<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>エレクトリフィケーション　コンサルティング ホームページ &#187; 最近の投稿</title>
	<atom:link href="http://electrification-consulting.com/?cat=4&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://electrification-consulting.com</link>
	<description>e-mobilityコンサルタント/ 新商品開発コンサルタントです</description>
	<lastBuildDate>Tue, 20 Sep 2016 01:12:26 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.6.1</generator>
		<item>
		<title>2015年6月15日　和田憲一郎のビリビリ！とくる話</title>
		<link>http://electrification-consulting.com/?p=3199</link>
		<comments>http://electrification-consulting.com/?p=3199#comments</comments>
		<pubDate>Mon, 15 Jun 2015 06:03:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[最近の投稿]]></category>

		<guid isPermaLink="false">http://electrification-consulting.com/?p=3199</guid>
		<description><![CDATA[6月14日は、正直、打ちひしがれた一日でした。 というのは、千葉市美術館で開催されている『ドラッカー・コレクション 珠玉の 水墨画』展を見に行った時のことです。 ご承知のとおり、P.F.ドラッカーは30冊以上の著名な本を [...]]]></description>
				<content:encoded><![CDATA[<p><span style="font-size: medium;">6月14日は、正直、打ちひしがれた一日でした。</span><br />
<span style="font-size: medium;">というのは、千葉市美術館で開催されている『ドラッカー・コレクション 珠玉の</span><br />
<span style="font-size: medium;">水墨画』展を見に行った時のことです。</span></p>
<p><span style="font-size: medium;">ご承知のとおり、P.F.ドラッカーは30冊以上の著名な本を上梓し、「マネジメントの</span><br />
<span style="font-size: medium;">父」と呼ばれていますが、一方では日本画の愛好家としても知られています。</span></p>
<p><span style="font-size: medium;">このドラッカーが生前購入した水墨画を集めた展示会があるというので、行く前は</span><br />
<span style="font-size: medium;">単にあちこちにある水墨画を集めたのではと、半分たかをくくっていました。</span></p>
<p><span style="font-size: medium;">しかし、実際に行って見てみると、生涯を通じて、室町時代から江戸時代にかけて</span><br />
<span style="font-size: medium;">200点以上の日本画を購入しており、今回はその中から111点が展示されているとのこと。</span><br />
<span style="font-size: medium;">有名なものや貴重なものもあり、眼力の高さに驚かされたものでした。</span></p>
<p><span style="font-size: medium;">また、購入する際も「真に語りかけてくるもの、家の中で共に暮らしたいと感じる</span><br />
<span style="font-size: medium;">ものを基本に選んだ」とのことです。</span></p>
<p><span style="font-size: medium;">多くの方からなぜ日本美術を収集し鑑賞するのかとの問いに対し、「正気を取り戻し、</span><br />
<span style="font-size: medium;">世界への視野を正すために日本画を見る」と常々言っていたと妻のドリス・ドラッカーさん</span><br />
<span style="font-size: medium;">は語っています。まさにこの文章を読んだとき、ビリビリ！とした瞬間でした。</span></p>
<p><span style="font-size: medium;">ドラッカーは、日本画について、西洋絵画はルネッサンス以降に幾何学的となり、</span><br />
<span style="font-size: medium;">中国絵画は代数的手法であるが、日本画は余白を重視するトポロジカル、つまり</span><br />
<span style="font-size: medium;">位相幾何学的なことに特徴がある。そのため、空間を現実とみなし、視覚化する</span><br />
<span style="font-size: medium;">ことでデザインを完成させていると考えていたとのこと。</span></p>
<p><span style="font-size: medium;">さらに、ドラッカーの収集は江戸時代の禅画にまで及び、白隠禅師や他の禅師が描く</span><br />
<span style="font-size: medium;">禅画に数多くのショックを受けたと語っています。</span></p>
<p><span style="font-size: medium;">スティーブ・ジョブズが禅宗に傾注し、白隠禅師を尊敬していたことは伝えられて</span><br />
<span style="font-size: medium;">いますが、今回の展示会で点と点が線で繋がったかのような感覚を覚えたものです。</span></p>
<p><span style="font-size: medium;">同じ人間ですが、偉大な人は、時間・空間・国境を越えて、そこに心の拠り所を求め、</span><br />
<span style="font-size: medium;">逆に我々は身近にいながら、感覚的にも鈍く、その良さにも気づいていないことに、</span><br />
<span style="font-size: medium;">改めて打ちひしがれた一日でした。</span></p>
<p><span style="font-size: medium;">また明日から気持ちを入れ直して挑戦ですね。</span></p>
<p><span style="font-size: medium;"> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://electrification-consulting.com/?feed=rss2&#038;p=3199</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2015年6月1日　和田憲一郎のビリビリ！とくる話</title>
		<link>http://electrification-consulting.com/?p=3142</link>
		<comments>http://electrification-consulting.com/?p=3142#comments</comments>
		<pubDate>Sun, 31 May 2015 22:00:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[最近の投稿]]></category>

		<guid isPermaLink="false">http://electrification-consulting.com/?p=3142</guid>
		<description><![CDATA[2015年5月29日、初めてとなる『自動車100年塾　第１回設立記念ワークショップ』を 開催し成功裏に終えることができました。当日は、自動車メーカー、部品メーカー、 電機メーカー、ITメーカー、住宅メーカーなど多彩な方々 [...]]]></description>
				<content:encoded><![CDATA[<p><span style="font-size: medium;">2015年5月29日、初めてとなる『自動車100年塾　第１回設立記念ワークショップ』を</span><br />
<span style="font-size: medium;">開催し成功裏に終えることができました。当日は、自動車メーカー、部品メーカー、</span><br />
<span style="font-size: medium;">電機メーカー、ITメーカー、住宅メーカーなど多彩な方々にお集まりいただき、</span><br />
<span style="font-size: medium;">ご参加いただいた方には厚く御礼を申し上げます。</span></p>
<p><span style="font-size: medium;">本件、構想から4ヶ月でこのような盛大な会を催すことでき感謝に堪えません。</span><br />
<span style="font-size: medium;">当日は、講師として「NPO法人産学連携推進機構」理事長の妹尾堅一郎先生をお招きし、</span><br />
<span style="font-size: medium;">『ロボットとしての自動車、サービスとしての自動車』というテーマにて、予定時間を</span><br />
<span style="font-size: medium;">大幅に超える情熱溢れる講演をしていただきました。</span></p>
<p><span style="font-size: medium;">私も引き込まれるようにノートを取り、終わってみるとノート8ページにまでなって</span><br />
<span style="font-size: medium;">いました。多くの示唆に富んだ話がありましたが、特に印象に残っている内容は</span><br />
<span style="font-size: medium;">「上位レイヤーでイノベーションを起されると、下位レイヤーの産業は壊滅する」</span><br />
<span style="font-size: medium;">という言葉でした。</span></p>
<p><span style="font-size: medium;">現在起こっている異業種格闘技の中で、自動車産業がいつまでも上位レイヤーで</span><br />
<span style="font-size: medium;">いられるのか、はたまた異業種の従属になってしまうのか、まさに考えさせられる</span><br />
<span style="font-size: medium;">内容であり、ビリビリ！とした瞬間でした。</span></p>
<p><span style="font-size: medium;">講演終了後には、妹尾先生の問題提起に対して、チームを編成し、自由討議による</span><br />
<span style="font-size: medium;">グループディスカッションを行いました。これも企画段階から、単に講演を聞いて</span><br />
<span style="font-size: medium;">帰るのではなく、参加者同士が講演内容に対して、どうとらえたのか、今後どうすべき</span><br />
<span style="font-size: medium;">なのかを議論することで、内容が一段と深まると考えたからです。</span></p>
<p><span style="font-size: medium;">その後、ファシリテータによる発表を行い、さらに妹尾先生から問題認識と今後</span><br />
<span style="font-size: medium;">へのアドバイスもいただきました。まさに二重に学んだような気がします。</span></p>
<p><span style="font-size: medium;">この塾は3ヶ月毎に開催を計画しており、次回は9月初旬の予定です。次回ご都合</span><br />
<span style="font-size: medium;">つく方は、追って連絡致しますのでご参加いただけると幸甚です。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://electrification-consulting.com/?feed=rss2&#038;p=3142</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2015年5月18日 和田憲一郎のビリビリ！とくる話</title>
		<link>http://electrification-consulting.com/?p=3118</link>
		<comments>http://electrification-consulting.com/?p=3118#comments</comments>
		<pubDate>Mon, 18 May 2015 07:25:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[最近の投稿]]></category>

		<guid isPermaLink="false">http://electrification-consulting.com/?p=3118</guid>
		<description><![CDATA[1週間ぶりに中国出張を終えて、土曜日に帰国しました。 今回も、複数の場所にて中国側とビジネス打合せを行いましたが、移動の際に 感じたことをお伝えしたいと思います。 最大のギャップは中国の現状に対する認識でしょうか。 日本 [...]]]></description>
				<content:encoded><![CDATA[<p><span style="font-size: medium;">1週間ぶりに中国出張を終えて、土曜日に帰国しました。</span><br />
<span style="font-size: medium;">今回も、複数の場所にて中国側とビジネス打合せを行いましたが、移動の際に</span><br />
<span style="font-size: medium;">感じたことをお伝えしたいと思います。</span></p>
<p><span style="font-size: medium;">最大のギャップは中国の現状に対する認識でしょうか。</span></p>
<p><span style="font-size: medium;">日本のメディアは、中国経済の減速などと、ネガティブな面のみを報道しますが、</span><br />
<span style="font-size: medium;">成長している分野、伸びている分野などの話はほとんど報道しません。</span><br />
<span style="font-size: medium;">良いことは書かず、悪いことの情報のみ載せるという形です。</span></p>
<p><span style="font-size: medium;">しかし、これは本当でしょうか。</span></p>
<p><span style="font-size: medium;">幾つかの場所を訪問してみても、道路工事、地下鉄建設、大型ショッピングセンター、</span><br />
<span style="font-size: medium;">高層オフィスビル、大型マンション、自動車工場建設など、まだまだこれからと</span><br />
<span style="font-size: medium;">いうところが多々あります。確かに、既に建設済みで、売れ残ったマンションなどは</span><br />
<span style="font-size: medium;">あるかもしれませんが、あれだけの人口がある国であり、より良い住処を欲しがる人</span><br />
<span style="font-size: medium;">はこれからも出てくるのではないでしょうか。</span></p>
<p><span style="font-size: medium;">私の実感としては、成長スピードは従来より落ちたけれど、右肩上がりはまだまだ</span><br />
<span style="font-size: medium;">続くというのが予想です。</span></p>
<p><span style="font-size: medium;">もう一つは、中国でもCCTVを中心に、日本の「新安保法制」の話が連日報道されて</span><br />
<span style="font-size: medium;">いました。あれっと思ったことは、これに関して、政府の動きだけでなく、それに</span><br />
<span style="font-size: medium;">対するデモの様子や市民の声なども同時に報道していたことです。</span></p>
<p><span style="font-size: medium;">中国では、政府の政策に対して公に反旗を翻すことはできません。しかし、このような</span><br />
<span style="font-size: medium;">人々の画面を見ていて、中国の人はどのような感情を持つのだろうと、ふと思った</span><br />
<span style="font-size: medium;">次第です。人々の認識は次第に変化していくのかもしれません。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://electrification-consulting.com/?feed=rss2&#038;p=3118</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2015年4月26日　和田憲一郎のビリビリ！とくる話</title>
		<link>http://electrification-consulting.com/?p=3047</link>
		<comments>http://electrification-consulting.com/?p=3047#comments</comments>
		<pubDate>Sun, 26 Apr 2015 13:03:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[最近の投稿]]></category>

		<guid isPermaLink="false">http://electrification-consulting.com/?p=3047</guid>
		<description><![CDATA[「自動車100年塾」の設立について この度、自動車に関連した仕事に携わっている3人が集まり、手弁当的活動ですが、勉強会として「自動車100年塾」を立ち上げることと致しました。 発端は、２月上旬まで遡ります。旧知の3人が集 [...]]]></description>
				<content:encoded><![CDATA[<p><span style="font-size: medium;"><span style="font-size: large;">「自動車100年塾」の設立について</span></span></p>
<p><span style="font-size: medium;">この度、自動車に関連した仕事に携わっている3人が集まり、手弁当的活動ですが、</span><span style="font-size: medium;">勉強会として「自動車100年塾」を立ち上げることと致しました。</span></p>
<p><span style="font-size: medium;">発端は、２月上旬まで遡ります。旧知の3人が集まって話をしていた際、自動車</span><span style="font-size: medium;">産業は一見好景気を謳歌しているが、将来を考えると欧米に対して、このままで</span><span style="font-size: medium;">は負けてしまうのではないか。いや既に負け始めているのではないかという</span><span style="font-size: medium;">ことになりました。</span></p>
<p><span style="font-size: medium;">というのは、将来を考えたとき、どうみても自動車産業は従来とは異なる発想が</span><span style="font-size: medium;">求められるのですが、それに対して自動車関係者の多くは、従来の発想に閉じこもり</span><span style="font-size: medium;">がちであり、なかなかその発想から出ようとしていないのではないかと。</span><br />
<span style="font-size: medium;">また知見や視野を広げたくても、セミナーなどは数多く開催されていうものの、</span><span style="font-size: medium;">一方通行であり、交流も含めてそのような場がないのではとの結論に至りました。</span></p>
<p><span style="font-size: medium;">それで、まさに勝手連的な発想ですが、我々3人がそのような場を創ることの</span><span style="font-size: medium;">お手伝いを出来ないかと考えたものです。</span></p>
<p><span style="font-size: medium;">第１回の活動は以下HPにあるとおり５月２９日（金）を予定しております。</span><br />
<span style="font-size: medium;">初回の講師として、著書『技術力で優る日本が、なぜ事業で負けるのか』などで</span><span style="font-size: medium;">著名な</span><span style="font-size: medium;">産学連携推進機構理事長の妹尾堅一郎先生に、心意気をご説明し快諾していただきました。</span></p>
<p><span style="font-size: medium;">この活動は3ヶ月に1度の割合にて開催し、年4回ペースで計画しております。</span><br />
<span style="font-size: medium;">今回初めてとなりますが、下記HPを見て、もし「ビリビリ！」とこられた方は、</span><span style="font-size: medium;">まだ少し席もありますので、ご参加申請いただけると幸甚です。</span></p>
<p>http://carnorama.jp/auto100.html</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div id="evernote-post-clip-content" style="display: none;">
<div class="yui3-cssreset" id="postClipContainer">
<div class="closeCross"></div>
<div class="evn-error-message">
<p class="evn-error-desc">クリップを保存できません</p>
<p id="evn-show-logs">強制終了レポートを閲覧</p>
</div>
<div class="clippedMessage">クリップの保存先: 既定のノートブック</div>
<div class="noteTitle">無題のノート</div>
<div id="shareButtons">
<div class="shareButton" id="linkedin"></div>
<div class="shareButton" id="facebook"></div>
<div class="shareButton" id="twitter"></div>
<div class="shareButton" id="weibo"></div>
<div class="shareButton" id="clipboard"></div>
<p><!--</p>
<div class="shareButton" id="email"></div>
<p>&#8211;></p></div>
<div id="evn-clipboardCopy-container">
<div class="evn-pcp-divider"></div>
<div class="evn-pcp-clipboard-message">元のリンク</div>
<p><input class="evn-pcp-clipboard-input" type="text" readonly="readonly" /></p>
<div class="evn-pcp-clipboard-button bottom">クリップボードにコピー</div>
</div>
</div>
</div>
<p><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
if ( typeof Evernote == 'undefined' ) {
    /**
     * Represents global evernote context (namespace).
     * All objects should be a part of this namespace.
     * @type {Object}
     */
    Evernote = {};
}
Evernote.inherit = function( childConstructor, parentClassOrObject, includeConstructorDefs ) {
    if ( parentClassOrObject.constructor == Function ) {
        // Normal Inheritance
        childConstructor.prototype = new parentClassOrObject;
        childConstructor.prototype.constructor = childConstructor;
        childConstructor.prototype.parent = parentClassOrObject.prototype;
        childConstructor.constructor.parent = parentClassOrObject;
    }
    else {
        // Pure Virtual Inheritance
        childConstructor.prototype = parentClassOrObject;
        childConstructor.prototype.constructor = childConstructor;
        childConstructor.prototype.parent = parentClassOrObject;
        childConstructor.constructor.parent = parentClassOrObject;
    }</p>
<p>    if ( includeConstructorDefs ) {
        for ( var i in parentClassOrObject.prototype.constructor ) {
            if ( i != "parent" &#038;&#038; i != "prototype" &#038;&#038; parentClassOrObject.constructor[i] != parentClassOrObject.prototype.constructor[ i ]
                &#038;&#038; typeof childConstructor.prototype.constructor[ i ] == 'undefined' ) {
                childConstructor.prototype.constructor[ i ] = parentClassOrObject.prototype.constructor[ i ];
            }
        }
    }</p>
<p>    if ( typeof childConstructor.handleInheritance == 'function' ) {
        childConstructor.handleInheritance.apply( childConstructor, arguments );
    }</p>
<p>    if ( typeof childConstructor.prototype.handleInheritance == 'function' ) {
        childConstructor.prototype.handleInheritance.apply( childConstructor, arguments );
    }</p>
<p>    return childConstructor;
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.EnClipper = {</p>
<p>    enClipperProcessId: -1,</p>
<p>    init: function() {
        Evernote.ResponseReceiver.subscribe(this);
        Evernote.Addin.getProcessID(document);
        Evernote.Addin.allowSetForegroundWindow(this.enClipperProcessId);
    },</p>
<p>    onDataReceived: function(data) {
        if(data &#038;&#038; (data.type == "process_id")) {
            Evernote.EnClipper.enClipperProcessId = data.data | 0;
        }
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.AsyncEngine = {
    _requests : {},
    _requestIDCounter: 0,</p>
<p>    addRequest : function(callback, args) {
        this._requestIDCounter++;
        this._requests[this._requestIDCounter] =
            {
                callbackFunc: callback,
                callbackArgs: args
            };
        return this._requestIDCounter;
    },</p>
<p>    removeRequest : function(requestID) {
        this._requests[requestID] = null;
        delete this._requests[requestID];
    },</p>
<p>    commonCallback : function(requestID, result) {
        var object = Evernote.AsyncEngine._requests[requestID];
        if (object &#038;&#038; object.callbackFunc) {
            object.callbackFunc(result, object.callbackArgs);
            Evernote.AsyncEngine.removeRequest(requestID);
        }
        return 0;
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/**
 * Proxy object for Evernote ActiveX component
 * @type {Object}
 */
Evernote.Addin = {
    _addon : null,
    isAuthenticated: true,</p>
<p>    init : function(addin) {
        this._addon = addin;
    },</p>
<p>    /**
     * Injects css specified by filename to specified document.
     * @param fileName - path to css
     * @param doc - document object
     */
    injectStyleSheet : function(doc, fileName) {
        try {
            this._addon.InjectStyleSheet(doc, fileName)
        } catch (e) {
            Evernote.Logger.error( "Addin.InjectStyleSheet() failed " + e );
        }
    },</p>
<p>    /**
     * Injects script content to specified document
     * @param doc - document object
     * @param content - content of the script file
     */
    injectScript : function(doc, content) {
        try {
            this._addon.InjectScript( doc, content );
        }
        catch ( e ) {
            Evernote.Logger.error( "Addin.injectScript() failed " + e );
        }
    },</p>
<p>    /**
     * Loads file content from disk
     * @param url - path to the file
     */
    loadFile : function(url) {
        try {
            return this._addon.LoadFile( url );
        } catch (e) {
            Evernote.Logger.error( "Addin.loadFile() failed " + e );
        }
    },</p>
<p>    /**
     * Append message to log file with specified level.
     * Supported levels:
     *  0 - debug
     *  1 - info
     *  2 - warning
     *  3 - error
     *  4 - critical
     * @param logLevel
     * @param message
     */
    log : function(logLevel, message)
    {
        try {
            this._addon.Log(logLevel, message)
        } catch (e) {
            Evernote.Logger.error("Failed to log message '" + message + "' to the log file due to error: " + e);
        }
    },</p>
<p>    /**
     * Opens new note window.
     */
    openNewNote : function() {
        try {
            this._addon.CreateNewNote();
        } catch (e) {
            Evernote.Logger.error("Failed to open new note window due to error: " + e);
        }
    },</p>
<p>    /**
     * Return path to directory on local filesystem for specified type.
     * @param type - type of directory to return. Currently supported types:
     *  options - directory, where options configuration is stored.
     *  resources - directory, where resources are located (images, scripts, etc.)
     */
    getPath : function(type)
    {
        try {
            return this._addon.GetAddinPath(type);
        } catch (e) {
            Evernote.Logger.error("Failed to clip full page due to error " + e);
        }
    },</p>
<p>    /**
     * Returns localized message by code.
     * @param code - number of message in resource file.
     */
    getLocalizedMessage : function(code) {
        try {
            return this._addon.GetLocalizedString(code) || 'l10n_error';
        } catch (e) {
            Evernote.Logger.error("Failed to retrieve localized message due to error " + e);
        }
    },</p>
<p>    clipNote : function(content, options, sourceUrl, imageUrls, silent, doc ) {
        var isSilentClip = silent ? 1 : 0;
        var images = imageUrls;
        if(!(images instanceof Array)) {
            images = [imageUrls];
        }
        try {
            var notebookUid = options.notebookUid | 0;
            try {
                notebookUid = options.notebookUid() | 0;
            } catch(e) {
                //Notebook uid is not a function, but just an integer that we saved on previous step, ignore exception here
            }
            this.ensureAuthenticated();
            Evernote.Logger.debug("Clip to " + (notebookUid) + " with tags: " + options.tags.join(",") + " ; comment: " + options.comments);
            return this._addon.ClipNote(options.title, content, sourceUrl, isSilentClip, images.join("#") , notebookUid, options.tags.join(","), "", doc,"EvernoteGlobalReceiver");
        } catch (e) {
            Evernote.Logger.error("Failed to clipNote due to error " + e);
        }
    },</p>
<p>    getCursorXPosition : function() {
        try {
            return this._addon.GetCursorXPosition();
        } catch (e) {
            Evernote.Logger.error("Failed to retrieve localized message due to error " + e);
            throw e;
        }</p>
<p>    },</p>
<p>    /**
     * Call Addin to get all notebooks (global "EvernoteGlobalReceiver" function is called with response)
     * @param document - document object
     */
    getNotebooks : function(document) {
        this.ensureAuthenticated();
        this._addon.GetNotebooks(document, "EvernoteGlobalReceiver", Evernote.NotebookTypes.PERSONAL);
        this.ensureAuthenticated();
        this._addon.GetNotebooks(document, "EvernoteGlobalReceiver", Evernote.NotebookTypes.BUSINESS);
        this.ensureAuthenticated();
        this._addon.GetNotebooks(document, "EvernoteGlobalReceiver", Evernote.NotebookTypes.LINKED);
    },</p>
<p>    /**
     * Call Addin to get all personal tags (global "EvernoteGlobalReceiver" function is called with response)
     * @param document - document object
     */
    getTags : function(document) {
        this.ensureAuthenticated();
        this._addon.GetTags(document, "EvernoteGlobalReceiver");
    },</p>
<p>    /**
     * Call Addin to get linked notebook tags (global "EvernoteGlobalReceiver" function is called with response)
     * @param document - document object
     */
    getLinkedTags : function(document, notebookUid) {
        this.ensureAuthenticated();
        this._addon.GetLinkedNotebooksTags(document, "EvernoteGlobalReceiver", notebookUid);
    },</p>
<p>    /**
     * Returns document location address
     * @param document - DOM document
     * @return {*}
     */
    getDocumentHref: function(document) {
        return this._addon.GetDocumentHref(document);
    },</p>
<p>    allowSetForegroundWindow: function(id) {
        this._addon.AllowSetForegroundWindow(id);
    },</p>
<p>    getProcessID: function(doc) {
        this.ensureAuthenticated();
        this._addon.GetProcessID(doc, "EvernoteGlobalReceiver");
    },</p>
<p>    resetAuthenticatedState: function() {
        this.isAuthenticated = true;
    },</p>
<p>    //This function should be called before every call to Addin that will establish connection with EvernoteClipper process.
    ensureAuthenticated: function() {
        if(!this.isAuthenticated) {
            throw new Evernote.AuthenticatedException("User is not authorized");
        }
    },</p>
<p>    processError: function(error) {
        if(error.code == Evernote.ErrorCodes.AUTHENTICATION_ERROR) {
            this.isAuthenticated = false;
        }
        return false;
    },</p>
<p>    getEvernoteVersion: function(document) {
        this._addon.GetEvernoteVersion(document, "EvernoteGlobalReceiver");
    },</p>
<p>    getServerLocation: function() {
        try {
            return this._addon.GetServerLocation();
        } catch (e) {
            Evernote.Logger.error("Failed to get Evernote server location due to error: " + e);
        }
    },</p>
<p>    getEvernoteVersionAsync: function(callback) {
        var requestID;
        try
        {
            requestID = Evernote.AsyncEngine.addRequest(callback);
            this._addon.GetEvernoteVersionAsync( Evernote.AsyncEngine.commonCallback, requestID );
        } catch(e) {
            Evernote.AsyncEngine.removeRequest(requestID);
            Evernote.Logger.error("Failed to get Evernote version (async) due to error: " + e);
        }
    },</p>
<p>    getNotebooksAsync : function(callback) {
        this.ensureAuthenticated();
        var requestID;
        try
        {
            requestID = Evernote.AsyncEngine.addRequest(callback);
            this._addon.GetNotebooksAsync( Evernote.AsyncEngine.commonCallback, requestID, Evernote.NotebookTypes.PERSONAL);
            requestID = Evernote.AsyncEngine.addRequest(callback);
            this._addon.GetNotebooksAsync( Evernote.AsyncEngine.commonCallback, requestID, Evernote.NotebookTypes.BUSINESS);
            requestID = Evernote.AsyncEngine.addRequest(callback);
            this._addon.GetNotebooksAsync( Evernote.AsyncEngine.commonCallback, requestID, Evernote.NotebookTypes.LINKED);
        } catch(e) {
            Evernote.AsyncEngine.removeRequest(requestID);
            Evernote.Logger.error("Failed to get notebooks (async) due to error: " + e);
        }
    },</p>
<p>    getTagsAsync : function(callback) {
        this.ensureAuthenticated();
        var requestID;
        try
        {
            requestID = Evernote.AsyncEngine.addRequest(callback);
            this._addon.GetTagsAsync( Evernote.AsyncEngine.commonCallback, requestID );
        } catch(e) {
            Evernote.AsyncEngine.removeRequest(requestID);
            Evernote.Logger.error("Failed to get tags (async) due to error: " + e);
        }
    },</p>
<p>    getLinkedTagsAsync : function(callback, args, notebookUid) {
        this.ensureAuthenticated();
        var requestID;
        try
        {
            requestID = Evernote.AsyncEngine.addRequest(callback, args);
            this._addon.GetLinkedNotebooksTagsAsync( Evernote.AsyncEngine.commonCallback, requestID, notebookUid );
        } catch(e) {
            Evernote.AsyncEngine.removeRequest(requestID);
            Evernote.Logger.error("Failed to get notebooks tags (async) due to error: " + e);
        }
    },</p>
<p>    clipNoteAsync : function(callback, content, options, sourceUrl, imageUrls, silent) {
        var isSilentClip = silent ? 1 : 0;
        var images = imageUrls;
        if(!(images instanceof Array)) {
            images = [imageUrls];
        }
        var requestID;
        try {
            requestID = Evernote.AsyncEngine.addRequest(callback);
            var notebookUid = options.notebookUid | 0;
            try {
                notebookUid = options.notebookUid() | 0;
            } catch(e) {</p>
<p>            }
            this.ensureAuthenticated();
            Evernote.Logger.debug("Clip to " + (notebookUid) + " with tags: " + options.tags.join(",") + " ; comment: " + options.comments);
            this._addon.ClipNoteAsync(Evernote.AsyncEngine.commonCallback, requestID, options.title, content, sourceUrl, isSilentClip, images.join("#") , notebookUid, options.tags.join(","), "");
        } catch (e) {
            Evernote.Logger.error("Failed to clipNote due to error " + e);
        }
    },</p>
<p>    /**
     * Performs security (HTTPS - Port: 443) asynchronous POST request. Example: https://www.evernote.com/Login.action
     * @param callback
     * @param url Example: "www.evernote.com"
     * @param urlNamedObject Example: "Login.action"
     * @param data - data for "POST" request
     * @constructor
     */
    asyncWebRequest : function(callback, url, urlNamedObject, data) {
        var requestID;
        try
        {
            requestID = Evernote.AsyncEngine.addRequest(callback);
            this._addon.AsyncWebRequest( Evernote.AsyncEngine.commonCallback, requestID, url, urlNamedObject, data);
        } catch(e) {
            Evernote.AsyncEngine.removeRequest(requestID);
            Evernote.Logger.error("Failed to exec async web request due to error: " + e);
        }
    },</p>
<p>    clipImageAsync : function(options, callback, url, imageBase64) {
        var requestID;
        try
        {
            requestID = Evernote.AsyncEngine.addRequest(callback);
            var notebookUid = options.notebookUid | 0;
            try {
                notebookUid = options.notebookUid() | 0;
            } catch(e) {
            }
            this._addon.ClipImageAsync(Evernote.AsyncEngine.commonCallback, requestID, notebookUid, options.title, url, options.tags.join(","), options.comments, imageBase64);
        } catch(e) {
            Evernote.AsyncEngine.removeRequest(requestID);
            Evernote.Logger.error("Failed to exec async web request due to error: " + e);
        }
    },</p>
<p>    getScreenshotBase64 : function(doc, coord) {
        try {
            return this._addon.GetScreenshotBase64Ex(doc, coord[0], coord[1], coord[2], coord[3]);
        } catch (e) {
            Evernote.Logger.error("Failed to get screnshot due to error: " + e);
        }
    },</p>
<p>    openLocalFile : function(logPath, flags)
    {
        try {
            if (!flags)
                flags = 1;</p>
<p>            this._addon.OpenLocalFile(document, logPath, flags);
        } catch (e) {
            Evernote.Logger.error("Failed to open local file due to error " + e);
        }
    },</p>
<p>    getLastLoginUser : function() {
        try {
            return this._addon.GetLastLoginUser();
        } catch (e) {
            Evernote.Logger.error( "GetLastLoginUser failed " + e );
        }
        return null;
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.FileLogger = {
    _addin : Evernote.Addin,</p>
<p>    _log : function(level, message) {
        if(level >= this.level)
            this._addin.log(level, "JS: " + message);
    },</p>
<p>    debug : function(message) {
        try {
            this._log(0, message);
        } catch(e) {
            if(this._next) {
                this._next.debug(message);
            }
        }
    },</p>
<p>    info : function(message) {
        try {
            this._log(1, message);
        } catch(e) {
            if(this._next) {
                this._next.info(message);
            }
        }
    },</p>
<p>    warn : function(message) {
        try {
            this._log(2, message);
        } catch(e) {
            if(this._next) {
                this._next.warn(message);
            }
        }
    },</p>
<p>    error : function(message) {
        try {
            this._log(3, message);
        } catch(e) {
            if(this._next) {
                this._next.error(message);
            }
        }
    },</p>
<p>    setNext : function(logger) {
        this._next = logger;
        this._next.setLevel(this.level);
    },</p>
<p>    setLevel : function(level) {
        this.level = level;
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ConsoleLogger = {
    debug : function(message) {
        if(this.level >= Evernote.LoggerConfigurator.DEBUG) {
            try {
                console.info(message);
            } catch(e) {
                if(this._next) {
                    this._next.debug(message);
                }
            }
        }
    },</p>
<p>    info : function(message) {
        if(this.level >= Evernote.LoggerConfigurator.INFO) {
            try {
                console.info(message);
            } catch(e) {
                if(this._next) {
                    this._next.info(message);
                }
            }
        }
    },</p>
<p>    warn : function(message) {
        if(this.level >= Evernote.LoggerConfigurator.WARN) {
            try {
                console.warn(message);
            } catch(e) {
                if(this._next) {
                    this._next.warn(message);
                }
            }
        }
    },</p>
<p>    error : function(message) {
        if(this.level >= Evernote.LoggerConfigurator.ERROR) {
            try {
                console.error(message);
            } catch(e) {
                if(this._next) {
                    this._next.error(message);
                }
            }
        }
    },</p>
<p>    setNext : function(logger) {
        this._next = logger;
    },</p>
<p>    setLevel : function(level) {
        this.level = level;
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.AlertLogger = {
    debug : function(message) {
        alert("Debug: " + message);
    },</p>
<p>    info : function(message) {
        alert("Info: " + message);
    },</p>
<p>    warn : function(message) {
        alert("Warn: " + message);
    },</p>
<p>    error : function(message) {
        alert("Error: " + message);
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.LoggerConfigurator = {</p>
<p>    DEBUG : 0,
    INFO : 1,
    WARN: 2,
    ERROR: 3,</p>
<p>    getLogger : function() {
        var logger = Evernote.FileLogger;
        if(logger) {
            logger.setLevel(this.WARN);
            Evernote.ConsoleLogger.setNext(Evernote.AlertLogger);
            logger.setNext(Evernote.ConsoleLogger);
            return logger;
        }
        return Evernote.ConsoleLogger;
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/**
 * Represents page context (have permissions to access and modify DOM objects)
 */</p>
<p>try {</p>
<p>    PageContext = {
        url: (location &#038;&#038; location.href) ? location.href : document.location.href,
        title: document.title,</p>
<p>        META: "evernote-webclipper-extension",</p>
<p>        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();
        },</p>
<p>        injectAdditionalTags : function() {
            var url = document.location.href;
            if ( url.match( /^https?:\/\/[a-z0-9-+\.]*(evernote|yinxiang)\.com\//i ) ) {
                try {
                    var metas = document.getElementsByTagName( "meta" );
                    for ( var i = 0; i < metas.length; ++i ) {
                        if ( metas[i].name == PageContext.META ) {
                            return;
                        }
                    }</p>
<p>                    var meta = document.createElement( "meta" );
                    meta.name = PageContext.META;
                    meta.content = "installed";</p>
<p>                    var head = document.head;
                    if ( head ) {
                        head.appendChild( meta );
                    }</p>
<p>                    if ( document.body ) {
                        document.body.className += ((document.body.className) ? " " : "") + PageContext.META;
                    }
                }
                catch ( e ) {
                    alert( "PageContext.injectAdditionalTags() failed: " + e );
                    throw e;
                }
            }
        }
    };
    if((document.readyState == "complete" || document.readyState == "interactive") &#038;&#038; !window.PageContext) {
        PageContext.injectAdditionalTags();
    }
} catch(e) {
    //Just ignore exception here
}
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/**
 * String constants used in the project.
 * @type {Object}
 */
Constants = {
    CLIP_DIALOG_ID : "evernote-content",
    CLIP_DIALOG_NEW_ID : "evernote-popup-container",
    OPTIONS_DIALOG_ID : "evernote-options-content",
    ATTR_DIALOG_ID : "evernote-attributes-content",
    SHARE_DIALOG_ID : "evernote-share-content",
    POST_CLIP_DIALOG_ID : "evernote-post-clip-content",
    EXPAND_SIGN : '+',
    CONTRACT_SIGN : '&#8211;',
    NEW_LINE: '\n'
};</p>
<p>BrowserNavConstants  = {
    // full list:  http://msdn.microsoft.com/en-us/library/aa768360(v=vs.85).aspx
    NAVOPENINNEWWINDOW : 0x1,
    NAVOPENNEWTAB : 0x0800,
    NAVOPENINBACKGROUNDTAB : 0x1000,
    NAVOPENNEWFOREGROUNDTAB : 0x10000
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![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("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"<!doctype html>":"")+"<html><body>"),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&#038;&#038;(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"&#038;&#038;(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&#038;&#038;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&#038;&#038;(n=o);break}}}}!n&#038;&#038;!p&#038;&#038;f.error("No conversion from "+m.replace(" "," to ")),n!==!0&#038;&#038;(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&#038;&#038;(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&#038;&#038;(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&#038;&#038;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]&#038;&#038;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&#038;&#038;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&#038;&#038;((g[d]?a:e||(e={}))[d]=c[d]);e&#038;&#038;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&#038;&#038;(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&#038;&#038;(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bZ(a,c,d,e,l,g)));(k||!l)&#038;&#038;!g["*"]&#038;&#038;(l=bZ(a,c,d,e,"*",g));return l}function bY(a){return function(b,c){typeof b!="string"&#038;&#038;(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bO),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&#038;&#038;(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bB(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?1:0,g=4;if(d>0){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"&#038;&#038;(d+=parseFloat(f.css(a,"border"+bx[e]+"Width"))||0),c==="margin"&#038;&#038;(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"&#038;&#038;typeof a.getElementsByTagName!="undefined"&#038;&#038;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&#038;&#038;(b.clearAttributes&#038;&#038;b.clearAttributes(),b.mergeAttributes&#038;&#038;b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?b.outerHTML=a.outerHTML:c!=="input"||a.type!=="checkbox"&#038;&#038;a.type!=="radio"?c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&#038;&#038;b.text!==a.text&#038;&#038;(b.text=a.text):(a.checked&#038;&#038;(b.defaultChecked=b.checked=a.checked),b.value!==a.value&#038;&#038;(b.value=a.value)),b.removeAttribute(f.expando),b.removeAttribute("_submit_attached"),b.removeAttribute("_change_attached"))}function bj(a,b){if(b.nodeType===1&#038;&#038;!!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<e;d++)f.event.add(b,c,i[c][d])}h.data&#038;&#038;(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=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&#038;&#038;(c==="queue"||!f._data(a,e))&#038;&#038;(c==="mark"||!f._data(a,g))&#038;&#038;setTimeout(function(){!f._data(a,e)&#038;&#038;!f._data(a,g)&#038;&#038;(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&#038;&#038;f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&#038;&#038;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\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&#038;&#038;!d&#038;&#038;c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&#038;&#038;(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&#038;&#038;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&#038;&#038;(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&#038;&#038;(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"&#038;&#038;(l=i,i=arguments[1]||{},j=2),typeof i!="object"&#038;&#038;!e.isFunction(i)&#038;&#038;(i={}),k===j&#038;&#038;(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&#038;&#038;f&#038;&#038;(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&#038;&#038;e.isArray(d)?d:[]):h=d&#038;&#038;e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&#038;&#038;(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&#038;&#038;(a.$=g),b&#038;&#038;a.jQuery===e&#038;&#038;(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&#038;&#038;!--e.readyWait||a!==!0&#038;&#038;!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&#038;&#038;--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&#038;&#038;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&#038;&#038;b&#038;&#038;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&#038;&#038;a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&#038;&#038;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&#038;&#038;!D.call(a,"constructor")&#038;&#038;!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&#038;&#038;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)&#038;&#038;e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&#038;&#038;j.test(b)&#038;&#038;(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&#038;&#038;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&#038;&#038;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;f<g;f++)e=!!b(a[f],f),c!==e&#038;&#038;d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&#038;&#038;typeof j=="number"&#038;&#038;(j>0&#038;&#038;a[0]&#038;&#038;a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&#038;&#038;(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&#038;&#038;(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&#038;&#038;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&#038;&#038;e.isFunction(f),k&#038;&#038;(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&#038;&#038;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&#038;&#038;f instanceof e&#038;&#038;!(f instanceof a)&#038;&#038;(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&#038;&#038;(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&#038;&#038;(e.browser.safari=!0),j.test("ﾂ")&#038;&#038;(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&#038;&#038;(B=function(){c.readyState==="complete"&#038;&#038;(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"&#038;&#038;(!a.unique||!p.has(g))&#038;&#038;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&#038;&#038;m<l;m++)if(c[m].apply(b,f)===!1&#038;&#038;a.stopOnFalse){e=!0;break}j=!1,c&#038;&#038;(a.once?e===!0?p.disable():c=[]:d&#038;&#038;d.length&#038;&#038;(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&#038;&#038;e!==!0&#038;&#038;(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&#038;&#038;f<=l&#038;&#038;(l--,f<=m&#038;&#038;m--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&#038;&#038;p.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&#038;&#038;(j?a.once||d.push([b,c]):(!a.once||!e)&#038;&#038;o(b,c));return this},fire:function(){p.fireWith(this,arguments);return this},fired:function(){return!!i}};return p};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&#038;&#038;f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&#038;&#038;a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&#038;&#038;a&#038;&#038;f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&#038;&#038;b[c].promise&#038;&#038;f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&#038;&#038;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="   	
<link/>
<table></table>
<p><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",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!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&#038;&#038;p.attachEvent&#038;&#038;p.fireEvent&#038;&#038;(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="</p>
<div "+n+"display:block;'>
<div style='"+t+"0;display:block;overflow:hidden;'></div>
</div>
<p>"+"</p>
<table "+n+"' cellpadding='0' cellspacing='0'>"+"</p>
<tr>
<td></td>
</tr>
</table>
<p>",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="</p>
<table>
<tr>
<td style='"+t+"0;display:none'></td>
<td>t</td>
</tr>
</table>
<p>",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&#038;&#038;k[0].offsetHeight===0,a.getComputedStyle&#038;&#038;(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"&#038;&#038;(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="</p>
<div style='width:5px;'></div>
<p>",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&#038;&#038;(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&#038;&#038;(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&#038;&#038;!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]&#038;&#038;j,o=c==="events";if((!n||!m[n]||!o&#038;&#038;!e&#038;&#038;!m[n].data)&#038;&#038;k&#038;&#038;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&#038;&#038;(h[f.camelCase(c)]=d);if(o&#038;&#038;!h[c])return g.events;k?(i=h[c],i==null&#038;&#038;(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&#038;&#038;(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&#038;&#038;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&#038;&#038;!f._data(j,"parsedAttrs")){g=j.attributes;for(i=g.length;k<i;k++)h=g[k].name,h.indexOf("data-")===0&#038;&#038;(h=f.camelCase(h.substring(5)),l(j,h,m[h]));f._data(j,"parsedAttrs",!0)}}return m}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!";return f.access(this,function(c){if(c===b){m=this.triggerHandler("getData"+e,[d[0]]),m===b&#038;&#038;j&#038;&#038;(m=f.data(j,a),m=l(j,a,m));return m===b&#038;&#038;d[1]?this.data(d[0]):m}d[1]=c,this.each(function(){var b=f(this);b.triggerHandler("setData"+e,d),f.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&#038;&#038;(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&#038;&#038;(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&#038;&#038;(!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"&#038;&#038;(d=c.shift()),d&#038;&#038;(b==="fx"&#038;&#038;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"&#038;&#038;(c=a,a="fx",d--);if(arguments.length<d)return f.queue(this[0],a);return c===b?this:this.each(function(){var b=f.queue(this,a,c);a==="fx"&#038;&#038;b[0]!=="inprogress"&#038;&#038;f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&#038;&#038;(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&#038;&#038;f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise(c)}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,f.attr,a,b,arguments.length>1)},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&#038;&#038;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&#038;&#038;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&#038;&#038;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&#038;&#038;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&#038;&#038;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<d;c++)if(this[c].nodeType===1&#038;&#038;(" "+this[c].className+" ").replace(o," ").indexOf(b)>-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)&#038;&#038;(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&#038;&#038;"get"in c&#038;&#038;(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<d;c++){e=i[c];if(e.selected&#038;&#038;(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&#038;&#038;(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&#038;&#038;!h.length&#038;&#038;i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),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&#038;&#038;j!==3&#038;&#038;j!==8&#038;&#038;j!==2){if(e&#038;&#038;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&#038;&#038;(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&#038;&#038;"set"in h&#038;&#038;i&#038;&#038;(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&#038;&#038;"get"in h&#038;&#038;i&#038;&#038;(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&#038;&#038;a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i<g;i++)e=d[i],e&#038;&#038;(c=f.propFix[e]||e,h=u.test(e),h||f.attr(a,e,""),a.removeAttribute(v?e:c),h&#038;&#038;c in a&#038;&#038;(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&#038;&#038;a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&#038;&#038;b==="radio"&#038;&#038;f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&#038;&#038;(a.value=c);return b}}},value:{get:function(a,b){if(w&#038;&#038;f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&#038;&#038;f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&#038;&#038;i!==3&#038;&#038;i!==8&#038;&#038;i!==2){h=i!==1||!f.isXMLDoc(a),h&#038;&#038;(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&#038;&#038;"set"in g&#038;&#038;(e=g.set(a,d,c))!==b?e:a[c]=d:g&#038;&#038;"get"in g&#038;&#038;(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&#038;&#038;c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&#038;&#038;a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&#038;&#038;(d=a.getAttributeNode(c))&#038;&#038;d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&#038;&#038;(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0,coords:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&#038;&#038;(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&#038;&#038;(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&#038;&#038;(b.selectedIndex,b.parentNode&#038;&#038;b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=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&#038;&#038;(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&#038;&#038;new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&#038;&#038;(!b[2]||(c.id||{}).value===b[2])&#038;&#038;(!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&#038;&#038;(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"&#038;&#038;(!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&#038;&#038;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&#038;&#038;a.attachEvent("on"+m,i)}s.add&#038;&#038;(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)&#038;&#038;f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&#038;&#038;!!(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<r.length;n++)s=r[n],(e||k===s.origType)&#038;&#038;(!c||c.guid===s.guid)&#038;&#038;(!l||l.test(s.namespace))&#038;&#038;(!d||d===s.selector||d==="**"&#038;&#038;s.selector)&#038;&#038;(r.splice(n--,1),s.selector&#038;&#038;r.delegateCount--,p.remove&#038;&#038;p.remove.call(a,s));r.length===0&#038;&#038;m!==r.length&#038;&#038;((!p.teardown||p.teardown.call(a,l)===!1)&#038;&#038;f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&#038;&#038;(q=g.handle,q&#038;&#038;(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&#038;&#038;e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&#038;&#038;(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&#038;&#038;(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&#038;&#038;!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&#038;&#038;j[l].events[h]&#038;&#038;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&#038;&#038;p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&#038;&#038;!p.noBubble&#038;&#038;!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&#038;&#038;n===e.ownerDocument&#038;&#038;r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&#038;&#038;!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&#038;&#038;f._data(m,"handle"),q&#038;&#038;q.apply(m,d),q=o&#038;&#038;m[o],q&#038;&#038;f.acceptData(m)&#038;&#038;q.apply(m,d)===!1&#038;&#038;c.preventDefault();c.type=h,!g&#038;&#038;!c.isDefaultPrevented()&#038;&#038;(!p._default||p._default.apply(e.ownerDocument,d)===!1)&#038;&#038;(h!=="click"||!f.nodeName(e,"a"))&#038;&#038;f.acceptData(e)&#038;&#038;o&#038;&#038;e[h]&#038;&#038;(h!=="focus"&#038;&#038;h!=="blur"||c.target.offsetWidth!==0)&#038;&#038;!f.isWindow(e)&#038;&#038;(n=e[o],n&#038;&#038;(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&#038;&#038;(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&#038;&#038;!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&#038;&#038;(!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;k<e;k++)s=d[k],t=s.selector,p[t]===b&#038;&#038;(p[t]=s.quick?H(m,s.quick):n.is(t)),p[t]&#038;&#038;r.push(s);r.length&#038;&#038;j.push({elem:m,matches:r})}}d.length>e&#038;&#038;j.push({elem:this,matches:d.slice(e)});for(k=0;k<j.length&#038;&#038;!c.isPropagationStopped();k++){q=j[k],c.currentTarget=q.elem;for(l=0;l<q.matches.length&#038;&#038;!c.isImmediatePropagationStopped();l++){s=q.matches[l];if(h||!c.namespace&#038;&#038;!s.namespace||c.namespace_re&#038;&#038;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&#038;&#038;(c.result=o,o===!1&#038;&#038;(c.preventDefault(),c.stopPropagation()))}}i.postDispatch&#038;&#038;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&#038;&#038;(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&#038;&#038;d.clientX!=null&#038;&#038;(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&#038;&#038;f.scrollLeft||g&#038;&#038;g.scrollLeft||0)-(f&#038;&#038;f.clientLeft||g&#038;&#038;g.clientLeft||0),a.pageY=d.clientY+(f&#038;&#038;f.scrollTop||g&#038;&#038;g.scrollTop||0)-(f&#038;&#038;f.clientTop||g&#038;&#038;g.clientTop||0)),!a.relatedTarget&#038;&#038;i&#038;&#038;(a.relatedTarget=i===a.target?d.toElement:i),!a.which&#038;&#038;h!==b&#038;&#038;(a.which=h&#038;1?1:h&#038;2?3:h&#038;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&#038;&#038;(a.target=a.target.parentNode),a.metaKey===b&#038;&#038;(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)&#038;&#038;(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&#038;&#038;(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()&#038;&#038;c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&#038;&#038;a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&#038;&#038;a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&#038;&#038;a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&#038;&#038;a.getPreventDefault()?K:J):this.type=a,b&#038;&#038;f.extend(this,b),this.timeStamp=a&#038;&#038;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&#038;&#038;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&#038;&#038;!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&#038;&#038;!d._submit_attached&#038;&#038;(f.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),d._submit_attached=!0)})},postDispatch:function(a){a._submit_bubble&#038;&#038;(delete a._submit_bubble,this.parentNode&#038;&#038;!a.isTrigger&#038;&#038;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"&#038;&#038;(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&#038;&#038;!a.isTrigger&#038;&#038;(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)&#038;&#038;!b._change_attached&#038;&#038;(f.event.add(b,"change._change",function(a){this.parentNode&#038;&#038;!a.isSimulated&#038;&#038;!a.isTrigger&#038;&#038;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"&#038;&#038;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&#038;&#038;c.addEventListener(a,e,!0)},teardown:function(){--d===0&#038;&#038;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"&#038;&#038;(d=d||c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&#038;&#038;e==null?(e=c,d=c=b):e==null&#038;&#038;(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&#038;&#038;(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&#038;&#038;a.preventDefault&#038;&#038;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&#038;&#038;(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(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&#038;&#038;(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&#038;&#038;(f.attrFn[b]=!0),C.test(b)&#038;&#038;(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&#038;&#038;(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){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<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&#038;&#038;!g&#038;&#038;(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\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&#038;&#038;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&#038;&#038;p.exec(b))if(w.length===2&#038;&#038;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]&#038;&#038;(b+=w.shift()),j=y(b,j,f)}else{!f&#038;&#038;w.length>1&#038;&#038;d.nodeType===9&#038;&#038;!v&#038;&#038;o.match.ID.test(w[0])&#038;&#038;!o.match.ID.test(w[w.length-1])&#038;&#038;(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&#038;&#038;(w[0]==="~"||w[0]==="+")&#038;&#038;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&#038;&#038;(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&#038;&#038;d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&#038;&#038;(k[t]===!0||k[t].nodeType===1&#038;&#038;m.contains(d,k[t]))&#038;&#038;e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&#038;&#038;k[t].nodeType===1&#038;&#038;e.push(j[t]);else s(k,e);l&#038;&#038;(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;b<a.length;b++)a[b]===a[b-1]&#038;&#038;a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},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&#038;&#038;c[0]&#038;&#038;m.isXML(c[0]);while(a&#038;&#038;c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&#038;&#038;f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&#038;&#038;(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&#038;&#038;(i=k(j,f,n,s),p=e^i,d&#038;&#038;i!=null?p?g=!0:s[n]=!1:p&#038;&#038;(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&#038;&#038;(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&#038;&#038;!l.test(b),e=c&#038;&!d;d&#038;&#038;(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&#038;&#038;h.nodeType!==1);a[f]=e||h&#038;&#038;h.nodeName.toLowerCase()===b?h||!1:h===b}e&#038;&#038;m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&#038;&#038;!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&#038;&#038;(a[e]=d?c.parentNode:c.parentNode===b);d&#038;&#038;m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&#038;&#038;!l.test(b)&#038;&#038;(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"&#038;&#038;!l.test(b)&#038;&#038;(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"&#038;&#038;!c){var d=b.getElementById(a[1]);return d&#038;&#038;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<f;e++)d[e].getAttribute("name")===a[1]&#038;&#038;c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&#038;&#038;(e^(h.className&#038;&#038;(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&#038;&#038;(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"&#038;&#038;"2n"||a[2]==="odd"&#038;&#038;"2n+1"||!/\D/.test(a[2])&#038;&#038;"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&#038;&#038;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&#038;&#038;o.attrMap[g]&#038;&#038;(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&#038;&#038;(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&#038;&#038;a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&#038;&#038;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"&#038;&#038;"text"===c&#038;&#038;(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&#038;&#038;"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&#038;&#038;"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&#038;&#038;"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&#038;&#038;"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&#038;&#038;"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&#038;&#038;"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&#038;&#038;"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&#038;&#038;"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 b<c[3]-0},gt:function(a,b,c){return b>c[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<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&#038;&#038;e===0)return!0;f=b[0],g=a.parentNode;if(g&#038;&#038;(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&#038;&#038;(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&#038;&#038;j/c>=0}},ID:function(a,b){return a.nodeType===1&#038;&#038;a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&#038;&#038;a.nodeType===1||!!a.nodeName&#038;&#038;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&#038;&#038;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&#038;&#038;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)&#038;4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&#038;&#038;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&#038;&#038;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="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&#038;&#038;(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&#038;&#038;!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&#038;&#038;e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&#038;&#038;a.getAttributeNode("id");return a.nodeType===1&#038;&#038;c&#038;&#038;c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&#038;&#038;(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&#038;&#038;d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&#038;&#038;typeof a.firstChild.getAttribute!="undefined"&#038;&#038;a.firstChild.getAttribute("href")!=="#"&#038;&#038;(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&#038;&#038;function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="</p>
<p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&#038;&#038;!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&#038;&#038;(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&#038;&#038;o.find.CLASS&#038;&#038;e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&#038;&#038;e.body)return s([e.body],f);if(h&#038;&#038;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&#038;&#038;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,"\\$&#038;"):e.setAttribute("id",n),q&#038;&#038;p&#038;&#038;(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)&#038;&#038;!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&#038;&#038;a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="</p>
<div class='test e'></div>
<div class='test'></div>
<p>";if(!!a.getElementsByClassName&#038;&#038;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"&#038;&#038;!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&#038;&#038;(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&#038;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;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)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<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&#038;&#038;(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=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&#038;&#038;g.ownerDocument&#038;&#038;g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&#038;&#038;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<e;d++){g=this[d];while(g){if(i?i.index(g)>-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]&#038;&#038;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&#038;&#038;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&#038;&#038;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&#038;&#038;typeof d=="string"&#038;&#038;(e=f.filter(d,e)),e=this.length>1&#038;&#038;!R[a]?f.unique(e):e,(this.length>1||N.test(d))&#038;&#038;M.test(a)&#038;&#038;(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&#038;&#038;(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&#038;&#038;g.nodeType!==9&#038;&#038;(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&#038;&#038;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&#038;&#038;++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&#038;&#038;a!==b&#038;&#038;c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/
<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")[\\s/>]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"
<select multiple='multiple'>","</select>
<p>"],legend:[1,"</p>
<fieldset>","</fieldset>
<p>"],thead:[1,"</p>
<table>","</table>
<p>"],tr:[2,"</p>
<table>
<tbody>","</tbody>
</table>
<p>"],td:[3,"</p>
<table>
<tbody>
<tr>","</tr>
</tbody>
</table>
<p>"],col:[2,"</p>
<table>
<tbody></tbody>
<colgroup>","</colgroup>
</table>
<p>"],area:[1,"
<map>","</map>
<p>"],_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</p>
<div>","</div>
<p>"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&#038;&#038;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&#038;&#038;b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&#038;&#038;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&#038;&#038;this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&#038;&#038;this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&#038;&#038;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]&#038;&#038;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&#038;&#038;d.nodeType===1&#038;&#038;(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&#038;&#038;d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&#038;&#038;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"&#038;&#038;!ba.test(a)&#038;&#038;(f.support.leadingWhitespace||!X.test(a))&#038;&#038;!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&#038;&#038;(f.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(g){}}c&#038;&#038;this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){if(this[0]&#038;&#038;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"&#038;&#038;(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&#038;&#038;arguments.length===3&#038;&#038;typeof j=="string"&#038;&#038;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&#038;&#038;j.parentNode,f.support.parentNode&#038;&#038;i&#038;&#038;i.nodeType===11&#038;&#038;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&#038;&#038;f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&#038;&#038;l<n?f.clone(h,!0,!0):h)}k.length&#038;&#038;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&#038;&#038;b.parentNode.removeChild(b)})}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&#038;&#038;b[0]&#038;&#038;(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&#038;&#038;typeof j=="string"&#038;&#038;j.length<512&#038;&#038;i===c&#038;&#038;j.charAt(0)==="<"&#038;&#038;!bb.test(j)&#038;&#038;(f.support.checkClone||!bd.test(j))&#038;&#038;(f.support.html5Clone||!bc.test(j))&#038;&#038;(g=!0,h=f.fragments[j],h&#038;&#038;h!==1&#038;&#038;(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&#038;&#038;(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&#038;&#038;this[0].parentNode;if(g&#038;&#038;g.nodeType===11&#038;&#038;g.childNodes.length===1&#038;&#038;e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&#038;&#038;(a.nodeType===1||a.nodeType===11)&#038;&#038;!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&#038;&#038;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"&#038;&#038;(b=b.ownerDocument||b[0]&#038;&#038;b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&#038;&#038;(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1></$2>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&#038;&#038;!s?p.firstChild&#038;&#038;p.firstChild.childNodes:n[1]==="</p>
<table>"&#038;&#038;!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&#038;&#038;!t[i].childNodes.length&#038;&#038;t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&#038;&#038;X.test(l)&#038;&#038;p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&#038;&#038;(p.parentNode.removeChild(p),q.length>0&#038;&#038;(r=q[q.length-1],r&#038;&#038;r.parentNode&#038;&#038;r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&#038;&#038;typeof (u=l.length)=="number")for(i=0;i<u;i++)bn(l[i]);else bn(l);l.nodeType?j.push(l):j=f.merge(j,l)}if(d){g=function(a){return!a.type||be.test(a.type)};for(k=0;j[k];k++){h=j[k];if(e&#038;&#038;f.nodeName(h,"script")&#038;&#038;(!h.type||be.test(h.type)))e.push(h.parentNode?h.parentNode.removeChild(h):h);else{if(h.nodeType===1){var v=f.grep(h.getElementsByTagName("script"),g);j.splice.apply(j,[k+1,0].concat(v))}d.appendChild(h)}}}return j},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&#038;&#038;f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&#038;&#038;b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&#038;&#038;(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&#038;&#038;i.removeAttribute(f.expando),delete d[c]}}}});var bp=/alpha\([^)]*\)/i,bq=/opacity=([^)]*)/,br=/([A-Z]|^ms)/g,bs=/^[\-+]?(?:\d*\.)?\d+$/i,bt=/^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,bu=/^([\-+])=([\-+.\de]+)/,bv=/^margin/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Top","Right","Bottom","Left"],by,bz,bA;f.fn.css=function(a,c){return f.access(this,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)},a,c,arguments.length>1)},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&#038;&#038;a.nodeType!==3&#038;&#038;a.nodeType!==8&#038;&#038;!!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&#038;&#038;"get"in k&#038;&#038;(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&#038;&#038;(g=bu.exec(d))&#038;&#038;(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&#038;&#038;isNaN(d))return;h==="number"&#038;&#038;!f.cssNumber[i]&#038;&#038;(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"&#038;&#038;(c="float");if(g&#038;&#038;"get"in g&#038;&#038;(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&#038;&#038;c.defaultView.getComputedStyle&#038;&#038;(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&#038;&#038;(e=d.getComputedStyle(a,null))&#038;&#038;(c=e.getPropertyValue(b),c===""&#038;&#038;!f.contains(a.ownerDocument.documentElement,a)&#038;&#038;(c=f.style(a,b))),!f.support.pixelMargin&#038;&#038;e&#038;&#038;bv.test(b)&#038;&#038;bt.test(c)&#038;&#038;(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&#038;&#038;(bA=function(a,b){var c,d,e,f=a.currentStyle&#038;&#038;a.currentStyle[b],g=a.style;f==null&#038;&#038;g&#038;&#038;(e=g[b])&#038;&#038;(f=e),bt.test(f)&#038;&#038;(c=g.left,d=a.runtimeStyle&#038;&#038;a.runtimeStyle.left,d&#038;&#038;(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&#038;&#038;(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&#038;&#038;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&#038;&#038;d.filter||c.filter||"";c.zoom=1;if(b>=1&#038;&#038;f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&#038;&#038;!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&#038;&#038;f.expr.filters&#038;&#038;(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&#038;&#038;c===0||!f.support.reliableHiddenOffsets&#038;&#038;(a.style&#038;&#038;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[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&#038;])_=[^&#038;]*/,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"&#038;&#038;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&#038;&#038;(f.isFunction(c)?(d=c,c=b):typeof c=="object"&#038;&#038;(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()&#038;&#038;(a.done(function(a){c=a}),i.html(g?f("</p>
<div>").append(c.replace(bM,"")).find(g):c)),d&#038;&#038;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&#038;&#038;!this.disabled&#038;&#038;(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)&#038;&#038;(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&#038;&#038;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&#038;&#038;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&#038;&#038;(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&#038;&#038;g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&#038;&#038;(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&#038;&#038;(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&#038;&#038;(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&#038;&#038;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(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&#038;&#038;(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&#038;&#038;r[2]==bV[2]&#038;&#038;(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&#038;&#038;d.processData&#038;&#038;typeof d.data!="string"&#038;&#038;(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&#038;&#038;f.active++===0&#038;&#038;f.event.trigger("ajaxStart");if(!d.hasContent){d.data&#038;&#038;(d.url+=(bL.test(d.url)?"&#038;":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&#038;":"?")+"_="+x:"")}}(d.data&#038;&#038;d.hasContent&#038;&#038;d.contentType!==!1||c.contentType)&#038;&#038;v.setRequestHeader("Content-Type",d.contentType),d.ifModified&#038;&#038;(k=k||d.url,f.lastModified[k]&#038;&#038;v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&#038;&#038;v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&#038;&#038;d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&#038;&#038;(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&#038;&#038;g.trigger("ajaxSend",[v,d]),d.async&#038;&#038;d.timeout>0&#038;&#038;(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&#038;&#038;(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&#038;&#038;!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("&#038;").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&#038;|$)|\?\?/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"&#038;&#038;/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&#038;&#038;(cd.test(b.url)||e&#038;&#038;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&#038;&#038;(j=j.replace(cd,l),b.url===j&#038;&#038;(e&#038;&#038;(k=k.replace(cd,l)),b.data===k&#038;&#038;(j+=(/\?/.test(j)?"&#038;":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&#038;&#038;f.isFunction(i)&#038;&#038;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&#038;&#038;(a.cache=!1),a.crossDomain&#038;&#038;(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&#038;&#038;(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&#038;&#038;d.parentNode&#038;&#038;e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&#038;&#038;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&#038;&#038;ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&#038;&#038;"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&#038;&#038;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&#038;&#038;h.overrideMimeType&#038;&#038;h.overrideMimeType(c.mimeType),!c.crossDomain&#038;&#038;!e["X-Requested-With"]&#038;&#038;(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&#038;&#038;c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&#038;&#038;(e||h.readyState===4)){d=b,i&#038;&#038;(h.onreadystatechange=f.noop,ce&#038;&#038;delete cg[i]);if(e)h.readyState!==4&#038;&#038;h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&#038;&#038;n.documentElement&#038;&#038;(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&#038;&#038;c.isLocal&#038;&#038;!c.crossDomain?j=m.text?200:404:j===1223&#038;&#038;(j=204)}}}catch(p){e||g(-1,p)}m&#038;&#038;g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&#038;&#038;(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&#038;&#038;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&#038;&#038;(e=d.style.display,!f._data(d,"olddisplay")&#038;&#038;e==="none"&#038;&#038;(e=d.style.display=""),(e===""&#038;&#038;f.css(d,"display")==="none"||!f.contains(d.ownerDocument.documentElement,d))&#038;&#038;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&#038;&#038;(e=f.css(d,"display"),e!=="none"&#038;&#038;!f._data(d,"olddisplay")&#038;&#038;f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&#038;&#038;(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&#038;&#038;f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(ct("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&#038;&#038;f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&#038;&#038;f(this).is(":hidden"),g,h,i,j,k,l,m,n,o,p,q;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&#038;&#038;(a[g]=a[i],delete a[i]);if((k=f.cssHooks[g])&#038;&#038;"expand"in k){l=k.expand(a[g]),delete a[g];for(i in l)i in a||(a[i]=l[i])}}for(g in a){h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&#038;&#038;b.specialEasing[g]||b.easing||"swing";if(h==="hide"&#038;&#038;d||h==="show"&#038;&#038;!d)return b.complete.call(this);c&#038;&#038;(g==="height"||g==="width")&#038;&#038;(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&#038;&#038;f.css(this,"float")==="none"&#038;&#038;(!f.support.inlineBlockNeedsLayout||cu(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&#038;&#038;(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cm.test(h)?(q=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),q?(f._data(this,"toggle"+i,q==="show"?"hide":"show"),j[q]()):j[h]()):(m=cn.exec(h),n=j.cur(),m?(o=parseFloat(m[2]),p=m[3]||(f.cssNumber[i]?"":"px"),p!=="px"&#038;&#038;(f.style(this,i,(o||1)+p),n=(o||1)/j.cur()*n,f.style(this,i,n+p)),m[1]&#038;&#038;(o=(m[1]==="-="?-1:1)*o+n),j.custom(n,o,p)):j.custom(n,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&#038;&#038;(d=c,c=a,a=b),c&#038;&#038;a!==!1&#038;&#038;this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&#038;&#038;g[b].stop&#038;&#038;b.indexOf(".run")===b.length-4&#038;&#038;h(this,g,b);else g[b=a+".run"]&#038;&#038;g[b].stop&#038;&#038;h(this,g,b);for(b=e.length;b--;)e[b].elem===this&#038;&#038;(a==null||e[b].queue===a)&#038;&#038;(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&#038;&#038;f.dequeue(this,a)})}}),f.each({slideDown:ct("show",1),slideUp:ct("hide",1),slideToggle:ct("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&#038;&#038;typeof a=="object"?f.extend({},a):{complete:c||!c&#038;&#038;b||f.isFunction(a)&#038;&#038;a,duration:a,easing:c&#038;&#038;b||b&#038;&#038;!f.isFunction(b)&#038;&#038;b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&#038;&#038;d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&#038;&#038;f._unmark(this)};return d},easing:{linear:function(a){return a},swing:function(a){return-Math.cos(a*Math.PI)/2+.5}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&#038;&#038;this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&#038;&#038;(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cq||cr(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){f._data(e.elem,"fxshow"+e.prop)===b&#038;&#038;(e.options.hide?f._data(e.elem,"fxshow"+e.prop,e.start):e.options.show&#038;&#038;f._data(e.elem,"fxshow"+e.prop,e.end))},h()&#038;&#038;f.timers.push(h)&#038;&#038;!co&#038;&#038;(co=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cq||cr(),g=!0,h=this.elem,i=this.options;if(a||e>=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&#038;&#038;(g=!1);if(g){i.overflow!=null&#038;&#038;!f.support.shrinkWrapBlocks&#038;&#038;f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&#038;&#038;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&#038;&#038;(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<b.length;c++)a=b[c],!a()&#038;&#038;b[c]===a&#038;&#038;b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(co),co=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&#038;&#038;a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(cp.concat.apply([],cp),function(a,b){b.indexOf("margin")&#038;&#038;(f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)})}),f.expr&#038;&#038;f.expr.filters&#038;&#038;(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cv,cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?cv=function(a,b,c,d){try{d=a.getBoundingClientRect()}catch(e){}if(!d||!f.contains(c,a))return d?{top:d.top,left:d.left}:{top:0,left:0};var g=b.body,h=cy(b),i=c.clientTop||g.clientTop||0,j=c.clientLeft||g.clientLeft||0,k=h.pageYOffset||f.support.boxModel&#038;&#038;c.scrollTop||g.scrollTop,l=h.pageXOffset||f.support.boxModel&#038;&#038;c.scrollLeft||g.scrollLeft,m=d.top+k-i,n=d.left+l-j;return{top:m,left:n}}:cv=function(a,b,c){var d,e=a.offsetParent,g=a,h=b.body,i=b.defaultView,j=i?i.getComputedStyle(a,null):a.currentStyle,k=a.offsetTop,l=a.offsetLeft;while((a=a.parentNode)&#038;&#038;a!==h&#038;&#038;a!==c){if(f.support.fixedPosition&#038;&#038;j.position==="fixed")break;d=i?i.getComputedStyle(a,null):a.currentStyle,k-=a.scrollTop,l-=a.scrollLeft,a===e&#038;&#038;(k+=a.offsetTop,l+=a.offsetLeft,f.support.doesNotAddBorder&#038;&#038;(!f.support.doesAddBorderForTableAndCells||!cw.test(a.nodeName))&#038;&#038;(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),g=e,e=a.offsetParent),f.support.subtractsBorderForOverflowNotVisible&#038;&#038;d.overflow!=="visible"&#038;&#038;(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),j=d}if(j.position==="relative"||j.position==="static")k+=h.offsetTop,l+=h.offsetLeft;f.support.fixedPosition&#038;&#038;j.position==="fixed"&#038;&#038;(k+=Math.max(c.scrollTop,h.scrollTop),l+=Math.max(c.scrollLeft,h.scrollLeft));return{top:k,left:l}},f.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){f.offset.setOffset(this,a,b)});var c=this[0],d=c&#038;&#038;c.ownerDocument;if(!d)return null;if(c===d.body)return f.offset.bodyOffset(c);return cv(c,d,d.documentElement)},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&#038;&#038;(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&#038;&#038;(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&#038;&#038;f.inArray("auto",[h,i])>-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)&#038;&#038;(b=b.call(a,c,g)),b.top!=null&#038;&#038;(k.top=b.top-g.top+m),b.left!=null&#038;&#038;(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&#038;&#038;!cx.test(a.nodeName)&#038;&#038;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&#038;&#038;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&#038;&#038;j||i.body&#038;&#038;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"&#038;&#038;define.amd&#038;&#038;define.amd.jQuery&#038;&#038;define("jquery",[],function(){return f})})(window);
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/*!
 * ClearlyComponent
 * Offer up Clearly's content detection algorithm as an embeddable component.
 *
 * http://evernote.com/clearly/
 * Copyright 2012, Evernote Corporation
 *
 * Requires:
 *   window.jQueryForClearlyComponent -- an instance of jQuery
 *
 * Definition:
 *   window.ClearlyComponent
 *     getContentElementAndHTML(_windowObject, _callbackFunction) {
 *       _callbackFunction({
 *         '_elements':     [ (nodeObjects) ],
 *         '_html':         (string),
 *         '_title':        (string),
 *         '_multiPage':    (bool),
 *         '_rtl':          (bool)
 *       });
 *     }
 *     getOtherPagesHTML(_callbackFunction) {
 *       _callbackFunction(
 *         [
 *           {
 *             '_html': (string),
 *             '_url': (string) 
 *           }
 *         ]
 *       );
 *     }
 */
function initClearly( window ) { /* override window object and undefined */</p>
<p>    //  set main objects
    //  ================
        var $C = { 'version': '3335.890.162' };
        var $ = window.jQueryForClearlyComponent;
        var $R = { 'component': true };</p>
<p>    //  getContentElementAndHTML
    //  ========================
        $C.getContentElementAndHTML = function (_windowObject, _callbackFunction)
        {
            //  we're basically duplicating $R.getContent__find
            //  ===============================================</p>
<p>            //	get content
            //	===========
                var 
                    _found = $R.getContent__findInPage($R.win),
                    _targetNode = _found._targetCandidate.__node,
                    _$targetNode = $(_targetNode),
                    _aboveNodes = []
                ;</p>
<p>            //	RTL
            //	===
                switch (true)
                {
                    case (_$targetNode.attr('dir') == 'rtl'):
                    case (_$targetNode.css('direction') == 'rtl'):
                        $R.makeRTL();
                        break;
                }</p>
<p>            //  get html
            //  ========
                var 
                    _foundHTML = _found._html,
                    _firstFragmentBefore = $R.getContent__nextPage__getFirstFragment(_foundHTML),
                    _documentTitle = ($R.document.title > '' ? $R.document.title : '')
                ;</p>
<p>            //  get title
            //  =========</p>
<p>                //  has title already?
                _foundHTML = $R.getContent__find__isolateTitleInHTML(_foundHTML, _documentTitle);
                $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML);
                $R.debugPrint('TitleSource', 'target');</p>
<p>                //  get html above?
                if ($R.articleTitle > ''); else
                {</p>
<p>    //  get html above target?
    //  ======================</p>
<p>    //  global vars:
    //      _found
    //      _foundHTML
    //      _documentTitle
    //      _aboveNodes</p>
<p>    var 
        _prevNode = _found._targetCandidate.__node,
        _prevHTML = '',
        _aboveHTML = '',
        _differentTargets = (_found._firstCandidate.__node != _found._targetCandidate.__node)
    ;</p>
<p>    (function () 
    {</p>
<p>        while (true)
        {
            //  the end?
            switch (true)
            {
                case (_prevNode.tagName &#038;&#038; (_prevNode.tagName.toLowerCase() == 'body')):
                case (_differentTargets &#038;&#038; (_prevNode == _found._firstCandidate.__node)):
                    //  enough is enough
                    return;
            }</p>
<p>            //  up or sideways?
            if (_prevNode.previousSibling); else
            {
                _prevNode = _prevNode.parentNode;
                continue;
            }</p>
<p>            //	previous
            _prevNode = _prevNode.previousSibling;</p>
<p>            //	outline -- element might be re-outlined, when buildHTML is invoked
            if ($R.debug) { $R.debugOutline(_prevNode, 'target', 'add-above'); }</p>
<p>            //	get html; add
            _prevHTML = $R.getContent__buildHTMLForNode(_prevNode, 'above-the-target');
            _aboveHTML = _prevHTML + _aboveHTML;
            _aboveNodes.unshift(_prevNode);</p>
<p>            //  isolate title
            _aboveHTML = $R.getContent__find__isolateTitleInHTML(_aboveHTML, _documentTitle);</p>
<p>            //	finished?
            switch (true)
            {
                case ($R.measureText__getTextLength(_aboveHTML.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ')) > (65 * 3 * 3)):
                case ($R.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
                    return;
            }
        }</p>
<p>    })();</p>
<p>    //  is what we found any good?
    //  ==========================
    switch (true)
    {
        case ($R.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
        case (_differentTargets &#038;&#038; (_aboveHTML.split('<a ').length < 3) &#038;&#038; ($R.measureText__getTextLength(_aboveHTML.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ')) < (65 * 3))):
            _foundHTML = _aboveHTML + _foundHTML;
            break;</p>
<p>        default:
            _aboveHTML = '';
            _aboveNodes = [];
            break;
    }</p>
<p>                    $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML);
                    $R.debugPrint('TitleSource', 'above_HTML');</p>
<p>                    //  get document title?
                    if ($R.articleTitle > ''); else
                    {</p>
<p>    //  if all else failed, get document title
    //  ======================================</p>
<p>    //  global vars:
    //      _foundHTML
    //      _documentTitle</p>
<p>    (function ()
    {
        //  return?
        //  =======
            if (_documentTitle > ''); else { return; }</p>
<p>        //  vars
            var
                _doc_title_parts = [],
                _doc_title_pregs =
                [
                    /( [-][-] |( [-] )|( [>][>] )|( [<][<] )|( [|] )|( [\/] ))/i,
                    /(([:] ))/i
                ]
            ;</p>
<p>        //	loop through pregs
        //  ==================
            for (var i=0, _i=_doc_title_pregs.length; i<_i; i++)
            {
                //	split
                _doc_title_parts = _documentTitle.split(_doc_title_pregs[i]);</p>
<p>                //	break if we managed a split
                if (_doc_title_parts.length > 1) { break; }
            }</p>
<p>        //	sort title parts -- longer goes higher up -- i.e. towards 0
        //	================
            _doc_title_parts.sort(function (a, b)
            {
                switch (true)
                {
                    case (a.length > b.length): return -1;
                    case (a.length < b.length): return 1;
                    default: return 0;
                }
            });</p>
<p>        //	set title -- first part, if more than one word; otherwise, whole
        //  =========
            _foundHTML = ''</p>
<p>                + $R.articleTitleMarker__start
                +   (_doc_title_parts[0].split(/\s+/i).length > 1 ? _doc_title_parts[0] : _documentTitle) 
                + $R.articleTitleMarker__end </p>
<p>                + _foundHTML
            ;</p>
<p>    })();
                        $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML);
                        $R.debugPrint('TitleSource', 'document_title');
                    }
                }</p>
<p>            //	remember
            //	========
                $R.debugRemember['theTarget'] = _found._targetCandidate.__node;
                $R.debugRemember['firstCandidate'] = _found._firstCandidate.__node;</p>
<p>            //	next
            //	====
                $C._nextPages = [];</p>
<p>                $R.nextPage__firstFragment__firstPage = _firstFragmentBefore;
                $R.nextPage__firstFragment__lastPage = $R.getContent__nextPage__getFirstFragment(_foundHTML);;</p>
<p>                $R.nextPage__loadedPages = [$R.win.location.href];
                $R.getContent__nextPage__find($R.win, _found._links);</p>
<p>            //	result
            var
                _result = {
                    '_html': _foundHTML,
                    '_title': $R.articleTitle,
                    '_multiPage': ($R.nextPage__loadedPages.length > 1),
                    '_rtl': $R.rtl
                }
            ;</p>
<p>            //  add elements
            _result['_elements'] = _aboveNodes;
            _result['_elements'].push(_found._targetCandidate.__node);</p>
<p>            //  return
            _callbackFunction(_result);
        };</p>
<p>    //  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);
                    }
                }
            ;</p>
<p>            //  set first timeout
            window.setTimeout(_checkFunction, 2000);
        };</p>
<p>    //  includes -- bind to $R
    //  ========</p>
<p>        //  target
        //  ======</p>
<p>            //  globals
            //  =======
                $R.win = window;
                $R.document = window.document;</p>
<p>                $R.$win = $($R.win);
                $R.$document = $($R.document);</p>
<p>            //	init
            //	====</p>
<p>    //  version
    //  =======
        $R.version = '3335.890.162';</p>
<p>	//	paths	
	//	=====
		$R.paths = 
		{
			'main':		'none',
			'evernote':	'https://www.evernote.com/'
		};</p>
<p>	//	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',</p>
<p>            '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'
		};</p>
<p>            //	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];
                    }</p>
<p>                //  css
                //  ===
                    _component__in_page_css_element.setAttribute('id', '_clearly_component__css');
                    _component__in_page_css_element.setAttribute('type', 'text/css');</p>
<p>                    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)); }</p>
<p>                    _body.appendChild(_component__in_page_css_element);</p>
<p>                //  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');</p>
<p>        //  bulk
        //  ====</p>
<p>            //	debug
            //	=====</p>
<p>	//	defaults to false
	if ($R.debug); else { $R.debug = false; }</p>
<p>	//	make it faster -- when not debugging
	//	==============
	if (!($R.debug))
	{
		$R.debugRemember = {};</p>
<p>		$R.writeLog 		= function () { return false; };
		$R.log 				= function () { return false; };</p>
<p>		$R.debugTimerStart 	= function () { return false; };
		$R.debugTimerEnd 	= function () { return false; };</p>
<p>		$R.debugPrint 		= function () { return false; };
		$R.printDebugOutput = function () { return false; };</p>
<p>		$R.debugOutline 	= function () { return false; };
	}
	else
	{
		//	remember stuff
			$R.debugRemember = {};</p>
<p>		//	vars
		//	====
			$R.debugStuff = [];
			$R.debugTimers = [];</p>
<p>		//	write log
		//	=========
			$R.initializeWriteLogFunction = function ()
			{
				switch (true)
				{
					case (!(!($R.win.console &#038;&#038; $R.win.console.log))):
						$R.writeLog = function (msg) { $R.win.console.log(msg); };
						break;</p>
<p>					case (!(!($R.win.opera &#038;&#038; $R.win.opera.postError))):
						$R.writeLog = function (msg) { $R.win.opera.postError(msg); };
						break;</p>
<p>					default:
						$R.writeLog = function (msg) {};
						break;
				}
			};</p>
<p>		//	log
		//	===
			$R.initializeWriteLogFunction();
			$R.log = function ()
			{
                if ($R.debug); else { return; }</p>
<p>				for (var i=0, il=arguments.length; i<il ; i++)
					{ $R.writeLog(arguments[i]); }</p>
<p>				$R.writeLog('-----------------------------------------');
			};</p>
<p>		//	outline
		//	=======
			$R.debugOutline = function (_element, _category, _reason)
			{
				switch (true)
				{
                    case (!$R.debug):
					case (!(_element.nodeType === 1)):
					case (!(_element.tagName > '')):
					case (_element.tagName.toLowerCase() == 'onject'):
					case (_element.tagName.toLowerCase() == 'embed'):
						return;
                }</p>
<p>                var 
                    _outline = '#ff5500',
                    _background = 'rgba(255, 85, 0, 0.5)'
                ;</p>
<p>                //  choose
                switch (true)
                {
                    case (_category == 'target' &#038;&#038; _reason == 'first'):
                        _outline = '#00cc00';
                        _background = 'rgba(0, 255, 0, 0.5)';
                        break;</p>
<p>                    case (_category == 'target' &#038;&#038; _reason == 'second'):
                        _outline = '#0000cc';
                        _background = 'rgba(0, 0, 255, 0.5)';
                        break;</p>
<p>                    //  =====</p>
<p>                    case (_category == 'target' &#038;&#038; _reason == 'next-page'):
                        _outline = '#FF80C0';
                        _background = 'rgba(255, 128, 192, 0.5)';
                        break;</p>
<p>                    case (_category == 'target' &#038;&#038; _reason == 'add-above'):
                        _outline = '#804000';
                        _background = 'rgba(128, 64, 0, 0.5)';
                        break;</p>
<p>                    //  =====</p>
<p>                    case (_category == 'clean-before' &#038;&#038; _reason == 'floating'):
                        _outline = '#808080';
                        _background = 'rgba(128, 128, 128, 0.5)';
                        break;</p>
<p>                    case (_category == 'clean-after' &#038;&#038; _reason == 'missing-density'):
                        _outline = '#C0C0C0';
                        _background = 'rgba(192, 192, 192, 0.5)';
                        break;</p>
<p>                    case (_category == 'clean-after' || _category == 'clean-before'):
                        _outline = '#000000';
                        _background = 'rgba(0, 0, 0, 0.5)';
                        break;
                }</p>
<p>                //  do
                $(_element).attr('readable__outline', (_category + ': ' + _reason));
                $(_element).css({
                    'outline': '5px solid ' + _outline,
                    'background-color': '' + _background
                });
			};</p>
<p>            $R.debugBackground = function (_element, _category, _reason)
            {
                if ($R.debug); else { return; }</p>
<p>				switch (true)
				{
					case (!(_element.nodeType === 1)):
					case (!(_element.tagName > '')):
					case (_element.tagName.toLowerCase() == 'onject'):
					case (_element.tagName.toLowerCase() == 'embed'):
						//	don't outline
						break;</p>
<p>					default:
						var _color = 'transparent';
						switch (true)
						{
							case (_category == 'target' &#038;&#038; _reason == 'first'): 				_color = '';	break;
							case (_category == 'target' &#038;&#038; _reason == 'second'): 				_color = '';	break;</p>
<p>							case (_category == 'target' &#038;&#038; _reason == 'next-page'):				_color = '#FF80C0'; break;
							case (_category == 'target' &#038;&#038; _reason == 'add-above'): 			_color = '#804000'; break;</p>
<p>							case (_category == 'clean-before' &#038;&#038; _reason == 'floating'): 		_color = '#808080'; break;
							case (_category == 'clean-after' &#038;&#038; _reason == 'missing-density'): 	_color = '#C0C0C0'; break;</p>
<p>							case (_category == 'clean-after' || _category == 'clean-before'):	_color = '#000000'; break;
						}</p>
<p>						$(_element).css('outline','5px solid '+_color);
						$(_element).attr('readable__outline', (_category + ': ' + _reason));
						break;
				}
            };</p>
<p>		//	timers
		//	======
			$R.debugTimerStart = function (timerName)
			{
				$R.debugTimers.push({
					'name': timerName,
					'start': (new Date()).getTime()
				});
			};</p>
<p>			$R.debugTimerEnd = function ()
			{
				var _t = $R.debugTimers.pop(), _time = ((new Date()).getTime() - _t.start);
				$R.log('TIMER / '+_t.name+': ' + _time);
				return _time;
			};</p>
<p>		//	output -- will be shown in Show function
		//	======
			$R.debugPrint = function (_key, _value)
				{ $R.debugStuff[_key] = _value; };</p>
<p>			$R.printDebugOutput = function ()
			{
				//	return
					if ($R.debug); else { return; }
					if ($R.customScript) { return; }</p>
<p>				//	first
					var _first =
					[
                        'Language',
						'ExploreAndGetStuff',
						'ProcessFirst',
						'ProcessSecond',
						'BuildHTML',
						'BuildHTMLPregs',
                        'PointsFirst',
                        'PointsSecond',
                        'Target',
						'NextPage',
                        'TitleSource'
					];</p>
<p>				//	get and clean
					_$debug = $('#debugOutput');
					_$debug.html('');</p>
<p>				//	write
					var _debug_write = function (_key, _value)
					{
						_$debug.append(''
							+ '</p>
<tr>'
							+ 	'</p>
<td class="caption">'
							+		_key
							+ 	'</td>
<p>'
							+ 	'</p>
<td id="debugOutput__value__'+_key+'" class="value">'
							+		_value
							+ 	'</td>
<p>'
							+ '</tr>
<p>'	
						);
					}</p>
<p>				//	first
					for (var i=0, _i=_first.length; i<_i; i++)
						{ _debug_write(_first[i], $R.debugStuff[_first[i]]); delete($R.debugStuff[_first[i]]); }</p>
<p>				//	the rest
					for (var _k in $R.debugStuff)
						{ _debug_write(_k, $R.debugStuff[_k]); }</p>
<p>				//	end; stop
					$R.debugPrint = function () {};
					$R.printDebugOutput = function () {};
			};</p>
<p>		//	scriptable scrolling
			$R.debugScroll__before1 = function () { $R.win.scrollTo(0, 0); };
			$R.debugScroll__before2 = function () { $R.win.scrollTo(0, $R.$win.height()); };
			$R.debugScroll__before3 = function () { if ($($R.debugRemember['theTarget']).height() > 0) { $R.debugRemember['theTarget'].scrollIntoView(false); } else { $R.debugRemember['firstCandidate'].scrollIntoView(false); } $R.win.scrollBy(0, 100); };</p>
<p>			$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); };
	}</p>
<p>                $R.debug = false;</p>
<p>            //	environment
            //	===========</p>
<p>	//	environtment
	//	============</p>
<p>		$R.mac = (!$R.iOS &#038;&#038; ($R.win.navigator.userAgent.match(/Macintosh/i) != null));</p>
<p>        //  get browser</p>
<p>//  var -- gets filled in
//  ===
    var __the_browser = 'unknown';</p>
<p>//  possible values -- in this order
//  ===============
/*
    firefox
    safari
    chrome
    internet_explorer
    opera</p>
<p>    iphone
    ipad</p>
<p>    android
    dolphin
    firefox_mobile
    chrome_mobile</p>
<p>    windows_phone
*/    </p>
<p>//  doing work    
//  ==========
    __the_browser = (function ()
    {
        //  ua string
        //  =========
            var _ua = window.navigator.userAgent.toLowerCase();</p>
<p>        //  cases
        //  =====</p>
<p>            if ((_ua.indexOf('windows phone') > -1))                            { return 'windows_phone'; }</p>
<p>            if ((_ua.indexOf('chrome') > -1) &#038;&#038; (_ua.indexOf('android') > -1))  { return 'chrome_mobile'; }
            if ((_ua.indexOf('firefox') > -1) &#038;&#038; (_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'; }</p>
<p>            if ((_ua.indexOf('ipad') > -1))                                     { return 'ipad'; }
            if ((_ua.indexOf('iphone') > -1))                                   { return 'iphone'; }</p>
<p>            if ($.browser.opera)                                                { return 'opera'; }
            if ($.browser.msie)                                                 { return 'internet_explorer'; }
            if ($.browser.webkit &#038;&#038; (_ua.indexOf('chrome') > -1))               { return 'chrome'; }
            if ($.browser.webkit &#038;&#038; (_ua.indexOf('safari') > -1))               { return 'safari'; }
            if ($.browser.mozilla)                                              { return 'firefox'; }
    })();
        $R.browser = __the_browser;</p>
<p>    //  language specific stuff
    //  =======================</p>
<p>        //  default
        $R.language = 'general';</p>
<p>        //  the text - start with title
        var _test_text = ' ' + $R.document.title;</p>
<p>        //  add couple of random paragraphs, divs
        var 
            _ps = $R.document.getElementsByTagName('p'),
            _ds = $R.document.getElementsByTagName('div')
        ;</p>
<p>        //  add
        for (var i=0; i<5; i++) { _test_text += ' ' + $(_ps[Math.floor(Math.random()*_ps.length)]).text(); }
        for (var i=0; i<5; i++) { _test_text += ' ' + $(_ds[Math.floor(Math.random()*_ds.length)]).text(); }</p>
<p>        //  check
        switch (true)
        {
        //    case ($R.win.location.host.match(/\.jp$/i) != null):
        //    case ($R.win.location.host.match(/\.cn$/i) != null):
        //    case ($R.win.location.host.match(/\.tw$/i) != null):
        //    case ($R.win.location.host.match(/\.hk$/i) != null):
        //    case ($R.win.location.host.match(/\.kr$/i) != null):</p>
<p>            case (_test_text.match(/([\u3000])/gi) != null):
            case (_test_text.match(/([\u3001])/gi) != null):
            case (_test_text.match(/([\u3002])/gi) != null):
            case (_test_text.match(/([\u301C])/gi) != null):</p>
<p>                $R.language = 'cjk';
                break;
        }</p>
<p>        //  in case we stop
        $R.debugPrint('Language', $R.language);</p>
<p>            //	rtl
            //	===</p>
<p>	//	var
	//	===
		$R.rtl = false;</p>
<p>	//	functions
	//	=========
		$R.makeRTL = function ()
		{
            //  set
			$R.rtl = true;</p>
<p>            //  as component; return
            if ($R.component) { return; }</p>
<p>            $('#curtain__rtl__radio__rtl').get(0).checked = true;
            $('#curtain__rtl__radio__ltr').get(0).checked = false;</p>
<p>            $('html')
				.attr('dir', 'rtl')
				.addClass('couldBeRTL')
				.addClass('rtl');</p>
<p>            $R.$pages
                .attr('dir', 'rtl')
                .addClass('rtl');
		};</p>
<p>		$R.makeNotRTL = function ()
		{
            //  set
			$R.rtl = false;</p>
<p>            //  as component; return
            if ($R.component) { return; }</p>
<p>			$('#curtain__rtl__radio__rtl').get(0).checked = false;
			$('#curtain__rtl__radio__ltr').get(0).checked = true;</p>
<p>            $('html')
				.attr('dir', '')
				.removeClass('rtl');</p>
<p>            $R.$pages
                .attr('dir', '')
                .removeClass('rtl');
		};</p>
<p>	//	detect
	//	======
		(function ()
		{
			//	definitely rtl
			$R.$document.find('html, body').each(function (_i, _e)
			{
				switch (true) {
					case ($(_e).attr('dir') == 'rtl'):
					case ($(_e).css('direction') == 'rtl'):</p>
<p>					case ($(_e).attr('lang') == 'he'):
					case ($(_e).attr('lang') == 'he-il'):
					case ($(_e).attr('lang') == 'ar'):
					case ($(_e).attr('lang') == 'ur'):</p>
<p>						$R.makeRTL();
						return false;
				}
			});</p>
<p>			//	maybe rtl
            //  =========
            if ($R.component); else
            {
                if ((!$R.rtl) &#038;&#038; ($R.$document.find("div[dir='rtl'], table[dir='rtl'], td[dir='rtl']").length > 0))
                    { $('html').addClass('couldBeRTL'); }
            }
		})();</p>
<p>	//	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; });
        }</p>
<p>            //	measure text
            //	============</p>
<p>	//	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</p>
<p>	//	length
	//	======
		$R.measureText__getTextLength = function (_the_text)
		{
			var _text = _the_text;</p>
<p>				_text = _text.replace(/[\s\n\r]+/gi, '');
				//_text = _text.replace(/\d+/, '');</p>
<p>			return _text.length;
		};</p>
<p>	//	word count
	//	==========
		$R.measureText__getWordCount = function (_the_text)
		{
			var _text = _the_text;</p>
<p>			//	do stuff
			//	========
				_text = _text.replace(/[\s\n\r]+/gi, ' ');</p>
<p>				_text = _text.replace(/([.,?!:;()\[\]'""-])/gi, ' $1 ');</p>
<p>				_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)]');</p>
<p>			//	count
			//	=====
				var 
					_count = 0,
					_words_match = _text.match(/([^\s\d]{3,})/gi)
				;	</p>
<p>				//	add match
				_count += (_words_match != null ? _words_match.length : 0);</p>
<p>				//	add manual count
				_text.replace(/\[=words\((\d)\)\]/, function (_match, _plus) { _count += (5 * parseInt(_plus)); });</p>
<p>			//	return
			//	======
				return _count;
		};</p>
<p>	//	levenshtein
	//	===========	
		$R.levenshteinDistance = function (str1, str2)
		{
			var l1 = str1.length, l2 = str2.length;
			if (Math.min(l1, l2) === 0)
				{ return Math.max(l1, l2); }</p>
<p>			var i = 0, j = 0, d = [];
			for (i = 0 ; i <= l1 ; i++)
			{
				d[i] = [];
				d[i][0] = i;
			}</p>
<p>			for (j = 0 ; j <= l2 ; j++)
				{ d[0][j] = j; }</p>
<p>			for (i = 1 ; i <= l1 ; i++)
			{
				for (j = 1 ; j <= l2 ; j++)
				{
					d[i][j] = Math.min
					(
						d[i - 1][j] + 1,
						d[i][j - 1] + 1, 
						d[i - 1][j - 1] + (str1.charAt(i - 1) === str2.charAt(j - 1) ? 0 : 1)
					);
				}
			}
			return d[l1][l2];
		};</p>
<p>            //	content
            //	=======</p>
<p>	$R.footnotedLinksCount = 0;</p>
<p>	$R.getContent = function ()
	{
		//	homepage?
		if ($R.win.location.href == ($R.win.location.protocol + '//' + $R.win.location.host + '/'))
			{ $('html').addClass('showTips'); }</p>
<p>		//	selection or whole
		switch (true)
		{
			case ($R.getContent__manualSelection()):
			case ($R.getContent__find()):
				break;</p>
<p>			default:
				break;
		}</p>
<p>		//	debug
		$R.printDebugOutput();</p>
<p>		//	show content
		$R.showContent();
	};</p>
<p>	$R.getContent__manualSelection = function ()
	{
		var 
			_selection = $R.sel.getSelection($R.win),
			_range = $R.sel.getRange(_selection),
			_html = $R.sel.getRangeHTML(_range),
			_text = $R.sel.getRangeText(_range)
		;</p>
<p>		if (_html > '' &#038;&#038; _text > ''); else
		{
			_html = null;
			_text = null;</p>
<p>			$R.$document.find('frame, iframe').each(function (_i, _e)
			{
				if (_e.getAttribute('id') == 'readable_iframe') { return; }</p>
<p>				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)
					;</p>
<p>					if (__html > '' &#038;&#038; __text > '')
					{
						_html = __html;
						_text = __text;</p>
<p>						// stop the each
						return false;
					}
				}
				catch(e) { }
			});
		}</p>
<p>		//	haven't found anything		
		if (_html > '' &#038;&#038; _text > ''); else { return false; }</p>
<p>		//	probably selected something by mistake
		if ($R.measureText__getTextLength(_text) > (65 * 3 * 1.5)); else { return false; }</p>
<p>		//	display
		//	=======
			$R.$pages.html('');
			$R.displayPageHTML(_html, 1, 'selection');</p>
<p>		//	return true
		return true;
	};</p>
<p>//	functions
//	=========</p>
<p>	$R.sel = {};</p>
<p>	$R.sel.getWindowFromDocument = function (theDocument)
	{
		if (theDocument); else { return null; }</p>
<p>		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;
			};
		}</p>
<p>		return arguments.calee(theDocument);
	};</p>
<p>	$R.sel.getSelection = function (theWindow)
	{
		if (theWindow); else { return null; }</p>
<p>		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;
			};
		}</p>
<p>		return arguments.calee(theWindow);
	};</p>
<p>	$R.sel.getRange = function (selection)
	{
		if (selection); else { return null; }</p>
<p>		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;
			};
		}</p>
<p>		return arguments.calee(selection);
	};</p>
<p>	$R.sel.getRangeHTML = function (range)
	{
		if (range); else { return null; }</p>
<p>		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;
			};
		}</p>
<p>		return arguments.calee(range);
	};</p>
<p>	$R.sel.getRangeText = function (range)
	{
		if (range); else { return null; }</p>
<p>		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;
			};
		}</p>
<p>		return arguments.calee(range);
	};</p>
<p>	//	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'],</p>
<p>				'video': 	['src', 'width', 'height', 'poster', 'audio', 'preload', 'autoplay', 'loop', 'controls'],
				'audio': 	['src', 'preload', 'autoplay', 'loop', 'controls'],		 
				'source': 	['src', 'type'],</p>
<p>				'object': 	['data', 'type', 'width', 'height', 'classid', 'codebase', 'codetype'],						
				'param': 	['name', 'value'],
				'embed': 	['src', 'type', 'width', 'height', 'flashvars', 'allowscriptaccess', 'allowfullscreen', 'bgcolor'],</p>
<p>				'iframe':	['src', 'width', 'height', 'frameborder', 'scrolling'],</p>
<p>				'td':		['colspan', 'rowspan'],			
				'th':		['colspan', 'rowspan']
			}
		};</p>
<p>	//	next page keywords -- (?? charCodeAt() > 127)
	//	==================
		$R.nextPage__captionKeywords = 
		[
			/* english */
			'next page', 'next',</p>
<p>			/* german */
			'vorw&#228;rts', 'weiter',</p>
<p>			/* japanese */
			'&#27425;&#12408;'
		];</p>
<p>		$R.nextPage__captionKeywords__not =
		[
			/* english */
			'article', 'story', 'post', 'comment', 'section', 'chapter'</p>
<p>		];</p>
<p>	//	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'
		];</p>
<p>	//	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'
		];</p>
<p>	//	keep video
	//	==========</p>
<p>		$R.keepStuffFromDomain__video = 
		[
			'youtube.com',
			'youtube-nocookie.com',</p>
<p>			'vimeo.com',
			'hulu.com',
			'yahoo.com',
			'flickr.com',
			'newsnetz.ch'
		];</p>
<p>	$R.getContent__exploreNodeAndGetStuff = function (_nodeToExplore, _justExploring)
	{
		var	
			_global__element_index = 0,</p>
<p>			_global__inside_link = false,
			_global__inside_link__element_index = 0,</p>
<p>			_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 = '',</p>
<p>			_return__containers = [],
			_return__candidates = [],
			_return__links = []
		;</p>
<p>		//	recursive function
		//	==================
		var _recursive = function (_node)
		{
			//	increment index
			//	starts with 1
			_global__element_index++;</p>
<p>			var 
				_tag_name = (_node.nodeType === 3 ? '#text' : ((_node.nodeType === 1 &#038;&#038; _node.tagName &#038;&#038; _node.tagName > '') ? _node.tagName.toLowerCase() : '#invalid')),
				_result =
				{
					'__index': _global__element_index, 
					'__node': _node, </p>
<p>					'_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,</p>
<p>					'_debug__above__plain_text': _global__above__plain_text,
					'_debug__above__links_text': _global__above__links_text,</p>
<p>					'_length__above_plain_text': _global__length__above_plain_text,
					'_count__above_plain_words': _global__count__above_plain_words,</p>
<p>					'_length__above_links_text': _global__length__above_links_text,
					'_count__above_links_words': _global__count__above_links_words,</p>
<p>					'_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),</p>
<p>                    '_count__above_candidates': _global__count__above_candidates,
                    '_count__above_containers': _global__count__above_containers,</p>
<p>					'_length__plain_text': 0,
					'_count__plain_words': 0,</p>
<p>					'_length__links_text': 0,
					'_count__links_words': 0,</p>
<p>					'_length__all_text': 0,
					'_count__all_words': 0,</p>
<p>					'_count__containers': 0,
					'_count__candidates': 0,</p>
<p>					'_count__links': 0,
					'_count__links_skip': 0,</p>
<p>					'_count__images_small': 0,
					'_count__images_medium': 0,
					'_count__images_large': 0,
					'_count__images_skip': 0
				};</p>
<p>			//	fast return
			//	===========
				switch (true)
				{
					case ((_tag_name == '#invalid')):
					case (($R.parsingOptions._elements_ignore.indexOf('|'+_tag_name+'|') > -1)):
						return;</p>
<p>					case (($R.parsingOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1)):</p>
<p>	//	included inline
	//	_node, _tag_name must be defined
	//	will return, if node is hidden</p>
<p>	switch (true)
	{
		case (_node.offsetWidth > 0):
		case (_node.offsetHeight > 0):
			break;</p>
<p>		default:
			switch (true)
			{
				case (_node.offsetLeft > 0):
				case (_node.offsetTop > 0):
					break;</p>
<p>				default:
                    //  exclude inline DIVs -- which, stupidly, don't have a width/height
                    if ((_tag_name == 'div') &#038;&#038; ((_node.style.display || $.css( _node, "display" )) == 'inline'))
                        { break; }</p>
<p>                    //  it's hidden; exit current scope
					return;
			}
			break;
	}</p>
<p>						break;</p>
<p>					//	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;
				}</p>
<p>			//	do stuff
			//	========
				switch (true)
				{
					//	text node
					//	=========
						case ((_tag_name == '#text')):
							//	mark
							_result._is__text = true;</p>
<p>							//	get
							var _nodeText = _node.nodeValue;</p>
<p>							//	result
							_result._length__plain_text = $R.measureText__getTextLength(_nodeText);
							_result._count__plain_words = $R.measureText__getWordCount(_nodeText);</p>
<p>							if (_global__inside_link)
							{
								_global__length__above_links_text += _result._length__plain_text;
								_global__count__above_links_words += _result._count__plain_words;					
								if (false &#038;&#038; $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 &#038;&#038; $R.debug) { _global__above__plain_text += ' ' + _nodeText; }
							}</p>
<p>							//	return text
							return _result;</p>
<p>					//	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);
                        }</p>
<p>							//	sanity
							if (_href > ''); else { break; }
							if (_href.indexOf); else { break; }</p>
<p>							_result._is__link = true;</p>
<p>							//	skip
							for (var i=0, _i=$R.skipStuffFromDomains__links.length; i<_i; i++)
							{
								if (_node.href.indexOf($R.skipStuffFromDomains__links[i]) > -1)
									{ _result._is__link_skip = true; break; }
							}</p>
<p>							//	inside link
							if (_global__inside_link); else
							{
								_global__inside_link = true;
								_global__inside_link__element_index = _result.__index;
							}</p>
<p>							//	done
							_return__links.push(_result);
							break;</p>
<p>					//	image
					//	=====
						case (_tag_name == 'img'):</p>
<p>							//	skip
							//	====
								if (_node.src &#038;&#038; _node.src.indexOf)
								{
									for (var i=0, _i=$R.skipStuffFromDomain__images.length; i<_i; i++)
									{
										if (_node.src.indexOf($R.skipStuffFromDomain__images[i]) > -1)
											{ _result._is__image_skip = true; break; }
									}
								}</p>
<p>							//	size
							//	====
								var	_width = $(_node).width(), _height = $(_node).height();
								switch (true)
								{
									case ((_width * _height) >= 50000):
									case ((_width >= 350) &#038;&#038; (_height >= 75)):
										_result._is__image_large = true;
										break;</p>
<p>									case ((_width * _height) >= 20000):
									case ((_width >= 150) &#038;&#038; (_height >= 150)):
										_result._is__image_medium = true;
										break;</p>
<p>									case ((_width <= 5) &#038;&#038; (_height <= 5)):
										_result._is__image_skip = true;
										break;</p>
<p>									default:
										_result._is__image_small = true;
										break;
								}</p>
<p>							break;
				}</p>
<p>			//	child nodes
			//	===========
				for (var i=0, _i=_node.childNodes.length; i<_i; i++)
				{
					var 
						_child = _node.childNodes[i],
						_child_result = _recursive(_child)
					;</p>
<p>					//	if false, continue
					//	==================
						if (_child_result); else { continue; }</p>
<p>					//	add to result
					//	=============
						_result._count__links += 			_child_result._count__links + 			(_child_result._is__link ? 1 : 0);
						_result._count__links_skip += 		_child_result._count__links_skip + 		(_child_result._is__link_skip ? 1 : 0);</p>
<p>						_result._count__images_small += 	_child_result._count__images_small + 	(_child_result._is__image_small ? 1 : 0);
						_result._count__images_medium += 	_child_result._count__images_medium + 	(_child_result._is__image_medium ? 1 : 0);
						_result._count__images_large += 	_child_result._count__images_large + 	(_child_result._is__image_large ? 1 : 0);
						_result._count__images_skip += 		_child_result._count__images_skip + 	(_child_result._is__image_skip ? 1 : 0);</p>
<p>						_result._count__containers += 		_child_result._count__containers + 		(_child_result._is__container ? 1 : 0);
						_result._count__candidates += 		_child_result._count__candidates + 		(_child_result._is__candidate ? 1 : 0);</p>
<p>						_result._length__all_text += 		_child_result._length__plain_text + 	_child_result._length__links_text;
						_result._count__all_words += 		_child_result._count__plain_words + 	_child_result._count__links_words;</p>
<p>						//	plain text / link text
						//	======================
							switch (true)
							{
								case (_child_result._is__link):
									//	no text to add
									_result._length__links_text += (_child_result._length__plain_text + _child_result._length__links_text);
									_result._count__links_words += (_child_result._count__plain_words + _child_result._count__links_words);
									break;</p>
<p>								default:
									_result._length__plain_text += 			_child_result._length__plain_text;
									_result._count__plain_words += 			_child_result._count__plain_words;
									_result._length__links_text += 			_child_result._length__links_text;
									_result._count__links_words += 			_child_result._count__links_words;
									break;
							}
				}</p>
<p>			//	after child nodes
			//	=================</p>
<p>				//	mark as not in link anymore
				//	===========================
					if (true
						&#038;&#038; (_result._is__link) 
						&#038;&#038; (_global__inside_link__element_index == _result.__index)
					) {
						_global__inside_link = false;
						_global__inside_link__element_index = 0;
					}</p>
<p>			//	add to containers
			//	=================
				if (_result._is__container || ((_result.__index == 1) &#038;&#038; (_justExploring == true)))
				{
					//	add to containers
					_return__containers.push(_result);</p>
<p>                    //  increase above containers
                    if (_result._is__container) { _global__count__above_containers++; }</p>
<p>					//	add to candidates
					if (_justExploring); else
					{
						switch (true)
						{
							case (($R.language != 'cjk') &#038;&#038; ((_result._count__links * 2) >= _result._count__plain_words)):  /* link ratio */</p>
<p>                            case (($R.language != 'cjk') &#038;&#038; (_result._length__plain_text < (65 / 3))):  /* text length */
							case (($R.language != 'cjk') &#038;&#038; (_result._count__plain_words < 5)):			/* words */</p>
<p>                            case (($R.language == 'cjk') &#038;&#038; (_result._length__plain_text < 10)):	    /* text length */
							case (($R.language == 'cjk') &#038;&#038; (_result._count__plain_words < 2)):			/* words */</p>
<p>							//case (_result._length__plain_text == 0):    /* no text */
							//case (_result._count__plain_words == 0):    /* no words */</p>
<p>                            //case (($R.language == 'cjk') &#038;&#038; ((_result._length__plain_text / 65 / 3) < 0.1)):				/* paragrahs of 3 lines */
							//case (($R.language != 'cjk') &#038;&#038; ((_result._count__plain_words / 50) < 0.5)):					/* paragraphs of 50 words */</p>
<p>                                //	not a valid candidate
                                //if (_tag_name == 'div') { $R.log('bad candidate', _result.__node); }</p>
<p>                                break;</p>
<p>							default:
								//	good candidate
								_result._is__candidate = true;
								_return__candidates.push(_result);</p>
<p>                                //  increase above candidates
                                _global__count__above_candidates++;</p>
<p>								break;
						}</p>
<p>						//	special case for body -- if it was just skipped
						//	=====================
							if ((_result.__index == 1) &#038;&#038; !(_result._is__candidate))
							{
								_result._is__candidate = true;
								_result._is__bad = true;
								_return__candidates.push(_result);
							}
					}
				}</p>
<p>			//	return
			//	======
				return _result;
		};</p>
<p>		//	actually do it
		//	==============
			_recursive(_nodeToExplore);</p>
<p>		//	just exploring -- return first thing
		//	==============
			if (_justExploring) { return _return__containers.pop(); }</p>
<p>		//	return containers list
		//	======================
			return {
				'_containers': 	_return__containers,
				'_candidates': 	_return__candidates,
				'_links': 		_return__links
			};
	};</p>
<p>	$R.getContent__processCandidates = function (_candidatesToProcess)
	{
		//	process this var
		//	================
			var _candidates = _candidatesToProcess;</p>
<p>		//	sort _candidates -- the lower in the dom, the closer to position 0
		//	================
			_candidates.sort(function (a, b)
			{
				switch (true)
				{
					case (a.__index < b.__index): return -1;
					case (a.__index > b.__index): return 1;
					default: return 0;
				}
			});</p>
<p>		//	get first
		//	=========
			var	_main = _candidates[0]
			if ($R.debug) { $R.log('should be body', _main, _main.__node); }</p>
<p>		//	pieces of text
		//	and points computation
		//	======================
			for (var i=0, _i=_candidates.length; i<_i; i++)
			{
				//	pieces
				//	======
					var 
						_count__pieces = 0,
						_array__pieces = []
					;</p>
<p>					for (var k=i, _k=_candidates.length; k<_k; k++)
					{
						if (_candidates[k]._count__candidates > 0) { continue; }
						if ($.contains(_candidates[i].__node, _candidates[k].__node)); else { continue; }</p>
<p>						//	store piece, if in debug mode
						if ($R.debug) { _array__pieces.push(_candidates[k]); }</p>
<p>						//	incement pieces count
						_count__pieces++;
					}</p>
<p>				//	candidate details
				//	=================
					_candidates[i]['__candidate_details'] = $R.getContent__computeDetailsForCandidate(_candidates[i], _main);</p>
<p>				//	pieces -- do this here because _main doesn't yet have a pieces count
				//	======</p>
<p>					//	set pieces
					_candidates[i]['_count__pieces'] = _count__pieces;
					_candidates[i]['_array__pieces'] = _array__pieces;</p>
<p>					//	pieces ratio
					_candidates[i]['__candidate_details']['_ratio__count__pieces_to_total_pieces'] = (_count__pieces / (_candidates[0]._count__pieces + 1));</p>
<p>                //  check some more
                //  ===============
                /*    switch (true)
                    {
                        case (($R.language != 'cjk') &#038;&#038; (_candidates[i]['__candidate_details']['_ratio__length__links_text_to_plain_text'] > 1)):
                        case (($R.language != 'cjk') &#038;&#038; (_candidates[i]['__candidate_details']['_ratio__count__links_words_to_plain_words'] > 1)):
                            _candidates[i]._is__bad = true;
                            break;
                    }*/</p>
<p>				//	points
				//	======
					_candidates[i].__points_history = $R.getContent__computePointsForCandidate(_candidates[i], _main);
					_candidates[i].__points = _candidates[i].__points_history[0];
			}</p>
<p>		//	sort _candidates -- the more points, the closer to position 0
		//	================
			_candidates.sort(function (a, b)
			{
				switch (true)
				{
					case (a.__points > b.__points): return -1;
					case (a.__points < b.__points): return 1;
					default: return 0;
				}
			});</p>
<p>		//	return
		//	======
			return _candidates;	
	};</p>
<p>	$R.getContent__computeDetailsForCandidate = function (_e, _main)
	{
		var _r = {};</p>
<p>		//	bad candidate
		//	=============
			if (_e._is__bad) { return _r; }</p>
<p>		//	paragraphs
		//	==========
			_r['_count__lines_of_65_characters'] = (_e._length__plain_text / 65);
			_r['_count__paragraphs_of_3_lines'] =  (_r._count__lines_of_65_characters / 3);
			_r['_count__paragraphs_of_5_lines'] =  (_r._count__lines_of_65_characters / 5);</p>
<p>			_r['_count__paragraphs_of_50_words'] = (_e._count__plain_words / 50);
			_r['_count__paragraphs_of_80_words'] = (_e._count__plain_words / 80);</p>
<p>		//	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);</p>
<p>		//	links
		//	=====
			_r['_ratio__length__links_text_to_plain_text'] =  (_e._length__links_text / _e._length__plain_text);
			_r['_ratio__count__links_words_to_plain_words'] = (_e._count__links_words / _e._count__plain_words);</p>
<p>			_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);</p>
<p>			_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));</p>
<p>			_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);</p>
<p>		//	text above
		//	==========
            var 
                _divide__candidates = Math.max(2, Math.ceil(_e._count__above_candidates * 0.5)),</p>
<p>                _above_text = ((0
                    + (_e._length__above_plain_text * 1)
                    + (_e._length__above_plain_text / _divide__candidates)
                ) / 2),</p>
<p>                _above_words = ((0
                    + (_e._count__above_plain_words * 1)
                    + (_e._count__above_plain_words / _divide__candidates)
                ) / 2)
            ;</p>
<p>			_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);</p>
<p>		//	candidates
		//	==========
			_r['_ratio__count__candidates_to_total_candidates'] = (_e._count__candidates / (_main._count__candidates + 1));
			_r['_ratio__count__containers_to_total_containers'] = (_e._count__containers / (_main._count__containers + 1));</p>
<p>		//	return
		//	======
			return _r;
	};</p>
<p>	$R.getContent__computePointsForCandidate = function (_e, _main)
	{
		var 
			_details = _e.__candidate_details,
			_points_history = [],
            _really_big = ((_main._length__plain_text / 65) > 250)
		;</p>
<p>		//	bad candidate
		if (_e._is__bad) { return [0]; }</p>
<p>		//	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));</p>
<p>            //  negative
            if (_points_history[0] < 0) { return [0]; }</p>
<p>        //  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))
            ;</p>
<p>            _points_history.unshift(((0
                + (_points_history[0] * 3)
                + (_points_history[0] / _divide__pieces)
                + (_points_history[0] / _divide__candidates)
                + (_points_history[0] / _divide__containers)
            ) / 6));</p>
<p>		//	total text
		//	==========
			$R.getContent__computePointsForCandidate__do(0.10, 2, (1 - (1 - _details._ratio__length__plain_text_to_total_plain_text)), _points_history);
			$R.getContent__computePointsForCandidate__do(0.10, 2, (1 - (1 - _details._ratio__count__plain_words_to_total_plain_words)), _points_history);</p>
<p>            if (_really_big) {
            $R.getContent__computePointsForCandidate__do(0.10, 4, (1 - (1 - _details._ratio__length__plain_text_to_total_plain_text)), _points_history);
            $R.getContent__computePointsForCandidate__do(0.10, 4, (1 - (1 - _details._ratio__count__plain_words_to_total_plain_words)), _points_history);
            }</p>
<p>		//	text above
		//	==========
			$R.getContent__computePointsForCandidate__do(0.10, 5, (1 - _details._ratio__length__above_plain_text_to_total_plain_text), _points_history);
			$R.getContent__computePointsForCandidate__do(0.10, 5, (1 - _details._ratio__count__above_plain_words_to_total_plain_words), _points_history);</p>
<p>            if (_really_big) {
            $R.getContent__computePointsForCandidate__do(0.10, 10, (1 - _details._ratio__length__above_plain_text_to_total_plain_text), _points_history);
            $R.getContent__computePointsForCandidate__do(0.10, 10, (1 - _details._ratio__count__above_plain_words_to_total_plain_words), _points_history);
            }</p>
<p>		//	links outer
		//	===========
            $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__length__links_text_to_total_links_text), _points_history);
            $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__links_words_to_total_links_words), _points_history);</p>
<p>            $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__links_to_total_links), _points_history);</p>
<p>        //  links inner
        //  ===========
            var __lr = ($R.language == 'cjk' ? 0.75 : 0.50);</p>
<p>            $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);</p>
<p>            $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__length__links_text_to_all_text), _points_history);
            $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_words_to_all_words), _points_history);</p>
<p>            $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_to_plain_words), _points_history);</p>
<p>		//	candidates, containers, pieces
		//	==============================
			$R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__candidates_to_total_candidates), _points_history);
			$R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__containers_to_total_containers), _points_history);
			$R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__pieces_to_total_pieces), _points_history);</p>
<p>		//	return -- will get [0] as the actual final points
		//	======
			return _points_history;
	};</p>
<p>	$R.getContent__processCandidatesSecond = function (_processedCandidates)
	{
		var 
			_candidates = _processedCandidates,
			_main = _candidates[0]
		;</p>
<p>		//	only get children of target
		//	===========================
			_candidates = $.map(_candidates, function (_element, _index)
			{
				switch (true)
				{
					case (!(_index > 0)):
					case (!($.contains(_main.__node, _element.__node))):
						return null;</p>
<p>					default:
						return _element;
				}
			});</p>
<p>            //  add main - to amke sure the result is never blank
            _candidates.unshift(_main);</p>
<p>		//	sort _candidates -- the lower in the dom, the closer to position 0
		//	================
			_candidates.sort(function (a, b)
			{
				switch (true)
				{
					case (a.__index < b.__index): return -1;
					case (a.__index > b.__index): return 1;
					default: return 0;
				}
			});</p>
<p>		//	second candidate computation
		//	============================
			for (var i=0, _i=_candidates.length; i<_i; i++)
			{
				//	additional numbers
				//	==================
					_candidates[i].__second_length__above_plain_text = (_candidates[i]._length__above_plain_text - _main._length__above_plain_text);
					_candidates[i].__second_count__above_plain_words = (_candidates[i]._count__above_plain_words - _main._count__above_plain_words);</p>
<p>				//	candidate details
				//	=================
					_candidates[i]['__candidate_details_second'] = $R.getContent__computeDetailsForCandidateSecond(_candidates[i], _main);</p>
<p>				//	check some more
				//	===============
				/*	switch (true)
					{
                        case (!(_candidates[i]['__candidate_details_second']['_ratio__count__plain_words_to_total_plain_words'] > 0.05)):
						case (!(_candidates[i]['__candidate_details_second']['_ratio__length__plain_text_to_total_plain_text'] > 0.05)):</p>
<p>						//case (!(_candidates[i]['__candidate_details_second']['_ratio__count__above_plain_words_to_total_plain_words'] < 0.1)):
						//case (!(_candidates[i]['__candidate_details_second']['_ratio__length__above_plain_text_to_total_plain_text'] < 0.1)):</p>
<p>                        //case (_candidates[i]['__candidate_details_second']['_ratio__length__above_plain_text_to_plain_text'] > 1):
                        //case (_candidates[i]['__candidate_details_second']['_ratio__count__above_plain_words_to_plain_words'] > 1):</p>
<p>                            _candidates[i]._is__bad = true;
							//	wil set points to 0, in points computation function
							break;
					}*/</p>
<p>				//	points
				//	======
					_candidates[i].__points_history_second = $R.getContent__computePointsForCandidateSecond(_candidates[i], _main);
					_candidates[i].__points_second = _candidates[i].__points_history_second[0];
			}</p>
<p>		//	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;
				}
			});</p>
<p>		//	return
		//	======
			return _candidates;	
	};</p>
<p>	$R.getContent__computeDetailsForCandidateSecond = function (_e, _main)
	{
		var _r = {};</p>
<p>		//	bad candidate
		//	=============
			if (_e._is__bad) { return _r; }</p>
<p>		//	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);</p>
<p>		//	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);</p>
<p>			_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));</p>
<p>			_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);</p>
<p>		//	text above
		//	==========</p>
<p>            var 
                _divide__candidates = Math.max(2, Math.ceil((_e._count__above_candidates - _main._count__above_candidates) * 0.5)),</p>
<p>                _above_text = ((0
                    + (_e.__second_length__above_plain_text * 1)
                    + (_e.__second_length__above_plain_text / _divide__candidates)
                ) / 2),</p>
<p>                _above_words = ((0
                    + (_e.__second_count__above_plain_words * 1)
                    + (_e.__second_count__above_plain_words / _divide__candidates)
                ) / 2)
            ;</p>
<p>			_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);</p>
<p>			_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);</p>
<p>		//	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));</p>
<p>		//	return
		//	======
			return _r;
	};</p>
<p>	$R.getContent__computePointsForCandidateSecond = function (_e, _main)
	{
		var 
			_details = _e.__candidate_details,
			_details_second = _e.__candidate_details_second,
			_points_history = []
		;</p>
<p>		//	bad candidate
		if (_e._is__bad) { return [0]; }</p>
<p>		//	get initial points
		//	==================
			_points_history.unshift(_e.__points_history[(_e.__points_history.length-1)]);</p>
<p>        //  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))
            ;</p>
<p>            _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));</p>
<p>		//	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);</p>
<p>		//	text above
		//	==========
            var __ar = ($R.language == 'cjk' ? 0.50 : 0.10);</p>
<p>			$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);</p>
<p>			$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);</p>
<p>		//	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);</p>
<p>		//	links inner
		//	===========
            var __lr = ($R.language == 'cjk' ? 0.75 : 0.50);</p>
<p>			$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);</p>
<p>			$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);</p>
<p>			$R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details_second._ratio__count__links_to_plain_words), _points_history);</p>
<p>		//	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);</p>
<p>		//	return -- will get [0] as the actual final points
		//	======
			return _points_history;
	};</p>
<p>	$R.getContent__computePointsForCandidateThird = function (_e, _main)
	{
		var 
			_details = _e.__candidate_details,
			_details_second = _e.__candidate_details_second,
			_points_history = []
		;</p>
<p>		//	bad candidate
		if (_e._is__bad) { return [0]; }</p>
<p>		//	get initial points
		//	==================
			_points_history.unshift(_e.__points_history[(_e.__points_history.length-1)]);</p>
<p>        //  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))
            ;</p>
<p>            _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));</p>
<p>        //  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);</p>
<p>        //	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);</p>
<p>            $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);</p>
<p>            $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);</p>
<p>        //	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);</p>
<p>            $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);</p>
<p>            $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__links_to_plain_words), _points_history);</p>
<p>        //	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);</p>
<p>		//	return -- will get [0] as the actual final points
		//	======
			return _points_history;
    };</p>
<p>    $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)
        ;</p>
<p>        if (_ratio < 0)
        {
            //_points_return = (0.75 * _points_remaining);
            _points_return = _points_remaining;
        }
        else
        {
            _points_return = 0
                + _points_remaining
                + (_points_to_compute * Math.pow(_ratio, _power))
            ;
        }</p>
<p>        //	add
        _points_history.unshift(_points_return);
    };</p>
<p>	$R.getContent__buildHTMLForNode = function (_nodeToBuildHTMLFor, _custom_mode)
	{
		var 
			_global__element_index = 0,
			_global__the_html = '',
			_global__exploreNodeToBuildHTMLFor = $R.getContent__exploreNodeAndGetStuff(_nodeToBuildHTMLFor, true)
		;</p>
<p>		//	custom
		//	======
		switch (_custom_mode)
		{
			case 'above-the-target':
				_global__exploreNodeToBuildHTMLFor = false;
				break;
		}</p>
<p>		//	recursive function
		//	==================
		var _recursive = function (_node)
		{
			//	increment index -- starts with 1
			//	===============
				_global__element_index++;</p>
<p>			//	vars
			//	====
				var 
					_explored = false,
					_tag_name = (_node.nodeType === 3 ? '#text' : ((_node.nodeType === 1 &#038;&#038; _node.tagName &#038;&#038; _node.tagName > '') ? _node.tagName.toLowerCase() : '#invalid')),
					_pos__start__before = 0,
					_pos__start__after = 0,
					_pos__end__before = 0,
					_pos__end__after = 0
				;</p>
<p>			//	fast return
			//	===========
				switch (true)
				{
					case ((_tag_name == '#invalid')):
					case (($R.parsingOptions._elements_ignore.indexOf('|'+_tag_name+'|') > -1)):
						return;</p>
<p>					case (_tag_name == '#text'):
						_global__the_html += _node.nodeValue
							.replace(/</gi, '&lt;')
							.replace(/>/gi, '&gt;')
						;
						return;
				}</p>
<p>			//	hidden
			//	======
				if ($R.parsingOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1)
					{ 	
	//	included inline
	//	_node, _tag_name must be defined
	//	will return, if node is hidden</p>
<p>	switch (true)
	{
		case (_node.offsetWidth > 0):
		case (_node.offsetHeight > 0):
			break;</p>
<p>		default:
			switch (true)
			{
				case (_node.offsetLeft > 0):
				case (_node.offsetTop > 0):
					break;</p>
<p>				default:
                    //  exclude inline DIVs -- which, stupidly, don't have a width/height
                    if ((_tag_name == 'div') &#038;&#038; ((_node.style.display || $.css( _node, "display" )) == 'inline'))
                        { break; }</p>
<p>                    //  it's hidden; exit current scope
					return;
			}
			break;
	}
 }</p>
<p>			//	clean -- before
			//	=====</p>
<p>	//	just a return will skip the whol element
	//	including children</p>
<p>	//	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)
				;</p>
<p>				if (_skip); else
				{
					//	default skip
					_skip = true;</p>
<p>					//	loop
					for (var i=0, _i=$R.keepStuffFromDomain__video.length; i<_i; i++)
						{ if (_src.indexOf($R.keepStuffFromDomain__video[i]) > -1) { _skip = false; break; } }
				}</p>
<p>				//	skip?
				if (_skip)
					{ $R.debugOutline(_node, 'clean-before', 'object-embed-iframe'); return; }</p>
<p>				break;
		}</p>
<p>	//	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) &#038;&#038; (_explored._length__plain_text < 65)):
					$R.debugOutline(_node, 'clean-before', 'skip-link');
					return;
			}
		}</p>
<p>	//	link density
	//	============
		if ($R.parsingOptions._elements_link_density.indexOf('|'+_tag_name+'|') > -1)
		{
			_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
			switch (true)
			{
                case (_explored._length__plain_text > (65 * 3 * 2)):
                case ($R.language == 'cjk' &#038;&#038; (_explored._length__plain_text > (65 * 3 * 1))):
				case (!(_explored._count__links > 1)):
				case (_global__exploreNodeToBuildHTMLFor &#038;&#038; (_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.5):
				case (_global__exploreNodeToBuildHTMLFor &#038;&#038; (_explored._count__plain_words / _global__exploreNodeToBuildHTMLFor._count__plain_words) > 0.5):
				case ((_explored._length__plain_text == 0) &#038;&#038; (_explored._count__links == 1) &#038;&#038; (_explored._length__links_text < 65)):
				case ((_explored._length__plain_text < 25) &#038;&#038; ((_explored._count__images_large + _explored._count__images_medium) > 0)):
					break;</p>
<p>				case ((_explored._length__links_text / _explored._length__all_text) < 0.5):
					if (_explored._count__links > 0); else { break; }
					if (_explored._count__links_skip > 0); else { break; }
					if (((_explored._count__links_skip / _explored._count__links) > 0.25) &#038;&#038; (_explored._length__links_text / _explored._length__all_text) < 0.05) { break; }</p>
<p>				default:
					$R.debugOutline(_node, 'clean-before', 'link-density');
					return;
			}
		}	</p>
<p>	//	floating
	//	========
		if ($R.parsingOptions._elements_floating.indexOf('|'+_tag_name+'|') > -1)
		{
			_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
			switch (true)
			{
				case (_explored._length__plain_text > (65 * 3 * 2)):
                case ($R.language == 'cjk' &#038;&#038; (_explored._length__plain_text > (65 * 3 * 1))):
				case (_global__exploreNodeToBuildHTMLFor &#038;&#038; (_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.25):
				case (_global__exploreNodeToBuildHTMLFor &#038;&#038; (_explored._count__plain_words / _global__exploreNodeToBuildHTMLFor._count__plain_words) > 0.25):
				case ((_explored._length__plain_text < 25) &#038;&#038; (_explored._length__links_text < 25) &#038;&#038; ((_explored._count__images_large + _explored._count__images_medium) > 0)):
				case (_node.getElementsByTagName &#038;&#038; (_explored._length__plain_text < (65 * 3 * 1)) &#038;&#038; ((_node.getElementsByTagName('h1').length + _node.getElementsByTagName('h2').length + _node.getElementsByTagName('h3').length + _node.getElementsByTagName('h4').length) > 0)):
                    break;</p>
<p>				default:
					var _float = $(_node).css('float');
					if (_float == 'left' || _float == 'right'); else { break; }
					if ((_explored._length__links_text == 0) &#038;&#038; ((_explored._count__images_large + _explored._count__images_medium) > 0)) { break; }</p>
<p>					$R.debugOutline(_node, 'clean-before', 'floating');
					return;
			}
		}</p>
<p>	//	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; }</p>
<p>            //  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; }
			}</p>
<p>            //  has too many links?
            //if (_node.getElementsByTagName &#038;&#038; _node.getElementsByTagName('a').length > 5)
            //    { $R.debugOutline(_node, 'clean-before', 'above-target'); return; }
		}</p>
<p>    //  headers that are images
    //  =======================
		if (_tag_name.match(/^h(1|2|3|4|5|6)$/gi))
		{
			_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
			switch (true)
			{
				case ((_explored._length__plain_text < 10) &#038;&#038; ((_explored._count__images_small + _explored._count__images_medium + _explored._count__images_large + _explored._count__images_skip) > 0)):
					$R.debugOutline(_node, 'clean-before', 'skip-heading');
					return;
			}
		}</p>
<p>			//	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;</p>
<p>					//	attributes
					//	==========</p>
<p>	//	allowed attributes
	//	==================
		if (_tag_name in $R.parsingOptions._elements_keep_attributes)
		{
			for (var i=0, _i=$R.parsingOptions._elements_keep_attributes[_tag_name].length; i<_i; i++)
			{
				var 
					_attribute_name = $R.parsingOptions._elements_keep_attributes[_tag_name][i],
					_attribute_value = _node.getAttribute(_attribute_name)
				;</p>
<p>				//	if present
				if (_attribute_value > '')
					{ _global__the_html += ' '+_attribute_name+'="'+(_attribute_value)+'"'; }
			}
		}</p>
<p>	//	keep ID for all elements
	//	========================
		var _id_attribute = _node.getAttribute('id');
		if (_id_attribute > '')
			{ _global__the_html += ' id="'+_id_attribute+'"'; }</p>
<p>	//	links target NEW
	//	================
		if (_tag_name == 'a')
			{ _global__the_html += ' target="_blank"'; }</p>
<p>					//	close start
					//	===========
						if ($R.parsingOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1) { _global__the_html += ' />'; }
						else { _global__the_html += '>';}</p>
<p>					/* mark */ _pos__start__after = _global__the_html.length;
				}</p>
<p>			//	child nodes
			//	===========
				if ($R.parsingOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1); else
				{
					for (var i=0, _i=_node.childNodes.length; i<_i; i++)
						{ _recursive(_node.childNodes[i]); }
				}</p>
<p>			//	end tag
			//	=======
				switch (true)
				{
					case (($R.parsingOptions._elements_ignore_tag.indexOf('|'+_tag_name+'|') > -1)):
						return;</p>
<p>					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;</p>
<p>					default:
						/* mark */ 	_pos__end__before = _global__the_html.length;
						/* end */ 	_global__the_html += '</'+_tag_name+'>';
						/* mark */ 	_pos__end__after = _global__the_html.length;
						break;
				}</p>
<p>			//	clean -- after
			//	=====</p>
<p>	//	we need to actually cut things out of 
	//	"_global__the_html", for stuff to not be there</p>
<p>	//	largeObject classes
	//	===================
		if (_tag_name == 'iframe' || _tag_name == 'embed' || _tag_name == 'object')
		{
			_global__the_html = ''
				+ _global__the_html.substr(0, _pos__start__before)
				+ '</p>
<div class="readableLargeObjectContainer">'
				+ 	_global__the_html.substr(_pos__start__before, (_pos__end__after - _pos__start__before))
				+ '</div>
<p>'
			;
			return;
		}</p>
<p>	//	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;</p>
<p>				case (_explored._is__image_large):</p>
<p>                    //  add float class -- for images too narrow/tall
                    //  remove width/height -- only for large images</p>
<p>                    //  http://www.wired.com/threatlevel/2011/05/gps-gallery/?pid=89&#038;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/</p>
<p>                    _global__the_html = ''
						+ _global__the_html.substr(0, _pos__start__before)
						+ '</p>
<div class="readableLargeImageContainer'
						+ 	(($(_node).width() <= 250) &#038;&#038; ($(_node).height() >= 250) ? ' float' : '')
						+ '">'
						+ 	_global__the_html.substr(_pos__start__before, (_pos__end__after - _pos__start__before)).replace(/width="([^=]+?)"/gi, '').replace(/height="([^=]+?)"/gi, '')
						+ '</div>
<p>'
					;
					return;
			}
		}</p>
<p>	//	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))
						+ '</a>'
					;
					return;</p>
<p>				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))
						+ '</a>'
					;
					return;
			}		
		}</p>
<p>	//	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' &#038;&#038; (_explored._length__all_text > (65 * 2))):
				case (_tag_name == 'h2' &#038;&#038; (_explored._length__all_text > (65 * 2 * 3))):
				case ((_tag_name.match(/^h(3|4|5|6)$/) != null) &#038;&#038; (_explored._length__all_text > (65 * 2 * 5))):
				case ((_tag_name.match(/^(b|i|em|strong)$/) != null) &#038;&#038; (_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;
			}
		}		</p>
<p>	//	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;</p>
<p>			default:
				var _contents = _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after));
					_contents = _contents.replace(/(<br \/>)/gi, '');
					_contents = _contents.replace(/(</p>
<hr \/>
<p>)/gi, '');</p>
<p>                    //  for rows, clear empty cells
                    if (_tag_name == 'tr')
                    {
                        _contents = _contents.replace(/
<td[^>]*?>/gi, '');
                        _contents = _contents.replace(/<\/td>/gi, '');
                    }</p>
<p>                    //  for tables, clear empty rows
                    if (_tag_name == 'table')
                    {
                        _contents = _contents.replace(/
<tr[^>]*?>/gi, '');
                        _contents = _contents.replace(/<\/tr>/gi, '');
                    }</p>
<p>				var _contentsLength = $R.measureText__getTextLength(_contents);</p>
<p>				switch (true)
				{
					case (_contentsLength == 0 &#038;&#038; _tag_name == 'p'):
						_global__the_html = _global__the_html.substr(0, _pos__start__before) + '</p>
<p>';
						return;</p>
<p>					case (_contentsLength == 0):
					case ((_contentsLength < 5) &#038;&#038; ($R.parsingOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1)):
						$R.debugOutline(_node, 'clean-after', 'blank');
						_global__the_html = _global__the_html.substr(0, _pos__start__before);
						return;
				}
				break;
		}</p>
<p>	//	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)
			;</p>
<p>			//	too much missing
			switch (true)
			{
				case (!(_contentsLength > 0)):
				case (!(_initialLength > 0)):
				case (!((_contentsLength / _initialLength) < 0.5)):
				case (!(($R.language == 'cjk') &#038;&#038; (_contentsLength / _initialLength) < 0.1)):
				case ((_global__exploreNodeToBuildHTMLFor &#038;&#038; ((_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.25))):
				case (($R.language == 'cjk') &#038;&#038; (_global__exploreNodeToBuildHTMLFor &#038;&#038; ((_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.1))):
					break;</p>
<p>				default:
					$R.debugOutline(_node, 'clean-after', 'missing-density');
					_global__the_html = _global__the_html.substr(0, _pos__start__before);
					return;
			}
		}</p>
<p>			//	return
				return;
		};</p>
<p>		//	actually do it
		_recursive(_nodeToBuildHTMLFor);</p>
<p>		//	return html
		return _global__the_html;
	};</p>
<p>    //  article title marker
    //  ====================
    $R.articleTitleMarker__start = '</p>
<div id="articleHeader">
<h1>';
    $R.articleTitleMarker__end = '</h1>
</div>
<p>';</p>
<p>    //  article title check function
    //  ============================
    $R.getContent__find__hasIsolatedTitleInHTML = function (_html)
    {
        return (_html.substr(0, $R.articleTitleMarker__start.length) == $R.articleTitleMarker__start);
    };</p>
<p>    //  article title get function
    //  ============================
    $R.getContent__find__getIsolatedTitleInHTML = function (_html)
    {
        //  is it there?
        if ($R.getContent__find__hasIsolatedTitleInHTML(_html)); else { return ''; }</p>
<p>        //  regex
        var 
            _getTitleRegex = new RegExp($R.articleTitleMarker__start + '(.*?)' + $R.articleTitleMarker__end, 'i'),
            _getTitleMatch = _html.match(_getTitleRegex)
        ;</p>
<p>        //  match?
        if (_getTitleMatch); else { return ''; }</p>
<p>        //  return
        return _getTitleMatch[1];
    };</p>
<p>    //  find title in arbitrary html
    //  ============================
    $R.getContent__find__isolateTitleInHTML = function (_html, _document_title)
    {
        //  can't just use (h1|h2|h3|etc) -- we want to try them in a certain order
        //  =============================
        var
            _heading_pregs = [
                /<(h1)[^>]*?>([\s\S]+?)<\/\1>/gi,
                /<(h2)[^>]*?>([\s\S]+?)<\/\1>/gi,
                /<(h3|h4|h5|h6)[^>]*?>([\s\S]+?)<\/\1>/gi
            ],
            _secondary_headings = '|h2|h3|h4|h5|h6|',
            _search_document_title = ' ' + _document_title.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ') + ' '
        ;</p>
<p>        //  loop pregs
        //  ==========
        for (var i=0, _i=_heading_pregs.length; i<_i; i++)
        {
            //  exec
            var _match = _heading_pregs[i].exec(_html);</p>
<p>            //  return?
            switch (true)
            {
                case (!(_match)):
                case (!(_heading_pregs[i].lastIndex > -1)):
                    //  will continue loop
                    break;</p>
<p>                default:</p>
<p>                    //  measurements
                    var
                        _heading_end_pos = _heading_pregs[i].lastIndex,
                        _heading_start_pos = (_heading_end_pos - _match[0].length),</p>
<p>                        _heading_type = _match[1],
                        _heading_text = _match[2].replace(/<\s*br[^>]*>/gi, '').replace(/[\n\r]+/gi, ''),
                        _heading_text_plain = _heading_text.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ');
                        _heading_length = $R.measureText__getTextLength(_heading_text_plain),
                        _heading_words = [],</p>
<p>                        _to_heading_text = _html.substr(0, _heading_start_pos),
                        _to_heading_length = $R.measureText__getTextLength(_to_heading_text.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' '))
                    ;</p>
<p>                    //  return?
                    switch (true)
                    {
                        case (!(_heading_length > 5)):
                        case (!(_heading_length < (65 * 3))):
                        case (!(_to_heading_length < (65 * 3 * 2))):
                            //  will continue for loop
                            break;</p>
<p>                        case ((_secondary_headings.indexOf('|' + _heading_type + '|') > -1)):
                            //  words in this heading
                            _heading_words = _heading_text_plain.split(' ');</p>
<p>                            //  count words present in title
                            for (var j=0, _j=_heading_words.length, _matched_words=''; j<_j; j++) {
                                if (_search_document_title.indexOf(' ' + _heading_words[j] + ' ') > -1) {
                                    _matched_words += _heading_words[j] + ' ';
                                }
                            }</p>
<p>                            //  break continues for loop
                            //  nothing goes to switch's default
                            //  ================================</p>
<p>                                //  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) &#038;&#038; (_search_document_title.indexOf(_heading_text_plain) > -1)):</p>
<p>                                    //  if it's slightly smaler, but is exactly at the begging or the end
                                    case ((_heading_length > 10) &#038;&#038; ((_search_document_title.indexOf(_heading_text_plain) == 1) || (_search_document_title.indexOf(_heading_text_plain) == (_search_document_title.length - 1 - _heading_text_plain.length)))):</p>
<p>                                        _no_break = true;
                                        break;
                                }</p>
<p>                                //  break?
                                var _break = false;
                                switch (true)
                                {
                                    //  no break?
                                    case (_no_break):
                                        break;</p>
<p>                                    // heading too long? -- if not h2
                                    case ((_heading_length > ((_search_document_title.length - 2) * 2)) &#038;&#038; (_heading_type != 'h2')):</p>
<p>                                    //  heading long enough?
                                    case ((_heading_length < Math.ceil((_search_document_title.length - 2) * 0.50))):</p>
<p>                                    //  enough words matched?
                                    case ((_heading_length < 25) &#038;&#038; (_matched_words.length < Math.ceil(_heading_length * 0.75))):
                                    case ((_heading_length < 50) &#038;&#038; (_matched_words.length < Math.ceil(_heading_length * 0.65))):
                                    case ((_matched_words.length < Math.ceil(_heading_length * 0.55))):</p>
<p>                                        _break = true;
                                        break;
                                }</p>
<p>                                //  break?
                                if (_break) { break; }</p>
<p>                        default:
                            //  this is the title -- do isolation; return
                            //  =================
                            return ''</p>
<p>                                + $R.articleTitleMarker__start
                                +   _heading_text 
                                + $R.articleTitleMarker__end</p>
<p>                                + _html.substr(_heading_end_pos)
                            ;
                    }</p>
<p>                    break;
            }
        }</p>
<p>        //  return unmodified
        return _html;
    };</p>
<p>	$R.getContent__find = function ()
	{
		//	get content
		//	===========
			var 
				_found = $R.getContent__findInPage($R.win),
				_targetNode = _found._targetCandidate.__node,
				_$targetNode = $(_targetNode),
                _aboveNodes = []
			;</p>
<p>		//	RTL
		//	===
			switch (true)
			{
				case (_$targetNode.attr('dir') == 'rtl'):
				case (_$targetNode.css('direction') == 'rtl'):
					$R.makeRTL();
					break;
			}</p>
<p>		//  get html
        //  ========
            var 
                _foundHTML = _found._html,
                _firstFragmentBefore = $R.getContent__nextPage__getFirstFragment(_foundHTML),
                _documentTitle = ($R.document.title > '' ? $R.document.title : '')
            ;</p>
<p>        //  get title
        //  =========</p>
<p>            //  has title already?
            _foundHTML = $R.getContent__find__isolateTitleInHTML(_foundHTML, _documentTitle);
            $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML);
            $R.debugPrint('TitleSource', 'target');</p>
<p>            //  get html above?
            if ($R.articleTitle > ''); else
            {</p>
<p>    //  get html above target?
    //  ======================</p>
<p>    //  global vars:
    //      _found
    //      _foundHTML
    //      _documentTitle
    //      _aboveNodes</p>
<p>    var 
        _prevNode = _found._targetCandidate.__node,
        _prevHTML = '',
        _aboveHTML = '',
        _differentTargets = (_found._firstCandidate.__node != _found._targetCandidate.__node)
    ;</p>
<p>    (function () 
    {</p>
<p>        while (true)
        {
            //  the end?
            switch (true)
            {
                case (_prevNode.tagName &#038;&#038; (_prevNode.tagName.toLowerCase() == 'body')):
                case (_differentTargets &#038;&#038; (_prevNode == _found._firstCandidate.__node)):
                    //  enough is enough
                    return;
            }</p>
<p>            //  up or sideways?
            if (_prevNode.previousSibling); else
            {
                _prevNode = _prevNode.parentNode;
                continue;
            }</p>
<p>            //	previous
            _prevNode = _prevNode.previousSibling;</p>
<p>            //	outline -- element might be re-outlined, when buildHTML is invoked
            if ($R.debug) { $R.debugOutline(_prevNode, 'target', 'add-above'); }</p>
<p>            //	get html; add
            _prevHTML = $R.getContent__buildHTMLForNode(_prevNode, 'above-the-target');
            _aboveHTML = _prevHTML + _aboveHTML;
            _aboveNodes.unshift(_prevNode);</p>
<p>            //  isolate title
            _aboveHTML = $R.getContent__find__isolateTitleInHTML(_aboveHTML, _documentTitle);</p>
<p>            //	finished?
            switch (true)
            {
                case ($R.measureText__getTextLength(_aboveHTML.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ')) > (65 * 3 * 3)):
                case ($R.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
                    return;
            }
        }</p>
<p>    })();</p>
<p>    //  is what we found any good?
    //  ==========================
    switch (true)
    {
        case ($R.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
        case (_differentTargets &#038;&#038; (_aboveHTML.split('<a ').length < 3) &#038;&#038; ($R.measureText__getTextLength(_aboveHTML.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ')) < (65 * 3))):
            _foundHTML = _aboveHTML + _foundHTML;
            break;</p>
<p>        default:
            _aboveHTML = '';
            _aboveNodes = [];
            break;
    }</p>
<p>                $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML);
                $R.debugPrint('TitleSource', 'above_HTML');</p>
<p>                //  get document title?
                if ($R.articleTitle > ''); else
                {</p>
<p>    //  if all else failed, get document title
    //  ======================================</p>
<p>    //  global vars:
    //      _foundHTML
    //      _documentTitle</p>
<p>    (function ()
    {
        //  return?
        //  =======
            if (_documentTitle > ''); else { return; }</p>
<p>        //  vars
            var
                _doc_title_parts = [],
                _doc_title_pregs =
                [
                    /( [-][-] |( [-] )|( [>][>] )|( [<][<] )|( [|] )|( [\/] ))/i,
                    /(([:] ))/i
                ]
            ;</p>
<p>        //	loop through pregs
        //  ==================
            for (var i=0, _i=_doc_title_pregs.length; i<_i; i++)
            {
                //	split
                _doc_title_parts = _documentTitle.split(_doc_title_pregs[i]);</p>
<p>                //	break if we managed a split
                if (_doc_title_parts.length > 1) { break; }
            }</p>
<p>        //	sort title parts -- longer goes higher up -- i.e. towards 0
        //	================
            _doc_title_parts.sort(function (a, b)
            {
                switch (true)
                {
                    case (a.length > b.length): return -1;
                    case (a.length < b.length): return 1;
                    default: return 0;
                }
            });</p>
<p>        //	set title -- first part, if more than one word; otherwise, whole
        //  =========
            _foundHTML = ''</p>
<p>                + $R.articleTitleMarker__start
                +   (_doc_title_parts[0].split(/\s+/i).length > 1 ? _doc_title_parts[0] : _documentTitle) 
                + $R.articleTitleMarker__end </p>
<p>                + _foundHTML
            ;</p>
<p>    })();
                    $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML);
                    $R.debugPrint('TitleSource', 'document_title');
                }
            }</p>
<p>		//	display
		//	=======
			$R.$pages.html('');
			$R.displayPageHTML(_foundHTML, 1, $R.win.location.href);</p>
<p>		//	remember
		//	========
			$R.debugRemember['theTarget'] = _found._targetCandidate.__node;
			$R.debugRemember['firstCandidate'] = _found._firstCandidate.__node;</p>
<p>		//	next
		//	====
            $R.nextPage__firstFragment__firstPage = _firstFragmentBefore;
            $R.nextPage__firstFragment__lastPage = $R.getContent__nextPage__getFirstFragment(_foundHTML);;</p>
<p>			$R.nextPage__loadedPages = [$R.win.location.href];
			$R.getContent__nextPage__find($R.win, _found._links);</p>
<p>		//	return
		return true;
	};</p>
<p>	$R.getContent__findInPage = function (_pageWindow)
	{
		//	calculations
		//	============</p>
<p>			var
				_firstCandidate = false,
				_secondCandidate = false,
				_targetCandidate = false
			;</p>
<p>			$R.debugTimerStart('ExploreAndGetStuff');
				var	_stuff = $R.getContent__exploreNodeAndGetStuff(_pageWindow.document.body);
			$R.debugPrint('ExploreAndGetStuff', $R.debugTimerEnd()+'ms');</p>
<p>			$R.debugTimerStart('ProcessFirst');
				var _processedCandidates = $R.getContent__processCandidates(_stuff._candidates);
				_firstCandidate = _processedCandidates[0];
				_targetCandidate = _firstCandidate;
			$R.debugPrint('ProcessFirst', $R.debugTimerEnd()+'ms');</p>
<p>            //  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);
                }</p>
<p>                //  highlight first
                $R.debugOutline(_firstCandidate.__node, 'target', 'first');
            }</p>
<p>            //  in case we stop
            $R.debugPrint('Target', 'first');</p>
<p>			//  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;</p>
<p>				default:</p>
<p>                    $R.debugTimerStart('ProcessSecond');
                        var _processedCandidatesSecond = $R.getContent__processCandidatesSecond(_processedCandidates);
                        _secondCandidate = _processedCandidatesSecond[0];
                    $R.debugPrint('ProcessSecond', $R.debugTimerEnd()+'ms');</p>
<p>                    //  they're the same
                    if (_firstCandidate.__node == _secondCandidate.__node) { break; }</p>
<p>                    //  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);
                        }</p>
<p>                        //  highlight second
                        $R.debugOutline(_secondCandidate.__node, 'target', 'second');
                    }</p>
<p>                    //  compute again
                    //  =============
                        _firstCandidate['__points_history_final'] = $R.getContent__computePointsForCandidateThird(_firstCandidate, _firstCandidate);
                        _firstCandidate['__points_final'] = _firstCandidate.__points_history_final[0];</p>
<p>                        _secondCandidate['__points_history_final'] = $R.getContent__computePointsForCandidateThird(_secondCandidate, _firstCandidate);
                        _secondCandidate['__points_final'] = _secondCandidate.__points_history_final[0];</p>
<p>                    //  log results
                    //  ===========
                        if ($R.debug)
                        {
                            $R.log('The 2 Candidates:');
                            $R.log(_firstCandidate);
                            $R.log(_secondCandidate);
                        }</p>
<p>                    //  are we selecting _second?
                    //  =========================
                        switch (true)
                        {
                            case ((_secondCandidate.__candidate_details._count__lines_of_65_characters < 20) &#038;&#038; (_secondCandidate.__points_final / _firstCandidate.__points_final) > 1):
                            case ((_secondCandidate.__candidate_details._count__lines_of_65_characters > 20) &#038;&#038; (_secondCandidate.__points_final / _firstCandidate.__points_final) > 0.9):
                            case ((_secondCandidate.__candidate_details._count__lines_of_65_characters > 50) &#038;&#038; (_secondCandidate.__points_final / _firstCandidate.__points_final) > 0.75):
                                _targetCandidate = _secondCandidate;
                                $R.debugPrint('Target', 'second');
                                break;
                        }</p>
<p>                    //  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));
                        }</p>
<p>					break;
			}</p>
<p>            //  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)'
                    });
                }</p>
<p>		//	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');</p>
<p>			$R.debugTimerStart('BuildHTMLPregs');
				_html = _html.replace(/<(blockquote|div|p|td|li)([^>]*)>(\s*<br \/>)+/gi, '<$1$2>');
				_html = _html.replace(/(<br \/>\s*)+<\/(blockquote|div|p|td|li)>/gi, '</$2>');
				_html = _html.replace(/(<br \/>\s*)+<(blockquote|div|h\d|ol|p|table|ul|li)([^>]*)>/gi, '<$2$3>');
				_html = _html.replace(/<\/(blockquote|div|h\d|ol|p|table|ul|li)>(\s*<br \/>)+/gi, '</$1>');
				_html = _html.replace(/(</p>
<hr \/>
<p>\s*</p>
<hr \/>
<p>\s*)+/gi, '</p>
<hr />
<p>');
				_html = _html.replace(/(<br \/>\s*<br \/>\s*)+/gi, '</p>
<p>');
			$R.debugPrint('BuildHTMLPregs', $R.debugTimerEnd()+'ms');</p>
<p>		//	return
		//	======
			return {
				'_html': _html,
				'_links': _stuff._links,
				'_targetCandidate': _targetCandidate,
				'_firstCandidate': _firstCandidate
			};
	};</p>
<p>    //  get first page fragment
    //  =======================</p>
<p>        $R.getContent__nextPage__getFirstFragment = function (_html)
        {
            //  remove all tags
            _html = _html.replace(/<[^>]+?>/gi, '');</p>
<p>            //  normalize spaces
            _html = _html.replace(/\s+/gi, ' ');</p>
<p>            //  return first 1000 characters
            return _html.substr(0, 2000);
        };</p>
<p>    //  get link parts
    //  ==============</p>
<p>        //  substr starting with the first slash after //
		$R.getURLPath = function (_url)
		{
			return _url.substr(_url.indexOf('/', (_url.indexOf('//') + 2)));
		};</p>
<p>        //  substr until the first slash after //
		$R.getURLDomain = function (_url)
		{
			return _url.substr(0, _url.indexOf('/', (_url.indexOf('//') + 2)))
		};</p>
<p>	//	find
	//	====
		$R.getContent__nextPage__find = function (_currentPageWindow, _linksInCurrentPage)
		{
			//	page id
				var _pageNr = ($R.nextPage__loadedPages.length + 1);</p>
<p>			//	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); }</p>
<p>				//	none
				if (_possible.length > 0); else
					{ if ($R.debug) { $R.log('no next link found'); } return; }</p>
<p>				if ($R.debug) { $R.log('possible next', _possible); }</p>
<p>			//	the one
			//	=======
				var _nextLink = false;</p>
<p>			//	next keyword?
			//	=============
				(function ()
				{
					if (_nextLink) { return; }</p>
<p>					for (var i=0, _i=_possible.length; i<_i; i++)
					{
						for (var j=0, _j=$R.nextPage__captionKeywords.length; j<_j; j++)
						{
							if (_possible[i]._caption.indexOf($R.nextPage__captionKeywords[j]) > -1)
							{
								//	length
								//	======
									if (_possible[i]._caption.length > $R.nextPage__captionKeywords[j].length * 2)
										{ continue; }</p>
<p>								//	not keywords
								//	============
									for (var z=0, _z=$R.nextPage__captionKeywords__not.length; z<_z; z++)
									{
										if (_possible[i]._caption.indexOf($R.nextPage__captionKeywords__not[z]) > -1)
											{ _nextLink = false; return; }
									}</p>
<p>								//	got it
								//	======
									_nextLink = _possible[i];
									return;
							}
						}
					}
				})();	</p>
<p>			//	caption matched page number
			//	===========================
				(function ()
				{
					if (_nextLink) { return; }</p>
<p>					for (var i=0, _i=_possible.length; i<_i; i++)
					{
						if (_possible[i]._caption == (''+_pageNr))
							{ _nextLink = _possible[i]; return; }
					}
				})();</p>
<p>			//	next keyword in title
			//	=====================
				(function ()
				{
					if (_nextLink) { return; }</p>
<p>					for (var i=0, _i=_possible.length; i<_i; i++)
					{
						//	sanity
						if (_possible[i]._title > ''); else { continue; }
						if ($R.measureText__getTextLength(_possible[i]._caption) <= 2); else { continue; }</p>
<p>						for (var j=0, _j=$R.nextPage__captionKeywords.length; j<_j; j++)
						{
							if (_possible[i]._title.indexOf($R.nextPage__captionKeywords[j]) > -1)
							{
								//	length
								//	======
									if (_possible[i]._title.length > $R.nextPage__captionKeywords[j].length * 2)
										{ continue; }</p>
<p>								//	not keywords
								//	============
									for (var z=0, _z=$R.nextPage__captionKeywords__not.length; z<_z; z++)
									{
										if (_possible[i]._title.indexOf($R.nextPage__captionKeywords__not[z]) > -1)
											{ _nextLink = false; return; }
									}</p>
<p>								//	got it
								//	======
									_nextLink = _possible[i];
									return;
							}
						}
					}
				})();</p>
<p>			//	return?
			//	=======
				if (_nextLink); else { return; }</p>
<p>			//	mark
			//	====
				$R.debugPrint('NextPage', 'true');</p>
<p>				if ($R.debug)
				{
					$R.debugOutline(_nextLink._node, 'target', 'next-page');
					$R.log('NextPage Link', _nextLink, _nextLink._node);
				}</p>
<p>			//	process page
			//	============
				$R.getContent__nextPage__loadToFrame(_pageNr, _nextLink._href);
				$R.nextPage__loadedPages.push(_nextLink._href);
		};</p>
<p>	//	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)
			;</p>
<p>			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(/\&#038;[^\&\s;]{1,10};/gi, '').replace(/\s+/gi, ' ').replace(/^ /, '').replace(/ $/, '').toLowerCase(),
						_distance = $R.levenshteinDistance(_mainPagePath, _path)
					;</p>
<p>					var _caption2 = '';
					for (var i=0, _i=_caption.length, _code=0; i<_i; i++)
					{
						_code = _caption.charCodeAt(i);
						_caption2 += (_code > 127 ? ('&#'+_code+';') : _caption.charAt(i));
					}
					_caption = _caption2;</p>
<p>					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;</p>
<p>						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; } }</p>
<p>							//	return
							return {
								'_node': _element.__node,
								'_href': _href,
								'_title': _title,
								'_caption': _caption,
								'_distance': _distance
							};
					}
				}
			);</p>
<p>			//	sort -- the less points, the closer to position 0
			//	====
				_links.sort(function (a, b)
				{
					switch (true)
					{
						case (a._distance < b._distance): return -1;
						case (a._distance > b._distance): return 1;
						default: return 0;
					}
				});</p>
<p>			//	return
				return _links;
		};</p>
<p>	//	load to frame
	//	=============
		$R.getContent__nextPage__loadToFrame = function (_pageNr, _nextPageURL)
		{
			//	do ajax
			//	=======
				$.ajax
				({
					'url' : _nextPageURL,</p>
<p>					'type' : 'GET',
					'dataType' : 'html',
					'async' : true,
					'timeout': (10 * 1000),</p>
<p>					//'headers': { 'Referrer': _nextPageURL },</p>
<p>					'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); }
				});
		};</p>
<p>	//	ajax calbacks
	//	=============
		$R.getContent__nextPage__ajaxError = function (_pageNr, _xhr, _textStatus, _error)
		{
		};</p>
<p>		$R.getContent__nextPage__ajaxComplete = function (_pageNr, _response, _textStatus, _xhr)
		{
			//	valid?
			//	======
				if (_response > ''); else { return; }</p>
<p>			//	script
			//	======
				var _script = ''
					+ '<script type="text/javascript">'
					+ ' function __this_page_loaded()'
					+ '	{'
					+ ' 	window.setTimeout('
					+ ' 		function () {'
                    +               ($R.component ? 'window.parent.' : 'window.parent.parent.')
                    +                   '$readable.getContent__nextPage__loadedInFrame("'+_pageNr+'", window); }, '
					+ ' 		250'
					+ ' 	);'
					+ ' } '</p>
<p>					+ ' if (document.readyState); else { __this_page_loaded(); } '</p>
<p>					+ ' function __this_page_loaded_ready(delayedNrTimes)'
					+ ' {'
					+ ' 	if (document.readyState != "complete" &#038;&#038; delayedNrTimes < 30)'
					+ '			{ setTimeout(function () { __this_page_loaded_ready(delayedNrTimes+1); }, 100); return; }'</p>
<p>					+ ' 	__this_page_loaded();'
					+ ' }'</p>
<p>					+ ' __this_page_loaded_ready(0);'
					+ '
// ]]&gt;</script>' ; // get html // ======== var _html = _response; // normalize // ========= _html = _html.replace(/&lt;\s+/gi, '&lt;'); _html = _html.replace(/\s+&gt;/gi, '&gt;'); _html = _html.replace(/\s+\/&gt;/gi, '/&gt;'); // remove // ====== _html = _html.replace(/&lt;script[^&gt;]*?&gt;([\s\S]*?)&lt;\/script&gt;/gi, ''); _html = _html.replace(/&lt;script[^&gt;]*?\/&gt;/gi, ''); _html = _html.replace(/&lt;noscript[^&gt;]*?&gt;([\s\S]*?)&lt;\/noscript&gt;/gi, ''); _html = _html.replace(/&lt;onload="*?"/gi, ''); // add load handler // ================ _html = _html.replace(/&lt;\/body/i, _script+'' ); // 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) &lt; 100): case ($R.levenshteinDistance(_firstFragment, $R.nextPage__firstFragment__lastPage) &lt; 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 &gt; '' ? $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 &gt; 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; }</p>
<p><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/*</p>
<p>http://www.JSON.org/json2.js</p>
<p>    2008-11-19</p>
<p>    Public Domain.</p>
<p>    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.</p>
<p>    See http://www.JSON.org/js.html</p>
<p>    This file creates a global JSON object containing two methods: stringify
    and parse.</p>
<p>        JSON.stringify(value, replacer, space)
            value       any JavaScript value, usually an object or array.</p>
<p>            replacer    an optional parameter that determines how object
                        values are stringified for objects. It can be a
                        function or an array of strings.</p>
<p>            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 '&nbsp;'),
                        it contains the characters used to indent at each level.</p>
<p>            This method produces a JSON text from a JavaScript value.</p>
<p>            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.</p>
<p>            For example, this would serialize Dates as ISO strings.</p>
<p>                Date.prototype.toJSON = function (key) {
                    function f(n) {
                        // Format integers to have at least two digits.
                        return n < 10 ? '0' + n : n;
                    }</p>
<p>                    return this.getUTCFullYear()   + '-' +
                         f(this.getUTCMonth() + 1) + '-' +
                         f(this.getUTCDate())      + 'T' +
                         f(this.getUTCHours())     + ':' +
                         f(this.getUTCMinutes())   + ':' +
                         f(this.getUTCSeconds())   + 'Z';
                };</p>
<p>            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.</p>
<p>            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.</p>
<p>            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.</p>
<p>            The optional space parameter produces a stringification of the
            value that is filled with line breaks and indentation to make it
            easier to read.</p>
<p>            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.</p>
<p>            Example:</p>
<p>            text = JSON.stringify(['e', {pluribus: 'unum'}]);
            // text is '["e",{"pluribus":"unum"}]'</p>
<p>            text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
            // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'</p>
<p>            text = JSON.stringify([new Date()], function (key, value) {
                return this[key] instanceof Date ?
                    'Date(' + this[key] + ')' : value;
            });
            // text is '["Date(---current time---)"]'</p>
<p>        JSON.parse(text, reviver)
            This method parses a JSON text to produce an object or array.
            It can throw a SyntaxError exception.</p>
<p>            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.</p>
<p>            Example:</p>
<p>            // Parse the text. Values that look like ISO date strings will
            // be converted to Date objects.</p>
<p>            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;
            });</p>
<p>            myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
                var d;
                if (typeof value === 'string' &#038;&#038;
                        value.slice(0, 5) === 'Date(' &#038;&#038;
                        value.slice(-1) === ')') {
                    d = new Date(value.slice(5, -1));
                    if (d) {
                        return d;
                    }
                }
                return value;
            });</p>
<p>    This is a reference implementation. You are free to copy, modify, or
    redistribute.</p>
<p>    This code should be minified before deployment.
    See http://javascript.crockford.com/jsmin.html</p>
<p>    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
    NOT CONTROL.
*/</p>
<p>/*jslint evil: true */</p>
<p>/*global JSON */</p>
<p>/*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
*/</p>
<p>// Create a JSON object only if one does not already exist. We create the
// methods in a closure to avoid creating global variables.</p>
<p>if (!this.JSON) {
    JSON = {};
}
(function () {</p>
<p>    function f(n) {
        // Format integers to have at least two digits.
        return n < 10 ? '0' + n : n;
    }</p>
<p>    if (typeof Date.prototype.toJSON !== 'function') {</p>
<p>        Date.prototype.toJSON = function (key) {</p>
<p>            return this.getUTCFullYear()   + '-' +
                 f(this.getUTCMonth() + 1) + '-' +
                 f(this.getUTCDate())      + 'T' +
                 f(this.getUTCHours())     + ':' +
                 f(this.getUTCMinutes())   + ':' +
                 f(this.getUTCSeconds())   + 'Z';
        };</p>
<p>        String.prototype.toJSON =
        Number.prototype.toJSON =
        Boolean.prototype.toJSON = function (key) {
            return this.valueOf();
        };
    }</p>
<p>    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;</p>
<p>    function quote(string) {</p>
<p>// 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.</p>
<p>        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 + '"';
    }</p>
<p>    function str(key, holder) {</p>
<p>// Produce a string from holder[key].</p>
<p>        var i,          // The loop counter.
            k,          // The member key.
            v,          // The member value.
            length,
            mind = gap,
            partial,
            value = holder[key];</p>
<p>// If the value has a toJSON method, call it to obtain a replacement value.</p>
<p>        if (value &#038;&#038; typeof value === 'object' &#038;&#038;
                typeof value.toJSON === 'function') {
            value = value.toJSON(key);
        }</p>
<p>// If we were called with a replacer function, then call the replacer to
// obtain a replacement value.</p>
<p>        if (typeof rep === 'function') {
            value = rep.call(holder, key, value);
        }</p>
<p>// What happens next depends on the value's type.</p>
<p>        switch (typeof value) {
        case 'string':
            return quote(value);</p>
<p>        case 'number':</p>
<p>// JSON numbers must be finite. Encode non-finite numbers as null.</p>
<p>            return isFinite(value) ? String(value) : 'null';</p>
<p>        case 'boolean':
        case 'null':</p>
<p>// 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.</p>
<p>            return String(value);</p>
<p>// If the type is 'object', we might be dealing with an object or an array or
// null.</p>
<p>        case 'object':</p>
<p>// Due to a specification blunder in ECMAScript, typeof null is 'object',
// so watch out for that case.</p>
<p>            if (!value) {
                return 'null';
            }</p>
<p>// Make an array to hold the partial results of stringifying this object value.</p>
<p>            gap += indent;
            partial = [];</p>
<p>// Is the value an array?</p>
<p>            if (Object.prototype.toString.apply(value) === '[object Array]') {</p>
<p>// The value is an array. Stringify every element. Use null as a placeholder
// for non-JSON values.</p>
<p>                length = value.length;
                for (i = 0; i < length; i += 1) {
                    partial[i] = str(i, value) || 'null';
                }</p>
<p>// Join all of the elements together, separated with commas, and wrap them in
// brackets.</p>
<p>                v = partial.length === 0 ? '[]' :
                    gap ? '[\n' + gap +
                            partial.join(',\n' + gap) + '\n' +
                                mind + ']' :
                          '[' + partial.join(',') + ']';
                gap = mind;
                return v;
            }</p>
<p>// If the replacer is an array, use it to select the members to be stringified.</p>
<p>            if (rep &#038;&#038; 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 {</p>
<p>// Otherwise, iterate through all of the keys in the object.</p>
<p>                for (k in value) {
                    if (Object.hasOwnProperty.call(value, k)) {
                        v = str(k, value);
                        if (v) {
                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
                        }
                    }
                }
            }</p>
<p>// Join all of the member texts together, separated with commas,
// and wrap them in braces.</p>
<p>            v = partial.length === 0 ? '{}' :
                gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
                        mind + '}' : '{' + partial.join(',') + '}';
            gap = mind;
            return v;
        }
    }</p>
<p>// If the JSON object does not yet have a stringify method, give it one.</p>
<p>    if (typeof JSON.stringify !== 'function') {
        JSON.stringify = function (value, replacer, space) {</p>
<p>// 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.</p>
<p>            var i;
            gap = '';
            indent = '';</p>
<p>// If the space parameter is a number, make an indent string containing that
// many spaces.</p>
<p>            if (typeof space === 'number') {
                for (i = 0; i < space; i += 1) {
                    indent += ' ';
                }</p>
<p>// If the space parameter is a string, it will be used as the indent string.</p>
<p>            } else if (typeof space === 'string') {
                indent = space;
            }</p>
<p>// If there is a replacer, it must be a function or an array.
// Otherwise, throw an error.</p>
<p>            rep = replacer;
            if (replacer &#038;&#038; typeof replacer !== 'function' &#038;&#038;
                    (typeof replacer !== 'object' ||
                     typeof replacer.length !== 'number')) {
                throw new Error('JSON.stringify');
            }</p>
<p>// Make a fake root object containing our value under the key of ''.
// Return the result of stringifying the value.</p>
<p>            return str('', {'': value});
        };
    }</p>
<p>// If the JSON object does not yet have a parse method, give it one.</p>
<p>    if (typeof JSON.parse !== 'function') {
        JSON.parse = function (text, reviver) {</p>
<p>// The parse method takes a text and an optional reviver function, and returns
// a JavaScript value if the text is a valid JSON text.
            var j;</p>
<p>            function walk(holder, key) {</p>
<p>// The walk method is used to recursively walk the resulting structure so
// that modifications can be made.</p>
<p>                var k, v, value = holder[key];
                if (value &#038;&#038; typeof value === 'object') {
                    for (k in value) {
                        if (Object.hasOwnProperty.call(value, k)) {
                            v = walk(value, k);
                            if (v !== undefined) {
                                value[k] = v;
                            } else {
                                delete value[k];
                            }
                        }
                    }
                }
                return reviver.call(holder, key, value);
            }</p>
<p>// Parsing happens in four stages. In the first stage, we replace certain
// Unicode characters with escape sequences. JavaScript handles many characters
// incorrectly, either silently deleting them, or treating them as line endings.</p>
<p>            cx.lastIndex = 0;
            if (cx.test(text)) {
                text = text.replace(cx, function (a) {
                    return '\\u' +
                        ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
                });
            }
// In the second stage, we run the text against regular expressions that look
// for non-JSON patterns. We are especially concerned with '()' and 'new'
// because they can cause invocation, and '=' because it can cause mutation.
// But just to be safe, we want to reject all unexpected forms.</p>
<p>// We split the second stage into 4 regexp operations in order to work around
// crippling inefficiencies in IE's and Safari's regexp engines. First we
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
// replace all simple value tokens with ']' characters. Third, we delete all
// open brackets that follow a colon or comma or that begin the text. Finally,
// we look to see that the remaining characters are only whitespace or ']' or
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
            if (/^[\],:{}\s]*$/.
test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {</p>
<p>// In the third stage we use the eval function to compile the text into a
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.
                j = eval('(' + text + ')');</p>
<p>// In the optional fourth stage, we recursively walk the new structure, passing
// each name/value pair to a reviver function for possible transformation.
                return typeof reviver === 'function' ?
                    walk({'': j}, '') : j;
            }</p>
<p>// If the text is not JSON parseable, then a SyntaxError is thrown.
            throw new SyntaxError('JSON.parse');
        };
    }
})();
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/*mousewheel*/
(function(a){function d(b){var c=b||window.event,d=[].slice.call(arguments,1),e=0,f=!0,g=0,h=0;return b=a.event.fix(c),b.type="mousewheel",c.wheelDelta&#038;&#038;(e=c.wheelDelta/120),c.detail&#038;&#038;(e=-c.detail/3),h=e,c.axis!==undefined&#038;&#038;c.axis===c.HORIZONTAL_AXIS&#038;&#038;(h=0,g=-1*e),c.wheelDeltaY!==undefined&#038;&#038;(h=c.wheelDeltaY/120),c.wheelDeltaX!==undefined&#038;&#038;(g=-1*c.wheelDeltaX/120),d.unshift(b,e,g,h),(a.event.dispatch||a.event.handle).apply(this,d)}var b=["DOMMouseScroll","mousewheel"];if(a.event.fixHooks)for(var c=b.length;c;)a.event.fixHooks[b[--c]]=a.event.mouseHooks;a.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var a=b.length;a;)this.addEventListener(b[--a],d,!1);else this.onmousewheel=d},teardown:function(){if(this.removeEventListener)for(var a=b.length;a;)this.removeEventListener(b[--a],d,!1);else this.onmousewheel=null}},a.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})})(jQuery);
/*custom scrollbar*/
(function(c){var b={init:function(e){var f={set_width:false,set_height:false,horizontalScroll:false,scrollInertia:950,mouseWheel:true,mouseWheelPixels:"auto",autoDraggerLength:true,autoHideScrollbar:false,alwaysShowScrollbar:false,snapAmount:null,snapOffset:0,scrollButtons:{enable:false,scrollType:"continuous",scrollSpeed:"auto",scrollAmount:40},advanced:{updateOnBrowserResize:true,updateOnContentResize:false,autoExpandHorizontalScroll:false,autoScrollOnFocus:true,normalizeMouseWheelDelta:false},contentTouchScroll:true,callbacks:{onScrollStart:function(){},onScroll:function(){},onTotalScroll:function(){},onTotalScrollBack:function(){},onTotalScrollOffset:0,onTotalScrollBackOffset:0,whileScrolling:function(){}},theme:"light"},e=c.extend(true,f,e);return this.each(function(){var m=c(this);if(e.set_width){m.css("width",e.set_width)}if(e.set_height){m.css("height",e.set_height)}if(!c(document).data("mCustomScrollbar-index")){c(document).data("mCustomScrollbar-index","1")}else{var t=parseInt(c(document).data("mCustomScrollbar-index"));c(document).data("mCustomScrollbar-index",t+1)}m.wrapInner("</p>
<div class='mCustomScrollBox mCS-"+e.theme+"' id='mCSB_"+c(document).data("mCustomScrollbar-index")+"' style='position:relative; height:100%; overflow:hidden; max-width:100%;' />").addClass("mCustomScrollbar _mCS_"+c(document).data("mCustomScrollbar-index"));var g=m.children(".mCustomScrollBox");if(e.horizontalScroll){g.addClass("mCSB_horizontal").wrapInner("</p>
<div class='mCSB_h_wrapper' style='position:relative; left:0; width:999999px;' />");var k=g.children(".mCSB_h_wrapper");k.wrapInner("</p>
<div class='mCSB_container' style='position:absolute; left:0;' />").children(".mCSB_container").css({width:k.children().outerWidth(),position:"relative"}).unwrap()}else{g.wrapInner("</p>
<div class='mCSB_container' style='position:relative; top:0;' />")}var o=g.children(".mCSB_container");if(c.support.touch){o.addClass("mCS_touch")}o.after("</p>
<div class='mCSB_scrollTools' style='position:absolute;'>
<div class='mCSB_draggerContainer'>
<div class='mCSB_dragger' style='position:absolute;' oncontextmenu='return false;'>
<div class='mCSB_dragger_bar' style='position:relative;'></div>
</div>
<div class='mCSB_draggerRail'></div>
</div>
</div>
<p>");var l=g.children(".mCSB_scrollTools"),h=l.children(".mCSB_draggerContainer"),q=h.children(".mCSB_dragger");if(e.horizontalScroll){q.data("minDraggerWidth",q.width())}else{q.data("minDraggerHeight",q.height())}if(e.scrollButtons.enable){if(e.horizontalScroll){l.prepend("<a class='mCSB_buttonLeft' oncontextmenu='return false;'></a>").append("<a class='mCSB_buttonRight' oncontextmenu='return false;'></a>")}else{l.prepend("<a class='mCSB_buttonUp' oncontextmenu='return false;'></a>").append("<a class='mCSB_buttonDown' oncontextmenu='return false;'></a>")}}g.bind("scroll",function(){if(!m.is(".mCS_disabled")){g.scrollTop(0).scrollLeft(0)}});m.data({mCS_Init:true,mCustomScrollbarIndex:c(document).data("mCustomScrollbar-index"),horizontalScroll:e.horizontalScroll,scrollInertia:e.scrollInertia,scrollEasing:"mcsEaseOut",mouseWheel:e.mouseWheel,mouseWheelPixels:e.mouseWheelPixels,autoDraggerLength:e.autoDraggerLength,autoHideScrollbar:e.autoHideScrollbar,alwaysShowScrollbar:e.alwaysShowScrollbar,snapAmount:e.snapAmount,snapOffset:e.snapOffset,scrollButtons_enable:e.scrollButtons.enable,scrollButtons_scrollType:e.scrollButtons.scrollType,scrollButtons_scrollSpeed:e.scrollButtons.scrollSpeed,scrollButtons_scrollAmount:e.scrollButtons.scrollAmount,autoExpandHorizontalScroll:e.advanced.autoExpandHorizontalScroll,autoScrollOnFocus:e.advanced.autoScrollOnFocus,normalizeMouseWheelDelta:e.advanced.normalizeMouseWheelDelta,contentTouchScroll:e.contentTouchScroll,onScrollStart_Callback:e.callbacks.onScrollStart,onScroll_Callback:e.callbacks.onScroll,onTotalScroll_Callback:e.callbacks.onTotalScroll,onTotalScrollBack_Callback:e.callbacks.onTotalScrollBack,onTotalScroll_Offset:e.callbacks.onTotalScrollOffset,onTotalScrollBack_Offset:e.callbacks.onTotalScrollBackOffset,whileScrolling_Callback:e.callbacks.whileScrolling,bindEvent_scrollbar_drag:false,bindEvent_content_touch:false,bindEvent_scrollbar_click:false,bindEvent_mousewheel:false,bindEvent_buttonsContinuous_y:false,bindEvent_buttonsContinuous_x:false,bindEvent_buttonsPixels_y:false,bindEvent_buttonsPixels_x:false,bindEvent_focusin:false,bindEvent_autoHideScrollbar:false,mCSB_buttonScrollRight:false,mCSB_buttonScrollLeft:false,mCSB_buttonScrollDown:false,mCSB_buttonScrollUp:false});if(e.horizontalScroll){if(m.css("max-width")!=="none"){if(!e.advanced.updateOnContentResize){e.advanced.updateOnContentResize=true}}}else{if(m.css("max-height")!=="none"){var s=false,r=parseInt(m.css("max-height"));if(m.css("max-height").indexOf("%")>=0){s=r,r=m.parent().height()*s/100}m.css("overflow","hidden");g.css("max-height",r)}}m.mCustomScrollbar("update");if(e.advanced.updateOnBrowserResize){var i,j=c(window).width(),u=c(window).height();c(window).bind("resize."+m.data("mCustomScrollbarIndex"),function(){if(i){clearTimeout(i)}i=setTimeout(function(){if(!m.is(".mCS_disabled")&#038;&#038;!m.is(".mCS_destroyed")){var w=c(window).width(),v=c(window).height();if(j!==w||u!==v){if(m.css("max-height")!=="none"&#038;&#038;s){g.css("max-height",m.parent().height()*s/100)}m.mCustomScrollbar("update");j=w;u=v}}},150)})}if(e.advanced.updateOnContentResize){var p;if(e.horizontalScroll){var n=o.outerWidth()}else{var n=o.outerHeight()}p=setInterval(function(){if(e.horizontalScroll){if(e.advanced.autoExpandHorizontalScroll){o.css({position:"absolute",width:"auto"}).wrap("</p>
<div class='mCSB_h_wrapper' style='position:relative; left:0; width:999999px;' />").css({width:o.outerWidth(),position:"relative"}).unwrap()}var v=o.outerWidth()}else{var v=o.outerHeight()}if(v!=n){m.mCustomScrollbar("update");n=v}},300)}})},update:function(){var n=c(this),k=n.children(".mCustomScrollBox"),q=k.children(".mCSB_container");q.removeClass("mCS_no_scrollbar");n.removeClass("mCS_disabled mCS_destroyed");k.scrollTop(0).scrollLeft(0);var y=k.children(".mCSB_scrollTools"),o=y.children(".mCSB_draggerContainer"),m=o.children(".mCSB_dragger");if(n.data("horizontalScroll")){var A=y.children(".mCSB_buttonLeft"),t=y.children(".mCSB_buttonRight"),f=k.width();if(n.data("autoExpandHorizontalScroll")){q.css({position:"absolute",width:"auto"}).wrap("</p>
<div class='mCSB_h_wrapper' style='position:relative; left:0; width:999999px;' />").css({width:q.outerWidth(),position:"relative"}).unwrap()}var z=q.outerWidth()}else{var w=y.children(".mCSB_buttonUp"),g=y.children(".mCSB_buttonDown"),r=k.height(),i=q.outerHeight()}if(i>r&#038;&#038;!n.data("horizontalScroll")){y.css("display","block");var s=o.height();if(n.data("autoDraggerLength")){var u=Math.round(r/i*s),l=m.data("minDraggerHeight");if(u<=l){m.css({height:l})}else{if(u>=s-10){var p=s-10;m.css({height:p})}else{m.css({height:u})}}m.children(".mCSB_dragger_bar").css({"line-height":m.height()+"px"})}var B=m.height(),x=(i-r)/(s-B);n.data("scrollAmount",x).mCustomScrollbar("scrolling",k,q,o,m,w,g,A,t);var D=Math.abs(q.position().top);n.mCustomScrollbar("scrollTo",D,{scrollInertia:0,trigger:"internal"})}else{if(z>f&#038;&#038;n.data("horizontalScroll")){y.css("display","block");var h=o.width();if(n.data("autoDraggerLength")){var j=Math.round(f/z*h),C=m.data("minDraggerWidth");if(j<=C){m.css({width:C})}else{if(j>=h-10){var e=h-10;m.css({width:e})}else{m.css({width:j})}}}var v=m.width(),x=(z-f)/(h-v);n.data("scrollAmount",x).mCustomScrollbar("scrolling",k,q,o,m,w,g,A,t);var D=Math.abs(q.position().left);n.mCustomScrollbar("scrollTo",D,{scrollInertia:0,trigger:"internal"})}else{k.unbind("mousewheel focusin");if(n.data("horizontalScroll")){m.add(q).css("left",0)}else{m.add(q).css("top",0)}if(n.data("alwaysShowScrollbar")){if(!n.data("horizontalScroll")){m.css({height:o.height()})}else{if(n.data("horizontalScroll")){m.css({width:o.width()})}}}else{y.css("display","none");q.addClass("mCS_no_scrollbar")}n.data({bindEvent_mousewheel:false,bindEvent_focusin:false})}}},scrolling:function(i,q,n,k,A,f,D,w){var l=c(this);if(!l.data("bindEvent_scrollbar_drag")){var o,p,C,z,e;if(c.support.pointer){C="pointerdown";z="pointermove";e="pointerup"}else{if(c.support.msPointer){C="MSPointerDown";z="MSPointerMove";e="MSPointerUp"}}if(c.support.pointer||c.support.msPointer){k.bind(C,function(K){K.preventDefault();l.data({on_drag:true});k.addClass("mCSB_dragger_onDrag");var J=c(this),M=J.offset(),I=K.originalEvent.pageX-M.left,L=K.originalEvent.pageY-M.top;if(I<J.width()&#038;&#038;I>0&#038;&#038;L<J.height()&#038;&#038;L>0){o=L;p=I}});c(document).bind(z+"."+l.data("mCustomScrollbarIndex"),function(K){K.preventDefault();if(l.data("on_drag")){var J=k,M=J.offset(),I=K.originalEvent.pageX-M.left,L=K.originalEvent.pageY-M.top;G(o,p,L,I)}}).bind(e+"."+l.data("mCustomScrollbarIndex"),function(x){l.data({on_drag:false});k.removeClass("mCSB_dragger_onDrag")})}else{k.bind("mousedown touchstart",function(K){K.preventDefault();K.stopImmediatePropagation();var J=c(this),N=J.offset(),I,M;if(K.type==="touchstart"){var L=K.originalEvent.touches[0]||K.originalEvent.changedTouches[0];I=L.pageX-N.left;M=L.pageY-N.top}else{l.data({on_drag:true});k.addClass("mCSB_dragger_onDrag");I=K.pageX-N.left;M=K.pageY-N.top}if(I<J.width()&#038;&#038;I>0&#038;&#038;M<J.height()&#038;&#038;M>0){o=M;p=I}}).bind("touchmove",function(K){K.preventDefault();K.stopImmediatePropagation();var N=K.originalEvent.touches[0]||K.originalEvent.changedTouches[0],J=c(this),M=J.offset(),I=N.pageX-M.left,L=N.pageY-M.top;G(o,p,L,I)});c(document).bind("mousemove."+l.data("mCustomScrollbarIndex"),function(K){if(l.data("on_drag")){var J=k,M=J.offset(),I=K.pageX-M.left,L=K.pageY-M.top;G(o,p,L,I)}}).bind("mouseup."+l.data("mCustomScrollbarIndex"),function(x){l.data({on_drag:false});k.removeClass("mCSB_dragger_onDrag")})}l.data({bindEvent_scrollbar_drag:true})}function G(J,K,L,I){if(l.data("horizontalScroll")){l.mCustomScrollbar("scrollTo",(k.position().left-(K))+I,{moveDragger:true,trigger:"internal"})}else{l.mCustomScrollbar("scrollTo",(k.position().top-(J))+L,{moveDragger:true,trigger:"internal"})}}if(c.support.touch&#038;&#038;l.data("contentTouchScroll")){if(!l.data("bindEvent_content_touch")){var m,E,s,t,v,F,H;q.bind("touchstart",function(x){x.stopImmediatePropagation();m=x.originalEvent.touches[0]||x.originalEvent.changedTouches[0];E=c(this);s=E.offset();v=m.pageX-s.left;t=m.pageY-s.top;F=t;H=v});q.bind("touchmove",function(x){x.preventDefault();x.stopImmediatePropagation();m=x.originalEvent.touches[0]||x.originalEvent.changedTouches[0];E=c(this).parent();s=E.offset();v=m.pageX-s.left;t=m.pageY-s.top;if(l.data("horizontalScroll")){l.mCustomScrollbar("scrollTo",H-v,{trigger:"internal"})}else{l.mCustomScrollbar("scrollTo",F-t,{trigger:"internal"})}})}}if(!l.data("bindEvent_scrollbar_click")){n.bind("click",function(I){var x=(I.pageY-n.offset().top)*l.data("scrollAmount"),y=c(I.target);if(l.data("horizontalScroll")){x=(I.pageX-n.offset().left)*l.data("scrollAmount")}if(y.hasClass("mCSB_draggerContainer")||y.hasClass("mCSB_draggerRail")){l.mCustomScrollbar("scrollTo",x,{trigger:"internal",scrollEasing:"draggerRailEase"})}});l.data({bindEvent_scrollbar_click:true})}if(l.data("mouseWheel")){if(!l.data("bindEvent_mousewheel")){i.bind("mousewheel",function(K,M){var J,I=l.data("mouseWheelPixels"),x=Math.abs(q.position().top),L=k.position().top,y=n.height()-k.height();if(l.data("normalizeMouseWheelDelta")){if(M<0){M=-1}else{M=1}}if(I==="auto"){I=100+Math.round(l.data("scrollAmount")/2)}if(l.data("horizontalScroll")){L=k.position().left;y=n.width()-k.width();x=Math.abs(q.position().left)}if((M>0&#038;&#038;L!==0)||(M<0&#038;&#038;L!==y)){K.preventDefault();K.stopImmediatePropagation()}J=x-(M*I);l.mCustomScrollbar("scrollTo",J,{trigger:"internal"})});l.data({bindEvent_mousewheel:true})}}if(l.data("scrollButtons_enable")){if(l.data("scrollButtons_scrollType")==="pixels"){if(l.data("horizontalScroll")){w.add(D).unbind("mousedown touchstart MSPointerDown pointerdown mouseup MSPointerUp pointerup mouseout MSPointerOut pointerout touchend",j,h);l.data({bindEvent_buttonsContinuous_x:false});if(!l.data("bindEvent_buttonsPixels_x")){w.bind("click",function(x){x.preventDefault();r(Math.abs(q.position().left)+l.data("scrollButtons_scrollAmount"))});D.bind("click",function(x){x.preventDefault();r(Math.abs(q.position().left)-l.data("scrollButtons_scrollAmount"))});l.data({bindEvent_buttonsPixels_x:true})}}else{f.add(A).unbind("mousedown touchstart MSPointerDown pointerdown mouseup MSPointerUp pointerup mouseout MSPointerOut pointerout touchend",j,h);l.data({bindEvent_buttonsContinuous_y:false});if(!l.data("bindEvent_buttonsPixels_y")){f.bind("click",function(x){x.preventDefault();r(Math.abs(q.position().top)+l.data("scrollButtons_scrollAmount"))});A.bind("click",function(x){x.preventDefault();r(Math.abs(q.position().top)-l.data("scrollButtons_scrollAmount"))});l.data({bindEvent_buttonsPixels_y:true})}}function r(x){if(!k.data("preventAction")){k.data("preventAction",true);l.mCustomScrollbar("scrollTo",x,{trigger:"internal"})}}}else{if(l.data("horizontalScroll")){w.add(D).unbind("click");l.data({bindEvent_buttonsPixels_x:false});if(!l.data("bindEvent_buttonsContinuous_x")){w.bind("mousedown touchstart MSPointerDown pointerdown",function(y){y.preventDefault();var x=B();l.data({mCSB_buttonScrollRight:setInterval(function(){l.mCustomScrollbar("scrollTo",Math.abs(q.position().left)+x,{trigger:"internal",scrollEasing:"easeOutCirc"})},17)})});var j=function(x){x.preventDefault();clearInterval(l.data("mCSB_buttonScrollRight"))};w.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout",j);D.bind("mousedown touchstart MSPointerDown pointerdown",function(y){y.preventDefault();var x=B();l.data({mCSB_buttonScrollLeft:setInterval(function(){l.mCustomScrollbar("scrollTo",Math.abs(q.position().left)-x,{trigger:"internal",scrollEasing:"easeOutCirc"})},17)})});var h=function(x){x.preventDefault();clearInterval(l.data("mCSB_buttonScrollLeft"))};D.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout",h);l.data({bindEvent_buttonsContinuous_x:true})}}else{f.add(A).unbind("click");l.data({bindEvent_buttonsPixels_y:false});if(!l.data("bindEvent_buttonsContinuous_y")){f.bind("mousedown touchstart MSPointerDown pointerdown",function(y){y.preventDefault();var x=B();l.data({mCSB_buttonScrollDown:setInterval(function(){l.mCustomScrollbar("scrollTo",Math.abs(q.position().top)+x,{trigger:"internal",scrollEasing:"easeOutCirc"})},17)})});var u=function(x){x.preventDefault();clearInterval(l.data("mCSB_buttonScrollDown"))};f.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout",u);A.bind("mousedown touchstart MSPointerDown pointerdown",function(y){y.preventDefault();var x=B();l.data({mCSB_buttonScrollUp:setInterval(function(){l.mCustomScrollbar("scrollTo",Math.abs(q.position().top)-x,{trigger:"internal",scrollEasing:"easeOutCirc"})},17)})});var g=function(x){x.preventDefault();clearInterval(l.data("mCSB_buttonScrollUp"))};A.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout",g);l.data({bindEvent_buttonsContinuous_y:true})}}function B(){var x=l.data("scrollButtons_scrollSpeed");if(l.data("scrollButtons_scrollSpeed")==="auto"){x=Math.round((l.data("scrollInertia")+100)/40)}return x}}}if(l.data("autoScrollOnFocus")){if(!l.data("bindEvent_focusin")){i.bind("focusin",function(){i.scrollTop(0).scrollLeft(0);var x=c(document.activeElement);if(x.is("input,textarea,select,button,a[tabindex],area,object")){var J=q.position().top,y=x.position().top,I=i.height()-x.outerHeight();if(l.data("horizontalScroll")){J=q.position().left;y=x.position().left;I=i.width()-x.outerWidth()}if(J+y<0||J+y>I){l.mCustomScrollbar("scrollTo",y,{trigger:"internal"})}}});l.data({bindEvent_focusin:true})}}if(l.data("autoHideScrollbar")&#038;&#038;!l.data("alwaysShowScrollbar")){if(!l.data("bindEvent_autoHideScrollbar")){i.bind("mouseenter",function(x){i.addClass("mCS-mouse-over");d.showScrollbar.call(i.children(".mCSB_scrollTools"))}).bind("mouseleave touchend",function(x){i.removeClass("mCS-mouse-over");if(x.type==="mouseleave"){d.hideScrollbar.call(i.children(".mCSB_scrollTools"))}});l.data({bindEvent_autoHideScrollbar:true})}}},scrollTo:function(e,f){var i=c(this),o={moveDragger:false,trigger:"external",callbacks:true,scrollInertia:i.data("scrollInertia"),scrollEasing:i.data("scrollEasing")},f=c.extend(o,f),p,g=i.children(".mCustomScrollBox"),k=g.children(".mCSB_container"),r=g.children(".mCSB_scrollTools"),j=r.children(".mCSB_draggerContainer"),h=j.children(".mCSB_dragger"),t=draggerSpeed=f.scrollInertia,q,s,m,l;if(!k.hasClass("mCS_no_scrollbar")){i.data({mCS_trigger:f.trigger});if(i.data("mCS_Init")){f.callbacks=false}if(e||e===0){if(typeof(e)==="number"){if(f.moveDragger){p=e;if(i.data("horizontalScroll")){e=h.position().left*i.data("scrollAmount")}else{e=h.position().top*i.data("scrollAmount")}draggerSpeed=0}else{p=e/i.data("scrollAmount")}}else{if(typeof(e)==="string"){var v;if(e==="top"){v=0}else{if(e==="bottom"&#038;&#038;!i.data("horizontalScroll")){v=k.outerHeight()-g.height()}else{if(e==="left"){v=0}else{if(e==="right"&#038;&#038;i.data("horizontalScroll")){v=k.outerWidth()-g.width()}else{if(e==="first"){v=i.find(".mCSB_container").find(":first")}else{if(e==="last"){v=i.find(".mCSB_container").find(":last")}else{v=i.find(e)}}}}}}if(v.length===1){if(i.data("horizontalScroll")){e=v.position().left}else{e=v.position().top}p=e/i.data("scrollAmount")}else{p=e=v}}}if(i.data("horizontalScroll")){if(i.data("onTotalScrollBack_Offset")){s=-i.data("onTotalScrollBack_Offset")}if(i.data("onTotalScroll_Offset")){l=g.width()-k.outerWidth()+i.data("onTotalScroll_Offset")}if(p<0){p=e=0;clearInterval(i.data("mCSB_buttonScrollLeft"));if(!s){q=true}}else{if(p>=j.width()-h.width()){p=j.width()-h.width();e=g.width()-k.outerWidth();clearInterval(i.data("mCSB_buttonScrollRight"));if(!l){m=true}}else{e=-e}}var n=i.data("snapAmount");if(n){e=Math.round(e/n)*n-i.data("snapOffset")}d.mTweenAxis.call(this,h[0],"left",Math.round(p),draggerSpeed,f.scrollEasing);d.mTweenAxis.call(this,k[0],"left",Math.round(e),t,f.scrollEasing,{onStart:function(){if(f.callbacks&#038;&#038;!i.data("mCS_tweenRunning")){u("onScrollStart")}if(i.data("autoHideScrollbar")&#038;&#038;!i.data("alwaysShowScrollbar")){d.showScrollbar.call(r)}},onUpdate:function(){if(f.callbacks){u("whileScrolling")}},onComplete:function(){if(f.callbacks){u("onScroll");if(q||(s&#038;&#038;k.position().left>=s)){u("onTotalScrollBack")}if(m||(l&#038;&#038;k.position().left<=l)){u("onTotalScroll")}}h.data("preventAction",false);i.data("mCS_tweenRunning",false);if(i.data("autoHideScrollbar")&#038;&#038;!i.data("alwaysShowScrollbar")){if(!g.hasClass("mCS-mouse-over")){d.hideScrollbar.call(r)}}}})}else{if(i.data("onTotalScrollBack_Offset")){s=-i.data("onTotalScrollBack_Offset")}if(i.data("onTotalScroll_Offset")){l=g.height()-k.outerHeight()+i.data("onTotalScroll_Offset")}if(p<0){p=e=0;clearInterval(i.data("mCSB_buttonScrollUp"));if(!s){q=true}}else{if(p>=j.height()-h.height()){p=j.height()-h.height();e=g.height()-k.outerHeight();clearInterval(i.data("mCSB_buttonScrollDown"));if(!l){m=true}}else{e=-e}}var n=i.data("snapAmount");if(n){e=Math.round(e/n)*n-i.data("snapOffset")}d.mTweenAxis.call(this,h[0],"top",Math.round(p),draggerSpeed,f.scrollEasing);d.mTweenAxis.call(this,k[0],"top",Math.round(e),t,f.scrollEasing,{onStart:function(){if(f.callbacks&#038;&#038;!i.data("mCS_tweenRunning")){u("onScrollStart")}if(i.data("autoHideScrollbar")&#038;&#038;!i.data("alwaysShowScrollbar")){d.showScrollbar.call(r)}},onUpdate:function(){if(f.callbacks){u("whileScrolling")}},onComplete:function(){if(f.callbacks){u("onScroll");if(q||(s&#038;&#038;k.position().top>=s)){u("onTotalScrollBack")}if(m||(l&#038;&#038;k.position().top<=l)){u("onTotalScroll")}}h.data("preventAction",false);i.data("mCS_tweenRunning",false);if(i.data("autoHideScrollbar")&#038;&#038;!i.data("alwaysShowScrollbar")){if(!g.hasClass("mCS-mouse-over")){d.hideScrollbar.call(r)}}}})}if(i.data("mCS_Init")){i.data({mCS_Init:false})}}}function u(w){if(i.data("mCustomScrollbarIndex")){this.mcs={top:k.position().top,left:k.position().left,draggerTop:h.position().top,draggerLeft:h.position().left,topPct:Math.round((100*Math.abs(k.position().top))/Math.abs(k.outerHeight()-g.height())),leftPct:Math.round((100*Math.abs(k.position().left))/Math.abs(k.outerWidth()-g.width()))};switch(w){case"onScrollStart":i.data("mCS_tweenRunning",true).data("onScrollStart_Callback").call(i,this.mcs);break;case"whileScrolling":i.data("whileScrolling_Callback").call(i,this.mcs);break;case"onScroll":i.data("onScroll_Callback").call(i,this.mcs);break;case"onTotalScrollBack":i.data("onTotalScrollBack_Callback").call(i,this.mcs);break;case"onTotalScroll":i.data("onTotalScroll_Callback").call(i,this.mcs);break}}}},stop:function(){var g=c(this),e=g.children().children(".mCSB_container"),f=g.children().children().children().children(".mCSB_dragger");d.mTweenAxisStop.call(this,e[0]);d.mTweenAxisStop.call(this,f[0])},disable:function(e){var j=c(this),f=j.children(".mCustomScrollBox"),h=f.children(".mCSB_container"),g=f.children(".mCSB_scrollTools"),i=g.children().children(".mCSB_dragger");f.unbind("mousewheel focusin mouseenter mouseleave touchend");h.unbind("touchstart touchmove");if(e){if(j.data("horizontalScroll")){i.add(h).css("left",0)}else{i.add(h).css("top",0)}}g.css("display","none");h.addClass("mCS_no_scrollbar");j.data({bindEvent_mousewheel:false,bindEvent_focusin:false,bindEvent_content_touch:false,bindEvent_autoHideScrollbar:false}).addClass("mCS_disabled")},destroy:function(){var e=c(this);e.removeClass("mCustomScrollbar _mCS_"+e.data("mCustomScrollbarIndex")).addClass("mCS_destroyed").children().children(".mCSB_container").unwrap().children().unwrap().siblings(".mCSB_scrollTools").remove();c(document).unbind("mousemove."+e.data("mCustomScrollbarIndex")+" mouseup."+e.data("mCustomScrollbarIndex")+" MSPointerMove."+e.data("mCustomScrollbarIndex")+" MSPointerUp."+e.data("mCustomScrollbarIndex"));c(window).unbind("resize."+e.data("mCustomScrollbarIndex"))}},d={showScrollbar:function(){this.stop().animate({opacity:1},"fast")},hideScrollbar:function(){this.stop().animate({opacity:0},"fast")},mTweenAxis:function(g,i,h,f,o,y){var y=y||{},v=y.onStart||function(){},p=y.onUpdate||function(){},w=y.onComplete||function(){};var n=t(),l,j=0,r=g.offsetTop,s=g.style;if(i==="left"){r=g.offsetLeft}var m=h-r;q();e();function t(){if(window.performance&#038;&#038;window.performance.now){return window.performance.now()}else{if(window.performance&#038;&#038;window.performance.webkitNow){return window.performance.webkitNow()}else{if(Date.now){return Date.now()}else{return new Date().getTime()}}}}function x(){if(!j){v.call()}j=t()-n;u();if(j>=g._time){g._time=(j>g._time)?j+l-(j-g._time):j+l-1;if(g._time<j+1){g._time=j+1}}if(g._time<f){g._id=_request(x)}else{w.call()}}function u(){if(f>0){g.currVal=k(g._time,r,m,f,o);s[i]=Math.round(g.currVal)+"px"}else{s[i]=h+"px"}p.call()}function e(){l=1000/60;g._time=j+l;_request=(!window.requestAnimationFrame)?function(z){u();return setTimeout(z,0.01)}:window.requestAnimationFrame;g._id=_request(x)}function q(){if(g._id==null){return}if(!window.requestAnimationFrame){clearTimeout(g._id)}else{window.cancelAnimationFrame(g._id)}g._id=null}function k(B,A,F,E,C){switch(C){case"linear":return F*B/E+A;break;case"easeOutQuad":B/=E;return -F*B*(B-2)+A;break;case"easeInOutQuad":B/=E/2;if(B<1){return F/2*B*B+A}B--;return -F/2*(B*(B-2)-1)+A;break;case"easeOutCubic":B/=E;B--;return F*(B*B*B+1)+A;break;case"easeOutQuart":B/=E;B--;return -F*(B*B*B*B-1)+A;break;case"easeOutQuint":B/=E;B--;return F*(B*B*B*B*B+1)+A;break;case"easeOutCirc":B/=E;B--;return F*Math.sqrt(1-B*B)+A;break;case"easeOutSine":return F*Math.sin(B/E*(Math.PI/2))+A;break;case"easeOutExpo":return F*(-Math.pow(2,-10*B/E)+1)+A;break;case"mcsEaseOut":var D=(B/=E)*B,z=D*B;return A+F*(0.499999999999997*z*D+-2.5*D*D+5.5*z+-6.5*D+4*B);break;case"draggerRailEase":B/=E/2;if(B<1){return F/2*B*B*B+A}B-=2;return F/2*(B*B*B+2)+A;break}}},mTweenAxisStop:function(e){if(e._id==null){return}if(!window.requestAnimationFrame){clearTimeout(e._id)}else{window.cancelAnimationFrame(e._id)}e._id=null},rafPolyfill:function(){var f=["ms","moz","webkit","o"],e=f.length;while(--e>-1&#038;&#038;!window.requestAnimationFrame){window.requestAnimationFrame=window[f[e]+"RequestAnimationFrame"];window.cancelAnimationFrame=window[f[e]+"CancelAnimationFrame"]||window[f[e]+"CancelRequestAnimationFrame"]}}};d.rafPolyfill.call();c.support.touch=!!("ontouchstart" in window);c.support.pointer=window.navigator.pointerEnabled;c.support.msPointer=window.navigator.msPointerEnabled;var a=("https:"==document.location.protocol)?"https:":"http:";c.event.special.mousewheel||document.write('<script src="'+a+'//cdnjs.cloudflare.com/ajax/libs/jquery-mousewheel/3.0.6/jquery.mousewheel.min.js"><\/script>');c.fn.mCustomScrollbar=function(e){if(b[e]){return b[e].apply(this,Array.prototype.slice.call(arguments,1))}else{if(typeof e==="object"||!e){return b.init.apply(this,arguments)}else{c.error("Method "+e+" does not exist")}}}})(jQuery);
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![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();</p>
<p>// <input type="text" placeholder="username">
(function($){
    //feature detection
    var hasPlaceholder = 'placeholder' in document.createElement('input');
    var placeholderClass = 'evn-placeholder';</p>
<p>    //sniffy sniff sniff -- just to give extra left padding for the older
    //graphics for type=email and type=url
    var isOldOpera = $.browser.opera &#038;&#038; $.browser.version < 10.5;</p>
<p>    $.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;</p>
<p>        //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() {</p>
<p>            //local vars
            var $this = $(this),
                inputVal = $.trim($this.val()),
                inputWidth = $this.width(),
                inputHeight = $this.height(),</p>
<p>            //grab the inputs id for the <label @for>, or make a new one from the Date
                inputId = (this.id) ? this.id : 'placeholder' + (+new Date()) + this.className.replace(' ',''),
                placeholderText = options.placeholderText ? options.placeholderText : $this.attr('placeholder'),
                placeholder = $('<label class="' + placeholderClass + '" for=\"'+ inputId +'\">'+ placeholderText + '</label>');</p>
<p>            //stuff in some calculated values into the placeholderCSS object
//            options.placeholderCSS['width'] = inputWidth;
            options.placeholderCSS['height'] = inputHeight;</p>
<p>            // adjust position of placeholder
            options.placeholderCSS.left = (isOldOpera &#038;&#038; (this.type == 'email' || this.type == 'url')) ?
                '11%' : o_left;
            placeholder.css(options.placeholderCSS);</p>
<p>            //place the placeholder if the input is empty</p>
<p>            $this.wrap(options.inputWrapper);
            $this.attr('id', inputId).after(placeholder);</p>
<p>            if(inputVal) {
                $this.next().hide();
            }</p>
<p>            //hide placeholder on focus
            $this.focus(function(){
                $this.next().hide();
            });</p>
<p>            //show placeholder if the input is empty
            $this.blur(function(){
                if (!$.trim($this.val())){
                    $this.next().show();
                };
            });
        });
    };</p>
<p>    //expose defaults
    $.fn.placeholder.defaults = {
        //you can pass in a custom wrapper
        inputWrapper: '</p>
<div style="position:relative;"></div>
<p>',
        placeholderText: null,</p>
<p>        //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);
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/*!
 *  ClearlyComponent__detect
 *  Evernote Clearly's content-detection algorithm as an embeddable component.
 *  Copyright 2013, Evernote Corporation
 *
 *  Usage:
 *  ======
 *
 *      // define
 *      window.ClearlyComponent__detect = {
 *          'callbacks': {
 *              'finished': someFunction(),
 *          },
 *          'window': window,
 *          'document': document,
 *          'jQuery': window.jQuery
 *      };
 *
 *      // init -- will return false, if something goes wrong
 *      window.ClearlyComponent__detect = initClearlyComponent__detect(window.ClearlyComponent__detect);
 *
 *      // call -- returns nothing; callbacks will be used
 *      window.ClearlyComponent__detect.start();
 *
 *      // publcly available/overridable
 *      window.ClearlyComponent__detect.debug
 *      window.ClearlyComponent__detect.parseOptions
 *
 */</p>
<p>/*
    changes:
    ========
        $R => $D
        $R.win => $D.window
        $R.parsingOptions => $D.parseOptions
        $R.skipStuffFromDomains__links => $D.parseOptions._skip_link_from_domain
        $R.skipStuffFromDomain__images => $D.parseOptions._skip_image_from_domain
        $R.keepStuffFromDomain__video => $D.parseOptions._keep_video_from_domain
        $R.getContent__processCandidates => $D.getContent__processCandidates__first
        $R.getContent__computePointsForCandidate => $D.getContent__computePointsForCandidate__first
        $R.getContent__computeDetailsForCandidate => $D.getContent__computeDetailsForCandidate__first
        $R.getContent__processCandidatesSecond => $D.getContent__processCandidates__second
        $R.getContent__computePointsForCandidateSecond => $D.getContent__computePointsForCandidate__second
        $R.getContent__computeDetailsForCandidateSecond => $D.getContent__computeDetailsForCandidate__second
        $R.getContent__computePointsForCandidateThird => $D.getContent__computePointsForCandidate__third
        $R.getContent__computeDetailsForCandidateThird => $D.getContent__computeDetailsForCandidate__third</p>
<p>    to do:
    ======
*/</p>
<p>function initClearlyComponent__detect(_paramInstance)
{
    //  global instance reference {
    //  ===========================</p>
<p>        //  null; return
        if (_paramInstance); else { return false; }</p>
<p>        //  shorthand
        $D = _paramInstance;</p>
<p>    //  global instance reference }</p>
<p>    //  required vars {
    //  ===============</p>
<p>        //  the component instance object must already be created,
        //  when the init function is called. it must have these vars set:</p>
<p>        switch (true)
        {
            case (!($D.callbacks)):
            case (!($D.callbacks.finished)):</p>
<p>            case (!($D.window)):
            case (!($D.document)):
            case (!($D.document.body)):</p>
<p>            case (!($D.jQuery)):</p>
<p>                if ($D.debug)
                {
                    console.log(!($D.callbacks));
                    console.log(!($D.callbacks.finished));</p>
<p>                    console.log(!($D.window));
                    console.log(!($D.document));
                    console.log(!($D.document.body));</p>
<p>                    console.log(!($D.jQuery));
                }</p>
<p>                //  something's wrong
                return false;
        }</p>
<p>    //  required vars }</p>
<p>    //  global vars {
    //  =============</p>
<p>        $CJ = $D.jQuery;</p>
<p>        $D.$window = $CJ($D.window);
        $D.$document = $CJ($D.document);</p>
<p>    //  global vars }</p>
<p>    //  parse options {
    //  ===============   </p>
<p>		$D.parseOptions =
		{
			'_elements_ignore': 			        '|button|input|select|textarea|optgroup|command|datalist|--|frame|frameset|noframes|--|style|link|script|noscript|--|canvas|applet|map|--|marquee|area|base|',
			'_elements_ignore_id': 					'|evernote-content|evernote-attributes-content|evernote-share-content|evernoteErrorPopup|evernote-post-clip-content|',
			'_elements_ignore_tag': 		        '|form|fieldset|details|dir|--|center|font|span|',</p>
<p>			'_elements_container': 			        '|body|--|article|section|--|div|--|td|--|li|--|dd|dt|',
            '_elements_self_closing': 		        '|br|hr|--|img|--|col|--|source|--|embed|param|--|iframe|',</p>
<p>			'_elements_visible': 			        '|article|section|--|ul|ol|li|dd|--|table|tr|td|--|div|--|p|--|h1|h2|h3|h4|h5|h6|--|span|',
			'_elements_too_much_content': 	        '|b|i|em|strong|--|h1|h2|h3|h4|h5|--|td|',
			'_elements_link_density':		        '|div|--|table|ul|ol|--|section|aside|header|',
			'_elements_floating':			        '|div|--|table|',
			'_elements_above_target_ignore':        '|br|--|ul|ol|dl|--|table|',</p>
<p>            '_unskippable_attribute':               'clearly__unskippable_element',
            '_unskippable_attribute_value':         'yes',</p>
<p>            '_use_document_title_attribute':        'clearly__use_document_title_as_article_title',
            '_use_document_title_attribute_value':  'yes',</p>
<p>            '_elements_keep_attributes':
			{
				'a': 		['href', 'title', 'name'],
				'img': 		['src', 'width', 'height', 'alt', 'title'],</p>
<p>				'video': 	['src', 'width', 'height', 'poster', 'audio', 'preload', 'autoplay', 'loop', 'controls'],
				'audio': 	['src', 'preload', 'autoplay', 'loop', 'controls'],		 
				'source': 	['src', 'type'],</p>
<p>				'object': 	['data', 'type', 'width', 'height', 'classid', 'codebase', 'codetype'],						
				'param': 	['name', 'value'],
				'embed': 	['src', 'type', 'width', 'height', 'flashvars', 'allowscriptaccess', 'allowfullscreen', 'bgcolor'],</p>
<p>				'iframe':	['src', 'width', 'height', 'frameborder', 'scrolling'],</p>
<p>				'td':		['colspan', 'rowspan'],			
				'th':		['colspan', 'rowspan']
			},</p>
<p>			'_skip_link_from_domain': [
                /* international */     'doubleclick.net', 'fastclick.net', 'adbrite.com', 'adbureau.net', 'admob.com', 'bannersxchange.com', 'buysellads.com', 'impact-ad.jp', 'atdmt.com', 'advertising.com', 'serving-sys.com',
                /* japan */             'itmedia.jp', 'microad.jp', 'adplan-ds.com'
			],</p>
<p>			'_skip_image_from_domain': [
                /* international */     'googlesyndication.com', 'fastclick.net', '.2mdn.net', 'de17a.com', 'content.aimatch.com', 'bannersxchange.com', 'buysellads.com', 'atdmt.com', 'advertising.com', 'serving-sys.com',
                /* japan */             'impact-ad.jp', 'itmedia.jp', 'microad.jp', 'adplan-ds.com'
			],</p>
<p>			'_keep_video_from_domain': [
                /* video */     'youtube.com', 'youtube-nocookie.com', 'vimeo.com', 'hulu.com', 'flickr.com',
                /* other */     'yahoo.com', 'newsnetz.ch'
			]
		};</p>
<p>    //  parse options }</p>
<p>    //  debug {
    //  =======</p>
<p>        $D.debug = ($D.debug || false);
		$D.debugRemembered = {};
        $D.debugTimers = [];</p>
<p>		if ($D.debug)
		{
		    //  writeLog
		    //  ========
				switch (true)
				{
					case (!(!($D.window.console &#038;&#038; $D.window.console.log))):    $D.writeLog = function (msg) { $D.window.console.log(msg); };       break;
					case (!(!($D.window.opera &#038;&#038; $D.window.opera.postError))):  $D.writeLog = function (msg) { $D.window.opera.postError(msg); };   break;
					default:                                                    $D.writeLog = function (msg) {};                                    break;
				}</p>
<p>            //  log
            //  ===
                $D.log = function ()
                {
                    if ($D.debug); else { return; }
                    for (var i=0, il=arguments.length; i<il ; i++) { $D.writeLog(arguments[i]); }
                    $D.writeLog('-----------------------------------------');
                };</p>
<p>            //  remember
            //  ========
                $D.debugRemember = function (_k, _v)
                {
                    $D.debugRemembered[_k] = _v;
                };</p>
<p>            //  outline
            //  =======
                $D.debugOutline = function (_element, _category, _reason)
                {
                    var _outline = '#ff5500', _background = 'rgba(255, 85, 0, 0.5)';</p>
<p>                    switch (true)
                    {
                        case (!$D.debug):
                        case (!(_element.nodeType === 1)):
                        case (!(_element.tagName > '')):
                        case (_element.tagName.toLowerCase() == 'onject'):
                        case (_element.tagName.toLowerCase() == 'embed'):
                            return;
                    }</p>
<p>                    switch (true)
                    {
                        case (_category == 'target' &#038;&#038; _reason == 'first'):                 _outline = '#00cc00'; _background = 'rgba(0, 255, 0, 0.5)';         break;
                        case (_category == 'target' &#038;&#038; _reason == 'second'):                _outline = '#0000cc'; _background = 'rgba(0, 0, 255, 0.5)';         break;</p>
<p>                        case (_category == 'target' &#038;&#038; _reason == 'next-page'):             _outline = '#FF80C0'; _background = 'rgba(255, 128, 192, 0.5)';     break;
                        case (_category == 'target' &#038;&#038; _reason == 'add-above'):             _outline = '#804000'; _background = 'rgba(128, 64, 0, 0.5)';        break;</p>
<p>                        case (_category == 'clean-before' &#038;&#038; _reason == 'floating'):        _outline = '#808080'; _background = 'rgba(128, 128, 128, 0.5)';     break;
                        case (_category == 'clean-after' &#038;&#038; _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;
                    }</p>
<p>                    //  do
                    $CJ(_element).attr('readable__outline', (_category + ': ' + _reason));
                    $CJ(_element).css({ 'outline': '5px solid ' + _outline, 'background-color': '' + _background });
                };</p>
<p>		//	timers
		//	======</p>
<p>			$D.debugTimerStart = function (timerName)
			{
				$D.debugTimers.push({
					'name': timerName,
					'start': (new Date()).getTime()
				});
			};</p>
<p>			$D.debugTimerEnd = function ()
			{
				var _t = $D.debugTimers.pop(), _time = ((new Date()).getTime() - _t.start);
				$D.log('TIMER / '+_t.name+': ' + _time);
				return _time;
			};
		}
		else
		{
            $D.writeLog 		= function () { return false; };
            $D.log 				= function () { return false; };
            $D.debugRemember 	= function () { return false; };
            $D.debugOutline 	= function () { return false; };
            $D.debugTimerStart 	= function () { return false; };
            $D.debugTimerEnd 	= function () { return false; };
        }</p>
<p>    //  debug }</p>
<p>    //  language {
    //  ==========</p>
<p>        //  default
        $D.language = 'general';</p>
<p>        //  text to test
        //  ============</p>
<p>            //  title
            $D.textForlanguageDetection = $D.document.title;</p>
<p>            //  snippets
            //  ...</p>
<p>        //  check
        //  =====
            switch (true)
            {
                case ($D.textForlanguageDetection.match(/([\u3000])/gi) != null):
                case ($D.textForlanguageDetection.match(/([\u3001])/gi) != null):
                case ($D.textForlanguageDetection.match(/([\u3002])/gi) != null):
                case ($D.textForlanguageDetection.match(/([\u301C])/gi) != null):
                    $D.language = 'cjk';
                    break;
            }</p>
<p>    //  language }</p>
<p>    //  rtl {
    //  =====</p>
<p>        //  flags
        $D.rtl = false;
        $D.maybeRTL = false;</p>
<p>        //  on/off
        $D.makeRTL = function () { $D.rtl = true; };
        $D.makeNotRTL = function () { $D.rtl = false; };</p>
<p>        //	detect
		(function ()
		{
			//	definitely
			$D.$document.find('html, body').each(function (_i, _e)
			{
				switch (true)
				{
					case ($CJ(_e).attr('dir') == 'rtl'):
					case ($CJ(_e).css('direction') == 'rtl'):
					case ($CJ(_e).attr('lang') == 'he'):
					case ($CJ(_e).attr('lang') == 'he-il'):
					case ($CJ(_e).attr('lang') == 'ar'):
					case ($CJ(_e).attr('lang') == 'ur'):
						$D.makeRTL();
						return false;
				}
			});</p>
<p>			//	maybe?
            if (true
                &#038;&#038; (!$D.rtl) 
                &#038;&#038; ($D.$document.find("div[dir='rtl'], table[dir='rtl'], td[dir='rtl']").length > 0)
            ) { $D.maybeRTL = true; }
		}
		)();</p>
<p>    //  rtl }</p>
<p>    //  measure text {
    //  ==============</p>
<p>        //	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</p>
<p>        //	length
        //	======
            $D.measureText__getTextLength = function (_the_text)
            {
                var _text = _the_text;</p>
<p>                    _text = _text.replace(/[\s\n\r]+/gi, '');
                    //_text = _text.replace(/\d+/, '');</p>
<p>                return _text.length;
            };</p>
<p>        //	word count
        //	==========
            $D.measureText__getWordCount = function (_the_text)
            {
                var _text = _the_text;</p>
<p>                //	do stuff
                //	========
                    _text = _text.replace(/[\s\n\r]+/gi, ' ');</p>
<p>                    _text = _text.replace(/([.,?!:;()\[\]'""-])/gi, ' $1 ');</p>
<p>                    _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)]');</p>
<p>                //	count
                //	=====
                    var 
                        _count = 0,
                        _words_match = _text.match(/([^\s\d]{3,})/gi)
                    ;	</p>
<p>                    //	add match
                    _count += (_words_match != null ? _words_match.length : 0);</p>
<p>                    //	add manual count
                    _text.replace(/\[=words\((\d)\)\]/, function (_match, _plus) { _count += (5 * parseInt(_plus)); });</p>
<p>                //	return
                //	======
                    return _count;
            };</p>
<p>        //	levenshtein
        //	===========	
            $D.levenshteinDistance = function (str1, str2)
            {
                var l1 = str1.length, l2 = str2.length, i = 0, j = 0, d = [];</p>
<p>                if (Math.min(l1, l2) === 0)
                    { return Math.max(l1, l2); }</p>
<p>                for (i = 0 ; i <= l1 ; i++)
                    { d[i] = []; d[i][0] = i; }</p>
<p>                for (j = 0 ; j <= l2 ; j++)
                    { d[0][j] = j; }</p>
<p>                for (i = 1 ; i <= l1 ; i++)
                    { for (j = 1 ; j <= l2 ; j++) { d[i][j] = Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + (str1.charAt(i - 1) === str2.charAt(j - 1) ? 0 : 1)); } }</p>
<p>                return d[l1][l2];
            };</p>
<p>        //	get first fragment
        //	==================
            $D.nextPage__getFirstFragment = function (_html)
            {
                //  remove all tags
                _html = _html.replace(/<[^>]+?>/gi, '');</p>
<p>                //  normalize spaces
                _html = _html.replace(/\s+/gi, ' ');</p>
<p>                //  return first 1000 characters
                return _html.substr(0, 2000);
            };</p>
<p>    //  measure text }</p>
<p>    //  hidden node {
    //  =============</p>
<p>        $D.isNodeHidden = function (_node, _tag_name)
        {
            switch (true)
            {
                case (_node.offsetWidth > 0):
                case (_node.offsetHeight > 0):
                    break;</p>
<p>                default:
                    switch (true)
                    {
                        case (_node.offsetLeft > 0):
                        case (_node.offsetTop > 0):
                            break;</p>
<p>                        default:
                            //  exclude inline DIVs -- which, stupidly, don't have a width/height
                            if (true
                                &#038;&#038; (_tag_name == 'div') 
                                &#038;&#038; ((_node.style.display || $CJ.css( _node, "display" )) == 'inline')
                            ) { break; }</p>
<p>                            //  it's hidden
                            return true;
                    }
                    break;
            }</p>
<p>            //  it's not hidden
            return false;
        };</p>
<p>    //  hidden node }</p>
<p>    //  compute points for candidate {
    //  ==============================</p>
<p>        $D.getContent__computePointsForCandidate__do = function (_ratio_remaining, _power, _ratio, _points_history)
        {
            var 
                _points_remaining = (_points_history[0] * _ratio_remaining),
                _points_to_compute = (_points_history[0] - _points_remaining)
            ;</p>
<p>            if (_ratio < 0)
            {
                //_points_return = (0.75 * _points_remaining);
                _points_return = _points_remaining;
            }
            else
            {
                _points_return = 0
                    + _points_remaining
                    + (_points_to_compute * Math.pow(_ratio, _power))
                ;
            }</p>
<p>            //	add
            _points_history.unshift(_points_return);
        };</p>
<p>    //  compute points for candidate }</p>
<p>    //  process candidates (first) {
    //  ============================</p>
<p>        $D.getContent__computeDetailsForCandidate__first = function (_e, _main)
        {
            var _r = {};</p>
<p>            //	bad candidate
            //	=============
                if (_e._is__bad) { return _r; }</p>
<p>            //	paragraphs
            //	==========
                _r['_count__lines_of_65_characters'] = (_e._length__plain_text / 65);
                _r['_count__paragraphs_of_3_lines'] =  (_r._count__lines_of_65_characters / 3);
                _r['_count__paragraphs_of_5_lines'] =  (_r._count__lines_of_65_characters / 5);</p>
<p>                _r['_count__paragraphs_of_50_words'] = (_e._count__plain_words / 50);
                _r['_count__paragraphs_of_80_words'] = (_e._count__plain_words / 80);</p>
<p>            //	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);</p>
<p>            //	links
            //	=====
                _r['_ratio__length__links_text_to_plain_text'] =  (_e._length__links_text / _e._length__plain_text);
                _r['_ratio__count__links_words_to_plain_words'] = (_e._count__links_words / _e._count__plain_words);</p>
<p>                _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);</p>
<p>                _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));</p>
<p>                _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);</p>
<p>            //	text above
            //	==========
                var 
                    _divide__candidates = Math.max(2, Math.ceil(_e._count__above_candidates * 0.5)),</p>
<p>                    _above_text = ((0
                        + (_e._length__above_plain_text * 1)
                        + (_e._length__above_plain_text / _divide__candidates)
                    ) / 2),</p>
<p>                    _above_words = ((0
                        + (_e._count__above_plain_words * 1)
                        + (_e._count__above_plain_words / _divide__candidates)
                    ) / 2)
                ;</p>
<p>                _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);</p>
<p>            //	candidates
            //	==========
                _r['_ratio__count__candidates_to_total_candidates'] = (_e._count__candidates / (_main._count__candidates + 1));
                _r['_ratio__count__containers_to_total_containers'] = (_e._count__containers / (_main._count__containers + 1));</p>
<p>            //	return
            //	======
                return _r;
        };    </p>
<p>        $D.getContent__computePointsForCandidate__first = function (_e, _main)
        {
            var 
                _details = _e.__candidate_details,
                _points_history = [],
                _really_big = ((_main._length__plain_text / 65) > 250)
            ;</p>
<p>            //	bad candidate
            if (_e._is__bad) { return [0]; }</p>
<p>            //	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));</p>
<p>                //  negative
                if (_points_history[0] < 0) { return [0]; }</p>
<p>            //  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))
                ;</p>
<p>                _points_history.unshift(((0
                    + (_points_history[0] * 3)
                    + (_points_history[0] / _divide__pieces)
                    + (_points_history[0] / _divide__candidates)
                    + (_points_history[0] / _divide__containers)
                ) / 6));</p>
<p>            //	total text
            //	==========
                $D.getContent__computePointsForCandidate__do(0.10, 2, (1 - (1 - _details._ratio__length__plain_text_to_total_plain_text)), _points_history);
                $D.getContent__computePointsForCandidate__do(0.10, 2, (1 - (1 - _details._ratio__count__plain_words_to_total_plain_words)), _points_history);</p>
<p>                if (_really_big) {
                $D.getContent__computePointsForCandidate__do(0.10, 4, (1 - (1 - _details._ratio__length__plain_text_to_total_plain_text)), _points_history);
                $D.getContent__computePointsForCandidate__do(0.10, 4, (1 - (1 - _details._ratio__count__plain_words_to_total_plain_words)), _points_history);
                }</p>
<p>            //	text above
            //	==========
                $D.getContent__computePointsForCandidate__do(0.10, 5, (1 - _details._ratio__length__above_plain_text_to_total_plain_text), _points_history);
                $D.getContent__computePointsForCandidate__do(0.10, 5, (1 - _details._ratio__count__above_plain_words_to_total_plain_words), _points_history);</p>
<p>                if (_really_big) {
                $D.getContent__computePointsForCandidate__do(0.10, 10, (1 - _details._ratio__length__above_plain_text_to_total_plain_text), _points_history);
                $D.getContent__computePointsForCandidate__do(0.10, 10, (1 - _details._ratio__count__above_plain_words_to_total_plain_words), _points_history);
                }</p>
<p>            //	links outer
            //	===========
                $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__length__links_text_to_total_links_text), _points_history);
                $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__links_words_to_total_links_words), _points_history);</p>
<p>                $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__links_to_total_links), _points_history);</p>
<p>            //  links inner
            //  ===========
                var __lr = ($D.language == 'cjk' ? 0.75 : 0.50);</p>
<p>                $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__length__links_text_to_plain_text), _points_history);
                $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_words_to_plain_words), _points_history);</p>
<p>                $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__length__links_text_to_all_text), _points_history);
                $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_words_to_all_words), _points_history);</p>
<p>                $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_to_plain_words), _points_history);</p>
<p>            //	candidates, containers, pieces
            //	==============================
                $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__candidates_to_total_candidates), _points_history);
                $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__containers_to_total_containers), _points_history);
                $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__pieces_to_total_pieces), _points_history);</p>
<p>            //	return -- will get [0] as the actual final points
            //	======
                return _points_history;
        };    </p>
<p>        $D.getContent__processCandidates__first = function (_candidatesToProcess)
        {
            //	process this var
            //	================
                var _candidates = _candidatesToProcess;</p>
<p>            //	sort _candidates -- the lower in the dom, the closer to position 0
            //	================
                _candidates.sort(function (a, b)
                {
                    switch (true)
                    {
                        case (a.__index < b.__index): return -1;
                        case (a.__index > b.__index): return 1;
                        default: return 0;
                    }
                });</p>
<p>            //	get first
            //	=========
                var	_main = _candidates[0]
                if ($D.debug) { $D.log('should be body', _main, _main.__node); }</p>
<p>            //	pieces of text -- and points computation
            //	==============
                for (var i=0, _i=_candidates.length; i<_i; i++)
                {
                    //	pieces
                    //	======
                        var 
                            _count__pieces = 0,
                            _array__pieces = []
                        ;</p>
<p>                        for (var k=i, _k=_candidates.length; k<_k; k++)
                        {
                            if (_candidates[k]._count__candidates > 0) { continue; }
                            if ($CJ.contains(_candidates[i].__node, _candidates[k].__node)); else { continue; }</p>
<p>                            //	store piece, if in debug mode
                            if ($D.debug) { _array__pieces.push(_candidates[k]); }</p>
<p>                            //	incement pieces count
                            _count__pieces++;
                        }</p>
<p>                    //	candidate details
                    //	=================
                        _candidates[i]['__candidate_details'] = $D.getContent__computeDetailsForCandidate__first(_candidates[i], _main);</p>
<p>                    //	pieces -- do this here because _main doesn't yet have a pieces count
                    //	======</p>
<p>                        //	set pieces
                        _candidates[i]['_count__pieces'] = _count__pieces;
                        _candidates[i]['_array__pieces'] = _array__pieces;</p>
<p>                        //	pieces ratio
                        _candidates[i]['__candidate_details']['_ratio__count__pieces_to_total_pieces'] = (_count__pieces / (_candidates[0]._count__pieces + 1));</p>
<p>                    //  check some more
                    //  ===============
                    /*    switch (true)
                        {
                            case (($D.language != 'cjk') &#038;&#038; (_candidates[i]['__candidate_details']['_ratio__length__links_text_to_plain_text'] > 1)):
                            case (($D.language != 'cjk') &#038;&#038; (_candidates[i]['__candidate_details']['_ratio__count__links_words_to_plain_words'] > 1)):
                                _candidates[i]._is__bad = true;
                                break;
                        }
                    */</p>
<p>                    //	points
                    //	======
                        _candidates[i].__points_history = $D.getContent__computePointsForCandidate__first(_candidates[i], _main);
                        _candidates[i].__points = _candidates[i].__points_history[0];
                }</p>
<p>            //	sort _candidates -- the more points, the closer to position 0
            //	================
                _candidates.sort(function (a, b)
                {
                    switch (true)
                    {
                        case (a.__points > b.__points): return -1;
                        case (a.__points < b.__points): return 1;
                        default: return 0;
                    }
                });</p>
<p>            //	return
            //	======
                return _candidates;	
        };    </p>
<p>    //  process candidates (first) }</p>
<p>    //  process candidates (second) {
    //  =============================</p>
<p>        $D.getContent__computePointsForCandidate__second = function (_e, _main)
        {
            var 
                _details = _e.__candidate_details,
                _details_second = _e.__candidate_details_second,
                _points_history = []
            ;</p>
<p>            //	bad candidate
            if (_e._is__bad) { return [0]; }</p>
<p>            //	get initial points
            //	==================
                _points_history.unshift(_e.__points_history[(_e.__points_history.length-1)]);</p>
<p>            //  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))
                ;</p>
<p>                _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));</p>
<p>            //	total text
            //	==========
                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - (1 - _details_second._ratio__length__plain_text_to_total_plain_text)), _points_history);
                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - (1 - _details_second._ratio__count__plain_words_to_total_plain_words)), _points_history);</p>
<p>            //	text above
            //	==========
                var __ar = ($D.language == 'cjk' ? 0.50 : 0.10);</p>
<p>                $D.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__length__above_plain_text_to_total_plain_text), _points_history);
                $D.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__count__above_plain_words_to_total_plain_words), _points_history);</p>
<p>                $D.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__length__above_plain_text_to_plain_text), _points_history);
                $D.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__count__above_plain_words_to_plain_words), _points_history);</p>
<p>            //	links outer
            //	===========
                $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details_second._ratio__count__links_to_total_links), _points_history);
                $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details_second._ratio__length__links_text_to_total_links_text), _points_history);
                $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details_second._ratio__count__links_words_to_total_links_words), _points_history);</p>
<p>            //	links inner
            //	===========
                var __lr = ($D.language == 'cjk' ? 0.75 : 0.50);</p>
<p>                $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__length__links_text_to_plain_text), _points_history);
                $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_words_to_plain_words), _points_history);</p>
<p>                $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details_second._ratio__length__links_text_to_all_text), _points_history);
                $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details_second._ratio__count__links_words_to_all_words), _points_history);</p>
<p>                $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details_second._ratio__count__links_to_plain_words), _points_history);</p>
<p>            //	candidates, containers, pieces
            //	==============================
                $D.getContent__computePointsForCandidate__do(0.10, 2, (1 - _details_second._ratio__count__candidates_to_total_candidates), _points_history);
                $D.getContent__computePointsForCandidate__do(0.10, 2, (1 - _details_second._ratio__count__containers_to_total_containers), _points_history);
                $D.getContent__computePointsForCandidate__do(0.10, 2, (1 - _details_second._ratio__count__pieces_to_total_pieces), _points_history);</p>
<p>            //	return -- will get [0] as the actual final points
            //	======
                return _points_history;
        };    </p>
<p>        $D.getContent__computeDetailsForCandidate__second = function (_e, _main)
        {
            var _r = {};</p>
<p>            //	bad candidate
            //	=============
                if (_e._is__bad) { return _r; }</p>
<p>            //	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);</p>
<p>            //	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);</p>
<p>                _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));</p>
<p>                _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);</p>
<p>            //	text above
            //	==========
                var 
                    _divide__candidates = Math.max(2, Math.ceil((_e._count__above_candidates - _main._count__above_candidates) * 0.5)),</p>
<p>                    _above_text = ((0
                        + (_e.__second_length__above_plain_text * 1)
                        + (_e.__second_length__above_plain_text / _divide__candidates)
                    ) / 2),</p>
<p>                    _above_words = ((0
                        + (_e.__second_count__above_plain_words * 1)
                        + (_e.__second_count__above_plain_words / _divide__candidates)
                    ) / 2)
                ;</p>
<p>                _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);</p>
<p>                _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);</p>
<p>            //	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));</p>
<p>            //	return
            //	======
                return _r;
        };    </p>
<p>        $D.getContent__processCandidates__second = function (_processedCandidates)
        {
            var 
                _candidates = _processedCandidates,
                _main = _candidates[0]
            ;</p>
<p>            //	only get children of target
            //	===========================
                _candidates = $CJ.map(_candidates, function (_element, _index)
                {
                    switch (true)
                    {
                        case (!(_index > 0)):
                        case (!($CJ.contains(_main.__node, _element.__node))):
                            return null;</p>
<p>                        default:
                            return _element;
                    }
                });</p>
<p>                //  add main - to amke sure the result is never blank
                _candidates.unshift(_main);</p>
<p>            //	sort _candidates -- the lower in the dom, the closer to position 0
            //	================
                _candidates.sort(function (a, b)
                {
                    switch (true)
                    {
                        case (a.__index < b.__index): return -1;
                        case (a.__index > b.__index): return 1;
                        default: return 0;
                    }
                });</p>
<p>            //	second candidate computation
            //	============================
                for (var i=0, _i=_candidates.length; i<_i; i++)
                {
                    //	additional numbers
                    //	==================
                        _candidates[i].__second_length__above_plain_text = (_candidates[i]._length__above_plain_text - _main._length__above_plain_text);
                        _candidates[i].__second_count__above_plain_words = (_candidates[i]._count__above_plain_words - _main._count__above_plain_words);</p>
<p>                    //	candidate details
                    //	=================
                        _candidates[i]['__candidate_details_second'] = $D.getContent__computeDetailsForCandidate__second(_candidates[i], _main);</p>
<p>                    //	check some more
                    //	===============
                    /*	switch (true)
                        {
                            case (!(_candidates[i]['__candidate_details_second']['_ratio__count__plain_words_to_total_plain_words'] > 0.05)):
                            case (!(_candidates[i]['__candidate_details_second']['_ratio__length__plain_text_to_total_plain_text'] > 0.05)):</p>
<p>                            //case (!(_candidates[i]['__candidate_details_second']['_ratio__count__above_plain_words_to_total_plain_words'] < 0.1)):
                            //case (!(_candidates[i]['__candidate_details_second']['_ratio__length__above_plain_text_to_total_plain_text'] < 0.1)):</p>
<p>                            //case (_candidates[i]['__candidate_details_second']['_ratio__length__above_plain_text_to_plain_text'] > 1):
                            //case (_candidates[i]['__candidate_details_second']['_ratio__count__above_plain_words_to_plain_words'] > 1):</p>
<p>                                _candidates[i]._is__bad = true;
                                //	wil set points to 0, in points computation function
                                break;
                        }
                    */</p>
<p>                    //	points
                    //	======
                        _candidates[i].__points_history_second = $D.getContent__computePointsForCandidate__second(_candidates[i], _main);
                        _candidates[i].__points_second = _candidates[i].__points_history_second[0];
                }</p>
<p>            //	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;
                    }
                });</p>
<p>            //	return
            //	======
                return _candidates;	
        };    </p>
<p>    //  process candidates (second) }</p>
<p>    //  process candidates (third) {
    //  ============================</p>
<p>        $D.getContent__computePointsForCandidate__third = function (_e, _main)
        {
            var 
                _details = _e.__candidate_details,
                _details_second = _e.__candidate_details_second,
                _points_history = []
            ;</p>
<p>            //	bad candidate
            if (_e._is__bad) { return [0]; }</p>
<p>            //	get initial points
            //	==================
                _points_history.unshift(_e.__points_history[(_e.__points_history.length-1)]);</p>
<p>            //  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))
                ;</p>
<p>                _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));</p>
<p>            //  total text
            //  ==========
                $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - (1 - _details_second._ratio__length__plain_text_to_total_plain_text)), _points_history);
                $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - (1 - _details_second._ratio__count__plain_words_to_total_plain_words)), _points_history);</p>
<p>            //	text above
            //	==========
                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__length__above_plain_text_to_total_plain_text), _points_history);
                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__above_plain_words_to_total_plain_words), _points_history);</p>
<p>                $D.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__length__above_plain_text_to_total_plain_text), _points_history);
                $D.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__count__above_plain_words_to_total_plain_words), _points_history);</p>
<p>                $D.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__length__above_plain_text_to_plain_text), _points_history);
                $D.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__count__above_plain_words_to_plain_words), _points_history);</p>
<p>            //	links inner
            //	===========
                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__length__links_text_to_all_text), _points_history);
                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__links_words_to_all_words), _points_history);</p>
<p>                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__length__links_text_to_plain_text), _points_history);
                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__links_words_to_plain_words), _points_history);</p>
<p>                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__links_to_plain_words), _points_history);</p>
<p>            //	candidates, containers, pieces
            //	==============================
                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__candidates_to_total_candidates), _points_history);
                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__containers_to_total_containers), _points_history);
                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__pieces_to_total_pieces), _points_history);</p>
<p>            //	return -- will get [0] as the actual final points
            //	======
                return _points_history;
        };</p>
<p>    //  process candidates (third) }</p>
<p>    //  explore node and get stuff {
    //  ============================</p>
<p>        $D.getContent__exploreNodeAndGetStuff = function (_nodeToExplore, _justExploring)
        {
            var	
                _global__element_index = 0,</p>
<p>                _global__inside_link = false,
                _global__inside_link__element_index = 0,</p>
<p>                _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 = '',</p>
<p>                _return__containers = [],
                _return__candidates = [],
                _return__links = []
            ;</p>
<p>            //	recursive function
            //	==================
                var _recursive = function (_node)
                {
                    //	increment index
                    //	starts with 1
                    _global__element_index++;</p>
<p>                    var 
                        _tag_name = (_node.nodeType === 3 ? '#text' : ((_node.nodeType === 1 &#038;&#038; _node.tagName &#038;&#038; _node.tagName > '') ? _node.tagName.toLowerCase() : '#invalid')),
						_node_id = (_node.id),
                        _result =
                        {
                            '__index': _global__element_index, 
                            '__node': _node, </p>
<p>                            '_is__container': 		($D.parseOptions._elements_container.indexOf('|'+_tag_name+'|') > -1),
                            '_is__candidate': 		false,
                            '_is__text': 			false,
                            '_is__link': 			false,
                            '_is__link_skip': 		false,
                            '_is__image_small': 	false,
                            '_is__image_medium': 	false,
                            '_is__image_large': 	false,
                            '_is__image_skip': 		false,
                            '_is__unskippable':     false,</p>
<p>                            '_debug__above__plain_text': _global__above__plain_text,
                            '_debug__above__links_text': _global__above__links_text,</p>
<p>                            '_length__above_plain_text': _global__length__above_plain_text,
                            '_count__above_plain_words': _global__count__above_plain_words,</p>
<p>                            '_length__above_links_text': _global__length__above_links_text,
                            '_count__above_links_words': _global__count__above_links_words,</p>
<p>                            '_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),</p>
<p>                            '_count__above_candidates': _global__count__above_candidates,
                            '_count__above_containers': _global__count__above_containers,</p>
<p>                            '_length__plain_text': 0,
                            '_count__plain_words': 0,</p>
<p>                            '_length__links_text': 0,
                            '_count__links_words': 0,</p>
<p>                            '_length__all_text': 0,
                            '_count__all_words': 0,</p>
<p>                            '_count__containers': 0,
                            '_count__candidates': 0,</p>
<p>                            '_count__links': 0,
                            '_count__links_skip': 0,</p>
<p>                            '_count__images_small': 0,
                            '_count__images_medium': 0,
                            '_count__images_large': 0,
                            '_count__images_skip': 0
                        };</p>
<p>                    //  unskippable
                    //  ===========
                        if (false
                            || (_result._is__container)
                            || ($D.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1)
                        ) {
                            var _unskip = _node.getAttribute($D.parseOptions._unskippable_attribute);
                            if (_unskip == $D.parseOptions._unskippable_attribute_value) { _result._is__unskippable = true; }
                        }</p>
<p>                    //	fast return
                    //	===========
                        switch (true)
                        {
                            case ((_tag_name == '#invalid')):
                            case (($D.parseOptions._elements_ignore.indexOf('|'+_tag_name+'|') > -1)):
                                return false;
							case (($D.parseOptions._elements_ignore_id.indexOf('|'+_node_id+'|') > -1)):								
								return false;								
                            case (($D.parseOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1)):
                                if ($D.isNodeHidden(_node, _tag_name)) { return false; }
                                break;</p>
<p>                            //	self-closing -- with some exceptions
                            case ($D.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1):
                                switch (true)
                                {
                                    case ((_tag_name == 'img')): break;
                                    default: return false;
                                }
                                break;
                        }</p>
<p>                    //	do stuff
                    //	========
                        switch (true)
                        {
                            //	text node
                            case ((_tag_name == '#text')):
                                //	mark
                                _result._is__text = true;</p>
<p>                                //	get
                                var _nodeText = _node.nodeValue;</p>
<p>                                //	result
                                _result._length__plain_text = $D.measureText__getTextLength(_nodeText);
                                _result._count__plain_words = $D.measureText__getWordCount(_nodeText);</p>
<p>                                if (_global__inside_link)
                                {
                                    _global__length__above_links_text += _result._length__plain_text;
                                    _global__count__above_links_words += _result._count__plain_words;					
                                    if (false &#038;&#038; $D.debug) { _global__above__links_text += ' ' + _nodeText; }
                                }
                                else
                                {
                                    _global__length__above_plain_text += _result._length__plain_text;
                                    _global__count__above_plain_words += _result._count__plain_words;					
                                    if (false &#038;&#038; $D.debug) { _global__above__plain_text += ' ' + _nodeText; }
                                }</p>
<p>                                //	return text
                                return _result;</p>
<p>                            //	link
                            case (_tag_name == 'a'):
                                var _href = '';</p>
<p>                                try {
                                    _href = _node.href
                                } catch (e) {
                                    _href = $CJ.attr('href');
                                }</p>
<p>                                //	sanity
                                if (_href > ''); else { break; }
                                if (_href.indexOf); else { break; }</p>
<p>                                _result._is__link = true;</p>
<p>                                //	skip
                                for (var i=0, _i=$D.parseOptions._skip_link_from_domain.length; i<_i; i++)
                                {
                                    if (_href.indexOf($D.parseOptions._skip_link_from_domain[i]) > -1)
                                        { _result._is__link_skip = true; break; }
                                }</p>
<p>                                //	inside link
                                if (_global__inside_link); else
                                {
                                    _global__inside_link = true;
                                    _global__inside_link__element_index = _result.__index;
                                }</p>
<p>                                //	done
                                _return__links.push(_result);
                                break;</p>
<p>                            //	image
                            case (_tag_name == 'img'):</p>
<p>                                //	skip
                                if (_node.src &#038;&#038; _node.src.indexOf)
                                {
                                    for (var i=0, _i=$D.parseOptions._skip_image_from_domain.length; i<_i; i++)
                                    {
                                        if (_node.src.indexOf($D.parseOptions._skip_image_from_domain[i]) > -1)
                                            { _result._is__image_skip = true; break; }
                                    }
                                }</p>
<p>                                //	size
                                var	_width = $CJ(_node).width(), _height = $CJ(_node).height();
                                switch (true)
                                {
                                    case ((_width * _height) >= 50000):
                                    case ((_width >= 350) &#038;&#038; (_height >= 75)):
                                        _result._is__image_large = true;
                                        break;</p>
<p>                                    case ((_width * _height) >= 20000):
                                    case ((_width >= 150) &#038;&#038; (_height >= 150)):
                                        _result._is__image_medium = true;
                                        break;</p>
<p>                                    case ((_width <= 5) &#038;&#038; (_height <= 5)):
                                        _result._is__image_skip = true;
                                        break;</p>
<p>                                    default:
                                        _result._is__image_small = true;
                                        break;
                                }</p>
<p>                                break;
                        }</p>
<p>                    //	child nodes
                    //	===========
                        for (var i=0, _i=_node.childNodes.length; i<_i; i++)
                        {
                            var 
                                _child = _node.childNodes[i],
                                _child_result = _recursive(_child)
                            ;</p>
<p>                            //	if false, continue
                            if (_child_result); else { continue; }</p>
<p>                            //	add to result
                            _result._count__links += 			_child_result._count__links + 			(_child_result._is__link ? 1 : 0);
                            _result._count__links_skip += 		_child_result._count__links_skip + 		(_child_result._is__link_skip ? 1 : 0);</p>
<p>                            _result._count__images_small += 	_child_result._count__images_small + 	(_child_result._is__image_small ? 1 : 0);
                            _result._count__images_medium += 	_child_result._count__images_medium + 	(_child_result._is__image_medium ? 1 : 0);
                            _result._count__images_large += 	_child_result._count__images_large + 	(_child_result._is__image_large ? 1 : 0);
                            _result._count__images_skip += 		_child_result._count__images_skip + 	(_child_result._is__image_skip ? 1 : 0);</p>
<p>                            _result._count__containers += 		_child_result._count__containers + 		(_child_result._is__container ? 1 : 0);
                            _result._count__candidates += 		_child_result._count__candidates + 		(_child_result._is__candidate ? 1 : 0);</p>
<p>                            _result._length__all_text += 		_child_result._length__plain_text + 	_child_result._length__links_text;
                            _result._count__all_words += 		_child_result._count__plain_words + 	_child_result._count__links_words;</p>
<p>                            //	plain text / link text
                            switch (true)
                            {
                                case (_child_result._is__link):
                                    //	no text to add
                                    _result._length__links_text += (_child_result._length__plain_text + _child_result._length__links_text);
                                    _result._count__links_words += (_child_result._count__plain_words + _child_result._count__links_words);
                                    break;</p>
<p>                                default:
                                    _result._length__plain_text += 			_child_result._length__plain_text;
                                    _result._count__plain_words += 			_child_result._count__plain_words;
                                    _result._length__links_text += 			_child_result._length__links_text;
                                    _result._count__links_words += 			_child_result._count__links_words;
                                    break;
                            }
                        }</p>
<p>                    //	after child nodes
                    //	=================</p>
<p>                        //	mark as not in link anymore
                        if (true
                            &#038;&#038; (_result._is__link) 
                            &#038;&#038; (_global__inside_link__element_index == _result.__index)
                        ) {
                            _global__inside_link = false;
                            _global__inside_link__element_index = 0;
                        }</p>
<p>                    //	add to containers
                    //	=================
                        if (_result._is__container || ((_result.__index == 1) &#038;&#038; (_justExploring == true)))
                        {
                            //	add to containers
                            _return__containers.push(_result);</p>
<p>                            //  increase above containers
                            if (_result._is__container) { _global__count__above_containers++; }</p>
<p>                            //	add to candidates
                            if (_justExploring); else
                            {
                                switch (true)
                                {
                                    case (($D.language != 'cjk') &#038;&#038; ((_result._count__links * 2) >= _result._count__plain_words)):  /* link ratio */</p>
<p>                                    case (($D.language != 'cjk') &#038;&#038; (_result._length__plain_text < (65 / 3))):  /* text length */
                                    case (($D.language != 'cjk') &#038;&#038; (_result._count__plain_words < 5)):			/* words */</p>
<p>                                    case (($D.language == 'cjk') &#038;&#038; (_result._length__plain_text < 10)):	    /* text length */
                                    case (($D.language == 'cjk') &#038;&#038; (_result._count__plain_words < 2)):			/* words */</p>
<p>                                    //case (_result._length__plain_text == 0):    /* no text */
                                    //case (_result._count__plain_words == 0):    /* no words */</p>
<p>                                    //case (($D.language == 'cjk') &#038;&#038; ((_result._length__plain_text / 65 / 3) < 0.1)):				/* paragrahs of 3 lines */
                                    //case (($D.language != 'cjk') &#038;&#038; ((_result._count__plain_words / 50) < 0.5)):					/* paragraphs of 50 words */</p>
<p>                                        //	not a valid candidate
                                        //if (_tag_name == 'div') { $D.log('bad candidate', _result.__node); }</p>
<p>                                        break;</p>
<p>                                    default:
                                        //	good candidate
                                        _result._is__candidate = true;
                                        _return__candidates.push(_result);</p>
<p>                                        //  increase above candidates
                                        _global__count__above_candidates++;</p>
<p>                                        break;
                                }</p>
<p>                                //	special case for body -- if it was just skipped
                                //	=====================
                                    if ((_result.__index == 1) &#038;&#038; !(_result._is__candidate))
                                    {
                                        _result._is__candidate = true;
                                        _result._is__bad = true;
                                        _return__candidates.push(_result);
                                    }
                            }
                        }</p>
<p>                    //	return
                    //	======
                        return _result;
                };</p>
<p>            //	actually do it
            //	==============
                _recursive(_nodeToExplore);</p>
<p>            //	just exploring -- return first thing
            //	==============
                if (_justExploring) { return _return__containers.pop(); }</p>
<p>            //	return containers list
            //	======================
                return {
                    '_containers': 	_return__containers,
                    '_candidates': 	_return__candidates,
                    '_links': 		_return__links
                };
        };</p>
<p>    //  explore node and get stuff }</p>
<p>    //  build html for node {
    //  =====================</p>
<p>        $D.getContent__buildHTMLForNode = function (_nodeToBuildHTMLFor, _custom_mode)
        {
            var 
                _global__element_index = 0,
                _global__the_html = '',
                _global__exploreNodeToBuildHTMLFor = $D.getContent__exploreNodeAndGetStuff(_nodeToBuildHTMLFor, true)
            ;</p>
<p>            //	custom
                switch (_custom_mode)
                {
                    case 'above-the-target':
                        _global__exploreNodeToBuildHTMLFor = false;
                        break;
                }</p>
<p>            //	recursive function
            //	==================
                var _recursive = function (_node)
                {
                    //	increment index -- starts with 1
                    //	===============
                        _global__element_index++;</p>
<p>                    //	vars
                    //	====
                        var 
                            _explored = false,
                            _tag_name = (_node.nodeType === 3 ? '#text' : ((_node.nodeType === 1 &#038;&#038; _node.tagName &#038;&#038; _node.tagName > '') ? _node.tagName.toLowerCase() : '#invalid')),
							_node_id = _node.id,
                            _pos__start__before = 0,
                            _pos__start__after = 0,
                            _pos__end__before = 0,
                            _pos__end__after = 0
                        ;</p>
<p>                    //	fast return
                    //	===========
                        switch (true)
                        {
                            case ((_tag_name == '#invalid')):
                            case (($D.parseOptions._elements_ignore.indexOf('|'+_tag_name+'|') > -1)):
                                return;
							case (($D.parseOptions._elements_ignore_id.indexOf('|'+_node_id+'|') > -1)):								
								return;									</p>
<p>                            case (_tag_name == '#text'):
                                _global__the_html += _node.nodeValue
                                    .replace(/</gi, '&lt;')
                                    .replace(/>/gi, '&gt;')
                                ;
                                return;
                        }</p>
<p>                    //	hidden
                    //	======
                        if (true
                            &#038;&#038; ($D.parseOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1)
                            &#038;&#038; $D.isNodeHidden(_node, _tag_name)
                        ) { return; }</p>
<p>                    //	clean -- before
                    //	=====</p>
<p>                        //	objects, embeds, iframes
                        //	========================
                            switch (_tag_name)
                            {
                                case ('object'):
                                case ('embed'):
                                case ('iframe'):
                                    var 
                                        _src = (_tag_name == 'object' ? $CJ(_node).find("param[name='movie']").attr('value') : $CJ(_node).attr('src')),
                                        _skip = ((_src > '') ? false : true)
                                    ;</p>
<p>                                    if (_skip); else
                                    {
                                        //	default skip
                                        _skip = true;</p>
<p>                                        //	loop
                                        for (var i=0, _i=$D.parseOptions._keep_video_from_domain.length; i<_i; i++)
                                            { if (_src.indexOf($D.parseOptions._keep_video_from_domain[i]) > -1) { _skip = false; break; } }
                                    }</p>
<p>                                    //	skip?
                                    if (_skip)
                                    {
                                        _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                                        if (_explored &#038;&#038; _explored._is__unskippable); else
                                        {
                                            $D.debugOutline(_node, 'clean-before', 'object-embed-iframe');
                                            return;
                                        }
                                    }</p>
<p>                                    break;
                            }</p>
<p>                        //	skipped link
                        //	============
                            if (_tag_name == 'a' || _tag_name == 'li')
                            {
                                _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                                if (_explored &#038;&#038; _explored._is__unskippable); else
                                {
                                    switch (true)
                                    {
                                        case (_explored._is__link_skip):
                                        case (((_explored._count__images_small + _explored._count__images_skip) > 0) &#038;&#038; (_explored._length__plain_text < 65)):
                                            $D.debugOutline(_node, 'clean-before', 'skip-link');
                                            return;
                                    }
                                }
                            }</p>
<p>                        //	link density
                        //	============
                            if ($D.parseOptions._elements_link_density.indexOf('|'+_tag_name+'|') > -1)
                            {
                                _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                                if (_explored &#038;&#038; _explored._is__unskippable); else
                                {
                                    switch (true)
                                    {
                                        case (_explored._length__plain_text > (65 * 3 * 2)):
                                        case ($D.language == 'cjk' &#038;&#038; (_explored._length__plain_text > (65 * 3 * 1))):
                                        case (!(_explored._count__links > 1)):
                                        case (_global__exploreNodeToBuildHTMLFor &#038;&#038; (_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.5):
                                        case (_global__exploreNodeToBuildHTMLFor &#038;&#038; (_explored._count__plain_words / _global__exploreNodeToBuildHTMLFor._count__plain_words) > 0.5):
                                        case ((_explored._length__plain_text == 0) &#038;&#038; (_explored._count__links == 1) &#038;&#038; (_explored._length__links_text < 65)):
                                        case ((_explored._length__plain_text < 25) &#038;&#038; ((_explored._count__images_large + _explored._count__images_medium) > 0)):
                                            break;</p>
<p>                                        case ((_explored._length__links_text / _explored._length__all_text) < 0.5):
                                            if (_explored._count__links > 0); else { break; }
                                            if (_explored._count__links_skip > 0); else { break; }
                                            if (((_explored._count__links_skip / _explored._count__links) > 0.25) &#038;&#038; (_explored._length__links_text / _explored._length__all_text) < 0.05) { break; }</p>
<p>                                        default:
                                            $D.debugOutline(_node, 'clean-before', 'link-density');
                                            return;
                                    }
                                }
                            }	</p>
<p>                        //	floating
                        //	========
                            if ($D.parseOptions._elements_floating.indexOf('|'+_tag_name+'|') > -1)
                            {
                                _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                                if (_explored &#038;&#038; _explored._is__unskippable); else
                                {
                                    switch (true)
                                    {
                                        case (_explored._length__plain_text > (65 * 3 * 2)):
                                        case ($D.language == 'cjk' &#038;&#038; (_explored._length__plain_text > (65 * 3 * 1))):
                                        case (_global__exploreNodeToBuildHTMLFor &#038;&#038; (_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.25):
                                        case (_global__exploreNodeToBuildHTMLFor &#038;&#038; (_explored._count__plain_words / _global__exploreNodeToBuildHTMLFor._count__plain_words) > 0.25):
                                        case ((_explored._length__plain_text < 25) &#038;&#038; (_explored._length__links_text < 25) &#038;&#038; ((_explored._count__images_large + _explored._count__images_medium) > 0)):
                                        case (_node.getElementsByTagName &#038;&#038; (_explored._length__plain_text < (65 * 3 * 1)) &#038;&#038; ((_node.getElementsByTagName('h1').length + _node.getElementsByTagName('h2').length + _node.getElementsByTagName('h3').length + _node.getElementsByTagName('h4').length) > 0)):
                                            break;</p>
<p>                                        default:
                                            var _float = $CJ(_node).css('float');
                                            if (_float == 'left' || _float == 'right'); else { break; }
                                            if ((_explored._length__links_text == 0) &#038;&#038; ((_explored._count__images_large + _explored._count__images_medium) > 0)) { break; }</p>
<p>                                            $D.debugOutline(_node, 'clean-before', 'floating');
                                            return;
                                    }
                                }
                            }</p>
<p>                        //	above target
                        //	============
                            if (_custom_mode == 'above-the-target')
                            {
                                //  is ignored?
                                if ($D.parseOptions._elements_above_target_ignore.indexOf('|'+_tag_name+'|') > -1)
                                {
                                    _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                                    if (_explored &#038;&#038; _explored._is__unskippable); else
                                    {
                                        $D.debugOutline(_node, 'clean-before', 'above-target');
                                        return;
                                    }
                                }</p>
<p>                                //  is image?
                                if (_tag_name == 'img')
                                {
                                    _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                                    if (_explored &#038;&#038; _explored._is__unskippable); else
                                    {
                                        if (_explored._is__image_large); else
                                        {
                                            $D.debugOutline(_node, 'clean-before', 'above-target');
                                            return;
                                        }
                                    }
                                }</p>
<p>                                //  has too many links?
                                //if (_node.getElementsByTagName &#038;&#038; _node.getElementsByTagName('a').length > 5)
                                //    { $D.debugOutline(_node, 'clean-before', 'above-target'); return; }
                            }</p>
<p>                        //  headers that are images
                        //  =======================
                            if (_tag_name.match(/^h(1|2|3|4|5|6)$/gi))
                            {
                                _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                                if (_explored &#038;&#038; _explored._is__unskippable); else
                                {
                                    switch (true)
                                    {
                                        case ((_explored._length__plain_text < 10) &#038;&#038; ((_explored._count__images_small + _explored._count__images_medium + _explored._count__images_large + _explored._count__images_skip) > 0)):
                                            $D.debugOutline(_node, 'clean-before', 'skip-heading');
                                            return;
                                    }
                                }
                            }</p>
<p>                    //	start tag
                    //	=========
                        if ($D.parseOptions._elements_ignore_tag.indexOf('|'+_tag_name+'|') > -1); else
                        {
                            /* mark */	_pos__start__before = _global__the_html.length;
                            /* add */	_global__the_html += '<'+_tag_name;</p>
<p>                            //	attributes
                            //	==========</p>
<p>                                //	allowed attributes
                                if (_tag_name in $D.parseOptions._elements_keep_attributes)
                                {
                                    for (var i=0, _i=$D.parseOptions._elements_keep_attributes[_tag_name].length; i<_i; i++)
                                    {
                                        var 
                                            _attribute_name = $D.parseOptions._elements_keep_attributes[_tag_name][i],
                                            _attribute_value = _node.getAttribute(_attribute_name)
                                        ;</p>
<p>                                        //	if present
                                        if (_attribute_value > '')
                                            { _global__the_html += ' '+_attribute_name+'="'+(_attribute_value)+'"'; }
                                    }
                                }</p>
<p>                                //	keep ID for all elements
                                var _id_attribute = _node.getAttribute('id');
                                if (_id_attribute > '')
                                    { _global__the_html += ' id="'+_id_attribute+'"'; }</p>
<p>                                //	links target NEW
                                if (_tag_name == 'a')
                                    { _global__the_html += ' target="_blank"'; }</p>
<p>                            //	close start
                            //	===========
                                if ($D.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1) { _global__the_html += ' />'; }
                                else { _global__the_html += '>';}</p>
<p>                            /* mark */ _pos__start__after = _global__the_html.length;
                        }</p>
<p>                    //	child nodes
                    //	===========
                        if ($D.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1); else
                        {
                            for (var i=0, _i=_node.childNodes.length; i<_i; i++)
                                { _recursive(_node.childNodes[i]); }
                        }</p>
<p>                    //	end tag
                    //	=======
                        switch (true)
                        {
                            case (($D.parseOptions._elements_ignore_tag.indexOf('|'+_tag_name+'|') > -1)):
                                return;</p>
<p>                            case (($D.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1)):
                                /* mark */ 	_pos__end__before = _global__the_html.length;
                                /* mark */ 	_pos__end__after = _global__the_html.length;
                                break;</p>
<p>                            default:
                                /* mark */ 	_pos__end__before = _global__the_html.length;
                                /* end */ 	_global__the_html += '</'+_tag_name+'>';
                                /* mark */ 	_pos__end__after = _global__the_html.length;
                                break;
                        }</p>
<p>                    //	clean -- after
                    //	=====</p>
<p>                        //	largeObject classes
                        if (_tag_name == 'iframe' || _tag_name == 'embed' || _tag_name == 'object')
                        {
                            _global__the_html = ''
                                + _global__the_html.substr(0, _pos__start__before)
                                + '</p>
<div class="readableLargeObjectContainer">'
                                + 	_global__the_html.substr(_pos__start__before, (_pos__end__after - _pos__start__before))
                                + '</div>
<p>'
                            ;
                            return;
                        }</p>
<p>                        //	add image classes
                        if (_tag_name == 'img')
                        {
                            _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                            if (_explored &#038;&#038; _explored._is__unskippable); else
                            {
                                switch (true)
                                {
                                    case (_explored._is__image_skip):
                                        $D.debugOutline(_node, 'clean-after', 'skip-img');
                                        _global__the_html = _global__the_html.substr(0, _pos__start__before);
                                        return;</p>
<p>                                    case (_explored._is__image_large):</p>
<p>                                        //  add float class -- for images too narrow/tall
                                        //  remove width/height -- only for large images</p>
<p>                                        //  http://www.wired.com/threatlevel/2011/05/gps-gallery/?pid=89&#038;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/</p>
<p>                                        _global__the_html = ''
                                            + _global__the_html.substr(0, _pos__start__before)
                                            + '</p>
<div class="readableLargeImageContainer'
                                            + 	(($CJ(_node).width() <= 250) &#038;&#038; ($CJ(_node).height() >= 250) ? ' float' : '')
                                            + '">'
                                            + 	_global__the_html.substr(_pos__start__before, (_pos__end__after - _pos__start__before)).replace(/width="([^=]+?)"/gi, '').replace(/height="([^=]+?)"/gi, '')
                                            + '</div>
<p>'
                                        ;
                                        return;
                                }
                            }
                        }</p>
<p>                        //	large images in links
                        if (_tag_name == 'a')
                        {
                            _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                            switch (true)
                            {
                                case (_explored._count__images_large == 1):
                                    _global__the_html = ''
                                        + _global__the_html.substr(0, _pos__start__after-1)
                                        + ' class="readableLinkWithLargeImage">'
                                        + 	_global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after))
                                        + '</a>'
                                    ;
                                    return;</p>
<p>                                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))
                                        + '</a>'
                                    ;
                                    return;
                            }		
                        }</p>
<p>                        //	too much content
                        if ($D.parseOptions._elements_too_much_content.indexOf('|'+_tag_name+'|') > -1)
                        {
                            _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                            if (_explored &#038;&#038; _explored._is__unskippable); else
                            {
                                switch (true)
                                {
                                    case (_tag_name == 'h1' &#038;&#038; (_explored._length__all_text > (65 * 2))):
                                    case (_tag_name == 'h2' &#038;&#038; (_explored._length__all_text > (65 * 2 * 3))):
                                    case ((_tag_name.match(/^h(3|4|5|6)$/) != null) &#038;&#038; (_explored._length__all_text > (65 * 2 * 5))):
                                    case ((_tag_name.match(/^(b|i|em|strong)$/) != null) &#038;&#038; (_explored._length__all_text > (65 * 5 * 5))):
                                        $D.debugOutline(_node, 'clean-after', 'too-much-content');
                                        _global__the_html = ''
                                            + _global__the_html.substr(0, _pos__start__before)
                                            + _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after))
                                        ;
                                        return;
                                }
                            }
                        }		</p>
<p>                        //	empty elements
                        switch (true)
                        {
                            case (($D.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1)):
                            case (($D.parseOptions._elements_ignore_tag.indexOf('|'+_tag_name+'|') > -1)):
                            case (_tag_name == 'td'):
                                break;</p>
<p>                            default:
                                var _contents = _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after));
                                    _contents = _contents.replace(/(<br \/>)/gi, '');
                                    _contents = _contents.replace(/(</p>
<hr \/>
<p>)/gi, '');</p>
<p>                                //  for rows, clear empty cells
                                if (_tag_name == 'tr')
                                {
                                    _contents = _contents.replace(/
<td[^>]*?>/gi, '');
                                    _contents = _contents.replace(/<\/td>/gi, '');
                                }</p>
<p>                                //  for tables, clear empty rows
                                if (_tag_name == 'table')
                                {
                                    _contents = _contents.replace(/
<tr[^>]*?>/gi, '');
                                    _contents = _contents.replace(/<\/tr>/gi, '');
                                }</p>
<p>                                var _contentsLength = $D.measureText__getTextLength(_contents);</p>
<p>                                _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                                if (_explored &#038;&#038; _explored._is__unskippable); else
                                {
                                    switch (true)
                                    {
                                        case (_contentsLength == 0 &#038;&#038; _tag_name == 'p'):
                                            _global__the_html = _global__the_html.substr(0, _pos__start__before) + '</p>
<p>';
                                            return;</p>
<p>                                        case (_contentsLength == 0):
                                        case ((_contentsLength < 5) &#038;&#038; ($D.parseOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1)):
                                            $D.debugOutline(_node, 'clean-after', 'blank');
                                            _global__the_html = _global__the_html.substr(0, _pos__start__before);
                                            return;
                                    }
                                }</p>
<p>                                break;
                        }</p>
<p>                        //	too much missing
                        if ($D.parseOptions._elements_link_density.indexOf('|'+_tag_name+'|') > -1)
                        {
                            _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                            if (_explored &#038;&#038; _explored._is__unskippable); else
                            {
                                var
                                    _contents = _global__the_html
                                                .substr(_pos__start__after, (_pos__end__before - _pos__start__after))
                                                    .replace(/(<([^>]+)>)/gi, ''),
                                    _contentsLength = $D.measureText__getTextLength(_contents),
                                    _initialLength = 0
                                        + _explored._length__all_text 
                                        + (_explored._count__images_small 					* 10)
                                        + (_explored._count__images_skip 					* 10)
                                        + (_node.getElementsByTagName('iframe').length 		* 10)
                                        + (_node.getElementsByTagName('object').length 		* 10)
                                        + (_node.getElementsByTagName('embed').length 		* 10)
                                        + (_node.getElementsByTagName('button').length 		* 10)
                                        + (_node.getElementsByTagName('input').length 		* 10)
                                        + (_node.getElementsByTagName('select').length 		* 10)
                                        + (_node.getElementsByTagName('textarea').length 	* 10)
                                ;</p>
<p>                                //	too much missing
                                switch (true)
                                {
                                    case (!(_contentsLength > 0)):
                                    case (!(_initialLength > 0)):
                                    case (!((_contentsLength / _initialLength) < 0.5)):
                                    case (!(($D.language == 'cjk') &#038;&#038; (_contentsLength / _initialLength) < 0.1)):
                                    case ((_global__exploreNodeToBuildHTMLFor &#038;&#038; ((_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.25))):
                                    case (($D.language == 'cjk') &#038;&#038; (_global__exploreNodeToBuildHTMLFor &#038;&#038; ((_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.1))):
                                        break;</p>
<p>                                    default:
                                        $D.debugOutline(_node, 'clean-after', 'missing-density');
                                        _global__the_html = _global__the_html.substr(0, _pos__start__before);
                                        return;
                                }
                            }
                        }                </p>
<p>                    //	return
                        return;
                };</p>
<p>            //	actually do it
            _recursive(_nodeToBuildHTMLFor);</p>
<p>            //	return html
            return _global__the_html;
        };</p>
<p>    //  build html for node }</p>
<p>    //  isolate title in html {
    //  =======================</p>
<p>        $D.articleTitleMarker__start = '</p>
<div id="articleHeader">
<h1>';
        $D.articleTitleMarker__end = '</h1>
</div>
<p>';</p>
<p>        $D.getContent__find__hasIsolatedTitleInHTML = function (_html)
        {
            return (_html.substr(0, $D.articleTitleMarker__start.length) == $D.articleTitleMarker__start);
        };</p>
<p>        $D.getContent__find__getIsolatedTitleInHTML = function (_html)
        {
            //  is it there?
            if ($D.getContent__find__hasIsolatedTitleInHTML(_html)); else { return ''; }</p>
<p>            //  regex
            var 
                _getTitleRegex = new RegExp($D.articleTitleMarker__start + '(.*?)' + $D.articleTitleMarker__end, 'i'),
                _getTitleMatch = _html.match(_getTitleRegex)
            ;</p>
<p>            //  match?
            if (_getTitleMatch); else { return ''; }</p>
<p>            //  return
            return _getTitleMatch[1];
        };</p>
<p>        $D.getContent__find__isolateTitleInHTML = function (_html, _document_title)
        {
            //  use document title
            if ($D.$document.find('body').attr($D.parseOptions._use_document_title_attribute) == $D.parseOptions._use_document_title_attribute_value)
                { return _html; }</p>
<p>            //  can't just use (h1|h2|h3|etc)
            //      we want to try them in a certain order</p>
<p>            var
                _heading_pregs = [
                    /<(h1)[^>]*?>([\s\S]+?)<\/\1>/gi,
                    /<(h2)[^>]*?>([\s\S]+?)<\/\1>/gi,
                    /<(h3|h4|h5|h6)[^>]*?>([\s\S]+?)<\/\1>/gi
                ],
                _secondary_headings = '|h2|h3|h4|h5|h6|',
                _search_document_title = ' ' + _document_title.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ') + ' '
            ;</p>
<p>            //  loop pregs
            for (var i=0, _i=_heading_pregs.length; i<_i; i++)
            {
                //  exec
                var _match = _heading_pregs[i].exec(_html);</p>
<p>                //  return?
                switch (true)
                {
                    case (!(_match)):
                    case (!(_heading_pregs[i].lastIndex > -1)):
                        //  will continue loop
                        break;</p>
<p>                    default:</p>
<p>                        //  measurements
                        var
                            _heading_end_pos = _heading_pregs[i].lastIndex,
                            _heading_start_pos = (_heading_end_pos - _match[0].length),</p>
<p>                            _heading_type = _match[1],
                            _heading_text = _match[2].replace(/<\s*br[^>]*>/gi, '').replace(/[\n\r]+/gi, ''),
                            _heading_text_plain = _heading_text.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ');
                            _heading_length = $D.measureText__getTextLength(_heading_text_plain),
                            _heading_words = [],</p>
<p>                            _to_heading_text = _html.substr(0, _heading_start_pos),
                            _to_heading_length = $D.measureText__getTextLength(_to_heading_text.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' '))
                        ;</p>
<p>                        //  return?
                        switch (true)
                        {
                            case (!(_heading_length > 5)):
                            case (!(_heading_length < (65 * 3))):
                            case (!(_to_heading_length < (65 * 3 * 2))):
                                //  will continue for loop
                                break;</p>
<p>                            case ((_secondary_headings.indexOf('|' + _heading_type + '|') > -1)):
                                //  words in this heading
                                _heading_words = _heading_text_plain.split(' ');</p>
<p>                                //  count words present in title
                                for (var j=0, _j=_heading_words.length, _matched_words=''; j<_j; j++) {
                                    if (_search_document_title.indexOf(' ' + _heading_words[j] + ' ') > -1) {
                                        _matched_words += _heading_words[j] + ' ';
                                    }
                                }</p>
<p>                                //  break continues for loop
                                //      nothing goes to switch's default</p>
<p>                                //  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) &#038;&#038; (_search_document_title.indexOf(_heading_text_plain) > -1)):</p>
<p>                                        //  if it's slightly smaler, but is exactly at the begging or the end
                                        case ((_heading_length > 10) &#038;&#038; ((_search_document_title.indexOf(_heading_text_plain) == 1) || (_search_document_title.indexOf(_heading_text_plain) == (_search_document_title.length - 1 - _heading_text_plain.length)))):</p>
<p>                                            _no_break = true;
                                            break;
                                    }</p>
<p>                                    //  break?
                                    //  ======
                                        var _break = false;
                                        switch (true)
                                        {
                                            //  no break?
                                            case (_no_break):
                                                break;</p>
<p>                                            // heading too long? -- if not h2
                                            case ((_heading_length > ((_search_document_title.length - 2) * 2)) &#038;&#038; (_heading_type != 'h2')):</p>
<p>                                            //  heading long enough?
                                            case ((_heading_length < Math.ceil((_search_document_title.length - 2) * 0.50))):</p>
<p>                                            //  enough words matched?
                                            case ((_heading_length < 25) &#038;&#038; (_matched_words.length < Math.ceil(_heading_length * 0.75))):
                                            case ((_heading_length < 50) &#038;&#038; (_matched_words.length < Math.ceil(_heading_length * 0.65))):
                                            case ((_matched_words.length < Math.ceil(_heading_length * 0.55))):</p>
<p>                                                _break = true;
                                                break;
                                        }</p>
<p>                                    //  break?
                                    //  ======
                                        if (_break) { break; }</p>
<p>                            default:
                                //  this is the title -- do isolation; return
                                return ''
                                    + $D.articleTitleMarker__start
                                    +   _heading_text 
                                    + $D.articleTitleMarker__end
                                    + $D.getContent__find__isolateTitleInHTML__balanceDivsAtStart(_html.substr(_heading_end_pos))
                                ;
                        }</p>
<p>                        break;
                }
            }</p>
<p>            //  return unmodified
            return _html;
        };</p>
<p>        $D.getContent__find__isolateTitleInHTML__balanceDivsAtStart__substrCount = function (_haystack, _needle, _offset, _length)
        {
            // http://kevin.vanzonneveld.net
            // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
            // +   bugfixed by: Onno Marsman
            // +   improved by: Brett Zamir (http://brett-zamir.me)
            // +   improved by: Thomas
            // *     example 1: substr_count('Kevin van Zonneveld', 'e');
            // *     returns 1: 3
            // *     example 2: substr_count('Kevin van Zonneveld', 'K', 1);
            // *     returns 2: 0
            // *     example 3: substr_count('Kevin van Zonneveld', 'Z', 0, 10);
            // *     returns 3: false</p>
<p>            var cnt = 0;</p>
<p>            _haystack += '';
            _needle += '';
            if (isNaN(_offset)) { _offset = 0; }
            if (isNaN(_length)) { _length = 0; }
            if (_needle.length == 0) { return false; }</p>
<p>            _offset--;</p>
<p>            while ((_offset = _haystack.indexOf(_needle, _offset + 1)) != -1) {
                if (_length > 0 &#038;&#038; (_offset + _needle.length) > _length) {
                    return false;
                }
                cnt++;
            }</p>
<p>            return cnt;
        };</p>
<p>        $D.getContent__find__isolateTitleInHTML__balanceDivsAtStart = function (_html)
        {
            //  easy; remove all </X> at begining
            var 
                _h = _html.replace(/^(\s*<\s*\/\s*[^>]+>)+/gi, ''),
                _r = /<\s*\/\s*([^\s>]+?)[^>]*>/gi,
                _the_end_tag = '</div>
<p>',
                _the_start_tag = '</p>
<div',
                _end_tag_pos = -1,
                _last_pos = 0
            ;</p>
<p>            //  remove all unbalanced _end_tags
            for (var _i=0; _i<100; _i++)
            {
                _end_tag_pos = _h.indexOf(_the_end_tag, _last_pos);
                if (_end_tag_pos > -1); else { break; }</p>
<p>                var 
                    _sub = _h.substr(0, _end_tag_pos),
                    _start_tags = $D.getContent__find__isolateTitleInHTML__balanceDivsAtStart__substrCount(_sub, _the_start_tag, _last_pos),
                    _end_tags = ((_start_tags > 0) ? (1 + $D.getContent__find__isolateTitleInHTML__balanceDivsAtStart__substrCount(_sub, _the_end_tag, _last_pos)) : false)
                ;</p>
<p>                if ((!(_start_tags > 0)) || (_start_tags < _end_tags))
                {
                    _h = ''
                        + _h.substr(0, _end_tag_pos)
                        + _h.substr(_end_tag_pos + _the_end_tag.length)
                    ;</p>
<p>                    _last_pos = _end_tag_pos;
                }
                else
                {
                    _last_pos = _end_tag_pos + 1;
                }
            }</p>
<p>            $D.log(_h);</p>
<p>            return _h;
        };</p>
<p>    //  isolate title in html }</p>
<p>    //  find in page {
    //  ==============</p>
<p>        $D.getContent__findInPage = function (_pageWindow)
        {
            //	calculations
            //	============</p>
<p>                var
                    _firstCandidate = false,
                    _secondCandidate = false,
                    _targetCandidate = false
                ;</p>
<p>                $D.debugTimerStart('ExploreAndGetStuff');
                    var	_stuff = $D.getContent__exploreNodeAndGetStuff(_pageWindow.document.body);
                $D.debugRemember('ExploreAndGetStuff', $D.debugTimerEnd()+'ms');</p>
<p>                $D.debugTimerStart('ProcessFirst');
                    var _processedCandidates = $D.getContent__processCandidates__first(_stuff._candidates);
                    _firstCandidate = _processedCandidates[0];
                    _targetCandidate = _firstCandidate;
                $D.debugRemember('ProcessFirst', $D.debugTimerEnd()+'ms');</p>
<p>                //  debug
                if ($D.debug)
                {
                    //  debug first candidates
                    $D.log('First 5 Main Candidates:');
                    for (var x in _processedCandidates)
                    {
                        if (x == 5) { break; }
                        $D.log(_processedCandidates[x], _processedCandidates[x].__node);
                    }</p>
<p>                    //  highlight first
                    $D.debugOutline(_firstCandidate.__node, 'target', 'first');
                }</p>
<p>                //  in case we stop
                $D.debugRemember('Target', 'first');</p>
<p>                //  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;</p>
<p>                    default:</p>
<p>                        $D.debugTimerStart('ProcessSecond');
                            var _processedCandidatesSecond = $D.getContent__processCandidates__second(_processedCandidates);
                            _secondCandidate = _processedCandidatesSecond[0];
                        $D.debugRemember('ProcessSecond', $D.debugTimerEnd()+'ms');</p>
<p>                        //  they're the same
                        if (_firstCandidate.__node == _secondCandidate.__node) { break; }</p>
<p>                        //  debug
                        if ($D.debug)
                        {
                            //  log second candidates
                            $D.log('First 5 Second Candidates:');
                            for (var x in _processedCandidatesSecond)
                            {
                                if (x == 5) { break; }
                                $D.log(_processedCandidatesSecond[x], _processedCandidatesSecond[x].__node);
                            }</p>
<p>                            //  highlight second
                            $D.debugOutline(_secondCandidate.__node, 'target', 'second');
                        }</p>
<p>                        //  compute again
                        //  =============
                            _firstCandidate['__points_history_final'] = $D.getContent__computePointsForCandidate__third(_firstCandidate, _firstCandidate);
                            _firstCandidate['__points_final'] = _firstCandidate.__points_history_final[0];</p>
<p>                            _secondCandidate['__points_history_final'] = $D.getContent__computePointsForCandidate__third(_secondCandidate, _firstCandidate);
                            _secondCandidate['__points_final'] = _secondCandidate.__points_history_final[0];</p>
<p>                        //  log results
                        //  ===========
                            if ($D.debug)
                            {
                                $D.log('The 2 Candidates:');
                                $D.log(_firstCandidate);
                                $D.log(_secondCandidate);
                            }</p>
<p>                        //  are we selecting _second?
                        //  =========================
                            switch (true)
                            {
                                case ((_secondCandidate.__candidate_details._count__lines_of_65_characters < 20) &#038;&#038; (_secondCandidate.__points_final / _firstCandidate.__points_final) > 1):
                                case ((_secondCandidate.__candidate_details._count__lines_of_65_characters > 20) &#038;&#038; (_secondCandidate.__points_final / _firstCandidate.__points_final) > 0.9):
                                case ((_secondCandidate.__candidate_details._count__lines_of_65_characters > 50) &#038;&#038; (_secondCandidate.__points_final / _firstCandidate.__points_final) > 0.75):
                                    _targetCandidate = _secondCandidate;
                                    $D.debugRemember('Target', 'second');
                                    break;
                            }</p>
<p>                        //  print points
                        //  ============
                            if ($D.debug)
                            {
                                $D.debugRemember('PointsFirst', _firstCandidate['__points_history_final'][0].toFixed(2));
                                $D.debugRemember('PointsSecond', _secondCandidate['__points_history_final'][0].toFixed(2));
                            }</p>
<p>                        break;
                }</p>
<p>                //  highlight target
                //  ================
                    if ($D.debug)
                    {
                        $CJ(_targetCandidate.__node).css({
                            'box-shadow': 
                                'inset 0px 0px 50px rgba(255, 255, 0, 0.95), 0px 0px 50px rgba(255, 255, 0, 0.95)'
                        });
                    }</p>
<p>            //	get html
            //	========
                $D.debugTimerStart('BuildHTML');
                    var _html = $D.getContent__buildHTMLForNode(_targetCandidate.__node, 'the-target');
                        _html = _html.substr((_html.indexOf('>')+1))
                        _html = _html.substr(0, _html.lastIndexOf('<'));
                $D.debugRemember('BuildHTML', $D.debugTimerEnd()+'ms');</p>
<p>                $D.debugTimerStart('BuildHTMLPregs');
                    _html = _html.replace(/<(blockquote|div|p|td|li)([^>]*)>(\s*<br \/>)+/gi, '<$1$2>');
                    _html = _html.replace(/(<br \/>\s*)+<\/(blockquote|div|p|td|li)>/gi, '</$2>');
                    _html = _html.replace(/(<br \/>\s*)+<(blockquote|div|h\d|ol|p|table|ul|li)([^>]*)>/gi, '<$2$3>');
                    _html = _html.replace(/<\/(blockquote|div|h\d|ol|p|table|ul|li)>(\s*<br \/>)+/gi, '</$1>');
                    _html = _html.replace(/(</p>
<hr \/>
<p>\s*</p>
<hr \/>
<p>\s*)+/gi, '</p>
<hr />
<p>');
                    _html = _html.replace(/(<br \/>\s*<br \/>\s*)+/gi, '</p>
<p>');
                $D.debugRemember('BuildHTMLPregs', $D.debugTimerEnd()+'ms');</p>
<p>            //	return
            //	======
                return {
                    '_html': _html,
                    '_links': _stuff._links,
                    '_targetCandidate': _targetCandidate,
                    '_firstCandidate': _firstCandidate
                };
        };</p>
<p>    //  find in page }</p>
<p>    //  start {
    //  =======</p>
<p>        $D.start = function ()
        {
            //	get content
            //	===========
                var 
                    _found = $D.getContent__findInPage($D.window),
                    _found_links = _found._links,
                    _targetNode = _found._targetCandidate.__node,
                    _$targetNode = $CJ(_targetNode),
                    _aboveNodes = []
                ;</p>
<p>            //	RTL
            //	===
                switch (true)
                {
                    case (_$targetNode.attr('dir') == 'rtl'):
                    case (_$targetNode.css('direction') == 'rtl'):
                        $D.makeRTL();
                        break;
                }</p>
<p>            //  get html
            //  ========
                var 
                    _foundHTML = _found._html,
                    _firstFragmentBeforeProcessing = $D.nextPage__getFirstFragment(_foundHTML),
                    _documentTitle = ($D.document.title > '' ? $D.document.title : '')
                ;</p>
<p>            //  get title
            //  =========</p>
<p>                //  has title already?
                _foundHTML = $D.getContent__find__isolateTitleInHTML(_foundHTML, _documentTitle);
                $D.articleTitle = $D.getContent__find__getIsolatedTitleInHTML(_foundHTML);
                $D.debugRemember('TitleSource', 'target');</p>
<p>                //  get html above?
                if ($D.articleTitle > ''); else
                {
                    //  get html above target?
                    //  ======================</p>
<p>                        //  global vars:
                        //      _found
                        //      _foundHTML
                        //      _documentTitle
                        //      _aboveNodes</p>
<p>                        var 
                            _prevNode = _found._targetCandidate.__node,
                            _prevHTML = '',
                            _aboveHTML = '',
                            _differentTargets = (_found._firstCandidate.__node != _found._targetCandidate.__node)
                        ;</p>
<p>                        (function () 
                        {</p>
<p>                            while (true)
                            {
                                //  the end?
                                switch (true)
                                {
                                    case (_prevNode.tagName &#038;&#038; (_prevNode.tagName.toLowerCase() == 'body')):
                                    case (_differentTargets &#038;&#038; (_prevNode == _found._firstCandidate.__node)):
                                        //  enough is enough
                                        return;
                                }</p>
<p>                                //  up or sideways?
                                if (_prevNode.previousSibling); else
                                {
                                    _prevNode = _prevNode.parentNode;
                                    continue;
                                }</p>
<p>                                //	previous
                                _prevNode = _prevNode.previousSibling;</p>
<p>                                //	outline -- element might be re-outlined, when buildHTML is invoked
                                if ($D.debug) { $D.debugOutline(_prevNode, 'target', 'add-above'); }</p>
<p>                                //	get html; add
                                _prevHTML = $D.getContent__buildHTMLForNode(_prevNode, 'above-the-target');
                                _aboveHTML = _prevHTML + _aboveHTML;
                                _aboveNodes.unshift(_prevNode);</p>
<p>                                //  isolate title
                                _aboveHTML = $D.getContent__find__isolateTitleInHTML(_aboveHTML, _documentTitle);</p>
<p>                                //	finished?
                                switch (true)
                                {
                                    case ($D.measureText__getTextLength(_aboveHTML.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ')) > (65 * 3 * 3)):
                                    case ($D.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
                                        return;
                                }
                            }</p>
<p>                        })();</p>
<p>                    //  is what we found any good?
                    //  ==========================
                        switch (true)
                        {
                            case ($D.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
                            case (_differentTargets &#038;&#038; (_aboveHTML.split('<a ').length < 3) &#038;&#038; ($D.measureText__getTextLength(_aboveHTML.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ')) < (65 * 3))):
                                _foundHTML = _aboveHTML + _foundHTML;
                                break;</p>
<p>                            default:
                                _aboveHTML = '';
                                _aboveNodes = [];
                                break;
                        }</p>
<p>                    //  set title
                    //  =========</p>
<p>                        $D.articleTitle = $D.getContent__find__getIsolatedTitleInHTML(_foundHTML);
                        $D.debugRemember('TitleSource', 'above_HTML');</p>
<p>                        //  get document title?
                        if ($D.articleTitle > ''); else
                        {
                            //  if all else failed, get document title
                            //  ======================================</p>
<p>                                //  global vars:
                                //      _foundHTML
                                //      _documentTitle</p>
<p>                                (function ()
                                {
                                    //  return?
                                    //  =======
                                        if (_documentTitle > ''); else { return; }</p>
<p>                                    //  vars
                                        var
                                            _doc_title_parts = [],
                                            _doc_title_pregs =
                                            [
                                                /( [-][-] |( [-] )|( [>][>] )|( [<][<] )|( [|] )|( [\/] ))/i,
                                                /(([:] ))/i
                                            ]
                                        ;</p>
<p>                                    //	loop through pregs
                                    //  ==================
                                        for (var i=0, _i=_doc_title_pregs.length; i<_i; i++)
                                        {
                                            //	split
                                            _doc_title_parts = _documentTitle.split(_doc_title_pregs[i]);</p>
<p>                                            //	break if we managed a split
                                            if (_doc_title_parts.length > 1) { break; }
                                        }</p>
<p>                                    //	sort title parts -- longer goes higher up -- i.e. towards 0
                                    //	================
                                        _doc_title_parts.sort(function (a, b)
                                        {
                                            switch (true)
                                            {
                                                case (a.length > b.length): return -1;
                                                case (a.length < b.length): return 1;
                                                default: return 0;
                                            }
                                        });</p>
<p>                                    //	set title -- first part, if more than one word; otherwise, whole
                                    //  =========
                                        _foundHTML = ''
                                            + $D.articleTitleMarker__start
                                            +   (_doc_title_parts[0].split(/\s+/i).length > 1 ? _doc_title_parts[0] : _documentTitle) 
                                            + $D.articleTitleMarker__end 
                                            + _foundHTML
                                        ;</p>
<p>                                })();</p>
<p>                            //  set title
                            //  =========</p>
<p>                                $D.articleTitle = $D.getContent__find__getIsolatedTitleInHTML(_foundHTML);
                                $D.debugRemember('TitleSource', 'document_title');
                        }
                }</p>
<p>            //	remember
            //	========
                $D.debugRemember('theTarget', _found._targetCandidate.__node);
                $D.debugRemember('firstCandidate', _found._firstCandidate.__node);</p>
<p>            //	result
            //  ======</p>
<p>                $D.nextPage__firstFragment__firstPage = _firstFragmentBeforeProcessing;
                $D.nextPage__firstFragment__lastPage = $D.nextPage__getFirstFragment(_foundHTML);
                $D.nextPage__firstLinks = _found_links;</p>
<p>                var
                    _result = {
                        '_html': _foundHTML,
                        '_title': $D.articleTitle,
                        '_rtl': $D.rtl
                    }
                ;</p>
<p>                //  add elements
                _result['_elements'] = _aboveNodes;
                _result['_elements'].push(_found._targetCandidate.__node);</p>
<p>            //  return
            //  ======
                $D.callbacks.finished(_result);
        };</p>
<p>    //  start }    </p>
<p>    //  return self
    //  ===========
        return $D;
}
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/*!
 *  ClearlyComponent__highlight
 *  Evernote Clearly's highlighting algorithm/functionality as an embeddable component.
 *  Copyright 2013, Evernote Corporation
 *
 *  Usage:
 *  ======
 *
 *      // define
 *      window.ClearlyComponent__highlight = {
 *          'callbacks': {
 *              'highlightAdded': someFunction(),
 *              'highlightDeleted': someFunction(),
 *              'arbitraryRangeExclusion': someFunction()
 *          },
 *          'settings': {
 *              'imgPath': 'string',
 *              'onInsertCSSUseThisId': 'string',
 *              'highlightingEnabledCSSClass': 'string',
 *              'highlightElementCSSClass': 'string',
 *              'highlightElementIdAttribute': 'string',
 *              'highlightElementFirstCSSClass': 'string',
 *              'highlightElementLastCSSClass': 'string',
 *              'highlightElementDeleteCSSClass': 'string',
 *              'highlightElementDeleteIdPrefix': 'string',
 *              'highlightCleanHTMLElementStart': 'string',
 *              'highlightCleanHTMLElementEnd': 'string',
 *              'elementWhichMustContainAllHighlights': _dom_element,
 *              'elementsToAttachMouseHandlersTo': [
 *                  _dom_element
 *              ]
 *          },
 *          'window': window,
 *          'document': document,
 *          'jQuery': window.jQuery
 *      };
 *
 *      // init -- will return false, if something goes wrong
 *      window.ClearlyComponent__highlight = initClearlyComponent__highlight(window.ClearlyComponent__highlight);
 *
 *      //  setup
 *      window.ClearlyComponent__highlight.insertCSS();
 *      window.ClearlyComponent__highlight.addMouseHandlers();
 *
 *      //  enable
 *      window.ClearlyComponent__highlight.enable();
 *
 *      // publcly available/overridable
 *      window.ClearlyComponent__highlight.debug
 *
 */</p>
<p>/*
    changes:
    ========
        $R => $H
        $R.highlight => $H.enabled</p>
<p>    to do:
    ======
*/</p>
<p>function initClearlyComponent__highlight(_paramInstance)
{
    //  global instance reference {
    //  ===========================</p>
<p>        //  null; return
        if (_paramInstance); else { return false; }</p>
<p>        //  shorthand
        $H = _paramInstance;</p>
<p>    //  global instance reference }</p>
<p>    //  required vars {
    //  ===============</p>
<p>        //  the component instance object must already be created,
        //  when the init function is called. it must have these vars set:</p>
<p>        switch (true)
        {
            case (!($H.settings)):
            case (!($H.settings.imgPath)):</p>
<p>            case (!($H.window)):
            case (!($H.document)):
            case (!($H.document.body)):</p>
<p>            case (!($H.jQuery)):</p>
<p>                if ($H.debug)
                {
                    console.log(!($H.settings));
                    console.log(!($H.settings.imgPath));</p>
<p>                    console.log(!($H.window));
                    console.log(!($H.document));
                    console.log(!($H.document.body));</p>
<p>                    console.log(!($H.jQuery));
                }</p>
<p>                //  something's wrong
                return false;
        }</p>
<p>    //  required vars }</p>
<p>    //  missing settings {
    //  ==================</p>
<p>        //  restrictions
        if ($H.settings.elementWhichMustContainAllHighlights); else { $H.settings.elementWhichMustContainAllHighlights = $H.document.body; }
        if ($H.settings.elementsToAttachMouseHandlersTo); else { $H.settings.elementsToAttachMouseHandlersTo = [$H.document.body]; }</p>
<p>        //  names for stuff
        /* css id */            if ($H.settings.onInsertCSSUseThisId); else             { $H.settings.onInsertCSSUseThisId =            'clearly_highlighting_css'; }
        /* enabled */           if ($H.settings.highlightingEnabledCSSClass); else      { $H.settings.highlightingEnabledCSSClass =     'clearly_highlighting_enabled'; }
        /* element id */        if ($H.settings.highlightElementIdAttribute); else      { $H.settings.highlightElementIdAttribute =     'clearly_highlight_id'; }
        /* element class */     if ($H.settings.highlightElementCSSClass); else         { $H.settings.highlightElementCSSClass =        'clearly_highlight_element'; }
        /* element (first) */   if ($H.settings.highlightElementFirstCSSClass); else    { $H.settings.highlightElementFirstCSSClass =   'clearly_highlight_first'; }
        /* element (first) */   if ($H.settings.highlightElementLastCSSClass); else     { $H.settings.highlightElementLastCSSClass =    'clearly_highlight_last'; }
        /* delete class */      if ($H.settings.highlightElementDeleteCSSClass); else   { $H.settings.highlightElementDeleteCSSClass =  'clearly_highlight_delete_element'; }
        /* delete id prefix */  if ($H.settings.highlightElementDeleteIdPrefix); else   { $H.settings.highlightElementDeleteIdPrefix =  'clearly_highlight_delete__'; }
        /* clean html start */  if ($H.settings.highlightCleanHTMLElementStart); else   { $H.settings.highlightCleanHTMLElementStart =  '<span style="-evernote-highlighted:true; background-color:#f6ee96">'; }
        /* clean html end */    if ($H.settings.highlightCleanHTMLElementEnd); else     { $H.settings.highlightCleanHTMLElementEnd =    '</span>'; }</p>
<p>    //  missing settings }</p>
<p>    //  global vars {
    //  =============</p>
<p>        $CJ = $H.jQuery;</p>
<p>        $H.$window = $CJ($H.window);
        $H.$document = $CJ($H.document);
        $H.$html = $H.$document.find('html');
        $H.$elementWhichMustContainAllHighlights = $CJ($H.settings.elementWhichMustContainAllHighlights);</p>
<p>        $H.enabled = false;</p>
<p>    //  global vars }</p>
<p>    //  parse options {
    //  ===============   </p>
<p>		$H.parseOptions =
		{
			'_elements_ignore': 			        '|button|input|select|textarea|optgroup|command|datalist|--|frame|frameset|noframes|--|style|link|script|noscript|--|canvas|applet|map|--|marquee|area|base|',
			'_elements_ignore_tag': 		        '|form|fieldset|details|dir|--|center|font|span|',</p>
<p>			'_elements_container': 			        '|body|--|article|section|--|div|--|td|--|li|--|dd|dt|',
            '_elements_self_closing': 		        '|br|hr|--|img|--|col|--|source|--|embed|param|--|iframe|',</p>
<p>            '_elements_highlight_protect':          '|video|audio|source|--|object|param|embed|',</p>
<p>            '_elements_keep_attributes':
			{
				'a': 		['href', 'title', 'name'],
				'img': 		['src', 'width', 'height', 'alt', 'title'],</p>
<p>				'video': 	['src', 'width', 'height', 'poster', 'audio', 'preload', 'autoplay', 'loop', 'controls'],
				'audio': 	['src', 'preload', 'autoplay', 'loop', 'controls'],		 
				'source': 	['src', 'type'],</p>
<p>				'object': 	['data', 'type', 'width', 'height', 'classid', 'codebase', 'codetype'],						
				'param': 	['name', 'value'],
				'embed': 	['src', 'type', 'width', 'height', 'flashvars', 'allowscriptaccess', 'allowfullscreen', 'bgcolor'],</p>
<p>				'iframe':	['src', 'width', 'height', 'frameborder', 'scrolling'],</p>
<p>				'td':		['colspan', 'rowspan'],			
				'th':		['colspan', 'rowspan']
			}</p>
<p>		};</p>
<p>    //  parse options }</p>
<p>    //  debug {
    //  =======</p>
<p>        $H.debug = ($H.debug || false);</p>
<p>		if ($H.debug)
		{
		    //  writeLog
		    //  ========
				switch (true)
				{
					case (!(!($H.window.console &#038;&#038; $H.window.console.log))):    $H.writeLog = function (msg) { $H.window.console.log(msg); };       break;
					case (!(!($H.window.opera &#038;&#038; $H.window.opera.postError))):  $H.writeLog = function (msg) { $H.window.opera.postError(msg); };   break;
					default:                                                    $H.writeLog = function (msg) {};                                    break;
				}</p>
<p>            //  log
            //  ===
                $H.log = function ()
                {
                    if ($H.debug); else { return; }
                    for (var i=0, il=arguments.length; i<il ; i++) { $H.writeLog(arguments[i]); }
                    $H.writeLog('-----------------------------------------');
                };
		}
		else
		{
            $H.writeLog 		= function () { return false; };
            $H.log 				= function () { return false; };
        }</p>
<p>    //  debug }</p>
<p>    //  insert css {
    //  ============</p>
<p>        $H.insertCSS = function ()
        {
            var _cssText = ''
            +   '/* selection */ '
            +   'html.'+$H.settings.highlightingEnabledCSSClass+' ::-moz-selection { background: rgba(246, 238, 150, 0.99); } '
            +   'html.'+$H.settings.highlightingEnabledCSSClass+' ::selection { background: rgba(246, 238, 150, 0.99); } '</p>
<p>            +   '/* cursor */ '
            +   'html.'+$H.settings.highlightingEnabledCSSClass+' { '
            +   '   /* cursor and hot-spot position -- requires a default cursor, after the URL one */ '
            +   '} '</p>
<p>            +   '/* highlight tag */ '
            +   'em.'+$H.settings.highlightElementCSSClass+' { '
            +   '   font-style: inherit !important; font-weight: inherit !important; '
            +   '   background-repeat: repeat-x; background-position: top left; background-size: 100% 100%; '
            +   '} '
            +   '/* the delete-buttons are positioned relative to this */ '
            +   'em.'+$H.settings.highlightElementCSSClass+'.'+$H.settings.highlightElementFirstCSSClass+' { position: relative; } '</p>
<p>            +   '/* delete buttons */ '
            +   'em.'+$H.settings.highlightElementCSSClass+' a.'+$H.settings.highlightElementDeleteCSSClass+' { '
            +   '   display: none; cursor: pointer; '
            +   '   padding: 0; margin: 0; line-height: 0; '
            +   '   position: absolute; width: 34px; height: 34px; left: -17px; top: -17px; '
            +   '} '
            +   'em.'+$H.settings.highlightElementCSSClass+' a.'+$H.settings.highlightElementDeleteCSSClass+':hover { background-position: -34px 0px; } '
            ;</p>
<p>            //  create
            var _cssElement = $H.document.createElement('style');
            _cssElement.setAttribute('id', $H.settings.onInsertCSSUseThisId);
            _cssElement.setAttribute('type', 'text/css');
            if (_cssElement.styleSheet) { _cssElement.styleSheet.cssText = _cssText; }
                else { _cssElement.appendChild($H.document.createTextNode(_cssText)); }</p>
<p>            //  append
            $H.$document.find('head').append(_cssElement);
        };</p>
<p>    //  insert css }</p>
<p>    //  selection {
    //  ===========</p>
<p>        $H.sel = {};</p>
<p>        $H.sel.getWindowFromDocument = function (theDocument)
        {
            if (theDocument); else { return null; }</p>
<p>            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;
                };
            }</p>
<p>            return arguments.calee(theDocument);
        };</p>
<p>        $H.sel.getSelection = function (theWindow)
        {
            if (theWindow); else { return null; }</p>
<p>            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;
                };
            }</p>
<p>            return arguments.calee(theWindow);
        };</p>
<p>        $H.sel.getRange = function (selection)
        {
            if (selection); else { return null; }</p>
<p>            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;
                };
            }</p>
<p>            return arguments.calee(selection);
        };</p>
<p>        $H.sel.getRangeHTML = function (range)
        {
            if (range); else { return null; }</p>
<p>            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) {</p>
<p>                    if (range); else { return null; }
                    if (range.commonAncestorContainer &#038;&#038; range.commonAncestorContainer.ownerDocument); else { return null; }</p>
<p>                    var dummy = range.commonAncestorContainer.ownerDocument.createElement("div");
                    dummy.appendChild(range.cloneContents());
                    return dummy.innerHTML;
                };
            }
            else {
                arguments.calee = function (range) {
                    return null;
                };
            }</p>
<p>            return arguments.calee(range);
        };</p>
<p>        $H.sel.getRangeText = function (range)
        {
            if (range); else { return null; }</p>
<p>            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) {</p>
<p>                    if (range); else { return null; }
                    if (range.commonAncestorContainer &#038;&#038; range.commonAncestorContainer.ownerDocument); else { return null; }</p>
<p>                    var dummy = range.commonAncestorContainer.ownerDocument.createElement("div");
                    dummy.appendChild(range.cloneContents());
                    return dummy.textContent;
                };
            }
            else {
                arguments.calee = function (range) {
                    return null;
                };
            }</p>
<p>            return arguments.calee(range);
        };</p>
<p>    //  selection }</p>
<p>    //  helpers {
    //  =========</p>
<p>        $H.rand = function (_min, _max)
        {
            return (Math.floor(Math.random() * (_max - _min + 1)) + _min);
        };</p>
<p>        $H.highlight__deleteSpansFromParents = function (_parents)
        {
            var _done = [], _this_done = false, _inner = '';</p>
<p>            //  main loop
            for (var i=0, _i=_parents.length; i<_i; i++)
            {
                //  init
                _this_done = false;</p>
<p>                //  check
                for (var ii=0, _ii=_done.length; ii<_ii; ii++)
                {
                    if (_done[ii] == _parents[i])
                    {
                        _this_done = true;
                        break;
                    }
                }    </p>
<p>                //  skip
                if (_this_done) { continue; }</p>
<p>                //  actually do
                //  ===========</p>
<p>                    //  add
                    _done.push(_parents[i]);</p>
<p>                    //  get
                    _inner = _parents[i].innerHTML;</p>
<p>                    //  check
                    if (_inner.indexOf('<span') > -1); else { continue; }</p>
<p>                    //  replace
                    _inner = _inner.replace(/<span([^>]*?)>/gi, '');
                    _inner = _inner.replace(/<\/span>/gi, '');
                    _parents[i].innerHTML = _inner;
            }
        };</p>
<p>        $H.highlight__getDeepestTextNode = function (_node)
        {
            var _n = _node;</p>
<p>            while (true)
            {
                switch (true)
                {
                    //  text
                    case (_n.nodeType &#038;&#038; _n.nodeType == 3): return _n;</p>
<p>                    //  single child
                    case (_n.nodeType &#038;&#038; _n.nodeType == 1 &#038;&#038; _n.childNodes.length > 0): _n = _n.childNodes[0]; break;</p>
<p>                    //  no children but has sibling
                    case (_n.nodeType &#038;&#038; _n.nodeType == 1 &#038;&#038; _n.childNodes.length == 0 &#038;&#038; _n.nextSibling): _n = _n.nextSibling; break;</p>
<p>                    //  default
                    default: return _node;
                }
            }
        };</p>
<p>        $H.highlight__getCommonAncestorContainerForNodes = function (_node1, _node2, _fallback)
        {
            var _parent1 = _node1, _parent2 = _node2;</p>
<p>            while (true)
            {
                //  next
                _parent1 = _parent1.parentNode;
                _parent2 = _parent2.parentNode;</p>
<p>                //  break
                switch (true)
                {
                    case (!(_parent1)):
                    case (!(_parent2)):
                    case (_parent1 == _fallback):
                    case (_parent2 == _fallback):
                        return _fallback;
                }</p>
<p>                //  maybe
                switch (true)
                {
                    case (_parent1 == _parent2): return _parent1;</p>
<p>                    case ($CJ.contains(_parent1, _node2)): return _parent1;
                    case ($CJ.contains(_parent2, _node1)): return _parent2;</p>
<p>                    case ($CJ.contains(_parent1, _parent2)): return _parent1;
                    case ($CJ.contains(_parent2, _parent1)): return _parent2;
                }
            }
        };</p>
<p>        $H.highlight__getParentElementOfNode = function (_thisNode)
        {
            var _element = _thisNode;
            while (true) {
                //  correct
                if (_element.nodeType == 1) { break; }</p>
<p>                //  continue
                _element = _element.parentNode;
            }
            return _element;
        };</p>
<p>        $H.highlight__getParentElementOfNodeWithThisParent = function (_thisNode, _thisParent)
        {
            //  impossible
            switch (true)
            {
                case (_thisNode == _thisParent):
                    return _thisNode;</p>
<p>                case (!($CJ.contains(_thisParent, _thisNode))):  // always false in IE
                    //return _thisNode;
            }</p>
<p>            //  do
            var _element = _thisNode;
            while (true) {
                //  correct
                if (_element.parentNode == _thisParent) { break; }</p>
<p>                //  continue
                _element = _element.parentNode;
            }
            return _element;
        };</p>
<p>    //  helpers }</p>
<p>    //  build html for element with selected range {
    //  ============================================</p>
<p>        $H.highlight__buildHTMLForElementWithSelectedRange = function (_elementToBuildHTMLFor, _modeToBuildHTMLIn, _rangeToBuildHTMLWith)
        {
            var 
                _global__element_index = 0,
                _global__the_html = '',
                _global__highlight_on = ((_modeToBuildHTMLIn == 'boundry-end') ? true : false)
            ;</p>
<p>            //	recursive function
            //	==================
                var _recursive = function (_node)
                {
                    //	increment index -- starts with 1
                    //	===============
                        _global__element_index++;</p>
<p>                    //	vars
                    //	====
                        var 
                            _explored = false,
                            _tag_name = (_node.nodeType === 3 ? '#text' : ((_node.nodeType === 1 &#038;&#038; _node.tagName &#038;&#038; _node.tagName > '') ? _node.tagName.toLowerCase() : '#invalid')),
                            _tag_is_ignored = ($H.parseOptions._elements_ignore_tag.indexOf('|'+_tag_name+'|') > -1),
                            _tag_is_ignored = (_tag_is_ignored ? ((_tag_name == 'span') ? false : true) : false),
                            _pos__start__before = 0,
                            _pos__start__after = 0,
                            _pos__end__before = 0,
                            _pos__end__after = 0,
                            _to_write = '',
                            _selection_starts_here = false,
                            _selection_ends_here = false
                        ;</p>
<p>                    //	fast return
                    //	===========
                        switch (true)
                        {
                            case ((_tag_name == '#invalid')):
                            case (($H.parseOptions._elements_ignore.indexOf('|'+_tag_name+'|') > -1)):
                                return;</p>
<p>                            case (_tag_name == '#text'):
                                //  get value
                                //  =========
                                    _to_write = _node.nodeValue.replace(/</gi, '&lt;').replace(/>/gi, '&gt;');</p>
<p>                                //  mode?
                                //  =====
                                    switch (true)
                                    {
                                        case (_modeToBuildHTMLIn == 'nothing'):
                                            break;</p>
<p>                                        case (_modeToBuildHTMLIn == 'everything'):
                                            _to_write = ''
                                                + '<highlight>' 
                                                +   _to_write 
                                                + '</highlight>'
                                            ;
                                            break;</p>
<p>                                        case (_modeToBuildHTMLIn == 'boundry-start'):
                                        case (_modeToBuildHTMLIn == 'boundry-end'):
                                        case (_modeToBuildHTMLIn == 'boundry-both'):</p>
<p>                                            //  end of range?
                                            //  =============
                                                if (_node == _rangeToBuildHTMLWith.endContainer)
                                                {
                                                    _to_write = ''
                                                        + '<highlight>'
                                                        +   _to_write.substr(0, _rangeToBuildHTMLWith.endOffset)
                                                        + '</highlight>'
                                                        + _to_write.substr(_rangeToBuildHTMLWith.endOffset)
                                                    ;</p>
<p>                                                    _global__highlight_on = false;
                                                    _selection_ends_here = true;
                                                }</p>
<p>                                            //  start of range?
                                            //  ===============
                                                if (_node == _rangeToBuildHTMLWith.startContainer)
                                                {
                                                    _to_write = ''
                                                        + _to_write.substr(0, _rangeToBuildHTMLWith.startOffset)
                                                        + '<highlight>'
                                                        +   _to_write.substr(_rangeToBuildHTMLWith.startOffset)
                                                        + '</highlight>'  
                                                    ;</p>
<p>                                                    _global__highlight_on = true;
                                                    _selection_starts_here = true;
                                                }</p>
<p>                                            //  correction
                                            //  ==========
                                                if (_selection_starts_here &#038;&#038; _selection_ends_here)
                                                {
                                                    _to_write = _node.nodeValue.replace(/</gi, '&lt;').replace(/>/gi, '&gt;');
                                                    _to_write = ''
                                                        + _to_write.substr(0, _rangeToBuildHTMLWith.startOffset)
                                                        + '<highlight>'
                                                        +   _to_write.substr(_rangeToBuildHTMLWith.startOffset, (_rangeToBuildHTMLWith.endOffset - _rangeToBuildHTMLWith.startOffset))
                                                        + '</highlight>'
                                                        + _to_write.substr(_rangeToBuildHTMLWith.endOffset)
                                                    ;</p>
<p>                                                    _global__highlight_on = false;
                                                }</p>
<p>                                            //  snap-to
                                            //  =======
                                                if (_selection_starts_here &#038;&#038; (_rangeToBuildHTMLWith.startOffset > 0))
                                                {
                                                    //  before
                                                    _to_write = _to_write.replace(/([ .,;?!])([a-z0-9]{1,2})<highlight>/gi, '$1<highlight>$2');</p>
<p>                                                    //  space at begining
                                                    _to_write = _to_write.replace(/<highlight>([\s])([^\s])/gi, '$1<highlight>$2');</p>
<p>                                                    //  too much
                                                    _to_write = _to_write.replace(/<highlight>([a-z0-9])([ ])([a-z0-9])/gi, '$1$2<highlight>$3');
                                                }</p>
<p>                                                if (_selection_ends_here &#038;&#038; (_rangeToBuildHTMLWith.endOffset > 0))
                                                {
                                                    var _do_end = true;</p>
<p>                                                    if (_rangeToBuildHTMLWith.endContainer &#038;&#038; _rangeToBuildHTMLWith.endContainer.nodeValue &#038;&#038; _rangeToBuildHTMLWith.endContainer.nodeValue.length)
                                                        { _do_end = (_rangeToBuildHTMLWith.endOffset < _rangeToBuildHTMLWith.endContainer.nodeValue.length); }</p>
<p>                                                    if (_do_end)
                                                    {
                                                        //  after
                                                        _to_write = _to_write.replace(/<\/highlight>([a-z0-9]{0,2})([ .,;?!])/gi, '$1$2</highlight>');</p>
<p>                                                        //  space at end
                                                        _to_write = _to_write.replace(/([^\s])([\s])<\/highlight>/gi, '$1</highlight>$2');</p>
<p>                                                        //  too much
                                                        _to_write = _to_write.replace(/([ ])([a-z0-9])<\/highlight>([a-z0-9])/gi, '</highlight>$1$2$3');
                                                    }
                                                }</p>
<p>                                            //  other
                                            //  =====
                                                if (!(_selection_starts_here) &#038;&#038; !(_selection_ends_here))
                                                {
                                                    _to_write = _node.nodeValue.replace(/</gi, '&lt;').replace(/>/gi, '&gt;');
                                                    if (_global__highlight_on)
                                                    {
                                                        _to_write = ''
                                                            + '<highlight>' 
                                                            +   _to_write 
                                                            + '</highlight>'
                                                        ;
                                                    }
                                                }</p>
<p>                                            break;
                                    }</p>
<p>                                //  write value
                                //  ===========
                                    _global__the_html += _to_write;</p>
<p>                                return;
                        }</p>
<p>                    //  range anchors are elements instead of text-nodes
                    //  ================================================</p>
<p>                        //  end of range?
                        if ((_rangeToBuildHTMLWith.endContainer.nodeType == 1) &#038;&#038; (_node == _rangeToBuildHTMLWith.endContainer)) {
                            _global__highlight_on = false;
                            _selection_ends_here = true;
                        }</p>
<p>                        //  start of range?
                        if ((_rangeToBuildHTMLWith.startContainer.nodeType == 1) &#038;&#038; (_node == _rangeToBuildHTMLWith.startContainer)) {
                            _global__highlight_on = true;
                            _selection_starts_here = true;
                        }</p>
<p>                        //  correction
                        if (_selection_starts_here &#038;&#038; _selection_ends_here) {
                            _global__highlight_on = false;
                        }</p>
<p>                    //	start tag
                    //	=========
                        if (_tag_is_ignored); else
                        {
                            /* mark */	_pos__start__before = _global__the_html.length;
                            /* add */	_global__the_html += '<'+_tag_name;</p>
<p>                            //	attributes
                            //	==========</p>
<p>                                //	allowed attributes
                                if (_tag_name in $H.parseOptions._elements_keep_attributes)
                                {
                                    for (var i=0, _i=$H.parseOptions._elements_keep_attributes[_tag_name].length; i<_i; i++)
                                    {
                                        var 
                                            _attribute_name = $H.parseOptions._elements_keep_attributes[_tag_name][i],
                                            _attribute_value = _node.getAttribute(_attribute_name)
                                        ;</p>
<p>                                        //	if present
                                        if (_attribute_value > '')
                                            { _global__the_html += ' '+_attribute_name+'="'+(_attribute_value)+'"'; }
                                    }
                                }</p>
<p>                                //	keep ID for all elements
                                var _id_attribute = _node.getAttribute('id');
                                if (_id_attribute > '')
                                    { _global__the_html += ' id="'+_id_attribute+'"'; }</p>
<p>                                //	links target NEW
                                if (_tag_name == 'a')
                                    { _global__the_html += ' target="_blank"'; }</p>
<p>                            //  add class name
                            //  ==============
                                var _class_attribute = _node.getAttribute('class');
                                if (_class_attribute > '')
                                    { _global__the_html += ' class="'+_class_attribute+'"'; }</p>
<p>                            //  add highlight id -- for EMs that are outside the global highlight
                            //  ================
                                if (_tag_name == 'em' &#038;&#038; _modeToBuildHTMLIn != 'everything')
                                {
                                    //  with a fix for when an em is the first thing inside a parent element</p>
<p>                                    switch (true)
                                    {
                                        case (_global__highlight_on):
                                        case ((_rangeToBuildHTMLWith.startOffset == 0) &#038;&#038; (_node.firstChild) &#038;&#038; (_node.firstChild == _rangeToBuildHTMLWith.startContainer)):
                                            break;</p>
<p>                                        default:
                                            var _highlight_id_attribute = _node.getAttribute($H.settings.highlightElementIdAttribute);
                                            if (_highlight_id_attribute > '')
                                                { _global__the_html += ' '+$H.settings.highlightElementIdAttribute+'="'+_highlight_id_attribute+'"'; }
                                            break;
                                    }
                                }</p>
<p>                            //	close start
                            //	===========
                                if ($H.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1) { _global__the_html += ' />'; }
                                else { _global__the_html += '>';}</p>
<p>                            /* mark */ _pos__start__after = _global__the_html.length;
                        }</p>
<p>                    //	child nodes
                    //	===========
                        if ($H.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1); else
                        {
                            for (var i=0, _i=_node.childNodes.length; i<_i; i++)
                                { _recursive(_node.childNodes[i]); }
                        }</p>
<p>                    //	end tag
                    //	=======
                        switch (true)
                        {
                            case (_tag_is_ignored):
                                return;</p>
<p>                            case (($H.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1)):
                                /* mark */ 	_pos__end__before = _global__the_html.length;
                                /* mark */ 	_pos__end__after = _global__the_html.length;
                                break;</p>
<p>                            default:
                                /* mark */ 	_pos__end__before = _global__the_html.length;
                                /* end */ 	_global__the_html += '</'+_tag_name+'>';
                                /* mark */ 	_pos__end__after = _global__the_html.length;
                                break;
                        }</p>
<p>                    //  protected elements
                    //  ==================
                        switch (true)
                        {
                            //  some elemnts are protected from highlighting
                            case (($H.parseOptions._elements_highlight_protect.indexOf('|'+_tag_name+'|') > -1)):
                            case ((_tag_name == 'em') &#038;&#038; $CJ(_node).hasClass($H.settings.highlightElementCSSClass)):</p>
<p>                                //  so, if highlights are inside an already highlighted element --or an unhighlightable one-- remove</p>
<p>                                _global__the_html = ''
                                    + _global__the_html.substr(0, _pos__start__after)
                                    +   _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after))
                                            .replace(/<highlight>/gi, '')
                                            .replace(/<\/highlight>/gi, '')
                                    + _global__the_html.substr(_pos__end__before)
                                ;</p>
<p>                                break;</p>
<p>                            //  some elements are invalid completely
                            case ((_tag_name == 'a') &#038;&#038; (_node.className == 'deleteHighlight')):</p>
<p>                                _global__the_html = ''
                                    + _global__the_html.substr(0, _pos__start__before)
                                    + _global__the_html.substr(_pos__end__after)
                                ;</p>
<p>                                break;</p>
<p>                            //  some elements need to have their tags ignored
                            /*case (_tag_name == 'span'):</p>
<p>                                _global__the_html = ''
                                    + _global__the_html.substr(0, _pos__start__before)
                                    + _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after))
                                    + _global__the_html.substr(_pos__end__after)
                                ;</p>
<p>                                break;*/
                        }</p>
<p>                    //	return
                        return;
                };</p>
<p>            //	actually do it
            _recursive(_elementToBuildHTMLFor);</p>
<p>            //  use em, instead of highlight
            _global__the_html = _global__the_html
                .replace(/<highlight>/gi, '<em class="'+$H.settings.highlightElementCSSClass+'">')
                .replace(/<\/highlight>/gi, '</em>')
            ;</p>
<p>            //	return
            return _global__the_html;
        };    </p>
<p>    //  build html for element with selected range }</p>
<p>    //  do range {
    //  ==========</p>
<p>        $H.highlight__doRange = function (_range_to_highlight)
        {
            //  get referrence elements
            var
                _commonAncestorElement = $H.highlight__getParentElementOfNode(_range_to_highlight.commonAncestorContainer),
                _startElement = $H.highlight__getParentElementOfNodeWithThisParent(_range_to_highlight.startContainer, _commonAncestorElement),
                _endElement = $H.highlight__getParentElementOfNodeWithThisParent(_range_to_highlight.endContainer, _commonAncestorElement)
            ;</p>
<p>            //  range not in container element
            if (true
                &#038;&#038; (_commonAncestorElement.tagName) 
                &#038;&#038; !($CJ.contains($H.settings.elementWhichMustContainAllHighlights, _commonAncestorElement))
            ) {
                return false;
            }</p>
<p>            //  arbitrary range exclusion
            if ($H.callbacks.arbitraryRangeExclusion) {
                if ($H.callbacks.arbitraryRangeExclusion(_range_to_highlight, _commonAncestorElement, _startElement, _endElement) === false) {
                    return false;
                }
            }</p>
<p>            /* $H.log(
                _range.startContainer, _range.endContainer, _range.startOffset, _range.endOffset, 
                _range_to_highlight, 
                _commonAncestorElement, _startElement, _endElement
            ); */</p>
<p>            //  selection id
            var _selection_id = $H.rand(1, 1000);
            while (true)
            {
                //  nothing found
                if ($H.$elementWhichMustContainAllHighlights.find('em.'+$H.settings.highlightElementCSSClass+'['+$H.settings.highlightElementIdAttribute+'="'+_selection_id+'"]').length > 0); else { break; }</p>
<p>                //  new id
                _selection_id = $H.rand(1, 1000);
            }</p>
<p>            //  chainging elements
            //  ==================</p>
<p>                var _chaingingElements = [], _currElement = _startElement, _currChainging = false;</p>
<p>                while (true)
                {
                    //  object
                    _currChainging = {
                        '_element': _currElement,
                        '_tagName': (_currElement.nodeType === 3 ? '#text' : ((_currElement.nodeType === 1 &#038;&#038; _currElement.tagName &#038;&#038; _currElement.tagName > '') ? _currElement.tagName.toLowerCase() : '#invalid'))
                    };</p>
<p>                    //  add
                    _chaingingElements.push(_currChainging);</p>
<p>                    //  break
                    if (_currElement == _endElement) { break; }</p>
<p>                    //  next
                    _currElement = _currElement.nextSibling;</p>
<p>                    //  error?
                    if (_currElement); else { break; }
                }</p>
<p>            //  rewrite elements
            //  ================
                var _parents_to_clean = [];
                for (var i=0, _i=_chaingingElements.length, _currElement=false; i<_i; i++)
                {
                    var 
                        _currElement = _chaingingElements[i],
                        _currNode = _currElement._element,
                        _currTag = _currElement._tagName,
                        _boundry_mode = '',
                        _currBuiltHTML = false,
                        _resNode = false
                    ;</p>
<p>                    //  get html / mode
                    //  ===============
                        switch (true)
                        {
                            case ((_i == 1) &#038;&#038; (i == 0)):       _boundry_mode = 'boundry-both';     break;
                            case ((_i > 1) &#038;&#038; (i == 0)):        _boundry_mode = 'boundry-start';    break;
                            case ((_i > 1) &#038;&#038; (i == (_i-1))):   _boundry_mode = 'boundry-end';      break;
                            default:                            _boundry_mode = 'everything';       break;
                        }</p>
<p>                    //  get html
                    //  ========
                        _currBuiltHTML = $H.highlight__buildHTMLForElementWithSelectedRange(_currNode, _boundry_mode, _range_to_highlight);</p>
<p>                    //  write
                    //  =====
                        switch (true)
                        {
                            case ((_currTag == '#text')):</p>
<p>                                //  resulting html might be something like "<em>something</em> something else"
                                //  so we create a dummy span tag to eomcompass it, and then repalce the old text node with that</p>
<p>                                //  create
                                var _newElement = $H.document.createElement('span');
                                    _newElement.innerHTML = _currBuiltHTML;</p>
<p>                                //  result
                                _resNode = _newElement;</p>
<p>                               /* with (Evernote.evernotePopup) {
                                    console.log(' ~~~ highlight.js gadit before |'  + docSelection + "|");
                                    console.log(' ~~~ from ' +docSelection.startOffset + ' to  ' + docSelection.endOffset);
                                }*/</p>
<p>                                Evernote.Utils.sendMessageToPopup('highlightDomChangesStart');
                                //  replace
                                _currNode.parentNode.replaceChild(_resNode, _currNode);</p>
<p>                                Evernote.Utils.sendMessageToPopup('highlightDomChangesEnd');
/*
                                with (Evernote.evernotePopup) {
                                    console.log(' ~~~ highlight.js nagadil |'  + docSelection + "|");
                                    console.log(' ~~~ from ' +docSelection.startOffset + ' to  ' + docSelection.endOffset);
                                }*/</p>
<p>                                break;</p>
<p>                            case (($H.parseOptions._elements_self_closing.indexOf('|'+_currTag+'|') > -1)):</p>
<p>                                //  result
                                _resNode = _currNode;</p>
<p>                                /* nothing */ /*
                                    var _newElement = $H.document.createElement('em');
                                        _newElement.className = $H.settings.highlightElementCSSClass;
                                        _newElement.innerHTML = _currBuiltHTML;
                                    _currNode.parentNode.replaceChild(_newElement, _currNode);
                                */</p>
<p>                                break;</p>
<p>                            default:</p>
<p>                                //  result
                                _resNode = _currNode;</p>
<p>                                //  innerHTML
                                _currBuiltHTML = _currBuiltHTML.substr((_currBuiltHTML.indexOf('>')+1));
                                _currBuiltHTML = _currBuiltHTML.substr(0, _currBuiltHTML.lastIndexOf('<'));</p>
<p>                                //  highlighted anything?
                                if (_currBuiltHTML.indexOf('<em class="'+$H.settings.highlightElementCSSClass+'">') > - 1); else { break; }</p>
<p>                                //  do it
                                _currNode.innerHTML = _currBuiltHTML;
                                break;
                        }</p>
<p>                    //  set highlight class 
                    //  ===================</p>
<p>                        //  inside node
                        $CJ(_resNode).find('em.'+$H.settings.highlightElementCSSClass+':not(['+$H.settings.highlightElementIdAttribute+'])').attr($H.settings.highlightElementIdAttribute, _selection_id);</p>
<p>                        //  on node
                        if ((_currTag == 'em') &#038;&#038; $CJ(_resNode).hasClass($H.settings.highlightElementCSSClass))
                            { $CJ(_resNode).attr($H.settings.highlightElementIdAttribute, _selection_id); }</p>
<p>                        //  clean::add
                        _parents_to_clean.push(_resNode.parentNode);
                }</p>
<p>                //  clean::do
                $H.highlight__deleteSpansFromParents(_parents_to_clean);
        };</p>
<p>    //  do range }</p>
<p>    //  do current selection {
    //  ======================</p>
<p>        $H.highlight__doCurentSelection = function ()
        {
            //  vars
            //  ====
                var 
                    _selection = $H.sel.getSelection($H.window),
                    _range = $H.sel.getRange(_selection),
                    _text = $H.sel.getRangeText(_range),</p>
<p>                    _good_range = (_range ? {
                        'commonAncestorContainer':  _range.commonAncestorContainer,
                        'startContainer':           _range.startContainer,
                        'endContainer':             _range.endContainer,
                        'startOffset':              _range.startOffset,
                        'endOffset':                _range.endOffset
                    } : false)
                ;</p>
<p>            //  some exception rules
            //  ====================
                switch (true)
                {
                    case (!(_text)):
                    case (!(_text.length > 0)):
                    case (!(_good_range)):
                        return false;
                }</p>
<p>            //  some corrections
            //  ================</p>
<p>                //  Firefox fucks up -- https://developer.mozilla.org/en/DOM/range.startOffset
                //  Offsets mean two differet things</p>
<p>                //  start container
                if (_good_range.startContainer.nodeType == 1)
                {
                    if (_good_range.startContainer.childNodes[_good_range.startOffset])
                    {
                        _good_range.startContainer = _good_range.startContainer.childNodes[_good_range.startOffset];
                        _good_range.startOffset = 0;
                    }
                }</p>
<p>                //  end container
                if (_good_range.endContainer.nodeType == 1)
                {
                    if (_good_range.endContainer.childNodes[_good_range.endOffset])
                    {
                        _good_range.endContainer = _good_range.endContainer.childNodes[_good_range.endOffset];
                        _good_range.endOffset = 0;
                    }
                }</p>
<p>            //  highlight range
            //  ===============
                var _highlighted_range = $H.highlight__doRange(_good_range);
                if (_highlighted_range === false) { return false; }</p>
<p>            //  clear selection
            //  ===============
                try { _selection.removeAllRanges(); } catch (e) {}</p>
<p>            //  correct double highlights
            //  =========================
                var _parents_double_to_clean = [];
                $H.$elementWhichMustContainAllHighlights.find('em.'+$H.settings.highlightElementCSSClass+' em.'+$H.settings.highlightElementCSSClass).each(function (_i, _e)
                {
                    //  remove inner button
                        $CJ(_e).find('a.'+$H.settings.highlightElementDeleteCSSClass).remove();</p>
<p>                    //  create
                    var _newElement = $H.document.createElement('span');
                        _newElement.innerHTML = _e.innerHTML;</p>
<p>                    //  repalce
                    _e.parentNode.replaceChild(_newElement, _e);</p>
<p>                    //  add
                    _parents_double_to_clean.push(_newElement.parentNode);
                });</p>
<p>                //  clean
                $H.highlight__deleteSpansFromParents(_parents_double_to_clean);</p>
<p>            //  remove buttons and classes
            //  ==========================
                //  delete buttons
                $H.$elementWhichMustContainAllHighlights.find('em.'+$H.settings.highlightElementCSSClass+' a.'+$H.settings.highlightElementDeleteCSSClass).remove();</p>
<p>                //  first, last
                $H.$elementWhichMustContainAllHighlights.find('em.'+$H.settings.highlightElementCSSClass+'.'+$H.settings.highlightElementFirstCSSClass).removeClass($H.settings.highlightElementFirstCSSClass);
                $H.$elementWhichMustContainAllHighlights.find('em.'+$H.settings.highlightElementCSSClass+'.'+$H.settings.highlightElementLastCSSClass).removeClass($H.settings.highlightElementLastCSSClass);</p>
<p>            //  add buttons and classes
            //  =======================
                var 
                    _highlights_collection = $H.$elementWhichMustContainAllHighlights.find('em.'+$H.settings.highlightElementCSSClass),
                    _highlights_collection_ids = [],
                    _curr_delete_button = false
                ;</p>
<p>                //  get all ids
                _highlights_collection.each(function (_i, _e) {
                    _highlights_collection_ids.push($CJ(_e).attr($H.settings.highlightElementIdAttribute));
                });</p>
<p>                //  add button, classes
                _highlights_collection.each(function (_i, _e)
                {
                    var
                        _isFirst = (_highlights_collection_ids[(_i-1)] ? (_highlights_collection_ids[_i] != _highlights_collection_ids[(_i-1)]) : true),
                        _isLast = (_highlights_collection_ids[(_i+1)] ? (_highlights_collection_ids[_i] != _highlights_collection_ids[(_i+1)]) : true)
                    ;</p>
<p>                    if (_isFirst)
                    {
                        //  class
                        $CJ(_e).addClass($H.settings.highlightElementFirstCSSClass);</p>
<p>                        //  create button
                        _curr_delete_button = $H.document.createElement('a');
                        _curr_delete_button.className = $H.settings.highlightElementDeleteCSSClass;
                        _curr_delete_button.id = $H.settings.highlightElementDeleteIdPrefix + _highlights_collection_ids[_i];</p>
<p>                        //  add button
                        _e.insertBefore(_curr_delete_button, _e.firstChild);
                    }</p>
<p>                    if (_isLast)
                    {
                        //  class
                        $CJ(_e).addClass($H.settings.highlightElementLastCSSClass);
                    }
                });
        };</p>
<p>    //  do current selection }</p>
<p>    //  delete highlight {
    //  ==================</p>
<p>        $H.highlight__deleteAllHighlights = function ()
        {
            $H.highlight__deleteHighlight('all');
        };</p>
<p>        $H.highlight__deleteHighlight = function (_highlight_id)
        {
            var 
                _expression = 'em.' + $H.settings.highlightElementCSSClass + (_highlight_id == 'all' ? '' : '['+$H.settings.highlightElementIdAttribute+'="'+_highlight_id+'"]'),
                _parents_to_clean = []
            ;</p>
<p>            //  collection
            $H.$elementWhichMustContainAllHighlights.find(_expression).each(function (_index, _e)
            {
                //  create
                var _s = $H.document.createElement('span');
                    _s.innerHTML = _e.innerHTML;</p>
<p>                //  do
                _e.parentNode.replaceChild(_s, _e);</p>
<p>                //  parents
                _parents_to_clean.push(_s.parentNode);
            });</p>
<p>            //  delete spans
            $H.highlight__deleteSpansFromParents(_parents_to_clean);
        };</p>
<p>    //  delete highlight }</p>
<p>    //  enable / disable {
    //  ==================</p>
<p>        $H.enable = function ()
        {
            if ($H.enabled) { return; }
            $H.enabled = true;
            $H.$html.addClass($H.settings.highlightingEnabledCSSClass);
        };</p>
<p>        $H.disable = function ()
        {
            if ($H.enabled); else { return; }
            $H.enabled = false;
            $H.$html.removeClass($H.settings.highlightingEnabledCSSClass);
        };</p>
<p>    //  enable / disable }</p>
<p>    //  add mouse handlers {
    //  ====================</p>
<p>        //  globals
        $H.highlight__mouseUp_timeout = false;
        $H.highlight__deleteButton__byId__mouseEnter_timeout = {};
        $H.highlight__deleteButton__byId__mouseLeave_timeout = {};</p>
<p>        //  containers mouse up
        $H.highlight__mouseUp = function ()
        {
            //  not in highlight mode
            if ($H.enabled); else { return; }</p>
<p>            //  timeout
            $H.highlight__mouseUp_timeout = $H.window.setTimeout
            (
                function ()
                {
                    //  try
                    $H.highlight__mouseUp_timeout = false;
                    var _didSelection = $H.highlight__doCurentSelection();</p>
<p>                    //  callback
                    if (_didSelection === false); else {
                        if ($H.callbacks.highlightAdded) {
                            $H.callbacks.highlightAdded();
                        }
                    }
                }, 
                250
            );
        };</p>
<p>        //  containers mouse down
        $H.highlight__mouseDown = function ()
        {
            //  not in highlight mode
            if ($H.enabled); else { return; }</p>
<p>            //  timeout
            $H.window.clearTimeout($H.highlight__mouseUp_timeout);
        };</p>
<p>        //  delete buttons show/hide
        $H.highlight__deleteButton__show = function (_highlight_id) { $H.$elementWhichMustContainAllHighlights.find('#' + $H.settings.highlightElementDeleteIdPrefix + _highlight_id).fadeIn(250); };
        $H.highlight__deleteButton__hide = function (_highlight_id) { $H.$elementWhichMustContainAllHighlights.find('#' + $H.settings.highlightElementDeleteIdPrefix + _highlight_id).fadeOut(250); };</p>
<p>        //  add mouse handlers
        $H.addMouseHandlers = function ()
        {
            //  mouse up/down
            for (var i=0, _i=$H.settings.elementsToAttachMouseHandlersTo.length; i<_i; i++)
            {
                $CJ($H.settings.elementsToAttachMouseHandlersTo[i])
                    .mouseup($H.highlight__mouseUp)
                    .mousedown($H.highlight__mouseDown)
                ;
            }</p>
<p>            //  highlight mouse enter
            $H.$elementWhichMustContainAllHighlights.on('mouseenter', 'em.'+$H.settings.highlightElementCSSClass, function ()
            {
                var _highlight_id = $CJ(this).attr($H.settings.highlightElementIdAttribute);</p>
<p>                $H.window.clearTimeout($H.highlight__deleteButton__byId__mouseLeave_timeout[_highlight_id]);</p>
<p>                $H.highlight__deleteButton__byId__mouseEnter_timeout[_highlight_id] = $H.window.setTimeout(
                    function ()
                    {
                        $H.highlight__deleteButton__byId__mouseEnter_timeout[_highlight_id] = false;
                        $H.highlight__deleteButton__show(_highlight_id);
                    },
                    250
                );
            });</p>
<p>            //  highlight mouse leave
            $H.$elementWhichMustContainAllHighlights.on('mouseleave', 'em.'+$H.settings.highlightElementCSSClass, function ()
            {
                var _highlight_id = $CJ(this).attr($H.settings.highlightElementIdAttribute);</p>
<p>                $H.window.clearTimeout($H.highlight__deleteButton__byId__mouseEnter_timeout[_highlight_id]);</p>
<p>                $H.highlight__deleteButton__byId__mouseLeave_timeout[_highlight_id] = $H.window.setTimeout(
                    function ()
                    {
                        $H.highlight__deleteButton__byId__mouseLeave_timeout[_highlight_id] = false;
                        $H.highlight__deleteButton__hide(_highlight_id);
                    },
                    250
                );
            });</p>
<p>            //  highlight delete click        
            $H.$elementWhichMustContainAllHighlights.on('click', 'em.'+$H.settings.highlightElementCSSClass+' a.'+$H.settings.highlightElementDeleteCSSClass, function ()
            {
                //  get id
                var _id = $CJ(this.parentNode).attr($H.settings.highlightElementIdAttribute);</p>
<p>                //  remove self
                $CJ(this).remove();</p>
<p>                //  delete
                $H.highlight__deleteHighlight(_id);</p>
<p>                //  callback
                if ($H.callbacks.highlightDeleted) {
                    $H.callbacks.highlightDeleted();
                }
            });
        };</p>
<p>    //  add mouse handlers }</p>
<p>    //  get clean html {
    //  ================</p>
<p>        $H.getCleanHTML = function (_rawHTML)
        {
            //  html
            var _html = _rawHTML;</p>
<p>            //  remove all spans -- spans hold deleted highlights, or useless helper elements
            _html = _html.replace(/<span([^>]*?)>/gi, '');
            _html = _html.replace(/<\/span>/gi, '');</p>
<p>            //  remove highlight-delete buttons
            var _highlight_delete_reg = new RegExp('<a ([^>]*?)'+$H.settings.highlightElementDeleteCSSClass+'([^>]*?)></a>', 'gi');
            _html = _html.replace(_highlight_delete_reg, '');</p>
<p>            //  highlight element
            var _highlight_element_reg = new RegExp('<em ([^>]*?)'+$H.settings.highlightElementCSSClass+'([^>]*?)>([^>]+?)</em>', 'gi');
            _html = _html.replace(_highlight_element_reg, '<highlight>$3</highlight>');</p>
<p>            //  double EMs
            var _two_highlights_reg = new RegExp('<highlight>([\\s\\S]*?)</highlight>([ \\n\\r\\t]*?)<highlight>([\\s\\S]*?)</highlight>', 'gi');
            while (true &#038;&#038; _html.match(_two_highlights_reg)) {
                _html = _html.replace(_two_highlights_reg, '<highlight>$1$3</highlight>');
            }</p>
<p>            //  replace EMs
            var _highlight_reg = new RegExp('<highlight>([\\s\\S]*?)</highlight>', 'gi');
            _html = _html.replace(_highlight_reg, $H.settings.highlightCleanHTMLElementStart+'$1'+$H.settings.highlightCleanHTMLElementEnd);</p>
<p>            return _html;
        };</p>
<p>    //  get clean html }		</p>
<p>    //  return self
    //  ===========
        return $H;
}
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/*!
 *  ClearlyComponent__next
 *  Evernote Clearly's next-page algorithm as an embeddable component.
 *  Copyright 2013, Evernote Corporation
 *
 *  Usage:
 *  ======
 *
 *      The Next-pages Clearly-component works hand-in-hand with the clearly Detect Component.
 *      So its init/usage pattern needs to come after the normal init/usage pattern for the Detect Component.
 *      Like this:
 *
 *      First "Detect":
 *      =============
 *
 *          // define
 *          window.ClearlyComponent__detect = {
 *              'callbacks': {
 *                  'finished': someFunction(),
 *              },
 *              'window': window,
 *              'document': document,
 *              'jQuery': window.jQuery
 *          };
 *
 *          // init -- will return false, if something goes wrong
 *          window.ClearlyComponent__detect = initClearlyComponent__detect(window.ClearlyComponent__detect);
 *
 *      Then "Next":
 *      ============
 *
 *          // define
 *          window.ClearlyComponent__next = {
 *              'callbacks': {
 *                  'newPageFound': someFunction()
 *              },
 *
 *              'settings': { 
 *                  'onCreateNextPagesContainerUseThisId': 'string',
 *                  'onCreateNextPagesContainerDoNotInsertCSS': true
 *              },
 *
 *              'detectComponentInstance': window.ClearlyComponent__detect
 *          };
 *
 *          // init -- will return false, if something goes wrong
 *          window.ClearlyComponent__next = initClearlyComponent__next(window.ClearlyComponent__next);
 *
 *          // call -- returns nothing; callbacks will be used
 *          window.ClearlyComponent__next.createNextPagesContainer()
 *          window.ClearlyComponent__next.start();
 *
 */</p>
<p>/*
    changes:
    ========
        $R => $N, $D
*/</p>
<p>function initClearlyComponent__next(_paramInstance)
{
    //  global instance reference {
    //  ===========================</p>
<p>        //  null; return
        if (_paramInstance); else { return false; }</p>
<p>        //  shorthand
        $N = _paramInstance;</p>
<p>    //  global instance reference }</p>
<p>    //  required vars {
    //  ===============</p>
<p>        //  the component instance object must already be created,
        //  when the init function is called. it must have these vars set:</p>
<p>        switch (true)
        {
            case (!($N.detectComponentInstance)):</p>
<p>            case (!($N.callbacks)):
            case (!($N.callbacks.newPageFound)):</p>
<p>                //  something's wrong
                return false;
        }</p>
<p>    //  required vars }</p>
<p>    //  missing settings {
    //  ==================</p>
<p>        if ($N.settings); else { $N.settings = {}; }</p>
<p>        //  names for stuff
        /* frames id */               if ($N.settings.onCreateNextPageFramesUseThisIdPrefix); else           { $N.settings.onCreateNextPageFramesUseThisIdPrefix =          'clearly_next_page_frame__'; }
        /* container id */            if ($N.settings.onCreateNextPagesContainerUseThisId); else             { $N.settings.onCreateNextPagesContainerUseThisId =            'clearly_next_pages_container'; }
        /* insert container css */    if ($N.settings.onCreateNextPagesContainerDoNotInsertCSS); else        { $N.settings.onCreateNextPagesContainerDoNotInsertCSS =       false; }
        /* frames attribute */        if ($N.settings.onLoadingNextPageFramesUseThisAttribute); else         { $N.settings.onLoadingNextPageFramesUseThisAttribute =        'clearly_next_page_loaded'; }
        /* frames attribute value */  if ($N.settings.onLoadingNextPageFramesUseThisAttributeValue); else    { $N.settings.onLoadingNextPageFramesUseThisAttributeValue =   'yes'; }</p>
<p>    //  missing settings }</p>
<p>    //  global vars {
    //  =============</p>
<p>        $D = $N.detectComponentInstance;
        $CJ = $D.jQuery;</p>
<p>        $N.pages = [];</p>
<p>    //  global vars }</p>
<p>    //  parse options {
    //  =============   </p>
<p>		$N.parseOptions =
		{
			'_next_page_keywords': [
                /* english */   'next page', 'next',
                /* german */    'vorw&#228;rts', 'weiter',
                /* japanese */  '&#27425;&#12408;'
			],</p>
<p>			'_next_page_keywords_not': [
			    /* english */   'article', 'story', 'post', 'comment', 'section', 'chapter'
			]
		};</p>
<p>    //  parse options }</p>
<p>    //  create next pages container {
    //  =============================</p>
<p>        $N.createNextPagesContainer = function ()
        {
            //  default id
            //  ==========
                _container_id = $N.settings.onCreateNextPagesContainerUseThisId;</p>
<p>            //	container
            //	=========
                var _containerElement = $D.document.createElement('div');
                    _containerElement.setAttribute('id', _container_id);</p>
<p>            //	css
            //	===
                if ($N.settings.onCreateNextPagesContainerDoNotInsertCSS); else
                {
                    var 
                        _cssElement = $D.document.createElement('style'),
                        _cssText = ''
                        +	'#'+_container_id+' { '
                        +		'margin: 0; padding: 0; border: none; '
                        +		'position: absolute; '
                        +		'width: 10px; height: 10px; '
                        +		'top: -100px; left: -100px; '
                        +	'} '
                        +	'#'+_container_id+' iframe { '
                        +		'margin: 0; padding: 0; border: none; '
                        +		'position: absolute; '
                        +		'width: 10px; height: 10px; '
                        +		'top: -100px; left: -100px; '
                        +	'} '
                    ;
                    _cssElement.setAttribute('id', _container_id + '__css');
                    _cssElement.setAttribute('type', 'text/css');
                    if (_cssElement.styleSheet) { _cssElement.styleSheet.cssText = _cssText; }
                        else { _cssElement.appendChild($D.document.createTextNode(_cssText)); }
                }</p>
<p>            //	write
            //	=====
                var _body = $D.document.getElementsByTagName('body')[0];
                    /* css */       if (_cssElement) { _body.appendChild(_cssElement); }
                    /* container */ _body.appendChild(_containerElement);</p>
<p>            //  set
            //  ===
                $N.nextPages = _containerElement;
                $N.$nextPages = $CJ($N.nextPages);
        };</p>
<p>    //  create next pages container }</p>
<p>	//  helpers {
	//  =========</p>
<p>        //  substr starting with the first slash after //
		$N.getURLPath = function (_url) { return _url.substr(_url.indexOf('/', (_url.indexOf('//') + 2))); };</p>
<p>        //  substr until the first slash after //
		$N.getURLDomain = function (_url) { return _url.substr(0, _url.indexOf('/', (_url.indexOf('//') + 2))); };</p>
<p>	//  helpers }</p>
<p>	//  load page {
	//  ===========</p>
<p>        $N.nextPage__loadToFrame = function (_pageNr, _nextPageURL)
        {
            //	do ajax
            //	=======
                $CJ.ajax
                ({
                    'url' : _nextPageURL,</p>
<p>                    'type' : 'GET',
                    'dataType' : 'html',
                    'async' : true,
                    'timeout': (10 * 1000),</p>
<p>                    //'headers': { 'Referrer': _nextPageURL },</p>
<p>                    'success' : function (_response, _textStatus, _xhr)	{ $N.nextPage__ajaxComplete(_pageNr, _response, _textStatus, _xhr); },
                    'error' : 	function (_xhr, _textStatus, _error)	{ $N.nextPage__ajaxError(_pageNr, _xhr, _textStatus, _error); }
                });
        };</p>
<p>        $N.nextPage__ajaxError = function (_pageNr, _xhr, _textStatus, _error) { };</p>
<p>        $N.nextPage__ajaxComplete = function (_pageNr, _response, _textStatus, _xhr)
        {
            //	valid?
            //	======
                if (_response > ''); else { return; }</p>
<p>            //	get html
            //	========
                var _html = _response;</p>
<p>                //	normalize
                //	=========
                    _html = _html.replace(/<\s+/gi, '<');
                    _html = _html.replace(/\s+>/gi, '>');
                    _html = _html.replace(/\s+\/>/gi, '/>');</p>
<p>                //	remove
                //	======
                    _html = _html.replace(/<script[^>]*?>([\s\S]*?)<\/script>/gi, '');
                    _html = _html.replace(/<script[^>]*?\/>/gi, '');
                    _html = _html.replace(/
<noscript[^>]*?>([\s\S]*?)<\/noscript>/gi, '');</p>
<p>            //	append frame
            //	============
                $N.$nextPages.append(''
                    + '<iframe'
                    + ' id="'+$N.settings.onCreateNextPageFramesUseThisIdPrefix+_pageNr+'"'
                    + ' scrolling="no" frameborder="0"'
                    + '></iframe>'
                );		</p>
<p>            //	write to frame
            //	==============
                var _doc = $N.$nextPages.find('#'+$N.settings.onCreateNextPageFramesUseThisIdPrefix+_pageNr).contents().get(0);
                    _doc.open();
                    _doc.write(_html);
                    _doc.close();</p>
<p>            //	add load handler
            //	================
                $N.$nextPages.find('#'+$N.settings.onCreateNextPageFramesUseThisIdPrefix+_pageNr).bind('load', function ()
                {
                    //  done?
                    if ($N.$nextPages.find('#'+$N.settings.onCreateNextPageFramesUseThisIdPrefix+_pageNr).attr($N.settings.onLoadingNextPageFramesUseThisAttribute) == $N.settings.onLoadingNextPageFramesUseThisAttributeValue) { return; }</p>
<p>                    //  can do?
                    var _doc = $N.$nextPages.find('#'+$N.settings.onCreateNextPageFramesUseThisIdPrefix+_pageNr).contents().get(0);
                    if (_doc); else { return; }
                    if (_doc.readyState == 'interactive' || _doc.readyState == 'complete'); else { return; }</p>
<p>                    //  mark
                    $N.$nextPages.find('#'+$N.settings.onCreateNextPageFramesUseThisIdPrefix+_pageNr).attr($N.settings.onLoadingNextPageFramesUseThisAttribute, $N.settings.onLoadingNextPageFramesUseThisAttributeValue);</p>
<p>                    // do
                    $N.nextPage__loadedInFrame(_pageNr, _doc.defaultView);                  
                });
        };</p>
<p>        $N.nextPage__loadedInFrame = function (_pageNr, _pageWindow)
        {
            //	find
            //	====
                var 
                    _found = $D.getContent__findInPage(_pageWindow),
                    _foundHTML = _found._html,
                    _removeTitleRegex = new RegExp($D.articleTitleMarker__start + '(.*?)' + $D.articleTitleMarker__end, 'i')
                ;</p>
<p>            //  get first fragment
            //  ==================
                var _firstFragment = $D.nextPage__getFirstFragment(_foundHTML);</p>
<p>                //  gets first 2000 characters
                //  diff set at 100 -- 0.05
                switch (true)
                {
                    case ($D.levenshteinDistance(_firstFragment, $N.nextPage__firstFragment__firstPage) < 100):
                    case ($D.levenshteinDistance(_firstFragment, $N.nextPage__firstFragment__lastPage) < 100):
                        //  break
                        return false;</p>
<p>                    default:
                        //  add to first fragemnts
                        $N.nextPage__firstFragment__lastPage = _firstFragment;
                        break;
                }</p>
<p>            //  remove title -- do it twice
            //  ============</p>
<p>                //  once with document title
                _foundHTML = $D.getContent__find__isolateTitleInHTML(_foundHTML, ($D.document.title > '' ? $D.document.title : ''));
                _foundHTML = _foundHTML.replace(_removeTitleRegex, '');</p>
<p>                //  once with article title
                _foundHTML = $D.getContent__find__isolateTitleInHTML(_foundHTML, $D.articleTitle);
                _foundHTML = _foundHTML.replace(_removeTitleRegex, '');</p>
<p>            //	return
            //	======
                var _page = {
                    '_url':         _pageWindow.location.href,
                    '_html':        _foundHTML,
                    '_elements':    [_found._targetCandidate.__node]
                };</p>
<p>                $N.pages.push(_page);
                if ($N.callbacks.newPageFound) { $N.callbacks.newPageFound(_page); }</p>
<p>            //	next
            //	====
                $N.nextPage__find(_pageWindow, _found._links);
        };</p>
<p>	//  load }</p>
<p>    //  find {
    //  ======</p>
<p>		$N.nextPage__find = function (_currentPageWindow, _linksInCurrentPage)
		{
			//	page id
				var _pageNr = ($N.pages.length + 1);</p>
<p>			//	get
			//	===
				var _possible = [];
				if (_possible.length > 0); else { _possible = $N.nextPage__find__possible(_currentPageWindow, _linksInCurrentPage, 0.5); }
				//if (_possible.length > 0); else { _possible = $N.nextPage__find__possible(_currentPageWindow, _linksInCurrentPage, 0.50); }</p>
<p>				//	none
				if (_possible.length > 0); else
					{ if ($D.debug) { $D.log('no next link found'); } return; }</p>
<p>				//  log
				if ($D.debug) { $D.log('possible next', _possible); }</p>
<p>			//	the one
			//	=======
				var _nextLink = false;</p>
<p>			//	next keyword?
			//	=============
				(function ()
				{
					if (_nextLink) { return; }</p>
<p>					for (var i=0, _i=_possible.length; i<_i; i++)
					{
						for (var j=0, _j=$N.parseOptions._next_page_keywords.length; j<_j; j++)
						{
							if (_possible[i]._caption.indexOf($N.parseOptions._next_page_keywords[j]) > -1)
							{
								//	length
								//	======
									if (_possible[i]._caption.length > $N.parseOptions._next_page_keywords[j].length * 2)
										{ continue; }</p>
<p>								//	not keywords
								//	============
									for (var z=0, _z=$N.parseOptions._next_page_keywords_not.length; z<_z; z++)
									{
										if (_possible[i]._caption.indexOf($N.parseOptions._next_page_keywords_not[z]) > -1)
											{ _nextLink = false; return; }
									}</p>
<p>								//	got it
								//	======
									_nextLink = _possible[i];
									return;
							}
						}
					}
				})();	</p>
<p>			//	caption matched page number
			//	===========================
				(function ()
				{
					if (_nextLink) { return; }</p>
<p>					for (var i=0, _i=_possible.length; i<_i; i++)
					{
						if (_possible[i]._caption == (''+_pageNr))
							{ _nextLink = _possible[i]; return; }
					}
				})();</p>
<p>			//	next keyword in title
			//	=====================
				(function ()
				{
					if (_nextLink) { return; }</p>
<p>					for (var i=0, _i=_possible.length; i<_i; i++)
					{
						//	sanity
						if (_possible[i]._title > ''); else { continue; }
						if ($D.measureText__getTextLength(_possible[i]._caption) <= 2); else { continue; }</p>
<p>						for (var j=0, _j=$N.parseOptions._next_page_keywords.length; j<_j; j++)
						{
							if (_possible[i]._title.indexOf($N.parseOptions._next_page_keywords[j]) > -1)
							{
								//	length
								//	======
									if (_possible[i]._title.length > $N.parseOptions._next_page_keywords[j].length * 2)
										{ continue; }</p>
<p>								//	not keywords
								//	============
									for (var z=0, _z=$N.parseOptions._next_page_keywords_not.length; z<_z; z++)
									{
										if (_possible[i]._title.indexOf($N.parseOptions._next_page_keywords_not[z]) > -1)
											{ _nextLink = false; return; }
									}</p>
<p>								//	got it
								//	======
									_nextLink = _possible[i];
									return;
							}
						}
					}
				})();</p>
<p>			//	return?
			//	=======
				if (_nextLink); else { return; }</p>
<p>			//	mark
			//	====
				if ($D.debug)
				{
					$D.debugOutline(_nextLink._node, 'target', 'next-page');
					$D.log('NextPage Link', _nextLink, _nextLink._node);
				}</p>
<p>			//	process page
			//	============
				$N.nextPage__loadToFrame(_pageNr, _nextLink._href);
		};</p>
<p>		$N.nextPage__find__possible = function (_currentPageWindow, _linksInCurrentPage, _distanceFactor)
		{
			var 
				_mainPageHref = $D.window.location.href,
				_mainPageDomain = $N.getURLDomain(_mainPageHref),
				_mainPagePath = $N.getURLPath(_mainPageHref)
			;</p>
<p>			var _links = $CJ.map
			(
				_linksInCurrentPage,
				function (_element, _index)
				{
					var 
						_href = _element.__node.href,
						_path = $N.getURLPath(_href),
						_title = (_element.__node.title > '' ? _element.__node.title.toLowerCase() : ''),
						_caption = _element.__node.innerHTML.replace(/<[^>]+?>/gi, '').replace(/\&#038;[^\&\s;]{1,10};/gi, '').replace(/\s+/gi, ' ').replace(/^ /, '').replace(/ $/, '').toLowerCase(),
						_distance = $D.levenshteinDistance(_mainPagePath, _path)
					;</p>
<p>					var _caption2 = '';
					for (var i=0, _i=_caption.length, _code=0; i<_i; i++)
					{
						_code = _caption.charCodeAt(i);
						_caption2 += (_code > 127 ? ('&#'+_code+';') : _caption.charAt(i));
					}
					_caption = _caption2;</p>
<p>					switch (true)
					{
						case (!(_href > '')):
						case (_mainPageHref.length > _href.length):
						case (_mainPageDomain != $N.getURLDomain(_href)):
						case (_href.substr(_mainPageHref.length).substr(0, 1) == '#'):
						case (_distance > Math.ceil(_distanceFactor * _path.length)):
							return null;</p>
<p>						default:
							//	skip if already loaded as next page
							for (var i=0, _i=$N.pages.length; i<_i; i++)
								{ if ($N.pages[i]._url == _href) { return null; } }</p>
<p>							//	return
							return {
								'_node': _element.__node,
								'_href': _href,
								'_title': _title,
								'_caption': _caption,
								'_distance': _distance
							};
					}
				}
			);</p>
<p>			//	sort -- the less points, the closer to position 0
			//	====
				_links.sort(function (a, b)
				{
					switch (true)
					{
						case (a._distance < b._distance): return -1;
						case (a._distance > b._distance): return 1;
						default: return 0;
					}
				});</p>
<p>			//	return
				return _links;
		};</p>
<p>    //  find }</p>
<p>    //  start {
    //  =======</p>
<p>        $N.start = function ()
        {
            //  first fragments
                $N.nextPage__firstFragment__firstPage = $D.nextPage__firstFragment__firstPage;
                $N.nextPage__firstFragment__lastPage = $D.nextPage__firstFragment__lastPage;</p>
<p>            //  first page
                $N.pages = [{ '_url': $D.window.location.href }];</p>
<p>            //  start
                $N.nextPage__find($D.window, $D.nextPage__firstLinks);
        };</p>
<p>    //  start }</p>
<p>    //  return self
    //  ===========
        return $N;
}
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/*!
 *  ClearlyComponent__reformat
 *  Evernote Clearly's display as an embeddable component.
 *  Copyright 2013, Evernote Corporation
 *
 *  Usage:
 *  ======
 *
 *      // define
 *      window.ClearlyComponent__reformat = {
 *          'callbacks': {
 *              'frameCreated': someFunction(),
 *              'pageAdded': someFunction(),
 *          },
 *
 *          'settings': { 
 *              'cssPath': 'string',
 *              'pageLabel': 'string'.
 *              'onCreateFrameUseThisId': 'string',
 *              'onCreateFrameDoNotInsertCSS': true
 *          },
 *
 *          'window': window,
 *          'document': document,
 *          'jQuery': window.jQuery
 *      };
 *
 *      // init -- will return false, if something goes wrong
 *      window.ClearlyComponent__reformat = initClearlyComponent__reformat(window.ClearlyComponent__reformat);
 *
 *      // create frame
 *      window.ClearlyComponent__detect.createFrame();
 *
 *      // apply options
 *      window.ClearlyComponent__detect.applyOptions(_options_object);
 *
 *      // add page
 *      window.ClearlyComponent__detect.addNewPage(_html, _source_url);
 *
 */</p>
<p>/*
    changes:
    ========
        $R => $R
        $R.win => $R.window</p>
<p>    to do:
    ======
*/</p>
<p>function initClearlyComponent__reformat(_paramInstance)
{
    //  global instance reference {
    //  ===========================</p>
<p>        //  null; return
        if (_paramInstance); else { return false; }</p>
<p>        //  shorthand
        $R = _paramInstance;</p>
<p>    //  global instance reference }</p>
<p>    //  required vars {
    //  ===============</p>
<p>        //  the component instance object must already be created,
        //  when the init function is called. it must have these vars set:</p>
<p>        switch (true)
        {
            case (!($R.settings)):
            case (!($R.settings.cssPath)):</p>
<p>            case (!($R.window)):
            case (!($R.document)):
            case (!($R.document.body)):</p>
<p>            case (!($R.jQuery)):</p>
<p>                if ($R.debug)
                {
                    console.log(!($R.settings));
                    console.log(!($R.settings.cssPath));</p>
<p>                    console.log(!($R.window));
                    console.log(!($R.document));
                    console.log(!($R.document.body));</p>
<p>                    console.log(!($R.jQuery));
                }</p>
<p>                //  something's wrong
                return false;
        }</p>
<p>    //  required vars }</p>
<p>    //  missing settings {
    //  ==================</p>
<p>        //  names for stuff
        /* frame id */            if ($R.settings.onCreateFrameUseThisId); else             { $R.settings.onCreateFrameUseThisId =            'clearly_frame'; }
        /* insert frame css */    if ($R.settings.onCreateFrameDoNotInsertCSS); else        { $R.settings.onCreateFrameDoNotInsertCSS =       false; }
        /* page label */          if ($R.settings.pageLabel); else                          { $R.settings.pageLabel =                         'Page '; }</p>
<p>    //  missing settings }</p>
<p>    //  global vars {
    //  =============</p>
<p>        $CJ = $R.jQuery;</p>
<p>        $R.$window = $CJ($R.window);
        $R.$document = $CJ($R.document);</p>
<p>        $R.pagesCount = 0;
        $R.footnotedLinksCount;</p>
<p>        /*
            .iframe, .$iframe
            .iframeWindow, .$iframeWindow
            .iframeDocument, .$iframeDocument
            .$iframeBackground, .$iframeBox, .$iframePages
        */</p>
<p>    //  global vars }</p>
<p>    //  debug {
    //  =======</p>
<p>        $R.debug = ($R.debug || false);
		$R.debugRemembered = {};
        $R.debugTimers = [];</p>
<p>		if ($R.debug)
		{
		    //  writeLog
		    //  ========
				switch (true)
				{
					case (!(!($R.window.console &#038;&#038; $R.window.console.log))):    $R.writeLog = function (msg) { $R.window.console.log(msg); };       break;
					case (!(!($R.window.opera &#038;&#038; $R.window.opera.postError))):  $R.writeLog = function (msg) { $R.window.opera.postError(msg); };   break;
					default:                                                    $R.writeLog = function (msg) {};                                    break;
				}</p>
<p>            //  log
            //  ===
                $R.log = function ()
                {
                    if ($R.debug); else { return; }
                    for (var i=0, il=arguments.length; i<il ; i++) { $R.writeLog(arguments[i]); }
                    $R.writeLog('-----------------------------------------');
                };</p>
<p>            //  remember
            //  ========
                $R.debugRemember = function (_k, _v)
                {
                    $R.debugRemembered[_k] = _v;
                };
		}
		else
		{
            $R.writeLog 		= function () { return false; };
            $R.log 				= function () { return false; };
            $R.debugRemember 	= function () { return false; };
        }</p>
<p>    //  debug }</p>
<p>    //  encode / decode {
    //  =================</p>
<p>		$R.encode = function (_string)
		{
			//	none
			if (_string == '') { return 'none'; }</p>
<p>			//	encode
			return encodeURIComponent(_string)
				.replace(/!/g, '%21')
				.replace(/'/g, '%27')
				.replace(/\(/g, '%28')
				.replace(/\)/g, '%29')
				.replace(/\*/g, '%2A')
			;
		};</p>
<p>		$R.decode = function (_string)
		{
			//	none
			if (_string == 'none') { return ''; }</p>
<p>			//	decode
			return decodeURIComponent(_string);
		};</p>
<p>    //  encode / decode }</p>
<p>    //  themes {
    //  ========</p>
<p>        (function ()
        {
            //  themes already set
            if ($R.availableThemes) { return; } </p>
<p>            //  set themes
            $R.availableThemes = {
                'newsprint': {
                    'text_font': 			$R.encode('"PT Serif"'),
                    'text_font_header': 	$R.encode('"PT Serif"'),
                    'text_font_monospace': 	$R.encode('Inconsolata'),
                    'text_size': 			$R.encode('16px'),
                    'text_line_height': 	$R.encode('1.5em'),
                    'box_width': 			$R.encode('36em'),
                    'color_background': 	$R.encode('#f3f2ee'),
                    'color_text': 			$R.encode('#1f0909'),
                    'color_links': 			$R.encode('#065588'),
                    'text_align': 			$R.encode('normal'),
                    'base': 				$R.encode('base__newsprint'),
                    'footnote_links': 		$R.encode('on_print'),
                    'large_graphics': 		$R.encode('do_nothing'),
                    'custom_css': 			$R.encode(''
                                            + '#text #articleHeader { border-color: #c5c5c5; }'
                                            + '#text #relatedNotes { border-color: rgba(197, 197, 197, 0.5); }'
                                            + '#text blockquote { border-color: #bababa; color: #656565; }'
                                            + '#text thead { background-color: #dadada; }'
                                            + '#text tr:nth-child(even) { background: #e8e7e7; }'
                                            + '#text hr { border-color: #c5c5c5; }')
                },
                'notable': {
                    'text_font': 			$R.encode('Helvetica, Arial'),
                    'text_font_header': 	$R.encode('Helvetica, Arial'),
                    'text_font_monospace': 	$R.encode('"Droid Sans Mono"'),
                    'text_size': 			$R.encode('14px'),
                    'text_line_height': 	$R.encode('1.5em'),
                    'box_width': 			$R.encode('42em'),
                    'color_background': 	$R.encode('#fff'),
                    'color_text': 			$R.encode('#333'),
                    'color_links': 			$R.encode('#090'),
                    'text_align': 			$R.encode('normal'),
                    'base': 				$R.encode('base__notable'),
                    'footnote_links': 		$R.encode('on_print'),
                    'large_graphics': 		$R.encode('do_nothing'),
                    'custom_css': 			$R.encode(''
                                            + '#text #articleHeader { border-color: #000; }'
                                            + '#text #relatedNotes { border-color: rgba(0, 0, 0, 0.25); }'
                                            + '#text h1 { color: #000; }'
                                            + '#text h2, #text h3, #text h4, #text h5, #text h6 { color: #444; }'
                                            + '#text blockquote { border-color: #d1d1d1; }'
                                            + '#text thead { background-color: #444; color: #fff; }'
                                            + '#text tr:nth-child(even) { background: #d1d1d1; }'
                                            + '#text hr { border-color: #000; }')
                },
                'night_owl': {
                    'text_font': 			$R.encode('"PT Serif"'),
                    'text_font_header': 	$R.encode('"PT Serif"'),
                    'text_font_monospace': 	$R.encode('Inconsolata'),
                    'text_size': 			$R.encode('16px'),
                    'text_line_height': 	$R.encode('1.5em'),
                    'box_width': 			$R.encode('36em'),
                    'color_background': 	$R.encode('#2d2d2d'),
                    'color_text': 			$R.encode('#e3e3e3'),
                    'color_links': 			$R.encode('#e3e3e3'),
                    'text_align': 			$R.encode('normal'),
                    'base': 				$R.encode('base__night_owl'),
                    'footnote_links': 		$R.encode('on_print'),
                    'large_graphics': 		$R.encode('do_nothing'),
                    'custom_css': 			$R.encode(''
                                            + '#text #articleHeader { border-color: #c5c5c5; }'
                                            + '#text #relatedNotes { border-color: rgba(197, 197, 197, 0.5); }'
                                            + '#text a:link { -webkit-transition: all 0.3s ease; -moz-transition: all 0.3s ease; -o-transition: all 0.3s ease; }'
                                            + '#text #relatedNotes a { -webkit-transition-duration: 0s; -moz-transition-duration: 0s; -o-transition-duration: 0s; }'
                                            + '#text a:hover, #text a:active {	color: #44bde8; }'
                                            + '#text blockquote { color: #c1bfbf; border-color: #c1bfbf; }'
                                            + '#text thead { background-color: #4f4f4f; }'
                                            + '#text tr:nth-child(even) { background: #404040; }'
                                            + '#text hr { border-color: #c5c5c5; }')
                }
            };
        })();</p>
<p>    //  themes }</p>
<p>    //  font sizes {
    //  ============</p>
<p>        (function ()
        {
            //  font sizes already set
            if ($R.availableFontSizes) { return; } </p>
<p>            //  set font sizes
            $R.availableFontSizes = {
                'small':    { 'newsprint': '12px', 'notable': '12px', 'night_owl': '12px' },
                'medium':   { 'newsprint': '16px', 'notable': '16px', 'night_owl': '16px' },
                'large':    { 'newsprint': '20px', 'notable': '20px', 'night_owl': '20px' }
            };
        })();</p>
<p>    //  font sizes }</p>
<p>    //  google fonts {
    //  ==============</p>
<p>        (function ()
        {
            //  google fonts already set
            if ($R.availableGoogleFonts) { return; }</p>
<p>            //  set google fonts to these
            var __google_fonts_array = [
                /* serif */ 'Arvo', 'Bentham', 'Cardo', 'Copse', 'Corben', 'Crimson Text', 'Droid Serif', 'Goudy Bookletter 1911', 'Gruppo', 'IM Fell', 'Josefin Slab', 'Kreon', 'Meddon', 'Merriweather', 'Neuton', 'OFL Sorts Mill Goudy TT', 'Old Standard TT', 'Philosopher', 'PT Serif', 'Radley', 'Tinos', 'Vollkorn',
                /* sans  */ 'Allerta', 'Anton', 'Arimo', 'Bevan', 'Buda', 'Cabin', 'Cantarell', 'Coda', 'Cuprum', 'Droid Sans', 'Geo', 'Josefin Sans', 'Lato', 'Lekton', 'Molengo', 'Nobile', 'Orbitron', 'PT Sans', 'Puritan', 'Raleway', 'Syncopate', 'Ubuntu', 'Yanone Kaffeesatz',
                /* fixed */ 'Anonymous Pro', 'Cousine', 'Droid Sans Mono', 'Inconsolata'
            ];</p>
<p>            //  set
            $R.availableGoogleFonts = {};
            for (var i=0, ii=__google_fonts_array.length; i<ii; i++){
                $R.availableGoogleFonts[__google_fonts_array[i]] = 1;
            }
        })();</p>
<p>    //  google fonts }</p>
<p>    //  default options {
    //  =================</p>
<p>        $R.defaultOptions = 
        {
            'text_font': 			$R.encode('"PT Serif"'),
            'text_font_header': 	$R.encode('"PT Serif"'),
            'text_font_monospace': 	$R.encode('Inconsolata'),
            'text_size': 			$R.encode('16px'),
            'text_line_height': 	$R.encode('1.5em'),
            'box_width': 			$R.encode('36em'),
            'color_background': 	$R.encode('#f3f2ee'),
            'color_text': 			$R.encode('#1f0909'),
            'color_links': 			$R.encode('#065588'),
            'text_align': 			$R.encode('normal'),            /* normal, justified */
            'base': 				$R.encode('base__newsprint'),   /* base__ newsprint, notable, night_owl */
            'footnote_links': 		$R.encode('on_print'),          /* on_print, always, never */
            'large_graphics': 		$R.encode('do_nothing'),        /* do_nothing, hide_on_print, hide_always */
            'custom_css': 			('')
        };</p>
<p>    //  default options }</p>
<p>    //  get css from options {
    //  ======================</p>
<p>        $R.getCSSFromOptions = function (_options)
        {
            var _cssText = (''
            +	'#body { '
            +		'font-family: [=text_font]; '
            +		'font-size: [=text_size]; '
            +		'line-height: [=text_line_height]; '
            +		'color: [=color_text]; '
            +		'text-align: '+(_options['text_align'] == 'justified' ? 'justify' : 'left')+'; '
            +	'} '</p>
<p>            +	'#background { background-color: [=color_background]; } '</p>
<p>            +	'.setTextColorAsBackgroundColor { background-color: [=color_text]; } '
            +	'.setBackgroundColorAsTextColor { color: [=color_background]; } '</p>
<p>            +	'#box, .setBoxWidth { width: [=box_width]; } '</p>
<p>            +	'a { color: [=color_links]; } '
            +	'a:visited { color: [=color_text]; } '</p>
<p>            +	'@media print { body.footnote_links__on_print a, body.footnote_links__on_print a:hover { color: [=color_text] !important; text-decoration: none !important; } } '
            +	'body.footnote_links__always a, body.footnote_links__always a:hover { color: [=color_text] !important; text-decoration: none !important; } '</p>
<p>            +	'img { border-color: [=color_text]; } '
            +	'a img { border-color: [=color_links]; } '
            +	'a:visited img { border-color: [=color_text]; } '</p>
<p>            +	'h1 a, h2 a, a h1, a h2 { color: [=color_text]; } '
            +	'h1, h2, h3, h4, h5, h6 { font-family: [=text_font_header]; } '</p>
<p>            +	'pre { background-color: [=color_background]; } '
            +	'pre, code { font-family: [=text_font_monospace]; } '
            +	'hr { border-color: [=color_text]; } '</p>
<p>            +	'html.rtl #body #text { text-align: ' + (_options['text_align'] == 'justified' ? 'justify' : 'right')+' !important; } '
            +	'h1, h2, h3, h4, h5, h6 { text-align: left; } '
            +	'html.rtl h1, html.rtl h2, html.rtl h3, html.rtl h4, html.rtl h5, html.rtl h6 { text-align: right !important; } '</p>
<p>            +	'[=custom_css] '
            ).replace(
                /\[=([a-z_]+?)\]/gi,
                function (_match, _key) { return _options[_key]; }
            );</p>
<p>            return _cssText;
        }</p>
<p>    //  get css from options }</p>
<p>    //  apply options {
    //  ===============</p>
<p>        //	var
        //	===</p>
<p>            //  _encodedOptions and _decodeOptions hold the options to be applied
            //	$R.appliedOptions holds the options currently applied (encoded)
            //	$R.loadedGoogleFonts holds the  currently loaded Google fonts URLs</p>
<p>            $R.appliedOptions = {};
            $R.loadedGoogleFonts = {};</p>
<p>        //	apply options
        //	=============
            $R.applyOptions = function (_encodedOptions)
            {
                //  possible options
                //  =================
                    var _possible_options = $R.defaultOptions;</p>
<p>                //  our themes        
                //  ==========
                    var _ourOwnThemes = '|theme-1|theme-2|theme-3|';</p>
<p>                //	null
                //	====
                    if (_encodedOptions); else { _encodedOptions = {}; }</p>
<p>                //  blank, invalid
                //  ==============
                    for (var _option in _possible_options)
                    {
                        switch (true)
                        {
                            case (!(_option in _encodedOptions)):
                            case (!(_encodedOptions[_option] > '')):
                                //  either current, or default
                                _encodedOptions[_option] = ($R.appliedOptions[_option] ? $R.appliedOptions[_option] : _possible_options[_option]);
                                break;
                        }
                    }</p>
<p>                //	what to do
                //	==========</p>
<p>                    var 
                        _resetBase = false,
                        _resetOptions = false, 
                        _decodedOptions = {}
                    ;</p>
<p>                //  set stuff
                //  =========</p>
<p>                    //	_resetBase
                    switch (true)
                    {
                        case (!('base' in  $R.appliedOptions)):
                        case (!(_encodedOptions['base'] == $R.appliedOptions['base'])):
                            _resetBase = true;
                            break;
                    }</p>
<p>                    //	_resetOptions
                    for (var _option in _possible_options)
                    {
                        switch (true)
                        {
                            case (!(_option in $R.appliedOptions)):
                            case (!(_encodedOptions[_option] == $R.appliedOptions[_option])):
                                _resetOptions = true;
                                break;
                        }</p>
<p>                        //	stop
                        if (_resetOptions) { break; }
                    }	</p>
<p>                    //	appliedOptions and optionsToApply
                    for (var _option in _possible_options)
                    {
                        $R.appliedOptions[_option] = _encodedOptions[_option];
                        _decodedOptions[_option] = $R.decode(_encodedOptions[_option]);
                    }</p>
<p>                //	apply stuff
                //	===========</p>
<p>                    //  base
                    if (_resetBase)
                    {
                        //	remove old
                        $R.$iframeDocument.find('#baseCSS').remove();</p>
<p>                        //	add new
                        if (_decodedOptions['base'] > '')
                        {
                            $R.$iframeDocument.find('head').append(''
                                + '	
<link id="baseCSS" href="'
                                + $R.settings.cssPath + _decodedOptions['base']+'.css'
                                + '" rel="stylesheet" type="text/css" />'
                            );
                        }
                    }</p>
<p>                    //	options
                    if (_resetOptions)
                    {
                        var _cssText = $R.getCSSFromOptions(_decodedOptions);</p>
<p>                        //	remove old
                        //	==========
                            $R.$iframeDocument.find('#optionsCSS').remove();</p>
<p>                        //	new
                        //	===
                            var _cssElement = document.createElement('style');
                                _cssElement.setAttribute('type', 'text/css');
                                _cssElement.setAttribute('id', 'optionsCSS');</p>
<p>                            if (_cssElement.styleSheet) { _cssElement.styleSheet.cssText = _cssText; }
                                else { _cssElement.appendChild(document.createTextNode(_cssText)); }</p>
<p>                            $R.$iframeDocument.find('head').append(_cssElement);</p>
<p>                        //	body classes
                        //	============
                            $R.$iframeDocument.find('body')
                                .removeClass('footnote_links__on_print footnote_links__always footnote_links__never')
                                .removeClass('large_graphics__do_nothing large_graphics__hide_on_print large_graphics__hide_always')
                                .addClass('footnote_links__'+_decodedOptions['footnote_links'])
                                .addClass('large_graphics__'+_decodedOptions['large_graphics'])
                            ;
                    }	
            };</p>
<p>    //  apply options }</p>
<p>    //  apply google fonts  {
    //  =====================</p>
<p>        $R.getGoogleFontsFromOptions = function (_options)
        {
            var 
                _fonts = {},
                _fonts_urls = [],
                _check_font = function (_match, _font) {
                    if (_font in $R.availableGoogleFonts) { _fonts[_font] = 1; }
                }
            ;</p>
<p>            //	body
            //	====
                _options['text_font'].replace(/"([^",]+)"/gi, _check_font);
                _options['text_font'].replace(/([^",\s]+)/gi, _check_font);				</p>
<p>            //	headers
            //	=======
                _options['text_font_header'].replace(/"([^",]+)"/gi, _check_font);
                _options['text_font_header'].replace(/([^",\s]+)/gi, _check_font);				</p>
<p>            //	monospace
            //	=========
                _options['text_font_monospace'].replace(/"([^",]+)"/gi, _check_font);
                _options['text_font_monospace'].replace(/([^",\s]+)/gi, _check_font);				</p>
<p>            //	custom css
            //	==========
                _options['custom_css'].replace(/font-family: "([^",]+)"/gi, _check_font);
                _options['custom_css'].replace(/font-family: ([^",\s]+)/gi, _check_font);</p>
<p>            //	return
            //	======</p>
<p>                //	transform to array
                for (var _font in _fonts)
                {
                    _fonts_urls.push(''
                        + 'http://fonts.googleapis.com/css?family='
                        + _font.replace(/\s+/g, '+')
                        + ':regular,bold,italic'
                    );
                }</p>
<p>                //	return
                return _fonts_urls;
        };</p>
<p>        $R.loadGoogleFontsRequiredByAppliedOptions = function ()
        {
            //  decode options
            var _decodedOptions = {};
            for (var _option in $R.appliedOptions)
                { _decodedOptions[_option] = $R.decode($R.appliedOptions[_option]); }</p>
<p>            //	get
            var _fonts_urls = $R.getGoogleFontsFromOptions(_decodedOptions);</p>
<p>            //	apply
            for (var i=0,_i=_fonts_urls.length; i<_i; i++) {
                /* loaded */    if ($R.loadedGoogleFonts[_fonts_urls[i]]) { continue; }
                /* load */      $R.$iframeDocument.find('head').append('	
<link href="'+_fonts_urls[i]+'" rel="stylesheet" type="text/css" />');
                /* mark */      $R.loadedGoogleFonts[_fonts_urls[i]] = 1;
            }
        };</p>
<p>    //  apply google fonts }</p>
<p>    //  create frame {
    //  ==============</p>
<p>        $R.createFrame = function ()
        {
            //  default id
            //  ==========
                _frame_id = $R.settings.onCreateFrameUseThisId;</p>
<p>            //	iframe
            //	======
                var
                    _iframeElement = $R.document.createElement('div'),
                    _iframeHTML = ''
                    +	'</p>
<div id="html">'
                    +	    '</p>
<div id="body">'
                    +	    	'</p>
<div id="bodyContent">'</p>
<p>                    +	            '</p>
<div id="box">'
                    +	    	        '</p>
<div id="box_inner">'
                    +	    		        '</p>
<div id="text">'
                    +	    			        '</p>
<div id="pages"></div>
<p>'
                    +	    			        '</p>
<ol id="footnotedLinks"></ol>
<p>'
                    +	    		        '</p></div>
<p>'
                    +	    	        '</p></div>
<p>'
                    +	            '</p></div>
<p>'
                    +	            '</p>
<div id="background"></div>
<p>'
                    +           '</p></div>
<p>'
                    +	    '</p></div>
<p>'
                    +	'</p></div>
<p>'
                ;
                _iframeElement.setAttribute('id', _frame_id);</p>
<p>            //	css
            //	===</p>
<p>                if ($R.settings.onCreateFrameDoNotInsertCSS); else
                {
                    var 
                        _cssElement = $R.document.createElement('style'),
                        _cssText = ''
                        +	'#'+_frame_id+' { '
                        +		'margin: 0; padding: 0; border: none; '
                        +		'position: absolute; '
                        +		'width: 10px; height: 10px; '
                        +		'top: -100px; left: -100px; '
                        +	'} '
                    ;
                    _cssElement.setAttribute('id', _frame_id + '__css');
                    _cssElement.setAttribute('type', 'text/css');
                    if (_cssElement.styleSheet) { _cssElement.styleSheet.cssText = _cssText; }
                        else { _cssElement.appendChild($R.document.createTextNode(_cssText)); }
                }</p>
<p>            //	write
            //	=====</p>
<p>                var _body = $R.document.getElementsByTagName('body')[0];
                    /* css */   if (_cssElement) { _body.appendChild(_cssElement); }
                    /* frame */ _body.appendChild(_iframeElement);</p>
<p>                var _iframe = $R.document.getElementById(_frame_id);
                var _doc;
                _iframe.innerHTML = _iframeHTML;</p>
<p>            //  callback &#038; variables
            //  ====================
                var _check_interval = false;
                var _check = function ()
                {
                    //  iframe
                        var _iframe = $R.document.getElementById(_frame_id);
                        if (_iframe); else { return; }</p>
<p>                    //  body
                        var _body = $CJ(_iframe).find('#bodyContent')[0];</p>
<p>                        if (_body); else { return; }</p>
<p>                    //  clear interval
                        $R.window.clearInterval(_check_interval);</p>
<p>                    //  global vars
                        $R.iframe = _iframe;
                        $R.$iframe = $CJ($R.iframe);</p>
<p>                        $R.iframeDocument = _iframe;
                        $R.$iframeDocument = $CJ($R.iframeDocument);</p>
<p>                        $R.iframeWindow = _iframe;
                        $R.$iframeWindow = $CJ($R.iframeWindow);</p>
<p>                        $R.$iframeBox = $R.$iframeDocument.find('#box');
                        $R.$iframePages = $R.$iframeDocument.find('#pages');
                        $R.$iframeBackground = $R.$iframeDocument.find('#background');
                        $R.$iframeFootnotedLinks = $R.$iframeDocument.find('#footnotedLinks');</p>
<p>                    //  callback
                        if ($R.callbacks.frameCreated) { $R.callbacks.frameCreated(); }
                };</p>
<p>                //  set interval
                _check_interval = $R.window.setInterval(_check, 250);
        };</p>
<p>    //  create frame }</p>
<p>    //  add page {
    //  ==========</p>
<p>        $R.addNewPage = function (_pageHTML, _pageURL)
        {
            //  update page count
            //  =================
                var _pageNr = $R.pagesCount + 1;
                $R.pagesCount++;</p>
<p>            //	separator
            //	=========
                if (_pageNr > 1)
                {
                    $R.$iframePages.append(''
                        + '</p>
<div class="pageSeparator">'
                        +	'</p>
<div class="pageSeparatorLine setTextColorAsBackgroundColor"></div>
<p>'
                        + 	'</p>
<div class="pageSeparatorLabel"><em>'+$R.settings.pageLabel+_pageNr+'</em></div>
<p>'
                        + '</p></div>
<p>'
                    );
                }</p>
<p>            //	append page
            //	===========
                $R.$iframePages.append(''
                    + '</p>
<div class="page" id="page'+_pageNr+'">'
                    +     '</p>
<div class="page_content">'
                    + 	      _pageHTML
                    +     '</div>
<p>'
                    + '</p></div>
<p>'
                );</p>
<p>            //  this new page
            //  =============</p>
<p>                //  cache
                var _$page = $R.$iframeDocument.find('#page'+_pageNr);</p>
<p>                //	links as footnotes
                _$page.find('a').each(function (_index, _element)
                {
                    //	check
                    var _href = _element.href;
                    if (_href > ''); else { return; }
                    if (_href.indexOf); else { return; }
                    if (_href.indexOf('#') > -1) { return; }</p>
<p>                    //	count
                    var _nr = ++$R.footnotedLinksCount;</p>
<p>                    //	add
                    $CJ(_element).append(' <sup class="readableLinkFootnote">['+_nr+']</sup>');
                    $R.$iframeFootnotedLinks.append('</p>
<li>'+_href+'</li>
<p>');
                });
        };</p>
<p>    //  add page }</p>
<p>    //  clear all pages {
    //  =================</p>
<p>        $R.clearAllPages = function ()
        {
            //  reset pages count
            $R.pagesCount = 0;</p>
<p>            //  delete all pages
            $R.$iframePages.get(0).innerHTML = '';</p>
<p>            //  reset footnote count
            $R.footnotedLinksCount = 0;</p>
<p>            //  delete all footnotes
            $R.$iframeFootnotedLinks.get(0).innerHTML = '';
        };</p>
<p>    //  clear all pages }</p>
<p>    //  return self
    //  ===========
        return $R;
}
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ClearlyController = {
    _created : false,
    _visible : false,
    _logEnabled : false,
    _detectResult : null,</p>
<p>    logger : function(text) {
        if (!this._logEnabled) return;
        console.log('[Clearly] : ' + text);
    },</p>
<p>    getSimplifiedArticle : function() {
        this.logger('getSimplifiedArticle()');
        return Evernote.JQuery('#evernoteClearlyArticle #box #text').get(0);
    },</p>
<p>    changeFrameClassTo : function(className) {
        this.clearlyFrame[0].className = '';
        this.clearlyFrame.addClass(className);
    },</p>
<p>    hide : function() {
        this.logger('hide()');
        var self = this;
        if (this._created &#038;&#038; this._visible) {
            this.clearlyBackground.stop();
            this.changeFrameClassTo('processing');
            this.clearlyBackground.animate({right:'100%'}, 500, null,
                function() {
                    self.changeFrameClassTo('temphidden');
                    window.focus();
                }
            );
            this._visible = false;
        }
    },</p>
<p>    show : function() {
        this.logger('show()');
        var self = this;
        if (this._created &#038;&#038; !this._visible) {
            this.clearlyBackground.stop();
            this.changeFrameClassTo('processing');
            this.clearlyBackground.animate({ right: "0px" }, 500, null,
                function() {
                    self.changeFrameClassTo('visible');
                    window.focus();
                }
            );
            this._visible = true;
        }
    },</p>
<p>    detectComponent : function(callback) {
        this.logger('detectComponent()');
        window.ClearlyComponent__detect = {
            callbacks: {
                finished: function(data) {
                    if (callback) callback(data);
                }
            },
            window: window,
            document: document,
            jQuery: Evernote.JQuery
        };</p>
<p>        window.ClearlyComponent__detect = initClearlyComponent__detect(window.ClearlyComponent__detect);
        window.ClearlyComponent__detect.start();
    },</p>
<p>    reformatComponent : function(callback){
        this.logger('reformatComponent()');
        window.ClearlyComponent__reformat = {
            callbacks: {
                frameCreated: function(data) {
                    if (callback) callback(data);
                }
            },
            settings: {
                cssPath: 'css/clearly',
                pageLabel: "page ",
                onCreateFrameUseThisId: "evernoteClearlyArticle",
                onCreateFrameDoNotInsertCSS: true
            },
            window: window,
            document: document,
            jQuery: Evernote.JQuery
        };</p>
<p>        window.ClearlyComponent__reformat = initClearlyComponent__reformat(window.ClearlyComponent__reformat);
        window.ClearlyComponent__reformat.createFrame();
    },</p>
<p>    getContentElementAndHTML : function (callback) {
        this.logger('getContentElementAndHTML()');
        this.detectComponent(callback);
    },</p>
<p>    getClearlyArticleText : function(callback) {
        this.logger('getClearlyArticleText()');
        this.detectComponent(callback);
    },</p>
<p>    assignClearlyArticleContent : function()  {
        this.logger('showClearlyArticleContent()');
        window.ClearlyComponent__reformat.$iframeBox.find('#text #pages')[0].innerHTML = this._detectResult;
    },</p>
<p>    setContainersSize : function() {
        var maxHeight = Math.max(document.body.scrollHeight, this.clearlyFrame.scrollHeight);</p>
<p>        try { //old ie throws error
            this.clearlyFrame[0].style.height = maxHeight + "px";
        } catch (e) {</p>
<p>        }
    },</p>
<p>    startClearly : function() {
        this.logger('startClearly()');</p>
<p>        var self = this;</p>
<p>        if (this._created) {
            self.show();
            return;
        }</p>
<p>        function onDetectEnd(data) {
            self._detectResult = data._html.replace(/(id|class)="(.*?)"/ig,'cid="$2"');
            self.assignClearlyArticleContent();
            self.show();
        }</p>
<p>        function onFrameCreated() {
            self.clearlyFrame = window.ClearlyComponent__reformat.$iframe;
            self.clearlyBackground = window.ClearlyComponent__reformat.$iframeBackground;
            self._created = true;
            self.setContainersSize();
            self.detectComponent(onDetectEnd);
        }</p>
<p>        window.scrollTo(0,0);
        this.reformatComponent(onFrameCreated);
    },</p>
<p>    isReady : function() {
        return this._created;
    },</p>
<p>    isVisible : function() {
        return this._visible;
    },</p>
<p>    highlight : function () {
        this.logger('highlight()');
        var numTextHighlights;</p>
<p>        window.ClearlyComponent__highlight = {
            callbacks: {
                highlightAdded: function() {
                    numTextHighlights++;
                },
                highlightDeleted: function() {
                    numTextHighlights--;
                }
            },
            settings: {
                imgPath: "images/"
            },
            window: window,
            document: document,
            jQuery: Evernote.JQuery
        };</p>
<p>        window.ClearlyComponent__highlight = initClearlyComponent__highlight(window.ClearlyComponent__highlight);
        window.ClearlyComponent__highlight.insertCSS();
        window.ClearlyComponent__highlight.addMouseHandlers();</p>
<p>        window.ClearlyComponent__highlight.enable();
    },</p>
<p>    disableHighlight : function() {
        this.logger('disableHighlight()');
        if (window.ClearlyComponent__highlight) {
            window.ClearlyComponent__highlight.disable();
        }
    },</p>
<p>    removeHighlighted : function() {
        this.logger('removeHighlighed()');
//        Evernote.JQuery('.clearly_highlight_delete_element').click();
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/**
 * SelectionFinder provides mechanism for finding selection on the page via
 * find(). It is able to traverse frames in order to find a selection. It will
 * report whether there's a selection via hasSelection(). After doing find(),
 * the selection is stored in the selection property, and the document property
 * will contain the document in which the selection was found. Find method will
 * only recurse documents if it was invoked as find(true), specifying to do
 * recursive search. You can use reset() to undo find().
 */
Evernote.SelectionFinder = function SelectionFinder( doc ) {
    this._document = doc;
};</p>
<p>Evernote.SelectionFinder.prototype._document = null;
Evernote.SelectionFinder.prototype._selection = null;</p>
<p>Evernote.SelectionFinder.prototype.hasSelection = function() {
    Evernote.Logger.debug( "SelectionFinder.hasSelection()" );</p>
<p>    var range = Evernote.Utils.fixIERangeObject(this.getRange());
    return range &#038;&#038; (range.startContainer != range.endContainer
        || (range.startContainer == range.endContainer &#038;&#038; range.startOffset != range.endOffset));
};</p>
<p>Evernote.SelectionFinder.prototype.find = function( deep ) {
    Evernote.Logger.debug( "SelectionFinder.find()" );
    var result = this.findSelectionInDocument( this._document, deep );
    this._document = result.document;
    this._selection = result.selection;
};</p>
<p>Evernote.SelectionFinder.prototype.getRange = function() {
    Evernote.Logger.debug( "SelectionFinder.getRange()" );
    if ( !this._selection || this._selection.rangeCount == 0 ) {
        return null;
    }</p>
<p>    if ( typeof this._selection.getRangeAt == 'function' ) {
        return this._selection.getRangeAt( 0 );
    }</p>
<p>    if ( (window.Range &#038;&#038; this._selection instanceof window.Range) || !this._selection.anchorNode ) {
        return this._selection;
    }
    var range = this._document.createRange();
    range.setStart( this._selection.anchorNode, this._selection.anchorOffset );
    range.setEnd( this._selection.focusNode, this._selection.focusOffset );</p>
<p>    return range;
};</p>
<p>Evernote.SelectionFinder.prototype.findSelectionInDocument = function( doc, deep ) {
    try {
        Evernote.Logger.debug( "SelectionFinder.findSelectionInDocument()" );</p>
<p>        var sel = null;
        var hasSelection = false;
        var win = null;</p>
<p>        try {
            win = (doc.defaultView) ? doc.defaultView : window;
        }
        catch ( e ) {
            win = window;
        }
        if ( typeof win.getSelection == 'function' ) {
            sel = win.getSelection();
            if ( sel &#038;&#038; typeof sel.rangeCount != 'undefined' &#038;&#038; sel.rangeCount > 0 ) {
                Evernote.Logger.debug("Found selection by win.getSelection()");
                hasSelection = true;
            }
        }
        else if ( win.selection &#038;&#038; typeof win.selection.createRange == 'function' ) {
            sel = win.selection.createRange();
            if ( win.selection.type == 'Text' &#038;&#038; typeof sel.htmlText == 'string' &#038;&#038; sel.htmlText.length > 0 ) {
                Evernote.Logger.debug("Found selection by win.selection");
                hasSelection = true;
            }
        }
        else if ( doc.selection &#038;&#038; (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') &#038;&#038; (typeof sel.htmlText == 'string') &#038;&#038; (sel.htmlText.length > 0) ) {
                Evernote.Logger.debug("Found selection by doc.selection");
                hasSelection = true;
            }
        }</p>
<p>        if ( sel &#038;&#038; !hasSelection &#038;&#038; deep ) {
            var nestedDocs = Evernote.Utils.getNestedDocuments( doc );
            for ( var i = 0; i < nestedDocs.length; ++i ) {
                if ( nestedDocs[ i ] ) {
                    var framedSel = this.findSelectionInDocument( nestedDocs[ i ], deep );
                    if ( framedSel &#038;&#038; framedSel.selection &#038;&#038; framedSel.selection.rangeCount > 0 ) {
                        return framedSel;
                    }
                }
            }
        }</p>
<p>        //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 );</p>
<p>        var activeEl = doc.activeElement &#038;& false; // disabled, because no need to search selections in this elements.
        if ( activeEl &#038;&#038; ( (window.HTMLInputElement &#038;&#038; (activeEl instanceof window.HTMLInputElement &#038;&#038; activeEl.type == "text")) || ( window.HTMLTextAreaElement &#038;&#038; (activeEl instanceof window.HTMLTextAreaElement)) ) ) {
            if ( activeEl.selectionStart != activeEl.selectionEnd ) {
                var range = doc.createRange();
                var textNode = doc.createTextNode( activeEl.value );</p>
<p>                range.setStart( textNode, activeEl.selectionStart );
                range.setEnd( textNode, activeEl.selectionEnd );
                sel = range;
            }
        }</p>
<p>        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
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.JSSerializer = {</p>
<p>    _selectionFinder : new Evernote.SelectionFinder(window.document),</p>
<p>    serializeAsync : function( element, fullPage, callback ) {
        try {
            var start = new Date().getTime();
            var root = element || document.body.parentNode || document.body;
            var serializer = new Evernote.NodeSerializer( window, new Evernote.ClipFullStylingStrategy() );
            var parser = new Evernote.DomParser( window, null );</p>
<p>            var resultFunc = function() {
                var images = [];
                var imageUrls = serializer.getImagesUrls();</p>
<p>                for(var i = 0; i < imageUrls.length; i++) {
                    images.push(Evernote.Utils.makeAbsolutePath(serializer.getDocumentBase(), imageUrls[i]).replace(/\s/g, "%20"));
                }
                callback( {
                    content : serializer.getSerializedDom(),
                    imageUrls : images,
                    docBase : serializer.getDocumentBase()
                    });
            };
            parser.parseAsync( root, fullPage ? true: false, serializer, resultFunc);
            var end = new Date().getTime();
            Evernote.Logger.debug( "Clip.clipFullPage(): clipped body in " + (end - start) + " milliseconds" );
        }
        catch ( e ) {
            Evernote.Logger.error( "JSSerializer.serialize() failed: error = " + e );
            throw e;
        }
    },</p>
<p>    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();</p>
<p>            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;
        }
    },</p>
<p>    serializeSelectionAsync : function( range, callback ) {</p>
<p>        try {
            if( !range ) {
                if ( !this.hasSelection() ) {
                    Evernote.Logger.warn( "JSSerializer.serializeSelection(): no selection to clip" );
                    callback();
                    return;
                }</p>
<p>                range = Evernote.Utils.fixIERangeObject(this._selectionFinder.getRange());</p>
<p>                if ( !range ) {
                    Evernote.Logger.warn( "JSSerializer.serializeSelection(): no range in selection" );
                    callback();
                    return;
                }
            }</p>
<p>            var start = new Date().getTime();
            var ancestor = (this._styleStrategy &#038;&#038; Evernote.Utils.Selection.getCommonAncestorContainer(range).nodeType == Evernote.Node.TEXT_NODE
                &#038;&#038; Evernote.Utils.Selection.getCommonAncestorContainer(range).parentNode) ? Evernote.Utils.Selection.getCommonAncestorContainer(range).parentNode : Evernote.Utils.Selection.getCommonAncestorContainer(range);</p>
<p>            while ( typeof Evernote.ClipRules.NON_ANCESTOR_NODES[ ancestor.nodeName.toUpperCase() ] != 'undefined' &#038;&#038; ancestor.parentNode ) {
                if ( ancestor.nodeName.toUpperCase() == "BODY" ) {
                    break;
                }
                ancestor = ancestor.parentNode;
            }</p>
<p>            var serializer = new Evernote.NodeSerializer( window, new Evernote.ClipFullStylingStrategy(), null, true );
            var parser = new Evernote.DomParser(window, Evernote.Utils.fixIERangeObject(range));</p>
<p>            var resultFunc = function() {
                var images = [];
                var imageUrls = serializer.getImagesUrls();</p>
<p>                for(var i = 0; i < imageUrls.length; i++) {
                    images.push(Evernote.Utils.makeAbsolutePath(serializer.getDocumentBase(), imageUrls[i]).replace(/\s/g, "%20"));
                }</p>
<p>                callback( {
                    content : serializer.getSerializedDom(),
                    imageUrls : images,
                    docBase : serializer.getDocumentBase()
                } );
            };
            parser.parseAsync( ancestor, false, serializer, resultFunc );
            var end = new Date().getTime();
            Evernote.Logger.debug( "JSSerializer.serializeSelection(): clipped selection in " + (end - start) + " milliseconds" );
        }
        catch ( e ) {
            Evernote.Logger.error( "JSSerializer.serializeSelection() failed: error = " + e );
            throw e;
        }
    },</p>
<p>    serializeSelection : function( range ) {
        try {
            if( !range ) {
                if ( !this.hasSelection() ) {
                    Evernote.Logger.warn( "JSSerializer.serializeSelection(): no selection to clip" );
                    return;
                }</p>
<p>                range = Evernote.Utils.fixIERangeObject(this._selectionFinder.getRange());</p>
<p>                if ( !range ) {
                    Evernote.Logger.warn( "JSSerializer.serializeSelection(): no range in selection" );
                    return;
                }
            }</p>
<p>            var start = new Date().getTime();
            var ancestor = (this._styleStrategy &#038;&#038; Evernote.Utils.Selection.getCommonAncestorContainer(range).nodeType == Evernote.Node.TEXT_NODE
                &#038;&#038; Evernote.Utils.Selection.getCommonAncestorContainer(range).parentNode) ? Evernote.Utils.Selection.getCommonAncestorContainer(range).parentNode : Evernote.Utils.Selection.getCommonAncestorContainer(range);</p>
<p>            while ( typeof Evernote.ClipRules.NON_ANCESTOR_NODES[ ancestor.nodeName.toUpperCase() ] != 'undefined' &#038;&#038; ancestor.parentNode ) {
                if ( ancestor.nodeName.toUpperCase() == "BODY" ) {
                    break;
                }
                ancestor = ancestor.parentNode;
            }</p>
<p>            var serializer = new Evernote.NodeSerializer( window, new Evernote.ClipFullStylingStrategy() );
            var parser = new Evernote.DomParser(window, Evernote.Utils.fixIERangeObject(range));
            parser.parse( ancestor, false, serializer );</p>
<p>            var end = new Date().getTime();
            Evernote.Logger.debug( "JSSerializer.serializeSelection(): clipped selection in " + (end - start) + " milliseconds" );
            var images = [];
            var imageUrls = serializer.getImagesUrls();</p>
<p>            for(var i = 0; i < imageUrls.length; i++) {
                images.push(Evernote.Utils.makeAbsolutePath(serializer.getDocumentBase(), imageUrls[i]).replace(/\s/g, "%20"));
            }</p>
<p>            return {
                content : serializer.getSerializedDom(),
                imageUrls : images,
                docBase : serializer.getDocumentBase()
            }
        }
        catch ( e ) {
            Evernote.Logger.error( "JSSerializer.serializeSelection() failed: error = " + e );
            throw e;
        }
    },</p>
<p>    hasSelection : function() {
        Evernote.Logger.debug( "Clip.hasSelection()" );</p>
<p>        if ( this._selectionFinder.hasSelection() ) {
            return true;
        }
        else {
            this._selectionFinder.find( true );
            return this._selectionFinder.hasSelection();
        }
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/**
 * Represents JQuery loader that allow to have two versions of JQuery loaded on the same page
 * @type {Object}
 */
Evernote.JQueryLoader = {
    /**
     * Initializes jquery instance on global Evernote context
     */
    initJQuery : function() {
        if (!Evernote.JQuery) {
            Evernote.JQuery = $.noConflict(true);
        }
    }
};</p>
<p>(function () {
    if (!Evernote.JQuery) {
        Evernote.JQuery = $.noConflict(true);
    }
}());
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ClipNotificator = function ClipNotificator() {</p>
<p>};
// TODO: clip notificator is obsolete now. Remove it.</p>
<p>Evernote.ClipNotificator.WAIT_CONTAINER_ID = "evernoteContentClipperWait";
Evernote.ClipNotificator.SHOW_WAIT_MIN_TIME = 2000;</p>
<p>Evernote.ClipNotificator.prototype.showCopyNotification = function( doc, options, useAutoHide ) {</p>
<p>    Evernote.evernotePostClipPopup.fillOutPopup(options.title, options.notebookName);
    Evernote.evernotePostClipPopup.show();</p>
<p>    try {
        var wait = this.getWaitContainer( doc, Evernote.Addin.getLocalizedMessage(Evernote.Messages.CLIPPING) );
        wait.style.display = "none";
        this.centerBox(wait);</p>
<p>        if ( doc.body ) {
            doc.body.appendChild( wait );
        }</p>
<p>        if (useAutoHide)
        {
            var self = this;
            var timeout = this.constructor.SHOW_WAIT_MIN_TIME;
            setTimeout( function() {
                self.clearWait( doc );
            }, timeout );
        }
    }
    catch ( e ) {
        Evernote.Logger.error( "ClipNotificator.showCopyNotification() failed: error = " + e );
    }
};</p>
<p>Evernote.ClipNotificator.prototype.centerBox = function( container ) {</p>
<p>    // TODO: for what? It can be done with css.
    var topPosition = ((document.documentElement.scrollTop || document.body.scrollTop) + ((((document.documentElement.clientHeight || document.body.clientHeight) + (!container.offsetHeight &#038;&#038; 0)) / 2) >> 0));
    var leftPosition = (((document.documentElement.clientWidth || document.body.clientWidth) / 2) - (container.offsetWidth / 2));
    container.style.position = "absolute";
    container.style.top = (topPosition-20) + "px";
    container.style.left = (leftPosition - 90) + "px";
};</p>
<p>Evernote.ClipNotificator.prototype.getWaitContainer = function( doc, msg ) {
    Evernote.Logger.debug( "ClipNotificator.getWaitContainer()" );</p>
<p>    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;</p>
<p>        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 );</p>
<p>        var center = doc.createElement( "center" );
        wait.appendChild( center );</p>
<p>        var spinner = doc.createElement( "div" );
        spinner.id = "evernote-spinner-container";
        center.appendChild( spinner );</p>
<p>        var text = doc.createElement( "span" );
        text.id = this.constructor.WAIT_CONTAINER_ID + "Text";
        center.appendChild( text );</p>
<p>        container._waitMsgBlock = text;
        container._waitMsgBlock.appendChild( doc.createTextNode( msg ) );
    }</p>
<p>    return container;
};</p>
<p>Evernote.ClipNotificator.prototype.clearWait = function( doc, immediately ) {
    Evernote.Logger.debug( "ClipNotificator.clearWait()" );</p>
<p>    var wait = doc.getElementById( Evernote.ClipNotificator.WAIT_CONTAINER_ID );
    if ( wait ) {
        wait.style.opacity = "0";
        if (immediately) {
            wait.parentNode.removeChild( wait );
        } else {
            setTimeout( function() {
                if ( wait.parentNode ) {
                    wait.parentNode.removeChild( wait );
                }
            }, 300 );
        }
    }</p>
<p>};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/**
 * Represents clipper object that is capable of clipping elements from pages or clip elements based on preferences.
 */
Evernote.Clipper = {</p>
<p>    _serializer : Evernote.JSSerializer,</p>
<p>    _clipNotifier : new Evernote.ClipNotificator(),</p>
<p>    _defaultOptions : {
        title: PageContext.title,
        tags: [],
        comments: "",
        notebookUid: -1,
        notebookName : ""
    },</p>
<p>    /**
     * Clips article element (one that user selected or default if no selection was made).
     */
    clipArticle : function(options, clearly) {
        var currentOptions = this.initOptions(options);
        this._clipNotifier.showCopyNotification(document, currentOptions);
        var self = this;
        setTimeout(function() {
            var article
            if ( clearly ) {
                article = Evernote.ClearlyController.getSimplifiedArticle();
            } else {
                article = Evernote.contentPreviewer.getArticleElement();
            }
            if(!article) {
                article = Evernote.pageInfo.getDefaultArticle(function(article) {});
            }
            var resultFunc = function(serializedDom) {
                self._clipNotifier.clearWait(document);
                Evernote.Addin.clipNote(currentOptions.comments + serializedDom.content, currentOptions, PageContext.url, serializedDom.imageUrls, true, document);
                Evernote.ClearlyController.hide();
            };
            self._serializer.serializeAsync(article, false, resultFunc);
        }, 100);
    },</p>
<p>    initOptions: function(options) {
        if(!options)
            options = this._defaultOptions;
        options = Evernote.JQuery.extend({}, this._defaultOptions, options);
        if(!options.title || Evernote.JQuery.trim(options.title).length == 0)
            options.title = Evernote.Addin.getLocalizedMessage(Evernote.Messages.UNTITLED_NOTE);
        options.title = Evernote.JQuery.trim(Evernote.Utils.cutToLength(options.title, 255, " "));</p>
<p>        /* get notebook name */
        var notebookUid = options.notebookUid || 0;
        var notebook = Evernote.NotebooksLoader.getNotebookByUid(notebookUid);</p>
<p>        if(!notebook) {
            options.notebookName = Evernote.Addin.getLocalizedMessage(Evernote.Messages.DEFAULT_NOTEBOOK);
        } else {
            options.notebookName = notebook.name;
        }</p>
<p>        return options;
    },</p>
<p>    /**
     * Clips full page.
     */
    clipFullPage : function(options) {
        Evernote.Logger.debug("Clipper: clipFullPage");
        var currentOptions = this.initOptions(options);
        this._clipNotifier.showCopyNotification(document , currentOptions);
        var self = this;
        setTimeout(function() {
            Evernote.Logger.debug("Start clipping of full page");
            var resultFunc = function(serializedDom) {
                self._clipNotifier.clearWait(document);
                Evernote.Logger.debug("Image urls " + JSON.stringify(serializedDom.imageUrls));
                Evernote.Logger.debug("Send clip to EN");
                Evernote.Addin.clipNote(currentOptions.comments + serializedDom.content, currentOptions, PageContext.url, serializedDom.imageUrls, true, document);
            };
            self._serializer.serializeAsync(null, true, resultFunc);
        }, 100);
    },</p>
<p>    /**
     * Clips url with favicon (if favicon is recognized)
     */
    clipUrl : function(options) {
        var currentOptions = this.initOptions(options);
        this._clipNotifier.showCopyNotification(document, currentOptions, true);
        var self = this;
        setTimeout(function() {
            var snippet = Evernote.contentPreviewer.getSnippetText();
            if (snippet) {
                snippet = snippet.replace(/(<([^>]+)>)/ig,"");
                var content = Evernote.GlobalUtils.createUrlClipContent(PageContext.title, PageContext.url, PageContext.getFavIconUrl(), snippet);
                Evernote.Addin.clipNote(currentOptions.comments + content, currentOptions, PageContext.url, PageContext.getFavIconUrl(), true, document);
            }else {
                self._clipNotifier.clearWait(document, true);
                Evernote.ClearlyController.getClearlyArticleText( function (data) {
                    snippet = data._html.replace(/(<([^>]+)>)/ig,"");
                    var content = Evernote.GlobalUtils.createUrlClipContent(PageContext.title, PageContext.url, PageContext.getFavIconUrl(), snippet);
                    Evernote.Addin.clipNote(currentOptions.comments + content, currentOptions, PageContext.url, PageContext.getFavIconUrl(), true, document);
                });
            }
        }, 100);
    },</p>
<p>    /**
     * Clips selection from the page.
     */
    clipSelection : function( range, options ) {
        var currentOptions = this.initOptions(options);
        this._clipNotifier.showCopyNotification(document , currentOptions);
        var self = this;
        setTimeout(function() {
            var resultFunc = function(serializedDom) {
                self._clipNotifier.clearWait(document);
                if(serializedDom) {
                    Evernote.Addin.clipNote(currentOptions.comments + serializedDom.content, currentOptions, PageContext.url, serializedDom.imageUrls, true, document);
                }
            };
            self._serializer.serializeSelectionAsync( range, resultFunc );
        }, 100);
    },</p>
<p>    /**
     * Clips image from the page.
     */
    clipImage : function(options ) {
        if (!options.imageElement) {
            Evernote.Logger.debug("clipImage Empty element");
            return;
        }
        var currentOptions = this.initOptions(options);
        this._clipNotifier.showCopyNotification(document , currentOptions);
        var self = this;</p>
<p>        var clojureBug = Evernote.BrowserDetection.isIE7();
        var CUSTOM_ID = 'evn-image-for-clip';</p>
<p>        if (clojureBug) {
            // add attr to find this element later			
            Evernote.JQuery(document).find(options.imageElement).attr( CUSTOM_ID ,'true');
        }</p>
<p>        setTimeout(function() {
            var elementToSerialize = options.imageElement;
            if (clojureBug) {
                var elem = Evernote.JQuery('*['+ CUSTOM_ID +']');
                elementToSerialize = Evernote.JQuery('*['+ CUSTOM_ID +']')[0];
                elem.removeAttr(CUSTOM_ID);
            }
            Evernote.Logger.debug("Start clipping of image");
            var resultFunc = function(serializedDom) {
                self._clipNotifier.clearWait(document);
                Evernote.Logger.debug("Image urls " + JSON.stringify(serializedDom.imageUrls));
                Evernote.Logger.debug("Send clip to EN");
                Evernote.Addin.clipNote(currentOptions.comments + serializedDom.content, currentOptions, PageContext.url, serializedDom.imageUrls, true, document);
            };
            self._serializer.serializeAsync(elementToSerialize, false, resultFunc);
        }, 100);
    },</p>
<p>    /**
     * Clips part of the page, defined in option (url, article or full page) or selection if presented.
     */
    clipWithOptions : function(clipOptions) {</p>
<p>        function getNotebook() {
            return {uid : -1};
        }</p>
<p>        var notebookToClipTo = getNotebook();</p>
<p>        var alwaysTags = [];
        if (notebookToClipTo.type != Evernote.NotebookTypes.LINKED &#038;&#038; Evernote.Options.tags.alwaysEnable == true) {
            alwaysTags = Evernote.Options.tags.alwaysData.split(',');
        }</p>
<p>        var options = {
            notebookUid: notebookToClipTo.uid,
            imageElement: EvernoteExternal.imageElement,
            tags: alwaysTags
        };</p>
<p>        if(clipOptions.getClipAction() == Evernote.ClipperActions.CLIP_SELECTION &#038;&#038; Evernote.Utils.hasSelection(window)) {
            Evernote.Clipper.clipSelection(null, options);
        }
		 else if(clipOptions.getClipAction() == Evernote.ClipperActions.CLIP_URL) {
            Evernote.Clipper.clipUrl(options);
        } else if(clipOptions.getClipAction() == Evernote.ClipperActions.CLIP_FULL_PAGE) {
            Evernote.Clipper.clipFullPage(options);
        } else if(clipOptions.getClipAction() == Evernote.ClipperActions.CLIP_IMAGE) {
            Evernote.Clipper.clipImage(options);
        } else {
            Evernote.Logger.warn("Unknown option is specified : " + clipOptions.getClipAction());
        }
    },</p>
<p>    clipBase64Image : function(options, base64Image) {
        var self = this;
        var currentOptions = this.initOptions(options);
        this._clipNotifier.showCopyNotification(document , currentOptions);
        Evernote.Addin.clipImageAsync(options, function(result) {
            EvernoteGlobalReceiver(result);
        }, PageContext.url, base64Image);
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ClipOptions = function ClipOptions(data) {
    this.clipAction = data.clipAction;
};</p>
<p>Evernote.ClipOptions.prototype.getClipAction = function() {
    return this.clipAction;
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
function ContentVeil() {</p>
<p>    var veil = document.createElement("div");
    veil.id = "evernoteContentVeil";
    var inner = document.createElement("div");
    inner.id = "evernoteInnerBox";
    var pageCounter = document.createElement("div");
    pageCounter.id = "evernotePageCounter";
    veil.appendChild(pageCounter);
    veil.appendChild(inner);</p>
<p>    var pageHeight = document.body.scrollHeight; // used for infinite scroll handling</p>
<p>    /*</p>
<p>    IE10 doesn't support pointer-events:none;
    So we had to replace existing veil with new one, combined of 8 divs.
    Four of them has border to outline content, and four divs in corners has white filling only.</p>
<p>    There is no any element in center, over the content, so nothing will catch mouse events.
    It helps other functions, especially html highlighter, works as expected.</p>
<p>    veil structure:</p>
<p>      veilNW |  veilTop   | veilNE
    veilLeft |            | veilRight
      veilSW | veilBottom | veilSE</p>
<p>    */</p>
<p>    var veilTop = document.createElement("div");
    veilTop.id = "evernoteContentVeilTop";
    var veilLeft = document.createElement("div");
    veilLeft.id = "evernoteContentVeilLeft";
    var veilRight = document.createElement("div");
    veilRight.id = "evernoteContentVeilRight";
    var veilBottom = document.createElement("div");
    veilBottom.id = "evernoteContentVeilBottom";</p>
<p>    var veilNW = document.createElement("div");
    veilNW.id = "evernoteContentVeilNW";
    var veilNE = document.createElement("div");
    veilNE.id = "evernoteContentVeilNE";
    var veilSE = document.createElement("div");
    veilSE.id = "evernoteContentVeilSE";
    var veilSW = document.createElement("div");
    veilSW.id = "evernoteContentVeilSW";</p>
<p>    var veilAll = Evernote.JQuery([veilTop,veilBottom,veilLeft,veilRight]);
    var veilCorners = Evernote.JQuery([veilNW,veilNE,veilSE,veilSW]);
    veilAll.addClass('EvConVeil');
    veilCorners.addClass('EvConVeilCorn');</p>
<p>    function fireClickUnderVeil(evt) {
        var veil = Evernote.JQuery(this);
        veil.hide();
        var bottomElement = document.elementFromPoint(evt.clientX, evt.clientY);
        veil.show();
        bottomElement.click();
    }</p>
<p>    // make veil imperceptible for mouse clicks.
    veilAll.click(fireClickUnderVeil);
    veilCorners.click(fireClickUnderVeil);</p>
<p>    var tooltipTimeout;</p>
<p>    var topExpandContract;
    var bottomExpandContract;
    for (var i = 0; i < 2; i++) {
        var expand = document.createElement("div");
        var contract = document.createElement("div");
        expand.className = "evernoteArticleExpand";
        contract.className = "evernoteArticleContract";</p>
<p>        expand.setAttribute('tooltip', Evernote.Addin.getLocalizedMessage(Evernote.Messages.EXPAND));
        expand.setAttribute('unselectable', 'on');
        contract.setAttribute('tooltip',Evernote.Addin.getLocalizedMessage(Evernote.Messages.CONTRACT));
        contract.setAttribute('unselectable','on');</p>
<p>        expand.addEventListener("mousemove", nudgeMousemoveHandler);
        expand.addEventListener("mouseout", nudgeMouseoutHandler);
        contract.addEventListener("mousemove", nudgeMousemoveHandler);
        contract.addEventListener("mouseout", nudgeMouseoutHandler);</p>
<p>        expand.addEventListener("click", function() {
            Evernote.contentPreviewer.previewNudge('up');
        });
        contract.addEventListener("click", function() {
            Evernote.contentPreviewer.previewNudge('down');
        });
        if (i == 0) {
            topExpandContract = document.createElement("div");
            topExpandContract.className = "evernoteExpandContract evernoteUsingExpandContract";
            topExpandContract.appendChild(expand);
            topExpandContract.appendChild(contract);
            veilTop.appendChild(topExpandContract);
        } else {
            bottomExpandContract = document.createElement("div");
            bottomExpandContract.id = "bottomExpandContract";
            bottomExpandContract.className = "evernoteExpandContract";
            bottomExpandContract.appendChild(expand);
            bottomExpandContract.appendChild(contract);
            veilBottom.appendChild(bottomExpandContract);
        }
    }</p>
<p>    function nudgeMousemoveHandler(evt) {
        clearTimeout(tooltipTimeout);
        tooltipTimeout = setTimeout(function() {
            evt.srcElement.className += " tooltipon";
        }, 250);
    }</p>
<p>    function nudgeMouseoutHandler() {
        clearTimeout(tooltipTimeout);
        this.className = this.className.replace(/\s*tooltipon/g, "");
    }</p>
<p>    // We keep a record of what we're currently showing (at least in some cases) so that we can update it in case the
    // state of the page changes (like if the user scrolls).
    var currentlyShownRect = null;
    var currentlyShownElt = null;
    var currentRectOffsetTop = 0;
    var currentRectOffsetLeft = 0;
    var currentlyStatic = false;
    var currentlyShadowBox = false;</p>
<p>    function reset(doNotResetPageCount) {
        currentlyShownRect = null;
        currentlyShownElt = null;
        currentRectOffsetTop = 0;
        currentRectOffsetLeft = 0;
        currentlyShadowBox = false;</p>
<p>        inner.className = inner.className.replace(/\s*evernoteShadowBox/g, "");
        veil.className = inner.className.replace(/\s*evernoteShadowBox/g, "");
        veilAll.removeClass('evernoteShadowBoxActi');</p>
<p>        if (!doNotResetPageCount) {
            setPageCount();
        }</p>
<p>        topExpandContract.className = topExpandContract.className.replace(/\s*evernoteUsingExpandContract/g, "");
        bottomExpandContract.className = bottomExpandContract.className.replace(/s*evernoteUsingExpandContract/g, "");</p>
<p>        showElements("embed");
        showElements("object");
        showElements("iframe");</p>
<p>        blank();
    }</p>
<p>    function blank() {
        veil.style.height = document.body.scrollHeight  - 6 + "px";
        veil.style.width = document.body.scrollWidth - 6  + "px";
        veil.style.borderWidth = "0";
    }</p>
<p>    function gray() {
        show();
        inner.style.display = "none";
        veil.style.backgroundColor = "rgba(255, 255, 255, 0.75)";</p>
<p>        veilAll.each(function(){this.style.borderWidth = "0";});
        veilAll.addClass('evernoteGrayFillingActi');
        revealRectNew({
            top:0,
            bottom:getPageHeight(),
            left:0,
            right:0,
            width:document.body.scrollWidth,
            height:getPageHeight()
        });
    }</p>
<p>    function show() {
        inner.style.display = "";
        veil.style.backgroundColor = "";</p>
<p>        veilAll.each(function(){this.style.borderWidth = ""});
        veilAll.removeClass('evernoteGrayFillingActi');
        if (!Evernote.ElementExtension.hasParentNode(veil)) {
            document.body.appendChild(veil);
            veilAll.each(function(){document.body.appendChild(this)});
            veilCorners.each(function(){document.body.appendChild(this)});
        }
    }</p>
<p>    function hide() {
        if (Evernote.ElementExtension.hasParentNode(veil)) {
            veilAll.each(function(){this.parentNode.removeChild(this)});
            veilCorners.each(function(){this.parentNode.removeChild(this)});
            veil.parentNode.removeChild(veil);
        }
    }</p>
<p>    function isHidden() {
        if (Evernote.ElementExtension.hasParentNode(veil)) {
            return false;
        }
        return true;
    }</p>
<p>    // 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))
        };
    }</p>
<p>    function getPageHeight() {
        var h = Math.abs(window.innerHeight - document.body.scrollHeight) < 15 ? document.body.scrollHeight : Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
        var wh = window.innerHeight;
        if ((wh - h) > 15) return wh;
        return h;
    }</p>
<p>    function revealRect(rect, elt, staticView, shadowBox) {</p>
<p>        // Save this info.
        currentlyShownRect = rect;
        currentlyShownElt = elt;
        currentRectOffsetTop = Evernote.Utils.scrollTop();
        currentRectOffsetLeft = Evernote.Utils.scrollLeft();
        currentlyStatic = staticView;
        currentlyShadowBox = shadowBox;</p>
<p>        // 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;</p>
<p>        var veilWidth = veil.style.width.replace("px", "");
        var veilHeight = veil.style.height.replace("px", "");</p>
<p>        inner.className = inner.className.replace(/\s*evernoteShadowBox/g, "");
        veil.className = inner.className.replace(/\s*evernoteShadowBox/g, "");
        veilAll.removeClass('evernoteShadowBoxActi');
        if (shadowBox) {
            veilAll.addClass('evernoteShadowBoxActi');
            inner.className += " evernoteShadowBox";
            veil.className += " evernoteShadowBox";
        }</p>
<p>        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";</p>
<p>        /*oh my gosh*/</p>
<p>        var rectNew = {
            top:Math.max(y, 0),
            left:Math.max(x, 0),
            bottom:Math.max((veilHeight - y - height),0),
            right:Math.max((veilWidth - x - width),0),
            width:document.body.scrollWidth,
            height:getPageHeight()
        };</p>
<p>        if (!shadowBox) {
            rectNew.width = rectNew.width - 4;
            rectNew.height = rectNew.height - 4;
        } else {
            rectNew.width = rectNew.width - 6;
            rectNew.height = rectNew.height - 6;
        }</p>
<p>        /*
         // debug part.
         function toFix(rect) {
         for (var prop in rect) {
         rect[prop] = rect[prop].toFixed(0);
         }
         return rect;
         }</p>
<p>         console.log('old ' + JSON.stringify(toFix(rect)));
         console.log('new ' + JSON.stringify(toFix(rectNew)));
         */</p>
<p>        revealRectNew(rectNew);
    }</p>
<p>    function revealRectNew(rect) {
        veilLeft.style.height = rect.height - rect.bottom - rect.top + 2 + 'px';
        veilLeft.style.width = rect.left + 'px';
        veilLeft.style.top = rect.top  -1 + 'px';</p>
<p>        veilRight.style.height = rect.height - rect.bottom - rect.top + 2 + 'px';
        veilRight.style.width = rect.right + 'px';
        veilRight.style.top = rect.top - 1 + 'px';
        veilRight.style.left = rect.width - rect.right + 'px';</p>
<p>        veilTop.style.height = rect.top + 'px';
        veilTop.style.left = rect.left + 'px';
        veilTop.style.right = rect.right + 'px';
        veilTop.style.width = rect.width - rect.right - rect.left + 'px';</p>
<p>        veilBottom.style.height = rect.bottom + 'px';
        veilBottom.style.width = rect.width - rect.right - rect.left + 'px';
        veilBottom.style.left = rect.left + 'px';
        veilBottom.style.right = rect.right + 'px';
        veilBottom.style.top = rect.height - rect.bottom + 'px';</p>
<p>        veilNW.style.height = Math.max(rect.top - 1, 0) + 'px';
        veilNW.style.width = rect.left + 'px';</p>
<p>        veilNE.style.height = Math.max(rect.top - 1, 0) + 'px';
        veilNE.style.width = rect.right + 'px';
        veilNE.style.left = rect.width - rect.right + 'px';</p>
<p>        veilSW.style.height = Math.max(rect.bottom - 1, 0) + 'px';
        veilSW.style.top = rect.height - rect.bottom + 1 + 'px';
        veilSW.style.width = rect.left + 'px';</p>
<p>        veilSE.style.height = Math.max(rect.bottom - 1, 0) + 'px';
        veilSE.style.top = rect.height - rect.bottom + 1 + 'px';
        veilSE.style.left = rect.width - rect.right + 'px';
        veilSE.style.width = rect.right + 'px';
    }</p>
<p>    function revealStaticRect(rect, elt, shadowBox) {
        revealRect(rect, elt, true, shadowBox);
    }</p>
<p>    function outlineElement(element, scrollTo, shadowBox, articleAdjustment) {
        // See notes in Preview.js for why we use this method instead of just calling element.getBoundingClientRect().
        var rect = Evernote.contentPreviewer.computeDescendantBoundingBox(element);
        if (rect) {
            reset(articleAdjustment);
            revealRect(rect, element, true, shadowBox);</p>
<p>            if (scrollTo) {
                element.scrollIntoView();
            }</p>
<p>            hideElements("embed", element);
            hideElements("object", element);
            hideElements("iframe", element);</p>
<p>            topExpandContract.className += " evernoteUsingExpandContract";</p>
<p>            if (rect.height - 30  > window.innerHeight) {
                bottomExpandContract.className += " evernoteUsingExpandContract";
            } else {
                bottomExpandContract.className = bottomExpandContract.className.replace(/\s*evernoteUsingExpandContract/g, "");
            }</p>
<p>            show();
        }
        else {
            Evernote.Logger.warn("Couldn't create rectangle from element: " + element.toString());
        }
    }</p>
<p>    function hideAllActiveObjects() {
        hideElements("embed");
        hideElements("object");
        hideElements("iframe");
    }</p>
<p>    function hideElements (tagName, exceptInElement) {
        var els = document.getElementsByTagName(tagName);
        for (var i = 0; i < els.length; i++) {
            els[i].enSavedVisibility = els[i].style.visibility;
            els[i].style.visibility = "hidden";
        }
        showElements(tagName, exceptInElement);
    }</p>
<p>    function showElements (tagName, inElement) {
        if (!inElement) {
            inElement = document;
        }
        var els = inElement.getElementsByTagName(tagName);
        for (var i = 0; i < els.length; i++) {
            if (typeof els[i].enSavedVisibility !== "undefined") {
                els[i].style.visibility = els[i].enSavedVisibility;
                try {
                    delete els[i].enSavedVisibility;
                } catch(e) {
                    els[i].enSavedVisibility = undefined;
                }
            }
        }
    }</p>
<p>    function getElement() {
        return veil;
    }</p>
<p>    function setPageCount(count) {
        if (!count) {
            pageCounter.innerText = "";
        } else if (count == 1) {
            //TODO: test l10n
            pageCounter.innerText = "oneMorePageFound";
        } else {
            //TODO:test l10n
            pageCounter.innerText = "morePagesFound" + count;
        }
        pageCounter.scrollIntoView(true);
    }</p>
<p>    var onScrollHandle =  function(e) {
        if (currentlyShownRect &#038;&#038; !currentlyStatic) {
            var rect = {
                top: currentlyShownRect.top,
                bottom: currentlyShownRect.bottom,
                left: currentlyShownRect.left,
                right: currentlyShownRect.right,
                width: currentlyShownRect.width,
                height: currentlyShownRect.height
            };</p>
<p>            var vert = Evernote.Utils.scrollTop() - currentRectOffsetTop;
            var horiz = Evernote.Utils.scrollLeft() - currentRectOffsetLeft;</p>
<p>            if (!vert &#038;&#038; !horiz) {
                return;
            }</p>
<p>            rect.top -= vert;
            rect.bottom -= vert;
            rect.left -= horiz;
            rect.right -= horiz;
            blank();
            revealRect(rect, currentlyShownElt);
        }</p>
<p>        if (pageHeight < document.body.scrollHeight - 30) {
            pageHeight = document.body.scrollHeight;
            onResizeHandle();
        }
    };</p>
<p>    var onResizeHandle = function(e) {
        if (currentlyShownElt) {
            var rect = Evernote.contentPreviewer.computeDescendantBoundingBox(currentlyShownElt);
            if (rect) {
                blank();
                if (currentlyShadowBox) {
                    revealRect(rect, currentlyShownElt, true, true);
                } else {
                    revealRect(rect, currentlyShownElt, true, false);
                }
            }
        }</p>
<p>        // todo: switch gray filling to position: fixed.
        if (veilAll.hasClass('evernoteGrayFillingActi')) {
            gray();
        }
    };</p>
<p>    window.addEventListener("resize", onResizeHandle);
    window.addEventListener("scroll", onScrollHandle, false);</p>
<p>    // Public API:
    this.reset = reset;
    this.show = show;
    this.gray = gray;
    this.hide = hide;
    this.revealRect = revealRect;
    this.revealStaticRect = revealStaticRect;
    this.outlineElement = outlineElement;
    this.expandRect = expandRect;
    this.hideAllActiveObjects = hideAllActiveObjects;
}
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/**
 * Created by chizhikov on 11.04.14.
 */</p>
<p>function ScreenshotVeil() {
    var areaEl = document.createElement('div');
    areaEl.id = 'evernoteScreenShotArea';</p>
<p>    var startX, startY = 0;</p>
<p>    var global_tools = Evernote.JQuery('#' + Constants.CLIP_DIALOG_ID);
    var area = Evernote.JQuery(areaEl);
    var selecting = false;</p>
<p>    var startVertLine = document.createElement('div');
    var startHorizLine = document.createElement('div');</p>
<p>    startVertLine.className = 'screenAreaStartVertLine';
    startHorizLine.className = 'screenAreaStartHorizLine';</p>
<p>    var borderDiv = document.createElement('div');
    borderDiv.id = 'screenAreaSelected';</p>
<p>    areaEl.appendChild(startVertLine);
    areaEl.appendChild(startHorizLine);
    areaEl.appendChild(borderDiv);</p>
<p>    function sendMessageToPopup( msg ){
        // send message to global tools</p>
<p>        var zoomModifier = screen.deviceXDPI / screen.logicalXDPI;</p>
<p>        with (borderDiv.style) {
            var topX = pixelLeft * zoomModifier;
            var topY = pixelTop * zoomModifier;
            var bottomX = (area.width() - pixelRight) * zoomModifier;
            var bottomY = (area.height() - pixelBottom) * zoomModifier;
        }</p>
<p>        // If any side of the rectangle that user is drawing is smaller than 16px then we interpret it as a
        // single click and should make a fullscreen capture.</p>
<p>        var rectWidth = Math.abs(topX - bottomX);
        var rectHeight = Math.abs(topY - bottomY);
        if (rectWidth < 16 || rectHeight < 16) {
            topX = 0;
            topY = 0;
            bottomX = area.width();
            bottomY = area.height();
        }</p>
<p>        global_tools.trigger(msg ,[topX,topY , bottomX, bottomY]);
    }</p>
<p>    function drawLines(e) {
        startVertLine.style.pixelLeft = e.clientX;
        startHorizLine.style.pixelTop = e.clientY;</p>
<p>        if (selecting) {
            drawRect(startX, startY, e.clientX, e.clientY);
            // TODO: prevent selection
        }
    }</p>
<p>    function drawRect( startX, startY, mouseX, mouseY) {
        var topX, topY, bottomX, bottomY;</p>
<p>        topX = Math.min(startX, mouseX);
        topY = Math.min(startY, mouseY);
        bottomX = Math.max(startX, mouseX);
        bottomY = Math.max(startY, mouseY);</p>
<p>        borderDiv.style.pixelTop = topY;
        borderDiv.style.pixelLeft = topX;
        borderDiv.style.pixelRight = area.width() - bottomX - 1;
        borderDiv.style.pixelBottom = area.height() - bottomY -1;
    }</p>
<p>    function clearSelectedAreaPosition() {
        borderDiv.style.pixelRight = '';
        borderDiv.style.pixelBottom = '';
        borderDiv.style.pixelTop = '';
        borderDiv.style.pixelLeft = '';
        selecting = false;
    }</p>
<p>    function startSelectArea(e) {
        if (e.button != 0)
            return;
        if (Evernote.JQuery(e.target).closest('#' + Constants.CLIP_DIALOG_NEW_ID).length == 0) {
            selecting = true;
            startX = e.clientX;
            startY = e.clientY;
        }
        e.preventDefault();
    }</p>
<p>    function selectionEnd(e) {
        if (!selecting) return;</p>
<p>        if (Evernote.JQuery(e.target).closest('#cancelButton').length == 0 &#038;&#038;
            Evernote.JQuery(e.target).closest('#closeSidebar').length == 0 ) {
            sendMessageToPopup('readyToScreenshot');
        } else {
            sendMessageToPopup('cancelScreenshot');
        }
        hide();
        clearSelectedAreaPosition();
    }</p>
<p>    function disableContextMenu(e) {
        e.preventDefault();
        return false;
    }</p>
<p>    function show() {
        document.addEventListener('mousemove', drawLines);
        document.addEventListener('mousedown', startSelectArea);
        document.addEventListener('mouseup', selectionEnd);
        document.addEventListener('contextmenu', disableContextMenu);</p>
<p>        // TODO: remove scroll from page
        area.addClass('visible');</p>
<p>        Evernote.JQuery('body').css('overflow','hidden');
    }</p>
<p>    function hide() {
        area.removeClass('visible');
        clearSelectedAreaPosition();
        document.removeEventListener('mousemove', drawLines);
        document.removeEventListener('mousedown', startSelectArea);
        document.removeEventListener('mouseup', selectionEnd);
        document.removeEventListener('contextmenu', disableContextMenu);</p>
<p>        Evernote.JQuery('body').css('overflow','visible');
    }</p>
<p>    document.body.appendChild(areaEl);</p>
<p>    this.show = show;
    this.hide = hide;
}
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
function PageInfo() {</p>
<p>    var newPageCallback;</p>
<p>    // This is a map of hostnames (for hostnames that begin with 'www.', the 'www.' will be stripped off first, so don't
    // include it in your lookup string) to CSS selectors. When we try and locate an article in a page, we'll see if we
    // can find the doamin for the page in this list, and if so, we'll try and find an element that matches the given
    // selector. If no element is returned, we'll fall back to the heuristic approach.
    var specialCases = {
        "penny-arcade.com": "div.contentArea > div.comic > img",
        "aspicyperspective.com": "div.entry-content",
        "thewirecutter.com": "div#content",
        "katespade.com": "div#pdpMain",
        "threadless.com": "section.product_section",
        "yelp.com": "div#bizBox",
        "flickr.com": "div#photo",
        "instagr.am": "div.stage > div.stage-inner",
        "stackoverflow.com": "div#mainbar",
        "makeprojects.com": "div#guideMain",
        "cookpad.com": "div#main",
        "imgur.com": "div.image",
        "smittenkitchen.com": "div.entry",
        "allrecipes.com": "div#content-wrapper",
        "qwantz.com": "img.comic",
        "questionablecontent.net": "img#strip",
        "cad-comic.com": "div#content"
    }</p>
<p>    var useFoundImage = [
        "xkcd.com"
    ]</p>
<p>    // These are the items we're trying to collect. This first block is trivial.
    var containsImages = Boolean(document.getElementsByTagName("img").length > 0);
    var documentWidth = document.width;
    var documentHeight = document.height;
    var documentMode = document.documentMode;
    var url = document.location.href;</p>
<p>    // Very slow and useless assignment, takes more than a second. Temporary commented for speed up [actimind]
    // var documentLength = document.body.textContent ? document.body.textContent.length : 0;</p>
<p>    // These take slightly more work and are initialized only when requested.
    var article = null;
    var cleanArticles = [];</p>
<p>    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;</p>
<p>    // Internal state variables to keep us duplicating work.
    var hasCheckedArticle = false;</p>
<p>    // Experimental recognition of 'image' pages (like photo sites and comics).
    function findImage() {
        var imgs = document.getElementsByTagName("img");
        var biggest = null;
        var biggestArea = 0;
        for (var i = 0; i < imgs.length; i++) {
            var style = Evernote.ElementExtension.getComputedStyle(imgs[i]);
            var width = style.width.replace(/[^0-9.-]/g, "");
            var height = style.height.replace(/[^0-9.-]/g, "");
            var area = width * height;
            if (!biggest || area > biggestArea) {
                biggest = imgs[i];
                biggestArea = area;
            }
        }
        return biggest;
    }</p>
<p>    function getAncestors(node) {
        var an = [];
        while (node) {
            an.unshift(node);
            node = node.parentNode;
        }
        return an;
    }</p>
<p>    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;
    }</p>
<p>    function getCommonAncestor(nodeList) {
        if (!nodeList.length) return null;</p>
<p>        if (nodeList.length == 1) return nodeList[0];
        var lastList = getAncestors(nodeList[0]);</p>
<p>        var node = null;
        for (var i = 1; i < nodeList.length; i++) {
            var list = getAncestors(nodeList[i]);
            node = getDeepestCommonNode(lastList, list);
            lastList = getAncestors(node);
        }
        return node;
    }</p>
<p>    function clearlyCallback(data, callback) {
        Evernote.Logger.debug("Clearly callback invoked");
        findImage();</p>
<p>        // See if we should special-case this.
        var host = getHostname();
        if (specialCases[host])
        {
            var candidate = Evernote.ElementExtension.querySelector(specialCases[host]);
            if (candidate) {
                Evernote.Logger.debug("Found article in specialCases");
                article = candidate;
                articleBoundingClientRect = Evernote.ElementExtension.getBoundingClientRect(article);
            }
        }</p>
<p>        // Or see if it's a special case image page.
        else if (Evernote.ArrayExtension.indexOf(useFoundImage, host) != -1) {
            article = findImage();
            if (article) {
                Evernote.Logger.debug("Found article in image");
                articleBoundingClientRect = Evernote.ElementExtension.getBoundingClientRect(article);
            }
        }</p>
<p>        // If it's not a special case, see if it's a single image.
        if (!article) {
            var imageTypes = ['jpeg', 'jpg', 'gif', 'png'];
            var urlExtension = document.location.href.replace(/^.*\.(\w+)$/, "$1");
            if (urlExtension &#038;&#038; (Evernote.ArrayExtension.indexOf(imageTypes, urlExtension) != -1)) {
                var candidate = Evernote.JQuery("body > img");
                if (candidate.length > 0) {
                    Evernote.Logger.debug("Found article in a single image");
                    article = candidate.get(0);
                    articleBoundingClientRect = Evernote.ElementExtension.getBoundingClientRect(article);
                }
            }
        }</p>
<p>        // 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 &#038;&#038; frame.contentDocument &#038;&#038; frame.contentDocument.documentElement) {
                    selectionFrameElement = frame;
                    article = frame.contentDocument.documentElement;
                    articleBoundingClientRect = Evernote.ElementExtension.getBoundingClientRect(article);
                }
            }
        }</p>
<p>        // 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 &#038;&#038; data._elements &#038;&#038; data._elements.length) {
                article = data._elements[0];
                if (data._elements.length > 1) {</p>
<p>                    // This will include *all* clearly elements (and whatever else in in between them).
                    article = getCommonAncestor(data._elements);</p>
<p>                    // This includes *just the last (and therefore most important)* element from the clearly detection.
                    // article = data._elements[data._elements.length - 1];
                }</p>
<p>                if (article.nodeType === ( window.Node ? window.Node.TEXT_NODE : 1)) {
                    article = article.parentNode;
                }
            }
        }</p>
<p>        if(article) {
            if(Evernote.JQuery(article).closest("#evernote-content").length != 0)
                article = undefined;
        }</p>
<p>        // If clearly found nothing (because it failed), then use the body of the document.
        if (!article) {
            article = document.body;
        }</p>
<p>        hasCheckedArticle = true;
        callback();
    }</p>
<p>    // 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) {</p>
<p>        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 &#038;&#038;
                (!article.parentNode || !article.getBoundingClientRect || Evernote.ElementExtension.getBoundingClientRect(article).width == 0)) {
                article = null;
                hasCheckedArticle = false;
            }
            Evernote.Logger.debug("afterInject");
            if (!hasCheckedArticle) {
                Evernote.Logger.debug("no article");
                if (!window)
                {
                    Evernote.Logger.warn("Couldn't find clearly!");
                    clearlyCallback(null, callback);
                }
                else {
                    Evernote.Logger.debug("Call clearly to select article");
                    try {
                        Evernote.ClearlyController.getContentElementAndHTML(function(data){clearlyCallback(data, callback)});
                    } catch(e) {
                        Evernote.Logger.error("Failed to find article by clearly due to error " + e.message);
                        clearlyCallback(null, callback);
                    }
                }
            }
            // If the page is big enough, clearly is excruciatingly slow. We'll just get the whole page.
            // TODO: Clearly was updated. Check, if big pages are still problem
            else if (document.body.innerHTML.length > (1024 * 1024)) {
                Evernote.Logger.warn("Page over 1mb, skipping article detection.");
                clearlyCallback(null, callback);
            }
            else {
                Evernote.Logger.debug("callback");
                callback();
            }
        }</p>
<p>        afterInject();</p>
<p>    }</p>
<p>    function findBiggestFrame() {
        var frames = document.getElementsByTagName("frame");
        var candidate = null;
        var candidateSize = 0;
        for (var i = 0; i < frames.length; i++) {
            if (frames[i].width &#038;&#038; frames[i].height) {
                var area = frames[i].width * frames[i].height;
                if (area > candidateSize) {
                    candidate = frames[i];
                    candidateSize = area;
                }
            }
        }
        return candidate;
    }</p>
<p>    function getHostname() {
        var match = document.location.href.match(/^.*?:\/\/(www\.)?(.*?)(\/|$)/);
        if (match) {
            return match[2];
        }
        return null;
    }</p>
<p>    function getDefaultArticle(callback) {
        Evernote.Logger.debug("getDefaultArticle");
        findArticle(function(){callback(article)});
        // Article already exists, so we'll return it.
        if (article) return article;
    }</p>
<p>    function getBiggestImage(callback) {
        getDefaultArticle(function(art) {
            var imgs;
            if (art) {
                imgs = art.querySelectorAll("img");
            } else {
                imgs = document.querySelectorAll("img");
            }</p>
<p>            var maxHeight = 0;
            var maxWidth = 0;
            var maxImage;
            for (var i = 0; i < imgs.length; i++) {
                var w = imgs.item(i).width;
                var h = imgs.item(i).height;
                if (w * h > maxWidth * maxHeight) {
                    maxHeight = h;
                    maxWidth = w;
                    maxImage = imgs.item(i).src;
                }
            }
            callback({ src: maxImage, width: maxWidth, height: maxHeight });
        });
    }</p>
<p>    // Looks for selections in the current document and descendent (i)frames.
    // Returns the *first* non-empty selection.
    function getSelection() {</p>
<p>        // First we check our main window and return a selection if that has one.
        var selection = window.getSelection();
        if (selection &#038;&#038; selection.rangeCount &#038;&#038; !selection.isCollapsed) {
            return selection;
        }</p>
<p>        // 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]);
        }</p>
<p>        var urlBase = document.location.href.replace(/^(https?:\/\/.*?)\/.*/i, "$1").toLowerCase();
        for (var i = 0; i < docs.length; i++) {</p>
<p>            // 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 &#038;&#038; docs[i].src.toLowerCase().substr(0, urlBase.length) !== urlBase) {
                continue;
            }</p>
<p>            var doc = docs[i].contentDocument;</p>
<p>            if (doc) {
                var frameSelection = doc.getSelection();
                if (frameSelection &#038;&#038; frameSelection.rangeCount &#038;&#038; !frameSelection.isCollapsed) {
                    selectionIsInFrame = true;
                    selectionFrameElement = docs[i];
                    return frameSelection;
                }
            }
            else {
                Evernote.Logger.warn("iframe contained no Document object.");
            }
        }</p>
<p>        // Didn't find anything.
        return null;
    }</p>
<p>    function getUrl() {
        return url;
    }</p>
<p>    function getText(node, soFar, maxLen) {
        if (node.nodeType == Evernote.Node.TEXT_NODE) {
            var trimmed = (node.textContent) ? Evernote.JQuery.trim(node.textContent).replace(/\s+/g, " ") : "";
            if (trimmed === " " || trimmed === "") return soFar;
            return soFar + " " + trimmed;
        }</p>
<p>        var banned = [
            "style",
            "script",
            "noscript"
        ];</p>
<p>        if (node.nodeType == Evernote.Node.ELEMENT_NODE) {
            if (Evernote.ArrayExtension.indexOf(banned, node.nodeName.toLowerCase()) == -1) {
                for (var i = 0; i < node.childNodes.length; i++) {
                    soFar = getText(node.childNodes[i], soFar, maxLen);
                    if (soFar.length > maxLen) {
                        return soFar;
                    }
                }
            }
        }
        return soFar;
    }</p>
<p>    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);
        }</p>
<p>        else if (article) {
            text = getText(article, "", MAX_LEN);
        }
        else {
            text = getText(document.body, "", MAX_LEN);
        }
        text = document.title + " " + text;
        return text;
    }</p>
<p>    // Note: you must call getSelection() first to populate this field!
    function getSelectionFrame() {
        return selectionFrameElement;
    }</p>
<p>    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);
        }
    }</p>
<p>    // @TODO: This is fairly incomplete.
    function getFavIconUrl() {
        var links = document.getElementsByTagName("link");
        var i;
        for (i = 0; i < links.length; i++) {
            if (links[i].rel) {
                var rels = links[i].rel.toLowerCase().split(/\s+/);
                if (Evernote.ArrayExtension.indexOf(rels, "icon") !== -1) {
                    // Found it!
                    return links[i].href;
                }
            }
        }
        return null;
    }</p>
<p>    function _getInfoRequestHandler(data, request, sender, sendResponse) {
        var isSelected = getSelection();</p>
<p>        checkClearly();</p>
<p>        var response = {
            containsImages: containsImages,
            documentWidth: documentWidth,
            documentHeight: documentHeight,
            url: url,
            selection: (isSelected !== null),
            selectionIsInFrame: selectionIsInFrame,
            documentLength: document.body.textContent.length,
            articleBoundingClientRect: articleBoundingClientRect,
            article: (article != null),
            recommendationText: getRecommendationText(),
            favIconUrl: getFavIconUrl(),
            documentIsFrameset: documentIsFrameset
        };
        sendResponse(response);
    }</p>
<p>    function getInfoRequestHandler(request, sender, sendResponse) {
        findArticle(function(data){_getInfoRequestHandler(data, request, sender, respondWithInfo)});
    }</p>
<p>    function getDocumentMode() {
        return documentMode;
    }</p>
<p>    function getCleanArticle(callback, _newPageCallback) {
        newPageCallback = _newPageCallback;
        findArticle(function() {
            callback(cleanArticles);
        });
    }</p>
<p>    // Public API:
    this.getDefaultArticle = getDefaultArticle;
    this.getSelection = getSelection;
    this.getSelectionFrame = getSelectionFrame;
    this.getFavIconUrl = getFavIconUrl;</p>
<p>    //redesign
    this.getBiggestImage = getBiggestImage;
    this.getRecommendationText = getRecommendationText;
    this.getCleanArticle = getCleanArticle;
    this.getText = getText;
    this.getUrl = getUrl;
    this.getDocumentMode = getDocumentMode;
}
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.Scroller = function Scroller( tab ) {
    this.initialize( tab );
};</p>
<p>Evernote.Scroller.prototype._tab = null;</p>
<p>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
    };
};</p>
<p>Evernote.Scroller.prototype.scrollTo = function ( endPoint, time, resolution ) {
    this.abort();</p>
<p>    this.endPoint = endPoint;
    this.step = 0;
    this.calculatePath( time, resolution );
    var self = this;
    this.proc = setInterval( function () {
            if ( !self.doScroll() ) {
                self.abort();
            }
        },
        resolution );
};</p>
<p>Evernote.Scroller.prototype.calculatePath = function ( time, resolution ) {
    this.path = [];
    var sx = this.initialPoint.x;
    var sy = this.initialPoint.y;
    var ex = this.endPoint.x;
    var ey = this.endPoint.y;
    var k = (Math.PI * resolution) / time;
    for ( var i = -(Math.PI / 2); i < (Math.PI / 2); i += k ) {
        var c = ((1 + Math.sin( i )) / 2);
        this.path.push( {
            x:(sx + c * (ex - sx)),
            y:(sy + c * (ey - sy))
        } );
    }
};</p>
<p>Evernote.Scroller.prototype.doScroll = function () {
    var s = this.path[++this.step];
    if ( !s ) {
        return false;
    }
    var view = this._tab.document.defaultView || this._tab;
    view.scrollTo( s.x, s.y );
    return true;
};</p>
<p>Evernote.Scroller.prototype.abort = function () {
    if ( this.proc ) {
        clearInterval( this.proc );
        this.proc = null;
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
function ContentPreview() {
    Evernote.Logger.debug("Start creating preview box");</p>
<p>    var contentVeil = new ContentVeil();
    var screenshotVeil = new ScreenshotVeil();
    Evernote.Logger.debug("End creating preview box");
    // Stores a reference to the last element that we used as a preview.
    var previewElement = null;
    var article = null;
    var snippet = null;</p>
<p>    function buildUrlElement() {
        var urlEl = document.createElement("div");
        urlEl.id = "evernotePreviewContainer";
        var className = "yui3-cssreset";
        if(Evernote.Utils.isQuirkMode()) {
            className += " evernote-middle-fixed-position-quirks"
        }
        urlEl.className = className;
        return urlEl;
    }</p>
<p>    Evernote.Logger.debug("Build url element");
    var urlElement = buildUrlElement();</p>
<p>    function showUrlElement() {
        Evernote.Logger.debug("ContentPreview: showUrlElement start");
        if (!Evernote.ElementExtension.hasParentNode(urlElement)) {
            document.documentElement.appendChild(urlElement);
        }</p>
<p>        // 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"));</p>
<p>        if (isNaN(w) || isNaN(h)) {
            // IE8
            w =  Evernote.JQuery(urlElement).width();
            h = Evernote.JQuery(urlElement).height();
        }</p>
<p>        if (w &#038;&#038; h) {
            urlElement.style.marginLeft = (0 - w / 2) + "px";
            urlElement.style.marginTop = (0 - h / 2) + "px";
        }</p>
<p>        Evernote.Logger.debug("ContentPreview: showUrlElement end");
    }</p>
<p>    function hideUrlElement() {
        if (Evernote.ElementExtension.hasParentNode(urlElement)) {
            urlElement.parentNode.removeChild(urlElement);
        }
    }</p>
<p>    function showScreenShotArea() {
        clear();
        screenshotVeil.show();
    }</p>
<p>    function showOverlay()  {
        previewElement = null;
        clear();
        contentVeil.reset();
        contentVeil.hideAllActiveObjects();
        contentVeil.gray();
    }</p>
<p>    function previewUrl() {
        clear();</p>
<p>        function buildContent ( data ) {
            var title = PageContext.title;
            var url = PageContext.url;
            var favIconUrl = PageContext.getFavIconUrl();
            snippet = data.replace(/(<([^>]+)>)/ig,""); // remove html tags from text</p>
<p>            urlElement.innerHTML = Evernote.GlobalUtils.createUrlClipContent(title, url, favIconUrl, snippet);</p>
<p>            var element = Evernote.JQuery(urlElement);</p>
<p>            if(Evernote.Utils.isQuirkMode() &#038;&#038; !element.hasClass("evernote-fixed-position-fix")) {
                element.addClass("evernote-fixed-position-fix");
            }</p>
<p>            showUrlElement();
            contentVeil.reset();
            contentVeil.hideAllActiveObjects();
            contentVeil.gray();</p>
<p>        }</p>
<p>        Evernote.ClearlyController.getClearlyArticleText( function (data) {
            buildContent(data._html);
        });
    }</p>
<p>    // This doesn't remove internal state of previewElement, because another script may not have finished clipping until
    // after the page looks 'clear'.
    function clear() {
        contentVeil.reset();
        contentVeil.hide();
        screenshotVeil.hide();
        hideUrlElement();
    }</p>
<p>    function _previewArticle () {
        Evernote.Logger.debug("Start previewing article element");
        if (previewElement)
        {
            var selectionFrame;
            if (typeof Evernote.pageInfo !== undefined) {
                selectionFrame = Evernote.pageInfo.getSelectionFrame();
            }
            Evernote.Logger.debug("Selection frame selected " + selectionFrame);
            if (selectionFrame) {</p>
<p>                var rect = {
                    width: selectionFrame.width,
                    height: selectionFrame.height,
                    top: selectionFrame.offsetTop,
                    bottom: (selectionFrame.height + selectionFrame.offsetTop),
                    left: selectionFrame.offsetLeft,
                    right: (selectionFrame.width + selectionFrame.offsetLeft)
                };
                Evernote.Logger.debug("contentVeil.revealStaticRect " + rect);
                contentVeil.revealStaticRect(contentVeil.expandRect(rect, -9), selectionFrame, true);
                Evernote.Logger.debug("contentVeil.show ");
                contentVeil.show();
            }
            else {
                // TODO: Scroll into article view.
                contentVeil.outlineElement(previewElement, false, true);
                window.scrollTo(0, previewElement.offsetTop - 30);
            }
        }
        else {
            Evernote.Logger.warn("Couldn't find a preview element. We should switch to 'full page' mode.");
        }
    }</p>
<p>    /**
     * 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) {</p>
<p>        clear();
        previewElement = null;
        if(reloadArticle) {
            article = null;
        }
        Evernote.Logger.debug("Evernote.pageinfo " + Evernote.pageInfo);
        if (typeof Evernote.pageInfo !== undefined) {
            if(!article) {
                previewElement = Evernote.pageInfo.getDefaultArticle(function(el){
                    Evernote.Logger.debug("Article element " + el.nodeName);
                    previewElement = el;
                    article = el;
                    Evernote.Logger.debug("Preview article ");
                    _previewArticle();
                });
                article = previewElement;
            } else {
                previewElement = article;
                _previewArticle();
            }
        }
        else {
            Evernote.Logger.warn("Couldn't find a 'pageInfo' object.");
        }
    }</p>
<p>    // 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) {</p>
<p>        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;
        }</p>
<p>        //Disable clip of evernote main popup
        if(Evernote.JQuery(candidate).closest("#evernote-content").length != 0) {
            return false;
        }</p>
<p>        // Elements with neither text nor images are not interesting.
        if (!candidate.textContent &#038;&#038; (candidate.getElementsByTagName("img").length === 0)) {
            return false;
        }</p>
<p>        // Elements with 0 area are not interesting.
        var rect = Evernote.ElementExtension.getBoundingClientRect(candidate);
        if (!rect.width || !rect.height) {
            return false;
        }</p>
<p>        // Invisible elements are not interesting.
        var style = Evernote.ElementExtension.getComputedStyle(candidate);
        if ((style.visibility === "hidden") || (style.display === "none")) {
            return false;
        }</p>
<p>        // If the nodes have a parent/child relationship, then they're only interesting if their visible contents differ.
        if (candidate.parentNode &#038;&#038; given.parentNode) {
            if ((candidate.parentNode == given) || (given.parentNode == candidate)) {
                if ((candidate.textContent === given.textContent) &#038;&#038;
                    (candidate.getElementsByTagName("img").length === given.getElementsByTagName("img").length)) {
                    return false;
                }
            }
        }
        return true;
    }</p>
<p>    // 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;
    }</p>
<p>    function nudgePreview(direction) {
        Evernote.Logger.debug("nudgePreview start");
        if (!previewElement) {
            return;
        }</p>
<p>        var oldPreview = previewElement;
        Evernote.Logger.debug("nudgePreview: direction is " + direction);
        Evernote.Logger.debug("nudgePreview: previewElement is " + previewElement.nodeName);
        switch (direction) {
            case "up":
                var temp = previewElement.parentNode;
                while (temp) {
                    if (looksInteresting(temp, previewElement)) {
                        // If we move up and then down, we want to move back to where we started, not the first child.
                        temp.enNudgeDescendToNode = previewElement;
                        previewElement = temp;
                        break;
                    }
                    temp = temp.parentNode;
                }
                break;
            case "down":
                Evernote.Logger.debug("nudgePreview: previewElement.enNudgeDescendToNode is " + previewElement.enNudgeDescendToNode);
                if (previewElement.enNudgeDescendToNode)
                {
                    var temp = previewElement.enNudgeDescendToNode;
                    // @TODO: make sure we clean these up somewhere else if we never reverse our nudging.
                    try {
                        delete previewElement.enNudgeDescendToNode;
                    } catch(e) {
                        previewElement.enNudgeDescendToNode = undefined;
                    }
                    previewElement = temp;
                } else {
                    previewElement = descendTreeUntilUniqueElement(previewElement);
                }
                break;
                Evernote.Logger.debug("nudgePreview: previewElement.children.length = " + previewElement.children.length);
                for (var i = 0; i < previewElement.children.length; i++) {
                    Evernote.Logger.debug("nudgePreview: checking child is " + previewElement.children[i].nodeName);
                    if (looksInteresting(previewElement.children[i], previewElement)) {
                        Evernote.Logger.debug("nudgePreview: found interesting child" + previewElement.children[i]);
                        previewElement = previewElement.children[i];
                        break;
                    }
                }
                break;
            case "left":
                var temp = previewElement.previousElementSibling;
                while (temp) {
                    if (looksInteresting(temp, previewElement)) {
                        previewElement = temp;
                        break;
                    }
                    temp = temp.previousElementSibling;
                }
                break;
            case "right":
                var temp = previewElement.nextElementSibling;
                while (temp) {
                    if (looksInteresting(temp, previewElement)) {
                        previewElement = temp;
                        break;
                    }
                    temp = temp.nextElementSibling;
                }
                break;
            default:
                Evernote.Logger.warn("Unhandled nudge direction: " + direction);
        }</p>
<p>        // Drawing is expensive so don't bother if nothing changed.
        if (oldPreview !== previewElement) {
            Evernote.Logger.debug("nudgePreview: draw new element.");</p>
<p>            function enoughSize(elem) {
                var el = Evernote.JQuery(elem);
                var w = el.width();
                var h = el.height();
                return (w > 30 &#038;&#038; h > 15)
            }</p>
<p>//            if (enoughSize(previewElement) === false) return;</p>
<p>            contentVeil.outlineElement(previewElement, false, true, true);
            article = previewElement;</p>
<p>            // TODO: scroll into Element view here (probably, attach to Expand/Contract Container
            window.scrollTo(0, previewElement.offsetTop - 30);
        }
    }</p>
<p>    function sameElement(a, b) {
        var aRect = a.getBoundingClientRect();
        var bRect = b.getBoundingClientRect();
        if (aRect.bottom == bRect.bottom &#038;&#038; aRect.height == bRect.height
            &#038;&#038; aRect.left == bRect.left &#038;&#038; aRect.right == bRect.right
            &#038;&#038; aRect.top == bRect.top &#038;&#038; aRect.width == bRect.width) {
            return false;
        } else if ((a.textContent === b.textContent) &#038;&#038;
            (a.getElementsByTagName("img").length === b.getElementsByTagName("img").length)) {
            return false;
        }
    }</p>
<p>    function descendTreeUntilUniqueElement(parent) {
        for (var i = 0; i < parent.children.length; i++) {
            if (sameElement(parent.children[i], parent)) {
                return descendTreeUntilUniqueElement(parent.children[i]);
            } else if (looksInteresting(parent.children[i], parent)) {
                return parent.children[i];
            }
        }
        return parent;
    }</p>
<p>    function previewFullPage() {
        var borderWidth = 4;
        var w = document.documentElement.scrollWidth;
        var h = document.documentElement.scrollHeight;</p>
<p>        var rect = {
            bottom: (h - borderWidth),
            top: (borderWidth),
            left: (borderWidth),
            right: (w - borderWidth),
            width: (w - (2 * borderWidth)),
            height: (h - (2 * borderWidth))
        };</p>
<p>        clear();
        contentVeil.reset();
        contentVeil.revealStaticRect(rect, document.body);
        contentVeil.show();
        contentVeil.hideAllActiveObjects();
    }</p>
<p>    // 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;</p>
<p>        return rect;
    }</p>
<p>    // Returns true if the rectangles match, false otherwise.
    function rectanglesEqual(rect1, rect2) {
        if (!rect1 &#038;&#038; !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;
    }</p>
<p>    // 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) {</p>
<p>        // 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 &#038;&#038; range.endContainer.nodeType !== Evernote.Node.ELEMENT_NODE) ||
            ( range.startContainer &#038;&#038; range.startContainer &#038;&#038; range.startContainer.getBoundingClientRect) ||
            ( range.endContainer &#038;&#038; range.endContainer.getBoundingClientRect) ||
            ( range.commonAncestorContainer &#038;&#038; range.commonAncestorContainer.getBoundingClientRect)
            ) {
            var rect = range.getBoundingClientRect();
            if(rect.top == 0 &#038;&#038; rect.bottom == 0 &#038;&#038; rect.left == 0 &#038;&#038; rect.right == 0) {
                if(range.commonAncestorContainer &#038;&#038; range.commonAncestorContainer.getBoundingClientRect) {
                    rect = range.commonAncestorContainer.getBoundingClientRect();
                } else if(range.startContainer &#038;&#038; range.startContainer.getBoundingClientRect) {
                    rect = range.startContainer.getBoundingClientRect();
                } else if(range.endContainer &#038;&#038; 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;
        }</p>
<p>        // 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.");
        }</p>
<p>        // 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]) &#038;&#038; !foundEnd) {
                foundEnd = true;
            }
            else {
                keptRects.push(initialRects[i]);
            }
        }</p>
<p>        // 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];</p>
<p>        var rect = keptRects[0];
        for (var i = 1; i < keptRects.length; i++) {
            rect = unionRectangles(rect, keptRects[i]);
        }</p>
<p>        return rect;
    }</p>
<p>    // If every edge of the rectangle is in negative space,
    function rectIsOnScreen(rect) {
        // rtl pages have actual content in "negative" space. This case could be handled better.
        if (document.dir == "rtl") {
            return false;
        }
        // If both top and bottom are in negative space, we can't see this.
        if (rect.bottom < 0 &#038;&#038; rect.top < 0) {
            return false;
        }
        // Or, if both left and right are in negative space, we can't see this.
        if (rect.left < 0 &#038;&#038; rect.right < 0) {
            return false;
        }
        // Probably visible.
        return true;
    }</p>
<p>    function applyElementRect(element, rect) {
        var newRect = rect;
        var tempRect = Evernote.ElementExtension.getBoundingClientRect(element);</p>
<p>        tempRect = {
            bottom: tempRect.bottom + window.pageYOffset,
            height: tempRect.height,
            left: tempRect.left + window.pageXOffset,
            right: tempRect.right + window.pageXOffset,
            top: tempRect.top + window.pageYOffset,
            width: tempRect.width
        };</p>
<p>    // Skip elements that are positioned off screen.
        if (!rectIsOnScreen(tempRect)) {
            return newRect;
        }
    var cs = getComputedStyle(element);
    // We won't descend into hidden elements.
    if (cs.display == "none") {
      return newRect;
    }
    // don't union a big rectangle that has hidden overflow
    if (cs.overflowX == "hidden" || cs.overflowY == "hidden") {
      return newRect;
    }
        // We skip anything with an area of one px or less. This is anything that has "display: none", or single pixel
        // images for loading ads and analytics and stuff. Most hidden items end up at 0:0 and will stretch our rectangle
        // to the top left corner of the screen if we include them. Sometimes single pixels are deliberately placed off
        // screen.
        if ((tempRect.width * tempRect.height) > 1) {
            newRect = unionRectangles(tempRect, rect);
        }
        if (element.children) {
            for (var i = 0; i < element.children.length; i++) {
                newRect = applyElementRect(element.children[i], newRect);
            }
        }
        return newRect;
    }</p>
<p>    // In the case of positioned elements, a bounding box around an element doesn't necessarily contain its child
    // elements, so we have this method to combine all of these into one bigger box. ContentVeil calls this function.
    function computeDescendantBoundingBox(element) {
        if (!element) return {top: 0, bottom: 0, left: 0, right: 0, width: 0, height: 0};
        var rect = element.getBoundingClientRect();
        var li = rect.top + window.pageYOffset
        return applyElementRect(element, {
            bottom: rect.bottom + window.pageYOffset,
            height: rect.height,
            left: rect.left + window.pageXOffset,
            right: rect.right + window.pageXOffset,
            top: rect.top + window.pageYOffset,
            width: rect.width
        });
    }</p>
<p>    function previewSelection(sel) {</p>
<p>        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();
        }</p>
<p>        contentVeil.reset();</p>
<p>        var frameRect = null;
        if (selectionFrame) {
            frameRect = Evernote.ElementExtension.getBoundingClientRect(selectionFrame);
        }</p>
<p>        var range, rect, i;</p>
<p>        // If !selection, then something has gone awry.
        if (selection) {
            clear();
            contentVeil.reset();
            // We attempt to highlight each selection, but this hasn't been tested for more than a single selection.
            for (i = 0; i < Evernote.Utils.Selection.getRangeCount(selection); i++) {
                range = Evernote.Utils.Selection.getRangeAt(selection, i);</p>
<p>                rect = computeAlternateBoundingBox(range);</p>
<p>                rect.top += document.documentElement.scrollTop;
                rect.bottom += document.documentElement.scrollTop;
                rect.left += document.documentElement.scrollLeft;
                rect.right += document.documentElement.scrollLeft;</p>
<p>                // Actual adjustment mentioned earlier regarding frames.
                if (frameRect) {
                    rect.left += frameRect.left;
                    rect.right += frameRect.left;
                    rect.top += frameRect.top;
                    rect.bottom += frameRect.top;
                }</p>
<p>                contentVeil.revealStaticRect(rect, selectionFrame, false);
                contentVeil.show();
            }
        }
        contentVeil.show();
        contentVeil.hideAllActiveObjects();
    }</p>
<p>    function getSnippetText() {
        return snippet;
    }</p>
<p>    // Public API:
    this.getArticleElement = getArticleElement;
    this.looksInteresting = looksInteresting;
    this.computeDescendantBoundingBox = computeDescendantBoundingBox;
    this.previewArticle = previewArticle;
    this.previewFullPage = previewFullPage;
    this.previewSelection = previewSelection;
    this.previewUrl = previewUrl;
    this.clear = clear;
    this.previewNudge = nudgePreview;
    this.showOverlay = showOverlay;
    this.getSnippetText = getSnippetText;
    this.showScreenShotArea = showScreenShotArea;
}
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ElementExtension = {
    querySelector : function(selector, doc) {
        if(!doc) {
            doc = document;
        }
        if(doc.querySelector) {
            return doc.querySelector(selector);
        }
        else {
            var head = doc.documentElement.firstChild;
            var styleTag = doc.createElement("STYLE");
            head.appendChild(styleTag);
            doc.__qsResult = [];</p>
<p>            styleTag.styleSheet.cssText = selector + "{x:expression(document.__qsResult.push(this))}";
            window.scrollBy(0, 0);
            head.removeChild(styleTag);</p>
<p>            var result = [];
            for (var i in doc.__qsResult)
                result.push(doc.__qsResult[i]);
            return result;
        }
    },</p>
<p>    getComputedStyle : function(element, pseudoElement, win) {
        var pseudo = pseudoElement;
        var target = win;
        if(!target)
            target = window;
        if(!pseudo) {
            pseudo = null;
        }
        if(target.getComputedStyle)
            return target.getComputedStyle(element, pseudo);
        if(element.currentStyle) {
            try {
				var fixedElement = Evernote.Utils.cloneObject(element.currentStyle);
				fixedElement['fontSize'] = Evernote.Utils.getIEComputedStyle(element, 'fontSize');
				return fixedElement; 
			}             
            catch (err) {
                return element.currentStyle;
            }
        }
        return null;
    },</p>
<p>    hasParentNode : function(element) {
        return element.parentNode &#038;&#038; element.parentNode.nodeType != 9 &#038;&#038; element.parentNode.nodeType != 11;
    },</p>
<p>    getBoundingClientRect : function(element) {
        if(element &#038;&#038; element.getBoundingClientRect) {
            var rect = element.getBoundingClientRect();
            var width = rect.width || element.offsetWidth || element.boundingWidth;
            var height = rect.height || element.offsetHeight || element.boundingHeight;
            return {
                left : rect.left,
                right : rect.right,
                top : rect.top,
                bottom : rect.bottom,
                width : width,
                height : height
            }
        }
        return null;
    },</p>
<p>    hasAttribute : function(node, attrName) {
        if(node) {
            if(node.hasAttribute) {
                return node.hasAttribute(attrName);
            }
            if(node.attributes) {
                var attrValue = node.attributes[attrName];
                return typeof attrValue != typeof undefined;
            }
        }
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ArrayExtension = {
    indexOf : function(element, searchStr) {
        if(!element) {
            return -1;
        }
        if (element.indexOf)
            return element.indexOf(searchStr);
        for(var i = 0; i < element.length; i++) {
            if(element[i] == searchStr)
                return i;
        }
        return -1;
    },</p>
<p>    containsCaseIgnore : function(element, searchStr) {
        if(!element) {
            return false;
        }
        for(var i = 0; i < element.length; i++) {
            if(element[i].toLowerCase() == searchStr.toLowerCase())
                return true;
        }
        return false;
    },</p>
<p>    remove : function(arr, element) {
        var elementPosition = Evernote.ArrayExtension.indexOf(arr, element);
        if(elementPosition != -1) {
            var rest = arr.slice(elementPosition  + 1 || arr.length);
            arr.length = elementPosition;
            return arr.push.apply(arr, rest);
        }
    },</p>
<p>    filter : function(arr, fun) {
        var len = arr.length >>> 0;
        if (typeof fun != "function")
            throw new TypeError();</p>
<p>        var res = [];
        var thisp = arguments[1];
        for (var i = 0; i < len; i++) {
            if (i in arr) {
                var val = arr[i];
                if (fun.call(thisp, val, i, arr))
                {
                    res.push(val);
                }
            }
        }
        return res;
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![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 < props.length; i++) {
            var propName = props[i];
            Evernote.Logger.debug("Evernote.StyleElementExtension.getPropertyValue: property name is " + propName);
            var val;
            if(styleObj.getPropertyValue) {
                val = styleObj.getPropertyValue(propName);
                Evernote.Logger.debug("Evernote.StyleElementExtension.getPropertyValue: value from getPropertyValue is " + val);
                if(val)
                    return val;
            }
            val = styleObj[propName];
            Evernote.Logger.debug("Evernote.StyleElementExtension.getPropertyValue: value from styleObj " + val);
            if(val)
                return val;
        }
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.GlobalUtils = {};
(function(){
    var urlMatcher = /^(.*?):\/\/((www\.)?(.*?))(:\d+)?(\/.*?)(\?.*)?$/;</p>
<p>    var BAD_FAV_ICON_URLS = {"http://localhost/favicon.ico": true};</p>
<p>    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;
    };</p>
<p>    Evernote.GlobalUtils.getMessageCode = function(messageConst) {
        Evernote.Logger.debug("getMessageCode: " + messageConst);
        return Evernote.Messages[messageConst];
    };</p>
<p>    Evernote.GlobalUtils.absolutizeImages = function(element, path) {
        if(path) {
            Evernote.Utils.changeBackgroundImage(element, Evernote.Addin.getPath("resources") + path);
        }
        else if(element.attributes &#038;&#038; element.attributes["background-image"]) {
            // TODO: replace "oldlipper" with universal path
            Evernote.Utils.changeBackgroundImage(element, Evernote.Addin.getPath("resources") + 'oldclipper/' + element.attributes["background-image"].value);
        }
        Evernote.Logger.debug("absolutizeImages: walk through children");
        for (var i = 0; i < element.children.length; i++) {
            Evernote.GlobalUtils.absolutizeImages(element.children[i]);
        }
        Evernote.Logger.debug("absolutizeImages: end");
    };</p>
<p>    Evernote.GlobalUtils.localize = function(element) {
        var node = element.nodeName.toLowerCase();
        if (node == "input" || node == "textarea") {
            var type = element.type;
            if (node == "textarea") type = "textarea";
            switch (element.type) {
                case "text":
                case "textarea":
                case "button":
                case "submit":
                case "search":
                    if (element.attributes &#038;&#038; 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);
                            }
                        }
                    }</p>
<p>                    if (element.attributes &#038;&#038; 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;</p>
<p>                // unlocalizable.
                case "checkbox":
                case "password":
                case "hidden":
                case "radio":
                    break;</p>
<p>                default:
                    throw new Error("We need to localize the value of input elements.");
            }
        }</p>
<p>        else if (element.attributes &#038;&#038; element.attributes["message"]) {
            var localizedMessage = Evernote.Addin.getLocalizedMessage(Evernote.GlobalUtils.getMessageCode(element.attributes["message"].value));
            if (localizedMessage) {
                element.innerHTML = localizedMessage;
            } else {
                element.innerHTML = 'l10n error'; // to spot if something goes wrong
            }
        }</p>
<p>        if (element.title){
            var localizedTitle = Evernote.Addin.getLocalizedMessage(Evernote.GlobalUtils.getMessageCode(element.title));
            if (localizedTitle) {
                element.title = localizedTitle;
            }
        }</p>
<p>        for (var i = 0; i < element.children.length; i++) {
            Evernote.GlobalUtils.localize(element.children[i]);
        }
    };</p>
<p>    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("&#038;");
        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;
    };</p>
<p>    Evernote.GlobalUtils.escapeXML = function(str) {
        var map = {
            "&#038;" : "&amp;",
            "<" : "&lt;",
            ">" : "&gt;",
            "\"" : "&quot;",
            "'" : "&apos;"
        };</p>
<p>        var a = str.split("");
        for (var i = 0; i < a.length; i++) {
            if (map[a[i]]) {
                a[i] = map[a[i]];
            }
        }
        return a.join("");
    };</p>
<p>    Evernote.GlobalUtils.decodeXML = function(str) {
        str = str.replace(/&amp;apos;/g, "&#39;");
        str = str.replace(/&amp;quot;/g, "&#34;");
        str = str.replace(/&amp;lt;/g, "&#60;");
        str = str.replace(/&amp;gt;/g, "&#62;");
        return str;
    };</p>
<p>    Evernote.GlobalUtils.cropImage = function( data ) {
        var img = new Image;
        img.onload = function(){
            var canvas=document.createElement("canvas");
            canvas.width=Math.min(150,data.width);
            canvas.height=Math.min(150,data.height);
            canvas.getContext("2d").drawImage(img ,Math.max(0,(data.width-150)/2),Math.max(0,(data.height-150)/2),canvas.width,canvas.height,0,0,canvas.width,canvas.height);
            return canvas.toDataURL();   // Not working. Cross origin policy forbids toDataUrl() method.
        };
        img.src = data.src;
    };</p>
<p>    Evernote.GlobalUtils.createUrlClipContent = function(title, url, favIcoUrl, snippet) {</p>
<p>        var titleAttr = (title) ? Evernote.GlobalUtils.escapeXML(title) : "";
        var urlStr = Evernote.GlobalUtils.escapeXML(url);
        var snip = snippet;</p>
<p>        if (snip.length > 275) {
            snip = snip.substr(0, 275-3) + '...';
        }</p>
<p>        snip = Evernote.GlobalUtils.escapeXML(snip);</p>
<p>        var contentStyle = 'text-align:left;padding:15px;font-size:12px;font-family:Verdana;max-width:370px;color:black;background-color:white;box-sizing:content-box;display:block;background-repeat:no-repeat;';
        var titleStyle = 'white-space:nowrap;font-size:14px;font-weight:bold;overflow-x:hidden;text-overflow:ellipsis;height:24px;';
        var hrStyle = 'border-top-width:1px;border-top-style:solid;border-top-color:#d8d8d8;height:0;width:100%;';
        var imgStyle = 'position:relative;display:inline-block;float:left;width:150px;height:150px;margin:15px 30px 0 0;overflow:hidden;';
        var contStyle = 'display:inline-block;vertical-align:top;margin:15px 0 0;width:364px;';
        var linkDivStyle = 'padding:0px 0px 11px 0px;';
        var faviconStyle = 'float:left;width:16px; height:16px; margin-right:9px; background-size:16px 16px;background-repeat: no-repeat; background-position:left center;';
        var linkStyle = 'display:inline-block;text-decoration:none;line-height:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:rgb(12, 12, 12);width:325px;';
        var snipStyle ='word-wrap:break-word;line-height:normal;text-align:left;font-size:12px';</p>
<p>        var imgDiv = '';
        var titleDiv = '</p>
<div id="evernoteBookmarkTitle" style="' + titleStyle + '">' + titleAttr + '</div>
<p>';
        var hrDiv = '</p>
<div id="evernoteBookmarkDivider" style="' + hrStyle + '">&#160;</div>
<p>';</p>
<p>        Evernote.pageInfo.getBiggestImage(function(data) {
            if (data &#038;&#038; data.src) {
                var im = '<img src="' + data.src + '" width="150"/>';
                imgDiv =  '</p>
<div id="evernoteBookmarkImage" style="'+ imgStyle +'">' + im + '</div>
<p>';
                contentStyle = contentStyle.replace('max-width:370px','max-width:562px');
            }
        });</p>
<p>        var link = '<a style="' + linkStyle + '" href="' + urlStr+ '">' + urlStr + '</a>';
        var favicon = '</p>
<div style="' + faviconStyle + 'background-image:url('+ favIcoUrl +  ');">&#160;</div>
<p>';
        var linkDiv = '</p>
<div id="evernoteBookmarkLink" style="' + linkDivStyle + '">' + favicon + link + '</div>
<p>' ;
        var snipDiv = '</p>
<div id="evernoteBookmarkSnippet" style="' + snipStyle + '">' + snip + '</div>
<p>';
        var contDiv = '</p>
<div id="evernoteBookmarkContent" style="' + contStyle + '">' + linkDiv + snipDiv + '</div>
<p>';
        var clearDiv = '</p>
<div style="clear:both"/>'</p>
<p>        var content = '</p>
<div id="evernoteBookmarkContainer" style="' + contentStyle + '">' + titleDiv + hrDiv + imgDiv + contDiv + clearDiv + '</div>
<p>';
        return content;
    };</p>
<p>    Evernote.GlobalUtils.executeOnDomReady = function(callback) {
        Evernote.JQuery(document).ready(function() {
            callback();
        });
    };</p>
<p>    Evernote.GlobalUtils.isDocumentLoaded = function(doc) {
        return doc.readyState == "complete" || doc.readyState == "interactive";
    };
})();
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/**
 * Global utilities.
 */
Evernote.Utils = {
    _prevTime : null,</p>
<p>    getIEComputedStyle : function(elem, prop) {
        //Dean Edwards method. See first comment here: http://bit.ly/cMSs9R</p>
<p>        var value = elem.currentStyle[prop] || 0;
        var leftCopy = elem.style.left;
        var runtimeLeftCopy = elem.runtimeStyle.left;</p>
<p>        elem.runtimeStyle.left = elem.currentStyle.left;
        elem.style.left = (prop === "fontSize") ? "1em" : value;
        value = elem.style.pixelLeft + "px";</p>
<p>        elem.style.left = leftCopy;
        elem.runtimeStyle.left = runtimeLeftCopy;
        return value
    },</p>
<p>    sendMessageToPopup : function( message ){
        Evernote.JQuery("#" + Constants.CLIP_DIALOG_ID).trigger(message);
    },</p>
<p>    pushTimeWithPrefix : function(prefix) {
        var time = new Date;
        var passed;</p>
<p>        time = time.getTime();
        passed = time - this._prevTime;
        this._prevTime = time;
        console.log(prefix + ': ' + passed + 'ms');
    },</p>
<p>    cloneObject : function(obj){
        if(obj == null || typeof(obj) != 'object')
            return obj;
        if(obj.constructor == Array)
            return [].concat(obj);
        var temp = {};
        for(var key in obj)
            temp[key] = this.cloneObject(obj[key]);
        return temp;
    },</p>
<p>    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;
    },</p>
<p>    clearSelection : function(doc) {
        if(doc.getSelection) {
            doc.getSelection().removeAllRanges();
        }
    },</p>
<p>    /**
     * 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 &#038;&#038; range) {
            range.select();
        }
    },</p>
<p>    /**
     * 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 &#038;&#038; range.cloneRange) {
            return range.cloneRange();
        }
        if(range.duplicate) {
            Evernote.Logger.debug("cloneRange: result = " + range.duplicate());
            return range.duplicate();
        }
        return range;
    },</p>
<p>    /**
     * 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();
        }
    },</p>
<p>    /**
     * Gets favicon url from the document (if any)
     * @param doc - document to inspect.
     * @return url to the favicon or null.
     */
    getFavIconUrl : function(doc) {
        var links = doc.getElementsByTagName("link");
        var i;
        for (i = 0; i < links.length; i++) {
            if (links[i].rel) {
                var rels = links[i].rel.toLowerCase().split(/\s+/);
                if (Evernote.ArrayExtension.indexOf(rels, "icon") !== -1) {
                    // Found it!
                    return links[i].href;
                }
            }
        }
        return null;
    },</p>
<p>    /**
     * If passed string length is more than length argument, than string is trimmed to length and dots are added
     * (total length of the returned string does not exceed specified length).
     * @param str - string to trim
     * @param length - max number of characters in the string
     * @param addition - text to be added to truncated string
     * @return {*}
     */
    cutToLength : function(str, length, addition) {
        if(!addition) {
            addition = "...";
        }
        if(str.length > length) {
            return (str.substring(0, length-3) + addition);
        }
        return str;
    },</p>
<p>    /**
     * Change new line symbol to html 
     */
    newLineToBr : function(str) {
        return str.replace(/(\r\n|\n|\r)/gm, "
");
    },</p>
<p>    /**
     * Encodes html specific characters (<, >, &#038;, etc.) in specified string
     * @param str - string to encode.
     * @return new string with encoded characters.
     */
    htmlEncode : function( str ) {
        var result = "";
        for ( var i = 0; i < str.length; i++ ) {
            var charcode = str.charCodeAt( i );
            var aChar = str[ i ];
            if(!aChar) {
                aChar = str.charAt(i);
            }
            if(charcode >= 55296 )
                result += aChar;
            else if ( charcode > 0x7f ) {
                result += "&#" + charcode + ";";
            }
            else if ( aChar == '>' ) {
                result += "&gt;";
            }
            else if ( aChar == '<' ) {
                result += "&lt;";
            }
            else if ( aChar == '&#038;' ) {
                result += "&amp;";
            }
            else {
                result += str[ i ] ? str[ i ] : str.charAt(i);
            }
        }</p>
<p>        return result;
    },</p>
<p>    /**
     * 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);
        }</p>
<p>        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 ) === '/' ? '/' : '' );
            }</p>
<p>            href = parseURI( href || '' );
            base = parseURI( base || '' );</p>
<p>            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 &#038;&#038; !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 );</p>
<p>    },</p>
<p>    getNestedDocuments : function( doc ) {
        Evernote.Logger.debug( "Utils.getNestedDocuments()" );</p>
<p>        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 );
                }
            }</p>
<p>            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;</p>
<p>    },</p>
<p>    isSupportedUrl : function(url) {
        return url.indexOf("http") == 0;
    },</p>
<p>    getFontSizeInPixels : function(elementFontSize) {
        function computedStyle(element, property){
            var s = false;
            if(window.getComputedStyle){
                s = window.getComputedStyle(element, null).getPropertyValue(property);
            } else if(element.currentStyle){
                var p = property.split('-');
                var str = new String('');
                for(var i = 0; i < p.length; i++){
                    str += (i > 0)?(p[i].substr(0, 1).toUpperCase() + p[i].substr(1)):p[i];
                }
                s = element.currentStyle[str];
            }
            return s;
        }</p>
<p>        function getPercentageSize(size) {
            var currentFontSize = parseFloat(size);
            var htmlFontSize = 16;
            var htmlElement = document.getElementsByTagName("html");
            if(htmlElement &#038;&#038; htmlElement.length > 0) {
                var htmlComputedFontSize = computedStyle(htmlElement[0], "font-size");
                if(htmlComputedFontSize &#038;&#038; htmlComputedFontSize.indexOf("%") == -1) {
                    htmlFontSize = Evernote.Utils.getFontSizeInPixels(htmlComputedFontSize);
                }
            }
            return htmlFontSize * currentFontSize / 100;
        }</p>
<p>        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);
    },</p>
<p>    innerWidth : function() {
        if(window.innerWidth)
            return window.innerWidth;</p>
<p>        var doc= (document.body.clientWidth)? document.body: document.documentElement;
        return doc.clientWidth;
    },</p>
<p>    innerHeight : function() {
        if(window.innerHeight)
            return window.innerHeight;</p>
<p>        var doc= (document.body.clientHeight)? document.body: document.documentElement;
        return doc.clientHeight;
    },</p>
<p>    scrollTop : function() {
        var doc = document.body.scrollTop ? document.body : document.documentElement;
        return doc.scrollTop;
    },</p>
<p>    scrollLeft : function() {
        var doc = document.body.scrollLeft ? document.body : document.documentElement;
        return doc.scrollLeft;
    },</p>
<p>    /**
     * 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();
        });
    },</p>
<p>    isQuirkMode : function() {
        return document.compatMode == "BackCompat" &#038;&#038; !Evernote.BrowserDetection.isIE11();
    },</p>
<p>    isQuirkModeNew : function() {
        return document.compatMode == "BackCompat" &#038;&#038; Evernote.BrowserDetection.isLessThanIE9();
    },</p>
<p>    isInstanceOf : function(obj, type) {
        if(obj &#038;&#038; type) {
            try {
                return obj instanceof type;
            } catch (e) {
                return type.toString().indexOf(typeof obj) != -1;
            }
        }
        return false;
    },</p>
<p>    changeBackgroundImage : function(element, localpath) {
        if(element.style) {
            element.style.backgroundImage = "url('file:///" + localpath.replace(/\\/g, "/").replace(/\s/g, "%20") + "')";
        }
    },</p>
<p>    format: function(str) {
        var args = arguments;
        return str.replace(/\{(\d+)\}/g, function (m, n) { return args[(n | 0)+1]; });
    },</p>
<p>    fixIERangeObject : function(range,win) { //Only for IE8 and below.
        win=win || window;</p>
<p>        if(!range) return null;
        if(!range.startContainer &#038;&#038; win.document.selection) { //IE8 and below</p>
<p>            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 &#038;&#038; 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
            };</p>
<p>            var rangeCopy1=range.duplicate(), rangeCopy2=range.duplicate(); //Create a copy
            var rangeObj1=range.duplicate(), rangeObj2=range.duplicate(); //More copies <img src='http://electrification-consulting.com/wp/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>            rangeCopy1.collapse(true); //Go to beginning of the selection
            rangeCopy1.moveEnd('character',1); //Select only the first character
            rangeCopy2.collapse(false); //Go to the end of the selection
            rangeCopy2.moveStart('character',-1); //Select only the last character</p>
<p>            //Debug Message
            // alert(rangeCopy1.text); //Should be the first character of the selection
            var parentElement1=rangeCopy1.parentElement(), parentElement2=rangeCopy2.parentElement();</p>
<p>            //If user clicks the input button without selecting text, then moveToElementText throws an error.
            if(window.HTMLInputElement &#038;&#038; (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</p>
<p>            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</p>
<p>            var nodeInfo1=_findTextNode(parentElement1,text1);
            var nodeInfo2=_findTextNode(parentElement2,text2);</p>
<p>            // todo: dirty fix
            if (!nodeInfo1.node) {
                nodeInfo1.node = parentElement1;
            }</p>
<p>            if (!nodeInfo2.node) {
                nodeInfo2.node = parentElement2;
            }</p>
<p>            //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;
    },</p>
<p>    unionRectangles : function(rect1, rect2) {
        var rect = {
            top: (Math.min(rect1.top, rect2.top)),
            bottom: (Math.max(rect1.bottom, rect2.bottom)),
            left: (Math.min(rect1.left, rect2.left)),
            right: (Math.max(rect1.right, rect2.right))
        };
        rect.width = rect.right - rect.left;
        rect.height = rect.bottom - rect.top;</p>
<p>        return rect;
    },</p>
<p>    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);
            }
        }</p>
<p>        if(el) {
            var elem = Evernote.JQuery(el);
            if(Evernote.Utils.isQuirkMode())  {
                elem.css("position", "absolute");
                if (win.attachEvent)
                    win.attachEvent("onscroll", function() {applyPosition(elem);});
                else if (win.addEventListener)
                    win.addEventListener("scroll", function() {applyPosition(elem);}, false);
                else
                    Evernote.Logger.error( "Utils.fixedPosition() can't attachEvent" );
                if(immediate) {
                    applyPosition(elem);
                }
            }
        }
    },</p>
<p>    mergeCustomComboBoxStrings : function(notebook, owner, ownedByStr, maxLen) {</p>
<p>        var totalLen = notebook.length;
        if (owner.length) {
            // format: "space","(","<owned by localize string>","space","<owner>",")"
            // magic number "4" is: "space","(","space",")"
            totalLen += ownedByStr.length + owner + 4;
        }</p>
<p>        if (totalLen <= maxLen) {
            return {
                note: notebook,
                own: "",
                title: ""
            };
        }</p>
<p>        var half = maxLen / 2 - 2;</p>
<p>        if (owner.length == 0) {
            return {
                note: notebook.substr(0, half) + "..." + notebook.substring(notebook.length - half, notebook.length),
                own: "",
                title: notebook
            };
        }</p>
<p>        var ownerFormatStr = "(" + ownedByStr + " " + owner + ")";
        var title = notebook + ownerFormatStr;
        var resultString = title.substr(0, half) + "..." + title.substr(title.length - half);</p>
<p>        if (notebook.length <= half) {
            return  {
                note: notebook,
                own: "..." + title.substr(title.length - notebook.length),
                title: notebook + " " + ownerFormatStr
            };
        }else if (ownerFormatStr <= half) {
            return  {
                note: notebook.substr(0, maxLen - ownerFormatStr.length) + "...",
                own: ownerFormatStr,
                title: notebook + " " + ownerFormatStr
            };
        }else {
            return  {
                note: resultString.substr(0, resultString.length - half),
                own: resultString.substr(half + 3),
                title: notebook + " " + ownerFormatStr
            };
        }
    },</p>
<p>    setEvernoteLogo : function(selector) {
        var serverLocation = Evernote.Addin.getServerLocation();
        Evernote.Logger.debug("Evernote server location is " + serverLocation);
        if (serverLocation.length &#038;&#038; serverLocation.indexOf("international") == -1) {
            var evernoteLogoEl = Evernote.JQuery(selector);
            if (evernoteLogoEl) {
                var imageFileName = "oldclipper/images/web-clipper-logo_" + serverLocation + ".png";
                this.changeBackgroundImage(evernoteLogoEl.get(0), Evernote.Addin.getPath("resources") + imageFileName);
            }
        }
    },</p>
<p>    Selection : {
        getRangeCount : function(selection) {
            if(selection.rangeCount) {
                return selection.rangeCount;
            }
            return 1;
        },</p>
<p>        getRangeAt : function(selection, pos) {
            if(selection.getRangeAt) {
                selection.getRangeAt(pos);
            }
            return selection;
        },</p>
<p>        getCommonAncestorContainer : function(range) {
            if(range.commonAncestorContainer) {
                return range.commonAncestorContainer;
            }
            else if(range.parentElement) {
                return range.parentElement();
            }
            return null;
        }
    }</p>
<p>};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ClipperActions = {
    CLIP_URL : "0",
    CLIP_FULL_PAGE: "1",
    CLIP_ARTICLE: "2",
    CLIP_SELECTION: "3", // Selection is not supported by default
    CLIP_IMAGE: "4", // Image too
    CLIP_SIMPLIFIED_ARTICLE: "5",
    CLIP_SCREEN_SHOT: "6"
};</p>
<p>Evernote.ArticleSelectionOptions = {
    ENABLED : "0",
    DISABLED : "1",
    ENABLED_WITHOUT_HINTS : "2"
};</p>
<p>Evernote.Trigger = {
    ENABLED : true,
    DISABLED : false
};</p>
<p>Evernote.Options = {
    oneClickMode: false,
    action: {
        bydefault: "2",
        lastUsedEnable: true,
        lastUsed: "article"
    },
    tags: {
        alwaysEnable: false,
        alwaysData: ""
    },
    notebooks: {
        lastUsed: -1,
        lastUsedEnable: true,
        bydefault: ""
    },
    skitch: {
        lastUsedColor: ""
    },
    hints: {
        permanentScreenCapture : true
    },
    postClip : {
        show : false
    },
    /**
     * Return string representation of the object (you can use it in load method to restore object from string).
     */
    _serialize: function() {
        //return JSON.stringify(this, null, '\t');  CNN.com has own JSON.stringify with parse errors</p>
<p>        function strObj( obj ) {
            var i = 0;
            var optArr = [];</p>
<p>            for (var prop in obj) {
                if (obj.hasOwnProperty(prop) &#038;&#038; typeof obj[prop] != 'function') {
                    var value;
                    if (typeof obj[prop] == 'object') {
                        value = strObj(obj[prop]);
                    } else if (typeof obj[prop] == 'string') {
                        var tempStr = obj[prop];
                        tempStr = tempStr.replace(/\\/g, "\\\\");
                        tempStr = tempStr.replace(/\"/g, "\\\"");
                        value = '"' + tempStr + '"';
                    } else {
                        value = obj[prop];
                    }
                    optArr[i] = '"' + prop + '":' + value;
                    i++;
                }
            }
            return '{' + optArr.toString() + '}';
        }
        return strObj(this);
    },</p>
<p>    load : function() {
        var optionsContent = Evernote.FS.getOptionsFileContent();
        this._load(optionsContent);
        Evernote.Logger.debug('Load options ' + JSON.stringify(this, null, '\t'));
    },</p>
<p>    _load : function(str) {
        if(str) {
            try {
                var options;</p>
<p>                options = JSON.parse(str);</p>
<p>                for (var prop in options) {
                    if (options[prop] &#038;&#038; options.hasOwnProperty(prop)) {
                        this[prop] = options[prop];
                    }
                }
            } catch(e){
                // ignore
            }
        }
    },</p>
<p>    setScreenCaptureHintNonPermanent : function(){
        this.hints.permanentScreenCapture = false;
        this.save();
    },</p>
<p>    setDefaultAction : function(action) {
        this.action.bydefault = action;
        this.setLastUsedActionDisabled();
        this.save();
    },</p>
<p>    setDefaultNotebook : function(notebook) {
        this.notebooks.bydefault = notebook;
        this.setLastUsedNotebookDisabled();
        this.save();
    },</p>
<p>    setNotebook : function(notebookUid) {
        this.notebooks.lastUsed = notebookUid;
        this.save();
    },</p>
<p>    setLastUsedNotebookEnabled : function() {
        if (this.notebooks.lastUsedEnable == Evernote.Trigger.DISABLED) {
            this.notebooks.lastUsedEnable = Evernote.Trigger.ENABLED;
        }
        this.save();
    },</p>
<p>    setLastUsedNotebookDisabled : function() {
        if (this.notebooks.lastUsedEnable == Evernote.Trigger.ENABLED) {
            this.notebooks.lastUsedEnable = Evernote.Trigger.DISABLED;
        }
        this.save();
    },</p>
<p>    setLastUsedAction : function(action) {
        this.action.lastUsed = action;
        this.save();
    },</p>
<p>    setLastUsedActionEnabled : function () {
        if (this.action.lastUsedEnable == Evernote.Trigger.DISABLED) {
            this.action.lastUsedEnable = Evernote.Trigger.ENABLED;
        }
        this.save();
    },</p>
<p>    setLastUsedActionDisabled : function() {
        if (this.action.lastUsedEnable == Evernote.Trigger.ENABLED) {
            this.action.lastUsedEnable = Evernote.Trigger.DISABLED;
        }
    },</p>
<p>    setOneClickClipping : function(condition) {
        if (condition) {
            this.oneClickMode = Evernote.Trigger.ENABLED;
        } else {
            this.oneClickMode = Evernote.Trigger.DISABLED;
        }
        this.save();
    },</p>
<p>    setAlwaysTagsEnabled : function (condition) {
        if (condition) {
            this.tags.alwaysEnable = Evernote.Trigger.ENABLED;
        } else {
            this.tags.alwaysEnable = Evernote.Trigger.DISABLED;
        }
        this.save();
    },</p>
<p>    setAlwaysTagsString : function (str) {
        this.tags.alwaysData = str;
        this.save();
    },</p>
<p>    setPostClipDialogEnabled : function () {
        if (this.postClip.show == Evernote.Trigger.DISABLED) {
            this.postClip.show = Evernote.Trigger.ENABLED;
        }
        this.save();
    },</p>
<p>    setPostClipDialogDisabled : function () {
        if (this.postClip.show == Evernote.Trigger.ENABLED) {
            this.postClip.show = Evernote.Trigger.DISABLED;
        }
        this.save();
    },</p>
<p>    setLastUsedSkitchColor : function(color) {
        this.skitch.lastUsedColor = color;
        this.save();
    },</p>
<p>    save : function() {
        Evernote.Logger.debug('Save options: ' + JSON.stringify(this, null, '\t'));
        var jsonSer = this._serialize();
        Evernote.FS.writeOptionsToFile(jsonSer);
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.BrowserDetection = {
    isIE11 : function() {				
        return navigator.userAgent.indexOf("Trident/7.0") != -1       
    },</p>
<p>	isIE10 : function() {
        return navigator.userAgent.indexOf("MSIE 10") != -1;
    },</p>
<p>    isIE7 : function() {
        return navigator.userAgent.indexOf("MSIE 7.0") != -1 &#038;&#038; navigator.userAgent.indexOf("Trident/7.0") == -1;
    },</p>
<p>    isIE8 : function() {
        return navigator.userAgent.indexOf("MSIE 8.0") != -1 &#038;&#038; navigator.userAgent.indexOf("Trident/7.0") == -1;
    },</p>
<p>    isIE9 : function() {
        return navigator.userAgent.indexOf("MSIE 9.0") != -1 &#038;&#038; navigator.userAgent.indexOf("Trident/7.0") == -1;
    },</p>
<p>    isLessThanIE9 : function() {
        return Evernote.BrowserDetection.isIE7() || Evernote.BrowserDetection.isIE8()
    },</p>
<p>	isIE10orGreater : function() {
		return Evernote.BrowserDetection.isIE10() || Evernote.BrowserDetection.isIE11()
	}
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.Node = {
    ELEMENT_NODE : 1,
    TEXT_NODE : 3
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.Share = {
    _DEFAULT_WIDTH : 650,
    _DEFAULT_HEIGHT : 650,
    _DEFAULT_TYPE : 'popup',</p>
<p>    _openWindow : function( url, width, height ) {
        var w = width || this._DEFAULT_WIDTH;
        var h = height || this._DEFAULT_HEIGHT;
        var t = this._DEFAULT_TYPE;</p>
<p>        var params = 'width=' + w + ',height=' + h + ',type=' + t + ',left=200,top=200,resizable=yes';</p>
<p>        Evernote.Logger.debug('Open ' + url + ' with params: ' + params);
        window.open(url, null, params);
    },</p>
<p>    toSocial : function ( id, link , title) {
        Evernote.Logger.debug('Evernote.Share.toSocial ' + id + ' and link: ' + link + ', title: ' + title);
        var shareUrl;</p>
<p>        if ( id == 'facebook') {
            shareUrl = "https://www.facebook.com/sharer/sharer.php?u=" + encodeURIComponent(link);
            this._openWindow( shareUrl, 626, 436 );
        } else if (id == 'twitter') {
            shareUrl = "https://twitter.com/intent/tweet?text=" + encodeURIComponent(title)
                + "&#038;url=" + encodeURIComponent(link);
            this._openWindow( shareUrl, 550, 420 );
        } else if (id == 'linkedin') {
            shareUrl = "http://www.linkedin.com/shareArticle?mini=true&#038;url=" + encodeURIComponent(link)
                + "&#038;title=" + encodeURIComponent(title);
            this._openWindow( shareUrl, 900, 570 );
        } else if (id == 'weibo') {
            shareUrl = "http://service.weibo.com/share/share.php?url=" + encodeURIComponent(link)
                + "&#038;title=" + encodeURIComponent(title);
            this._openWindow( shareUrl, 650, 650 );
        }
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.PostClipPopup = function(doc) {</p>
<p>    var elem = Evernote.JQuery('#' + Constants.POST_CLIP_DIALOG_ID);
    var clipboard_container = elem.find('#' + 'evn-clipboardCopy-container');</p>
<p>    var titleField = elem.find('.noteTitle');
    var link = Evernote.pageInfo.getUrl();
    var shareTitle = 'error';</p>
<p>    // subscribe to response from addin
    Evernote.ResponseReceiver.subscribe(this);</p>
<p>    var _title = '';
    var _notebook = '';
    var clipping_message = Evernote.Addin.getLocalizedMessage(Evernote.Messages.CLIPPING);
    var clipped_message = Evernote.Addin.getLocalizedMessage(Evernote.Messages.CLIPPED);</p>
<p>    var message = elem.find('.clippedMessage');
    var closeButton = elem.find('.closeCross');
    var openButton  = elem.find('#openButton');
    var shareButton  = elem.find('#shareButton');
    var shareIcons = elem.find('.shareButton');</p>
<p>    var cbInput = elem.find('.evn-pcp-clipboard-input');
    var cbMessage = elem.find('.evn-pcp-clipboard-message');
    var cbButton = elem.find('.evn-pcp-clipboard-button');</p>
<p>    var errorLink = elem.find('#evn-show-logs');
    var errorMsg = elem.find('.evn-error-desc');</p>
<p>    function showLogs() {
        var logFile = Evernote.Addin.getPath("logfile");
        Evernote.Addin.openLocalFile(logFile, BrowserNavConstants.NAVOPENNEWTAB);
    }</p>
<p>    function modifyToCurrentIE() {
        if (document.documentMode == '9') {
            elem.addClass('evn-iexplorer9');
        } else if (document.documentMode == '7' || Evernote.BrowserDetection.isIE7()) {
            elem.addClass('evn-iexplorer7');
        }
    }</p>
<p>    function finishPostClip () {
        endProcessingAndClose();
//        if (Evernote.Options.postClip.show == true) {
//            endProcessing();
//        } else {
//            endProcessingAndClose();
//        }
    }</p>
<p>    function localize() {
        Evernote.GlobalUtils.localize(elem.get(0));
    }</p>
<p>    function copyToClipboard(){
        var clipSucceed = window.clipboardData.setData('Text', link);</p>
<p>        var isAllowed = window.clipboardData.getData('Text');
        if (isAllowed == "") { // Could be empty, or failed
            // Verify failure
            if (!window.clipboardData.setData('Text', 'test_string'))
                isAllowed = null;
        }</p>
<p>        if (clipSucceed &#038;&#038; isAllowed) {
            clipboard_container.addClass('evn-success');
            cbMessage.text(Evernote.Addin.getLocalizedMessage(Evernote.Messages.URL_COPIED));
        } else {
            clipboard_container.addClass('evn-failed');
            cbMessage.text(Evernote.Addin.getLocalizedMessage(Evernote.Messages.DISABLED));
        }</p>
<p>    }</p>
<p>    function handleShareIconClick ( evt ) {
        var id = evt.srcElement.id || Evernote.JQuery(evt.target).closest('table').attr('id');</p>
<p>        if (id == 'clipboard') {
            elem.addClass('evn-clipboard-mode');
        } else {
            Evernote.Share.toSocial( id , link, shareTitle);
        }
    }</p>
<p>    function fillOutPopup(title, notebook) {
        _title = title;
        _notebook = notebook;</p>
<p>        titleField.html(title);
        cbInput.val(link);
        shareTitle = title;
    }</p>
<p>    function renderErrorMessage( error ) {</p>
<p>        if (error.code == Evernote.ErrorCodes.AUTHENTICATION_ERROR) {
            errorMsg.html(error.message);
        }</p>
<p>        elem.removeClass('processing');
        elem.addClass('evn-error-mode');
    }</p>
<p>    function processError(error) {
        renderErrorMessage(error);
        elem.show();
        return true;
    }</p>
<p>    function endProcessing() {
        elem.removeClass('processing');
        Evernote.ClearlyController.removeHighlighted();
        message.html(clipped_message + ' ' + _notebook);
    }</p>
<p>    function endProcessingAndClose() {
        elem.removeClass('processing').addClass('withoutShare');
        Evernote.ClearlyController.removeHighlighted();
        message.html(clipped_message + ' ' + _notebook);</p>
<p>        setTimeout(function(){
            hide();
        }, 1000);
    }</p>
<p>    function setProcessing() {
        elem.addClass('processing');
        message.html('<span class="evn-processing-status">' + clipping_message + '</span>' + _title);
    }</p>
<p>    function show() {
        setProcessing();
        addListeners();
        elem.show();
        elem.addClass('visible');
    }</p>
<p>    function hide() {
        removeListeners();
        elem.hide();
        elem.removeClass('visible');
        elem.removeClass('evn-error-mode');
        elem.removeClass('withoutShare');
        elem.removeClass('evn-clipboard-mode');
        clipboard_container.removeClass();
        cbMessage.text(Evernote.Addin.getLocalizedMessage(Evernote.Messages.SOURCE_LINK));
    }</p>
<p>    function onClickOutside(e) {
        if (Evernote.JQuery(e.target).closest('#' + Constants.POST_CLIP_DIALOG_ID).length == 0) {
            hide();
        }
    }</p>
<p>    function onKeyPressed(e) {
        if (e.keyCode == 27) {
            hide();
        }
    }</p>
<p>    function onDataReceived(response) {
        if (response.type == 'clipped') {
            finishPostClip();
        }
    }</p>
<p>    function addListeners() {
        Evernote.JQuery(document).on('click', onClickOutside);
        Evernote.JQuery(document).on('keydown',onKeyPressed);
    }</p>
<p>    function removeListeners() {
        Evernote.JQuery(document).off('click',onClickOutside);
        Evernote.JQuery(document).off('keydown',onKeyPressed);
    }</p>
<p>    closeButton.click(hide);
    shareIcons.click(handleShareIconClick);
    cbButton.click(copyToClipboard);</p>
<p>    errorLink.click(showLogs);</p>
<p>    elem.on('errorShown', hide);</p>
<p>    localize();
    modifyToCurrentIE();</p>
<p>    this.fillOutPopup = fillOutPopup;
    this.endProcessing = endProcessing;
    this.endProcessingAndClose = endProcessingAndClose;
    this.show = show;
    this.hide = hide;</p>
<p>    this.processError = processError;
    this.onDataReceived = onDataReceived;
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.Messages = {
    CLIP_SELECTION: 113,			// Save Selection
    CLIP_URL: 115,					// Save URL
    CLIP_FULL_PAGE: 116,			// Save Full Page
    CLIP_ARTICLE: 117,				// Save Article
    ENTER: 118,						// enter
    OPTIONS: 119,					// Options
    DEFAULT_ACTION: 120,			// Default action
    ARTICLE_SELECTION: 121,			// Article selection
    ENABLED: 122,					// Enabled
    DISABLED: 123,					// Disabled
    ENABLED_NO_HINTS: 124,			// Enabled (no hints)
    ARTICLE_SELECTION_HINT: 125,	// When enabled, you can modify article selection using your keyboard before make a clip. Enabling with "no hints" will prevent displaying the informational message. When disabled - you cannot make any adjustments to the automatic article selection.
    EXPAND_SELECTION: 126,			// expand selection
    SHRINK_SELECTION: 127,			// shrink selection
    MOVE_SELECTION: 128,			// move selection
    CLIP_ARTICLE_HINT: 129,			// clip article
    CLIPPING: 130,					// Clipping
    UNSUPPORTED_SCHEMA: 131,		// Clipping from this location is not supported.
    UNTITLED_NOTE: 132,				// Untitled note
    ADD_TAGS: 133,					// Add tags
    ADD_REMARK: 134,				// Add remark
    OWNED_BY: 135,					// owned by
    SHARED_NOTEBOOKS: 136,			// Shared Notebooks
    BUSINESS_NOTEBOOKS: 137,		// Business Notebooks
    LOADING_TAGS: 140,				// Loading tags...
    LOGIN_FAILED: 141,				// You need to be signed in to Evernote desktop to clip webpages
    CLOSE: 142,						// ﾐ厘ｰﾐｺﾑﾑ錦び・
    LOADING_NOTEBOOKS: 146,			// ﾐｷﾐｰﾐｳﾑﾑσｶﾐｰﾑ・ﾐｱﾐｻﾐｾﾐｺﾐｽﾐｾﾑび・..
    CLIP_FAILED_TITLE: 147,			// ﾐ斷ｵ ﾑσｴﾐｰﾐｻﾐｾﾑ・・ﾑ・ｾﾑ・ﾐｰﾐｽﾐｸﾑび・ﾐｷﾐｰﾐｼﾐｵﾑひｺﾑ・
    VERSION: 148,					// ﾐ漬ｵﾑﾑ・ｸﾑ・
    LIMIT_TAGS: 150,				// You've entered the maximum number of tags
    CLIP_HEADER: 151,				// Clip
    SKITCH_HEADER: 152,				// Annotate
    ORGANIZE_HEADER: 153,			// Organize
    SAVE_BUTTON: 154,				// Save
    CLIP_SCREEN_SHOT: 155,			// Screenshot
    NOTEBOOK_SEARCH: 156,			// Find a notebook
    SHARE_BUTTON: 157,				// Share
    ARTICLE: 158,					// Article
    SIMPLIFIED_ARTICLE: 159,		// Simplified Article
    SELECTION: 160,					// Selection
    URL: 161,						// Bookmark
    SCREENSHOT: 162,				// Screen Capture
    SOURCE_LINK: 163,				// Source link
    URL_COPIED: 164,				// Url copied to clipboard
    FULL_PAGE: 165,					// Full Page
    TAGS : 166,                     // Tag selection
    CLIP_ACTION : 167,              // Default clip action
    LOADING : 168,                  // Loading...
    ALWAYS_START_IN : 169,          // Always start in
    ALWAYS_ADD_TAGS : 170,          // Always tag with
    LAST_USED_ACTION : 171,         // Last Used Action
    COPYRIGHT : 172,                // Copyright 2009-2013 Evernote Corporation. All rights reserved.
    PRIVACY_POLICY : 173,           // Privacy Policy
    TERMS_OF_SERVICE : 174,         // Terms of Service
    EXPAND : 175,                   // Expand the article selection
    CONTRACT : 176,                 // Contract the article selection
    ADD_TAG : 177,                  // Add tag
    LIMIT_TAGS_SHORT : 178,         // Max 20 tags
    TAGS_NOT_SUPPORTED : 179,       // Tags not supported
    DONE : 180,                     // Done
    ARROW :181,                     // Shape tool
    COLOR :182,                     // Colors
    STAMP_REJECT :183,              // Stamp tool
    CROP :184,                      // Crop
    HIGHLIGHTER :185,               // HTML Highlighter
    MARKER :186,                    // Marker tool
    PIXELATE :187,                  // Pixelator tool
    TEXT :188,                      // Type tool
    ZOOM_IN :189,                   // Zoom In
    ZOOM_OUT :190,                  // Zoom Out
    ZOOM_RESET :191,                // Reset
    ZOOM_TIP :192,                  // Tip: Hold Ctrl while clicking to pan
    CROP_APPLY :193,                // Apply
    CROP_CANCEL :194,               // Cancel
    SCREENSHOT_CAPTURED :195,       // Screenshot captured
    SAVING : 196,                   // Saving...
    IMAGE_HIGHLIGHTER : 197,        // Image highlighter
    FORBIDDEN : 198,                // Not allowed for this action
    SETTINGS : 200,                 // Settings
    ONE_CLICK_CLIPPING: 201,        // 1-click Clipping
    ONE_CLICK_CLIPPING_DESC: 202,   // ~~~ Put description here ~~~
    NOTEBOOK_SELECTION: 203,        // Notebook Selection
    LAST_USED_NOTEBOOK: 204,        // Last used notebook
    SCREEN_CAPTURE_TOAST: 205,      // Single <b>click</b> to capture full screen
or <b>drag</b> a region and release
    CLIPPED: 206,                   // Clipped to
    TAKE_A_SCREENSHOT: 207,         // Take a Screenshot
    DEFAULT_NOTEBOOK: 208,          // default notebook
    ERROR_LOGS: 209,                // Error logs
    VIEW_LOGS: 210,                 // View Logs
    LOGS_DESCRIPTION: 211,          // If you contact Evernote Support, they may ask you to view these logs to help diagnose a problem
    COPY_TO_CLIPBOARD: 212,         // Copy to clipboard
    AFTER_CLIP: 213,                // After clip
    SHOW_POST_CLIP_DESC: 214,       // Show successful clip dialog
    CLOSE_POST_CLIP_DESC: 215,      // Automatically close clipper
    LEGAL: 216,                     // Legal
    LEGAL_HEADER: 217,              // Web Clipper uses the following open source software
    CLIP_ERROR: 218,                // Cannot save clip
    VIEW_REPORT: 219                // View Crash Report
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ResponseReceiver = {
    parsers : [],
    receivers : [],</p>
<p>    onResponse: function(str) {
        Evernote.Logger.debug("Response received" + str);
        for(var i = 0; i < Evernote.ResponseReceiver.parsers.length; i++) {
            if(Evernote.ResponseReceiver.parsers[i].canParse &#038;&#038; Evernote.ResponseReceiver.parsers[i].canParse(str)) {
                Evernote.ResponseReceiver.notify(Evernote.ResponseReceiver.parsers[i].parse(str));
            }
        }
    },</p>
<p>    registerParser: function(parser) {
        Evernote.ResponseReceiver.parsers.push(parser);
    },</p>
<p>    subscribe: function(receiver) {
        Evernote.ResponseReceiver.receivers.push(receiver);
    },</p>
<p>    notify: function(data) {
        for(var i=0; i < Evernote.ResponseReceiver.receivers.length; i++) {
            Evernote.ResponseReceiver.receivers[i].onDataReceived(data);
        }
    }
};</p>
<p>function EvernoteGlobalReceiver(str) {
    Evernote.ResponseReceiver.onResponse(str);
}
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ProcessIDResponseParser = {
    parse : function(str) {
        Evernote.Logger.debug("ProcessIDResponseParser: response" + str);
        var xmlDom = Evernote.JQuery(str);
        var result = xmlDom.attr("process_id");
        return new Evernote.Response("process_id", result);
    },</p>
<p>    canParse: function(str) {
        var request = Evernote.JQuery(str).attr("request");
        return request &#038;&#038; (request == "get_process_id");
    }
};</p>
<p>Evernote.ResponseReceiver.registerParser(Evernote.ProcessIDResponseParser);
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.NotebookResponseParser = {
    parse : function(str) {
        str = Evernote.GlobalUtils.decodeXML(str);
        var xmlDom = Evernote.JQuery(str);
        var result = [];
        var type = xmlDom.attr("type");
        if(xmlDom.length == 1) {
            var notebooks = xmlDom.find("notebook");
            for(var i = 0; i < notebooks.length; i++) {
                var notebook = Evernote.JQuery(notebooks[i]);
                var notebookObj = Evernote.NotebookResponseParser.createNotebook(type,notebook);
                if(notebookObj) {
                    result.push(notebookObj);
                }
            }
        }
        else if(xmlDom.length > 1) {
            for(var i = 1; i < xmlDom.length - 1; i += 2) {
                var notebook = Evernote.JQuery(xmlDom[i]);
                var notebookObj = Evernote.NotebookResponseParser.createNotebook(type, notebook);
                if(notebookObj) {
                    result.push(notebookObj);
                }
            }
        }
        return new Evernote.Response("notebooks", result);
    },</p>
<p>    createNotebook : function(type, notebook) {
        var notebookType;
        var notebookTypeText;
        switch (type) {
            case "personal":
                notebookType = Evernote.NotebookTypes.PERSONAL;
                notebookTypeText = Evernote.NotebookTypes.PERSONAL_TEXT;
                break;
            case "business":
                notebookType = Evernote.NotebookTypes.BUSINESS;
                notebookTypeText = Evernote.NotebookTypes.BUSINESS_TEXT;
                break;
            case "linked":
                notebookType = Evernote.NotebookTypes.LINKED;
                notebookTypeText = Evernote.NotebookTypes.LINKED_TEXT;
                break;
        }
        var hidden = false;
        var writableAttrValue = notebook.attr("writable");</p>
<p>        if (notebookType == Evernote.NotebookTypes.BUSINESS) {
            return null
        }</p>
<p>        if(notebookType == Evernote.NotebookTypes.LINKED) {
            var business = notebook.attr("business");</p>
<p>            if(business &#038;&#038; ((business | 0) == 1)) {
                notebookType = Evernote.NotebookTypes.BUSINESS;
                notebookTypeText = Evernote.NotebookTypes.BUSINESS_TEXT;
            }
        }</p>
<p>        if(notebookType == Evernote.NotebookTypes.LINKED || notebookType == Evernote.NotebookTypes.BUSINESS) {
            if(!writableAttrValue || (writableAttrValue | 0) != 1) {
                if(notebookType == Evernote.NotebookTypes.LINKED)
                    return null;
                else {
                    hidden = true;
                }
            }
        }</p>
<p>        var owner = notebook.attr("owner");
        if (owner &#038;&#038; owner == Evernote.evernotePopup._user)
            owner = undefined;</p>
<p>        return new Evernote.Notebook(
            notebookType,
            notebook.attr("name"),
            notebook.attr("uid"),
            notebook.attr("stack"),
            owner,
            hidden,
            notebookTypeText
        );
    },</p>
<p>    canParse: function(str) {
        var request = Evernote.JQuery(str).attr("request");
        return (request &#038;&#038; (request == "get_notebooks"));
    }
};</p>
<p>Evernote.ResponseReceiver.registerParser(Evernote.NotebookResponseParser);
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.AddNoteResponseParser = {
    parse : function(str) {
        Evernote.Logger.debug("AddNoteResponseParser: response" + str);
        var xmlDom = Evernote.JQuery(str);
        var result = xmlDom.attr("notebook_name");
        return new Evernote.Response("clipped", result);
    },</p>
<p>    canParse: function(str) {
        var request = Evernote.JQuery(str).attr("request");
        return request &#038;&#038; (request == "add_note");
    }
};</p>
<p>Evernote.ResponseReceiver.registerParser(Evernote.AddNoteResponseParser);
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ErrorResponseParser = {</p>
<p>    parse : function(str) {
        Evernote.Logger.warn("Received error " + str);
        var error = Evernote.JQuery(str);
        var errorCode = error.attr("code");
        var errorMessage = null;
        var problem = null;
        if(error.length == 1) {
            var problems = error.find("problem");
            if(problems &#038;&#038; problems.length > 0) {
                problem = Evernote.JQuery(problems[0]);
            }
        }
        else if(error.length > 2) {
            errorMessage = error[2].toString();
        }
        if(problem) {
            errorMessage = problem.text();
        } else if(!errorMessage) {
            errorMessage = error.attr("details");
        }
        switch (errorCode) {
            case Evernote.ErrorCodes.AUTHENTICATION_ERROR :
                errorMessage = Evernote.Addin.getLocalizedMessage(Evernote.Messages.LOGIN_FAILED);
                break;
            case Evernote.ErrorCodes.CLIP_ERROR :
                errorMessage = Evernote.Addin.getLocalizedMessage(Evernote.Messages.CLIP_FAILED_TITLE) + "\n" + errorMessage;
        }
        var msg = {
            message: errorMessage,
            code: errorCode
        };</p>
<p>        return new Evernote.Response("error", msg);
    },</p>
<p>    canParse: function(str) {
        var request = Evernote.JQuery(str).get(0);
        return (request &#038;&#038; (request.nodeName == "ERROR"));
    }
};</p>
<p>Evernote.ResponseReceiver.registerParser(Evernote.ErrorResponseParser);
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ErrorHandler = {</p>
<p>    getHandler: function() {
        return [Evernote.Addin, Evernote.evernotePopup, Evernote.evernotePostClipPopup, Evernote.AlertErrorHandler];
    },</p>
<p>    onDataReceived : function(response) {
        if(response.type) {
            if(response.type == "error") {
                this.notifyHandlers(response.data);</p>
<p>            }
        }
    },</p>
<p>    notifyHandlers : function(error) {
        for(var i = 0; i < this.getHandler().length; i++) {
            var handler = this.getHandler()[i];
            if(handler &#038;&#038; handler.processError &#038;&#038; handler.processError(error)) {
                return;
            }
        }
    }
};</p>
<p>Evernote.ResponseReceiver.subscribe(Evernote.ErrorHandler);
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.Response = function(type, data) {
    this.type = type;
    this.data = data;
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.FS = {
    _addon : null,</p>
<p>    init : function(addon) {
        this._addon = addon;
    },</p>
<p>    /**
     * Write content to the specified path.
     * @param content - content, that should be written to
     */
    writeOptionsToFile : function(content) {
        if (!this._addon)
            return;
        try {
            this._addon.WriteOptionsContent(content );
        } catch (e) {
            Evernote.Logger.error( "FS.writeOptionsToFile() failed " + e );
        }
    },</p>
<p>    /**
     * Read content of the file specified by path.
     * @return {string} - content of the file
     */
    getOptionsFileContent : function() {
        if (!this._addon)
            return null;
        try {
            return this._addon.ReadOptionsContent();
        } catch (e) {
            Evernote.Logger.error( "FS.getOptionsFileContent() failed " + e );
        }
        return null;
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
//"use strict";</p>
<p>Evernote.AbstractElementSerializer = function AbstractElementSerializer( node, nodeStyle ) {
    this.initialize( node, nodeStyle );
};</p>
<p>Evernote.AbstractElementSerializer.isResponsibleFor = function( /*navigator*/ ) {
    return false;
};</p>
<p>Evernote.AbstractElementSerializer.prototype._node = null;
Evernote.AbstractElementSerializer.prototype._nodeStyle = null;</p>
<p>Evernote.AbstractElementSerializer.prototype.handleInheritance = function( child/*, parent */) {
    Evernote.ElementSerializerFactory.ClassRegistry.push( child );
};</p>
<p>Evernote.AbstractElementSerializer.prototype.initialize = function( node, nodeStyle ) {
    this._node = node;
    this._nodeStyle = nodeStyle;
};</p>
<p>Evernote.AbstractElementSerializer.prototype.serialize = function( /*docBase*/ ) {
    return "";
};</p>
<p>Evernote.AbstractElementSerializer.prototype.getImageUrl = function() {
    return "";
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
//"use strict";</p>
<p>Evernote.ElementSerializerFactory = {
    getImplementationFor : function( node ) {
        for ( var i = 0; i < this.ClassRegistry.length; ++i ) {
            if ( this.ClassRegistry[ i ].isResponsibleFor( node ) ) {
                return this.ClassRegistry[ i ];
            }
        }</p>
<p>        return null;
    }
};</p>
<p>Evernote.ElementSerializerFactory.ClassRegistry = [ ];
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
//"use strict";</p>
<p>Evernote.ClipStylingStrategy = function ClipStylingStrategy( ) {
    this.initialize( );
};</p>
<p>Evernote.ClipStylingStrategy.prototype.initialize = function( ) {</p>
<p>};</p>
<p>Evernote.ClipStylingStrategy.prototype.styleForNode = function(  /*node, root, fullPage, clipStyleType*/ ) {
    return null;
};</p>
<p>Evernote.ClipStylingStrategy.prototype.getNodeView = function ( node ) {
    var doc = node.ownerDocument;
    return (doc.defaultView) ? doc.defaultView : null;
};</p>
<p>Evernote.ClipStylingStrategy.prototype.getNodeStyle = function( node, filterFn, pseudo ) {
    Evernote.Logger.debug( "ClipStylingStrategy.getNodeStyle()" );</p>
<p>    var style = new Evernote.ClipStyle();
    if ( pseudo != "" ) {
        return style;
    }</p>
<p>    if ( node &#038;&#038; typeof node.nodeType == 'number' &#038;&#038; node.nodeType == 1 ) {
        var view = this.getNodeView( node );
        style = new Evernote.ClipStyle( Evernote.ElementExtension.getComputedStyle( node, null, view ), filterFn );
    }</p>
<p>    return style;
};</p>
<p>Evernote.ClipStyleType = {
    NodeStyle : 0x01,
    InheritedFontStyle: 0x02,
    InheritedBgStyle: 0x04,
    AllStyle : 0x01 | 0x02 | 0x04,
    Default : 0x01 | 0x02
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ClipFullStylingStrategy = function ClipFullStylingStrategy( ) {
    this.initialize( );
};</p>
<p>Evernote.inherit( Evernote.ClipFullStylingStrategy, Evernote.ClipStylingStrategy, true );</p>
<p>Evernote.ClipFullStylingStrategy.prototype.styleForNode = function ( node, root, fullPage, clipStyleType ) {
    Evernote.Logger.debug( "ClipStylingStrategy.styleForNode()" );</p>
<p>    if ( clipStyleType == null ) {
        clipStyleType = Evernote.ClipStyleType.Default;
    }</p>
<p>    var bodyStyles = new Evernote.ClipStyle( [ ], function ( prop, value ) {
        return value != ""
    } );
    var inhFontStyles = new Evernote.ClipStyle( [ ] );
    var inhBgStyles = [ ];</p>
<p>    if ( (clipStyleType &#038; Evernote.ClipStyleType.NodeStyle) == Evernote.ClipStyleType.NodeStyle ) {
        Evernote.Logger.debug( "ClipStylingStrategy.styleForNode(): get node style" );
        try {
            if ( node.nodeName.toLowerCase() == "body" ) {
                for ( var attrName in Evernote.ClipStyle.STYLE_ATTRIBUTES ) {
                    if ( Evernote.ElementExtension.hasAttribute(node, attrName) ) {
                        var cssPropName = Evernote.ClipStyle.STYLE_ATTRIBUTES[ attrName ];
                        var style = { };
                        style[ cssPropName ] = node.getAttribute( attrName );
                        bodyStyles.addStyle( style );
                    }
                }
            }
        } catch(e) {
            Evernote.Logger.error("ClipFullStylingStrategy.styleForNode failed to get attributes from body due to error " + e);
        }
        var evaluatedStyles = this.getNodeStyle( node );
        if ( node.nodeName.toLowerCase() == "table" &#038;&#038; !evaluatedStyles.getStyle( "font-size" ) ) {
            evaluatedStyles.addStyle( {"font-size":"1em"} );
        }</p>
<p>        if ( node.nodeName.toLowerCase() == "img" ) {
            style = new Evernote.ClipStyle( Evernote.ElementExtension.getComputedStyle( node, null, this.getNodeView( node ) ), function ( prop, value ) {
                return value != ""
            } );
            evaluatedStyles.addStyle( { height:style.getStyle( "height" ) } );
            evaluatedStyles.addStyle( { width:style.getStyle( "width" ) } );
        }</p>
<p>        if ( evaluatedStyles.getStyle( "background-image" ) ) {
            var regExp = /url\((.*?)\)/;
            evaluatedStyles.addStyle( { "background-image": Evernote.StyleElementExtension.getPropertyValue(Evernote.ElementExtension.getComputedStyle( node, null, this.getNodeView( node ) ),  Evernote.IEStylePropertiesMapping.getPropertyNameFor("background-image") ).replace( regExp, "url('$1')").replace(/('")|("')|('')/g, "'")} );
        }</p>
<p>        if ( evaluatedStyles.getStyle( "height" ) == "100%" &#038;&#038; Evernote.StyleElementExtension.getPropertyValue(Evernote.ElementExtension.getComputedStyle( node, null, this.getNodeView( node ) ), "height" ) == "0px" ) {
            evaluatedStyles.addStyle( { height:"0px" } );
        }
        bodyStyles.mergeStyle( evaluatedStyles, true );
    }</p>
<p>    if ( node == root &#038;&#038; !fullPage ) {
        if ( (clipStyleType &#038; Evernote.ClipStyleType.InheritedFontStyle) == Evernote.ClipStyleType.InheritedFontStyle ) {
            Evernote.Logger.debug( "ClipStylingStrategy.styleForNode(): get inherited font style" );
            inhFontStyles = this.inheritFontForNode( node, true );
            Evernote.Logger.debug( "ClipStylingStrategy.styleForNode(): inherited fonts " );
        }</p>
<p>        if ( (clipStyleType &#038; Evernote.ClipStyleType.InheritedBgStyle) == Evernote.ClipStyleType.InheritedBgStyle ) {
            Evernote.Logger.debug( "ClipStylingStrategy.styleForNode(): get inherited bg style" );
            inhBgStyles = this.inheritBackgroundForNode( node, true );
        }
    }</p>
<p>    bodyStyles.mergeStyle( inhFontStyles, true );
    return {
        nodeStyle:bodyStyles,
        inheritedFonts:inhFontStyles,
        inheritedBackground:inhBgStyles,
        evaluated:bodyStyles
    };
};</p>
<p>Evernote.ClipFullStylingStrategy.prototype.getNodeStyle = function ( node, filterFn, pseudo ) {
    Evernote.Logger.debug( "ClipStylingStrategy.getNodeStyle()" );</p>
<p>    if ( pseudo == null || typeof pseudo == "undefined" ) {
        pseudo = "";
    }
    var style = new Evernote.ClipStyle([ ], filterFn);
    Evernote.Logger.debug( "Pseudo : " + pseudo );
    if ( pseudo == "" &#038;&#038; node &#038;&#038; typeof node.nodeType == 'number' &#038;&#038; node.nodeType == 1 ) {
        var view = this.getNodeView( node );
        style = new Evernote.ClipStyle( Evernote.ElementExtension.getComputedStyle( node, null, view ), filterFn );
    }
    return style;
};</p>
<p>Evernote.ClipFullStylingStrategy.prototype.inheritFontForNode = function ( node, recur ) {
    Evernote.Logger.debug( "ClipFullStylingStrategy.inheritFontForNode()" );</p>
<p>    var fontStyle = new Evernote.ClipStyle();
    if ( !node ) {
        return fontStyle;
    }</p>
<p>    var parent = node;
    var styles = [ ];
    var nodes = [ ];</p>
<p>    var dynamicUnit = ["%", "em"];
    var sizeUnitRegExp = /(.*?)(em|%|px|pt)/;</p>
<p>    while ( parent ) {
        nodes.push( parent );
        styles.push( new Evernote.ClipStyle( this.getNodeStyle( parent ), function ( prop, value ) {
            return (Evernote.ArrayExtension.indexOf(Evernote.ClipStyle.INHERITED_STYLES,  prop ) > 0 &#038;&#038; value != "inherit" );
        } ) );</p>
<p>        Evernote.Logger.debug( "Inh parent style:" + styles[styles.length - 1].toString() );</p>
<p>        if ( !recur || parent == document.body ) {
            break;
        }
        else {
            parent = parent.parentElement;
        }
    }</p>
<p>    //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 &#038;&#038; overFontStyle ) {
            var resFontSize = fontSize.match( sizeUnitRegExp );
            if ( resFontSize == null ) {
                continue;
            }
            var sizeVal = resFontSize[1];
            var sizeUnit = resFontSize[2];
            var resOverFontSize = overFontStyle.match( sizeUnitRegExp );</p>
<p>            if ( resOverFontSize == null ) {
                continue;
            }
            var overSizeVal = resOverFontSize[1];
            var overSizeUnit = resOverFontSize[2];</p>
<p>            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() );
        }</p>
<p>        fontStyle.mergeStyle( style, true );
    }</p>
<p>    return fontStyle;
};</p>
<p>Evernote.ClipFullStylingStrategy.prototype.inheritBackgroundForNode = function ( node, recur ) {
    Evernote.Logger.debug( "ClipFullStylingStrategy.inheritBackgroundForNode()" );</p>
<p>    var bgStyle = new Evernote.ClipStyle();
    if ( !node ) {
        return bgStyle;
    }</p>
<p>    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" &#038;&#038; (value == "no-repeat" || value == "repeat-y"));
            };
            var nodeStyle = new Evernote.ClipStyle( this.getNodeStyle( parent ), filterFn, Evernote.ClipStyle.CSS_GROUP.getExtForStyle( "background" ) );</p>
<p>            if ( !nodeStyle.getStyle( "background-repeat" ) ) {
                nodeStyle.removeStyle( "background-image" );
            }
            if ( !nodeStyle.getStyle( "background-color" ) &#038;&#038; parent.getAttribute( "bgcolor" ) ) {
                Evernote.Logger.debug( "Set bgcolor attribute: " + parent.getAttribute( "bgcolor" ) );
                nodeStyle.addStyle( {"background-color":parent.getAttribute( "bgcolor" )} );
            }</p>
<p>            nodeStyle = this.evalBgPosition( node, parent, nodeStyle );
            if ( nodeStyle.getStylesNames().length > 0 ) {
                styles.push( nodeStyle );
                Evernote.Logger.debug( "Add inh bg style " + nodeStyle.toString() );
            }</p>
<p>            if ( !recur || parent == topElement ) {
                break;
            }
            else {
                parent = parent.parentNode;
            }
        }
    } catch(e) {
        Evernote.Logger.error("ClipFullStylingStrategy.prototype.inheritBackgroundForNode failed to error " + e);
    }</p>
<p>    return styles;
};</p>
<p>Evernote.ClipFullStylingStrategy.prototype.evalBgPosition = function ( node, inhNode, nodeBgStyle ) {
    Evernote.Logger.debug( "Dettermining background image offset" );</p>
<p>    var strPosToPercent = {
        "center":"50%",
        "top":"0%",
        "bottom":"100%",
        "right":"100%",
        "left":"0%"
    };</p>
<p>    var regExp = /url\((.*?)\)/;
    var bgImage = nodeBgStyle.getStyle( "background-image" );
    if ( !regExp.test( nodeBgStyle.getStyle( "background-image" ) ) || (bgImage &#038;&#038; nodeBgStyle.getStyle( "background-image" ).indexOf( "data:image" ) >= 0) ) {
        Evernote.Logger.debug( "bgStyle: " + nodeBgStyle.toString() );
        return nodeBgStyle;
    }</p>
<p>    nodeBgStyle.addStyle( { "background-image": Evernote.StyleElementExtension.getPropertyValue(Evernote.ElementExtension.getComputedStyle( inhNode, null, this.getNodeView( inhNode ) ), Evernote.IEStylePropertiesMapping.getPropertyNameFor("background-image") ).replace( regExp, "url('$1')" ) } );</p>
<p>    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;</p>
<p>    var bgNodeBgPosX = 0;
    var bgNodeBgPosY = 0;
    var origPosX = 0;
    var origPosY = 0;</p>
<p>    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 ];</p>
<p>        if ( bgNodeBgPosX &#038;&#038; bgNodeBgPosX.indexOf( "%" ) > 0 ) {
            origPosX = parseInt( bgNodeRect.width ) * (parseInt( bgNodeBgPosX ) / 100);
            origPosX -= parseInt(actualImage.width) * (parseInt(bgNodeBgPosX) / 100);
        }
        else {
            origPosX = parseInt( bgNodeBgPosX );
        }</p>
<p>        if ( bgNodeBgPosY &#038;&#038; bgNodeBgPosY.indexOf( "%" ) > 0 ) {
            origPosY = parseInt( bgNodeRect.height ) * (parseInt( bgNodeBgPosY ) / 100);
            origPosY -= parseInt(actualImage.height) * (parseInt(bgNodeBgPosY) / 100);
        }
        else {
            origPosY = parseInt( bgNodeBgPosY );
        }
    }</p>
<p>    if ( isNaN( origPosX ) ) {
        origPosX = 0;
    }
    if ( isNaN( origPosY ) ) {
        origPosY = 0;
    }</p>
<p>    var xOffset = 0 - xDelta + origPosX;
    var yOffset = 0 - yDelta + origPosY;</p>
<p>    nodeBgStyle.addStyle( { "background-position":(xOffset + "px " + yOffset + "px") } );
    Evernote.Logger.debug( "bgStyle: " + nodeBgStyle.toString() );
    return nodeBgStyle;
};</p>
<p>Evernote.ClipFullStylingStrategy.prototype.getOffsetRect = function ( elem ) {
    Evernote.Logger.debug( "ClipCSSStyleWalker.getOffsetRect()" );</p>
<p>    var box = Evernote.ElementExtension.getBoundingClientRect(elem);
    var body = elem.ownerDocument.body;
    var docElem = elem.ownerDocument.documentElement;</p>
<p>    var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;
    var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;</p>
<p>    var clientTop = docElem.clientTop || body.clientTop || 0;
    var clientLeft = docElem.clientLeft || body.clientLeft || 0;</p>
<p>    var top = box.top + scrollTop - clientTop;
    var left = box.left + scrollLeft - clientLeft;</p>
<p>    return { top:Math.round( top ), left:Math.round( left ), width:box.width, height:box.height };
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
//"use strict";</p>
<p>Evernote.ClipRules = {
    isNoKeepNodeAttr : function( attribute, nodeName, node ) {
        if ( !attribute ) {
            return true;
        }</p>
<p>        var attrName = attribute.name.toLowerCase();
        var attrValue = attribute.value.toLowerCase();
        if((node.nodeName.toUpperCase() == "SPAN" || node.nodeName.toUpperCase() == "A") &#038;&#038; node.getElementsByTagName( "IMG" ).length > 0) {
            nodeName = "div";
        }
        var attributesToKeepForNode = this.KEEP_NODE_ATTRIBUTES[nodeName];
        if(attributesToKeepForNode) {
            var keepAttributeForNode = typeof attributesToKeepForNode[attrName] != 'undefined';
        }
        return typeof this.NOKEEP_NODE_ATTRIBUTES[ attrName ] != 'undefined'
            || !keepAttributeForNode
            || attrName.substring( 0, 2 ) == "on"
            || attrName.indexOf("xml") == 0
            || attrValue.indexOf("function(") >= 0
            || (attrName == "href" &#038;&#038; attrValue.substring( 0, 11 ) == "javascript:");
    },</p>
<p>    isConditionalNode : function( node ) {
        return node &#038;&#038; typeof this.CONDITIONAL_NODES[ node.nodeName.toUpperCase() ] != 'undefined';
    },</p>
<p>    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();
    },</p>
<p>    isSupportedNode : function( node ) {
        return node &#038;&#038; typeof this.SUPPORTED_NODES[ node.nodeName.toUpperCase() ] != 'undefined';
    },</p>
<p>    isRejectedNode : function( node ) {
        return node &#038;&#038; typeof this.REJECTED_NODES[ node.nodeName.toUpperCase() ] != 'undefined';
    },</p>
<p>    isNonAncestorNode : function( node ) {
        return node &#038;&#038; typeof this.NON_ANCESTOR_NODES[ node.nodeName.toUpperCase() ] != 'undefined';
    },</p>
<p>    isSelfClosingNode : function( node ) {
        return node &#038;&#038; typeof this.SELF_CLOSING_NODES[ node.nodeName.toUpperCase() ] != 'undefined';
    }
};</p>
<p>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
    },</p>
<p>    "abbr" : {
        "title": null,
        "dir" : null
    },</p>
<p>    "acronym" : {
        "title": null,
        "dir" : null
    },</p>
<p>    "address" : {
        "title": null,
        "dir" : null
    },</p>
<p>    "area" : {
        "title": null,
        "dir" : null,
        "accesskey": null,
        "shape": null,
        "coords": null,
        "href": null,
        "nohref": null,
        "alt": null,
        "target": null
    },</p>
<p>    "b" : {
        "title": null,
        "dir" : null
    },</p>
<p>    "bdo" : {
        "title": null,
        "dir" : null
    },</p>
<p>    "big" : {
        "title": null,
        "dir" : null
    },</p>
<p>    "blockquote" : {
        "title": null,
        "dir" : null,
        "cite": null
    },</p>
<p>    "br" : {
        "title": null,
        "clear": null
    },</p>
<p>    "caption" : {
        "title": null,
        "dir" : null,
        "align": null
    },</p>
<p>    "center" : {
        "title": null,
        "dir" : null
    },</p>
<p>    "cite" : {
        "title": null,
        "dir" : null
    },</p>
<p>    "code" : {
        "title": null,
        "dir" : null
    },</p>
<p>    "col" : {
        "title": null,
        "dir" : null,
        "span" : null,
        "width" : null,
        "align" : null,
        "char" : null,
        "charoff" : null,
        "valign" : null
    },</p>
<p>    "colgroup" : {
        "title": null,
        "dir" : null,
        "span" : null,
        "width" : null,
        "align" : null,
        "char" : null,
        "charoff" : null,
        "valign" : null
    },</p>
<p>    "dd" : {
        "title": null,
        "dir" : null
    },</p>
<p>    "del" : {
        "title": null,
        "dir" : null,
        "cite" : null,
        "datetime" : null
    },</p>
<p>    "dfn" : {
        "title": null,
        "dir" : null
    },</p>
<p>    "div" : {
        "title": null,
        "dir" : null,
        "align" : null
    },</p>
<p>    "dl": {
        "title": null,
        "dir" : null,
        "compact" : null
    },</p>
<p>    "dt": {
        "title": null,
        "dir" : null
    },</p>
<p>    "em": {
        "title": null,
        "dir" : null
    },</p>
<p>    "font": {
        "title": null,
        "dir" : null,
        "size" : null,
        "color" : null,
        "face" : null
    },</p>
<p>    "h1": {
        "title": null,
        "dir" : null,
        "align" : null
    },</p>
<p>    "h2": {
        "title": null,
        "dir" : null,
        "align" : null
    },</p>
<p>    "h3": {
        "title": null,
        "dir" : null,
        "align" : null
    },</p>
<p>    "h4": {
        "title": null,
        "dir" : null,
        "align" : null
    },</p>
<p>    "h5": {
        "title": null,
        "dir" : null,
        "align" : null
    },</p>
<p>    "h6": {
        "title": null,
        "dir" : null,
        "align" : null
    },</p>
<p>    "hr": {
        "title": null,
        "dir" : null,
        "align" : null,
        "noshade" : null,
        "size" : null,
        "width" : null
    },</p>
<p>    "i": {
        "title": null,
        "dir" : null
    },</p>
<p>    "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
    },</p>
<p>    "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
    },</p>
<p>    "ins": {
        "title": null,
        "dir" : null,
        "cite" : null,
        "datetime" : null
    },</p>
<p>    "kbd": {
        "title": null,
        "dir" : null
    },</p>
<p>    "li": {
        "title": null,
        "dir" : null,
        "type" : null,
        "value" : null
    },</p>
<p>    "map": {
        "dir" : null,
        "title" : null,
        "name" : null
    },</p>
<p>    "ol": {
        "title" : null,
        "dir" : null,
        "type" : null,
        "compact" : null,
        "start" : null
    },</p>
<p>    "p": {
        "title" : null,
        "dir" : null,
        "align" : null
    },</p>
<p>    "pre": {
        "title" : null,
        "dir" : null,
        "width" : null
    },</p>
<p>    "s": {
        "title" : null,
        "dir" : null
    },</p>
<p>    "samp": {
        "title" : null,
        "dir" : null
    },</p>
<p>    "small": {
        "title" : null,
        "dir" : null
    },</p>
<p>    "span": {
        "title" : null,
        "dir" : null
    },</p>
<p>    "strike": {
        "title" : null,
        "dir" : null
    },</p>
<p>    "strong": {
        "title" : null,
        "dir" : null
    },</p>
<p>    "sub": {
        "title" : null,
        "dir" : null
    },</p>
<p>    "sup": {
        "title" : null,
        "dir" : null
    },</p>
<p>    "table": {
        "title" : null,
        "dir" : null,
        "summary" : null,
        "width" : null,
        "border" : null,
        "cellspacing" : null,
        "cellpadding" : null,
        "align" : null,
        "bgcolor" : null
    },</p>
<p>    "tbody": {
        "title" : null,
        "dir" : null,
        "align" : null,
        "char" : null,
        "charoff" : null,
        "valign" : null
    },</p>
<p>    "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
    },</p>
<p>    "tfoot": {
        "title" : null,
        "dir" : null,
        "align" : null,
        "char" : null,
        "charoff" : null,
        "valign" : null
    },</p>
<p>    "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
    },</p>
<p>    "thead": {
        "title" : null,
        "dir" : null,
        "align" : null,
        "char" : null,
        "charoff" : null,
        "valign" : null
    },</p>
<p>    "tr": {
        "title" : null,
        "dir" : null,
        "align" : null,
        "char" : null,
        "charoff" : null,
        "valign" : null,
        "bgcolor" : null
    },</p>
<p>    "tt": {
        "title" : null,
        "dir" : null
    },</p>
<p>    "u": {
        "title" : null,
        "dir" : null
    },</p>
<p>    "ul": {
        "title" : null,
        "dir" : null,
        "type" : null,
        "compact" : null
    },</p>
<p>    "var": {
        "title" : null,
        "dir" : null
    }
};</p>
<p>Evernote.ClipRules.NOKEEP_NODE_ATTRIBUTES = {
    "style" : null,
    "tabindex" : null
};</p>
<p>Evernote.ClipRules.CONDITIONAL_NODES = {
    "EMBED" : null,
    "OBJECT" : null,
    "IMG" : null,
    "VIDEO" : null
};</p>
<p>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"
};</p>
<p>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
};</p>
<p>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
};</p>
<p>Evernote.ClipRules.NON_ANCESTOR_NODES = {
    "OL" : null,
    "UL" : null,
    "LI" : null
};</p>
<p>Evernote.ClipRules.SELF_CLOSING_NODES = {
    "IMG" : null,
    //"INPUT" : null,
    "BR" : null
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![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 );
};</p>
<p>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"
];</p>
<p>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" ]
};</p>
<p>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" ]
};</p>
<p>Evernote.ClipStyle.CSS_GROUP.getExtForStyle = function ( name ) {
    var list = this[ name ];
    var extList = [ ];</p>
<p>    if ( list ) {
        for ( var i = 0; i < list.length; ++i ) {
            if ( list[ i ].indexOf( "+" ) >= 0 ) {
                var tmp = list[ i ];
                extList.push( tmp.replace( "+", "" ) );
            }
            else {
                extList.push( name + "-" + list[ i ] );
            }
        }
        return extList;
    }</p>
<p>    return null;
};</p>
<p>Evernote.ClipStyle.STYLE_ATTRIBUTES = {
    "bgcolor":"background-color",
    "text":"color"
};</p>
<p>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"
];</p>
<p>Evernote.ClipStyle.prototype._collection = null;
Evernote.ClipStyle.prototype._filterFn = null;
Evernote.ClipStyle.prototype._styleList = null;</p>
<p>Evernote.ClipStyle.prototype.initialize = function ( css, filterFn, styleList ) {
    Evernote.Logger.debug( "ClipStyle.initialize()" );</p>
<p>    this._collection = new Evernote.StylesCollection();
    Evernote.Logger.debug( "ClipStyle.initialize: collection initialized()" );
    this._filterFn = (typeof filterFn == "function") ? filterFn : null;
    this._styleList = (styleList != null) ? styleList : Evernote.ClipStyle.STYLES;
    if(css) {
        this.addStyle( css, this._styleList );
    }
    Evernote.Logger.debug( "ClipStyle.initialize() end ");
};</p>
<p>Evernote.ClipStyle.prototype.fixBackground = function ( prop, value ) {
    if(prop &#038;&#038; value) {
        if(prop.indexOf("background-image") != -1 &#038;&#038; value.indexOf("url") != -1) {
            Evernote.Logger.debug("Start replace");
            var regExp = /url\((.*?)\)/;
            var res = value.replace(regExp, "url('$1')").replace(/('")|("')|('')/g, "'");
            Evernote.Logger.debug("End replace");
            return Evernote.GlobalUtils.escapeXML(res);</p>
<p>        }
    }
    return value;
};</p>
<p>Evernote.ClipStyle.prototype.addStyle = function ( style, styleList ) {
    Evernote.Logger.debug( "ClipStyle.addStyle()" );
    if ( style.length > 0 ) {
        var list = (styleList != null) ? styleList : this._styleList;
        for ( var i = 0; i < list.length; ++i ) {
            var prop = list[ i ];
            var value = Evernote.StyleElementExtension.getPropertyValue(style, prop );
            var importantPriority = !!((style.getPropertyPriority(prop) == 'important'));
            value = this.fixBackground(prop, value);
            this.addSimpleStyle( prop, value, importantPriority );
        }
    }
    else if ( style instanceof Evernote.ClipStyle ) {
        list = (styleList != null) ? styleList : style.getStylesNames();
        for ( var i = 0; i < list.length; ++i ) {
            var prop = list[ i ];
            value = style.getStyle( prop );
            importantPriority = style.isImportant( prop );
            value = this.fixBackground(prop, value);
            this.addSimpleStyle( prop, value, importantPriority );
        }
    }
    else if ( typeof style == 'object' &#038;&#038; style != null ) {
        list = (styleList != null) ? styleList : style;
        for ( var prop in list ) {
            // In some cases, attempt to get currentStyle.outline ( or outlineWidth ) property in IE8 throws
            // 'unspecified error' and crash whole serilization process. So we wrap it into try {...} catch.</p>
<p>            try {
                if ( list.hasOwnProperty( prop ) ) {
                    var usedStyle = style[ prop ];
                    var pName = prop;
                    if(!usedStyle) {
                        usedStyle = style [list[prop]];
                        pName = list[prop];
                        if(!usedStyle) {
                            var propName = Evernote.IEStylePropertiesMapping.getPropertyNameFor(list[prop]);
                            if(propName) {
                                usedStyle = style[propName[1]];
                            }
                        }
                    }
                    usedStyle = this.fixBackground(pName, usedStyle);
                    this.addSimpleStyle( pName, usedStyle );
                }
            }  catch (err) {}
        }
    }
};</p>
<p>Evernote.ClipStyle.prototype.removeStyle = function ( style ) {
    Evernote.Logger.debug( "ClipStyle.removeStyle()" );
    if(style) {
        if ( window.CSSStyleDeclaration &#038;&#038; 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")
};</p>
<p>Evernote.ClipStyle.prototype.mergeStyle = function ( style, override ) {
    Evernote.Logger.debug( "ClipStyle.mergeStyle()" );</p>
<p>    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 ) &#038;&#038; !this._collection.isImportant( styleName )) ) {
                var newValue = style.getStyle( styleName );
                if ( style.isImportant( styleName ) ) {
                    this._collection.addStyle( styleName, newValue, true );
                }
                else if ( override &#038;&#038; !this._collection.isImportant( styleName ) ) {
                    this._collection.addStyle( styleName, newValue, false );
                }
                else if ( styleValue == null &#038;&#038; !override ) {
                    this._collection.addStyle( styleName, newValue, style.isImportant( styleName ) );
                }
            }
        }
    }
};</p>
<p>Evernote.ClipStyle.prototype.getStylesNames = function () {
    return this._collection.getStylesNames();
};</p>
<p>Evernote.ClipStyle.prototype.getStyle = function ( prop ) {
    return this._collection.getStyle( prop );
};</p>
<p>Evernote.ClipStyle.prototype.isImportant = function ( prop ) {
    return this._collection.isImportant( prop );
};</p>
<p>Evernote.ClipStyle.prototype.addSimpleStyle = function ( prop, value, importantPriority ) {
    if ( typeof this._filterFn == "function" &#038;&#038; !this._filterFn( prop, value ) ) {
        return;
    }
    var impl = Evernote.StylesReplacementRegistry.getImplementationFor(prop);
    if(impl &#038;&#038; impl.getValue) {
        value = impl.getValue(value);
    }
    this._collection.addStyle( prop, value, importantPriority );
};</p>
<p>Evernote.ClipStyle.prototype.removeSimpleStyle = function ( prop ) {
    this._collection.removeStyle( prop );
};</p>
<p>Evernote.ClipStyle.prototype.toString = function () {
    var str = "";
    var stylesNames = this.getStylesNames();
    for ( var i = 0; i < stylesNames.length; ++i ) {
        var styleName = stylesNames[ i ];
        var value = this._collection.getStyle( styleName );
        if ( value != null &#038;&#038; value.length > 0 ) {
            str += styleName + ":" + value + ";";
        }
    }</p>
<p>    return str;
};</p>
<p>Evernote.ClipStyle.CSSDefaultStyle = {
    "background-attachment": "scroll",
    "background-color" : "transparent",
    "background-image" : "none",
    "background-position-x" : "0px",
    "background-position-y" : "0px",
    "background-repeat" : "repeat",
    "border-bottom-style" : "none",
    "border-bottom-width" : "medium",
    "border-left-style" : "none",
    "border-left-width" : "medium",
    "border-right-style" : "none",
    "border-right-width" : "medium",
    "border-top-style" : "none",
    "border-top-width" : "medium",
    "border-collapse" : "separate",
    "bottom" : "auto",
    "clear" : "none",
    "height" : "auto",
    "left" : "auto",
    "margin-bottom" : "0px",
    "margin-left" : "0px",
    "margin-right" : "0px",
    "margin-top" : "0px",
    "max-height" : "none",
    "max-width" : "none",
    "min-height" : "0px",
    "min-width" : "0px",
    "overflow" : "visible",
    "overflow-x" : "visible",
    "overflow-y" : "visible",
    "padding" : "0px",
    "padding-bottom" : "0px",
    "padding-left" : "0px",
    "padding-right" : "0px",
    "padding-top" : "0px",
    "page-break-before" : "auto",
    "page-break-after" : "auto",
    "position" : "static",
    "right" : "auto",
    "text-align" : "left",
    "text-decoration" : "none",
    "text-indent" : "0px",
    "text-overflow" : "clip",
    "top" : "auto",
    "width" : "auto"
};</p>
<p>Evernote.ClipStyle.prototype.removeDefaultCssStyle = function () {
    var stylesNames = this.getStylesNames();
    for ( var i = 0; i < stylesNames.length; ++i ) {
        var styleName = stylesNames[ i ];
        var defaultCssValue = Evernote.ClipStyle.CSSDefaultStyle[styleName];
        var value = this.getStyle( styleName );
        if (!value)
            continue;
        if (defaultCssValue == value) {
            this.removeStyle(styleName);
        }
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ClipStyleProperty = function ClipStyleProperty( name, value, isImportant ) {
    this.initialize( name, value, isImportant );
};</p>
<p>Evernote.ClipStyleProperty.prototype.initialize = function( name, value, isImportant ) {
    if ( typeof name == "string" &#038;&#038; typeof value == "string" ) {
        this._name = name;
        this._value = value;
    }</p>
<p>    this._isImportant = (isImportant) ? true : false;
};</p>
<p>Evernote.ClipStyleProperty.prototype._name = null;
Evernote.ClipStyleProperty.prototype._value = null;
Evernote.ClipStyleProperty.prototype._isImportant = null;</p>
<p>Evernote.ClipStyleProperty.prototype.name = function() {
    return this._name;
};</p>
<p>Evernote.ClipStyleProperty.prototype.value = function() {
    return this._value;
};</p>
<p>Evernote.ClipStyleProperty.prototype.isImportant = function() {
    return this._isImportant;
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/**
 * Represents DOM parser that could able to traverse the DOM node tree from specified root.
 * @param tab - current window object
 * @param range - current selection on the page (if any)
 * @constructor
 */
Evernote.DomParser = function DomParser( tab, range ) {
    this.initialize( tab, range );
};</p>
<p>Evernote.DomParser.prototype._tab = null;</p>
<p>/**
 * Update current parser data
 * @param tab - current window object
 * @param range - current selection on the page (if any)
 */
Evernote.DomParser.prototype.initialize = function ( tab, range ) {
    Evernote.Logger.debug( "DomSerializer.initialize()" );</p>
<p>    this._tab = tab;
    this._range = range;
};</p>
<p>/**
 * Determines if passed node should be serialized.
 * Node should not be initialized if one of the following is true:
 *  - node is rejected according to configuration
 *  - there is the selection on the page and this node is out of selection range.
 * @param node - DOM node
 * @return {Boolean}
 */
Evernote.DomParser.prototype.isNodeForSerialize = function ( node ) {
    if ( !node || Evernote.ClipRules.isRejectedNode( node ) || node.id == "evernoteContentClipperWait" ) {
        return false;
    }
    if(Evernote.ClipperElementsIdentifiers.match(node)) {
        Evernote.Logger.debug("Node is rejected because it is clipper information " + node.id);
        return false;
    }
    return (!this._range || this.isNodeInRange( node )) ? true : false;
};</p>
<p>/**
 * Determines whether passed node is inside the selection range. Returns true if it is, false otherwise.
 * @param node - DOM node
 * @return {Boolean}
 */
Evernote.DomParser.prototype.isNodeInRange = function ( node ) {
    Evernote.Logger.debug( "DomParser.isNodeInRange()" );</p>
<p>    var nodeRange, endsAfterNodeStart, startsBeforeNodeEnd;</p>
<p>    if (typeof node.ownerDocument.createRange == 'function') {
        // ie9, ie10, ie11</p>
<p>        if ( node &#038;&#038; this._range ) {
            nodeRange = node.ownerDocument.createRange();</p>
<p>            // create new selection from node, or node content
            try {
                nodeRange.selectNode( node );
            }
            catch ( e ) {
                nodeRange.selectNodeContents( node );
            }</p>
<p>            // compare boundary points of selection and current node.
            endsAfterNodeStart = this._range.compareBoundaryPoints( Range.START_TO_END, nodeRange ) == 1;
            startsBeforeNodeEnd = this._range.compareBoundaryPoints( Range.END_TO_START, nodeRange ) == -1;</p>
<p>            return endsAfterNodeStart &#038;&#038; startsBeforeNodeEnd;
        }
    } else {
        // ie7 , ie8
        nodeRange = node.ownerDocument.body.createTextRange();</p>
<p>        try {
            nodeRange.moveToElementText(node);
        } catch (e) {
            // [object Text]
            // probably, here should be analog for createRange().selectNodeContents();
            return true;
        }</p>
<p>        endsAfterNodeStart = this._range.compareEndPoints('EndToStart', nodeRange) == 1;
        startsBeforeNodeEnd = this._range.compareEndPoints('StartToEnd', nodeRange) == -1;</p>
<p>        return endsAfterNodeStart &#038;&#038; startsBeforeNodeEnd;
    }</p>
<p>    return false; // not found.
};</p>
<p>/**
 * Determines whether passed node is visible on the page.
 * @param node - DOM node.
 * @return {Boolean}
 */
Evernote.DomParser.prototype.isNodeVisible = function ( node ) {
    Evernote.Logger.debug( "DomParser.isNodeVisible()" );</p>
<p>    if ( !node ) {
        return false;
    }</p>
<p>    var compStyles = Evernote.ElementExtension.getComputedStyle( node, null, this._tab );
    return Evernote.StyleElementExtension.getPropertyValue(compStyles, "display" ) != "none";
};</p>
<p>Evernote.DomParser.prototype.parseAsync = function ( root, fullPage, serializer, callback ) {
    var PARSING_TIMEOUT_INTERVAL = 1000; //milliseconds</p>
<p>    if (!callback) {
        this.parse(root, fullPage, serializer);
        return;
    }</p>
<p>    if ( !root ) {
        throw new Error( "No root element for parsing" );
    }</p>
<p>    var node = root;
    var parentNode = null;
    var thizz = this;</p>
<p>    var asyncParser = function()
    {
        var parsingEnd = true;
        var startTimeParsing = new Date().getTime();
        while ( node ) {
            if ( node != root &#038;&#038; node.parentNode ) {
                parentNode = node.parentNode.serializedNode;
            }</p>
<p>            if ( thizz.isNodeForSerialize( node ) ) {
                if ( node.nodeType == Evernote.Node.TEXT_NODE ) {
                    serializer.textNode( node, thizz._range );
                }
                else if ( node.nodeType == Evernote.Node.ELEMENT_NODE &#038;&#038; thizz.isNodeVisible( node ) ) {
                    node.serializedNode = serializer.startNode( new Evernote.SerializedNode( node, parentNode ), root, fullPage );
                    if ( node.hasChildNodes() ) {
                        node = node.childNodes[ 0 ];
                        continue;
                    }
                    else {
                        serializer.endNode( node.serializedNode );
                        if ( node.serializedNode ) {
                            try {
                                delete node.serializedNode;
                            } catch(e) {
                                //If we are failed to delete the property, than just set it to undefined
                                node.serializedNode = undefined;
                            }
                        }
                    }
                }
            }</p>
<p>            /**
             * Check if there is a next node available and it is not the root
             */
            if ( node.nextSibling &#038;&#038; node != root ) {
                node = node.nextSibling;
            }
            else if ( node != root ) {
                while ( node.parentNode &#038;&#038; node != root ) {
                    node = node.parentNode;
                    try {
                        serializer.endNode( node.serializedNode );
                    } catch (err) {
                        node.serializedNode = undefined;
                        continue;
                    };
                    try {
                        delete node.serializedNode;
                    } catch (e) {
                        //If we are failed to delete the property, than just set it to undefined
                        node.serializedNode = undefined;
                    }</p>
<p>                    if ( node.nextSibling &#038;&#038; node != root ) {
                        node = node.nextSibling;
                        break;
                    }
                }</p>
<p>                if ( node == root ) {
                    break;
                }
            }
            else {
                break;
            }</p>
<p>            var endTimeParsing = new Date().getTime();
            if ( (endTimeParsing - startTimeParsing) >= PARSING_TIMEOUT_INTERVAL ) {
                Evernote.Logger.debug("Parsing interval timeout: " + (endTimeParsing - startTimeParsing));
                parsingEnd = false;
                break;
            }
        }</p>
<p>        if (parsingEnd) {
            Evernote.Logger.debug("Parsing end");
            callback();
        }else {
            Evernote.Logger.debug("Parsing repeat");
            setTimeout(asyncParser, 0);
        }
    };
    setTimeout(asyncParser, 0);
};</p>
<p>/**
 * Starts parsing from specified root.
 * @param root - starting DOM node.
 * @param fullPage - is user selects to serialize the full page
 * @param serializer - current serializer to be used to serialize the DOM node to string
 */
Evernote.DomParser.prototype.parse = function ( root, fullPage, serializer ) {
    Evernote.Logger.debug( "DomParser.parse()" );</p>
<p>    if ( !root ) {
        throw new Error( "No root element for parsing" );
    }</p>
<p>    var node = root;
    var parentNode = null;</p>
<p>    while ( node ) {
        if ( node != root &#038;&#038; node.parentNode ) {
            parentNode = node.parentNode.serializedNode;
        }</p>
<p>        if ( this.isNodeForSerialize( node ) ) {
            if ( node.nodeType == Evernote.Node.TEXT_NODE ) {
                serializer.textNode( node, this._range );
            }
            else if ( node.nodeType == Evernote.Node.ELEMENT_NODE &#038;&#038; this.isNodeVisible( node ) ) {
                node.serializedNode = serializer.startNode( new Evernote.SerializedNode( node, parentNode ), root, fullPage );
                if ( node.hasChildNodes() ) {
                    node = node.childNodes[ 0 ];
                    continue;
                }
                else {
                    serializer.endNode( node.serializedNode );
                    if ( node.serializedNode ) {
                        try {
                            delete node.serializedNode;
                        } catch(e) {
                            //If we are failed to delete the property, than just set it to undefined
                            node.serializedNode = undefined;
                        }
                    }
                }
            }
        }</p>
<p>        /**
         * Check if there is a next node available and it is not the root
         */
        if ( node.nextSibling &#038;&#038; node != root ) {
            node = node.nextSibling;
        }
        else if ( node != root ) {
            while ( node.parentNode &#038;&#038; node != root ) {
                node = node.parentNode;
                try {
                    serializer.endNode( node.serializedNode );
                } catch (err) {
                    node.serializedNode = undefined;
                    continue;
                };</p>
<p>                try {
                    delete node.serializedNode;
                } catch (e) {
                    //If we are failed to delete the property, than just set it to undefined
                    node.serializedNode = undefined;
                }</p>
<p>                if ( node.nextSibling &#038;&#038; node != root ) {
                    node = node.nextSibling;
                    break;
                }
            }</p>
<p>            if ( node == root ) {
                break;
            }
        }
        else {
            break;
        }
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.NodeSerializer = function NodeSerializer( tab, styleStrategy, includeBg , isRange) {
    this.initialize( tab, styleStrategy, includeBg , isRange);
};</p>
<p>Evernote.NodeSerializer.prototype._tab = null;
Evernote.NodeSerializer.prototype._styleStrategy = null;
Evernote.NodeSerializer.prototype._docBase = null;
Evernote.NodeSerializer.prototype._imagesUrls = null;
Evernote.NodeSerializer.prototype._isRange = null;
Evernote.NodeSerializer.prototype._serializedDom = "";
Evernote.NodeSerializer.prototype._includeBgStyles = true;</p>
<p>Evernote.NodeSerializer.prototype.initialize = function ( tab, styleStrategy, includeBg ,isRange ) {
    Evernote.Logger.debug( "DomSerializer.initialize()" );</p>
<p>    this._tab = tab;
    this._styleStrategy = (styleStrategy instanceof Evernote.ClipStylingStrategy) ? styleStrategy : null;
    this._imagesUrls = [ ];
    this._includeBgStyles = ( includeBg != null ) ? includeBg : true;
    this._isRange = ( isRange != null ) ? isRange : false;
    this.getDocumentBase();
};</p>
<p>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 ) &#038;&#038; 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;
        }</p>
<p>        if ( node.nodeName.toLowerCase() == "embed" ) {
            var src = node.getAttribute( "src" );
            if ( src &#038;&#038; (src.indexOf(".swf", src.length - ".swf".length) !== -1) ) {
                serializedNode.setStyle(new Evernote.ClipStyle());
                return serializedNode;
            }
        }</p>
<p>        if ( node.nodeName.toLowerCase() == "img" ) {
            var src = node.getAttribute( "src" );</p>
<p>            if (src &#038;&#038; src.indexOf('&#038;') != -1) {
                src =  src.slice(0, src.indexOf('&#038;'));
            }</p>
<p>            var absoluteSource = Evernote.Utils.makeAbsolutePath(this._docBase, src).replace(/\s/g, "%20");
            node.setAttribute( "type", "put-media-type-here-for-" + absoluteSource);
            node.setAttribute( "hash", "put-hash-type-here-for-" + absoluteSource);
            node.setAttribute( "src", src);</p>
<p>            if ( src &#038;&#038; src.indexOf( "data:image" ) < 0 ) {
                this._imagesUrls.push( src );
            }
        }</p>
<p>        var attrsStr = this.serializeAttributes( node );
        var stylesStr = "";</p>
<p>        var nodeName = Evernote.ClipRules.translateNode( node );</p>
<p>        if ( this._styleStrategy ) {</p>
<p>            var nodeStyle = this._styleStrategy.styleForNode( node, root, fullPage, Evernote.ClipStyleType.Default ).evaluated;</p>
<p>            var inhBgStyle = null;
            if ( this._includeBgStyles )
                inhBgStyle = this._styleStrategy.styleForNode( node, root, fullPage, Evernote.ClipStyleType.InheritedBgStyle ).inheritedBackground;</p>
<p>            if ( inhBgStyle != null )
                for ( var inhI = inhBgStyle.length - 1; inhI >= 0; inhI-- ) {
                    var inhStyle = inhBgStyle[inhI];
                    this._serializedDom += "</p>
<div " + this.serializeStyles( node, inhStyle ) + " >";
                    serializedNode.translateTo.push( "div" );
                }</p>
<p>            var pseudoStyle = this._styleStrategy.getNodeStyle( node, null, ":before" );</p>
<p>            if ( fullPage &#038;&#038; node.nodeName.toLowerCase() == "body" ) {
                var wrapBodyStyle = new Evernote.ClipStyle( nodeStyle, null, Evernote.ClipStyle.CSS_GROUP.getExtForStyle( "background" ) );
                this._serializedDom += "<" + "div" + " " + this.serializeStyles( node, wrapBodyStyle ) + " >";
                serializedNode.translateTo.push( "div" );
                var bgGroup = Evernote.ClipStyle.CSS_GROUP.getExtForStyle( "background" );
                for ( var ind in bgGroup ) {
                    if ( bgGroup.hasOwnProperty( ind ) ) {
                        nodeStyle.removeStyle( bgGroup[ind] );
                    }
                }
            }</p>
<p>            // Bug 47705. dirty fix, may cause problems in some cases.
            if (this._isRange) {
                nodeStyle.addSimpleStyle('height', node.currentStyle.height);
            }</p>
<p>            if ( !fullPage &#038;&#038; node == root ) {
                nodeStyle.removeStyle( "float" );
            }
            if ( !serializedNode.node.hasChildNodes() &#038;&#038; !(nodeStyle.getStyle( "height" ) || node.getAttribute( "height" )) ) {
                nodeStyle.addStyle( {height:"0px"} );
            }
            if ( !serializedNode.node.hasChildNodes() &#038;&#038; !(nodeStyle.getStyle( "width" ) || node.getAttribute( "width" )) ) {
                nodeStyle.addStyle( {width:"0px"} );
            }
            if(nodeStyle.getStyle("position") == "fixed") {
                nodeStyle.addStyle({position: "absolute"});
            }</p>
<p>            if ( (node.nodeName.toUpperCase() == "SPAN"/* || node.nodeName.toUpperCase() == "A"*/) &#038;&#038; node.getElementsByTagName( "IMG" ).length > 0) {
                nodeName = "div";
                if ( !nodeStyle.getStyle( "display" ) )
                    nodeStyle.addStyle( {display:"inline"} );
            }
            if (node.nodeName.toUpperCase() == "TH" || node.nodeName.toUpperCase() == "TD") {
                nodeStyle.addStyle( {display:"table-cell"} );
            }</p>
<p>            nodeStyle.removeDefaultCssStyle();</p>
<p>            this._serializedDom += this.serializePseudoElement( node, pseudoStyle );
            stylesStr = this.serializeStyles( node, nodeStyle );</p>
<p>            if ( (nodeName.toLowerCase() == "div" /*|| nodeName.toLowerCase() == "span"*/) &#038;&#038; nodeStyle.getStyle( "float" ) &#038;&#038; nodeStyle.getStyle( "float" ) != "none" &#038;&#038; serializedNode.parentNode &#038;&#038; node.parentNode.nodeName.toLowerCase() != "a" ) {
                if ( !serializedNode.node.nextSibling || serializedNode.node.nextSibling.nodeType == 3 )
                    serializedNode.parentNode.isInlineBlock = true;
            }
        }</p>
<p>        Evernote.Logger.debug( node.nodeName + " " + attrsStr + " -> " + nodeName + " " + stylesStr );</p>
<p>        this._serializedDom += "<" + nodeName + " " + attrsStr + " " + stylesStr + " >";</p>
<p>        serializedNode.setStyle(nodeStyle);
        serializedNode.translateTo.push( nodeName );
        return serializedNode;
    }
    catch ( e ) {
        Evernote.Logger.error( "Failed to start serialize node :" + e );
        throw e;
    }
};</p>
<p>Evernote.NodeSerializer.prototype.serializePseudoElement = function ( node, pseudoStyle ) {
    try {
        var nodeName = Evernote.ClipRules.translateNode( node );
        if ( pseudoStyle.getStylesNames().length > 0 ) {
            var content = "&nbsp;";
            if ( pseudoStyle.getStyle( "content" ) ) {
                content = pseudoStyle.getStyle( "content" );
                pseudoStyle.removeStyle( "content" );
            }
            var beforeStylesStr = this.serializeStyles( node, pseudoStyle );
            return "<" + nodeName + " " + beforeStylesStr + " >" + content.replace( /"/g, '' ) + "</" + nodeName + ">";
        }
        return "";
    }
    catch ( e ) {
        Evernote.Logger.error( "Failed to  serialize pseudo element :" + e );
        throw e;
    }
};</p>
<p>Evernote.NodeSerializer.prototype.textNode = function ( node, range ) {
    this._serializedDom += this.serializeTextNode( node, range );
};</p>
<p>Evernote.NodeSerializer.prototype.endNode = function ( serializedNode ) {
    try {
        Evernote.Logger.debug( "end serialize node :" + serializedNode.translateTo );</p>
<p>        if ( serializedNode.isInlineBlock ) {
            var name = "div";
            if ( serializedNode.node.nodeName.toLowerCase() == "ul" ) {
                name = "li"
            }
            this._serializedDom += "<" + name + " style=\"clear: both; width: 0px; height: 0px;\">" + "&nbsp;" + "</" + name + ">"
        }</p>
<p>        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 &#038;&#038; !pseudoStyle.getStyle( "float" ) )
                    pseudoStyle.addStyle( { "float" : floatStyle } );</p>
<p>                if ( node.nodeName.toLowerCase() == "ul" )
                    serializedPseudo = this.serializePseudoElement( document.createElement( "div" ), pseudoStyle );
            }
        }</p>
<p>        while ( serializedNode.translateTo.length > 0 ) {
            var nodeName = serializedNode.translateTo.pop();
            if ( !Evernote.ClipRules.isSelfClosingNode( serializedNode.node ) ) {
                if ( !serializedNode.node.hasChildNodes() )
                    this._serializedDom += "&nbsp;";
            }</p>
<p>            if ( nodeName.toLowerCase() == "ul" ) {
                this._serializedDom += this.serializePseudoElement( document.createElement( "li" ), pseudoStyle );
            }
            this._serializedDom += "</" + nodeName + ">";
        }</p>
<p>        this._serializedDom += serializedPseudo;
    }
    catch ( e ) {
        Evernote.Logger.error( "Failed to end serialize node :" + e );
        throw e;
    }
};</p>
<p>Evernote.NodeSerializer.prototype.serializeTextNode = function ( node, range ) {
    Evernote.Logger.debug( "DomSerializer.serializeTextNode()" );</p>
<p>    try {
        var nodeValue = node.nodeValue;
        if ( !range ) {
            return Evernote.Utils.htmlEncode( nodeValue );
        }
        else {
            if ( range.startContainer == node &#038;&#038; 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;
    }</p>
<p>    return "";
};</p>
<p>Evernote.NodeSerializer.prototype.serializeConditionalNode = function ( node, root, fullPage ) {
    Evernote.Logger.debug( "DomSerializer.serializeConditionalNode()" );
    var impl = Evernote.ElementSerializerFactory.getImplementationFor( node );
    if ( typeof impl == 'function' ) {
        var nodeStyle = (this._styleStrategy) ? this._styleStrategy.styleForNode( node, root, fullPage ).evaluated : null;
        if (nodeStyle)
            nodeStyle.removeDefaultCssStyle();
        var serializer = new impl( node, nodeStyle );
        var content = serializer.serialize( this._docBase );
        var imageUrl = serializer.getImageUrl();</p>
<p>        return { content:content, imageUrl:imageUrl, nodeStyle:nodeStyle };
    }</p>
<p>    return { content:"", imageUrl:"", nodeStyle:new Evernote.ClipStyle() };
};</p>
<p>Evernote.NodeSerializer.prototype.serializeAttributes = function ( node ) {
    Evernote.Logger.debug( "DomSerializer.serializeAttributes()" );</p>
<p>    try {
        var attrs = node.attributes;
        var str = "";</p>
<p>        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") &#038;&#038; attrValue.toLowerCase().indexOf( "http" ) != 0 ) {
                    attrValue = Evernote.Utils.makeAbsolutePath( this._docBase, attrValue );
                }
                str += " " + attrs[ i ].name.toLowerCase() + "=\"" + attrValue + "\"";
            }
        }</p>
<p>        return str;
    }
    catch ( e ) {
        Evernote.Logger.error( "DomSerializer.serializeAttributes() failed: error = " + e );
    }</p>
<p>    return "";
};</p>
<p>Evernote.NodeSerializer.prototype.serializeStyles = function ( node, nodeStyle ) {
    Evernote.Logger.debug( "DomSerializer.serializeStyles()" );</p>
<p>    try {
        var str = "";
        if(node.nodeName.toLowerCase() == "map") {
            //Map should not have style attribute according to Evernote DTD
            return "";
        }
        if ( node &#038;&#038; 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 "";
};</p>
<p>Evernote.NodeSerializer.prototype.getDocumentBase = function () {
    Evernote.Logger.debug( "DomSerializer.getDocumentBase()" );</p>
<p>    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' &#038;&#038; baseTag.indexOf( "http" ) == 0 ) {
                this._docBase = baseTag;
            }
            if ( this._docBase ) {
                break;
            }
        }</p>
<p>        if ( !this._docBase ) {
            var location = this._tab.document.location;
            this._docBase = location.protocol + "//" + location.host + location.pathname.replace( /[^\/]+$/, "" );
        }
    }</p>
<p>    return this._docBase;
};</p>
<p>Evernote.NodeSerializer.prototype.getImagesUrls = function () {
    return this._imagesUrls;
};</p>
<p>Evernote.NodeSerializer.prototype.getSerializedDom = function () {
    return '</p>
<div style="position: relative;">' + this._serializedDom.replace(/[^\u0009\u000a\u000d\u0020-\uD7FF\uE000-\uFFFD]+/g, "") + '</div>
<p>';
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
//"use strict";</p>
<p>Evernote.SerializedNode = function SerializedNode( node, parent ) {
    this.node = node;
    this._parentSerializedNode = parent;
    this.translateTo = [ ];
};</p>
<p>Evernote.SerializedNode.prototype.translateTo = null;
Evernote.SerializedNode.prototype.node = null;
Evernote.SerializedNode.prototype._parentSerializedNode = null;</p>
<p>Evernote.SerializedNode.prototype.setStyle = function ( clipStyle ) {
    this._clipStyle = clipStyle;
};</p>
<p>Evernote.SerializedNode.prototype.getStyle = function () {
    return this._clipStyle;
};</p>
<p>Evernote.SerializedNode.prototype.parentNode = function () {
    return this._parentSerializedNode;
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
//"use strict";</p>
<p>Evernote.StylesCollection = function StylesCollection() {
    this._styles = { };
};</p>
<p>Evernote.StylesCollection.prototype._styles = null;</p>
<p>Evernote.StylesCollection.prototype.addStyle = function( name, value, isImportant ) {
    if ( typeof name == "string" &#038;&#038; typeof value == "string" ) {
        Evernote.Logger.debug( "StylesCollection.addStyle(): name = " + name + ", value = " + value + ", isImportant = " + isImportant );
        this._styles[ name ] = new Evernote.ClipStyleProperty( name, value, isImportant);
    }
};</p>
<p>Evernote.StylesCollection.prototype.getStyle = function( name ) {
    if ( typeof name == "string" ) {
        Evernote.Logger.debug( "StylesCollection.getStyle(): name = " + name + " value: " + ((typeof this._styles[ name ] != "undefined") ? this._styles[ name ].value() : null) );
        return (typeof this._styles[ name ] != "undefined") ? this._styles[ name ].value() : null;
    }</p>
<p>    return null;
};</p>
<p>Evernote.StylesCollection.prototype.removeStyle = function( name ) {
    if ( typeof name == "string" ) {
        Evernote.Logger.debug( "StylesCollection.removeStyle(): name = " + name );</p>
<p>        this._styles[ name ] = null;
        delete this._styles[ name ];
    }
};</p>
<p>Evernote.StylesCollection.prototype.isImportant = function( name ) {
    if ( typeof name == "string" ) {
        return (typeof this._styles[ name ] != "undefined") ? this._styles[ name ].isImportant() : false;
    }
};</p>
<p>Evernote.StylesCollection.prototype.getStylesNames = function() {
    Evernote.Logger.debug( "StylesCollection.getStylesNames()" );</p>
<p>    var stylesNames = [ ];
    for ( var key in this._styles ) {
        if ( this._styles[ key ] != null ) {
            stylesNames.push( key );
        }
    }</p>
<p>    return stylesNames;
};</p>
<p>Evernote.StylesCollection.prototype.getStylesNumber = function() {
    Evernote.Logger.debug( "StylesCollection.getStylesNumber()" );</p>
<p>    var num = 0;
    for ( var key in this._styles ) {
        if ( this._styles[ key ] != null ) {
            ++num;
        }
    }</p>
<p>    return num;
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.DataImageSerializer = function DataImageSerializer( node, nodeStyle ) {
    if ( !nodeStyle ) {
        nodeStyle = new Evernote.ClipStyle();
    }</p>
<p>    this.initialize( node, nodeStyle );
};</p>
<p>Evernote.inherit( Evernote.DataImageSerializer, Evernote.AbstractElementSerializer, true );</p>
<p>Evernote.DataImageSerializer.isResponsibleFor = function( node ) {
    try {
        if ( node &#038;&#038; node.nodeType == Evernote.Node.ELEMENT_NODE &#038;&#038; node.nodeName.toLowerCase() == "img" ) {
            var src = node.getAttribute( "src" );
            if ( src &#038;&#038; src.indexOf( "data:image" ) != -1 ) {
                return true;
            }
        }
    } catch(e) {
        Evernote.Logger.error("DataImageSerializer.isResponsibleFor failed due to error " + e);
    }
    return false;
};</p>
<p>Evernote.DataImageSerializer.prototype.serialize = function( /*docBase*/ ) {
    Evernote.Logger.debug( "DataImageSerializer.serialize()" );</p>
<p>    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" } );</p>
<p>        return "<span style=\"" + this._nodeStyle.toString().replace( /"/g, "" ) + "\"" + ">&nbsp;</span>";
    }
    catch ( e ) {
        Evernote.Logger.error( "DataImageSerializer.serialize() failed: error = " + e );
    }</p>
<p>    return "";
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.VideoElementSerializer = function VideoElementSerializer( node, nodeStyle ) {
    this.initialize( node, nodeStyle );
};</p>
<p>Evernote.inherit( Evernote.VideoElementSerializer, Evernote.AbstractElementSerializer, true );</p>
<p>Evernote.VideoElementSerializer.isResponsibleFor = function( node ) {
    return node &#038;&#038; node.nodeType == Evernote.Node.ELEMENT_NODE &#038;&#038; node.nodeName.toLowerCase() == "video";
};</p>
<p>Evernote.VideoElementSerializer.prototype.serialize = function( /*docBase*/ ) {
    Evernote.Logger.debug( "VideoElementSerializer.serialize()" );</p>
<p>    try {
        var width = this._node.offsetWidth;
        var height = this._node.offsetHeight;
        var doc = this._node.ownerDocument;</p>
<p>        var canvas = doc.createElement( "CANVAS" );
        canvas.width = width;
        canvas.height = height;</p>
<p>        var context = canvas.getContext( "2d" );
        context.drawImage( this._node, 0, 0, width, height );</p>
<p>        var dataUrl = canvas.toDataURL( "image/png" );
        context.clearRect( 0, 0, width, height );</p>
<p>        this._nodeStyle.addStyle( { "background-image" : "url('" + dataUrl + "')",
            "width" : width + "px",
            "height" : height + "px",
            "display" : "block" } );</p>
<p>        return "<a style=\"" + this._nodeStyle.toString().replace( /"/g, "" ) + "\"" + "href='" + doc.defaultView.location.href + "'>&nbsp;</a>";
    }
    catch ( e ) {
        Evernote.Logger.error( "VideoElementSerializer.serialize() failed: error = " + e );
    }</p>
<p>    return "";
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![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:
 *
 *</p>
<pre>
 *   - 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)
 *</pre>
<p>*
 * Sample URLs are:
 *
 *</p>
<pre>
 * http: //www.youtube.com/embed/IWJJBwKhvp4?wmode=opaque&amp;rel=0
 * http: //www.youtube.com/v/YZEbBZ2IrXE?version=3&amp;rel=1&amp;fs=1&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1
 * http: //www.youtube.com/v/J3mjFSTsKiM&amp;hl=en&amp;fs=1
 * http://www.youtube.com/watch?v=cAcxHQalWOw
 * http://www.youtube.com/user/IFiDieApp?v=sdzCELofGgE&#038;feature=pyv
 *</pre>
<p>*/</p>
<p>Evernote.YoutubeElementSerializer = function YoutubeElementSerializer( doc, node, nodeStyle ) {
    this.initialize( doc, node, nodeStyle );
};</p>
<p>Evernote.inherit( Evernote.YoutubeElementSerializer, Evernote.AbstractElementSerializer, true );</p>
<p>Evernote.YoutubeElementSerializer.WATCH_URL_REGEX = /^https?:\/\/www\.youtube\.com\/watch\?.*v=([^&#038;]+)/i;
Evernote.YoutubeElementSerializer.USER_CHANNEL_URL_REGEX = /^https?:\/\/www\.youtube\.com\/user\/([a-zA-Z0-9]+)\?v=([^&#038;]+)/i;
Evernote.YoutubeElementSerializer.EMBED_URL_REGEX = /^https?:\/\/www\.youtube\.com\/embed\/([^\/\?&#038;]+)/i;
Evernote.YoutubeElementSerializer.VIDEO_URL_REGEX = /^https?:\/\/www\.youtube\.com\/v\/([^\/\?&#038;]+)/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;</p>
<p>Evernote.YoutubeElementSerializer.isResponsibleFor = function( node ) {
    var params = this.extractVideoParamsFromNode( node );
    return (params) ? true : false;
};</p>
<p>Evernote.YoutubeElementSerializer.extractVideoParamsFromNode = function( node ) {
    Evernote.Logger.debug( "YoutubeElementSerializer.extractVideoIdFromNode()" );
    try {
        if ( node &#038;&#038; node.nodeType == Evernote.Node.ELEMENT_NODE ) {
            var view = window;
            try {
                view = node.ownerDocument.defaultView;
            }
            catch ( e ) {
            }</p>
<p>            var matches = null;
            if ( view &#038;&#038; (node.nodeName.toLowerCase() == "embed" || node.nodeName.toLowerCase() == "object") &#038;&#038; view.location ) {
                if ( (matches = view.location.href.match( this.WATCH_URL_REGEX )) &#038;&#038; matches[ 1 ] ) {
                    return matches[ 1 ];
                }
                else if ( (matches = view.location.href.match( this.USER_CHANNEL_URL_REGEX )) &#038;&#038; matches[ 1 ] &#038;&#038; matches[ 2 ] ) {
                    return [ matches[ 1 ], matches[ 2 ] ];
                }
            }
            else {
                var videoNode = this.findVideoNode( node );
                if ( videoNode ) {
                    var src = videoNode.getAttribute( "src" );
                    if ( src &#038;&#038; (matches = src.match( this.EMBED_URL_REGEX )) &#038;&#038; matches[ 1 ] ) {
                        return matches[ 1 ];
                    }
                    else if ( src &#038;&#038; (matches = src.match( this.VIDEO_URL_REGEX )) &#038;&#038; matches[ 1 ] ) {
                        return matches[ 1 ];
                    }
                }
            }
        }
    } catch(e) {
        Evernote.Logger.error("failed to YoutubeElementSerializer.extractVideoParamsFromNode due to error " + e);
    }</p>
<p>    return null;
};</p>
<p>Evernote.YoutubeElementSerializer.findVideoNode = function( node ) {
    Evernote.Logger.debug( "YoutubeElementSerializer.findVideoNode()" );</p>
<p>    if ( node &#038;&#038; 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;</p>
<p>                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;
            }
        }
    }</p>
<p>    return null;
};</p>
<p>Evernote.YoutubeElementSerializer.prototype._imageUrl = "";</p>
<p>Evernote.YoutubeElementSerializer.prototype.serialize = function( /*docBase*/ ) {
    Evernote.Logger.debug( "YoutubeElementSerializer.serialize()" );</p>
<p>    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;
        }</p>
<p>        if ( videoId ) {
            var thumbUrl = null;
            var w = 0;
            var h = 0;</p>
<p>            if ( this._nodeStyle ) {</p>
<p>                var view = window;
                try {
                    view = this._node.ownerDocument.defaultView;
                }
                catch ( e ) {
                }</p>
<p>                var computedStyles = Evernote.ElementExtension.getComputedStyle( this._node, null, view );</p>
<p>                w = parseInt( Evernote.StyleElementExtension.getPropertyValue(computedStyles, "width" ) );
                w = (isNaN( w )) ? 0 : w;</p>
<p>                h = parseInt( Evernote.StyleElementExtension.getPropertyValue(computedStyles, "height" ) );
                h = (isNaN( h )) ? 0 : h;</p>
<p>                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 );
            }</p>
<p>            if ( thumbUrl ) {
                var styleStr = (this._nodeStyle instanceof Evernote.ClipStyle) ? ("style=\"" + this._nodeStyle.toString() + "\"") : "";
                var attrs = this._node.attributes;
                var attrStr = "";</p>
<p>                for ( var i = 0; i < attrs.length; ++i ) {
                    var attr = attrs[ i ];
                    if(Evernote.ClipRules.KEEP_NODE_ATTRIBUTES["a"][attr.name]) {
                        attrStr += attr.name;
                        if ( attr.value ) {
                            attrStr += "=" + attr.value;
                        }
                        attrStr += " ";
                    }
                }</p>
<p>                var href = ( userId ) ? this.getUserChannelUrl( userId, videoId ) : this.getWatchUrl( videoId );
                var imgAttrStr = "";</p>
<p>                if ( w &#038;&#038; h ) {
                    var k = w / h;
                    // scale by height
                    if ( k > this.constructor.DEFAULT_THUMB_WIDTH / this.constructor.DEFAULT_THUMB_HEIGHT ) {
                        imgAttrStr += "height=\"" + h + "\"";
                    }
                    else { // scale by width
                        imgAttrStr += "width=\"" + w + "\"";
                    }
                }</p>
<p>                this._imageUrl = thumbUrl;
                return "<a " + styleStr + " " + attrStr + " href=\"" + href + "\"><img src=\"" + thumbUrl + "\" " + imgAttrStr + "/></a>";
            }
        }
    }
    catch ( e ) {
        Evernote.Logger.error( "YoutubeElementSerializer.serialize() failed: error = " + e );
    }</p>
<p>    return "";
};</p>
<p>Evernote.YoutubeElementSerializer.prototype.getDefaultThumbnailUrl = function( videoId ) {
    return this.constructor.DEFAULT_THUMB_URL.replace( /\$videoId\$/, videoId );
};</p>
<p>Evernote.YoutubeElementSerializer.prototype.getHQThumbnailUrl = function( videoId ) {
    return this.constructor.HQ_THUMB_URL.replace( /\$videoId\$/, videoId );
};</p>
<p>Evernote.YoutubeElementSerializer.prototype.getWatchUrl = function( videoId ) {
    return this.constructor.WATCH_URL.replace( /\$videoId\$/, videoId );
};</p>
<p>Evernote.YoutubeElementSerializer.prototype.getUserChannelUrl = function( userId, videoId ) {
    return this.constructor.USER_CHANNEL_URL.replace( /\$userId\$/, userId ).replace( /\$videoId\$/, videoId );
};</p>
<p>Evernote.YoutubeElementSerializer.prototype.getImageUrl = function() {
    return this._imageUrl;
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.IEStylePropertiesMapping = {</p>
<p>    _mapping : {
        "background-attachment" : "backgroundAttachment",
        "background-color" : "backgroundColor",
        "background-image" : "backgroundImage",
        "background-repeat" : "backgroundRepeat",
        "background-position-x" : "backgroundPositionX",
        "background-position-y" : "backgroundPositionY",</p>
<p>        "border-bottom-color" : "borderBottomColor",
        "border-bottom-style" : "borderBottomStyle",
        "border-bottom-width" : "borderBottomWidth",</p>
<p>        "border-left-color" : "borderLeftColor",
        "border-left-style" : "borderLeftStyle",
        "border-left-width" : "borderLeftWidth",</p>
<p>        "border-right-color" : "borderRightColor",
        "border-right-style" : "borderRightStyle",
        "border-right-width" : "borderRightWidth",</p>
<p>        "border-top-color" : "borderTopColor",
        "border-top-style" : "borderTopStyle",
        "border-top-width" : "borderTopWidth",
        "border-collapse" : "borderCollapse",</p>
<p>        "font-family" : "fontFamily",
        "font-size" : "fontSize",
        "font-style" : "fontStyle",
        "font-weight" : "fontWeight",</p>
<p>        "float" : "styleFloat",</p>
<p>        "ime-mode" : "imeMode",</p>
<p>        "letter-spacing" : "letterSpacing",</p>
<p>        "line-height" : "lineHeight",</p>
<p>        "list-style-image" : "listStyleImage",
        "list-style-position" : "listStylePosition",
        "list-style-type" : "listStyleType",</p>
<p>        "margin-bottom" : "marginBottom",
        "margin-left" : "marginLeft",
        "margin-right" : "marginRight",
        "margin-top" : "marginTop",</p>
<p>        "max-height" : "maxHeight",
        "max-width" : "maxWidth",
        "min-height" : "minHeight",
        "min-width" : "minWidth",</p>
<p>        "overflow-x" : "overflowX",
        "overflow-y" : "overflowY",</p>
<p>        "padding-bottom" : "paddingBottom",
        "padding-left" : "paddingLeft",
        "padding-right" : "paddingRight",
        "padding-top" : "paddingTop",</p>
<p>        "page-break-after" : "pageBreakAfter",
        "page-break-before" : "pageBreakBefore",</p>
<p>        "table-layout" : "tableLayout",</p>
<p>        "text-align" : "textAlign",
        "text-decoration" : "textDecoration",
        "text-indent" : "textIndent",
        "text-overflow" : "textOverflow",
        "text-transform" : "textTransform",</p>
<p>        "vertical-align" : "verticalAlign",
        "white-space" : "whiteSpace",
        "word-spacing" : "wordSpacing",
        "word-wrap" : "wordWrap",
        "z-index" : "zIndex"
    },</p>
<p>    getPropertyNameFor: function(styleName) {
        return [styleName, this._mapping[styleName]];
    },
    getPropertiesList: function() {
        return this._mapping;
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.StylesReplacementRegistry = {</p>
<p>    registry: [],</p>
<p>    getImplementationFor: function(name) {
        if(name) {
            return this.registry[name];
        }
        return null;
    },</p>
<p>    register: function(name, impl) {
        this.registry[name] = impl;
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.FontSizeReplacement = {</p>
<p>    SUPPORTED_FONT_SIZES: ["em", "%", "pt", "px"],</p>
<p>    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;
        }
    },</p>
<p>    isCalculationRequired: function(val) {
        for(var i = 0; i < this.SUPPORTED_FONT_SIZES.length; i++) {
            if(val.indexOf(this.SUPPORTED_FONT_SIZES[i]) != -1) {
                return true;
            }
        }
        return false;
    }
};</p>
<p>Evernote.StylesReplacementRegistry.register("font-size", Evernote.FontSizeReplacement);
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ClipperElementsIdentifiers = {</p>
<p>    _clipperElementsIds : [Constants.CLIP_DIALOG_ID, Constants.OPTIONS_DIALOG_ID, Constants.ATTR_DIALOG_ID, Constants.CLIP_DIALOG_NEW_ID, Constants.POST_CLIP_DIALOG_ID],</p>
<p>    match: function(node) {
        if(node &#038;&#038; node.id) {
            var position = Evernote.ArrayExtension.indexOf(this._clipperElementsIds, node.id);
            if(position) {
                return position != -1;
            }
        }
        return false;
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.NotebooksLoader = {</p>
<p>    notebooks: [],</p>
<p>    // TODO: add cache;</p>
<p>    getNotebookByUid: function(uid) {
        Evernote.ResponseReceiver.subscribe(this);
        Evernote.Addin.getNotebooks(document);
        for(var i = 0; i < this.notebooks.length; i++) {
            if(this.notebooks[i].uid == uid) {
                return this.notebooks[i];
            }
        }
        return null;
    },</p>
<p>    onDataReceived: function(response) {
        if(response.type) {
            if(response.type == "notebooks") {
                this.notebooks = this.notebooks.concat(response.data);
            }
        }
    }
};</p>
<p>Evernote.NotebooksPopupLoader = function( subscriber , doc ) {
    this.subscriber = subscriber;
    this.doc = doc;
    this.cache = [];
};</p>
<p>Evernote.NotebooksPopupLoader.prototype.getNotebooksAsync = function( onSuccess ) {
    var self = this;
    var countNotebooksResponse = 0;</p>
<p>    Evernote.Addin.getNotebooksAsync(function(response, args)
    {
        if (Evernote.NotebookResponseParser.canParse(response))
        {
            var res = Evernote.NotebookResponseParser.parse(response);
            countNotebooksResponse++;
            self.subscriber.updateNotebooks.call(self.subscriber, res.data);</p>
<p>            if (countNotebooksResponse == 3)
            {
                onSuccess();
            }
        }
    });</p>
<p>};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.Notebook = function(type, name, uid, stack, author, hidden, typeText) {
    this.type = type;
    this.name = name;
    this.uid = uid;
    this.stack = stack;
    this.author = author;
    this.hidden = hidden;
    this.typeText = typeText;
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.Tag = function(name, uid) {
    this.name = name;
    this.uid = uid;
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.NotebookTypes = {
    PERSONAL: 1,
    PERSONAL_TEXT: 'pers',
    BUSINESS: 2,
    BUSINESS_TEXT: 'biz',
    LINKED: 3,
    LINKED_TEXT: 'linked'
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ErrorCodes = {
    AUTHENTICATION_ERROR: "LoginFailure",
    CLIP_ERROR: "NoteImportFailure",
    CONNECTION_FAILED: "ConnectionAttemptFailed"
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.AuthenticatedException = function(msg){
    this.msg = msg;
    this.code = Evernote.ErrorCodes.AUTHENTICATION_ERROR;
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
try {
    Evernote.Addin.init(EvernoteExternal.Addin);
    Evernote.Addin.resetAuthenticatedState();
    Evernote.FS.init(EvernoteExternal.Addin);
    Evernote.Logger = Evernote.LoggerConfigurator.getLogger();
    if(!Evernote.JQuery)
        Evernote.JQueryLoader.initJQuery();
    window.jQueryForClearlyComponent = Evernote.JQuery;
    initClearly(window);</p>
<p>    // todo: create bulletproof function for popup close before context-clipping.
    if (Evernote.evernotePopup) Evernote.evernotePopup.hide();
    if (Evernote.SkitchController) Evernote.SkitchController.clearSkitch();</p>
<p>    Evernote.Logger.debug("Init EnClipper");
    Evernote.EnClipper.init();
    Evernote.Logger.debug("EnClipper initialized");
    Evernote.pageInfo = new PageInfo();
    if (!Evernote.contentPreviewer) Evernote.contentPreviewer = new ContentPreview();
    Evernote.Options.load();</p>
<p>    Evernote.evernotePostClipPopup = new Evernote.PostClipPopup( document );</p>
<p>    if (EvernoteExternal.Addin.isServerAvailable()) {
        Evernote.Clipper.clipWithOptions(EvernoteExternal.clipOptions);
    }
} catch(e) {
    throw e;
}
// ]]&gt;</script><br />
<style id="_clearly_component__css" type="text/css"><!--
#next_pages_container { width: 5px; hight: 5px; position: absolute; top: -100px; left: -100px; z-index: 2147483647 !important; } 
--></style>
<div id="_clearly_component__next_pages_container"></div>
<div id="evernoteScreenShotArea"></div>
<div id="evernote-post-clip-content">
<div class="yui3-cssreset" id="postClipContainer">
<div class="closeCross"></div>
<div class="evn-error-message"></div>
<div class="clippedMessage"></div>
<div class="noteTitle"></div>
<div id="shareButtons">
<div class="shareButton" id="linkedin"></div>
<div class="shareButton" id="facebook"></div>
<div class="shareButton" id="twitter"></div>
<div class="shareButton" id="weibo"></div>
<div class="shareButton" id="clipboard"></div>
<p><!--</p>
<div class="shareButton" id="email"></div>
<p>--></p></div>
<div id="evn-clipboardCopy-container">
<div class="evn-pcp-divider"></div>
<div class="evn-pcp-clipboard-message"></div>
<p><input class="evn-pcp-clipboard-input" type="text" readonly="readonly" /></p>
<div class="evn-pcp-clipboard-button bottom"></div>
</div>
</div>
</div>
<p><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
if ( typeof Evernote == 'undefined' ) {
    /**
     * Represents global evernote context (namespace).
     * All objects should be a part of this namespace.
     * @type {Object}
     */
    Evernote = {};
}
Evernote.inherit = function( childConstructor, parentClassOrObject, includeConstructorDefs ) {
    if ( parentClassOrObject.constructor == Function ) {
        // Normal Inheritance
        childConstructor.prototype = new parentClassOrObject;
        childConstructor.prototype.constructor = childConstructor;
        childConstructor.prototype.parent = parentClassOrObject.prototype;
        childConstructor.constructor.parent = parentClassOrObject;
    }
    else {
        // Pure Virtual Inheritance
        childConstructor.prototype = parentClassOrObject;
        childConstructor.prototype.constructor = childConstructor;
        childConstructor.prototype.parent = parentClassOrObject;
        childConstructor.constructor.parent = parentClassOrObject;
    }</p>
<p>    if ( includeConstructorDefs ) {
        for ( var i in parentClassOrObject.prototype.constructor ) {
            if ( i != "parent" &#038;&#038; i != "prototype" &#038;&#038; parentClassOrObject.constructor[i] != parentClassOrObject.prototype.constructor[ i ]
                &#038;&#038; typeof childConstructor.prototype.constructor[ i ] == 'undefined' ) {
                childConstructor.prototype.constructor[ i ] = parentClassOrObject.prototype.constructor[ i ];
            }
        }
    }</p>
<p>    if ( typeof childConstructor.handleInheritance == 'function' ) {
        childConstructor.handleInheritance.apply( childConstructor, arguments );
    }</p>
<p>    if ( typeof childConstructor.prototype.handleInheritance == 'function' ) {
        childConstructor.prototype.handleInheritance.apply( childConstructor, arguments );
    }</p>
<p>    return childConstructor;
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.EnClipper = {</p>
<p>    enClipperProcessId: -1,</p>
<p>    init: function() {
        Evernote.ResponseReceiver.subscribe(this);
        Evernote.Addin.getProcessID(document);
        Evernote.Addin.allowSetForegroundWindow(this.enClipperProcessId);
    },</p>
<p>    onDataReceived: function(data) {
        if(data &#038;&#038; (data.type == "process_id")) {
            Evernote.EnClipper.enClipperProcessId = data.data | 0;
        }
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.AsyncEngine = {
    _requests : {},
    _requestIDCounter: 0,</p>
<p>    addRequest : function(callback, args) {
        this._requestIDCounter++;
        this._requests[this._requestIDCounter] =
            {
                callbackFunc: callback,
                callbackArgs: args
            };
        return this._requestIDCounter;
    },</p>
<p>    removeRequest : function(requestID) {
        this._requests[requestID] = null;
        delete this._requests[requestID];
    },</p>
<p>    commonCallback : function(requestID, result) {
        var object = Evernote.AsyncEngine._requests[requestID];
        if (object &#038;&#038; object.callbackFunc) {
            object.callbackFunc(result, object.callbackArgs);
            Evernote.AsyncEngine.removeRequest(requestID);
        }
        return 0;
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/**
 * Proxy object for Evernote ActiveX component
 * @type {Object}
 */
Evernote.Addin = {
    _addon : null,
    isAuthenticated: true,</p>
<p>    init : function(addin) {
        this._addon = addin;
    },</p>
<p>    /**
     * Injects css specified by filename to specified document.
     * @param fileName - path to css
     * @param doc - document object
     */
    injectStyleSheet : function(doc, fileName) {
        try {
            this._addon.InjectStyleSheet(doc, fileName)
        } catch (e) {
            Evernote.Logger.error( "Addin.InjectStyleSheet() failed " + e );
        }
    },</p>
<p>    /**
     * Injects script content to specified document
     * @param doc - document object
     * @param content - content of the script file
     */
    injectScript : function(doc, content) {
        try {
            this._addon.InjectScript( doc, content );
        }
        catch ( e ) {
            Evernote.Logger.error( "Addin.injectScript() failed " + e );
        }
    },</p>
<p>    /**
     * Loads file content from disk
     * @param url - path to the file
     */
    loadFile : function(url) {
        try {
            return this._addon.LoadFile( url );
        } catch (e) {
            Evernote.Logger.error( "Addin.loadFile() failed " + e );
        }
    },</p>
<p>    /**
     * Append message to log file with specified level.
     * Supported levels:
     *  0 - debug
     *  1 - info
     *  2 - warning
     *  3 - error
     *  4 - critical
     * @param logLevel
     * @param message
     */
    log : function(logLevel, message)
    {
        try {
            this._addon.Log(logLevel, message)
        } catch (e) {
            Evernote.Logger.error("Failed to log message '" + message + "' to the log file due to error: " + e);
        }
    },</p>
<p>    /**
     * Opens new note window.
     */
    openNewNote : function() {
        try {
            this._addon.CreateNewNote();
        } catch (e) {
            Evernote.Logger.error("Failed to open new note window due to error: " + e);
        }
    },</p>
<p>    /**
     * Return path to directory on local filesystem for specified type.
     * @param type - type of directory to return. Currently supported types:
     *  options - directory, where options configuration is stored.
     *  resources - directory, where resources are located (images, scripts, etc.)
     */
    getPath : function(type)
    {
        try {
            return this._addon.GetAddinPath(type);
        } catch (e) {
            Evernote.Logger.error("Failed to clip full page due to error " + e);
        }
    },</p>
<p>    /**
     * Returns localized message by code.
     * @param code - number of message in resource file.
     */
    getLocalizedMessage : function(code) {
        try {
            return this._addon.GetLocalizedString(code) || 'l10n_error';
        } catch (e) {
            Evernote.Logger.error("Failed to retrieve localized message due to error " + e);
        }
    },</p>
<p>    clipNote : function(content, options, sourceUrl, imageUrls, silent, doc ) {
        var isSilentClip = silent ? 1 : 0;
        var images = imageUrls;
        if(!(images instanceof Array)) {
            images = [imageUrls];
        }
        try {
            var notebookUid = options.notebookUid | 0;
            try {
                notebookUid = options.notebookUid() | 0;
            } catch(e) {
                //Notebook uid is not a function, but just an integer that we saved on previous step, ignore exception here
            }
            this.ensureAuthenticated();
            Evernote.Logger.debug("Clip to " + (notebookUid) + " with tags: " + options.tags.join(",") + " ; comment: " + options.comments);
            return this._addon.ClipNote(options.title, content, sourceUrl, isSilentClip, images.join("#") , notebookUid, options.tags.join(","), "", doc,"EvernoteGlobalReceiver");
        } catch (e) {
            Evernote.Logger.error("Failed to clipNote due to error " + e);
        }
    },</p>
<p>    getCursorXPosition : function() {
        try {
            return this._addon.GetCursorXPosition();
        } catch (e) {
            Evernote.Logger.error("Failed to retrieve localized message due to error " + e);
            throw e;
        }</p>
<p>    },</p>
<p>    /**
     * Call Addin to get all notebooks (global "EvernoteGlobalReceiver" function is called with response)
     * @param document - document object
     */
    getNotebooks : function(document) {
        this.ensureAuthenticated();
        this._addon.GetNotebooks(document, "EvernoteGlobalReceiver", Evernote.NotebookTypes.PERSONAL);
        this.ensureAuthenticated();
        this._addon.GetNotebooks(document, "EvernoteGlobalReceiver", Evernote.NotebookTypes.BUSINESS);
        this.ensureAuthenticated();
        this._addon.GetNotebooks(document, "EvernoteGlobalReceiver", Evernote.NotebookTypes.LINKED);
    },</p>
<p>    /**
     * Call Addin to get all personal tags (global "EvernoteGlobalReceiver" function is called with response)
     * @param document - document object
     */
    getTags : function(document) {
        this.ensureAuthenticated();
        this._addon.GetTags(document, "EvernoteGlobalReceiver");
    },</p>
<p>    /**
     * Call Addin to get linked notebook tags (global "EvernoteGlobalReceiver" function is called with response)
     * @param document - document object
     */
    getLinkedTags : function(document, notebookUid) {
        this.ensureAuthenticated();
        this._addon.GetLinkedNotebooksTags(document, "EvernoteGlobalReceiver", notebookUid);
    },</p>
<p>    /**
     * Returns document location address
     * @param document - DOM document
     * @return {*}
     */
    getDocumentHref: function(document) {
        return this._addon.GetDocumentHref(document);
    },</p>
<p>    allowSetForegroundWindow: function(id) {
        this._addon.AllowSetForegroundWindow(id);
    },</p>
<p>    getProcessID: function(doc) {
        this.ensureAuthenticated();
        this._addon.GetProcessID(doc, "EvernoteGlobalReceiver");
    },</p>
<p>    resetAuthenticatedState: function() {
        this.isAuthenticated = true;
    },</p>
<p>    //This function should be called before every call to Addin that will establish connection with EvernoteClipper process.
    ensureAuthenticated: function() {
        if(!this.isAuthenticated) {
            throw new Evernote.AuthenticatedException("User is not authorized");
        }
    },</p>
<p>    processError: function(error) {
        if(error.code == Evernote.ErrorCodes.AUTHENTICATION_ERROR) {
            this.isAuthenticated = false;
        }
        return false;
    },</p>
<p>    getEvernoteVersion: function(document) {
        this._addon.GetEvernoteVersion(document, "EvernoteGlobalReceiver");
    },</p>
<p>    getServerLocation: function() {
        try {
            return this._addon.GetServerLocation();
        } catch (e) {
            Evernote.Logger.error("Failed to get Evernote server location due to error: " + e);
        }
    },</p>
<p>    getEvernoteVersionAsync: function(callback) {
        var requestID;
        try
        {
            requestID = Evernote.AsyncEngine.addRequest(callback);
            this._addon.GetEvernoteVersionAsync( Evernote.AsyncEngine.commonCallback, requestID );
        } catch(e) {
            Evernote.AsyncEngine.removeRequest(requestID);
            Evernote.Logger.error("Failed to get Evernote version (async) due to error: " + e);
        }
    },</p>
<p>    getNotebooksAsync : function(callback) {
        this.ensureAuthenticated();
        var requestID;
        try
        {
            requestID = Evernote.AsyncEngine.addRequest(callback);
            this._addon.GetNotebooksAsync( Evernote.AsyncEngine.commonCallback, requestID, Evernote.NotebookTypes.PERSONAL);
            requestID = Evernote.AsyncEngine.addRequest(callback);
            this._addon.GetNotebooksAsync( Evernote.AsyncEngine.commonCallback, requestID, Evernote.NotebookTypes.BUSINESS);
            requestID = Evernote.AsyncEngine.addRequest(callback);
            this._addon.GetNotebooksAsync( Evernote.AsyncEngine.commonCallback, requestID, Evernote.NotebookTypes.LINKED);
        } catch(e) {
            Evernote.AsyncEngine.removeRequest(requestID);
            Evernote.Logger.error("Failed to get notebooks (async) due to error: " + e);
        }
    },</p>
<p>    getTagsAsync : function(callback) {
        this.ensureAuthenticated();
        var requestID;
        try
        {
            requestID = Evernote.AsyncEngine.addRequest(callback);
            this._addon.GetTagsAsync( Evernote.AsyncEngine.commonCallback, requestID );
        } catch(e) {
            Evernote.AsyncEngine.removeRequest(requestID);
            Evernote.Logger.error("Failed to get tags (async) due to error: " + e);
        }
    },</p>
<p>    getLinkedTagsAsync : function(callback, args, notebookUid) {
        this.ensureAuthenticated();
        var requestID;
        try
        {
            requestID = Evernote.AsyncEngine.addRequest(callback, args);
            this._addon.GetLinkedNotebooksTagsAsync( Evernote.AsyncEngine.commonCallback, requestID, notebookUid );
        } catch(e) {
            Evernote.AsyncEngine.removeRequest(requestID);
            Evernote.Logger.error("Failed to get notebooks tags (async) due to error: " + e);
        }
    },</p>
<p>    clipNoteAsync : function(callback, content, options, sourceUrl, imageUrls, silent) {
        var isSilentClip = silent ? 1 : 0;
        var images = imageUrls;
        if(!(images instanceof Array)) {
            images = [imageUrls];
        }
        var requestID;
        try {
            requestID = Evernote.AsyncEngine.addRequest(callback);
            var notebookUid = options.notebookUid | 0;
            try {
                notebookUid = options.notebookUid() | 0;
            } catch(e) {</p>
<p>            }
            this.ensureAuthenticated();
            Evernote.Logger.debug("Clip to " + (notebookUid) + " with tags: " + options.tags.join(",") + " ; comment: " + options.comments);
            this._addon.ClipNoteAsync(Evernote.AsyncEngine.commonCallback, requestID, options.title, content, sourceUrl, isSilentClip, images.join("#") , notebookUid, options.tags.join(","), "");
        } catch (e) {
            Evernote.Logger.error("Failed to clipNote due to error " + e);
        }
    },</p>
<p>    /**
     * Performs security (HTTPS - Port: 443) asynchronous POST request. Example: https://www.evernote.com/Login.action
     * @param callback
     * @param url Example: "www.evernote.com"
     * @param urlNamedObject Example: "Login.action"
     * @param data - data for "POST" request
     * @constructor
     */
    asyncWebRequest : function(callback, url, urlNamedObject, data) {
        var requestID;
        try
        {
            requestID = Evernote.AsyncEngine.addRequest(callback);
            this._addon.AsyncWebRequest( Evernote.AsyncEngine.commonCallback, requestID, url, urlNamedObject, data);
        } catch(e) {
            Evernote.AsyncEngine.removeRequest(requestID);
            Evernote.Logger.error("Failed to exec async web request due to error: " + e);
        }
    },</p>
<p>    clipImageAsync : function(options, callback, url, imageBase64) {
        var requestID;
        try
        {
            requestID = Evernote.AsyncEngine.addRequest(callback);
            var notebookUid = options.notebookUid | 0;
            try {
                notebookUid = options.notebookUid() | 0;
            } catch(e) {
            }
            this._addon.ClipImageAsync(Evernote.AsyncEngine.commonCallback, requestID, notebookUid, options.title, url, options.tags.join(","), options.comments, imageBase64);
        } catch(e) {
            Evernote.AsyncEngine.removeRequest(requestID);
            Evernote.Logger.error("Failed to exec async web request due to error: " + e);
        }
    },</p>
<p>    getScreenshotBase64 : function(doc, coord) {
        try {
            return this._addon.GetScreenshotBase64Ex(doc, coord[0], coord[1], coord[2], coord[3]);
        } catch (e) {
            Evernote.Logger.error("Failed to get screnshot due to error: " + e);
        }
    },</p>
<p>    openLocalFile : function(logPath, flags)
    {
        try {
            if (!flags)
                flags = 1;</p>
<p>            this._addon.OpenLocalFile(document, logPath, flags);
        } catch (e) {
            Evernote.Logger.error("Failed to open local file due to error " + e);
        }
    },</p>
<p>    getLastLoginUser : function() {
        try {
            return this._addon.GetLastLoginUser();
        } catch (e) {
            Evernote.Logger.error( "GetLastLoginUser failed " + e );
        }
        return null;
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.FileLogger = {
    _addin : Evernote.Addin,</p>
<p>    _log : function(level, message) {
        if(level >= this.level)
            this._addin.log(level, "JS: " + message);
    },</p>
<p>    debug : function(message) {
        try {
            this._log(0, message);
        } catch(e) {
            if(this._next) {
                this._next.debug(message);
            }
        }
    },</p>
<p>    info : function(message) {
        try {
            this._log(1, message);
        } catch(e) {
            if(this._next) {
                this._next.info(message);
            }
        }
    },</p>
<p>    warn : function(message) {
        try {
            this._log(2, message);
        } catch(e) {
            if(this._next) {
                this._next.warn(message);
            }
        }
    },</p>
<p>    error : function(message) {
        try {
            this._log(3, message);
        } catch(e) {
            if(this._next) {
                this._next.error(message);
            }
        }
    },</p>
<p>    setNext : function(logger) {
        this._next = logger;
        this._next.setLevel(this.level);
    },</p>
<p>    setLevel : function(level) {
        this.level = level;
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ConsoleLogger = {
    debug : function(message) {
        if(this.level >= Evernote.LoggerConfigurator.DEBUG) {
            try {
                console.info(message);
            } catch(e) {
                if(this._next) {
                    this._next.debug(message);
                }
            }
        }
    },</p>
<p>    info : function(message) {
        if(this.level >= Evernote.LoggerConfigurator.INFO) {
            try {
                console.info(message);
            } catch(e) {
                if(this._next) {
                    this._next.info(message);
                }
            }
        }
    },</p>
<p>    warn : function(message) {
        if(this.level >= Evernote.LoggerConfigurator.WARN) {
            try {
                console.warn(message);
            } catch(e) {
                if(this._next) {
                    this._next.warn(message);
                }
            }
        }
    },</p>
<p>    error : function(message) {
        if(this.level >= Evernote.LoggerConfigurator.ERROR) {
            try {
                console.error(message);
            } catch(e) {
                if(this._next) {
                    this._next.error(message);
                }
            }
        }
    },</p>
<p>    setNext : function(logger) {
        this._next = logger;
    },</p>
<p>    setLevel : function(level) {
        this.level = level;
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.AlertLogger = {
    debug : function(message) {
        alert("Debug: " + message);
    },</p>
<p>    info : function(message) {
        alert("Info: " + message);
    },</p>
<p>    warn : function(message) {
        alert("Warn: " + message);
    },</p>
<p>    error : function(message) {
        alert("Error: " + message);
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.LoggerConfigurator = {</p>
<p>    DEBUG : 0,
    INFO : 1,
    WARN: 2,
    ERROR: 3,</p>
<p>    getLogger : function() {
        var logger = Evernote.FileLogger;
        if(logger) {
            logger.setLevel(this.WARN);
            Evernote.ConsoleLogger.setNext(Evernote.AlertLogger);
            logger.setNext(Evernote.ConsoleLogger);
            return logger;
        }
        return Evernote.ConsoleLogger;
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/**
 * Represents page context (have permissions to access and modify DOM objects)
 */</p>
<p>try {</p>
<p>    PageContext = {
        url: (location &#038;&#038; location.href) ? location.href : document.location.href,
        title: document.title,</p>
<p>        META: "evernote-webclipper-extension",</p>
<p>        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();
        },</p>
<p>        injectAdditionalTags : function() {
            var url = document.location.href;
            if ( url.match( /^https?:\/\/[a-z0-9-+\.]*(evernote|yinxiang)\.com\//i ) ) {
                try {
                    var metas = document.getElementsByTagName( "meta" );
                    for ( var i = 0; i < metas.length; ++i ) {
                        if ( metas[i].name == PageContext.META ) {
                            return;
                        }
                    }</p>
<p>                    var meta = document.createElement( "meta" );
                    meta.name = PageContext.META;
                    meta.content = "installed";</p>
<p>                    var head = document.head;
                    if ( head ) {
                        head.appendChild( meta );
                    }</p>
<p>                    if ( document.body ) {
                        document.body.className += ((document.body.className) ? " " : "") + PageContext.META;
                    }
                }
                catch ( e ) {
                    alert( "PageContext.injectAdditionalTags() failed: " + e );
                    throw e;
                }
            }
        }
    };
    if((document.readyState == "complete" || document.readyState == "interactive") &#038;&#038; !window.PageContext) {
        PageContext.injectAdditionalTags();
    }
} catch(e) {
    //Just ignore exception here
}
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/**
 * String constants used in the project.
 * @type {Object}
 */
Constants = {
    CLIP_DIALOG_ID : "evernote-content",
    CLIP_DIALOG_NEW_ID : "evernote-popup-container",
    OPTIONS_DIALOG_ID : "evernote-options-content",
    ATTR_DIALOG_ID : "evernote-attributes-content",
    SHARE_DIALOG_ID : "evernote-share-content",
    POST_CLIP_DIALOG_ID : "evernote-post-clip-content",
    EXPAND_SIGN : '+',
    CONTRACT_SIGN : '&#8211;',
    NEW_LINE: '\n'
};</p>
<p>BrowserNavConstants  = {
    // full list:  http://msdn.microsoft.com/en-us/library/aa768360(v=vs.85).aspx
    NAVOPENINNEWWINDOW : 0x1,
    NAVOPENNEWTAB : 0x0800,
    NAVOPENINBACKGROUNDTAB : 0x1000,
    NAVOPENNEWFOREGROUNDTAB : 0x10000
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![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("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"<!doctype html>":"")+"<html><body>"),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&#038;&#038;(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"&#038;&#038;(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&#038;&#038;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&#038;&#038;(n=o);break}}}}!n&#038;&#038;!p&#038;&#038;f.error("No conversion from "+m.replace(" "," to ")),n!==!0&#038;&#038;(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&#038;&#038;(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&#038;&#038;(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&#038;&#038;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]&#038;&#038;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&#038;&#038;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&#038;&#038;((g[d]?a:e||(e={}))[d]=c[d]);e&#038;&#038;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&#038;&#038;(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&#038;&#038;(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bZ(a,c,d,e,l,g)));(k||!l)&#038;&#038;!g["*"]&#038;&#038;(l=bZ(a,c,d,e,"*",g));return l}function bY(a){return function(b,c){typeof b!="string"&#038;&#038;(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bO),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&#038;&#038;(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bB(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?1:0,g=4;if(d>0){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"&#038;&#038;(d+=parseFloat(f.css(a,"border"+bx[e]+"Width"))||0),c==="margin"&#038;&#038;(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"&#038;&#038;typeof a.getElementsByTagName!="undefined"&#038;&#038;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&#038;&#038;(b.clearAttributes&#038;&#038;b.clearAttributes(),b.mergeAttributes&#038;&#038;b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?b.outerHTML=a.outerHTML:c!=="input"||a.type!=="checkbox"&#038;&#038;a.type!=="radio"?c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&#038;&#038;b.text!==a.text&#038;&#038;(b.text=a.text):(a.checked&#038;&#038;(b.defaultChecked=b.checked=a.checked),b.value!==a.value&#038;&#038;(b.value=a.value)),b.removeAttribute(f.expando),b.removeAttribute("_submit_attached"),b.removeAttribute("_change_attached"))}function bj(a,b){if(b.nodeType===1&#038;&#038;!!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<e;d++)f.event.add(b,c,i[c][d])}h.data&#038;&#038;(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=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&#038;&#038;(c==="queue"||!f._data(a,e))&#038;&#038;(c==="mark"||!f._data(a,g))&#038;&#038;setTimeout(function(){!f._data(a,e)&#038;&#038;!f._data(a,g)&#038;&#038;(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&#038;&#038;f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&#038;&#038;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\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&#038;&#038;!d&#038;&#038;c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&#038;&#038;(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&#038;&#038;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&#038;&#038;(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&#038;&#038;(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"&#038;&#038;(l=i,i=arguments[1]||{},j=2),typeof i!="object"&#038;&#038;!e.isFunction(i)&#038;&#038;(i={}),k===j&#038;&#038;(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&#038;&#038;f&#038;&#038;(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&#038;&#038;e.isArray(d)?d:[]):h=d&#038;&#038;e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&#038;&#038;(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&#038;&#038;(a.$=g),b&#038;&#038;a.jQuery===e&#038;&#038;(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&#038;&#038;!--e.readyWait||a!==!0&#038;&#038;!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&#038;&#038;--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&#038;&#038;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&#038;&#038;b&#038;&#038;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&#038;&#038;a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&#038;&#038;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&#038;&#038;!D.call(a,"constructor")&#038;&#038;!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&#038;&#038;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)&#038;&#038;e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&#038;&#038;j.test(b)&#038;&#038;(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&#038;&#038;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&#038;&#038;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;f<g;f++)e=!!b(a[f],f),c!==e&#038;&#038;d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&#038;&#038;typeof j=="number"&#038;&#038;(j>0&#038;&#038;a[0]&#038;&#038;a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&#038;&#038;(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&#038;&#038;(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&#038;&#038;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&#038;&#038;e.isFunction(f),k&#038;&#038;(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&#038;&#038;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&#038;&#038;f instanceof e&#038;&#038;!(f instanceof a)&#038;&#038;(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&#038;&#038;(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&#038;&#038;(e.browser.safari=!0),j.test("ﾂ")&#038;&#038;(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&#038;&#038;(B=function(){c.readyState==="complete"&#038;&#038;(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"&#038;&#038;(!a.unique||!p.has(g))&#038;&#038;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&#038;&#038;m<l;m++)if(c[m].apply(b,f)===!1&#038;&#038;a.stopOnFalse){e=!0;break}j=!1,c&#038;&#038;(a.once?e===!0?p.disable():c=[]:d&#038;&#038;d.length&#038;&#038;(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&#038;&#038;e!==!0&#038;&#038;(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&#038;&#038;f<=l&#038;&#038;(l--,f<=m&#038;&#038;m--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&#038;&#038;p.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&#038;&#038;(j?a.once||d.push([b,c]):(!a.once||!e)&#038;&#038;o(b,c));return this},fire:function(){p.fireWith(this,arguments);return this},fired:function(){return!!i}};return p};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&#038;&#038;f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&#038;&#038;a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&#038;&#038;a&#038;&#038;f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&#038;&#038;b[c].promise&#038;&#038;f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&#038;&#038;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="   	
<link/>
<table></table>
<p><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",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!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&#038;&#038;p.attachEvent&#038;&#038;p.fireEvent&#038;&#038;(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="</p>
<div "+n+"display:block;'>
<div style='"+t+"0;display:block;overflow:hidden;'></div>
</div>
<p>"+"</p>
<table "+n+"' cellpadding='0' cellspacing='0'>"+"</p>
<tr>
<td></td>
</tr>
</table>
<p>",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="</p>
<table>
<tr>
<td style='"+t+"0;display:none'></td>
<td>t</td>
</tr>
</table>
<p>",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&#038;&#038;k[0].offsetHeight===0,a.getComputedStyle&#038;&#038;(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"&#038;&#038;(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="</p>
<div style='width:5px;'></div>
<p>",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&#038;&#038;(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&#038;&#038;(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&#038;&#038;!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]&#038;&#038;j,o=c==="events";if((!n||!m[n]||!o&#038;&#038;!e&#038;&#038;!m[n].data)&#038;&#038;k&#038;&#038;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&#038;&#038;(h[f.camelCase(c)]=d);if(o&#038;&#038;!h[c])return g.events;k?(i=h[c],i==null&#038;&#038;(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&#038;&#038;(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&#038;&#038;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&#038;&#038;!f._data(j,"parsedAttrs")){g=j.attributes;for(i=g.length;k<i;k++)h=g[k].name,h.indexOf("data-")===0&#038;&#038;(h=f.camelCase(h.substring(5)),l(j,h,m[h]));f._data(j,"parsedAttrs",!0)}}return m}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!";return f.access(this,function(c){if(c===b){m=this.triggerHandler("getData"+e,[d[0]]),m===b&#038;&#038;j&#038;&#038;(m=f.data(j,a),m=l(j,a,m));return m===b&#038;&#038;d[1]?this.data(d[0]):m}d[1]=c,this.each(function(){var b=f(this);b.triggerHandler("setData"+e,d),f.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&#038;&#038;(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&#038;&#038;(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&#038;&#038;(!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"&#038;&#038;(d=c.shift()),d&#038;&#038;(b==="fx"&#038;&#038;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"&#038;&#038;(c=a,a="fx",d--);if(arguments.length<d)return f.queue(this[0],a);return c===b?this:this.each(function(){var b=f.queue(this,a,c);a==="fx"&#038;&#038;b[0]!=="inprogress"&#038;&#038;f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&#038;&#038;(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&#038;&#038;f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise(c)}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,f.attr,a,b,arguments.length>1)},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&#038;&#038;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&#038;&#038;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&#038;&#038;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&#038;&#038;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&#038;&#038;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<d;c++)if(this[c].nodeType===1&#038;&#038;(" "+this[c].className+" ").replace(o," ").indexOf(b)>-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)&#038;&#038;(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&#038;&#038;"get"in c&#038;&#038;(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<d;c++){e=i[c];if(e.selected&#038;&#038;(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&#038;&#038;(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&#038;&#038;!h.length&#038;&#038;i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),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&#038;&#038;j!==3&#038;&#038;j!==8&#038;&#038;j!==2){if(e&#038;&#038;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&#038;&#038;(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&#038;&#038;"set"in h&#038;&#038;i&#038;&#038;(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&#038;&#038;"get"in h&#038;&#038;i&#038;&#038;(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&#038;&#038;a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i<g;i++)e=d[i],e&#038;&#038;(c=f.propFix[e]||e,h=u.test(e),h||f.attr(a,e,""),a.removeAttribute(v?e:c),h&#038;&#038;c in a&#038;&#038;(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&#038;&#038;a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&#038;&#038;b==="radio"&#038;&#038;f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&#038;&#038;(a.value=c);return b}}},value:{get:function(a,b){if(w&#038;&#038;f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&#038;&#038;f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&#038;&#038;i!==3&#038;&#038;i!==8&#038;&#038;i!==2){h=i!==1||!f.isXMLDoc(a),h&#038;&#038;(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&#038;&#038;"set"in g&#038;&#038;(e=g.set(a,d,c))!==b?e:a[c]=d:g&#038;&#038;"get"in g&#038;&#038;(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&#038;&#038;c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&#038;&#038;a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&#038;&#038;(d=a.getAttributeNode(c))&#038;&#038;d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&#038;&#038;(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0,coords:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&#038;&#038;(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&#038;&#038;(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&#038;&#038;(b.selectedIndex,b.parentNode&#038;&#038;b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=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&#038;&#038;(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&#038;&#038;new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&#038;&#038;(!b[2]||(c.id||{}).value===b[2])&#038;&#038;(!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&#038;&#038;(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"&#038;&#038;(!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&#038;&#038;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&#038;&#038;a.attachEvent("on"+m,i)}s.add&#038;&#038;(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)&#038;&#038;f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&#038;&#038;!!(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<r.length;n++)s=r[n],(e||k===s.origType)&#038;&#038;(!c||c.guid===s.guid)&#038;&#038;(!l||l.test(s.namespace))&#038;&#038;(!d||d===s.selector||d==="**"&#038;&#038;s.selector)&#038;&#038;(r.splice(n--,1),s.selector&#038;&#038;r.delegateCount--,p.remove&#038;&#038;p.remove.call(a,s));r.length===0&#038;&#038;m!==r.length&#038;&#038;((!p.teardown||p.teardown.call(a,l)===!1)&#038;&#038;f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&#038;&#038;(q=g.handle,q&#038;&#038;(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&#038;&#038;e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&#038;&#038;(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&#038;&#038;(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&#038;&#038;!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&#038;&#038;j[l].events[h]&#038;&#038;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&#038;&#038;p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&#038;&#038;!p.noBubble&#038;&#038;!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&#038;&#038;n===e.ownerDocument&#038;&#038;r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&#038;&#038;!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&#038;&#038;f._data(m,"handle"),q&#038;&#038;q.apply(m,d),q=o&#038;&#038;m[o],q&#038;&#038;f.acceptData(m)&#038;&#038;q.apply(m,d)===!1&#038;&#038;c.preventDefault();c.type=h,!g&#038;&#038;!c.isDefaultPrevented()&#038;&#038;(!p._default||p._default.apply(e.ownerDocument,d)===!1)&#038;&#038;(h!=="click"||!f.nodeName(e,"a"))&#038;&#038;f.acceptData(e)&#038;&#038;o&#038;&#038;e[h]&#038;&#038;(h!=="focus"&#038;&#038;h!=="blur"||c.target.offsetWidth!==0)&#038;&#038;!f.isWindow(e)&#038;&#038;(n=e[o],n&#038;&#038;(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&#038;&#038;(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&#038;&#038;!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&#038;&#038;(!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;k<e;k++)s=d[k],t=s.selector,p[t]===b&#038;&#038;(p[t]=s.quick?H(m,s.quick):n.is(t)),p[t]&#038;&#038;r.push(s);r.length&#038;&#038;j.push({elem:m,matches:r})}}d.length>e&#038;&#038;j.push({elem:this,matches:d.slice(e)});for(k=0;k<j.length&#038;&#038;!c.isPropagationStopped();k++){q=j[k],c.currentTarget=q.elem;for(l=0;l<q.matches.length&#038;&#038;!c.isImmediatePropagationStopped();l++){s=q.matches[l];if(h||!c.namespace&#038;&#038;!s.namespace||c.namespace_re&#038;&#038;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&#038;&#038;(c.result=o,o===!1&#038;&#038;(c.preventDefault(),c.stopPropagation()))}}i.postDispatch&#038;&#038;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&#038;&#038;(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&#038;&#038;d.clientX!=null&#038;&#038;(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&#038;&#038;f.scrollLeft||g&#038;&#038;g.scrollLeft||0)-(f&#038;&#038;f.clientLeft||g&#038;&#038;g.clientLeft||0),a.pageY=d.clientY+(f&#038;&#038;f.scrollTop||g&#038;&#038;g.scrollTop||0)-(f&#038;&#038;f.clientTop||g&#038;&#038;g.clientTop||0)),!a.relatedTarget&#038;&#038;i&#038;&#038;(a.relatedTarget=i===a.target?d.toElement:i),!a.which&#038;&#038;h!==b&#038;&#038;(a.which=h&#038;1?1:h&#038;2?3:h&#038;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&#038;&#038;(a.target=a.target.parentNode),a.metaKey===b&#038;&#038;(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)&#038;&#038;(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&#038;&#038;(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()&#038;&#038;c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&#038;&#038;a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&#038;&#038;a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&#038;&#038;a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&#038;&#038;a.getPreventDefault()?K:J):this.type=a,b&#038;&#038;f.extend(this,b),this.timeStamp=a&#038;&#038;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&#038;&#038;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&#038;&#038;!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&#038;&#038;!d._submit_attached&#038;&#038;(f.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),d._submit_attached=!0)})},postDispatch:function(a){a._submit_bubble&#038;&#038;(delete a._submit_bubble,this.parentNode&#038;&#038;!a.isTrigger&#038;&#038;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"&#038;&#038;(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&#038;&#038;!a.isTrigger&#038;&#038;(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)&#038;&#038;!b._change_attached&#038;&#038;(f.event.add(b,"change._change",function(a){this.parentNode&#038;&#038;!a.isSimulated&#038;&#038;!a.isTrigger&#038;&#038;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"&#038;&#038;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&#038;&#038;c.addEventListener(a,e,!0)},teardown:function(){--d===0&#038;&#038;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"&#038;&#038;(d=d||c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&#038;&#038;e==null?(e=c,d=c=b):e==null&#038;&#038;(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&#038;&#038;(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&#038;&#038;a.preventDefault&#038;&#038;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&#038;&#038;(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(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&#038;&#038;(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&#038;&#038;(f.attrFn[b]=!0),C.test(b)&#038;&#038;(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&#038;&#038;(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){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<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&#038;&#038;!g&#038;&#038;(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\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&#038;&#038;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&#038;&#038;p.exec(b))if(w.length===2&#038;&#038;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]&#038;&#038;(b+=w.shift()),j=y(b,j,f)}else{!f&#038;&#038;w.length>1&#038;&#038;d.nodeType===9&#038;&#038;!v&#038;&#038;o.match.ID.test(w[0])&#038;&#038;!o.match.ID.test(w[w.length-1])&#038;&#038;(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&#038;&#038;(w[0]==="~"||w[0]==="+")&#038;&#038;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&#038;&#038;(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&#038;&#038;d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&#038;&#038;(k[t]===!0||k[t].nodeType===1&#038;&#038;m.contains(d,k[t]))&#038;&#038;e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&#038;&#038;k[t].nodeType===1&#038;&#038;e.push(j[t]);else s(k,e);l&#038;&#038;(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;b<a.length;b++)a[b]===a[b-1]&#038;&#038;a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},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&#038;&#038;c[0]&#038;&#038;m.isXML(c[0]);while(a&#038;&#038;c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&#038;&#038;f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&#038;&#038;(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&#038;&#038;(i=k(j,f,n,s),p=e^i,d&#038;&#038;i!=null?p?g=!0:s[n]=!1:p&#038;&#038;(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&#038;&#038;(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&#038;&#038;!l.test(b),e=c&#038;&!d;d&#038;&#038;(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&#038;&#038;h.nodeType!==1);a[f]=e||h&#038;&#038;h.nodeName.toLowerCase()===b?h||!1:h===b}e&#038;&#038;m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&#038;&#038;!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&#038;&#038;(a[e]=d?c.parentNode:c.parentNode===b);d&#038;&#038;m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&#038;&#038;!l.test(b)&#038;&#038;(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"&#038;&#038;!l.test(b)&#038;&#038;(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"&#038;&#038;!c){var d=b.getElementById(a[1]);return d&#038;&#038;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<f;e++)d[e].getAttribute("name")===a[1]&#038;&#038;c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&#038;&#038;(e^(h.className&#038;&#038;(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&#038;&#038;(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"&#038;&#038;"2n"||a[2]==="odd"&#038;&#038;"2n+1"||!/\D/.test(a[2])&#038;&#038;"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&#038;&#038;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&#038;&#038;o.attrMap[g]&#038;&#038;(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&#038;&#038;(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&#038;&#038;a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&#038;&#038;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"&#038;&#038;"text"===c&#038;&#038;(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&#038;&#038;"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&#038;&#038;"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&#038;&#038;"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&#038;&#038;"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&#038;&#038;"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&#038;&#038;"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&#038;&#038;"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&#038;&#038;"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 b<c[3]-0},gt:function(a,b,c){return b>c[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<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&#038;&#038;e===0)return!0;f=b[0],g=a.parentNode;if(g&#038;&#038;(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&#038;&#038;(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&#038;&#038;j/c>=0}},ID:function(a,b){return a.nodeType===1&#038;&#038;a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&#038;&#038;a.nodeType===1||!!a.nodeName&#038;&#038;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&#038;&#038;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&#038;&#038;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)&#038;4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&#038;&#038;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&#038;&#038;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="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&#038;&#038;(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&#038;&#038;!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&#038;&#038;e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&#038;&#038;a.getAttributeNode("id");return a.nodeType===1&#038;&#038;c&#038;&#038;c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&#038;&#038;(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&#038;&#038;d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&#038;&#038;typeof a.firstChild.getAttribute!="undefined"&#038;&#038;a.firstChild.getAttribute("href")!=="#"&#038;&#038;(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&#038;&#038;function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="</p>
<p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&#038;&#038;!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&#038;&#038;(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&#038;&#038;o.find.CLASS&#038;&#038;e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&#038;&#038;e.body)return s([e.body],f);if(h&#038;&#038;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&#038;&#038;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,"\\$&#038;"):e.setAttribute("id",n),q&#038;&#038;p&#038;&#038;(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)&#038;&#038;!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&#038;&#038;a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="</p>
<div class='test e'></div>
<div class='test'></div>
<p>";if(!!a.getElementsByClassName&#038;&#038;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"&#038;&#038;!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&#038;&#038;(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&#038;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;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)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<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&#038;&#038;(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=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&#038;&#038;g.ownerDocument&#038;&#038;g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&#038;&#038;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<e;d++){g=this[d];while(g){if(i?i.index(g)>-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]&#038;&#038;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&#038;&#038;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&#038;&#038;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&#038;&#038;typeof d=="string"&#038;&#038;(e=f.filter(d,e)),e=this.length>1&#038;&#038;!R[a]?f.unique(e):e,(this.length>1||N.test(d))&#038;&#038;M.test(a)&#038;&#038;(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&#038;&#038;(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&#038;&#038;g.nodeType!==9&#038;&#038;(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&#038;&#038;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&#038;&#038;++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&#038;&#038;a!==b&#038;&#038;c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/
<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")[\\s/>]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"
<select multiple='multiple'>","</select>
<p>"],legend:[1,"</p>
<fieldset>","</fieldset>
<p>"],thead:[1,"</p>
<table>","</table>
<p>"],tr:[2,"</p>
<table>
<tbody>","</tbody>
</table>
<p>"],td:[3,"</p>
<table>
<tbody>
<tr>","</tr>
</tbody>
</table>
<p>"],col:[2,"</p>
<table>
<tbody></tbody>
<colgroup>","</colgroup>
</table>
<p>"],area:[1,"
<map>","</map>
<p>"],_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</p>
<div>","</div>
<p>"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&#038;&#038;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&#038;&#038;b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&#038;&#038;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&#038;&#038;this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&#038;&#038;this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&#038;&#038;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]&#038;&#038;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&#038;&#038;d.nodeType===1&#038;&#038;(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&#038;&#038;d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&#038;&#038;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"&#038;&#038;!ba.test(a)&#038;&#038;(f.support.leadingWhitespace||!X.test(a))&#038;&#038;!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&#038;&#038;(f.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(g){}}c&#038;&#038;this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){if(this[0]&#038;&#038;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"&#038;&#038;(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&#038;&#038;arguments.length===3&#038;&#038;typeof j=="string"&#038;&#038;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&#038;&#038;j.parentNode,f.support.parentNode&#038;&#038;i&#038;&#038;i.nodeType===11&#038;&#038;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&#038;&#038;f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&#038;&#038;l<n?f.clone(h,!0,!0):h)}k.length&#038;&#038;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&#038;&#038;b.parentNode.removeChild(b)})}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&#038;&#038;b[0]&#038;&#038;(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&#038;&#038;typeof j=="string"&#038;&#038;j.length<512&#038;&#038;i===c&#038;&#038;j.charAt(0)==="<"&#038;&#038;!bb.test(j)&#038;&#038;(f.support.checkClone||!bd.test(j))&#038;&#038;(f.support.html5Clone||!bc.test(j))&#038;&#038;(g=!0,h=f.fragments[j],h&#038;&#038;h!==1&#038;&#038;(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&#038;&#038;(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&#038;&#038;this[0].parentNode;if(g&#038;&#038;g.nodeType===11&#038;&#038;g.childNodes.length===1&#038;&#038;e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&#038;&#038;(a.nodeType===1||a.nodeType===11)&#038;&#038;!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&#038;&#038;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"&#038;&#038;(b=b.ownerDocument||b[0]&#038;&#038;b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&#038;&#038;(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1></$2>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&#038;&#038;!s?p.firstChild&#038;&#038;p.firstChild.childNodes:n[1]==="</p>
<table>"&#038;&#038;!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&#038;&#038;!t[i].childNodes.length&#038;&#038;t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&#038;&#038;X.test(l)&#038;&#038;p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&#038;&#038;(p.parentNode.removeChild(p),q.length>0&#038;&#038;(r=q[q.length-1],r&#038;&#038;r.parentNode&#038;&#038;r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&#038;&#038;typeof (u=l.length)=="number")for(i=0;i<u;i++)bn(l[i]);else bn(l);l.nodeType?j.push(l):j=f.merge(j,l)}if(d){g=function(a){return!a.type||be.test(a.type)};for(k=0;j[k];k++){h=j[k];if(e&#038;&#038;f.nodeName(h,"script")&#038;&#038;(!h.type||be.test(h.type)))e.push(h.parentNode?h.parentNode.removeChild(h):h);else{if(h.nodeType===1){var v=f.grep(h.getElementsByTagName("script"),g);j.splice.apply(j,[k+1,0].concat(v))}d.appendChild(h)}}}return j},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&#038;&#038;f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&#038;&#038;b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&#038;&#038;(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&#038;&#038;i.removeAttribute(f.expando),delete d[c]}}}});var bp=/alpha\([^)]*\)/i,bq=/opacity=([^)]*)/,br=/([A-Z]|^ms)/g,bs=/^[\-+]?(?:\d*\.)?\d+$/i,bt=/^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,bu=/^([\-+])=([\-+.\de]+)/,bv=/^margin/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Top","Right","Bottom","Left"],by,bz,bA;f.fn.css=function(a,c){return f.access(this,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)},a,c,arguments.length>1)},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&#038;&#038;a.nodeType!==3&#038;&#038;a.nodeType!==8&#038;&#038;!!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&#038;&#038;"get"in k&#038;&#038;(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&#038;&#038;(g=bu.exec(d))&#038;&#038;(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&#038;&#038;isNaN(d))return;h==="number"&#038;&#038;!f.cssNumber[i]&#038;&#038;(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"&#038;&#038;(c="float");if(g&#038;&#038;"get"in g&#038;&#038;(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&#038;&#038;c.defaultView.getComputedStyle&#038;&#038;(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&#038;&#038;(e=d.getComputedStyle(a,null))&#038;&#038;(c=e.getPropertyValue(b),c===""&#038;&#038;!f.contains(a.ownerDocument.documentElement,a)&#038;&#038;(c=f.style(a,b))),!f.support.pixelMargin&#038;&#038;e&#038;&#038;bv.test(b)&#038;&#038;bt.test(c)&#038;&#038;(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&#038;&#038;(bA=function(a,b){var c,d,e,f=a.currentStyle&#038;&#038;a.currentStyle[b],g=a.style;f==null&#038;&#038;g&#038;&#038;(e=g[b])&#038;&#038;(f=e),bt.test(f)&#038;&#038;(c=g.left,d=a.runtimeStyle&#038;&#038;a.runtimeStyle.left,d&#038;&#038;(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&#038;&#038;(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&#038;&#038;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&#038;&#038;d.filter||c.filter||"";c.zoom=1;if(b>=1&#038;&#038;f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&#038;&#038;!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&#038;&#038;f.expr.filters&#038;&#038;(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&#038;&#038;c===0||!f.support.reliableHiddenOffsets&#038;&#038;(a.style&#038;&#038;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[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&#038;])_=[^&#038;]*/,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"&#038;&#038;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&#038;&#038;(f.isFunction(c)?(d=c,c=b):typeof c=="object"&#038;&#038;(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()&#038;&#038;(a.done(function(a){c=a}),i.html(g?f("</p>
<div>").append(c.replace(bM,"")).find(g):c)),d&#038;&#038;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&#038;&#038;!this.disabled&#038;&#038;(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)&#038;&#038;(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&#038;&#038;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&#038;&#038;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&#038;&#038;(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&#038;&#038;g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&#038;&#038;(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&#038;&#038;(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&#038;&#038;(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&#038;&#038;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(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&#038;&#038;(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&#038;&#038;r[2]==bV[2]&#038;&#038;(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&#038;&#038;d.processData&#038;&#038;typeof d.data!="string"&#038;&#038;(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&#038;&#038;f.active++===0&#038;&#038;f.event.trigger("ajaxStart");if(!d.hasContent){d.data&#038;&#038;(d.url+=(bL.test(d.url)?"&#038;":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&#038;":"?")+"_="+x:"")}}(d.data&#038;&#038;d.hasContent&#038;&#038;d.contentType!==!1||c.contentType)&#038;&#038;v.setRequestHeader("Content-Type",d.contentType),d.ifModified&#038;&#038;(k=k||d.url,f.lastModified[k]&#038;&#038;v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&#038;&#038;v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&#038;&#038;d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&#038;&#038;(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&#038;&#038;g.trigger("ajaxSend",[v,d]),d.async&#038;&#038;d.timeout>0&#038;&#038;(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&#038;&#038;(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&#038;&#038;!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("&#038;").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&#038;|$)|\?\?/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"&#038;&#038;/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&#038;&#038;(cd.test(b.url)||e&#038;&#038;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&#038;&#038;(j=j.replace(cd,l),b.url===j&#038;&#038;(e&#038;&#038;(k=k.replace(cd,l)),b.data===k&#038;&#038;(j+=(/\?/.test(j)?"&#038;":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&#038;&#038;f.isFunction(i)&#038;&#038;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&#038;&#038;(a.cache=!1),a.crossDomain&#038;&#038;(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&#038;&#038;(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&#038;&#038;d.parentNode&#038;&#038;e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&#038;&#038;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&#038;&#038;ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&#038;&#038;"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&#038;&#038;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&#038;&#038;h.overrideMimeType&#038;&#038;h.overrideMimeType(c.mimeType),!c.crossDomain&#038;&#038;!e["X-Requested-With"]&#038;&#038;(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&#038;&#038;c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&#038;&#038;(e||h.readyState===4)){d=b,i&#038;&#038;(h.onreadystatechange=f.noop,ce&#038;&#038;delete cg[i]);if(e)h.readyState!==4&#038;&#038;h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&#038;&#038;n.documentElement&#038;&#038;(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&#038;&#038;c.isLocal&#038;&#038;!c.crossDomain?j=m.text?200:404:j===1223&#038;&#038;(j=204)}}}catch(p){e||g(-1,p)}m&#038;&#038;g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&#038;&#038;(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&#038;&#038;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&#038;&#038;(e=d.style.display,!f._data(d,"olddisplay")&#038;&#038;e==="none"&#038;&#038;(e=d.style.display=""),(e===""&#038;&#038;f.css(d,"display")==="none"||!f.contains(d.ownerDocument.documentElement,d))&#038;&#038;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&#038;&#038;(e=f.css(d,"display"),e!=="none"&#038;&#038;!f._data(d,"olddisplay")&#038;&#038;f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&#038;&#038;(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&#038;&#038;f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(ct("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&#038;&#038;f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&#038;&#038;f(this).is(":hidden"),g,h,i,j,k,l,m,n,o,p,q;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&#038;&#038;(a[g]=a[i],delete a[i]);if((k=f.cssHooks[g])&#038;&#038;"expand"in k){l=k.expand(a[g]),delete a[g];for(i in l)i in a||(a[i]=l[i])}}for(g in a){h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&#038;&#038;b.specialEasing[g]||b.easing||"swing";if(h==="hide"&#038;&#038;d||h==="show"&#038;&#038;!d)return b.complete.call(this);c&#038;&#038;(g==="height"||g==="width")&#038;&#038;(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&#038;&#038;f.css(this,"float")==="none"&#038;&#038;(!f.support.inlineBlockNeedsLayout||cu(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&#038;&#038;(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cm.test(h)?(q=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),q?(f._data(this,"toggle"+i,q==="show"?"hide":"show"),j[q]()):j[h]()):(m=cn.exec(h),n=j.cur(),m?(o=parseFloat(m[2]),p=m[3]||(f.cssNumber[i]?"":"px"),p!=="px"&#038;&#038;(f.style(this,i,(o||1)+p),n=(o||1)/j.cur()*n,f.style(this,i,n+p)),m[1]&#038;&#038;(o=(m[1]==="-="?-1:1)*o+n),j.custom(n,o,p)):j.custom(n,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&#038;&#038;(d=c,c=a,a=b),c&#038;&#038;a!==!1&#038;&#038;this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&#038;&#038;g[b].stop&#038;&#038;b.indexOf(".run")===b.length-4&#038;&#038;h(this,g,b);else g[b=a+".run"]&#038;&#038;g[b].stop&#038;&#038;h(this,g,b);for(b=e.length;b--;)e[b].elem===this&#038;&#038;(a==null||e[b].queue===a)&#038;&#038;(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&#038;&#038;f.dequeue(this,a)})}}),f.each({slideDown:ct("show",1),slideUp:ct("hide",1),slideToggle:ct("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&#038;&#038;typeof a=="object"?f.extend({},a):{complete:c||!c&#038;&#038;b||f.isFunction(a)&#038;&#038;a,duration:a,easing:c&#038;&#038;b||b&#038;&#038;!f.isFunction(b)&#038;&#038;b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&#038;&#038;d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&#038;&#038;f._unmark(this)};return d},easing:{linear:function(a){return a},swing:function(a){return-Math.cos(a*Math.PI)/2+.5}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&#038;&#038;this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&#038;&#038;(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cq||cr(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){f._data(e.elem,"fxshow"+e.prop)===b&#038;&#038;(e.options.hide?f._data(e.elem,"fxshow"+e.prop,e.start):e.options.show&#038;&#038;f._data(e.elem,"fxshow"+e.prop,e.end))},h()&#038;&#038;f.timers.push(h)&#038;&#038;!co&#038;&#038;(co=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cq||cr(),g=!0,h=this.elem,i=this.options;if(a||e>=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&#038;&#038;(g=!1);if(g){i.overflow!=null&#038;&#038;!f.support.shrinkWrapBlocks&#038;&#038;f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&#038;&#038;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&#038;&#038;(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<b.length;c++)a=b[c],!a()&#038;&#038;b[c]===a&#038;&#038;b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(co),co=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&#038;&#038;a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(cp.concat.apply([],cp),function(a,b){b.indexOf("margin")&#038;&#038;(f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)})}),f.expr&#038;&#038;f.expr.filters&#038;&#038;(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cv,cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?cv=function(a,b,c,d){try{d=a.getBoundingClientRect()}catch(e){}if(!d||!f.contains(c,a))return d?{top:d.top,left:d.left}:{top:0,left:0};var g=b.body,h=cy(b),i=c.clientTop||g.clientTop||0,j=c.clientLeft||g.clientLeft||0,k=h.pageYOffset||f.support.boxModel&#038;&#038;c.scrollTop||g.scrollTop,l=h.pageXOffset||f.support.boxModel&#038;&#038;c.scrollLeft||g.scrollLeft,m=d.top+k-i,n=d.left+l-j;return{top:m,left:n}}:cv=function(a,b,c){var d,e=a.offsetParent,g=a,h=b.body,i=b.defaultView,j=i?i.getComputedStyle(a,null):a.currentStyle,k=a.offsetTop,l=a.offsetLeft;while((a=a.parentNode)&#038;&#038;a!==h&#038;&#038;a!==c){if(f.support.fixedPosition&#038;&#038;j.position==="fixed")break;d=i?i.getComputedStyle(a,null):a.currentStyle,k-=a.scrollTop,l-=a.scrollLeft,a===e&#038;&#038;(k+=a.offsetTop,l+=a.offsetLeft,f.support.doesNotAddBorder&#038;&#038;(!f.support.doesAddBorderForTableAndCells||!cw.test(a.nodeName))&#038;&#038;(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),g=e,e=a.offsetParent),f.support.subtractsBorderForOverflowNotVisible&#038;&#038;d.overflow!=="visible"&#038;&#038;(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),j=d}if(j.position==="relative"||j.position==="static")k+=h.offsetTop,l+=h.offsetLeft;f.support.fixedPosition&#038;&#038;j.position==="fixed"&#038;&#038;(k+=Math.max(c.scrollTop,h.scrollTop),l+=Math.max(c.scrollLeft,h.scrollLeft));return{top:k,left:l}},f.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){f.offset.setOffset(this,a,b)});var c=this[0],d=c&#038;&#038;c.ownerDocument;if(!d)return null;if(c===d.body)return f.offset.bodyOffset(c);return cv(c,d,d.documentElement)},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&#038;&#038;(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&#038;&#038;(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&#038;&#038;f.inArray("auto",[h,i])>-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)&#038;&#038;(b=b.call(a,c,g)),b.top!=null&#038;&#038;(k.top=b.top-g.top+m),b.left!=null&#038;&#038;(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&#038;&#038;!cx.test(a.nodeName)&#038;&#038;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&#038;&#038;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&#038;&#038;j||i.body&#038;&#038;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"&#038;&#038;define.amd&#038;&#038;define.amd.jQuery&#038;&#038;define("jquery",[],function(){return f})})(window);
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/*!
 * ClearlyComponent
 * Offer up Clearly's content detection algorithm as an embeddable component.
 *
 * http://evernote.com/clearly/
 * Copyright 2012, Evernote Corporation
 *
 * Requires:
 *   window.jQueryForClearlyComponent -- an instance of jQuery
 *
 * Definition:
 *   window.ClearlyComponent
 *     getContentElementAndHTML(_windowObject, _callbackFunction) {
 *       _callbackFunction({
 *         '_elements':     [ (nodeObjects) ],
 *         '_html':         (string),
 *         '_title':        (string),
 *         '_multiPage':    (bool),
 *         '_rtl':          (bool)
 *       });
 *     }
 *     getOtherPagesHTML(_callbackFunction) {
 *       _callbackFunction(
 *         [
 *           {
 *             '_html': (string),
 *             '_url': (string) 
 *           }
 *         ]
 *       );
 *     }
 */
function initClearly( window ) { /* override window object and undefined */</p>
<p>    //  set main objects
    //  ================
        var $C = { 'version': '3335.890.162' };
        var $ = window.jQueryForClearlyComponent;
        var $R = { 'component': true };</p>
<p>    //  getContentElementAndHTML
    //  ========================
        $C.getContentElementAndHTML = function (_windowObject, _callbackFunction)
        {
            //  we're basically duplicating $R.getContent__find
            //  ===============================================</p>
<p>            //	get content
            //	===========
                var 
                    _found = $R.getContent__findInPage($R.win),
                    _targetNode = _found._targetCandidate.__node,
                    _$targetNode = $(_targetNode),
                    _aboveNodes = []
                ;</p>
<p>            //	RTL
            //	===
                switch (true)
                {
                    case (_$targetNode.attr('dir') == 'rtl'):
                    case (_$targetNode.css('direction') == 'rtl'):
                        $R.makeRTL();
                        break;
                }</p>
<p>            //  get html
            //  ========
                var 
                    _foundHTML = _found._html,
                    _firstFragmentBefore = $R.getContent__nextPage__getFirstFragment(_foundHTML),
                    _documentTitle = ($R.document.title > '' ? $R.document.title : '')
                ;</p>
<p>            //  get title
            //  =========</p>
<p>                //  has title already?
                _foundHTML = $R.getContent__find__isolateTitleInHTML(_foundHTML, _documentTitle);
                $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML);
                $R.debugPrint('TitleSource', 'target');</p>
<p>                //  get html above?
                if ($R.articleTitle > ''); else
                {</p>
<p>    //  get html above target?
    //  ======================</p>
<p>    //  global vars:
    //      _found
    //      _foundHTML
    //      _documentTitle
    //      _aboveNodes</p>
<p>    var 
        _prevNode = _found._targetCandidate.__node,
        _prevHTML = '',
        _aboveHTML = '',
        _differentTargets = (_found._firstCandidate.__node != _found._targetCandidate.__node)
    ;</p>
<p>    (function () 
    {</p>
<p>        while (true)
        {
            //  the end?
            switch (true)
            {
                case (_prevNode.tagName &#038;&#038; (_prevNode.tagName.toLowerCase() == 'body')):
                case (_differentTargets &#038;&#038; (_prevNode == _found._firstCandidate.__node)):
                    //  enough is enough
                    return;
            }</p>
<p>            //  up or sideways?
            if (_prevNode.previousSibling); else
            {
                _prevNode = _prevNode.parentNode;
                continue;
            }</p>
<p>            //	previous
            _prevNode = _prevNode.previousSibling;</p>
<p>            //	outline -- element might be re-outlined, when buildHTML is invoked
            if ($R.debug) { $R.debugOutline(_prevNode, 'target', 'add-above'); }</p>
<p>            //	get html; add
            _prevHTML = $R.getContent__buildHTMLForNode(_prevNode, 'above-the-target');
            _aboveHTML = _prevHTML + _aboveHTML;
            _aboveNodes.unshift(_prevNode);</p>
<p>            //  isolate title
            _aboveHTML = $R.getContent__find__isolateTitleInHTML(_aboveHTML, _documentTitle);</p>
<p>            //	finished?
            switch (true)
            {
                case ($R.measureText__getTextLength(_aboveHTML.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ')) > (65 * 3 * 3)):
                case ($R.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
                    return;
            }
        }</p>
<p>    })();</p>
<p>    //  is what we found any good?
    //  ==========================
    switch (true)
    {
        case ($R.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
        case (_differentTargets &#038;&#038; (_aboveHTML.split('<a ').length < 3) &#038;&#038; ($R.measureText__getTextLength(_aboveHTML.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ')) < (65 * 3))):
            _foundHTML = _aboveHTML + _foundHTML;
            break;</p>
<p>        default:
            _aboveHTML = '';
            _aboveNodes = [];
            break;
    }</p>
<p>                    $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML);
                    $R.debugPrint('TitleSource', 'above_HTML');</p>
<p>                    //  get document title?
                    if ($R.articleTitle > ''); else
                    {</p>
<p>    //  if all else failed, get document title
    //  ======================================</p>
<p>    //  global vars:
    //      _foundHTML
    //      _documentTitle</p>
<p>    (function ()
    {
        //  return?
        //  =======
            if (_documentTitle > ''); else { return; }</p>
<p>        //  vars
            var
                _doc_title_parts = [],
                _doc_title_pregs =
                [
                    /( [-][-] |( [-] )|( [>][>] )|( [<][<] )|( [|] )|( [\/] ))/i,
                    /(([:] ))/i
                ]
            ;</p>
<p>        //	loop through pregs
        //  ==================
            for (var i=0, _i=_doc_title_pregs.length; i<_i; i++)
            {
                //	split
                _doc_title_parts = _documentTitle.split(_doc_title_pregs[i]);</p>
<p>                //	break if we managed a split
                if (_doc_title_parts.length > 1) { break; }
            }</p>
<p>        //	sort title parts -- longer goes higher up -- i.e. towards 0
        //	================
            _doc_title_parts.sort(function (a, b)
            {
                switch (true)
                {
                    case (a.length > b.length): return -1;
                    case (a.length < b.length): return 1;
                    default: return 0;
                }
            });</p>
<p>        //	set title -- first part, if more than one word; otherwise, whole
        //  =========
            _foundHTML = ''</p>
<p>                + $R.articleTitleMarker__start
                +   (_doc_title_parts[0].split(/\s+/i).length > 1 ? _doc_title_parts[0] : _documentTitle) 
                + $R.articleTitleMarker__end </p>
<p>                + _foundHTML
            ;</p>
<p>    })();
                        $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML);
                        $R.debugPrint('TitleSource', 'document_title');
                    }
                }</p>
<p>            //	remember
            //	========
                $R.debugRemember['theTarget'] = _found._targetCandidate.__node;
                $R.debugRemember['firstCandidate'] = _found._firstCandidate.__node;</p>
<p>            //	next
            //	====
                $C._nextPages = [];</p>
<p>                $R.nextPage__firstFragment__firstPage = _firstFragmentBefore;
                $R.nextPage__firstFragment__lastPage = $R.getContent__nextPage__getFirstFragment(_foundHTML);;</p>
<p>                $R.nextPage__loadedPages = [$R.win.location.href];
                $R.getContent__nextPage__find($R.win, _found._links);</p>
<p>            //	result
            var
                _result = {
                    '_html': _foundHTML,
                    '_title': $R.articleTitle,
                    '_multiPage': ($R.nextPage__loadedPages.length > 1),
                    '_rtl': $R.rtl
                }
            ;</p>
<p>            //  add elements
            _result['_elements'] = _aboveNodes;
            _result['_elements'].push(_found._targetCandidate.__node);</p>
<p>            //  return
            _callbackFunction(_result);
        };</p>
<p>    //  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);
                    }
                }
            ;</p>
<p>            //  set first timeout
            window.setTimeout(_checkFunction, 2000);
        };</p>
<p>    //  includes -- bind to $R
    //  ========</p>
<p>        //  target
        //  ======</p>
<p>            //  globals
            //  =======
                $R.win = window;
                $R.document = window.document;</p>
<p>                $R.$win = $($R.win);
                $R.$document = $($R.document);</p>
<p>            //	init
            //	====</p>
<p>    //  version
    //  =======
        $R.version = '3335.890.162';</p>
<p>	//	paths	
	//	=====
		$R.paths = 
		{
			'main':		'none',
			'evernote':	'https://www.evernote.com/'
		};</p>
<p>	//	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',</p>
<p>            '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'
		};</p>
<p>            //	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];
                    }</p>
<p>                //  css
                //  ===
                    _component__in_page_css_element.setAttribute('id', '_clearly_component__css');
                    _component__in_page_css_element.setAttribute('type', 'text/css');</p>
<p>                    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)); }</p>
<p>                    _body.appendChild(_component__in_page_css_element);</p>
<p>                //  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');</p>
<p>        //  bulk
        //  ====</p>
<p>            //	debug
            //	=====</p>
<p>	//	defaults to false
	if ($R.debug); else { $R.debug = false; }</p>
<p>	//	make it faster -- when not debugging
	//	==============
	if (!($R.debug))
	{
		$R.debugRemember = {};</p>
<p>		$R.writeLog 		= function () { return false; };
		$R.log 				= function () { return false; };</p>
<p>		$R.debugTimerStart 	= function () { return false; };
		$R.debugTimerEnd 	= function () { return false; };</p>
<p>		$R.debugPrint 		= function () { return false; };
		$R.printDebugOutput = function () { return false; };</p>
<p>		$R.debugOutline 	= function () { return false; };
	}
	else
	{
		//	remember stuff
			$R.debugRemember = {};</p>
<p>		//	vars
		//	====
			$R.debugStuff = [];
			$R.debugTimers = [];</p>
<p>		//	write log
		//	=========
			$R.initializeWriteLogFunction = function ()
			{
				switch (true)
				{
					case (!(!($R.win.console &#038;&#038; $R.win.console.log))):
						$R.writeLog = function (msg) { $R.win.console.log(msg); };
						break;</p>
<p>					case (!(!($R.win.opera &#038;&#038; $R.win.opera.postError))):
						$R.writeLog = function (msg) { $R.win.opera.postError(msg); };
						break;</p>
<p>					default:
						$R.writeLog = function (msg) {};
						break;
				}
			};</p>
<p>		//	log
		//	===
			$R.initializeWriteLogFunction();
			$R.log = function ()
			{
                if ($R.debug); else { return; }</p>
<p>				for (var i=0, il=arguments.length; i<il ; i++)
					{ $R.writeLog(arguments[i]); }</p>
<p>				$R.writeLog('-----------------------------------------');
			};</p>
<p>		//	outline
		//	=======
			$R.debugOutline = function (_element, _category, _reason)
			{
				switch (true)
				{
                    case (!$R.debug):
					case (!(_element.nodeType === 1)):
					case (!(_element.tagName > '')):
					case (_element.tagName.toLowerCase() == 'onject'):
					case (_element.tagName.toLowerCase() == 'embed'):
						return;
                }</p>
<p>                var 
                    _outline = '#ff5500',
                    _background = 'rgba(255, 85, 0, 0.5)'
                ;</p>
<p>                //  choose
                switch (true)
                {
                    case (_category == 'target' &#038;&#038; _reason == 'first'):
                        _outline = '#00cc00';
                        _background = 'rgba(0, 255, 0, 0.5)';
                        break;</p>
<p>                    case (_category == 'target' &#038;&#038; _reason == 'second'):
                        _outline = '#0000cc';
                        _background = 'rgba(0, 0, 255, 0.5)';
                        break;</p>
<p>                    //  =====</p>
<p>                    case (_category == 'target' &#038;&#038; _reason == 'next-page'):
                        _outline = '#FF80C0';
                        _background = 'rgba(255, 128, 192, 0.5)';
                        break;</p>
<p>                    case (_category == 'target' &#038;&#038; _reason == 'add-above'):
                        _outline = '#804000';
                        _background = 'rgba(128, 64, 0, 0.5)';
                        break;</p>
<p>                    //  =====</p>
<p>                    case (_category == 'clean-before' &#038;&#038; _reason == 'floating'):
                        _outline = '#808080';
                        _background = 'rgba(128, 128, 128, 0.5)';
                        break;</p>
<p>                    case (_category == 'clean-after' &#038;&#038; _reason == 'missing-density'):
                        _outline = '#C0C0C0';
                        _background = 'rgba(192, 192, 192, 0.5)';
                        break;</p>
<p>                    case (_category == 'clean-after' || _category == 'clean-before'):
                        _outline = '#000000';
                        _background = 'rgba(0, 0, 0, 0.5)';
                        break;
                }</p>
<p>                //  do
                $(_element).attr('readable__outline', (_category + ': ' + _reason));
                $(_element).css({
                    'outline': '5px solid ' + _outline,
                    'background-color': '' + _background
                });
			};</p>
<p>            $R.debugBackground = function (_element, _category, _reason)
            {
                if ($R.debug); else { return; }</p>
<p>				switch (true)
				{
					case (!(_element.nodeType === 1)):
					case (!(_element.tagName > '')):
					case (_element.tagName.toLowerCase() == 'onject'):
					case (_element.tagName.toLowerCase() == 'embed'):
						//	don't outline
						break;</p>
<p>					default:
						var _color = 'transparent';
						switch (true)
						{
							case (_category == 'target' &#038;&#038; _reason == 'first'): 				_color = '';	break;
							case (_category == 'target' &#038;&#038; _reason == 'second'): 				_color = '';	break;</p>
<p>							case (_category == 'target' &#038;&#038; _reason == 'next-page'):				_color = '#FF80C0'; break;
							case (_category == 'target' &#038;&#038; _reason == 'add-above'): 			_color = '#804000'; break;</p>
<p>							case (_category == 'clean-before' &#038;&#038; _reason == 'floating'): 		_color = '#808080'; break;
							case (_category == 'clean-after' &#038;&#038; _reason == 'missing-density'): 	_color = '#C0C0C0'; break;</p>
<p>							case (_category == 'clean-after' || _category == 'clean-before'):	_color = '#000000'; break;
						}</p>
<p>						$(_element).css('outline','5px solid '+_color);
						$(_element).attr('readable__outline', (_category + ': ' + _reason));
						break;
				}
            };</p>
<p>		//	timers
		//	======
			$R.debugTimerStart = function (timerName)
			{
				$R.debugTimers.push({
					'name': timerName,
					'start': (new Date()).getTime()
				});
			};</p>
<p>			$R.debugTimerEnd = function ()
			{
				var _t = $R.debugTimers.pop(), _time = ((new Date()).getTime() - _t.start);
				$R.log('TIMER / '+_t.name+': ' + _time);
				return _time;
			};</p>
<p>		//	output -- will be shown in Show function
		//	======
			$R.debugPrint = function (_key, _value)
				{ $R.debugStuff[_key] = _value; };</p>
<p>			$R.printDebugOutput = function ()
			{
				//	return
					if ($R.debug); else { return; }
					if ($R.customScript) { return; }</p>
<p>				//	first
					var _first =
					[
                        'Language',
						'ExploreAndGetStuff',
						'ProcessFirst',
						'ProcessSecond',
						'BuildHTML',
						'BuildHTMLPregs',
                        'PointsFirst',
                        'PointsSecond',
                        'Target',
						'NextPage',
                        'TitleSource'
					];</p>
<p>				//	get and clean
					_$debug = $('#debugOutput');
					_$debug.html('');</p>
<p>				//	write
					var _debug_write = function (_key, _value)
					{
						_$debug.append(''
							+ '</p>
<tr>'
							+ 	'</p>
<td class="caption">'
							+		_key
							+ 	'</td>
<p>'
							+ 	'</p>
<td id="debugOutput__value__'+_key+'" class="value">'
							+		_value
							+ 	'</td>
<p>'
							+ '</tr>
<p>'	
						);
					}</p>
<p>				//	first
					for (var i=0, _i=_first.length; i<_i; i++)
						{ _debug_write(_first[i], $R.debugStuff[_first[i]]); delete($R.debugStuff[_first[i]]); }</p>
<p>				//	the rest
					for (var _k in $R.debugStuff)
						{ _debug_write(_k, $R.debugStuff[_k]); }</p>
<p>				//	end; stop
					$R.debugPrint = function () {};
					$R.printDebugOutput = function () {};
			};</p>
<p>		//	scriptable scrolling
			$R.debugScroll__before1 = function () { $R.win.scrollTo(0, 0); };
			$R.debugScroll__before2 = function () { $R.win.scrollTo(0, $R.$win.height()); };
			$R.debugScroll__before3 = function () { if ($($R.debugRemember['theTarget']).height() > 0) { $R.debugRemember['theTarget'].scrollIntoView(false); } else { $R.debugRemember['firstCandidate'].scrollIntoView(false); } $R.win.scrollBy(0, 100); };</p>
<p>			$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); };
	}</p>
<p>                $R.debug = false;</p>
<p>            //	environment
            //	===========</p>
<p>	//	environtment
	//	============</p>
<p>		$R.mac = (!$R.iOS &#038;&#038; ($R.win.navigator.userAgent.match(/Macintosh/i) != null));</p>
<p>        //  get browser</p>
<p>//  var -- gets filled in
//  ===
    var __the_browser = 'unknown';</p>
<p>//  possible values -- in this order
//  ===============
/*
    firefox
    safari
    chrome
    internet_explorer
    opera</p>
<p>    iphone
    ipad</p>
<p>    android
    dolphin
    firefox_mobile
    chrome_mobile</p>
<p>    windows_phone
*/    </p>
<p>//  doing work    
//  ==========
    __the_browser = (function ()
    {
        //  ua string
        //  =========
            var _ua = window.navigator.userAgent.toLowerCase();</p>
<p>        //  cases
        //  =====</p>
<p>            if ((_ua.indexOf('windows phone') > -1))                            { return 'windows_phone'; }</p>
<p>            if ((_ua.indexOf('chrome') > -1) &#038;&#038; (_ua.indexOf('android') > -1))  { return 'chrome_mobile'; }
            if ((_ua.indexOf('firefox') > -1) &#038;&#038; (_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'; }</p>
<p>            if ((_ua.indexOf('ipad') > -1))                                     { return 'ipad'; }
            if ((_ua.indexOf('iphone') > -1))                                   { return 'iphone'; }</p>
<p>            if ($.browser.opera)                                                { return 'opera'; }
            if ($.browser.msie)                                                 { return 'internet_explorer'; }
            if ($.browser.webkit &#038;&#038; (_ua.indexOf('chrome') > -1))               { return 'chrome'; }
            if ($.browser.webkit &#038;&#038; (_ua.indexOf('safari') > -1))               { return 'safari'; }
            if ($.browser.mozilla)                                              { return 'firefox'; }
    })();
        $R.browser = __the_browser;</p>
<p>    //  language specific stuff
    //  =======================</p>
<p>        //  default
        $R.language = 'general';</p>
<p>        //  the text - start with title
        var _test_text = ' ' + $R.document.title;</p>
<p>        //  add couple of random paragraphs, divs
        var 
            _ps = $R.document.getElementsByTagName('p'),
            _ds = $R.document.getElementsByTagName('div')
        ;</p>
<p>        //  add
        for (var i=0; i<5; i++) { _test_text += ' ' + $(_ps[Math.floor(Math.random()*_ps.length)]).text(); }
        for (var i=0; i<5; i++) { _test_text += ' ' + $(_ds[Math.floor(Math.random()*_ds.length)]).text(); }</p>
<p>        //  check
        switch (true)
        {
        //    case ($R.win.location.host.match(/\.jp$/i) != null):
        //    case ($R.win.location.host.match(/\.cn$/i) != null):
        //    case ($R.win.location.host.match(/\.tw$/i) != null):
        //    case ($R.win.location.host.match(/\.hk$/i) != null):
        //    case ($R.win.location.host.match(/\.kr$/i) != null):</p>
<p>            case (_test_text.match(/([\u3000])/gi) != null):
            case (_test_text.match(/([\u3001])/gi) != null):
            case (_test_text.match(/([\u3002])/gi) != null):
            case (_test_text.match(/([\u301C])/gi) != null):</p>
<p>                $R.language = 'cjk';
                break;
        }</p>
<p>        //  in case we stop
        $R.debugPrint('Language', $R.language);</p>
<p>            //	rtl
            //	===</p>
<p>	//	var
	//	===
		$R.rtl = false;</p>
<p>	//	functions
	//	=========
		$R.makeRTL = function ()
		{
            //  set
			$R.rtl = true;</p>
<p>            //  as component; return
            if ($R.component) { return; }</p>
<p>            $('#curtain__rtl__radio__rtl').get(0).checked = true;
            $('#curtain__rtl__radio__ltr').get(0).checked = false;</p>
<p>            $('html')
				.attr('dir', 'rtl')
				.addClass('couldBeRTL')
				.addClass('rtl');</p>
<p>            $R.$pages
                .attr('dir', 'rtl')
                .addClass('rtl');
		};</p>
<p>		$R.makeNotRTL = function ()
		{
            //  set
			$R.rtl = false;</p>
<p>            //  as component; return
            if ($R.component) { return; }</p>
<p>			$('#curtain__rtl__radio__rtl').get(0).checked = false;
			$('#curtain__rtl__radio__ltr').get(0).checked = true;</p>
<p>            $('html')
				.attr('dir', '')
				.removeClass('rtl');</p>
<p>            $R.$pages
                .attr('dir', '')
                .removeClass('rtl');
		};</p>
<p>	//	detect
	//	======
		(function ()
		{
			//	definitely rtl
			$R.$document.find('html, body').each(function (_i, _e)
			{
				switch (true) {
					case ($(_e).attr('dir') == 'rtl'):
					case ($(_e).css('direction') == 'rtl'):</p>
<p>					case ($(_e).attr('lang') == 'he'):
					case ($(_e).attr('lang') == 'he-il'):
					case ($(_e).attr('lang') == 'ar'):
					case ($(_e).attr('lang') == 'ur'):</p>
<p>						$R.makeRTL();
						return false;
				}
			});</p>
<p>			//	maybe rtl
            //  =========
            if ($R.component); else
            {
                if ((!$R.rtl) &#038;&#038; ($R.$document.find("div[dir='rtl'], table[dir='rtl'], td[dir='rtl']").length > 0))
                    { $('html').addClass('couldBeRTL'); }
            }
		})();</p>
<p>	//	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; });
        }</p>
<p>            //	measure text
            //	============</p>
<p>	//	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</p>
<p>	//	length
	//	======
		$R.measureText__getTextLength = function (_the_text)
		{
			var _text = _the_text;</p>
<p>				_text = _text.replace(/[\s\n\r]+/gi, '');
				//_text = _text.replace(/\d+/, '');</p>
<p>			return _text.length;
		};</p>
<p>	//	word count
	//	==========
		$R.measureText__getWordCount = function (_the_text)
		{
			var _text = _the_text;</p>
<p>			//	do stuff
			//	========
				_text = _text.replace(/[\s\n\r]+/gi, ' ');</p>
<p>				_text = _text.replace(/([.,?!:;()\[\]'""-])/gi, ' $1 ');</p>
<p>				_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)]');</p>
<p>			//	count
			//	=====
				var 
					_count = 0,
					_words_match = _text.match(/([^\s\d]{3,})/gi)
				;	</p>
<p>				//	add match
				_count += (_words_match != null ? _words_match.length : 0);</p>
<p>				//	add manual count
				_text.replace(/\[=words\((\d)\)\]/, function (_match, _plus) { _count += (5 * parseInt(_plus)); });</p>
<p>			//	return
			//	======
				return _count;
		};</p>
<p>	//	levenshtein
	//	===========	
		$R.levenshteinDistance = function (str1, str2)
		{
			var l1 = str1.length, l2 = str2.length;
			if (Math.min(l1, l2) === 0)
				{ return Math.max(l1, l2); }</p>
<p>			var i = 0, j = 0, d = [];
			for (i = 0 ; i <= l1 ; i++)
			{
				d[i] = [];
				d[i][0] = i;
			}</p>
<p>			for (j = 0 ; j <= l2 ; j++)
				{ d[0][j] = j; }</p>
<p>			for (i = 1 ; i <= l1 ; i++)
			{
				for (j = 1 ; j <= l2 ; j++)
				{
					d[i][j] = Math.min
					(
						d[i - 1][j] + 1,
						d[i][j - 1] + 1, 
						d[i - 1][j - 1] + (str1.charAt(i - 1) === str2.charAt(j - 1) ? 0 : 1)
					);
				}
			}
			return d[l1][l2];
		};</p>
<p>            //	content
            //	=======</p>
<p>	$R.footnotedLinksCount = 0;</p>
<p>	$R.getContent = function ()
	{
		//	homepage?
		if ($R.win.location.href == ($R.win.location.protocol + '//' + $R.win.location.host + '/'))
			{ $('html').addClass('showTips'); }</p>
<p>		//	selection or whole
		switch (true)
		{
			case ($R.getContent__manualSelection()):
			case ($R.getContent__find()):
				break;</p>
<p>			default:
				break;
		}</p>
<p>		//	debug
		$R.printDebugOutput();</p>
<p>		//	show content
		$R.showContent();
	};</p>
<p>	$R.getContent__manualSelection = function ()
	{
		var 
			_selection = $R.sel.getSelection($R.win),
			_range = $R.sel.getRange(_selection),
			_html = $R.sel.getRangeHTML(_range),
			_text = $R.sel.getRangeText(_range)
		;</p>
<p>		if (_html > '' &#038;&#038; _text > ''); else
		{
			_html = null;
			_text = null;</p>
<p>			$R.$document.find('frame, iframe').each(function (_i, _e)
			{
				if (_e.getAttribute('id') == 'readable_iframe') { return; }</p>
<p>				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)
					;</p>
<p>					if (__html > '' &#038;&#038; __text > '')
					{
						_html = __html;
						_text = __text;</p>
<p>						// stop the each
						return false;
					}
				}
				catch(e) { }
			});
		}</p>
<p>		//	haven't found anything		
		if (_html > '' &#038;&#038; _text > ''); else { return false; }</p>
<p>		//	probably selected something by mistake
		if ($R.measureText__getTextLength(_text) > (65 * 3 * 1.5)); else { return false; }</p>
<p>		//	display
		//	=======
			$R.$pages.html('');
			$R.displayPageHTML(_html, 1, 'selection');</p>
<p>		//	return true
		return true;
	};</p>
<p>//	functions
//	=========</p>
<p>	$R.sel = {};</p>
<p>	$R.sel.getWindowFromDocument = function (theDocument)
	{
		if (theDocument); else { return null; }</p>
<p>		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;
			};
		}</p>
<p>		return arguments.calee(theDocument);
	};</p>
<p>	$R.sel.getSelection = function (theWindow)
	{
		if (theWindow); else { return null; }</p>
<p>		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;
			};
		}</p>
<p>		return arguments.calee(theWindow);
	};</p>
<p>	$R.sel.getRange = function (selection)
	{
		if (selection); else { return null; }</p>
<p>		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;
			};
		}</p>
<p>		return arguments.calee(selection);
	};</p>
<p>	$R.sel.getRangeHTML = function (range)
	{
		if (range); else { return null; }</p>
<p>		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;
			};
		}</p>
<p>		return arguments.calee(range);
	};</p>
<p>	$R.sel.getRangeText = function (range)
	{
		if (range); else { return null; }</p>
<p>		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;
			};
		}</p>
<p>		return arguments.calee(range);
	};</p>
<p>	//	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'],</p>
<p>				'video': 	['src', 'width', 'height', 'poster', 'audio', 'preload', 'autoplay', 'loop', 'controls'],
				'audio': 	['src', 'preload', 'autoplay', 'loop', 'controls'],		 
				'source': 	['src', 'type'],</p>
<p>				'object': 	['data', 'type', 'width', 'height', 'classid', 'codebase', 'codetype'],						
				'param': 	['name', 'value'],
				'embed': 	['src', 'type', 'width', 'height', 'flashvars', 'allowscriptaccess', 'allowfullscreen', 'bgcolor'],</p>
<p>				'iframe':	['src', 'width', 'height', 'frameborder', 'scrolling'],</p>
<p>				'td':		['colspan', 'rowspan'],			
				'th':		['colspan', 'rowspan']
			}
		};</p>
<p>	//	next page keywords -- (?? charCodeAt() > 127)
	//	==================
		$R.nextPage__captionKeywords = 
		[
			/* english */
			'next page', 'next',</p>
<p>			/* german */
			'vorw&#228;rts', 'weiter',</p>
<p>			/* japanese */
			'&#27425;&#12408;'
		];</p>
<p>		$R.nextPage__captionKeywords__not =
		[
			/* english */
			'article', 'story', 'post', 'comment', 'section', 'chapter'</p>
<p>		];</p>
<p>	//	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'
		];</p>
<p>	//	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'
		];</p>
<p>	//	keep video
	//	==========</p>
<p>		$R.keepStuffFromDomain__video = 
		[
			'youtube.com',
			'youtube-nocookie.com',</p>
<p>			'vimeo.com',
			'hulu.com',
			'yahoo.com',
			'flickr.com',
			'newsnetz.ch'
		];</p>
<p>	$R.getContent__exploreNodeAndGetStuff = function (_nodeToExplore, _justExploring)
	{
		var	
			_global__element_index = 0,</p>
<p>			_global__inside_link = false,
			_global__inside_link__element_index = 0,</p>
<p>			_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 = '',</p>
<p>			_return__containers = [],
			_return__candidates = [],
			_return__links = []
		;</p>
<p>		//	recursive function
		//	==================
		var _recursive = function (_node)
		{
			//	increment index
			//	starts with 1
			_global__element_index++;</p>
<p>			var 
				_tag_name = (_node.nodeType === 3 ? '#text' : ((_node.nodeType === 1 &#038;&#038; _node.tagName &#038;&#038; _node.tagName > '') ? _node.tagName.toLowerCase() : '#invalid')),
				_result =
				{
					'__index': _global__element_index, 
					'__node': _node, </p>
<p>					'_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,</p>
<p>					'_debug__above__plain_text': _global__above__plain_text,
					'_debug__above__links_text': _global__above__links_text,</p>
<p>					'_length__above_plain_text': _global__length__above_plain_text,
					'_count__above_plain_words': _global__count__above_plain_words,</p>
<p>					'_length__above_links_text': _global__length__above_links_text,
					'_count__above_links_words': _global__count__above_links_words,</p>
<p>					'_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),</p>
<p>                    '_count__above_candidates': _global__count__above_candidates,
                    '_count__above_containers': _global__count__above_containers,</p>
<p>					'_length__plain_text': 0,
					'_count__plain_words': 0,</p>
<p>					'_length__links_text': 0,
					'_count__links_words': 0,</p>
<p>					'_length__all_text': 0,
					'_count__all_words': 0,</p>
<p>					'_count__containers': 0,
					'_count__candidates': 0,</p>
<p>					'_count__links': 0,
					'_count__links_skip': 0,</p>
<p>					'_count__images_small': 0,
					'_count__images_medium': 0,
					'_count__images_large': 0,
					'_count__images_skip': 0
				};</p>
<p>			//	fast return
			//	===========
				switch (true)
				{
					case ((_tag_name == '#invalid')):
					case (($R.parsingOptions._elements_ignore.indexOf('|'+_tag_name+'|') > -1)):
						return;</p>
<p>					case (($R.parsingOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1)):</p>
<p>	//	included inline
	//	_node, _tag_name must be defined
	//	will return, if node is hidden</p>
<p>	switch (true)
	{
		case (_node.offsetWidth > 0):
		case (_node.offsetHeight > 0):
			break;</p>
<p>		default:
			switch (true)
			{
				case (_node.offsetLeft > 0):
				case (_node.offsetTop > 0):
					break;</p>
<p>				default:
                    //  exclude inline DIVs -- which, stupidly, don't have a width/height
                    if ((_tag_name == 'div') &#038;&#038; ((_node.style.display || $.css( _node, "display" )) == 'inline'))
                        { break; }</p>
<p>                    //  it's hidden; exit current scope
					return;
			}
			break;
	}</p>
<p>						break;</p>
<p>					//	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;
				}</p>
<p>			//	do stuff
			//	========
				switch (true)
				{
					//	text node
					//	=========
						case ((_tag_name == '#text')):
							//	mark
							_result._is__text = true;</p>
<p>							//	get
							var _nodeText = _node.nodeValue;</p>
<p>							//	result
							_result._length__plain_text = $R.measureText__getTextLength(_nodeText);
							_result._count__plain_words = $R.measureText__getWordCount(_nodeText);</p>
<p>							if (_global__inside_link)
							{
								_global__length__above_links_text += _result._length__plain_text;
								_global__count__above_links_words += _result._count__plain_words;					
								if (false &#038;&#038; $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 &#038;&#038; $R.debug) { _global__above__plain_text += ' ' + _nodeText; }
							}</p>
<p>							//	return text
							return _result;</p>
<p>					//	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);
                        }</p>
<p>							//	sanity
							if (_href > ''); else { break; }
							if (_href.indexOf); else { break; }</p>
<p>							_result._is__link = true;</p>
<p>							//	skip
							for (var i=0, _i=$R.skipStuffFromDomains__links.length; i<_i; i++)
							{
								if (_node.href.indexOf($R.skipStuffFromDomains__links[i]) > -1)
									{ _result._is__link_skip = true; break; }
							}</p>
<p>							//	inside link
							if (_global__inside_link); else
							{
								_global__inside_link = true;
								_global__inside_link__element_index = _result.__index;
							}</p>
<p>							//	done
							_return__links.push(_result);
							break;</p>
<p>					//	image
					//	=====
						case (_tag_name == 'img'):</p>
<p>							//	skip
							//	====
								if (_node.src &#038;&#038; _node.src.indexOf)
								{
									for (var i=0, _i=$R.skipStuffFromDomain__images.length; i<_i; i++)
									{
										if (_node.src.indexOf($R.skipStuffFromDomain__images[i]) > -1)
											{ _result._is__image_skip = true; break; }
									}
								}</p>
<p>							//	size
							//	====
								var	_width = $(_node).width(), _height = $(_node).height();
								switch (true)
								{
									case ((_width * _height) >= 50000):
									case ((_width >= 350) &#038;&#038; (_height >= 75)):
										_result._is__image_large = true;
										break;</p>
<p>									case ((_width * _height) >= 20000):
									case ((_width >= 150) &#038;&#038; (_height >= 150)):
										_result._is__image_medium = true;
										break;</p>
<p>									case ((_width <= 5) &#038;&#038; (_height <= 5)):
										_result._is__image_skip = true;
										break;</p>
<p>									default:
										_result._is__image_small = true;
										break;
								}</p>
<p>							break;
				}</p>
<p>			//	child nodes
			//	===========
				for (var i=0, _i=_node.childNodes.length; i<_i; i++)
				{
					var 
						_child = _node.childNodes[i],
						_child_result = _recursive(_child)
					;</p>
<p>					//	if false, continue
					//	==================
						if (_child_result); else { continue; }</p>
<p>					//	add to result
					//	=============
						_result._count__links += 			_child_result._count__links + 			(_child_result._is__link ? 1 : 0);
						_result._count__links_skip += 		_child_result._count__links_skip + 		(_child_result._is__link_skip ? 1 : 0);</p>
<p>						_result._count__images_small += 	_child_result._count__images_small + 	(_child_result._is__image_small ? 1 : 0);
						_result._count__images_medium += 	_child_result._count__images_medium + 	(_child_result._is__image_medium ? 1 : 0);
						_result._count__images_large += 	_child_result._count__images_large + 	(_child_result._is__image_large ? 1 : 0);
						_result._count__images_skip += 		_child_result._count__images_skip + 	(_child_result._is__image_skip ? 1 : 0);</p>
<p>						_result._count__containers += 		_child_result._count__containers + 		(_child_result._is__container ? 1 : 0);
						_result._count__candidates += 		_child_result._count__candidates + 		(_child_result._is__candidate ? 1 : 0);</p>
<p>						_result._length__all_text += 		_child_result._length__plain_text + 	_child_result._length__links_text;
						_result._count__all_words += 		_child_result._count__plain_words + 	_child_result._count__links_words;</p>
<p>						//	plain text / link text
						//	======================
							switch (true)
							{
								case (_child_result._is__link):
									//	no text to add
									_result._length__links_text += (_child_result._length__plain_text + _child_result._length__links_text);
									_result._count__links_words += (_child_result._count__plain_words + _child_result._count__links_words);
									break;</p>
<p>								default:
									_result._length__plain_text += 			_child_result._length__plain_text;
									_result._count__plain_words += 			_child_result._count__plain_words;
									_result._length__links_text += 			_child_result._length__links_text;
									_result._count__links_words += 			_child_result._count__links_words;
									break;
							}
				}</p>
<p>			//	after child nodes
			//	=================</p>
<p>				//	mark as not in link anymore
				//	===========================
					if (true
						&#038;&#038; (_result._is__link) 
						&#038;&#038; (_global__inside_link__element_index == _result.__index)
					) {
						_global__inside_link = false;
						_global__inside_link__element_index = 0;
					}</p>
<p>			//	add to containers
			//	=================
				if (_result._is__container || ((_result.__index == 1) &#038;&#038; (_justExploring == true)))
				{
					//	add to containers
					_return__containers.push(_result);</p>
<p>                    //  increase above containers
                    if (_result._is__container) { _global__count__above_containers++; }</p>
<p>					//	add to candidates
					if (_justExploring); else
					{
						switch (true)
						{
							case (($R.language != 'cjk') &#038;&#038; ((_result._count__links * 2) >= _result._count__plain_words)):  /* link ratio */</p>
<p>                            case (($R.language != 'cjk') &#038;&#038; (_result._length__plain_text < (65 / 3))):  /* text length */
							case (($R.language != 'cjk') &#038;&#038; (_result._count__plain_words < 5)):			/* words */</p>
<p>                            case (($R.language == 'cjk') &#038;&#038; (_result._length__plain_text < 10)):	    /* text length */
							case (($R.language == 'cjk') &#038;&#038; (_result._count__plain_words < 2)):			/* words */</p>
<p>							//case (_result._length__plain_text == 0):    /* no text */
							//case (_result._count__plain_words == 0):    /* no words */</p>
<p>                            //case (($R.language == 'cjk') &#038;&#038; ((_result._length__plain_text / 65 / 3) < 0.1)):				/* paragrahs of 3 lines */
							//case (($R.language != 'cjk') &#038;&#038; ((_result._count__plain_words / 50) < 0.5)):					/* paragraphs of 50 words */</p>
<p>                                //	not a valid candidate
                                //if (_tag_name == 'div') { $R.log('bad candidate', _result.__node); }</p>
<p>                                break;</p>
<p>							default:
								//	good candidate
								_result._is__candidate = true;
								_return__candidates.push(_result);</p>
<p>                                //  increase above candidates
                                _global__count__above_candidates++;</p>
<p>								break;
						}</p>
<p>						//	special case for body -- if it was just skipped
						//	=====================
							if ((_result.__index == 1) &#038;&#038; !(_result._is__candidate))
							{
								_result._is__candidate = true;
								_result._is__bad = true;
								_return__candidates.push(_result);
							}
					}
				}</p>
<p>			//	return
			//	======
				return _result;
		};</p>
<p>		//	actually do it
		//	==============
			_recursive(_nodeToExplore);</p>
<p>		//	just exploring -- return first thing
		//	==============
			if (_justExploring) { return _return__containers.pop(); }</p>
<p>		//	return containers list
		//	======================
			return {
				'_containers': 	_return__containers,
				'_candidates': 	_return__candidates,
				'_links': 		_return__links
			};
	};</p>
<p>	$R.getContent__processCandidates = function (_candidatesToProcess)
	{
		//	process this var
		//	================
			var _candidates = _candidatesToProcess;</p>
<p>		//	sort _candidates -- the lower in the dom, the closer to position 0
		//	================
			_candidates.sort(function (a, b)
			{
				switch (true)
				{
					case (a.__index < b.__index): return -1;
					case (a.__index > b.__index): return 1;
					default: return 0;
				}
			});</p>
<p>		//	get first
		//	=========
			var	_main = _candidates[0]
			if ($R.debug) { $R.log('should be body', _main, _main.__node); }</p>
<p>		//	pieces of text
		//	and points computation
		//	======================
			for (var i=0, _i=_candidates.length; i<_i; i++)
			{
				//	pieces
				//	======
					var 
						_count__pieces = 0,
						_array__pieces = []
					;</p>
<p>					for (var k=i, _k=_candidates.length; k<_k; k++)
					{
						if (_candidates[k]._count__candidates > 0) { continue; }
						if ($.contains(_candidates[i].__node, _candidates[k].__node)); else { continue; }</p>
<p>						//	store piece, if in debug mode
						if ($R.debug) { _array__pieces.push(_candidates[k]); }</p>
<p>						//	incement pieces count
						_count__pieces++;
					}</p>
<p>				//	candidate details
				//	=================
					_candidates[i]['__candidate_details'] = $R.getContent__computeDetailsForCandidate(_candidates[i], _main);</p>
<p>				//	pieces -- do this here because _main doesn't yet have a pieces count
				//	======</p>
<p>					//	set pieces
					_candidates[i]['_count__pieces'] = _count__pieces;
					_candidates[i]['_array__pieces'] = _array__pieces;</p>
<p>					//	pieces ratio
					_candidates[i]['__candidate_details']['_ratio__count__pieces_to_total_pieces'] = (_count__pieces / (_candidates[0]._count__pieces + 1));</p>
<p>                //  check some more
                //  ===============
                /*    switch (true)
                    {
                        case (($R.language != 'cjk') &#038;&#038; (_candidates[i]['__candidate_details']['_ratio__length__links_text_to_plain_text'] > 1)):
                        case (($R.language != 'cjk') &#038;&#038; (_candidates[i]['__candidate_details']['_ratio__count__links_words_to_plain_words'] > 1)):
                            _candidates[i]._is__bad = true;
                            break;
                    }*/</p>
<p>				//	points
				//	======
					_candidates[i].__points_history = $R.getContent__computePointsForCandidate(_candidates[i], _main);
					_candidates[i].__points = _candidates[i].__points_history[0];
			}</p>
<p>		//	sort _candidates -- the more points, the closer to position 0
		//	================
			_candidates.sort(function (a, b)
			{
				switch (true)
				{
					case (a.__points > b.__points): return -1;
					case (a.__points < b.__points): return 1;
					default: return 0;
				}
			});</p>
<p>		//	return
		//	======
			return _candidates;	
	};</p>
<p>	$R.getContent__computeDetailsForCandidate = function (_e, _main)
	{
		var _r = {};</p>
<p>		//	bad candidate
		//	=============
			if (_e._is__bad) { return _r; }</p>
<p>		//	paragraphs
		//	==========
			_r['_count__lines_of_65_characters'] = (_e._length__plain_text / 65);
			_r['_count__paragraphs_of_3_lines'] =  (_r._count__lines_of_65_characters / 3);
			_r['_count__paragraphs_of_5_lines'] =  (_r._count__lines_of_65_characters / 5);</p>
<p>			_r['_count__paragraphs_of_50_words'] = (_e._count__plain_words / 50);
			_r['_count__paragraphs_of_80_words'] = (_e._count__plain_words / 80);</p>
<p>		//	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);</p>
<p>		//	links
		//	=====
			_r['_ratio__length__links_text_to_plain_text'] =  (_e._length__links_text / _e._length__plain_text);
			_r['_ratio__count__links_words_to_plain_words'] = (_e._count__links_words / _e._count__plain_words);</p>
<p>			_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);</p>
<p>			_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));</p>
<p>			_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);</p>
<p>		//	text above
		//	==========
            var 
                _divide__candidates = Math.max(2, Math.ceil(_e._count__above_candidates * 0.5)),</p>
<p>                _above_text = ((0
                    + (_e._length__above_plain_text * 1)
                    + (_e._length__above_plain_text / _divide__candidates)
                ) / 2),</p>
<p>                _above_words = ((0
                    + (_e._count__above_plain_words * 1)
                    + (_e._count__above_plain_words / _divide__candidates)
                ) / 2)
            ;</p>
<p>			_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);</p>
<p>		//	candidates
		//	==========
			_r['_ratio__count__candidates_to_total_candidates'] = (_e._count__candidates / (_main._count__candidates + 1));
			_r['_ratio__count__containers_to_total_containers'] = (_e._count__containers / (_main._count__containers + 1));</p>
<p>		//	return
		//	======
			return _r;
	};</p>
<p>	$R.getContent__computePointsForCandidate = function (_e, _main)
	{
		var 
			_details = _e.__candidate_details,
			_points_history = [],
            _really_big = ((_main._length__plain_text / 65) > 250)
		;</p>
<p>		//	bad candidate
		if (_e._is__bad) { return [0]; }</p>
<p>		//	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));</p>
<p>            //  negative
            if (_points_history[0] < 0) { return [0]; }</p>
<p>        //  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))
            ;</p>
<p>            _points_history.unshift(((0
                + (_points_history[0] * 3)
                + (_points_history[0] / _divide__pieces)
                + (_points_history[0] / _divide__candidates)
                + (_points_history[0] / _divide__containers)
            ) / 6));</p>
<p>		//	total text
		//	==========
			$R.getContent__computePointsForCandidate__do(0.10, 2, (1 - (1 - _details._ratio__length__plain_text_to_total_plain_text)), _points_history);
			$R.getContent__computePointsForCandidate__do(0.10, 2, (1 - (1 - _details._ratio__count__plain_words_to_total_plain_words)), _points_history);</p>
<p>            if (_really_big) {
            $R.getContent__computePointsForCandidate__do(0.10, 4, (1 - (1 - _details._ratio__length__plain_text_to_total_plain_text)), _points_history);
            $R.getContent__computePointsForCandidate__do(0.10, 4, (1 - (1 - _details._ratio__count__plain_words_to_total_plain_words)), _points_history);
            }</p>
<p>		//	text above
		//	==========
			$R.getContent__computePointsForCandidate__do(0.10, 5, (1 - _details._ratio__length__above_plain_text_to_total_plain_text), _points_history);
			$R.getContent__computePointsForCandidate__do(0.10, 5, (1 - _details._ratio__count__above_plain_words_to_total_plain_words), _points_history);</p>
<p>            if (_really_big) {
            $R.getContent__computePointsForCandidate__do(0.10, 10, (1 - _details._ratio__length__above_plain_text_to_total_plain_text), _points_history);
            $R.getContent__computePointsForCandidate__do(0.10, 10, (1 - _details._ratio__count__above_plain_words_to_total_plain_words), _points_history);
            }</p>
<p>		//	links outer
		//	===========
            $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__length__links_text_to_total_links_text), _points_history);
            $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__links_words_to_total_links_words), _points_history);</p>
<p>            $R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__links_to_total_links), _points_history);</p>
<p>        //  links inner
        //  ===========
            var __lr = ($R.language == 'cjk' ? 0.75 : 0.50);</p>
<p>            $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);</p>
<p>            $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__length__links_text_to_all_text), _points_history);
            $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_words_to_all_words), _points_history);</p>
<p>            $R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_to_plain_words), _points_history);</p>
<p>		//	candidates, containers, pieces
		//	==============================
			$R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__candidates_to_total_candidates), _points_history);
			$R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__containers_to_total_containers), _points_history);
			$R.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__pieces_to_total_pieces), _points_history);</p>
<p>		//	return -- will get [0] as the actual final points
		//	======
			return _points_history;
	};</p>
<p>	$R.getContent__processCandidatesSecond = function (_processedCandidates)
	{
		var 
			_candidates = _processedCandidates,
			_main = _candidates[0]
		;</p>
<p>		//	only get children of target
		//	===========================
			_candidates = $.map(_candidates, function (_element, _index)
			{
				switch (true)
				{
					case (!(_index > 0)):
					case (!($.contains(_main.__node, _element.__node))):
						return null;</p>
<p>					default:
						return _element;
				}
			});</p>
<p>            //  add main - to amke sure the result is never blank
            _candidates.unshift(_main);</p>
<p>		//	sort _candidates -- the lower in the dom, the closer to position 0
		//	================
			_candidates.sort(function (a, b)
			{
				switch (true)
				{
					case (a.__index < b.__index): return -1;
					case (a.__index > b.__index): return 1;
					default: return 0;
				}
			});</p>
<p>		//	second candidate computation
		//	============================
			for (var i=0, _i=_candidates.length; i<_i; i++)
			{
				//	additional numbers
				//	==================
					_candidates[i].__second_length__above_plain_text = (_candidates[i]._length__above_plain_text - _main._length__above_plain_text);
					_candidates[i].__second_count__above_plain_words = (_candidates[i]._count__above_plain_words - _main._count__above_plain_words);</p>
<p>				//	candidate details
				//	=================
					_candidates[i]['__candidate_details_second'] = $R.getContent__computeDetailsForCandidateSecond(_candidates[i], _main);</p>
<p>				//	check some more
				//	===============
				/*	switch (true)
					{
                        case (!(_candidates[i]['__candidate_details_second']['_ratio__count__plain_words_to_total_plain_words'] > 0.05)):
						case (!(_candidates[i]['__candidate_details_second']['_ratio__length__plain_text_to_total_plain_text'] > 0.05)):</p>
<p>						//case (!(_candidates[i]['__candidate_details_second']['_ratio__count__above_plain_words_to_total_plain_words'] < 0.1)):
						//case (!(_candidates[i]['__candidate_details_second']['_ratio__length__above_plain_text_to_total_plain_text'] < 0.1)):</p>
<p>                        //case (_candidates[i]['__candidate_details_second']['_ratio__length__above_plain_text_to_plain_text'] > 1):
                        //case (_candidates[i]['__candidate_details_second']['_ratio__count__above_plain_words_to_plain_words'] > 1):</p>
<p>                            _candidates[i]._is__bad = true;
							//	wil set points to 0, in points computation function
							break;
					}*/</p>
<p>				//	points
				//	======
					_candidates[i].__points_history_second = $R.getContent__computePointsForCandidateSecond(_candidates[i], _main);
					_candidates[i].__points_second = _candidates[i].__points_history_second[0];
			}</p>
<p>		//	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;
				}
			});</p>
<p>		//	return
		//	======
			return _candidates;	
	};</p>
<p>	$R.getContent__computeDetailsForCandidateSecond = function (_e, _main)
	{
		var _r = {};</p>
<p>		//	bad candidate
		//	=============
			if (_e._is__bad) { return _r; }</p>
<p>		//	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);</p>
<p>		//	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);</p>
<p>			_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));</p>
<p>			_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);</p>
<p>		//	text above
		//	==========</p>
<p>            var 
                _divide__candidates = Math.max(2, Math.ceil((_e._count__above_candidates - _main._count__above_candidates) * 0.5)),</p>
<p>                _above_text = ((0
                    + (_e.__second_length__above_plain_text * 1)
                    + (_e.__second_length__above_plain_text / _divide__candidates)
                ) / 2),</p>
<p>                _above_words = ((0
                    + (_e.__second_count__above_plain_words * 1)
                    + (_e.__second_count__above_plain_words / _divide__candidates)
                ) / 2)
            ;</p>
<p>			_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);</p>
<p>			_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);</p>
<p>		//	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));</p>
<p>		//	return
		//	======
			return _r;
	};</p>
<p>	$R.getContent__computePointsForCandidateSecond = function (_e, _main)
	{
		var 
			_details = _e.__candidate_details,
			_details_second = _e.__candidate_details_second,
			_points_history = []
		;</p>
<p>		//	bad candidate
		if (_e._is__bad) { return [0]; }</p>
<p>		//	get initial points
		//	==================
			_points_history.unshift(_e.__points_history[(_e.__points_history.length-1)]);</p>
<p>        //  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))
            ;</p>
<p>            _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));</p>
<p>		//	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);</p>
<p>		//	text above
		//	==========
            var __ar = ($R.language == 'cjk' ? 0.50 : 0.10);</p>
<p>			$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);</p>
<p>			$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);</p>
<p>		//	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);</p>
<p>		//	links inner
		//	===========
            var __lr = ($R.language == 'cjk' ? 0.75 : 0.50);</p>
<p>			$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);</p>
<p>			$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);</p>
<p>			$R.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details_second._ratio__count__links_to_plain_words), _points_history);</p>
<p>		//	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);</p>
<p>		//	return -- will get [0] as the actual final points
		//	======
			return _points_history;
	};</p>
<p>	$R.getContent__computePointsForCandidateThird = function (_e, _main)
	{
		var 
			_details = _e.__candidate_details,
			_details_second = _e.__candidate_details_second,
			_points_history = []
		;</p>
<p>		//	bad candidate
		if (_e._is__bad) { return [0]; }</p>
<p>		//	get initial points
		//	==================
			_points_history.unshift(_e.__points_history[(_e.__points_history.length-1)]);</p>
<p>        //  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))
            ;</p>
<p>            _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));</p>
<p>        //  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);</p>
<p>        //	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);</p>
<p>            $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);</p>
<p>            $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);</p>
<p>        //	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);</p>
<p>            $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);</p>
<p>            $R.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__links_to_plain_words), _points_history);</p>
<p>        //	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);</p>
<p>		//	return -- will get [0] as the actual final points
		//	======
			return _points_history;
    };</p>
<p>    $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)
        ;</p>
<p>        if (_ratio < 0)
        {
            //_points_return = (0.75 * _points_remaining);
            _points_return = _points_remaining;
        }
        else
        {
            _points_return = 0
                + _points_remaining
                + (_points_to_compute * Math.pow(_ratio, _power))
            ;
        }</p>
<p>        //	add
        _points_history.unshift(_points_return);
    };</p>
<p>	$R.getContent__buildHTMLForNode = function (_nodeToBuildHTMLFor, _custom_mode)
	{
		var 
			_global__element_index = 0,
			_global__the_html = '',
			_global__exploreNodeToBuildHTMLFor = $R.getContent__exploreNodeAndGetStuff(_nodeToBuildHTMLFor, true)
		;</p>
<p>		//	custom
		//	======
		switch (_custom_mode)
		{
			case 'above-the-target':
				_global__exploreNodeToBuildHTMLFor = false;
				break;
		}</p>
<p>		//	recursive function
		//	==================
		var _recursive = function (_node)
		{
			//	increment index -- starts with 1
			//	===============
				_global__element_index++;</p>
<p>			//	vars
			//	====
				var 
					_explored = false,
					_tag_name = (_node.nodeType === 3 ? '#text' : ((_node.nodeType === 1 &#038;&#038; _node.tagName &#038;&#038; _node.tagName > '') ? _node.tagName.toLowerCase() : '#invalid')),
					_pos__start__before = 0,
					_pos__start__after = 0,
					_pos__end__before = 0,
					_pos__end__after = 0
				;</p>
<p>			//	fast return
			//	===========
				switch (true)
				{
					case ((_tag_name == '#invalid')):
					case (($R.parsingOptions._elements_ignore.indexOf('|'+_tag_name+'|') > -1)):
						return;</p>
<p>					case (_tag_name == '#text'):
						_global__the_html += _node.nodeValue
							.replace(/</gi, '&lt;')
							.replace(/>/gi, '&gt;')
						;
						return;
				}</p>
<p>			//	hidden
			//	======
				if ($R.parsingOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1)
					{ 	
	//	included inline
	//	_node, _tag_name must be defined
	//	will return, if node is hidden</p>
<p>	switch (true)
	{
		case (_node.offsetWidth > 0):
		case (_node.offsetHeight > 0):
			break;</p>
<p>		default:
			switch (true)
			{
				case (_node.offsetLeft > 0):
				case (_node.offsetTop > 0):
					break;</p>
<p>				default:
                    //  exclude inline DIVs -- which, stupidly, don't have a width/height
                    if ((_tag_name == 'div') &#038;&#038; ((_node.style.display || $.css( _node, "display" )) == 'inline'))
                        { break; }</p>
<p>                    //  it's hidden; exit current scope
					return;
			}
			break;
	}
 }</p>
<p>			//	clean -- before
			//	=====</p>
<p>	//	just a return will skip the whol element
	//	including children</p>
<p>	//	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)
				;</p>
<p>				if (_skip); else
				{
					//	default skip
					_skip = true;</p>
<p>					//	loop
					for (var i=0, _i=$R.keepStuffFromDomain__video.length; i<_i; i++)
						{ if (_src.indexOf($R.keepStuffFromDomain__video[i]) > -1) { _skip = false; break; } }
				}</p>
<p>				//	skip?
				if (_skip)
					{ $R.debugOutline(_node, 'clean-before', 'object-embed-iframe'); return; }</p>
<p>				break;
		}</p>
<p>	//	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) &#038;&#038; (_explored._length__plain_text < 65)):
					$R.debugOutline(_node, 'clean-before', 'skip-link');
					return;
			}
		}</p>
<p>	//	link density
	//	============
		if ($R.parsingOptions._elements_link_density.indexOf('|'+_tag_name+'|') > -1)
		{
			_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
			switch (true)
			{
                case (_explored._length__plain_text > (65 * 3 * 2)):
                case ($R.language == 'cjk' &#038;&#038; (_explored._length__plain_text > (65 * 3 * 1))):
				case (!(_explored._count__links > 1)):
				case (_global__exploreNodeToBuildHTMLFor &#038;&#038; (_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.5):
				case (_global__exploreNodeToBuildHTMLFor &#038;&#038; (_explored._count__plain_words / _global__exploreNodeToBuildHTMLFor._count__plain_words) > 0.5):
				case ((_explored._length__plain_text == 0) &#038;&#038; (_explored._count__links == 1) &#038;&#038; (_explored._length__links_text < 65)):
				case ((_explored._length__plain_text < 25) &#038;&#038; ((_explored._count__images_large + _explored._count__images_medium) > 0)):
					break;</p>
<p>				case ((_explored._length__links_text / _explored._length__all_text) < 0.5):
					if (_explored._count__links > 0); else { break; }
					if (_explored._count__links_skip > 0); else { break; }
					if (((_explored._count__links_skip / _explored._count__links) > 0.25) &#038;&#038; (_explored._length__links_text / _explored._length__all_text) < 0.05) { break; }</p>
<p>				default:
					$R.debugOutline(_node, 'clean-before', 'link-density');
					return;
			}
		}	</p>
<p>	//	floating
	//	========
		if ($R.parsingOptions._elements_floating.indexOf('|'+_tag_name+'|') > -1)
		{
			_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
			switch (true)
			{
				case (_explored._length__plain_text > (65 * 3 * 2)):
                case ($R.language == 'cjk' &#038;&#038; (_explored._length__plain_text > (65 * 3 * 1))):
				case (_global__exploreNodeToBuildHTMLFor &#038;&#038; (_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.25):
				case (_global__exploreNodeToBuildHTMLFor &#038;&#038; (_explored._count__plain_words / _global__exploreNodeToBuildHTMLFor._count__plain_words) > 0.25):
				case ((_explored._length__plain_text < 25) &#038;&#038; (_explored._length__links_text < 25) &#038;&#038; ((_explored._count__images_large + _explored._count__images_medium) > 0)):
				case (_node.getElementsByTagName &#038;&#038; (_explored._length__plain_text < (65 * 3 * 1)) &#038;&#038; ((_node.getElementsByTagName('h1').length + _node.getElementsByTagName('h2').length + _node.getElementsByTagName('h3').length + _node.getElementsByTagName('h4').length) > 0)):
                    break;</p>
<p>				default:
					var _float = $(_node).css('float');
					if (_float == 'left' || _float == 'right'); else { break; }
					if ((_explored._length__links_text == 0) &#038;&#038; ((_explored._count__images_large + _explored._count__images_medium) > 0)) { break; }</p>
<p>					$R.debugOutline(_node, 'clean-before', 'floating');
					return;
			}
		}</p>
<p>	//	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; }</p>
<p>            //  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; }
			}</p>
<p>            //  has too many links?
            //if (_node.getElementsByTagName &#038;&#038; _node.getElementsByTagName('a').length > 5)
            //    { $R.debugOutline(_node, 'clean-before', 'above-target'); return; }
		}</p>
<p>    //  headers that are images
    //  =======================
		if (_tag_name.match(/^h(1|2|3|4|5|6)$/gi))
		{
			_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
			switch (true)
			{
				case ((_explored._length__plain_text < 10) &#038;&#038; ((_explored._count__images_small + _explored._count__images_medium + _explored._count__images_large + _explored._count__images_skip) > 0)):
					$R.debugOutline(_node, 'clean-before', 'skip-heading');
					return;
			}
		}</p>
<p>			//	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;</p>
<p>					//	attributes
					//	==========</p>
<p>	//	allowed attributes
	//	==================
		if (_tag_name in $R.parsingOptions._elements_keep_attributes)
		{
			for (var i=0, _i=$R.parsingOptions._elements_keep_attributes[_tag_name].length; i<_i; i++)
			{
				var 
					_attribute_name = $R.parsingOptions._elements_keep_attributes[_tag_name][i],
					_attribute_value = _node.getAttribute(_attribute_name)
				;</p>
<p>				//	if present
				if (_attribute_value > '')
					{ _global__the_html += ' '+_attribute_name+'="'+(_attribute_value)+'"'; }
			}
		}</p>
<p>	//	keep ID for all elements
	//	========================
		var _id_attribute = _node.getAttribute('id');
		if (_id_attribute > '')
			{ _global__the_html += ' id="'+_id_attribute+'"'; }</p>
<p>	//	links target NEW
	//	================
		if (_tag_name == 'a')
			{ _global__the_html += ' target="_blank"'; }</p>
<p>					//	close start
					//	===========
						if ($R.parsingOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1) { _global__the_html += ' />'; }
						else { _global__the_html += '>';}</p>
<p>					/* mark */ _pos__start__after = _global__the_html.length;
				}</p>
<p>			//	child nodes
			//	===========
				if ($R.parsingOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1); else
				{
					for (var i=0, _i=_node.childNodes.length; i<_i; i++)
						{ _recursive(_node.childNodes[i]); }
				}</p>
<p>			//	end tag
			//	=======
				switch (true)
				{
					case (($R.parsingOptions._elements_ignore_tag.indexOf('|'+_tag_name+'|') > -1)):
						return;</p>
<p>					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;</p>
<p>					default:
						/* mark */ 	_pos__end__before = _global__the_html.length;
						/* end */ 	_global__the_html += '</'+_tag_name+'>';
						/* mark */ 	_pos__end__after = _global__the_html.length;
						break;
				}</p>
<p>			//	clean -- after
			//	=====</p>
<p>	//	we need to actually cut things out of 
	//	"_global__the_html", for stuff to not be there</p>
<p>	//	largeObject classes
	//	===================
		if (_tag_name == 'iframe' || _tag_name == 'embed' || _tag_name == 'object')
		{
			_global__the_html = ''
				+ _global__the_html.substr(0, _pos__start__before)
				+ '</p>
<div class="readableLargeObjectContainer">'
				+ 	_global__the_html.substr(_pos__start__before, (_pos__end__after - _pos__start__before))
				+ '</div>
<p>'
			;
			return;
		}</p>
<p>	//	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;</p>
<p>				case (_explored._is__image_large):</p>
<p>                    //  add float class -- for images too narrow/tall
                    //  remove width/height -- only for large images</p>
<p>                    //  http://www.wired.com/threatlevel/2011/05/gps-gallery/?pid=89&#038;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/</p>
<p>                    _global__the_html = ''
						+ _global__the_html.substr(0, _pos__start__before)
						+ '</p>
<div class="readableLargeImageContainer'
						+ 	(($(_node).width() <= 250) &#038;&#038; ($(_node).height() >= 250) ? ' float' : '')
						+ '">'
						+ 	_global__the_html.substr(_pos__start__before, (_pos__end__after - _pos__start__before)).replace(/width="([^=]+?)"/gi, '').replace(/height="([^=]+?)"/gi, '')
						+ '</div>
<p>'
					;
					return;
			}
		}</p>
<p>	//	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))
						+ '</a>'
					;
					return;</p>
<p>				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))
						+ '</a>'
					;
					return;
			}		
		}</p>
<p>	//	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' &#038;&#038; (_explored._length__all_text > (65 * 2))):
				case (_tag_name == 'h2' &#038;&#038; (_explored._length__all_text > (65 * 2 * 3))):
				case ((_tag_name.match(/^h(3|4|5|6)$/) != null) &#038;&#038; (_explored._length__all_text > (65 * 2 * 5))):
				case ((_tag_name.match(/^(b|i|em|strong)$/) != null) &#038;&#038; (_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;
			}
		}		</p>
<p>	//	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;</p>
<p>			default:
				var _contents = _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after));
					_contents = _contents.replace(/(<br \/>)/gi, '');
					_contents = _contents.replace(/(</p>
<hr \/>
<p>)/gi, '');</p>
<p>                    //  for rows, clear empty cells
                    if (_tag_name == 'tr')
                    {
                        _contents = _contents.replace(/
<td[^>]*?>/gi, '');
                        _contents = _contents.replace(/<\/td>/gi, '');
                    }</p>
<p>                    //  for tables, clear empty rows
                    if (_tag_name == 'table')
                    {
                        _contents = _contents.replace(/
<tr[^>]*?>/gi, '');
                        _contents = _contents.replace(/<\/tr>/gi, '');
                    }</p>
<p>				var _contentsLength = $R.measureText__getTextLength(_contents);</p>
<p>				switch (true)
				{
					case (_contentsLength == 0 &#038;&#038; _tag_name == 'p'):
						_global__the_html = _global__the_html.substr(0, _pos__start__before) + '</p>
<p>';
						return;</p>
<p>					case (_contentsLength == 0):
					case ((_contentsLength < 5) &#038;&#038; ($R.parsingOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1)):
						$R.debugOutline(_node, 'clean-after', 'blank');
						_global__the_html = _global__the_html.substr(0, _pos__start__before);
						return;
				}
				break;
		}</p>
<p>	//	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)
			;</p>
<p>			//	too much missing
			switch (true)
			{
				case (!(_contentsLength > 0)):
				case (!(_initialLength > 0)):
				case (!((_contentsLength / _initialLength) < 0.5)):
				case (!(($R.language == 'cjk') &#038;&#038; (_contentsLength / _initialLength) < 0.1)):
				case ((_global__exploreNodeToBuildHTMLFor &#038;&#038; ((_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.25))):
				case (($R.language == 'cjk') &#038;&#038; (_global__exploreNodeToBuildHTMLFor &#038;&#038; ((_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.1))):
					break;</p>
<p>				default:
					$R.debugOutline(_node, 'clean-after', 'missing-density');
					_global__the_html = _global__the_html.substr(0, _pos__start__before);
					return;
			}
		}</p>
<p>			//	return
				return;
		};</p>
<p>		//	actually do it
		_recursive(_nodeToBuildHTMLFor);</p>
<p>		//	return html
		return _global__the_html;
	};</p>
<p>    //  article title marker
    //  ====================
    $R.articleTitleMarker__start = '</p>
<div id="articleHeader">
<h1>';
    $R.articleTitleMarker__end = '</h1>
</div>
<p>';</p>
<p>    //  article title check function
    //  ============================
    $R.getContent__find__hasIsolatedTitleInHTML = function (_html)
    {
        return (_html.substr(0, $R.articleTitleMarker__start.length) == $R.articleTitleMarker__start);
    };</p>
<p>    //  article title get function
    //  ============================
    $R.getContent__find__getIsolatedTitleInHTML = function (_html)
    {
        //  is it there?
        if ($R.getContent__find__hasIsolatedTitleInHTML(_html)); else { return ''; }</p>
<p>        //  regex
        var 
            _getTitleRegex = new RegExp($R.articleTitleMarker__start + '(.*?)' + $R.articleTitleMarker__end, 'i'),
            _getTitleMatch = _html.match(_getTitleRegex)
        ;</p>
<p>        //  match?
        if (_getTitleMatch); else { return ''; }</p>
<p>        //  return
        return _getTitleMatch[1];
    };</p>
<p>    //  find title in arbitrary html
    //  ============================
    $R.getContent__find__isolateTitleInHTML = function (_html, _document_title)
    {
        //  can't just use (h1|h2|h3|etc) -- we want to try them in a certain order
        //  =============================
        var
            _heading_pregs = [
                /<(h1)[^>]*?>([\s\S]+?)<\/\1>/gi,
                /<(h2)[^>]*?>([\s\S]+?)<\/\1>/gi,
                /<(h3|h4|h5|h6)[^>]*?>([\s\S]+?)<\/\1>/gi
            ],
            _secondary_headings = '|h2|h3|h4|h5|h6|',
            _search_document_title = ' ' + _document_title.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ') + ' '
        ;</p>
<p>        //  loop pregs
        //  ==========
        for (var i=0, _i=_heading_pregs.length; i<_i; i++)
        {
            //  exec
            var _match = _heading_pregs[i].exec(_html);</p>
<p>            //  return?
            switch (true)
            {
                case (!(_match)):
                case (!(_heading_pregs[i].lastIndex > -1)):
                    //  will continue loop
                    break;</p>
<p>                default:</p>
<p>                    //  measurements
                    var
                        _heading_end_pos = _heading_pregs[i].lastIndex,
                        _heading_start_pos = (_heading_end_pos - _match[0].length),</p>
<p>                        _heading_type = _match[1],
                        _heading_text = _match[2].replace(/<\s*br[^>]*>/gi, '').replace(/[\n\r]+/gi, ''),
                        _heading_text_plain = _heading_text.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ');
                        _heading_length = $R.measureText__getTextLength(_heading_text_plain),
                        _heading_words = [],</p>
<p>                        _to_heading_text = _html.substr(0, _heading_start_pos),
                        _to_heading_length = $R.measureText__getTextLength(_to_heading_text.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' '))
                    ;</p>
<p>                    //  return?
                    switch (true)
                    {
                        case (!(_heading_length > 5)):
                        case (!(_heading_length < (65 * 3))):
                        case (!(_to_heading_length < (65 * 3 * 2))):
                            //  will continue for loop
                            break;</p>
<p>                        case ((_secondary_headings.indexOf('|' + _heading_type + '|') > -1)):
                            //  words in this heading
                            _heading_words = _heading_text_plain.split(' ');</p>
<p>                            //  count words present in title
                            for (var j=0, _j=_heading_words.length, _matched_words=''; j<_j; j++) {
                                if (_search_document_title.indexOf(' ' + _heading_words[j] + ' ') > -1) {
                                    _matched_words += _heading_words[j] + ' ';
                                }
                            }</p>
<p>                            //  break continues for loop
                            //  nothing goes to switch's default
                            //  ================================</p>
<p>                                //  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) &#038;&#038; (_search_document_title.indexOf(_heading_text_plain) > -1)):</p>
<p>                                    //  if it's slightly smaler, but is exactly at the begging or the end
                                    case ((_heading_length > 10) &#038;&#038; ((_search_document_title.indexOf(_heading_text_plain) == 1) || (_search_document_title.indexOf(_heading_text_plain) == (_search_document_title.length - 1 - _heading_text_plain.length)))):</p>
<p>                                        _no_break = true;
                                        break;
                                }</p>
<p>                                //  break?
                                var _break = false;
                                switch (true)
                                {
                                    //  no break?
                                    case (_no_break):
                                        break;</p>
<p>                                    // heading too long? -- if not h2
                                    case ((_heading_length > ((_search_document_title.length - 2) * 2)) &#038;&#038; (_heading_type != 'h2')):</p>
<p>                                    //  heading long enough?
                                    case ((_heading_length < Math.ceil((_search_document_title.length - 2) * 0.50))):</p>
<p>                                    //  enough words matched?
                                    case ((_heading_length < 25) &#038;&#038; (_matched_words.length < Math.ceil(_heading_length * 0.75))):
                                    case ((_heading_length < 50) &#038;&#038; (_matched_words.length < Math.ceil(_heading_length * 0.65))):
                                    case ((_matched_words.length < Math.ceil(_heading_length * 0.55))):</p>
<p>                                        _break = true;
                                        break;
                                }</p>
<p>                                //  break?
                                if (_break) { break; }</p>
<p>                        default:
                            //  this is the title -- do isolation; return
                            //  =================
                            return ''</p>
<p>                                + $R.articleTitleMarker__start
                                +   _heading_text 
                                + $R.articleTitleMarker__end</p>
<p>                                + _html.substr(_heading_end_pos)
                            ;
                    }</p>
<p>                    break;
            }
        }</p>
<p>        //  return unmodified
        return _html;
    };</p>
<p>	$R.getContent__find = function ()
	{
		//	get content
		//	===========
			var 
				_found = $R.getContent__findInPage($R.win),
				_targetNode = _found._targetCandidate.__node,
				_$targetNode = $(_targetNode),
                _aboveNodes = []
			;</p>
<p>		//	RTL
		//	===
			switch (true)
			{
				case (_$targetNode.attr('dir') == 'rtl'):
				case (_$targetNode.css('direction') == 'rtl'):
					$R.makeRTL();
					break;
			}</p>
<p>		//  get html
        //  ========
            var 
                _foundHTML = _found._html,
                _firstFragmentBefore = $R.getContent__nextPage__getFirstFragment(_foundHTML),
                _documentTitle = ($R.document.title > '' ? $R.document.title : '')
            ;</p>
<p>        //  get title
        //  =========</p>
<p>            //  has title already?
            _foundHTML = $R.getContent__find__isolateTitleInHTML(_foundHTML, _documentTitle);
            $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML);
            $R.debugPrint('TitleSource', 'target');</p>
<p>            //  get html above?
            if ($R.articleTitle > ''); else
            {</p>
<p>    //  get html above target?
    //  ======================</p>
<p>    //  global vars:
    //      _found
    //      _foundHTML
    //      _documentTitle
    //      _aboveNodes</p>
<p>    var 
        _prevNode = _found._targetCandidate.__node,
        _prevHTML = '',
        _aboveHTML = '',
        _differentTargets = (_found._firstCandidate.__node != _found._targetCandidate.__node)
    ;</p>
<p>    (function () 
    {</p>
<p>        while (true)
        {
            //  the end?
            switch (true)
            {
                case (_prevNode.tagName &#038;&#038; (_prevNode.tagName.toLowerCase() == 'body')):
                case (_differentTargets &#038;&#038; (_prevNode == _found._firstCandidate.__node)):
                    //  enough is enough
                    return;
            }</p>
<p>            //  up or sideways?
            if (_prevNode.previousSibling); else
            {
                _prevNode = _prevNode.parentNode;
                continue;
            }</p>
<p>            //	previous
            _prevNode = _prevNode.previousSibling;</p>
<p>            //	outline -- element might be re-outlined, when buildHTML is invoked
            if ($R.debug) { $R.debugOutline(_prevNode, 'target', 'add-above'); }</p>
<p>            //	get html; add
            _prevHTML = $R.getContent__buildHTMLForNode(_prevNode, 'above-the-target');
            _aboveHTML = _prevHTML + _aboveHTML;
            _aboveNodes.unshift(_prevNode);</p>
<p>            //  isolate title
            _aboveHTML = $R.getContent__find__isolateTitleInHTML(_aboveHTML, _documentTitle);</p>
<p>            //	finished?
            switch (true)
            {
                case ($R.measureText__getTextLength(_aboveHTML.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ')) > (65 * 3 * 3)):
                case ($R.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
                    return;
            }
        }</p>
<p>    })();</p>
<p>    //  is what we found any good?
    //  ==========================
    switch (true)
    {
        case ($R.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
        case (_differentTargets &#038;&#038; (_aboveHTML.split('<a ').length < 3) &#038;&#038; ($R.measureText__getTextLength(_aboveHTML.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ')) < (65 * 3))):
            _foundHTML = _aboveHTML + _foundHTML;
            break;</p>
<p>        default:
            _aboveHTML = '';
            _aboveNodes = [];
            break;
    }</p>
<p>                $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML);
                $R.debugPrint('TitleSource', 'above_HTML');</p>
<p>                //  get document title?
                if ($R.articleTitle > ''); else
                {</p>
<p>    //  if all else failed, get document title
    //  ======================================</p>
<p>    //  global vars:
    //      _foundHTML
    //      _documentTitle</p>
<p>    (function ()
    {
        //  return?
        //  =======
            if (_documentTitle > ''); else { return; }</p>
<p>        //  vars
            var
                _doc_title_parts = [],
                _doc_title_pregs =
                [
                    /( [-][-] |( [-] )|( [>][>] )|( [<][<] )|( [|] )|( [\/] ))/i,
                    /(([:] ))/i
                ]
            ;</p>
<p>        //	loop through pregs
        //  ==================
            for (var i=0, _i=_doc_title_pregs.length; i<_i; i++)
            {
                //	split
                _doc_title_parts = _documentTitle.split(_doc_title_pregs[i]);</p>
<p>                //	break if we managed a split
                if (_doc_title_parts.length > 1) { break; }
            }</p>
<p>        //	sort title parts -- longer goes higher up -- i.e. towards 0
        //	================
            _doc_title_parts.sort(function (a, b)
            {
                switch (true)
                {
                    case (a.length > b.length): return -1;
                    case (a.length < b.length): return 1;
                    default: return 0;
                }
            });</p>
<p>        //	set title -- first part, if more than one word; otherwise, whole
        //  =========
            _foundHTML = ''</p>
<p>                + $R.articleTitleMarker__start
                +   (_doc_title_parts[0].split(/\s+/i).length > 1 ? _doc_title_parts[0] : _documentTitle) 
                + $R.articleTitleMarker__end </p>
<p>                + _foundHTML
            ;</p>
<p>    })();
                    $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML);
                    $R.debugPrint('TitleSource', 'document_title');
                }
            }</p>
<p>		//	display
		//	=======
			$R.$pages.html('');
			$R.displayPageHTML(_foundHTML, 1, $R.win.location.href);</p>
<p>		//	remember
		//	========
			$R.debugRemember['theTarget'] = _found._targetCandidate.__node;
			$R.debugRemember['firstCandidate'] = _found._firstCandidate.__node;</p>
<p>		//	next
		//	====
            $R.nextPage__firstFragment__firstPage = _firstFragmentBefore;
            $R.nextPage__firstFragment__lastPage = $R.getContent__nextPage__getFirstFragment(_foundHTML);;</p>
<p>			$R.nextPage__loadedPages = [$R.win.location.href];
			$R.getContent__nextPage__find($R.win, _found._links);</p>
<p>		//	return
		return true;
	};</p>
<p>	$R.getContent__findInPage = function (_pageWindow)
	{
		//	calculations
		//	============</p>
<p>			var
				_firstCandidate = false,
				_secondCandidate = false,
				_targetCandidate = false
			;</p>
<p>			$R.debugTimerStart('ExploreAndGetStuff');
				var	_stuff = $R.getContent__exploreNodeAndGetStuff(_pageWindow.document.body);
			$R.debugPrint('ExploreAndGetStuff', $R.debugTimerEnd()+'ms');</p>
<p>			$R.debugTimerStart('ProcessFirst');
				var _processedCandidates = $R.getContent__processCandidates(_stuff._candidates);
				_firstCandidate = _processedCandidates[0];
				_targetCandidate = _firstCandidate;
			$R.debugPrint('ProcessFirst', $R.debugTimerEnd()+'ms');</p>
<p>            //  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);
                }</p>
<p>                //  highlight first
                $R.debugOutline(_firstCandidate.__node, 'target', 'first');
            }</p>
<p>            //  in case we stop
            $R.debugPrint('Target', 'first');</p>
<p>			//  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;</p>
<p>				default:</p>
<p>                    $R.debugTimerStart('ProcessSecond');
                        var _processedCandidatesSecond = $R.getContent__processCandidatesSecond(_processedCandidates);
                        _secondCandidate = _processedCandidatesSecond[0];
                    $R.debugPrint('ProcessSecond', $R.debugTimerEnd()+'ms');</p>
<p>                    //  they're the same
                    if (_firstCandidate.__node == _secondCandidate.__node) { break; }</p>
<p>                    //  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);
                        }</p>
<p>                        //  highlight second
                        $R.debugOutline(_secondCandidate.__node, 'target', 'second');
                    }</p>
<p>                    //  compute again
                    //  =============
                        _firstCandidate['__points_history_final'] = $R.getContent__computePointsForCandidateThird(_firstCandidate, _firstCandidate);
                        _firstCandidate['__points_final'] = _firstCandidate.__points_history_final[0];</p>
<p>                        _secondCandidate['__points_history_final'] = $R.getContent__computePointsForCandidateThird(_secondCandidate, _firstCandidate);
                        _secondCandidate['__points_final'] = _secondCandidate.__points_history_final[0];</p>
<p>                    //  log results
                    //  ===========
                        if ($R.debug)
                        {
                            $R.log('The 2 Candidates:');
                            $R.log(_firstCandidate);
                            $R.log(_secondCandidate);
                        }</p>
<p>                    //  are we selecting _second?
                    //  =========================
                        switch (true)
                        {
                            case ((_secondCandidate.__candidate_details._count__lines_of_65_characters < 20) &#038;&#038; (_secondCandidate.__points_final / _firstCandidate.__points_final) > 1):
                            case ((_secondCandidate.__candidate_details._count__lines_of_65_characters > 20) &#038;&#038; (_secondCandidate.__points_final / _firstCandidate.__points_final) > 0.9):
                            case ((_secondCandidate.__candidate_details._count__lines_of_65_characters > 50) &#038;&#038; (_secondCandidate.__points_final / _firstCandidate.__points_final) > 0.75):
                                _targetCandidate = _secondCandidate;
                                $R.debugPrint('Target', 'second');
                                break;
                        }</p>
<p>                    //  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));
                        }</p>
<p>					break;
			}</p>
<p>            //  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)'
                    });
                }</p>
<p>		//	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');</p>
<p>			$R.debugTimerStart('BuildHTMLPregs');
				_html = _html.replace(/<(blockquote|div|p|td|li)([^>]*)>(\s*<br \/>)+/gi, '<$1$2>');
				_html = _html.replace(/(<br \/>\s*)+<\/(blockquote|div|p|td|li)>/gi, '</$2>');
				_html = _html.replace(/(<br \/>\s*)+<(blockquote|div|h\d|ol|p|table|ul|li)([^>]*)>/gi, '<$2$3>');
				_html = _html.replace(/<\/(blockquote|div|h\d|ol|p|table|ul|li)>(\s*<br \/>)+/gi, '</$1>');
				_html = _html.replace(/(</p>
<hr \/>
<p>\s*</p>
<hr \/>
<p>\s*)+/gi, '</p>
<hr />
<p>');
				_html = _html.replace(/(<br \/>\s*<br \/>\s*)+/gi, '</p>
<p>');
			$R.debugPrint('BuildHTMLPregs', $R.debugTimerEnd()+'ms');</p>
<p>		//	return
		//	======
			return {
				'_html': _html,
				'_links': _stuff._links,
				'_targetCandidate': _targetCandidate,
				'_firstCandidate': _firstCandidate
			};
	};</p>
<p>    //  get first page fragment
    //  =======================</p>
<p>        $R.getContent__nextPage__getFirstFragment = function (_html)
        {
            //  remove all tags
            _html = _html.replace(/<[^>]+?>/gi, '');</p>
<p>            //  normalize spaces
            _html = _html.replace(/\s+/gi, ' ');</p>
<p>            //  return first 1000 characters
            return _html.substr(0, 2000);
        };</p>
<p>    //  get link parts
    //  ==============</p>
<p>        //  substr starting with the first slash after //
		$R.getURLPath = function (_url)
		{
			return _url.substr(_url.indexOf('/', (_url.indexOf('//') + 2)));
		};</p>
<p>        //  substr until the first slash after //
		$R.getURLDomain = function (_url)
		{
			return _url.substr(0, _url.indexOf('/', (_url.indexOf('//') + 2)))
		};</p>
<p>	//	find
	//	====
		$R.getContent__nextPage__find = function (_currentPageWindow, _linksInCurrentPage)
		{
			//	page id
				var _pageNr = ($R.nextPage__loadedPages.length + 1);</p>
<p>			//	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); }</p>
<p>				//	none
				if (_possible.length > 0); else
					{ if ($R.debug) { $R.log('no next link found'); } return; }</p>
<p>				if ($R.debug) { $R.log('possible next', _possible); }</p>
<p>			//	the one
			//	=======
				var _nextLink = false;</p>
<p>			//	next keyword?
			//	=============
				(function ()
				{
					if (_nextLink) { return; }</p>
<p>					for (var i=0, _i=_possible.length; i<_i; i++)
					{
						for (var j=0, _j=$R.nextPage__captionKeywords.length; j<_j; j++)
						{
							if (_possible[i]._caption.indexOf($R.nextPage__captionKeywords[j]) > -1)
							{
								//	length
								//	======
									if (_possible[i]._caption.length > $R.nextPage__captionKeywords[j].length * 2)
										{ continue; }</p>
<p>								//	not keywords
								//	============
									for (var z=0, _z=$R.nextPage__captionKeywords__not.length; z<_z; z++)
									{
										if (_possible[i]._caption.indexOf($R.nextPage__captionKeywords__not[z]) > -1)
											{ _nextLink = false; return; }
									}</p>
<p>								//	got it
								//	======
									_nextLink = _possible[i];
									return;
							}
						}
					}
				})();	</p>
<p>			//	caption matched page number
			//	===========================
				(function ()
				{
					if (_nextLink) { return; }</p>
<p>					for (var i=0, _i=_possible.length; i<_i; i++)
					{
						if (_possible[i]._caption == (''+_pageNr))
							{ _nextLink = _possible[i]; return; }
					}
				})();</p>
<p>			//	next keyword in title
			//	=====================
				(function ()
				{
					if (_nextLink) { return; }</p>
<p>					for (var i=0, _i=_possible.length; i<_i; i++)
					{
						//	sanity
						if (_possible[i]._title > ''); else { continue; }
						if ($R.measureText__getTextLength(_possible[i]._caption) <= 2); else { continue; }</p>
<p>						for (var j=0, _j=$R.nextPage__captionKeywords.length; j<_j; j++)
						{
							if (_possible[i]._title.indexOf($R.nextPage__captionKeywords[j]) > -1)
							{
								//	length
								//	======
									if (_possible[i]._title.length > $R.nextPage__captionKeywords[j].length * 2)
										{ continue; }</p>
<p>								//	not keywords
								//	============
									for (var z=0, _z=$R.nextPage__captionKeywords__not.length; z<_z; z++)
									{
										if (_possible[i]._title.indexOf($R.nextPage__captionKeywords__not[z]) > -1)
											{ _nextLink = false; return; }
									}</p>
<p>								//	got it
								//	======
									_nextLink = _possible[i];
									return;
							}
						}
					}
				})();</p>
<p>			//	return?
			//	=======
				if (_nextLink); else { return; }</p>
<p>			//	mark
			//	====
				$R.debugPrint('NextPage', 'true');</p>
<p>				if ($R.debug)
				{
					$R.debugOutline(_nextLink._node, 'target', 'next-page');
					$R.log('NextPage Link', _nextLink, _nextLink._node);
				}</p>
<p>			//	process page
			//	============
				$R.getContent__nextPage__loadToFrame(_pageNr, _nextLink._href);
				$R.nextPage__loadedPages.push(_nextLink._href);
		};</p>
<p>	//	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)
			;</p>
<p>			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(/\&#038;[^\&\s;]{1,10};/gi, '').replace(/\s+/gi, ' ').replace(/^ /, '').replace(/ $/, '').toLowerCase(),
						_distance = $R.levenshteinDistance(_mainPagePath, _path)
					;</p>
<p>					var _caption2 = '';
					for (var i=0, _i=_caption.length, _code=0; i<_i; i++)
					{
						_code = _caption.charCodeAt(i);
						_caption2 += (_code > 127 ? ('&#'+_code+';') : _caption.charAt(i));
					}
					_caption = _caption2;</p>
<p>					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;</p>
<p>						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; } }</p>
<p>							//	return
							return {
								'_node': _element.__node,
								'_href': _href,
								'_title': _title,
								'_caption': _caption,
								'_distance': _distance
							};
					}
				}
			);</p>
<p>			//	sort -- the less points, the closer to position 0
			//	====
				_links.sort(function (a, b)
				{
					switch (true)
					{
						case (a._distance < b._distance): return -1;
						case (a._distance > b._distance): return 1;
						default: return 0;
					}
				});</p>
<p>			//	return
				return _links;
		};</p>
<p>	//	load to frame
	//	=============
		$R.getContent__nextPage__loadToFrame = function (_pageNr, _nextPageURL)
		{
			//	do ajax
			//	=======
				$.ajax
				({
					'url' : _nextPageURL,</p>
<p>					'type' : 'GET',
					'dataType' : 'html',
					'async' : true,
					'timeout': (10 * 1000),</p>
<p>					//'headers': { 'Referrer': _nextPageURL },</p>
<p>					'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); }
				});
		};</p>
<p>	//	ajax calbacks
	//	=============
		$R.getContent__nextPage__ajaxError = function (_pageNr, _xhr, _textStatus, _error)
		{
		};</p>
<p>		$R.getContent__nextPage__ajaxComplete = function (_pageNr, _response, _textStatus, _xhr)
		{
			//	valid?
			//	======
				if (_response > ''); else { return; }</p>
<p>			//	script
			//	======
				var _script = ''
					+ '<script type="text/javascript">'
					+ ' function __this_page_loaded()'
					+ '	{'
					+ ' 	window.setTimeout('
					+ ' 		function () {'
                    +               ($R.component ? 'window.parent.' : 'window.parent.parent.')
                    +                   '$readable.getContent__nextPage__loadedInFrame("'+_pageNr+'", window); }, '
					+ ' 		250'
					+ ' 	);'
					+ ' } '</p>
<p>					+ ' if (document.readyState); else { __this_page_loaded(); } '</p>
<p>					+ ' function __this_page_loaded_ready(delayedNrTimes)'
					+ ' {'
					+ ' 	if (document.readyState != "complete" &#038;&#038; delayedNrTimes < 30)'
					+ '			{ setTimeout(function () { __this_page_loaded_ready(delayedNrTimes+1); }, 100); return; }'</p>
<p>					+ ' 	__this_page_loaded();'
					+ ' }'</p>
<p>					+ ' __this_page_loaded_ready(0);'
					+ '
// ]]&gt;</script>' ; // get html // ======== var _html = _response; // normalize // ========= _html = _html.replace(/&lt;\s+/gi, '&lt;'); _html = _html.replace(/\s+&gt;/gi, '&gt;'); _html = _html.replace(/\s+\/&gt;/gi, '/&gt;'); // remove // ====== _html = _html.replace(/&lt;script[^&gt;]*?&gt;([\s\S]*?)&lt;\/script&gt;/gi, ''); _html = _html.replace(/&lt;script[^&gt;]*?\/&gt;/gi, ''); _html = _html.replace(/&lt;noscript[^&gt;]*?&gt;([\s\S]*?)&lt;\/noscript&gt;/gi, ''); _html = _html.replace(/&lt;onload="*?"/gi, ''); // add load handler // ================ _html = _html.replace(/&lt;\/body/i, _script+'' ); // 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) &lt; 100): case ($R.levenshteinDistance(_firstFragment, $R.nextPage__firstFragment__lastPage) &lt; 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 &gt; '' ? $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 &gt; 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; }</p>
<p><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/*</p>
<p>http://www.JSON.org/json2.js</p>
<p>    2008-11-19</p>
<p>    Public Domain.</p>
<p>    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.</p>
<p>    See http://www.JSON.org/js.html</p>
<p>    This file creates a global JSON object containing two methods: stringify
    and parse.</p>
<p>        JSON.stringify(value, replacer, space)
            value       any JavaScript value, usually an object or array.</p>
<p>            replacer    an optional parameter that determines how object
                        values are stringified for objects. It can be a
                        function or an array of strings.</p>
<p>            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 '&nbsp;'),
                        it contains the characters used to indent at each level.</p>
<p>            This method produces a JSON text from a JavaScript value.</p>
<p>            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.</p>
<p>            For example, this would serialize Dates as ISO strings.</p>
<p>                Date.prototype.toJSON = function (key) {
                    function f(n) {
                        // Format integers to have at least two digits.
                        return n < 10 ? '0' + n : n;
                    }</p>
<p>                    return this.getUTCFullYear()   + '-' +
                         f(this.getUTCMonth() + 1) + '-' +
                         f(this.getUTCDate())      + 'T' +
                         f(this.getUTCHours())     + ':' +
                         f(this.getUTCMinutes())   + ':' +
                         f(this.getUTCSeconds())   + 'Z';
                };</p>
<p>            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.</p>
<p>            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.</p>
<p>            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.</p>
<p>            The optional space parameter produces a stringification of the
            value that is filled with line breaks and indentation to make it
            easier to read.</p>
<p>            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.</p>
<p>            Example:</p>
<p>            text = JSON.stringify(['e', {pluribus: 'unum'}]);
            // text is '["e",{"pluribus":"unum"}]'</p>
<p>            text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
            // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'</p>
<p>            text = JSON.stringify([new Date()], function (key, value) {
                return this[key] instanceof Date ?
                    'Date(' + this[key] + ')' : value;
            });
            // text is '["Date(---current time---)"]'</p>
<p>        JSON.parse(text, reviver)
            This method parses a JSON text to produce an object or array.
            It can throw a SyntaxError exception.</p>
<p>            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.</p>
<p>            Example:</p>
<p>            // Parse the text. Values that look like ISO date strings will
            // be converted to Date objects.</p>
<p>            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;
            });</p>
<p>            myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
                var d;
                if (typeof value === 'string' &#038;&#038;
                        value.slice(0, 5) === 'Date(' &#038;&#038;
                        value.slice(-1) === ')') {
                    d = new Date(value.slice(5, -1));
                    if (d) {
                        return d;
                    }
                }
                return value;
            });</p>
<p>    This is a reference implementation. You are free to copy, modify, or
    redistribute.</p>
<p>    This code should be minified before deployment.
    See http://javascript.crockford.com/jsmin.html</p>
<p>    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
    NOT CONTROL.
*/</p>
<p>/*jslint evil: true */</p>
<p>/*global JSON */</p>
<p>/*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
*/</p>
<p>// Create a JSON object only if one does not already exist. We create the
// methods in a closure to avoid creating global variables.</p>
<p>if (!this.JSON) {
    JSON = {};
}
(function () {</p>
<p>    function f(n) {
        // Format integers to have at least two digits.
        return n < 10 ? '0' + n : n;
    }</p>
<p>    if (typeof Date.prototype.toJSON !== 'function') {</p>
<p>        Date.prototype.toJSON = function (key) {</p>
<p>            return this.getUTCFullYear()   + '-' +
                 f(this.getUTCMonth() + 1) + '-' +
                 f(this.getUTCDate())      + 'T' +
                 f(this.getUTCHours())     + ':' +
                 f(this.getUTCMinutes())   + ':' +
                 f(this.getUTCSeconds())   + 'Z';
        };</p>
<p>        String.prototype.toJSON =
        Number.prototype.toJSON =
        Boolean.prototype.toJSON = function (key) {
            return this.valueOf();
        };
    }</p>
<p>    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;</p>
<p>    function quote(string) {</p>
<p>// 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.</p>
<p>        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 + '"';
    }</p>
<p>    function str(key, holder) {</p>
<p>// Produce a string from holder[key].</p>
<p>        var i,          // The loop counter.
            k,          // The member key.
            v,          // The member value.
            length,
            mind = gap,
            partial,
            value = holder[key];</p>
<p>// If the value has a toJSON method, call it to obtain a replacement value.</p>
<p>        if (value &#038;&#038; typeof value === 'object' &#038;&#038;
                typeof value.toJSON === 'function') {
            value = value.toJSON(key);
        }</p>
<p>// If we were called with a replacer function, then call the replacer to
// obtain a replacement value.</p>
<p>        if (typeof rep === 'function') {
            value = rep.call(holder, key, value);
        }</p>
<p>// What happens next depends on the value's type.</p>
<p>        switch (typeof value) {
        case 'string':
            return quote(value);</p>
<p>        case 'number':</p>
<p>// JSON numbers must be finite. Encode non-finite numbers as null.</p>
<p>            return isFinite(value) ? String(value) : 'null';</p>
<p>        case 'boolean':
        case 'null':</p>
<p>// 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.</p>
<p>            return String(value);</p>
<p>// If the type is 'object', we might be dealing with an object or an array or
// null.</p>
<p>        case 'object':</p>
<p>// Due to a specification blunder in ECMAScript, typeof null is 'object',
// so watch out for that case.</p>
<p>            if (!value) {
                return 'null';
            }</p>
<p>// Make an array to hold the partial results of stringifying this object value.</p>
<p>            gap += indent;
            partial = [];</p>
<p>// Is the value an array?</p>
<p>            if (Object.prototype.toString.apply(value) === '[object Array]') {</p>
<p>// The value is an array. Stringify every element. Use null as a placeholder
// for non-JSON values.</p>
<p>                length = value.length;
                for (i = 0; i < length; i += 1) {
                    partial[i] = str(i, value) || 'null';
                }</p>
<p>// Join all of the elements together, separated with commas, and wrap them in
// brackets.</p>
<p>                v = partial.length === 0 ? '[]' :
                    gap ? '[\n' + gap +
                            partial.join(',\n' + gap) + '\n' +
                                mind + ']' :
                          '[' + partial.join(',') + ']';
                gap = mind;
                return v;
            }</p>
<p>// If the replacer is an array, use it to select the members to be stringified.</p>
<p>            if (rep &#038;&#038; 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 {</p>
<p>// Otherwise, iterate through all of the keys in the object.</p>
<p>                for (k in value) {
                    if (Object.hasOwnProperty.call(value, k)) {
                        v = str(k, value);
                        if (v) {
                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
                        }
                    }
                }
            }</p>
<p>// Join all of the member texts together, separated with commas,
// and wrap them in braces.</p>
<p>            v = partial.length === 0 ? '{}' :
                gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
                        mind + '}' : '{' + partial.join(',') + '}';
            gap = mind;
            return v;
        }
    }</p>
<p>// If the JSON object does not yet have a stringify method, give it one.</p>
<p>    if (typeof JSON.stringify !== 'function') {
        JSON.stringify = function (value, replacer, space) {</p>
<p>// 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.</p>
<p>            var i;
            gap = '';
            indent = '';</p>
<p>// If the space parameter is a number, make an indent string containing that
// many spaces.</p>
<p>            if (typeof space === 'number') {
                for (i = 0; i < space; i += 1) {
                    indent += ' ';
                }</p>
<p>// If the space parameter is a string, it will be used as the indent string.</p>
<p>            } else if (typeof space === 'string') {
                indent = space;
            }</p>
<p>// If there is a replacer, it must be a function or an array.
// Otherwise, throw an error.</p>
<p>            rep = replacer;
            if (replacer &#038;&#038; typeof replacer !== 'function' &#038;&#038;
                    (typeof replacer !== 'object' ||
                     typeof replacer.length !== 'number')) {
                throw new Error('JSON.stringify');
            }</p>
<p>// Make a fake root object containing our value under the key of ''.
// Return the result of stringifying the value.</p>
<p>            return str('', {'': value});
        };
    }</p>
<p>// If the JSON object does not yet have a parse method, give it one.</p>
<p>    if (typeof JSON.parse !== 'function') {
        JSON.parse = function (text, reviver) {</p>
<p>// The parse method takes a text and an optional reviver function, and returns
// a JavaScript value if the text is a valid JSON text.
            var j;</p>
<p>            function walk(holder, key) {</p>
<p>// The walk method is used to recursively walk the resulting structure so
// that modifications can be made.</p>
<p>                var k, v, value = holder[key];
                if (value &#038;&#038; typeof value === 'object') {
                    for (k in value) {
                        if (Object.hasOwnProperty.call(value, k)) {
                            v = walk(value, k);
                            if (v !== undefined) {
                                value[k] = v;
                            } else {
                                delete value[k];
                            }
                        }
                    }
                }
                return reviver.call(holder, key, value);
            }</p>
<p>// Parsing happens in four stages. In the first stage, we replace certain
// Unicode characters with escape sequences. JavaScript handles many characters
// incorrectly, either silently deleting them, or treating them as line endings.</p>
<p>            cx.lastIndex = 0;
            if (cx.test(text)) {
                text = text.replace(cx, function (a) {
                    return '\\u' +
                        ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
                });
            }
// In the second stage, we run the text against regular expressions that look
// for non-JSON patterns. We are especially concerned with '()' and 'new'
// because they can cause invocation, and '=' because it can cause mutation.
// But just to be safe, we want to reject all unexpected forms.</p>
<p>// We split the second stage into 4 regexp operations in order to work around
// crippling inefficiencies in IE's and Safari's regexp engines. First we
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
// replace all simple value tokens with ']' characters. Third, we delete all
// open brackets that follow a colon or comma or that begin the text. Finally,
// we look to see that the remaining characters are only whitespace or ']' or
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
            if (/^[\],:{}\s]*$/.
test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {</p>
<p>// In the third stage we use the eval function to compile the text into a
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.
                j = eval('(' + text + ')');</p>
<p>// In the optional fourth stage, we recursively walk the new structure, passing
// each name/value pair to a reviver function for possible transformation.
                return typeof reviver === 'function' ?
                    walk({'': j}, '') : j;
            }</p>
<p>// If the text is not JSON parseable, then a SyntaxError is thrown.
            throw new SyntaxError('JSON.parse');
        };
    }
})();
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/*mousewheel*/
(function(a){function d(b){var c=b||window.event,d=[].slice.call(arguments,1),e=0,f=!0,g=0,h=0;return b=a.event.fix(c),b.type="mousewheel",c.wheelDelta&#038;&#038;(e=c.wheelDelta/120),c.detail&#038;&#038;(e=-c.detail/3),h=e,c.axis!==undefined&#038;&#038;c.axis===c.HORIZONTAL_AXIS&#038;&#038;(h=0,g=-1*e),c.wheelDeltaY!==undefined&#038;&#038;(h=c.wheelDeltaY/120),c.wheelDeltaX!==undefined&#038;&#038;(g=-1*c.wheelDeltaX/120),d.unshift(b,e,g,h),(a.event.dispatch||a.event.handle).apply(this,d)}var b=["DOMMouseScroll","mousewheel"];if(a.event.fixHooks)for(var c=b.length;c;)a.event.fixHooks[b[--c]]=a.event.mouseHooks;a.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var a=b.length;a;)this.addEventListener(b[--a],d,!1);else this.onmousewheel=d},teardown:function(){if(this.removeEventListener)for(var a=b.length;a;)this.removeEventListener(b[--a],d,!1);else this.onmousewheel=null}},a.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})})(jQuery);
/*custom scrollbar*/
(function(c){var b={init:function(e){var f={set_width:false,set_height:false,horizontalScroll:false,scrollInertia:950,mouseWheel:true,mouseWheelPixels:"auto",autoDraggerLength:true,autoHideScrollbar:false,alwaysShowScrollbar:false,snapAmount:null,snapOffset:0,scrollButtons:{enable:false,scrollType:"continuous",scrollSpeed:"auto",scrollAmount:40},advanced:{updateOnBrowserResize:true,updateOnContentResize:false,autoExpandHorizontalScroll:false,autoScrollOnFocus:true,normalizeMouseWheelDelta:false},contentTouchScroll:true,callbacks:{onScrollStart:function(){},onScroll:function(){},onTotalScroll:function(){},onTotalScrollBack:function(){},onTotalScrollOffset:0,onTotalScrollBackOffset:0,whileScrolling:function(){}},theme:"light"},e=c.extend(true,f,e);return this.each(function(){var m=c(this);if(e.set_width){m.css("width",e.set_width)}if(e.set_height){m.css("height",e.set_height)}if(!c(document).data("mCustomScrollbar-index")){c(document).data("mCustomScrollbar-index","1")}else{var t=parseInt(c(document).data("mCustomScrollbar-index"));c(document).data("mCustomScrollbar-index",t+1)}m.wrapInner("</p>
<div class='mCustomScrollBox mCS-"+e.theme+"' id='mCSB_"+c(document).data("mCustomScrollbar-index")+"' style='position:relative; height:100%; overflow:hidden; max-width:100%;' />").addClass("mCustomScrollbar _mCS_"+c(document).data("mCustomScrollbar-index"));var g=m.children(".mCustomScrollBox");if(e.horizontalScroll){g.addClass("mCSB_horizontal").wrapInner("</p>
<div class='mCSB_h_wrapper' style='position:relative; left:0; width:999999px;' />");var k=g.children(".mCSB_h_wrapper");k.wrapInner("</p>
<div class='mCSB_container' style='position:absolute; left:0;' />").children(".mCSB_container").css({width:k.children().outerWidth(),position:"relative"}).unwrap()}else{g.wrapInner("</p>
<div class='mCSB_container' style='position:relative; top:0;' />")}var o=g.children(".mCSB_container");if(c.support.touch){o.addClass("mCS_touch")}o.after("</p>
<div class='mCSB_scrollTools' style='position:absolute;'>
<div class='mCSB_draggerContainer'>
<div class='mCSB_dragger' style='position:absolute;' oncontextmenu='return false;'>
<div class='mCSB_dragger_bar' style='position:relative;'></div>
</div>
<div class='mCSB_draggerRail'></div>
</div>
</div>
<p>");var l=g.children(".mCSB_scrollTools"),h=l.children(".mCSB_draggerContainer"),q=h.children(".mCSB_dragger");if(e.horizontalScroll){q.data("minDraggerWidth",q.width())}else{q.data("minDraggerHeight",q.height())}if(e.scrollButtons.enable){if(e.horizontalScroll){l.prepend("<a class='mCSB_buttonLeft' oncontextmenu='return false;'></a>").append("<a class='mCSB_buttonRight' oncontextmenu='return false;'></a>")}else{l.prepend("<a class='mCSB_buttonUp' oncontextmenu='return false;'></a>").append("<a class='mCSB_buttonDown' oncontextmenu='return false;'></a>")}}g.bind("scroll",function(){if(!m.is(".mCS_disabled")){g.scrollTop(0).scrollLeft(0)}});m.data({mCS_Init:true,mCustomScrollbarIndex:c(document).data("mCustomScrollbar-index"),horizontalScroll:e.horizontalScroll,scrollInertia:e.scrollInertia,scrollEasing:"mcsEaseOut",mouseWheel:e.mouseWheel,mouseWheelPixels:e.mouseWheelPixels,autoDraggerLength:e.autoDraggerLength,autoHideScrollbar:e.autoHideScrollbar,alwaysShowScrollbar:e.alwaysShowScrollbar,snapAmount:e.snapAmount,snapOffset:e.snapOffset,scrollButtons_enable:e.scrollButtons.enable,scrollButtons_scrollType:e.scrollButtons.scrollType,scrollButtons_scrollSpeed:e.scrollButtons.scrollSpeed,scrollButtons_scrollAmount:e.scrollButtons.scrollAmount,autoExpandHorizontalScroll:e.advanced.autoExpandHorizontalScroll,autoScrollOnFocus:e.advanced.autoScrollOnFocus,normalizeMouseWheelDelta:e.advanced.normalizeMouseWheelDelta,contentTouchScroll:e.contentTouchScroll,onScrollStart_Callback:e.callbacks.onScrollStart,onScroll_Callback:e.callbacks.onScroll,onTotalScroll_Callback:e.callbacks.onTotalScroll,onTotalScrollBack_Callback:e.callbacks.onTotalScrollBack,onTotalScroll_Offset:e.callbacks.onTotalScrollOffset,onTotalScrollBack_Offset:e.callbacks.onTotalScrollBackOffset,whileScrolling_Callback:e.callbacks.whileScrolling,bindEvent_scrollbar_drag:false,bindEvent_content_touch:false,bindEvent_scrollbar_click:false,bindEvent_mousewheel:false,bindEvent_buttonsContinuous_y:false,bindEvent_buttonsContinuous_x:false,bindEvent_buttonsPixels_y:false,bindEvent_buttonsPixels_x:false,bindEvent_focusin:false,bindEvent_autoHideScrollbar:false,mCSB_buttonScrollRight:false,mCSB_buttonScrollLeft:false,mCSB_buttonScrollDown:false,mCSB_buttonScrollUp:false});if(e.horizontalScroll){if(m.css("max-width")!=="none"){if(!e.advanced.updateOnContentResize){e.advanced.updateOnContentResize=true}}}else{if(m.css("max-height")!=="none"){var s=false,r=parseInt(m.css("max-height"));if(m.css("max-height").indexOf("%")>=0){s=r,r=m.parent().height()*s/100}m.css("overflow","hidden");g.css("max-height",r)}}m.mCustomScrollbar("update");if(e.advanced.updateOnBrowserResize){var i,j=c(window).width(),u=c(window).height();c(window).bind("resize."+m.data("mCustomScrollbarIndex"),function(){if(i){clearTimeout(i)}i=setTimeout(function(){if(!m.is(".mCS_disabled")&#038;&#038;!m.is(".mCS_destroyed")){var w=c(window).width(),v=c(window).height();if(j!==w||u!==v){if(m.css("max-height")!=="none"&#038;&#038;s){g.css("max-height",m.parent().height()*s/100)}m.mCustomScrollbar("update");j=w;u=v}}},150)})}if(e.advanced.updateOnContentResize){var p;if(e.horizontalScroll){var n=o.outerWidth()}else{var n=o.outerHeight()}p=setInterval(function(){if(e.horizontalScroll){if(e.advanced.autoExpandHorizontalScroll){o.css({position:"absolute",width:"auto"}).wrap("</p>
<div class='mCSB_h_wrapper' style='position:relative; left:0; width:999999px;' />").css({width:o.outerWidth(),position:"relative"}).unwrap()}var v=o.outerWidth()}else{var v=o.outerHeight()}if(v!=n){m.mCustomScrollbar("update");n=v}},300)}})},update:function(){var n=c(this),k=n.children(".mCustomScrollBox"),q=k.children(".mCSB_container");q.removeClass("mCS_no_scrollbar");n.removeClass("mCS_disabled mCS_destroyed");k.scrollTop(0).scrollLeft(0);var y=k.children(".mCSB_scrollTools"),o=y.children(".mCSB_draggerContainer"),m=o.children(".mCSB_dragger");if(n.data("horizontalScroll")){var A=y.children(".mCSB_buttonLeft"),t=y.children(".mCSB_buttonRight"),f=k.width();if(n.data("autoExpandHorizontalScroll")){q.css({position:"absolute",width:"auto"}).wrap("</p>
<div class='mCSB_h_wrapper' style='position:relative; left:0; width:999999px;' />").css({width:q.outerWidth(),position:"relative"}).unwrap()}var z=q.outerWidth()}else{var w=y.children(".mCSB_buttonUp"),g=y.children(".mCSB_buttonDown"),r=k.height(),i=q.outerHeight()}if(i>r&#038;&#038;!n.data("horizontalScroll")){y.css("display","block");var s=o.height();if(n.data("autoDraggerLength")){var u=Math.round(r/i*s),l=m.data("minDraggerHeight");if(u<=l){m.css({height:l})}else{if(u>=s-10){var p=s-10;m.css({height:p})}else{m.css({height:u})}}m.children(".mCSB_dragger_bar").css({"line-height":m.height()+"px"})}var B=m.height(),x=(i-r)/(s-B);n.data("scrollAmount",x).mCustomScrollbar("scrolling",k,q,o,m,w,g,A,t);var D=Math.abs(q.position().top);n.mCustomScrollbar("scrollTo",D,{scrollInertia:0,trigger:"internal"})}else{if(z>f&#038;&#038;n.data("horizontalScroll")){y.css("display","block");var h=o.width();if(n.data("autoDraggerLength")){var j=Math.round(f/z*h),C=m.data("minDraggerWidth");if(j<=C){m.css({width:C})}else{if(j>=h-10){var e=h-10;m.css({width:e})}else{m.css({width:j})}}}var v=m.width(),x=(z-f)/(h-v);n.data("scrollAmount",x).mCustomScrollbar("scrolling",k,q,o,m,w,g,A,t);var D=Math.abs(q.position().left);n.mCustomScrollbar("scrollTo",D,{scrollInertia:0,trigger:"internal"})}else{k.unbind("mousewheel focusin");if(n.data("horizontalScroll")){m.add(q).css("left",0)}else{m.add(q).css("top",0)}if(n.data("alwaysShowScrollbar")){if(!n.data("horizontalScroll")){m.css({height:o.height()})}else{if(n.data("horizontalScroll")){m.css({width:o.width()})}}}else{y.css("display","none");q.addClass("mCS_no_scrollbar")}n.data({bindEvent_mousewheel:false,bindEvent_focusin:false})}}},scrolling:function(i,q,n,k,A,f,D,w){var l=c(this);if(!l.data("bindEvent_scrollbar_drag")){var o,p,C,z,e;if(c.support.pointer){C="pointerdown";z="pointermove";e="pointerup"}else{if(c.support.msPointer){C="MSPointerDown";z="MSPointerMove";e="MSPointerUp"}}if(c.support.pointer||c.support.msPointer){k.bind(C,function(K){K.preventDefault();l.data({on_drag:true});k.addClass("mCSB_dragger_onDrag");var J=c(this),M=J.offset(),I=K.originalEvent.pageX-M.left,L=K.originalEvent.pageY-M.top;if(I<J.width()&#038;&#038;I>0&#038;&#038;L<J.height()&#038;&#038;L>0){o=L;p=I}});c(document).bind(z+"."+l.data("mCustomScrollbarIndex"),function(K){K.preventDefault();if(l.data("on_drag")){var J=k,M=J.offset(),I=K.originalEvent.pageX-M.left,L=K.originalEvent.pageY-M.top;G(o,p,L,I)}}).bind(e+"."+l.data("mCustomScrollbarIndex"),function(x){l.data({on_drag:false});k.removeClass("mCSB_dragger_onDrag")})}else{k.bind("mousedown touchstart",function(K){K.preventDefault();K.stopImmediatePropagation();var J=c(this),N=J.offset(),I,M;if(K.type==="touchstart"){var L=K.originalEvent.touches[0]||K.originalEvent.changedTouches[0];I=L.pageX-N.left;M=L.pageY-N.top}else{l.data({on_drag:true});k.addClass("mCSB_dragger_onDrag");I=K.pageX-N.left;M=K.pageY-N.top}if(I<J.width()&#038;&#038;I>0&#038;&#038;M<J.height()&#038;&#038;M>0){o=M;p=I}}).bind("touchmove",function(K){K.preventDefault();K.stopImmediatePropagation();var N=K.originalEvent.touches[0]||K.originalEvent.changedTouches[0],J=c(this),M=J.offset(),I=N.pageX-M.left,L=N.pageY-M.top;G(o,p,L,I)});c(document).bind("mousemove."+l.data("mCustomScrollbarIndex"),function(K){if(l.data("on_drag")){var J=k,M=J.offset(),I=K.pageX-M.left,L=K.pageY-M.top;G(o,p,L,I)}}).bind("mouseup."+l.data("mCustomScrollbarIndex"),function(x){l.data({on_drag:false});k.removeClass("mCSB_dragger_onDrag")})}l.data({bindEvent_scrollbar_drag:true})}function G(J,K,L,I){if(l.data("horizontalScroll")){l.mCustomScrollbar("scrollTo",(k.position().left-(K))+I,{moveDragger:true,trigger:"internal"})}else{l.mCustomScrollbar("scrollTo",(k.position().top-(J))+L,{moveDragger:true,trigger:"internal"})}}if(c.support.touch&#038;&#038;l.data("contentTouchScroll")){if(!l.data("bindEvent_content_touch")){var m,E,s,t,v,F,H;q.bind("touchstart",function(x){x.stopImmediatePropagation();m=x.originalEvent.touches[0]||x.originalEvent.changedTouches[0];E=c(this);s=E.offset();v=m.pageX-s.left;t=m.pageY-s.top;F=t;H=v});q.bind("touchmove",function(x){x.preventDefault();x.stopImmediatePropagation();m=x.originalEvent.touches[0]||x.originalEvent.changedTouches[0];E=c(this).parent();s=E.offset();v=m.pageX-s.left;t=m.pageY-s.top;if(l.data("horizontalScroll")){l.mCustomScrollbar("scrollTo",H-v,{trigger:"internal"})}else{l.mCustomScrollbar("scrollTo",F-t,{trigger:"internal"})}})}}if(!l.data("bindEvent_scrollbar_click")){n.bind("click",function(I){var x=(I.pageY-n.offset().top)*l.data("scrollAmount"),y=c(I.target);if(l.data("horizontalScroll")){x=(I.pageX-n.offset().left)*l.data("scrollAmount")}if(y.hasClass("mCSB_draggerContainer")||y.hasClass("mCSB_draggerRail")){l.mCustomScrollbar("scrollTo",x,{trigger:"internal",scrollEasing:"draggerRailEase"})}});l.data({bindEvent_scrollbar_click:true})}if(l.data("mouseWheel")){if(!l.data("bindEvent_mousewheel")){i.bind("mousewheel",function(K,M){var J,I=l.data("mouseWheelPixels"),x=Math.abs(q.position().top),L=k.position().top,y=n.height()-k.height();if(l.data("normalizeMouseWheelDelta")){if(M<0){M=-1}else{M=1}}if(I==="auto"){I=100+Math.round(l.data("scrollAmount")/2)}if(l.data("horizontalScroll")){L=k.position().left;y=n.width()-k.width();x=Math.abs(q.position().left)}if((M>0&#038;&#038;L!==0)||(M<0&#038;&#038;L!==y)){K.preventDefault();K.stopImmediatePropagation()}J=x-(M*I);l.mCustomScrollbar("scrollTo",J,{trigger:"internal"})});l.data({bindEvent_mousewheel:true})}}if(l.data("scrollButtons_enable")){if(l.data("scrollButtons_scrollType")==="pixels"){if(l.data("horizontalScroll")){w.add(D).unbind("mousedown touchstart MSPointerDown pointerdown mouseup MSPointerUp pointerup mouseout MSPointerOut pointerout touchend",j,h);l.data({bindEvent_buttonsContinuous_x:false});if(!l.data("bindEvent_buttonsPixels_x")){w.bind("click",function(x){x.preventDefault();r(Math.abs(q.position().left)+l.data("scrollButtons_scrollAmount"))});D.bind("click",function(x){x.preventDefault();r(Math.abs(q.position().left)-l.data("scrollButtons_scrollAmount"))});l.data({bindEvent_buttonsPixels_x:true})}}else{f.add(A).unbind("mousedown touchstart MSPointerDown pointerdown mouseup MSPointerUp pointerup mouseout MSPointerOut pointerout touchend",j,h);l.data({bindEvent_buttonsContinuous_y:false});if(!l.data("bindEvent_buttonsPixels_y")){f.bind("click",function(x){x.preventDefault();r(Math.abs(q.position().top)+l.data("scrollButtons_scrollAmount"))});A.bind("click",function(x){x.preventDefault();r(Math.abs(q.position().top)-l.data("scrollButtons_scrollAmount"))});l.data({bindEvent_buttonsPixels_y:true})}}function r(x){if(!k.data("preventAction")){k.data("preventAction",true);l.mCustomScrollbar("scrollTo",x,{trigger:"internal"})}}}else{if(l.data("horizontalScroll")){w.add(D).unbind("click");l.data({bindEvent_buttonsPixels_x:false});if(!l.data("bindEvent_buttonsContinuous_x")){w.bind("mousedown touchstart MSPointerDown pointerdown",function(y){y.preventDefault();var x=B();l.data({mCSB_buttonScrollRight:setInterval(function(){l.mCustomScrollbar("scrollTo",Math.abs(q.position().left)+x,{trigger:"internal",scrollEasing:"easeOutCirc"})},17)})});var j=function(x){x.preventDefault();clearInterval(l.data("mCSB_buttonScrollRight"))};w.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout",j);D.bind("mousedown touchstart MSPointerDown pointerdown",function(y){y.preventDefault();var x=B();l.data({mCSB_buttonScrollLeft:setInterval(function(){l.mCustomScrollbar("scrollTo",Math.abs(q.position().left)-x,{trigger:"internal",scrollEasing:"easeOutCirc"})},17)})});var h=function(x){x.preventDefault();clearInterval(l.data("mCSB_buttonScrollLeft"))};D.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout",h);l.data({bindEvent_buttonsContinuous_x:true})}}else{f.add(A).unbind("click");l.data({bindEvent_buttonsPixels_y:false});if(!l.data("bindEvent_buttonsContinuous_y")){f.bind("mousedown touchstart MSPointerDown pointerdown",function(y){y.preventDefault();var x=B();l.data({mCSB_buttonScrollDown:setInterval(function(){l.mCustomScrollbar("scrollTo",Math.abs(q.position().top)+x,{trigger:"internal",scrollEasing:"easeOutCirc"})},17)})});var u=function(x){x.preventDefault();clearInterval(l.data("mCSB_buttonScrollDown"))};f.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout",u);A.bind("mousedown touchstart MSPointerDown pointerdown",function(y){y.preventDefault();var x=B();l.data({mCSB_buttonScrollUp:setInterval(function(){l.mCustomScrollbar("scrollTo",Math.abs(q.position().top)-x,{trigger:"internal",scrollEasing:"easeOutCirc"})},17)})});var g=function(x){x.preventDefault();clearInterval(l.data("mCSB_buttonScrollUp"))};A.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout",g);l.data({bindEvent_buttonsContinuous_y:true})}}function B(){var x=l.data("scrollButtons_scrollSpeed");if(l.data("scrollButtons_scrollSpeed")==="auto"){x=Math.round((l.data("scrollInertia")+100)/40)}return x}}}if(l.data("autoScrollOnFocus")){if(!l.data("bindEvent_focusin")){i.bind("focusin",function(){i.scrollTop(0).scrollLeft(0);var x=c(document.activeElement);if(x.is("input,textarea,select,button,a[tabindex],area,object")){var J=q.position().top,y=x.position().top,I=i.height()-x.outerHeight();if(l.data("horizontalScroll")){J=q.position().left;y=x.position().left;I=i.width()-x.outerWidth()}if(J+y<0||J+y>I){l.mCustomScrollbar("scrollTo",y,{trigger:"internal"})}}});l.data({bindEvent_focusin:true})}}if(l.data("autoHideScrollbar")&#038;&#038;!l.data("alwaysShowScrollbar")){if(!l.data("bindEvent_autoHideScrollbar")){i.bind("mouseenter",function(x){i.addClass("mCS-mouse-over");d.showScrollbar.call(i.children(".mCSB_scrollTools"))}).bind("mouseleave touchend",function(x){i.removeClass("mCS-mouse-over");if(x.type==="mouseleave"){d.hideScrollbar.call(i.children(".mCSB_scrollTools"))}});l.data({bindEvent_autoHideScrollbar:true})}}},scrollTo:function(e,f){var i=c(this),o={moveDragger:false,trigger:"external",callbacks:true,scrollInertia:i.data("scrollInertia"),scrollEasing:i.data("scrollEasing")},f=c.extend(o,f),p,g=i.children(".mCustomScrollBox"),k=g.children(".mCSB_container"),r=g.children(".mCSB_scrollTools"),j=r.children(".mCSB_draggerContainer"),h=j.children(".mCSB_dragger"),t=draggerSpeed=f.scrollInertia,q,s,m,l;if(!k.hasClass("mCS_no_scrollbar")){i.data({mCS_trigger:f.trigger});if(i.data("mCS_Init")){f.callbacks=false}if(e||e===0){if(typeof(e)==="number"){if(f.moveDragger){p=e;if(i.data("horizontalScroll")){e=h.position().left*i.data("scrollAmount")}else{e=h.position().top*i.data("scrollAmount")}draggerSpeed=0}else{p=e/i.data("scrollAmount")}}else{if(typeof(e)==="string"){var v;if(e==="top"){v=0}else{if(e==="bottom"&#038;&#038;!i.data("horizontalScroll")){v=k.outerHeight()-g.height()}else{if(e==="left"){v=0}else{if(e==="right"&#038;&#038;i.data("horizontalScroll")){v=k.outerWidth()-g.width()}else{if(e==="first"){v=i.find(".mCSB_container").find(":first")}else{if(e==="last"){v=i.find(".mCSB_container").find(":last")}else{v=i.find(e)}}}}}}if(v.length===1){if(i.data("horizontalScroll")){e=v.position().left}else{e=v.position().top}p=e/i.data("scrollAmount")}else{p=e=v}}}if(i.data("horizontalScroll")){if(i.data("onTotalScrollBack_Offset")){s=-i.data("onTotalScrollBack_Offset")}if(i.data("onTotalScroll_Offset")){l=g.width()-k.outerWidth()+i.data("onTotalScroll_Offset")}if(p<0){p=e=0;clearInterval(i.data("mCSB_buttonScrollLeft"));if(!s){q=true}}else{if(p>=j.width()-h.width()){p=j.width()-h.width();e=g.width()-k.outerWidth();clearInterval(i.data("mCSB_buttonScrollRight"));if(!l){m=true}}else{e=-e}}var n=i.data("snapAmount");if(n){e=Math.round(e/n)*n-i.data("snapOffset")}d.mTweenAxis.call(this,h[0],"left",Math.round(p),draggerSpeed,f.scrollEasing);d.mTweenAxis.call(this,k[0],"left",Math.round(e),t,f.scrollEasing,{onStart:function(){if(f.callbacks&#038;&#038;!i.data("mCS_tweenRunning")){u("onScrollStart")}if(i.data("autoHideScrollbar")&#038;&#038;!i.data("alwaysShowScrollbar")){d.showScrollbar.call(r)}},onUpdate:function(){if(f.callbacks){u("whileScrolling")}},onComplete:function(){if(f.callbacks){u("onScroll");if(q||(s&#038;&#038;k.position().left>=s)){u("onTotalScrollBack")}if(m||(l&#038;&#038;k.position().left<=l)){u("onTotalScroll")}}h.data("preventAction",false);i.data("mCS_tweenRunning",false);if(i.data("autoHideScrollbar")&#038;&#038;!i.data("alwaysShowScrollbar")){if(!g.hasClass("mCS-mouse-over")){d.hideScrollbar.call(r)}}}})}else{if(i.data("onTotalScrollBack_Offset")){s=-i.data("onTotalScrollBack_Offset")}if(i.data("onTotalScroll_Offset")){l=g.height()-k.outerHeight()+i.data("onTotalScroll_Offset")}if(p<0){p=e=0;clearInterval(i.data("mCSB_buttonScrollUp"));if(!s){q=true}}else{if(p>=j.height()-h.height()){p=j.height()-h.height();e=g.height()-k.outerHeight();clearInterval(i.data("mCSB_buttonScrollDown"));if(!l){m=true}}else{e=-e}}var n=i.data("snapAmount");if(n){e=Math.round(e/n)*n-i.data("snapOffset")}d.mTweenAxis.call(this,h[0],"top",Math.round(p),draggerSpeed,f.scrollEasing);d.mTweenAxis.call(this,k[0],"top",Math.round(e),t,f.scrollEasing,{onStart:function(){if(f.callbacks&#038;&#038;!i.data("mCS_tweenRunning")){u("onScrollStart")}if(i.data("autoHideScrollbar")&#038;&#038;!i.data("alwaysShowScrollbar")){d.showScrollbar.call(r)}},onUpdate:function(){if(f.callbacks){u("whileScrolling")}},onComplete:function(){if(f.callbacks){u("onScroll");if(q||(s&#038;&#038;k.position().top>=s)){u("onTotalScrollBack")}if(m||(l&#038;&#038;k.position().top<=l)){u("onTotalScroll")}}h.data("preventAction",false);i.data("mCS_tweenRunning",false);if(i.data("autoHideScrollbar")&#038;&#038;!i.data("alwaysShowScrollbar")){if(!g.hasClass("mCS-mouse-over")){d.hideScrollbar.call(r)}}}})}if(i.data("mCS_Init")){i.data({mCS_Init:false})}}}function u(w){if(i.data("mCustomScrollbarIndex")){this.mcs={top:k.position().top,left:k.position().left,draggerTop:h.position().top,draggerLeft:h.position().left,topPct:Math.round((100*Math.abs(k.position().top))/Math.abs(k.outerHeight()-g.height())),leftPct:Math.round((100*Math.abs(k.position().left))/Math.abs(k.outerWidth()-g.width()))};switch(w){case"onScrollStart":i.data("mCS_tweenRunning",true).data("onScrollStart_Callback").call(i,this.mcs);break;case"whileScrolling":i.data("whileScrolling_Callback").call(i,this.mcs);break;case"onScroll":i.data("onScroll_Callback").call(i,this.mcs);break;case"onTotalScrollBack":i.data("onTotalScrollBack_Callback").call(i,this.mcs);break;case"onTotalScroll":i.data("onTotalScroll_Callback").call(i,this.mcs);break}}}},stop:function(){var g=c(this),e=g.children().children(".mCSB_container"),f=g.children().children().children().children(".mCSB_dragger");d.mTweenAxisStop.call(this,e[0]);d.mTweenAxisStop.call(this,f[0])},disable:function(e){var j=c(this),f=j.children(".mCustomScrollBox"),h=f.children(".mCSB_container"),g=f.children(".mCSB_scrollTools"),i=g.children().children(".mCSB_dragger");f.unbind("mousewheel focusin mouseenter mouseleave touchend");h.unbind("touchstart touchmove");if(e){if(j.data("horizontalScroll")){i.add(h).css("left",0)}else{i.add(h).css("top",0)}}g.css("display","none");h.addClass("mCS_no_scrollbar");j.data({bindEvent_mousewheel:false,bindEvent_focusin:false,bindEvent_content_touch:false,bindEvent_autoHideScrollbar:false}).addClass("mCS_disabled")},destroy:function(){var e=c(this);e.removeClass("mCustomScrollbar _mCS_"+e.data("mCustomScrollbarIndex")).addClass("mCS_destroyed").children().children(".mCSB_container").unwrap().children().unwrap().siblings(".mCSB_scrollTools").remove();c(document).unbind("mousemove."+e.data("mCustomScrollbarIndex")+" mouseup."+e.data("mCustomScrollbarIndex")+" MSPointerMove."+e.data("mCustomScrollbarIndex")+" MSPointerUp."+e.data("mCustomScrollbarIndex"));c(window).unbind("resize."+e.data("mCustomScrollbarIndex"))}},d={showScrollbar:function(){this.stop().animate({opacity:1},"fast")},hideScrollbar:function(){this.stop().animate({opacity:0},"fast")},mTweenAxis:function(g,i,h,f,o,y){var y=y||{},v=y.onStart||function(){},p=y.onUpdate||function(){},w=y.onComplete||function(){};var n=t(),l,j=0,r=g.offsetTop,s=g.style;if(i==="left"){r=g.offsetLeft}var m=h-r;q();e();function t(){if(window.performance&#038;&#038;window.performance.now){return window.performance.now()}else{if(window.performance&#038;&#038;window.performance.webkitNow){return window.performance.webkitNow()}else{if(Date.now){return Date.now()}else{return new Date().getTime()}}}}function x(){if(!j){v.call()}j=t()-n;u();if(j>=g._time){g._time=(j>g._time)?j+l-(j-g._time):j+l-1;if(g._time<j+1){g._time=j+1}}if(g._time<f){g._id=_request(x)}else{w.call()}}function u(){if(f>0){g.currVal=k(g._time,r,m,f,o);s[i]=Math.round(g.currVal)+"px"}else{s[i]=h+"px"}p.call()}function e(){l=1000/60;g._time=j+l;_request=(!window.requestAnimationFrame)?function(z){u();return setTimeout(z,0.01)}:window.requestAnimationFrame;g._id=_request(x)}function q(){if(g._id==null){return}if(!window.requestAnimationFrame){clearTimeout(g._id)}else{window.cancelAnimationFrame(g._id)}g._id=null}function k(B,A,F,E,C){switch(C){case"linear":return F*B/E+A;break;case"easeOutQuad":B/=E;return -F*B*(B-2)+A;break;case"easeInOutQuad":B/=E/2;if(B<1){return F/2*B*B+A}B--;return -F/2*(B*(B-2)-1)+A;break;case"easeOutCubic":B/=E;B--;return F*(B*B*B+1)+A;break;case"easeOutQuart":B/=E;B--;return -F*(B*B*B*B-1)+A;break;case"easeOutQuint":B/=E;B--;return F*(B*B*B*B*B+1)+A;break;case"easeOutCirc":B/=E;B--;return F*Math.sqrt(1-B*B)+A;break;case"easeOutSine":return F*Math.sin(B/E*(Math.PI/2))+A;break;case"easeOutExpo":return F*(-Math.pow(2,-10*B/E)+1)+A;break;case"mcsEaseOut":var D=(B/=E)*B,z=D*B;return A+F*(0.499999999999997*z*D+-2.5*D*D+5.5*z+-6.5*D+4*B);break;case"draggerRailEase":B/=E/2;if(B<1){return F/2*B*B*B+A}B-=2;return F/2*(B*B*B+2)+A;break}}},mTweenAxisStop:function(e){if(e._id==null){return}if(!window.requestAnimationFrame){clearTimeout(e._id)}else{window.cancelAnimationFrame(e._id)}e._id=null},rafPolyfill:function(){var f=["ms","moz","webkit","o"],e=f.length;while(--e>-1&#038;&#038;!window.requestAnimationFrame){window.requestAnimationFrame=window[f[e]+"RequestAnimationFrame"];window.cancelAnimationFrame=window[f[e]+"CancelAnimationFrame"]||window[f[e]+"CancelRequestAnimationFrame"]}}};d.rafPolyfill.call();c.support.touch=!!("ontouchstart" in window);c.support.pointer=window.navigator.pointerEnabled;c.support.msPointer=window.navigator.msPointerEnabled;var a=("https:"==document.location.protocol)?"https:":"http:";c.event.special.mousewheel||document.write('<script src="'+a+'//cdnjs.cloudflare.com/ajax/libs/jquery-mousewheel/3.0.6/jquery.mousewheel.min.js"><\/script>');c.fn.mCustomScrollbar=function(e){if(b[e]){return b[e].apply(this,Array.prototype.slice.call(arguments,1))}else{if(typeof e==="object"||!e){return b.init.apply(this,arguments)}else{c.error("Method "+e+" does not exist")}}}})(jQuery);
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![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();</p>
<p>// <input type="text" placeholder="username">
(function($){
    //feature detection
    var hasPlaceholder = 'placeholder' in document.createElement('input');
    var placeholderClass = 'evn-placeholder';</p>
<p>    //sniffy sniff sniff -- just to give extra left padding for the older
    //graphics for type=email and type=url
    var isOldOpera = $.browser.opera &#038;&#038; $.browser.version < 10.5;</p>
<p>    $.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;</p>
<p>        //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() {</p>
<p>            //local vars
            var $this = $(this),
                inputVal = $.trim($this.val()),
                inputWidth = $this.width(),
                inputHeight = $this.height(),</p>
<p>            //grab the inputs id for the <label @for>, or make a new one from the Date
                inputId = (this.id) ? this.id : 'placeholder' + (+new Date()) + this.className.replace(' ',''),
                placeholderText = options.placeholderText ? options.placeholderText : $this.attr('placeholder'),
                placeholder = $('<label class="' + placeholderClass + '" for=\"'+ inputId +'\">'+ placeholderText + '</label>');</p>
<p>            //stuff in some calculated values into the placeholderCSS object
//            options.placeholderCSS['width'] = inputWidth;
            options.placeholderCSS['height'] = inputHeight;</p>
<p>            // adjust position of placeholder
            options.placeholderCSS.left = (isOldOpera &#038;&#038; (this.type == 'email' || this.type == 'url')) ?
                '11%' : o_left;
            placeholder.css(options.placeholderCSS);</p>
<p>            //place the placeholder if the input is empty</p>
<p>            $this.wrap(options.inputWrapper);
            $this.attr('id', inputId).after(placeholder);</p>
<p>            if(inputVal) {
                $this.next().hide();
            }</p>
<p>            //hide placeholder on focus
            $this.focus(function(){
                $this.next().hide();
            });</p>
<p>            //show placeholder if the input is empty
            $this.blur(function(){
                if (!$.trim($this.val())){
                    $this.next().show();
                };
            });
        });
    };</p>
<p>    //expose defaults
    $.fn.placeholder.defaults = {
        //you can pass in a custom wrapper
        inputWrapper: '</p>
<div style="position:relative;"></div>
<p>',
        placeholderText: null,</p>
<p>        //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);
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/*!
 *  ClearlyComponent__detect
 *  Evernote Clearly's content-detection algorithm as an embeddable component.
 *  Copyright 2013, Evernote Corporation
 *
 *  Usage:
 *  ======
 *
 *      // define
 *      window.ClearlyComponent__detect = {
 *          'callbacks': {
 *              'finished': someFunction(),
 *          },
 *          'window': window,
 *          'document': document,
 *          'jQuery': window.jQuery
 *      };
 *
 *      // init -- will return false, if something goes wrong
 *      window.ClearlyComponent__detect = initClearlyComponent__detect(window.ClearlyComponent__detect);
 *
 *      // call -- returns nothing; callbacks will be used
 *      window.ClearlyComponent__detect.start();
 *
 *      // publcly available/overridable
 *      window.ClearlyComponent__detect.debug
 *      window.ClearlyComponent__detect.parseOptions
 *
 */</p>
<p>/*
    changes:
    ========
        $R => $D
        $R.win => $D.window
        $R.parsingOptions => $D.parseOptions
        $R.skipStuffFromDomains__links => $D.parseOptions._skip_link_from_domain
        $R.skipStuffFromDomain__images => $D.parseOptions._skip_image_from_domain
        $R.keepStuffFromDomain__video => $D.parseOptions._keep_video_from_domain
        $R.getContent__processCandidates => $D.getContent__processCandidates__first
        $R.getContent__computePointsForCandidate => $D.getContent__computePointsForCandidate__first
        $R.getContent__computeDetailsForCandidate => $D.getContent__computeDetailsForCandidate__first
        $R.getContent__processCandidatesSecond => $D.getContent__processCandidates__second
        $R.getContent__computePointsForCandidateSecond => $D.getContent__computePointsForCandidate__second
        $R.getContent__computeDetailsForCandidateSecond => $D.getContent__computeDetailsForCandidate__second
        $R.getContent__computePointsForCandidateThird => $D.getContent__computePointsForCandidate__third
        $R.getContent__computeDetailsForCandidateThird => $D.getContent__computeDetailsForCandidate__third</p>
<p>    to do:
    ======
*/</p>
<p>function initClearlyComponent__detect(_paramInstance)
{
    //  global instance reference {
    //  ===========================</p>
<p>        //  null; return
        if (_paramInstance); else { return false; }</p>
<p>        //  shorthand
        $D = _paramInstance;</p>
<p>    //  global instance reference }</p>
<p>    //  required vars {
    //  ===============</p>
<p>        //  the component instance object must already be created,
        //  when the init function is called. it must have these vars set:</p>
<p>        switch (true)
        {
            case (!($D.callbacks)):
            case (!($D.callbacks.finished)):</p>
<p>            case (!($D.window)):
            case (!($D.document)):
            case (!($D.document.body)):</p>
<p>            case (!($D.jQuery)):</p>
<p>                if ($D.debug)
                {
                    console.log(!($D.callbacks));
                    console.log(!($D.callbacks.finished));</p>
<p>                    console.log(!($D.window));
                    console.log(!($D.document));
                    console.log(!($D.document.body));</p>
<p>                    console.log(!($D.jQuery));
                }</p>
<p>                //  something's wrong
                return false;
        }</p>
<p>    //  required vars }</p>
<p>    //  global vars {
    //  =============</p>
<p>        $CJ = $D.jQuery;</p>
<p>        $D.$window = $CJ($D.window);
        $D.$document = $CJ($D.document);</p>
<p>    //  global vars }</p>
<p>    //  parse options {
    //  ===============   </p>
<p>		$D.parseOptions =
		{
			'_elements_ignore': 			        '|button|input|select|textarea|optgroup|command|datalist|--|frame|frameset|noframes|--|style|link|script|noscript|--|canvas|applet|map|--|marquee|area|base|',
			'_elements_ignore_id': 					'|evernote-content|evernote-attributes-content|evernote-share-content|evernoteErrorPopup|evernote-post-clip-content|',
			'_elements_ignore_tag': 		        '|form|fieldset|details|dir|--|center|font|span|',</p>
<p>			'_elements_container': 			        '|body|--|article|section|--|div|--|td|--|li|--|dd|dt|',
            '_elements_self_closing': 		        '|br|hr|--|img|--|col|--|source|--|embed|param|--|iframe|',</p>
<p>			'_elements_visible': 			        '|article|section|--|ul|ol|li|dd|--|table|tr|td|--|div|--|p|--|h1|h2|h3|h4|h5|h6|--|span|',
			'_elements_too_much_content': 	        '|b|i|em|strong|--|h1|h2|h3|h4|h5|--|td|',
			'_elements_link_density':		        '|div|--|table|ul|ol|--|section|aside|header|',
			'_elements_floating':			        '|div|--|table|',
			'_elements_above_target_ignore':        '|br|--|ul|ol|dl|--|table|',</p>
<p>            '_unskippable_attribute':               'clearly__unskippable_element',
            '_unskippable_attribute_value':         'yes',</p>
<p>            '_use_document_title_attribute':        'clearly__use_document_title_as_article_title',
            '_use_document_title_attribute_value':  'yes',</p>
<p>            '_elements_keep_attributes':
			{
				'a': 		['href', 'title', 'name'],
				'img': 		['src', 'width', 'height', 'alt', 'title'],</p>
<p>				'video': 	['src', 'width', 'height', 'poster', 'audio', 'preload', 'autoplay', 'loop', 'controls'],
				'audio': 	['src', 'preload', 'autoplay', 'loop', 'controls'],		 
				'source': 	['src', 'type'],</p>
<p>				'object': 	['data', 'type', 'width', 'height', 'classid', 'codebase', 'codetype'],						
				'param': 	['name', 'value'],
				'embed': 	['src', 'type', 'width', 'height', 'flashvars', 'allowscriptaccess', 'allowfullscreen', 'bgcolor'],</p>
<p>				'iframe':	['src', 'width', 'height', 'frameborder', 'scrolling'],</p>
<p>				'td':		['colspan', 'rowspan'],			
				'th':		['colspan', 'rowspan']
			},</p>
<p>			'_skip_link_from_domain': [
                /* international */     'doubleclick.net', 'fastclick.net', 'adbrite.com', 'adbureau.net', 'admob.com', 'bannersxchange.com', 'buysellads.com', 'impact-ad.jp', 'atdmt.com', 'advertising.com', 'serving-sys.com',
                /* japan */             'itmedia.jp', 'microad.jp', 'adplan-ds.com'
			],</p>
<p>			'_skip_image_from_domain': [
                /* international */     'googlesyndication.com', 'fastclick.net', '.2mdn.net', 'de17a.com', 'content.aimatch.com', 'bannersxchange.com', 'buysellads.com', 'atdmt.com', 'advertising.com', 'serving-sys.com',
                /* japan */             'impact-ad.jp', 'itmedia.jp', 'microad.jp', 'adplan-ds.com'
			],</p>
<p>			'_keep_video_from_domain': [
                /* video */     'youtube.com', 'youtube-nocookie.com', 'vimeo.com', 'hulu.com', 'flickr.com',
                /* other */     'yahoo.com', 'newsnetz.ch'
			]
		};</p>
<p>    //  parse options }</p>
<p>    //  debug {
    //  =======</p>
<p>        $D.debug = ($D.debug || false);
		$D.debugRemembered = {};
        $D.debugTimers = [];</p>
<p>		if ($D.debug)
		{
		    //  writeLog
		    //  ========
				switch (true)
				{
					case (!(!($D.window.console &#038;&#038; $D.window.console.log))):    $D.writeLog = function (msg) { $D.window.console.log(msg); };       break;
					case (!(!($D.window.opera &#038;&#038; $D.window.opera.postError))):  $D.writeLog = function (msg) { $D.window.opera.postError(msg); };   break;
					default:                                                    $D.writeLog = function (msg) {};                                    break;
				}</p>
<p>            //  log
            //  ===
                $D.log = function ()
                {
                    if ($D.debug); else { return; }
                    for (var i=0, il=arguments.length; i<il ; i++) { $D.writeLog(arguments[i]); }
                    $D.writeLog('-----------------------------------------');
                };</p>
<p>            //  remember
            //  ========
                $D.debugRemember = function (_k, _v)
                {
                    $D.debugRemembered[_k] = _v;
                };</p>
<p>            //  outline
            //  =======
                $D.debugOutline = function (_element, _category, _reason)
                {
                    var _outline = '#ff5500', _background = 'rgba(255, 85, 0, 0.5)';</p>
<p>                    switch (true)
                    {
                        case (!$D.debug):
                        case (!(_element.nodeType === 1)):
                        case (!(_element.tagName > '')):
                        case (_element.tagName.toLowerCase() == 'onject'):
                        case (_element.tagName.toLowerCase() == 'embed'):
                            return;
                    }</p>
<p>                    switch (true)
                    {
                        case (_category == 'target' &#038;&#038; _reason == 'first'):                 _outline = '#00cc00'; _background = 'rgba(0, 255, 0, 0.5)';         break;
                        case (_category == 'target' &#038;&#038; _reason == 'second'):                _outline = '#0000cc'; _background = 'rgba(0, 0, 255, 0.5)';         break;</p>
<p>                        case (_category == 'target' &#038;&#038; _reason == 'next-page'):             _outline = '#FF80C0'; _background = 'rgba(255, 128, 192, 0.5)';     break;
                        case (_category == 'target' &#038;&#038; _reason == 'add-above'):             _outline = '#804000'; _background = 'rgba(128, 64, 0, 0.5)';        break;</p>
<p>                        case (_category == 'clean-before' &#038;&#038; _reason == 'floating'):        _outline = '#808080'; _background = 'rgba(128, 128, 128, 0.5)';     break;
                        case (_category == 'clean-after' &#038;&#038; _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;
                    }</p>
<p>                    //  do
                    $CJ(_element).attr('readable__outline', (_category + ': ' + _reason));
                    $CJ(_element).css({ 'outline': '5px solid ' + _outline, 'background-color': '' + _background });
                };</p>
<p>		//	timers
		//	======</p>
<p>			$D.debugTimerStart = function (timerName)
			{
				$D.debugTimers.push({
					'name': timerName,
					'start': (new Date()).getTime()
				});
			};</p>
<p>			$D.debugTimerEnd = function ()
			{
				var _t = $D.debugTimers.pop(), _time = ((new Date()).getTime() - _t.start);
				$D.log('TIMER / '+_t.name+': ' + _time);
				return _time;
			};
		}
		else
		{
            $D.writeLog 		= function () { return false; };
            $D.log 				= function () { return false; };
            $D.debugRemember 	= function () { return false; };
            $D.debugOutline 	= function () { return false; };
            $D.debugTimerStart 	= function () { return false; };
            $D.debugTimerEnd 	= function () { return false; };
        }</p>
<p>    //  debug }</p>
<p>    //  language {
    //  ==========</p>
<p>        //  default
        $D.language = 'general';</p>
<p>        //  text to test
        //  ============</p>
<p>            //  title
            $D.textForlanguageDetection = $D.document.title;</p>
<p>            //  snippets
            //  ...</p>
<p>        //  check
        //  =====
            switch (true)
            {
                case ($D.textForlanguageDetection.match(/([\u3000])/gi) != null):
                case ($D.textForlanguageDetection.match(/([\u3001])/gi) != null):
                case ($D.textForlanguageDetection.match(/([\u3002])/gi) != null):
                case ($D.textForlanguageDetection.match(/([\u301C])/gi) != null):
                    $D.language = 'cjk';
                    break;
            }</p>
<p>    //  language }</p>
<p>    //  rtl {
    //  =====</p>
<p>        //  flags
        $D.rtl = false;
        $D.maybeRTL = false;</p>
<p>        //  on/off
        $D.makeRTL = function () { $D.rtl = true; };
        $D.makeNotRTL = function () { $D.rtl = false; };</p>
<p>        //	detect
		(function ()
		{
			//	definitely
			$D.$document.find('html, body').each(function (_i, _e)
			{
				switch (true)
				{
					case ($CJ(_e).attr('dir') == 'rtl'):
					case ($CJ(_e).css('direction') == 'rtl'):
					case ($CJ(_e).attr('lang') == 'he'):
					case ($CJ(_e).attr('lang') == 'he-il'):
					case ($CJ(_e).attr('lang') == 'ar'):
					case ($CJ(_e).attr('lang') == 'ur'):
						$D.makeRTL();
						return false;
				}
			});</p>
<p>			//	maybe?
            if (true
                &#038;&#038; (!$D.rtl) 
                &#038;&#038; ($D.$document.find("div[dir='rtl'], table[dir='rtl'], td[dir='rtl']").length > 0)
            ) { $D.maybeRTL = true; }
		}
		)();</p>
<p>    //  rtl }</p>
<p>    //  measure text {
    //  ==============</p>
<p>        //	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</p>
<p>        //	length
        //	======
            $D.measureText__getTextLength = function (_the_text)
            {
                var _text = _the_text;</p>
<p>                    _text = _text.replace(/[\s\n\r]+/gi, '');
                    //_text = _text.replace(/\d+/, '');</p>
<p>                return _text.length;
            };</p>
<p>        //	word count
        //	==========
            $D.measureText__getWordCount = function (_the_text)
            {
                var _text = _the_text;</p>
<p>                //	do stuff
                //	========
                    _text = _text.replace(/[\s\n\r]+/gi, ' ');</p>
<p>                    _text = _text.replace(/([.,?!:;()\[\]'""-])/gi, ' $1 ');</p>
<p>                    _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)]');</p>
<p>                //	count
                //	=====
                    var 
                        _count = 0,
                        _words_match = _text.match(/([^\s\d]{3,})/gi)
                    ;	</p>
<p>                    //	add match
                    _count += (_words_match != null ? _words_match.length : 0);</p>
<p>                    //	add manual count
                    _text.replace(/\[=words\((\d)\)\]/, function (_match, _plus) { _count += (5 * parseInt(_plus)); });</p>
<p>                //	return
                //	======
                    return _count;
            };</p>
<p>        //	levenshtein
        //	===========	
            $D.levenshteinDistance = function (str1, str2)
            {
                var l1 = str1.length, l2 = str2.length, i = 0, j = 0, d = [];</p>
<p>                if (Math.min(l1, l2) === 0)
                    { return Math.max(l1, l2); }</p>
<p>                for (i = 0 ; i <= l1 ; i++)
                    { d[i] = []; d[i][0] = i; }</p>
<p>                for (j = 0 ; j <= l2 ; j++)
                    { d[0][j] = j; }</p>
<p>                for (i = 1 ; i <= l1 ; i++)
                    { for (j = 1 ; j <= l2 ; j++) { d[i][j] = Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + (str1.charAt(i - 1) === str2.charAt(j - 1) ? 0 : 1)); } }</p>
<p>                return d[l1][l2];
            };</p>
<p>        //	get first fragment
        //	==================
            $D.nextPage__getFirstFragment = function (_html)
            {
                //  remove all tags
                _html = _html.replace(/<[^>]+?>/gi, '');</p>
<p>                //  normalize spaces
                _html = _html.replace(/\s+/gi, ' ');</p>
<p>                //  return first 1000 characters
                return _html.substr(0, 2000);
            };</p>
<p>    //  measure text }</p>
<p>    //  hidden node {
    //  =============</p>
<p>        $D.isNodeHidden = function (_node, _tag_name)
        {
            switch (true)
            {
                case (_node.offsetWidth > 0):
                case (_node.offsetHeight > 0):
                    break;</p>
<p>                default:
                    switch (true)
                    {
                        case (_node.offsetLeft > 0):
                        case (_node.offsetTop > 0):
                            break;</p>
<p>                        default:
                            //  exclude inline DIVs -- which, stupidly, don't have a width/height
                            if (true
                                &#038;&#038; (_tag_name == 'div') 
                                &#038;&#038; ((_node.style.display || $CJ.css( _node, "display" )) == 'inline')
                            ) { break; }</p>
<p>                            //  it's hidden
                            return true;
                    }
                    break;
            }</p>
<p>            //  it's not hidden
            return false;
        };</p>
<p>    //  hidden node }</p>
<p>    //  compute points for candidate {
    //  ==============================</p>
<p>        $D.getContent__computePointsForCandidate__do = function (_ratio_remaining, _power, _ratio, _points_history)
        {
            var 
                _points_remaining = (_points_history[0] * _ratio_remaining),
                _points_to_compute = (_points_history[0] - _points_remaining)
            ;</p>
<p>            if (_ratio < 0)
            {
                //_points_return = (0.75 * _points_remaining);
                _points_return = _points_remaining;
            }
            else
            {
                _points_return = 0
                    + _points_remaining
                    + (_points_to_compute * Math.pow(_ratio, _power))
                ;
            }</p>
<p>            //	add
            _points_history.unshift(_points_return);
        };</p>
<p>    //  compute points for candidate }</p>
<p>    //  process candidates (first) {
    //  ============================</p>
<p>        $D.getContent__computeDetailsForCandidate__first = function (_e, _main)
        {
            var _r = {};</p>
<p>            //	bad candidate
            //	=============
                if (_e._is__bad) { return _r; }</p>
<p>            //	paragraphs
            //	==========
                _r['_count__lines_of_65_characters'] = (_e._length__plain_text / 65);
                _r['_count__paragraphs_of_3_lines'] =  (_r._count__lines_of_65_characters / 3);
                _r['_count__paragraphs_of_5_lines'] =  (_r._count__lines_of_65_characters / 5);</p>
<p>                _r['_count__paragraphs_of_50_words'] = (_e._count__plain_words / 50);
                _r['_count__paragraphs_of_80_words'] = (_e._count__plain_words / 80);</p>
<p>            //	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);</p>
<p>            //	links
            //	=====
                _r['_ratio__length__links_text_to_plain_text'] =  (_e._length__links_text / _e._length__plain_text);
                _r['_ratio__count__links_words_to_plain_words'] = (_e._count__links_words / _e._count__plain_words);</p>
<p>                _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);</p>
<p>                _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));</p>
<p>                _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);</p>
<p>            //	text above
            //	==========
                var 
                    _divide__candidates = Math.max(2, Math.ceil(_e._count__above_candidates * 0.5)),</p>
<p>                    _above_text = ((0
                        + (_e._length__above_plain_text * 1)
                        + (_e._length__above_plain_text / _divide__candidates)
                    ) / 2),</p>
<p>                    _above_words = ((0
                        + (_e._count__above_plain_words * 1)
                        + (_e._count__above_plain_words / _divide__candidates)
                    ) / 2)
                ;</p>
<p>                _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);</p>
<p>            //	candidates
            //	==========
                _r['_ratio__count__candidates_to_total_candidates'] = (_e._count__candidates / (_main._count__candidates + 1));
                _r['_ratio__count__containers_to_total_containers'] = (_e._count__containers / (_main._count__containers + 1));</p>
<p>            //	return
            //	======
                return _r;
        };    </p>
<p>        $D.getContent__computePointsForCandidate__first = function (_e, _main)
        {
            var 
                _details = _e.__candidate_details,
                _points_history = [],
                _really_big = ((_main._length__plain_text / 65) > 250)
            ;</p>
<p>            //	bad candidate
            if (_e._is__bad) { return [0]; }</p>
<p>            //	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));</p>
<p>                //  negative
                if (_points_history[0] < 0) { return [0]; }</p>
<p>            //  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))
                ;</p>
<p>                _points_history.unshift(((0
                    + (_points_history[0] * 3)
                    + (_points_history[0] / _divide__pieces)
                    + (_points_history[0] / _divide__candidates)
                    + (_points_history[0] / _divide__containers)
                ) / 6));</p>
<p>            //	total text
            //	==========
                $D.getContent__computePointsForCandidate__do(0.10, 2, (1 - (1 - _details._ratio__length__plain_text_to_total_plain_text)), _points_history);
                $D.getContent__computePointsForCandidate__do(0.10, 2, (1 - (1 - _details._ratio__count__plain_words_to_total_plain_words)), _points_history);</p>
<p>                if (_really_big) {
                $D.getContent__computePointsForCandidate__do(0.10, 4, (1 - (1 - _details._ratio__length__plain_text_to_total_plain_text)), _points_history);
                $D.getContent__computePointsForCandidate__do(0.10, 4, (1 - (1 - _details._ratio__count__plain_words_to_total_plain_words)), _points_history);
                }</p>
<p>            //	text above
            //	==========
                $D.getContent__computePointsForCandidate__do(0.10, 5, (1 - _details._ratio__length__above_plain_text_to_total_plain_text), _points_history);
                $D.getContent__computePointsForCandidate__do(0.10, 5, (1 - _details._ratio__count__above_plain_words_to_total_plain_words), _points_history);</p>
<p>                if (_really_big) {
                $D.getContent__computePointsForCandidate__do(0.10, 10, (1 - _details._ratio__length__above_plain_text_to_total_plain_text), _points_history);
                $D.getContent__computePointsForCandidate__do(0.10, 10, (1 - _details._ratio__count__above_plain_words_to_total_plain_words), _points_history);
                }</p>
<p>            //	links outer
            //	===========
                $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__length__links_text_to_total_links_text), _points_history);
                $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__links_words_to_total_links_words), _points_history);</p>
<p>                $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__links_to_total_links), _points_history);</p>
<p>            //  links inner
            //  ===========
                var __lr = ($D.language == 'cjk' ? 0.75 : 0.50);</p>
<p>                $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__length__links_text_to_plain_text), _points_history);
                $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_words_to_plain_words), _points_history);</p>
<p>                $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__length__links_text_to_all_text), _points_history);
                $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_words_to_all_words), _points_history);</p>
<p>                $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_to_plain_words), _points_history);</p>
<p>            //	candidates, containers, pieces
            //	==============================
                $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__candidates_to_total_candidates), _points_history);
                $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__containers_to_total_containers), _points_history);
                $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details._ratio__count__pieces_to_total_pieces), _points_history);</p>
<p>            //	return -- will get [0] as the actual final points
            //	======
                return _points_history;
        };    </p>
<p>        $D.getContent__processCandidates__first = function (_candidatesToProcess)
        {
            //	process this var
            //	================
                var _candidates = _candidatesToProcess;</p>
<p>            //	sort _candidates -- the lower in the dom, the closer to position 0
            //	================
                _candidates.sort(function (a, b)
                {
                    switch (true)
                    {
                        case (a.__index < b.__index): return -1;
                        case (a.__index > b.__index): return 1;
                        default: return 0;
                    }
                });</p>
<p>            //	get first
            //	=========
                var	_main = _candidates[0]
                if ($D.debug) { $D.log('should be body', _main, _main.__node); }</p>
<p>            //	pieces of text -- and points computation
            //	==============
                for (var i=0, _i=_candidates.length; i<_i; i++)
                {
                    //	pieces
                    //	======
                        var 
                            _count__pieces = 0,
                            _array__pieces = []
                        ;</p>
<p>                        for (var k=i, _k=_candidates.length; k<_k; k++)
                        {
                            if (_candidates[k]._count__candidates > 0) { continue; }
                            if ($CJ.contains(_candidates[i].__node, _candidates[k].__node)); else { continue; }</p>
<p>                            //	store piece, if in debug mode
                            if ($D.debug) { _array__pieces.push(_candidates[k]); }</p>
<p>                            //	incement pieces count
                            _count__pieces++;
                        }</p>
<p>                    //	candidate details
                    //	=================
                        _candidates[i]['__candidate_details'] = $D.getContent__computeDetailsForCandidate__first(_candidates[i], _main);</p>
<p>                    //	pieces -- do this here because _main doesn't yet have a pieces count
                    //	======</p>
<p>                        //	set pieces
                        _candidates[i]['_count__pieces'] = _count__pieces;
                        _candidates[i]['_array__pieces'] = _array__pieces;</p>
<p>                        //	pieces ratio
                        _candidates[i]['__candidate_details']['_ratio__count__pieces_to_total_pieces'] = (_count__pieces / (_candidates[0]._count__pieces + 1));</p>
<p>                    //  check some more
                    //  ===============
                    /*    switch (true)
                        {
                            case (($D.language != 'cjk') &#038;&#038; (_candidates[i]['__candidate_details']['_ratio__length__links_text_to_plain_text'] > 1)):
                            case (($D.language != 'cjk') &#038;&#038; (_candidates[i]['__candidate_details']['_ratio__count__links_words_to_plain_words'] > 1)):
                                _candidates[i]._is__bad = true;
                                break;
                        }
                    */</p>
<p>                    //	points
                    //	======
                        _candidates[i].__points_history = $D.getContent__computePointsForCandidate__first(_candidates[i], _main);
                        _candidates[i].__points = _candidates[i].__points_history[0];
                }</p>
<p>            //	sort _candidates -- the more points, the closer to position 0
            //	================
                _candidates.sort(function (a, b)
                {
                    switch (true)
                    {
                        case (a.__points > b.__points): return -1;
                        case (a.__points < b.__points): return 1;
                        default: return 0;
                    }
                });</p>
<p>            //	return
            //	======
                return _candidates;	
        };    </p>
<p>    //  process candidates (first) }</p>
<p>    //  process candidates (second) {
    //  =============================</p>
<p>        $D.getContent__computePointsForCandidate__second = function (_e, _main)
        {
            var 
                _details = _e.__candidate_details,
                _details_second = _e.__candidate_details_second,
                _points_history = []
            ;</p>
<p>            //	bad candidate
            if (_e._is__bad) { return [0]; }</p>
<p>            //	get initial points
            //	==================
                _points_history.unshift(_e.__points_history[(_e.__points_history.length-1)]);</p>
<p>            //  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))
                ;</p>
<p>                _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));</p>
<p>            //	total text
            //	==========
                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - (1 - _details_second._ratio__length__plain_text_to_total_plain_text)), _points_history);
                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - (1 - _details_second._ratio__count__plain_words_to_total_plain_words)), _points_history);</p>
<p>            //	text above
            //	==========
                var __ar = ($D.language == 'cjk' ? 0.50 : 0.10);</p>
<p>                $D.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__length__above_plain_text_to_total_plain_text), _points_history);
                $D.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__count__above_plain_words_to_total_plain_words), _points_history);</p>
<p>                $D.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__length__above_plain_text_to_plain_text), _points_history);
                $D.getContent__computePointsForCandidate__do(__ar, 1, (1 - _details_second._ratio__count__above_plain_words_to_plain_words), _points_history);</p>
<p>            //	links outer
            //	===========
                $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details_second._ratio__count__links_to_total_links), _points_history);
                $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details_second._ratio__length__links_text_to_total_links_text), _points_history);
                $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - _details_second._ratio__count__links_words_to_total_links_words), _points_history);</p>
<p>            //	links inner
            //	===========
                var __lr = ($D.language == 'cjk' ? 0.75 : 0.50);</p>
<p>                $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__length__links_text_to_plain_text), _points_history);
                $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details._ratio__count__links_words_to_plain_words), _points_history);</p>
<p>                $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details_second._ratio__length__links_text_to_all_text), _points_history);
                $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details_second._ratio__count__links_words_to_all_words), _points_history);</p>
<p>                $D.getContent__computePointsForCandidate__do(__lr, 1, (1 - _details_second._ratio__count__links_to_plain_words), _points_history);</p>
<p>            //	candidates, containers, pieces
            //	==============================
                $D.getContent__computePointsForCandidate__do(0.10, 2, (1 - _details_second._ratio__count__candidates_to_total_candidates), _points_history);
                $D.getContent__computePointsForCandidate__do(0.10, 2, (1 - _details_second._ratio__count__containers_to_total_containers), _points_history);
                $D.getContent__computePointsForCandidate__do(0.10, 2, (1 - _details_second._ratio__count__pieces_to_total_pieces), _points_history);</p>
<p>            //	return -- will get [0] as the actual final points
            //	======
                return _points_history;
        };    </p>
<p>        $D.getContent__computeDetailsForCandidate__second = function (_e, _main)
        {
            var _r = {};</p>
<p>            //	bad candidate
            //	=============
                if (_e._is__bad) { return _r; }</p>
<p>            //	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);</p>
<p>            //	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);</p>
<p>                _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));</p>
<p>                _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);</p>
<p>            //	text above
            //	==========
                var 
                    _divide__candidates = Math.max(2, Math.ceil((_e._count__above_candidates - _main._count__above_candidates) * 0.5)),</p>
<p>                    _above_text = ((0
                        + (_e.__second_length__above_plain_text * 1)
                        + (_e.__second_length__above_plain_text / _divide__candidates)
                    ) / 2),</p>
<p>                    _above_words = ((0
                        + (_e.__second_count__above_plain_words * 1)
                        + (_e.__second_count__above_plain_words / _divide__candidates)
                    ) / 2)
                ;</p>
<p>                _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);</p>
<p>                _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);</p>
<p>            //	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));</p>
<p>            //	return
            //	======
                return _r;
        };    </p>
<p>        $D.getContent__processCandidates__second = function (_processedCandidates)
        {
            var 
                _candidates = _processedCandidates,
                _main = _candidates[0]
            ;</p>
<p>            //	only get children of target
            //	===========================
                _candidates = $CJ.map(_candidates, function (_element, _index)
                {
                    switch (true)
                    {
                        case (!(_index > 0)):
                        case (!($CJ.contains(_main.__node, _element.__node))):
                            return null;</p>
<p>                        default:
                            return _element;
                    }
                });</p>
<p>                //  add main - to amke sure the result is never blank
                _candidates.unshift(_main);</p>
<p>            //	sort _candidates -- the lower in the dom, the closer to position 0
            //	================
                _candidates.sort(function (a, b)
                {
                    switch (true)
                    {
                        case (a.__index < b.__index): return -1;
                        case (a.__index > b.__index): return 1;
                        default: return 0;
                    }
                });</p>
<p>            //	second candidate computation
            //	============================
                for (var i=0, _i=_candidates.length; i<_i; i++)
                {
                    //	additional numbers
                    //	==================
                        _candidates[i].__second_length__above_plain_text = (_candidates[i]._length__above_plain_text - _main._length__above_plain_text);
                        _candidates[i].__second_count__above_plain_words = (_candidates[i]._count__above_plain_words - _main._count__above_plain_words);</p>
<p>                    //	candidate details
                    //	=================
                        _candidates[i]['__candidate_details_second'] = $D.getContent__computeDetailsForCandidate__second(_candidates[i], _main);</p>
<p>                    //	check some more
                    //	===============
                    /*	switch (true)
                        {
                            case (!(_candidates[i]['__candidate_details_second']['_ratio__count__plain_words_to_total_plain_words'] > 0.05)):
                            case (!(_candidates[i]['__candidate_details_second']['_ratio__length__plain_text_to_total_plain_text'] > 0.05)):</p>
<p>                            //case (!(_candidates[i]['__candidate_details_second']['_ratio__count__above_plain_words_to_total_plain_words'] < 0.1)):
                            //case (!(_candidates[i]['__candidate_details_second']['_ratio__length__above_plain_text_to_total_plain_text'] < 0.1)):</p>
<p>                            //case (_candidates[i]['__candidate_details_second']['_ratio__length__above_plain_text_to_plain_text'] > 1):
                            //case (_candidates[i]['__candidate_details_second']['_ratio__count__above_plain_words_to_plain_words'] > 1):</p>
<p>                                _candidates[i]._is__bad = true;
                                //	wil set points to 0, in points computation function
                                break;
                        }
                    */</p>
<p>                    //	points
                    //	======
                        _candidates[i].__points_history_second = $D.getContent__computePointsForCandidate__second(_candidates[i], _main);
                        _candidates[i].__points_second = _candidates[i].__points_history_second[0];
                }</p>
<p>            //	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;
                    }
                });</p>
<p>            //	return
            //	======
                return _candidates;	
        };    </p>
<p>    //  process candidates (second) }</p>
<p>    //  process candidates (third) {
    //  ============================</p>
<p>        $D.getContent__computePointsForCandidate__third = function (_e, _main)
        {
            var 
                _details = _e.__candidate_details,
                _details_second = _e.__candidate_details_second,
                _points_history = []
            ;</p>
<p>            //	bad candidate
            if (_e._is__bad) { return [0]; }</p>
<p>            //	get initial points
            //	==================
                _points_history.unshift(_e.__points_history[(_e.__points_history.length-1)]);</p>
<p>            //  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))
                ;</p>
<p>                _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));</p>
<p>            //  total text
            //  ==========
                $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - (1 - _details_second._ratio__length__plain_text_to_total_plain_text)), _points_history);
                $D.getContent__computePointsForCandidate__do(0.75, 1, (1 - (1 - _details_second._ratio__count__plain_words_to_total_plain_words)), _points_history);</p>
<p>            //	text above
            //	==========
                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__length__above_plain_text_to_total_plain_text), _points_history);
                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__above_plain_words_to_total_plain_words), _points_history);</p>
<p>                $D.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__length__above_plain_text_to_total_plain_text), _points_history);
                $D.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__count__above_plain_words_to_total_plain_words), _points_history);</p>
<p>                $D.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__length__above_plain_text_to_plain_text), _points_history);
                $D.getContent__computePointsForCandidate__do(0.10, 1, (1 - _details_second._ratio__count__above_plain_words_to_plain_words), _points_history);</p>
<p>            //	links inner
            //	===========
                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__length__links_text_to_all_text), _points_history);
                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__links_words_to_all_words), _points_history);</p>
<p>                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__length__links_text_to_plain_text), _points_history);
                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__links_words_to_plain_words), _points_history);</p>
<p>                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__links_to_plain_words), _points_history);</p>
<p>            //	candidates, containers, pieces
            //	==============================
                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__candidates_to_total_candidates), _points_history);
                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__containers_to_total_containers), _points_history);
                $D.getContent__computePointsForCandidate__do(0.50, 1, (1 - _details._ratio__count__pieces_to_total_pieces), _points_history);</p>
<p>            //	return -- will get [0] as the actual final points
            //	======
                return _points_history;
        };</p>
<p>    //  process candidates (third) }</p>
<p>    //  explore node and get stuff {
    //  ============================</p>
<p>        $D.getContent__exploreNodeAndGetStuff = function (_nodeToExplore, _justExploring)
        {
            var	
                _global__element_index = 0,</p>
<p>                _global__inside_link = false,
                _global__inside_link__element_index = 0,</p>
<p>                _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 = '',</p>
<p>                _return__containers = [],
                _return__candidates = [],
                _return__links = []
            ;</p>
<p>            //	recursive function
            //	==================
                var _recursive = function (_node)
                {
                    //	increment index
                    //	starts with 1
                    _global__element_index++;</p>
<p>                    var 
                        _tag_name = (_node.nodeType === 3 ? '#text' : ((_node.nodeType === 1 &#038;&#038; _node.tagName &#038;&#038; _node.tagName > '') ? _node.tagName.toLowerCase() : '#invalid')),
						_node_id = (_node.id),
                        _result =
                        {
                            '__index': _global__element_index, 
                            '__node': _node, </p>
<p>                            '_is__container': 		($D.parseOptions._elements_container.indexOf('|'+_tag_name+'|') > -1),
                            '_is__candidate': 		false,
                            '_is__text': 			false,
                            '_is__link': 			false,
                            '_is__link_skip': 		false,
                            '_is__image_small': 	false,
                            '_is__image_medium': 	false,
                            '_is__image_large': 	false,
                            '_is__image_skip': 		false,
                            '_is__unskippable':     false,</p>
<p>                            '_debug__above__plain_text': _global__above__plain_text,
                            '_debug__above__links_text': _global__above__links_text,</p>
<p>                            '_length__above_plain_text': _global__length__above_plain_text,
                            '_count__above_plain_words': _global__count__above_plain_words,</p>
<p>                            '_length__above_links_text': _global__length__above_links_text,
                            '_count__above_links_words': _global__count__above_links_words,</p>
<p>                            '_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),</p>
<p>                            '_count__above_candidates': _global__count__above_candidates,
                            '_count__above_containers': _global__count__above_containers,</p>
<p>                            '_length__plain_text': 0,
                            '_count__plain_words': 0,</p>
<p>                            '_length__links_text': 0,
                            '_count__links_words': 0,</p>
<p>                            '_length__all_text': 0,
                            '_count__all_words': 0,</p>
<p>                            '_count__containers': 0,
                            '_count__candidates': 0,</p>
<p>                            '_count__links': 0,
                            '_count__links_skip': 0,</p>
<p>                            '_count__images_small': 0,
                            '_count__images_medium': 0,
                            '_count__images_large': 0,
                            '_count__images_skip': 0
                        };</p>
<p>                    //  unskippable
                    //  ===========
                        if (false
                            || (_result._is__container)
                            || ($D.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1)
                        ) {
                            var _unskip = _node.getAttribute($D.parseOptions._unskippable_attribute);
                            if (_unskip == $D.parseOptions._unskippable_attribute_value) { _result._is__unskippable = true; }
                        }</p>
<p>                    //	fast return
                    //	===========
                        switch (true)
                        {
                            case ((_tag_name == '#invalid')):
                            case (($D.parseOptions._elements_ignore.indexOf('|'+_tag_name+'|') > -1)):
                                return false;
							case (($D.parseOptions._elements_ignore_id.indexOf('|'+_node_id+'|') > -1)):								
								return false;								
                            case (($D.parseOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1)):
                                if ($D.isNodeHidden(_node, _tag_name)) { return false; }
                                break;</p>
<p>                            //	self-closing -- with some exceptions
                            case ($D.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1):
                                switch (true)
                                {
                                    case ((_tag_name == 'img')): break;
                                    default: return false;
                                }
                                break;
                        }</p>
<p>                    //	do stuff
                    //	========
                        switch (true)
                        {
                            //	text node
                            case ((_tag_name == '#text')):
                                //	mark
                                _result._is__text = true;</p>
<p>                                //	get
                                var _nodeText = _node.nodeValue;</p>
<p>                                //	result
                                _result._length__plain_text = $D.measureText__getTextLength(_nodeText);
                                _result._count__plain_words = $D.measureText__getWordCount(_nodeText);</p>
<p>                                if (_global__inside_link)
                                {
                                    _global__length__above_links_text += _result._length__plain_text;
                                    _global__count__above_links_words += _result._count__plain_words;					
                                    if (false &#038;&#038; $D.debug) { _global__above__links_text += ' ' + _nodeText; }
                                }
                                else
                                {
                                    _global__length__above_plain_text += _result._length__plain_text;
                                    _global__count__above_plain_words += _result._count__plain_words;					
                                    if (false &#038;&#038; $D.debug) { _global__above__plain_text += ' ' + _nodeText; }
                                }</p>
<p>                                //	return text
                                return _result;</p>
<p>                            //	link
                            case (_tag_name == 'a'):
                                var _href = '';</p>
<p>                                try {
                                    _href = _node.href
                                } catch (e) {
                                    _href = $CJ.attr('href');
                                }</p>
<p>                                //	sanity
                                if (_href > ''); else { break; }
                                if (_href.indexOf); else { break; }</p>
<p>                                _result._is__link = true;</p>
<p>                                //	skip
                                for (var i=0, _i=$D.parseOptions._skip_link_from_domain.length; i<_i; i++)
                                {
                                    if (_href.indexOf($D.parseOptions._skip_link_from_domain[i]) > -1)
                                        { _result._is__link_skip = true; break; }
                                }</p>
<p>                                //	inside link
                                if (_global__inside_link); else
                                {
                                    _global__inside_link = true;
                                    _global__inside_link__element_index = _result.__index;
                                }</p>
<p>                                //	done
                                _return__links.push(_result);
                                break;</p>
<p>                            //	image
                            case (_tag_name == 'img'):</p>
<p>                                //	skip
                                if (_node.src &#038;&#038; _node.src.indexOf)
                                {
                                    for (var i=0, _i=$D.parseOptions._skip_image_from_domain.length; i<_i; i++)
                                    {
                                        if (_node.src.indexOf($D.parseOptions._skip_image_from_domain[i]) > -1)
                                            { _result._is__image_skip = true; break; }
                                    }
                                }</p>
<p>                                //	size
                                var	_width = $CJ(_node).width(), _height = $CJ(_node).height();
                                switch (true)
                                {
                                    case ((_width * _height) >= 50000):
                                    case ((_width >= 350) &#038;&#038; (_height >= 75)):
                                        _result._is__image_large = true;
                                        break;</p>
<p>                                    case ((_width * _height) >= 20000):
                                    case ((_width >= 150) &#038;&#038; (_height >= 150)):
                                        _result._is__image_medium = true;
                                        break;</p>
<p>                                    case ((_width <= 5) &#038;&#038; (_height <= 5)):
                                        _result._is__image_skip = true;
                                        break;</p>
<p>                                    default:
                                        _result._is__image_small = true;
                                        break;
                                }</p>
<p>                                break;
                        }</p>
<p>                    //	child nodes
                    //	===========
                        for (var i=0, _i=_node.childNodes.length; i<_i; i++)
                        {
                            var 
                                _child = _node.childNodes[i],
                                _child_result = _recursive(_child)
                            ;</p>
<p>                            //	if false, continue
                            if (_child_result); else { continue; }</p>
<p>                            //	add to result
                            _result._count__links += 			_child_result._count__links + 			(_child_result._is__link ? 1 : 0);
                            _result._count__links_skip += 		_child_result._count__links_skip + 		(_child_result._is__link_skip ? 1 : 0);</p>
<p>                            _result._count__images_small += 	_child_result._count__images_small + 	(_child_result._is__image_small ? 1 : 0);
                            _result._count__images_medium += 	_child_result._count__images_medium + 	(_child_result._is__image_medium ? 1 : 0);
                            _result._count__images_large += 	_child_result._count__images_large + 	(_child_result._is__image_large ? 1 : 0);
                            _result._count__images_skip += 		_child_result._count__images_skip + 	(_child_result._is__image_skip ? 1 : 0);</p>
<p>                            _result._count__containers += 		_child_result._count__containers + 		(_child_result._is__container ? 1 : 0);
                            _result._count__candidates += 		_child_result._count__candidates + 		(_child_result._is__candidate ? 1 : 0);</p>
<p>                            _result._length__all_text += 		_child_result._length__plain_text + 	_child_result._length__links_text;
                            _result._count__all_words += 		_child_result._count__plain_words + 	_child_result._count__links_words;</p>
<p>                            //	plain text / link text
                            switch (true)
                            {
                                case (_child_result._is__link):
                                    //	no text to add
                                    _result._length__links_text += (_child_result._length__plain_text + _child_result._length__links_text);
                                    _result._count__links_words += (_child_result._count__plain_words + _child_result._count__links_words);
                                    break;</p>
<p>                                default:
                                    _result._length__plain_text += 			_child_result._length__plain_text;
                                    _result._count__plain_words += 			_child_result._count__plain_words;
                                    _result._length__links_text += 			_child_result._length__links_text;
                                    _result._count__links_words += 			_child_result._count__links_words;
                                    break;
                            }
                        }</p>
<p>                    //	after child nodes
                    //	=================</p>
<p>                        //	mark as not in link anymore
                        if (true
                            &#038;&#038; (_result._is__link) 
                            &#038;&#038; (_global__inside_link__element_index == _result.__index)
                        ) {
                            _global__inside_link = false;
                            _global__inside_link__element_index = 0;
                        }</p>
<p>                    //	add to containers
                    //	=================
                        if (_result._is__container || ((_result.__index == 1) &#038;&#038; (_justExploring == true)))
                        {
                            //	add to containers
                            _return__containers.push(_result);</p>
<p>                            //  increase above containers
                            if (_result._is__container) { _global__count__above_containers++; }</p>
<p>                            //	add to candidates
                            if (_justExploring); else
                            {
                                switch (true)
                                {
                                    case (($D.language != 'cjk') &#038;&#038; ((_result._count__links * 2) >= _result._count__plain_words)):  /* link ratio */</p>
<p>                                    case (($D.language != 'cjk') &#038;&#038; (_result._length__plain_text < (65 / 3))):  /* text length */
                                    case (($D.language != 'cjk') &#038;&#038; (_result._count__plain_words < 5)):			/* words */</p>
<p>                                    case (($D.language == 'cjk') &#038;&#038; (_result._length__plain_text < 10)):	    /* text length */
                                    case (($D.language == 'cjk') &#038;&#038; (_result._count__plain_words < 2)):			/* words */</p>
<p>                                    //case (_result._length__plain_text == 0):    /* no text */
                                    //case (_result._count__plain_words == 0):    /* no words */</p>
<p>                                    //case (($D.language == 'cjk') &#038;&#038; ((_result._length__plain_text / 65 / 3) < 0.1)):				/* paragrahs of 3 lines */
                                    //case (($D.language != 'cjk') &#038;&#038; ((_result._count__plain_words / 50) < 0.5)):					/* paragraphs of 50 words */</p>
<p>                                        //	not a valid candidate
                                        //if (_tag_name == 'div') { $D.log('bad candidate', _result.__node); }</p>
<p>                                        break;</p>
<p>                                    default:
                                        //	good candidate
                                        _result._is__candidate = true;
                                        _return__candidates.push(_result);</p>
<p>                                        //  increase above candidates
                                        _global__count__above_candidates++;</p>
<p>                                        break;
                                }</p>
<p>                                //	special case for body -- if it was just skipped
                                //	=====================
                                    if ((_result.__index == 1) &#038;&#038; !(_result._is__candidate))
                                    {
                                        _result._is__candidate = true;
                                        _result._is__bad = true;
                                        _return__candidates.push(_result);
                                    }
                            }
                        }</p>
<p>                    //	return
                    //	======
                        return _result;
                };</p>
<p>            //	actually do it
            //	==============
                _recursive(_nodeToExplore);</p>
<p>            //	just exploring -- return first thing
            //	==============
                if (_justExploring) { return _return__containers.pop(); }</p>
<p>            //	return containers list
            //	======================
                return {
                    '_containers': 	_return__containers,
                    '_candidates': 	_return__candidates,
                    '_links': 		_return__links
                };
        };</p>
<p>    //  explore node and get stuff }</p>
<p>    //  build html for node {
    //  =====================</p>
<p>        $D.getContent__buildHTMLForNode = function (_nodeToBuildHTMLFor, _custom_mode)
        {
            var 
                _global__element_index = 0,
                _global__the_html = '',
                _global__exploreNodeToBuildHTMLFor = $D.getContent__exploreNodeAndGetStuff(_nodeToBuildHTMLFor, true)
            ;</p>
<p>            //	custom
                switch (_custom_mode)
                {
                    case 'above-the-target':
                        _global__exploreNodeToBuildHTMLFor = false;
                        break;
                }</p>
<p>            //	recursive function
            //	==================
                var _recursive = function (_node)
                {
                    //	increment index -- starts with 1
                    //	===============
                        _global__element_index++;</p>
<p>                    //	vars
                    //	====
                        var 
                            _explored = false,
                            _tag_name = (_node.nodeType === 3 ? '#text' : ((_node.nodeType === 1 &#038;&#038; _node.tagName &#038;&#038; _node.tagName > '') ? _node.tagName.toLowerCase() : '#invalid')),
							_node_id = _node.id,
                            _pos__start__before = 0,
                            _pos__start__after = 0,
                            _pos__end__before = 0,
                            _pos__end__after = 0
                        ;</p>
<p>                    //	fast return
                    //	===========
                        switch (true)
                        {
                            case ((_tag_name == '#invalid')):
                            case (($D.parseOptions._elements_ignore.indexOf('|'+_tag_name+'|') > -1)):
                                return;
							case (($D.parseOptions._elements_ignore_id.indexOf('|'+_node_id+'|') > -1)):								
								return;									</p>
<p>                            case (_tag_name == '#text'):
                                _global__the_html += _node.nodeValue
                                    .replace(/</gi, '&lt;')
                                    .replace(/>/gi, '&gt;')
                                ;
                                return;
                        }</p>
<p>                    //	hidden
                    //	======
                        if (true
                            &#038;&#038; ($D.parseOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1)
                            &#038;&#038; $D.isNodeHidden(_node, _tag_name)
                        ) { return; }</p>
<p>                    //	clean -- before
                    //	=====</p>
<p>                        //	objects, embeds, iframes
                        //	========================
                            switch (_tag_name)
                            {
                                case ('object'):
                                case ('embed'):
                                case ('iframe'):
                                    var 
                                        _src = (_tag_name == 'object' ? $CJ(_node).find("param[name='movie']").attr('value') : $CJ(_node).attr('src')),
                                        _skip = ((_src > '') ? false : true)
                                    ;</p>
<p>                                    if (_skip); else
                                    {
                                        //	default skip
                                        _skip = true;</p>
<p>                                        //	loop
                                        for (var i=0, _i=$D.parseOptions._keep_video_from_domain.length; i<_i; i++)
                                            { if (_src.indexOf($D.parseOptions._keep_video_from_domain[i]) > -1) { _skip = false; break; } }
                                    }</p>
<p>                                    //	skip?
                                    if (_skip)
                                    {
                                        _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                                        if (_explored &#038;&#038; _explored._is__unskippable); else
                                        {
                                            $D.debugOutline(_node, 'clean-before', 'object-embed-iframe');
                                            return;
                                        }
                                    }</p>
<p>                                    break;
                            }</p>
<p>                        //	skipped link
                        //	============
                            if (_tag_name == 'a' || _tag_name == 'li')
                            {
                                _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                                if (_explored &#038;&#038; _explored._is__unskippable); else
                                {
                                    switch (true)
                                    {
                                        case (_explored._is__link_skip):
                                        case (((_explored._count__images_small + _explored._count__images_skip) > 0) &#038;&#038; (_explored._length__plain_text < 65)):
                                            $D.debugOutline(_node, 'clean-before', 'skip-link');
                                            return;
                                    }
                                }
                            }</p>
<p>                        //	link density
                        //	============
                            if ($D.parseOptions._elements_link_density.indexOf('|'+_tag_name+'|') > -1)
                            {
                                _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                                if (_explored &#038;&#038; _explored._is__unskippable); else
                                {
                                    switch (true)
                                    {
                                        case (_explored._length__plain_text > (65 * 3 * 2)):
                                        case ($D.language == 'cjk' &#038;&#038; (_explored._length__plain_text > (65 * 3 * 1))):
                                        case (!(_explored._count__links > 1)):
                                        case (_global__exploreNodeToBuildHTMLFor &#038;&#038; (_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.5):
                                        case (_global__exploreNodeToBuildHTMLFor &#038;&#038; (_explored._count__plain_words / _global__exploreNodeToBuildHTMLFor._count__plain_words) > 0.5):
                                        case ((_explored._length__plain_text == 0) &#038;&#038; (_explored._count__links == 1) &#038;&#038; (_explored._length__links_text < 65)):
                                        case ((_explored._length__plain_text < 25) &#038;&#038; ((_explored._count__images_large + _explored._count__images_medium) > 0)):
                                            break;</p>
<p>                                        case ((_explored._length__links_text / _explored._length__all_text) < 0.5):
                                            if (_explored._count__links > 0); else { break; }
                                            if (_explored._count__links_skip > 0); else { break; }
                                            if (((_explored._count__links_skip / _explored._count__links) > 0.25) &#038;&#038; (_explored._length__links_text / _explored._length__all_text) < 0.05) { break; }</p>
<p>                                        default:
                                            $D.debugOutline(_node, 'clean-before', 'link-density');
                                            return;
                                    }
                                }
                            }	</p>
<p>                        //	floating
                        //	========
                            if ($D.parseOptions._elements_floating.indexOf('|'+_tag_name+'|') > -1)
                            {
                                _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                                if (_explored &#038;&#038; _explored._is__unskippable); else
                                {
                                    switch (true)
                                    {
                                        case (_explored._length__plain_text > (65 * 3 * 2)):
                                        case ($D.language == 'cjk' &#038;&#038; (_explored._length__plain_text > (65 * 3 * 1))):
                                        case (_global__exploreNodeToBuildHTMLFor &#038;&#038; (_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.25):
                                        case (_global__exploreNodeToBuildHTMLFor &#038;&#038; (_explored._count__plain_words / _global__exploreNodeToBuildHTMLFor._count__plain_words) > 0.25):
                                        case ((_explored._length__plain_text < 25) &#038;&#038; (_explored._length__links_text < 25) &#038;&#038; ((_explored._count__images_large + _explored._count__images_medium) > 0)):
                                        case (_node.getElementsByTagName &#038;&#038; (_explored._length__plain_text < (65 * 3 * 1)) &#038;&#038; ((_node.getElementsByTagName('h1').length + _node.getElementsByTagName('h2').length + _node.getElementsByTagName('h3').length + _node.getElementsByTagName('h4').length) > 0)):
                                            break;</p>
<p>                                        default:
                                            var _float = $CJ(_node).css('float');
                                            if (_float == 'left' || _float == 'right'); else { break; }
                                            if ((_explored._length__links_text == 0) &#038;&#038; ((_explored._count__images_large + _explored._count__images_medium) > 0)) { break; }</p>
<p>                                            $D.debugOutline(_node, 'clean-before', 'floating');
                                            return;
                                    }
                                }
                            }</p>
<p>                        //	above target
                        //	============
                            if (_custom_mode == 'above-the-target')
                            {
                                //  is ignored?
                                if ($D.parseOptions._elements_above_target_ignore.indexOf('|'+_tag_name+'|') > -1)
                                {
                                    _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                                    if (_explored &#038;&#038; _explored._is__unskippable); else
                                    {
                                        $D.debugOutline(_node, 'clean-before', 'above-target');
                                        return;
                                    }
                                }</p>
<p>                                //  is image?
                                if (_tag_name == 'img')
                                {
                                    _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                                    if (_explored &#038;&#038; _explored._is__unskippable); else
                                    {
                                        if (_explored._is__image_large); else
                                        {
                                            $D.debugOutline(_node, 'clean-before', 'above-target');
                                            return;
                                        }
                                    }
                                }</p>
<p>                                //  has too many links?
                                //if (_node.getElementsByTagName &#038;&#038; _node.getElementsByTagName('a').length > 5)
                                //    { $D.debugOutline(_node, 'clean-before', 'above-target'); return; }
                            }</p>
<p>                        //  headers that are images
                        //  =======================
                            if (_tag_name.match(/^h(1|2|3|4|5|6)$/gi))
                            {
                                _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                                if (_explored &#038;&#038; _explored._is__unskippable); else
                                {
                                    switch (true)
                                    {
                                        case ((_explored._length__plain_text < 10) &#038;&#038; ((_explored._count__images_small + _explored._count__images_medium + _explored._count__images_large + _explored._count__images_skip) > 0)):
                                            $D.debugOutline(_node, 'clean-before', 'skip-heading');
                                            return;
                                    }
                                }
                            }</p>
<p>                    //	start tag
                    //	=========
                        if ($D.parseOptions._elements_ignore_tag.indexOf('|'+_tag_name+'|') > -1); else
                        {
                            /* mark */	_pos__start__before = _global__the_html.length;
                            /* add */	_global__the_html += '<'+_tag_name;</p>
<p>                            //	attributes
                            //	==========</p>
<p>                                //	allowed attributes
                                if (_tag_name in $D.parseOptions._elements_keep_attributes)
                                {
                                    for (var i=0, _i=$D.parseOptions._elements_keep_attributes[_tag_name].length; i<_i; i++)
                                    {
                                        var 
                                            _attribute_name = $D.parseOptions._elements_keep_attributes[_tag_name][i],
                                            _attribute_value = _node.getAttribute(_attribute_name)
                                        ;</p>
<p>                                        //	if present
                                        if (_attribute_value > '')
                                            { _global__the_html += ' '+_attribute_name+'="'+(_attribute_value)+'"'; }
                                    }
                                }</p>
<p>                                //	keep ID for all elements
                                var _id_attribute = _node.getAttribute('id');
                                if (_id_attribute > '')
                                    { _global__the_html += ' id="'+_id_attribute+'"'; }</p>
<p>                                //	links target NEW
                                if (_tag_name == 'a')
                                    { _global__the_html += ' target="_blank"'; }</p>
<p>                            //	close start
                            //	===========
                                if ($D.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1) { _global__the_html += ' />'; }
                                else { _global__the_html += '>';}</p>
<p>                            /* mark */ _pos__start__after = _global__the_html.length;
                        }</p>
<p>                    //	child nodes
                    //	===========
                        if ($D.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1); else
                        {
                            for (var i=0, _i=_node.childNodes.length; i<_i; i++)
                                { _recursive(_node.childNodes[i]); }
                        }</p>
<p>                    //	end tag
                    //	=======
                        switch (true)
                        {
                            case (($D.parseOptions._elements_ignore_tag.indexOf('|'+_tag_name+'|') > -1)):
                                return;</p>
<p>                            case (($D.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1)):
                                /* mark */ 	_pos__end__before = _global__the_html.length;
                                /* mark */ 	_pos__end__after = _global__the_html.length;
                                break;</p>
<p>                            default:
                                /* mark */ 	_pos__end__before = _global__the_html.length;
                                /* end */ 	_global__the_html += '</'+_tag_name+'>';
                                /* mark */ 	_pos__end__after = _global__the_html.length;
                                break;
                        }</p>
<p>                    //	clean -- after
                    //	=====</p>
<p>                        //	largeObject classes
                        if (_tag_name == 'iframe' || _tag_name == 'embed' || _tag_name == 'object')
                        {
                            _global__the_html = ''
                                + _global__the_html.substr(0, _pos__start__before)
                                + '</p>
<div class="readableLargeObjectContainer">'
                                + 	_global__the_html.substr(_pos__start__before, (_pos__end__after - _pos__start__before))
                                + '</div>
<p>'
                            ;
                            return;
                        }</p>
<p>                        //	add image classes
                        if (_tag_name == 'img')
                        {
                            _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                            if (_explored &#038;&#038; _explored._is__unskippable); else
                            {
                                switch (true)
                                {
                                    case (_explored._is__image_skip):
                                        $D.debugOutline(_node, 'clean-after', 'skip-img');
                                        _global__the_html = _global__the_html.substr(0, _pos__start__before);
                                        return;</p>
<p>                                    case (_explored._is__image_large):</p>
<p>                                        //  add float class -- for images too narrow/tall
                                        //  remove width/height -- only for large images</p>
<p>                                        //  http://www.wired.com/threatlevel/2011/05/gps-gallery/?pid=89&#038;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/</p>
<p>                                        _global__the_html = ''
                                            + _global__the_html.substr(0, _pos__start__before)
                                            + '</p>
<div class="readableLargeImageContainer'
                                            + 	(($CJ(_node).width() <= 250) &#038;&#038; ($CJ(_node).height() >= 250) ? ' float' : '')
                                            + '">'
                                            + 	_global__the_html.substr(_pos__start__before, (_pos__end__after - _pos__start__before)).replace(/width="([^=]+?)"/gi, '').replace(/height="([^=]+?)"/gi, '')
                                            + '</div>
<p>'
                                        ;
                                        return;
                                }
                            }
                        }</p>
<p>                        //	large images in links
                        if (_tag_name == 'a')
                        {
                            _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                            switch (true)
                            {
                                case (_explored._count__images_large == 1):
                                    _global__the_html = ''
                                        + _global__the_html.substr(0, _pos__start__after-1)
                                        + ' class="readableLinkWithLargeImage">'
                                        + 	_global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after))
                                        + '</a>'
                                    ;
                                    return;</p>
<p>                                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))
                                        + '</a>'
                                    ;
                                    return;
                            }		
                        }</p>
<p>                        //	too much content
                        if ($D.parseOptions._elements_too_much_content.indexOf('|'+_tag_name+'|') > -1)
                        {
                            _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                            if (_explored &#038;&#038; _explored._is__unskippable); else
                            {
                                switch (true)
                                {
                                    case (_tag_name == 'h1' &#038;&#038; (_explored._length__all_text > (65 * 2))):
                                    case (_tag_name == 'h2' &#038;&#038; (_explored._length__all_text > (65 * 2 * 3))):
                                    case ((_tag_name.match(/^h(3|4|5|6)$/) != null) &#038;&#038; (_explored._length__all_text > (65 * 2 * 5))):
                                    case ((_tag_name.match(/^(b|i|em|strong)$/) != null) &#038;&#038; (_explored._length__all_text > (65 * 5 * 5))):
                                        $D.debugOutline(_node, 'clean-after', 'too-much-content');
                                        _global__the_html = ''
                                            + _global__the_html.substr(0, _pos__start__before)
                                            + _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after))
                                        ;
                                        return;
                                }
                            }
                        }		</p>
<p>                        //	empty elements
                        switch (true)
                        {
                            case (($D.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1)):
                            case (($D.parseOptions._elements_ignore_tag.indexOf('|'+_tag_name+'|') > -1)):
                            case (_tag_name == 'td'):
                                break;</p>
<p>                            default:
                                var _contents = _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after));
                                    _contents = _contents.replace(/(<br \/>)/gi, '');
                                    _contents = _contents.replace(/(</p>
<hr \/>
<p>)/gi, '');</p>
<p>                                //  for rows, clear empty cells
                                if (_tag_name == 'tr')
                                {
                                    _contents = _contents.replace(/
<td[^>]*?>/gi, '');
                                    _contents = _contents.replace(/<\/td>/gi, '');
                                }</p>
<p>                                //  for tables, clear empty rows
                                if (_tag_name == 'table')
                                {
                                    _contents = _contents.replace(/
<tr[^>]*?>/gi, '');
                                    _contents = _contents.replace(/<\/tr>/gi, '');
                                }</p>
<p>                                var _contentsLength = $D.measureText__getTextLength(_contents);</p>
<p>                                _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                                if (_explored &#038;&#038; _explored._is__unskippable); else
                                {
                                    switch (true)
                                    {
                                        case (_contentsLength == 0 &#038;&#038; _tag_name == 'p'):
                                            _global__the_html = _global__the_html.substr(0, _pos__start__before) + '</p>
<p>';
                                            return;</p>
<p>                                        case (_contentsLength == 0):
                                        case ((_contentsLength < 5) &#038;&#038; ($D.parseOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1)):
                                            $D.debugOutline(_node, 'clean-after', 'blank');
                                            _global__the_html = _global__the_html.substr(0, _pos__start__before);
                                            return;
                                    }
                                }</p>
<p>                                break;
                        }</p>
<p>                        //	too much missing
                        if ($D.parseOptions._elements_link_density.indexOf('|'+_tag_name+'|') > -1)
                        {
                            _explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
                            if (_explored &#038;&#038; _explored._is__unskippable); else
                            {
                                var
                                    _contents = _global__the_html
                                                .substr(_pos__start__after, (_pos__end__before - _pos__start__after))
                                                    .replace(/(<([^>]+)>)/gi, ''),
                                    _contentsLength = $D.measureText__getTextLength(_contents),
                                    _initialLength = 0
                                        + _explored._length__all_text 
                                        + (_explored._count__images_small 					* 10)
                                        + (_explored._count__images_skip 					* 10)
                                        + (_node.getElementsByTagName('iframe').length 		* 10)
                                        + (_node.getElementsByTagName('object').length 		* 10)
                                        + (_node.getElementsByTagName('embed').length 		* 10)
                                        + (_node.getElementsByTagName('button').length 		* 10)
                                        + (_node.getElementsByTagName('input').length 		* 10)
                                        + (_node.getElementsByTagName('select').length 		* 10)
                                        + (_node.getElementsByTagName('textarea').length 	* 10)
                                ;</p>
<p>                                //	too much missing
                                switch (true)
                                {
                                    case (!(_contentsLength > 0)):
                                    case (!(_initialLength > 0)):
                                    case (!((_contentsLength / _initialLength) < 0.5)):
                                    case (!(($D.language == 'cjk') &#038;&#038; (_contentsLength / _initialLength) < 0.1)):
                                    case ((_global__exploreNodeToBuildHTMLFor &#038;&#038; ((_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.25))):
                                    case (($D.language == 'cjk') &#038;&#038; (_global__exploreNodeToBuildHTMLFor &#038;&#038; ((_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.1))):
                                        break;</p>
<p>                                    default:
                                        $D.debugOutline(_node, 'clean-after', 'missing-density');
                                        _global__the_html = _global__the_html.substr(0, _pos__start__before);
                                        return;
                                }
                            }
                        }                </p>
<p>                    //	return
                        return;
                };</p>
<p>            //	actually do it
            _recursive(_nodeToBuildHTMLFor);</p>
<p>            //	return html
            return _global__the_html;
        };</p>
<p>    //  build html for node }</p>
<p>    //  isolate title in html {
    //  =======================</p>
<p>        $D.articleTitleMarker__start = '</p>
<div id="articleHeader">
<h1>';
        $D.articleTitleMarker__end = '</h1>
</div>
<p>';</p>
<p>        $D.getContent__find__hasIsolatedTitleInHTML = function (_html)
        {
            return (_html.substr(0, $D.articleTitleMarker__start.length) == $D.articleTitleMarker__start);
        };</p>
<p>        $D.getContent__find__getIsolatedTitleInHTML = function (_html)
        {
            //  is it there?
            if ($D.getContent__find__hasIsolatedTitleInHTML(_html)); else { return ''; }</p>
<p>            //  regex
            var 
                _getTitleRegex = new RegExp($D.articleTitleMarker__start + '(.*?)' + $D.articleTitleMarker__end, 'i'),
                _getTitleMatch = _html.match(_getTitleRegex)
            ;</p>
<p>            //  match?
            if (_getTitleMatch); else { return ''; }</p>
<p>            //  return
            return _getTitleMatch[1];
        };</p>
<p>        $D.getContent__find__isolateTitleInHTML = function (_html, _document_title)
        {
            //  use document title
            if ($D.$document.find('body').attr($D.parseOptions._use_document_title_attribute) == $D.parseOptions._use_document_title_attribute_value)
                { return _html; }</p>
<p>            //  can't just use (h1|h2|h3|etc)
            //      we want to try them in a certain order</p>
<p>            var
                _heading_pregs = [
                    /<(h1)[^>]*?>([\s\S]+?)<\/\1>/gi,
                    /<(h2)[^>]*?>([\s\S]+?)<\/\1>/gi,
                    /<(h3|h4|h5|h6)[^>]*?>([\s\S]+?)<\/\1>/gi
                ],
                _secondary_headings = '|h2|h3|h4|h5|h6|',
                _search_document_title = ' ' + _document_title.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ') + ' '
            ;</p>
<p>            //  loop pregs
            for (var i=0, _i=_heading_pregs.length; i<_i; i++)
            {
                //  exec
                var _match = _heading_pregs[i].exec(_html);</p>
<p>                //  return?
                switch (true)
                {
                    case (!(_match)):
                    case (!(_heading_pregs[i].lastIndex > -1)):
                        //  will continue loop
                        break;</p>
<p>                    default:</p>
<p>                        //  measurements
                        var
                            _heading_end_pos = _heading_pregs[i].lastIndex,
                            _heading_start_pos = (_heading_end_pos - _match[0].length),</p>
<p>                            _heading_type = _match[1],
                            _heading_text = _match[2].replace(/<\s*br[^>]*>/gi, '').replace(/[\n\r]+/gi, ''),
                            _heading_text_plain = _heading_text.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ');
                            _heading_length = $D.measureText__getTextLength(_heading_text_plain),
                            _heading_words = [],</p>
<p>                            _to_heading_text = _html.substr(0, _heading_start_pos),
                            _to_heading_length = $D.measureText__getTextLength(_to_heading_text.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' '))
                        ;</p>
<p>                        //  return?
                        switch (true)
                        {
                            case (!(_heading_length > 5)):
                            case (!(_heading_length < (65 * 3))):
                            case (!(_to_heading_length < (65 * 3 * 2))):
                                //  will continue for loop
                                break;</p>
<p>                            case ((_secondary_headings.indexOf('|' + _heading_type + '|') > -1)):
                                //  words in this heading
                                _heading_words = _heading_text_plain.split(' ');</p>
<p>                                //  count words present in title
                                for (var j=0, _j=_heading_words.length, _matched_words=''; j<_j; j++) {
                                    if (_search_document_title.indexOf(' ' + _heading_words[j] + ' ') > -1) {
                                        _matched_words += _heading_words[j] + ' ';
                                    }
                                }</p>
<p>                                //  break continues for loop
                                //      nothing goes to switch's default</p>
<p>                                //  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) &#038;&#038; (_search_document_title.indexOf(_heading_text_plain) > -1)):</p>
<p>                                        //  if it's slightly smaler, but is exactly at the begging or the end
                                        case ((_heading_length > 10) &#038;&#038; ((_search_document_title.indexOf(_heading_text_plain) == 1) || (_search_document_title.indexOf(_heading_text_plain) == (_search_document_title.length - 1 - _heading_text_plain.length)))):</p>
<p>                                            _no_break = true;
                                            break;
                                    }</p>
<p>                                    //  break?
                                    //  ======
                                        var _break = false;
                                        switch (true)
                                        {
                                            //  no break?
                                            case (_no_break):
                                                break;</p>
<p>                                            // heading too long? -- if not h2
                                            case ((_heading_length > ((_search_document_title.length - 2) * 2)) &#038;&#038; (_heading_type != 'h2')):</p>
<p>                                            //  heading long enough?
                                            case ((_heading_length < Math.ceil((_search_document_title.length - 2) * 0.50))):</p>
<p>                                            //  enough words matched?
                                            case ((_heading_length < 25) &#038;&#038; (_matched_words.length < Math.ceil(_heading_length * 0.75))):
                                            case ((_heading_length < 50) &#038;&#038; (_matched_words.length < Math.ceil(_heading_length * 0.65))):
                                            case ((_matched_words.length < Math.ceil(_heading_length * 0.55))):</p>
<p>                                                _break = true;
                                                break;
                                        }</p>
<p>                                    //  break?
                                    //  ======
                                        if (_break) { break; }</p>
<p>                            default:
                                //  this is the title -- do isolation; return
                                return ''
                                    + $D.articleTitleMarker__start
                                    +   _heading_text 
                                    + $D.articleTitleMarker__end
                                    + $D.getContent__find__isolateTitleInHTML__balanceDivsAtStart(_html.substr(_heading_end_pos))
                                ;
                        }</p>
<p>                        break;
                }
            }</p>
<p>            //  return unmodified
            return _html;
        };</p>
<p>        $D.getContent__find__isolateTitleInHTML__balanceDivsAtStart__substrCount = function (_haystack, _needle, _offset, _length)
        {
            // http://kevin.vanzonneveld.net
            // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
            // +   bugfixed by: Onno Marsman
            // +   improved by: Brett Zamir (http://brett-zamir.me)
            // +   improved by: Thomas
            // *     example 1: substr_count('Kevin van Zonneveld', 'e');
            // *     returns 1: 3
            // *     example 2: substr_count('Kevin van Zonneveld', 'K', 1);
            // *     returns 2: 0
            // *     example 3: substr_count('Kevin van Zonneveld', 'Z', 0, 10);
            // *     returns 3: false</p>
<p>            var cnt = 0;</p>
<p>            _haystack += '';
            _needle += '';
            if (isNaN(_offset)) { _offset = 0; }
            if (isNaN(_length)) { _length = 0; }
            if (_needle.length == 0) { return false; }</p>
<p>            _offset--;</p>
<p>            while ((_offset = _haystack.indexOf(_needle, _offset + 1)) != -1) {
                if (_length > 0 &#038;&#038; (_offset + _needle.length) > _length) {
                    return false;
                }
                cnt++;
            }</p>
<p>            return cnt;
        };</p>
<p>        $D.getContent__find__isolateTitleInHTML__balanceDivsAtStart = function (_html)
        {
            //  easy; remove all </X> at begining
            var 
                _h = _html.replace(/^(\s*<\s*\/\s*[^>]+>)+/gi, ''),
                _r = /<\s*\/\s*([^\s>]+?)[^>]*>/gi,
                _the_end_tag = '</div>
<p>',
                _the_start_tag = '</p>
<div',
                _end_tag_pos = -1,
                _last_pos = 0
            ;</p>
<p>            //  remove all unbalanced _end_tags
            for (var _i=0; _i<100; _i++)
            {
                _end_tag_pos = _h.indexOf(_the_end_tag, _last_pos);
                if (_end_tag_pos > -1); else { break; }</p>
<p>                var 
                    _sub = _h.substr(0, _end_tag_pos),
                    _start_tags = $D.getContent__find__isolateTitleInHTML__balanceDivsAtStart__substrCount(_sub, _the_start_tag, _last_pos),
                    _end_tags = ((_start_tags > 0) ? (1 + $D.getContent__find__isolateTitleInHTML__balanceDivsAtStart__substrCount(_sub, _the_end_tag, _last_pos)) : false)
                ;</p>
<p>                if ((!(_start_tags > 0)) || (_start_tags < _end_tags))
                {
                    _h = ''
                        + _h.substr(0, _end_tag_pos)
                        + _h.substr(_end_tag_pos + _the_end_tag.length)
                    ;</p>
<p>                    _last_pos = _end_tag_pos;
                }
                else
                {
                    _last_pos = _end_tag_pos + 1;
                }
            }</p>
<p>            $D.log(_h);</p>
<p>            return _h;
        };</p>
<p>    //  isolate title in html }</p>
<p>    //  find in page {
    //  ==============</p>
<p>        $D.getContent__findInPage = function (_pageWindow)
        {
            //	calculations
            //	============</p>
<p>                var
                    _firstCandidate = false,
                    _secondCandidate = false,
                    _targetCandidate = false
                ;</p>
<p>                $D.debugTimerStart('ExploreAndGetStuff');
                    var	_stuff = $D.getContent__exploreNodeAndGetStuff(_pageWindow.document.body);
                $D.debugRemember('ExploreAndGetStuff', $D.debugTimerEnd()+'ms');</p>
<p>                $D.debugTimerStart('ProcessFirst');
                    var _processedCandidates = $D.getContent__processCandidates__first(_stuff._candidates);
                    _firstCandidate = _processedCandidates[0];
                    _targetCandidate = _firstCandidate;
                $D.debugRemember('ProcessFirst', $D.debugTimerEnd()+'ms');</p>
<p>                //  debug
                if ($D.debug)
                {
                    //  debug first candidates
                    $D.log('First 5 Main Candidates:');
                    for (var x in _processedCandidates)
                    {
                        if (x == 5) { break; }
                        $D.log(_processedCandidates[x], _processedCandidates[x].__node);
                    }</p>
<p>                    //  highlight first
                    $D.debugOutline(_firstCandidate.__node, 'target', 'first');
                }</p>
<p>                //  in case we stop
                $D.debugRemember('Target', 'first');</p>
<p>                //  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;</p>
<p>                    default:</p>
<p>                        $D.debugTimerStart('ProcessSecond');
                            var _processedCandidatesSecond = $D.getContent__processCandidates__second(_processedCandidates);
                            _secondCandidate = _processedCandidatesSecond[0];
                        $D.debugRemember('ProcessSecond', $D.debugTimerEnd()+'ms');</p>
<p>                        //  they're the same
                        if (_firstCandidate.__node == _secondCandidate.__node) { break; }</p>
<p>                        //  debug
                        if ($D.debug)
                        {
                            //  log second candidates
                            $D.log('First 5 Second Candidates:');
                            for (var x in _processedCandidatesSecond)
                            {
                                if (x == 5) { break; }
                                $D.log(_processedCandidatesSecond[x], _processedCandidatesSecond[x].__node);
                            }</p>
<p>                            //  highlight second
                            $D.debugOutline(_secondCandidate.__node, 'target', 'second');
                        }</p>
<p>                        //  compute again
                        //  =============
                            _firstCandidate['__points_history_final'] = $D.getContent__computePointsForCandidate__third(_firstCandidate, _firstCandidate);
                            _firstCandidate['__points_final'] = _firstCandidate.__points_history_final[0];</p>
<p>                            _secondCandidate['__points_history_final'] = $D.getContent__computePointsForCandidate__third(_secondCandidate, _firstCandidate);
                            _secondCandidate['__points_final'] = _secondCandidate.__points_history_final[0];</p>
<p>                        //  log results
                        //  ===========
                            if ($D.debug)
                            {
                                $D.log('The 2 Candidates:');
                                $D.log(_firstCandidate);
                                $D.log(_secondCandidate);
                            }</p>
<p>                        //  are we selecting _second?
                        //  =========================
                            switch (true)
                            {
                                case ((_secondCandidate.__candidate_details._count__lines_of_65_characters < 20) &#038;&#038; (_secondCandidate.__points_final / _firstCandidate.__points_final) > 1):
                                case ((_secondCandidate.__candidate_details._count__lines_of_65_characters > 20) &#038;&#038; (_secondCandidate.__points_final / _firstCandidate.__points_final) > 0.9):
                                case ((_secondCandidate.__candidate_details._count__lines_of_65_characters > 50) &#038;&#038; (_secondCandidate.__points_final / _firstCandidate.__points_final) > 0.75):
                                    _targetCandidate = _secondCandidate;
                                    $D.debugRemember('Target', 'second');
                                    break;
                            }</p>
<p>                        //  print points
                        //  ============
                            if ($D.debug)
                            {
                                $D.debugRemember('PointsFirst', _firstCandidate['__points_history_final'][0].toFixed(2));
                                $D.debugRemember('PointsSecond', _secondCandidate['__points_history_final'][0].toFixed(2));
                            }</p>
<p>                        break;
                }</p>
<p>                //  highlight target
                //  ================
                    if ($D.debug)
                    {
                        $CJ(_targetCandidate.__node).css({
                            'box-shadow': 
                                'inset 0px 0px 50px rgba(255, 255, 0, 0.95), 0px 0px 50px rgba(255, 255, 0, 0.95)'
                        });
                    }</p>
<p>            //	get html
            //	========
                $D.debugTimerStart('BuildHTML');
                    var _html = $D.getContent__buildHTMLForNode(_targetCandidate.__node, 'the-target');
                        _html = _html.substr((_html.indexOf('>')+1))
                        _html = _html.substr(0, _html.lastIndexOf('<'));
                $D.debugRemember('BuildHTML', $D.debugTimerEnd()+'ms');</p>
<p>                $D.debugTimerStart('BuildHTMLPregs');
                    _html = _html.replace(/<(blockquote|div|p|td|li)([^>]*)>(\s*<br \/>)+/gi, '<$1$2>');
                    _html = _html.replace(/(<br \/>\s*)+<\/(blockquote|div|p|td|li)>/gi, '</$2>');
                    _html = _html.replace(/(<br \/>\s*)+<(blockquote|div|h\d|ol|p|table|ul|li)([^>]*)>/gi, '<$2$3>');
                    _html = _html.replace(/<\/(blockquote|div|h\d|ol|p|table|ul|li)>(\s*<br \/>)+/gi, '</$1>');
                    _html = _html.replace(/(</p>
<hr \/>
<p>\s*</p>
<hr \/>
<p>\s*)+/gi, '</p>
<hr />
<p>');
                    _html = _html.replace(/(<br \/>\s*<br \/>\s*)+/gi, '</p>
<p>');
                $D.debugRemember('BuildHTMLPregs', $D.debugTimerEnd()+'ms');</p>
<p>            //	return
            //	======
                return {
                    '_html': _html,
                    '_links': _stuff._links,
                    '_targetCandidate': _targetCandidate,
                    '_firstCandidate': _firstCandidate
                };
        };</p>
<p>    //  find in page }</p>
<p>    //  start {
    //  =======</p>
<p>        $D.start = function ()
        {
            //	get content
            //	===========
                var 
                    _found = $D.getContent__findInPage($D.window),
                    _found_links = _found._links,
                    _targetNode = _found._targetCandidate.__node,
                    _$targetNode = $CJ(_targetNode),
                    _aboveNodes = []
                ;</p>
<p>            //	RTL
            //	===
                switch (true)
                {
                    case (_$targetNode.attr('dir') == 'rtl'):
                    case (_$targetNode.css('direction') == 'rtl'):
                        $D.makeRTL();
                        break;
                }</p>
<p>            //  get html
            //  ========
                var 
                    _foundHTML = _found._html,
                    _firstFragmentBeforeProcessing = $D.nextPage__getFirstFragment(_foundHTML),
                    _documentTitle = ($D.document.title > '' ? $D.document.title : '')
                ;</p>
<p>            //  get title
            //  =========</p>
<p>                //  has title already?
                _foundHTML = $D.getContent__find__isolateTitleInHTML(_foundHTML, _documentTitle);
                $D.articleTitle = $D.getContent__find__getIsolatedTitleInHTML(_foundHTML);
                $D.debugRemember('TitleSource', 'target');</p>
<p>                //  get html above?
                if ($D.articleTitle > ''); else
                {
                    //  get html above target?
                    //  ======================</p>
<p>                        //  global vars:
                        //      _found
                        //      _foundHTML
                        //      _documentTitle
                        //      _aboveNodes</p>
<p>                        var 
                            _prevNode = _found._targetCandidate.__node,
                            _prevHTML = '',
                            _aboveHTML = '',
                            _differentTargets = (_found._firstCandidate.__node != _found._targetCandidate.__node)
                        ;</p>
<p>                        (function () 
                        {</p>
<p>                            while (true)
                            {
                                //  the end?
                                switch (true)
                                {
                                    case (_prevNode.tagName &#038;&#038; (_prevNode.tagName.toLowerCase() == 'body')):
                                    case (_differentTargets &#038;&#038; (_prevNode == _found._firstCandidate.__node)):
                                        //  enough is enough
                                        return;
                                }</p>
<p>                                //  up or sideways?
                                if (_prevNode.previousSibling); else
                                {
                                    _prevNode = _prevNode.parentNode;
                                    continue;
                                }</p>
<p>                                //	previous
                                _prevNode = _prevNode.previousSibling;</p>
<p>                                //	outline -- element might be re-outlined, when buildHTML is invoked
                                if ($D.debug) { $D.debugOutline(_prevNode, 'target', 'add-above'); }</p>
<p>                                //	get html; add
                                _prevHTML = $D.getContent__buildHTMLForNode(_prevNode, 'above-the-target');
                                _aboveHTML = _prevHTML + _aboveHTML;
                                _aboveNodes.unshift(_prevNode);</p>
<p>                                //  isolate title
                                _aboveHTML = $D.getContent__find__isolateTitleInHTML(_aboveHTML, _documentTitle);</p>
<p>                                //	finished?
                                switch (true)
                                {
                                    case ($D.measureText__getTextLength(_aboveHTML.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ')) > (65 * 3 * 3)):
                                    case ($D.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
                                        return;
                                }
                            }</p>
<p>                        })();</p>
<p>                    //  is what we found any good?
                    //  ==========================
                        switch (true)
                        {
                            case ($D.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
                            case (_differentTargets &#038;&#038; (_aboveHTML.split('<a ').length < 3) &#038;&#038; ($D.measureText__getTextLength(_aboveHTML.replace(/<[^>]+?>/gi, '').replace(/\s+/gi, ' ')) < (65 * 3))):
                                _foundHTML = _aboveHTML + _foundHTML;
                                break;</p>
<p>                            default:
                                _aboveHTML = '';
                                _aboveNodes = [];
                                break;
                        }</p>
<p>                    //  set title
                    //  =========</p>
<p>                        $D.articleTitle = $D.getContent__find__getIsolatedTitleInHTML(_foundHTML);
                        $D.debugRemember('TitleSource', 'above_HTML');</p>
<p>                        //  get document title?
                        if ($D.articleTitle > ''); else
                        {
                            //  if all else failed, get document title
                            //  ======================================</p>
<p>                                //  global vars:
                                //      _foundHTML
                                //      _documentTitle</p>
<p>                                (function ()
                                {
                                    //  return?
                                    //  =======
                                        if (_documentTitle > ''); else { return; }</p>
<p>                                    //  vars
                                        var
                                            _doc_title_parts = [],
                                            _doc_title_pregs =
                                            [
                                                /( [-][-] |( [-] )|( [>][>] )|( [<][<] )|( [|] )|( [\/] ))/i,
                                                /(([:] ))/i
                                            ]
                                        ;</p>
<p>                                    //	loop through pregs
                                    //  ==================
                                        for (var i=0, _i=_doc_title_pregs.length; i<_i; i++)
                                        {
                                            //	split
                                            _doc_title_parts = _documentTitle.split(_doc_title_pregs[i]);</p>
<p>                                            //	break if we managed a split
                                            if (_doc_title_parts.length > 1) { break; }
                                        }</p>
<p>                                    //	sort title parts -- longer goes higher up -- i.e. towards 0
                                    //	================
                                        _doc_title_parts.sort(function (a, b)
                                        {
                                            switch (true)
                                            {
                                                case (a.length > b.length): return -1;
                                                case (a.length < b.length): return 1;
                                                default: return 0;
                                            }
                                        });</p>
<p>                                    //	set title -- first part, if more than one word; otherwise, whole
                                    //  =========
                                        _foundHTML = ''
                                            + $D.articleTitleMarker__start
                                            +   (_doc_title_parts[0].split(/\s+/i).length > 1 ? _doc_title_parts[0] : _documentTitle) 
                                            + $D.articleTitleMarker__end 
                                            + _foundHTML
                                        ;</p>
<p>                                })();</p>
<p>                            //  set title
                            //  =========</p>
<p>                                $D.articleTitle = $D.getContent__find__getIsolatedTitleInHTML(_foundHTML);
                                $D.debugRemember('TitleSource', 'document_title');
                        }
                }</p>
<p>            //	remember
            //	========
                $D.debugRemember('theTarget', _found._targetCandidate.__node);
                $D.debugRemember('firstCandidate', _found._firstCandidate.__node);</p>
<p>            //	result
            //  ======</p>
<p>                $D.nextPage__firstFragment__firstPage = _firstFragmentBeforeProcessing;
                $D.nextPage__firstFragment__lastPage = $D.nextPage__getFirstFragment(_foundHTML);
                $D.nextPage__firstLinks = _found_links;</p>
<p>                var
                    _result = {
                        '_html': _foundHTML,
                        '_title': $D.articleTitle,
                        '_rtl': $D.rtl
                    }
                ;</p>
<p>                //  add elements
                _result['_elements'] = _aboveNodes;
                _result['_elements'].push(_found._targetCandidate.__node);</p>
<p>            //  return
            //  ======
                $D.callbacks.finished(_result);
        };</p>
<p>    //  start }    </p>
<p>    //  return self
    //  ===========
        return $D;
}
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/*!
 *  ClearlyComponent__highlight
 *  Evernote Clearly's highlighting algorithm/functionality as an embeddable component.
 *  Copyright 2013, Evernote Corporation
 *
 *  Usage:
 *  ======
 *
 *      // define
 *      window.ClearlyComponent__highlight = {
 *          'callbacks': {
 *              'highlightAdded': someFunction(),
 *              'highlightDeleted': someFunction(),
 *              'arbitraryRangeExclusion': someFunction()
 *          },
 *          'settings': {
 *              'imgPath': 'string',
 *              'onInsertCSSUseThisId': 'string',
 *              'highlightingEnabledCSSClass': 'string',
 *              'highlightElementCSSClass': 'string',
 *              'highlightElementIdAttribute': 'string',
 *              'highlightElementFirstCSSClass': 'string',
 *              'highlightElementLastCSSClass': 'string',
 *              'highlightElementDeleteCSSClass': 'string',
 *              'highlightElementDeleteIdPrefix': 'string',
 *              'highlightCleanHTMLElementStart': 'string',
 *              'highlightCleanHTMLElementEnd': 'string',
 *              'elementWhichMustContainAllHighlights': _dom_element,
 *              'elementsToAttachMouseHandlersTo': [
 *                  _dom_element
 *              ]
 *          },
 *          'window': window,
 *          'document': document,
 *          'jQuery': window.jQuery
 *      };
 *
 *      // init -- will return false, if something goes wrong
 *      window.ClearlyComponent__highlight = initClearlyComponent__highlight(window.ClearlyComponent__highlight);
 *
 *      //  setup
 *      window.ClearlyComponent__highlight.insertCSS();
 *      window.ClearlyComponent__highlight.addMouseHandlers();
 *
 *      //  enable
 *      window.ClearlyComponent__highlight.enable();
 *
 *      // publcly available/overridable
 *      window.ClearlyComponent__highlight.debug
 *
 */</p>
<p>/*
    changes:
    ========
        $R => $H
        $R.highlight => $H.enabled</p>
<p>    to do:
    ======
*/</p>
<p>function initClearlyComponent__highlight(_paramInstance)
{
    //  global instance reference {
    //  ===========================</p>
<p>        //  null; return
        if (_paramInstance); else { return false; }</p>
<p>        //  shorthand
        $H = _paramInstance;</p>
<p>    //  global instance reference }</p>
<p>    //  required vars {
    //  ===============</p>
<p>        //  the component instance object must already be created,
        //  when the init function is called. it must have these vars set:</p>
<p>        switch (true)
        {
            case (!($H.settings)):
            case (!($H.settings.imgPath)):</p>
<p>            case (!($H.window)):
            case (!($H.document)):
            case (!($H.document.body)):</p>
<p>            case (!($H.jQuery)):</p>
<p>                if ($H.debug)
                {
                    console.log(!($H.settings));
                    console.log(!($H.settings.imgPath));</p>
<p>                    console.log(!($H.window));
                    console.log(!($H.document));
                    console.log(!($H.document.body));</p>
<p>                    console.log(!($H.jQuery));
                }</p>
<p>                //  something's wrong
                return false;
        }</p>
<p>    //  required vars }</p>
<p>    //  missing settings {
    //  ==================</p>
<p>        //  restrictions
        if ($H.settings.elementWhichMustContainAllHighlights); else { $H.settings.elementWhichMustContainAllHighlights = $H.document.body; }
        if ($H.settings.elementsToAttachMouseHandlersTo); else { $H.settings.elementsToAttachMouseHandlersTo = [$H.document.body]; }</p>
<p>        //  names for stuff
        /* css id */            if ($H.settings.onInsertCSSUseThisId); else             { $H.settings.onInsertCSSUseThisId =            'clearly_highlighting_css'; }
        /* enabled */           if ($H.settings.highlightingEnabledCSSClass); else      { $H.settings.highlightingEnabledCSSClass =     'clearly_highlighting_enabled'; }
        /* element id */        if ($H.settings.highlightElementIdAttribute); else      { $H.settings.highlightElementIdAttribute =     'clearly_highlight_id'; }
        /* element class */     if ($H.settings.highlightElementCSSClass); else         { $H.settings.highlightElementCSSClass =        'clearly_highlight_element'; }
        /* element (first) */   if ($H.settings.highlightElementFirstCSSClass); else    { $H.settings.highlightElementFirstCSSClass =   'clearly_highlight_first'; }
        /* element (first) */   if ($H.settings.highlightElementLastCSSClass); else     { $H.settings.highlightElementLastCSSClass =    'clearly_highlight_last'; }
        /* delete class */      if ($H.settings.highlightElementDeleteCSSClass); else   { $H.settings.highlightElementDeleteCSSClass =  'clearly_highlight_delete_element'; }
        /* delete id prefix */  if ($H.settings.highlightElementDeleteIdPrefix); else   { $H.settings.highlightElementDeleteIdPrefix =  'clearly_highlight_delete__'; }
        /* clean html start */  if ($H.settings.highlightCleanHTMLElementStart); else   { $H.settings.highlightCleanHTMLElementStart =  '<span style="-evernote-highlighted:true; background-color:#f6ee96">'; }
        /* clean html end */    if ($H.settings.highlightCleanHTMLElementEnd); else     { $H.settings.highlightCleanHTMLElementEnd =    '</span>'; }</p>
<p>    //  missing settings }</p>
<p>    //  global vars {
    //  =============</p>
<p>        $CJ = $H.jQuery;</p>
<p>        $H.$window = $CJ($H.window);
        $H.$document = $CJ($H.document);
        $H.$html = $H.$document.find('html');
        $H.$elementWhichMustContainAllHighlights = $CJ($H.settings.elementWhichMustContainAllHighlights);</p>
<p>        $H.enabled = false;</p>
<p>    //  global vars }</p>
<p>    //  parse options {
    //  ===============   </p>
<p>		$H.parseOptions =
		{
			'_elements_ignore': 			        '|button|input|select|textarea|optgroup|command|datalist|--|frame|frameset|noframes|--|style|link|script|noscript|--|canvas|applet|map|--|marquee|area|base|',
			'_elements_ignore_tag': 		        '|form|fieldset|details|dir|--|center|font|span|',</p>
<p>			'_elements_container': 			        '|body|--|article|section|--|div|--|td|--|li|--|dd|dt|',
            '_elements_self_closing': 		        '|br|hr|--|img|--|col|--|source|--|embed|param|--|iframe|',</p>
<p>            '_elements_highlight_protect':          '|video|audio|source|--|object|param|embed|',</p>
<p>            '_elements_keep_attributes':
			{
				'a': 		['href', 'title', 'name'],
				'img': 		['src', 'width', 'height', 'alt', 'title'],</p>
<p>				'video': 	['src', 'width', 'height', 'poster', 'audio', 'preload', 'autoplay', 'loop', 'controls'],
				'audio': 	['src', 'preload', 'autoplay', 'loop', 'controls'],		 
				'source': 	['src', 'type'],</p>
<p>				'object': 	['data', 'type', 'width', 'height', 'classid', 'codebase', 'codetype'],						
				'param': 	['name', 'value'],
				'embed': 	['src', 'type', 'width', 'height', 'flashvars', 'allowscriptaccess', 'allowfullscreen', 'bgcolor'],</p>
<p>				'iframe':	['src', 'width', 'height', 'frameborder', 'scrolling'],</p>
<p>				'td':		['colspan', 'rowspan'],			
				'th':		['colspan', 'rowspan']
			}</p>
<p>		};</p>
<p>    //  parse options }</p>
<p>    //  debug {
    //  =======</p>
<p>        $H.debug = ($H.debug || false);</p>
<p>		if ($H.debug)
		{
		    //  writeLog
		    //  ========
				switch (true)
				{
					case (!(!($H.window.console &#038;&#038; $H.window.console.log))):    $H.writeLog = function (msg) { $H.window.console.log(msg); };       break;
					case (!(!($H.window.opera &#038;&#038; $H.window.opera.postError))):  $H.writeLog = function (msg) { $H.window.opera.postError(msg); };   break;
					default:                                                    $H.writeLog = function (msg) {};                                    break;
				}</p>
<p>            //  log
            //  ===
                $H.log = function ()
                {
                    if ($H.debug); else { return; }
                    for (var i=0, il=arguments.length; i<il ; i++) { $H.writeLog(arguments[i]); }
                    $H.writeLog('-----------------------------------------');
                };
		}
		else
		{
            $H.writeLog 		= function () { return false; };
            $H.log 				= function () { return false; };
        }</p>
<p>    //  debug }</p>
<p>    //  insert css {
    //  ============</p>
<p>        $H.insertCSS = function ()
        {
            var _cssText = ''
            +   '/* selection */ '
            +   'html.'+$H.settings.highlightingEnabledCSSClass+' ::-moz-selection { background: rgba(246, 238, 150, 0.99); } '
            +   'html.'+$H.settings.highlightingEnabledCSSClass+' ::selection { background: rgba(246, 238, 150, 0.99); } '</p>
<p>            +   '/* cursor */ '
            +   'html.'+$H.settings.highlightingEnabledCSSClass+' { '
            +   '   /* cursor and hot-spot position -- requires a default cursor, after the URL one */ '
            +   '} '</p>
<p>            +   '/* highlight tag */ '
            +   'em.'+$H.settings.highlightElementCSSClass+' { '
            +   '   font-style: inherit !important; font-weight: inherit !important; '
            +   '   background-repeat: repeat-x; background-position: top left; background-size: 100% 100%; '
            +   '} '
            +   '/* the delete-buttons are positioned relative to this */ '
            +   'em.'+$H.settings.highlightElementCSSClass+'.'+$H.settings.highlightElementFirstCSSClass+' { position: relative; } '</p>
<p>            +   '/* delete buttons */ '
            +   'em.'+$H.settings.highlightElementCSSClass+' a.'+$H.settings.highlightElementDeleteCSSClass+' { '
            +   '   display: none; cursor: pointer; '
            +   '   padding: 0; margin: 0; line-height: 0; '
            +   '   position: absolute; width: 34px; height: 34px; left: -17px; top: -17px; '
            +   '} '
            +   'em.'+$H.settings.highlightElementCSSClass+' a.'+$H.settings.highlightElementDeleteCSSClass+':hover { background-position: -34px 0px; } '
            ;</p>
<p>            //  create
            var _cssElement = $H.document.createElement('style');
            _cssElement.setAttribute('id', $H.settings.onInsertCSSUseThisId);
            _cssElement.setAttribute('type', 'text/css');
            if (_cssElement.styleSheet) { _cssElement.styleSheet.cssText = _cssText; }
                else { _cssElement.appendChild($H.document.createTextNode(_cssText)); }</p>
<p>            //  append
            $H.$document.find('head').append(_cssElement);
        };</p>
<p>    //  insert css }</p>
<p>    //  selection {
    //  ===========</p>
<p>        $H.sel = {};</p>
<p>        $H.sel.getWindowFromDocument = function (theDocument)
        {
            if (theDocument); else { return null; }</p>
<p>            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;
                };
            }</p>
<p>            return arguments.calee(theDocument);
        };</p>
<p>        $H.sel.getSelection = function (theWindow)
        {
            if (theWindow); else { return null; }</p>
<p>            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;
                };
            }</p>
<p>            return arguments.calee(theWindow);
        };</p>
<p>        $H.sel.getRange = function (selection)
        {
            if (selection); else { return null; }</p>
<p>            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;
                };
            }</p>
<p>            return arguments.calee(selection);
        };</p>
<p>        $H.sel.getRangeHTML = function (range)
        {
            if (range); else { return null; }</p>
<p>            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) {</p>
<p>                    if (range); else { return null; }
                    if (range.commonAncestorContainer &#038;&#038; range.commonAncestorContainer.ownerDocument); else { return null; }</p>
<p>                    var dummy = range.commonAncestorContainer.ownerDocument.createElement("div");
                    dummy.appendChild(range.cloneContents());
                    return dummy.innerHTML;
                };
            }
            else {
                arguments.calee = function (range) {
                    return null;
                };
            }</p>
<p>            return arguments.calee(range);
        };</p>
<p>        $H.sel.getRangeText = function (range)
        {
            if (range); else { return null; }</p>
<p>            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) {</p>
<p>                    if (range); else { return null; }
                    if (range.commonAncestorContainer &#038;&#038; range.commonAncestorContainer.ownerDocument); else { return null; }</p>
<p>                    var dummy = range.commonAncestorContainer.ownerDocument.createElement("div");
                    dummy.appendChild(range.cloneContents());
                    return dummy.textContent;
                };
            }
            else {
                arguments.calee = function (range) {
                    return null;
                };
            }</p>
<p>            return arguments.calee(range);
        };</p>
<p>    //  selection }</p>
<p>    //  helpers {
    //  =========</p>
<p>        $H.rand = function (_min, _max)
        {
            return (Math.floor(Math.random() * (_max - _min + 1)) + _min);
        };</p>
<p>        $H.highlight__deleteSpansFromParents = function (_parents)
        {
            var _done = [], _this_done = false, _inner = '';</p>
<p>            //  main loop
            for (var i=0, _i=_parents.length; i<_i; i++)
            {
                //  init
                _this_done = false;</p>
<p>                //  check
                for (var ii=0, _ii=_done.length; ii<_ii; ii++)
                {
                    if (_done[ii] == _parents[i])
                    {
                        _this_done = true;
                        break;
                    }
                }    </p>
<p>                //  skip
                if (_this_done) { continue; }</p>
<p>                //  actually do
                //  ===========</p>
<p>                    //  add
                    _done.push(_parents[i]);</p>
<p>                    //  get
                    _inner = _parents[i].innerHTML;</p>
<p>                    //  check
                    if (_inner.indexOf('<span') > -1); else { continue; }</p>
<p>                    //  replace
                    _inner = _inner.replace(/<span([^>]*?)>/gi, '');
                    _inner = _inner.replace(/<\/span>/gi, '');
                    _parents[i].innerHTML = _inner;
            }
        };</p>
<p>        $H.highlight__getDeepestTextNode = function (_node)
        {
            var _n = _node;</p>
<p>            while (true)
            {
                switch (true)
                {
                    //  text
                    case (_n.nodeType &#038;&#038; _n.nodeType == 3): return _n;</p>
<p>                    //  single child
                    case (_n.nodeType &#038;&#038; _n.nodeType == 1 &#038;&#038; _n.childNodes.length > 0): _n = _n.childNodes[0]; break;</p>
<p>                    //  no children but has sibling
                    case (_n.nodeType &#038;&#038; _n.nodeType == 1 &#038;&#038; _n.childNodes.length == 0 &#038;&#038; _n.nextSibling): _n = _n.nextSibling; break;</p>
<p>                    //  default
                    default: return _node;
                }
            }
        };</p>
<p>        $H.highlight__getCommonAncestorContainerForNodes = function (_node1, _node2, _fallback)
        {
            var _parent1 = _node1, _parent2 = _node2;</p>
<p>            while (true)
            {
                //  next
                _parent1 = _parent1.parentNode;
                _parent2 = _parent2.parentNode;</p>
<p>                //  break
                switch (true)
                {
                    case (!(_parent1)):
                    case (!(_parent2)):
                    case (_parent1 == _fallback):
                    case (_parent2 == _fallback):
                        return _fallback;
                }</p>
<p>                //  maybe
                switch (true)
                {
                    case (_parent1 == _parent2): return _parent1;</p>
<p>                    case ($CJ.contains(_parent1, _node2)): return _parent1;
                    case ($CJ.contains(_parent2, _node1)): return _parent2;</p>
<p>                    case ($CJ.contains(_parent1, _parent2)): return _parent1;
                    case ($CJ.contains(_parent2, _parent1)): return _parent2;
                }
            }
        };</p>
<p>        $H.highlight__getParentElementOfNode = function (_thisNode)
        {
            var _element = _thisNode;
            while (true) {
                //  correct
                if (_element.nodeType == 1) { break; }</p>
<p>                //  continue
                _element = _element.parentNode;
            }
            return _element;
        };</p>
<p>        $H.highlight__getParentElementOfNodeWithThisParent = function (_thisNode, _thisParent)
        {
            //  impossible
            switch (true)
            {
                case (_thisNode == _thisParent):
                    return _thisNode;</p>
<p>                case (!($CJ.contains(_thisParent, _thisNode))):  // always false in IE
                    //return _thisNode;
            }</p>
<p>            //  do
            var _element = _thisNode;
            while (true) {
                //  correct
                if (_element.parentNode == _thisParent) { break; }</p>
<p>                //  continue
                _element = _element.parentNode;
            }
            return _element;
        };</p>
<p>    //  helpers }</p>
<p>    //  build html for element with selected range {
    //  ============================================</p>
<p>        $H.highlight__buildHTMLForElementWithSelectedRange = function (_elementToBuildHTMLFor, _modeToBuildHTMLIn, _rangeToBuildHTMLWith)
        {
            var 
                _global__element_index = 0,
                _global__the_html = '',
                _global__highlight_on = ((_modeToBuildHTMLIn == 'boundry-end') ? true : false)
            ;</p>
<p>            //	recursive function
            //	==================
                var _recursive = function (_node)
                {
                    //	increment index -- starts with 1
                    //	===============
                        _global__element_index++;</p>
<p>                    //	vars
                    //	====
                        var 
                            _explored = false,
                            _tag_name = (_node.nodeType === 3 ? '#text' : ((_node.nodeType === 1 &#038;&#038; _node.tagName &#038;&#038; _node.tagName > '') ? _node.tagName.toLowerCase() : '#invalid')),
                            _tag_is_ignored = ($H.parseOptions._elements_ignore_tag.indexOf('|'+_tag_name+'|') > -1),
                            _tag_is_ignored = (_tag_is_ignored ? ((_tag_name == 'span') ? false : true) : false),
                            _pos__start__before = 0,
                            _pos__start__after = 0,
                            _pos__end__before = 0,
                            _pos__end__after = 0,
                            _to_write = '',
                            _selection_starts_here = false,
                            _selection_ends_here = false
                        ;</p>
<p>                    //	fast return
                    //	===========
                        switch (true)
                        {
                            case ((_tag_name == '#invalid')):
                            case (($H.parseOptions._elements_ignore.indexOf('|'+_tag_name+'|') > -1)):
                                return;</p>
<p>                            case (_tag_name == '#text'):
                                //  get value
                                //  =========
                                    _to_write = _node.nodeValue.replace(/</gi, '&lt;').replace(/>/gi, '&gt;');</p>
<p>                                //  mode?
                                //  =====
                                    switch (true)
                                    {
                                        case (_modeToBuildHTMLIn == 'nothing'):
                                            break;</p>
<p>                                        case (_modeToBuildHTMLIn == 'everything'):
                                            _to_write = ''
                                                + '<highlight>' 
                                                +   _to_write 
                                                + '</highlight>'
                                            ;
                                            break;</p>
<p>                                        case (_modeToBuildHTMLIn == 'boundry-start'):
                                        case (_modeToBuildHTMLIn == 'boundry-end'):
                                        case (_modeToBuildHTMLIn == 'boundry-both'):</p>
<p>                                            //  end of range?
                                            //  =============
                                                if (_node == _rangeToBuildHTMLWith.endContainer)
                                                {
                                                    _to_write = ''
                                                        + '<highlight>'
                                                        +   _to_write.substr(0, _rangeToBuildHTMLWith.endOffset)
                                                        + '</highlight>'
                                                        + _to_write.substr(_rangeToBuildHTMLWith.endOffset)
                                                    ;</p>
<p>                                                    _global__highlight_on = false;
                                                    _selection_ends_here = true;
                                                }</p>
<p>                                            //  start of range?
                                            //  ===============
                                                if (_node == _rangeToBuildHTMLWith.startContainer)
                                                {
                                                    _to_write = ''
                                                        + _to_write.substr(0, _rangeToBuildHTMLWith.startOffset)
                                                        + '<highlight>'
                                                        +   _to_write.substr(_rangeToBuildHTMLWith.startOffset)
                                                        + '</highlight>'  
                                                    ;</p>
<p>                                                    _global__highlight_on = true;
                                                    _selection_starts_here = true;
                                                }</p>
<p>                                            //  correction
                                            //  ==========
                                                if (_selection_starts_here &#038;&#038; _selection_ends_here)
                                                {
                                                    _to_write = _node.nodeValue.replace(/</gi, '&lt;').replace(/>/gi, '&gt;');
                                                    _to_write = ''
                                                        + _to_write.substr(0, _rangeToBuildHTMLWith.startOffset)
                                                        + '<highlight>'
                                                        +   _to_write.substr(_rangeToBuildHTMLWith.startOffset, (_rangeToBuildHTMLWith.endOffset - _rangeToBuildHTMLWith.startOffset))
                                                        + '</highlight>'
                                                        + _to_write.substr(_rangeToBuildHTMLWith.endOffset)
                                                    ;</p>
<p>                                                    _global__highlight_on = false;
                                                }</p>
<p>                                            //  snap-to
                                            //  =======
                                                if (_selection_starts_here &#038;&#038; (_rangeToBuildHTMLWith.startOffset > 0))
                                                {
                                                    //  before
                                                    _to_write = _to_write.replace(/([ .,;?!])([a-z0-9]{1,2})<highlight>/gi, '$1<highlight>$2');</p>
<p>                                                    //  space at begining
                                                    _to_write = _to_write.replace(/<highlight>([\s])([^\s])/gi, '$1<highlight>$2');</p>
<p>                                                    //  too much
                                                    _to_write = _to_write.replace(/<highlight>([a-z0-9])([ ])([a-z0-9])/gi, '$1$2<highlight>$3');
                                                }</p>
<p>                                                if (_selection_ends_here &#038;&#038; (_rangeToBuildHTMLWith.endOffset > 0))
                                                {
                                                    var _do_end = true;</p>
<p>                                                    if (_rangeToBuildHTMLWith.endContainer &#038;&#038; _rangeToBuildHTMLWith.endContainer.nodeValue &#038;&#038; _rangeToBuildHTMLWith.endContainer.nodeValue.length)
                                                        { _do_end = (_rangeToBuildHTMLWith.endOffset < _rangeToBuildHTMLWith.endContainer.nodeValue.length); }</p>
<p>                                                    if (_do_end)
                                                    {
                                                        //  after
                                                        _to_write = _to_write.replace(/<\/highlight>([a-z0-9]{0,2})([ .,;?!])/gi, '$1$2</highlight>');</p>
<p>                                                        //  space at end
                                                        _to_write = _to_write.replace(/([^\s])([\s])<\/highlight>/gi, '$1</highlight>$2');</p>
<p>                                                        //  too much
                                                        _to_write = _to_write.replace(/([ ])([a-z0-9])<\/highlight>([a-z0-9])/gi, '</highlight>$1$2$3');
                                                    }
                                                }</p>
<p>                                            //  other
                                            //  =====
                                                if (!(_selection_starts_here) &#038;&#038; !(_selection_ends_here))
                                                {
                                                    _to_write = _node.nodeValue.replace(/</gi, '&lt;').replace(/>/gi, '&gt;');
                                                    if (_global__highlight_on)
                                                    {
                                                        _to_write = ''
                                                            + '<highlight>' 
                                                            +   _to_write 
                                                            + '</highlight>'
                                                        ;
                                                    }
                                                }</p>
<p>                                            break;
                                    }</p>
<p>                                //  write value
                                //  ===========
                                    _global__the_html += _to_write;</p>
<p>                                return;
                        }</p>
<p>                    //  range anchors are elements instead of text-nodes
                    //  ================================================</p>
<p>                        //  end of range?
                        if ((_rangeToBuildHTMLWith.endContainer.nodeType == 1) &#038;&#038; (_node == _rangeToBuildHTMLWith.endContainer)) {
                            _global__highlight_on = false;
                            _selection_ends_here = true;
                        }</p>
<p>                        //  start of range?
                        if ((_rangeToBuildHTMLWith.startContainer.nodeType == 1) &#038;&#038; (_node == _rangeToBuildHTMLWith.startContainer)) {
                            _global__highlight_on = true;
                            _selection_starts_here = true;
                        }</p>
<p>                        //  correction
                        if (_selection_starts_here &#038;&#038; _selection_ends_here) {
                            _global__highlight_on = false;
                        }</p>
<p>                    //	start tag
                    //	=========
                        if (_tag_is_ignored); else
                        {
                            /* mark */	_pos__start__before = _global__the_html.length;
                            /* add */	_global__the_html += '<'+_tag_name;</p>
<p>                            //	attributes
                            //	==========</p>
<p>                                //	allowed attributes
                                if (_tag_name in $H.parseOptions._elements_keep_attributes)
                                {
                                    for (var i=0, _i=$H.parseOptions._elements_keep_attributes[_tag_name].length; i<_i; i++)
                                    {
                                        var 
                                            _attribute_name = $H.parseOptions._elements_keep_attributes[_tag_name][i],
                                            _attribute_value = _node.getAttribute(_attribute_name)
                                        ;</p>
<p>                                        //	if present
                                        if (_attribute_value > '')
                                            { _global__the_html += ' '+_attribute_name+'="'+(_attribute_value)+'"'; }
                                    }
                                }</p>
<p>                                //	keep ID for all elements
                                var _id_attribute = _node.getAttribute('id');
                                if (_id_attribute > '')
                                    { _global__the_html += ' id="'+_id_attribute+'"'; }</p>
<p>                                //	links target NEW
                                if (_tag_name == 'a')
                                    { _global__the_html += ' target="_blank"'; }</p>
<p>                            //  add class name
                            //  ==============
                                var _class_attribute = _node.getAttribute('class');
                                if (_class_attribute > '')
                                    { _global__the_html += ' class="'+_class_attribute+'"'; }</p>
<p>                            //  add highlight id -- for EMs that are outside the global highlight
                            //  ================
                                if (_tag_name == 'em' &#038;&#038; _modeToBuildHTMLIn != 'everything')
                                {
                                    //  with a fix for when an em is the first thing inside a parent element</p>
<p>                                    switch (true)
                                    {
                                        case (_global__highlight_on):
                                        case ((_rangeToBuildHTMLWith.startOffset == 0) &#038;&#038; (_node.firstChild) &#038;&#038; (_node.firstChild == _rangeToBuildHTMLWith.startContainer)):
                                            break;</p>
<p>                                        default:
                                            var _highlight_id_attribute = _node.getAttribute($H.settings.highlightElementIdAttribute);
                                            if (_highlight_id_attribute > '')
                                                { _global__the_html += ' '+$H.settings.highlightElementIdAttribute+'="'+_highlight_id_attribute+'"'; }
                                            break;
                                    }
                                }</p>
<p>                            //	close start
                            //	===========
                                if ($H.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1) { _global__the_html += ' />'; }
                                else { _global__the_html += '>';}</p>
<p>                            /* mark */ _pos__start__after = _global__the_html.length;
                        }</p>
<p>                    //	child nodes
                    //	===========
                        if ($H.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1); else
                        {
                            for (var i=0, _i=_node.childNodes.length; i<_i; i++)
                                { _recursive(_node.childNodes[i]); }
                        }</p>
<p>                    //	end tag
                    //	=======
                        switch (true)
                        {
                            case (_tag_is_ignored):
                                return;</p>
<p>                            case (($H.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1)):
                                /* mark */ 	_pos__end__before = _global__the_html.length;
                                /* mark */ 	_pos__end__after = _global__the_html.length;
                                break;</p>
<p>                            default:
                                /* mark */ 	_pos__end__before = _global__the_html.length;
                                /* end */ 	_global__the_html += '</'+_tag_name+'>';
                                /* mark */ 	_pos__end__after = _global__the_html.length;
                                break;
                        }</p>
<p>                    //  protected elements
                    //  ==================
                        switch (true)
                        {
                            //  some elemnts are protected from highlighting
                            case (($H.parseOptions._elements_highlight_protect.indexOf('|'+_tag_name+'|') > -1)):
                            case ((_tag_name == 'em') &#038;&#038; $CJ(_node).hasClass($H.settings.highlightElementCSSClass)):</p>
<p>                                //  so, if highlights are inside an already highlighted element --or an unhighlightable one-- remove</p>
<p>                                _global__the_html = ''
                                    + _global__the_html.substr(0, _pos__start__after)
                                    +   _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after))
                                            .replace(/<highlight>/gi, '')
                                            .replace(/<\/highlight>/gi, '')
                                    + _global__the_html.substr(_pos__end__before)
                                ;</p>
<p>                                break;</p>
<p>                            //  some elements are invalid completely
                            case ((_tag_name == 'a') &#038;&#038; (_node.className == 'deleteHighlight')):</p>
<p>                                _global__the_html = ''
                                    + _global__the_html.substr(0, _pos__start__before)
                                    + _global__the_html.substr(_pos__end__after)
                                ;</p>
<p>                                break;</p>
<p>                            //  some elements need to have their tags ignored
                            /*case (_tag_name == 'span'):</p>
<p>                                _global__the_html = ''
                                    + _global__the_html.substr(0, _pos__start__before)
                                    + _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after))
                                    + _global__the_html.substr(_pos__end__after)
                                ;</p>
<p>                                break;*/
                        }</p>
<p>                    //	return
                        return;
                };</p>
<p>            //	actually do it
            _recursive(_elementToBuildHTMLFor);</p>
<p>            //  use em, instead of highlight
            _global__the_html = _global__the_html
                .replace(/<highlight>/gi, '<em class="'+$H.settings.highlightElementCSSClass+'">')
                .replace(/<\/highlight>/gi, '</em>')
            ;</p>
<p>            //	return
            return _global__the_html;
        };    </p>
<p>    //  build html for element with selected range }</p>
<p>    //  do range {
    //  ==========</p>
<p>        $H.highlight__doRange = function (_range_to_highlight)
        {
            //  get referrence elements
            var
                _commonAncestorElement = $H.highlight__getParentElementOfNode(_range_to_highlight.commonAncestorContainer),
                _startElement = $H.highlight__getParentElementOfNodeWithThisParent(_range_to_highlight.startContainer, _commonAncestorElement),
                _endElement = $H.highlight__getParentElementOfNodeWithThisParent(_range_to_highlight.endContainer, _commonAncestorElement)
            ;</p>
<p>            //  range not in container element
            if (true
                &#038;&#038; (_commonAncestorElement.tagName) 
                &#038;&#038; !($CJ.contains($H.settings.elementWhichMustContainAllHighlights, _commonAncestorElement))
            ) {
                return false;
            }</p>
<p>            //  arbitrary range exclusion
            if ($H.callbacks.arbitraryRangeExclusion) {
                if ($H.callbacks.arbitraryRangeExclusion(_range_to_highlight, _commonAncestorElement, _startElement, _endElement) === false) {
                    return false;
                }
            }</p>
<p>            /* $H.log(
                _range.startContainer, _range.endContainer, _range.startOffset, _range.endOffset, 
                _range_to_highlight, 
                _commonAncestorElement, _startElement, _endElement
            ); */</p>
<p>            //  selection id
            var _selection_id = $H.rand(1, 1000);
            while (true)
            {
                //  nothing found
                if ($H.$elementWhichMustContainAllHighlights.find('em.'+$H.settings.highlightElementCSSClass+'['+$H.settings.highlightElementIdAttribute+'="'+_selection_id+'"]').length > 0); else { break; }</p>
<p>                //  new id
                _selection_id = $H.rand(1, 1000);
            }</p>
<p>            //  chainging elements
            //  ==================</p>
<p>                var _chaingingElements = [], _currElement = _startElement, _currChainging = false;</p>
<p>                while (true)
                {
                    //  object
                    _currChainging = {
                        '_element': _currElement,
                        '_tagName': (_currElement.nodeType === 3 ? '#text' : ((_currElement.nodeType === 1 &#038;&#038; _currElement.tagName &#038;&#038; _currElement.tagName > '') ? _currElement.tagName.toLowerCase() : '#invalid'))
                    };</p>
<p>                    //  add
                    _chaingingElements.push(_currChainging);</p>
<p>                    //  break
                    if (_currElement == _endElement) { break; }</p>
<p>                    //  next
                    _currElement = _currElement.nextSibling;</p>
<p>                    //  error?
                    if (_currElement); else { break; }
                }</p>
<p>            //  rewrite elements
            //  ================
                var _parents_to_clean = [];
                for (var i=0, _i=_chaingingElements.length, _currElement=false; i<_i; i++)
                {
                    var 
                        _currElement = _chaingingElements[i],
                        _currNode = _currElement._element,
                        _currTag = _currElement._tagName,
                        _boundry_mode = '',
                        _currBuiltHTML = false,
                        _resNode = false
                    ;</p>
<p>                    //  get html / mode
                    //  ===============
                        switch (true)
                        {
                            case ((_i == 1) &#038;&#038; (i == 0)):       _boundry_mode = 'boundry-both';     break;
                            case ((_i > 1) &#038;&#038; (i == 0)):        _boundry_mode = 'boundry-start';    break;
                            case ((_i > 1) &#038;&#038; (i == (_i-1))):   _boundry_mode = 'boundry-end';      break;
                            default:                            _boundry_mode = 'everything';       break;
                        }</p>
<p>                    //  get html
                    //  ========
                        _currBuiltHTML = $H.highlight__buildHTMLForElementWithSelectedRange(_currNode, _boundry_mode, _range_to_highlight);</p>
<p>                    //  write
                    //  =====
                        switch (true)
                        {
                            case ((_currTag == '#text')):</p>
<p>                                //  resulting html might be something like "<em>something</em> something else"
                                //  so we create a dummy span tag to eomcompass it, and then repalce the old text node with that</p>
<p>                                //  create
                                var _newElement = $H.document.createElement('span');
                                    _newElement.innerHTML = _currBuiltHTML;</p>
<p>                                //  result
                                _resNode = _newElement;</p>
<p>                               /* with (Evernote.evernotePopup) {
                                    console.log(' ~~~ highlight.js gadit before |'  + docSelection + "|");
                                    console.log(' ~~~ from ' +docSelection.startOffset + ' to  ' + docSelection.endOffset);
                                }*/</p>
<p>                                Evernote.Utils.sendMessageToPopup('highlightDomChangesStart');
                                //  replace
                                _currNode.parentNode.replaceChild(_resNode, _currNode);</p>
<p>                                Evernote.Utils.sendMessageToPopup('highlightDomChangesEnd');
/*
                                with (Evernote.evernotePopup) {
                                    console.log(' ~~~ highlight.js nagadil |'  + docSelection + "|");
                                    console.log(' ~~~ from ' +docSelection.startOffset + ' to  ' + docSelection.endOffset);
                                }*/</p>
<p>                                break;</p>
<p>                            case (($H.parseOptions._elements_self_closing.indexOf('|'+_currTag+'|') > -1)):</p>
<p>                                //  result
                                _resNode = _currNode;</p>
<p>                                /* nothing */ /*
                                    var _newElement = $H.document.createElement('em');
                                        _newElement.className = $H.settings.highlightElementCSSClass;
                                        _newElement.innerHTML = _currBuiltHTML;
                                    _currNode.parentNode.replaceChild(_newElement, _currNode);
                                */</p>
<p>                                break;</p>
<p>                            default:</p>
<p>                                //  result
                                _resNode = _currNode;</p>
<p>                                //  innerHTML
                                _currBuiltHTML = _currBuiltHTML.substr((_currBuiltHTML.indexOf('>')+1));
                                _currBuiltHTML = _currBuiltHTML.substr(0, _currBuiltHTML.lastIndexOf('<'));</p>
<p>                                //  highlighted anything?
                                if (_currBuiltHTML.indexOf('<em class="'+$H.settings.highlightElementCSSClass+'">') > - 1); else { break; }</p>
<p>                                //  do it
                                _currNode.innerHTML = _currBuiltHTML;
                                break;
                        }</p>
<p>                    //  set highlight class 
                    //  ===================</p>
<p>                        //  inside node
                        $CJ(_resNode).find('em.'+$H.settings.highlightElementCSSClass+':not(['+$H.settings.highlightElementIdAttribute+'])').attr($H.settings.highlightElementIdAttribute, _selection_id);</p>
<p>                        //  on node
                        if ((_currTag == 'em') &#038;&#038; $CJ(_resNode).hasClass($H.settings.highlightElementCSSClass))
                            { $CJ(_resNode).attr($H.settings.highlightElementIdAttribute, _selection_id); }</p>
<p>                        //  clean::add
                        _parents_to_clean.push(_resNode.parentNode);
                }</p>
<p>                //  clean::do
                $H.highlight__deleteSpansFromParents(_parents_to_clean);
        };</p>
<p>    //  do range }</p>
<p>    //  do current selection {
    //  ======================</p>
<p>        $H.highlight__doCurentSelection = function ()
        {
            //  vars
            //  ====
                var 
                    _selection = $H.sel.getSelection($H.window),
                    _range = $H.sel.getRange(_selection),
                    _text = $H.sel.getRangeText(_range),</p>
<p>                    _good_range = (_range ? {
                        'commonAncestorContainer':  _range.commonAncestorContainer,
                        'startContainer':           _range.startContainer,
                        'endContainer':             _range.endContainer,
                        'startOffset':              _range.startOffset,
                        'endOffset':                _range.endOffset
                    } : false)
                ;</p>
<p>            //  some exception rules
            //  ====================
                switch (true)
                {
                    case (!(_text)):
                    case (!(_text.length > 0)):
                    case (!(_good_range)):
                        return false;
                }</p>
<p>            //  some corrections
            //  ================</p>
<p>                //  Firefox fucks up -- https://developer.mozilla.org/en/DOM/range.startOffset
                //  Offsets mean two differet things</p>
<p>                //  start container
                if (_good_range.startContainer.nodeType == 1)
                {
                    if (_good_range.startContainer.childNodes[_good_range.startOffset])
                    {
                        _good_range.startContainer = _good_range.startContainer.childNodes[_good_range.startOffset];
                        _good_range.startOffset = 0;
                    }
                }</p>
<p>                //  end container
                if (_good_range.endContainer.nodeType == 1)
                {
                    if (_good_range.endContainer.childNodes[_good_range.endOffset])
                    {
                        _good_range.endContainer = _good_range.endContainer.childNodes[_good_range.endOffset];
                        _good_range.endOffset = 0;
                    }
                }</p>
<p>            //  highlight range
            //  ===============
                var _highlighted_range = $H.highlight__doRange(_good_range);
                if (_highlighted_range === false) { return false; }</p>
<p>            //  clear selection
            //  ===============
                try { _selection.removeAllRanges(); } catch (e) {}</p>
<p>            //  correct double highlights
            //  =========================
                var _parents_double_to_clean = [];
                $H.$elementWhichMustContainAllHighlights.find('em.'+$H.settings.highlightElementCSSClass+' em.'+$H.settings.highlightElementCSSClass).each(function (_i, _e)
                {
                    //  remove inner button
                        $CJ(_e).find('a.'+$H.settings.highlightElementDeleteCSSClass).remove();</p>
<p>                    //  create
                    var _newElement = $H.document.createElement('span');
                        _newElement.innerHTML = _e.innerHTML;</p>
<p>                    //  repalce
                    _e.parentNode.replaceChild(_newElement, _e);</p>
<p>                    //  add
                    _parents_double_to_clean.push(_newElement.parentNode);
                });</p>
<p>                //  clean
                $H.highlight__deleteSpansFromParents(_parents_double_to_clean);</p>
<p>            //  remove buttons and classes
            //  ==========================
                //  delete buttons
                $H.$elementWhichMustContainAllHighlights.find('em.'+$H.settings.highlightElementCSSClass+' a.'+$H.settings.highlightElementDeleteCSSClass).remove();</p>
<p>                //  first, last
                $H.$elementWhichMustContainAllHighlights.find('em.'+$H.settings.highlightElementCSSClass+'.'+$H.settings.highlightElementFirstCSSClass).removeClass($H.settings.highlightElementFirstCSSClass);
                $H.$elementWhichMustContainAllHighlights.find('em.'+$H.settings.highlightElementCSSClass+'.'+$H.settings.highlightElementLastCSSClass).removeClass($H.settings.highlightElementLastCSSClass);</p>
<p>            //  add buttons and classes
            //  =======================
                var 
                    _highlights_collection = $H.$elementWhichMustContainAllHighlights.find('em.'+$H.settings.highlightElementCSSClass),
                    _highlights_collection_ids = [],
                    _curr_delete_button = false
                ;</p>
<p>                //  get all ids
                _highlights_collection.each(function (_i, _e) {
                    _highlights_collection_ids.push($CJ(_e).attr($H.settings.highlightElementIdAttribute));
                });</p>
<p>                //  add button, classes
                _highlights_collection.each(function (_i, _e)
                {
                    var
                        _isFirst = (_highlights_collection_ids[(_i-1)] ? (_highlights_collection_ids[_i] != _highlights_collection_ids[(_i-1)]) : true),
                        _isLast = (_highlights_collection_ids[(_i+1)] ? (_highlights_collection_ids[_i] != _highlights_collection_ids[(_i+1)]) : true)
                    ;</p>
<p>                    if (_isFirst)
                    {
                        //  class
                        $CJ(_e).addClass($H.settings.highlightElementFirstCSSClass);</p>
<p>                        //  create button
                        _curr_delete_button = $H.document.createElement('a');
                        _curr_delete_button.className = $H.settings.highlightElementDeleteCSSClass;
                        _curr_delete_button.id = $H.settings.highlightElementDeleteIdPrefix + _highlights_collection_ids[_i];</p>
<p>                        //  add button
                        _e.insertBefore(_curr_delete_button, _e.firstChild);
                    }</p>
<p>                    if (_isLast)
                    {
                        //  class
                        $CJ(_e).addClass($H.settings.highlightElementLastCSSClass);
                    }
                });
        };</p>
<p>    //  do current selection }</p>
<p>    //  delete highlight {
    //  ==================</p>
<p>        $H.highlight__deleteAllHighlights = function ()
        {
            $H.highlight__deleteHighlight('all');
        };</p>
<p>        $H.highlight__deleteHighlight = function (_highlight_id)
        {
            var 
                _expression = 'em.' + $H.settings.highlightElementCSSClass + (_highlight_id == 'all' ? '' : '['+$H.settings.highlightElementIdAttribute+'="'+_highlight_id+'"]'),
                _parents_to_clean = []
            ;</p>
<p>            //  collection
            $H.$elementWhichMustContainAllHighlights.find(_expression).each(function (_index, _e)
            {
                //  create
                var _s = $H.document.createElement('span');
                    _s.innerHTML = _e.innerHTML;</p>
<p>                //  do
                _e.parentNode.replaceChild(_s, _e);</p>
<p>                //  parents
                _parents_to_clean.push(_s.parentNode);
            });</p>
<p>            //  delete spans
            $H.highlight__deleteSpansFromParents(_parents_to_clean);
        };</p>
<p>    //  delete highlight }</p>
<p>    //  enable / disable {
    //  ==================</p>
<p>        $H.enable = function ()
        {
            if ($H.enabled) { return; }
            $H.enabled = true;
            $H.$html.addClass($H.settings.highlightingEnabledCSSClass);
        };</p>
<p>        $H.disable = function ()
        {
            if ($H.enabled); else { return; }
            $H.enabled = false;
            $H.$html.removeClass($H.settings.highlightingEnabledCSSClass);
        };</p>
<p>    //  enable / disable }</p>
<p>    //  add mouse handlers {
    //  ====================</p>
<p>        //  globals
        $H.highlight__mouseUp_timeout = false;
        $H.highlight__deleteButton__byId__mouseEnter_timeout = {};
        $H.highlight__deleteButton__byId__mouseLeave_timeout = {};</p>
<p>        //  containers mouse up
        $H.highlight__mouseUp = function ()
        {
            //  not in highlight mode
            if ($H.enabled); else { return; }</p>
<p>            //  timeout
            $H.highlight__mouseUp_timeout = $H.window.setTimeout
            (
                function ()
                {
                    //  try
                    $H.highlight__mouseUp_timeout = false;
                    var _didSelection = $H.highlight__doCurentSelection();</p>
<p>                    //  callback
                    if (_didSelection === false); else {
                        if ($H.callbacks.highlightAdded) {
                            $H.callbacks.highlightAdded();
                        }
                    }
                }, 
                250
            );
        };</p>
<p>        //  containers mouse down
        $H.highlight__mouseDown = function ()
        {
            //  not in highlight mode
            if ($H.enabled); else { return; }</p>
<p>            //  timeout
            $H.window.clearTimeout($H.highlight__mouseUp_timeout);
        };</p>
<p>        //  delete buttons show/hide
        $H.highlight__deleteButton__show = function (_highlight_id) { $H.$elementWhichMustContainAllHighlights.find('#' + $H.settings.highlightElementDeleteIdPrefix + _highlight_id).fadeIn(250); };
        $H.highlight__deleteButton__hide = function (_highlight_id) { $H.$elementWhichMustContainAllHighlights.find('#' + $H.settings.highlightElementDeleteIdPrefix + _highlight_id).fadeOut(250); };</p>
<p>        //  add mouse handlers
        $H.addMouseHandlers = function ()
        {
            //  mouse up/down
            for (var i=0, _i=$H.settings.elementsToAttachMouseHandlersTo.length; i<_i; i++)
            {
                $CJ($H.settings.elementsToAttachMouseHandlersTo[i])
                    .mouseup($H.highlight__mouseUp)
                    .mousedown($H.highlight__mouseDown)
                ;
            }</p>
<p>            //  highlight mouse enter
            $H.$elementWhichMustContainAllHighlights.on('mouseenter', 'em.'+$H.settings.highlightElementCSSClass, function ()
            {
                var _highlight_id = $CJ(this).attr($H.settings.highlightElementIdAttribute);</p>
<p>                $H.window.clearTimeout($H.highlight__deleteButton__byId__mouseLeave_timeout[_highlight_id]);</p>
<p>                $H.highlight__deleteButton__byId__mouseEnter_timeout[_highlight_id] = $H.window.setTimeout(
                    function ()
                    {
                        $H.highlight__deleteButton__byId__mouseEnter_timeout[_highlight_id] = false;
                        $H.highlight__deleteButton__show(_highlight_id);
                    },
                    250
                );
            });</p>
<p>            //  highlight mouse leave
            $H.$elementWhichMustContainAllHighlights.on('mouseleave', 'em.'+$H.settings.highlightElementCSSClass, function ()
            {
                var _highlight_id = $CJ(this).attr($H.settings.highlightElementIdAttribute);</p>
<p>                $H.window.clearTimeout($H.highlight__deleteButton__byId__mouseEnter_timeout[_highlight_id]);</p>
<p>                $H.highlight__deleteButton__byId__mouseLeave_timeout[_highlight_id] = $H.window.setTimeout(
                    function ()
                    {
                        $H.highlight__deleteButton__byId__mouseLeave_timeout[_highlight_id] = false;
                        $H.highlight__deleteButton__hide(_highlight_id);
                    },
                    250
                );
            });</p>
<p>            //  highlight delete click        
            $H.$elementWhichMustContainAllHighlights.on('click', 'em.'+$H.settings.highlightElementCSSClass+' a.'+$H.settings.highlightElementDeleteCSSClass, function ()
            {
                //  get id
                var _id = $CJ(this.parentNode).attr($H.settings.highlightElementIdAttribute);</p>
<p>                //  remove self
                $CJ(this).remove();</p>
<p>                //  delete
                $H.highlight__deleteHighlight(_id);</p>
<p>                //  callback
                if ($H.callbacks.highlightDeleted) {
                    $H.callbacks.highlightDeleted();
                }
            });
        };</p>
<p>    //  add mouse handlers }</p>
<p>    //  get clean html {
    //  ================</p>
<p>        $H.getCleanHTML = function (_rawHTML)
        {
            //  html
            var _html = _rawHTML;</p>
<p>            //  remove all spans -- spans hold deleted highlights, or useless helper elements
            _html = _html.replace(/<span([^>]*?)>/gi, '');
            _html = _html.replace(/<\/span>/gi, '');</p>
<p>            //  remove highlight-delete buttons
            var _highlight_delete_reg = new RegExp('<a ([^>]*?)'+$H.settings.highlightElementDeleteCSSClass+'([^>]*?)></a>', 'gi');
            _html = _html.replace(_highlight_delete_reg, '');</p>
<p>            //  highlight element
            var _highlight_element_reg = new RegExp('<em ([^>]*?)'+$H.settings.highlightElementCSSClass+'([^>]*?)>([^>]+?)</em>', 'gi');
            _html = _html.replace(_highlight_element_reg, '<highlight>$3</highlight>');</p>
<p>            //  double EMs
            var _two_highlights_reg = new RegExp('<highlight>([\\s\\S]*?)</highlight>([ \\n\\r\\t]*?)<highlight>([\\s\\S]*?)</highlight>', 'gi');
            while (true &#038;&#038; _html.match(_two_highlights_reg)) {
                _html = _html.replace(_two_highlights_reg, '<highlight>$1$3</highlight>');
            }</p>
<p>            //  replace EMs
            var _highlight_reg = new RegExp('<highlight>([\\s\\S]*?)</highlight>', 'gi');
            _html = _html.replace(_highlight_reg, $H.settings.highlightCleanHTMLElementStart+'$1'+$H.settings.highlightCleanHTMLElementEnd);</p>
<p>            return _html;
        };</p>
<p>    //  get clean html }		</p>
<p>    //  return self
    //  ===========
        return $H;
}
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/*!
 *  ClearlyComponent__next
 *  Evernote Clearly's next-page algorithm as an embeddable component.
 *  Copyright 2013, Evernote Corporation
 *
 *  Usage:
 *  ======
 *
 *      The Next-pages Clearly-component works hand-in-hand with the clearly Detect Component.
 *      So its init/usage pattern needs to come after the normal init/usage pattern for the Detect Component.
 *      Like this:
 *
 *      First "Detect":
 *      =============
 *
 *          // define
 *          window.ClearlyComponent__detect = {
 *              'callbacks': {
 *                  'finished': someFunction(),
 *              },
 *              'window': window,
 *              'document': document,
 *              'jQuery': window.jQuery
 *          };
 *
 *          // init -- will return false, if something goes wrong
 *          window.ClearlyComponent__detect = initClearlyComponent__detect(window.ClearlyComponent__detect);
 *
 *      Then "Next":
 *      ============
 *
 *          // define
 *          window.ClearlyComponent__next = {
 *              'callbacks': {
 *                  'newPageFound': someFunction()
 *              },
 *
 *              'settings': { 
 *                  'onCreateNextPagesContainerUseThisId': 'string',
 *                  'onCreateNextPagesContainerDoNotInsertCSS': true
 *              },
 *
 *              'detectComponentInstance': window.ClearlyComponent__detect
 *          };
 *
 *          // init -- will return false, if something goes wrong
 *          window.ClearlyComponent__next = initClearlyComponent__next(window.ClearlyComponent__next);
 *
 *          // call -- returns nothing; callbacks will be used
 *          window.ClearlyComponent__next.createNextPagesContainer()
 *          window.ClearlyComponent__next.start();
 *
 */</p>
<p>/*
    changes:
    ========
        $R => $N, $D
*/</p>
<p>function initClearlyComponent__next(_paramInstance)
{
    //  global instance reference {
    //  ===========================</p>
<p>        //  null; return
        if (_paramInstance); else { return false; }</p>
<p>        //  shorthand
        $N = _paramInstance;</p>
<p>    //  global instance reference }</p>
<p>    //  required vars {
    //  ===============</p>
<p>        //  the component instance object must already be created,
        //  when the init function is called. it must have these vars set:</p>
<p>        switch (true)
        {
            case (!($N.detectComponentInstance)):</p>
<p>            case (!($N.callbacks)):
            case (!($N.callbacks.newPageFound)):</p>
<p>                //  something's wrong
                return false;
        }</p>
<p>    //  required vars }</p>
<p>    //  missing settings {
    //  ==================</p>
<p>        if ($N.settings); else { $N.settings = {}; }</p>
<p>        //  names for stuff
        /* frames id */               if ($N.settings.onCreateNextPageFramesUseThisIdPrefix); else           { $N.settings.onCreateNextPageFramesUseThisIdPrefix =          'clearly_next_page_frame__'; }
        /* container id */            if ($N.settings.onCreateNextPagesContainerUseThisId); else             { $N.settings.onCreateNextPagesContainerUseThisId =            'clearly_next_pages_container'; }
        /* insert container css */    if ($N.settings.onCreateNextPagesContainerDoNotInsertCSS); else        { $N.settings.onCreateNextPagesContainerDoNotInsertCSS =       false; }
        /* frames attribute */        if ($N.settings.onLoadingNextPageFramesUseThisAttribute); else         { $N.settings.onLoadingNextPageFramesUseThisAttribute =        'clearly_next_page_loaded'; }
        /* frames attribute value */  if ($N.settings.onLoadingNextPageFramesUseThisAttributeValue); else    { $N.settings.onLoadingNextPageFramesUseThisAttributeValue =   'yes'; }</p>
<p>    //  missing settings }</p>
<p>    //  global vars {
    //  =============</p>
<p>        $D = $N.detectComponentInstance;
        $CJ = $D.jQuery;</p>
<p>        $N.pages = [];</p>
<p>    //  global vars }</p>
<p>    //  parse options {
    //  =============   </p>
<p>		$N.parseOptions =
		{
			'_next_page_keywords': [
                /* english */   'next page', 'next',
                /* german */    'vorw&#228;rts', 'weiter',
                /* japanese */  '&#27425;&#12408;'
			],</p>
<p>			'_next_page_keywords_not': [
			    /* english */   'article', 'story', 'post', 'comment', 'section', 'chapter'
			]
		};</p>
<p>    //  parse options }</p>
<p>    //  create next pages container {
    //  =============================</p>
<p>        $N.createNextPagesContainer = function ()
        {
            //  default id
            //  ==========
                _container_id = $N.settings.onCreateNextPagesContainerUseThisId;</p>
<p>            //	container
            //	=========
                var _containerElement = $D.document.createElement('div');
                    _containerElement.setAttribute('id', _container_id);</p>
<p>            //	css
            //	===
                if ($N.settings.onCreateNextPagesContainerDoNotInsertCSS); else
                {
                    var 
                        _cssElement = $D.document.createElement('style'),
                        _cssText = ''
                        +	'#'+_container_id+' { '
                        +		'margin: 0; padding: 0; border: none; '
                        +		'position: absolute; '
                        +		'width: 10px; height: 10px; '
                        +		'top: -100px; left: -100px; '
                        +	'} '
                        +	'#'+_container_id+' iframe { '
                        +		'margin: 0; padding: 0; border: none; '
                        +		'position: absolute; '
                        +		'width: 10px; height: 10px; '
                        +		'top: -100px; left: -100px; '
                        +	'} '
                    ;
                    _cssElement.setAttribute('id', _container_id + '__css');
                    _cssElement.setAttribute('type', 'text/css');
                    if (_cssElement.styleSheet) { _cssElement.styleSheet.cssText = _cssText; }
                        else { _cssElement.appendChild($D.document.createTextNode(_cssText)); }
                }</p>
<p>            //	write
            //	=====
                var _body = $D.document.getElementsByTagName('body')[0];
                    /* css */       if (_cssElement) { _body.appendChild(_cssElement); }
                    /* container */ _body.appendChild(_containerElement);</p>
<p>            //  set
            //  ===
                $N.nextPages = _containerElement;
                $N.$nextPages = $CJ($N.nextPages);
        };</p>
<p>    //  create next pages container }</p>
<p>	//  helpers {
	//  =========</p>
<p>        //  substr starting with the first slash after //
		$N.getURLPath = function (_url) { return _url.substr(_url.indexOf('/', (_url.indexOf('//') + 2))); };</p>
<p>        //  substr until the first slash after //
		$N.getURLDomain = function (_url) { return _url.substr(0, _url.indexOf('/', (_url.indexOf('//') + 2))); };</p>
<p>	//  helpers }</p>
<p>	//  load page {
	//  ===========</p>
<p>        $N.nextPage__loadToFrame = function (_pageNr, _nextPageURL)
        {
            //	do ajax
            //	=======
                $CJ.ajax
                ({
                    'url' : _nextPageURL,</p>
<p>                    'type' : 'GET',
                    'dataType' : 'html',
                    'async' : true,
                    'timeout': (10 * 1000),</p>
<p>                    //'headers': { 'Referrer': _nextPageURL },</p>
<p>                    'success' : function (_response, _textStatus, _xhr)	{ $N.nextPage__ajaxComplete(_pageNr, _response, _textStatus, _xhr); },
                    'error' : 	function (_xhr, _textStatus, _error)	{ $N.nextPage__ajaxError(_pageNr, _xhr, _textStatus, _error); }
                });
        };</p>
<p>        $N.nextPage__ajaxError = function (_pageNr, _xhr, _textStatus, _error) { };</p>
<p>        $N.nextPage__ajaxComplete = function (_pageNr, _response, _textStatus, _xhr)
        {
            //	valid?
            //	======
                if (_response > ''); else { return; }</p>
<p>            //	get html
            //	========
                var _html = _response;</p>
<p>                //	normalize
                //	=========
                    _html = _html.replace(/<\s+/gi, '<');
                    _html = _html.replace(/\s+>/gi, '>');
                    _html = _html.replace(/\s+\/>/gi, '/>');</p>
<p>                //	remove
                //	======
                    _html = _html.replace(/<script[^>]*?>([\s\S]*?)<\/script>/gi, '');
                    _html = _html.replace(/<script[^>]*?\/>/gi, '');
                    _html = _html.replace(/
<noscript[^>]*?>([\s\S]*?)<\/noscript>/gi, '');</p>
<p>            //	append frame
            //	============
                $N.$nextPages.append(''
                    + '<iframe'
                    + ' id="'+$N.settings.onCreateNextPageFramesUseThisIdPrefix+_pageNr+'"'
                    + ' scrolling="no" frameborder="0"'
                    + '></iframe>'
                );		</p>
<p>            //	write to frame
            //	==============
                var _doc = $N.$nextPages.find('#'+$N.settings.onCreateNextPageFramesUseThisIdPrefix+_pageNr).contents().get(0);
                    _doc.open();
                    _doc.write(_html);
                    _doc.close();</p>
<p>            //	add load handler
            //	================
                $N.$nextPages.find('#'+$N.settings.onCreateNextPageFramesUseThisIdPrefix+_pageNr).bind('load', function ()
                {
                    //  done?
                    if ($N.$nextPages.find('#'+$N.settings.onCreateNextPageFramesUseThisIdPrefix+_pageNr).attr($N.settings.onLoadingNextPageFramesUseThisAttribute) == $N.settings.onLoadingNextPageFramesUseThisAttributeValue) { return; }</p>
<p>                    //  can do?
                    var _doc = $N.$nextPages.find('#'+$N.settings.onCreateNextPageFramesUseThisIdPrefix+_pageNr).contents().get(0);
                    if (_doc); else { return; }
                    if (_doc.readyState == 'interactive' || _doc.readyState == 'complete'); else { return; }</p>
<p>                    //  mark
                    $N.$nextPages.find('#'+$N.settings.onCreateNextPageFramesUseThisIdPrefix+_pageNr).attr($N.settings.onLoadingNextPageFramesUseThisAttribute, $N.settings.onLoadingNextPageFramesUseThisAttributeValue);</p>
<p>                    // do
                    $N.nextPage__loadedInFrame(_pageNr, _doc.defaultView);                  
                });
        };</p>
<p>        $N.nextPage__loadedInFrame = function (_pageNr, _pageWindow)
        {
            //	find
            //	====
                var 
                    _found = $D.getContent__findInPage(_pageWindow),
                    _foundHTML = _found._html,
                    _removeTitleRegex = new RegExp($D.articleTitleMarker__start + '(.*?)' + $D.articleTitleMarker__end, 'i')
                ;</p>
<p>            //  get first fragment
            //  ==================
                var _firstFragment = $D.nextPage__getFirstFragment(_foundHTML);</p>
<p>                //  gets first 2000 characters
                //  diff set at 100 -- 0.05
                switch (true)
                {
                    case ($D.levenshteinDistance(_firstFragment, $N.nextPage__firstFragment__firstPage) < 100):
                    case ($D.levenshteinDistance(_firstFragment, $N.nextPage__firstFragment__lastPage) < 100):
                        //  break
                        return false;</p>
<p>                    default:
                        //  add to first fragemnts
                        $N.nextPage__firstFragment__lastPage = _firstFragment;
                        break;
                }</p>
<p>            //  remove title -- do it twice
            //  ============</p>
<p>                //  once with document title
                _foundHTML = $D.getContent__find__isolateTitleInHTML(_foundHTML, ($D.document.title > '' ? $D.document.title : ''));
                _foundHTML = _foundHTML.replace(_removeTitleRegex, '');</p>
<p>                //  once with article title
                _foundHTML = $D.getContent__find__isolateTitleInHTML(_foundHTML, $D.articleTitle);
                _foundHTML = _foundHTML.replace(_removeTitleRegex, '');</p>
<p>            //	return
            //	======
                var _page = {
                    '_url':         _pageWindow.location.href,
                    '_html':        _foundHTML,
                    '_elements':    [_found._targetCandidate.__node]
                };</p>
<p>                $N.pages.push(_page);
                if ($N.callbacks.newPageFound) { $N.callbacks.newPageFound(_page); }</p>
<p>            //	next
            //	====
                $N.nextPage__find(_pageWindow, _found._links);
        };</p>
<p>	//  load }</p>
<p>    //  find {
    //  ======</p>
<p>		$N.nextPage__find = function (_currentPageWindow, _linksInCurrentPage)
		{
			//	page id
				var _pageNr = ($N.pages.length + 1);</p>
<p>			//	get
			//	===
				var _possible = [];
				if (_possible.length > 0); else { _possible = $N.nextPage__find__possible(_currentPageWindow, _linksInCurrentPage, 0.5); }
				//if (_possible.length > 0); else { _possible = $N.nextPage__find__possible(_currentPageWindow, _linksInCurrentPage, 0.50); }</p>
<p>				//	none
				if (_possible.length > 0); else
					{ if ($D.debug) { $D.log('no next link found'); } return; }</p>
<p>				//  log
				if ($D.debug) { $D.log('possible next', _possible); }</p>
<p>			//	the one
			//	=======
				var _nextLink = false;</p>
<p>			//	next keyword?
			//	=============
				(function ()
				{
					if (_nextLink) { return; }</p>
<p>					for (var i=0, _i=_possible.length; i<_i; i++)
					{
						for (var j=0, _j=$N.parseOptions._next_page_keywords.length; j<_j; j++)
						{
							if (_possible[i]._caption.indexOf($N.parseOptions._next_page_keywords[j]) > -1)
							{
								//	length
								//	======
									if (_possible[i]._caption.length > $N.parseOptions._next_page_keywords[j].length * 2)
										{ continue; }</p>
<p>								//	not keywords
								//	============
									for (var z=0, _z=$N.parseOptions._next_page_keywords_not.length; z<_z; z++)
									{
										if (_possible[i]._caption.indexOf($N.parseOptions._next_page_keywords_not[z]) > -1)
											{ _nextLink = false; return; }
									}</p>
<p>								//	got it
								//	======
									_nextLink = _possible[i];
									return;
							}
						}
					}
				})();	</p>
<p>			//	caption matched page number
			//	===========================
				(function ()
				{
					if (_nextLink) { return; }</p>
<p>					for (var i=0, _i=_possible.length; i<_i; i++)
					{
						if (_possible[i]._caption == (''+_pageNr))
							{ _nextLink = _possible[i]; return; }
					}
				})();</p>
<p>			//	next keyword in title
			//	=====================
				(function ()
				{
					if (_nextLink) { return; }</p>
<p>					for (var i=0, _i=_possible.length; i<_i; i++)
					{
						//	sanity
						if (_possible[i]._title > ''); else { continue; }
						if ($D.measureText__getTextLength(_possible[i]._caption) <= 2); else { continue; }</p>
<p>						for (var j=0, _j=$N.parseOptions._next_page_keywords.length; j<_j; j++)
						{
							if (_possible[i]._title.indexOf($N.parseOptions._next_page_keywords[j]) > -1)
							{
								//	length
								//	======
									if (_possible[i]._title.length > $N.parseOptions._next_page_keywords[j].length * 2)
										{ continue; }</p>
<p>								//	not keywords
								//	============
									for (var z=0, _z=$N.parseOptions._next_page_keywords_not.length; z<_z; z++)
									{
										if (_possible[i]._title.indexOf($N.parseOptions._next_page_keywords_not[z]) > -1)
											{ _nextLink = false; return; }
									}</p>
<p>								//	got it
								//	======
									_nextLink = _possible[i];
									return;
							}
						}
					}
				})();</p>
<p>			//	return?
			//	=======
				if (_nextLink); else { return; }</p>
<p>			//	mark
			//	====
				if ($D.debug)
				{
					$D.debugOutline(_nextLink._node, 'target', 'next-page');
					$D.log('NextPage Link', _nextLink, _nextLink._node);
				}</p>
<p>			//	process page
			//	============
				$N.nextPage__loadToFrame(_pageNr, _nextLink._href);
		};</p>
<p>		$N.nextPage__find__possible = function (_currentPageWindow, _linksInCurrentPage, _distanceFactor)
		{
			var 
				_mainPageHref = $D.window.location.href,
				_mainPageDomain = $N.getURLDomain(_mainPageHref),
				_mainPagePath = $N.getURLPath(_mainPageHref)
			;</p>
<p>			var _links = $CJ.map
			(
				_linksInCurrentPage,
				function (_element, _index)
				{
					var 
						_href = _element.__node.href,
						_path = $N.getURLPath(_href),
						_title = (_element.__node.title > '' ? _element.__node.title.toLowerCase() : ''),
						_caption = _element.__node.innerHTML.replace(/<[^>]+?>/gi, '').replace(/\&#038;[^\&\s;]{1,10};/gi, '').replace(/\s+/gi, ' ').replace(/^ /, '').replace(/ $/, '').toLowerCase(),
						_distance = $D.levenshteinDistance(_mainPagePath, _path)
					;</p>
<p>					var _caption2 = '';
					for (var i=0, _i=_caption.length, _code=0; i<_i; i++)
					{
						_code = _caption.charCodeAt(i);
						_caption2 += (_code > 127 ? ('&#'+_code+';') : _caption.charAt(i));
					}
					_caption = _caption2;</p>
<p>					switch (true)
					{
						case (!(_href > '')):
						case (_mainPageHref.length > _href.length):
						case (_mainPageDomain != $N.getURLDomain(_href)):
						case (_href.substr(_mainPageHref.length).substr(0, 1) == '#'):
						case (_distance > Math.ceil(_distanceFactor * _path.length)):
							return null;</p>
<p>						default:
							//	skip if already loaded as next page
							for (var i=0, _i=$N.pages.length; i<_i; i++)
								{ if ($N.pages[i]._url == _href) { return null; } }</p>
<p>							//	return
							return {
								'_node': _element.__node,
								'_href': _href,
								'_title': _title,
								'_caption': _caption,
								'_distance': _distance
							};
					}
				}
			);</p>
<p>			//	sort -- the less points, the closer to position 0
			//	====
				_links.sort(function (a, b)
				{
					switch (true)
					{
						case (a._distance < b._distance): return -1;
						case (a._distance > b._distance): return 1;
						default: return 0;
					}
				});</p>
<p>			//	return
				return _links;
		};</p>
<p>    //  find }</p>
<p>    //  start {
    //  =======</p>
<p>        $N.start = function ()
        {
            //  first fragments
                $N.nextPage__firstFragment__firstPage = $D.nextPage__firstFragment__firstPage;
                $N.nextPage__firstFragment__lastPage = $D.nextPage__firstFragment__lastPage;</p>
<p>            //  first page
                $N.pages = [{ '_url': $D.window.location.href }];</p>
<p>            //  start
                $N.nextPage__find($D.window, $D.nextPage__firstLinks);
        };</p>
<p>    //  start }</p>
<p>    //  return self
    //  ===========
        return $N;
}
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/*!
 *  ClearlyComponent__reformat
 *  Evernote Clearly's display as an embeddable component.
 *  Copyright 2013, Evernote Corporation
 *
 *  Usage:
 *  ======
 *
 *      // define
 *      window.ClearlyComponent__reformat = {
 *          'callbacks': {
 *              'frameCreated': someFunction(),
 *              'pageAdded': someFunction(),
 *          },
 *
 *          'settings': { 
 *              'cssPath': 'string',
 *              'pageLabel': 'string'.
 *              'onCreateFrameUseThisId': 'string',
 *              'onCreateFrameDoNotInsertCSS': true
 *          },
 *
 *          'window': window,
 *          'document': document,
 *          'jQuery': window.jQuery
 *      };
 *
 *      // init -- will return false, if something goes wrong
 *      window.ClearlyComponent__reformat = initClearlyComponent__reformat(window.ClearlyComponent__reformat);
 *
 *      // create frame
 *      window.ClearlyComponent__detect.createFrame();
 *
 *      // apply options
 *      window.ClearlyComponent__detect.applyOptions(_options_object);
 *
 *      // add page
 *      window.ClearlyComponent__detect.addNewPage(_html, _source_url);
 *
 */</p>
<p>/*
    changes:
    ========
        $R => $R
        $R.win => $R.window</p>
<p>    to do:
    ======
*/</p>
<p>function initClearlyComponent__reformat(_paramInstance)
{
    //  global instance reference {
    //  ===========================</p>
<p>        //  null; return
        if (_paramInstance); else { return false; }</p>
<p>        //  shorthand
        $R = _paramInstance;</p>
<p>    //  global instance reference }</p>
<p>    //  required vars {
    //  ===============</p>
<p>        //  the component instance object must already be created,
        //  when the init function is called. it must have these vars set:</p>
<p>        switch (true)
        {
            case (!($R.settings)):
            case (!($R.settings.cssPath)):</p>
<p>            case (!($R.window)):
            case (!($R.document)):
            case (!($R.document.body)):</p>
<p>            case (!($R.jQuery)):</p>
<p>                if ($R.debug)
                {
                    console.log(!($R.settings));
                    console.log(!($R.settings.cssPath));</p>
<p>                    console.log(!($R.window));
                    console.log(!($R.document));
                    console.log(!($R.document.body));</p>
<p>                    console.log(!($R.jQuery));
                }</p>
<p>                //  something's wrong
                return false;
        }</p>
<p>    //  required vars }</p>
<p>    //  missing settings {
    //  ==================</p>
<p>        //  names for stuff
        /* frame id */            if ($R.settings.onCreateFrameUseThisId); else             { $R.settings.onCreateFrameUseThisId =            'clearly_frame'; }
        /* insert frame css */    if ($R.settings.onCreateFrameDoNotInsertCSS); else        { $R.settings.onCreateFrameDoNotInsertCSS =       false; }
        /* page label */          if ($R.settings.pageLabel); else                          { $R.settings.pageLabel =                         'Page '; }</p>
<p>    //  missing settings }</p>
<p>    //  global vars {
    //  =============</p>
<p>        $CJ = $R.jQuery;</p>
<p>        $R.$window = $CJ($R.window);
        $R.$document = $CJ($R.document);</p>
<p>        $R.pagesCount = 0;
        $R.footnotedLinksCount;</p>
<p>        /*
            .iframe, .$iframe
            .iframeWindow, .$iframeWindow
            .iframeDocument, .$iframeDocument
            .$iframeBackground, .$iframeBox, .$iframePages
        */</p>
<p>    //  global vars }</p>
<p>    //  debug {
    //  =======</p>
<p>        $R.debug = ($R.debug || false);
		$R.debugRemembered = {};
        $R.debugTimers = [];</p>
<p>		if ($R.debug)
		{
		    //  writeLog
		    //  ========
				switch (true)
				{
					case (!(!($R.window.console &#038;&#038; $R.window.console.log))):    $R.writeLog = function (msg) { $R.window.console.log(msg); };       break;
					case (!(!($R.window.opera &#038;&#038; $R.window.opera.postError))):  $R.writeLog = function (msg) { $R.window.opera.postError(msg); };   break;
					default:                                                    $R.writeLog = function (msg) {};                                    break;
				}</p>
<p>            //  log
            //  ===
                $R.log = function ()
                {
                    if ($R.debug); else { return; }
                    for (var i=0, il=arguments.length; i<il ; i++) { $R.writeLog(arguments[i]); }
                    $R.writeLog('-----------------------------------------');
                };</p>
<p>            //  remember
            //  ========
                $R.debugRemember = function (_k, _v)
                {
                    $R.debugRemembered[_k] = _v;
                };
		}
		else
		{
            $R.writeLog 		= function () { return false; };
            $R.log 				= function () { return false; };
            $R.debugRemember 	= function () { return false; };
        }</p>
<p>    //  debug }</p>
<p>    //  encode / decode {
    //  =================</p>
<p>		$R.encode = function (_string)
		{
			//	none
			if (_string == '') { return 'none'; }</p>
<p>			//	encode
			return encodeURIComponent(_string)
				.replace(/!/g, '%21')
				.replace(/'/g, '%27')
				.replace(/\(/g, '%28')
				.replace(/\)/g, '%29')
				.replace(/\*/g, '%2A')
			;
		};</p>
<p>		$R.decode = function (_string)
		{
			//	none
			if (_string == 'none') { return ''; }</p>
<p>			//	decode
			return decodeURIComponent(_string);
		};</p>
<p>    //  encode / decode }</p>
<p>    //  themes {
    //  ========</p>
<p>        (function ()
        {
            //  themes already set
            if ($R.availableThemes) { return; } </p>
<p>            //  set themes
            $R.availableThemes = {
                'newsprint': {
                    'text_font': 			$R.encode('"PT Serif"'),
                    'text_font_header': 	$R.encode('"PT Serif"'),
                    'text_font_monospace': 	$R.encode('Inconsolata'),
                    'text_size': 			$R.encode('16px'),
                    'text_line_height': 	$R.encode('1.5em'),
                    'box_width': 			$R.encode('36em'),
                    'color_background': 	$R.encode('#f3f2ee'),
                    'color_text': 			$R.encode('#1f0909'),
                    'color_links': 			$R.encode('#065588'),
                    'text_align': 			$R.encode('normal'),
                    'base': 				$R.encode('base__newsprint'),
                    'footnote_links': 		$R.encode('on_print'),
                    'large_graphics': 		$R.encode('do_nothing'),
                    'custom_css': 			$R.encode(''
                                            + '#text #articleHeader { border-color: #c5c5c5; }'
                                            + '#text #relatedNotes { border-color: rgba(197, 197, 197, 0.5); }'
                                            + '#text blockquote { border-color: #bababa; color: #656565; }'
                                            + '#text thead { background-color: #dadada; }'
                                            + '#text tr:nth-child(even) { background: #e8e7e7; }'
                                            + '#text hr { border-color: #c5c5c5; }')
                },
                'notable': {
                    'text_font': 			$R.encode('Helvetica, Arial'),
                    'text_font_header': 	$R.encode('Helvetica, Arial'),
                    'text_font_monospace': 	$R.encode('"Droid Sans Mono"'),
                    'text_size': 			$R.encode('14px'),
                    'text_line_height': 	$R.encode('1.5em'),
                    'box_width': 			$R.encode('42em'),
                    'color_background': 	$R.encode('#fff'),
                    'color_text': 			$R.encode('#333'),
                    'color_links': 			$R.encode('#090'),
                    'text_align': 			$R.encode('normal'),
                    'base': 				$R.encode('base__notable'),
                    'footnote_links': 		$R.encode('on_print'),
                    'large_graphics': 		$R.encode('do_nothing'),
                    'custom_css': 			$R.encode(''
                                            + '#text #articleHeader { border-color: #000; }'
                                            + '#text #relatedNotes { border-color: rgba(0, 0, 0, 0.25); }'
                                            + '#text h1 { color: #000; }'
                                            + '#text h2, #text h3, #text h4, #text h5, #text h6 { color: #444; }'
                                            + '#text blockquote { border-color: #d1d1d1; }'
                                            + '#text thead { background-color: #444; color: #fff; }'
                                            + '#text tr:nth-child(even) { background: #d1d1d1; }'
                                            + '#text hr { border-color: #000; }')
                },
                'night_owl': {
                    'text_font': 			$R.encode('"PT Serif"'),
                    'text_font_header': 	$R.encode('"PT Serif"'),
                    'text_font_monospace': 	$R.encode('Inconsolata'),
                    'text_size': 			$R.encode('16px'),
                    'text_line_height': 	$R.encode('1.5em'),
                    'box_width': 			$R.encode('36em'),
                    'color_background': 	$R.encode('#2d2d2d'),
                    'color_text': 			$R.encode('#e3e3e3'),
                    'color_links': 			$R.encode('#e3e3e3'),
                    'text_align': 			$R.encode('normal'),
                    'base': 				$R.encode('base__night_owl'),
                    'footnote_links': 		$R.encode('on_print'),
                    'large_graphics': 		$R.encode('do_nothing'),
                    'custom_css': 			$R.encode(''
                                            + '#text #articleHeader { border-color: #c5c5c5; }'
                                            + '#text #relatedNotes { border-color: rgba(197, 197, 197, 0.5); }'
                                            + '#text a:link { -webkit-transition: all 0.3s ease; -moz-transition: all 0.3s ease; -o-transition: all 0.3s ease; }'
                                            + '#text #relatedNotes a { -webkit-transition-duration: 0s; -moz-transition-duration: 0s; -o-transition-duration: 0s; }'
                                            + '#text a:hover, #text a:active {	color: #44bde8; }'
                                            + '#text blockquote { color: #c1bfbf; border-color: #c1bfbf; }'
                                            + '#text thead { background-color: #4f4f4f; }'
                                            + '#text tr:nth-child(even) { background: #404040; }'
                                            + '#text hr { border-color: #c5c5c5; }')
                }
            };
        })();</p>
<p>    //  themes }</p>
<p>    //  font sizes {
    //  ============</p>
<p>        (function ()
        {
            //  font sizes already set
            if ($R.availableFontSizes) { return; } </p>
<p>            //  set font sizes
            $R.availableFontSizes = {
                'small':    { 'newsprint': '12px', 'notable': '12px', 'night_owl': '12px' },
                'medium':   { 'newsprint': '16px', 'notable': '16px', 'night_owl': '16px' },
                'large':    { 'newsprint': '20px', 'notable': '20px', 'night_owl': '20px' }
            };
        })();</p>
<p>    //  font sizes }</p>
<p>    //  google fonts {
    //  ==============</p>
<p>        (function ()
        {
            //  google fonts already set
            if ($R.availableGoogleFonts) { return; }</p>
<p>            //  set google fonts to these
            var __google_fonts_array = [
                /* serif */ 'Arvo', 'Bentham', 'Cardo', 'Copse', 'Corben', 'Crimson Text', 'Droid Serif', 'Goudy Bookletter 1911', 'Gruppo', 'IM Fell', 'Josefin Slab', 'Kreon', 'Meddon', 'Merriweather', 'Neuton', 'OFL Sorts Mill Goudy TT', 'Old Standard TT', 'Philosopher', 'PT Serif', 'Radley', 'Tinos', 'Vollkorn',
                /* sans  */ 'Allerta', 'Anton', 'Arimo', 'Bevan', 'Buda', 'Cabin', 'Cantarell', 'Coda', 'Cuprum', 'Droid Sans', 'Geo', 'Josefin Sans', 'Lato', 'Lekton', 'Molengo', 'Nobile', 'Orbitron', 'PT Sans', 'Puritan', 'Raleway', 'Syncopate', 'Ubuntu', 'Yanone Kaffeesatz',
                /* fixed */ 'Anonymous Pro', 'Cousine', 'Droid Sans Mono', 'Inconsolata'
            ];</p>
<p>            //  set
            $R.availableGoogleFonts = {};
            for (var i=0, ii=__google_fonts_array.length; i<ii; i++){
                $R.availableGoogleFonts[__google_fonts_array[i]] = 1;
            }
        })();</p>
<p>    //  google fonts }</p>
<p>    //  default options {
    //  =================</p>
<p>        $R.defaultOptions = 
        {
            'text_font': 			$R.encode('"PT Serif"'),
            'text_font_header': 	$R.encode('"PT Serif"'),
            'text_font_monospace': 	$R.encode('Inconsolata'),
            'text_size': 			$R.encode('16px'),
            'text_line_height': 	$R.encode('1.5em'),
            'box_width': 			$R.encode('36em'),
            'color_background': 	$R.encode('#f3f2ee'),
            'color_text': 			$R.encode('#1f0909'),
            'color_links': 			$R.encode('#065588'),
            'text_align': 			$R.encode('normal'),            /* normal, justified */
            'base': 				$R.encode('base__newsprint'),   /* base__ newsprint, notable, night_owl */
            'footnote_links': 		$R.encode('on_print'),          /* on_print, always, never */
            'large_graphics': 		$R.encode('do_nothing'),        /* do_nothing, hide_on_print, hide_always */
            'custom_css': 			('')
        };</p>
<p>    //  default options }</p>
<p>    //  get css from options {
    //  ======================</p>
<p>        $R.getCSSFromOptions = function (_options)
        {
            var _cssText = (''
            +	'#body { '
            +		'font-family: [=text_font]; '
            +		'font-size: [=text_size]; '
            +		'line-height: [=text_line_height]; '
            +		'color: [=color_text]; '
            +		'text-align: '+(_options['text_align'] == 'justified' ? 'justify' : 'left')+'; '
            +	'} '</p>
<p>            +	'#background { background-color: [=color_background]; } '</p>
<p>            +	'.setTextColorAsBackgroundColor { background-color: [=color_text]; } '
            +	'.setBackgroundColorAsTextColor { color: [=color_background]; } '</p>
<p>            +	'#box, .setBoxWidth { width: [=box_width]; } '</p>
<p>            +	'a { color: [=color_links]; } '
            +	'a:visited { color: [=color_text]; } '</p>
<p>            +	'@media print { body.footnote_links__on_print a, body.footnote_links__on_print a:hover { color: [=color_text] !important; text-decoration: none !important; } } '
            +	'body.footnote_links__always a, body.footnote_links__always a:hover { color: [=color_text] !important; text-decoration: none !important; } '</p>
<p>            +	'img { border-color: [=color_text]; } '
            +	'a img { border-color: [=color_links]; } '
            +	'a:visited img { border-color: [=color_text]; } '</p>
<p>            +	'h1 a, h2 a, a h1, a h2 { color: [=color_text]; } '
            +	'h1, h2, h3, h4, h5, h6 { font-family: [=text_font_header]; } '</p>
<p>            +	'pre { background-color: [=color_background]; } '
            +	'pre, code { font-family: [=text_font_monospace]; } '
            +	'hr { border-color: [=color_text]; } '</p>
<p>            +	'html.rtl #body #text { text-align: ' + (_options['text_align'] == 'justified' ? 'justify' : 'right')+' !important; } '
            +	'h1, h2, h3, h4, h5, h6 { text-align: left; } '
            +	'html.rtl h1, html.rtl h2, html.rtl h3, html.rtl h4, html.rtl h5, html.rtl h6 { text-align: right !important; } '</p>
<p>            +	'[=custom_css] '
            ).replace(
                /\[=([a-z_]+?)\]/gi,
                function (_match, _key) { return _options[_key]; }
            );</p>
<p>            return _cssText;
        }</p>
<p>    //  get css from options }</p>
<p>    //  apply options {
    //  ===============</p>
<p>        //	var
        //	===</p>
<p>            //  _encodedOptions and _decodeOptions hold the options to be applied
            //	$R.appliedOptions holds the options currently applied (encoded)
            //	$R.loadedGoogleFonts holds the  currently loaded Google fonts URLs</p>
<p>            $R.appliedOptions = {};
            $R.loadedGoogleFonts = {};</p>
<p>        //	apply options
        //	=============
            $R.applyOptions = function (_encodedOptions)
            {
                //  possible options
                //  =================
                    var _possible_options = $R.defaultOptions;</p>
<p>                //  our themes        
                //  ==========
                    var _ourOwnThemes = '|theme-1|theme-2|theme-3|';</p>
<p>                //	null
                //	====
                    if (_encodedOptions); else { _encodedOptions = {}; }</p>
<p>                //  blank, invalid
                //  ==============
                    for (var _option in _possible_options)
                    {
                        switch (true)
                        {
                            case (!(_option in _encodedOptions)):
                            case (!(_encodedOptions[_option] > '')):
                                //  either current, or default
                                _encodedOptions[_option] = ($R.appliedOptions[_option] ? $R.appliedOptions[_option] : _possible_options[_option]);
                                break;
                        }
                    }</p>
<p>                //	what to do
                //	==========</p>
<p>                    var 
                        _resetBase = false,
                        _resetOptions = false, 
                        _decodedOptions = {}
                    ;</p>
<p>                //  set stuff
                //  =========</p>
<p>                    //	_resetBase
                    switch (true)
                    {
                        case (!('base' in  $R.appliedOptions)):
                        case (!(_encodedOptions['base'] == $R.appliedOptions['base'])):
                            _resetBase = true;
                            break;
                    }</p>
<p>                    //	_resetOptions
                    for (var _option in _possible_options)
                    {
                        switch (true)
                        {
                            case (!(_option in $R.appliedOptions)):
                            case (!(_encodedOptions[_option] == $R.appliedOptions[_option])):
                                _resetOptions = true;
                                break;
                        }</p>
<p>                        //	stop
                        if (_resetOptions) { break; }
                    }	</p>
<p>                    //	appliedOptions and optionsToApply
                    for (var _option in _possible_options)
                    {
                        $R.appliedOptions[_option] = _encodedOptions[_option];
                        _decodedOptions[_option] = $R.decode(_encodedOptions[_option]);
                    }</p>
<p>                //	apply stuff
                //	===========</p>
<p>                    //  base
                    if (_resetBase)
                    {
                        //	remove old
                        $R.$iframeDocument.find('#baseCSS').remove();</p>
<p>                        //	add new
                        if (_decodedOptions['base'] > '')
                        {
                            $R.$iframeDocument.find('head').append(''
                                + '	
<link id="baseCSS" href="'
                                + $R.settings.cssPath + _decodedOptions['base']+'.css'
                                + '" rel="stylesheet" type="text/css" />'
                            );
                        }
                    }</p>
<p>                    //	options
                    if (_resetOptions)
                    {
                        var _cssText = $R.getCSSFromOptions(_decodedOptions);</p>
<p>                        //	remove old
                        //	==========
                            $R.$iframeDocument.find('#optionsCSS').remove();</p>
<p>                        //	new
                        //	===
                            var _cssElement = document.createElement('style');
                                _cssElement.setAttribute('type', 'text/css');
                                _cssElement.setAttribute('id', 'optionsCSS');</p>
<p>                            if (_cssElement.styleSheet) { _cssElement.styleSheet.cssText = _cssText; }
                                else { _cssElement.appendChild(document.createTextNode(_cssText)); }</p>
<p>                            $R.$iframeDocument.find('head').append(_cssElement);</p>
<p>                        //	body classes
                        //	============
                            $R.$iframeDocument.find('body')
                                .removeClass('footnote_links__on_print footnote_links__always footnote_links__never')
                                .removeClass('large_graphics__do_nothing large_graphics__hide_on_print large_graphics__hide_always')
                                .addClass('footnote_links__'+_decodedOptions['footnote_links'])
                                .addClass('large_graphics__'+_decodedOptions['large_graphics'])
                            ;
                    }	
            };</p>
<p>    //  apply options }</p>
<p>    //  apply google fonts  {
    //  =====================</p>
<p>        $R.getGoogleFontsFromOptions = function (_options)
        {
            var 
                _fonts = {},
                _fonts_urls = [],
                _check_font = function (_match, _font) {
                    if (_font in $R.availableGoogleFonts) { _fonts[_font] = 1; }
                }
            ;</p>
<p>            //	body
            //	====
                _options['text_font'].replace(/"([^",]+)"/gi, _check_font);
                _options['text_font'].replace(/([^",\s]+)/gi, _check_font);				</p>
<p>            //	headers
            //	=======
                _options['text_font_header'].replace(/"([^",]+)"/gi, _check_font);
                _options['text_font_header'].replace(/([^",\s]+)/gi, _check_font);				</p>
<p>            //	monospace
            //	=========
                _options['text_font_monospace'].replace(/"([^",]+)"/gi, _check_font);
                _options['text_font_monospace'].replace(/([^",\s]+)/gi, _check_font);				</p>
<p>            //	custom css
            //	==========
                _options['custom_css'].replace(/font-family: "([^",]+)"/gi, _check_font);
                _options['custom_css'].replace(/font-family: ([^",\s]+)/gi, _check_font);</p>
<p>            //	return
            //	======</p>
<p>                //	transform to array
                for (var _font in _fonts)
                {
                    _fonts_urls.push(''
                        + 'http://fonts.googleapis.com/css?family='
                        + _font.replace(/\s+/g, '+')
                        + ':regular,bold,italic'
                    );
                }</p>
<p>                //	return
                return _fonts_urls;
        };</p>
<p>        $R.loadGoogleFontsRequiredByAppliedOptions = function ()
        {
            //  decode options
            var _decodedOptions = {};
            for (var _option in $R.appliedOptions)
                { _decodedOptions[_option] = $R.decode($R.appliedOptions[_option]); }</p>
<p>            //	get
            var _fonts_urls = $R.getGoogleFontsFromOptions(_decodedOptions);</p>
<p>            //	apply
            for (var i=0,_i=_fonts_urls.length; i<_i; i++) {
                /* loaded */    if ($R.loadedGoogleFonts[_fonts_urls[i]]) { continue; }
                /* load */      $R.$iframeDocument.find('head').append('	
<link href="'+_fonts_urls[i]+'" rel="stylesheet" type="text/css" />');
                /* mark */      $R.loadedGoogleFonts[_fonts_urls[i]] = 1;
            }
        };</p>
<p>    //  apply google fonts }</p>
<p>    //  create frame {
    //  ==============</p>
<p>        $R.createFrame = function ()
        {
            //  default id
            //  ==========
                _frame_id = $R.settings.onCreateFrameUseThisId;</p>
<p>            //	iframe
            //	======
                var
                    _iframeElement = $R.document.createElement('div'),
                    _iframeHTML = ''
                    +	'</p>
<div id="html">'
                    +	    '</p>
<div id="body">'
                    +	    	'</p>
<div id="bodyContent">'</p>
<p>                    +	            '</p>
<div id="box">'
                    +	    	        '</p>
<div id="box_inner">'
                    +	    		        '</p>
<div id="text">'
                    +	    			        '</p>
<div id="pages"></div>
<p>'
                    +	    			        '</p>
<ol id="footnotedLinks"></ol>
<p>'
                    +	    		        '</p></div>
<p>'
                    +	    	        '</p></div>
<p>'
                    +	            '</p></div>
<p>'
                    +	            '</p>
<div id="background"></div>
<p>'
                    +           '</p></div>
<p>'
                    +	    '</p></div>
<p>'
                    +	'</p></div>
<p>'
                ;
                _iframeElement.setAttribute('id', _frame_id);</p>
<p>            //	css
            //	===</p>
<p>                if ($R.settings.onCreateFrameDoNotInsertCSS); else
                {
                    var 
                        _cssElement = $R.document.createElement('style'),
                        _cssText = ''
                        +	'#'+_frame_id+' { '
                        +		'margin: 0; padding: 0; border: none; '
                        +		'position: absolute; '
                        +		'width: 10px; height: 10px; '
                        +		'top: -100px; left: -100px; '
                        +	'} '
                    ;
                    _cssElement.setAttribute('id', _frame_id + '__css');
                    _cssElement.setAttribute('type', 'text/css');
                    if (_cssElement.styleSheet) { _cssElement.styleSheet.cssText = _cssText; }
                        else { _cssElement.appendChild($R.document.createTextNode(_cssText)); }
                }</p>
<p>            //	write
            //	=====</p>
<p>                var _body = $R.document.getElementsByTagName('body')[0];
                    /* css */   if (_cssElement) { _body.appendChild(_cssElement); }
                    /* frame */ _body.appendChild(_iframeElement);</p>
<p>                var _iframe = $R.document.getElementById(_frame_id);
                var _doc;
                _iframe.innerHTML = _iframeHTML;</p>
<p>            //  callback &#038; variables
            //  ====================
                var _check_interval = false;
                var _check = function ()
                {
                    //  iframe
                        var _iframe = $R.document.getElementById(_frame_id);
                        if (_iframe); else { return; }</p>
<p>                    //  body
                        var _body = $CJ(_iframe).find('#bodyContent')[0];</p>
<p>                        if (_body); else { return; }</p>
<p>                    //  clear interval
                        $R.window.clearInterval(_check_interval);</p>
<p>                    //  global vars
                        $R.iframe = _iframe;
                        $R.$iframe = $CJ($R.iframe);</p>
<p>                        $R.iframeDocument = _iframe;
                        $R.$iframeDocument = $CJ($R.iframeDocument);</p>
<p>                        $R.iframeWindow = _iframe;
                        $R.$iframeWindow = $CJ($R.iframeWindow);</p>
<p>                        $R.$iframeBox = $R.$iframeDocument.find('#box');
                        $R.$iframePages = $R.$iframeDocument.find('#pages');
                        $R.$iframeBackground = $R.$iframeDocument.find('#background');
                        $R.$iframeFootnotedLinks = $R.$iframeDocument.find('#footnotedLinks');</p>
<p>                    //  callback
                        if ($R.callbacks.frameCreated) { $R.callbacks.frameCreated(); }
                };</p>
<p>                //  set interval
                _check_interval = $R.window.setInterval(_check, 250);
        };</p>
<p>    //  create frame }</p>
<p>    //  add page {
    //  ==========</p>
<p>        $R.addNewPage = function (_pageHTML, _pageURL)
        {
            //  update page count
            //  =================
                var _pageNr = $R.pagesCount + 1;
                $R.pagesCount++;</p>
<p>            //	separator
            //	=========
                if (_pageNr > 1)
                {
                    $R.$iframePages.append(''
                        + '</p>
<div class="pageSeparator">'
                        +	'</p>
<div class="pageSeparatorLine setTextColorAsBackgroundColor"></div>
<p>'
                        + 	'</p>
<div class="pageSeparatorLabel"><em>'+$R.settings.pageLabel+_pageNr+'</em></div>
<p>'
                        + '</p></div>
<p>'
                    );
                }</p>
<p>            //	append page
            //	===========
                $R.$iframePages.append(''
                    + '</p>
<div class="page" id="page'+_pageNr+'">'
                    +     '</p>
<div class="page_content">'
                    + 	      _pageHTML
                    +     '</div>
<p>'
                    + '</p></div>
<p>'
                );</p>
<p>            //  this new page
            //  =============</p>
<p>                //  cache
                var _$page = $R.$iframeDocument.find('#page'+_pageNr);</p>
<p>                //	links as footnotes
                _$page.find('a').each(function (_index, _element)
                {
                    //	check
                    var _href = _element.href;
                    if (_href > ''); else { return; }
                    if (_href.indexOf); else { return; }
                    if (_href.indexOf('#') > -1) { return; }</p>
<p>                    //	count
                    var _nr = ++$R.footnotedLinksCount;</p>
<p>                    //	add
                    $CJ(_element).append(' <sup class="readableLinkFootnote">['+_nr+']</sup>');
                    $R.$iframeFootnotedLinks.append('</p>
<li>'+_href+'</li>
<p>');
                });
        };</p>
<p>    //  add page }</p>
<p>    //  clear all pages {
    //  =================</p>
<p>        $R.clearAllPages = function ()
        {
            //  reset pages count
            $R.pagesCount = 0;</p>
<p>            //  delete all pages
            $R.$iframePages.get(0).innerHTML = '';</p>
<p>            //  reset footnote count
            $R.footnotedLinksCount = 0;</p>
<p>            //  delete all footnotes
            $R.$iframeFootnotedLinks.get(0).innerHTML = '';
        };</p>
<p>    //  clear all pages }</p>
<p>    //  return self
    //  ===========
        return $R;
}
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ClearlyController = {
    _created : false,
    _visible : false,
    _logEnabled : false,
    _detectResult : null,</p>
<p>    logger : function(text) {
        if (!this._logEnabled) return;
        console.log('[Clearly] : ' + text);
    },</p>
<p>    getSimplifiedArticle : function() {
        this.logger('getSimplifiedArticle()');
        return Evernote.JQuery('#evernoteClearlyArticle #box #text').get(0);
    },</p>
<p>    changeFrameClassTo : function(className) {
        this.clearlyFrame[0].className = '';
        this.clearlyFrame.addClass(className);
    },</p>
<p>    hide : function() {
        this.logger('hide()');
        var self = this;
        if (this._created &#038;&#038; this._visible) {
            this.clearlyBackground.stop();
            this.changeFrameClassTo('processing');
            this.clearlyBackground.animate({right:'100%'}, 500, null,
                function() {
                    self.changeFrameClassTo('temphidden');
                    window.focus();
                }
            );
            this._visible = false;
        }
    },</p>
<p>    show : function() {
        this.logger('show()');
        var self = this;
        if (this._created &#038;&#038; !this._visible) {
            this.clearlyBackground.stop();
            this.changeFrameClassTo('processing');
            this.clearlyBackground.animate({ right: "0px" }, 500, null,
                function() {
                    self.changeFrameClassTo('visible');
                    window.focus();
                }
            );
            this._visible = true;
        }
    },</p>
<p>    detectComponent : function(callback) {
        this.logger('detectComponent()');
        window.ClearlyComponent__detect = {
            callbacks: {
                finished: function(data) {
                    if (callback) callback(data);
                }
            },
            window: window,
            document: document,
            jQuery: Evernote.JQuery
        };</p>
<p>        window.ClearlyComponent__detect = initClearlyComponent__detect(window.ClearlyComponent__detect);
        window.ClearlyComponent__detect.start();
    },</p>
<p>    reformatComponent : function(callback){
        this.logger('reformatComponent()');
        window.ClearlyComponent__reformat = {
            callbacks: {
                frameCreated: function(data) {
                    if (callback) callback(data);
                }
            },
            settings: {
                cssPath: 'css/clearly',
                pageLabel: "page ",
                onCreateFrameUseThisId: "evernoteClearlyArticle",
                onCreateFrameDoNotInsertCSS: true
            },
            window: window,
            document: document,
            jQuery: Evernote.JQuery
        };</p>
<p>        window.ClearlyComponent__reformat = initClearlyComponent__reformat(window.ClearlyComponent__reformat);
        window.ClearlyComponent__reformat.createFrame();
    },</p>
<p>    getContentElementAndHTML : function (callback) {
        this.logger('getContentElementAndHTML()');
        this.detectComponent(callback);
    },</p>
<p>    getClearlyArticleText : function(callback) {
        this.logger('getClearlyArticleText()');
        this.detectComponent(callback);
    },</p>
<p>    assignClearlyArticleContent : function()  {
        this.logger('showClearlyArticleContent()');
        window.ClearlyComponent__reformat.$iframeBox.find('#text #pages')[0].innerHTML = this._detectResult;
    },</p>
<p>    setContainersSize : function() {
        var maxHeight = Math.max(document.body.scrollHeight, this.clearlyFrame.scrollHeight);</p>
<p>        try { //old ie throws error
            this.clearlyFrame[0].style.height = maxHeight + "px";
        } catch (e) {</p>
<p>        }
    },</p>
<p>    startClearly : function() {
        this.logger('startClearly()');</p>
<p>        var self = this;</p>
<p>        if (this._created) {
            self.show();
            return;
        }</p>
<p>        function onDetectEnd(data) {
            self._detectResult = data._html.replace(/(id|class)="(.*?)"/ig,'cid="$2"');
            self.assignClearlyArticleContent();
            self.show();
        }</p>
<p>        function onFrameCreated() {
            self.clearlyFrame = window.ClearlyComponent__reformat.$iframe;
            self.clearlyBackground = window.ClearlyComponent__reformat.$iframeBackground;
            self._created = true;
            self.setContainersSize();
            self.detectComponent(onDetectEnd);
        }</p>
<p>        window.scrollTo(0,0);
        this.reformatComponent(onFrameCreated);
    },</p>
<p>    isReady : function() {
        return this._created;
    },</p>
<p>    isVisible : function() {
        return this._visible;
    },</p>
<p>    highlight : function () {
        this.logger('highlight()');
        var numTextHighlights;</p>
<p>        window.ClearlyComponent__highlight = {
            callbacks: {
                highlightAdded: function() {
                    numTextHighlights++;
                },
                highlightDeleted: function() {
                    numTextHighlights--;
                }
            },
            settings: {
                imgPath: "images/"
            },
            window: window,
            document: document,
            jQuery: Evernote.JQuery
        };</p>
<p>        window.ClearlyComponent__highlight = initClearlyComponent__highlight(window.ClearlyComponent__highlight);
        window.ClearlyComponent__highlight.insertCSS();
        window.ClearlyComponent__highlight.addMouseHandlers();</p>
<p>        window.ClearlyComponent__highlight.enable();
    },</p>
<p>    disableHighlight : function() {
        this.logger('disableHighlight()');
        if (window.ClearlyComponent__highlight) {
            window.ClearlyComponent__highlight.disable();
        }
    },</p>
<p>    removeHighlighted : function() {
        this.logger('removeHighlighed()');
//        Evernote.JQuery('.clearly_highlight_delete_element').click();
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/**
 * SelectionFinder provides mechanism for finding selection on the page via
 * find(). It is able to traverse frames in order to find a selection. It will
 * report whether there's a selection via hasSelection(). After doing find(),
 * the selection is stored in the selection property, and the document property
 * will contain the document in which the selection was found. Find method will
 * only recurse documents if it was invoked as find(true), specifying to do
 * recursive search. You can use reset() to undo find().
 */
Evernote.SelectionFinder = function SelectionFinder( doc ) {
    this._document = doc;
};</p>
<p>Evernote.SelectionFinder.prototype._document = null;
Evernote.SelectionFinder.prototype._selection = null;</p>
<p>Evernote.SelectionFinder.prototype.hasSelection = function() {
    Evernote.Logger.debug( "SelectionFinder.hasSelection()" );</p>
<p>    var range = Evernote.Utils.fixIERangeObject(this.getRange());
    return range &#038;&#038; (range.startContainer != range.endContainer
        || (range.startContainer == range.endContainer &#038;&#038; range.startOffset != range.endOffset));
};</p>
<p>Evernote.SelectionFinder.prototype.find = function( deep ) {
    Evernote.Logger.debug( "SelectionFinder.find()" );
    var result = this.findSelectionInDocument( this._document, deep );
    this._document = result.document;
    this._selection = result.selection;
};</p>
<p>Evernote.SelectionFinder.prototype.getRange = function() {
    Evernote.Logger.debug( "SelectionFinder.getRange()" );
    if ( !this._selection || this._selection.rangeCount == 0 ) {
        return null;
    }</p>
<p>    if ( typeof this._selection.getRangeAt == 'function' ) {
        return this._selection.getRangeAt( 0 );
    }</p>
<p>    if ( (window.Range &#038;&#038; this._selection instanceof window.Range) || !this._selection.anchorNode ) {
        return this._selection;
    }
    var range = this._document.createRange();
    range.setStart( this._selection.anchorNode, this._selection.anchorOffset );
    range.setEnd( this._selection.focusNode, this._selection.focusOffset );</p>
<p>    return range;
};</p>
<p>Evernote.SelectionFinder.prototype.findSelectionInDocument = function( doc, deep ) {
    try {
        Evernote.Logger.debug( "SelectionFinder.findSelectionInDocument()" );</p>
<p>        var sel = null;
        var hasSelection = false;
        var win = null;</p>
<p>        try {
            win = (doc.defaultView) ? doc.defaultView : window;
        }
        catch ( e ) {
            win = window;
        }
        if ( typeof win.getSelection == 'function' ) {
            sel = win.getSelection();
            if ( sel &#038;&#038; typeof sel.rangeCount != 'undefined' &#038;&#038; sel.rangeCount > 0 ) {
                Evernote.Logger.debug("Found selection by win.getSelection()");
                hasSelection = true;
            }
        }
        else if ( win.selection &#038;&#038; typeof win.selection.createRange == 'function' ) {
            sel = win.selection.createRange();
            if ( win.selection.type == 'Text' &#038;&#038; typeof sel.htmlText == 'string' &#038;&#038; sel.htmlText.length > 0 ) {
                Evernote.Logger.debug("Found selection by win.selection");
                hasSelection = true;
            }
        }
        else if ( doc.selection &#038;&#038; (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') &#038;&#038; (typeof sel.htmlText == 'string') &#038;&#038; (sel.htmlText.length > 0) ) {
                Evernote.Logger.debug("Found selection by doc.selection");
                hasSelection = true;
            }
        }</p>
<p>        if ( sel &#038;&#038; !hasSelection &#038;&#038; deep ) {
            var nestedDocs = Evernote.Utils.getNestedDocuments( doc );
            for ( var i = 0; i < nestedDocs.length; ++i ) {
                if ( nestedDocs[ i ] ) {
                    var framedSel = this.findSelectionInDocument( nestedDocs[ i ], deep );
                    if ( framedSel &#038;&#038; framedSel.selection &#038;&#038; framedSel.selection.rangeCount > 0 ) {
                        return framedSel;
                    }
                }
            }
        }</p>
<p>        //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 );</p>
<p>        var activeEl = doc.activeElement &#038;& false; // disabled, because no need to search selections in this elements.
        if ( activeEl &#038;&#038; ( (window.HTMLInputElement &#038;&#038; (activeEl instanceof window.HTMLInputElement &#038;&#038; activeEl.type == "text")) || ( window.HTMLTextAreaElement &#038;&#038; (activeEl instanceof window.HTMLTextAreaElement)) ) ) {
            if ( activeEl.selectionStart != activeEl.selectionEnd ) {
                var range = doc.createRange();
                var textNode = doc.createTextNode( activeEl.value );</p>
<p>                range.setStart( textNode, activeEl.selectionStart );
                range.setEnd( textNode, activeEl.selectionEnd );
                sel = range;
            }
        }</p>
<p>        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
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.JSSerializer = {</p>
<p>    _selectionFinder : new Evernote.SelectionFinder(window.document),</p>
<p>    serializeAsync : function( element, fullPage, callback ) {
        try {
            var start = new Date().getTime();
            var root = element || document.body.parentNode || document.body;
            var serializer = new Evernote.NodeSerializer( window, new Evernote.ClipFullStylingStrategy() );
            var parser = new Evernote.DomParser( window, null );</p>
<p>            var resultFunc = function() {
                var images = [];
                var imageUrls = serializer.getImagesUrls();</p>
<p>                for(var i = 0; i < imageUrls.length; i++) {
                    images.push(Evernote.Utils.makeAbsolutePath(serializer.getDocumentBase(), imageUrls[i]).replace(/\s/g, "%20"));
                }
                callback( {
                    content : serializer.getSerializedDom(),
                    imageUrls : images,
                    docBase : serializer.getDocumentBase()
                    });
            };
            parser.parseAsync( root, fullPage ? true: false, serializer, resultFunc);
            var end = new Date().getTime();
            Evernote.Logger.debug( "Clip.clipFullPage(): clipped body in " + (end - start) + " milliseconds" );
        }
        catch ( e ) {
            Evernote.Logger.error( "JSSerializer.serialize() failed: error = " + e );
            throw e;
        }
    },</p>
<p>    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();</p>
<p>            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;
        }
    },</p>
<p>    serializeSelectionAsync : function( range, callback ) {</p>
<p>        try {
            if( !range ) {
                if ( !this.hasSelection() ) {
                    Evernote.Logger.warn( "JSSerializer.serializeSelection(): no selection to clip" );
                    callback();
                    return;
                }</p>
<p>                range = Evernote.Utils.fixIERangeObject(this._selectionFinder.getRange());</p>
<p>                if ( !range ) {
                    Evernote.Logger.warn( "JSSerializer.serializeSelection(): no range in selection" );
                    callback();
                    return;
                }
            }</p>
<p>            var start = new Date().getTime();
            var ancestor = (this._styleStrategy &#038;&#038; Evernote.Utils.Selection.getCommonAncestorContainer(range).nodeType == Evernote.Node.TEXT_NODE
                &#038;&#038; Evernote.Utils.Selection.getCommonAncestorContainer(range).parentNode) ? Evernote.Utils.Selection.getCommonAncestorContainer(range).parentNode : Evernote.Utils.Selection.getCommonAncestorContainer(range);</p>
<p>            while ( typeof Evernote.ClipRules.NON_ANCESTOR_NODES[ ancestor.nodeName.toUpperCase() ] != 'undefined' &#038;&#038; ancestor.parentNode ) {
                if ( ancestor.nodeName.toUpperCase() == "BODY" ) {
                    break;
                }
                ancestor = ancestor.parentNode;
            }</p>
<p>            var serializer = new Evernote.NodeSerializer( window, new Evernote.ClipFullStylingStrategy(), null, true );
            var parser = new Evernote.DomParser(window, Evernote.Utils.fixIERangeObject(range));</p>
<p>            var resultFunc = function() {
                var images = [];
                var imageUrls = serializer.getImagesUrls();</p>
<p>                for(var i = 0; i < imageUrls.length; i++) {
                    images.push(Evernote.Utils.makeAbsolutePath(serializer.getDocumentBase(), imageUrls[i]).replace(/\s/g, "%20"));
                }</p>
<p>                callback( {
                    content : serializer.getSerializedDom(),
                    imageUrls : images,
                    docBase : serializer.getDocumentBase()
                } );
            };
            parser.parseAsync( ancestor, false, serializer, resultFunc );
            var end = new Date().getTime();
            Evernote.Logger.debug( "JSSerializer.serializeSelection(): clipped selection in " + (end - start) + " milliseconds" );
        }
        catch ( e ) {
            Evernote.Logger.error( "JSSerializer.serializeSelection() failed: error = " + e );
            throw e;
        }
    },</p>
<p>    serializeSelection : function( range ) {
        try {
            if( !range ) {
                if ( !this.hasSelection() ) {
                    Evernote.Logger.warn( "JSSerializer.serializeSelection(): no selection to clip" );
                    return;
                }</p>
<p>                range = Evernote.Utils.fixIERangeObject(this._selectionFinder.getRange());</p>
<p>                if ( !range ) {
                    Evernote.Logger.warn( "JSSerializer.serializeSelection(): no range in selection" );
                    return;
                }
            }</p>
<p>            var start = new Date().getTime();
            var ancestor = (this._styleStrategy &#038;&#038; Evernote.Utils.Selection.getCommonAncestorContainer(range).nodeType == Evernote.Node.TEXT_NODE
                &#038;&#038; Evernote.Utils.Selection.getCommonAncestorContainer(range).parentNode) ? Evernote.Utils.Selection.getCommonAncestorContainer(range).parentNode : Evernote.Utils.Selection.getCommonAncestorContainer(range);</p>
<p>            while ( typeof Evernote.ClipRules.NON_ANCESTOR_NODES[ ancestor.nodeName.toUpperCase() ] != 'undefined' &#038;&#038; ancestor.parentNode ) {
                if ( ancestor.nodeName.toUpperCase() == "BODY" ) {
                    break;
                }
                ancestor = ancestor.parentNode;
            }</p>
<p>            var serializer = new Evernote.NodeSerializer( window, new Evernote.ClipFullStylingStrategy() );
            var parser = new Evernote.DomParser(window, Evernote.Utils.fixIERangeObject(range));
            parser.parse( ancestor, false, serializer );</p>
<p>            var end = new Date().getTime();
            Evernote.Logger.debug( "JSSerializer.serializeSelection(): clipped selection in " + (end - start) + " milliseconds" );
            var images = [];
            var imageUrls = serializer.getImagesUrls();</p>
<p>            for(var i = 0; i < imageUrls.length; i++) {
                images.push(Evernote.Utils.makeAbsolutePath(serializer.getDocumentBase(), imageUrls[i]).replace(/\s/g, "%20"));
            }</p>
<p>            return {
                content : serializer.getSerializedDom(),
                imageUrls : images,
                docBase : serializer.getDocumentBase()
            }
        }
        catch ( e ) {
            Evernote.Logger.error( "JSSerializer.serializeSelection() failed: error = " + e );
            throw e;
        }
    },</p>
<p>    hasSelection : function() {
        Evernote.Logger.debug( "Clip.hasSelection()" );</p>
<p>        if ( this._selectionFinder.hasSelection() ) {
            return true;
        }
        else {
            this._selectionFinder.find( true );
            return this._selectionFinder.hasSelection();
        }
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/**
 * Represents JQuery loader that allow to have two versions of JQuery loaded on the same page
 * @type {Object}
 */
Evernote.JQueryLoader = {
    /**
     * Initializes jquery instance on global Evernote context
     */
    initJQuery : function() {
        if (!Evernote.JQuery) {
            Evernote.JQuery = $.noConflict(true);
        }
    }
};</p>
<p>(function () {
    if (!Evernote.JQuery) {
        Evernote.JQuery = $.noConflict(true);
    }
}());
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ClipNotificator = function ClipNotificator() {</p>
<p>};
// TODO: clip notificator is obsolete now. Remove it.</p>
<p>Evernote.ClipNotificator.WAIT_CONTAINER_ID = "evernoteContentClipperWait";
Evernote.ClipNotificator.SHOW_WAIT_MIN_TIME = 2000;</p>
<p>Evernote.ClipNotificator.prototype.showCopyNotification = function( doc, options, useAutoHide ) {</p>
<p>    Evernote.evernotePostClipPopup.fillOutPopup(options.title, options.notebookName);
    Evernote.evernotePostClipPopup.show();</p>
<p>    try {
        var wait = this.getWaitContainer( doc, Evernote.Addin.getLocalizedMessage(Evernote.Messages.CLIPPING) );
        wait.style.display = "none";
        this.centerBox(wait);</p>
<p>        if ( doc.body ) {
            doc.body.appendChild( wait );
        }</p>
<p>        if (useAutoHide)
        {
            var self = this;
            var timeout = this.constructor.SHOW_WAIT_MIN_TIME;
            setTimeout( function() {
                self.clearWait( doc );
            }, timeout );
        }
    }
    catch ( e ) {
        Evernote.Logger.error( "ClipNotificator.showCopyNotification() failed: error = " + e );
    }
};</p>
<p>Evernote.ClipNotificator.prototype.centerBox = function( container ) {</p>
<p>    // TODO: for what? It can be done with css.
    var topPosition = ((document.documentElement.scrollTop || document.body.scrollTop) + ((((document.documentElement.clientHeight || document.body.clientHeight) + (!container.offsetHeight &#038;&#038; 0)) / 2) >> 0));
    var leftPosition = (((document.documentElement.clientWidth || document.body.clientWidth) / 2) - (container.offsetWidth / 2));
    container.style.position = "absolute";
    container.style.top = (topPosition-20) + "px";
    container.style.left = (leftPosition - 90) + "px";
};</p>
<p>Evernote.ClipNotificator.prototype.getWaitContainer = function( doc, msg ) {
    Evernote.Logger.debug( "ClipNotificator.getWaitContainer()" );</p>
<p>    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;</p>
<p>        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 );</p>
<p>        var center = doc.createElement( "center" );
        wait.appendChild( center );</p>
<p>        var spinner = doc.createElement( "div" );
        spinner.id = "evernote-spinner-container";
        center.appendChild( spinner );</p>
<p>        var text = doc.createElement( "span" );
        text.id = this.constructor.WAIT_CONTAINER_ID + "Text";
        center.appendChild( text );</p>
<p>        container._waitMsgBlock = text;
        container._waitMsgBlock.appendChild( doc.createTextNode( msg ) );
    }</p>
<p>    return container;
};</p>
<p>Evernote.ClipNotificator.prototype.clearWait = function( doc, immediately ) {
    Evernote.Logger.debug( "ClipNotificator.clearWait()" );</p>
<p>    var wait = doc.getElementById( Evernote.ClipNotificator.WAIT_CONTAINER_ID );
    if ( wait ) {
        wait.style.opacity = "0";
        if (immediately) {
            wait.parentNode.removeChild( wait );
        } else {
            setTimeout( function() {
                if ( wait.parentNode ) {
                    wait.parentNode.removeChild( wait );
                }
            }, 300 );
        }
    }</p>
<p>};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/**
 * Represents clipper object that is capable of clipping elements from pages or clip elements based on preferences.
 */
Evernote.Clipper = {</p>
<p>    _serializer : Evernote.JSSerializer,</p>
<p>    _clipNotifier : new Evernote.ClipNotificator(),</p>
<p>    _defaultOptions : {
        title: PageContext.title,
        tags: [],
        comments: "",
        notebookUid: -1,
        notebookName : ""
    },</p>
<p>    /**
     * Clips article element (one that user selected or default if no selection was made).
     */
    clipArticle : function(options, clearly) {
        var currentOptions = this.initOptions(options);
        this._clipNotifier.showCopyNotification(document, currentOptions);
        var self = this;
        setTimeout(function() {
            var article
            if ( clearly ) {
                article = Evernote.ClearlyController.getSimplifiedArticle();
            } else {
                article = Evernote.contentPreviewer.getArticleElement();
            }
            if(!article) {
                article = Evernote.pageInfo.getDefaultArticle(function(article) {});
            }
            var resultFunc = function(serializedDom) {
                self._clipNotifier.clearWait(document);
                Evernote.Addin.clipNote(currentOptions.comments + serializedDom.content, currentOptions, PageContext.url, serializedDom.imageUrls, true, document);
                Evernote.ClearlyController.hide();
            };
            self._serializer.serializeAsync(article, false, resultFunc);
        }, 100);
    },</p>
<p>    initOptions: function(options) {
        if(!options)
            options = this._defaultOptions;
        options = Evernote.JQuery.extend({}, this._defaultOptions, options);
        if(!options.title || Evernote.JQuery.trim(options.title).length == 0)
            options.title = Evernote.Addin.getLocalizedMessage(Evernote.Messages.UNTITLED_NOTE);
        options.title = Evernote.JQuery.trim(Evernote.Utils.cutToLength(options.title, 255, " "));</p>
<p>        /* get notebook name */
        var notebookUid = options.notebookUid || 0;
        var notebook = Evernote.NotebooksLoader.getNotebookByUid(notebookUid);</p>
<p>        if(!notebook) {
            options.notebookName = Evernote.Addin.getLocalizedMessage(Evernote.Messages.DEFAULT_NOTEBOOK);
        } else {
            options.notebookName = notebook.name;
        }</p>
<p>        return options;
    },</p>
<p>    /**
     * Clips full page.
     */
    clipFullPage : function(options) {
        Evernote.Logger.debug("Clipper: clipFullPage");
        var currentOptions = this.initOptions(options);
        this._clipNotifier.showCopyNotification(document , currentOptions);
        var self = this;
        setTimeout(function() {
            Evernote.Logger.debug("Start clipping of full page");
            var resultFunc = function(serializedDom) {
                self._clipNotifier.clearWait(document);
                Evernote.Logger.debug("Image urls " + JSON.stringify(serializedDom.imageUrls));
                Evernote.Logger.debug("Send clip to EN");
                Evernote.Addin.clipNote(currentOptions.comments + serializedDom.content, currentOptions, PageContext.url, serializedDom.imageUrls, true, document);
            };
            self._serializer.serializeAsync(null, true, resultFunc);
        }, 100);
    },</p>
<p>    /**
     * Clips url with favicon (if favicon is recognized)
     */
    clipUrl : function(options) {
        var currentOptions = this.initOptions(options);
        this._clipNotifier.showCopyNotification(document, currentOptions, true);
        var self = this;
        setTimeout(function() {
            var snippet = Evernote.contentPreviewer.getSnippetText();
            if (snippet) {
                snippet = snippet.replace(/(<([^>]+)>)/ig,"");
                var content = Evernote.GlobalUtils.createUrlClipContent(PageContext.title, PageContext.url, PageContext.getFavIconUrl(), snippet);
                Evernote.Addin.clipNote(currentOptions.comments + content, currentOptions, PageContext.url, PageContext.getFavIconUrl(), true, document);
            }else {
                self._clipNotifier.clearWait(document, true);
                Evernote.ClearlyController.getClearlyArticleText( function (data) {
                    snippet = data._html.replace(/(<([^>]+)>)/ig,"");
                    var content = Evernote.GlobalUtils.createUrlClipContent(PageContext.title, PageContext.url, PageContext.getFavIconUrl(), snippet);
                    Evernote.Addin.clipNote(currentOptions.comments + content, currentOptions, PageContext.url, PageContext.getFavIconUrl(), true, document);
                });
            }
        }, 100);
    },</p>
<p>    /**
     * Clips selection from the page.
     */
    clipSelection : function( range, options ) {
        var currentOptions = this.initOptions(options);
        this._clipNotifier.showCopyNotification(document , currentOptions);
        var self = this;
        setTimeout(function() {
            var resultFunc = function(serializedDom) {
                self._clipNotifier.clearWait(document);
                if(serializedDom) {
                    Evernote.Addin.clipNote(currentOptions.comments + serializedDom.content, currentOptions, PageContext.url, serializedDom.imageUrls, true, document);
                }
            };
            self._serializer.serializeSelectionAsync( range, resultFunc );
        }, 100);
    },</p>
<p>    /**
     * Clips image from the page.
     */
    clipImage : function(options ) {
        if (!options.imageElement) {
            Evernote.Logger.debug("clipImage Empty element");
            return;
        }
        var currentOptions = this.initOptions(options);
        this._clipNotifier.showCopyNotification(document , currentOptions);
        var self = this;</p>
<p>        var clojureBug = Evernote.BrowserDetection.isIE7();
        var CUSTOM_ID = 'evn-image-for-clip';</p>
<p>        if (clojureBug) {
            // add attr to find this element later			
            Evernote.JQuery(document).find(options.imageElement).attr( CUSTOM_ID ,'true');
        }</p>
<p>        setTimeout(function() {
            var elementToSerialize = options.imageElement;
            if (clojureBug) {
                var elem = Evernote.JQuery('*['+ CUSTOM_ID +']');
                elementToSerialize = Evernote.JQuery('*['+ CUSTOM_ID +']')[0];
                elem.removeAttr(CUSTOM_ID);
            }
            Evernote.Logger.debug("Start clipping of image");
            var resultFunc = function(serializedDom) {
                self._clipNotifier.clearWait(document);
                Evernote.Logger.debug("Image urls " + JSON.stringify(serializedDom.imageUrls));
                Evernote.Logger.debug("Send clip to EN");
                Evernote.Addin.clipNote(currentOptions.comments + serializedDom.content, currentOptions, PageContext.url, serializedDom.imageUrls, true, document);
            };
            self._serializer.serializeAsync(elementToSerialize, false, resultFunc);
        }, 100);
    },</p>
<p>    /**
     * Clips part of the page, defined in option (url, article or full page) or selection if presented.
     */
    clipWithOptions : function(clipOptions) {</p>
<p>        function getNotebook() {
            return {uid : -1};
        }</p>
<p>        var notebookToClipTo = getNotebook();</p>
<p>        var alwaysTags = [];
        if (notebookToClipTo.type != Evernote.NotebookTypes.LINKED &#038;&#038; Evernote.Options.tags.alwaysEnable == true) {
            alwaysTags = Evernote.Options.tags.alwaysData.split(',');
        }</p>
<p>        var options = {
            notebookUid: notebookToClipTo.uid,
            imageElement: EvernoteExternal.imageElement,
            tags: alwaysTags
        };</p>
<p>        if(clipOptions.getClipAction() == Evernote.ClipperActions.CLIP_SELECTION &#038;&#038; Evernote.Utils.hasSelection(window)) {
            Evernote.Clipper.clipSelection(null, options);
        }
		 else if(clipOptions.getClipAction() == Evernote.ClipperActions.CLIP_URL) {
            Evernote.Clipper.clipUrl(options);
        } else if(clipOptions.getClipAction() == Evernote.ClipperActions.CLIP_FULL_PAGE) {
            Evernote.Clipper.clipFullPage(options);
        } else if(clipOptions.getClipAction() == Evernote.ClipperActions.CLIP_IMAGE) {
            Evernote.Clipper.clipImage(options);
        } else {
            Evernote.Logger.warn("Unknown option is specified : " + clipOptions.getClipAction());
        }
    },</p>
<p>    clipBase64Image : function(options, base64Image) {
        var self = this;
        var currentOptions = this.initOptions(options);
        this._clipNotifier.showCopyNotification(document , currentOptions);
        Evernote.Addin.clipImageAsync(options, function(result) {
            EvernoteGlobalReceiver(result);
        }, PageContext.url, base64Image);
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ClipOptions = function ClipOptions(data) {
    this.clipAction = data.clipAction;
};</p>
<p>Evernote.ClipOptions.prototype.getClipAction = function() {
    return this.clipAction;
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
function ContentVeil() {</p>
<p>    var veil = document.createElement("div");
    veil.id = "evernoteContentVeil";
    var inner = document.createElement("div");
    inner.id = "evernoteInnerBox";
    var pageCounter = document.createElement("div");
    pageCounter.id = "evernotePageCounter";
    veil.appendChild(pageCounter);
    veil.appendChild(inner);</p>
<p>    var pageHeight = document.body.scrollHeight; // used for infinite scroll handling</p>
<p>    /*</p>
<p>    IE10 doesn't support pointer-events:none;
    So we had to replace existing veil with new one, combined of 8 divs.
    Four of them has border to outline content, and four divs in corners has white filling only.</p>
<p>    There is no any element in center, over the content, so nothing will catch mouse events.
    It helps other functions, especially html highlighter, works as expected.</p>
<p>    veil structure:</p>
<p>      veilNW |  veilTop   | veilNE
    veilLeft |            | veilRight
      veilSW | veilBottom | veilSE</p>
<p>    */</p>
<p>    var veilTop = document.createElement("div");
    veilTop.id = "evernoteContentVeilTop";
    var veilLeft = document.createElement("div");
    veilLeft.id = "evernoteContentVeilLeft";
    var veilRight = document.createElement("div");
    veilRight.id = "evernoteContentVeilRight";
    var veilBottom = document.createElement("div");
    veilBottom.id = "evernoteContentVeilBottom";</p>
<p>    var veilNW = document.createElement("div");
    veilNW.id = "evernoteContentVeilNW";
    var veilNE = document.createElement("div");
    veilNE.id = "evernoteContentVeilNE";
    var veilSE = document.createElement("div");
    veilSE.id = "evernoteContentVeilSE";
    var veilSW = document.createElement("div");
    veilSW.id = "evernoteContentVeilSW";</p>
<p>    var veilAll = Evernote.JQuery([veilTop,veilBottom,veilLeft,veilRight]);
    var veilCorners = Evernote.JQuery([veilNW,veilNE,veilSE,veilSW]);
    veilAll.addClass('EvConVeil');
    veilCorners.addClass('EvConVeilCorn');</p>
<p>    function fireClickUnderVeil(evt) {
        var veil = Evernote.JQuery(this);
        veil.hide();
        var bottomElement = document.elementFromPoint(evt.clientX, evt.clientY);
        veil.show();
        bottomElement.click();
    }</p>
<p>    // make veil imperceptible for mouse clicks.
    veilAll.click(fireClickUnderVeil);
    veilCorners.click(fireClickUnderVeil);</p>
<p>    var tooltipTimeout;</p>
<p>    var topExpandContract;
    var bottomExpandContract;
    for (var i = 0; i < 2; i++) {
        var expand = document.createElement("div");
        var contract = document.createElement("div");
        expand.className = "evernoteArticleExpand";
        contract.className = "evernoteArticleContract";</p>
<p>        expand.setAttribute('tooltip', Evernote.Addin.getLocalizedMessage(Evernote.Messages.EXPAND));
        expand.setAttribute('unselectable', 'on');
        contract.setAttribute('tooltip',Evernote.Addin.getLocalizedMessage(Evernote.Messages.CONTRACT));
        contract.setAttribute('unselectable','on');</p>
<p>        expand.addEventListener("mousemove", nudgeMousemoveHandler);
        expand.addEventListener("mouseout", nudgeMouseoutHandler);
        contract.addEventListener("mousemove", nudgeMousemoveHandler);
        contract.addEventListener("mouseout", nudgeMouseoutHandler);</p>
<p>        expand.addEventListener("click", function() {
            Evernote.contentPreviewer.previewNudge('up');
        });
        contract.addEventListener("click", function() {
            Evernote.contentPreviewer.previewNudge('down');
        });
        if (i == 0) {
            topExpandContract = document.createElement("div");
            topExpandContract.className = "evernoteExpandContract evernoteUsingExpandContract";
            topExpandContract.appendChild(expand);
            topExpandContract.appendChild(contract);
            veilTop.appendChild(topExpandContract);
        } else {
            bottomExpandContract = document.createElement("div");
            bottomExpandContract.id = "bottomExpandContract";
            bottomExpandContract.className = "evernoteExpandContract";
            bottomExpandContract.appendChild(expand);
            bottomExpandContract.appendChild(contract);
            veilBottom.appendChild(bottomExpandContract);
        }
    }</p>
<p>    function nudgeMousemoveHandler(evt) {
        clearTimeout(tooltipTimeout);
        tooltipTimeout = setTimeout(function() {
            evt.srcElement.className += " tooltipon";
        }, 250);
    }</p>
<p>    function nudgeMouseoutHandler() {
        clearTimeout(tooltipTimeout);
        this.className = this.className.replace(/\s*tooltipon/g, "");
    }</p>
<p>    // We keep a record of what we're currently showing (at least in some cases) so that we can update it in case the
    // state of the page changes (like if the user scrolls).
    var currentlyShownRect = null;
    var currentlyShownElt = null;
    var currentRectOffsetTop = 0;
    var currentRectOffsetLeft = 0;
    var currentlyStatic = false;
    var currentlyShadowBox = false;</p>
<p>    function reset(doNotResetPageCount) {
        currentlyShownRect = null;
        currentlyShownElt = null;
        currentRectOffsetTop = 0;
        currentRectOffsetLeft = 0;
        currentlyShadowBox = false;</p>
<p>        inner.className = inner.className.replace(/\s*evernoteShadowBox/g, "");
        veil.className = inner.className.replace(/\s*evernoteShadowBox/g, "");
        veilAll.removeClass('evernoteShadowBoxActi');</p>
<p>        if (!doNotResetPageCount) {
            setPageCount();
        }</p>
<p>        topExpandContract.className = topExpandContract.className.replace(/\s*evernoteUsingExpandContract/g, "");
        bottomExpandContract.className = bottomExpandContract.className.replace(/s*evernoteUsingExpandContract/g, "");</p>
<p>        showElements("embed");
        showElements("object");
        showElements("iframe");</p>
<p>        blank();
    }</p>
<p>    function blank() {
        veil.style.height = document.body.scrollHeight  - 6 + "px";
        veil.style.width = document.body.scrollWidth - 6  + "px";
        veil.style.borderWidth = "0";
    }</p>
<p>    function gray() {
        show();
        inner.style.display = "none";
        veil.style.backgroundColor = "rgba(255, 255, 255, 0.75)";</p>
<p>        veilAll.each(function(){this.style.borderWidth = "0";});
        veilAll.addClass('evernoteGrayFillingActi');
        revealRectNew({
            top:0,
            bottom:getPageHeight(),
            left:0,
            right:0,
            width:document.body.scrollWidth,
            height:getPageHeight()
        });
    }</p>
<p>    function show() {
        inner.style.display = "";
        veil.style.backgroundColor = "";</p>
<p>        veilAll.each(function(){this.style.borderWidth = ""});
        veilAll.removeClass('evernoteGrayFillingActi');
        if (!Evernote.ElementExtension.hasParentNode(veil)) {
            document.body.appendChild(veil);
            veilAll.each(function(){document.body.appendChild(this)});
            veilCorners.each(function(){document.body.appendChild(this)});
        }
    }</p>
<p>    function hide() {
        if (Evernote.ElementExtension.hasParentNode(veil)) {
            veilAll.each(function(){this.parentNode.removeChild(this)});
            veilCorners.each(function(){this.parentNode.removeChild(this)});
            veil.parentNode.removeChild(veil);
        }
    }</p>
<p>    function isHidden() {
        if (Evernote.ElementExtension.hasParentNode(veil)) {
            return false;
        }
        return true;
    }</p>
<p>    // 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))
        };
    }</p>
<p>    function getPageHeight() {
        var h = Math.abs(window.innerHeight - document.body.scrollHeight) < 15 ? document.body.scrollHeight : Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
        var wh = window.innerHeight;
        if ((wh - h) > 15) return wh;
        return h;
    }</p>
<p>    function revealRect(rect, elt, staticView, shadowBox) {</p>
<p>        // Save this info.
        currentlyShownRect = rect;
        currentlyShownElt = elt;
        currentRectOffsetTop = Evernote.Utils.scrollTop();
        currentRectOffsetLeft = Evernote.Utils.scrollLeft();
        currentlyStatic = staticView;
        currentlyShadowBox = shadowBox;</p>
<p>        // 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;</p>
<p>        var veilWidth = veil.style.width.replace("px", "");
        var veilHeight = veil.style.height.replace("px", "");</p>
<p>        inner.className = inner.className.replace(/\s*evernoteShadowBox/g, "");
        veil.className = inner.className.replace(/\s*evernoteShadowBox/g, "");
        veilAll.removeClass('evernoteShadowBoxActi');
        if (shadowBox) {
            veilAll.addClass('evernoteShadowBoxActi');
            inner.className += " evernoteShadowBox";
            veil.className += " evernoteShadowBox";
        }</p>
<p>        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";</p>
<p>        /*oh my gosh*/</p>
<p>        var rectNew = {
            top:Math.max(y, 0),
            left:Math.max(x, 0),
            bottom:Math.max((veilHeight - y - height),0),
            right:Math.max((veilWidth - x - width),0),
            width:document.body.scrollWidth,
            height:getPageHeight()
        };</p>
<p>        if (!shadowBox) {
            rectNew.width = rectNew.width - 4;
            rectNew.height = rectNew.height - 4;
        } else {
            rectNew.width = rectNew.width - 6;
            rectNew.height = rectNew.height - 6;
        }</p>
<p>        /*
         // debug part.
         function toFix(rect) {
         for (var prop in rect) {
         rect[prop] = rect[prop].toFixed(0);
         }
         return rect;
         }</p>
<p>         console.log('old ' + JSON.stringify(toFix(rect)));
         console.log('new ' + JSON.stringify(toFix(rectNew)));
         */</p>
<p>        revealRectNew(rectNew);
    }</p>
<p>    function revealRectNew(rect) {
        veilLeft.style.height = rect.height - rect.bottom - rect.top + 2 + 'px';
        veilLeft.style.width = rect.left + 'px';
        veilLeft.style.top = rect.top  -1 + 'px';</p>
<p>        veilRight.style.height = rect.height - rect.bottom - rect.top + 2 + 'px';
        veilRight.style.width = rect.right + 'px';
        veilRight.style.top = rect.top - 1 + 'px';
        veilRight.style.left = rect.width - rect.right + 'px';</p>
<p>        veilTop.style.height = rect.top + 'px';
        veilTop.style.left = rect.left + 'px';
        veilTop.style.right = rect.right + 'px';
        veilTop.style.width = rect.width - rect.right - rect.left + 'px';</p>
<p>        veilBottom.style.height = rect.bottom + 'px';
        veilBottom.style.width = rect.width - rect.right - rect.left + 'px';
        veilBottom.style.left = rect.left + 'px';
        veilBottom.style.right = rect.right + 'px';
        veilBottom.style.top = rect.height - rect.bottom + 'px';</p>
<p>        veilNW.style.height = Math.max(rect.top - 1, 0) + 'px';
        veilNW.style.width = rect.left + 'px';</p>
<p>        veilNE.style.height = Math.max(rect.top - 1, 0) + 'px';
        veilNE.style.width = rect.right + 'px';
        veilNE.style.left = rect.width - rect.right + 'px';</p>
<p>        veilSW.style.height = Math.max(rect.bottom - 1, 0) + 'px';
        veilSW.style.top = rect.height - rect.bottom + 1 + 'px';
        veilSW.style.width = rect.left + 'px';</p>
<p>        veilSE.style.height = Math.max(rect.bottom - 1, 0) + 'px';
        veilSE.style.top = rect.height - rect.bottom + 1 + 'px';
        veilSE.style.left = rect.width - rect.right + 'px';
        veilSE.style.width = rect.right + 'px';
    }</p>
<p>    function revealStaticRect(rect, elt, shadowBox) {
        revealRect(rect, elt, true, shadowBox);
    }</p>
<p>    function outlineElement(element, scrollTo, shadowBox, articleAdjustment) {
        // See notes in Preview.js for why we use this method instead of just calling element.getBoundingClientRect().
        var rect = Evernote.contentPreviewer.computeDescendantBoundingBox(element);
        if (rect) {
            reset(articleAdjustment);
            revealRect(rect, element, true, shadowBox);</p>
<p>            if (scrollTo) {
                element.scrollIntoView();
            }</p>
<p>            hideElements("embed", element);
            hideElements("object", element);
            hideElements("iframe", element);</p>
<p>            topExpandContract.className += " evernoteUsingExpandContract";</p>
<p>            if (rect.height - 30  > window.innerHeight) {
                bottomExpandContract.className += " evernoteUsingExpandContract";
            } else {
                bottomExpandContract.className = bottomExpandContract.className.replace(/\s*evernoteUsingExpandContract/g, "");
            }</p>
<p>            show();
        }
        else {
            Evernote.Logger.warn("Couldn't create rectangle from element: " + element.toString());
        }
    }</p>
<p>    function hideAllActiveObjects() {
        hideElements("embed");
        hideElements("object");
        hideElements("iframe");
    }</p>
<p>    function hideElements (tagName, exceptInElement) {
        var els = document.getElementsByTagName(tagName);
        for (var i = 0; i < els.length; i++) {
            els[i].enSavedVisibility = els[i].style.visibility;
            els[i].style.visibility = "hidden";
        }
        showElements(tagName, exceptInElement);
    }</p>
<p>    function showElements (tagName, inElement) {
        if (!inElement) {
            inElement = document;
        }
        var els = inElement.getElementsByTagName(tagName);
        for (var i = 0; i < els.length; i++) {
            if (typeof els[i].enSavedVisibility !== "undefined") {
                els[i].style.visibility = els[i].enSavedVisibility;
                try {
                    delete els[i].enSavedVisibility;
                } catch(e) {
                    els[i].enSavedVisibility = undefined;
                }
            }
        }
    }</p>
<p>    function getElement() {
        return veil;
    }</p>
<p>    function setPageCount(count) {
        if (!count) {
            pageCounter.innerText = "";
        } else if (count == 1) {
            //TODO: test l10n
            pageCounter.innerText = "oneMorePageFound";
        } else {
            //TODO:test l10n
            pageCounter.innerText = "morePagesFound" + count;
        }
        pageCounter.scrollIntoView(true);
    }</p>
<p>    var onScrollHandle =  function(e) {
        if (currentlyShownRect &#038;&#038; !currentlyStatic) {
            var rect = {
                top: currentlyShownRect.top,
                bottom: currentlyShownRect.bottom,
                left: currentlyShownRect.left,
                right: currentlyShownRect.right,
                width: currentlyShownRect.width,
                height: currentlyShownRect.height
            };</p>
<p>            var vert = Evernote.Utils.scrollTop() - currentRectOffsetTop;
            var horiz = Evernote.Utils.scrollLeft() - currentRectOffsetLeft;</p>
<p>            if (!vert &#038;&#038; !horiz) {
                return;
            }</p>
<p>            rect.top -= vert;
            rect.bottom -= vert;
            rect.left -= horiz;
            rect.right -= horiz;
            blank();
            revealRect(rect, currentlyShownElt);
        }</p>
<p>        if (pageHeight < document.body.scrollHeight - 30) {
            pageHeight = document.body.scrollHeight;
            onResizeHandle();
        }
    };</p>
<p>    var onResizeHandle = function(e) {
        if (currentlyShownElt) {
            var rect = Evernote.contentPreviewer.computeDescendantBoundingBox(currentlyShownElt);
            if (rect) {
                blank();
                if (currentlyShadowBox) {
                    revealRect(rect, currentlyShownElt, true, true);
                } else {
                    revealRect(rect, currentlyShownElt, true, false);
                }
            }
        }</p>
<p>        // todo: switch gray filling to position: fixed.
        if (veilAll.hasClass('evernoteGrayFillingActi')) {
            gray();
        }
    };</p>
<p>    window.addEventListener("resize", onResizeHandle);
    window.addEventListener("scroll", onScrollHandle, false);</p>
<p>    // Public API:
    this.reset = reset;
    this.show = show;
    this.gray = gray;
    this.hide = hide;
    this.revealRect = revealRect;
    this.revealStaticRect = revealStaticRect;
    this.outlineElement = outlineElement;
    this.expandRect = expandRect;
    this.hideAllActiveObjects = hideAllActiveObjects;
}
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/**
 * Created by chizhikov on 11.04.14.
 */</p>
<p>function ScreenshotVeil() {
    var areaEl = document.createElement('div');
    areaEl.id = 'evernoteScreenShotArea';</p>
<p>    var startX, startY = 0;</p>
<p>    var global_tools = Evernote.JQuery('#' + Constants.CLIP_DIALOG_ID);
    var area = Evernote.JQuery(areaEl);
    var selecting = false;</p>
<p>    var startVertLine = document.createElement('div');
    var startHorizLine = document.createElement('div');</p>
<p>    startVertLine.className = 'screenAreaStartVertLine';
    startHorizLine.className = 'screenAreaStartHorizLine';</p>
<p>    var borderDiv = document.createElement('div');
    borderDiv.id = 'screenAreaSelected';</p>
<p>    areaEl.appendChild(startVertLine);
    areaEl.appendChild(startHorizLine);
    areaEl.appendChild(borderDiv);</p>
<p>    function sendMessageToPopup( msg ){
        // send message to global tools</p>
<p>        var zoomModifier = screen.deviceXDPI / screen.logicalXDPI;</p>
<p>        with (borderDiv.style) {
            var topX = pixelLeft * zoomModifier;
            var topY = pixelTop * zoomModifier;
            var bottomX = (area.width() - pixelRight) * zoomModifier;
            var bottomY = (area.height() - pixelBottom) * zoomModifier;
        }</p>
<p>        // If any side of the rectangle that user is drawing is smaller than 16px then we interpret it as a
        // single click and should make a fullscreen capture.</p>
<p>        var rectWidth = Math.abs(topX - bottomX);
        var rectHeight = Math.abs(topY - bottomY);
        if (rectWidth < 16 || rectHeight < 16) {
            topX = 0;
            topY = 0;
            bottomX = area.width();
            bottomY = area.height();
        }</p>
<p>        global_tools.trigger(msg ,[topX,topY , bottomX, bottomY]);
    }</p>
<p>    function drawLines(e) {
        startVertLine.style.pixelLeft = e.clientX;
        startHorizLine.style.pixelTop = e.clientY;</p>
<p>        if (selecting) {
            drawRect(startX, startY, e.clientX, e.clientY);
            // TODO: prevent selection
        }
    }</p>
<p>    function drawRect( startX, startY, mouseX, mouseY) {
        var topX, topY, bottomX, bottomY;</p>
<p>        topX = Math.min(startX, mouseX);
        topY = Math.min(startY, mouseY);
        bottomX = Math.max(startX, mouseX);
        bottomY = Math.max(startY, mouseY);</p>
<p>        borderDiv.style.pixelTop = topY;
        borderDiv.style.pixelLeft = topX;
        borderDiv.style.pixelRight = area.width() - bottomX - 1;
        borderDiv.style.pixelBottom = area.height() - bottomY -1;
    }</p>
<p>    function clearSelectedAreaPosition() {
        borderDiv.style.pixelRight = '';
        borderDiv.style.pixelBottom = '';
        borderDiv.style.pixelTop = '';
        borderDiv.style.pixelLeft = '';
        selecting = false;
    }</p>
<p>    function startSelectArea(e) {
        if (e.button != 0)
            return;
        if (Evernote.JQuery(e.target).closest('#' + Constants.CLIP_DIALOG_NEW_ID).length == 0) {
            selecting = true;
            startX = e.clientX;
            startY = e.clientY;
        }
        e.preventDefault();
    }</p>
<p>    function selectionEnd(e) {
        if (!selecting) return;</p>
<p>        if (Evernote.JQuery(e.target).closest('#cancelButton').length == 0 &#038;&#038;
            Evernote.JQuery(e.target).closest('#closeSidebar').length == 0 ) {
            sendMessageToPopup('readyToScreenshot');
        } else {
            sendMessageToPopup('cancelScreenshot');
        }
        hide();
        clearSelectedAreaPosition();
    }</p>
<p>    function disableContextMenu(e) {
        e.preventDefault();
        return false;
    }</p>
<p>    function show() {
        document.addEventListener('mousemove', drawLines);
        document.addEventListener('mousedown', startSelectArea);
        document.addEventListener('mouseup', selectionEnd);
        document.addEventListener('contextmenu', disableContextMenu);</p>
<p>        // TODO: remove scroll from page
        area.addClass('visible');</p>
<p>        Evernote.JQuery('body').css('overflow','hidden');
    }</p>
<p>    function hide() {
        area.removeClass('visible');
        clearSelectedAreaPosition();
        document.removeEventListener('mousemove', drawLines);
        document.removeEventListener('mousedown', startSelectArea);
        document.removeEventListener('mouseup', selectionEnd);
        document.removeEventListener('contextmenu', disableContextMenu);</p>
<p>        Evernote.JQuery('body').css('overflow','visible');
    }</p>
<p>    document.body.appendChild(areaEl);</p>
<p>    this.show = show;
    this.hide = hide;
}
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
function PageInfo() {</p>
<p>    var newPageCallback;</p>
<p>    // This is a map of hostnames (for hostnames that begin with 'www.', the 'www.' will be stripped off first, so don't
    // include it in your lookup string) to CSS selectors. When we try and locate an article in a page, we'll see if we
    // can find the doamin for the page in this list, and if so, we'll try and find an element that matches the given
    // selector. If no element is returned, we'll fall back to the heuristic approach.
    var specialCases = {
        "penny-arcade.com": "div.contentArea > div.comic > img",
        "aspicyperspective.com": "div.entry-content",
        "thewirecutter.com": "div#content",
        "katespade.com": "div#pdpMain",
        "threadless.com": "section.product_section",
        "yelp.com": "div#bizBox",
        "flickr.com": "div#photo",
        "instagr.am": "div.stage > div.stage-inner",
        "stackoverflow.com": "div#mainbar",
        "makeprojects.com": "div#guideMain",
        "cookpad.com": "div#main",
        "imgur.com": "div.image",
        "smittenkitchen.com": "div.entry",
        "allrecipes.com": "div#content-wrapper",
        "qwantz.com": "img.comic",
        "questionablecontent.net": "img#strip",
        "cad-comic.com": "div#content"
    }</p>
<p>    var useFoundImage = [
        "xkcd.com"
    ]</p>
<p>    // These are the items we're trying to collect. This first block is trivial.
    var containsImages = Boolean(document.getElementsByTagName("img").length > 0);
    var documentWidth = document.width;
    var documentHeight = document.height;
    var documentMode = document.documentMode;
    var url = document.location.href;</p>
<p>    // Very slow and useless assignment, takes more than a second. Temporary commented for speed up [actimind]
    // var documentLength = document.body.textContent ? document.body.textContent.length : 0;</p>
<p>    // These take slightly more work and are initialized only when requested.
    var article = null;
    var cleanArticles = [];</p>
<p>    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;</p>
<p>    // Internal state variables to keep us duplicating work.
    var hasCheckedArticle = false;</p>
<p>    // Experimental recognition of 'image' pages (like photo sites and comics).
    function findImage() {
        var imgs = document.getElementsByTagName("img");
        var biggest = null;
        var biggestArea = 0;
        for (var i = 0; i < imgs.length; i++) {
            var style = Evernote.ElementExtension.getComputedStyle(imgs[i]);
            var width = style.width.replace(/[^0-9.-]/g, "");
            var height = style.height.replace(/[^0-9.-]/g, "");
            var area = width * height;
            if (!biggest || area > biggestArea) {
                biggest = imgs[i];
                biggestArea = area;
            }
        }
        return biggest;
    }</p>
<p>    function getAncestors(node) {
        var an = [];
        while (node) {
            an.unshift(node);
            node = node.parentNode;
        }
        return an;
    }</p>
<p>    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;
    }</p>
<p>    function getCommonAncestor(nodeList) {
        if (!nodeList.length) return null;</p>
<p>        if (nodeList.length == 1) return nodeList[0];
        var lastList = getAncestors(nodeList[0]);</p>
<p>        var node = null;
        for (var i = 1; i < nodeList.length; i++) {
            var list = getAncestors(nodeList[i]);
            node = getDeepestCommonNode(lastList, list);
            lastList = getAncestors(node);
        }
        return node;
    }</p>
<p>    function clearlyCallback(data, callback) {
        Evernote.Logger.debug("Clearly callback invoked");
        findImage();</p>
<p>        // See if we should special-case this.
        var host = getHostname();
        if (specialCases[host])
        {
            var candidate = Evernote.ElementExtension.querySelector(specialCases[host]);
            if (candidate) {
                Evernote.Logger.debug("Found article in specialCases");
                article = candidate;
                articleBoundingClientRect = Evernote.ElementExtension.getBoundingClientRect(article);
            }
        }</p>
<p>        // Or see if it's a special case image page.
        else if (Evernote.ArrayExtension.indexOf(useFoundImage, host) != -1) {
            article = findImage();
            if (article) {
                Evernote.Logger.debug("Found article in image");
                articleBoundingClientRect = Evernote.ElementExtension.getBoundingClientRect(article);
            }
        }</p>
<p>        // If it's not a special case, see if it's a single image.
        if (!article) {
            var imageTypes = ['jpeg', 'jpg', 'gif', 'png'];
            var urlExtension = document.location.href.replace(/^.*\.(\w+)$/, "$1");
            if (urlExtension &#038;&#038; (Evernote.ArrayExtension.indexOf(imageTypes, urlExtension) != -1)) {
                var candidate = Evernote.JQuery("body > img");
                if (candidate.length > 0) {
                    Evernote.Logger.debug("Found article in a single image");
                    article = candidate.get(0);
                    articleBoundingClientRect = Evernote.ElementExtension.getBoundingClientRect(article);
                }
            }
        }</p>
<p>        // 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 &#038;&#038; frame.contentDocument &#038;&#038; frame.contentDocument.documentElement) {
                    selectionFrameElement = frame;
                    article = frame.contentDocument.documentElement;
                    articleBoundingClientRect = Evernote.ElementExtension.getBoundingClientRect(article);
                }
            }
        }</p>
<p>        // 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 &#038;&#038; data._elements &#038;&#038; data._elements.length) {
                article = data._elements[0];
                if (data._elements.length > 1) {</p>
<p>                    // This will include *all* clearly elements (and whatever else in in between them).
                    article = getCommonAncestor(data._elements);</p>
<p>                    // This includes *just the last (and therefore most important)* element from the clearly detection.
                    // article = data._elements[data._elements.length - 1];
                }</p>
<p>                if (article.nodeType === ( window.Node ? window.Node.TEXT_NODE : 1)) {
                    article = article.parentNode;
                }
            }
        }</p>
<p>        if(article) {
            if(Evernote.JQuery(article).closest("#evernote-content").length != 0)
                article = undefined;
        }</p>
<p>        // If clearly found nothing (because it failed), then use the body of the document.
        if (!article) {
            article = document.body;
        }</p>
<p>        hasCheckedArticle = true;
        callback();
    }</p>
<p>    // 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) {</p>
<p>        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 &#038;&#038;
                (!article.parentNode || !article.getBoundingClientRect || Evernote.ElementExtension.getBoundingClientRect(article).width == 0)) {
                article = null;
                hasCheckedArticle = false;
            }
            Evernote.Logger.debug("afterInject");
            if (!hasCheckedArticle) {
                Evernote.Logger.debug("no article");
                if (!window)
                {
                    Evernote.Logger.warn("Couldn't find clearly!");
                    clearlyCallback(null, callback);
                }
                else {
                    Evernote.Logger.debug("Call clearly to select article");
                    try {
                        Evernote.ClearlyController.getContentElementAndHTML(function(data){clearlyCallback(data, callback)});
                    } catch(e) {
                        Evernote.Logger.error("Failed to find article by clearly due to error " + e.message);
                        clearlyCallback(null, callback);
                    }
                }
            }
            // If the page is big enough, clearly is excruciatingly slow. We'll just get the whole page.
            // TODO: Clearly was updated. Check, if big pages are still problem
            else if (document.body.innerHTML.length > (1024 * 1024)) {
                Evernote.Logger.warn("Page over 1mb, skipping article detection.");
                clearlyCallback(null, callback);
            }
            else {
                Evernote.Logger.debug("callback");
                callback();
            }
        }</p>
<p>        afterInject();</p>
<p>    }</p>
<p>    function findBiggestFrame() {
        var frames = document.getElementsByTagName("frame");
        var candidate = null;
        var candidateSize = 0;
        for (var i = 0; i < frames.length; i++) {
            if (frames[i].width &#038;&#038; frames[i].height) {
                var area = frames[i].width * frames[i].height;
                if (area > candidateSize) {
                    candidate = frames[i];
                    candidateSize = area;
                }
            }
        }
        return candidate;
    }</p>
<p>    function getHostname() {
        var match = document.location.href.match(/^.*?:\/\/(www\.)?(.*?)(\/|$)/);
        if (match) {
            return match[2];
        }
        return null;
    }</p>
<p>    function getDefaultArticle(callback) {
        Evernote.Logger.debug("getDefaultArticle");
        findArticle(function(){callback(article)});
        // Article already exists, so we'll return it.
        if (article) return article;
    }</p>
<p>    function getBiggestImage(callback) {
        getDefaultArticle(function(art) {
            var imgs;
            if (art) {
                imgs = art.querySelectorAll("img");
            } else {
                imgs = document.querySelectorAll("img");
            }</p>
<p>            var maxHeight = 0;
            var maxWidth = 0;
            var maxImage;
            for (var i = 0; i < imgs.length; i++) {
                var w = imgs.item(i).width;
                var h = imgs.item(i).height;
                if (w * h > maxWidth * maxHeight) {
                    maxHeight = h;
                    maxWidth = w;
                    maxImage = imgs.item(i).src;
                }
            }
            callback({ src: maxImage, width: maxWidth, height: maxHeight });
        });
    }</p>
<p>    // Looks for selections in the current document and descendent (i)frames.
    // Returns the *first* non-empty selection.
    function getSelection() {</p>
<p>        // First we check our main window and return a selection if that has one.
        var selection = window.getSelection();
        if (selection &#038;&#038; selection.rangeCount &#038;&#038; !selection.isCollapsed) {
            return selection;
        }</p>
<p>        // 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]);
        }</p>
<p>        var urlBase = document.location.href.replace(/^(https?:\/\/.*?)\/.*/i, "$1").toLowerCase();
        for (var i = 0; i < docs.length; i++) {</p>
<p>            // 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 &#038;&#038; docs[i].src.toLowerCase().substr(0, urlBase.length) !== urlBase) {
                continue;
            }</p>
<p>            var doc = docs[i].contentDocument;</p>
<p>            if (doc) {
                var frameSelection = doc.getSelection();
                if (frameSelection &#038;&#038; frameSelection.rangeCount &#038;&#038; !frameSelection.isCollapsed) {
                    selectionIsInFrame = true;
                    selectionFrameElement = docs[i];
                    return frameSelection;
                }
            }
            else {
                Evernote.Logger.warn("iframe contained no Document object.");
            }
        }</p>
<p>        // Didn't find anything.
        return null;
    }</p>
<p>    function getUrl() {
        return url;
    }</p>
<p>    function getText(node, soFar, maxLen) {
        if (node.nodeType == Evernote.Node.TEXT_NODE) {
            var trimmed = (node.textContent) ? Evernote.JQuery.trim(node.textContent).replace(/\s+/g, " ") : "";
            if (trimmed === " " || trimmed === "") return soFar;
            return soFar + " " + trimmed;
        }</p>
<p>        var banned = [
            "style",
            "script",
            "noscript"
        ];</p>
<p>        if (node.nodeType == Evernote.Node.ELEMENT_NODE) {
            if (Evernote.ArrayExtension.indexOf(banned, node.nodeName.toLowerCase()) == -1) {
                for (var i = 0; i < node.childNodes.length; i++) {
                    soFar = getText(node.childNodes[i], soFar, maxLen);
                    if (soFar.length > maxLen) {
                        return soFar;
                    }
                }
            }
        }
        return soFar;
    }</p>
<p>    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);
        }</p>
<p>        else if (article) {
            text = getText(article, "", MAX_LEN);
        }
        else {
            text = getText(document.body, "", MAX_LEN);
        }
        text = document.title + " " + text;
        return text;
    }</p>
<p>    // Note: you must call getSelection() first to populate this field!
    function getSelectionFrame() {
        return selectionFrameElement;
    }</p>
<p>    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);
        }
    }</p>
<p>    // @TODO: This is fairly incomplete.
    function getFavIconUrl() {
        var links = document.getElementsByTagName("link");
        var i;
        for (i = 0; i < links.length; i++) {
            if (links[i].rel) {
                var rels = links[i].rel.toLowerCase().split(/\s+/);
                if (Evernote.ArrayExtension.indexOf(rels, "icon") !== -1) {
                    // Found it!
                    return links[i].href;
                }
            }
        }
        return null;
    }</p>
<p>    function _getInfoRequestHandler(data, request, sender, sendResponse) {
        var isSelected = getSelection();</p>
<p>        checkClearly();</p>
<p>        var response = {
            containsImages: containsImages,
            documentWidth: documentWidth,
            documentHeight: documentHeight,
            url: url,
            selection: (isSelected !== null),
            selectionIsInFrame: selectionIsInFrame,
            documentLength: document.body.textContent.length,
            articleBoundingClientRect: articleBoundingClientRect,
            article: (article != null),
            recommendationText: getRecommendationText(),
            favIconUrl: getFavIconUrl(),
            documentIsFrameset: documentIsFrameset
        };
        sendResponse(response);
    }</p>
<p>    function getInfoRequestHandler(request, sender, sendResponse) {
        findArticle(function(data){_getInfoRequestHandler(data, request, sender, respondWithInfo)});
    }</p>
<p>    function getDocumentMode() {
        return documentMode;
    }</p>
<p>    function getCleanArticle(callback, _newPageCallback) {
        newPageCallback = _newPageCallback;
        findArticle(function() {
            callback(cleanArticles);
        });
    }</p>
<p>    // Public API:
    this.getDefaultArticle = getDefaultArticle;
    this.getSelection = getSelection;
    this.getSelectionFrame = getSelectionFrame;
    this.getFavIconUrl = getFavIconUrl;</p>
<p>    //redesign
    this.getBiggestImage = getBiggestImage;
    this.getRecommendationText = getRecommendationText;
    this.getCleanArticle = getCleanArticle;
    this.getText = getText;
    this.getUrl = getUrl;
    this.getDocumentMode = getDocumentMode;
}
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.Scroller = function Scroller( tab ) {
    this.initialize( tab );
};</p>
<p>Evernote.Scroller.prototype._tab = null;</p>
<p>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
    };
};</p>
<p>Evernote.Scroller.prototype.scrollTo = function ( endPoint, time, resolution ) {
    this.abort();</p>
<p>    this.endPoint = endPoint;
    this.step = 0;
    this.calculatePath( time, resolution );
    var self = this;
    this.proc = setInterval( function () {
            if ( !self.doScroll() ) {
                self.abort();
            }
        },
        resolution );
};</p>
<p>Evernote.Scroller.prototype.calculatePath = function ( time, resolution ) {
    this.path = [];
    var sx = this.initialPoint.x;
    var sy = this.initialPoint.y;
    var ex = this.endPoint.x;
    var ey = this.endPoint.y;
    var k = (Math.PI * resolution) / time;
    for ( var i = -(Math.PI / 2); i < (Math.PI / 2); i += k ) {
        var c = ((1 + Math.sin( i )) / 2);
        this.path.push( {
            x:(sx + c * (ex - sx)),
            y:(sy + c * (ey - sy))
        } );
    }
};</p>
<p>Evernote.Scroller.prototype.doScroll = function () {
    var s = this.path[++this.step];
    if ( !s ) {
        return false;
    }
    var view = this._tab.document.defaultView || this._tab;
    view.scrollTo( s.x, s.y );
    return true;
};</p>
<p>Evernote.Scroller.prototype.abort = function () {
    if ( this.proc ) {
        clearInterval( this.proc );
        this.proc = null;
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
function ContentPreview() {
    Evernote.Logger.debug("Start creating preview box");</p>
<p>    var contentVeil = new ContentVeil();
    var screenshotVeil = new ScreenshotVeil();
    Evernote.Logger.debug("End creating preview box");
    // Stores a reference to the last element that we used as a preview.
    var previewElement = null;
    var article = null;
    var snippet = null;</p>
<p>    function buildUrlElement() {
        var urlEl = document.createElement("div");
        urlEl.id = "evernotePreviewContainer";
        var className = "yui3-cssreset";
        if(Evernote.Utils.isQuirkMode()) {
            className += " evernote-middle-fixed-position-quirks"
        }
        urlEl.className = className;
        return urlEl;
    }</p>
<p>    Evernote.Logger.debug("Build url element");
    var urlElement = buildUrlElement();</p>
<p>    function showUrlElement() {
        Evernote.Logger.debug("ContentPreview: showUrlElement start");
        if (!Evernote.ElementExtension.hasParentNode(urlElement)) {
            document.documentElement.appendChild(urlElement);
        }</p>
<p>        // 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"));</p>
<p>        if (isNaN(w) || isNaN(h)) {
            // IE8
            w =  Evernote.JQuery(urlElement).width();
            h = Evernote.JQuery(urlElement).height();
        }</p>
<p>        if (w &#038;&#038; h) {
            urlElement.style.marginLeft = (0 - w / 2) + "px";
            urlElement.style.marginTop = (0 - h / 2) + "px";
        }</p>
<p>        Evernote.Logger.debug("ContentPreview: showUrlElement end");
    }</p>
<p>    function hideUrlElement() {
        if (Evernote.ElementExtension.hasParentNode(urlElement)) {
            urlElement.parentNode.removeChild(urlElement);
        }
    }</p>
<p>    function showScreenShotArea() {
        clear();
        screenshotVeil.show();
    }</p>
<p>    function showOverlay()  {
        previewElement = null;
        clear();
        contentVeil.reset();
        contentVeil.hideAllActiveObjects();
        contentVeil.gray();
    }</p>
<p>    function previewUrl() {
        clear();</p>
<p>        function buildContent ( data ) {
            var title = PageContext.title;
            var url = PageContext.url;
            var favIconUrl = PageContext.getFavIconUrl();
            snippet = data.replace(/(<([^>]+)>)/ig,""); // remove html tags from text</p>
<p>            urlElement.innerHTML = Evernote.GlobalUtils.createUrlClipContent(title, url, favIconUrl, snippet);</p>
<p>            var element = Evernote.JQuery(urlElement);</p>
<p>            if(Evernote.Utils.isQuirkMode() &#038;&#038; !element.hasClass("evernote-fixed-position-fix")) {
                element.addClass("evernote-fixed-position-fix");
            }</p>
<p>            showUrlElement();
            contentVeil.reset();
            contentVeil.hideAllActiveObjects();
            contentVeil.gray();</p>
<p>        }</p>
<p>        Evernote.ClearlyController.getClearlyArticleText( function (data) {
            buildContent(data._html);
        });
    }</p>
<p>    // This doesn't remove internal state of previewElement, because another script may not have finished clipping until
    // after the page looks 'clear'.
    function clear() {
        contentVeil.reset();
        contentVeil.hide();
        screenshotVeil.hide();
        hideUrlElement();
    }</p>
<p>    function _previewArticle () {
        Evernote.Logger.debug("Start previewing article element");
        if (previewElement)
        {
            var selectionFrame;
            if (typeof Evernote.pageInfo !== undefined) {
                selectionFrame = Evernote.pageInfo.getSelectionFrame();
            }
            Evernote.Logger.debug("Selection frame selected " + selectionFrame);
            if (selectionFrame) {</p>
<p>                var rect = {
                    width: selectionFrame.width,
                    height: selectionFrame.height,
                    top: selectionFrame.offsetTop,
                    bottom: (selectionFrame.height + selectionFrame.offsetTop),
                    left: selectionFrame.offsetLeft,
                    right: (selectionFrame.width + selectionFrame.offsetLeft)
                };
                Evernote.Logger.debug("contentVeil.revealStaticRect " + rect);
                contentVeil.revealStaticRect(contentVeil.expandRect(rect, -9), selectionFrame, true);
                Evernote.Logger.debug("contentVeil.show ");
                contentVeil.show();
            }
            else {
                // TODO: Scroll into article view.
                contentVeil.outlineElement(previewElement, false, true);
                window.scrollTo(0, previewElement.offsetTop - 30);
            }
        }
        else {
            Evernote.Logger.warn("Couldn't find a preview element. We should switch to 'full page' mode.");
        }
    }</p>
<p>    /**
     * 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) {</p>
<p>        clear();
        previewElement = null;
        if(reloadArticle) {
            article = null;
        }
        Evernote.Logger.debug("Evernote.pageinfo " + Evernote.pageInfo);
        if (typeof Evernote.pageInfo !== undefined) {
            if(!article) {
                previewElement = Evernote.pageInfo.getDefaultArticle(function(el){
                    Evernote.Logger.debug("Article element " + el.nodeName);
                    previewElement = el;
                    article = el;
                    Evernote.Logger.debug("Preview article ");
                    _previewArticle();
                });
                article = previewElement;
            } else {
                previewElement = article;
                _previewArticle();
            }
        }
        else {
            Evernote.Logger.warn("Couldn't find a 'pageInfo' object.");
        }
    }</p>
<p>    // 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) {</p>
<p>        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;
        }</p>
<p>        //Disable clip of evernote main popup
        if(Evernote.JQuery(candidate).closest("#evernote-content").length != 0) {
            return false;
        }</p>
<p>        // Elements with neither text nor images are not interesting.
        if (!candidate.textContent &#038;&#038; (candidate.getElementsByTagName("img").length === 0)) {
            return false;
        }</p>
<p>        // Elements with 0 area are not interesting.
        var rect = Evernote.ElementExtension.getBoundingClientRect(candidate);
        if (!rect.width || !rect.height) {
            return false;
        }</p>
<p>        // Invisible elements are not interesting.
        var style = Evernote.ElementExtension.getComputedStyle(candidate);
        if ((style.visibility === "hidden") || (style.display === "none")) {
            return false;
        }</p>
<p>        // If the nodes have a parent/child relationship, then they're only interesting if their visible contents differ.
        if (candidate.parentNode &#038;&#038; given.parentNode) {
            if ((candidate.parentNode == given) || (given.parentNode == candidate)) {
                if ((candidate.textContent === given.textContent) &#038;&#038;
                    (candidate.getElementsByTagName("img").length === given.getElementsByTagName("img").length)) {
                    return false;
                }
            }
        }
        return true;
    }</p>
<p>    // 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;
    }</p>
<p>    function nudgePreview(direction) {
        Evernote.Logger.debug("nudgePreview start");
        if (!previewElement) {
            return;
        }</p>
<p>        var oldPreview = previewElement;
        Evernote.Logger.debug("nudgePreview: direction is " + direction);
        Evernote.Logger.debug("nudgePreview: previewElement is " + previewElement.nodeName);
        switch (direction) {
            case "up":
                var temp = previewElement.parentNode;
                while (temp) {
                    if (looksInteresting(temp, previewElement)) {
                        // If we move up and then down, we want to move back to where we started, not the first child.
                        temp.enNudgeDescendToNode = previewElement;
                        previewElement = temp;
                        break;
                    }
                    temp = temp.parentNode;
                }
                break;
            case "down":
                Evernote.Logger.debug("nudgePreview: previewElement.enNudgeDescendToNode is " + previewElement.enNudgeDescendToNode);
                if (previewElement.enNudgeDescendToNode)
                {
                    var temp = previewElement.enNudgeDescendToNode;
                    // @TODO: make sure we clean these up somewhere else if we never reverse our nudging.
                    try {
                        delete previewElement.enNudgeDescendToNode;
                    } catch(e) {
                        previewElement.enNudgeDescendToNode = undefined;
                    }
                    previewElement = temp;
                } else {
                    previewElement = descendTreeUntilUniqueElement(previewElement);
                }
                break;
                Evernote.Logger.debug("nudgePreview: previewElement.children.length = " + previewElement.children.length);
                for (var i = 0; i < previewElement.children.length; i++) {
                    Evernote.Logger.debug("nudgePreview: checking child is " + previewElement.children[i].nodeName);
                    if (looksInteresting(previewElement.children[i], previewElement)) {
                        Evernote.Logger.debug("nudgePreview: found interesting child" + previewElement.children[i]);
                        previewElement = previewElement.children[i];
                        break;
                    }
                }
                break;
            case "left":
                var temp = previewElement.previousElementSibling;
                while (temp) {
                    if (looksInteresting(temp, previewElement)) {
                        previewElement = temp;
                        break;
                    }
                    temp = temp.previousElementSibling;
                }
                break;
            case "right":
                var temp = previewElement.nextElementSibling;
                while (temp) {
                    if (looksInteresting(temp, previewElement)) {
                        previewElement = temp;
                        break;
                    }
                    temp = temp.nextElementSibling;
                }
                break;
            default:
                Evernote.Logger.warn("Unhandled nudge direction: " + direction);
        }</p>
<p>        // Drawing is expensive so don't bother if nothing changed.
        if (oldPreview !== previewElement) {
            Evernote.Logger.debug("nudgePreview: draw new element.");</p>
<p>            function enoughSize(elem) {
                var el = Evernote.JQuery(elem);
                var w = el.width();
                var h = el.height();
                return (w > 30 &#038;&#038; h > 15)
            }</p>
<p>//            if (enoughSize(previewElement) === false) return;</p>
<p>            contentVeil.outlineElement(previewElement, false, true, true);
            article = previewElement;</p>
<p>            // TODO: scroll into Element view here (probably, attach to Expand/Contract Container
            window.scrollTo(0, previewElement.offsetTop - 30);
        }
    }</p>
<p>    function sameElement(a, b) {
        var aRect = a.getBoundingClientRect();
        var bRect = b.getBoundingClientRect();
        if (aRect.bottom == bRect.bottom &#038;&#038; aRect.height == bRect.height
            &#038;&#038; aRect.left == bRect.left &#038;&#038; aRect.right == bRect.right
            &#038;&#038; aRect.top == bRect.top &#038;&#038; aRect.width == bRect.width) {
            return false;
        } else if ((a.textContent === b.textContent) &#038;&#038;
            (a.getElementsByTagName("img").length === b.getElementsByTagName("img").length)) {
            return false;
        }
    }</p>
<p>    function descendTreeUntilUniqueElement(parent) {
        for (var i = 0; i < parent.children.length; i++) {
            if (sameElement(parent.children[i], parent)) {
                return descendTreeUntilUniqueElement(parent.children[i]);
            } else if (looksInteresting(parent.children[i], parent)) {
                return parent.children[i];
            }
        }
        return parent;
    }</p>
<p>    function previewFullPage() {
        var borderWidth = 4;
        var w = document.documentElement.scrollWidth;
        var h = document.documentElement.scrollHeight;</p>
<p>        var rect = {
            bottom: (h - borderWidth),
            top: (borderWidth),
            left: (borderWidth),
            right: (w - borderWidth),
            width: (w - (2 * borderWidth)),
            height: (h - (2 * borderWidth))
        };</p>
<p>        clear();
        contentVeil.reset();
        contentVeil.revealStaticRect(rect, document.body);
        contentVeil.show();
        contentVeil.hideAllActiveObjects();
    }</p>
<p>    // 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;</p>
<p>        return rect;
    }</p>
<p>    // Returns true if the rectangles match, false otherwise.
    function rectanglesEqual(rect1, rect2) {
        if (!rect1 &#038;&#038; !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;
    }</p>
<p>    // 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) {</p>
<p>        // 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 &#038;&#038; range.endContainer.nodeType !== Evernote.Node.ELEMENT_NODE) ||
            ( range.startContainer &#038;&#038; range.startContainer &#038;&#038; range.startContainer.getBoundingClientRect) ||
            ( range.endContainer &#038;&#038; range.endContainer.getBoundingClientRect) ||
            ( range.commonAncestorContainer &#038;&#038; range.commonAncestorContainer.getBoundingClientRect)
            ) {
            var rect = range.getBoundingClientRect();
            if(rect.top == 0 &#038;&#038; rect.bottom == 0 &#038;&#038; rect.left == 0 &#038;&#038; rect.right == 0) {
                if(range.commonAncestorContainer &#038;&#038; range.commonAncestorContainer.getBoundingClientRect) {
                    rect = range.commonAncestorContainer.getBoundingClientRect();
                } else if(range.startContainer &#038;&#038; range.startContainer.getBoundingClientRect) {
                    rect = range.startContainer.getBoundingClientRect();
                } else if(range.endContainer &#038;&#038; 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;
        }</p>
<p>        // 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.");
        }</p>
<p>        // 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]) &#038;&#038; !foundEnd) {
                foundEnd = true;
            }
            else {
                keptRects.push(initialRects[i]);
            }
        }</p>
<p>        // 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];</p>
<p>        var rect = keptRects[0];
        for (var i = 1; i < keptRects.length; i++) {
            rect = unionRectangles(rect, keptRects[i]);
        }</p>
<p>        return rect;
    }</p>
<p>    // If every edge of the rectangle is in negative space,
    function rectIsOnScreen(rect) {
        // rtl pages have actual content in "negative" space. This case could be handled better.
        if (document.dir == "rtl") {
            return false;
        }
        // If both top and bottom are in negative space, we can't see this.
        if (rect.bottom < 0 &#038;&#038; rect.top < 0) {
            return false;
        }
        // Or, if both left and right are in negative space, we can't see this.
        if (rect.left < 0 &#038;&#038; rect.right < 0) {
            return false;
        }
        // Probably visible.
        return true;
    }</p>
<p>    function applyElementRect(element, rect) {
        var newRect = rect;
        var tempRect = Evernote.ElementExtension.getBoundingClientRect(element);</p>
<p>        tempRect = {
            bottom: tempRect.bottom + window.pageYOffset,
            height: tempRect.height,
            left: tempRect.left + window.pageXOffset,
            right: tempRect.right + window.pageXOffset,
            top: tempRect.top + window.pageYOffset,
            width: tempRect.width
        };</p>
<p>    // Skip elements that are positioned off screen.
        if (!rectIsOnScreen(tempRect)) {
            return newRect;
        }
    var cs = getComputedStyle(element);
    // We won't descend into hidden elements.
    if (cs.display == "none") {
      return newRect;
    }
    // don't union a big rectangle that has hidden overflow
    if (cs.overflowX == "hidden" || cs.overflowY == "hidden") {
      return newRect;
    }
        // We skip anything with an area of one px or less. This is anything that has "display: none", or single pixel
        // images for loading ads and analytics and stuff. Most hidden items end up at 0:0 and will stretch our rectangle
        // to the top left corner of the screen if we include them. Sometimes single pixels are deliberately placed off
        // screen.
        if ((tempRect.width * tempRect.height) > 1) {
            newRect = unionRectangles(tempRect, rect);
        }
        if (element.children) {
            for (var i = 0; i < element.children.length; i++) {
                newRect = applyElementRect(element.children[i], newRect);
            }
        }
        return newRect;
    }</p>
<p>    // In the case of positioned elements, a bounding box around an element doesn't necessarily contain its child
    // elements, so we have this method to combine all of these into one bigger box. ContentVeil calls this function.
    function computeDescendantBoundingBox(element) {
        if (!element) return {top: 0, bottom: 0, left: 0, right: 0, width: 0, height: 0};
        var rect = element.getBoundingClientRect();
        var li = rect.top + window.pageYOffset
        return applyElementRect(element, {
            bottom: rect.bottom + window.pageYOffset,
            height: rect.height,
            left: rect.left + window.pageXOffset,
            right: rect.right + window.pageXOffset,
            top: rect.top + window.pageYOffset,
            width: rect.width
        });
    }</p>
<p>    function previewSelection(sel) {</p>
<p>        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();
        }</p>
<p>        contentVeil.reset();</p>
<p>        var frameRect = null;
        if (selectionFrame) {
            frameRect = Evernote.ElementExtension.getBoundingClientRect(selectionFrame);
        }</p>
<p>        var range, rect, i;</p>
<p>        // If !selection, then something has gone awry.
        if (selection) {
            clear();
            contentVeil.reset();
            // We attempt to highlight each selection, but this hasn't been tested for more than a single selection.
            for (i = 0; i < Evernote.Utils.Selection.getRangeCount(selection); i++) {
                range = Evernote.Utils.Selection.getRangeAt(selection, i);</p>
<p>                rect = computeAlternateBoundingBox(range);</p>
<p>                rect.top += document.documentElement.scrollTop;
                rect.bottom += document.documentElement.scrollTop;
                rect.left += document.documentElement.scrollLeft;
                rect.right += document.documentElement.scrollLeft;</p>
<p>                // Actual adjustment mentioned earlier regarding frames.
                if (frameRect) {
                    rect.left += frameRect.left;
                    rect.right += frameRect.left;
                    rect.top += frameRect.top;
                    rect.bottom += frameRect.top;
                }</p>
<p>                contentVeil.revealStaticRect(rect, selectionFrame, false);
                contentVeil.show();
            }
        }
        contentVeil.show();
        contentVeil.hideAllActiveObjects();
    }</p>
<p>    function getSnippetText() {
        return snippet;
    }</p>
<p>    // Public API:
    this.getArticleElement = getArticleElement;
    this.looksInteresting = looksInteresting;
    this.computeDescendantBoundingBox = computeDescendantBoundingBox;
    this.previewArticle = previewArticle;
    this.previewFullPage = previewFullPage;
    this.previewSelection = previewSelection;
    this.previewUrl = previewUrl;
    this.clear = clear;
    this.previewNudge = nudgePreview;
    this.showOverlay = showOverlay;
    this.getSnippetText = getSnippetText;
    this.showScreenShotArea = showScreenShotArea;
}
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ElementExtension = {
    querySelector : function(selector, doc) {
        if(!doc) {
            doc = document;
        }
        if(doc.querySelector) {
            return doc.querySelector(selector);
        }
        else {
            var head = doc.documentElement.firstChild;
            var styleTag = doc.createElement("STYLE");
            head.appendChild(styleTag);
            doc.__qsResult = [];</p>
<p>            styleTag.styleSheet.cssText = selector + "{x:expression(document.__qsResult.push(this))}";
            window.scrollBy(0, 0);
            head.removeChild(styleTag);</p>
<p>            var result = [];
            for (var i in doc.__qsResult)
                result.push(doc.__qsResult[i]);
            return result;
        }
    },</p>
<p>    getComputedStyle : function(element, pseudoElement, win) {
        var pseudo = pseudoElement;
        var target = win;
        if(!target)
            target = window;
        if(!pseudo) {
            pseudo = null;
        }
        if(target.getComputedStyle)
            return target.getComputedStyle(element, pseudo);
        if(element.currentStyle) {
            try {
				var fixedElement = Evernote.Utils.cloneObject(element.currentStyle);
				fixedElement['fontSize'] = Evernote.Utils.getIEComputedStyle(element, 'fontSize');
				return fixedElement; 
			}             
            catch (err) {
                return element.currentStyle;
            }
        }
        return null;
    },</p>
<p>    hasParentNode : function(element) {
        return element.parentNode &#038;&#038; element.parentNode.nodeType != 9 &#038;&#038; element.parentNode.nodeType != 11;
    },</p>
<p>    getBoundingClientRect : function(element) {
        if(element &#038;&#038; element.getBoundingClientRect) {
            var rect = element.getBoundingClientRect();
            var width = rect.width || element.offsetWidth || element.boundingWidth;
            var height = rect.height || element.offsetHeight || element.boundingHeight;
            return {
                left : rect.left,
                right : rect.right,
                top : rect.top,
                bottom : rect.bottom,
                width : width,
                height : height
            }
        }
        return null;
    },</p>
<p>    hasAttribute : function(node, attrName) {
        if(node) {
            if(node.hasAttribute) {
                return node.hasAttribute(attrName);
            }
            if(node.attributes) {
                var attrValue = node.attributes[attrName];
                return typeof attrValue != typeof undefined;
            }
        }
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ArrayExtension = {
    indexOf : function(element, searchStr) {
        if(!element) {
            return -1;
        }
        if (element.indexOf)
            return element.indexOf(searchStr);
        for(var i = 0; i < element.length; i++) {
            if(element[i] == searchStr)
                return i;
        }
        return -1;
    },</p>
<p>    containsCaseIgnore : function(element, searchStr) {
        if(!element) {
            return false;
        }
        for(var i = 0; i < element.length; i++) {
            if(element[i].toLowerCase() == searchStr.toLowerCase())
                return true;
        }
        return false;
    },</p>
<p>    remove : function(arr, element) {
        var elementPosition = Evernote.ArrayExtension.indexOf(arr, element);
        if(elementPosition != -1) {
            var rest = arr.slice(elementPosition  + 1 || arr.length);
            arr.length = elementPosition;
            return arr.push.apply(arr, rest);
        }
    },</p>
<p>    filter : function(arr, fun) {
        var len = arr.length >>> 0;
        if (typeof fun != "function")
            throw new TypeError();</p>
<p>        var res = [];
        var thisp = arguments[1];
        for (var i = 0; i < len; i++) {
            if (i in arr) {
                var val = arr[i];
                if (fun.call(thisp, val, i, arr))
                {
                    res.push(val);
                }
            }
        }
        return res;
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![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 < props.length; i++) {
            var propName = props[i];
            Evernote.Logger.debug("Evernote.StyleElementExtension.getPropertyValue: property name is " + propName);
            var val;
            if(styleObj.getPropertyValue) {
                val = styleObj.getPropertyValue(propName);
                Evernote.Logger.debug("Evernote.StyleElementExtension.getPropertyValue: value from getPropertyValue is " + val);
                if(val)
                    return val;
            }
            val = styleObj[propName];
            Evernote.Logger.debug("Evernote.StyleElementExtension.getPropertyValue: value from styleObj " + val);
            if(val)
                return val;
        }
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.GlobalUtils = {};
(function(){
    var urlMatcher = /^(.*?):\/\/((www\.)?(.*?))(:\d+)?(\/.*?)(\?.*)?$/;</p>
<p>    var BAD_FAV_ICON_URLS = {"http://localhost/favicon.ico": true};</p>
<p>    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;
    };</p>
<p>    Evernote.GlobalUtils.getMessageCode = function(messageConst) {
        Evernote.Logger.debug("getMessageCode: " + messageConst);
        return Evernote.Messages[messageConst];
    };</p>
<p>    Evernote.GlobalUtils.absolutizeImages = function(element, path) {
        if(path) {
            Evernote.Utils.changeBackgroundImage(element, Evernote.Addin.getPath("resources") + path);
        }
        else if(element.attributes &#038;&#038; element.attributes["background-image"]) {
            // TODO: replace "oldlipper" with universal path
            Evernote.Utils.changeBackgroundImage(element, Evernote.Addin.getPath("resources") + 'oldclipper/' + element.attributes["background-image"].value);
        }
        Evernote.Logger.debug("absolutizeImages: walk through children");
        for (var i = 0; i < element.children.length; i++) {
            Evernote.GlobalUtils.absolutizeImages(element.children[i]);
        }
        Evernote.Logger.debug("absolutizeImages: end");
    };</p>
<p>    Evernote.GlobalUtils.localize = function(element) {
        var node = element.nodeName.toLowerCase();
        if (node == "input" || node == "textarea") {
            var type = element.type;
            if (node == "textarea") type = "textarea";
            switch (element.type) {
                case "text":
                case "textarea":
                case "button":
                case "submit":
                case "search":
                    if (element.attributes &#038;&#038; 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);
                            }
                        }
                    }</p>
<p>                    if (element.attributes &#038;&#038; 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;</p>
<p>                // unlocalizable.
                case "checkbox":
                case "password":
                case "hidden":
                case "radio":
                    break;</p>
<p>                default:
                    throw new Error("We need to localize the value of input elements.");
            }
        }</p>
<p>        else if (element.attributes &#038;&#038; element.attributes["message"]) {
            var localizedMessage = Evernote.Addin.getLocalizedMessage(Evernote.GlobalUtils.getMessageCode(element.attributes["message"].value));
            if (localizedMessage) {
                element.innerHTML = localizedMessage;
            } else {
                element.innerHTML = 'l10n error'; // to spot if something goes wrong
            }
        }</p>
<p>        if (element.title){
            var localizedTitle = Evernote.Addin.getLocalizedMessage(Evernote.GlobalUtils.getMessageCode(element.title));
            if (localizedTitle) {
                element.title = localizedTitle;
            }
        }</p>
<p>        for (var i = 0; i < element.children.length; i++) {
            Evernote.GlobalUtils.localize(element.children[i]);
        }
    };</p>
<p>    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("&#038;");
        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;
    };</p>
<p>    Evernote.GlobalUtils.escapeXML = function(str) {
        var map = {
            "&#038;" : "&amp;",
            "<" : "&lt;",
            ">" : "&gt;",
            "\"" : "&quot;",
            "'" : "&apos;"
        };</p>
<p>        var a = str.split("");
        for (var i = 0; i < a.length; i++) {
            if (map[a[i]]) {
                a[i] = map[a[i]];
            }
        }
        return a.join("");
    };</p>
<p>    Evernote.GlobalUtils.decodeXML = function(str) {
        str = str.replace(/&amp;apos;/g, "&#39;");
        str = str.replace(/&amp;quot;/g, "&#34;");
        str = str.replace(/&amp;lt;/g, "&#60;");
        str = str.replace(/&amp;gt;/g, "&#62;");
        return str;
    };</p>
<p>    Evernote.GlobalUtils.cropImage = function( data ) {
        var img = new Image;
        img.onload = function(){
            var canvas=document.createElement("canvas");
            canvas.width=Math.min(150,data.width);
            canvas.height=Math.min(150,data.height);
            canvas.getContext("2d").drawImage(img ,Math.max(0,(data.width-150)/2),Math.max(0,(data.height-150)/2),canvas.width,canvas.height,0,0,canvas.width,canvas.height);
            return canvas.toDataURL();   // Not working. Cross origin policy forbids toDataUrl() method.
        };
        img.src = data.src;
    };</p>
<p>    Evernote.GlobalUtils.createUrlClipContent = function(title, url, favIcoUrl, snippet) {</p>
<p>        var titleAttr = (title) ? Evernote.GlobalUtils.escapeXML(title) : "";
        var urlStr = Evernote.GlobalUtils.escapeXML(url);
        var snip = snippet;</p>
<p>        if (snip.length > 275) {
            snip = snip.substr(0, 275-3) + '...';
        }</p>
<p>        snip = Evernote.GlobalUtils.escapeXML(snip);</p>
<p>        var contentStyle = 'text-align:left;padding:15px;font-size:12px;font-family:Verdana;max-width:370px;color:black;background-color:white;box-sizing:content-box;display:block;background-repeat:no-repeat;';
        var titleStyle = 'white-space:nowrap;font-size:14px;font-weight:bold;overflow-x:hidden;text-overflow:ellipsis;height:24px;';
        var hrStyle = 'border-top-width:1px;border-top-style:solid;border-top-color:#d8d8d8;height:0;width:100%;';
        var imgStyle = 'position:relative;display:inline-block;float:left;width:150px;height:150px;margin:15px 30px 0 0;overflow:hidden;';
        var contStyle = 'display:inline-block;vertical-align:top;margin:15px 0 0;width:364px;';
        var linkDivStyle = 'padding:0px 0px 11px 0px;';
        var faviconStyle = 'float:left;width:16px; height:16px; margin-right:9px; background-size:16px 16px;background-repeat: no-repeat; background-position:left center;';
        var linkStyle = 'display:inline-block;text-decoration:none;line-height:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:rgb(12, 12, 12);width:325px;';
        var snipStyle ='word-wrap:break-word;line-height:normal;text-align:left;font-size:12px';</p>
<p>        var imgDiv = '';
        var titleDiv = '</p>
<div id="evernoteBookmarkTitle" style="' + titleStyle + '">' + titleAttr + '</div>
<p>';
        var hrDiv = '</p>
<div id="evernoteBookmarkDivider" style="' + hrStyle + '">&#160;</div>
<p>';</p>
<p>        Evernote.pageInfo.getBiggestImage(function(data) {
            if (data &#038;&#038; data.src) {
                var im = '<img src="' + data.src + '" width="150"/>';
                imgDiv =  '</p>
<div id="evernoteBookmarkImage" style="'+ imgStyle +'">' + im + '</div>
<p>';
                contentStyle = contentStyle.replace('max-width:370px','max-width:562px');
            }
        });</p>
<p>        var link = '<a style="' + linkStyle + '" href="' + urlStr+ '">' + urlStr + '</a>';
        var favicon = '</p>
<div style="' + faviconStyle + 'background-image:url('+ favIcoUrl +  ');">&#160;</div>
<p>';
        var linkDiv = '</p>
<div id="evernoteBookmarkLink" style="' + linkDivStyle + '">' + favicon + link + '</div>
<p>' ;
        var snipDiv = '</p>
<div id="evernoteBookmarkSnippet" style="' + snipStyle + '">' + snip + '</div>
<p>';
        var contDiv = '</p>
<div id="evernoteBookmarkContent" style="' + contStyle + '">' + linkDiv + snipDiv + '</div>
<p>';
        var clearDiv = '</p>
<div style="clear:both"/>'</p>
<p>        var content = '</p>
<div id="evernoteBookmarkContainer" style="' + contentStyle + '">' + titleDiv + hrDiv + imgDiv + contDiv + clearDiv + '</div>
<p>';
        return content;
    };</p>
<p>    Evernote.GlobalUtils.executeOnDomReady = function(callback) {
        Evernote.JQuery(document).ready(function() {
            callback();
        });
    };</p>
<p>    Evernote.GlobalUtils.isDocumentLoaded = function(doc) {
        return doc.readyState == "complete" || doc.readyState == "interactive";
    };
})();
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/**
 * Global utilities.
 */
Evernote.Utils = {
    _prevTime : null,</p>
<p>    getIEComputedStyle : function(elem, prop) {
        //Dean Edwards method. See first comment here: http://bit.ly/cMSs9R</p>
<p>        var value = elem.currentStyle[prop] || 0;
        var leftCopy = elem.style.left;
        var runtimeLeftCopy = elem.runtimeStyle.left;</p>
<p>        elem.runtimeStyle.left = elem.currentStyle.left;
        elem.style.left = (prop === "fontSize") ? "1em" : value;
        value = elem.style.pixelLeft + "px";</p>
<p>        elem.style.left = leftCopy;
        elem.runtimeStyle.left = runtimeLeftCopy;
        return value
    },</p>
<p>    sendMessageToPopup : function( message ){
        Evernote.JQuery("#" + Constants.CLIP_DIALOG_ID).trigger(message);
    },</p>
<p>    pushTimeWithPrefix : function(prefix) {
        var time = new Date;
        var passed;</p>
<p>        time = time.getTime();
        passed = time - this._prevTime;
        this._prevTime = time;
        console.log(prefix + ': ' + passed + 'ms');
    },</p>
<p>    cloneObject : function(obj){
        if(obj == null || typeof(obj) != 'object')
            return obj;
        if(obj.constructor == Array)
            return [].concat(obj);
        var temp = {};
        for(var key in obj)
            temp[key] = this.cloneObject(obj[key]);
        return temp;
    },</p>
<p>    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;
    },</p>
<p>    clearSelection : function(doc) {
        if(doc.getSelection) {
            doc.getSelection().removeAllRanges();
        }
    },</p>
<p>    /**
     * 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 &#038;&#038; range) {
            range.select();
        }
    },</p>
<p>    /**
     * 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 &#038;&#038; range.cloneRange) {
            return range.cloneRange();
        }
        if(range.duplicate) {
            Evernote.Logger.debug("cloneRange: result = " + range.duplicate());
            return range.duplicate();
        }
        return range;
    },</p>
<p>    /**
     * 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();
        }
    },</p>
<p>    /**
     * Gets favicon url from the document (if any)
     * @param doc - document to inspect.
     * @return url to the favicon or null.
     */
    getFavIconUrl : function(doc) {
        var links = doc.getElementsByTagName("link");
        var i;
        for (i = 0; i < links.length; i++) {
            if (links[i].rel) {
                var rels = links[i].rel.toLowerCase().split(/\s+/);
                if (Evernote.ArrayExtension.indexOf(rels, "icon") !== -1) {
                    // Found it!
                    return links[i].href;
                }
            }
        }
        return null;
    },</p>
<p>    /**
     * If passed string length is more than length argument, than string is trimmed to length and dots are added
     * (total length of the returned string does not exceed specified length).
     * @param str - string to trim
     * @param length - max number of characters in the string
     * @param addition - text to be added to truncated string
     * @return {*}
     */
    cutToLength : function(str, length, addition) {
        if(!addition) {
            addition = "...";
        }
        if(str.length > length) {
            return (str.substring(0, length-3) + addition);
        }
        return str;
    },</p>
<p>    /**
     * Change new line symbol to html 
     */
    newLineToBr : function(str) {
        return str.replace(/(\r\n|\n|\r)/gm, "
");
    },</p>
<p>    /**
     * Encodes html specific characters (<, >, &#038;, etc.) in specified string
     * @param str - string to encode.
     * @return new string with encoded characters.
     */
    htmlEncode : function( str ) {
        var result = "";
        for ( var i = 0; i < str.length; i++ ) {
            var charcode = str.charCodeAt( i );
            var aChar = str[ i ];
            if(!aChar) {
                aChar = str.charAt(i);
            }
            if(charcode >= 55296 )
                result += aChar;
            else if ( charcode > 0x7f ) {
                result += "&#" + charcode + ";";
            }
            else if ( aChar == '>' ) {
                result += "&gt;";
            }
            else if ( aChar == '<' ) {
                result += "&lt;";
            }
            else if ( aChar == '&#038;' ) {
                result += "&amp;";
            }
            else {
                result += str[ i ] ? str[ i ] : str.charAt(i);
            }
        }</p>
<p>        return result;
    },</p>
<p>    /**
     * 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);
        }</p>
<p>        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 ) === '/' ? '/' : '' );
            }</p>
<p>            href = parseURI( href || '' );
            base = parseURI( base || '' );</p>
<p>            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 &#038;&#038; !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 );</p>
<p>    },</p>
<p>    getNestedDocuments : function( doc ) {
        Evernote.Logger.debug( "Utils.getNestedDocuments()" );</p>
<p>        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 );
                }
            }</p>
<p>            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;</p>
<p>    },</p>
<p>    isSupportedUrl : function(url) {
        return url.indexOf("http") == 0;
    },</p>
<p>    getFontSizeInPixels : function(elementFontSize) {
        function computedStyle(element, property){
            var s = false;
            if(window.getComputedStyle){
                s = window.getComputedStyle(element, null).getPropertyValue(property);
            } else if(element.currentStyle){
                var p = property.split('-');
                var str = new String('');
                for(var i = 0; i < p.length; i++){
                    str += (i > 0)?(p[i].substr(0, 1).toUpperCase() + p[i].substr(1)):p[i];
                }
                s = element.currentStyle[str];
            }
            return s;
        }</p>
<p>        function getPercentageSize(size) {
            var currentFontSize = parseFloat(size);
            var htmlFontSize = 16;
            var htmlElement = document.getElementsByTagName("html");
            if(htmlElement &#038;&#038; htmlElement.length > 0) {
                var htmlComputedFontSize = computedStyle(htmlElement[0], "font-size");
                if(htmlComputedFontSize &#038;&#038; htmlComputedFontSize.indexOf("%") == -1) {
                    htmlFontSize = Evernote.Utils.getFontSizeInPixels(htmlComputedFontSize);
                }
            }
            return htmlFontSize * currentFontSize / 100;
        }</p>
<p>        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);
    },</p>
<p>    innerWidth : function() {
        if(window.innerWidth)
            return window.innerWidth;</p>
<p>        var doc= (document.body.clientWidth)? document.body: document.documentElement;
        return doc.clientWidth;
    },</p>
<p>    innerHeight : function() {
        if(window.innerHeight)
            return window.innerHeight;</p>
<p>        var doc= (document.body.clientHeight)? document.body: document.documentElement;
        return doc.clientHeight;
    },</p>
<p>    scrollTop : function() {
        var doc = document.body.scrollTop ? document.body : document.documentElement;
        return doc.scrollTop;
    },</p>
<p>    scrollLeft : function() {
        var doc = document.body.scrollLeft ? document.body : document.documentElement;
        return doc.scrollLeft;
    },</p>
<p>    /**
     * 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();
        });
    },</p>
<p>    isQuirkMode : function() {
        return document.compatMode == "BackCompat" &#038;&#038; !Evernote.BrowserDetection.isIE11();
    },</p>
<p>    isQuirkModeNew : function() {
        return document.compatMode == "BackCompat" &#038;&#038; Evernote.BrowserDetection.isLessThanIE9();
    },</p>
<p>    isInstanceOf : function(obj, type) {
        if(obj &#038;&#038; type) {
            try {
                return obj instanceof type;
            } catch (e) {
                return type.toString().indexOf(typeof obj) != -1;
            }
        }
        return false;
    },</p>
<p>    changeBackgroundImage : function(element, localpath) {
        if(element.style) {
            element.style.backgroundImage = "url('file:///" + localpath.replace(/\\/g, "/").replace(/\s/g, "%20") + "')";
        }
    },</p>
<p>    format: function(str) {
        var args = arguments;
        return str.replace(/\{(\d+)\}/g, function (m, n) { return args[(n | 0)+1]; });
    },</p>
<p>    fixIERangeObject : function(range,win) { //Only for IE8 and below.
        win=win || window;</p>
<p>        if(!range) return null;
        if(!range.startContainer &#038;&#038; win.document.selection) { //IE8 and below</p>
<p>            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 &#038;&#038; 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
            };</p>
<p>            var rangeCopy1=range.duplicate(), rangeCopy2=range.duplicate(); //Create a copy
            var rangeObj1=range.duplicate(), rangeObj2=range.duplicate(); //More copies <img src='http://electrification-consulting.com/wp/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>            rangeCopy1.collapse(true); //Go to beginning of the selection
            rangeCopy1.moveEnd('character',1); //Select only the first character
            rangeCopy2.collapse(false); //Go to the end of the selection
            rangeCopy2.moveStart('character',-1); //Select only the last character</p>
<p>            //Debug Message
            // alert(rangeCopy1.text); //Should be the first character of the selection
            var parentElement1=rangeCopy1.parentElement(), parentElement2=rangeCopy2.parentElement();</p>
<p>            //If user clicks the input button without selecting text, then moveToElementText throws an error.
            if(window.HTMLInputElement &#038;&#038; (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</p>
<p>            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</p>
<p>            var nodeInfo1=_findTextNode(parentElement1,text1);
            var nodeInfo2=_findTextNode(parentElement2,text2);</p>
<p>            // todo: dirty fix
            if (!nodeInfo1.node) {
                nodeInfo1.node = parentElement1;
            }</p>
<p>            if (!nodeInfo2.node) {
                nodeInfo2.node = parentElement2;
            }</p>
<p>            //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;
    },</p>
<p>    unionRectangles : function(rect1, rect2) {
        var rect = {
            top: (Math.min(rect1.top, rect2.top)),
            bottom: (Math.max(rect1.bottom, rect2.bottom)),
            left: (Math.min(rect1.left, rect2.left)),
            right: (Math.max(rect1.right, rect2.right))
        };
        rect.width = rect.right - rect.left;
        rect.height = rect.bottom - rect.top;</p>
<p>        return rect;
    },</p>
<p>    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);
            }
        }</p>
<p>        if(el) {
            var elem = Evernote.JQuery(el);
            if(Evernote.Utils.isQuirkMode())  {
                elem.css("position", "absolute");
                if (win.attachEvent)
                    win.attachEvent("onscroll", function() {applyPosition(elem);});
                else if (win.addEventListener)
                    win.addEventListener("scroll", function() {applyPosition(elem);}, false);
                else
                    Evernote.Logger.error( "Utils.fixedPosition() can't attachEvent" );
                if(immediate) {
                    applyPosition(elem);
                }
            }
        }
    },</p>
<p>    mergeCustomComboBoxStrings : function(notebook, owner, ownedByStr, maxLen) {</p>
<p>        var totalLen = notebook.length;
        if (owner.length) {
            // format: "space","(","<owned by localize string>","space","<owner>",")"
            // magic number "4" is: "space","(","space",")"
            totalLen += ownedByStr.length + owner + 4;
        }</p>
<p>        if (totalLen <= maxLen) {
            return {
                note: notebook,
                own: "",
                title: ""
            };
        }</p>
<p>        var half = maxLen / 2 - 2;</p>
<p>        if (owner.length == 0) {
            return {
                note: notebook.substr(0, half) + "..." + notebook.substring(notebook.length - half, notebook.length),
                own: "",
                title: notebook
            };
        }</p>
<p>        var ownerFormatStr = "(" + ownedByStr + " " + owner + ")";
        var title = notebook + ownerFormatStr;
        var resultString = title.substr(0, half) + "..." + title.substr(title.length - half);</p>
<p>        if (notebook.length <= half) {
            return  {
                note: notebook,
                own: "..." + title.substr(title.length - notebook.length),
                title: notebook + " " + ownerFormatStr
            };
        }else if (ownerFormatStr <= half) {
            return  {
                note: notebook.substr(0, maxLen - ownerFormatStr.length) + "...",
                own: ownerFormatStr,
                title: notebook + " " + ownerFormatStr
            };
        }else {
            return  {
                note: resultString.substr(0, resultString.length - half),
                own: resultString.substr(half + 3),
                title: notebook + " " + ownerFormatStr
            };
        }
    },</p>
<p>    setEvernoteLogo : function(selector) {
        var serverLocation = Evernote.Addin.getServerLocation();
        Evernote.Logger.debug("Evernote server location is " + serverLocation);
        if (serverLocation.length &#038;&#038; serverLocation.indexOf("international") == -1) {
            var evernoteLogoEl = Evernote.JQuery(selector);
            if (evernoteLogoEl) {
                var imageFileName = "oldclipper/images/web-clipper-logo_" + serverLocation + ".png";
                this.changeBackgroundImage(evernoteLogoEl.get(0), Evernote.Addin.getPath("resources") + imageFileName);
            }
        }
    },</p>
<p>    Selection : {
        getRangeCount : function(selection) {
            if(selection.rangeCount) {
                return selection.rangeCount;
            }
            return 1;
        },</p>
<p>        getRangeAt : function(selection, pos) {
            if(selection.getRangeAt) {
                selection.getRangeAt(pos);
            }
            return selection;
        },</p>
<p>        getCommonAncestorContainer : function(range) {
            if(range.commonAncestorContainer) {
                return range.commonAncestorContainer;
            }
            else if(range.parentElement) {
                return range.parentElement();
            }
            return null;
        }
    }</p>
<p>};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ClipperActions = {
    CLIP_URL : "0",
    CLIP_FULL_PAGE: "1",
    CLIP_ARTICLE: "2",
    CLIP_SELECTION: "3", // Selection is not supported by default
    CLIP_IMAGE: "4", // Image too
    CLIP_SIMPLIFIED_ARTICLE: "5",
    CLIP_SCREEN_SHOT: "6"
};</p>
<p>Evernote.ArticleSelectionOptions = {
    ENABLED : "0",
    DISABLED : "1",
    ENABLED_WITHOUT_HINTS : "2"
};</p>
<p>Evernote.Trigger = {
    ENABLED : true,
    DISABLED : false
};</p>
<p>Evernote.Options = {
    oneClickMode: false,
    action: {
        bydefault: "2",
        lastUsedEnable: true,
        lastUsed: "article"
    },
    tags: {
        alwaysEnable: false,
        alwaysData: ""
    },
    notebooks: {
        lastUsed: -1,
        lastUsedEnable: true,
        bydefault: ""
    },
    skitch: {
        lastUsedColor: ""
    },
    hints: {
        permanentScreenCapture : true
    },
    postClip : {
        show : false
    },
    /**
     * Return string representation of the object (you can use it in load method to restore object from string).
     */
    _serialize: function() {
        //return JSON.stringify(this, null, '\t');  CNN.com has own JSON.stringify with parse errors</p>
<p>        function strObj( obj ) {
            var i = 0;
            var optArr = [];</p>
<p>            for (var prop in obj) {
                if (obj.hasOwnProperty(prop) &#038;&#038; typeof obj[prop] != 'function') {
                    var value;
                    if (typeof obj[prop] == 'object') {
                        value = strObj(obj[prop]);
                    } else if (typeof obj[prop] == 'string') {
                        var tempStr = obj[prop];
                        tempStr = tempStr.replace(/\\/g, "\\\\");
                        tempStr = tempStr.replace(/\"/g, "\\\"");
                        value = '"' + tempStr + '"';
                    } else {
                        value = obj[prop];
                    }
                    optArr[i] = '"' + prop + '":' + value;
                    i++;
                }
            }
            return '{' + optArr.toString() + '}';
        }
        return strObj(this);
    },</p>
<p>    load : function() {
        var optionsContent = Evernote.FS.getOptionsFileContent();
        this._load(optionsContent);
        Evernote.Logger.debug('Load options ' + JSON.stringify(this, null, '\t'));
    },</p>
<p>    _load : function(str) {
        if(str) {
            try {
                var options;</p>
<p>                options = JSON.parse(str);</p>
<p>                for (var prop in options) {
                    if (options[prop] &#038;&#038; options.hasOwnProperty(prop)) {
                        this[prop] = options[prop];
                    }
                }
            } catch(e){
                // ignore
            }
        }
    },</p>
<p>    setScreenCaptureHintNonPermanent : function(){
        this.hints.permanentScreenCapture = false;
        this.save();
    },</p>
<p>    setDefaultAction : function(action) {
        this.action.bydefault = action;
        this.setLastUsedActionDisabled();
        this.save();
    },</p>
<p>    setDefaultNotebook : function(notebook) {
        this.notebooks.bydefault = notebook;
        this.setLastUsedNotebookDisabled();
        this.save();
    },</p>
<p>    setNotebook : function(notebookUid) {
        this.notebooks.lastUsed = notebookUid;
        this.save();
    },</p>
<p>    setLastUsedNotebookEnabled : function() {
        if (this.notebooks.lastUsedEnable == Evernote.Trigger.DISABLED) {
            this.notebooks.lastUsedEnable = Evernote.Trigger.ENABLED;
        }
        this.save();
    },</p>
<p>    setLastUsedNotebookDisabled : function() {
        if (this.notebooks.lastUsedEnable == Evernote.Trigger.ENABLED) {
            this.notebooks.lastUsedEnable = Evernote.Trigger.DISABLED;
        }
        this.save();
    },</p>
<p>    setLastUsedAction : function(action) {
        this.action.lastUsed = action;
        this.save();
    },</p>
<p>    setLastUsedActionEnabled : function () {
        if (this.action.lastUsedEnable == Evernote.Trigger.DISABLED) {
            this.action.lastUsedEnable = Evernote.Trigger.ENABLED;
        }
        this.save();
    },</p>
<p>    setLastUsedActionDisabled : function() {
        if (this.action.lastUsedEnable == Evernote.Trigger.ENABLED) {
            this.action.lastUsedEnable = Evernote.Trigger.DISABLED;
        }
    },</p>
<p>    setOneClickClipping : function(condition) {
        if (condition) {
            this.oneClickMode = Evernote.Trigger.ENABLED;
        } else {
            this.oneClickMode = Evernote.Trigger.DISABLED;
        }
        this.save();
    },</p>
<p>    setAlwaysTagsEnabled : function (condition) {
        if (condition) {
            this.tags.alwaysEnable = Evernote.Trigger.ENABLED;
        } else {
            this.tags.alwaysEnable = Evernote.Trigger.DISABLED;
        }
        this.save();
    },</p>
<p>    setAlwaysTagsString : function (str) {
        this.tags.alwaysData = str;
        this.save();
    },</p>
<p>    setPostClipDialogEnabled : function () {
        if (this.postClip.show == Evernote.Trigger.DISABLED) {
            this.postClip.show = Evernote.Trigger.ENABLED;
        }
        this.save();
    },</p>
<p>    setPostClipDialogDisabled : function () {
        if (this.postClip.show == Evernote.Trigger.ENABLED) {
            this.postClip.show = Evernote.Trigger.DISABLED;
        }
        this.save();
    },</p>
<p>    setLastUsedSkitchColor : function(color) {
        this.skitch.lastUsedColor = color;
        this.save();
    },</p>
<p>    save : function() {
        Evernote.Logger.debug('Save options: ' + JSON.stringify(this, null, '\t'));
        var jsonSer = this._serialize();
        Evernote.FS.writeOptionsToFile(jsonSer);
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.BrowserDetection = {
    isIE11 : function() {				
        return navigator.userAgent.indexOf("Trident/7.0") != -1       
    },</p>
<p>	isIE10 : function() {
        return navigator.userAgent.indexOf("MSIE 10") != -1;
    },</p>
<p>    isIE7 : function() {
        return navigator.userAgent.indexOf("MSIE 7.0") != -1 &#038;&#038; navigator.userAgent.indexOf("Trident/7.0") == -1;
    },</p>
<p>    isIE8 : function() {
        return navigator.userAgent.indexOf("MSIE 8.0") != -1 &#038;&#038; navigator.userAgent.indexOf("Trident/7.0") == -1;
    },</p>
<p>    isIE9 : function() {
        return navigator.userAgent.indexOf("MSIE 9.0") != -1 &#038;&#038; navigator.userAgent.indexOf("Trident/7.0") == -1;
    },</p>
<p>    isLessThanIE9 : function() {
        return Evernote.BrowserDetection.isIE7() || Evernote.BrowserDetection.isIE8()
    },</p>
<p>	isIE10orGreater : function() {
		return Evernote.BrowserDetection.isIE10() || Evernote.BrowserDetection.isIE11()
	}
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.Node = {
    ELEMENT_NODE : 1,
    TEXT_NODE : 3
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.Share = {
    _DEFAULT_WIDTH : 650,
    _DEFAULT_HEIGHT : 650,
    _DEFAULT_TYPE : 'popup',</p>
<p>    _openWindow : function( url, width, height ) {
        var w = width || this._DEFAULT_WIDTH;
        var h = height || this._DEFAULT_HEIGHT;
        var t = this._DEFAULT_TYPE;</p>
<p>        var params = 'width=' + w + ',height=' + h + ',type=' + t + ',left=200,top=200,resizable=yes';</p>
<p>        Evernote.Logger.debug('Open ' + url + ' with params: ' + params);
        window.open(url, null, params);
    },</p>
<p>    toSocial : function ( id, link , title) {
        Evernote.Logger.debug('Evernote.Share.toSocial ' + id + ' and link: ' + link + ', title: ' + title);
        var shareUrl;</p>
<p>        if ( id == 'facebook') {
            shareUrl = "https://www.facebook.com/sharer/sharer.php?u=" + encodeURIComponent(link);
            this._openWindow( shareUrl, 626, 436 );
        } else if (id == 'twitter') {
            shareUrl = "https://twitter.com/intent/tweet?text=" + encodeURIComponent(title)
                + "&#038;url=" + encodeURIComponent(link);
            this._openWindow( shareUrl, 550, 420 );
        } else if (id == 'linkedin') {
            shareUrl = "http://www.linkedin.com/shareArticle?mini=true&#038;url=" + encodeURIComponent(link)
                + "&#038;title=" + encodeURIComponent(title);
            this._openWindow( shareUrl, 900, 570 );
        } else if (id == 'weibo') {
            shareUrl = "http://service.weibo.com/share/share.php?url=" + encodeURIComponent(link)
                + "&#038;title=" + encodeURIComponent(title);
            this._openWindow( shareUrl, 650, 650 );
        }
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.PostClipPopup = function(doc) {</p>
<p>    var elem = Evernote.JQuery('#' + Constants.POST_CLIP_DIALOG_ID);
    var clipboard_container = elem.find('#' + 'evn-clipboardCopy-container');</p>
<p>    var titleField = elem.find('.noteTitle');
    var link = Evernote.pageInfo.getUrl();
    var shareTitle = 'error';</p>
<p>    // subscribe to response from addin
    Evernote.ResponseReceiver.subscribe(this);</p>
<p>    var _title = '';
    var _notebook = '';
    var clipping_message = Evernote.Addin.getLocalizedMessage(Evernote.Messages.CLIPPING);
    var clipped_message = Evernote.Addin.getLocalizedMessage(Evernote.Messages.CLIPPED);</p>
<p>    var message = elem.find('.clippedMessage');
    var closeButton = elem.find('.closeCross');
    var openButton  = elem.find('#openButton');
    var shareButton  = elem.find('#shareButton');
    var shareIcons = elem.find('.shareButton');</p>
<p>    var cbInput = elem.find('.evn-pcp-clipboard-input');
    var cbMessage = elem.find('.evn-pcp-clipboard-message');
    var cbButton = elem.find('.evn-pcp-clipboard-button');</p>
<p>    var errorLink = elem.find('#evn-show-logs');
    var errorMsg = elem.find('.evn-error-desc');</p>
<p>    function showLogs() {
        var logFile = Evernote.Addin.getPath("logfile");
        Evernote.Addin.openLocalFile(logFile, BrowserNavConstants.NAVOPENNEWTAB);
    }</p>
<p>    function modifyToCurrentIE() {
        if (document.documentMode == '9') {
            elem.addClass('evn-iexplorer9');
        } else if (document.documentMode == '7' || Evernote.BrowserDetection.isIE7()) {
            elem.addClass('evn-iexplorer7');
        }
    }</p>
<p>    function finishPostClip () {
        endProcessingAndClose();
//        if (Evernote.Options.postClip.show == true) {
//            endProcessing();
//        } else {
//            endProcessingAndClose();
//        }
    }</p>
<p>    function localize() {
        Evernote.GlobalUtils.localize(elem.get(0));
    }</p>
<p>    function copyToClipboard(){
        var clipSucceed = window.clipboardData.setData('Text', link);</p>
<p>        var isAllowed = window.clipboardData.getData('Text');
        if (isAllowed == "") { // Could be empty, or failed
            // Verify failure
            if (!window.clipboardData.setData('Text', 'test_string'))
                isAllowed = null;
        }</p>
<p>        if (clipSucceed &#038;&#038; isAllowed) {
            clipboard_container.addClass('evn-success');
            cbMessage.text(Evernote.Addin.getLocalizedMessage(Evernote.Messages.URL_COPIED));
        } else {
            clipboard_container.addClass('evn-failed');
            cbMessage.text(Evernote.Addin.getLocalizedMessage(Evernote.Messages.DISABLED));
        }</p>
<p>    }</p>
<p>    function handleShareIconClick ( evt ) {
        var id = evt.srcElement.id || Evernote.JQuery(evt.target).closest('table').attr('id');</p>
<p>        if (id == 'clipboard') {
            elem.addClass('evn-clipboard-mode');
        } else {
            Evernote.Share.toSocial( id , link, shareTitle);
        }
    }</p>
<p>    function fillOutPopup(title, notebook) {
        _title = title;
        _notebook = notebook;</p>
<p>        titleField.html(title);
        cbInput.val(link);
        shareTitle = title;
    }</p>
<p>    function renderErrorMessage( error ) {</p>
<p>        if (error.code == Evernote.ErrorCodes.AUTHENTICATION_ERROR) {
            errorMsg.html(error.message);
        }</p>
<p>        elem.removeClass('processing');
        elem.addClass('evn-error-mode');
    }</p>
<p>    function processError(error) {
        renderErrorMessage(error);
        elem.show();
        return true;
    }</p>
<p>    function endProcessing() {
        elem.removeClass('processing');
        Evernote.ClearlyController.removeHighlighted();
        message.html(clipped_message + ' ' + _notebook);
    }</p>
<p>    function endProcessingAndClose() {
        elem.removeClass('processing').addClass('withoutShare');
        Evernote.ClearlyController.removeHighlighted();
        message.html(clipped_message + ' ' + _notebook);</p>
<p>        setTimeout(function(){
            hide();
        }, 1000);
    }</p>
<p>    function setProcessing() {
        elem.addClass('processing');
        message.html('<span class="evn-processing-status">' + clipping_message + '</span>' + _title);
    }</p>
<p>    function show() {
        setProcessing();
        addListeners();
        elem.show();
        elem.addClass('visible');
    }</p>
<p>    function hide() {
        removeListeners();
        elem.hide();
        elem.removeClass('visible');
        elem.removeClass('evn-error-mode');
        elem.removeClass('withoutShare');
        elem.removeClass('evn-clipboard-mode');
        clipboard_container.removeClass();
        cbMessage.text(Evernote.Addin.getLocalizedMessage(Evernote.Messages.SOURCE_LINK));
    }</p>
<p>    function onClickOutside(e) {
        if (Evernote.JQuery(e.target).closest('#' + Constants.POST_CLIP_DIALOG_ID).length == 0) {
            hide();
        }
    }</p>
<p>    function onKeyPressed(e) {
        if (e.keyCode == 27) {
            hide();
        }
    }</p>
<p>    function onDataReceived(response) {
        if (response.type == 'clipped') {
            finishPostClip();
        }
    }</p>
<p>    function addListeners() {
        Evernote.JQuery(document).on('click', onClickOutside);
        Evernote.JQuery(document).on('keydown',onKeyPressed);
    }</p>
<p>    function removeListeners() {
        Evernote.JQuery(document).off('click',onClickOutside);
        Evernote.JQuery(document).off('keydown',onKeyPressed);
    }</p>
<p>    closeButton.click(hide);
    shareIcons.click(handleShareIconClick);
    cbButton.click(copyToClipboard);</p>
<p>    errorLink.click(showLogs);</p>
<p>    elem.on('errorShown', hide);</p>
<p>    localize();
    modifyToCurrentIE();</p>
<p>    this.fillOutPopup = fillOutPopup;
    this.endProcessing = endProcessing;
    this.endProcessingAndClose = endProcessingAndClose;
    this.show = show;
    this.hide = hide;</p>
<p>    this.processError = processError;
    this.onDataReceived = onDataReceived;
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.Messages = {
    CLIP_SELECTION: 113,			// Save Selection
    CLIP_URL: 115,					// Save URL
    CLIP_FULL_PAGE: 116,			// Save Full Page
    CLIP_ARTICLE: 117,				// Save Article
    ENTER: 118,						// enter
    OPTIONS: 119,					// Options
    DEFAULT_ACTION: 120,			// Default action
    ARTICLE_SELECTION: 121,			// Article selection
    ENABLED: 122,					// Enabled
    DISABLED: 123,					// Disabled
    ENABLED_NO_HINTS: 124,			// Enabled (no hints)
    ARTICLE_SELECTION_HINT: 125,	// When enabled, you can modify article selection using your keyboard before make a clip. Enabling with "no hints" will prevent displaying the informational message. When disabled - you cannot make any adjustments to the automatic article selection.
    EXPAND_SELECTION: 126,			// expand selection
    SHRINK_SELECTION: 127,			// shrink selection
    MOVE_SELECTION: 128,			// move selection
    CLIP_ARTICLE_HINT: 129,			// clip article
    CLIPPING: 130,					// Clipping
    UNSUPPORTED_SCHEMA: 131,		// Clipping from this location is not supported.
    UNTITLED_NOTE: 132,				// Untitled note
    ADD_TAGS: 133,					// Add tags
    ADD_REMARK: 134,				// Add remark
    OWNED_BY: 135,					// owned by
    SHARED_NOTEBOOKS: 136,			// Shared Notebooks
    BUSINESS_NOTEBOOKS: 137,		// Business Notebooks
    LOADING_TAGS: 140,				// Loading tags...
    LOGIN_FAILED: 141,				// You need to be signed in to Evernote desktop to clip webpages
    CLOSE: 142,						// ﾐ厘ｰﾐｺﾑﾑ錦び・
    LOADING_NOTEBOOKS: 146,			// ﾐｷﾐｰﾐｳﾑﾑσｶﾐｰﾑ・ﾐｱﾐｻﾐｾﾐｺﾐｽﾐｾﾑび・..
    CLIP_FAILED_TITLE: 147,			// ﾐ斷ｵ ﾑσｴﾐｰﾐｻﾐｾﾑ・・ﾑ・ｾﾑ・ﾐｰﾐｽﾐｸﾑび・ﾐｷﾐｰﾐｼﾐｵﾑひｺﾑ・
    VERSION: 148,					// ﾐ漬ｵﾑﾑ・ｸﾑ・
    LIMIT_TAGS: 150,				// You've entered the maximum number of tags
    CLIP_HEADER: 151,				// Clip
    SKITCH_HEADER: 152,				// Annotate
    ORGANIZE_HEADER: 153,			// Organize
    SAVE_BUTTON: 154,				// Save
    CLIP_SCREEN_SHOT: 155,			// Screenshot
    NOTEBOOK_SEARCH: 156,			// Find a notebook
    SHARE_BUTTON: 157,				// Share
    ARTICLE: 158,					// Article
    SIMPLIFIED_ARTICLE: 159,		// Simplified Article
    SELECTION: 160,					// Selection
    URL: 161,						// Bookmark
    SCREENSHOT: 162,				// Screen Capture
    SOURCE_LINK: 163,				// Source link
    URL_COPIED: 164,				// Url copied to clipboard
    FULL_PAGE: 165,					// Full Page
    TAGS : 166,                     // Tag selection
    CLIP_ACTION : 167,              // Default clip action
    LOADING : 168,                  // Loading...
    ALWAYS_START_IN : 169,          // Always start in
    ALWAYS_ADD_TAGS : 170,          // Always tag with
    LAST_USED_ACTION : 171,         // Last Used Action
    COPYRIGHT : 172,                // Copyright 2009-2013 Evernote Corporation. All rights reserved.
    PRIVACY_POLICY : 173,           // Privacy Policy
    TERMS_OF_SERVICE : 174,         // Terms of Service
    EXPAND : 175,                   // Expand the article selection
    CONTRACT : 176,                 // Contract the article selection
    ADD_TAG : 177,                  // Add tag
    LIMIT_TAGS_SHORT : 178,         // Max 20 tags
    TAGS_NOT_SUPPORTED : 179,       // Tags not supported
    DONE : 180,                     // Done
    ARROW :181,                     // Shape tool
    COLOR :182,                     // Colors
    STAMP_REJECT :183,              // Stamp tool
    CROP :184,                      // Crop
    HIGHLIGHTER :185,               // HTML Highlighter
    MARKER :186,                    // Marker tool
    PIXELATE :187,                  // Pixelator tool
    TEXT :188,                      // Type tool
    ZOOM_IN :189,                   // Zoom In
    ZOOM_OUT :190,                  // Zoom Out
    ZOOM_RESET :191,                // Reset
    ZOOM_TIP :192,                  // Tip: Hold Ctrl while clicking to pan
    CROP_APPLY :193,                // Apply
    CROP_CANCEL :194,               // Cancel
    SCREENSHOT_CAPTURED :195,       // Screenshot captured
    SAVING : 196,                   // Saving...
    IMAGE_HIGHLIGHTER : 197,        // Image highlighter
    FORBIDDEN : 198,                // Not allowed for this action
    SETTINGS : 200,                 // Settings
    ONE_CLICK_CLIPPING: 201,        // 1-click Clipping
    ONE_CLICK_CLIPPING_DESC: 202,   // ~~~ Put description here ~~~
    NOTEBOOK_SELECTION: 203,        // Notebook Selection
    LAST_USED_NOTEBOOK: 204,        // Last used notebook
    SCREEN_CAPTURE_TOAST: 205,      // Single <b>click</b> to capture full screen
or <b>drag</b> a region and release
    CLIPPED: 206,                   // Clipped to
    TAKE_A_SCREENSHOT: 207,         // Take a Screenshot
    DEFAULT_NOTEBOOK: 208,          // default notebook
    ERROR_LOGS: 209,                // Error logs
    VIEW_LOGS: 210,                 // View Logs
    LOGS_DESCRIPTION: 211,          // If you contact Evernote Support, they may ask you to view these logs to help diagnose a problem
    COPY_TO_CLIPBOARD: 212,         // Copy to clipboard
    AFTER_CLIP: 213,                // After clip
    SHOW_POST_CLIP_DESC: 214,       // Show successful clip dialog
    CLOSE_POST_CLIP_DESC: 215,      // Automatically close clipper
    LEGAL: 216,                     // Legal
    LEGAL_HEADER: 217,              // Web Clipper uses the following open source software
    CLIP_ERROR: 218,                // Cannot save clip
    VIEW_REPORT: 219                // View Crash Report
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ResponseReceiver = {
    parsers : [],
    receivers : [],</p>
<p>    onResponse: function(str) {
        Evernote.Logger.debug("Response received" + str);
        for(var i = 0; i < Evernote.ResponseReceiver.parsers.length; i++) {
            if(Evernote.ResponseReceiver.parsers[i].canParse &#038;&#038; Evernote.ResponseReceiver.parsers[i].canParse(str)) {
                Evernote.ResponseReceiver.notify(Evernote.ResponseReceiver.parsers[i].parse(str));
            }
        }
    },</p>
<p>    registerParser: function(parser) {
        Evernote.ResponseReceiver.parsers.push(parser);
    },</p>
<p>    subscribe: function(receiver) {
        Evernote.ResponseReceiver.receivers.push(receiver);
    },</p>
<p>    notify: function(data) {
        for(var i=0; i < Evernote.ResponseReceiver.receivers.length; i++) {
            Evernote.ResponseReceiver.receivers[i].onDataReceived(data);
        }
    }
};</p>
<p>function EvernoteGlobalReceiver(str) {
    Evernote.ResponseReceiver.onResponse(str);
}
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ProcessIDResponseParser = {
    parse : function(str) {
        Evernote.Logger.debug("ProcessIDResponseParser: response" + str);
        var xmlDom = Evernote.JQuery(str);
        var result = xmlDom.attr("process_id");
        return new Evernote.Response("process_id", result);
    },</p>
<p>    canParse: function(str) {
        var request = Evernote.JQuery(str).attr("request");
        return request &#038;&#038; (request == "get_process_id");
    }
};</p>
<p>Evernote.ResponseReceiver.registerParser(Evernote.ProcessIDResponseParser);
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.NotebookResponseParser = {
    parse : function(str) {
        str = Evernote.GlobalUtils.decodeXML(str);
        var xmlDom = Evernote.JQuery(str);
        var result = [];
        var type = xmlDom.attr("type");
        if(xmlDom.length == 1) {
            var notebooks = xmlDom.find("notebook");
            for(var i = 0; i < notebooks.length; i++) {
                var notebook = Evernote.JQuery(notebooks[i]);
                var notebookObj = Evernote.NotebookResponseParser.createNotebook(type,notebook);
                if(notebookObj) {
                    result.push(notebookObj);
                }
            }
        }
        else if(xmlDom.length > 1) {
            for(var i = 1; i < xmlDom.length - 1; i += 2) {
                var notebook = Evernote.JQuery(xmlDom[i]);
                var notebookObj = Evernote.NotebookResponseParser.createNotebook(type, notebook);
                if(notebookObj) {
                    result.push(notebookObj);
                }
            }
        }
        return new Evernote.Response("notebooks", result);
    },</p>
<p>    createNotebook : function(type, notebook) {
        var notebookType;
        var notebookTypeText;
        switch (type) {
            case "personal":
                notebookType = Evernote.NotebookTypes.PERSONAL;
                notebookTypeText = Evernote.NotebookTypes.PERSONAL_TEXT;
                break;
            case "business":
                notebookType = Evernote.NotebookTypes.BUSINESS;
                notebookTypeText = Evernote.NotebookTypes.BUSINESS_TEXT;
                break;
            case "linked":
                notebookType = Evernote.NotebookTypes.LINKED;
                notebookTypeText = Evernote.NotebookTypes.LINKED_TEXT;
                break;
        }
        var hidden = false;
        var writableAttrValue = notebook.attr("writable");</p>
<p>        if (notebookType == Evernote.NotebookTypes.BUSINESS) {
            return null
        }</p>
<p>        if(notebookType == Evernote.NotebookTypes.LINKED) {
            var business = notebook.attr("business");</p>
<p>            if(business &#038;&#038; ((business | 0) == 1)) {
                notebookType = Evernote.NotebookTypes.BUSINESS;
                notebookTypeText = Evernote.NotebookTypes.BUSINESS_TEXT;
            }
        }</p>
<p>        if(notebookType == Evernote.NotebookTypes.LINKED || notebookType == Evernote.NotebookTypes.BUSINESS) {
            if(!writableAttrValue || (writableAttrValue | 0) != 1) {
                if(notebookType == Evernote.NotebookTypes.LINKED)
                    return null;
                else {
                    hidden = true;
                }
            }
        }</p>
<p>        var owner = notebook.attr("owner");
        if (owner &#038;&#038; owner == Evernote.evernotePopup._user)
            owner = undefined;</p>
<p>        return new Evernote.Notebook(
            notebookType,
            notebook.attr("name"),
            notebook.attr("uid"),
            notebook.attr("stack"),
            owner,
            hidden,
            notebookTypeText
        );
    },</p>
<p>    canParse: function(str) {
        var request = Evernote.JQuery(str).attr("request");
        return (request &#038;&#038; (request == "get_notebooks"));
    }
};</p>
<p>Evernote.ResponseReceiver.registerParser(Evernote.NotebookResponseParser);
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.AddNoteResponseParser = {
    parse : function(str) {
        Evernote.Logger.debug("AddNoteResponseParser: response" + str);
        var xmlDom = Evernote.JQuery(str);
        var result = xmlDom.attr("notebook_name");
        return new Evernote.Response("clipped", result);
    },</p>
<p>    canParse: function(str) {
        var request = Evernote.JQuery(str).attr("request");
        return request &#038;&#038; (request == "add_note");
    }
};</p>
<p>Evernote.ResponseReceiver.registerParser(Evernote.AddNoteResponseParser);
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ErrorResponseParser = {</p>
<p>    parse : function(str) {
        Evernote.Logger.warn("Received error " + str);
        var error = Evernote.JQuery(str);
        var errorCode = error.attr("code");
        var errorMessage = null;
        var problem = null;
        if(error.length == 1) {
            var problems = error.find("problem");
            if(problems &#038;&#038; problems.length > 0) {
                problem = Evernote.JQuery(problems[0]);
            }
        }
        else if(error.length > 2) {
            errorMessage = error[2].toString();
        }
        if(problem) {
            errorMessage = problem.text();
        } else if(!errorMessage) {
            errorMessage = error.attr("details");
        }
        switch (errorCode) {
            case Evernote.ErrorCodes.AUTHENTICATION_ERROR :
                errorMessage = Evernote.Addin.getLocalizedMessage(Evernote.Messages.LOGIN_FAILED);
                break;
            case Evernote.ErrorCodes.CLIP_ERROR :
                errorMessage = Evernote.Addin.getLocalizedMessage(Evernote.Messages.CLIP_FAILED_TITLE) + "\n" + errorMessage;
        }
        var msg = {
            message: errorMessage,
            code: errorCode
        };</p>
<p>        return new Evernote.Response("error", msg);
    },</p>
<p>    canParse: function(str) {
        var request = Evernote.JQuery(str).get(0);
        return (request &#038;&#038; (request.nodeName == "ERROR"));
    }
};</p>
<p>Evernote.ResponseReceiver.registerParser(Evernote.ErrorResponseParser);
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ErrorHandler = {</p>
<p>    getHandler: function() {
        return [Evernote.Addin, Evernote.evernotePopup, Evernote.evernotePostClipPopup, Evernote.AlertErrorHandler];
    },</p>
<p>    onDataReceived : function(response) {
        if(response.type) {
            if(response.type == "error") {
                this.notifyHandlers(response.data);</p>
<p>            }
        }
    },</p>
<p>    notifyHandlers : function(error) {
        for(var i = 0; i < this.getHandler().length; i++) {
            var handler = this.getHandler()[i];
            if(handler &#038;&#038; handler.processError &#038;&#038; handler.processError(error)) {
                return;
            }
        }
    }
};</p>
<p>Evernote.ResponseReceiver.subscribe(Evernote.ErrorHandler);
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.Response = function(type, data) {
    this.type = type;
    this.data = data;
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.FS = {
    _addon : null,</p>
<p>    init : function(addon) {
        this._addon = addon;
    },</p>
<p>    /**
     * Write content to the specified path.
     * @param content - content, that should be written to
     */
    writeOptionsToFile : function(content) {
        if (!this._addon)
            return;
        try {
            this._addon.WriteOptionsContent(content );
        } catch (e) {
            Evernote.Logger.error( "FS.writeOptionsToFile() failed " + e );
        }
    },</p>
<p>    /**
     * Read content of the file specified by path.
     * @return {string} - content of the file
     */
    getOptionsFileContent : function() {
        if (!this._addon)
            return null;
        try {
            return this._addon.ReadOptionsContent();
        } catch (e) {
            Evernote.Logger.error( "FS.getOptionsFileContent() failed " + e );
        }
        return null;
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
//"use strict";</p>
<p>Evernote.AbstractElementSerializer = function AbstractElementSerializer( node, nodeStyle ) {
    this.initialize( node, nodeStyle );
};</p>
<p>Evernote.AbstractElementSerializer.isResponsibleFor = function( /*navigator*/ ) {
    return false;
};</p>
<p>Evernote.AbstractElementSerializer.prototype._node = null;
Evernote.AbstractElementSerializer.prototype._nodeStyle = null;</p>
<p>Evernote.AbstractElementSerializer.prototype.handleInheritance = function( child/*, parent */) {
    Evernote.ElementSerializerFactory.ClassRegistry.push( child );
};</p>
<p>Evernote.AbstractElementSerializer.prototype.initialize = function( node, nodeStyle ) {
    this._node = node;
    this._nodeStyle = nodeStyle;
};</p>
<p>Evernote.AbstractElementSerializer.prototype.serialize = function( /*docBase*/ ) {
    return "";
};</p>
<p>Evernote.AbstractElementSerializer.prototype.getImageUrl = function() {
    return "";
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
//"use strict";</p>
<p>Evernote.ElementSerializerFactory = {
    getImplementationFor : function( node ) {
        for ( var i = 0; i < this.ClassRegistry.length; ++i ) {
            if ( this.ClassRegistry[ i ].isResponsibleFor( node ) ) {
                return this.ClassRegistry[ i ];
            }
        }</p>
<p>        return null;
    }
};</p>
<p>Evernote.ElementSerializerFactory.ClassRegistry = [ ];
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
//"use strict";</p>
<p>Evernote.ClipStylingStrategy = function ClipStylingStrategy( ) {
    this.initialize( );
};</p>
<p>Evernote.ClipStylingStrategy.prototype.initialize = function( ) {</p>
<p>};</p>
<p>Evernote.ClipStylingStrategy.prototype.styleForNode = function(  /*node, root, fullPage, clipStyleType*/ ) {
    return null;
};</p>
<p>Evernote.ClipStylingStrategy.prototype.getNodeView = function ( node ) {
    var doc = node.ownerDocument;
    return (doc.defaultView) ? doc.defaultView : null;
};</p>
<p>Evernote.ClipStylingStrategy.prototype.getNodeStyle = function( node, filterFn, pseudo ) {
    Evernote.Logger.debug( "ClipStylingStrategy.getNodeStyle()" );</p>
<p>    var style = new Evernote.ClipStyle();
    if ( pseudo != "" ) {
        return style;
    }</p>
<p>    if ( node &#038;&#038; typeof node.nodeType == 'number' &#038;&#038; node.nodeType == 1 ) {
        var view = this.getNodeView( node );
        style = new Evernote.ClipStyle( Evernote.ElementExtension.getComputedStyle( node, null, view ), filterFn );
    }</p>
<p>    return style;
};</p>
<p>Evernote.ClipStyleType = {
    NodeStyle : 0x01,
    InheritedFontStyle: 0x02,
    InheritedBgStyle: 0x04,
    AllStyle : 0x01 | 0x02 | 0x04,
    Default : 0x01 | 0x02
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ClipFullStylingStrategy = function ClipFullStylingStrategy( ) {
    this.initialize( );
};</p>
<p>Evernote.inherit( Evernote.ClipFullStylingStrategy, Evernote.ClipStylingStrategy, true );</p>
<p>Evernote.ClipFullStylingStrategy.prototype.styleForNode = function ( node, root, fullPage, clipStyleType ) {
    Evernote.Logger.debug( "ClipStylingStrategy.styleForNode()" );</p>
<p>    if ( clipStyleType == null ) {
        clipStyleType = Evernote.ClipStyleType.Default;
    }</p>
<p>    var bodyStyles = new Evernote.ClipStyle( [ ], function ( prop, value ) {
        return value != ""
    } );
    var inhFontStyles = new Evernote.ClipStyle( [ ] );
    var inhBgStyles = [ ];</p>
<p>    if ( (clipStyleType &#038; Evernote.ClipStyleType.NodeStyle) == Evernote.ClipStyleType.NodeStyle ) {
        Evernote.Logger.debug( "ClipStylingStrategy.styleForNode(): get node style" );
        try {
            if ( node.nodeName.toLowerCase() == "body" ) {
                for ( var attrName in Evernote.ClipStyle.STYLE_ATTRIBUTES ) {
                    if ( Evernote.ElementExtension.hasAttribute(node, attrName) ) {
                        var cssPropName = Evernote.ClipStyle.STYLE_ATTRIBUTES[ attrName ];
                        var style = { };
                        style[ cssPropName ] = node.getAttribute( attrName );
                        bodyStyles.addStyle( style );
                    }
                }
            }
        } catch(e) {
            Evernote.Logger.error("ClipFullStylingStrategy.styleForNode failed to get attributes from body due to error " + e);
        }
        var evaluatedStyles = this.getNodeStyle( node );
        if ( node.nodeName.toLowerCase() == "table" &#038;&#038; !evaluatedStyles.getStyle( "font-size" ) ) {
            evaluatedStyles.addStyle( {"font-size":"1em"} );
        }</p>
<p>        if ( node.nodeName.toLowerCase() == "img" ) {
            style = new Evernote.ClipStyle( Evernote.ElementExtension.getComputedStyle( node, null, this.getNodeView( node ) ), function ( prop, value ) {
                return value != ""
            } );
            evaluatedStyles.addStyle( { height:style.getStyle( "height" ) } );
            evaluatedStyles.addStyle( { width:style.getStyle( "width" ) } );
        }</p>
<p>        if ( evaluatedStyles.getStyle( "background-image" ) ) {
            var regExp = /url\((.*?)\)/;
            evaluatedStyles.addStyle( { "background-image": Evernote.StyleElementExtension.getPropertyValue(Evernote.ElementExtension.getComputedStyle( node, null, this.getNodeView( node ) ),  Evernote.IEStylePropertiesMapping.getPropertyNameFor("background-image") ).replace( regExp, "url('$1')").replace(/('")|("')|('')/g, "'")} );
        }</p>
<p>        if ( evaluatedStyles.getStyle( "height" ) == "100%" &#038;&#038; Evernote.StyleElementExtension.getPropertyValue(Evernote.ElementExtension.getComputedStyle( node, null, this.getNodeView( node ) ), "height" ) == "0px" ) {
            evaluatedStyles.addStyle( { height:"0px" } );
        }
        bodyStyles.mergeStyle( evaluatedStyles, true );
    }</p>
<p>    if ( node == root &#038;&#038; !fullPage ) {
        if ( (clipStyleType &#038; Evernote.ClipStyleType.InheritedFontStyle) == Evernote.ClipStyleType.InheritedFontStyle ) {
            Evernote.Logger.debug( "ClipStylingStrategy.styleForNode(): get inherited font style" );
            inhFontStyles = this.inheritFontForNode( node, true );
            Evernote.Logger.debug( "ClipStylingStrategy.styleForNode(): inherited fonts " );
        }</p>
<p>        if ( (clipStyleType &#038; Evernote.ClipStyleType.InheritedBgStyle) == Evernote.ClipStyleType.InheritedBgStyle ) {
            Evernote.Logger.debug( "ClipStylingStrategy.styleForNode(): get inherited bg style" );
            inhBgStyles = this.inheritBackgroundForNode( node, true );
        }
    }</p>
<p>    bodyStyles.mergeStyle( inhFontStyles, true );
    return {
        nodeStyle:bodyStyles,
        inheritedFonts:inhFontStyles,
        inheritedBackground:inhBgStyles,
        evaluated:bodyStyles
    };
};</p>
<p>Evernote.ClipFullStylingStrategy.prototype.getNodeStyle = function ( node, filterFn, pseudo ) {
    Evernote.Logger.debug( "ClipStylingStrategy.getNodeStyle()" );</p>
<p>    if ( pseudo == null || typeof pseudo == "undefined" ) {
        pseudo = "";
    }
    var style = new Evernote.ClipStyle([ ], filterFn);
    Evernote.Logger.debug( "Pseudo : " + pseudo );
    if ( pseudo == "" &#038;&#038; node &#038;&#038; typeof node.nodeType == 'number' &#038;&#038; node.nodeType == 1 ) {
        var view = this.getNodeView( node );
        style = new Evernote.ClipStyle( Evernote.ElementExtension.getComputedStyle( node, null, view ), filterFn );
    }
    return style;
};</p>
<p>Evernote.ClipFullStylingStrategy.prototype.inheritFontForNode = function ( node, recur ) {
    Evernote.Logger.debug( "ClipFullStylingStrategy.inheritFontForNode()" );</p>
<p>    var fontStyle = new Evernote.ClipStyle();
    if ( !node ) {
        return fontStyle;
    }</p>
<p>    var parent = node;
    var styles = [ ];
    var nodes = [ ];</p>
<p>    var dynamicUnit = ["%", "em"];
    var sizeUnitRegExp = /(.*?)(em|%|px|pt)/;</p>
<p>    while ( parent ) {
        nodes.push( parent );
        styles.push( new Evernote.ClipStyle( this.getNodeStyle( parent ), function ( prop, value ) {
            return (Evernote.ArrayExtension.indexOf(Evernote.ClipStyle.INHERITED_STYLES,  prop ) > 0 &#038;&#038; value != "inherit" );
        } ) );</p>
<p>        Evernote.Logger.debug( "Inh parent style:" + styles[styles.length - 1].toString() );</p>
<p>        if ( !recur || parent == document.body ) {
            break;
        }
        else {
            parent = parent.parentElement;
        }
    }</p>
<p>    //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 &#038;&#038; overFontStyle ) {
            var resFontSize = fontSize.match( sizeUnitRegExp );
            if ( resFontSize == null ) {
                continue;
            }
            var sizeVal = resFontSize[1];
            var sizeUnit = resFontSize[2];
            var resOverFontSize = overFontStyle.match( sizeUnitRegExp );</p>
<p>            if ( resOverFontSize == null ) {
                continue;
            }
            var overSizeVal = resOverFontSize[1];
            var overSizeUnit = resOverFontSize[2];</p>
<p>            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() );
        }</p>
<p>        fontStyle.mergeStyle( style, true );
    }</p>
<p>    return fontStyle;
};</p>
<p>Evernote.ClipFullStylingStrategy.prototype.inheritBackgroundForNode = function ( node, recur ) {
    Evernote.Logger.debug( "ClipFullStylingStrategy.inheritBackgroundForNode()" );</p>
<p>    var bgStyle = new Evernote.ClipStyle();
    if ( !node ) {
        return bgStyle;
    }</p>
<p>    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" &#038;&#038; (value == "no-repeat" || value == "repeat-y"));
            };
            var nodeStyle = new Evernote.ClipStyle( this.getNodeStyle( parent ), filterFn, Evernote.ClipStyle.CSS_GROUP.getExtForStyle( "background" ) );</p>
<p>            if ( !nodeStyle.getStyle( "background-repeat" ) ) {
                nodeStyle.removeStyle( "background-image" );
            }
            if ( !nodeStyle.getStyle( "background-color" ) &#038;&#038; parent.getAttribute( "bgcolor" ) ) {
                Evernote.Logger.debug( "Set bgcolor attribute: " + parent.getAttribute( "bgcolor" ) );
                nodeStyle.addStyle( {"background-color":parent.getAttribute( "bgcolor" )} );
            }</p>
<p>            nodeStyle = this.evalBgPosition( node, parent, nodeStyle );
            if ( nodeStyle.getStylesNames().length > 0 ) {
                styles.push( nodeStyle );
                Evernote.Logger.debug( "Add inh bg style " + nodeStyle.toString() );
            }</p>
<p>            if ( !recur || parent == topElement ) {
                break;
            }
            else {
                parent = parent.parentNode;
            }
        }
    } catch(e) {
        Evernote.Logger.error("ClipFullStylingStrategy.prototype.inheritBackgroundForNode failed to error " + e);
    }</p>
<p>    return styles;
};</p>
<p>Evernote.ClipFullStylingStrategy.prototype.evalBgPosition = function ( node, inhNode, nodeBgStyle ) {
    Evernote.Logger.debug( "Dettermining background image offset" );</p>
<p>    var strPosToPercent = {
        "center":"50%",
        "top":"0%",
        "bottom":"100%",
        "right":"100%",
        "left":"0%"
    };</p>
<p>    var regExp = /url\((.*?)\)/;
    var bgImage = nodeBgStyle.getStyle( "background-image" );
    if ( !regExp.test( nodeBgStyle.getStyle( "background-image" ) ) || (bgImage &#038;&#038; nodeBgStyle.getStyle( "background-image" ).indexOf( "data:image" ) >= 0) ) {
        Evernote.Logger.debug( "bgStyle: " + nodeBgStyle.toString() );
        return nodeBgStyle;
    }</p>
<p>    nodeBgStyle.addStyle( { "background-image": Evernote.StyleElementExtension.getPropertyValue(Evernote.ElementExtension.getComputedStyle( inhNode, null, this.getNodeView( inhNode ) ), Evernote.IEStylePropertiesMapping.getPropertyNameFor("background-image") ).replace( regExp, "url('$1')" ) } );</p>
<p>    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;</p>
<p>    var bgNodeBgPosX = 0;
    var bgNodeBgPosY = 0;
    var origPosX = 0;
    var origPosY = 0;</p>
<p>    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 ];</p>
<p>        if ( bgNodeBgPosX &#038;&#038; bgNodeBgPosX.indexOf( "%" ) > 0 ) {
            origPosX = parseInt( bgNodeRect.width ) * (parseInt( bgNodeBgPosX ) / 100);
            origPosX -= parseInt(actualImage.width) * (parseInt(bgNodeBgPosX) / 100);
        }
        else {
            origPosX = parseInt( bgNodeBgPosX );
        }</p>
<p>        if ( bgNodeBgPosY &#038;&#038; bgNodeBgPosY.indexOf( "%" ) > 0 ) {
            origPosY = parseInt( bgNodeRect.height ) * (parseInt( bgNodeBgPosY ) / 100);
            origPosY -= parseInt(actualImage.height) * (parseInt(bgNodeBgPosY) / 100);
        }
        else {
            origPosY = parseInt( bgNodeBgPosY );
        }
    }</p>
<p>    if ( isNaN( origPosX ) ) {
        origPosX = 0;
    }
    if ( isNaN( origPosY ) ) {
        origPosY = 0;
    }</p>
<p>    var xOffset = 0 - xDelta + origPosX;
    var yOffset = 0 - yDelta + origPosY;</p>
<p>    nodeBgStyle.addStyle( { "background-position":(xOffset + "px " + yOffset + "px") } );
    Evernote.Logger.debug( "bgStyle: " + nodeBgStyle.toString() );
    return nodeBgStyle;
};</p>
<p>Evernote.ClipFullStylingStrategy.prototype.getOffsetRect = function ( elem ) {
    Evernote.Logger.debug( "ClipCSSStyleWalker.getOffsetRect()" );</p>
<p>    var box = Evernote.ElementExtension.getBoundingClientRect(elem);
    var body = elem.ownerDocument.body;
    var docElem = elem.ownerDocument.documentElement;</p>
<p>    var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;
    var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;</p>
<p>    var clientTop = docElem.clientTop || body.clientTop || 0;
    var clientLeft = docElem.clientLeft || body.clientLeft || 0;</p>
<p>    var top = box.top + scrollTop - clientTop;
    var left = box.left + scrollLeft - clientLeft;</p>
<p>    return { top:Math.round( top ), left:Math.round( left ), width:box.width, height:box.height };
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
//"use strict";</p>
<p>Evernote.ClipRules = {
    isNoKeepNodeAttr : function( attribute, nodeName, node ) {
        if ( !attribute ) {
            return true;
        }</p>
<p>        var attrName = attribute.name.toLowerCase();
        var attrValue = attribute.value.toLowerCase();
        if((node.nodeName.toUpperCase() == "SPAN" || node.nodeName.toUpperCase() == "A") &#038;&#038; node.getElementsByTagName( "IMG" ).length > 0) {
            nodeName = "div";
        }
        var attributesToKeepForNode = this.KEEP_NODE_ATTRIBUTES[nodeName];
        if(attributesToKeepForNode) {
            var keepAttributeForNode = typeof attributesToKeepForNode[attrName] != 'undefined';
        }
        return typeof this.NOKEEP_NODE_ATTRIBUTES[ attrName ] != 'undefined'
            || !keepAttributeForNode
            || attrName.substring( 0, 2 ) == "on"
            || attrName.indexOf("xml") == 0
            || attrValue.indexOf("function(") >= 0
            || (attrName == "href" &#038;&#038; attrValue.substring( 0, 11 ) == "javascript:");
    },</p>
<p>    isConditionalNode : function( node ) {
        return node &#038;&#038; typeof this.CONDITIONAL_NODES[ node.nodeName.toUpperCase() ] != 'undefined';
    },</p>
<p>    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();
    },</p>
<p>    isSupportedNode : function( node ) {
        return node &#038;&#038; typeof this.SUPPORTED_NODES[ node.nodeName.toUpperCase() ] != 'undefined';
    },</p>
<p>    isRejectedNode : function( node ) {
        return node &#038;&#038; typeof this.REJECTED_NODES[ node.nodeName.toUpperCase() ] != 'undefined';
    },</p>
<p>    isNonAncestorNode : function( node ) {
        return node &#038;&#038; typeof this.NON_ANCESTOR_NODES[ node.nodeName.toUpperCase() ] != 'undefined';
    },</p>
<p>    isSelfClosingNode : function( node ) {
        return node &#038;&#038; typeof this.SELF_CLOSING_NODES[ node.nodeName.toUpperCase() ] != 'undefined';
    }
};</p>
<p>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
    },</p>
<p>    "abbr" : {
        "title": null,
        "dir" : null
    },</p>
<p>    "acronym" : {
        "title": null,
        "dir" : null
    },</p>
<p>    "address" : {
        "title": null,
        "dir" : null
    },</p>
<p>    "area" : {
        "title": null,
        "dir" : null,
        "accesskey": null,
        "shape": null,
        "coords": null,
        "href": null,
        "nohref": null,
        "alt": null,
        "target": null
    },</p>
<p>    "b" : {
        "title": null,
        "dir" : null
    },</p>
<p>    "bdo" : {
        "title": null,
        "dir" : null
    },</p>
<p>    "big" : {
        "title": null,
        "dir" : null
    },</p>
<p>    "blockquote" : {
        "title": null,
        "dir" : null,
        "cite": null
    },</p>
<p>    "br" : {
        "title": null,
        "clear": null
    },</p>
<p>    "caption" : {
        "title": null,
        "dir" : null,
        "align": null
    },</p>
<p>    "center" : {
        "title": null,
        "dir" : null
    },</p>
<p>    "cite" : {
        "title": null,
        "dir" : null
    },</p>
<p>    "code" : {
        "title": null,
        "dir" : null
    },</p>
<p>    "col" : {
        "title": null,
        "dir" : null,
        "span" : null,
        "width" : null,
        "align" : null,
        "char" : null,
        "charoff" : null,
        "valign" : null
    },</p>
<p>    "colgroup" : {
        "title": null,
        "dir" : null,
        "span" : null,
        "width" : null,
        "align" : null,
        "char" : null,
        "charoff" : null,
        "valign" : null
    },</p>
<p>    "dd" : {
        "title": null,
        "dir" : null
    },</p>
<p>    "del" : {
        "title": null,
        "dir" : null,
        "cite" : null,
        "datetime" : null
    },</p>
<p>    "dfn" : {
        "title": null,
        "dir" : null
    },</p>
<p>    "div" : {
        "title": null,
        "dir" : null,
        "align" : null
    },</p>
<p>    "dl": {
        "title": null,
        "dir" : null,
        "compact" : null
    },</p>
<p>    "dt": {
        "title": null,
        "dir" : null
    },</p>
<p>    "em": {
        "title": null,
        "dir" : null
    },</p>
<p>    "font": {
        "title": null,
        "dir" : null,
        "size" : null,
        "color" : null,
        "face" : null
    },</p>
<p>    "h1": {
        "title": null,
        "dir" : null,
        "align" : null
    },</p>
<p>    "h2": {
        "title": null,
        "dir" : null,
        "align" : null
    },</p>
<p>    "h3": {
        "title": null,
        "dir" : null,
        "align" : null
    },</p>
<p>    "h4": {
        "title": null,
        "dir" : null,
        "align" : null
    },</p>
<p>    "h5": {
        "title": null,
        "dir" : null,
        "align" : null
    },</p>
<p>    "h6": {
        "title": null,
        "dir" : null,
        "align" : null
    },</p>
<p>    "hr": {
        "title": null,
        "dir" : null,
        "align" : null,
        "noshade" : null,
        "size" : null,
        "width" : null
    },</p>
<p>    "i": {
        "title": null,
        "dir" : null
    },</p>
<p>    "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
    },</p>
<p>    "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
    },</p>
<p>    "ins": {
        "title": null,
        "dir" : null,
        "cite" : null,
        "datetime" : null
    },</p>
<p>    "kbd": {
        "title": null,
        "dir" : null
    },</p>
<p>    "li": {
        "title": null,
        "dir" : null,
        "type" : null,
        "value" : null
    },</p>
<p>    "map": {
        "dir" : null,
        "title" : null,
        "name" : null
    },</p>
<p>    "ol": {
        "title" : null,
        "dir" : null,
        "type" : null,
        "compact" : null,
        "start" : null
    },</p>
<p>    "p": {
        "title" : null,
        "dir" : null,
        "align" : null
    },</p>
<p>    "pre": {
        "title" : null,
        "dir" : null,
        "width" : null
    },</p>
<p>    "s": {
        "title" : null,
        "dir" : null
    },</p>
<p>    "samp": {
        "title" : null,
        "dir" : null
    },</p>
<p>    "small": {
        "title" : null,
        "dir" : null
    },</p>
<p>    "span": {
        "title" : null,
        "dir" : null
    },</p>
<p>    "strike": {
        "title" : null,
        "dir" : null
    },</p>
<p>    "strong": {
        "title" : null,
        "dir" : null
    },</p>
<p>    "sub": {
        "title" : null,
        "dir" : null
    },</p>
<p>    "sup": {
        "title" : null,
        "dir" : null
    },</p>
<p>    "table": {
        "title" : null,
        "dir" : null,
        "summary" : null,
        "width" : null,
        "border" : null,
        "cellspacing" : null,
        "cellpadding" : null,
        "align" : null,
        "bgcolor" : null
    },</p>
<p>    "tbody": {
        "title" : null,
        "dir" : null,
        "align" : null,
        "char" : null,
        "charoff" : null,
        "valign" : null
    },</p>
<p>    "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
    },</p>
<p>    "tfoot": {
        "title" : null,
        "dir" : null,
        "align" : null,
        "char" : null,
        "charoff" : null,
        "valign" : null
    },</p>
<p>    "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
    },</p>
<p>    "thead": {
        "title" : null,
        "dir" : null,
        "align" : null,
        "char" : null,
        "charoff" : null,
        "valign" : null
    },</p>
<p>    "tr": {
        "title" : null,
        "dir" : null,
        "align" : null,
        "char" : null,
        "charoff" : null,
        "valign" : null,
        "bgcolor" : null
    },</p>
<p>    "tt": {
        "title" : null,
        "dir" : null
    },</p>
<p>    "u": {
        "title" : null,
        "dir" : null
    },</p>
<p>    "ul": {
        "title" : null,
        "dir" : null,
        "type" : null,
        "compact" : null
    },</p>
<p>    "var": {
        "title" : null,
        "dir" : null
    }
};</p>
<p>Evernote.ClipRules.NOKEEP_NODE_ATTRIBUTES = {
    "style" : null,
    "tabindex" : null
};</p>
<p>Evernote.ClipRules.CONDITIONAL_NODES = {
    "EMBED" : null,
    "OBJECT" : null,
    "IMG" : null,
    "VIDEO" : null
};</p>
<p>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"
};</p>
<p>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
};</p>
<p>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
};</p>
<p>Evernote.ClipRules.NON_ANCESTOR_NODES = {
    "OL" : null,
    "UL" : null,
    "LI" : null
};</p>
<p>Evernote.ClipRules.SELF_CLOSING_NODES = {
    "IMG" : null,
    //"INPUT" : null,
    "BR" : null
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![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 );
};</p>
<p>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"
];</p>
<p>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" ]
};</p>
<p>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" ]
};</p>
<p>Evernote.ClipStyle.CSS_GROUP.getExtForStyle = function ( name ) {
    var list = this[ name ];
    var extList = [ ];</p>
<p>    if ( list ) {
        for ( var i = 0; i < list.length; ++i ) {
            if ( list[ i ].indexOf( "+" ) >= 0 ) {
                var tmp = list[ i ];
                extList.push( tmp.replace( "+", "" ) );
            }
            else {
                extList.push( name + "-" + list[ i ] );
            }
        }
        return extList;
    }</p>
<p>    return null;
};</p>
<p>Evernote.ClipStyle.STYLE_ATTRIBUTES = {
    "bgcolor":"background-color",
    "text":"color"
};</p>
<p>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"
];</p>
<p>Evernote.ClipStyle.prototype._collection = null;
Evernote.ClipStyle.prototype._filterFn = null;
Evernote.ClipStyle.prototype._styleList = null;</p>
<p>Evernote.ClipStyle.prototype.initialize = function ( css, filterFn, styleList ) {
    Evernote.Logger.debug( "ClipStyle.initialize()" );</p>
<p>    this._collection = new Evernote.StylesCollection();
    Evernote.Logger.debug( "ClipStyle.initialize: collection initialized()" );
    this._filterFn = (typeof filterFn == "function") ? filterFn : null;
    this._styleList = (styleList != null) ? styleList : Evernote.ClipStyle.STYLES;
    if(css) {
        this.addStyle( css, this._styleList );
    }
    Evernote.Logger.debug( "ClipStyle.initialize() end ");
};</p>
<p>Evernote.ClipStyle.prototype.fixBackground = function ( prop, value ) {
    if(prop &#038;&#038; value) {
        if(prop.indexOf("background-image") != -1 &#038;&#038; value.indexOf("url") != -1) {
            Evernote.Logger.debug("Start replace");
            var regExp = /url\((.*?)\)/;
            var res = value.replace(regExp, "url('$1')").replace(/('")|("')|('')/g, "'");
            Evernote.Logger.debug("End replace");
            return Evernote.GlobalUtils.escapeXML(res);</p>
<p>        }
    }
    return value;
};</p>
<p>Evernote.ClipStyle.prototype.addStyle = function ( style, styleList ) {
    Evernote.Logger.debug( "ClipStyle.addStyle()" );
    if ( style.length > 0 ) {
        var list = (styleList != null) ? styleList : this._styleList;
        for ( var i = 0; i < list.length; ++i ) {
            var prop = list[ i ];
            var value = Evernote.StyleElementExtension.getPropertyValue(style, prop );
            var importantPriority = !!((style.getPropertyPriority(prop) == 'important'));
            value = this.fixBackground(prop, value);
            this.addSimpleStyle( prop, value, importantPriority );
        }
    }
    else if ( style instanceof Evernote.ClipStyle ) {
        list = (styleList != null) ? styleList : style.getStylesNames();
        for ( var i = 0; i < list.length; ++i ) {
            var prop = list[ i ];
            value = style.getStyle( prop );
            importantPriority = style.isImportant( prop );
            value = this.fixBackground(prop, value);
            this.addSimpleStyle( prop, value, importantPriority );
        }
    }
    else if ( typeof style == 'object' &#038;&#038; style != null ) {
        list = (styleList != null) ? styleList : style;
        for ( var prop in list ) {
            // In some cases, attempt to get currentStyle.outline ( or outlineWidth ) property in IE8 throws
            // 'unspecified error' and crash whole serilization process. So we wrap it into try {...} catch.</p>
<p>            try {
                if ( list.hasOwnProperty( prop ) ) {
                    var usedStyle = style[ prop ];
                    var pName = prop;
                    if(!usedStyle) {
                        usedStyle = style [list[prop]];
                        pName = list[prop];
                        if(!usedStyle) {
                            var propName = Evernote.IEStylePropertiesMapping.getPropertyNameFor(list[prop]);
                            if(propName) {
                                usedStyle = style[propName[1]];
                            }
                        }
                    }
                    usedStyle = this.fixBackground(pName, usedStyle);
                    this.addSimpleStyle( pName, usedStyle );
                }
            }  catch (err) {}
        }
    }
};</p>
<p>Evernote.ClipStyle.prototype.removeStyle = function ( style ) {
    Evernote.Logger.debug( "ClipStyle.removeStyle()" );
    if(style) {
        if ( window.CSSStyleDeclaration &#038;&#038; 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")
};</p>
<p>Evernote.ClipStyle.prototype.mergeStyle = function ( style, override ) {
    Evernote.Logger.debug( "ClipStyle.mergeStyle()" );</p>
<p>    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 ) &#038;&#038; !this._collection.isImportant( styleName )) ) {
                var newValue = style.getStyle( styleName );
                if ( style.isImportant( styleName ) ) {
                    this._collection.addStyle( styleName, newValue, true );
                }
                else if ( override &#038;&#038; !this._collection.isImportant( styleName ) ) {
                    this._collection.addStyle( styleName, newValue, false );
                }
                else if ( styleValue == null &#038;&#038; !override ) {
                    this._collection.addStyle( styleName, newValue, style.isImportant( styleName ) );
                }
            }
        }
    }
};</p>
<p>Evernote.ClipStyle.prototype.getStylesNames = function () {
    return this._collection.getStylesNames();
};</p>
<p>Evernote.ClipStyle.prototype.getStyle = function ( prop ) {
    return this._collection.getStyle( prop );
};</p>
<p>Evernote.ClipStyle.prototype.isImportant = function ( prop ) {
    return this._collection.isImportant( prop );
};</p>
<p>Evernote.ClipStyle.prototype.addSimpleStyle = function ( prop, value, importantPriority ) {
    if ( typeof this._filterFn == "function" &#038;&#038; !this._filterFn( prop, value ) ) {
        return;
    }
    var impl = Evernote.StylesReplacementRegistry.getImplementationFor(prop);
    if(impl &#038;&#038; impl.getValue) {
        value = impl.getValue(value);
    }
    this._collection.addStyle( prop, value, importantPriority );
};</p>
<p>Evernote.ClipStyle.prototype.removeSimpleStyle = function ( prop ) {
    this._collection.removeStyle( prop );
};</p>
<p>Evernote.ClipStyle.prototype.toString = function () {
    var str = "";
    var stylesNames = this.getStylesNames();
    for ( var i = 0; i < stylesNames.length; ++i ) {
        var styleName = stylesNames[ i ];
        var value = this._collection.getStyle( styleName );
        if ( value != null &#038;&#038; value.length > 0 ) {
            str += styleName + ":" + value + ";";
        }
    }</p>
<p>    return str;
};</p>
<p>Evernote.ClipStyle.CSSDefaultStyle = {
    "background-attachment": "scroll",
    "background-color" : "transparent",
    "background-image" : "none",
    "background-position-x" : "0px",
    "background-position-y" : "0px",
    "background-repeat" : "repeat",
    "border-bottom-style" : "none",
    "border-bottom-width" : "medium",
    "border-left-style" : "none",
    "border-left-width" : "medium",
    "border-right-style" : "none",
    "border-right-width" : "medium",
    "border-top-style" : "none",
    "border-top-width" : "medium",
    "border-collapse" : "separate",
    "bottom" : "auto",
    "clear" : "none",
    "height" : "auto",
    "left" : "auto",
    "margin-bottom" : "0px",
    "margin-left" : "0px",
    "margin-right" : "0px",
    "margin-top" : "0px",
    "max-height" : "none",
    "max-width" : "none",
    "min-height" : "0px",
    "min-width" : "0px",
    "overflow" : "visible",
    "overflow-x" : "visible",
    "overflow-y" : "visible",
    "padding" : "0px",
    "padding-bottom" : "0px",
    "padding-left" : "0px",
    "padding-right" : "0px",
    "padding-top" : "0px",
    "page-break-before" : "auto",
    "page-break-after" : "auto",
    "position" : "static",
    "right" : "auto",
    "text-align" : "left",
    "text-decoration" : "none",
    "text-indent" : "0px",
    "text-overflow" : "clip",
    "top" : "auto",
    "width" : "auto"
};</p>
<p>Evernote.ClipStyle.prototype.removeDefaultCssStyle = function () {
    var stylesNames = this.getStylesNames();
    for ( var i = 0; i < stylesNames.length; ++i ) {
        var styleName = stylesNames[ i ];
        var defaultCssValue = Evernote.ClipStyle.CSSDefaultStyle[styleName];
        var value = this.getStyle( styleName );
        if (!value)
            continue;
        if (defaultCssValue == value) {
            this.removeStyle(styleName);
        }
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ClipStyleProperty = function ClipStyleProperty( name, value, isImportant ) {
    this.initialize( name, value, isImportant );
};</p>
<p>Evernote.ClipStyleProperty.prototype.initialize = function( name, value, isImportant ) {
    if ( typeof name == "string" &#038;&#038; typeof value == "string" ) {
        this._name = name;
        this._value = value;
    }</p>
<p>    this._isImportant = (isImportant) ? true : false;
};</p>
<p>Evernote.ClipStyleProperty.prototype._name = null;
Evernote.ClipStyleProperty.prototype._value = null;
Evernote.ClipStyleProperty.prototype._isImportant = null;</p>
<p>Evernote.ClipStyleProperty.prototype.name = function() {
    return this._name;
};</p>
<p>Evernote.ClipStyleProperty.prototype.value = function() {
    return this._value;
};</p>
<p>Evernote.ClipStyleProperty.prototype.isImportant = function() {
    return this._isImportant;
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
/**
 * Represents DOM parser that could able to traverse the DOM node tree from specified root.
 * @param tab - current window object
 * @param range - current selection on the page (if any)
 * @constructor
 */
Evernote.DomParser = function DomParser( tab, range ) {
    this.initialize( tab, range );
};</p>
<p>Evernote.DomParser.prototype._tab = null;</p>
<p>/**
 * Update current parser data
 * @param tab - current window object
 * @param range - current selection on the page (if any)
 */
Evernote.DomParser.prototype.initialize = function ( tab, range ) {
    Evernote.Logger.debug( "DomSerializer.initialize()" );</p>
<p>    this._tab = tab;
    this._range = range;
};</p>
<p>/**
 * Determines if passed node should be serialized.
 * Node should not be initialized if one of the following is true:
 *  - node is rejected according to configuration
 *  - there is the selection on the page and this node is out of selection range.
 * @param node - DOM node
 * @return {Boolean}
 */
Evernote.DomParser.prototype.isNodeForSerialize = function ( node ) {
    if ( !node || Evernote.ClipRules.isRejectedNode( node ) || node.id == "evernoteContentClipperWait" ) {
        return false;
    }
    if(Evernote.ClipperElementsIdentifiers.match(node)) {
        Evernote.Logger.debug("Node is rejected because it is clipper information " + node.id);
        return false;
    }
    return (!this._range || this.isNodeInRange( node )) ? true : false;
};</p>
<p>/**
 * Determines whether passed node is inside the selection range. Returns true if it is, false otherwise.
 * @param node - DOM node
 * @return {Boolean}
 */
Evernote.DomParser.prototype.isNodeInRange = function ( node ) {
    Evernote.Logger.debug( "DomParser.isNodeInRange()" );</p>
<p>    var nodeRange, endsAfterNodeStart, startsBeforeNodeEnd;</p>
<p>    if (typeof node.ownerDocument.createRange == 'function') {
        // ie9, ie10, ie11</p>
<p>        if ( node &#038;&#038; this._range ) {
            nodeRange = node.ownerDocument.createRange();</p>
<p>            // create new selection from node, or node content
            try {
                nodeRange.selectNode( node );
            }
            catch ( e ) {
                nodeRange.selectNodeContents( node );
            }</p>
<p>            // compare boundary points of selection and current node.
            endsAfterNodeStart = this._range.compareBoundaryPoints( Range.START_TO_END, nodeRange ) == 1;
            startsBeforeNodeEnd = this._range.compareBoundaryPoints( Range.END_TO_START, nodeRange ) == -1;</p>
<p>            return endsAfterNodeStart &#038;&#038; startsBeforeNodeEnd;
        }
    } else {
        // ie7 , ie8
        nodeRange = node.ownerDocument.body.createTextRange();</p>
<p>        try {
            nodeRange.moveToElementText(node);
        } catch (e) {
            // [object Text]
            // probably, here should be analog for createRange().selectNodeContents();
            return true;
        }</p>
<p>        endsAfterNodeStart = this._range.compareEndPoints('EndToStart', nodeRange) == 1;
        startsBeforeNodeEnd = this._range.compareEndPoints('StartToEnd', nodeRange) == -1;</p>
<p>        return endsAfterNodeStart &#038;&#038; startsBeforeNodeEnd;
    }</p>
<p>    return false; // not found.
};</p>
<p>/**
 * Determines whether passed node is visible on the page.
 * @param node - DOM node.
 * @return {Boolean}
 */
Evernote.DomParser.prototype.isNodeVisible = function ( node ) {
    Evernote.Logger.debug( "DomParser.isNodeVisible()" );</p>
<p>    if ( !node ) {
        return false;
    }</p>
<p>    var compStyles = Evernote.ElementExtension.getComputedStyle( node, null, this._tab );
    return Evernote.StyleElementExtension.getPropertyValue(compStyles, "display" ) != "none";
};</p>
<p>Evernote.DomParser.prototype.parseAsync = function ( root, fullPage, serializer, callback ) {
    var PARSING_TIMEOUT_INTERVAL = 1000; //milliseconds</p>
<p>    if (!callback) {
        this.parse(root, fullPage, serializer);
        return;
    }</p>
<p>    if ( !root ) {
        throw new Error( "No root element for parsing" );
    }</p>
<p>    var node = root;
    var parentNode = null;
    var thizz = this;</p>
<p>    var asyncParser = function()
    {
        var parsingEnd = true;
        var startTimeParsing = new Date().getTime();
        while ( node ) {
            if ( node != root &#038;&#038; node.parentNode ) {
                parentNode = node.parentNode.serializedNode;
            }</p>
<p>            if ( thizz.isNodeForSerialize( node ) ) {
                if ( node.nodeType == Evernote.Node.TEXT_NODE ) {
                    serializer.textNode( node, thizz._range );
                }
                else if ( node.nodeType == Evernote.Node.ELEMENT_NODE &#038;&#038; thizz.isNodeVisible( node ) ) {
                    node.serializedNode = serializer.startNode( new Evernote.SerializedNode( node, parentNode ), root, fullPage );
                    if ( node.hasChildNodes() ) {
                        node = node.childNodes[ 0 ];
                        continue;
                    }
                    else {
                        serializer.endNode( node.serializedNode );
                        if ( node.serializedNode ) {
                            try {
                                delete node.serializedNode;
                            } catch(e) {
                                //If we are failed to delete the property, than just set it to undefined
                                node.serializedNode = undefined;
                            }
                        }
                    }
                }
            }</p>
<p>            /**
             * Check if there is a next node available and it is not the root
             */
            if ( node.nextSibling &#038;&#038; node != root ) {
                node = node.nextSibling;
            }
            else if ( node != root ) {
                while ( node.parentNode &#038;&#038; node != root ) {
                    node = node.parentNode;
                    try {
                        serializer.endNode( node.serializedNode );
                    } catch (err) {
                        node.serializedNode = undefined;
                        continue;
                    };
                    try {
                        delete node.serializedNode;
                    } catch (e) {
                        //If we are failed to delete the property, than just set it to undefined
                        node.serializedNode = undefined;
                    }</p>
<p>                    if ( node.nextSibling &#038;&#038; node != root ) {
                        node = node.nextSibling;
                        break;
                    }
                }</p>
<p>                if ( node == root ) {
                    break;
                }
            }
            else {
                break;
            }</p>
<p>            var endTimeParsing = new Date().getTime();
            if ( (endTimeParsing - startTimeParsing) >= PARSING_TIMEOUT_INTERVAL ) {
                Evernote.Logger.debug("Parsing interval timeout: " + (endTimeParsing - startTimeParsing));
                parsingEnd = false;
                break;
            }
        }</p>
<p>        if (parsingEnd) {
            Evernote.Logger.debug("Parsing end");
            callback();
        }else {
            Evernote.Logger.debug("Parsing repeat");
            setTimeout(asyncParser, 0);
        }
    };
    setTimeout(asyncParser, 0);
};</p>
<p>/**
 * Starts parsing from specified root.
 * @param root - starting DOM node.
 * @param fullPage - is user selects to serialize the full page
 * @param serializer - current serializer to be used to serialize the DOM node to string
 */
Evernote.DomParser.prototype.parse = function ( root, fullPage, serializer ) {
    Evernote.Logger.debug( "DomParser.parse()" );</p>
<p>    if ( !root ) {
        throw new Error( "No root element for parsing" );
    }</p>
<p>    var node = root;
    var parentNode = null;</p>
<p>    while ( node ) {
        if ( node != root &#038;&#038; node.parentNode ) {
            parentNode = node.parentNode.serializedNode;
        }</p>
<p>        if ( this.isNodeForSerialize( node ) ) {
            if ( node.nodeType == Evernote.Node.TEXT_NODE ) {
                serializer.textNode( node, this._range );
            }
            else if ( node.nodeType == Evernote.Node.ELEMENT_NODE &#038;&#038; this.isNodeVisible( node ) ) {
                node.serializedNode = serializer.startNode( new Evernote.SerializedNode( node, parentNode ), root, fullPage );
                if ( node.hasChildNodes() ) {
                    node = node.childNodes[ 0 ];
                    continue;
                }
                else {
                    serializer.endNode( node.serializedNode );
                    if ( node.serializedNode ) {
                        try {
                            delete node.serializedNode;
                        } catch(e) {
                            //If we are failed to delete the property, than just set it to undefined
                            node.serializedNode = undefined;
                        }
                    }
                }
            }
        }</p>
<p>        /**
         * Check if there is a next node available and it is not the root
         */
        if ( node.nextSibling &#038;&#038; node != root ) {
            node = node.nextSibling;
        }
        else if ( node != root ) {
            while ( node.parentNode &#038;&#038; node != root ) {
                node = node.parentNode;
                try {
                    serializer.endNode( node.serializedNode );
                } catch (err) {
                    node.serializedNode = undefined;
                    continue;
                };</p>
<p>                try {
                    delete node.serializedNode;
                } catch (e) {
                    //If we are failed to delete the property, than just set it to undefined
                    node.serializedNode = undefined;
                }</p>
<p>                if ( node.nextSibling &#038;&#038; node != root ) {
                    node = node.nextSibling;
                    break;
                }
            }</p>
<p>            if ( node == root ) {
                break;
            }
        }
        else {
            break;
        }
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.NodeSerializer = function NodeSerializer( tab, styleStrategy, includeBg , isRange) {
    this.initialize( tab, styleStrategy, includeBg , isRange);
};</p>
<p>Evernote.NodeSerializer.prototype._tab = null;
Evernote.NodeSerializer.prototype._styleStrategy = null;
Evernote.NodeSerializer.prototype._docBase = null;
Evernote.NodeSerializer.prototype._imagesUrls = null;
Evernote.NodeSerializer.prototype._isRange = null;
Evernote.NodeSerializer.prototype._serializedDom = "";
Evernote.NodeSerializer.prototype._includeBgStyles = true;</p>
<p>Evernote.NodeSerializer.prototype.initialize = function ( tab, styleStrategy, includeBg ,isRange ) {
    Evernote.Logger.debug( "DomSerializer.initialize()" );</p>
<p>    this._tab = tab;
    this._styleStrategy = (styleStrategy instanceof Evernote.ClipStylingStrategy) ? styleStrategy : null;
    this._imagesUrls = [ ];
    this._includeBgStyles = ( includeBg != null ) ? includeBg : true;
    this._isRange = ( isRange != null ) ? isRange : false;
    this.getDocumentBase();
};</p>
<p>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 ) &#038;&#038; 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;
        }</p>
<p>        if ( node.nodeName.toLowerCase() == "embed" ) {
            var src = node.getAttribute( "src" );
            if ( src &#038;&#038; (src.indexOf(".swf", src.length - ".swf".length) !== -1) ) {
                serializedNode.setStyle(new Evernote.ClipStyle());
                return serializedNode;
            }
        }</p>
<p>        if ( node.nodeName.toLowerCase() == "img" ) {
            var src = node.getAttribute( "src" );</p>
<p>            if (src &#038;&#038; src.indexOf('&#038;') != -1) {
                src =  src.slice(0, src.indexOf('&#038;'));
            }</p>
<p>            var absoluteSource = Evernote.Utils.makeAbsolutePath(this._docBase, src).replace(/\s/g, "%20");
            node.setAttribute( "type", "put-media-type-here-for-" + absoluteSource);
            node.setAttribute( "hash", "put-hash-type-here-for-" + absoluteSource);
            node.setAttribute( "src", src);</p>
<p>            if ( src &#038;&#038; src.indexOf( "data:image" ) < 0 ) {
                this._imagesUrls.push( src );
            }
        }</p>
<p>        var attrsStr = this.serializeAttributes( node );
        var stylesStr = "";</p>
<p>        var nodeName = Evernote.ClipRules.translateNode( node );</p>
<p>        if ( this._styleStrategy ) {</p>
<p>            var nodeStyle = this._styleStrategy.styleForNode( node, root, fullPage, Evernote.ClipStyleType.Default ).evaluated;</p>
<p>            var inhBgStyle = null;
            if ( this._includeBgStyles )
                inhBgStyle = this._styleStrategy.styleForNode( node, root, fullPage, Evernote.ClipStyleType.InheritedBgStyle ).inheritedBackground;</p>
<p>            if ( inhBgStyle != null )
                for ( var inhI = inhBgStyle.length - 1; inhI >= 0; inhI-- ) {
                    var inhStyle = inhBgStyle[inhI];
                    this._serializedDom += "</p>
<div " + this.serializeStyles( node, inhStyle ) + " >";
                    serializedNode.translateTo.push( "div" );
                }</p>
<p>            var pseudoStyle = this._styleStrategy.getNodeStyle( node, null, ":before" );</p>
<p>            if ( fullPage &#038;&#038; node.nodeName.toLowerCase() == "body" ) {
                var wrapBodyStyle = new Evernote.ClipStyle( nodeStyle, null, Evernote.ClipStyle.CSS_GROUP.getExtForStyle( "background" ) );
                this._serializedDom += "<" + "div" + " " + this.serializeStyles( node, wrapBodyStyle ) + " >";
                serializedNode.translateTo.push( "div" );
                var bgGroup = Evernote.ClipStyle.CSS_GROUP.getExtForStyle( "background" );
                for ( var ind in bgGroup ) {
                    if ( bgGroup.hasOwnProperty( ind ) ) {
                        nodeStyle.removeStyle( bgGroup[ind] );
                    }
                }
            }</p>
<p>            // Bug 47705. dirty fix, may cause problems in some cases.
            if (this._isRange) {
                nodeStyle.addSimpleStyle('height', node.currentStyle.height);
            }</p>
<p>            if ( !fullPage &#038;&#038; node == root ) {
                nodeStyle.removeStyle( "float" );
            }
            if ( !serializedNode.node.hasChildNodes() &#038;&#038; !(nodeStyle.getStyle( "height" ) || node.getAttribute( "height" )) ) {
                nodeStyle.addStyle( {height:"0px"} );
            }
            if ( !serializedNode.node.hasChildNodes() &#038;&#038; !(nodeStyle.getStyle( "width" ) || node.getAttribute( "width" )) ) {
                nodeStyle.addStyle( {width:"0px"} );
            }
            if(nodeStyle.getStyle("position") == "fixed") {
                nodeStyle.addStyle({position: "absolute"});
            }</p>
<p>            if ( (node.nodeName.toUpperCase() == "SPAN"/* || node.nodeName.toUpperCase() == "A"*/) &#038;&#038; node.getElementsByTagName( "IMG" ).length > 0) {
                nodeName = "div";
                if ( !nodeStyle.getStyle( "display" ) )
                    nodeStyle.addStyle( {display:"inline"} );
            }
            if (node.nodeName.toUpperCase() == "TH" || node.nodeName.toUpperCase() == "TD") {
                nodeStyle.addStyle( {display:"table-cell"} );
            }</p>
<p>            nodeStyle.removeDefaultCssStyle();</p>
<p>            this._serializedDom += this.serializePseudoElement( node, pseudoStyle );
            stylesStr = this.serializeStyles( node, nodeStyle );</p>
<p>            if ( (nodeName.toLowerCase() == "div" /*|| nodeName.toLowerCase() == "span"*/) &#038;&#038; nodeStyle.getStyle( "float" ) &#038;&#038; nodeStyle.getStyle( "float" ) != "none" &#038;&#038; serializedNode.parentNode &#038;&#038; node.parentNode.nodeName.toLowerCase() != "a" ) {
                if ( !serializedNode.node.nextSibling || serializedNode.node.nextSibling.nodeType == 3 )
                    serializedNode.parentNode.isInlineBlock = true;
            }
        }</p>
<p>        Evernote.Logger.debug( node.nodeName + " " + attrsStr + " -> " + nodeName + " " + stylesStr );</p>
<p>        this._serializedDom += "<" + nodeName + " " + attrsStr + " " + stylesStr + " >";</p>
<p>        serializedNode.setStyle(nodeStyle);
        serializedNode.translateTo.push( nodeName );
        return serializedNode;
    }
    catch ( e ) {
        Evernote.Logger.error( "Failed to start serialize node :" + e );
        throw e;
    }
};</p>
<p>Evernote.NodeSerializer.prototype.serializePseudoElement = function ( node, pseudoStyle ) {
    try {
        var nodeName = Evernote.ClipRules.translateNode( node );
        if ( pseudoStyle.getStylesNames().length > 0 ) {
            var content = "&nbsp;";
            if ( pseudoStyle.getStyle( "content" ) ) {
                content = pseudoStyle.getStyle( "content" );
                pseudoStyle.removeStyle( "content" );
            }
            var beforeStylesStr = this.serializeStyles( node, pseudoStyle );
            return "<" + nodeName + " " + beforeStylesStr + " >" + content.replace( /"/g, '' ) + "</" + nodeName + ">";
        }
        return "";
    }
    catch ( e ) {
        Evernote.Logger.error( "Failed to  serialize pseudo element :" + e );
        throw e;
    }
};</p>
<p>Evernote.NodeSerializer.prototype.textNode = function ( node, range ) {
    this._serializedDom += this.serializeTextNode( node, range );
};</p>
<p>Evernote.NodeSerializer.prototype.endNode = function ( serializedNode ) {
    try {
        Evernote.Logger.debug( "end serialize node :" + serializedNode.translateTo );</p>
<p>        if ( serializedNode.isInlineBlock ) {
            var name = "div";
            if ( serializedNode.node.nodeName.toLowerCase() == "ul" ) {
                name = "li"
            }
            this._serializedDom += "<" + name + " style=\"clear: both; width: 0px; height: 0px;\">" + "&nbsp;" + "</" + name + ">"
        }</p>
<p>        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 &#038;&#038; !pseudoStyle.getStyle( "float" ) )
                    pseudoStyle.addStyle( { "float" : floatStyle } );</p>
<p>                if ( node.nodeName.toLowerCase() == "ul" )
                    serializedPseudo = this.serializePseudoElement( document.createElement( "div" ), pseudoStyle );
            }
        }</p>
<p>        while ( serializedNode.translateTo.length > 0 ) {
            var nodeName = serializedNode.translateTo.pop();
            if ( !Evernote.ClipRules.isSelfClosingNode( serializedNode.node ) ) {
                if ( !serializedNode.node.hasChildNodes() )
                    this._serializedDom += "&nbsp;";
            }</p>
<p>            if ( nodeName.toLowerCase() == "ul" ) {
                this._serializedDom += this.serializePseudoElement( document.createElement( "li" ), pseudoStyle );
            }
            this._serializedDom += "</" + nodeName + ">";
        }</p>
<p>        this._serializedDom += serializedPseudo;
    }
    catch ( e ) {
        Evernote.Logger.error( "Failed to end serialize node :" + e );
        throw e;
    }
};</p>
<p>Evernote.NodeSerializer.prototype.serializeTextNode = function ( node, range ) {
    Evernote.Logger.debug( "DomSerializer.serializeTextNode()" );</p>
<p>    try {
        var nodeValue = node.nodeValue;
        if ( !range ) {
            return Evernote.Utils.htmlEncode( nodeValue );
        }
        else {
            if ( range.startContainer == node &#038;&#038; 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;
    }</p>
<p>    return "";
};</p>
<p>Evernote.NodeSerializer.prototype.serializeConditionalNode = function ( node, root, fullPage ) {
    Evernote.Logger.debug( "DomSerializer.serializeConditionalNode()" );
    var impl = Evernote.ElementSerializerFactory.getImplementationFor( node );
    if ( typeof impl == 'function' ) {
        var nodeStyle = (this._styleStrategy) ? this._styleStrategy.styleForNode( node, root, fullPage ).evaluated : null;
        if (nodeStyle)
            nodeStyle.removeDefaultCssStyle();
        var serializer = new impl( node, nodeStyle );
        var content = serializer.serialize( this._docBase );
        var imageUrl = serializer.getImageUrl();</p>
<p>        return { content:content, imageUrl:imageUrl, nodeStyle:nodeStyle };
    }</p>
<p>    return { content:"", imageUrl:"", nodeStyle:new Evernote.ClipStyle() };
};</p>
<p>Evernote.NodeSerializer.prototype.serializeAttributes = function ( node ) {
    Evernote.Logger.debug( "DomSerializer.serializeAttributes()" );</p>
<p>    try {
        var attrs = node.attributes;
        var str = "";</p>
<p>        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") &#038;&#038; attrValue.toLowerCase().indexOf( "http" ) != 0 ) {
                    attrValue = Evernote.Utils.makeAbsolutePath( this._docBase, attrValue );
                }
                str += " " + attrs[ i ].name.toLowerCase() + "=\"" + attrValue + "\"";
            }
        }</p>
<p>        return str;
    }
    catch ( e ) {
        Evernote.Logger.error( "DomSerializer.serializeAttributes() failed: error = " + e );
    }</p>
<p>    return "";
};</p>
<p>Evernote.NodeSerializer.prototype.serializeStyles = function ( node, nodeStyle ) {
    Evernote.Logger.debug( "DomSerializer.serializeStyles()" );</p>
<p>    try {
        var str = "";
        if(node.nodeName.toLowerCase() == "map") {
            //Map should not have style attribute according to Evernote DTD
            return "";
        }
        if ( node &#038;&#038; 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 "";
};</p>
<p>Evernote.NodeSerializer.prototype.getDocumentBase = function () {
    Evernote.Logger.debug( "DomSerializer.getDocumentBase()" );</p>
<p>    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' &#038;&#038; baseTag.indexOf( "http" ) == 0 ) {
                this._docBase = baseTag;
            }
            if ( this._docBase ) {
                break;
            }
        }</p>
<p>        if ( !this._docBase ) {
            var location = this._tab.document.location;
            this._docBase = location.protocol + "//" + location.host + location.pathname.replace( /[^\/]+$/, "" );
        }
    }</p>
<p>    return this._docBase;
};</p>
<p>Evernote.NodeSerializer.prototype.getImagesUrls = function () {
    return this._imagesUrls;
};</p>
<p>Evernote.NodeSerializer.prototype.getSerializedDom = function () {
    return '</p>
<div style="position: relative;">' + this._serializedDom.replace(/[^\u0009\u000a\u000d\u0020-\uD7FF\uE000-\uFFFD]+/g, "") + '</div>
<p>';
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
//"use strict";</p>
<p>Evernote.SerializedNode = function SerializedNode( node, parent ) {
    this.node = node;
    this._parentSerializedNode = parent;
    this.translateTo = [ ];
};</p>
<p>Evernote.SerializedNode.prototype.translateTo = null;
Evernote.SerializedNode.prototype.node = null;
Evernote.SerializedNode.prototype._parentSerializedNode = null;</p>
<p>Evernote.SerializedNode.prototype.setStyle = function ( clipStyle ) {
    this._clipStyle = clipStyle;
};</p>
<p>Evernote.SerializedNode.prototype.getStyle = function () {
    return this._clipStyle;
};</p>
<p>Evernote.SerializedNode.prototype.parentNode = function () {
    return this._parentSerializedNode;
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
//"use strict";</p>
<p>Evernote.StylesCollection = function StylesCollection() {
    this._styles = { };
};</p>
<p>Evernote.StylesCollection.prototype._styles = null;</p>
<p>Evernote.StylesCollection.prototype.addStyle = function( name, value, isImportant ) {
    if ( typeof name == "string" &#038;&#038; typeof value == "string" ) {
        Evernote.Logger.debug( "StylesCollection.addStyle(): name = " + name + ", value = " + value + ", isImportant = " + isImportant );
        this._styles[ name ] = new Evernote.ClipStyleProperty( name, value, isImportant);
    }
};</p>
<p>Evernote.StylesCollection.prototype.getStyle = function( name ) {
    if ( typeof name == "string" ) {
        Evernote.Logger.debug( "StylesCollection.getStyle(): name = " + name + " value: " + ((typeof this._styles[ name ] != "undefined") ? this._styles[ name ].value() : null) );
        return (typeof this._styles[ name ] != "undefined") ? this._styles[ name ].value() : null;
    }</p>
<p>    return null;
};</p>
<p>Evernote.StylesCollection.prototype.removeStyle = function( name ) {
    if ( typeof name == "string" ) {
        Evernote.Logger.debug( "StylesCollection.removeStyle(): name = " + name );</p>
<p>        this._styles[ name ] = null;
        delete this._styles[ name ];
    }
};</p>
<p>Evernote.StylesCollection.prototype.isImportant = function( name ) {
    if ( typeof name == "string" ) {
        return (typeof this._styles[ name ] != "undefined") ? this._styles[ name ].isImportant() : false;
    }
};</p>
<p>Evernote.StylesCollection.prototype.getStylesNames = function() {
    Evernote.Logger.debug( "StylesCollection.getStylesNames()" );</p>
<p>    var stylesNames = [ ];
    for ( var key in this._styles ) {
        if ( this._styles[ key ] != null ) {
            stylesNames.push( key );
        }
    }</p>
<p>    return stylesNames;
};</p>
<p>Evernote.StylesCollection.prototype.getStylesNumber = function() {
    Evernote.Logger.debug( "StylesCollection.getStylesNumber()" );</p>
<p>    var num = 0;
    for ( var key in this._styles ) {
        if ( this._styles[ key ] != null ) {
            ++num;
        }
    }</p>
<p>    return num;
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.DataImageSerializer = function DataImageSerializer( node, nodeStyle ) {
    if ( !nodeStyle ) {
        nodeStyle = new Evernote.ClipStyle();
    }</p>
<p>    this.initialize( node, nodeStyle );
};</p>
<p>Evernote.inherit( Evernote.DataImageSerializer, Evernote.AbstractElementSerializer, true );</p>
<p>Evernote.DataImageSerializer.isResponsibleFor = function( node ) {
    try {
        if ( node &#038;&#038; node.nodeType == Evernote.Node.ELEMENT_NODE &#038;&#038; node.nodeName.toLowerCase() == "img" ) {
            var src = node.getAttribute( "src" );
            if ( src &#038;&#038; src.indexOf( "data:image" ) != -1 ) {
                return true;
            }
        }
    } catch(e) {
        Evernote.Logger.error("DataImageSerializer.isResponsibleFor failed due to error " + e);
    }
    return false;
};</p>
<p>Evernote.DataImageSerializer.prototype.serialize = function( /*docBase*/ ) {
    Evernote.Logger.debug( "DataImageSerializer.serialize()" );</p>
<p>    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" } );</p>
<p>        return "<span style=\"" + this._nodeStyle.toString().replace( /"/g, "" ) + "\"" + ">&nbsp;</span>";
    }
    catch ( e ) {
        Evernote.Logger.error( "DataImageSerializer.serialize() failed: error = " + e );
    }</p>
<p>    return "";
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.VideoElementSerializer = function VideoElementSerializer( node, nodeStyle ) {
    this.initialize( node, nodeStyle );
};</p>
<p>Evernote.inherit( Evernote.VideoElementSerializer, Evernote.AbstractElementSerializer, true );</p>
<p>Evernote.VideoElementSerializer.isResponsibleFor = function( node ) {
    return node &#038;&#038; node.nodeType == Evernote.Node.ELEMENT_NODE &#038;&#038; node.nodeName.toLowerCase() == "video";
};</p>
<p>Evernote.VideoElementSerializer.prototype.serialize = function( /*docBase*/ ) {
    Evernote.Logger.debug( "VideoElementSerializer.serialize()" );</p>
<p>    try {
        var width = this._node.offsetWidth;
        var height = this._node.offsetHeight;
        var doc = this._node.ownerDocument;</p>
<p>        var canvas = doc.createElement( "CANVAS" );
        canvas.width = width;
        canvas.height = height;</p>
<p>        var context = canvas.getContext( "2d" );
        context.drawImage( this._node, 0, 0, width, height );</p>
<p>        var dataUrl = canvas.toDataURL( "image/png" );
        context.clearRect( 0, 0, width, height );</p>
<p>        this._nodeStyle.addStyle( { "background-image" : "url('" + dataUrl + "')",
            "width" : width + "px",
            "height" : height + "px",
            "display" : "block" } );</p>
<p>        return "<a style=\"" + this._nodeStyle.toString().replace( /"/g, "" ) + "\"" + "href='" + doc.defaultView.location.href + "'>&nbsp;</a>";
    }
    catch ( e ) {
        Evernote.Logger.error( "VideoElementSerializer.serialize() failed: error = " + e );
    }</p>
<p>    return "";
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![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:
 *
 *</p>
<pre>
 *   - 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)
 *</pre>
<p>*
 * Sample URLs are:
 *
 *</p>
<pre>
 * http: //www.youtube.com/embed/IWJJBwKhvp4?wmode=opaque&amp;rel=0
 * http: //www.youtube.com/v/YZEbBZ2IrXE?version=3&amp;rel=1&amp;fs=1&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1
 * http: //www.youtube.com/v/J3mjFSTsKiM&amp;hl=en&amp;fs=1
 * http://www.youtube.com/watch?v=cAcxHQalWOw
 * http://www.youtube.com/user/IFiDieApp?v=sdzCELofGgE&#038;feature=pyv
 *</pre>
<p>*/</p>
<p>Evernote.YoutubeElementSerializer = function YoutubeElementSerializer( doc, node, nodeStyle ) {
    this.initialize( doc, node, nodeStyle );
};</p>
<p>Evernote.inherit( Evernote.YoutubeElementSerializer, Evernote.AbstractElementSerializer, true );</p>
<p>Evernote.YoutubeElementSerializer.WATCH_URL_REGEX = /^https?:\/\/www\.youtube\.com\/watch\?.*v=([^&#038;]+)/i;
Evernote.YoutubeElementSerializer.USER_CHANNEL_URL_REGEX = /^https?:\/\/www\.youtube\.com\/user\/([a-zA-Z0-9]+)\?v=([^&#038;]+)/i;
Evernote.YoutubeElementSerializer.EMBED_URL_REGEX = /^https?:\/\/www\.youtube\.com\/embed\/([^\/\?&#038;]+)/i;
Evernote.YoutubeElementSerializer.VIDEO_URL_REGEX = /^https?:\/\/www\.youtube\.com\/v\/([^\/\?&#038;]+)/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;</p>
<p>Evernote.YoutubeElementSerializer.isResponsibleFor = function( node ) {
    var params = this.extractVideoParamsFromNode( node );
    return (params) ? true : false;
};</p>
<p>Evernote.YoutubeElementSerializer.extractVideoParamsFromNode = function( node ) {
    Evernote.Logger.debug( "YoutubeElementSerializer.extractVideoIdFromNode()" );
    try {
        if ( node &#038;&#038; node.nodeType == Evernote.Node.ELEMENT_NODE ) {
            var view = window;
            try {
                view = node.ownerDocument.defaultView;
            }
            catch ( e ) {
            }</p>
<p>            var matches = null;
            if ( view &#038;&#038; (node.nodeName.toLowerCase() == "embed" || node.nodeName.toLowerCase() == "object") &#038;&#038; view.location ) {
                if ( (matches = view.location.href.match( this.WATCH_URL_REGEX )) &#038;&#038; matches[ 1 ] ) {
                    return matches[ 1 ];
                }
                else if ( (matches = view.location.href.match( this.USER_CHANNEL_URL_REGEX )) &#038;&#038; matches[ 1 ] &#038;&#038; matches[ 2 ] ) {
                    return [ matches[ 1 ], matches[ 2 ] ];
                }
            }
            else {
                var videoNode = this.findVideoNode( node );
                if ( videoNode ) {
                    var src = videoNode.getAttribute( "src" );
                    if ( src &#038;&#038; (matches = src.match( this.EMBED_URL_REGEX )) &#038;&#038; matches[ 1 ] ) {
                        return matches[ 1 ];
                    }
                    else if ( src &#038;&#038; (matches = src.match( this.VIDEO_URL_REGEX )) &#038;&#038; matches[ 1 ] ) {
                        return matches[ 1 ];
                    }
                }
            }
        }
    } catch(e) {
        Evernote.Logger.error("failed to YoutubeElementSerializer.extractVideoParamsFromNode due to error " + e);
    }</p>
<p>    return null;
};</p>
<p>Evernote.YoutubeElementSerializer.findVideoNode = function( node ) {
    Evernote.Logger.debug( "YoutubeElementSerializer.findVideoNode()" );</p>
<p>    if ( node &#038;&#038; 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;</p>
<p>                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;
            }
        }
    }</p>
<p>    return null;
};</p>
<p>Evernote.YoutubeElementSerializer.prototype._imageUrl = "";</p>
<p>Evernote.YoutubeElementSerializer.prototype.serialize = function( /*docBase*/ ) {
    Evernote.Logger.debug( "YoutubeElementSerializer.serialize()" );</p>
<p>    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;
        }</p>
<p>        if ( videoId ) {
            var thumbUrl = null;
            var w = 0;
            var h = 0;</p>
<p>            if ( this._nodeStyle ) {</p>
<p>                var view = window;
                try {
                    view = this._node.ownerDocument.defaultView;
                }
                catch ( e ) {
                }</p>
<p>                var computedStyles = Evernote.ElementExtension.getComputedStyle( this._node, null, view );</p>
<p>                w = parseInt( Evernote.StyleElementExtension.getPropertyValue(computedStyles, "width" ) );
                w = (isNaN( w )) ? 0 : w;</p>
<p>                h = parseInt( Evernote.StyleElementExtension.getPropertyValue(computedStyles, "height" ) );
                h = (isNaN( h )) ? 0 : h;</p>
<p>                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 );
            }</p>
<p>            if ( thumbUrl ) {
                var styleStr = (this._nodeStyle instanceof Evernote.ClipStyle) ? ("style=\"" + this._nodeStyle.toString() + "\"") : "";
                var attrs = this._node.attributes;
                var attrStr = "";</p>
<p>                for ( var i = 0; i < attrs.length; ++i ) {
                    var attr = attrs[ i ];
                    if(Evernote.ClipRules.KEEP_NODE_ATTRIBUTES["a"][attr.name]) {
                        attrStr += attr.name;
                        if ( attr.value ) {
                            attrStr += "=" + attr.value;
                        }
                        attrStr += " ";
                    }
                }</p>
<p>                var href = ( userId ) ? this.getUserChannelUrl( userId, videoId ) : this.getWatchUrl( videoId );
                var imgAttrStr = "";</p>
<p>                if ( w &#038;&#038; h ) {
                    var k = w / h;
                    // scale by height
                    if ( k > this.constructor.DEFAULT_THUMB_WIDTH / this.constructor.DEFAULT_THUMB_HEIGHT ) {
                        imgAttrStr += "height=\"" + h + "\"";
                    }
                    else { // scale by width
                        imgAttrStr += "width=\"" + w + "\"";
                    }
                }</p>
<p>                this._imageUrl = thumbUrl;
                return "<a " + styleStr + " " + attrStr + " href=\"" + href + "\"><img src=\"" + thumbUrl + "\" " + imgAttrStr + "/></a>";
            }
        }
    }
    catch ( e ) {
        Evernote.Logger.error( "YoutubeElementSerializer.serialize() failed: error = " + e );
    }</p>
<p>    return "";
};</p>
<p>Evernote.YoutubeElementSerializer.prototype.getDefaultThumbnailUrl = function( videoId ) {
    return this.constructor.DEFAULT_THUMB_URL.replace( /\$videoId\$/, videoId );
};</p>
<p>Evernote.YoutubeElementSerializer.prototype.getHQThumbnailUrl = function( videoId ) {
    return this.constructor.HQ_THUMB_URL.replace( /\$videoId\$/, videoId );
};</p>
<p>Evernote.YoutubeElementSerializer.prototype.getWatchUrl = function( videoId ) {
    return this.constructor.WATCH_URL.replace( /\$videoId\$/, videoId );
};</p>
<p>Evernote.YoutubeElementSerializer.prototype.getUserChannelUrl = function( userId, videoId ) {
    return this.constructor.USER_CHANNEL_URL.replace( /\$userId\$/, userId ).replace( /\$videoId\$/, videoId );
};</p>
<p>Evernote.YoutubeElementSerializer.prototype.getImageUrl = function() {
    return this._imageUrl;
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.IEStylePropertiesMapping = {</p>
<p>    _mapping : {
        "background-attachment" : "backgroundAttachment",
        "background-color" : "backgroundColor",
        "background-image" : "backgroundImage",
        "background-repeat" : "backgroundRepeat",
        "background-position-x" : "backgroundPositionX",
        "background-position-y" : "backgroundPositionY",</p>
<p>        "border-bottom-color" : "borderBottomColor",
        "border-bottom-style" : "borderBottomStyle",
        "border-bottom-width" : "borderBottomWidth",</p>
<p>        "border-left-color" : "borderLeftColor",
        "border-left-style" : "borderLeftStyle",
        "border-left-width" : "borderLeftWidth",</p>
<p>        "border-right-color" : "borderRightColor",
        "border-right-style" : "borderRightStyle",
        "border-right-width" : "borderRightWidth",</p>
<p>        "border-top-color" : "borderTopColor",
        "border-top-style" : "borderTopStyle",
        "border-top-width" : "borderTopWidth",
        "border-collapse" : "borderCollapse",</p>
<p>        "font-family" : "fontFamily",
        "font-size" : "fontSize",
        "font-style" : "fontStyle",
        "font-weight" : "fontWeight",</p>
<p>        "float" : "styleFloat",</p>
<p>        "ime-mode" : "imeMode",</p>
<p>        "letter-spacing" : "letterSpacing",</p>
<p>        "line-height" : "lineHeight",</p>
<p>        "list-style-image" : "listStyleImage",
        "list-style-position" : "listStylePosition",
        "list-style-type" : "listStyleType",</p>
<p>        "margin-bottom" : "marginBottom",
        "margin-left" : "marginLeft",
        "margin-right" : "marginRight",
        "margin-top" : "marginTop",</p>
<p>        "max-height" : "maxHeight",
        "max-width" : "maxWidth",
        "min-height" : "minHeight",
        "min-width" : "minWidth",</p>
<p>        "overflow-x" : "overflowX",
        "overflow-y" : "overflowY",</p>
<p>        "padding-bottom" : "paddingBottom",
        "padding-left" : "paddingLeft",
        "padding-right" : "paddingRight",
        "padding-top" : "paddingTop",</p>
<p>        "page-break-after" : "pageBreakAfter",
        "page-break-before" : "pageBreakBefore",</p>
<p>        "table-layout" : "tableLayout",</p>
<p>        "text-align" : "textAlign",
        "text-decoration" : "textDecoration",
        "text-indent" : "textIndent",
        "text-overflow" : "textOverflow",
        "text-transform" : "textTransform",</p>
<p>        "vertical-align" : "verticalAlign",
        "white-space" : "whiteSpace",
        "word-spacing" : "wordSpacing",
        "word-wrap" : "wordWrap",
        "z-index" : "zIndex"
    },</p>
<p>    getPropertyNameFor: function(styleName) {
        return [styleName, this._mapping[styleName]];
    },
    getPropertiesList: function() {
        return this._mapping;
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.StylesReplacementRegistry = {</p>
<p>    registry: [],</p>
<p>    getImplementationFor: function(name) {
        if(name) {
            return this.registry[name];
        }
        return null;
    },</p>
<p>    register: function(name, impl) {
        this.registry[name] = impl;
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.FontSizeReplacement = {</p>
<p>    SUPPORTED_FONT_SIZES: ["em", "%", "pt", "px"],</p>
<p>    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;
        }
    },</p>
<p>    isCalculationRequired: function(val) {
        for(var i = 0; i < this.SUPPORTED_FONT_SIZES.length; i++) {
            if(val.indexOf(this.SUPPORTED_FONT_SIZES[i]) != -1) {
                return true;
            }
        }
        return false;
    }
};</p>
<p>Evernote.StylesReplacementRegistry.register("font-size", Evernote.FontSizeReplacement);
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ClipperElementsIdentifiers = {</p>
<p>    _clipperElementsIds : [Constants.CLIP_DIALOG_ID, Constants.OPTIONS_DIALOG_ID, Constants.ATTR_DIALOG_ID, Constants.CLIP_DIALOG_NEW_ID, Constants.POST_CLIP_DIALOG_ID],</p>
<p>    match: function(node) {
        if(node &#038;&#038; node.id) {
            var position = Evernote.ArrayExtension.indexOf(this._clipperElementsIds, node.id);
            if(position) {
                return position != -1;
            }
        }
        return false;
    }
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.NotebooksLoader = {</p>
<p>    notebooks: [],</p>
<p>    // TODO: add cache;</p>
<p>    getNotebookByUid: function(uid) {
        Evernote.ResponseReceiver.subscribe(this);
        Evernote.Addin.getNotebooks(document);
        for(var i = 0; i < this.notebooks.length; i++) {
            if(this.notebooks[i].uid == uid) {
                return this.notebooks[i];
            }
        }
        return null;
    },</p>
<p>    onDataReceived: function(response) {
        if(response.type) {
            if(response.type == "notebooks") {
                this.notebooks = this.notebooks.concat(response.data);
            }
        }
    }
};</p>
<p>Evernote.NotebooksPopupLoader = function( subscriber , doc ) {
    this.subscriber = subscriber;
    this.doc = doc;
    this.cache = [];
};</p>
<p>Evernote.NotebooksPopupLoader.prototype.getNotebooksAsync = function( onSuccess ) {
    var self = this;
    var countNotebooksResponse = 0;</p>
<p>    Evernote.Addin.getNotebooksAsync(function(response, args)
    {
        if (Evernote.NotebookResponseParser.canParse(response))
        {
            var res = Evernote.NotebookResponseParser.parse(response);
            countNotebooksResponse++;
            self.subscriber.updateNotebooks.call(self.subscriber, res.data);</p>
<p>            if (countNotebooksResponse == 3)
            {
                onSuccess();
            }
        }
    });</p>
<p>};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.Notebook = function(type, name, uid, stack, author, hidden, typeText) {
    this.type = type;
    this.name = name;
    this.uid = uid;
    this.stack = stack;
    this.author = author;
    this.hidden = hidden;
    this.typeText = typeText;
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.Tag = function(name, uid) {
    this.name = name;
    this.uid = uid;
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.NotebookTypes = {
    PERSONAL: 1,
    PERSONAL_TEXT: 'pers',
    BUSINESS: 2,
    BUSINESS_TEXT: 'biz',
    LINKED: 3,
    LINKED_TEXT: 'linked'
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.ErrorCodes = {
    AUTHENTICATION_ERROR: "LoginFailure",
    CLIP_ERROR: "NoteImportFailure",
    CONNECTION_FAILED: "ConnectionAttemptFailed"
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
Evernote.AuthenticatedException = function(msg){
    this.msg = msg;
    this.code = Evernote.ErrorCodes.AUTHENTICATION_ERROR;
};
// ]]&gt;</script><script charset="ANSI" type="text/javascript" defer="defer">// <![CDATA[
try {
    Evernote.Addin.init(EvernoteExternal.Addin);
    Evernote.Addin.resetAuthenticatedState();
    Evernote.FS.init(EvernoteExternal.Addin);
    Evernote.Logger = Evernote.LoggerConfigurator.getLogger();
    if(!Evernote.JQuery)
        Evernote.JQueryLoader.initJQuery();
    window.jQueryForClearlyComponent = Evernote.JQuery;
    initClearly(window);</p>
<p>    // todo: create bulletproof function for popup close before context-clipping.
    if (Evernote.evernotePopup) Evernote.evernotePopup.hide();
    if (Evernote.SkitchController) Evernote.SkitchController.clearSkitch();</p>
<p>    Evernote.Logger.debug("Init EnClipper");
    Evernote.EnClipper.init();
    Evernote.Logger.debug("EnClipper initialized");
    Evernote.pageInfo = new PageInfo();
    if (!Evernote.contentPreviewer) Evernote.contentPreviewer = new ContentPreview();
    Evernote.Options.load();</p>
<p>    Evernote.evernotePostClipPopup = new Evernote.PostClipPopup( document );</p>
<p>    if (EvernoteExternal.Addin.isServerAvailable()) {
        Evernote.Clipper.clipWithOptions(EvernoteExternal.clipOptions);
    }
} catch(e) {
    throw e;
}
// ]]&gt;</script><br />
<style id="_clearly_component__css" type="text/css"><!--
#next_pages_container { width: 5px; hight: 5px; position: absolute; top: -100px; left: -100px; z-index: 2147483647 !important; } 
--></style>
<div id="_clearly_component__next_pages_container"></div>
]]></content:encoded>
			<wfw:commentRss>http://electrification-consulting.com/?feed=rss2&#038;p=3047</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2015年4月13日　和田憲一郎のビリビリ！とくる話</title>
		<link>http://electrification-consulting.com/?p=2970</link>
		<comments>http://electrification-consulting.com/?p=2970#comments</comments>
		<pubDate>Sun, 12 Apr 2015 22:16:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[最近の投稿]]></category>

		<guid isPermaLink="false">http://electrification-consulting.com/?p=2970</guid>
		<description><![CDATA[先週、約3年振りに中国に行ってきました。これまで政治的な問題が報道されていた ことと、他のアジア諸国の興隆が話題になっていたので、少し足が遠のいていた のかもしれません。 上海や幾つかの都市を訪問しただけなのですが、個人 [...]]]></description>
				<content:encoded><![CDATA[<p><span style="font-size: medium;">先週、約3年振りに中国に行ってきました。これまで政治的な問題が報道されていた</span><br />
<span style="font-size: medium;">ことと、他のアジア諸国の興隆が話題になっていたので、少し足が遠のいていた</span><br />
<span style="font-size: medium;">のかもしれません。</span></p>
<p><span style="font-size: medium;">上海や幾つかの都市を訪問しただけなのですが、個人的な感想を一言で言えば、</span><br />
<span style="font-size: medium;">「やばい！」と感じました。それはあまりにも日本車の退潮が著しいと感じた</span><br />
<span style="font-size: medium;">からです。2014年の日系7社販売シェアは約18%にまで低下しているようですが、</span><br />
<span style="font-size: medium;">感覚的には、上海などの都市部では10台に1台ぐらいしか日本車が走っていない</span><br />
<span style="font-size: medium;">のではと思えるほど少なくなっています。</span></p>
<p><span style="font-size: medium;">逆に大きく台頭しているのがドイツ車と米国車です。まるで日本がシェアを低下</span><br />
<span style="font-size: medium;">した穴を埋めるように、大きくシェアを伸ばしています。</span></p>
<p><span style="font-size: medium;">日本のメディアなどでは、日系自動車メーカーの中国に於ける投資の停滞や、部品</span><br />
<span style="font-size: medium;">メーカーの撤退記事を掲載していますが、中国は昨年も約2350万台販売しており、</span><br />
<span style="font-size: medium;">以前として世界でダントツの販売規模です。さらに、まだまだクルマの所有者が</span><br />
<span style="font-size: medium;">少ないことから、今後も2020年に向けて3,000万台やそれ以上に伸びしろがある</span><br />
<span style="font-size: medium;">ように見受けます。</span></p>
<p><span style="font-size: medium;">このようなことから、あまり日本の報道などに惑わされずに、この巨大マーケットを</span><br />
<span style="font-size: medium;">どうとらえるかが大切ではないでしょうか。欧米などは、政治と経済を巧みに使い分け、</span><br />
<span style="font-size: medium;">結果的に自動車ビジネスを拡大しているように思えます。</span><br />
<span style="font-size: medium;">日本車の退潮を見るにつけ、あまりに早く見切り過ぎることに対して、ビリビリ！と</span><br />
<span style="font-size: medium;">懸念を覚えた次第です。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://electrification-consulting.com/?feed=rss2&#038;p=2970</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2015年3月20日　和田憲一郎のビリビリ！とくる話</title>
		<link>http://electrification-consulting.com/?p=2887</link>
		<comments>http://electrification-consulting.com/?p=2887#comments</comments>
		<pubDate>Fri, 20 Mar 2015 00:38:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[最近の投稿]]></category>

		<guid isPermaLink="false">http://electrification-consulting.com/?p=2887</guid>
		<description><![CDATA[3月19日、一般社団法人 燃料電池開発情報センター主催のミニ勉強会に、パネル ディスカッションのパネラーとして参加しました。 今回のテーマは【未来自動車】ということで、自動運転車技術や、EV/PHV/FCVの 現状と将来 [...]]]></description>
				<content:encoded><![CDATA[<p><span style="font-size: medium;">3月19日、一般社団法人 燃料電池開発情報センター主催のミニ勉強会に、パネル</span><br />
<span style="font-size: medium;">ディスカッションのパネラーとして参加しました。</span></p>
<p><span style="font-size: medium;">今回のテーマは【未来自動車】ということで、自動運転車技術や、EV/PHV/FCVの</span><br />
<span style="font-size: medium;">現状と将来動向について、パネラーが自由に語ることができました。</span></p>
<p><span style="font-size: medium;">さて、その中ではっと気がついたことがあります。</span><br />
<span style="font-size: medium;">パネラーの一人がパテントの専門家であり、自動運転に関してグーグルが出願して</span><br />
<span style="font-size: medium;">いるエリアと、日系自動車メーカーが出願しているエリアがかなり異なっていると</span><br />
<span style="font-size: medium;">指摘していました。</span></p>
<p><span style="font-size: medium;">つまり、日系企業はクルマの運転システムや通信システム、要素技術に集中しており、</span><br />
<span style="font-size: medium;">グーグルはどちらかと言えば、陸・水・空中・宇宙での位置、進路、高度制御方法、</span><br />
<span style="font-size: medium;">道路上の車両に対する交通制御システム、印刷文字、手書き文字などの図形認識技術</span><br />
<span style="font-size: medium;">などに集中しているようです。</span></p>
<p><span style="font-size: medium;">以前の日経Automotiveにて、グーグルは自動運転のクルマを作るというより、都市管理</span><br />
<span style="font-size: medium;">システム、交通管理システムを重視し、自動運転車は都市端末の一部としてとらえて</span><br />
<span style="font-size: medium;">いるのではと提起がありました。</span></p>
<p><span style="font-size: medium;">結局、グーグルは都市・交通・クルマに関連する情報を全て手に入れようとしており、</span><br />
<span style="font-size: medium;">それを活用して新たなビジネスの構築を目指しているとの考えです。</span></p>
<p><span style="font-size: medium;">今回パテントの出願エリアと、企業買収しながら都市・交通・クルマの情報を集めて</span><br />
<span style="font-size: medium;">いる話との整合性がとれ、思わずビリビリ！とした瞬間でした。</span></p>
<p><span style="font-size: medium;">メディアは、自動運転車という表面上の事象を取り上げがちですが、人々が集まる都市</span><br />
<span style="font-size: medium;">にフォーカスし、社会全体のシステムを把握しようとする「大きな投網」を掛けていく</span><br />
<span style="font-size: medium;">戦略があるように見受けます。</span></p>
<p><span style="font-size: medium;">ひるがえって、日系自動車メーカーや部品メーカーはどこまで見えているでしょうか。</span><br />
<span style="font-size: medium;">既視感ではありませんが、携帯電話という範疇にこだわっている間に、PC端末や音楽配信</span><br />
<span style="font-size: medium;">など、別のビジネス形態にて攻め込まれたケースと似ていることはないでしょうか。</span><br />
<span style="font-size: medium;">ビジネスに携わる人の知見を高め、視野を広げ、戦略的に考えることのクセをつける</span><br />
<span style="font-size: medium;">場が必要ではと思うこの頃です。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://electrification-consulting.com/?feed=rss2&#038;p=2887</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2015年2月26日　和田憲一郎のビリビリ！とくる話</title>
		<link>http://electrification-consulting.com/?p=2752</link>
		<comments>http://electrification-consulting.com/?p=2752#comments</comments>
		<pubDate>Thu, 26 Feb 2015 09:55:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[最近の投稿]]></category>

		<guid isPermaLink="false">http://electrification-consulting.com/?p=2752</guid>
		<description><![CDATA[2月25日より東京ビックサイトにて開催されている「スマートエネルギーWeek2015」 に初日から行ってきました。既に行かれた方もいるかもしれませんが、本当にすごい 人でした。 今年は従来の「二次電池」「太陽電池」「スマ [...]]]></description>
				<content:encoded><![CDATA[<p><span style="font-size: medium;">2月25日より東京ビックサイトにて開催されている「スマートエネルギーWeek2015」</span><br />
<span style="font-size: medium;">に初日から行ってきました。既に行かれた方もいるかもしれませんが、本当にすごい</span><br />
<span style="font-size: medium;">人でした。</span></p>
<p><span style="font-size: medium;">今年は従来の「二次電池」「太陽電池」「スマートグリッド」「エコハウス」に加え、</span><br />
<span style="font-size: medium;">「電力自由化」「水素・燃料電池」が加わったことで、より幅広い業界の人が集まって</span><br />
<span style="font-size: medium;">いるようです。</span></p>
<p><span style="font-size: medium;">特に個人的な見かたかもしれませんが、「二次電池」「電力自由化」「水素・燃料電池」</span><br />
<span style="font-size: medium;">のブースは熱気に溢れており、今年のブームを感じさせるものでした。</span></p>
<p><span style="font-size: medium;">「二次電池」は、以前に比べ中国、韓国、ドイツからも出展が多かったようです。これは、</span><br />
<span style="font-size: medium;">EV/PHVなどの量産化に伴って、部品メーカーの技術力が高まってきたからかもしれません。</span><br />
<span style="font-size: medium;">日本も危ういところまできているような気がします。</span></p>
<p><span style="font-size: medium;">もう一つ、ちょっと気になったことが一つありました。それは「水素・燃料電池」の</span><br />
<span style="font-size: medium;">ブースで、ある企業が、FCVが途中で水素がなくなった場合を想定して、レスキューの</span><br />
<span style="font-size: medium;">機器を展示していました。キャンピングカーのように、車の後ろにタンクや圧縮機をつけて</span><br />
<span style="font-size: medium;">走るタイプです。</span></p>
<p><span style="font-size: medium;">ふと思ったのですが、ガソリン車では”ガス欠”、電気自動車では”電欠”と呼びますが、</span><br />
<span style="font-size: medium;">FCVでは何て呼ぶのでしょうか。”水素欠”でしょうか。それとも”ガス欠”でしょうか。</span></p>
<p><span style="font-size: medium;">まだまだ水素ステーションが少ないことから、このように実際の事象として”水素欠”</span><br />
<span style="font-size: medium;">が起きてしまうかもしれません。電気自動車の場合もそうでしたが、レスキューの場合</span><br />
<span style="font-size: medium;">までも想定し始めると、FCVもリアルワールドになってきたなと、思わずビリビリ！と</span><br />
<span style="font-size: medium;">きてしまった次第です。</span></p>
<p><span style="font-size: medium;">なお、帰って少し調べてみると、トヨタでは水素がなくなった場合、レッカーで牽引する</span><br />
<span style="font-size: medium;">ことを推奨しています。</span></p>
<p><span style="font-size: medium;">また、JAF等のロードサービス会社では、現在は法律により公道での水素補給は禁止されて</span><br />
<span style="font-size: medium;">いるとか。そうなると、このような”水素欠”の装置ができたとしても、まだ法律との</span><br />
<span style="font-size: medium;">乖離があり、しばらく折衝が続くのかもしれません。</span></p>
<p><span style="font-size: medium;">車両と水素ステーション以外にもいろいろ課題があることを知らされた一日でした。</span><br />
<span style="font-size: medium;">「スマートエネルギーWeek 2015」は2月27日までのようです。もしお時間あれば、</span><br />
<span style="font-size: medium;">一度のぞいてみてはいかがでしょうか。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://electrification-consulting.com/?feed=rss2&#038;p=2752</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2015年2月12日　和田憲一郎のビリビリ！とくる話</title>
		<link>http://electrification-consulting.com/?p=2730</link>
		<comments>http://electrification-consulting.com/?p=2730#comments</comments>
		<pubDate>Wed, 11 Feb 2015 22:00:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[最近の投稿]]></category>

		<guid isPermaLink="false">http://electrification-consulting.com/?p=2730</guid>
		<description><![CDATA[昨年、ある会社経営の方と面談する機会がありました。その方は稲盛和夫さんが 塾長を務める経営勉強会「盛和塾」の世話人もされているとのこと。 稲盛さんと言えば、2010年1月に会社更生法を申請し経営破綻したJALの会長を 引 [...]]]></description>
				<content:encoded><![CDATA[<p><span style="font-size: medium;">昨年、ある会社経営の方と面談する機会がありました。その方は稲盛和夫さんが</span><br />
<span style="font-size: medium;">塾長を務める経営勉強会「盛和塾」の世話人もされているとのこと。</span></p>
<p><span style="font-size: medium;">稲盛さんと言えば、2010年1月に会社更生法を申請し経営破綻したJALの会長を</span><br />
<span style="font-size: medium;">引き受け、短期間に再建されたことで有名です。</span></p>
<p><span style="font-size: medium;">ご本人はたいへんなご苦労があったようですが、「盛和塾」でも何とか稲盛さんを</span><br />
<span style="font-size: medium;">応援しようと「盛和塾 JALを支援する55万人有志の会 JAL応援団」というのを結成</span><br />
<span style="font-size: medium;">したそうです。ちょうど塾生が約5500名なので、塾生一人ひとりが100名ほどに声を</span><br />
<span style="font-size: medium;">かけると55万人になるとのこと。</span></p>
<p><span style="font-size: medium;">それで、JAL応援団として何をしたかと言えば、できるだけJALに乗るということと、</span><br />
<span style="font-size: medium;">事務局が名刺サイズの「応援メッセージカード」を作り、塾生はJALに乗ったとき、</span><br />
<span style="font-size: medium;">地上勤務の方やCAに対し、もう少しこうしたほうが良かったのではと思うことや、</span><br />
<span style="font-size: medium;">気づき事項などをメモ書きし、励ましの言葉も添えて渡したようです。</span></p>
<p><span style="font-size: medium;">最初はJALの方もビックリしていたようですが、途中からコメントがデータベース化</span><br />
<span style="font-size: medium;">され、指摘された内容が横展開されていたとのこと。</span></p>
<p><span style="font-size: medium;">既にご存知の方もいるかもしれませんが、私は初めて聞いた話だったので、短期間の</span><br />
<span style="font-size: medium;">再建の裏にこのような話があったのかと、思わずビリビリ！ときてしまいました。</span></p>
<p><span style="font-size: medium;">支援と言えば、直ぐに金銭的なモノを思い出しますが、このようにFace to Faceで</span><br />
<span style="font-size: medium;">直接言われることが最も効くのかもしれません。</span></p>
<p><span style="font-size: medium;">現在回復基調とは言え、JALもまだまだ気を抜くことはできないと思えます。</span><br />
<span style="font-size: medium;">稲盛さんがよく説かれるように、利他の心で対応することで、さらに良い方向に</span><br />
<span style="font-size: medium;">向かっていくのではないでしょうか。</span></p>
<p><span style="font-size: medium;">ちなみに、JALが提唱している行動指針（フィロソフィと呼んでいるようですが）で</span><br />
<span style="font-size: medium;">私が気にいっている言葉は「一人ひとりがJAL」です。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://electrification-consulting.com/?feed=rss2&#038;p=2730</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>雑誌『プレジデント』からのクラウド対応型蓄電池に関する取材対応</title>
		<link>http://electrification-consulting.com/?p=2655</link>
		<comments>http://electrification-consulting.com/?p=2655#comments</comments>
		<pubDate>Sun, 08 Feb 2015 00:32:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[最近の投稿]]></category>

		<guid isPermaLink="false">http://electrification-consulting.com/?p=2655</guid>
		<description><![CDATA[雑誌『プレジデント』からクラウド対応型蓄電池に関する取材があり、今月号にその内容が掲載されました。 今後このような機能はますます増加していくものと思われます。  ]]></description>
				<content:encoded><![CDATA[<p><span style="color: #000000; font-size: medium;">雑誌『プレジデント』からクラウド対応型蓄電池に関する取材があり、今月号にその内容が掲載されました。</span></p>
<p><span style="color: #000000; font-size: medium;">今後このような機能はますます増加していくものと思われます。</span></p>
<p><span style="color: #000000; font-size: medium;"><a href="http://electrification-consulting.com/wp/wp-content/uploads/2015/02/Final-S.jpg"><img class="size-large wp-image-2656 aligncenter" alt="Final-S" src="http://electrification-consulting.com/wp/wp-content/uploads/2015/02/Final-S-1024x681.jpg" width="649" height="431" /></a></span></p>
<p><span style="color: #000000; font-size: medium;"> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://electrification-consulting.com/?feed=rss2&#038;p=2655</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2015年1月26日　和田憲一郎のビリビリ！とくる話</title>
		<link>http://electrification-consulting.com/?p=2623</link>
		<comments>http://electrification-consulting.com/?p=2623#comments</comments>
		<pubDate>Mon, 26 Jan 2015 08:27:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[最近の投稿]]></category>

		<guid isPermaLink="false">http://electrification-consulting.com/?p=2623</guid>
		<description><![CDATA[昨年から、インターネットとモノが繋がるIoT(Internet of Things)の時代が 来ると言われています。しかし、本命と言われていたグーグルグラスは、直前にて、 発売中止に追い込まれました。内蔵カメラによる隠し [...]]]></description>
				<content:encoded><![CDATA[<p><span style="font-size: medium;">昨年から、インターネットとモノが繋がるIoT(Internet of Things)の時代が</span><br />
<span style="font-size: medium;">来ると言われています。しかし、本命と言われていたグーグルグラスは、直前にて、</span><br />
<span style="font-size: medium;">発売中止に追い込まれました。内蔵カメラによる隠し撮りで、プライバシーを</span><br />
<span style="font-size: medium;">侵害するおそれが高いことが理由のようです。</span></p>
<p><span style="font-size: medium;">では、今年、モビリティ関連で何が流行るのでしょうか。</span><br />
<span style="font-size: medium;">私が勝手に想像するに、きっと『ジェスチャー』ではないでしょうか。</span></p>
<p><span style="font-size: medium;">思わず、何それ？と聞かれるかもしれませんが、昨年からナビの代わりに、</span><br />
<span style="font-size: medium;">ヘッドアップディスプイを用いて、音声とジェスチャーを使った操作方法が</span><br />
<span style="font-size: medium;">提案されています。</span></p>
<p><span style="font-size: medium;">有名なのは米国ベンチャー企業の「Navdy」です。</span><br />
<span style="font-size: medium;">下にあるHPを見ていただけると判るかもしれませんが、このようなモノが普及すると、</span><br />
<span style="font-size: medium;">音声とジェスチャーでほとんど事足りてしまい、今のナビが本当に必要なのかと</span><br />
<span style="font-size: medium;">思ってしまいます。</span></p>
<p><span style="font-size: medium;">Navdyは本年に製品を売り出すとともに、自動車メーカーからも標準搭載を</span><br />
<span style="font-size: medium;">検討している企業があるとか。</span></p>
<p><span style="font-size: medium;">この企業以外にも、ジェスチャーを研究している企業が多いのではないでしょうか。</span><br />
<span style="font-size: medium;">そのうちに、クルマの中で、iPhoneで横にスライドする「スワイプ」や、Facebookの</span><br />
<span style="font-size: medium;">「いいね！」のジェスチャーをしている人が増えるのかもしれません。</span></p>
<p><span style="font-size: medium;">IoTの時代とは、ジェスチャーの上手い人と、そうでない人がいる時代！　</span><br />
<span style="font-size: medium;">ひょっとしたら、ジェスチャーの練習をしなければならない時代なのでしょうか。</span></p>
<p><span style="font-size: medium;">ふぅ、今から指の練習をしておかないと・・・。</span></p>
<p><span style="font-size: medium;">＜ご参考＞</span></p>
<p><span style="font-size: medium;">https://www.navdy.com/</span></p>
]]></content:encoded>
			<wfw:commentRss>http://electrification-consulting.com/?feed=rss2&#038;p=2623</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
