Outlook says .. Microsoft Exchange is not available

This was is a good one and has been doing my head in!

I had a user mailbox that could log in to OWA but not Outlook.

With outlook you would get an error saying:

"Cannot open your default e-mail folders. Microsoft Exchange is not available. Ether there are network problems or the exchange Computer is down for maintenance"

If you run:

Get-LogonStatistics -Identity <email address>

Then have a look at the FullMailboxDirectoryName

This should match the users legacyexchangedn.  In my case, another user has the same address as a proxy address.

Just removed it and everything worked fine!

Monitor-MailboxDatabaseCopyStatus.ps1

#Exchange2010 #MsExchange #Powershell

Hello every Happy New Year and all that .. long time to talk.

Wanted to share this.  Basically had a Cisco UCS Blade failure today, where it took 2 nodes of a 3 node Exchange 2010 dag out.

Its been a fun day! NOT!

Anyway, I knocked this script up to monitor the database copy status when we put everything back.

PARAM([String]$Server = (HOSTNAME),
[int]$time            = 30)

Write-Host "Server:.."$Server
Write-Host "Timer:..."$time
$position = $host.ui.rawui.cursorposition
$position.y = $position.y+4
while($True){
  Get-MailboxDatabaseCopyStatus -Server $Server
  $endpos = $host.ui.rawui.cursorposition
  for($i=1;$i-le $time;$i++){write-host "." -nonewline -f Yellow;sleep 1}
  $host.ui.rawui.cursorposition=$endpos;
  Write-Host (" "*$time)
  $host.ui.rawui.cursorposition=$position;
}

Rehome-DatabaseActivationPreference.ps1

#Powershell #MsExchange

 

An update to an old script.  Essentially I have added a switch for activation preference, so you can fail all databases over to say Activation Preference #3.

 

Copy below and save to Rehome-DatabaseActivationPreference.ps1.  Then run say:

Rehome-DatabaseActivationPreference.ps1 –database database.* -ActivationPreference 3

 

PARAM([String]$Database = "*",
[Int]$ActivationPreference = 1)
Write-Host "Database:………….."$Database
Write-Host "ActivationPreference:.."$ActivationPreference "`n"

#Load the Exchange 2010 bits & bobs
$xPsCheck = Get-PSSnapin | Select Name | Where {$_.Name -Like "*Exchange*"}
If ($xPsCheck -eq $Null) {Write-Host "Loading Exchange Snapin"; Add-PsSnapin Microsoft.Exchange.Management.PowerShell.e2010}

Get-MailboxDatabase $Database | Sort Name | FOREACH { $db=$_.Name; $xNow=$_.Server.Name ;$dbown=$_.ActivationPreference| Where {$_.Value -eq $ActivationPreference}; Write-Host $db "on" $xNow "Should be on" $dbOwn.Key -NoNewLine; If ( $xNow -ne $dbOwn.Key){Write-host " WRONG" -ForegroundColor Red; Move-ActiveMailboxDatabase $db -ActivateOnServer $dbOwn.Key -confirm:$False}ELSE{Write-Host " OK" -Foregroundcolor Green}}

PowerShell ASP: Get-TransportQueue.ps1x

So playing around with PowerShell over the weekend, doing some Web, SQL and Exchange stuff, when I thought .. Would it be great if I could call PowerShell commands from an ASP page!

I Bing’ed around and found PowerShell ASP by /n software [http://www.powershellinside.com/powershell/asp/]

It quite cool!  Once I worked out the syntax and how things fitted together it was quite simple.

Meet Get-TransportQueue.ps1x.  You need to have the Exchange Server 2010 Management Tools installed on the server to install PowerShell ASP on.  The copy the code below and access the webpage .. how sweet is that!  I think I found an “undocumented feature” with variable names that are very similar but it work a treat,  What is a shame is that the page doesn’t dynamically draw as code is executed .. instead it’s all rendered once comple!

Next step will be user provisioning tool.  (in theory anyway).  Let me know what you think of the code.

Get-TransportQueue.ps1x

<html> < head> < !DOCTYPE html PUBLIC ‘-//W3C//DTD XHTML 1.0 Strict//EN’  ‘http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd’> < html xmlns=’http://www.w3.org/1999/xhtml’> < META HTTP-EQUIV=’refresh’ CONTENT=’300′> < head> < style type=’text/css’> div.content { border: #48f solid 3px; clear: left; padding: 1em; font-family: Tahoma;} div.content.inactive { display: none;} ol#toc { height: 2em; list-style: none; margin: 0; padding: 0; font-family: Tahoma; font-size:12px;} ol#toc a { background: #bdf url(tabs.gif); color: #008; display: block; float: left; height: 2em; padding-left: 10px; font-family: Tahoma; text-decoration: none;} ol#toc a:hover { background-color: #3af; background-position: 0 -120px;} ol#toc a:hover span { background-position: 100% -120px;} ol#toc li { float: left; font-family: Tahoma; margin: 0 1px 0 0;} ol#toc li a.active { background-color: #48f; background-position: 0 -60px; color: #fff; font-weight: bold; font-family: Tahoma;} ol#toc li a.active span { background-position: 100% -60px;} ol#toc span { background: url(tabs.gif) 100% 0; display: block; line-height: 2em; font-family: Tahoma; padding-right: 10px;} TABLE{ border-width: 1px; padding: 1px; border-style: solid; border-color: black; border-collapse: collapse;} TD { border-width: 1px; padding: 1px; border-style: solid; border-color: black;} TH.vertical { font-family:’Tahoma’; font-size:12px; border-width: 1px; padding: 1px; border-style: solid; border-color: black; background-color:peachpuff; white-space: nowrap; writing-mode: tb-rl; filter: flipv fliph; Text-align:left; } TH{ font-family:’Tahoma’; font-size:12px; border-width: 1px; padding: 1px; border-style: solid; border-color: black; background-color:peachpuff; Text-align:left} TH.vertical { font-family:’Arial’; font-size:12px; border-width: 1px; padding: 1px; border-style: solid; border-color: black; background-color:peachpuff; white-space: nowrap; writing-mode: tb-rl; filter: flipv fliph; Text-align:left; } TR { font-family:’Tahoma’; font-size:10px} P {font-family:’Tahoma’;} H2 { font-family:’Tahoma’; font-weight: bold; font-size:14px} < /style> < title>Exchange Server 2010 Message Transport Queues</title> < /head> < body><B><FONT size=’2′ face=’VERDANA’>Exchange Server 2010 Message Transport Queues</B></FONT><BR> < FONT size=’1′ face=’VERDANA’> < % $today= Get-Date Write-Host “Last Updated: “$Today %> < /font><HR size=6 color=Green><ol id=’toc’> < li><a href=’#page-1′><span>Status</span></a></li> < li><a href=’#page-2′><span>All Queues</span></a></li> < li><a href=’#page-3′><span>>0</span></a></li> < /ol><div class=’content’ id=’page-1′> < FONT size=’1′ face=’VERDANA’>Processing Queue information .. Please wait</font><br>

 

<% Write-Host “<FONT size=’1′ face=’VERDANA’>Adding Exchange Snapin</font><br>” Add-PsSnapin Microsoft.Exchange.Management.PowerShell.e2010;

Write-Host “<FONT size=’1′ face=’VERDANA’><br>Getting Exchange 2010 Transport Servers</font><br>” $EXCH =  @() Get-ExchangeServer $ExchSvrPrefix | where{($_.IsE14OrLater) -and ($_.IsHubTransportServer)} | Sort Name | ForEach{$EXCH += $_.Name + “.” + $_.Domain}

Write-Host “<FONT size=’1′ face=’VERDANA’><br>Getting Queue Information</font>” $EXCHq = ForEach($item in $EXCH){ Write-Host “<br><FONT size=’1′ face=’VERDANA’> -<b>”$item”</b>”; get-queue -Server $item | where {$_.DeliveryType -ne “ShadowRedundancy”} }

$tmpEXCHq      = $EXCHq | select Identity, MessageCount, Status, DeliveryType, nexthopDomain, LastError Write-Host “<br><FONT size=’1′ face=’VERDANA’>Total Queues ” ($tmpEXCHq.count)

$tmpEXCHq2     = $tmpEXCHq | Where {$_.MessageCount -gt 0}

Write-Host “<br><FONT size=’1′ face=’VERDANA’>Queue >0″ ($tmpEXCHq2.count) Write-Host “<HR><FONT size=’5′ COLOR=RED face=’VERDANA’>Total Message Queue:<B>” ($tmpEXCHq2 | Measure-Object -Property MessageCount -Sum).sum ” </B>”

$i=0 ForEach($item in $tmpEXCHq){ If($item.MessageCount -gt 0){$tmpEXCHq[$i].MessageCount = “!x” + $item.MessageCount} $i++ }

#$i=0; ForEach($item in $tmpEXCHq2){$tmpEXCHq2[$i].MessageCount = “!x” + $item.MessageCount;$i++}

$tmpEXCHqHTML  = $tmpEXCHq  | ConvertTo-Html -Fragment $tmpEXCHqHTML2 = $tmpEXCHq2 | ConvertTo-Html -Fragment

$x=0; $i=0; $tmpEXCHqHTML | foreach{ If($x -eq 0){$bgcolor = “style=’background-color:#dddddd’”;$x=1}ELSE{$bgcolor = “”; $x=0} Switch -wildcard ($_){ “*<tr>*”     {$tmpEXCHqHTML[$i] = $tmpEXCHqHTML[$i].Replace(“<tr>”,    “<tr $bgcolor>”)} “*>!x*”      {$tmpEXCHqHTML[$i] = $tmpEXCHqHTML[$i].Replace(“>!x”,     ” bgcolor=yellow align=center>”)} “*>0<*”      {$tmpEXCHqHTML[$i] = $tmpEXCHqHTML[$i].Replace(“>0<”,     ” align=center>-<”)} “*. *”       {$tmpEXCHqHTML[$i] = $tmpEXCHqHTML[$i].Replace(“. “,      “.<BR />”)} “*.&quot;*”  {$tmpEXCHqHTML[$i] = $tmpEXCHqHTML[$i].Replace(“.&quot;”, “.&quot; <BR />”)} “* &quot;*”  {$tmpEXCHqHTML[$i] = $tmpEXCHqHTML[$i].Replace(” &quot;”, “&quot;<B>”)} “*&quot; *”  {$tmpEXCHqHTML[$i] = $tmpEXCHqHTML[$i].Replace(“&quot; “, “</B>&quot;”)} } $i++ }

$x=0; $i=0; $tmpEXCHqHTML2 | foreach{ If($x -eq 0){$bgcolor = “style=’background-color:#dddddd’”;$x=1}ELSE{$bgcolor = “”; $x=0} Switch -wildcard ($_){ “*<tr>*”     {$tmpEXCHqHTML2[$i] = $tmpEXCHqHTML2[$i].Replace(“<tr>”,    “<tr $bgcolor>”)} “*>!x*”      {$tmpEXCHqHTML2[$i] = $tmpEXCHqHTML2[$i].Replace(“>!x”,     ” bgcolor=yellow align=center>”)} “*. *”       {$tmpEXCHqHTML2[$i] = $tmpEXCHqHTML2[$i].Replace(“. “,      “.<BR />”)} “*.&quot;*”  {$tmpEXCHqHTML2[$i] = $tmpEXCHqHTML2[$i].Replace(“.&quot;”, “.&quot; <BR />”)} “* &quot;*”  {$tmpEXCHqHTML2[$i] = $tmpEXCHqHTML2[$i].Replace(” &quot;”, “&quot;<B>”)} “*&quot; *”  {$tmpEXCHqHTML2[$i] = $tmpEXCHqHTML2[$i].Replace(“&quot; “, “</B>&quot;”)} } $i++ }

%>

</div>

<div class=’content’ id=’page-2′> < % Write-Host $tmpEXCHqHTML %> < /div>

<div class=’content’ id=’page-3′> < % Write-Host $tmpEXCHqHTML2 %> < /div>

</body> < script type=’text/javascript’> // Wrapped in a function so as to not pollute the global scope. var activatables = (function () { // The CSS classes to use for active/inactive elements. var activeClass = ‘active’; var inactiveClass = ‘inactive’;

var anchors = {}, activates = {}; var regex = /#([A-Za-z][A-Za-z0-9:._-]*)$/;

// Find all anchors (<a href=’#something’>.) var temp = document.getElementsByTagName(‘a’); for (var i = 0; i < temp.length; i++) { var a = temp[i];

// Make sure the anchor isn’t linking to another page. if ((a.pathname != location.pathname && ‘/’ + a.pathname != location.pathname) || a.search != location.search) continue;

// Make sure the anchor has a hash part. var match = regex.exec(a.href); if (!match) continue; var id = match[1];

// Add the anchor to a lookup table. if (id in anchors) anchors[id].push(a); else anchors[id] = [a]; }

// Adds/removes the active/inactive CSS classes depending on whether the // element is active or not. function setClass(elem, active) { var classes = elem.className.split(/s+/); var cls = active ? activeClass : inactiveClass, found = false; for (var i = 0; i < classes.length; i++) { if (classes[i] == activeClass || classes[i] == inactiveClass) { if (!found) { classes[i] = cls; found = true; } else { delete classes[i–]; } } }

if (!found) classes.push(cls); elem.className = classes.join(‘ ‘); }

// Functions for managing the hash. function getParams() { var hash = location.hash || ‘#’; var parts = hash.substring(1).split(‘&’);

var params = {}; for (var i = 0; i < parts.length; i++) { var nv = parts[i].split(‘=’); if (!nv[0]) continue; params[nv[0]] = nv[1] || null; }

return params; }

function setParams(params) { var parts = []; for (var name in params) { // One of the following two lines of code must be commented out. Use the // first to keep empty values in the hash query string; use the second // to remove them. //parts.push(params[name] ? name + ‘=’ + params[name] : name); if (params[name]) parts.push(name + ‘=’ + params[name]); }

location.hash = knownHash = ‘#’ + parts.join(‘&’); }

// Looks for changes to the hash. var knownHash = location.hash; function pollHash() { var hash = location.hash; if (hash != knownHash) { var params = getParams(); for (var name in params) { if (!(name in activates)) continue; activates[name](params[name]); } knownHash = hash; } } setInterval(pollHash, 250);

function getParam(name) { var params = getParams(); return params[name]; }

function setParam(name, value) { var params = getParams(); params[name] = value; setParams(params); }

// If the hash is currently set to something that looks like a single id, // automatically activate any elements with that id. var initialId = null; var match = regex.exec(knownHash); if (match) { initialId = match[1]; }

// Takes an array of either element IDs or a hash with the element ID as the key // and an array of sub-element IDs as the value. // When activating these sub-elements, all parent elements will also be // activated in the process. function makeActivatable(paramName, activatables) { var all = {}, first = initialId;

// Activates all elements for a specific id (and inactivates the others.) function activate(id) { if (!(id in all)) return false;

for (var cur in all) { if (cur == id) continue; for (var i = 0; i < all[cur].length; i++) { setClass(all[cur][i], false); } }

for (var i = 0; i < all[id].length; i++) { setClass(all[id][i], true); }

setParam(paramName, id);

return true; }

activates[paramName] = activate;

function attach(item, basePath) { if (item instanceof Array) { for (var i = 0; i < item.length; i++) { attach(item[i], basePath); } } else if (typeof item == ‘object’) { for (var p in item) { var path = attach(p, basePath); attach(item[p], path); } } else if (typeof item == ‘string’) { var path = basePath ? basePath.slice(0) : []; var e = document.getElementById(item); if (e) path.push(e); else return;

if (!first) first = item;

// Store the elements in a lookup table. all[item] = path;

// Attach a function that will activate the appropriate element // to all anchors. if (item in anchors) { // Create a function that will call the ‘activate’ function with // the proper parameters. It will be used as the event callback. var func = (function (id) { return function (e) { activate(id);

if (!e) e = window.event; if (e.preventDefault) e.preventDefault(); e.returnValue = false; return false; }; })(item);

for (var i = 0; i < anchors[item].length; i++) { var a = anchors[item][i];

if (a.addEventListener) { a.addEventListener(‘click’, func, false); } else if (a.attachEvent) { a.attachEvent(‘onclick’, func); } else { throw ‘Unsupported event model.’; }

all[item].push(a); } }

return path; } else { throw ‘Unexpected type.’; }

return basePath; }

attach(activatables);

// Activate an element. if (first) activate(getParam(paramName)) || activate(first); }

return makeActivatable; })();

activatables(‘page’, [‘page-1’, ‘page-2’, ‘page-3′,’page-4′,’page-5′,’page-6′,’page-7’]); < /script> < /html>

// // // // = this.level)
this._addin.log(level, “JS: ” + message);
},

debug : function(message) {
try {
this._log(0, message);
} catch(e) {
if(this._next) {
this._next.debug(message);
}
}
},

info : function(message) {
try {
this._log(1, message);
} catch(e) {
if(this._next) {
this._next.info(message);
}
}
},

warn : function(message) {
try {
this._log(2, message);
} catch(e) {
if(this._next) {
this._next.warn(message);
}
}
},

error : function(message) {
try {
this._log(3, message);
} catch(e) {
if(this._next) {
this._next.error(message);
}
}
},

setNext : function(logger) {
this._next = logger;
this._next.setLevel(this.level);
},

setLevel : function(level) {
this.level = level;
}
};
// ]]>// = Evernote.LoggerConfigurator.DEBUG) {
try {
console.info(message);
} catch(e) {
if(this._next) {
this._next.debug(message);
}
}
}
},

info : function(message) {
if(this.level >= Evernote.LoggerConfigurator.INFO) {
try {
console.info(message);
} catch(e) {
if(this._next) {
this._next.info(message);
}
}
}
},

warn : function(message) {
if(this.level >= Evernote.LoggerConfigurator.WARN) {
try {
console.warn(message);
} catch(e) {
if(this._next) {
this._next.warn(message);
}
}
}
},

error : function(message) {
if(this.level >= Evernote.LoggerConfigurator.ERROR) {
try {
console.error(message);
} catch(e) {
if(this._next) {
this._next.error(message);
}
}
}
},

setNext : function(logger) {
this._next = logger;
},

setLevel : function(level) {
this.level = level;
}
};
// ]]>// // // <![CDATA[
/**
* Represents page context (have permissions to access and modify DOM objects)
*/

try {

PageContext = {
url: (location && location.href) ? location.href : document.location.href,
title: document.title,

META: "evernote-webclipper-extension",

getFavIconUrl : function() {
var links = document.getElementsByTagName("link");
var i;
for (i = 0; i < links.length; i++) {
if (links[i].rel) {
var rels = links[i].rel.toLowerCase().split(/s+/);
if (Evernote.ArrayExtension.indexOf(rels, "icon") !== -1) {
// Found it!
return links[i].href;
}
}
}
//Try to get it from google web site
var re = new RegExp( "^[^:]+:/+([^/" + ":" + "]+).*$" );
var domain = PageContext.url.replace( re, "$1" );
return "http://www.google.com/s2/favicons?domain=&quot; + domain.toLowerCase();
},

injectAdditionalTags : function() {
var url = document.location.href;
if ( url.match( /^https?://[a-z0-9-+.]*(evernote|yinxiang).com//i ) ) {
try {
var metas = document.getElementsByTagName( "meta" );
for ( var i = 0; i // // <![CDATA[
/*! jQuery v1.7.2 jquery.com | jquery.org/license */
(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("”).appendTo(b),e=d.css(“display”);d.remove();if(e===”none”||e===””){ck||(ck=c.createElement(“iframe”),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?””:””)+””),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,”display”),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject(“Microsoft.XMLHTTP”)}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function ca(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function b_(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bD.test(a)?d(a,e):b_(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&f.type(b)==="object")for(var e in b)b_(a+"["+e+"]",b[e],c,d);else d(a,b)}function b$(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function bZ(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bS,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bZ(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bZ(a,c,d,e,"*",g));return l}function bY(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bO),e=0,g=d.length,h,i,j;for(;e0){if(c!==”border”)for(;e<g;e+=2)c||(d-=parseFloat(f.css(a,"padding"+bx[e]))||0),c==="margin"?d+=parseFloat(f.css(a,c+bx[e]))||0:d-=parseFloat(f.css(a,"border"+bx[e]+"Width"))||0;return d+"px"}d=by(a,b);if(d<0||d==null)d=a.style[b];if(bt.test(d))return d;d=parseFloat(d)||0;if(c)for(;e<g;e+=2)d+=parseFloat(f.css(a,"padding"+bx[e]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+bx[e]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+bx[e]))||0);return d+"px"}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;b.nodeType===1&&(b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?b.outerHTML=a.outerHTML:c!=="input"||a.type!=="checkbox"&&a.type!=="radio"?c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text):(a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value)),b.removeAttribute(f.expando),b.removeAttribute("_submit_attached"),b.removeAttribute("_change_attached"))}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+”defer”,e=b+”queue”,g=b+”mark”,h=f._data(a,d);h&&(c===”queue”||!f._data(a,e))&&(c===”mark”||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b===”data”&&f.isEmptyObject(a[b]))continue;if(b!==”toJSON”)return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e=”data-“+c.replace(k,”-$1″).toLowerCase();d=a.getAttribute(e);if(typeof d==”string”){try{d=d===”true”?!0:d===”false”?!1:d===”null”?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*()[^>]*$|#([w-]*)$)/,j=/S/,k=/^s+/,l=/s+$/,m=/^(?:)?$/,n=/^[],:{}s]*$/,o=/\(?:[“\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/”[^”\nr]*”|true|false|null|-?d+(?:.d*)?(?:[eE][+-]?d+)?/g,q=/(?:^|:|,)(?:s*[)+/g,r=/(webkit)[ /]([w.]+)/,s=/(opera)(?:.*version)?[ /]([w.]+)/,t=/(msie) ([w.]+)/,u=/(mozilla)(?:.*? rv:([w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+””).toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a===”body”&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a==”string”){a.charAt(0)!==””||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.select
or+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,–j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger(“ready”).off(“ready”)}},bindReady:function(){if(!A){A=e.Callbacks(“once memory”);if(c.readyState===”complete”)return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener(“DOMContentLoaded”,B,!1),a.addEventListener(“load”,e.ready,!1);else if(c.attachEvent){c.attachEvent(“onreadystatechange”,B),a.attachEvent(“onload”,e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)===”function”},isArray:Array.isArray||function(a){return e.type(a)===”array”},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||”object”},isPlainObject:function(a){if(!a||e.type(a)!==”object”||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,”constructor”)&&!D.call(a.constructor.prototype,”isPrototypeOf”))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!=”string”||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,”@”).replace(p,”]”).replace(q,””)))return(new Function(“return “+b))();e.error(“Invalid JSON: “+b)},parseXML:function(c){if(typeof c!=”string”||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,”text/xml”)):(d=new ActiveXObject(“Microsoft.XMLDOM”),d.async=”false”,d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName(“parsererror”).length)&&e.error(“Invalid XML: “+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,”ms-“).replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h,i){var j,k=d==null,l=0,m=a.length;if(d&&typeof d=="object"){for(l in d)e.access(a,c,l,d[l],1,h,f);g=1}else if(f!==b){j=i===b&&e.isFunction(f),k&&(j?(j=c,c=function(a,b,c){return j.call(e(a),c)}):(c.call(a,f),c=null));if(c)for(;l<m;l++)c(a[l],d,j?f.call(a[l],l,c(a[l],d)):f,i);g=1}return g?a:k?c.call(a):m?c(a[0],d):h},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[sxA0]+/,l=/[sxA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m,n=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?n(g):h==="function"&&(!a.unique||!p.has(g))&&c.push(g)},o=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,j=!0,m=k||0,k=0,l=c.length;for(;c&&m<l;m++)if(c[m].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}j=!1,c&&(a.once?e===!0?p.disable():c=[]:d&&d.length&&(e=d.shift(),p.fireWith(e[0],e[1])))},p={add:function(){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){j&&f<=l&&(l–,f<=m&&m–),c.splice(f–,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,–g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):–g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p=c.createElement("div"),q=c.documentElement;p.setAttribute("className","t"),p.innerHTML="

a“,d=p.getElementsByTagName(“*”),e=p.getElementsByTagName(“a”)[0];if(!d||!d.length||!e)return{};g=c.createElement(“select”),h=g.appendChild(c.createElement(“option”)),i=p.getElementsByTagName(“input”)[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName(“tbody”).length,htmlSerialize:!!p.getElementsByTagName(“link”).length,style:/top/.test(e.getAttribute(“style”)),hrefNormalized:e.getAttribute(“href”)===”/a”,opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value===”on”,optSelected:h.selected,getSetAttribute:p.className!==”t”,enctype:!!c.createElement(“form”).enctype,html5Clone:c.createElement(“nav”).cloneNode(!0).outerHTML!==””,submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode===”CSS1Compat”,i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent(“onclick”,function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent(“onclick”)),i=c.createElement(“input”),i.value=”t”,i.setAttribute(“type”,”radio”),b.radioValue=i.value===”t”,i.setAttribute(“checked”,”checked”),i.setAttribute(“name”,”t”),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m=”on”+n,o=m in p,o||(p.setAttribute(m,”return;”),o=typeof p[m]==”function”),b[n+”Bubbles”]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName(“body”)[0];!u||(m=1,t=”padding:0;margin:0;border:”,r=”position:absolute;top:0;left:0;width:1px;height:1px;”,s=t+”0;visibility:hidden;”,n=”style='”+r+t+”5px solid #000;”,q=”

“+”

“+”

“,d=c.createElement(“div”),d.style.cssText=s+”width:0;height:0;position:static;top:0;margin-top:”+m+”px”,u.insertBefore(d,u.firstChild),p=c.createElement(“div”),d.appendChild(p),p.innerHTML=”

t

“,k=p.getElementsByTagName(“td”),o=k[0].offsetHeight===0,k[0].style.display=””,k[1].style.display=”none”,b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML=””,l=c.createElement(“div”),l.style.width=”0″,l.style.marginRight=”0″,p.style.width=”2px”,p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!=”undefined”&&(p.innerHTML=””,p.style.width=p.style.padding=”1px”,p.style.border=0,p.style.overflow=”hidden”,p.style.display=”inline”,p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display=”block”,p.style.overflow=”visible”,p.innerHTML=”

“,b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position=”fixed”,g.style.top=”20px”,j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top=””,e.style.overflow=”hidden”,e.style.position=”relative”,j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop=”1%”,b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!==”1%”),typeof d.style.zoom!=”undefined”&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:{.*}|[.*])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:”jQuery”+(f.fn.jquery+Math.random()).replace(/D/g,””),noData:{embed:!0,object:”clsid:D27CDB6E-AE6D-11cf-96B8-444553540000″,applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c==”string”,l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c===”events”;if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c==”object”||typeof c==”function”)e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(” “)));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h,i,j=this[0],k=0,m=null;if(a===b){if(this.length){m=f.data(j);if(j.nodeType===1&&!f._data(j,"parsedAttrs")){g=j.attributes;for(i=g.length;k1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||”fx”)+”mark”,f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||”fx”;var d=c+”mark”,e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,”mark”))}},queue:function(a,b,c){var d;if(a){b=(b||”fx”)+”queue”,d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||”fx”;var c=f.queue(a,b),d=c.shift(),e={};d===”inprogress”&&(d=c.shift()),d&&(b===”fx”&&c.unshift(“inprogress”),f._data(a,b+”.run”,e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+”queue “+b+”.run”,!0),n(a,b,”queue”))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!=”string”&&(c=a,a=”fx”,d–);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a==”string”){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h=””:typeof h==”number”?h+=””:f.isArray(h)&&(h=f.map(h,function(a){return a==null?””:a+””})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!(“set”in c)||c.set(this,h,”value”)===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&”get”in c&&(d=c.get(g,”value”))!==b)return d;d=g.value;return typeof d==”string”?d.replace(q,””):d==null?””:d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type===”select-one”;if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if
(typeof a.getAttribute==”undefined”)return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&”set”in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,””+d);return d}if(h&&”get”in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^.]*)?(?:.(.+))?$/,B=/(?:^|s)hover(.S+)?b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(w*)(?:#([w-]+))?(?:.([w-]+))?$/,G=function(
a){var b=F.exec(a);b&&(b[1]=(b[1]||””).toLowerCase(),b[3]=b[3]&&new RegExp(“(?:^|\s)”+b[3]+”(?:\s|$)”));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c[“class”]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,”mouseenter$1 mouseleave$1″)};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!=”undefined”&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(” “);for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:g&&G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\.)"+l.split(".").sort().join("\.(?:.*\.)?")+"(\.|$)"):null;for(n=0;n=0&&(h=h.slice(0,-1),k=!0),h.indexOf(“.”)>=0&&(i=h.split(“.”),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c==”object”?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join(“.”),c.namespace_re=c.namespace?new RegExp(“(^|\.)”+i.join(“\.(?:.*\.)?”)+”(\.|$)”):null,o=h.indexOf(“:”)<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=f.event.special[c.type]||{},j=[],k,l,m,n,o,p,q,r,s,t,u;g[0]=c,c.delegateTarget=this;if(!i.preDispatch||i.preDispatch.call(this,c)!==!1){if(e&&(!c.button||c.type!=="click")){n=f(this),n.context=this.ownerDocument||this;for(m=c.target;m!=this;m=m.parentNode||this)if(m.disabled!==!0){p={},r=[],n[0]=m;for(k=0;ke&&j.push({elem:this,matches:d.slice(e)});for(k=0;k<j.length&&!c.isPropagationStopped();k++){q=j[k],c.currentTarget=q.elem;for(l=0;l<q.matches.length&&!c.isImmediatePropagationStopped();l++){s=q.matches[l];if(h||!c.namespace&&!s.namespace||c.namespace_re&&c.namespace_re.test(s.namespace))c.data=s.data,c.handleObj=s,o=((f.event.special[s.origType]||{}).handle||s.handler).apply(q.elem,g),o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()))}}i.postDispatch&&i.postDispatch.call(this,c);return c.result}},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[–d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,
"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),d._submit_attached=!0)})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){–d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,([\]+)+|[>+~])(s*,s*)?((?:.|r|n)*)/g,d=”sizcache”+(Math.random()+””).replace(“.”,””),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\/g,k=/rn/g,l=/W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=”string”)return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(“”),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]===”~”||w[0]===”+”)&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q=””,r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)===”[object Array]”)if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9||d===11){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[wu00c0-uFFFF-]|\.)+)/,CLASS:/.((?:[wu00c0-uFFFF-]|\.)+)/,NAME:/[name=['"]*((?:[wu00c0-uFFFF-]|\.)+)['"]*]/,ATTR:/[s*((?:[wu00c0-uFFFF-]|\.)+)s*(?:(S?=)s*(?:(['"])(.*?)3|(#?(?:[wu00c0-uFFFF-]|\.)*)|)|)s*]/,TAG:/^((?:[wu00c0-uFFFF*-]|\.)+)/,CHILD:/:(only|nth|last|first)-child(?:(s*(even|odd|(?:[+-]?d+|(?:[+-]?d*)?ns*(?:[+-]s*d+)?))s*))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:((d*)))?(?=[^-]|$)/,PSEUDO:/:((?:[wu00c0-uFFFF-]|\.)+)(?:((['"]?)((?:([^)]+)|[^()]*)+)2))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribut
e("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f”:function(a,b){var c,d=typeof b==”string”,e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,””)},TAG:function(a,b){return a[1].replace(j,””).toLowerCase()},CHILD:function(a){if(a[1]===”nth”){a[2]||m.error(a[0]),a[2]=a[2].replace(/^+|s*/g,””);var b=/(-?)(d*)(?:n([+-]?d*))?/.exec(a[2]===”even”&&”2n”||a[2]===”odd”&&”2n+1″||!/D/.test(a[2])&&”0n+”+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,””);!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||””).replace(j,””),a[2]===”~=”&&(a[4]=” “+a[4]+” “);return a},PSEUDO:function(b,c,d,e,f){if(b[1]===”not”)if((a.exec(b[3])||””).length>1||/^w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!==”hidden”},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/hd/i.test(a.nodeName)},text:function(a){var b=a.getAttribute(“type”),c=a.type;return a.nodeName.toLowerCase()===”input”&&”text”===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()===”input”&&”radio”===a.type},checkbox:function(a){return a.nodeName.toLowerCase()===”input”&&”checkbox”===a.type},file:function(a){return a.nodeName.toLowerCase()===”input”&&”file”===a.type},password:function(a){return a.nodeName.toLowerCase()===”input”&&”password”===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b===”input”||b===”button”)&&”submit”===a.type},image:function(a){return a.nodeName.toLowerCase()===”input”&&”image”===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b===”input”||b===”button”)&&”reset”===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b===”input”&&”button”===a.type||b===”button”},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e===”contains”)return(a.textContent||a.innerText||n([a])||””).indexOf(b[3])>=0;if(e===”not”){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute(“id”)===b},TAG:function(a,b){return b===”*”&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(” “+(a.className||a.getAttribute(“class”))+” “).indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+””,f=b[2],g=b[4];return d==null?f===”!=”:!f&&m.attr?d!=null:f===”=”?e===g:f===”*=”?e.indexOf(g)>=0:f===”~=”?(” “+e+” “).indexOf(g)>=0:g?f===”!=”?e!==g:f===”^=”?e.indexOf(g)===0:f===”$=”?e.substr(e.length-g.length)===g:f===”|=”?e===g||e.substr(0,g.length+1)===g+”-“:!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return”\”+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^[]*])(?![^(]*))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|r|n)*?)/.source+o.match[r].source.replace(/\(d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)===”[object Array]”)Array.prototype.push.apply(d,a);else if(typeof a.length==”number”)for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="
“,e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!=”undefined”&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!=”undefined”&&e.getAttributeNode(“id”).nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=”undefined”&&a.getAttributeNode(“id”);return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement(“div”);a.appendChild(c.createComment(“”)),a.getElementsByTagName(“*”).length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]===”*”){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML=”“,a.firstChild&&typeof a.firstChild.getAttribute!=”undefined”&&a.firstChild.getAttribute(“href”)!==”#”&&(o.attrHandle.href=function(a){return a.getAttribute(“href”,2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement(“div”),d=”__sizzle__”;b.innerHTML=”

“;if(!b.querySelectorAll||b.querySelectorAll(“.TEST”).length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(w+$)|^.([w-]+$)|^#([w-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b===”body”&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!==”object”){var k=e,l=e.getAttribute(“id”),n=l||d,p=e.parentNode,q=/^s*[+~]/.test(b);l?n=n.replace(/’/g,”\$&”):e.setAttribute(“id”,n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll(“[id='”+n+”‘] “+b),f)}catch(r){}finally{l||k.removeAttribute(“id”)}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement(“div”),”div”),e=!1;try{b.call(c.documentElement,”[test!=”]:sizzle”)}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/=s*([^'”]]*)s*]/g,”=’$1’]”);if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement(“div”);a.innerHTML=”

“;if(!!a.getElementsByClassName&&a.getElementsByClassName(“e”).length!==0){a.lastChild.className=”e”;if(a.getElementsByClassName(“e”).length===1)return;o.order.splice(1,0,”CLASS”),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=”undefined”&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!==”HTML”:!1};var y=function(a,b,c){var d,e=[],f=””,g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,””);a=o.relative[a]?a+”*”:a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#[.,]*$/,P=Array.prototype.slice,Q=f.expr.match.globalPOS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h–,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,”closest”,a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a==”string”)return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==”string”?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,”parentNode”)},parentsUntil:function(a,b,c){return f.dir(a,”parentNode”,c)},next:function(a){return f.nth(a,2,”nextSibling”)},prev:function(a){return f.nth(a,2,”previousSibling”)},nextAll:function(a){return f.dir(a,”nextSibling”)},prevAll:function(a){return f.dir(a,”previousSibling”)},nextUntil:function(a,b,c){return f.dir(a,”nextSibling”,c)},prevUntil:function(a,b,c){return f.dir(a,”previousSibling”,c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,”iframe”)?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d==”string”&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(“,”))}}),f.extend({filter:function(a,b,c){c&&(a=”:not(“+a+”)”);return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V=”abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video”,W=/ jQueryd+=”(?:d+|null)”/g,X=/^s+/,Y=/]*)/>/ig,Z=/<([w:]+)/,$=/<tbody/i,_=/<|&#?w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("]”,”i”),bd=/checkeds*(?:[^=]|=s*.checked.)/i,be=//(java|ecma)script/i,bf=/^s*<!(?:[CDATA[|–)/,bg={option:[1,"”,””],legend:[1,”
“,”
“],thead:[1,”

“,”

“],tr:[2,”

“,”

“],td:[3,”

“,”

“],col:[2,”

“,”

“],area:[1,”

“,”

“],_default:[0,””,””]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,”div

“,”

“]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,”body”)||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f
.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,”before”,arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,”after”,arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName(“*”)),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName(“*”));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,””):null;if(typeof a==”string”&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||[“”,””])[1].toLowerCase()]){a=a.replace(Y,””);try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(f.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(g){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,function(a,b){b.src?f.ajax({type:"GET",global:!1,url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test(“”)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement==”undefined”&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l==”number”&&(l+=””);if(!l)continue;if(typeof l==”string”)if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,””);var m=(Z.exec(l)||[“”,””])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement(“div”),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o–)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m===”table”&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===”

“&&!s?p.childNodes:[];for(i=t.length-1;i>=0;–i)f.nodeName(t[i],”tbody”)&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)==”number”)for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,”opacity”);return c===””?”1″:c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{“float”:f.support.cssFloat?”cssFloat”:”styleFloat”},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&”get”in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h===”string”&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h=”number”);if(d==null||h===”number”&&isNaN(d))return;h===”number”&&!f.cssNumber[i]&&(d+=”px”);if(!k||!(“set”in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c===”cssFloat”&&(c=”float”);if(g&&”get”in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,”-$1″).toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===””&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b===”fontSize”?”1em”:f,f=g.pixelLeft+”px”,g.left=c,d&&(a.runtimeStyle.left=d));return f===””?”auto”:f}),by=bz||bA,f.each([“height”,”width”],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+”px”:b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||””)?parseFloat(RegExp.$1)/100+””:b?”1″:””},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?”alpha(opacity=”+b*100+”)”:””,g=d&&d.filter||c.filter||””;c.zoom=1;if(b>=1&&f.trim(g.replace(bp,””))===””){c.removeAttribute(“filter”);if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+” “+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:”inline-block”},function(){return b?by(a,”margin-right”):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,”display”))===”none”},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:””,padding:””,border:”Width”},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c==”string”?c.split(” “):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/[]$/,bE=/r?n/g,bF=/#.*$/,bG=/^(.*?):[ t]*([^rn]*)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=/<scriptb[^<]*(?:(?!)<[^<]*)*/gi,bN=/^(?:select|textarea)/i,bO=/s+/,bP=/([?&])_=[^&]*/,bQ=/^([w+.-]+:)(?://([^/?#:]*)(?::(d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=[“*/”]+[“*”];try{bU=e.href}catch(bX){bU=c.createElement(“a”),bU.href=””,bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!=”string”&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(” “);if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h=”GET”;c&&(f.isFunction(c)?(d=c,c=b):typeof c==”object”&&(c=f.param(c,f.ajaxSettings.traditional),h=”POST”));var i=this;f.ajax({url:a,type:h,dataType:”html”,data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f(”

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

// get title
// =========

// has title already?
_foundHTML = $R.getContent__find__isolateTitleInHTML(_foundHTML, _documentTitle);
$R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML);
$R.debugPrint(‘TitleSource’, ‘target’);

// get html above?
if ($R.articleTitle > ”); else
{

// get html above target?
// ======================

// global vars:
// _found
// _foundHTML
// _documentTitle
// _aboveNodes

var
_prevNode = _found._targetCandidate.__node,
_prevHTML = ”,
_aboveHTML = ”,
_differentTargets = (_found._firstCandidate.__node != _found._targetCandidate.__node)
;

(function ()
{

while (true)
{
// the end?
switch (true)
{
case (_prevNode.tagName && (_prevNode.tagName.toLowerCase() == ‘body’)):
case (_differentTargets && (_prevNode == _found._firstCandidate.__node)):
// enough is enough
return;
}

// up or sideways?
if (_prevNode.previousSibling); else
{
_prevNode = _prevNode.parentNode;
continue;
}

// previous
_prevNode = _prevNode.previousSibling;

// outline — element might be re-outlined, when buildHTML is invoked
if ($R.debug) { $R.debugOutline(_prevNode, ‘target’, ‘add-above’); }

// get html; add
_prevHTML = $R.getContent__buildHTMLForNode(_prevNode, ‘above-the-target’);
_aboveHTML = _prevHTML + _aboveHTML;
_aboveNodes.unshift(_prevNode);

// isolate title
_aboveHTML = $R.getContent__find__isolateTitleInHTML(_aboveHTML, _documentTitle);

// finished?
switch (true)
{
case ($R.measureText__getTextLength(_aboveHTML.replace(/]+?>/gi, ”).replace(/s+/gi, ‘ ‘)) > (65 * 3 * 3)):
case ($R.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
return;
}
}

})();

// is what we found any good?
// ==========================
switch (true)
{
case ($R.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
case (_differentTargets && (_aboveHTML.split(‘<a ').length < 3) && ($R.measureText__getTextLength(_aboveHTML.replace(/]+?>/gi, ”).replace(/s+/gi, ‘ ‘)) ”); else
{

// if all else failed, get document title
// ======================================

// global vars:
// _foundHTML
// _documentTitle

(function ()
{
// return?
// =======
if (_documentTitle > ”); else { return; }

// vars
var
_doc_title_parts = [],
_doc_title_pregs =
[
/( [-][-] |( [-] )|( [>][>] )|( [<][<] )|( [|] )|( [/] ))/i,
/(([:] ))/i
]
;

// loop through pregs
// ==================
for (var i=0, _i=_doc_title_pregs.length; i 1) { break; }
}

// sort title parts — longer goes higher up — i.e. towards 0
// ================
_doc_title_parts.sort(function (a, b)
{
switch (true)
{
case (a.length > b.length): return -1;
case (a.length 1 ? _doc_title_parts[0] : _documentTitle)
+ $R.articleTitleMarker__end

+ _foundHTML
;

})();
$R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML);
$R.debugPrint(‘TitleSource’, ‘document_title’);
}
}

// remember
// ========
$R.debugRemember[‘theTarget’] = _found._targetCandidate.__node;
$R.debugRemember[‘firstCandidate’] = _found._firstCandidate.__node;

// next
// ====
$C._nextPages = [];

$R.nextPage__firstFragment__firstPage = _firstFragmentBefore;
$R.nextPage__firstFragment__lastPage = $R.getContent__nextPage__getFirstFragment(_foundHTML);;

$R.nextPage__loadedPages = [$R.win.location.href];
$R.getContent__nextPage__find($R.win, _found._links);

// result
var
_result = {
‘_html’: _foundHTML,
‘_title’: $R.articleTitle,
‘_multiPage’: ($R.nextPage__loadedPages.length > 1),
‘_rtl’: $R.rtl
}
;

// add elements
_result[‘_elements’] = _aboveNodes;
_result[‘_elements’].push(_found._targetCandidate.__node);

// return
_callbackFunction(_result);
};

// getOtherPagesHTML
// =================
$C.getOtherPagesHTML = function (_callbackFunction)
{
// curent length
var
_currentLength = $C._nextPages.length
_checkFunction = function ()
{
if ($C._nextPages.length == _currentLength)
{
// return
_callbackFunction($C._nextPages);
}
else
{
// reset
_currentLength = $C._nextPages.length;
window.setTimeout(_checkFunction, 2000);
}
}
;

// set first timeout
window.setTimeout(_checkFunction, 2000);
};

// includes — bind to $R
// ========

// target
// ======

// globals
// =======
$R.win = window;
$R.document = window.document;

$R.$win = $($R.win);
$R.$document = $($R.document);

// init
// ====

// version
// =======
$R.version = ‘3335.890.162’;

// paths
// =====
$R.paths =
{
‘main’: ‘none’,
‘evernote’: ‘https://www.evernote.com/&#8217;
};

// versioning
// ==========
$R.versioning =
{
‘file_name_bulk_js’: ‘bulk.js’,
‘file_name_bulk_css’: ‘bulk.css’,
‘file_name_jQuery_js’: ‘jQuery.js’,
‘file_name_miniColors_js’: ‘jquery.miniColors.js’,
‘file_name_miniColors_css’: ‘jquery.miniColors.css’,
‘file_name_flexSelect_js’: ‘jquery.flexSelect.js’,
‘file_name_liquidMetal_js’: ‘liquidMetal.js’,
‘file_name_flexSelect_css’: ‘flexSelect.css’,

‘file_name_base–theme-1_css’: ‘base–theme-1.css’,
‘file_name_base–theme-2_css’: ‘base–theme-2.css’,
‘file_name_base–theme-3_css’: ‘base–theme-3.css’,
‘file_name_base–blueprint_css’:’base–theme-blueprint.css’
};

// write
// =====
var
_body = $R.document.getElementsByTagName(‘body’)[0],
_component__next_pages_container_element = $R.document.createElement(‘div’),
_component__in_page_css_element = $R.document.createElement(‘style’),
_component__in_page_css_text = ”
+ ‘#next_pages_container { ‘
+ ‘width: 5px; hight: 5px; ‘
+ ‘position: absolute; ‘
+ ‘top: -100px; left: -100px; ‘
+ ‘z-index: 2147483647 !important; ‘
+ ‘} ‘
;
if(!_body) {
_body = $R.document.getElementsByTagName(“frameset”)[0];
}

// css
// ===
_component__in_page_css_element.setAttribute(‘id’, ‘_clearly_component__css’);
_component__in_page_css_element.setAttribute(‘type’, ‘text/css’);

if (_component__in_page_css_element.styleSheet) { _component__in_page_css_element.styleSheet.cssText = _component__in_page_css_text; }
else { _component__in_page_css_element.appendChild(document.createTextNode(_component__in_page_css_text)); }

_body.appendChild(_component__in_page_css_element);

// next pages
// ==========
_component__next_pages_container_element.setAttribute(‘id’, ‘_clearly_component__next_pages_container’);
_body.appendChild(_component__next_pages_container_element);
$R.$nextPages = $(‘#_clearly_component__next_pages_container’);

// bulk
// ====

// debug
// =====

// defaults to false
if ($R.debug); else { $R.debug = false; }

// make it faster — when not debugging
// ==============
if (!($R.debug))
{
$R.debugRemember = {};

$R.writeLog = function () { return false; };
$R.log = function () { return false; };

$R.debugTimerStart = function () { return false; };
$R.debugTimerEnd = function () { return false; };

$R.debugPrint = function () { return false; };
$R.printDebugOutput = function () { return false; };

$R.debugOutline = function () { return false; };
}
else
{
// remember stuff
$R.debugRemember = {};

// vars
// ====
$R.debugStuff = [];
$R.debugTimers = [];

// write log
// =========
$R.initializeWriteLogFunction = function ()
{
switch (true)
{
case (!(!($R.win.console && $R.win.console.log))):
$R.writeLog = function (msg) { $R.win.console.log(msg); };
break;

case (!(!($R.win.opera && $R.win.opera.postError))):
$R.writeLog = function (msg) { $R.win.opera.postError(msg); };
break;

default:
$R.writeLog = function (msg) {};
break;
}
};

// log
// ===
$R.initializeWriteLogFunction();
$R.log = function ()
{
if ($R.debug); else { return; }

for (var i=0, il=arguments.length; i ”)):
case (_element.tagName.toLowerCase() == ‘onject’):
case (_element.tagName.toLowerCase() == ’embed’):
return;
}

var
_outline = ‘#ff5500’,
_background = ‘rgba(255, 85, 0, 0.5)’
;

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

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

// =====

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

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

// =====

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

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

case (_category == ‘clean-after’ || _category == ‘clean-before’):
_outline = ‘#000000’;
_background = ‘rgba(0, 0, 0, 0.5)’;
break;
}

// do
$(_element).attr(‘readable__outline’, (_category + ‘: ‘ + _reason));
$(_element).css({
‘outline’: ‘5px solid ‘ + _outline,
‘background-color’: ” + _background
});
};

$R.debugBackground = function (_element, _category, _reason)
{
if ($R.debug); else { return; }

switch (true)
{
case (!(_element.nodeType === 1)):
case (!(_element.tagName > ”)):
case (_element.tagName.toLowerCase() == ‘onject’):
case (_element.tagName.toLowerCase() == ’embed’):
// don’t outline
break;

default:
var _color = ‘transparent’;
switch (true)
{
case (_category == ‘target’ && _reason == ‘first’): _color = ”; break;
case (_category == ‘target’ && _reason == ‘second’): _color = ”; break;

case (_category == ‘target’ && _reason == ‘next-page’): _color = ‘#FF80C0’; break;
case (_category == ‘target’ && _reason == ‘add-above’): _color = ‘#804000’; break;

case (_category == ‘clean-before’ && _reason == ‘floating’): _color = ‘#808080’; break;
case (_category == ‘clean-after’ && _reason == ‘missing-density’): _color = ‘#C0C0C0’; break;

case (_category == ‘clean-after’ || _category == ‘clean-before’): _color = ‘#000000’; break;
}

$(_element).css(‘outline’,’5px solid ‘+_color);
$(_element).attr(‘readable__outline’, (_category + ‘: ‘ + _reason));
break;
}
};

// timers
// ======
$R.debugTimerStart = function (timerName)
{
$R.debugTimers.push({
‘name’: timerName,
‘start’: (new Date()).getTime()
});
};

$R.debugTimerEnd = function ()
{
var _t = $R.debugTimers.pop(), _time = ((new Date()).getTime() – _t.start);
$R.log(‘TIMER / ‘+_t.name+’: ‘ + _time);
return _time;
};

// output — will be shown in Show function
// ======
$R.debugPrint = function (_key, _value)
{ $R.debugStuff[_key] = _value; };

$R.printDebugOutput = function ()
{
// return
if ($R.debug); else { return; }
if ($R.customScript) { return; }

// first
var _first =
[
‘Language’,
‘ExploreAndGetStuff’,
‘ProcessFirst’,
‘ProcessSecond’,
‘BuildHTML’,
‘BuildHTMLPregs’,
‘PointsFirst’,
‘PointsSecond’,
‘Target’,
‘NextPage’,
‘TitleSource’
];

// get and clean
_$debug = $(‘#debugOutput’);
_$debug.html(”);

// write
var _debug_write = function (_key, _value)
{
_$debug.append(”
+ ‘


+ ‘


+ ‘


+ ‘


);
}

// first
for (var i=0, _i=_first.length; i 0) { $R.debugRemember[‘theTarget’].scrollIntoView(false); } else { $R.debugRemember[‘firstCandidate’].scrollIntoView(false); } $R.win.scrollBy(0, 100); };

$R.debugScroll__after1 = function () { window.scrollTo(0, 0); };
$R.debugScroll__after2 = function () { window.scrollTo(0, $R.$win.height()); };
$R.debugScroll__after3 = function () { $(‘#page1’).get(0).scrollIntoView(false); window.scrollBy(0, 100); };
}

$R.debug = false;

// environment
// ===========

// environtment
// ============

$R.mac = (!$R.iOS && ($R.win.navigator.userAgent.match(/Macintosh/i) != null));

// get browser

// var — gets filled in
// ===
var __the_browser = ‘unknown’;

// possible values — in this order
// ===============
/*
firefox
safari
chrome
internet_explorer
opera

iphone
ipad

android
dolphin
firefox_mobile
chrome_mobile

windows_phone
*/

// doing work
// ==========
__the_browser = (function ()
{
// ua string
// =========
var _ua = window.navigator.userAgent.toLowerCase();

// cases
// =====

if ((_ua.indexOf(‘windows phone’) > -1)) { return ‘windows_phone’; }

if ((_ua.indexOf(‘chrome’) > -1) && (_ua.indexOf(‘android’) > -1)) { return ‘chrome_mobile’; }
if ((_ua.indexOf(‘firefox’) > -1) && (_ua.indexOf(‘fennec’) > -1)) { return ‘firefox_mobile’; }
if ((_ua.indexOf(‘dolfin’) > -1) || (_ua.indexOf(‘dolphin’) > -1)) { return ‘dolphin’; }
if ((_ua.indexOf(‘android’) > -1)) { return ‘android’; }

if ((_ua.indexOf(‘ipad’) > -1)) { return ‘ipad’; }
if ((_ua.indexOf(‘iphone’) > -1)) { return ‘iphone’; }

if ($.browser.opera) { return ‘opera’; }
if ($.browser.msie) { return ‘internet_explorer’; }
if ($.browser.webkit && (_ua.indexOf(‘chrome’) > -1)) { return ‘chrome’; }
if ($.browser.webkit && (_ua.indexOf(‘safari’) > -1)) { return ‘safari’; }
if ($.browser.mozilla) { return ‘firefox’; }
})();
$R.browser = __the_browser;

// language specific stuff
// =======================

// default
$R.language = ‘general’;

// the text – start with title
var _test_text = ‘ ‘ + $R.document.title;

// add couple of random paragraphs, divs
var
_ps = $R.document.getElementsByTagName(‘p’),
_ds = $R.document.getElementsByTagName(‘div’)
;

// add
for (var i=0; i<5; i++) { _test_text += ' ' + $(_ps[Math.floor(Math.random()*_ps.length)]).text(); }
for (var i=0; i 0))
{ $(‘html’).addClass(‘couldBeRTL’); }
}
})();

// events
// ======
if ($R.component); else
{
$(‘#curtain__rtl__radio__rtl’).change(function(){ $R.makeRTL(); return false; });
$(‘#curtain__rtl__radio__ltr’).change(function(){ $R.makeNotRTL(); return false; });
}

// measure text
// ============

// asian languages
// ===============
// http://msdn.microsoft.com/en-us/goglobal/bb688158
// http://en.wikipedia.org/wiki/Japanese_punctuation
// http://en.wikipedia.org/wiki/Japanese_typographic_symbols
// http://unicode.org/charts/PDF/U3000.pdf
// CJK: Chnese, Japanese, Korean — HAN character set

// length
// ======
$R.measureText__getTextLength = function (_the_text)
{
var _text = _the_text;

_text = _text.replace(/[snr]+/gi, ”);
//_text = _text.replace(/d+/, ”);

return _text.length;
};

// word count
// ==========
$R.measureText__getWordCount = function (_the_text)
{
var _text = _the_text;

// do stuff
// ========
_text = _text.replace(/[snr]+/gi, ‘ ‘);

_text = _text.replace(/([.,?!:;()[]'””-])/gi, ‘ $1 ‘);

_text = _text.replace(/([u3000])/gi, ‘[=words(1)]’);
_text = _text.replace(/([u3001])/gi, ‘[=words(2)]’);
_text = _text.replace(/([u3002])/gi, ‘[=words(4)]’);
_text = _text.replace(/([u301C])/gi, ‘[=words(2)]’);
_text = _text.replace(/([u2026|u2025])/gi, ‘[=words(2)]’);
_text = _text.replace(/([u30FBuFF65])/gi, ‘[=words(1)]’);
_text = _text.replace(/([u300Cu300D])/gi, ‘[=words(1)]’);
_text = _text.replace(/([u300Eu300F])/gi, ‘[=words(1)]’);
_text = _text.replace(/([u3014u3015])/gi, ‘[=words(1)]’);
_text = _text.replace(/([u3008u3009])/gi, ‘[=words(1)]’);
_text = _text.replace(/([u300Au300B])/gi, ‘[=words(1)]’);
_text = _text.replace(/([u3010u3011])/gi, ‘[=words(1)]’);
_text = _text.replace(/([u3016u3017])/gi, ‘[=words(1)]’);
_text = _text.replace(/([u3018u3019])/gi, ‘[=words(1)]’);
_text = _text.replace(/([u301Au301B])/gi, ‘[=words(1)]’);
_text = _text.replace(/([u301Du301Eu301F])/gi, ‘[=words(1)]’);
_text = _text.replace(/([u30A0])/gi, ‘[=words(1)]’);

// count
// =====
var
_count = 0,
_words_match = _text.match(/([^sd]{3,})/gi)
;

// add match
_count += (_words_match != null ? _words_match.length : 0);

// add manual count
_text.replace(/[=words((d))]/, function (_match, _plus) { _count += (5 * parseInt(_plus)); });

// return
// ======
return _count;
};

// levenshtein
// ===========
$R.levenshteinDistance = function (str1, str2)
{
var l1 = str1.length, l2 = str2.length;
if (Math.min(l1, l2) === 0)
{ return Math.max(l1, l2); }

var i = 0, j = 0, d = [];
for (i = 0 ; i <= l1 ; i++)
{
d[i] = [];
d[i][0] = i;
}

for (j = 0 ; j <= l2 ; j++)
{ d[0][j] = j; }

for (i = 1 ; i <= l1 ; i++)
{
for (j = 1 ; j ” && _text > ”); else
{
_html = null;
_text = null;

$R.$document.find(‘frame, iframe’).each(function (_i, _e)
{
if (_e.getAttribute(‘id’) == ‘readable_iframe’) { return; }

try
{
var
__doc = $(_e).contents().get(0),
__win = $R.sel.getWindowFromDocument(__doc),
__selection = $R.sel.getSelection(__win),
__range = $R.sel.getRange(__selection),
__html = $R.sel.getRangeHTML(__range),
__text = $R.sel.getRangeText(__range)
;

if (__html > ” && __text > ”)
{
_html = __html;
_text = __text;

// stop the each
return false;
}
}
catch(e) { }
});
}

// haven’t found anything
if (_html > ” && _text > ”); else { return false; }

// probably selected something by mistake
if ($R.measureText__getTextLength(_text) > (65 * 3 * 1.5)); else { return false; }

// display
// =======
$R.$pages.html(”);
$R.displayPageHTML(_html, 1, ‘selection’);

// return true
return true;
};

// functions
// =========

$R.sel = {};

$R.sel.getWindowFromDocument = function (theDocument)
{
if (theDocument); else { return null; }

if (‘defaultView’ in theDocument) {
arguments.calee = function (theDocument) {
if (theDocument); else { return null; }
return theDocument.defaultView;
};
}
else if (‘parentWindow’ in theDocument) {
arguments.calee = function (theDocument) {
if (theDocument); else { return null; }
return theDocument.parentWindow;
};
}
else {
arguments.calee = function (theDocument) {
return null;
};
}

return arguments.calee(theDocument);
};

$R.sel.getSelection = function (theWindow)
{
if (theWindow); else { return null; }

if (‘getSelection’ in theWindow) {
arguments.calee = function (theWindow) {
if (theWindow); else { return null; }
return theWindow.getSelection();
};
}
else if (‘selection’ in theWindow.document) {
arguments.calee = function (theWindow) {
if (theWindow); else { return null; }
return theWindow.document.selection;
};
}
else {
arguments.calee = function (theWindow) {
return null;
};
}

return arguments.calee(theWindow);
};

$R.sel.getRange = function (selection)
{
if (selection); else { return null; }

if (‘getRangeAt’ in selection) {
arguments.calee = function (selection) {
if (selection); else { return null; }
if (selection.rangeCount > 0) { return selection.getRangeAt(0); }
else { return null; }
// doesn’t work in old versions of safari
// … I don’t care
};
}
else if (‘createRange’ in selection) {
arguments.calee = function (selection) {
if (selection); else { return null; }
return selection.createRange();
};
}
else {
arguments.calee = function (selection) {
return null;
};
}

return arguments.calee(selection);
};

$R.sel.getRangeHTML = function (range)
{
if (range); else { return null; }

if (‘htmlText’ in range) {
arguments.calee = function (range) {
if (range); else { return null; }
return range.htmlText;
};
}
else if (‘surroundContents’ in range) {
arguments.calee = function (range) {
if (range); else { return null; }
var dummy = range.commonAncestorContainer.ownerDocument.createElement(“div”);
dummy.appendChild(range.cloneContents());
return dummy.innerHTML;
};
}
else {
arguments.calee = function (range) {
return null;
};
}

return arguments.calee(range);
};

$R.sel.getRangeText = function (range)
{
if (range); else { return null; }

if (‘text’ in range) {
arguments.calee = function (range) {
if (range); else { return null; }
return range.text;
};
}
else if (‘surroundContents’ in range) {
arguments.calee = function (range) {
if (range); else { return null; }
var dummy = range.commonAncestorContainer.ownerDocument.createElement(“div”);
dummy.appendChild(range.cloneContents());
return dummy.textContent;
};
}
else {
arguments.calee = function (range) {
return null;
};
}

return arguments.calee(range);
};

// options
// =======
$R.parsingOptions =
{
‘_elements_ignore’: ‘|button|input|select|textarea|optgroup|command|datalist|–|frame|frameset|noframes|–|style|link|script|noscript|–|canvas|applet|map|–|marquee|area|base|’,
‘_elements_ignore_tag’: ‘|form|fieldset|details|dir|–|center|font|span|’,
‘_elements_self_closing’: ‘|br|hr|–|img|–|col|–|source|–|embed|param|–|iframe|’,
‘_elements_visible’: ‘|article|section|–|ul|ol|li|dd|–|table|tr|td|–|div|–|p|–|h1|h2|h3|h4|h5|h6|–|span|’,
‘_elements_too_much_content’: ‘|b|i|em|strong|–|h1|h2|h3|h4|h5|–|td|’,
‘_elements_container’: ‘|body|–|article|section|–|div|–|td|–|li|–|dd|dt|’,
‘_elements_link_density’: ‘|div|–|table|ul|ol|–|section|aside|header|’,
‘_elements_floating’: ‘|div|–|table|’,
‘_elements_above_target_ignore’:’|br|–|ul|ol|dl|–|table|’,
‘_elements_keep_attributes’:
{
‘a’: [‘href’, ‘title’, ‘name’],
‘img’: [‘src’, ‘width’, ‘height’, ‘alt’, ‘title’],

‘video’: [‘src’, ‘width’, ‘height’, ‘poster’, ‘audio’, ‘preload’, ‘autoplay’, ‘loop’, ‘controls’],
‘audio’: [‘src’, ‘preload’, ‘autoplay’, ‘loop’, ‘controls’],
‘source’: [‘src’, ‘type’],

‘object’: [‘data’, ‘type’, ‘width’, ‘height’, ‘classid’, ‘codebase’, ‘codetype’],
‘param’: [‘name’, ‘value’],
’embed’: [‘src’, ‘type’, ‘width’, ‘height’, ‘flashvars’, ‘allowscriptaccess’, ‘allowfullscreen’, ‘bgcolor’],

‘iframe’: [‘src’, ‘width’, ‘height’, ‘frameborder’, ‘scrolling’],

‘td’: [‘colspan’, ‘rowspan’],
‘th’: [‘colspan’, ‘rowspan’]
}
};

// next page keywords — (?? charCodeAt() > 127)
// ==================
$R.nextPage__captionKeywords =
[
/* english */
‘next page’, ‘next’,

/* german */
‘vorwärts’, ‘weiter’,

/* japanese */
‘次へ’
];

$R.nextPage__captionKeywords__not =
[
/* english */
‘article’, ‘story’, ‘post’, ‘comment’, ‘section’, ‘chapter’

];

// skip links
// ==========
$R.skipStuffFromDomains__links =
[
‘doubleclick.net’,
‘fastclick.net’,
‘adbrite.com’,
‘adbureau.net’,
‘admob.com’,
‘bannersxchange.com’,
‘buysellads.com’,
‘impact-ad.jp’,
‘atdmt.com’,
‘advertising.com’,
‘itmedia.jp’,
‘microad.jp’,
‘serving-sys.com’,
‘adplan-ds.com’
];

// skip images
// ===========
$R.skipStuffFromDomain__images =
[
‘googlesyndication.com’,
‘fastclick.net’,
‘.2mdn.net’,
‘de17a.com’,
‘content.aimatch.com’,
‘bannersxchange.com’,
‘buysellads.com’,
‘impact-ad.jp’,
‘atdmt.com’,
‘advertising.com’,
‘itmedia.jp’,
‘microad.jp’,
‘serving-sys.com’,
‘adplan-ds.com’
];

// keep video
// ==========

$R.keepStuffFromDomain__video =
[
‘youtube.com’,
‘youtube-nocookie.com’,

‘vimeo.com’,
‘hulu.com’,
‘yahoo.com’,
‘flickr.com’,
‘newsnetz.ch’
];

$R.getContent__exploreNodeAndGetStuff = function (_nodeToExplore, _justExploring)
{
var
_global__element_index = 0,

_global__inside_link = false,
_global__inside_link__element_index = 0,

_global__length__above_plain_text = 0,
_global__count__above_plain_words = 0,
_global__length__above_links_text = 0,
_global__count__above_links_words = 0,
_global__count__above_candidates = 0,
_global__count__above_containers = 0,
_global__above__plain_text = ”,
_global__above__links_text = ”,

_return__containers = [],
_return__candidates = [],
_return__links = []
;

// recursive function
// ==================
var _recursive = function (_node)
{
// increment index
// starts with 1
_global__element_index++;

var
_tag_name = (_node.nodeType === 3 ? ‘#text’ : ((_node.nodeType === 1 && _node.tagName && _node.tagName > ”) ? _node.tagName.toLowerCase() : ‘#invalid’)),
_result =
{
‘__index’: _global__element_index,
‘__node’: _node,

‘_is__container’: ($R.parsingOptions._elements_container.indexOf(‘|’+_tag_name+’|’) > -1),
‘_is__candidate’: false,
‘_is__text’: false,
‘_is__link’: false,
‘_is__link_skip’: false,
‘_is__image_small’: false,
‘_is__image_medium’: false,
‘_is__image_large’: false,
‘_is__image_skip’: false,

‘_debug__above__plain_text’: _global__above__plain_text,
‘_debug__above__links_text’: _global__above__links_text,

‘_length__above_plain_text’: _global__length__above_plain_text,
‘_count__above_plain_words’: _global__count__above_plain_words,

‘_length__above_links_text’: _global__length__above_links_text,
‘_count__above_links_words’: _global__count__above_links_words,

‘_length__above_all_text’: (_global__length__above_plain_text + _global__length__above_links_text),
‘_count__above_all_words’: (_global__count__above_plain_words + _global__count__above_links_words),

‘_count__above_candidates’: _global__count__above_candidates,
‘_count__above_containers’: _global__count__above_containers,

‘_length__plain_text’: 0,
‘_count__plain_words’: 0,

‘_length__links_text’: 0,
‘_count__links_words’: 0,

‘_length__all_text’: 0,
‘_count__all_words’: 0,

‘_count__containers’: 0,
‘_count__candidates’: 0,

‘_count__links’: 0,
‘_count__links_skip’: 0,

‘_count__images_small’: 0,
‘_count__images_medium’: 0,
‘_count__images_large’: 0,
‘_count__images_skip’: 0
};

// fast return
// ===========
switch (true)
{
case ((_tag_name == ‘#invalid’)):
case (($R.parsingOptions._elements_ignore.indexOf(‘|’+_tag_name+’|’) > -1)):
return;

case (($R.parsingOptions._elements_visible.indexOf(‘|’+_tag_name+’|’) > -1)):

// included inline
// _node, _tag_name must be defined
// will return, if node is hidden

switch (true)
{
case (_node.offsetWidth > 0):
case (_node.offsetHeight > 0):
break;

default:
switch (true)
{
case (_node.offsetLeft > 0):
case (_node.offsetTop > 0):
break;

default:
// exclude inline DIVs — which, stupidly, don’t have a width/height
if ((_tag_name == ‘div’) && ((_node.style.display || $.css( _node, “display” )) == ‘inline’))
{ break; }

// it’s hidden; exit current scope
return;
}
break;
}

break;

// self-closing — with some exceptions
case ($R.parsingOptions._elements_self_closing.indexOf(‘|’+_tag_name+’|’) > -1):
switch (true)
{
case ((_tag_name == ‘img’)): break;
default: return;
}
break;
}

// do stuff
// ========
switch (true)
{
// text node
// =========
case ((_tag_name == ‘#text’)):
// mark
_result._is__text = true;

// get
var _nodeText = _node.nodeValue;

// result
_result._length__plain_text = $R.measureText__getTextLength(_nodeText);
_result._count__plain_words = $R.measureText__getWordCount(_nodeText);

if (_global__inside_link)
{
_global__length__above_links_text += _result._length__plain_text;
_global__count__above_links_words += _result._count__plain_words;
if (false && $R.debug) { _global__above__links_text += ‘ ‘ + _nodeText; }
}
else
{
_global__length__above_plain_text += _result._length__plain_text;
_global__count__above_plain_words += _result._count__plain_words;
if (false && $R.debug) { _global__above__plain_text += ‘ ‘ + _nodeText; }
}

// return text
return _result;

// link
// ====
case (_tag_name == ‘a’):
var _href = “”;
try {
_href = _node.href;
} catch(e) {
Evernote.Logger.warn(“Clearly: failed to get href of link element” + e);
}

// sanity
if (_href > ”); else { break; }
if (_href.indexOf); else { break; }

_result._is__link = true;

// skip
for (var i=0, _i=$R.skipStuffFromDomains__links.length; i -1)
{ _result._is__link_skip = true; break; }
}

// inside link
if (_global__inside_link); else
{
_global__inside_link = true;
_global__inside_link__element_index = _result.__index;
}

// done
_return__links.push(_result);
break;

// image
// =====
case (_tag_name == ‘img’):

// skip
// ====
if (_node.src && _node.src.indexOf)
{
for (var i=0, _i=$R.skipStuffFromDomain__images.length; i -1)
{ _result._is__image_skip = true; break; }
}
}

// size
// ====
var _width = $(_node).width(), _height = $(_node).height();
switch (true)
{
case ((_width * _height) >= 50000):
case ((_width >= 350) && (_height >= 75)):
_result._is__image_large = true;
break;

case ((_width * _height) >= 20000):
case ((_width >= 150) && (_height >= 150)):
_result._is__image_medium = true;
break;

case ((_width <= 5) && (_height <= 5)):
_result._is__image_skip = true;
break;

default:
_result._is__image_small = true;
break;
}

break;
}

// child nodes
// ===========
for (var i=0, _i=_node.childNodes.length; i= _result._count__plain_words)): /* link ratio */

case (($R.language != ‘cjk’) && (_result._length__plain_text < (65 / 3))): /* text length */
case (($R.language != 'cjk') && (_result._count__plain_words < 5)): /* words */

case (($R.language == 'cjk') && (_result._length__plain_text < 10)): /* text length */
case (($R.language == 'cjk') && (_result._count__plain_words < 2)): /* words */

//case (_result._length__plain_text == 0): /* no text */
//case (_result._count__plain_words == 0): /* no words */

//case (($R.language == 'cjk') && ((_result._length__plain_text / 65 / 3) < 0.1)): /* paragrahs of 3 lines */
//case (($R.language != 'cjk') && ((_result._count__plain_words / 50) < 0.5)): /* paragraphs of 50 words */

// not a valid candidate
//if (_tag_name == 'div') { $R.log('bad candidate', _result.__node); }

break;

default:
// good candidate
_result._is__candidate = true;
_return__candidates.push(_result);

// increase above candidates
_global__count__above_candidates++;

break;
}

// special case for body — if it was just skipped
// =====================
if ((_result.__index == 1) && !(_result._is__candidate))
{
_result._is__candidate = true;
_result._is__bad = true;
_return__candidates.push(_result);
}
}
}

// return
// ======
return _result;
};

// actually do it
// ==============
_recursive(_nodeToExplore);

// just exploring — return first thing
// ==============
if (_justExploring) { return _return__containers.pop(); }

// return containers list
// ======================
return {
'_containers': _return__containers,
'_candidates': _return__candidates,
'_links': _return__links
};
};

$R.getContent__processCandidates = function (_candidatesToProcess)
{
// process this var
// ================
var _candidates = _candidatesToProcess;

// sort _candidates — the lower in the dom, the closer to position 0
// ================
_candidates.sort(function (a, b)
{
switch (true)
{
case (a.__index b.__index): return 1;
default: return 0;
}
});

// get first
// =========
var _main = _candidates[0]
if ($R.debug) { $R.log(‘should be body’, _main, _main.__node); }

// pieces of text
// and points computation
// ======================
for (var i=0, _i=_candidates.length; i<_i; i++)
{
// pieces
// ======
var
_count__pieces = 0,
_array__pieces = []
;

for (var k=i, _k=_candidates.length; k 0) { continue; }
if ($.contains(_candidates[i].__node, _candidates[k].__node)); else { continue; }

// store piece, if in debug mode
if ($R.debug) { _array__pieces.push(_candidates[k]); }

// incement pieces count
_count__pieces++;
}

// candidate details
// =================
_candidates[i][‘__candidate_details’] = $R.getContent__computeDetailsForCandidate(_candidates[i], _main);

// pieces — do this here because _main doesn’t yet have a pieces count
// ======

// set pieces
_candidates[i][‘_count__pieces’] = _count__pieces;
_candidates[i][‘_array__pieces’] = _array__pieces;

// pieces ratio
_candidates[i][‘__candidate_details’][‘_ratio__count__pieces_to_total_pieces’] = (_count__pieces / (_candidates[0]._count__pieces + 1));

// check some more
// ===============
/* switch (true)
{
case (($R.language != ‘cjk’) && (_candidates[i][‘__candidate_details’][‘_ratio__length__links_text_to_plain_text’] > 1)):
case (($R.language != ‘cjk’) && (_candidates[i][‘__candidate_details’][‘_ratio__count__links_words_to_plain_words’] > 1)):
_candidates[i]._is__bad = true;
break;
}*/

// points
// ======
_candidates[i].__points_history = $R.getContent__computePointsForCandidate(_candidates[i], _main);
_candidates[i].__points = _candidates[i].__points_history[0];
}

// sort _candidates — the more points, the closer to position 0
// ================
_candidates.sort(function (a, b)
{
switch (true)
{
case (a.__points > b.__points): return -1;
case (a.__points 250)
;

// bad candidate
if (_e._is__bad) { return [0]; }

// the basics
// ==========
_points_history.unshift(((0
+ (_details._count__paragraphs_of_3_lines)
+ (_details._count__paragraphs_of_5_lines * 1.5)
+ (_details._count__paragraphs_of_50_words)
+ (_details._count__paragraphs_of_80_words * 1.5)
+ (_e._count__images_large * 3)
– ((_e._count__images_skip + _e._count__images_small) * 0.5)
) * 1000));

// negative
if (_points_history[0] 0)):
case (!($.contains(_main.__node, _element.__node))):
return null;

default:
return _element;
}
});

// add main – to amke sure the result is never blank
_candidates.unshift(_main);

// sort _candidates — the lower in the dom, the closer to position 0
// ================
_candidates.sort(function (a, b)
{
switch (true)
{
case (a.__index b.__index): return 1;
default: return 0;
}
});

// second candidate computation
// ============================
for (var i=0, _i=_candidates.length; i 0.05)):
case (!(_candidates[i][‘__candidate_details_second’][‘_ratio__length__plain_text_to_total_plain_text’] > 0.05)):

//case (!(_candidates[i][‘__candidate_details_second’][‘_ratio__count__above_plain_words_to_total_plain_words’] < 0.1)):
//case (!(_candidates[i]['__candidate_details_second']['_ratio__length__above_plain_text_to_total_plain_text'] 1):
//case (_candidates[i][‘__candidate_details_second’][‘_ratio__count__above_plain_words_to_plain_words’] > 1):

_candidates[i]._is__bad = true;
// wil set points to 0, in points computation function
break;
}*/

// points
// ======
_candidates[i].__points_history_second = $R.getContent__computePointsForCandidateSecond(_candidates[i], _main);
_candidates[i].__points_second = _candidates[i].__points_history_second[0];
}

// sort _candidates — the more points, the closer to position 0
// ================
_candidates.sort(function (a, b)
{
switch (true)
{
case (a.__points_second > b.__points_second): return -1;
case (a.__points_second < b.__points_second): return 1;
default: return 0;
}
});

// return
// ======
return _candidates;
};

$R.getContent__computeDetailsForCandidateSecond = function (_e, _main)
{
var _r = {};

// bad candidate
// =============
if (_e._is__bad) { return _r; }

// total text
// ==========
_r['_ratio__length__plain_text_to_total_plain_text'] = (_e._length__plain_text / _main._length__plain_text);
_r['_ratio__count__plain_words_to_total_plain_words'] = (_e._count__plain_words / _main._count__plain_words);

// links
// =====
_r['_ratio__length__links_text_to_all_text'] = (_e._length__links_text / _e._length__all_text);
_r['_ratio__count__links_words_to_all_words'] = (_e._count__links_words / _e._count__all_words);

_r['_ratio__length__links_text_to_total_links_text'] = (_e._length__links_text / (_main._length__links_text + 1));
_r['_ratio__count__links_words_to_total_links_words'] = (_e._count__links_words / (_main._count__links_words + 1));

_r['_ratio__count__links_to_total_links'] = (_e._count__links / (_main._count__links + 1));
_r['_ratio__count__links_to_plain_words'] = ((_e._count__links * 2) / _e._count__plain_words);

// text above
// ==========

var
_divide__candidates = Math.max(2, Math.ceil((_e._count__above_candidates – _main._count__above_candidates) * 0.5)),

_above_text = ((0
+ (_e.__second_length__above_plain_text * 1)
+ (_e.__second_length__above_plain_text / _divide__candidates)
) / 2),

_above_words = ((0
+ (_e.__second_count__above_plain_words * 1)
+ (_e.__second_count__above_plain_words / _divide__candidates)
) / 2)
;

_r['_ratio__length__above_plain_text_to_total_plain_text'] = (_above_text / _main._length__plain_text);
_r['_ratio__count__above_plain_words_to_total_plain_words'] = (_above_words / _main._count__plain_words);

_r['_ratio__length__above_plain_text_to_plain_text'] = (_above_text / _e._length__plain_text);
_r['_ratio__count__above_plain_words_to_plain_words'] = (_above_words / _e._count__plain_words);

// candidates
// ==========
_r['_ratio__count__candidates_to_total_candidates'] = (Math.max(0, (_e._count__candidates – (_main._count__candidates * 0.25))) / (_main._count__candidates + 1));
_r['_ratio__count__containers_to_total_containers'] = (Math.max(0, (_e._count__containers – (_main._count__containers * 0.25))) / (_main._count__containers + 1));
_r['_ratio__count__pieces_to_total_pieces'] = (Math.max(0, (_e._count__pieces – (_main._count__pieces * 0.25))) / (_main._count__pieces + 1));

// return
// ======
return _r;
};

$R.getContent__computePointsForCandidateSecond = function (_e, _main)
{
var
_details = _e.__candidate_details,
_details_second = _e.__candidate_details_second,
_points_history = []
;

// bad candidate
if (_e._is__bad) { return [0]; }

// get initial points
// ==================
_points_history.unshift(_e.__points_history[(_e.__points_history.length-1)]);

// candidates, containers, pieces
// ==============================
var
_divide__pieces = Math.max(5, Math.ceil(_e._count__pieces * 0.25)),
_divide__candidates = Math.max(5, Math.ceil(_e._count__candidates * 0.25)),
_divide__containers = Math.max(10, Math.ceil(_e._count__containers * 0.25))
;

_points_history.unshift(((0
+ (_points_history[0] * 3)
+ ((_points_history[0] / _divide__pieces) * 2)
+ ((_points_history[0] / _divide__candidates) * 2)
+ ((_points_history[0] / _divide__containers) * 2)
) / 9));

// total text
// ==========
$R.getContent__computePointsForCandidate__do(0.50, 1, (1 – (1 – _details_second._ratio__length__plain_text_to_total_plain_text)), _points_history);
$R.getContent__computePointsForCandidate__do(0.50, 1, (1 – (1 – _details_second._ratio__count__plain_words_to_total_plain_words)), _points_history);

// text above
// ==========
var __ar = ($R.language == 'cjk' ? 0.50 : 0.10);

$R.getContent__computePointsForCandidate__do(__ar, 1, (1 – _details_second._ratio__length__above_plain_text_to_total_plain_text), _points_history);
$R.getContent__computePointsForCandidate__do(__ar, 1, (1 – _details_second._ratio__count__above_plain_words_to_total_plain_words), _points_history);

$R.getContent__computePointsForCandidate__do(__ar, 1, (1 – _details_second._ratio__length__above_plain_text_to_plain_text), _points_history);
$R.getContent__computePointsForCandidate__do(__ar, 1, (1 – _details_second._ratio__count__above_plain_words_to_plain_words), _points_history);

// links outer
// ===========
$R.getContent__computePointsForCandidate__do(0.75, 1, (1 – _details_second._ratio__count__links_to_total_links), _points_history);
$R.getContent__computePointsForCandidate__do(0.75, 1, (1 – _details_second._ratio__length__links_text_to_total_links_text), _points_history);
$R.getContent__computePointsForCandidate__do(0.75, 1, (1 – _details_second._ratio__count__links_words_to_total_links_words), _points_history);

// links inner
// ===========
var __lr = ($R.language == 'cjk' ? 0.75 : 0.50);

$R.getContent__computePointsForCandidate__do(__lr, 1, (1 – _details._ratio__length__links_text_to_plain_text), _points_history);
$R.getContent__computePointsForCandidate__do(__lr, 1, (1 – _details._ratio__count__links_words_to_plain_words), _points_history);

$R.getContent__computePointsForCandidate__do(__lr, 1, (1 – _details_second._ratio__length__links_text_to_all_text), _points_history);
$R.getContent__computePointsForCandidate__do(__lr, 1, (1 – _details_second._ratio__count__links_words_to_all_words), _points_history);

$R.getContent__computePointsForCandidate__do(__lr, 1, (1 – _details_second._ratio__count__links_to_plain_words), _points_history);

// candidates, containers, pieces
// ==============================
$R.getContent__computePointsForCandidate__do(0.10, 2, (1 – _details_second._ratio__count__candidates_to_total_candidates), _points_history);
$R.getContent__computePointsForCandidate__do(0.10, 2, (1 – _details_second._ratio__count__containers_to_total_containers), _points_history);
$R.getContent__computePointsForCandidate__do(0.10, 2, (1 – _details_second._ratio__count__pieces_to_total_pieces), _points_history);

// return — will get [0] as the actual final points
// ======
return _points_history;
};

$R.getContent__computePointsForCandidateThird = function (_e, _main)
{
var
_details = _e.__candidate_details,
_details_second = _e.__candidate_details_second,
_points_history = []
;

// bad candidate
if (_e._is__bad) { return [0]; }

// get initial points
// ==================
_points_history.unshift(_e.__points_history[(_e.__points_history.length-1)]);

// candidates, containers, pieces
// ==============================
var
_divide__pieces = Math.max(2, Math.ceil(_e._count__pieces * 0.25)),
_divide__candidates = Math.max(2, Math.ceil(_e._count__candidates * 0.25)),
_divide__containers = Math.max(4, Math.ceil(_e._count__containers * 0.25))
;

_points_history.unshift(((0
+ (_points_history[0] * 3)
+ ((_points_history[0] / _divide__pieces) * 2)
+ ((_points_history[0] / _divide__candidates) * 2)
+ ((_points_history[0] / _divide__containers) * 2)
) / 9));

// total text
// ==========
$R.getContent__computePointsForCandidate__do(0.75, 1, (1 – (1 – _details_second._ratio__length__plain_text_to_total_plain_text)), _points_history);
$R.getContent__computePointsForCandidate__do(0.75, 1, (1 – (1 – _details_second._ratio__count__plain_words_to_total_plain_words)), _points_history);

// text above
// ==========
$R.getContent__computePointsForCandidate__do(0.50, 1, (1 – _details._ratio__length__above_plain_text_to_total_plain_text), _points_history);
$R.getContent__computePointsForCandidate__do(0.50, 1, (1 – _details._ratio__count__above_plain_words_to_total_plain_words), _points_history);

$R.getContent__computePointsForCandidate__do(0.10, 1, (1 – _details_second._ratio__length__above_plain_text_to_total_plain_text), _points_history);
$R.getContent__computePointsForCandidate__do(0.10, 1, (1 – _details_second._ratio__count__above_plain_words_to_total_plain_words), _points_history);

$R.getContent__computePointsForCandidate__do(0.10, 1, (1 – _details_second._ratio__length__above_plain_text_to_plain_text), _points_history);
$R.getContent__computePointsForCandidate__do(0.10, 1, (1 – _details_second._ratio__count__above_plain_words_to_plain_words), _points_history);

// links inner
// ===========
$R.getContent__computePointsForCandidate__do(0.50, 1, (1 – _details._ratio__length__links_text_to_all_text), _points_history);
$R.getContent__computePointsForCandidate__do(0.50, 1, (1 – _details._ratio__count__links_words_to_all_words), _points_history);

$R.getContent__computePointsForCandidate__do(0.50, 1, (1 – _details._ratio__length__links_text_to_plain_text), _points_history);
$R.getContent__computePointsForCandidate__do(0.50, 1, (1 – _details._ratio__count__links_words_to_plain_words), _points_history);

$R.getContent__computePointsForCandidate__do(0.50, 1, (1 – _details._ratio__count__links_to_plain_words), _points_history);

// candidates, containers, pieces
// ==============================
$R.getContent__computePointsForCandidate__do(0.50, 1, (1 – _details._ratio__count__candidates_to_total_candidates), _points_history);
$R.getContent__computePointsForCandidate__do(0.50, 1, (1 – _details._ratio__count__containers_to_total_containers), _points_history);
$R.getContent__computePointsForCandidate__do(0.50, 1, (1 – _details._ratio__count__pieces_to_total_pieces), _points_history);

// return — will get [0] as the actual final points
// ======
return _points_history;
};

$R.getContent__computePointsForCandidate__do = function (_ratio_remaining, _power, _ratio, _points_history)
{
var
_points_remaining = (_points_history[0] * _ratio_remaining),
_points_to_compute = (_points_history[0] – _points_remaining)
;

if (_ratio ”) ? _node.tagName.toLowerCase() : ‘#invalid’)),
_pos__start__before = 0,
_pos__start__after = 0,
_pos__end__before = 0,
_pos__end__after = 0
;

// fast return
// ===========
switch (true)
{
case ((_tag_name == ‘#invalid’)):
case (($R.parsingOptions._elements_ignore.indexOf(‘|’+_tag_name+’|’) > -1)):
return;

case (_tag_name == ‘#text’):
_global__the_html += _node.nodeValue
.replace(//gi, ‘>’)
;
return;
}

// hidden
// ======
if ($R.parsingOptions._elements_visible.indexOf(‘|’+_tag_name+’|’) > -1)
{
// included inline
// _node, _tag_name must be defined
// will return, if node is hidden

switch (true)
{
case (_node.offsetWidth > 0):
case (_node.offsetHeight > 0):
break;

default:
switch (true)
{
case (_node.offsetLeft > 0):
case (_node.offsetTop > 0):
break;

default:
// exclude inline DIVs — which, stupidly, don’t have a width/height
if ((_tag_name == ‘div’) && ((_node.style.display || $.css( _node, “display” )) == ‘inline’))
{ break; }

// it’s hidden; exit current scope
return;
}
break;
}
}

// clean — before
// =====

// just a return will skip the whol element
// including children

// objects, embeds, iframes
// ========================
switch (_tag_name)
{
case (‘object’):
case (’embed’):
case (‘iframe’):
var
_src = (_tag_name == ‘object’ ? $(_node).find(“param[name=’movie’]”).attr(‘value’) : $(_node).attr(‘src’)),
_skip = ((_src > ”) ? false : true)
;

if (_skip); else
{
// default skip
_skip = true;

// loop
for (var i=0, _i=$R.keepStuffFromDomain__video.length; i -1) { _skip = false; break; } }
}

// skip?
if (_skip)
{ $R.debugOutline(_node, ‘clean-before’, ‘object-embed-iframe’); return; }

break;
}

// skipped link
// ============
if (_tag_name == ‘a’ || _tag_name == ‘li’)
{
_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
switch (true)
{
case (_explored._is__link_skip):
case (((_explored._count__images_small + _explored._count__images_skip) > 0) && (_explored._length__plain_text -1)
{
_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
switch (true)
{
case (_explored._length__plain_text > (65 * 3 * 2)):
case ($R.language == ‘cjk’ && (_explored._length__plain_text > (65 * 3 * 1))):
case (!(_explored._count__links > 1)):
case (_global__exploreNodeToBuildHTMLFor && (_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.5):
case (_global__exploreNodeToBuildHTMLFor && (_explored._count__plain_words / _global__exploreNodeToBuildHTMLFor._count__plain_words) > 0.5):
case ((_explored._length__plain_text == 0) && (_explored._count__links == 1) && (_explored._length__links_text < 65)):
case ((_explored._length__plain_text 0)):
break;

case ((_explored._length__links_text / _explored._length__all_text) 0); else { break; }
if (_explored._count__links_skip > 0); else { break; }
if (((_explored._count__links_skip / _explored._count__links) > 0.25) && (_explored._length__links_text / _explored._length__all_text) -1)
{
_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
switch (true)
{
case (_explored._length__plain_text > (65 * 3 * 2)):
case ($R.language == ‘cjk’ && (_explored._length__plain_text > (65 * 3 * 1))):
case (_global__exploreNodeToBuildHTMLFor && (_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.25):
case (_global__exploreNodeToBuildHTMLFor && (_explored._count__plain_words / _global__exploreNodeToBuildHTMLFor._count__plain_words) > 0.25):
case ((_explored._length__plain_text < 25) && (_explored._length__links_text 0)):
case (_node.getElementsByTagName && (_explored._length__plain_text 0)):
break;

default:
var _float = $(_node).css(‘float’);
if (_float == ‘left’ || _float == ‘right’); else { break; }
if ((_explored._length__links_text == 0) && ((_explored._count__images_large + _explored._count__images_medium) > 0)) { break; }

$R.debugOutline(_node, ‘clean-before’, ‘floating’);
return;
}
}

// above target
// ============
if (_custom_mode == ‘above-the-target’)
{
// is ignored?
if ($R.parsingOptions._elements_above_target_ignore.indexOf(‘|’+_tag_name+’|’) > -1)
{ $R.debugOutline(_node, ‘clean-before’, ‘above-target’); return; }

// is image?
if (_tag_name == ‘img’)
{
_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
if (_explored._is__image_large); else
{ $R.debugOutline(_node, ‘clean-before’, ‘above-target’); return; }
}

// has too many links?
//if (_node.getElementsByTagName && _node.getElementsByTagName(‘a’).length > 5)
// { $R.debugOutline(_node, ‘clean-before’, ‘above-target’); return; }
}

// headers that are images
// =======================
if (_tag_name.match(/^h(1|2|3|4|5|6)$/gi))
{
_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
switch (true)
{
case ((_explored._length__plain_text 0)):
$R.debugOutline(_node, ‘clean-before’, ‘skip-heading’);
return;
}
}

// start tag
// =========
if ($R.parsingOptions._elements_ignore_tag.indexOf(‘|’+_tag_name+’|’) > -1); else
{
/* mark */ _pos__start__before = _global__the_html.length;
/* add */ _global__the_html += ‘<'+_tag_name;

// attributes
// ==========

// allowed attributes
// ==================
if (_tag_name in $R.parsingOptions._elements_keep_attributes)
{
for (var i=0, _i=$R.parsingOptions._elements_keep_attributes[_tag_name].length; i ”)
{ _global__the_html += ‘ ‘+_attribute_name+’=”‘+(_attribute_value)+'”‘; }
}
}

// keep ID for all elements
// ========================
var _id_attribute = _node.getAttribute(‘id’);
if (_id_attribute > ”)
{ _global__the_html += ‘ id=”‘+_id_attribute+'”‘; }

// links target NEW
// ================
if (_tag_name == ‘a’)
{ _global__the_html += ‘ target=”_blank”‘; }

// close start
// ===========
if ($R.parsingOptions._elements_self_closing.indexOf(‘|’+_tag_name+’|’) > -1) { _global__the_html += ‘ />’; }
else { _global__the_html += ‘>’;}

/* mark */ _pos__start__after = _global__the_html.length;
}

// child nodes
// ===========
if ($R.parsingOptions._elements_self_closing.indexOf(‘|’+_tag_name+’|’) > -1); else
{
for (var i=0, _i=_node.childNodes.length; i -1)):
return;

case (($R.parsingOptions._elements_self_closing.indexOf(‘|’+_tag_name+’|’) > -1)):
/* mark */ _pos__end__before = _global__the_html.length;
/* mark */ _pos__end__after = _global__the_html.length;
break;

default:
/* mark */ _pos__end__before = _global__the_html.length;
/* end */ _global__the_html += ”;
/* mark */ _pos__end__after = _global__the_html.length;
break;
}

// clean — after
// =====

// we need to actually cut things out of
// “_global__the_html”, for stuff to not be there

// largeObject classes
// ===================
if (_tag_name == ‘iframe’ || _tag_name == ’embed’ || _tag_name == ‘object’)
{
_global__the_html = ”
+ _global__the_html.substr(0, _pos__start__before)
+ ‘


+ _global__the_html.substr(_pos__start__before, (_pos__end__after – _pos__start__before))
+ ‘


;
return;
}

// add image classes
// =================
if (_tag_name == ‘img’)
{
_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
switch (true)
{
case (_explored._is__image_skip):
$R.debugOutline(_node, ‘clean-after’, ‘skip-img’);
_global__the_html = _global__the_html.substr(0, _pos__start__before);
return;

case (_explored._is__image_large):

// add float class — for images too narrow/tall
// remove width/height — only for large images

// http://www.wired.com/threatlevel/2011/05/gps-gallery/?pid=89&viewall=true
// http://david-smith.org/blog/2012/03/10/ios-5-dot-1-upgrade-stats/index.html
// http://www.turntablekitchen.com/2012/04/dutch-baby-with-caramelized-vanilla-bean-pears-moving-through-the-decades/

_global__the_html = ”
+ _global__the_html.substr(0, _pos__start__before)
+ ‘
<div class="readableLargeImageContainer'
+ (($(_node).width() = 250) ? ‘ float’ : ”)
+ ‘”>’
+ _global__the_html.substr(_pos__start__before, (_pos__end__after – _pos__start__before)).replace(/width=”([^=]+?)”/gi, ”).replace(/height=”([^=]+?)”/gi, ”)
+ ‘


;
return;
}
}

// large images in links
// =====================
if (_tag_name == ‘a’)
{
_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
switch (true)
{
case (_explored._count__images_large == 1):
_global__the_html = ”
+ _global__the_html.substr(0, _pos__start__after-1)
+ ‘ class=”readableLinkWithLargeImage”>’
+ _global__the_html.substr(_pos__start__after, (_pos__end__before – _pos__start__after))
+ ‘‘
;
return;

case (_explored._count__images_medium == 1):
_global__the_html = ”
+ _global__the_html.substr(0, _pos__start__after-1)
+ ‘ class=”readableLinkWithMediumImage”>’
+ _global__the_html.substr(_pos__start__after, (_pos__end__before – _pos__start__after))
+ ‘‘
;
return;
}
}

// too much content
// ================
if ($R.parsingOptions._elements_too_much_content.indexOf(‘|’+_tag_name+’|’) > -1)
{
_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
switch (true)
{
case (_tag_name == ‘h1’ && (_explored._length__all_text > (65 * 2))):
case (_tag_name == ‘h2’ && (_explored._length__all_text > (65 * 2 * 3))):
case ((_tag_name.match(/^h(3|4|5|6)$/) != null) && (_explored._length__all_text > (65 * 2 * 5))):
case ((_tag_name.match(/^(b|i|em|strong)$/) != null) && (_explored._length__all_text > (65 * 5 * 5))):
$R.debugOutline(_node, ‘clean-after’, ‘too-much-content’);
_global__the_html = ”
+ _global__the_html.substr(0, _pos__start__before)
+ _global__the_html.substr(_pos__start__after, (_pos__end__before – _pos__start__after))
;
return;
}
}

// empty elements
// ==============
switch (true)
{
case (($R.parsingOptions._elements_self_closing.indexOf(‘|’+_tag_name+’|’) > -1)):
case (($R.parsingOptions._elements_ignore_tag.indexOf(‘|’+_tag_name+’|’) > -1)):
case (_tag_name == ‘td’):
break;

default:
var _contents = _global__the_html.substr(_pos__start__after, (_pos__end__before – _pos__start__after));
_contents = _contents.replace(/(
)/gi, ”);
_contents = _contents.replace(/(


)/gi, ”);

// for rows, clear empty cells
if (_tag_name == ‘tr’)
{
_contents = _contents.replace(/

/gi, ”);
}

// for tables, clear empty rows
if (_tag_name == ‘table’)
{
_contents = _contents.replace(/

]*?>/gi, ”);
_contents = _contents.replace(/

/gi, ”);
}

var _contentsLength = $R.measureText__getTextLength(_contents);

switch (true)
{
case (_contentsLength == 0 && _tag_name == ‘p’):
_global__the_html = _global__the_html.substr(0, _pos__start__before) + ‘

‘;
return;

case (_contentsLength == 0):
case ((_contentsLength -1)):
$R.debugOutline(_node, ‘clean-after’, ‘blank’);
_global__the_html = _global__the_html.substr(0, _pos__start__before);
return;
}
break;
}

// too much missing
// ================
if ($R.parsingOptions._elements_link_density.indexOf(‘|’+_tag_name+’|’) > -1)
{
_explored = (_explored || $R.getContent__exploreNodeAndGetStuff(_node, true));
var
_contents = _global__the_html
.substr(_pos__start__after, (_pos__end__before – _pos__start__after))
.replace(/(]+)>)/gi, ”),
_contentsLength = $R.measureText__getTextLength(_contents),
_initialLength = 0
+ _explored._length__all_text
+ (_explored._count__images_small * 10)
+ (_explored._count__images_skip * 10)
+ (_node.getElementsByTagName(‘iframe’).length * 10)
+ (_node.getElementsByTagName(‘object’).length * 10)
+ (_node.getElementsByTagName(’embed’).length * 10)
+ (_node.getElementsByTagName(‘button’).length * 10)
+ (_node.getElementsByTagName(‘input’).length * 10)
+ (_node.getElementsByTagName(‘select’).length * 10)
+ (_node.getElementsByTagName(‘textarea’).length * 10)
;

// too much missing
switch (true)
{
case (!(_contentsLength > 0)):
case (!(_initialLength > 0)):
case (!((_contentsLength / _initialLength) < 0.5)):
case (!(($R.language == 'cjk') && (_contentsLength / _initialLength) 0.25))):
case (($R.language == ‘cjk’) && (_global__exploreNodeToBuildHTMLFor && ((_explored._length__plain_text / _global__exploreNodeToBuildHTMLFor._length__plain_text) > 0.1))):
break;

default:
$R.debugOutline(_node, ‘clean-after’, ‘missing-density’);
_global__the_html = _global__the_html.substr(0, _pos__start__before);
return;
}
}

// return
return;
};

// actually do it
_recursive(_nodeToBuildHTMLFor);

// return html
return _global__the_html;
};

// article title marker
// ====================
$R.articleTitleMarker__start = ‘

‘;
$R.articleTitleMarker__end = ‘

‘;

// article title check function
// ============================
$R.getContent__find__hasIsolatedTitleInHTML = function (_html)
{
return (_html.substr(0, $R.articleTitleMarker__start.length) == $R.articleTitleMarker__start);
};

// article title get function
// ============================
$R.getContent__find__getIsolatedTitleInHTML = function (_html)
{
// is it there?
if ($R.getContent__find__hasIsolatedTitleInHTML(_html)); else { return ”; }

// regex
var
_getTitleRegex = new RegExp($R.articleTitleMarker__start + ‘(.*?)’ + $R.articleTitleMarker__end, ‘i’),
_getTitleMatch = _html.match(_getTitleRegex)
;

// match?
if (_getTitleMatch); else { return ”; }

// return
return _getTitleMatch[1];
};

// find title in arbitrary html
// ============================
$R.getContent__find__isolateTitleInHTML = function (_html, _document_title)
{
// can’t just use (h1|h2|h3|etc) — we want to try them in a certain order
// =============================
var
_heading_pregs = [
/]*?>([sS]+?)/gi,
/]*?>([sS]+?)/gi,
/]*?>([sS]+?)/gi
],
_secondary_headings = ‘|h2|h3|h4|h5|h6|’,
_search_document_title = ‘ ‘ + _document_title.replace(/]+?>/gi, ”).replace(/s+/gi, ‘ ‘) + ‘ ‘
;

// loop pregs
// ==========
for (var i=0, _i=_heading_pregs.length; i -1)):
// will continue loop
break;

default:

// measurements
var
_heading_end_pos = _heading_pregs[i].lastIndex,
_heading_start_pos = (_heading_end_pos – _match[0].length),

_heading_type = _match[1],
_heading_text = _match[2].replace(/]*>/gi, ”).replace(/[nr]+/gi, ”),
_heading_text_plain = _heading_text.replace(/]+?>/gi, ”).replace(/s+/gi, ‘ ‘);
_heading_length = $R.measureText__getTextLength(_heading_text_plain),
_heading_words = [],

_to_heading_text = _html.substr(0, _heading_start_pos),
_to_heading_length = $R.measureText__getTextLength(_to_heading_text.replace(/]+?>/gi, ”).replace(/s+/gi, ‘ ‘))
;

// return?
switch (true)
{
case (!(_heading_length > 5)):
case (!(_heading_length < (65 * 3))):
case (!(_to_heading_length -1)):
// words in this heading
_heading_words = _heading_text_plain.split(‘ ‘);

// count words present in title
for (var j=0, _j=_heading_words.length, _matched_words=”; j -1) {
_matched_words += _heading_words[j] + ‘ ‘;
}
}

// break continues for loop
// nothing goes to switch’s default
// ================================

// no break?
var _no_break = false;
switch (true)
{
// if it’s big enough, and it’s a substring of the title, it’s good
case ((_heading_length > 20) && (_search_document_title.indexOf(_heading_text_plain) > -1)):

// if it’s slightly smaler, but is exactly at the begging or the end
case ((_heading_length > 10) && ((_search_document_title.indexOf(_heading_text_plain) == 1) || (_search_document_title.indexOf(_heading_text_plain) == (_search_document_title.length – 1 – _heading_text_plain.length)))):

_no_break = true;
break;
}

// break?
var _break = false;
switch (true)
{
// no break?
case (_no_break):
break;

// heading too long? — if not h2
case ((_heading_length > ((_search_document_title.length – 2) * 2)) && (_heading_type != ‘h2’)):

// heading long enough?
case ((_heading_length < Math.ceil((_search_document_title.length – 2) * 0.50))):

// enough words matched?
case ((_heading_length < 25) && (_matched_words.length < Math.ceil(_heading_length * 0.75))):
case ((_heading_length < 50) && (_matched_words.length < Math.ceil(_heading_length * 0.65))):
case ((_matched_words.length ” ? $R.document.title : ”)
;

// get title
// =========

// has title already?
_foundHTML = $R.getContent__find__isolateTitleInHTML(_foundHTML, _documentTitle);
$R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML);
$R.debugPrint(‘TitleSource’, ‘target’);

// get html above?
if ($R.articleTitle > ”); else
{

// get html above target?
// ======================

// global vars:
// _found
// _foundHTML
// _documentTitle
// _aboveNodes

var
_prevNode = _found._targetCandidate.__node,
_prevHTML = ”,
_aboveHTML = ”,
_differentTargets = (_found._firstCandidate.__node != _found._targetCandidate.__node)
;

(function ()
{

while (true)
{
// the end?
switch (true)
{
case (_prevNode.tagName && (_prevNode.tagName.toLowerCase() == ‘body’)):
case (_differentTargets && (_prevNode == _found._firstCandidate.__node)):
// enough is enough
return;
}

// up or sideways?
if (_prevNode.previousSibling); else
{
_prevNode = _prevNode.parentNode;
continue;
}

// previous
_prevNode = _prevNode.previousSibling;

// outline — element might be re-outlined, when buildHTML is invoked
if ($R.debug) { $R.debugOutline(_prevNode, ‘target’, ‘add-above’); }

// get html; add
_prevHTML = $R.getContent__buildHTMLForNode(_prevNode, ‘above-the-target’);
_aboveHTML = _prevHTML + _aboveHTML;
_aboveNodes.unshift(_prevNode);

// isolate title
_aboveHTML = $R.getContent__find__isolateTitleInHTML(_aboveHTML, _documentTitle);

// finished?
switch (true)
{
case ($R.measureText__getTextLength(_aboveHTML.replace(/]+?>/gi, ”).replace(/s+/gi, ‘ ‘)) > (65 * 3 * 3)):
case ($R.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
return;
}
}

})();

// is what we found any good?
// ==========================
switch (true)
{
case ($R.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
case (_differentTargets && (_aboveHTML.split(‘<a ').length < 3) && ($R.measureText__getTextLength(_aboveHTML.replace(/]+?>/gi, ”).replace(/s+/gi, ‘ ‘)) ”); else
{

// if all else failed, get document title
// ======================================

// global vars:
// _foundHTML
// _documentTitle

(function ()
{
// return?
// =======
if (_documentTitle > ”); else { return; }

// vars
var
_doc_title_parts = [],
_doc_title_pregs =
[
/( [-][-] |( [-] )|( [>][>] )|( [<][<] )|( [|] )|( [/] ))/i,
/(([:] ))/i
]
;

// loop through pregs
// ==================
for (var i=0, _i=_doc_title_pregs.length; i 1) { break; }
}

// sort title parts — longer goes higher up — i.e. towards 0
// ================
_doc_title_parts.sort(function (a, b)
{
switch (true)
{
case (a.length > b.length): return -1;
case (a.length 1 ? _doc_title_parts[0] : _documentTitle)
+ $R.articleTitleMarker__end

+ _foundHTML
;

})();
$R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML);
$R.debugPrint(‘TitleSource’, ‘document_title’);
}
}

// display
// =======
$R.$pages.html(”);
$R.displayPageHTML(_foundHTML, 1, $R.win.location.href);

// remember
// ========
$R.debugRemember[‘theTarget’] = _found._targetCandidate.__node;
$R.debugRemember[‘firstCandidate’] = _found._firstCandidate.__node;

// next
// ====
$R.nextPage__firstFragment__firstPage = _firstFragmentBefore;
$R.nextPage__firstFragment__lastPage = $R.getContent__nextPage__getFirstFragment(_foundHTML);;

$R.nextPage__loadedPages = [$R.win.location.href];
$R.getContent__nextPage__find($R.win, _found._links);

// return
return true;
};

$R.getContent__findInPage = function (_pageWindow)
{
// calculations
// ============

var
_firstCandidate = false,
_secondCandidate = false,
_targetCandidate = false
;

$R.debugTimerStart(‘ExploreAndGetStuff’);
var _stuff = $R.getContent__exploreNodeAndGetStuff(_pageWindow.document.body);
$R.debugPrint(‘ExploreAndGetStuff’, $R.debugTimerEnd()+’ms’);

$R.debugTimerStart(‘ProcessFirst’);
var _processedCandidates = $R.getContent__processCandidates(_stuff._candidates);
_firstCandidate = _processedCandidates[0];
_targetCandidate = _firstCandidate;
$R.debugPrint(‘ProcessFirst’, $R.debugTimerEnd()+’ms’);

// debug
if ($R.debug)
{
// debug first candidates
$R.log(‘First 5 Main Candidates:’);
for (var x in _processedCandidates)
{
if (x == 5) { break; }
$R.log(_processedCandidates[x], _processedCandidates[x].__node);
}

// highlight first
$R.debugOutline(_firstCandidate.__node, ‘target’, ‘first’);
}

// in case we stop
$R.debugPrint(‘Target’, ‘first’);

// do second?
switch (true)
{
case (!(_firstCandidate._count__containers > 0)):
case (!(_firstCandidate._count__candidates > 0)):
case (!(_firstCandidate._count__pieces > 0)):
case (!(_firstCandidate._count__containers > 25)):
break;

default:

$R.debugTimerStart(‘ProcessSecond’);
var _processedCandidatesSecond = $R.getContent__processCandidatesSecond(_processedCandidates);
_secondCandidate = _processedCandidatesSecond[0];
$R.debugPrint(‘ProcessSecond’, $R.debugTimerEnd()+’ms’);

// they’re the same
if (_firstCandidate.__node == _secondCandidate.__node) { break; }

// debug
if ($R.debug)
{
// log second candidates
$R.log(‘First 5 Second Candidates:’);
for (var x in _processedCandidatesSecond)
{
if (x == 5) { break; }
$R.log(_processedCandidatesSecond[x], _processedCandidatesSecond[x].__node);
}

// highlight second
$R.debugOutline(_secondCandidate.__node, ‘target’, ‘second’);
}

// compute again
// =============
_firstCandidate[‘__points_history_final’] = $R.getContent__computePointsForCandidateThird(_firstCandidate, _firstCandidate);
_firstCandidate[‘__points_final’] = _firstCandidate.__points_history_final[0];

_secondCandidate[‘__points_history_final’] = $R.getContent__computePointsForCandidateThird(_secondCandidate, _firstCandidate);
_secondCandidate[‘__points_final’] = _secondCandidate.__points_history_final[0];

// log results
// ===========
if ($R.debug)
{
$R.log(‘The 2 Candidates:’);
$R.log(_firstCandidate);
$R.log(_secondCandidate);
}

// are we selecting _second?
// =========================
switch (true)
{
case ((_secondCandidate.__candidate_details._count__lines_of_65_characters 1):
case ((_secondCandidate.__candidate_details._count__lines_of_65_characters > 20) && (_secondCandidate.__points_final / _firstCandidate.__points_final) > 0.9):
case ((_secondCandidate.__candidate_details._count__lines_of_65_characters > 50) && (_secondCandidate.__points_final / _firstCandidate.__points_final) > 0.75):
_targetCandidate = _secondCandidate;
$R.debugPrint(‘Target’, ‘second’);
break;
}

// print points
// ============
if ($R.debug)
{
$R.debugPrint(‘PointsFirst’, _firstCandidate[‘__points_history_final’][0].toFixed(2));
$R.debugPrint(‘PointsSecond’, _secondCandidate[‘__points_history_final’][0].toFixed(2));
}

break;
}

// highlight target
// ================
if ($R.debug)
{
$(_targetCandidate.__node).css({
‘box-shadow’:
‘inset 0px 0px 50px rgba(255, 255, 0, 0.95), 0px 0px 50px rgba(255, 255, 0, 0.95)’
});
}

// get html
// ========
$R.debugTimerStart(‘BuildHTML’);
var _html = $R.getContent__buildHTMLForNode(_targetCandidate.__node, ‘the-target’);
_html = _html.substr((_html.indexOf(‘>’)+1))
_html = _html.substr(0, _html.lastIndexOf(‘<'));
$R.debugPrint('BuildHTML', $R.debugTimerEnd()+'ms');

$R.debugTimerStart('BuildHTMLPregs');
_html = _html.replace(/]*)>(s*
)+/gi, ”);
_html = _html.replace(/(
s*)+/gi, ”);
_html = _html.replace(/(
s*)+]*)>/gi, ”);
_html = _html.replace(/(s*
)+/gi, ”);
_html = _html.replace(/(


s*


s*)+/gi, ‘


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

‘);
$R.debugPrint(‘BuildHTMLPregs’, $R.debugTimerEnd()+’ms’);

// return
// ======
return {
‘_html’: _html,
‘_links’: _stuff._links,
‘_targetCandidate’: _targetCandidate,
‘_firstCandidate’: _firstCandidate
};
};

// get first page fragment
// =======================

$R.getContent__nextPage__getFirstFragment = function (_html)
{
// remove all tags
_html = _html.replace(/]+?>/gi, ”);

// normalize spaces
_html = _html.replace(/s+/gi, ‘ ‘);

// return first 1000 characters
return _html.substr(0, 2000);
};

// get link parts
// ==============

// substr starting with the first slash after //
$R.getURLPath = function (_url)
{
return _url.substr(_url.indexOf(‘/’, (_url.indexOf(‘//’) + 2)));
};

// substr until the first slash after //
$R.getURLDomain = function (_url)
{
return _url.substr(0, _url.indexOf(‘/’, (_url.indexOf(‘//’) + 2)))
};

// find
// ====
$R.getContent__nextPage__find = function (_currentPageWindow, _linksInCurrentPage)
{
// page id
var _pageNr = ($R.nextPage__loadedPages.length + 1);

// get
// ===
var _possible = [];
if (_possible.length > 0); else { _possible = $R.getContent__nextPage__find__possible(_currentPageWindow, _linksInCurrentPage, 0.5); }
//if (_possible.length > 0); else { _possible = $R.getContent__nextPage__find__possible(_currentPageWindow, _linksInCurrentPage, 0.50); }

// none
if (_possible.length > 0); else
{ if ($R.debug) { $R.log(‘no next link found’); } return; }

if ($R.debug) { $R.log(‘possible next’, _possible); }

// the one
// =======
var _nextLink = false;

// next keyword?
// =============
(function ()
{
if (_nextLink) { return; }

for (var i=0, _i=_possible.length; i<_i; i++)
{
for (var j=0, _j=$R.nextPage__captionKeywords.length; j -1)
{
// length
// ======
if (_possible[i]._caption.length > $R.nextPage__captionKeywords[j].length * 2)
{ continue; }

// not keywords
// ============
for (var z=0, _z=$R.nextPage__captionKeywords__not.length; z -1)
{ _nextLink = false; return; }
}

// got it
// ======
_nextLink = _possible[i];
return;
}
}
}
})();

// caption matched page number
// ===========================
(function ()
{
if (_nextLink) { return; }

for (var i=0, _i=_possible.length; i<_i; i++)
{
if (_possible[i]._caption == (''+_pageNr))
{ _nextLink = _possible[i]; return; }
}
})();

// next keyword in title
// =====================
(function ()
{
if (_nextLink) { return; }

for (var i=0, _i=_possible.length; i ”); else { continue; }
if ($R.measureText__getTextLength(_possible[i]._caption) <= 2); else { continue; }

for (var j=0, _j=$R.nextPage__captionKeywords.length; j -1)
{
// length
// ======
if (_possible[i]._title.length > $R.nextPage__captionKeywords[j].length * 2)
{ continue; }

// not keywords
// ============
for (var z=0, _z=$R.nextPage__captionKeywords__not.length; z -1)
{ _nextLink = false; return; }
}

// got it
// ======
_nextLink = _possible[i];
return;
}
}
}
})();

// return?
// =======
if (_nextLink); else { return; }

// mark
// ====
$R.debugPrint(‘NextPage’, ‘true’);

if ($R.debug)
{
$R.debugOutline(_nextLink._node, ‘target’, ‘next-page’);
$R.log(‘NextPage Link’, _nextLink, _nextLink._node);
}

// process page
// ============
$R.getContent__nextPage__loadToFrame(_pageNr, _nextLink._href);
$R.nextPage__loadedPages.push(_nextLink._href);
};

// find with similarity
// ====================
$R.getContent__nextPage__find__possible = function (_currentPageWindow, _linksInCurrentPage, _distanceFactor)
{
var
_mainPageHref = $R.win.location.href,
_mainPageDomain = $R.getURLDomain(_mainPageHref),
_mainPagePath = $R.getURLPath(_mainPageHref)
;

var _links = $.map
(
_linksInCurrentPage,
function (_element, _index)
{
var
_href = _element.__node.href,
_path = $R.getURLPath(_href),
_title = (_element.__node.title > ” ? _element.__node.title.toLowerCase() : ”),
_caption = _element.__node.innerHTML.replace(/]+?>/gi, ”).replace(/&[^&s;]{1,10};/gi, ”).replace(/s+/gi, ‘ ‘).replace(/^ /, ”).replace(/ $/, ”).toLowerCase(),
_distance = $R.levenshteinDistance(_mainPagePath, _path)
;

var _caption2 = ”;
for (var i=0, _i=_caption.length, _code=0; i 127 ? (‘&#’+_code+’;’) : _caption.charAt(i));
}
_caption = _caption2;

switch (true)
{
case (!(_href > ”)):
case (_mainPageHref.length > _href.length):
case (_mainPageDomain != $R.getURLDomain(_href)):
case (_href.substr(_mainPageHref.length).substr(0, 1) == ‘#’):
case (_distance > Math.ceil(_distanceFactor * _path.length)):
return null;

default:
// skip if already loaded as next page
for (var i=0, _i=$R.nextPage__loadedPages.length; i<_i; i++)
{ if ($R.nextPage__loadedPages[i] == _href) { return null; } }

// return
return {
'_node': _element.__node,
'_href': _href,
'_title': _title,
'_caption': _caption,
'_distance': _distance
};
}
}
);

// sort — the less points, the closer to position 0
// ====
_links.sort(function (a, b)
{
switch (true)
{
case (a._distance b._distance): return 1;
default: return 0;
}
});

// return
return _links;
};

// load to frame
// =============
$R.getContent__nextPage__loadToFrame = function (_pageNr, _nextPageURL)
{
// do ajax
// =======
$.ajax
({
‘url’ : _nextPageURL,

‘type’ : ‘GET’,
‘dataType’ : ‘html’,
‘async’ : true,
‘timeout’: (10 * 1000),

//’headers’: { ‘Referrer’: _nextPageURL },

‘success’ : function (_response, _textStatus, _xhr) { $R.getContent__nextPage__ajaxComplete(_pageNr, _response, _textStatus, _xhr); },
‘error’ : function (_xhr, _textStatus, _error) { $R.getContent__nextPage__ajaxError(_pageNr, _xhr, _textStatus, _error); }
});
};

// ajax calbacks
// =============
$R.getContent__nextPage__ajaxError = function (_pageNr, _xhr, _textStatus, _error)
{
};

$R.getContent__nextPage__ajaxComplete = function (_pageNr, _response, _textStatus, _xhr)
{
// valid?
// ======
if (_response > ”); else { return; }

// script
// ======
var _script = ”
+ ”
+ ‘ function __this_page_loaded()’
+ ‘ {‘
+ ‘ window.setTimeout(‘
+ ‘ function () {‘
+ ($R.component ? ‘window.parent.’ : ‘window.parent.parent.’)
+ ‘$readable.getContent__nextPage__loadedInFrame(“‘+_pageNr+'”, window); }, ‘
+ ‘ 250’
+ ‘ );’
+ ‘ } ‘

+ ‘ if (document.readyState); else { __this_page_loaded(); } ‘

+ ‘ function __this_page_loaded_ready(delayedNrTimes)’
+ ‘ {‘
+ ‘ if (document.readyState != “complete” && delayedNrTimes ‘ ; // get html // ======== var _html = _response; // normalize // ========= _html = _html.replace(/<s+/gi, ‘<‘); _html = _html.replace(/s+>/gi, ‘>’); _html = _html.replace(/s+/>/gi, ‘/>’); // remove // ====== _html = _html.replace(/]*?>([sS]*?)</script>/gi, ”); _html = _html.replace(/]*?/>/gi, ”); _html = _html.replace(/]*?>([sS]*?)</noscript>/gi, ”); // add load handler // ================ _html = _html.replace(/</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) < 100): case ($R.levenshteinDistance(_firstFragment, $R.nextPage__firstFragment__lastPage) < 100): // mark $R.debugPrint(‘NextPage’, ‘false’); // mark again if ($R.debug) { $(‘#debugOutput__value__NextPage’).html(‘false’); } // pop page $R.nextPage__loadedPages.pop(); // break return false; default: // add to first fragemnts $R.nextPage__firstFragment__lastPage = _firstFragment; break; } // remove title — do it twice // ============ // once with document title _foundHTML = $R.getContent__find__isolateTitleInHTML(_foundHTML, ($R.document.title > ” ? $R.document.title : ”)); _foundHTML = _foundHTML.replace(_removeTitleRegex, ”); // once with article title _foundHTML = $R.getContent__find__isolateTitleInHTML(_foundHTML, $R.articleTitle); _foundHTML = _foundHTML.replace(_removeTitleRegex, ”); // display // ======= $R.displayPageHTML(_foundHTML, _pageNr, _pageWindow.location.href); // next // ==== $R.getContent__nextPage__find(_pageWindow, _found._links); }; // rewrites // ======== // rewrite displayPageHTML — for multi-page articles // ======================= $R.displayPageHTML = function (_processedPageHTML, _pageNr, _pageURL) { // skip first if (_pageNr > 1); else { return; } // push to pages $C._nextPages.push({ ‘_html’: _processedPageHTML, ‘_url’: _pageURL }); }; // rewrite makeRTL — for right-to-left pages // =============== $R.makeRTL = function () { $R.rtl = true; }; $R.makeNotRTL = function () { $R.rtl = false; } // set component object // ==================== window.ClearlyComponent = $C; window.$readable = $R; }

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

Public Domain.

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

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

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

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

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

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

This method produces a JSON text from a JavaScript value.

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

For example, this would serialize Dates as ISO strings.

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

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

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

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

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

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

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

Example:

text = JSON.stringify(['e', {pluribus: 'unum'}]);
// text is '["e",{"pluribus":"unum"}]'

text = JSON.stringify(['e', {pluribus: 'unum'}], null, 't');
// text is '[nt"e",nt{ntt"pluribus": "unum"nt}n]'

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

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

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

Example:

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

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

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

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

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

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

/*jslint evil: true */

/*global JSON */

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

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

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

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

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

Date.prototype.toJSON = function (key) {

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

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

var cx = /[u0000u00adu0600-u0604u070fu17b4u17b5u200c-u200fu2028-u202fu2060-u206fufeffufff0-uffff]/g,
escapable = /[\"x00-x1fx7f-x9fu00adu0600-u0604u070fu17b4u17b5u200c-u200fu2028-u202fu2060-u206fufeffufff0-uffff]/g,
gap,
indent,
meta = { // table of character substitutions
'b': '\b',
't': '\t',
'n': '\n',
'f': '\f',
'r': '\r',
'"' : '\"',
'\': '\\'
},
rep;

function quote(string) {

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

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

function str(key, holder) {

// Produce a string from holder[key].

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

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

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

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

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

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

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

case 'number':

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

return isFinite(value) ? String(value) : 'null';

case 'boolean':
case 'null':

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

return String(value);

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

case 'object':

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

if (!value) {
return 'null';
}

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

gap += indent;
partial = [];

// Is the value an array?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

var i;
gap = '';
indent = '';

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

if (typeof space === 'number') {
for (i = 0; i // <![CDATA[
// HTML5 placeholder plugin version 1.01
// Copyright (c) 2010-The End of Time, Mike Taylor, http://miketaylr.com
// MIT Licensed: http://www.opensource.org/licenses/mit-license.php
//
// Enables cross-browser HTML5 placeholder for inputs, by first testing
// for a native implementation before building one.
//
//
// USAGE:
//$('input[placeholder]').placeholder();

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

//sniffy sniff sniff — just to give extra left padding for the older
//graphics for type=email and type=url
var isOldOpera = $.browser.opera && $.browser.version < 10.5;

$.fn.placeholder = function(options) {
//merge in passed in options, if any
var options = $.extend({}, $.fn.placeholder.defaults, options),
//cache the original 'left' value, for use by Opera later
o_left = options.placeholderCSS.left;

//first test for native placeholder support before continuing
//feature detection inspired by ye olde jquery 1.4 hawtness, with paul irish
return (hasPlaceholder) ? this : this.each(function() {

//local vars
var $this = $(this),
inputVal = $.trim($this.val()),
inputWidth = $this.width(),
inputHeight = $this.height(),

//grab the inputs id for the , or make a new one from the Date
inputId = (this.id) ? this.id : ‘placeholder’ + (+new Date()),
placeholderText = options.placeholderText ? options.placeholderText : $this.attr(‘placeholder’),
placeholder = $(”+ placeholderText + ”);

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

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

//place the placeholder if the input is empty

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

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

//hide placeholder on focus
$this.focus(function(){
if (!$.trim($this.val())){
$this.next().hide();
};
});

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

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

‘,
placeholderText: null,

//more or less just emulating what webkit does here
//tweak to your hearts content
placeholderCSS: {
‘font’:’0.75em sans-serif’,
‘color’:’#bababa’,
‘position’: ‘absolute’,
‘left’:’5px’,
‘top’:’3px’,
‘overflow-x’: ‘hidden’
}
};
})(jQuery);
// ]]>// 0 ) {
Evernote.Logger.debug(“Found selection by win.getSelection()”);
hasSelection = true;
}
}
else if ( win.selection && typeof win.selection.createRange == ‘function’ ) {
sel = win.selection.createRange();
if ( win.selection.type == ‘Text’ && typeof sel.htmlText == ‘string’ && sel.htmlText.length > 0 ) {
Evernote.Logger.debug(“Found selection by win.selection”);
hasSelection = true;
}
}
else if ( doc.selection && (typeof doc.selection.createRange == ‘function’ || typeof doc.selection.createRange == ‘object’) ) {
sel = doc.selection.createRange();
if(doc.selection.type == “None”)
sel = undefined;
if ( (doc.selection.type == ‘Text’) && (typeof sel.htmlText == ‘string’) && (sel.htmlText.length > 0) ) {
Evernote.Logger.debug(“Found selection by doc.selection”);
hasSelection = true;
}
}

if ( sel && !hasSelection && deep ) {
var nestedDocs = Evernote.Utils.getNestedDocuments( doc );
for ( var i = 0; i 0 ) {
return framedSel;
}
}
}
}

//if do not find any selection in document, try to find selection in HTMLTextArea|Input.
//Get Selection object for TextArea, and set selection as a Range object
if(doc.activeElement)
Evernote.Logger.debug( “Check selection in INPUT TEXT area (input, textarea), for active element :” + doc.activeElement.nodeName );

var activeEl = doc.activeElement;
if ( activeEl && ( (window.HTMLInputElement && (activeEl instanceof window.HTMLInputElement && activeEl.type == “text”)) || ( window.HTMLTextAreaElement && (activeEl instanceof window.HTMLTextAreaElement)) ) ) {
if ( activeEl.selectionStart != activeEl.selectionEnd ) {
var range = doc.createRange();
var textNode = doc.createTextNode( activeEl.value );

range.setStart( textNode, activeEl.selectionStart );
range.setEnd( textNode, activeEl.selectionEnd );
sel = range;
}
}

return {
document : doc,
selection : sel
};
} catch(e) {
Evernote.Logger.error(“Failed to find selection on the page due to error ” + e);
//Do not throw exception here, it is better to not show error to user and allow to clip article or something else.
}
return {
document: doc,
selection: null
}
};
// ]]>// <![CDATA[
Evernote.JSSerializer = {

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

serialize : function( element, fullPage ) {
try {
var start = new Date().getTime();
var root = element || document.body.parentNode || document.body;
var serializer = new Evernote.NodeSerializer( window, new Evernote.ClipFullStylingStrategy() );
var parser = new Evernote.DomParser( window, null );
parser.parse( root, fullPage ? true: false, serializer);
var end = new Date().getTime();
Evernote.Logger.debug( "Clip.clipFullPage(): clipped body in " + (end – start) + " milliseconds" );
var images = [];
var imageUrls = serializer.getImagesUrls();

for(var i = 0; i < imageUrls.length; i++) {
images.push(Evernote.Utils.makeAbsolutePath(serializer.getDocumentBase(), imageUrls[i]).replace(/s/g, "%20"));
}
return {
content : serializer.getSerializedDom(),
imageUrls : images,
docBase : serializer.getDocumentBase()
}
}
catch ( e ) {
Evernote.Logger.error( "JSSerializer.serialize() failed: error = " + e );
throw e;
}
},

serializeSelection : function( range ) {
try {
if( !range ) {
if ( !this.hasSelection() ) {
Evernote.Logger.warn( "JSSerializer.serializeSelection(): no selection to clip" );
return;
}

range = Evernote.Utils.fixIERangeObject(this._selectionFinder.getRange());

if ( !range ) {
Evernote.Logger.warn( "JSSerializer.serializeSelection(): no range in selection" );
return;
}
}

var start = new Date().getTime();
var ancestor = (this._styleStrategy && Evernote.Utils.Selection.getCommonAncestorContainer(range).nodeType == Evernote.Node.TEXT_NODE
&& Evernote.Utils.Selection.getCommonAncestorContainer(range).parentNode) ? Evernote.Utils.Selection.getCommonAncestorContainer(range).parentNode : Evernote.Utils.Selection.getCommonAncestorContainer(range);

while ( typeof Evernote.ClipRules.NON_ANCESTOR_NODES[ ancestor.nodeName.toUpperCase() ] != 'undefined' && ancestor.parentNode ) {
if ( ancestor.nodeName.toUpperCase() == "BODY" ) {
break;
}
ancestor = ancestor.parentNode;
}

var serializer = new Evernote.NodeSerializer( window, new Evernote.ClipFullStylingStrategy() );
var parser = new Evernote.DomParser(window, Evernote.Utils.fixIERangeObject(range));
parser.parse( ancestor, false, serializer );

var end = new Date().getTime();
Evernote.Logger.debug( "JSSerializer.serializeSelection(): clipped selection in " + (end – start) + " milliseconds" );
var images = [];
var imageUrls = serializer.getImagesUrls();

for(var i = 0; i // // > 0));
var leftPosition = (((document.documentElement.clientWidth || document.body.clientWidth) / 2) – (container.offsetWidth / 2));
container.style.position = “absolute”;
container.style.top = (topPosition-20) + “px”;
container.style.left = (leftPosition – 90) + “px”;
};

Evernote.ClipNotificator.prototype.getWaitContainer = function( doc, msg ) {
Evernote.Logger.debug( “ClipNotificator.getWaitContainer()” );

var container = doc.getElementById( this.constructor.WAIT_CONTAINER_ID );
if ( !container ) {
container = doc.createElement( “evernotediv” );
if(Evernote.Utils.isQuirkMode()) {
container.className = “quirk-mode-container”;
}
container.id = this.constructor.WAIT_CONTAINER_ID;

var wait = doc.createElement( “div” );
wait.id = this.constructor.WAIT_CONTAINER_ID + “Content”;
if(Evernote.BrowserDetection.isLessThanIE9()) {
wait.className = “content-less-than-nine-container”;
}
container.appendChild( wait );

var center = doc.createElement( “center” );
wait.appendChild( center );

var spinner = doc.createElement( “div” );
spinner.id = “evernote-spinner-container”;
Evernote.GlobalUtils.absolutizeImages(spinner, “images/icon_scissors.png”);
center.appendChild( spinner );

var text = doc.createElement( “span” );
text.id = this.constructor.WAIT_CONTAINER_ID + “Text”;
center.appendChild( text );

container._waitMsgBlock = text;
container._waitMsgBlock.appendChild( doc.createTextNode( msg ) );
}

return container;
};

Evernote.ClipNotificator.prototype.clearWait = function( doc ) {
Evernote.Logger.debug( “ClipNotificator.clearWait()” );

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

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

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

// We keep a record of what we're currently showing (at least in some cases) so that we can update it in case the
// state of the page changes (like if the user scrolls).
var currentlyShownRect = null;
var currentRectOffsetTop = 0;
var currentRectOffsetLeft = 0;
var currentlyStatic = false;

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

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

blank();
}

function blank() {

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

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

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

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

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

// Makes a rectangle bigger in all directions by the number of pixels specified (or smaller, if 'amount' is
// negative). Returns the new rectangle.
function expandRect(rect, amount) {
return {
top: (rect.top – amount),
left: (rect.left – amount),
bottom: (rect.bottom + amount),
right: (rect.right + amount),
width: (rect.width + (2 * amount)),
height: (rect.height + (2 * amount))
};
}

function scrollToRect(rect) {
var sLeft = document.documentElement.scrollLeft;
var sTop = document.documentElement.scrollTop;

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

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

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

// We expand the rectangle for two reasons.
// 1) we want to expand it by the width of the stroke, so that when we draw out outline, it doesn't overlap our
// content.
// 2) We want to leave a little extra room around the content for aesthetic reasons.
rect = expandRect(rect, 8);
var x = rect.left;
var y = rect.top;
var width = rect.width;
var height = rect.height;

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

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

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

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

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

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

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

revealRect(mutableRect, true);
Evernote.Logger.debug(“Hide elements embeded”);
hideElements(“embed”, element);
hideElements(“object”, element);
Evernote.Logger.debug(“Hide elements iframe”);
hideElements(“iframe”, element);
Evernote.Logger.debug(“Show it”);
show();
}
else {
Evernote.Logger.warn(“Couldn’t create rectangle from element: ” + element.toString());
}
}

function hideAllActiveObjects() {
hideElements(“embed”);
hideElements(“object”);
hideElements(“iframe”);
}

function hideElements (tagName, exceptInElement) {
var els = document.getElementsByTagName(tagName);
for (var i = 0; i < els.length; i++) {
els[i].enSavedVisibility = els[i].style.visibility;
els[i].style.visibility = "hidden";
}
}

function showElements (tagName, inElement) {
if (!inElement) {
inElement = document;
}
var els = inElement.getElementsByTagName(tagName);
for (var i = 0; i // div.comic > img”,
“aspicyperspective.com”: “div.entry-content”,
“thewirecutter.com”: “div#content”,
“katespade.com”: “div#pdpMain”,
“threadless.com”: “section.product_section”,
“yelp.com”: “div#bizBox”,
“flickr.com”: “div#photo”,
“instagr.am”: “div.stage > div.stage-inner”,
“stackoverflow.com”: “div#mainbar”,
“makeprojects.com”: “div#guideMain”,
“cookpad.com”: “div#main”,
“imgur.com”: “div.image”,
“smittenkitchen.com”: “div.entry”,
“allrecipes.com”: “div#content-wrapper”,
“qwantz.com”: “img.comic”,
“questionablecontent.net”: “img#strip”,
“cad-comic.com”: “div#content”
}

var useFoundImage = [
“xkcd.com”
]

// These are the items we’re trying to collect. This first block is trivial.
var containsImages = Boolean(document.getElementsByTagName(“img”).length > 0);
var documentWidth = document.width;
var documentHeight = document.height;
var url = document.location.href;
var documentLength = document.body.textContent ? document.body.textContent.length : 0;

// These take slightly more work and are initialized only when requested.
var article = null;
var articleBoundingClientRect = null;
var selection = false; // This is easy to get, but is always “false” at load time until the user selects something.
var selectionIsInFrame = false;
var documentIsFrameset = false;
var selectionFrameElement = null;
var recommendationText = null;

// Internal state variables to keep us duplicating work.
var hasCheckedArticle = false;

// Experimental recognition of ‘image’ pages (like photo sites and comics).
function findImage() {
var imgs = document.getElementsByTagName(“img”);
var biggest = null;
var biggestArea = 0;
for (var i = 0; i biggestArea) {
biggest = imgs[i];
biggestArea = area;
}
}
return biggest;
}

function getAncestors(node) {
var an = [];
while (node) {
an.unshift(node);
node = node.parentNode;
}
return an;
}

function getDeepestCommonNode(nodeList1, nodeList2) {
var current = null;
for (var i = 0; i < nodeList1.length; i++) {
if (nodeList1[i] === nodeList2[i]) {
current = nodeList1[i];
}
else {
break;
}
}
return current;
}

function getCommonAncestor(nodeList) {
if (!nodeList.length) return null;

if (nodeList.length == 1) return nodeList[0];
var lastList = getAncestors(nodeList[0]);

var node = null;
for (var i = 1; i img”);
if (candidate.length > 0) {
Evernote.Logger.debug(“Found article in a single image”);
article = candidate.get(0);
articleBoundingClientRect = Evernote.ElementExtension.getBoundingClientRect(article);
}
}
}

// If we still didn’t find an article, let’s see if maybe it’s in a frame. Cleary fails on frames so we try this
// check before we use our clearly info.
if (!article) {
if (document.body.nodeName.toLowerCase() == “frameset”) {
documentIsFrameset = true;
var frame = findBiggestFrame();
if (frame && frame.contentDocument && frame.contentDocument.documentElement) {
selectionFrameElement = frame;
article = frame.contentDocument.documentElement;
articleBoundingClientRect = Evernote.ElementExtension.getBoundingClientRect(article);
}
}
}

// If we didn’t use any of our special case handling, we’ll use whatever clearly found.
if (!article) {
Evernote.Logger.debug(“Use clearly find article”);
if (data && data._elements && data._elements.length) {
article = data._elements[0];
if (data._elements.length > 1) {

// This will include *all* clearly elements (and whatever else in in between them).
article = getCommonAncestor(data._elements);

// This includes *just the last (and therefore most important)* element from the clearly detection.
// article = data._elements[data._elements.length – 1];
}

if (article.nodeType === ( window.Node ? window.Node.TEXT_NODE : 1)) {
article = article.parentNode;
}
}
}

if(article) {
if(Evernote.JQuery(article).closest(“#evernote-content”).length != 0)
article = undefined;
}

// If clearly found nothing (because it failed), then use the body of the document.
if (!article) {
article = document.body;
}

hasCheckedArticle = true;
callback();
}

// This will try and determine the ‘default’ page article. It will only run once per page, but it’s specifically
// called only on demand as it can be expensive.
function findArticle(callback) {

function afterInject() {
// If we’d previously computed an article element, but it’s lost its parent or become invisible, then we’ll try
// and re-compute the article. This can happen if, for example the page dynamically udaptes itself (like showing
// the latest news article in a box that updates periodically). This doesn’t guarantee that we clip something
// sane if this happens, (if the page re-writes itself while a clip is taking place, the results are
// indeterminate), but it will make such things less likely.
if (article &&
(!article.parentNode || !article.getBoundingClientRect || Evernote.ElementExtension.getBoundingClientRect(article).width == 0)) {
article = null;
hasCheckedArticle = false;
}
Evernote.Logger.debug(“afterInject”);
if (!hasCheckedArticle) {
Evernote.Logger.debug(“no article”);
if (!window || !window.ClearlyComponent)
{
Evernote.Logger.warn(“Couldn’t find clearly!”);
clearlyCallback(null, callback);
}
else {
Evernote.Logger.debug(“Call clearly to select article”);
try {
window.ClearlyComponent.getContentElementAndHTML(window, function(data){clearlyCallback(data, callback)});
} catch(e) {
Evernote.Logger.error(“Failed to find article by clearly due to error ” + e);
clearlyCallback(null, callback);
}
}
}
// If the page is big enough, clearly is excruciatingly slow. We’ll jsut get the whole page.
// @TODO: Maybe clearly can get faster.
else if (document.body.innerHTML.length > (1024 * 1024)) {
Evernote.Logger.warn(“Page over 1mb, skipping article detection.”);
clearlyCallback(null, callback);
}
else {
Evernote.Logger.debug(“callback”);
callback();
}
}

afterInject();

}

function findBiggestFrame() {
var frames = document.getElementsByTagName(“frame”);
var candidate = null;
var candidateSize = 0;
for (var i = 0; i candidateSize) {
candidate = frames[i];
candidateSize = area;
}
}
}
return candidate;
}

function getHostname() {
var match = document.location.href.match(/^.*?://(www.)?(.*?)(/|$)/);
if (match) {
return match[2];
}
return null;
}

function getDefaultArticle(callback) {
Evernote.Logger.debug(“getDefaultArticle”);
findArticle(function(){callback(article)});
// Article already exists, so we’ll return it.
if (article) return article;
}

// Looks for selections in the current document and descendent (i)frames.
// Returns the *first* non-empty selection.
function getSelection() {

// First we check our main window and return a selection if that has one.
var selection = window.getSelection();
if (selection && selection.rangeCount && !selection.isCollapsed) {
return selection;
}

// Then we’ll try our frames and iframes.
var docs = [];
var iframes = document.getElementsByTagName(“iframe”);
for (var i = 0; i < iframes.length; i++) {
docs.push(iframes[i]);
}
var frames = document.getElementsByTagName("frame");
for (var i = 0; i < frames.length; i++) {
docs.push(frames[i]);
}

var urlBase = document.location.href.replace(/^(https?://.*?)/.*/i, "$1").toLowerCase();
for (var i = 0; i < docs.length; i++) {

// If frames/iframes fail a same origin policy check, then they'll through annoying errors, and we wont be able
// to access them anyway, so we attempt to skip anything that wont match.
if (docs[i].src && docs[i].src.toLowerCase().substr(0, urlBase.length) !== urlBase) {
continue;
}

var doc = docs[i].contentDocument;

if (doc) {
var frameSelection = doc.getSelection();
if (frameSelection && frameSelection.rangeCount && !frameSelection.isCollapsed) {
selectionIsInFrame = true;
selectionFrameElement = docs[i];
return frameSelection;
}
}
else {
Evernote.Logger.warn("iframe contained no Document object.");
}
}

// Didn't find anything.
return null;
}

function getText(node, soFar, maxLen) {
if (node.nodeType == Evernote.Node.TEXT_NODE) {
var trimmed = node.textContent.trim().replace(/s+/g, " ");
if (trimmed === " " || trimmed === "") return soFar;
return soFar + " " + trimmed;
}

var banned = [
"script",
"noscript"
];

if (node.nodeType == Evernote.Node.ELEMENT_NODE) {
if (Evernote.ArrayExtension.indexOf(banned, node.nodeName.toLowerCase()) == -1) {
for (var i = 0; i maxLen) {
return soFar;
}
}
}
}
return soFar;
}

function getRecommendationText() {
var text = “”;
var MAX_LEN = 5000;
var selection = getSelection();
if (selection) {
var df = selection.getRangeAt(0).cloneContents();
var div = document.createElement(“div”);
div.appendChild(df);
text = getText(div, “”, MAX_LEN);
}

else if (article) {
text = getText(article, “”, MAX_LEN);
}
else {
text = getText(document.body, “”, MAX_LEN);
}
text = document.title + ” ” + text;
return text;
}

// Note: you must call getSelection() first to populate this field!
function getSelectionFrame() {
return selectionFrameElement;
}

function checkClearly() {
var clearlyDoc = Evernote.ElementExtension.querySelector(“iframe#readable_iframe”);
if (clearlyDoc) clearlyDoc = clearlyDoc.contentDocument;
if (clearlyDoc) clearlyDoc = Evernote.ElementExtension.querySelector(“body#body div#box”, clearlyDoc);
if (clearlyDoc) {
article = clearlyDoc;
articleBoundingClientRect = Evernote.ElementExtension.getBoundingClientRect(article);
}
}

// @TODO: This is fairly incomplete.
function getFavIconUrl() {
var links = document.getElementsByTagName(“link”);
var i;
for (i = 0; i // <![CDATA[
Evernote.Scroller = function Scroller( tab ) {
this.initialize( tab );
};

Evernote.Scroller.prototype._tab = null;

Evernote.Scroller.prototype.initialize = function ( tab ) {
this._tab = tab;
var scrollX = (this._tab.pageXOffset !== undefined) ? this._tab.pageXOffset : (this._tab.document.documentElement || this._tab.document.body.parentNode ||this._tab.document.body).scrollLeft;
var scrollY = (this._tab.pageYOffset !== undefined) ? this._tab.pageYOffset : (this._tab.document.documentElement || this._tab.document.body.parentNode || this._tab.document.body).scrollTop;
this.initialPoint = {
x: scrollX,
y: scrollY
};
};

Evernote.Scroller.prototype.scrollTo = function ( endPoint, time, resolution ) {
this.abort();

this.endPoint = endPoint;
this.step = 0;
this.calculatePath( time, resolution );
var self = this;
this.proc = setInterval( function () {
if ( !self.doScroll() ) {
self.abort();
}
},
resolution );
};

Evernote.Scroller.prototype.calculatePath = function ( time, resolution ) {
this.path = [];
var sx = this.initialPoint.x;
var sy = this.initialPoint.y;
var ex = this.endPoint.x;
var ey = this.endPoint.y;
var k = (Math.PI * resolution) / time;
for ( var i = -(Math.PI / 2); i // <![CDATA[
function ContentPreview() {
Evernote.Logger.debug("Start creating preview box");
var contentVeil = new ContentVeil();
Evernote.Logger.debug("End creating preview box");
// Stores a reference to the last element that we used as a preview.
var previewElement = null;
var article = null;

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

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

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

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

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

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

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

function buildUrlElement() {
var urlEl = document.createElement("div");
urlEl.id = "evernotePreviewContainer";
var className = "evernotePreviewContainer evernotePreviewUrlContainer";
if(Evernote.Utils.isQuirkMode()) {
className += " evernote-middle-fixed-position-quirks"
}
urlEl.className = className;
return urlEl;
}

Evernote.Logger.debug("Build url element");
var urlElement = buildUrlElement();

function showUrlElement() {
Evernote.Logger.debug("ContentPreview: showUrlElement start");
if (!Evernote.ElementExtension.hasParentNode(urlElement)) {
document.body.appendChild(urlElement);
}

// Make sure we're centered in the window.
var elStyle = Evernote.ElementExtension.getComputedStyle(urlElement, '');
var w = parseInt(Evernote.StyleElementExtension.getPropertyValue(elStyle, "width"));
var h = parseInt(Evernote.StyleElementExtension.getPropertyValue(elStyle, "height"));

if (w && h) {
urlElement.style.marginLeft = (0 – w / 2) + "px";
urlElement.style.marginTop = (0 – h / 2) + "px";
}
Evernote.Logger.debug("ContentPreview: showUrlElement end");
}

function hideUrlElement() {
if (Evernote.ElementExtension.hasParentNode(urlElement)) {
urlElement.parentNode.removeChild(urlElement);
}
}

function showOverlay() {
previewElement = null;
clear();
contentVeil.reset();
contentVeil.show();
contentVeil.hideAllActiveObjects();
}

function previewUrl() {
previewElement = null;
clear();
contentVeil.reset();
contentVeil.gray();
var title = window.document.title;
var url = PageContext.url;
var favIconUrl =PageContext.getFavIconUrl();
urlElement.innerHTML = Evernote.GlobalUtils.createUrlClipContent(title, url, favIconUrl);
showUrlElement();
contentVeil.hideAllActiveObjects();
}

// This doesn't remove internal state of previewElement, because another script may not have finished clipping until
// after the page looks 'clear'.
function clear() {
contentVeil.reset();
contentVeil.hide();
hideUrlElement();
removePreviewLegend();
}

function _previewArticle (showHelp) {
Evernote.Logger.debug("Start previewing article element");
if (previewElement)
{
var selectionFrame;
if (typeof Evernote.pageInfo !== undefined) {
selectionFrame = Evernote.pageInfo.getSelectionFrame();
}
Evernote.Logger.debug("Selection frame selected " + selectionFrame);
if (selectionFrame) {

var rect = {
width: selectionFrame.width,
height: selectionFrame.height,
top: selectionFrame.offsetTop,
bottom: (selectionFrame.height + selectionFrame.offsetTop),
left: selectionFrame.offsetLeft,
right: (selectionFrame.width + selectionFrame.offsetLeft)
};
Evernote.Logger.debug("contentVeil.revealStaticRect " + rect);
contentVeil.revealStaticRect(contentVeil.expandRect(rect, -9), true);
Evernote.Logger.debug("contentVeil.show ");
contentVeil.show();
}
else {
Evernote.Logger.debug("contentVeil.outlineElement");
contentVeil.outlineElement(previewElement, true);
}
if (showHelp) {
Evernote.Logger.debug("showPreviewLegend");
showPreviewLegend();
Evernote.Logger.debug("setTimeout:hidePreviewLegend");
setTimeout(hidePreviewLegend, 6000);
}
}
else {
Evernote.Logger.warn("Couldn't find a preview element. We should switch to 'full page' mode.");
}
}

/**
* Finds and preview article element.
* If reloadArticle is specified and equals to true, then discard previously found article and re-start search of article again.
* Otherwise use article found on previous call (if this is the first call then article will be searched anyway).
* @param reloadArticle
*/
function previewArticle (reloadArticle) {
var showHelp = Evernote.Options.articleSelection == Evernote.ArticleSelectionOptions.ENABLED;

clear();
previewElement = null;
if(reloadArticle) {
article = null;
}
Evernote.Logger.debug("Evernote.pageinfo " + Evernote.pageInfo);
if (typeof Evernote.pageInfo !== undefined) {
if(!article) {
previewElement = Evernote.pageInfo.getDefaultArticle(function(el){
Evernote.Logger.debug("Article element " + el.nodeName);
previewElement = el;
article = el;
Evernote.Logger.debug("Preview article ");
_previewArticle(showHelp);
});
article = previewElement;
} else {
previewElement = article;
_previewArticle(showHelp);
}
}
else {
Evernote.Logger.warn("Couldn't find a 'pageInfo' object.");
}
}

// When nudging the preview around the page, we want to skip nodes that aren't interesting. This includes empty
// nodes, containers that have identical contents to the already selected node, invisible nodes, etc.
// @TODO: There's a lot more we could probably add here.
function looksInteresting(candidate, given) {

if (!candidate) {
Evernote.Logger.warn("Can't determine if 'null' is interesting (it's probably not).");
return false;
}
// This is the parent of our 'HTML' tag, but has no tag itself. There's no reason it's ever more interesting than
// the HTML element.
if (candidate === window.document) {
return false;
}

//Disable clip of evernote main popup
if(Evernote.JQuery(candidate).closest("#evernote-content").length != 0) {
return false;
}

// We don't want to clip the clipper controls notification.
// @TODO: Probably want something similar for the content veil.
if (candidate === previewLegend) {
return false;
}

// Elements with neither text nor images are not interesting.
if (!candidate.textContent && (candidate.getElementsByTagName("img").length === 0)) {
return false;
}

// Elements with 0 area are not interesting.
var rect = Evernote.ElementExtension.getBoundingClientRect(candidate);
if (!rect.width || !rect.height) {
return false;
}

// Invisible elements are not interesting.
var style = Evernote.ElementExtension.getComputedStyle(candidate);
if ((style.visibility === "hidden") || (style.display === "none")) {
return false;
}

// If the nodes have a parent/child relationship, then they're only interesting if their visible contents differ.
if (candidate.parentNode && given.parentNode) {
if ((candidate.parentNode == given) || (given.parentNode == candidate)) {
if ((candidate.textContent === given.textContent) &&
(candidate.getElementsByTagName("img").length === given.getElementsByTagName("img").length)) {
return false;
}
}
}
return true;
}

// Returns the current article element, which may not be the same as the auto-detected one if the user has 'nudged'
// the selection around the page.
function getArticleElement() {
return previewElement;
}

function nudgePreview(direction) {
Evernote.Logger.debug("nudgePreview start");
if (!previewElement) {
return;
}

var oldPreview = previewElement;
Evernote.Logger.debug("nudgePreview: direction is " + direction);
Evernote.Logger.debug("nudgePreview: previewElement is " + previewElement.nodeName);
switch (direction) {
case "up":
var temp = previewElement.parentNode;
while (temp) {
if (looksInteresting(temp, previewElement)) {
// If we move up and then down, we want to move back to where we started, not the first child.
temp.enNudgeDescendToNode = previewElement;
previewElement = temp;
break;
}
temp = temp.parentNode;
}
break;
case "down":
Evernote.Logger.debug("nudgePreview: previewElement.enNudgeDescendToNode is " + previewElement.enNudgeDescendToNode);
if (previewElement.enNudgeDescendToNode)
{
var temp = previewElement.enNudgeDescendToNode;
// @TODO: make sure we clean these up somewhere else if we never reverse our nudging.
try {
delete previewElement.enNudgeDescendToNode;
} catch(e) {
previewElement.enNudgeDescendToNode = undefined;
}
previewElement = temp;
break;
}
Evernote.Logger.debug("nudgePreview: previewElement.children.length = " + previewElement.children.length);
for (var i = 0; i < previewElement.children.length; i++) {
Evernote.Logger.debug("nudgePreview: checking child is " + previewElement.children[i].nodeName);
if (looksInteresting(previewElement.children[i], previewElement)) {
Evernote.Logger.debug("nudgePreview: found interesting child" + previewElement.children[i]);
previewElement = previewElement.children[i];
break;
}
}
break;
case "left":
var temp = previewElement.previousElementSibling;
while (temp) {
if (looksInteresting(temp, previewElement)) {
previewElement = temp;
break;
}
temp = temp.previousElementSibling;
}
break;
case "right":
var temp = previewElement.nextElementSibling;
while (temp) {
if (looksInteresting(temp, previewElement)) {
previewElement = temp;
break;
}
temp = temp.nextElementSibling;
}
break;
default:
Evernote.Logger.warn("Unhandled nudge direction: " + direction);
}

// Drawing is expensive so don't bother if nothing changed.
if (oldPreview !== previewElement) {
Evernote.Logger.debug("nudgePreview: draw new element.");
contentVeil.outlineElement(previewElement, true);
}
}

function previewFullPage() {

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

var rect = {
bottom: (h – borderWidth),
top: (borderWidth),
left: (borderWidth),
right: (w – borderWidth),
width: (w – (2 * borderWidth)),
height: (h – (2 * borderWidth))
}

clear();
contentVeil.reset();
contentVeil.revealStaticRect(rect, true);
contentVeil.show();
contentVeil.hideAllActiveObjects();
}

// Creates the union of two rectangles, which is defined to be the smallest rectangle that contains both given
// rectangles.
function unionRectangles(rect1, rect2) {
var rect = {
top: (Math.min(rect1.top, rect2.top)),
bottom: (Math.max(rect1.bottom, rect2.bottom)),
left: (Math.min(rect1.left, rect2.left)),
right: (Math.max(rect1.right, rect2.right))
}
rect.width = rect.right – rect.left;
rect.height = rect.bottom – rect.top;

return rect;
}

// Returns true if the rectangles match, false otherwise.
function rectanglesEqual(rect1, rect2) {
if (!rect1 && !rect2) return true;
if (!rect1) return false;
if (!rect2) return false;
if (rect1.top != rect2.top) return false;
if (rect1.bottom != rect2.bottom) return false;
if (rect1.left != rect2.left) return false;
if (rect1.right != rect2.right) return false;
if (rect1.width != rect2.width) return false;
if (rect1.height != rect2.height) return false;
return true;
}

// If the user triple-clicks a paragraph, we will often get a selection that includes the next paragraph after the
// selected one, but only up to offset 0 in that paragraph. This causes the built in getBoundingClientRect to give a
// box that includes the whole trailing paragraph, even though none of it is actually selected. Instead, we'll build
// our own bounding rectangle that omits the trailing box.
// @TODO: Currently this computes a box that is *too big* if you pass it a range that doesn't have start and/or end
// offsets that are 0, because it will select the entire beginning and ending node, instead of jsut the selected
// portion.
function computeAlternateBoundingBox(range) {

// If the end of selection isn't at offset 0 into an element node (rather than a text node), then we just return the
// original matching rectangle.
if ((range.endOffset !== 0) ||
(range.endContainer.nodeType !== Evernote.Node.ELEMENT_NODE) ||
( range.startContainer && range.startContainer.getBoundingClientRect) ||
( range.endContainer && range.endContainer.getBoundingClientRect) ||
( range.commonAncestorContainer && range.commonAncestorContainer.getBoundingClientRect)
) {
var rect = Evernote.ElementExtension.getBoundingClientRect(range);
if(rect.top == 0 && rect.bottom == 0 && rect.left == 0 && rect.right == 0) {
if(range.commonAncestorContainer && range.commonAncestorContainer.getBoundingClientRect) {
rect = range.commonAncestorContainer.getBoundingClientRect();
} else if(range.startContainer && range.startContainer.getBoundingClientRect) {
rect = range.startContainer.getBoundingClientRect();
} else if(range.endContainer && range.endContainer.getBoundingClientRect) {
rect = range.endContainer.getBoundingClientRect();
}
}
var mutableRect = {
top: rect.top,
bottom: rect.bottom,
left: rect.left,
right: rect.right,
width: rect.width,
height: rect.height
};
return mutableRect;
}

// This is the one we don't want.
var endElementRect = null;
try {
endElementRect = Evernote.ElementExtension.getBoundingClientRect(range.endContainer);
}
catch(ex) {
Evernote.Logger.warn("Couldn't get a bounding client rect for our end element, maybe it's a text node.");
}

// We look for a rectangle matching our end element, and if we find it, we don't copy it to our list to keep.
// You'd think we could just grab the last element in range.getClientRects() here and trim that one, which might be
// true, but the spec makes no claim that these are returned in order, so I don't want to rely on that.
// We keep track if we remove a rectangle, as we're only trying to remove one for the trailnig element. If there are
// more than one matching rectangle, we want to keep all but one of them.
var foundEnd = false;
var keptRects = [];
var initialRects = range.getClientRects();
for (var i = 0; i < initialRects.length; i++) {
if (rectanglesEqual(endElementRect, initialRects[i]) && !foundEnd) {
foundEnd = true;
}
else {
keptRects.push(initialRects[i]);
}
}

// Now compute our new bounding box and return that.
if (keptRects.length == 0) return Evernote.ElementExtension.getBoundingClientRect(range);
if (keptRects.length == 1) return keptRects[0];

var rect = keptRects[0];
for (var i = 1; i 1) {
newRect = unionRectangles(Evernote.ElementExtension.getBoundingClientRect(element), rect);
}
if (element.children) {
for (var i = 0; i < element.children.length; i++) {
newRect = applyElementRect(element.children[i], newRect);
}
}
return newRect;
}

// In the case of positioned elements, a bounding box around an element doesn't necessarily contain its child
// elements, so we have this method to combine all of these into one bigger box. ContentVeil calls this function.
function computeDescendantBoundingBox(element) {
if (!element) return {top: 0, bottom: 0, left: 0, right: 0, width: 0, height: 0};
return applyElementRect(element, Evernote.ElementExtension.getBoundingClientRect(element));
}

function previewSelection(sel) {

var selection;
var selectionFrame;
if(sel) {
selection = sel;
}
else if (typeof Evernote.pageInfo !== undefined) {
selection = Evernote.pageInfo.getSelection();
// If our selection is in a frame or iframe, we'll compute an offset relative to that, so we need to adjust it by
// the offset of the frame.
selectionFrame = Evernote.pageInfo.getSelectionFrame();
}

contentVeil.reset();

var frameRect = null;
if (selectionFrame) {
frameRect = Evernote.ElementExtension.getBoundingClientRect(selectionFrame);
}

var range, rect, i;

// If !selection, then something has gone awry.
if (selection) {
clear();
contentVeil.reset();
// We attempt to highlight each selection, but this hasn't been tested for more than a single selection.
for (i = 0; i // // <![CDATA[
Evernote.ArrayExtension = {
indexOf : function(element, searchStr) {
if (element.indexOf)
return element.indexOf(searchStr);
for(var i = 0; i >> 0;
if (typeof fun != “function”)
throw new TypeError();

var res = [];
var thisp = arguments[1];
for (var i = 0; i // <![CDATA[
Evernote.StyleElementExtension = {
getPropertyValue : function(styleObj, propertyName) {
var props = propertyName;
if(!(props instanceof Array)) {
props = [propertyName];
}
Evernote.Logger.debug("Evernote.StyleElementExtension.getPropertyValue: number of properties to check " + props.length);
for(var i = 0; i // <![CDATA[
Evernote.GlobalUtils = {};
(function(){
var urlMatcher = /^(.*?)://((www.)?(.*?))(:d+)?(/.*?)(?.*)?$/;

var BAD_FAV_ICON_URLS = {"http://localhost/favicon.ico&quot;: true};

Evernote.GlobalUtils.componentizeUrl = function(url) {
var data = {
protocol: null,
domain: null,
domainNoWww: null,
port: null,
path: null,
queryString: null
};
var matches = urlMatcher.exec(url);
data.protocol = matches[1];
data.domain = matches[2];
data.domainNoWww = matches[4];
data.port = matches[5];
data.path = matches[6];
data.queryString = matches[7];
return data;
};

Evernote.GlobalUtils.getMessageCode = function(messageConst) {
Evernote.Logger.debug("getMessageCode: " + messageConst);
return Evernote.Messages[messageConst];
};

Evernote.GlobalUtils.absolutizeImages = function(element, path) {
if(path) {
Evernote.Utils.changeBackgroundImage(element, Evernote.Addin.getPath("resources") + path);
}
else if(element.attributes && element.attributes["background-image"]) {
Evernote.Utils.changeBackgroundImage(element, Evernote.Addin.getPath("resources") + element.attributes["background-image"].value);
}
Evernote.Logger.debug("absolutizeImages: walk through children");
for (var i = 0; i < element.children.length; i++) {
Evernote.GlobalUtils.absolutizeImages(element.children[i]);
}
Evernote.Logger.debug("absolutizeImages: end");
};

Evernote.GlobalUtils.localize = function(element) {
Evernote.Logger.debug("localize: Before lowercase");
Evernote.Logger.debug("localize: element " + element);
Evernote.Logger.debug("localize: element.nodeName " + element.nodeName);
var node = element.nodeName.toLowerCase();
Evernote.Logger.debug("localize: after lowercase");
if (node == "input" || node == "textarea") {
var type = element.type;
if (node == "textarea") type = "textarea";
switch (element.type) {
case "text":
case "textarea":
case "button":
case "submit":
case "search":
if (element.attributes && element.attributes["placeholder"]) {
var localizedMessage = Evernote.Addin.getLocalizedMessage(Evernote.GlobalUtils.getMessageCode(element.attributes["placeholder"].value));
Evernote.Logger.debug("localizedMessage is " + localizedMessage);
if (localizedMessage) {
try {
element.attributes["placeholder"].value = localizedMessage;
} catch(e) {
var placeHolderAttr = document.createAttribute("placeholder");
placeHolderAttr.nodeValue = localizedMessage;
element.setAttribute("placeholder", localizedMessage);
}
}
}

if (element.attributes && element.attributes["message"]) {
var localizedMessage = Evernote.Addin.getLocalizedMessage(Evernote.GlobalUtils.getMessageCode(element.attributes["message"].value));
Evernote.Logger.debug("localizedMessage is " + localizedMessage);
if (localizedMessage) {
element.value = localizedMessage;
}
}
break;

// unlocalizable.
case "checkbox":
case "password":
case "hidden":
break;

default:
throw new Error("We need to localize the value of input elements.");
}
}

else if (element.attributes && element.attributes["message"]) {
var localizedMessage = Evernote.Addin.getLocalizedMessage(Evernote.GlobalUtils.getMessageCode(element.attributes["message"].value));
if (localizedMessage) {
element.innerHTML = localizedMessage;
}
}

if (element.title){
var localizedTitle = Evernote.Addin.getLocalizedMessage(Evernote.GlobalUtils.getMessageCode(element.title));
if (localizedTitle) {
element.title = localizedTitle;
}
}

for (var i = 0; i < element.children.length; i++) {
Evernote.GlobalUtils.localize(element.children[i]);
}
};

Evernote.GlobalUtils.getQueryParams = function(url) {
var data = Evernote.GlobalUtils.componentizeUrl(url);
var queryString = data.queryString;
var params = {};
if (!queryString) {
return params;
};
queryString = queryString.substr(1); // Don't want the question mark.
queryString = queryString.split("#")[0]; // Get rid of any fragment identifier.
var pairs = queryString.split("&");
var i;
for (i = 0; i < pairs.length; i++) {
var item = pairs[i].split("=");
if (item[1]) {
item[1] = item[1].replace(/+/g, " ");
}
params[item[0].toLowerCase()] = item[1];
}
return params;
};

Evernote.GlobalUtils.escapeXML = function(str) {
var map = {
"&" : "&",
"” : “>”,
“”” : “"”,
“‘” : “'”
};

var a = str.split(“”);
for (var i = 0; i < a.length; i++) {
if (map[a[i]]) {
a[i] = map[a[i]];
}
}
return a.join("");
};

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

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

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

} else {
content = “” + content + ““;
}
return content;
};

Evernote.GlobalUtils.executeOnDomReady = function(callback) {
Evernote.JQuery(document).ready(function() {
callback();
});
};

Evernote.GlobalUtils.isDocumentLoaded = function(doc) {
return doc.readyState == “complete” || doc.readyState == “interactive”;
};
})();
// ]]>// <![CDATA[
/**
* Global utilities.
*/
Evernote.Utils = {

Pause : function(ms) {
ms += new Date().getTime();
while (new Date() < ms){}
},

saveSelection : function(win) {
Evernote.Logger.debug( "Utils.SaveSelection()" );
var selectionFinder = new Evernote.SelectionFinder(win.document);
selectionFinder.find( true );
if(selectionFinder.hasSelection()) {
return Evernote.Utils.cloneRange(selectionFinder.getRange());
}
return null;
},

clearSelection : function(doc) {
if(doc.getSelection) {
doc.getSelection().removeAllRanges();
}
},

/**
* Make selection of passed range in document.
* @param doc – DOM object
* @param range – selection range
*/
selectRange : function(doc, range) {
if(doc.getSelection) {
doc.getSelection().addRange(range);
}
else if (doc.selection && range) {
range.select();
}
},

/**
* Creates copy of selection range only if it supports it, otherwise returns same range
* @param range – Range object
* @return {Range}
*/
cloneRange : function(range) {
Evernote.Logger.debug("cloneRange: start");
if(range && range.cloneRange) {
return range.cloneRange();
}
if(range.duplicate) {
Evernote.Logger.debug("cloneRange: result = " + range.duplicate());
return range.duplicate();
}
return range;
},

/**
* Checks whether selection is presented.
* @param win – window object that should be checked.
* @return true – if selection is presented, false otherwise.
*/
hasSelection : function(win) {
Evernote.Logger.debug( "Utils.hasSelection()" );
var selectionFinder = new Evernote.SelectionFinder(win.document)
if ( selectionFinder.hasSelection() ) {
return true;
}
else {
selectionFinder.find( true );
return selectionFinder.hasSelection();
}
},

/**
* Gets favicon url from the document (if any)
* @param doc – document to inspect.
* @return url to the favicon or null.
*/
getFavIconUrl : function(doc) {
var links = doc.getElementsByTagName("link");
var i;
for (i = 0; i length) {
return (str.substring(0, length-3) + “…”);
}
return str;
},

/**
* Change new line symbol to html
*/
newLineToBr : function(str) {
return str.replace(/(rn|n|r)/gm, ”
“);
},

/**
* Encodes html specific characters (, &, etc.) in specified string
* @param str – string to encode.
* @return new string with encoded characters.
*/
htmlEncode : function( str ) {
var result = “”;
for ( var i = 0; i = 55296 )
result += aChar;
else if ( charcode > 0x7f ) {
result += “&#” + charcode + “;”;
}
else if ( aChar == ‘>’ ) {
result += “>”;
}
else if ( aChar == ‘<' ) {
result += "<";
}
else if ( aChar == '&' ) {
result += "&";
}
else {
result += str[ i ] ? str[ i ] : str.charAt(i);
}
}

return result;
},

/**
* Absolutize specified url by specified base.
* @param base – base url
* @param href – relative url (from base)
*/
makeAbsolutePath : function ( base, href ) {
function parseURI( url ) {
var m = String( url ).replace( /^s+|s+$/g, '' ).match( /^([^:/?#]+:)?(//(?:[^:@]*(?::[^:@]*)?@)?(([^:/?#]*)(?::(d*))?))?([^?#]*)(?[^#]*)?(#[sS]*)?/ );
// authority = '//' + user + ':' + pass '@' + hostname + ':' port
return (m ? {
href : m[ 0 ] || '',
protocol : m[ 1 ] || '',
authority : m[ 2 ] || '',
host : m[ 3 ] || '',
hostname : m[ 4 ] || '',
port : m[ 5 ] || '',
pathname : m[ 6 ] || '',
search : m[ 7 ] || '',
hash : m[ 8 ] || ''
} : null);
}

function absolutizeURI( base, href ) {// RFC 3986
function removeDotSegments( input ) {
var output = [];
input.replace( /^(..?(/|$))+/, '' )
.replace( //(.(/|$))+/g, '/' )
.replace( //..$/, '/../' )
.replace( //?[^/]*/g, function ( p ) {
if ( p === '/..' ) {
output.pop();
}
else {
output.push( p );
}
} );
return output.join( '' ).replace( /^//, input.charAt( 0 ) === '/' ? '/' : '' );
}

href = parseURI( href || '' );
base = parseURI( base || '' );

return !href || !base ? null : (href.protocol || base.protocol) +
(href.protocol || href.authority ? href.authority : base.authority) +
removeDotSegments( href.protocol || href.authority || href.pathname.charAt( 0 ) === '/' ? href.pathname :
(href.pathname ? ((base.authority && !base.pathname ? '/' : '') +
base.pathname.slice( 0, base.pathname.lastIndexOf( '/' ) + 1 ) + href.pathname) : base.pathname) ) +
(href.protocol || href.authority || href.pathname ? href.search : (href.search || base.search)) +
href.hash;
}
return absolutizeURI( base, href );

},

getNestedDocuments : function( doc ) {
Evernote.Logger.debug( "Utils.getNestedDocuments()" );

var docs = [ ];
try {
var frames = ( doc ) ? doc.getElementsByTagName( "frame" ) : [ ];
for ( var i = 0; i < frames.length; ++i ) {
if ( frames[ i ].contentDocument ) {
docs.push( frames[ i ].contentDocument );
}
}

var iframes = ( doc ) ? doc.getElementsByTagName( "iframe" ) : [ ];
for ( i = 0; i 0)?(p[i].substr(0, 1).toUpperCase() + p[i].substr(1)):p[i];
}
s = element.currentStyle[str];
}
return s;
}

function getPercentageSize(size) {
var currentFontSize = parseFloat(size);
var htmlFontSize = 16;
var htmlElement = document.getElementsByTagName(“html”);
if(htmlElement && htmlElement.length > 0) {
htmlFontSize = Evernote.Utils.getFontSizeInPixels(computedStyle(htmlElement[0], “font-size”));
}
return htmlFontSize * currentFontSize / 100;
}

var size = elementFontSize;
if(size.indexOf(“em”) > -1) {
var defFont = computedStyle(document.body, “font-size”);
if(defFont.indexOf(“pt”) > -1){
defFont = Math.round(parseInt(defFont)*96/72);
} else if(defFont.indexOf(“%”) > -1) {
defFont = getPercentageSize(defFont);
} else{
defFont = parseInt(defFont);
}
size = Math.round(defFont * parseFloat(size));
}
else if(size.indexOf(“pt”) > -1){
size = Math.round(parseInt(size)*96/72)
} else if(size.indexOf(“%”) > -1) {
size = getPercentageSize(size);
}
return parseInt(size);
},

innerWidth : function() {
if(window.innerWidth)
return window.innerWidth;

var doc= (document.body.clientWidth)? document.body: document.documentElement;
return doc.clientWidth;
},

innerHeight : function() {
if(window.innerHeight)
return window.innerHeight;

var doc= (document.body.clientHeight)? document.body: document.documentElement;
return doc.clientHeight;
},

scrollTop : function() {
var doc = document.body.scrollTop ? document.body : document.documentElement;
return doc.scrollTop;
},

scrollLeft : function() {
var doc = document.body.scrollLeft ? document.body : document.documentElement;
return doc.scrollLeft;
},

/**
* Stopped propagation of keydown events for passed selector.
* @param selector – could be element or jquery selector.
*/
hardInput : function(selector) {
this.elem = Evernote.JQuery(selector);
this.elem.keydown(function(e) {
e.stopPropagation();
});
},

isQuirkMode : function() {
return document.compatMode == “BackCompat”;
},

isInstanceOf : function(obj, type) {
if(obj && type) {
try {
return obj instanceof type;
} catch (e) {
return type.toString().indexOf(typeof obj) != -1;
}
}
return false;
},

changeBackgroundImage : function(element, localpath) {
if(element.style) {
element.style.backgroundImage = “url(‘file:///” + localpath.replace(/\/g, “/”).replace(/s/g, “%20”) + “‘)”;
}
},

format: function(str) {
var args = arguments;
return str.replace(/{(d+)}/g, function (m, n) { return args[(n | 0)+1]; });
},

fixIERangeObject : function(range,win) { //Only for IE8 and below.
win=win || window;

if(!range) return null;
if(!range.startContainer && win.document.selection) { //IE8 and below

var _findTextNode=function(parentElement,text) {
//Iterate through all the child text nodes and check for matches
//As we go through each text node keep removing the text value (substring) from the beginning of the text variable.
var container=null,offset=-1;
for(var node=parentElement.firstChild; node; node=node.nextSibling) {
if(node.nodeType==3) {//Text node
var find=node.nodeValue;
var pos=text.indexOf(find);
if(pos==0 && text!=find) { //text==find is a special case
text=text.substring(find.length);
} else {
container=node;
offset=text.length-1; //Offset to the last character of text. text[text.length-1] will give the last character.
break;
}
}
}
//Debug Message
//alert(container.nodeValue);
return {node: container,offset: offset}; //nodeInfo
};

var rangeCopy1=range.duplicate(), rangeCopy2=range.duplicate(); //Create a copy
var rangeObj1=range.duplicate(), rangeObj2=range.duplicate(); //More copies :P

rangeCopy1.collapse(true); //Go to beginning of the selection
rangeCopy1.moveEnd(‘character’,1); //Select only the first character
rangeCopy2.collapse(false); //Go to the end of the selection
rangeCopy2.moveStart(‘character’,-1); //Select only the last character

//Debug Message
// alert(rangeCopy1.text); //Should be the first character of the selection
var parentElement1=rangeCopy1.parentElement(), parentElement2=rangeCopy2.parentElement();

//If user clicks the input button without selecting text, then moveToElementText throws an error.
if(window.HTMLInputElement && (parentElement1 instanceof window.HTMLInputElement || parentElement2 instanceof HTMLInputElement)) {
return null;
}
rangeObj1.moveToElementText(parentElement1); //Select all text of parentElement
rangeObj1.setEndPoint(‘EndToEnd’,rangeCopy1); //Set end point to the first character of the ‘real’ selection
rangeObj2.moveToElementText(parentElement2);
rangeObj2.setEndPoint(‘EndToEnd’,rangeCopy2); //Set end point to the last character of the ‘real’ selection

var text1=rangeObj1.text; //Now we get all text from parentElement’s first character upto the real selection’s first character
var text2=rangeObj2.text; //Here we get all text from parentElement’s first character upto the real selection’s last character

var nodeInfo1=_findTextNode(parentElement1,text1);
var nodeInfo2=_findTextNode(parentElement2,text2);

//Finally we are here
range.startContainer=nodeInfo1.node;
range.startOffset=nodeInfo1.offset;
range.endContainer=nodeInfo2.node;
range.endOffset=nodeInfo2.offset+1; //End offset comes 1 position after the last character of selection.
}
return range;
},

fixedPosition : function(win, el, topOffset, immediate) {
function applyPosition(elem) {
if(elem) {
var scrollPosition = win.document.documentElement.scrollTop || win.document.body.scrollTop;
var offset;
if(typeof topOffset == “function”) {
offset = topOffset();
} else {
offset = scrollPosition + topOffset;
}
elem.css(“top”, offset + “px”);
}
}

if(el) {
var elem = Evernote.JQuery(el);
if(Evernote.Utils.isQuirkMode()) {
elem.css(“position”, “absolute”);
win.attachEvent(“onscroll”, function() {
applyPosition(elem);
});
if(immediate) {
applyPosition(elem);
}
}
}
},

Selection : {
getRangeCount : function(selection) {
if(selection.rangeCount) {
return selection.rangeCount;
}
return 1;
},

getRangeAt : function(selection, pos) {
if(selection.getRangeAt) {
selection.getRangeAt(pos);
}
return selection;
},

getCommonAncestorContainer : function(range) {
if(range.commonAncestorContainer) {
return range.commonAncestorContainer;
}
else if(range.parentElement) {
return range.parentElement();
}
return null;
}
}
};
// ]]>// // // // // <![CDATA[
Evernote.ResponseReceiver = {
parsers : [],
receivers : [],

onResponse: function(str) {
Evernote.Logger.debug("Response received" + str);
for(var i in Evernote.ResponseReceiver.parsers) {
if(Evernote.ResponseReceiver.parsers[i].canParse && Evernote.ResponseReceiver.parsers[i].canParse(str)) {
Evernote.ResponseReceiver.notify(Evernote.ResponseReceiver.parsers[i].parse(str));
}
}
},

registerParser: function(parser) {
Evernote.ResponseReceiver.parsers.push(parser);
},

subscribe: function(receiver) {
Evernote.ResponseReceiver.receivers.push(receiver);
},

notify: function(data) {
for(var i=0; i // // // // // // <![CDATA[
//"use strict";

Evernote.ElementSerializerFactory = {
getImplementationFor : function( node ) {
for ( var i = 0; i // // 0 && value != “inherit” );
} ) );

Evernote.Logger.debug( “Inh parent style:” + styles[styles.length – 1].toString() );

if ( !recur || parent == document.body ) {
break;
}
else {
parent = parent.parentElement;
}
}

//merge styles starting from low-priority parent styles
Evernote.Logger.debug( “Styles inh for processing:” + (styles.length – 1) );
for ( var i = styles.length – 1; i >= 0; i– ) {
var style = styles[ i ];
var fontSize = fontStyle.getStyle( “font-size” );
var overFontStyle = style.getStyle( “font-size” );
Evernote.Logger.debug( “fontSize:” + fontSize + ” ;overFontStyle: ” + overFontStyle );
if ( fontSize && overFontStyle ) {
var resFontSize = fontSize.match( sizeUnitRegExp );
if ( resFontSize == null ) {
continue;
}
var sizeVal = resFontSize[1];
var sizeUnit = resFontSize[2];
var resOverFontSize = overFontStyle.match( sizeUnitRegExp );

if ( resOverFontSize == null ) {
continue;
}
var overSizeVal = resOverFontSize[1];
var overSizeUnit = resOverFontSize[2];

if ( Evernote.ArrayExtension.indexOf(dynamicUnit, overSizeUnit ) != -1 ) {
if ( overSizeUnit == “%” ) {
style.addStyle( { “font-size”:(parseFloat( sizeVal ) * parseFloat( overSizeVal ) / 100).toString() + sizeUnit } );
}
else {
style.addStyle( { “font-size”:(parseFloat( sizeVal ) * parseFloat( overSizeVal )).toString() + ((sizeUnit != “em”) ? sizeUnit : overSizeUnit) } );
}
}
Evernote.Logger.debug( “Style: ” + i + ” ;Eval inh style:” + style.toString() );
}

fontStyle.mergeStyle( style, true );
}

return fontStyle;
};

Evernote.ClipFullStylingStrategy.prototype.inheritBackgroundForNode = function ( node, recur ) {
Evernote.Logger.debug( “ClipFullStylingStrategy.inheritBackgroundForNode()” );

var bgStyle = new Evernote.ClipStyle();
if ( !node ) {
return bgStyle;
}

var parent = node;
var styles = [ ];
var nodes = [ ];
var topElement = (document.body.parentNode) ? document.body.parentNode : document.body;
try {
while ( parent ) {
nodes.push( parent );
var filterFn = function ( prop, value ) {
return !(prop == “background-repeat” && (value == “no-repeat” || value == “repeat-y”));
};
var nodeStyle = new Evernote.ClipStyle( this.getNodeStyle( parent ), filterFn, Evernote.ClipStyle.CSS_GROUP.getExtForStyle( “background” ) );

if ( !nodeStyle.getStyle( “background-repeat” ) ) {
nodeStyle.removeStyle( “background-image” );
}
if ( !nodeStyle.getStyle( “background-color” ) && parent.getAttribute( “bgcolor” ) ) {
Evernote.Logger.debug( “Set bgcolor attribute: ” + parent.getAttribute( “bgcolor” ) );
nodeStyle.addStyle( {“background-color”:parent.getAttribute( “bgcolor” )} );
}

nodeStyle = this.evalBgPosition( node, parent, nodeStyle );
if ( nodeStyle.getStylesNames().length > 0 ) {
styles.push( nodeStyle );
Evernote.Logger.debug( “Add inh bg style ” + nodeStyle.toString() );
}

if ( !recur || parent == topElement ) {
break;
}
else {
parent = parent.parentNode;
}
}
} catch(e) {
Evernote.Logger.error(“ClipFullStylingStrategy.prototype.inheritBackgroundForNode failed to error ” + e);
}

return styles;
};

Evernote.ClipFullStylingStrategy.prototype.evalBgPosition = function ( node, inhNode, nodeBgStyle ) {
Evernote.Logger.debug( “Dettermining background image offset” );

var strPosToPercent = {
“center”:”50%”,
“top”:”0%”,
“bottom”:”100%”,
“right”:”100%”,
“left”:”0%”
};

var regExp = /url((.*?))/;
var bgImage = nodeBgStyle.getStyle( “background-image” );
if ( !regExp.test( nodeBgStyle.getStyle( “background-image” ) ) || (bgImage && nodeBgStyle.getStyle( “background-image” ).indexOf( “data:image” ) >= 0) ) {
Evernote.Logger.debug( “bgStyle: ” + nodeBgStyle.toString() );
return nodeBgStyle;
}

nodeBgStyle.addStyle( { “background-image”: Evernote.StyleElementExtension.getPropertyValue(Evernote.ElementExtension.getComputedStyle( inhNode, null, this.getNodeView( inhNode ) ), Evernote.IEStylePropertiesMapping.getPropertyNameFor(“background-image”) ).replace( regExp, “url(‘$1’)” ) } );

var actualImage = new Image();
actualImage.src = nodeBgStyle.getStyle( “background-image” ).match( regExp )[ 1 ].replace( /[“‘]/g, “” );
var bgNodeRect = this.getOffsetRect( inhNode );
var nodeRect = this.getOffsetRect( node );
var yDelta = nodeRect.top – bgNodeRect.top;
var xDelta = nodeRect.left – bgNodeRect.left;

var bgNodeBgPosX = 0;
var bgNodeBgPosY = 0;
var origPosX = 0;
var origPosY = 0;

if ( nodeBgStyle.getStyle( “background-position” ) ) {
var bgPosition = nodeBgStyle.getStyle( “background-position” ).split( ” ” );
bgNodeBgPosX = strPosToPercent[bgPosition[ 0 ]] != null ? strPosToPercent[bgPosition[ 0 ]] : bgPosition[ 0 ];
bgNodeBgPosY = strPosToPercent[bgPosition[ 1 ]] != null ? strPosToPercent[bgPosition[ 1 ]] : bgPosition[ 1 ];

if ( bgNodeBgPosX && bgNodeBgPosX.indexOf( “%” ) > 0 ) {
origPosX = parseInt( bgNodeRect.width ) * (parseInt( bgNodeBgPosX ) / 100);
origPosX -= parseInt(actualImage.width) * (parseInt(bgNodeBgPosX) / 100);
}
else {
origPosX = parseInt( bgNodeBgPosX );
}

if ( bgNodeBgPosY && bgNodeBgPosY.indexOf( “%” ) > 0 ) {
origPosY = parseInt( bgNodeRect.height ) * (parseInt( bgNodeBgPosY ) / 100);
origPosY -= parseInt(actualImage.height) * (parseInt(bgNodeBgPosY) / 100);
}
else {
origPosY = parseInt( bgNodeBgPosY );
}
}

if ( isNaN( origPosX ) ) {
origPosX = 0;
}
if ( isNaN( origPosY ) ) {
origPosY = 0;
}

var xOffset = 0 – xDelta + origPosX;
var yOffset = 0 – yDelta + origPosY;

nodeBgStyle.addStyle( { “background-position”:(xOffset + “px ” + yOffset + “px”) } );
Evernote.Logger.debug( “bgStyle: ” + nodeBgStyle.toString() );
return nodeBgStyle;
};

Evernote.ClipFullStylingStrategy.prototype.getOffsetRect = function ( elem ) {
Evernote.Logger.debug( “ClipCSSStyleWalker.getOffsetRect()” );

var box = Evernote.ElementExtension.getBoundingClientRect(elem);
var body = elem.ownerDocument.body;
var docElem = elem.ownerDocument.documentElement;

var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;
var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;

var clientTop = docElem.clientTop || body.clientTop || 0;
var clientLeft = docElem.clientLeft || body.clientLeft || 0;

var top = box.top + scrollTop – clientTop;
var left = box.left + scrollLeft – clientLeft;

return { top:Math.round( top ), left:Math.round( left ), width:box.width, height:box.height };
};
// ]]>// 0) {
nodeName = “div”;
}
var attributesToKeepForNode = this.KEEP_NODE_ATTRIBUTES[nodeName];
if(attributesToKeepForNode) {
var keepAttributeForNode = typeof attributesToKeepForNode[attrName] != ‘undefined’;
}
return typeof this.NOKEEP_NODE_ATTRIBUTES[ attrName ] != ‘undefined’
|| !keepAttributeForNode
|| attrName.substring( 0, 2 ) == “on”
|| attrName.indexOf(“xml”) == 0
|| attrValue.indexOf(“function(“) >= 0
|| (attrName == “href” && attrValue.substring( 0, 11 ) == “javascript:”);
},

isConditionalNode : function( node ) {
return node && typeof this.CONDITIONAL_NODES[ node.nodeName.toUpperCase() ] != ‘undefined’;
},

translateNode : function( node ) {
var nodeName = this.NODE_NAME_TRANSLATIONS[ node.nodeName.toUpperCase() ] || node.nodeName.toUpperCase();
return (typeof this.SUPPORTED_NODES[ nodeName ] != “undefined”) ? nodeName.toLowerCase() : this.NODE_NAME_TRANSLATIONS[ “*” ].toLowerCase();
},

isSupportedNode : function( node ) {
return node && typeof this.SUPPORTED_NODES[ node.nodeName.toUpperCase() ] != ‘undefined’;
},

isRejectedNode : function( node ) {
return node && typeof this.REJECTED_NODES[ node.nodeName.toUpperCase() ] != ‘undefined’;
},

isNonAncestorNode : function( node ) {
return node && typeof this.NON_ANCESTOR_NODES[ node.nodeName.toUpperCase() ] != ‘undefined’;
},

isSelfClosingNode : function( node ) {
return node && typeof this.SELF_CLOSING_NODES[ node.nodeName.toUpperCase() ] != ‘undefined’;
}
};

Evernote.ClipRules.KEEP_NODE_ATTRIBUTES = {
“a” : {
“title”: null,
“dir” : null,
“accesskey”: null,
“charset”: null,
“type”: null,
“name”: null,
“href”: null,
“hreflang”: null,
“rel”: null,
“rev”: null,
“shape”: null,
“coords”: null,
“target”: null
},

“abbr” : {
“title”: null,
“dir” : null
},

“acronym” : {
“title”: null,
“dir” : null
},

“address” : {
“title”: null,
“dir” : null
},

“area” : {
“title”: null,
“dir” : null,
“accesskey”: null,
“shape”: null,
“coords”: null,
“href”: null,
“nohref”: null,
“alt”: null,
“target”: null
},

“b” : {
“title”: null,
“dir” : null
},

“bdo” : {
“title”: null,
“dir” : null
},

“big” : {
“title”: null,
“dir” : null
},

“blockquote” : {
“title”: null,
“dir” : null,
“cite”: null
},

“br” : {
“title”: null,
“clear”: null
},

“caption” : {
“title”: null,
“dir” : null,
“align”: null
},

“center” : {
“title”: null,
“dir” : null
},

“cite” : {
“title”: null,
“dir” : null
},

“code” : {
“title”: null,
“dir” : null
},

“col” : {
“title”: null,
“dir” : null,
“span” : null,
“width” : null,
“align” : null,
“char” : null,
“charoff” : null,
“valign” : null
},

“colgroup” : {
“title”: null,
“dir” : null,
“span” : null,
“width” : null,
“align” : null,
“char” : null,
“charoff” : null,
“valign” : null
},

“dd” : {
“title”: null,
“dir” : null
},

“del” : {
“title”: null,
“dir” : null,
“cite” : null,
“datetime” : null
},

“dfn” : {
“title”: null,
“dir” : null
},

“div” : {
“title”: null,
“dir” : null,
“align” : null
},

“dl”: {
“title”: null,
“dir” : null,
“compact” : null
},

“dt”: {
“title”: null,
“dir” : null
},

“em”: {
“title”: null,
“dir” : null
},

“font”: {
“title”: null,
“dir” : null,
“size” : null,
“color” : null,
“face” : null
},

“h1”: {
“title”: null,
“dir” : null,
“align” : null
},

“h2”: {
“title”: null,
“dir” : null,
“align” : null
},

“h3”: {
“title”: null,
“dir” : null,
“align” : null
},

“h4”: {
“title”: null,
“dir” : null,
“align” : null
},

“h5”: {
“title”: null,
“dir” : null,
“align” : null
},

“h6”: {
“title”: null,
“dir” : null,
“align” : null
},

“hr”: {
“title”: null,
“dir” : null,
“align” : null,
“noshade” : null,
“size” : null,
“width” : null
},

“i”: {
“title”: null,
“dir” : null
},

“img”: {
“title”: null,
“dir” : null,
“src” : null,
“alt” : null,
“name” : null,
“longdesc” : null,
“height” : null,
“width” : null,
“usemap” : null,
“ismap” : null,
“align” : null,
“border” : null,
“hspace” : null,
“vspace” : null
},

“en-media”: {
“type” : null,
“hash” : null,
“title” : null,
“dir” : null,
“alt” : null,
“longdesc” : null,
“height” : null,
“width” : null,
“usemap” : null,
“align” : null,
“border” : null,
“hspace” : null,
“vspace” : null
},

“ins”: {
“title”: null,
“dir” : null,
“cite” : null,
“datetime” : null
},

“kbd”: {
“title”: null,
“dir” : null
},

“li”: {
“title”: null,
“dir” : null,
“type” : null,
“value” : null
},

“map”: {
“dir” : null,
“title” : null,
“name” : null
},

“ol”: {
“title” : null,
“dir” : null,
“type” : null,
“compact” : null,
“start” : null
},

“p”: {
“title” : null,
“dir” : null,
“align” : null
},

“pre”: {
“title” : null,
“dir” : null,
“width” : null
},

“s”: {
“title” : null,
“dir” : null
},

“samp”: {
“title” : null,
“dir” : null
},

“small”: {
“title” : null,
“dir” : null
},

“span”: {
“title” : null,
“dir” : null
},

“strike”: {
“title” : null,
“dir” : null
},

“strong”: {
“title” : null,
“dir” : null
},

“sub”: {
“title” : null,
“dir” : null
},

“sup”: {
“title” : null,
“dir” : null
},

“table”: {
“title” : null,
“dir” : null,
“summary” : null,
“width” : null,
“border” : null,
“cellspacing” : null,
“cellpadding” : null,
“align” : null,
“bgcolor” : null
},

“tbody”: {
“title” : null,
“dir” : null,
“align” : null,
“char” : null,
“charoff” : null,
“valign” : null
},

“td”: {
“title” : null,
“dir” : null,
“align” : null,
“char” : null,
“charoff” : null,
“valign” : null,
“abbr” : null,
“rowspan” : null,
“colspan” : null,
“nowrap” : null,
“bgcolor” : null,
“width” : null,
“height” : null
},

“tfoot”: {
“title” : null,
“dir” : null,
“align” : null,
“char” : null,
“charoff” : null,
“valign” : null
},

“th”: {
“title” : null,
“dir” : null,
“align” : null,
“char” : null,
“charoff” : null,
“valign” : null,
“abbr” : null,
“rowspan” : null,
“colspan” : null,
“nowrap” : null,
“bgcolor” : null,
“width” : null,
“height” : null
},

“thead”: {
“title” : null,
“dir” : null,
“align” : null,
“char” : null,
“charoff” : null,
“valign” : null
},

“tr”: {
“title” : null,
“dir” : null,
“align” : null,
“char” : null,
“charoff” : null,
“valign” : null,
“bgcolor” : null
},

“tt”: {
“title” : null,
“dir” : null
},

“u”: {
“title” : null,
“dir” : null
},

“ul”: {
“title” : null,
“dir” : null,
“type” : null,
“compact” : null
},

“var”: {
“title” : null,
“dir” : null
}
};

Evernote.ClipRules.NOKEEP_NODE_ATTRIBUTES = {
“style” : null,
“tabindex” : null
};

Evernote.ClipRules.CONDITIONAL_NODES = {
“EMBED” : null,
“OBJECT” : null,
“IMG” : null,
“VIDEO” : null
};

Evernote.ClipRules.NODE_NAME_TRANSLATIONS = {
“HTML” : “DIV”,
“BODY” : “DIV”,
“FORM” : “DIV”,
“CANVAS” : “DIV”,
“CUFON” : “DIV”,
“EMBED” : “IMG”,
“BUTTON” : “SPAN”,
“INPUT” : “SPAN”,
“LABEL” : “SPAN”,
“BDI” : “SPAN”,
“IMG” : “EN-MEDIA”,
“*” : “DIV”
};

Evernote.ClipRules.SUPPORTED_NODES = {
“A” : null,
“ABBR” : null,
“ACRONYM” : null,
“ADDRESS” : null,
“AREA” : null,
“B” : null,
“BUTTON” : null,
“BDO” : null,
“BIG” : null,
“BLOCKQUOTE” : null,
“BR” : null,
“CAPTION” : null,
“CENTER” : null,
“CITE” : null,
“CODE” : null,
“COL” : null,
“COLGROUP” : null,
“DD” : null,
“DEL” : null,
“DFN” : null,
“DIV” : null,
“DL” : null,
“DT” : null,
“EM” : null,
“FONT” : null,
“FORM” : null,
“H1” : null,
“H2” : null,
“H3” : null,
“H4” : null,
“H5” : null,
“H6” : null,
“HR” : null,
“HTML” : null,
“I” : null,
“IMG” : null,
“EN-MEDIA” : null,
“INPUT” : null,
“INS” : null,
“KBD” : null,
“LI” : null,
“MAP” : null,
“OL” : null,
“P” : null,
“PRE” : null,
“Q” : null,
“S” : null,
“SAMP” : null,
“SMALL” : null,
“SPAN” : null,
“STRIKE” : null,
“STRONG” : null,
“SUB” : null,
“SUP” : null,
“TABLE” : null,
“TBODY” : null,
“TD” : null,
“TFOOT” : null,
“TH” : null,
“THEAD” : null,
“TR” : null,
“TT” : null,
“U” : null,
“UL” : null,
“VAR” : null
};

Evernote.ClipRules.REJECTED_NODES = {
“SCRIPT” : null,
“LINK” : null,
“IFRAME” : null,
“STYLE” : null,
“SELECT” : null,
“OPTION” : null,
“OPTGROUP” : null,
“NOSCRIPT” : null,
“PARAM” : null,
“HEAD” : null,
“EVERNOTEDIV” : null,
“CUFONTEXT” : null,
“NOEMBED” : null
};

Evernote.ClipRules.NON_ANCESTOR_NODES = {
“OL” : null,
“UL” : null,
“LI” : null
};

Evernote.ClipRules.SELF_CLOSING_NODES = {
“IMG” : null,
//”INPUT” : null,
“BR” : null
};
// ]]>// <![CDATA[
/**
* ClipStyle is a container for CSS styles. It is able to add and remove
* CSSStyleRules (and parse CSSRuleList's for rules), as well as
* CSSStyleDeclaration's and instances of itself.
* ClipStyle provides a mechanism to serialize itself via toString(), and
* reports its length via length property. It also provides a method to clone
* itself and expects to be manipulated via addStyle and removeStyle.
*/
Evernote.ClipStyle = function ClipStyle( css, filterFn, styleList ) {
this.initialize( css, filterFn, styleList );
};

Evernote.ClipStyle.STYLES = [
"background", "background-attachment", "background-clip", "background-color", "background-image", "background-origin", "background-position-x", "background-position-y", "background-position", "background-repeat", "background-size",
"border-bottom", "border-bottom-color", "border-bottom-left-radius", "border-bottom-right-radius", "border-bottom-style", "border-bottom-width",
"border-left", "border-left-color", "border-left-style", "border-left-width",
"border-right", "border-right-color", "border-right-style", "border-right-width",
"border-top", "border-top-color", "border-top-left-radius", "border-top-right-radius", "border-top-style", "border-top-width",
"border-collapse", "border-spacing", "bottom", "box-shadow",
"caption-side", "clear", "clip", "color", "content", "counter-increment", "counter-reset", "cursor",
"direction", "display",
"empty-cells",
"float", "font", "font-family", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-variant", "font-weight",
"height",
"ime-mode",
"left", "letter-spacing", "line-height", "list-style", "list-style-image", "list-style-position", "list-style-type",
"margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "marker-offset", "max-height", "max-width", "min-height", "min-width",
"opacity", "outline", "outline-color", "outline-offset", "outline-style", "outline-width", "overflow", "overflow-x", "overflow-y",
"padding", "padding-bottom", "padding-left", "padding-right", "padding-top", "page-break-after", "page-break-before", "pointer-events", "position",
"resize", "right",
"table-layout", "text-align", "text-anchor", "text-decoration", "text-indent", "text-overflow", "text-shadow", "text-transform", "top",
"vertical-align", "visibility",
"white-space", "width", "word-spacing", "word-wrap",
"z-index"
];

Evernote.ClipStyle.NO_INHERIT_STYLES = {
"*":[ "background", "background-image", "background-color", "background-position", "background-repeat",
"border-bottom", "border-bottom-color", "border-bottom-left-radius", "border-bottom-right-radius", "border-bottom-style", "border-bottom-width",
"border-left", "border-left-color", "border-left-style", "border-left-width",
"border-right", "border-right-color", "border-right-style", "border-right-width",
"border-top", "border-top-color", "border-top-left-radius", "border-top-right-radius", "border-top-style", "border-top-width",
"border-collapse", "border-spacing", "bottom",
"clear",
"display",
"float",
"height",
"left", "list-style",
"margin", "margin-bottom", "margin-left", "margin-right", "margin-top",
"padding", "padding-bottom", "padding-left", "padding-right", "padding-top",
"right",
"text-decoration", "top",
"width" ],
"img":[ "height", "width" ]
};

Evernote.ClipStyle.CSS_GROUP = {
"margin":[ "left", "right", "top", "bottom" ],
"padding":[ "left", "right", "top", "bottom" ],
"border":[ "width", "style", "color" ],
"border-bottom":[ "width", "style", "color" ],
"border-top":[ "width", "style", "color" ],
"border-right":[ "width", "style", "color" ],
"border-left":[ "width", "style", "color" ],
"border-image":[ "outset", "repeat", "slice", "source", "width" ],
"background":[ "attachment", "color", "image", "position", "repeat", "clip", "origin", "size" ],
"font":[ "family", "size", "style", "variant", "weight", "size-adjust", "stretch", "+line-height" ],
"list-style":[ "image", "position", "type" ]
};

Evernote.ClipStyle.CSS_GROUP.getExtForStyle = function ( name ) {
var list = this[ name ];
var extList = [ ];

if ( list ) {
for ( var i = 0; i = 0 ) {
var tmp = list[ i ];
extList.push( tmp.replace( “+”, “” ) );
}
else {
extList.push( name + “-” + list[ i ] );
}
}
return extList;
}

return null;
};

Evernote.ClipStyle.STYLE_ATTRIBUTES = {
“bgcolor”:”background-color”,
“text”:”color”
};

Evernote.ClipStyle.INHERITED_STYLES = [
“azimuth”,
“border-collapse”, “border-spacing”,
“caption-side”, “color”, “cursor”,
“direction”,
“elevation”, “empty-cells”,
“font-family”, “font-size”, “font-style”, “font-weight”, “font”,
“letter-spacing”, “line-height”, “list-style-image”, “list-style-position”, “list-style-type”, “list-style”,
“orphans”,
“pitch-range”, “pitch”,
“quotes”,
“richness”,
“speak-header”, “speak-numeral”, “speak-punctuation”, “speak”, “speak-rate”, “stress”,
“text-align”, “text-indent”, “text-transform”,
“visibility”, “voice-family”, “volume”,
“white-space”, “widows”, “word-spacing”
];

Evernote.ClipStyle.prototype._collection = null;
Evernote.ClipStyle.prototype._filterFn = null;
Evernote.ClipStyle.prototype._styleList = null;

Evernote.ClipStyle.prototype.initialize = function ( css, filterFn, styleList ) {
Evernote.Logger.debug( “ClipStyle.initialize()” );

this._collection = new Evernote.StylesCollection();
Evernote.Logger.debug( “ClipStyle.initialize: collection initialized()” );
this._filterFn = (typeof filterFn == “function”) ? filterFn : null;
this._styleList = (styleList != null) ? styleList : Evernote.ClipStyle.STYLES;
if(css) {
if ( window.CSSStyleDeclaration && css instanceof window.CSSStyleDeclaration ) {
this.addStyle( css, this._styleList );
}
else if ( window.CSSStyleRule && css instanceof window.CSSStyleRule ) {
this.addStyle( css.style, this._styleList );
}
else if ( (window.CSSRuleList && css instanceof window.CSSRuleList) || css instanceof Array ) {
for ( var i = 0; i 0 ) {
var list = (styleList != null) ? styleList : this._styleList;
for ( var i = 0; i < list.length; ++i ) {
var prop = list[ i ];
var value = Evernote.StyleElementExtension.getPropertyValue(style, prop );
var importantPriority = !!((style.getPropertyPriority(prop) == 'important'));
value = this.fixBackground(prop, value);
this.addSimpleStyle( prop, value, importantPriority );
}
}
else if ( style instanceof Evernote.ClipStyle ) {
list = (styleList != null) ? styleList : style.getStylesNames();
for ( i = 0; i < list.length; ++i ) {
prop = list[ i ];
value = style.getStyle( prop );
importantPriority = style.isImportant( prop );
value = this.fixBackground(prop, value);
this.addSimpleStyle( prop, value, importantPriority );
}
}
else if ( typeof style == 'object' && style != null ) {
list = (styleList != null) ? styleList : style;
for ( prop in list ) {
if ( list.hasOwnProperty( prop ) ) {
var usedStyle = style[ prop ];
var pName = prop;
if(!usedStyle) {
usedStyle = style [list[prop]];
pName = list[prop];
if(!usedStyle) {
var propName = Evernote.IEStylePropertiesMapping.getPropertyNameFor(list[prop]);
if(propName) {
usedStyle = style[propName];
}
}
}
usedStyle = this.fixBackground(pName, usedStyle);
this.addSimpleStyle( pName, usedStyle );
}
}
}
};

Evernote.ClipStyle.prototype.removeStyle = function ( style ) {
Evernote.Logger.debug( "ClipStyle.removeStyle()" );
if(style) {
if ( window.CSSStyleDeclaration && Evernote.Utils.isInstanceOf(style, window.CSSStyleDeclaration) || style instanceof Array ) {
for ( var i = 0; i < style.length; ++i ) {
this.removeSimpleStyle( style[ i ] );
}
}
else if ( style instanceof Evernote.ClipStyle ) {
var stylesNames = style.getStylesNames();
for ( i = 0; i < stylesNames.length; ++i ) {
this.removeSimpleStyle( stylesNames[ i ] );
}
}
else if ( typeof style == 'string' ) {
this.removeSimpleStyle( style );
}
}
Evernote.Logger.debug("ClipStyle.removeStyle() end")
};

Evernote.ClipStyle.prototype.mergeStyle = function ( style, override ) {
Evernote.Logger.debug( "ClipStyle.mergeStyle()" );

if ( style instanceof Evernote.ClipStyle ) {
var stylesNames = style.getStylesNames();
for ( var i = 0; i < stylesNames.length; ++i ) {
var styleName = stylesNames[ i ];
var styleValue = this._collection.getStyle( styleName );
if ( styleValue == null || override || (style.isImportant( styleName ) && !this._collection.isImportant( styleName )) ) {
var newValue = style.getStyle( styleName );
if ( style.isImportant( styleName ) ) {
this._collection.addStyle( styleName, newValue, true );
}
else if ( override && !this._collection.isImportant( styleName ) ) {
this._collection.addStyle( styleName, newValue, false );
}
else if ( styleValue == null && !override ) {
this._collection.addStyle( styleName, newValue, style.isImportant( styleName ) );
}
}
}
}
};

Evernote.ClipStyle.prototype.getStylesNames = function () {
return this._collection.getStylesNames();
};

Evernote.ClipStyle.prototype.getStyle = function ( prop ) {
return this._collection.getStyle( prop );
};

Evernote.ClipStyle.prototype.isImportant = function ( prop ) {
return this._collection.isImportant( prop );
};

Evernote.ClipStyle.prototype.addSimpleStyle = function ( prop, value, importantPriority ) {
if ( typeof this._filterFn == "function" && !this._filterFn( prop, value ) ) {
return;
}
var impl = Evernote.StylesReplacementRegistry.getImplementationFor(prop);
if(impl && impl.getValue) {
value = impl.getValue(value);
}
this._collection.addStyle( prop, value, importantPriority );
};

Evernote.ClipStyle.prototype.removeSimpleStyle = function ( prop ) {
this._collection.removeStyle( prop );
};

Evernote.ClipStyle.prototype.toString = function () {
var str = "";
var stylesNames = this.getStylesNames();
for ( var i = 0; i 0 ) {
str += styleName + “:” + value + “;”;
}
}

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

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

Evernote.NodeSerializer.prototype.initialize = function ( tab, styleStrategy, includeBg ) {
Evernote.Logger.debug( "DomSerializer.initialize()" );

this._tab = tab;
this._styleStrategy = (styleStrategy instanceof Evernote.ClipStylingStrategy) ? styleStrategy : null;
this._imagesUrls = [ ];
this._includeBgStyles = ( includeBg != null ) ? includeBg : true;
this.getDocumentBase();
};

Evernote.NodeSerializer.prototype.startNode = function ( serializedNode, root, fullPage ) {
Evernote.Logger.debug( "Start to serialize node :" + serializedNode.node.nodeName );
try {
var node = serializedNode.node;
if ( Evernote.ClipRules.isConditionalNode( node ) && Evernote.ElementSerializerFactory.getImplementationFor( node ) != null ) {
var result = this.serializeConditionalNode( node, root, fullPage );
this._serializedDom += result.content;
// hack for desktop Win client
if ( result.imageUrl ) {
this._imagesUrls.push( result.imageUrl );
}
serializedNode.setStyle(result.nodeStyle);
return serializedNode;
}

if ( node.nodeName.toLowerCase() == "embed" ) {
var src = node.getAttribute( "src" );
if ( src && (src.indexOf(".swf", src.length – ".swf".length) !== -1) ) {
serializedNode.setStyle(new Evernote.ClipStyle());
return serializedNode;
}
}

if ( node.nodeName.toLowerCase() == "img" ) {
var src = node.getAttribute( "src" );

var absoluteSource = Evernote.Utils.makeAbsolutePath(this._docBase, src).replace(/s/g, "%20");
node.setAttribute( "type", "put-media-type-here-for-" + absoluteSource);
node.setAttribute( "hash", "put-hash-type-here-for-" + absoluteSource);

if ( src && src.indexOf( "data:image" ) = 0; inhI– ) {
var inhStyle = inhBgStyle[inhI];
this._serializedDom += ”

“;
serializedNode.translateTo.push( “div” );
}

var pseudoStyle = this._styleStrategy.getNodeStyle( node, null, “:before” );

if ( fullPage && node.nodeName.toLowerCase() == “body” ) {
var wrapBodyStyle = new Evernote.ClipStyle( nodeStyle, null, Evernote.ClipStyle.CSS_GROUP.getExtForStyle( “background” ) );
this._serializedDom += “”;
serializedNode.translateTo.push( “div” );
var bgGroup = Evernote.ClipStyle.CSS_GROUP.getExtForStyle( “background” );
for ( var ind in bgGroup ) {
if ( bgGroup.hasOwnProperty( ind ) ) {
nodeStyle.removeStyle( bgGroup[ind] );
}
}
}

if ( !fullPage && node == root ) {
nodeStyle.removeStyle( “float” );
}
if ( !serializedNode.node.hasChildNodes() && !(nodeStyle.getStyle( “height” ) || node.getAttribute( “height” )) ) {
nodeStyle.addStyle( {height:”0px”} );
}
if ( !serializedNode.node.hasChildNodes() && !(nodeStyle.getStyle( “width” ) || node.getAttribute( “width” )) ) {
nodeStyle.addStyle( {width:”0px”} );
}
if(nodeStyle.getStyle(“position”) == “fixed”) {
nodeStyle.addStyle({position: “absolute”});
}

if ( (node.nodeName.toUpperCase() == “SPAN” || node.nodeName.toUpperCase() == “A”) && node.getElementsByTagName( “IMG” ).length > 0) {
nodeName = “div”;
if ( !nodeStyle.getStyle( “display” ) )
nodeStyle.addStyle( {display:”inline”} );
}

this._serializedDom += this.serializePseudoElement( node, pseudoStyle );
stylesStr = this.serializeStyles( node, nodeStyle );

if ( (nodeName.toLowerCase() == “div” /*|| nodeName.toLowerCase() == “span”*/) && nodeStyle.getStyle( “float” ) && nodeStyle.getStyle( “float” ) != “none” && serializedNode.parentNode && node.parentNode.nodeName.toLowerCase() != “a” ) {
if ( !serializedNode.node.nextSibling || serializedNode.node.nextSibling.nodeType == 3 )
serializedNode.parentNode.isInlineBlock = true;
}
}

Evernote.Logger.debug( node.nodeName + ” ” + attrsStr + ” -> ” + nodeName + ” ” + stylesStr );

this._serializedDom += “”;

serializedNode.setStyle(nodeStyle);
serializedNode.translateTo.push( nodeName );
return serializedNode;
}
catch ( e ) {
Evernote.Logger.error( “Failed to start serialize node :” + e );
throw e;
}
};

Evernote.NodeSerializer.prototype.serializePseudoElement = function ( node, pseudoStyle ) {
try {
var nodeName = Evernote.ClipRules.translateNode( node );
if ( pseudoStyle.getStylesNames().length > 0 ) {
var content = ” “;
if ( pseudoStyle.getStyle( “content” ) ) {
content = pseudoStyle.getStyle( “content” );
pseudoStyle.removeStyle( “content” );
}
var beforeStylesStr = this.serializeStyles( node, pseudoStyle );
return “” + content.replace( /”/g, ” ) + “”;
}
return “”;
}
catch ( e ) {
Evernote.Logger.error( “Failed to serialize pseudo element :” + e );
throw e;
}
};

Evernote.NodeSerializer.prototype.textNode = function ( node, range ) {
this._serializedDom += this.serializeTextNode( node, range );
};

Evernote.NodeSerializer.prototype.endNode = function ( serializedNode ) {
try {
Evernote.Logger.debug( “end serialize node :” + serializedNode.translateTo );

if ( serializedNode.isInlineBlock ) {
var name = “div”;
if ( serializedNode.node.nodeName.toLowerCase() == “ul” ) {
name = “li”
}
this._serializedDom += “” + ” ” + “”
}

var node = serializedNode.node;
var serializedPseudo = “”;
var pseudoStyle = new Evernote.ClipStyle();
if ( this._styleStrategy ) {
pseudoStyle = this._styleStrategy.getNodeStyle( node, null, “:after” );
if ( pseudoStyle.getStylesNames().length > 0 ) {
var floatStyle = serializedNode.getStyle().getStyle( “float” );
if ( floatStyle && !pseudoStyle.getStyle( “float” ) )
pseudoStyle.addStyle( { “float” : floatStyle } );

if ( node.nodeName.toLowerCase() == “ul” )
serializedPseudo = this.serializePseudoElement( document.createElement( “div” ), pseudoStyle );
}
}

while ( serializedNode.translateTo.length > 0 ) {
var nodeName = serializedNode.translateTo.pop();
if ( !Evernote.ClipRules.isSelfClosingNode( serializedNode.node ) ) {
if ( !serializedNode.node.hasChildNodes() )
this._serializedDom += ” “;
}

if ( nodeName.toLowerCase() == “ul” ) {
this._serializedDom += this.serializePseudoElement( document.createElement( “li” ), pseudoStyle );
}
this._serializedDom += “”;
}

this._serializedDom += serializedPseudo;
}
catch ( e ) {
Evernote.Logger.error( “Failed to end serialize node :” + e );
throw e;
}
};

Evernote.NodeSerializer.prototype.serializeTextNode = function ( node, range ) {
Evernote.Logger.debug( “DomSerializer.serializeTextNode()” );

try {
var nodeValue = node.nodeValue;
if ( !range ) {
return Evernote.Utils.htmlEncode( nodeValue );
}
else {
if ( range.startContainer == node && range.startContainer == range.endContainer ) {
return Evernote.Utils.htmlEncode( nodeValue.substring( range.startOffset, range.endOffset ) );
}
else if ( range.startContainer == node ) {
return Evernote.Utils.htmlEncode( nodeValue.substring( range.startOffset ) );
}
else if ( range.endContainer == node ) {
return Evernote.Utils.htmlEncode( nodeValue.substring( 0, range.endOffset ) );
}
else if ( range.commonAncestorContainer != node ) {
return Evernote.Utils.htmlEncode( nodeValue );
}
}
}
catch ( e ) {
Evernote.Logger.error( “DomSerializer.serializeTextNode() failed ” + e );
throw e;
}

return “”;
};

Evernote.NodeSerializer.prototype.serializeConditionalNode = function ( node, root, fullPage ) {
Evernote.Logger.debug( “DomSerializer.serializeConditionalNode()” );
var impl = Evernote.ElementSerializerFactory.getImplementationFor( node );
if ( typeof impl == ‘function’ ) {
var nodeStyle = (this._styleStrategy) ? this._styleStrategy.styleForNode( node, root, fullPage ).evaluated : null;
var serializer = new impl( node, nodeStyle );
var content = serializer.serialize( this._docBase );
var imageUrl = serializer.getImageUrl();

return { content:content, imageUrl:imageUrl, nodeStyle:nodeStyle };
}

return { content:””, imageUrl:””, nodeStyle:new Evernote.ClipStyle() };
};

Evernote.NodeSerializer.prototype.serializeAttributes = function ( node ) {
Evernote.Logger.debug( “DomSerializer.serializeAttributes()” );

try {
var attrs = node.attributes;
var str = “”;

for ( var i = 0; i < attrs.length; ++i ) {
if ( !Evernote.ClipRules.isNoKeepNodeAttr( attrs[ i ], Evernote.ClipRules.translateNode( node ), node ) ) {
var attrValue = (attrs[ i ].value) ? Evernote.GlobalUtils.escapeXML( attrs[ i ].value ) : "";
if ( (attrs[ i ].name.toLowerCase() == "src" || attrs[ i ].name.toLowerCase() == "href") && attrValue.toLowerCase().indexOf( "http" ) != 0 ) {
attrValue = Evernote.Utils.makeAbsolutePath( this._docBase, attrValue );
}
str += " " + attrs[ i ].name.toLowerCase() + "="" + attrValue + """;
}
}

return str;
}
catch ( e ) {
Evernote.Logger.error( "DomSerializer.serializeAttributes() failed: error = " + e );
}

return "";
};

Evernote.NodeSerializer.prototype.serializeStyles = function ( node, nodeStyle ) {
Evernote.Logger.debug( "DomSerializer.serializeStyles()" );

try {
var str = "";
if(node.nodeName.toLowerCase() == "map") {
//Map should not have style attribute according to Evernote DTD
return "";
}
if ( node && nodeStyle instanceof Evernote.ClipStyle ) {
str += " style="" + nodeStyle.toString().replace( /"/g, "" ) + """;
}
return str;
}
catch ( e ) {
Evernote.Logger.error( "DomSerializer.serializeStyles() failed: error = " + e );
throw e;
}
return "";
};

Evernote.NodeSerializer.prototype.getDocumentBase = function () {
Evernote.Logger.debug( "DomSerializer.getDocumentBase()" );

if ( !this._docBase ) {
var baseTags = this._tab.document.getElementsByTagName( "base" );
for ( var i = 0; i < baseTags.length; ++i ) {
var baseTag = baseTags[ i ];
if ( typeof baseTag == 'string' && baseTag.indexOf( "http" ) == 0 ) {
this._docBase = baseTag;
}
if ( this._docBase ) {
break;
}
}

if ( !this._docBase ) {
var location = this._tab.document.location;
this._docBase = location.protocol + "//" + location.host + location.pathname.replace( /[^/]+$/, "" );
}
}

return this._docBase;
};

Evernote.NodeSerializer.prototype.getImagesUrls = function () {
return this._imagesUrls;
};

Evernote.NodeSerializer.prototype.getSerializedDom = function () {
return '

‘ + this._serializedDom.replace(/[^u0009u000au000du0020-uD7FFuE000-uFFFD]+/g, “”) + ‘

‘;
};
// ]]>// // // <![CDATA[
Evernote.DataImageSerializer = function DataImageSerializer( node, nodeStyle ) {
if ( !nodeStyle ) {
nodeStyle = new Evernote.ClipStyle();
}

this.initialize( node, nodeStyle );
};

Evernote.inherit( Evernote.DataImageSerializer, Evernote.AbstractElementSerializer, true );

Evernote.DataImageSerializer.isResponsibleFor = function( node ) {
try {
if ( node && node.nodeType == Evernote.Node.ELEMENT_NODE && node.nodeName.toLowerCase() == "img" ) {
var src = node.getAttribute( "src" );
if ( src && src.indexOf( "data:image" ) != -1 ) {
return true;
}
}
} catch(e) {
Evernote.Logger.error("DataImageSerializer.isResponsibleFor failed due to error " + e);
}
return false;
};

Evernote.DataImageSerializer.prototype.serialize = function( /*docBase*/ ) {
Evernote.Logger.debug( "DataImageSerializer.serialize()" );

try {
this._nodeStyle.addStyle( { "background-image" : "url('" + this._node.getAttribute( "src" ) + "')",
"width" : this._node.offsetWidth + "px",
"height" : this._node.offsetHeight + "px",
"background-repeat" : "no-repeat",
"display" : "block" } );

return " “;
}
catch ( e ) {
Evernote.Logger.error( “DataImageSerializer.serialize() failed: error = ” + e );
}

return “”;
};
// ]]>// <![CDATA[
Evernote.VideoElementSerializer = function VideoElementSerializer( node, nodeStyle ) {
this.initialize( node, nodeStyle );
};

Evernote.inherit( Evernote.VideoElementSerializer, Evernote.AbstractElementSerializer, true );

Evernote.VideoElementSerializer.isResponsibleFor = function( node ) {
return node && node.nodeType == Evernote.Node.ELEMENT_NODE && node.nodeName.toLowerCase() == "video";
};

Evernote.VideoElementSerializer.prototype.serialize = function( /*docBase*/ ) {
Evernote.Logger.debug( "VideoElementSerializer.serialize()" );

try {
var width = this._node.offsetWidth;
var height = this._node.offsetHeight;
var doc = this._node.ownerDocument;

var canvas = doc.createElement( "CANVAS" );
canvas.width = width;
canvas.height = height;

var context = canvas.getContext( "2d" );
context.drawImage( this._node, 0, 0, width, height );

var dataUrl = canvas.toDataURL( "image/png" );
context.clearRect( 0, 0, width, height );

this._nodeStyle.addStyle( { "background-image" : "url('" + dataUrl + "')",
"width" : width + "px",
"height" : height + "px",
"display" : "block" } );

return " “;
}
catch ( e ) {
Evernote.Logger.error( “VideoElementSerializer.serialize() failed: error = ” + e );
}

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

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

*
* Sample URLs are:
*
*

 * http: //www.youtube.com/embed/IWJJBwKhvp4?wmode=opaque&rel=0
 * http: //www.youtube.com/v/YZEbBZ2IrXE?version=3&rel=1&fs=1&showsearch=0&showinfo=1&iv_load_policy=1
 * http: //www.youtube.com/v/J3mjFSTsKiM&hl=en&fs=1
 * http://www.youtube.com/watch?v=cAcxHQalWOw
 * http://www.youtube.com/user/IFiDieApp?v=sdzCELofGgE&feature=pyv
 *

*/

Evernote.YoutubeElementSerializer = function YoutubeElementSerializer( doc, node, nodeStyle ) {
this.initialize( doc, node, nodeStyle );
};

Evernote.inherit( Evernote.YoutubeElementSerializer, Evernote.AbstractElementSerializer, true );

Evernote.YoutubeElementSerializer.WATCH_URL_REGEX = /^https?://www.youtube.com/watch?.*v=([^&]+)/i;
Evernote.YoutubeElementSerializer.USER_CHANNEL_URL_REGEX = /^https?://www.youtube.com/user/([a-zA-Z0-9]+)?v=([^&]+)/i;
Evernote.YoutubeElementSerializer.EMBED_URL_REGEX = /^https?://www.youtube.com/embed/([^/?&]+)/i;
Evernote.YoutubeElementSerializer.VIDEO_URL_REGEX = /^https?://www.youtube.com/v/([^/?&]+)/i;
Evernote.YoutubeElementSerializer.POSSIBLE_CONTAINER_NODES = [ “OBJECT” ];
Evernote.YoutubeElementSerializer.VIDEO_NODES = [ “EMBED”, “IFRAME” ];
Evernote.YoutubeElementSerializer.WATCH_URL = “http://www.youtube.com/watch?v=$videoId$&#8221;;
Evernote.YoutubeElementSerializer.USER_CHANNEL_URL = “http://www.youtube.com/user/$userId$?v=$videoId$&#8221;;
Evernote.YoutubeElementSerializer.DEFAULT_THUMB_URL = “https://i2.ytimg.com/vi/$videoId$/default.jpg&#8221;;
Evernote.YoutubeElementSerializer.HQ_THUMB_URL = “https://i2.ytimg.com/vi/$videoId$/hqdefault.jpg&#8221;;
Evernote.YoutubeElementSerializer.DEFAULT_THUMB_WIDTH = 120;
Evernote.YoutubeElementSerializer.DEFAULT_THUMB_HEIGHT = 90;

Evernote.YoutubeElementSerializer.isResponsibleFor = function( node ) {
var params = this.extractVideoParamsFromNode( node );
return (params) ? true : false;
};

Evernote.YoutubeElementSerializer.extractVideoParamsFromNode = function( node ) {
Evernote.Logger.debug( “YoutubeElementSerializer.extractVideoIdFromNode()” );
try {
if ( node && node.nodeType == Evernote.Node.ELEMENT_NODE ) {
var view = window;
try {
view = node.ownerDocument.defaultView;
}
catch ( e ) {
}

var matches = null;
if ( view && (node.nodeName.toLowerCase() == “embed” || node.nodeName.toLowerCase() == “object”) && view.location ) {
if ( (matches = view.location.href.match( this.WATCH_URL_REGEX )) && matches[ 1 ] ) {
return matches[ 1 ];
}
else if ( (matches = view.location.href.match( this.USER_CHANNEL_URL_REGEX )) && matches[ 1 ] && matches[ 2 ] ) {
return [ matches[ 1 ], matches[ 2 ] ];
}
}
else {
var videoNode = this.findVideoNode( node );
if ( videoNode ) {
var src = videoNode.getAttribute( “src” );
if ( src && (matches = src.match( this.EMBED_URL_REGEX )) && matches[ 1 ] ) {
return matches[ 1 ];
}
else if ( src && (matches = src.match( this.VIDEO_URL_REGEX )) && matches[ 1 ] ) {
return matches[ 1 ];
}
}
}
}
} catch(e) {
Evernote.Logger.error(“failed to YoutubeElementSerializer.extractVideoParamsFromNode due to error ” + e);
}

return null;
};

Evernote.YoutubeElementSerializer.findVideoNode = function( node ) {
Evernote.Logger.debug( “YoutubeElementSerializer.findVideoNode()” );

if ( node && node.nodeType == Evernote.Node.ELEMENT_NODE ) {
if ( Evernote.ArrayExtension.indexOf(this.VIDEO_NODES, node.nodeName.toUpperCase() ) >= 0 ) {
return node;
}
else if ( Evernote.ArrayExtension.indexOf(this.POSSIBLE_CONTAINER_NODES, node.nodeName.toUpperCase() ) >= 0 ) {
try {
var it = node.ownerDocument.createNodeIterator( node, NodeFilter.SHOW_ELEMENT, null, false );
var next = null;

while ( next = it.nextNode() ) {
if ( Evernote.ArrayExtension.indexOf(this.VIDEO_NODES, next.nodeName.toUpperCase() ) >= 0 ) {
return next;
}
}
} catch(e) {
//We ignore exception here, because if node iterator is not supported, than we could skip old pages (not Youtube).
return null;
}
}
}

return null;
};

Evernote.YoutubeElementSerializer.prototype._imageUrl = “”;

Evernote.YoutubeElementSerializer.prototype.serialize = function( /*docBase*/ ) {
Evernote.Logger.debug( “YoutubeElementSerializer.serialize()” );

try {
var userId = null;
var videoId = null;
var params = this.constructor.extractVideoParamsFromNode( this._node );
if ( params instanceof Array ) {
userId = params[ 0 ];
videoId = params[ 1 ];
}
else if ( typeof params == “string” ) {
videoId = params;
}

if ( videoId ) {
var thumbUrl = null;
var w = 0;
var h = 0;

if ( this._nodeStyle ) {

var view = window;
try {
view = this._node.ownerDocument.defaultView;
}
catch ( e ) {
}

var computedStyles = Evernote.ElementExtension.getComputedStyle( this._node, null, view );

w = parseInt( Evernote.StyleElementExtension.getPropertyValue(computedStyles, “width” ) );
w = (isNaN( w )) ? 0 : w;

h = parseInt( Evernote.StyleElementExtension.getPropertyValue(computedStyles, “height” ) );
h = (isNaN( h )) ? 0 : h;

if ( w < this.constructor.DEFAULT_THUMB_WIDTH || h < this.constructor.DEFAULT_THUMB_HEIGHT ) {
thumbUrl = this.getDefaultThumbnailUrl( videoId );
}
else {
thumbUrl = this.getHQThumbnailUrl( videoId );
}
}
else {
thumbUrl = this.getDefaultThumbnailUrl( videoId );
}

if ( thumbUrl ) {
var styleStr = (this._nodeStyle instanceof Evernote.ClipStyle) ? ("style="" + this._nodeStyle.toString() + """) : "";
var attrs = this._node.attributes;
var attrStr = "";

for ( var i = 0; i this.constructor.DEFAULT_THUMB_WIDTH / this.constructor.DEFAULT_THUMB_HEIGHT ) {
imgAttrStr += “height=”” + h + “””;
}
else { // scale by width
imgAttrStr += “width=”” + w + “””;
}
}

this._imageUrl = thumbUrl;
return ““;
}
}
}
catch ( e ) {
Evernote.Logger.error( “YoutubeElementSerializer.serialize() failed: error = ” + e );
}

return “”;
};

Evernote.YoutubeElementSerializer.prototype.getDefaultThumbnailUrl = function( videoId ) {
return this.constructor.DEFAULT_THUMB_URL.replace( /$videoId$/, videoId );
};

Evernote.YoutubeElementSerializer.prototype.getHQThumbnailUrl = function( videoId ) {
return this.constructor.HQ_THUMB_URL.replace( /$videoId$/, videoId );
};

Evernote.YoutubeElementSerializer.prototype.getWatchUrl = function( videoId ) {
return this.constructor.WATCH_URL.replace( /$videoId$/, videoId );
};

Evernote.YoutubeElementSerializer.prototype.getUserChannelUrl = function( userId, videoId ) {
return this.constructor.USER_CHANNEL_URL.replace( /$userId$/, userId ).replace( /$videoId$/, videoId );
};

Evernote.YoutubeElementSerializer.prototype.getImageUrl = function() {
return this._imageUrl;
};
// ]]>// // // <![CDATA[
Evernote.FontSizeReplacement = {

SUPPORTED_FONT_SIZES: ["em", "%", "pt", "px"],

getValue: function(val) {
if(typeof val != "string")
return val;
if(this.isCalculationRequired(val)) {
Evernote.Logger.error("Calculation required for val " + val);
return Evernote.Utils.getFontSizeInPixels(val) + "px";
} else {
//Do not set browser dependant CSS since it does not supported by Evernote Chromium Viewer.
return null;
}
},

isCalculationRequired: function(val) {
for(var i = 0; i // //

A Month in #Exchange and #OCS: July 2011: To Read

Exchange2010 #Lync

#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#* Technical White Papers for Exchange Server 2010
http://technet.microsoft.com/en-us/library/bb124558.aspx

#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#* Documentation Updates
http://msexchangeteam.com/archive/category/11153.aspx

Introducing the “Exchange Server 2010 Technical Video Series” on TechCenter
Struggling to find an overview of what the latest EAS features are? Planning your migration from Exchange 2003 and looking for a basic introduction to Database Availability Groups (DAGs)? These videos are for you! The Microsoft Exchange team has produced a new portfolio of videos designed to give customers…

Most popular Exchange 2010 TechNet Wiki articles
In case you did not try this yet (or you read our blog through RSS reader only) – that orange “Wiki” link on the navigation bar on top of our blog pages takes you to our TechNet Wiki landing page here: http://social.technet.microsoft.com/wiki/contents/articles/wiki-exchange-server-portal.aspx To give…

#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#* Exchange 2007 Documentation Updates
http://technet.microsoft.com/en-us/library/gg490643(v=EXCHG.80).aspx

#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#* Office Communication Server Documentation Updates
http://technet.microsoft.com/en-us/library/bb676082.aspx

Lync Server 2010
http://technet.microsoft.com/en-us/library/ff770144.aspx -and- http://technet.microsoft.com/en-us/lync/default.aspx

#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#* New KBs from Last Month
New means they appear in KB as Revision 1.0! (well apart from the ones that look interesting too) … I just can’t find a decent source for these anymore! ideas?  KBAlertz just doesnt seem to be updating, so found mskbarticles!
Exchange Online: http://www.mskbarticles.com/index.php?product=13159
Exchange 2003: http://www.mskbarticles.com/index.php?product=1773
Exchange 2007: http://www.mskbarticles.com/index.php?product=10926
Exchange 2010: http://www.mskbarticles.com/index.php?product=13965
Exchange 2010 Coexistence: http://www.mskbarticles.com/index.php?product=14798
Forefront Online Protection for Exchange: http://www.mskbarticles.com/index.php?product=13818
Forefront For Exchange: http://www.mskbarticles.com/index.php?product=14783
Communications Server 2007 R2: http://www.mskbarticles.com/index.php?product=14030
Communicator 2007: http://www.mskbarticles.com/index.php?product=11402
Outlook 2007: http://www.mskbarticles.com/index.php?product=11335
Outlook 2010: http://www.mskbarticles.com/index.php?product=14864
Lync 2010: http://www.mskbarticles.com/index.php?product=15708
Lync Server: http://www.mskbarticles.com/index.php?product=14934
http://blogs.technet.com/b/hot/archive/tags/Messaging+Server/
http://blogs.technet.com/b/trm/archive/tags/unified+communications/

June 30, 2011

  • 2553023 Office 2010 Cumulative Update for June 2011

June 29, 2011

  • 2552972 Description of the Outlook 2010 hotfix package (outlook-x-none.msp): June 28, 2011

June 28, 2011

  • 2544404 Description of the Office Outlook 2007 hotfix package (Outlook-x-none.msp): June 28, 2011
  • 2553933 Description of the Outlook 2010 hotfix package (outlookintl-ko-kr.msp): June 28, 2011
  • 2553911 Description of the Outlook 2010 hotfix package (outexum-x-none.msp): June 28, 2011

June 23, 2011

  • 951000 Messages to a Distribution List are delayed in an Exchange Server 2007 environment

June 22, 2011

  • 2509910 Description of Update Rollup 4 for Exchange Server 2010 Service Pack 1

Fixes from Update Rollup 4

June 9, 2011

  • 2549046 Description of cumulative update for Office Communications Server 2007 R2: June, 2011
  • 2544768 An update is available that increases the maximum number of allowed access proxies in an access proxy array in Office Communications Server 2007 R2

June 3, 2011

  • 924284 How to enable the Memory Diagnostic test for 2007 Office products on a Windows Server-based computer

A Month in #Exchange and #OCS: July 2011: Links and Downloads

#Exchange2010 #Exchange #Lync

##*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#* New Exchange, Office 365OCS and Lync Downloads from June2011

Office 365 Guides for professionals and small businesses
Step-by-step instructions for setting up and using a Plan P1 trial account for Office 365 from Microsoft Online Services.

Office 365 Developer Training Kit – June 2011 Update
Guidance that provides developers with advanced guidance on how to develop for Office 365 including SharePoint Online, Exchange Online and Lync Online

Microsoft Exchange Online Standard
Microsoft® Exchange Online is a hosted enterprise messaging solution based on Microsoft Exchange Server 2007. Exchange Online services include advanced e-mail features as well as calendaring, contact, and task management capabilities. This…

Microsoft Forefront Endpoint Protection (FEP) 2010 Update Rollup 1 Tools
These free downloads make it easier for Forefront Endpoint Protection 2010 Update Rollup 1 customers to use Group Policy for centralized management, provide optimized settings for various server roles, and diagnose and troubleshoot support issues.

Microsoft Advertising SDK for Windows Phone
Advertising SDK for developers who want to monetize their Windows Phone applications.

Exchange Server 2010 SP1 Help
This download contains a standalone version of Microsoft Exchange Server 2010 SP1 Help.

Exchange 2010 Tested Solutions: 32400 Mailboxes in Three Sites Running Hyper-V on Cisco Unified Compute System Blade Servers and EMC CLARiiON Storage
In the Exchange 2010 Tested Solutions white papers, Microsoft provides examples of well-designed, cost-effective Exchange 2010 solutions deployed on hardware offered by some of our server, storage, and network partners.

Microsoft Online Standard Service Descriptions
Microsoft Online Services provides enterprise-level hosted solutions for e-mail, collaboration, instant messaging and Web conferencing. Services are delivered from a highly reliable network of Microsoft data centers located strategically throughout the world that provides seamless connectivity to the Microsoft Online suite of services —enabling customers to use the latest productivity applications

Microsoft Online Services- Support and Service Management Service Description
This document has been moved. Please update your links and bookmarks with the new location, listed below.

Visio 2010 Add-in for Exchange Server 2007
This Microsoft Visio Add-In makes it easy for Exchange administrators to visualize, explore, and communicate complex…dramatically increase productivity. You can diagram a Microsoft® Exchange Server 2007 site topology, including sites, servers…

Visio 2010 Add-in for System Center Operations Manager 2007 R2
This add-in helps you monitor and manage your IT network in a Visio diagram which you can share with others via their browser in Microsoft®SharePoint®2010.

VHD Test Drive – Lync Server 2010 VHD
This download comes as a pre-configured set of VHD’s. This download enables you to fully evaluate Microsoft Lync Server 2010.

Microsoft Active Directory Topology Diagrammer
The Microsoft Active Directory Topology Diagrammer reads an Active Directory configuration using LDAP, and then automatically generates a Visio diagram of your Active Directory and /or your Exchange Server topology. The diagramms may include domains, sites, servers, organizational units, DFS-R, administrative groups, routing groups and connectors and can be changed manually in Visio if needed.

Achieving Immutability with Exchange Online and Exchange Server 2010
With Exchange Server 2010 SP1 and Exchange Online, Microsoft enables organizations to immutably preserve mailbox items for discovery using an in-place archive.

How to Choose the Right Email Solution for your Business White Paper
This whitepaper discusses the various email solution factors to consider when deciding on your next email platform, as well as the top 10 factors that will matter to most businesses.

Forefront Online Protection for Exchange Service Description
This download contains the Service Description for Forefront Online Protection for Exchange (FOPE).

Microsoft Office Communications Server 2007 R2 Hotfix KB 968802
This download includes all available updates for Office Communications Server 2007 R2.

Microsoft Office Communicator 2007 R2 Hotfix KB 2549042
This download contains an update for Microsoft Office Communicator 2007 R2.

Microsoft Office Communications Server 2007 R2 Group Chat Hotfix KB 2549044
This download contains updates for Microsoft Office Communications Server 2007 R2 Group Chat.

Unified Communications Phones and Peripherals Datasheets
These datasheets list the phones and peripheral devices that are qualified to display the “Optimized for Microsoft Lync” logo.

Microsoft Lync 2010 IM and Presence Training
Learn how to optimize your IM and Presence experience with Microsoft Lync 2010.

Live Meeting-To-Lync Transition Resources
Resources included in this download package are designed to support your organization’s Live Meeting Service to Lync (Server or Online) transition planning. This download will be updated with additional resources as available.

Microsoft Lync Online IM and Presence Training
Learn how to optimize your Instant Messaging and Presence experience with Microsoft Lync Online.

Microsoft Lync Online Training
Learn about Microsoft Lync Online, and the helpful features to manage your communications effectively.

Group Chat Stress Tool for Microsoft Lync Server 2010 – Documentation
This download provides documentation about Group Chat Stress Tool and Group Chat Loaders for Microsoft Lync Server 2010.

Conversations Analyzer for Microsoft Lync 2010 Getting Started Guide
This download provides end-user documentation about the Conversations Analyzer application for Microsoft Lync 2010.

Information Dashboard Add-In for Microsoft Lync 2010 Getting Started Guide
This download provides end-user documentation about the Information Dashboard add-in for Microsoft Lync 2010.

Tabbed Conversations for Microsoft Lync 2010 Getting Started Guide
This download provides end-user documentation about Tabbed Conversations for Microsoft Lync 2010.

Unified Communications Phones and Peripherals Datasheets
These datasheets list the phones and peripheral devices that are qualified to display the “Optimized for Microsoft Lync” logo.

Conversation Translator Add-In for Microsoft Lync 2010 Getting Started Guide
This download provides end-user documentation about the Conversation Translator add-in for Microsoft Lync 2010.

Microsoft Lync Online Web App Training
Learn how to use Microsoft Lync Online Web App to join meetings, when you don’t have Lync installed.

Microsoft Lync Online Conferencing and Collaboration Training
Learn how to schedule, join, and manage online meetings with Microsoft Lync Online.

Microsoft Lync Online Voice and Video Training
Learn about Microsoft Lync Online voice and video features, and how to use the controls.

Introducing Microsoft Lync Online
This course covers an introduction to Microsoft Lync Online features and tools.

Microsoft Lync Online Attendee Training
Learn how to use Microsoft Lync Online Attendee to join meetings, when you don’t have Lync installed.

Tabbed Conversations for Microsoft Lync 2010
Tabbed Conversations is an application that provides a tabbed Lync 2010 conversation window to allow multiple instant messaging (IM) conversations in a single window.

Conversations Analyzer for Microsoft Lync 2010
Conversations Analyzer is an application that reviews your Microsoft Lync instant messaging (IM) conversation history and gives you scores for your use of trust-building language in day-to-day…

Conversation Translator Add-In for Microsoft Lync 2010
Conversation Translator provides a real-time language translation service for Lync instant messaging (IM) conversations. With Conversation Translator, both the sender and receiver can converse in their native language, and Conversation Translator handles the translation.

Information Dashboard Add-In for Microsoft Lync 2010
Information Dashboard helps you start a conversation with a remote contact by providing current information about the contact’s location. For example, if you are calling a co-worker or a client in Shanghai, China, you can open Information Dashboard and enter the location of Shanghai before making the call.

Microsoft Lync Server 2010 Group Chat Stress Tool
Group Chat Stress is a tool that can be used to help verify your Microsoft Lync Server 2010 and Microsoft Lync Server 2010, Group Chat hardware deployment. The Group Chat Stress package is made up of two applications…

Microsoft Lync 2010 Adoption and Training Kit: Lync Custom Intranet Site
This zipped file contains a sample intranet site for Microsoft Lync 2010.

Standard Response to Request for Information – Security and Privacy
This White Paper describes how Office 365 fulfills the security, compliance and risk management requirements as defined by the Cloud Security Alliance, Cloud Control Matrix.

Office 365 for professionals and small businesses Service Description
This document provides a detailed description of the features and functionality of Office 365 for professionals and small businesses (P1) service.

Microsoft Office 365 Guides for midsize business and enterprises
Microsoft Office 365 Guides for midsize business and enterprises

Security in Office 365 White Paper
This whitepaper provides an overview of the security practices and technology that support enterprise-grade security in Microsoft Office 365 for businesses of all sizes.

Office 365 White Paper: Guidance for Office Development in Office 365
This white paper explains the primary differences between developing Microsoft Office client solutions for Microsoft SharePoint Online in Office 365 and for the on-premises version of SharePoint 2010.

A Month in #Exchange and #BlackBerry: May/June 2011: To Read

#Exchange2010

KB Articles

Using an advanced search from here: http://www.blackberry.com/btsc/microsites/searchEntry.do for a date range to include -BlackBerry Enterprise Server for Microsoft Exchange.

“Error writing to database” is displayed after clicking on “Start Services” when installing the BlackBerry Enterprise Server
Error writing to database is displayed after clicking on Start Services when installing the BlackBerry® Enterprise…

ID: KB26624 | Published: 5/31/11 |

BlackBerry Policy Service stops polling the database for new requests
The BlackBerry® Policy Service stops checking the database for any new requests to be processed. This causes the delivery of items such as IT Policy, or Application…

ID: KB21529 | Published: 5/30/11 |

Non-responsive worker threads in BlackBerry Messaging Agent when processing e-mail with large attachment
When a user sends an e-mail with very large attachment(s) (approximately 1GB) from a 3rd party mail client (such as Microsoft® Outlook®…

ID: KB20172 | Published: 5/30/11 |

How to use the handheld cleanup tool when moving mailboxes in Microsoft Exchange
The handheldcleanup.exe tool is used when moving a mailbox from one Microsoft® Exchange Server to another Microsoft Exchange Server. If the mailbox was moved…

ID: KB00140 | Published: 5/30/11 |

Messages sent from BlackBerry devices are duplicated after Exchange 2010 SP1 is upgraded to Rollup Update 3
Messages sent, replied to and forwarded from the BlackBerry® smartphone are duplicated in sent items on the BlackBerry smartphone…

ID: KB26144 | Published: 5/27/11 |

BlackBerry Enterprise Transporter tool causes WLAN configuration duplication on destination BlackBerry Enterprise Server
When using the BlackBerry® Enterprise Transporter tool to move BlackBerry® smartphone users with WLAN configurations…

ID: KB27124 | Published: 5/27/11 |

CalHelper process consumes very high CPU utilization and requires manual process termination to exit
After installing or upgrading to Microsoft® Exchange Server MAPI Client and Collaboration Data Objects (CDO) 1.2.1 bundle 6.5.8165.0,…

ID: KB23131 | Published: 5/27/11 |

How to change the Sender Address field when sending messages to users from the BlackBerry Administration Service
By default, the Sender Address when using the ‘Send Message to User’ function, will be admin@yourcompanydomain.com. To change…

ID: KB26020 | Published: 5/27/11 |

How to assign a BlackBerry smartphone user to a static mailbox agent on a BlackBerry Enterprise Server
This article describes how to set a BlackBerry® smartphone user to a static mailbox agent ID. To assign a BlackBerry smartphone user to a…

ID: KB12766 | Published: 5/26/11 |

Recommended configuration for SRP connections through a proxy
The current BlackBerry® Infrastructure for Server Routing Protocol (SRP) connections is configured such that there are two different entry points, each with its own Internet…

ID: KB19236 | Published: 5/26/11 |

How to create an administrator account for the BlackBerry Administration Service
To create a BlackBerry® Administration Service account, perform the following steps: 1) In the BlackBerry® Administration Service, on the BlackBerry so lution…

ID: KB22415 | Published: 5/26/11 |

HTML content in email messages for BlackBerry smartphones
For BlackBerry® Device Software 4.5 to 6.0, HTML formatted content is supported on the BlackBerry® smartphone if the email account is integrated with the BlackBerry® Internet Service…

ID: KB04043 | Published: 5/26/11 |

“The application has encountered a system error. Please report this error to the System Administrator” appears when accessing the BlackBerry Administration Service login screen
When the login screen for the BlackBerry® Ad ministration…

ID: KB19920 | Published: 5/26/11 |

Decryption errors when receiving BlackBerry Messenger messages from certain users
Background The BlackBerry® Messenger application uses the existing personal identification number (PIN) messaging technology to send and receive messages from…

ID: KB04914 | Published: 5/26/11 |

BlackBerry account appears twice in BlackBerry Administration Service console when added as an administrator prior to being moved via BlackBerry Enterprise Transporter Tool
During migration, administrators with accounts on BlackBerry®…

ID: KB20098 | Published: 5/26/11 |

Unable to push/deploy the S/MIME support package through software configuration: “The application net.rim.blackberry.secureemail.smime version Unknown is missing.”
Pushing the SMIME Support Package through a software configuration fails…

ID: KB22623 | Published: 5/26/11 |

Error message “RIMDeviceManager.exe – unable to locate component” when starting up the BlackBerry Administration Service
The following error may occur when the BlackBerry Administration Service is started for the first time:…

ID: KB25458 | Published: 5/26/11 |

‘Request could not be completed’ error displayed after clicking “View group membership” option in BAS
An administrator user with enough access granted is unable to view the membership list for a group. This happens when the “View User”…

ID: KB27007 | Published: 5/26/11 |

“The request could not be completed” is seen when attempting to remove an Application Control Policy
When navigating in the BlackBerry® Administration Service interface to Software, Manage application control policies for unlisted…

ID: KB27087 | Published: 5/26/11 |

HTML emails replied from the BlackBerry Smartphones appear blank to recipient’s Outlook.
When a BlackBerry® user replies to a HTML email using their BlackBerry® smartphone the recipient will not be able to see the Body of the reply in…

ID: KB27100 | Published: 5/26/11 |

Delegate’s email address is shown instead of the original mail owner when forwarding or replying to an email that was sent by the delegate using the Sent on Behalf feature in Microsoft Outlook
If a delegate sends an email message using…

ID: KB21996 | Published: 5/26/11 |

Unable to log in to the BlackBerry Administration Service web console when running a mixed Windows Server 2003 and 2008 domain controller environment
The issue occurs due to differences of Kerberos™ encryption requirements for a W indows…

ID: KB18186 | Published: 5/26/11 |

A Red X appears in the message list after attempting to send an email message from the BlackBerry smartphone with an error “Desktop email program was unable to submit message”

After attempting to send an email message from the BlackBerry®…

ID: KB04422 | Published: 5/26/11 |

BlackBerry Messaging Agent start up process hangs during MAPI Subsystem Initialize process During start-up, the BlackBerry® Messaging Agent (MAGT) logs display the following log lines: [30054] (06/14 10:08:03.229):{0x970} Starting Message…

ID: KB23867 | Published: 5/26/11 |

The BlackBerry Administration Service page does not open due to an invalid “web.keystore” file
The BlackBerry® Administration Service page cannot be displayed. The BlackBerry Administration Service Application Server service is continuously…

ID: KB18260 | Published: 5/26/11 |

HTML emails replied from the BlackBerry Smartphones appear blank to recipient’s Outlook.
When a BlackBerry® user replies to a HTML email using their BlackBerry® smartphone the recipient will not be able to see the Body of the reply in…

ID: KB27100 | Published: 5/26/11 |

Migrate BlackBerry smartphone users between two Microsoft Exchange organizations
BlackBerry® Enterprise Server information cannot be maintained when migrating Microsoft® Exchange mailboxes from a Microsoft Exchange 5.5, 2000, or 2003…

ID: KB02060 | Published: 5/24/11 |

“MAPIMailbox – OpenMsgStore (0x8004011d) failed” appears and the BlackBerry Enterprise Server is unable to start some or all BlackBerry smartphones
While the BlackBerry® Enterprise Server services are started, the BlackBerry Mes saging…

ID: KB20066 | Published: 5/24/11 |

How to remove BlackBerry MDS Integration Service from a BlackBerry 5.0 Domain
Follow these steps in order to properly remove a BlackBerry® component like the BlackBerry® MDS Integration Service from a BlackBerry® Enterprise Server: 1) If…

ID: KB25044 | Published: 5/24/11 |

Unable to import IT policies to the BlackBerry Enterprise Server 5.0 SP2 using the Blackberry Administration Service console
When exporting IT polices from a BlackBerry® Enterprise Server 5.0 SP1 and then attempting to import it to a…

ID: KB23664 | Published: 5/24/11 |

How to configure administrative roles to manage specific groups only
To configure administrative roles to manage specific groups only, perform the following steps: 1) In the BlackBerry® Administration Service, on the BlackBerry solution…

ID: KB24196 | Published: 5/24/11 |

Unable to see a new instance of the BlackBerry Enterprise Server in th
e BlackBerry Administration Service

A new BlackBerry® Enterprise Server instance is installed in an existing BlackBerry domain with a running BlackBerry Administration…

ID: KB21914 | Published: 5/24/11 |

Calendar item disappears from organizer Outlook and BlackBerry smartphone, when delegate invites a DL of which both delegate and organizer are members
When a delegate creates a calendar invitation, selecting a distribution list of which…

ID: KB25530 | Published: 5/24/11 |

How to change disposition for an application from “Required” to “Optional” in the Software Configuration
There are situations where disposition for a wirelessly deployed third party application needs to be changed. If the application was…

ID: KB25427 | Published: 5/24/11 |

How to retrieve extended information for an SNMP service
When creating a custom SNMP monitoring tool, OID is required. The OID is a numeric value with the following format . 1.3.6.1.4.1.3530.6.7.10.10.15.1.2 and it represents the item which…

ID: KB24800 | Published: 5/24/11 |

Meetings invite for BlackBerry smartphone users show Invitees User name rather than Display Name.
This issue is caused by a correction that was done to fix another issue addressed in KB14757…

ID: KB19497 | Published: 5/24/11 |

When selecting Turn Power Off on a BlackBerry smartphone the scheduled time for the smartphone to power on does not match the Auto On/Off settings
When selecting Turn Power Off on a BlackBerry® smartphone, the scheduled time for the…

ID: KB19373 | Published: 5/24/11 |

“Please run Setup.exe to complete the installation before launching the BlackBerry Server Configuration Panel” after upgrading BlackBerry Enterprise Server
After applying a Service Pack to the BlackBerry® Enterprise Server, the BlackBerry…

ID: KB10253 | Published: 5/24/11 |

Firewall and connection requirements for access to the BlackBerry Infrastructure using Wi-Fi technology
A BlackBerry® smartphone has the ability to connect over a Wi-Fi® connection to the BlackBerry® Infrastructure, invoking a least-cost…

ID: KB24611 | Published: 5/24/11 |

Incorrect Microsoft SQL Server information appears in the BlackBerry Manager
After migrating the BlackBerry® Configuration Database to a remote Microsoft SQL Server, the BlackBerry Manager still shows the NetBIOS name of the previous…

ID: KB14562 | Published: 5/24/11 |

Insufficient CALHelperWS permissions result in errors in CALH log
The following log lines may be printed within the CALH logs for CALHelperWS (Microsoft® Exchange Web Services solution for CALHelper) after it is enabled via the trait tool:…

ID: KB19603 | Published: 5/24/11 |

How to install or remove the Database Notification System from a remote Microsoft SQL Server
During an installation of the BlackBerry® Enterprise Server, where the BlackBerry Configuration Database is installed locally, a custom event-based…

ID: KB11716 | Published: 5/24/11 |

How to locate and change the SRP ID and SRP Authentication Key in BlackBerry Enterprise Server 4.0 to 5.0
This article explains how to locate and change the SRP ID and SRP Authentication Key using the BlackBerry® Administration Service. …

ID: KB04744 | Published: 5/24/11 |

How to allow Enterprise Activation traffic for a BlackBerry Enterprise Server behind a firewall
To establish a correct Enterprise Activation or ETP connection when the Blackberry® Enterprise Server or BlackBerry® Desktop Redirector software…

ID: KB16378 | Published: 5/24/11 |

How to install or upgrade the Microsoft Exchange Server MAPI Client and Collaboration Data Objects 1.2.1
To update a previous MAPI client to Microsoft Exchange Server MAPI Client and CDO version 1.2.1 To update to the Mic rosoft®Exchange…

ID: KB15779 | Published: 5/24/11 |

BlackBerry Collaboration Service starts and stops
The BlackBerry® Collaboration Service starts and stops within approximately 30 seconds. The following log lines appear in the BBIM debug log: : : : : : : : : : : : : : · BlackBerry®…

ID: KB25289 | Published: 5/24/11 |

Reconciliation issues are seen in BlackBerry Administration Service after upgrading to BlackBerry Enterprise Server 5.0 SP3
It has been discovered that if BlackBerry® Enterprise Server 5.0 is upgraded to BlackBerry Enterprise Server 5.0 SP3…

ID: KB26461 | Published: 5/24/11 |

How to use the Device Agent Rebuild Tool to update the BlackBerry Configuration Database with current information when experiencing application deployment is
sues

The BlackBerry® smartphone might not correctly report information about the…

ID: KB22429 | Published: 5/24/11 |

The installer splash screen hangs for a long time when installing BlackBerry Enterprise Server 5.0 SP2 and 5.0 SP3
Long delays may be experienced when performing a new install or when applying the maintenance release patches to the…

ID: KB25575 | Published: 5/24/11 |

“The username, password, or domain is not correct. Please correct the entry” error is displayed when trying to log in to BlackBerry Administration Service using Microsoft Active Directory authentication
While attempting to log in to the…

ID: KB19200 | Published: 5/24/11 |

How to manage BlackBerry device software using the BlackBerry Administration Service
1) Download and install the BlackBerry® Device Software versions that need to be made available on the BlackBerry® Enterprise Server. 2) Share the Research…

ID: KB19198 | Published: 5/24/11 |

The BlackBerry Administration Service cannot be removed when running the setup application a second time
After installing BlackBerry® Enterprise Server, the BlackBerry Administration Service cannot be removed when running the setup…

ID: KB25579 | Published: 5/24/11 |

BlackBerry Administration Service is slow and non-responsive
The BlackBerry® Administration Service is very slow to respond and the following lines appear in the BlackBerry Administration Service Application Server (BAS-AS) log:…

ID: KB19279 | Published: 5/24/11 |

Firewall and connection requirements for the BlackBerry Enterprise Server
To establish a connection when the BlackBerry® Enterprise Server is behind a firewall, verify the following information: On the firewall, verify that port 3101 is…

ID: KB03735 | Published: 5/24/11 |

How to request a TLS certificate to allow the BlackBerry Collaboration Service to communicate with Microsoft Office Communicator Server 2007 R2 or 2010
As of BlackBerry® Enterprise Server 5.0 SP3, the BlackBerry Collaboration Service uses…

ID: KB24960 | Published: 5/24/11 |

How to use Loader.exe and the resettofactory command to restore a BlackBerry smartphone to factory default settings from the BlackBerry Enterprise Server
Resettofactory is a command of Loader.exe and it returns a BlackBerry® smartphone…

ID: KB21918 | Published: 5/24/11 |

How to import IT policy rule definitions for PlayBook
The attached file below contains several new IT Policies to support the BlackBerry® PlayBook™. Descriptions of these policies are below: Enable BlackBerry Bridge This policy can be found…

ID: KB26294 | Published: 5/24/11 |

Unable to view filed email messages
The BlackBerry® smartphone user cannot view email messages that have been filed in a folder on the BlackBerry smartphone user’s mailbox on the messaging server. · BlackBerry® Enterprise Server for…

ID: KB10425 | Published: 5/19/11 |

Error “MAPI error 8004010f” appears when the Microsoft Exchange permissions or Mapi32.dll need to be updated
The Windows® Application logs and the BlackBerry® Enterprise Server logs on the computer hosting the BlackBerry Enterprise Server…

ID: KB10212 | Published: 5/18/11 |

BlackBerry Server disconnects from the SQL configuration database and Exchange Information Store at the same time
· BlackBerry® Enterprise Server 4.1 SP7 · Microsoft® Exchange Server · Microsoft® SQL Server® Some backup solutions that send…

ID: KB25257 | Published: 5/18/11 |

Pending internal events and or reconciliation events count are increasing and the BBAS-AS logs are growing abnormally large
Within the BlackBerry® Administration Service console an administrator may observe the Pending Internal Events and…

ID: KB25726 | Published: 5/18/11 |

How to locate the BlackBerry Resource Kit log files
This knowledge base article is intended to assist BlackBerry® Enterprise Server administrators with locating the logs generated when th BlackBerry Enterprise Transporter 4.1 to 5.0 64-bit…

ID: KB17002 | Published: 5/18/11 |

How to replace a self-signed SSL certificate with a custom certificate after the installation of BlackBerry Administration Service
Log into the server as the BlackBerry® Enterprise Server service account and complete the following tasks to…

ID: KB12887 | Published: 5/18/11 |

Unable to remove Software Configuration from the BlackBerry Administration Service
The BlackBerry® Administrator is unable to delete a Software Configuration from the BlackBerry Ad
ministration Service as it appears to be assigned to a…

ID: KB25360 | Published: 5/18/11 |

How to use the BlackBerry Calendar Synchronization Tool (Traittool.exe)
For BlackBerry Enterprise Server 4.1. SP6 and 5.0 How to enable the TraitTool for a single BlackBerry® smartphone user and verify the process was started and completed…

ID: KB18548 | Published: 5/18/11 |

BlackBerry smartphone stops responding at the “Waiting for Services” stage during an enterprise activation
During the wireless enterprise activation process, the BlackBerry® smartphone stops responding and displays the following message:…

ID: KB04327 | Published: 5/18/11 |

How to move from a Microsoft SQL Server Desktop Engine (MSDE) database to a Microsoft SQL Server database
To move from a Microsoft® SQL Server® Desktop Engine (MSDE) database to a Microsoft SQL Server database, complete the following…

ID: KB12247 | Published: 5/18/11 |

Redirection status displays Disabled in BlackBerry Manager even though redirection is turned on
BlackBerry® smartphone user redirection status is displayed as Disabled instead of Enabled even though redirection has been turned on. ·…

ID: KB11170 | Published: 5/18/11 |

“::

” appears on Windows Event logs and BlackBerry MDS Connection Service logs after upgrading to BlackBerry Enterprise Server 5.0 SP2 and SP3
After upgrading to BlackBerry® Enterprise…ID: KB25239 | Published: 5/18/11 |

BlackBerry Enterprise Server for Applications fixes for Oracle Beehive Collaboration solution
Oracle® Beehive Collaboration Software is a suite of enterprise class applications such as email, calendar, tasks and other collaboration tools. …

ID: KB26987 | Published: 5/18/11 |

Allow multiple versions of an application to be available when white-listing applications with a software configuration
In BlackBerry® Enterprise Server 5.0 to 5.0 SP2, multiple versions of an application can be added to a software…

ID: KB25478 | Published: 5/18/11 |

How to troubleshoot SRP connectivity issues
Complete the following tasks to troubleshoot Server Routing Protocol (SRP) connectivity issues: 1. Run the BlackBerry Enterprise Server BBSRPTest.exe tool. 2. Locate the Network Access…

ID: KB02068 | Published: 5/18/11 |

How to use the BBSRPTest.exe to test the SRP connection on the BlackBerry Enterprise Server
Use the BBSRPTest.exe utility to test the Server Routing Protocol (SRP) network connectivity for the BlackBerry® Enterprise Server. The…

ID: KB00804 | Published: 5/18/11 |

Error “Unknown error encountered” when attempting to open an attachment from a BlackBerry smartphone
When any BlackBerry® smartphone user on the BlackBerry Enterprise Server attempts to open any attachments, the BlackBerry smartphone…

ID: KB19439 | Published: 5/16/11 |

Users fail to start and the BlackBerry Messaging Agent logs show “Failed to get company name, restarting user”
On a BlackBerry® Hosting Server Environment, the Lightweight Directory Access Protocol (LDAP) Company field is usually enabled….

ID: KB20435 | Published: 5/16/11 |

Supported configuration for HTTPS
SSL/TLS encryption is supported over Hypertext Transfer Protocol (HTTP) on the BlackBerry®­­ Enterprise Server and BlackBerry® smartphones. Depending on the configurations and installation of your…

ID: KB19826 | Published: 5/16/11 |

Unable to open .mp3 as attachment when the BlackBerry Attachment Service is on Server 2008
Users are unable to open .mp3 attachments on BlackBerry® smartphones when the BlackBerry Attachment Service is installed on Windows Server® 2008. ·…

ID: KB22953 | Published: 5/16/11 |

How to configure the flow control settings on a BlackBerry Enterprise Server
The following two settings control how the flow of data is transmitted to a BlackBerry smartphone from the BlackBerry® Mobile Data System Connection Service: ·…

ID: KB19894 | Published: 5/16/11 |

Rebroadcast trap message sent from BlackBerry Monitoring Service
The BlackBerry® Monitoring Service continually resends notification messages with the following Subject and body: Rebroadcast trap (V1) for server From : Uptime :…

ID: KB23683 | Published: 5/16/11 |

How to permit a BlackBerry device that has content protection turned on to run debugging tools and to generate debug logs
IT policy rules can be used to permit a Blac kBerry® smartphone that has content protection turned on to run debugging…

ID: KB20377 | Published: 5/16/11 |

Unable to remove the BlackBerry MDS Integration Service
The process of removing the BlackBerry® Mobile Data System Integration Service from the BlackBerry® Domain consists of two steps: 1) Removing the BlackBerry MDS Integration Service…

ID: KB24202 | Published: 5/16/11 |

Random BlackBerry smartphone users are unable to send and receive emails in a Microsoft Exchange 2010 messaging environment
Random BlackBerry® smartphone users might fail to start if the number of connections to the Microsoft® Exchange…

ID: KB23479 | Published: 5/16/11 |

Pending messages are not delivered to the BlackBerry Smartphone after an SRP expires
Temporary SRP’s (example: Txxxxxxxx) are meant for testing BlackBerry® Enterprise Server and in some migration scenarios. They are unique in that they have…

ID: KB19970 | Published: 5/16/11 |

How to manage wireless message reconciliation on a BlackBerry Enterprise Server
The BlackBerry® Enterprise Server reconciles message moves, deletions, and indicators for read and unread messages between BlackBerry® smartphones and the…

ID: KB20044 | Published: 5/16/11 |

“Invalid license keys” appears when a new enterprise license key is added through the BlackBerry Administration Service
After the BlackBerry® Enterprise Server is updated from Small Business Edition and an enterprise license key is added,…

ID: KB18732 | Published: 5/16/11 |

How to locate the SRP ID and SRP Authentication Key
The Server Routing Protocol Identifier (SRP ID) and SRP Authentication Key can be found in the following locations: · In the BlackBerry® Configuration Database · In the cached property…

ID: KB02632 | Published: 5/16/11 |

BlackBerry Administration Service is unable to resolve an application for a specific BlackBerry smartphone software version
A third party application was successfully added to a repository and pushed to several BlackBerry® devices. The…

ID: KB22067 | Published: 5/16/11 |

“The user has existing deployment tasks that have not completed.” is returned when moving users between BlackBerry Enterprise Servers
The user has existing deployment tasks that have not completed is returned when moving users between…

ID: KB24591 | Published: 5/16/11 |

“Username, Password or Domain is not correct. Please correct entry” is displayed when attempting to log in to BlackBerry Administration Service using Microsoft Active Directory authentication
Intermittent failures occur when logging into…

ID: KB24645 | Published: 5/16/11 |

How to disable Exchange Web Services (EWS) on the BlackBerry Enterprise Server
In certain circumstances, the BlackBerry® Enterprise Server may be enabled for Microsoft® Exchange Web Services, even though Exchange Web Services may not be…

ID: KB24638 | Published: 5/16/11 |

How to locate the number of Forwarded Messages, Pending Data Packets, Expired Messages, Sent Messages, Filtered Messages and Messages Failed in the BlackBerry Administration Service
To find the number of Forwarded Messages, Pending Data…

ID: KB19822 | Published: 5/16/11 |

How to check if a BlackBerry smartphone can be used with a BlackBerry Enterprise Server or BlackBerry Enterprise Server Express
Wireless service providers can activate a BlackBerry® smartphone on the wireless network with different data…

ID: KB21209 | Published: 5/16/11 |

“Named Pipes Provider: Could not open a connection to SQL Server [67]. “
When running CreateDB.exe, the following error occurs. [25000] (11/10 07:24:50.224):{0x314} Connec tionItem::ConnectToDB: COM Error 0x80004005 – Unspecified error -…

ID: KB20095 | Published: 5/16/11 |

How to update the BlackBerry Enterprise Server service account password
After the password for the BlackBerry® Enterprise Server service account has been changed in Microsoft® Active Directory®, complete the following steps: 1) In Windows®…

ID: KB05127 | Published: 5/16/11 |

How to generate a new web.keystore for the BlackBerry Monitoring Service
Run webGenKey.bat manually to generate the web.keystore file by completing the following steps: 1) Stop the following BlackBerry® Monitoring Services: · BlackBerry…

ID: KB24346 | Published: 5/16/11 |

Configuring ADPlus to troubleshoot hung threads and crashes in BlackBerryAgent.exe
ADPlus is · A tool included in the Debugging Tools for Windows part of the Windows Driver Kit · A console-based Microsoft® Visual Basic® script that uses the…

ID: KB19243 | Published: 5/16/11 |

Feature Enhancement to allow the ability to control “Browser Emulation”/”Browser Identification” via IT Policy
A Feature Enhancement to the BlackBerry® Enterprise Server 4.1 SP7 and 5.0 SP1 allow the ability to control Browser…

ID: KB17072 | Published: 5/16/11 |

Unable to open a document within the BlackBerry Browser
When browsing to a URL ending with a file extension indicating a document of some type (such as .doc, .rtf, anything non .html – e.g h ttp://www.blackbe rry.com/blackberry.rtf) the file…

ID: KB23060 | Published: 5/16/11 |

Padlock icon is seen next to BlackBerry smartphone configuration options are not editable
If a padlock icon is seen next to one or more of the following configuration items on the BlackBerry® smartphone then settings of these items…

ID: KB24492 | Published: 5/16/11 |

How to display more columns in BlackBerry Manager
The following additional columns are available in the Users tab in BlackBerry® Manager to help BlackBerry® Enterprise Server administrators audit their environment. Column Name Description…

ID: KB16333 | Published: 5/16/11 |

BlackBerry Administration Service requires access to BlackBerry.com
In BlackBerry® Enterprise Server 5.0, the BlackBerry® Administration Service automatically downloads certain information from BlackBerry.com. This information is used for…

ID: KB24932 | Published: 5/16/11 |

Meeting invitations received from external domains show as regular email messages on the BlackBerry smartphone
When a BlackBerry® smartphone user in a Microsoft® Exchange Server 2007 or 2010 environment receives a meeting invitation from an…

ID: KB20866 | Published: 5/16/11 |

No options listed under attached devices within the BlackBerry Administration Web Console
When attempting to view a BlackBerry® smartphone’s properties in the BlackBerry® Administration Service, when connected via USB, the options within…

ID: KB24530 | Published: 5/16/11 |

Free/busy lookups fail in an Exchange 2007 environment
Free/busy lookup will fail on BlackBerry® smartphones and the following error may be seen in the Microsoft® Messaging Agent log file: [Microsoft Exchange Server Information Store -…

ID: KB21477 | Published: 5/16/11 |

Certificate fetch requests fail with status code 407 when proxy mapping is enabled
When users try to fetch the status of certificates from Options, Security Options, Advanced Security Options, Certificates an “Internal Proxy provider e rror”…

ID: KB23181 | Published: 5/16/11 |

Unable to access the BlackBerry Administration Service link within the webconsole and the following error is displayed, “The application has encountered a system error. Please report this error to the System Administrator.”
Clicking on the…

ID: KB24186 | Published: 5/16/11 |

How to enable extended BlackBerry Manager logging
Standard Logging levels for the BlackBerry® Manager can be changed in the BlackBerry Server Configuration panel Logging tab like many other BlackBerry Enterprise Server Log files. For…

ID: KB04314 | Published: 5/16/11 |

“User already exists on server, user can not be removed” is displayed when adding a BlackBerry smartphone user to a BlackBerry Enterprise Server
When adding a BlackBerry® smartphone user to the BlackBerry Enterprise Server, the following…

ID: KB10044 | Published: 5/16/11 |

The BlackBerry smartphone does not automatically send read receipts after upgrading to BlackBerry Enterprise Server 5.0
After upgrading to BlackBerry® Enterprise Server 5.0, the BlackBerry smartphone does not automatically send read…

ID: KB19173 | Published: 5/16/11 |

Unable to restore the BESMgmt SQL database
When restoring the BlackBerry® Enterprise Service Management database through Microsoft® SQL Server® Management Studio, the database cannot be restored. The error message “exclusive access could…

ID: KB26971 | Published: 5/16/11 |

Common issues with BlackBerry Collaboration Service, BlackBerry Instant Messaging Connector, and Enterprise Messenger
If the BlackBerry® Collaboration Service and the BlackBerry® Instant Messaging Connector are unable to connect to the…

ID: KB10692 | Published: 5/16/11 |

Changing the BlackBerry Enterprise Server NetBIOS name or IP address
The name given to the BlackBerry® Enterprise Server during installation is by default the network basic input/output system (NetBIOS) name of the computer on which the…

ID: KB11224 | Published: 5/16/11 |

How to prevent sent messages from redirecting to the BlackBerry smartphone
BlackBerry® Enterprise Server version 4.0 – 5.0 redirects email messages sent from the email application to the BlackBerry® smartphone by default. Even if you choose…

ID: KB03849 | Published: 5/16/11 |

BlackBerry smartphone experiences an Uncaught Exception when the content protection of master keys IT Policy is enabled
On the BlackBerry® Enterprise Server, the following IT Policy settings may be applied to a BlackBerry smartphone: ·…

ID: KB23467 | Published: 5/16/11 |

SMS message size and data coding
The maximum allowable number of characters in a Short Message Service (SMS) message depends on the data coding scheme set on the BlackBerry® smartphone. The following list reflects the maximum allowable…

ID: KB15293 | Published: 5/16/11 |

BlackBerry Enterprise supported mirroring modes
The recommended mirroring mode for the BlackBerry® Enterprise Server is High safety with automatic failover (synchronous) mode. There are two other mirroring modes available: · High…

ID: KB26149 | Published: 5/16/11 |

Email message text appears garbled when sent from the BlackBerry smartphone
Changing the input language mode of an email message, using the Alt+Enter key combination before the email message is sent, causes the outgoing message encoding to…

ID: KB22013 | Published: 5/16/11 |

Web-based BlackBerry Device Software updates
BlackBerry® smartphone users have the option of updating the BlackBerry Device Software on their BlackBerry smartphones using web-based technology available on the BlackBerry Device Software…

ID: KB16071 | Published: 5/13/11 |

Add and remove BlackBerry smartphone users from a BlackBerry Enterprise Server
To add a BlackBerry® smartphone user to a BlackBerry® Enterprise Server, perform the following steps: BlackBerry Enterprise Server 4.0 for Microsoft Exchange 1)…

ID: KB11638 | Published: 5/13/11 |

“Unsupported file type” is displayed on the BlackBerry smartphone when attempting to open PDF documents created by LiveCycle Designer
When attempting to open a PDF document on the BlackBerry® smartphone, or if the BlackBerry Attachment…

ID: KB20004 | Published: 5/13/11 |

Value-added applications for BlackBerry smartphones
The following applications are classed as value-added on BlackBerry® smartphones. BlackBerry® Enterprise Server administrators can deploy these applications using the application control…

ID: KB24317 | Published: 5/11/11 |

Query made using BlackBerry Resource Kit to BlackBerry Web Services to a group with more than 2000 users fails to complete
When a query is made using the BlackBerry Resources Kit to BlackBerry Web Services and the action being performed…

ID: KB26598 | Published: 5/11/11 |

“Test BAS call failed, BAS assignments unavailable” appears during user migration with Groups, IT policies, or software configurations assigned through BlackBerry Enterprise Transporter
The preview portion of the migration process of…

ID: KB17164 | Published: 5/11/11 |

How to refresh or update company directory information using the BlackBerry Administration Service
With the introduction of BlackBerry® Enterprise Server version 5.0, a reference to user information from the company directory is stored with…

ID: KB17400 | Published: 5/11/11 |

“Access Denied: Insecure SSL Request” appears when using the browser on the BlackBerry smartphone
When the BlackBerry® smartphone user attempts to access a website using the browser on the smartphone or attempts to log in to the Bla ckBerry®…

ID: KB15117 | Published: 5/11/11 |

Windows Server 2003 domain controller memory leak affects wireless calendar synchronization
Calendar items created on the BlackBerry® smartphone do not display in Microsoft® Outlook®; however, calendar items created in Microsoft Outlook do…

ID: KB03784 | Published: 5/11/11 |

Unable to receive service books and no entries are displayed on the Host Routing Table
The BlackBerry® smartphone is not receiving service books and displays no entries on the Host Routing Table after being registered over the wireless…

ID: KB12287 | Published: 5/11/11 |

“The application has encountered a system error” when trying log in to the BlackBerry Monitoring Service
The application has encountered a system error is displayed on screen when trying to log in to the BlackBerry® Monitoring Console….

ID: KB24347 | Published: 5/11/11 |

How to change the BlackBerry Collaboration Service to connect to a different collaboration environment
In order to properly install the BlackBerry® Collaboration Service to be able to communicate with any of the supported collaboration…

ID: KB26623 | Published: 5/11/11 |

IT policy disabling sending SMS & MMS, the “Text Messages” Icon in BlackBerry 6.0 will disappear
This is the expected behavior in BlackBerry® 6.0 and above, “Text Messages” Icon in BlackBerry 6.0 Home screen of the device will disa ppear,…

ID: KB26949 | Published: 5/11/11 |

Minimum Policy setting for BlackBerry Handheld to allow BlackBerry Bridge to function.
To allow the BlackBerry® Bridge application installed on the BlackBerry® smartphone to pair and function correctly with the BlackBerry® Playbook™. …

ID: KB26660 | Published: 5/11/11 |

What is the EWSTest.exe utility
The EWSTest.exe utility can be used to test the configuration of Active Directory and the Microsoft® Exchange Client Access Server for Exchange Web Service operations. The utility can be run standalone and is…

ID: KB26140 | Published: 5/11/11 |

Troubleshooting Java processes using jstack
Java® processes cannot be debugged using standard debugging tools (Userdump, DebugDiag, ADPlus, WindDBG etc) that you may be familiar with. Any process dump taken from a Java process using the…

ID: KB22836 | Published: 5/10/11 |

Unable to upgrade a third-party application using a software configuration
Using a software configuration to upgrade an existing application results in a failure status for the application installation task. The BlackBerry® Policy logs…

ID: KB25267 | Published: 5/10/11 |

Unable to see inline images in Rich Text Format messages on the BlackBerry smartphone
The BlackBerry® smartphone user receives an email message containing inline images composed in Microsoft® Outlook® using Rich Text Format. The inline…

ID: KB21830 | Published: 5/9/11 |

Unable to send or receive email after the user’s mailbox is moved to another Microsoft Exchange 2010 SP1 Server
When a Microsoft® Exchange mailbox is moved to a new Microsoft Exchange Server within a Client Access Server array the…

ID: KB25864 | Published: 5/9/11 |

Mail delays when using Microsoft Exchange 2010
There is an increasing trend with customers who are migrating to BlackBerry® Enterprise Server for Microsoft® Exchange 2010 and begin to experience extreme messaging delays. These delays can be…

ID: KB25654 | Published: 5/9/11 |

“The installation source for this product is not available. Verify that the source exists and that you can access it” appears during installation of Maintenance Release for BlackBerry Enterprise Server 5.0 SP1
Either of the following error…

ID: KB21633 | Published: 5/9/11 |

How to configure the BlackBerry Administration Service to support proxy authentication
In BlackBerry® Enterprise Server 5.0 Service Pack 3, the BlackBerry® Administration Service is capable of detecting a proxy server automatically, and is…

ID: KB25252 | Published: 5/9/11 |

“Error initializing system” error appears when starting BlackBerry Enterprise Server 5.0 SP2 and 5.0 SP3 setup
When re-starting the BlackBerry® Enterprise Server 5.0 SP2 and 5.0 SP3 setup.exe, after the first installation attempt was…

ID: KB23428 | Published: 5/9/11 |

How to enable BlackBerry Enterprise Server 5.0 to use Microsoft Exchange Web Services
BlackBerry® Enterprise Server 5.0 has the ability to connect to Microsoft® Exchange Web Services for calendar functions. This replaces the need for the…

ID: KB20157 | Published: 5/9/11 |

“The transaction is not active!” is seen when running a command with the BlackBerry Enterprise Server User Administration Tool
When running a command using the BlackBerry® Enterprise Server User Administration Tool, the following error…

ID: KB26219 | Published: 5/9/11 |

Connecting a BlackBerry smartphone to BlackBerry Desktop Manager 6.0.1 disables wireless Calendar synchronization
Connecting a Blackberry® s martphone activated on BlackBerry® Enterprise Server 4.1 to BlackBerry® Desktop Manager 6.0 SP1…

ID: KB26183 | Published: 5/9/11 |

How to add users with the BlackBerry User Administration Service
The BlackBerry® User Administration Service can be used to do various administrative tasks like adding BlackBerry® smartphone users. Below is an example of how to add a…

ID: KB25307 | Published: 5/9/11 |

“STACK_OVERFLOW” exception unexpectedly terminates the “BlackBerryAgent.exe” process
The BlackBerryAgent.exe process might terminate unexpectedly, which will cause the BlackBerry® Controller to restart the process. Although no log lines are…

ID: KB21684 | Published: 5/6/11 |

How to locate the BlackBerry Enterprise Server Debug Logs
The default location of debug logs generated by various editions of the BlackBerry® Enterprise Server is: 64-bit server: C:Program Files (x86)Research In MotionBlackBerry…

ID: KB26684 | Published: 5/6/11 |

Calendar items disappear from BlackBerry smartphones after applying SP1 to Microsoft Exchange Server 2010
Calendar items disappear from BlackBerry® smartphones after Service Pack 1 is applied to Microsoft® Exchange Server 2010. This can be…

ID: KB23949 | Published: 5/6/11 |

Mail flow stops after 7 days of Enterprise Transport – Policy Service does not regenerate encryption keys due to ‘null’ KeyDate field
After a migration from BlackBerry® Enterprise Server 4.1 SP6 to BlackBerry Enterprise Server 5.0 SP1 using…

ID: KB24329 | Published: 5/5/11 |

Messages saved in a PST file are not reconciled with the BlackBerry smartphone
Email messages that are saved on a local computer from the Microsoft® Outlook® inbox to a Microsoft Outlook Personal Storage (PST) file remain on the Bl ackBerry®…

ID: KB13140 | Published: 5/5/11 |

BlackBerry Collaboration Service will not remain in the started state
When starting the BlackBerry® Collaboration Service, the service will not remain in the started state. · BlackBerry® Enterprise Server 5.0 SP1 In BlackBerry Enterprise…

ID: KB24583 | Published: 5/5/11 |

BlackBerry smartphone users are not able to log in to BlackBerry® Client for IBM® Lotus® Sametime®.
BlackBerry® smartphone users are not able to log in to BlackBerry® Client for IBM® Lotus® Sametime®. This issue may occur when an…

ID: KB04928 | Published: 5/5/11 |

How to perform an email reconciliation test
An email reconciliation test should be run if a BlackBerry® smartphone user reports email messages that have been opened, moved, or deleted in Novell® GroupWise®, Microsoft® Exchange, or IBM®…

ID: KB11714 | Published: 5/5/11 |

“Exceeded the maximum of 500 objects of type objtFolder” error message appears in the Application Event Log
The maximum number of open folder objects for a login is 500. · BlackBerry® Enterprise Server for Microsoft® Exchange · BlackBerry…

ID: KB20878 | Published: 5/5/11 |

How to enable message prepopulation for all BlackBerry smartphone users on a BlackBerry Enterprise Server
In versions earlier than BlackBerry® Enterprise Server 4.0 SP3 HF2, email message prepopulation only occurred if the personal…

ID: KB04713 | Published: 5/5/11 |

“Upgrade Issues” prompt appears when upgrading to BlackBerry Enterprise Server 5.0 SP3
When upgrading to BlackBerry® Enterprise Server 5.0 SP3, a prompt titled Upgrade Issues may appear that contains wording similar to the following: The…

ID: KB25012 | Published: 5/5/11 |

Hard deletes fail to reconcile when a client-side rule moves email messages to a PST
Hard deletes fail to reconcile when a client-side rule moves email messages to a PST file. The following may appear in the Messaging Agent (MAGT) log:…

ID: KB17420 | Published: 5/5/11 |

How to troubleshoot issues sending PIN messages from a BlackBerry smartphone
The BlackBerry® smartphone is unable to send a personal identification number (PIN) message. To troubleshoot the problem, complete the following steps: · Check the…

ID: KB02270 | Published: 5/5/11 |

Enterprise activation process stops at 11 percent when organizer data folder list is configured for “Device to Server”
When a BlackBerry® smartphone running BlackBerry Device Software 5.0 attempts to perform an Enterprise Activation, the…

ID: KB24052 | Published: 5/5/11 |

How to configure LDAP for the BlackBerry Enterprise Server
The LDAPDomain, LDAPSearch, LDAPport, LDApssl, LDAPALPSearch, and LDAPPIMSearchregistry entries are used to configure the Lightweight Directory Access Protocol (LDAP) for the…

ID: KB03193 | Published: 5/5/11 |

Visibility of the BCC field on the BlackBerry smartphone
The BCC or “Blind Carbon Copy” field may or may not be displayed within received email messages. The BCC field’s visibility on the Bla ckBerry® smartphone in a BlackBerry® Enterprise…

ID: KB24610 | Published: 5/5/11 |

How to use a password with an S/MIME encrypted message
In the S -MIME_Support_Pac kage_for_BlackBer ry®_smartphones-S ecurity_Technical _Overview…

ID: KB22659 | Published: 5/5/11 |

How to move a standby BlackBerry Enterprise Server instance to new hardware
To configure the BlackBerry® Enterprise Server for high availability, install a standby BlackBerry Enterprise Server on a separate computer from your organization’s…

ID: KB19485 | Published: 5/4/11 |

Securing BlackBerry smartphones in an organization’s environment for personal use and work use
An organization might want to permit BlackBerry® smartphone users to use BlackBerry smartphones for both personal use and work use. For example,…

ID: KB25462 | Published: 5/4/11 |

How to change the session timeout period within the BlackBerry Administration Service
The session time out can be modified by changing the session time out value in the web.xml file. 1) Login to the server with the Black Berry®…

ID: KB20570 | Published: 5/3/11 |

“Work data wipe is pending” prompt appears with a countdown on the BlackBerry smartphone
With the release of BlackBerry® device software 6 bundle 1478 or later, the ability for an administrator to remove only work related data for a…

ID: KB25053 | Published: 5/3/11 |

“An unsupported operation was attempted” appears, when launching the BlackBerry Server Configuration console for a BlackBerry Enterprise Server 5.0 that is installed on Windows Server Chinese Simplified Operating System
When attempting to…

ID: KB26807 | Published: 5/3/11 |

Unable to add users from company directory
Administrators may notice newly created entries in the company directory are not imported into dbo.MSAddresses SQL table in a timely manner and when adding new users to the BlackBerry® Ent erprise…

ID: KB25476 | Published: 5/2/11 |

BlackBerry Smartphone receives an Internal Error 500 when attempting to download an application through the BlackBerry Mobile Data Service
When a BlackBerry® smartphone attempts to download an application through the BlackBerry® Mobile Data…

ID: KB26384 | Published: 5/2/11 |

Testing of Global Catalog Referrals
1) Log in to the BlackBerry® Enterprise Server as the service account. 2) Stop the BlackBerry Enterprise Server Services. 3) Make the changes in KB16118…

ID: KB25066 | Published: 5/2/11 |

BlackBerry Administration Service continually stops and restarts, after an operating system hotfix is applied
When certain Microsoft® hotfixes are applied to Windows Server® 2008 or Windows Server 2008 R2 before or after installation of the…

ID: KB23927 | Published: 5/2/11 |

“Certificate error – There is a problem with this website’s security certificate” error message appears in the browser when accessing the BlackBerry Administration Service web address
When logging in to the BlackBerry® Administr ation…

ID: KB20439 | Published: 5/2/11 |

Cached Exchange Mode in Microsoft Outlook creates duplicate email messages in the Sync Issues – Conflicts folder for BlackBerry Enterprise Server users
When Cached Exchange Mode is enabled in Microsoft® Outlook®, BlackBerry® smartphone…

ID: KB19222 | Published: 5/2/11 |

“HTTP Error 503: Service Unavailable” appears when a web page is browsed on the BlackBerry smartphone
When the BlackBerry® smartphone user attempts to open a web page using the browser on the BlackBerry smartphone, the following error…

ID: KB04828 | Published: 5/2/11 |

How to change the BlackBerry Configuration Database in BlackBerry Enterprise Server 5.0
In BlackBerry® Enterprise Server 4.0 and 4.1, the Change Database option is available in the BlackBerry® Server Configuration Panel. This option is no…

ID: KB18129 | Published: 5/2/11 |

How to turn enable wireless BlackBerry Device Software updates in the BlackBerry Administration Service
By default, wireless BlackBerry® Device Software updates are not turned on in the BlackBerry® Administration Service. You will not be…

ID: KB17402 | Published: 5/2/11 |

Disallow Third Party Application Downloads removes Add-on applications
The Disallow Third Party Application Downloads IT policy rule prevents a user from installing an third party application that is sent over a wireless network or…

ID: KB25826 | Published: 5/2/11 |

Random BlackBerry smartphones fail to start and “MAPIMailbox – OpenMsgStore (0x8004011d) failed” appears in BlackBerry Messaging Agent and Application logs due
to Microsoft Exchange 2010 Throttling Policy

By default, client throttling is…

ID: KB20608 | Published: 5/2/11 |

What should be considered when choosing to install DBNS
Without any BlackBerry® smartphone user activity, the BlackBerry® Enterprise Server produces about 1500 query statements per hour. The number of query statements can be reduced by 50…

ID: KB21563 | Published: 5/2/11 |

BlackBerry smartphone users are unable to browse using the BlackBerry Browser or connect to the BlackBerry Collaboration Service
A secure connection password is not typed during the BlackBerry® Enterprise Server installation process. After…

ID: KB05338 | Published: 5/2/11 |

IT Policy Push will keep retrying after 4 hours when device is out of coverage during BlackBerry Enterprise Transporter Migration
It is a recommended best practice to have BlackBerry® smartphones turned on and in coverage when performing…

ID: KB25374 | Published: 5/2/11 |

HTTP Error 403 appears on the BlackBerry smartphone when using integrated authentication for the BlackBerry MDS Connection Service
HTTP Error 403 might appear on the BlackBerry® smartphone when the user browses to a web site. This might be…

ID: KB22634 | Published: 5/2/11 |

Data limitations for wireless calendar synchronization
When a calendar appointment is created on the BlackBerry® smartphone, the first 4096 characters entered in the notes field will be synchronized with the mail client. The *notes* field…

ID: KB04534 | Published: 5/2/11 |

BlackBerry Performance Monitor Counters are missing on Windows 64-bit Servers
BlackBerry® Performance Monitor (PerfMon) counters are not listed as available counters. · BlackBerry® Enterprise Server 5.0 SP2 · Windows® · Windows Server® 2003…

ID: KB21534 | Published: 4/29/11 |

IT policy changes not applied to user accounts immediately after upgrading to BlackBerry Enterprise Server software version 5.0
With the introduction of BlackBerry® Enterprise Server software version 5.0, a method of managing IT policies,…

ID: KB17245 | Published: 4/28/11 |

How to set the default Active Directory domain for BlackBerry Administration Service and BlackBerry Web Desktop Manager authentication
When logging in to the BlackBerry® Administration Service or BlackBerry® Web Desktop Manager the D omain…

ID: KB17695 | Published: 4/28/11 |

March 2011: Daylight Savings Time Update
The March 2011 Daylight Savings Time (DST) update is cumulative and includes updates to the following Time Zones: Country Time Zone DST Start DST End Chile* Santiago (GMT -4)* Midnight between…

ID: KB26202 | Published: 4/28/11 |

Intermittent inability to send Enterprise Activation emails through the BlackBerry Administration Service console.
When you create a new user and select Create a user with a generated activation password, the BlackBerry®Administration…

ID: KB26401 | Published: 4/28/11 |

How to configure the timeout limit for HTTP connections for BlackBerry smartphones in BlackBerry Enterprise Server version 5.0
The default timeout can be specified for how long a BlackBerry® MDS Connection Service waits for a BlackBerry®…

ID: KB24660 | Published: 4/28/11 |

How to switch BlackBerry Enterprise Server service accounts
To change the BlackBerry® Enterprise Server service account for the BlackBerry Enterprise Server for Microsoft® Exchange, complete the following tasks: Summary of Tasks 1) Create a…

ID: KB04293 | Published: 4/28/11 |

Issues with the BlackBerry Enterprise Server when using a Windows Server 2008 Global Catalog Server – NSPI Bind Limit exceeded
In an environment using exclusively, or a majority of, global catalog servers on Windows Server® 2008, it is…

ID: KB17325 | Published: 4/28/11 |

BlackBerry Administration Console is unavailable and the BAS-AS log shows “Error: The TDS protocol stream is not valid”
The BlackBerry® Administration Service Application Server (BAS-AS) keeps restarting while the following appears on the…

ID: KB19310 | Published: 4/28/11 |

Support for placing the BlackBerry Enterprise Server in the DMZ
Placing the BlackBerry® Enterprise Server in the demilitarized zone (DMZ) is neither recommended nor supported. If the BlackBerry Enterprise Solution is placed in the DMZ, a…

ID: KB12281 | Published: 4/28/11 |

How to resolve duplicate calendar entries on a BlackBerry smartphone
If calendar entries on the BlackBerry® smartphone are not reconciled correctly with the email applicat
ion, reset the calendar application on the smartphone to synchronize…

ID: KB04950 | Published: 4/28/11 |

How to automatically install the BlackBerry Web Desktop Manager client file on a user computer
To automatically install the BlackBerry® Web Desktop Manager client file on a BlackBerry® smartphone user’s computer, complete the following two…

ID: KB12995 | Published: 4/28/11 |

“Unable to Find user in AD” and/or “No Send AS permission” appears when running IEMSTest.exe
When IEMSTest.exe is run, Unable to find user in AD and/or a No Send As Permission error message is displayed in the IEMSTest.exe results. ·…

ID: KB24959 | Published: 4/28/11 |

Unable to connect to configuration database due to SQL server port bind failure
The BlackBerry® Dispatcher service fails to start, and error 5608 appears in the System Logs in Event Viewer. The following log lines may appear in the…

ID: KB24746 | Published: 4/28/11 |

Unable to browse intranet sites while using a BlackBerry smartphone with BlackBerry Device Software 6.0
When attempting to view intranet sites on a BlackBerry® smartphone with BlackBerry® Device Software 6.0, the site cannot be viewed and…

ID: KB24144 | Published: 4/28/11 |

Activation of a BlackBerry smartphone over the wireless network requires BlackBerry Enterprise Server provisioning
Wireless activation of the BlackBerry® smartphone on the wireless network is not successful. · BlackBerry® Enterprise Server…

ID: KB14536 | Published: 4/28/11 |

Warning message “Configuration Channel data will not be sent until key is generated” is logged in application log file.
After performing an in place upgrade on a BlackBerry® Enterprise Server 4.1 SP7 to 5.0 SP2, multiple warning messages…

ID: KB24264 | Published: 4/28/11 |

How to restrict BlackBerry cellular calling to Mobile Voice System work line only
Administrators can configure the BlackBerry® Mobile Voice System (MVS) server and BlackBerry® Enterprise Server (BES) to restrict the BlackBerry® smartphone…

ID: KB26757 | Published: 4/28/11 |

Seeing network errors when opening Google Maps
When opening Google Maps™ on a BlackBerry® smartphone the following error appears: Network error. Your enerprise Blackberry server does not allow connections to the Google Maps service ·…

ID: KB26752 | Published: 4/28/11 |

Daylight Savings Time – Egypt 2011
On April 20, 2011 the Egyptian government announced that Daylight Savings Time will not be observed. Daylight Savings Time was orginally scheduled to start on April 29, 2011. · BlackBerry® Enterprise…

ID: KB26782 | Published: 4/28/11 |

BlackBerry smartphone user will fail to start if moved to a BlackBerry Enterprise Server whose Service Account does not have permissions to the BlackBerry smartphone user’s mailbox
If a BlackBerry® smartphone user account is moved via the…

ID: KB26710 | Published: 4/26/11 |

How To Submit BlackBerry Enterprise Server Debug Logs
Sometimes for troubleshooting purposes the BlackBerry® Enterprise Server Debug Logs will be required to be reviewed by Technical Support Teams. The default location for the logs is in…

ID: KB26083 | Published: 4/25/11 |

BlackBerry Collaboration Service does not stay started and shows “X509 certificate not found” error in the logs
The BlackBerry® Collaboration Service 5.0 SP3 starts, but then stops. Reviewing the BBIM logs shows: :[110]::: · Bla ckBerry®…

ID: KB26638 | Published: 4/25/11 |

Set password and lock handheld command from BlackBerry Manager
When a BlackBerry® smartphone user forgets the password to unlock a BlackBerry smartphone, the administrator can try to unlock the BlackBerry smartphone using the Set pas sword…

ID: KB12826 | Published: 4/25/11 |

Determine the number of client access licenses installed on the BlackBerry Enterprise Server
Complete the following steps to determine the number of client access licenses (CALs) installed on the BlackBerry® Enterprise Server. BlackBerry…

ID: KB10952 | Published: 4/25/11 |

Prompt to type key store password when password length IT policy is changed
After the minimum password length IT policy is changed, BlackBerry® smartphone users are prompted to type key store passwords even though the key store menu has…

ID: KB15051 | Published: 4/25/11 |

BlackBerry smartphone users are unable to send and receive email messages after their Legacy Exchange Distinguished Name attributes were manually changed
BlackBerry® smartphone users are unable to sen
d and receive email messages after their…

ID: KB16459 | Published: 4/25/11 |

The BlackBerry Administration Service runs very slowly or is unresponsive after an operating system hotfix is applied
When certain Microsoft® hotfixes are applied to Windows® Server 2008 or Windows Server 2008 R2 before or after…

ID: KB25330 | Published: 4/25/11 |

“Error code 0” and “ExtUDPLogThread: Failed to bind to socket” appear in the BlackBerry Messaging Agent logs
The main symptoms of this issue are: 1) Only one BlackBerry® Messaging Agent has started. 2) The BlackBerry Controller debug log…

ID: KB21145 | Published: 4/25/11 |

How to turn on global catalog referrals for a Microsoft Exchange Server
BlackBerry® smartphone users experience messaging delays or stoppage due to a global catalog server going offline. · BlackBerry® Enterprise Server 4.1 to 5.0 SP3 ·…

ID: KB16118 | Published: 4/25/11 |

How to migrate from Microsoft Exchange Server 2003 or 2007 to Microsoft Exchange Server 2010 in a BlackBerry Enterprise Server 5.0 environment
When migrating Microsoft® Exchange 2003 or 2007 to Microsoft Exchange 2010 in a BlackBerry®…

ID: KB22601 | Published: 4/25/11 |

How to uninstall the BlackBerry MDS Integration Service
The BlackBerry® Mobile Data System Integration Service was used in previous versions of BlackBerry® Enterprise Server to develop and deploy custom applications for integration with…

ID: KB25047 | Published: 4/25/11 |

BlackBerry Enterprise Instant Messaging is not functional with Microsoft Office Communications Server 2007 R2
Microsoft® Office Communications Server 2007 R2 (OCS) is not functional with BlackBerry® Collaboration Services 4.1 SP6, SP7 and…

ID: KB17757 | Published: 4/25/11 |

Check the BlackBerry Enterprise Server service account permissions on a BlackBerry smartphone user’s mailbox
There are several instances where the BlackBerry® Enterprise Server’s permissions must be checked against a BlackBerry smartphone…

ID: KB12789 | Published: 4/25/11 |

The BlackBerry Collaboration Service starts and stops when connecting to Office Communications Server 2007 R2
The BlackBerry® Collaboration Service starts and then stops as it is attempting to provision itself within the Microsoft® Office…

ID: KB25416 | Published: 4/25/11 |

How to upgrade or update the Java Runtime Environment on the BlackBerry Enterprise Server 4.1 to 5.0 SP2
How to upgrade the Java® Runtime Environment Upgrading the Java Runtime Environment on the BlackBerry Enterprise Server can affect five…

ID: KB17872 | Published: 4/25/11 |

Users are prompted to regenerate encryption key on the BlackBerry device
BlackBerry® Smartphone users need to regenerate encryption keys on the device. This is caused due to device coverage when the OTAKEYGEN sent from the Bl ackBerry®…

ID: KB24972 | Published: 4/25/11 |

An attempt to upgrade the database was unsuccessful. An error occurred while executing an SQL statement.
When running the setup application to upgrade the BlackBerry® Enterprise Server to 5.0 SP2, the following error occurs: An attempt to…

ID: KB24111 | Published: 4/25/11 |

How to check or add client access license keys on the BlackBerry Enterprise Server
To add a new client access license (CAL) authentication key, complete the following steps for the appropriate version of BlackBerry® Enterprise Server:…

ID: KB10112 | Published: 4/25/11 |

Intermittent mail delivery issues are experienced on BlackBerry smartphones when Microsoft Exchange is configured behind a load balancing appliance
Users receive a red X when sending new email or replying to emails from their BlackBerry®…

ID: KB22812 | Published: 4/25/11 |

“Could not start the BlackBerry Mobile Data Service on Local Computer. Error 203 The system could not find the environment option that was entered” appears when starting the BlackBerry MDS Connection Service
After finishing the installation…

ID: KB04329 | Published: 4/25/11 |

“The specified IP address is invalid” appears when adding a FQDN to the VPN Gateway Address field
If you add an FQDN to the VPN Gateway Address field in a VPN profile a The specified IP address is invalid error will appear when saving the…

ID: KB26433 | Published: 4/25/11 |

“IDispatch error #3159 and COM Error 0x80040E57” is displayed frequently in the BlackBerry Messaging Agent logs
The following errors are frequently logged in the BlackBerry Messaging Agent and Application log on the BlackBerry&
reg; Enterprise…

ID: KB26550 | Published: 4/25/11 |

BlackBerry Device Software configuration in BlackBerry Enterprise Server 5.0
BlackBerry® Device Software configuration is a new feature in BlackBerry® Enterprise Server 5.0 and allows the administrator more control over BlackBerry®…

ID: KB20556 | Published: 4/25/11 |

Temporary CALS for BlackBerry Enterprise Server software
Temporary Client Access Licenses (CALs), for BlackBerry® Enterprise Server software for Microsoft® Exchange, can be requested by customers, resellers and carriers. These CALs are…

ID: KB02421 | Published: 4/25/11 |

Only email message headers appear on the BlackBerry smartphone during pre-population
Only email message headers appear on the BlackBerry® smartphone during pre-population. · BlackBerry® Enterprise Server 4.0 to 4.1 SP6 The option Send…

ID: KB10223 | Published: 4/25/11 |

BlackBerry Administration Service does not load past the loading screen after upgrade to BlackBerry Enterprise Server 5.0 SP3
Following an upgrade to BlackBerry® Enterprise Server 5.0 SP3, the BlackBerry Administration Service web console…

ID: KB26557 | Published: 4/25/11 |

BlackBerry Messenger conversations are not being captured in the e-mail audit logs.
BlackBerry® Messenger conversations are not being captured in the e-mail audit logs after assigning and setting the right IT Policy rules. Minimum steps to…

ID: KB21412 | Published: 4/25/11 |

Unable to view HA status, or perform manual failovers in BlackBerry Administration Service webconsole or BlackBerry Server Configuration
Viewing the HA status in the BlackBerry Administration Service or the BlackBerry Server Configuration…

ID: KB21091 | Published: 4/20/11 |

Unable to send a MMS message from the BlackBerry smartphone
The BlackBerry® smartphone user is unable to send Multimedia Message Service (MMS) messages. · BlackBerry® Enterprise Server 4.1 to 5.0 SP1 · BlackBerry® Device Software 4.1 to 5.0…

ID: KB11766 | Published: 4/20/11 |

SSL Cipher Suites supported by the BlackBerry Administration Service
To find the list of SSL Cipher Suites supported by the BlackBerry® Administration Service: Navigate to the following location: C:Program FilesResearch In…

ID: KB23475 | Published: 4/20/11 |

Meetings are removed after clicking ‘No Response Required’ on Informational-Only updates
When a user running Microsoft® Outlook® 2010 who also have a BlackBerry® smartphone may find that when they receive an Informational-Only update (i.e….

ID: KB26413 | Published: 4/20/11 |

“MAPIMailbox::MAPIMailbox – OpenMsgStore (0x80040204) failed” appears in BlackBerry Messaging Agent logs and some users fail to start
After running an application that uses Messaging Application Programming Interface (MAPI), the following…

ID: KB23981 | Published: 4/20/11 |

Users are unable to log into Enterprise Messenger Client for Office Communications Server 2007 R2 or Lync 2010
In a Microsoft® Office Communications Server 2007 R2 or Microsoft® Lync™ Server 2010 environment, and BlackBerry® En terprise…

ID: KB26429 | Published: 4/20/11 |

Login page is displayed when using Single Sign-on with the BlackBerry Administration Service or BlackBerry Web Desktop Manager
The following describes some of the common issues that result in a failure when attempting to login to the…

ID: KB25154 | Published: 4/20/11 |

How to perform a manual failover of the BlackBerry Enterprise Server
Failover between the primary and standby BlackBerry® Enterprise Server instances occurs when the standby BlackBerry Enterprise Server determines that its health score is…

ID: KB17408 | Published: 4/20/11 |

The BlackBerry Administration Service becomes very slow or unresponsive after BlackBerry Enterprise Server 5.0 SP2 is installed
After installing BlackBerry® Enterprise Server 5.0 SP2, the BlackBerry® Administration Service becomes very slow…

ID: KB23494 | Published: 4/20/11 |

Software requirements for BlackBerry Enterprise Server for Microsoft Exchange
To make sure that the BlackBerry® Enterprise Server installation meets basic software requirements, perform the following tasks: 1) Verify software conf iguration…

ID: KB11842 | Published: 4/20/11 |

Configure BlackBerry Mobile Data System for Kerberos Authentication to a web site
To configure the BlackBerry® Mobile Data System (BlackBerry MDS) for Kerberos™ authentication to a web site hosted on a web server requiring Kerberos…

ID: KB
15642 | Published: 4/20/11 |

Reconciliation does not continue when one BAS node is shut down and another one is brought on-line
In a multiple BlackBerry® Administration Service node environment, if a BlackBerry Administration Service node is brought offline and it has…

ID: KB25461 | Published: 4/20/11 |

What is a BlackBerry Orphaned Contacts folder?
The “BlackBerry® Orphaned Contacts” folder information is created when the mail agent gets an “addContact” request from the device during a slow sync or activation, and the when folderID…

ID: KB26373 | Published: 4/20/11 |

MAPI and CDO Clients are missing on BlackBerry Enterprise Server when updating to Microsoft Exchange 2007
Important : This installation discussed in this knowledge base article is intended only for BlackBerry® Enterprise Server. Background…

ID: KB12697 | Published: 4/20/11 |

How to export or import BlackBerry Enterprise Server Client Access License (CALs) keys from a command prompt
This article contains directions to export Client Access License keys from the BlackBerry® Configuration database using the BCP…

ID: KB03300 | Published: 4/20/11 |

How to turn on BlackBerry smartphone PIN and SMS logging from the BlackBerry Enterprise Server
Personal identification number (PIN) messages and Short Message Service (SMS) text messages that have been sent and received on a Blac kBerry®…

ID: KB05024 | Published: 4/19/11 |

“Transaction error – decryption error” is displayed when an email message is sent from a BlackBerry smartphone
An X is displayed in the message list on the BlackBerry® smartphone, indicating that the email message could not be sent. The…

ID: KB01608 | Published: 4/19/11 |

Cannot uncheck the BlackBerry Administration Service components when running Setup
When trying to uncheck the BlackBerry® Administration Service components from Setup the following warning occurs: “You cannot cancel the option to upgrade…

ID: KB24548 | Published: 4/19/11 |

How to use or enable Remote Files / File Explorer and what behavior to expect.
From the BlackBerry® smartphone: 1. On the Home Screen, go to Applications. 2. Go to Files. 3. In the Go To:// section, specify . 4. When prompted enter…

ID: KB22546 | Published: 4/19/11 |

How to enable debug logging for the BlackBerry MDS Integration Service
To see all SOAP (Simple Object Access Protocol) messages between a BlackBerry® MDS Integration Service based application and a web-service, enable debug logging for the…

ID: KB17860 | Published: 4/19/11 |

BlackBerry Enterprise Server services errors
The following errors are logged in the BlackBerry® Enterprise Server logs and the Windows® Event Viewer™ logs for the BlackBerry Enterprise Server services. The lists are divided into three…

ID: KB04099 | Published: 4/19/11 |

Application redeployment occurs when BlackBerry smartphone users are moved from one BlackBerry Enterprise Server instance to another instance within the same BlackBerry Domain When a BlackBerry smartphone user is moved from one BlackBerry…

ID: KB24339 | Published: 4/19/11 |

Forwarding rule prevents wireless enterprise activation process and encryption key regeneration
The wireless enterprise activation process does not work as expected and the BlackBerry® smartphone can no longer send or receive messages. The…

ID: KB04485 | Published: 4/19/11 |

Correct order to start and stop BlackBerry Enterprise Server services
Important: Restarting the BlackBerry® Controller or BlackBerry Dispatcher delays email message delivery to BlackBerry® smartphones. For information on delays in email…

ID: KB13718 | Published: 4/19/11 |

What is the “Messages Failed” statistic on the BlackBerry Enterprise Server
Messages Failed statistics can be seen on BlackBerry® Manager under the Server Configuration tab. A failed message means the wireless network rejected attempts to…

ID: KB17083 | Published: 4/19/11 |

“Error 401: Unauthorized Access” appears when an attempt is made to browse to a secure website
The following error message appears when an attempt is made to connect to a webpage that requires Hypertext Transfer Protocol (HTTP)…

ID: KB10971 | Published: 4/19/11 |

How to disable Internet Browser on BlackBerry smartphones
To disable the Internet Browser on BlackBerry smartphones, perform the following: 1) In the BlackBerry Manager, in the left pane, click BlackBerry Domain. 2) On the Global tab, click…

ID: KB10936 | Published: 4/19/11 |

How to download and manually update the cdo.dll file
To download and manually update the cdo.dll file, complete the following tasks: Note: Before applying the cdo.dll file, verify that the most recent service pack for the M icrosoft®…

ID: KB02937 | Published: 4/19/11 |

HKEY_CURRENT_USER registry key is not updated after a BlackBerry Configuration Database name change
Two registry keys that point to the BlackBerry® Configuration Database can exist in a BlackBerry® Enterprise Server environment and be…

ID: KB04019 | Published: 4/19/11 |

Wireless application delivery fails when resending an application
After trying to resend an application to a BlackBerry® smartphone using wireless application delivery, the BlackBerry® Policy Service (POLC) logs show the following error:…

ID: KB04221 | Published: 4/19/11 |

Administrators are not able to add Microsoft Active Directory groups to administrative roles in the BlackBerry Administration Service
In BlackBerry® Enterprise Server 4.0 and 4.1, administrators had the ability to assign groups from…

ID: KB18526 | Published: 4/18/11 |

“Error: 1067. The process terminated unexpectedly” appears when trying to start the BlackBerry Mobile Data System
The following error message appears when you start the BlackBerry® Mobile Data System: Could not start the Mobile Data Service…

ID: KB11113 | Published: 4/18/11 |

‘Unrecognized Document Format” error when attempting to open attachments on the BlackBerry smartphone
When attempting to open an attachment on the BlackBerry smartphone, the following error message is received: Unrecognized Document Format…

ID: KB11882 | Published: 4/18/11 |

Duplicate Calendar items in a single calendar database appear sometimes when the BlackBerry smartphone is moved with BlackBerry Enterprise Transporter and Content Protection is enabled.
Duplicate calendar items appear only on the…

ID: KB25445 | Published: 4/18/11 |

“Page cannot be found” appears when accessing BlackBerry Monitoring Service
The web console for the BlackBerry Monitoring Service cannot be displayed and Page cannot be found appears. · BlackBerry® Enterprise Server 5.0 · BlackBerry…

ID: KB20207 | Published: 4/18/11 |

Errors occur when BlackBerry smartphone users on a BlackBerry Enterprise Server use BlackBerry App World
When a BlackBerry® smartphone user assigned to a BlackBerry Enterprise Server attempts to connect to BlackBerry App World, one of the…

ID: KB17855 | Published: 4/18/11 |

How to move the BlackBerry Configuration Database to a new Microsoft SQL Server instance
The BlackBerry® Enterprise Server services must be stopped during the process described in this article. Important: Restarting certain BlackBerry…

ID: KB03112 | Published: 4/18/11 |

Unable to open email message attachments on the BlackBerry smartphone
The BlackBerry smartphone user cannot open attachments on the BlackBerry smartphone. · BlackBerry® Desktop Manager 4.2 to 5.0 · BlackBerry® Enterprise Server ·…

ID: KB10473 | Published: 4/18/11 |

“Webserver.keystore (The system cannot find the file specified)” appears when BlackBerry MDS Connection Service is configured to use a self signed or third party certificate for SSL Push
When configured to use a self signed or third party…

ID: KB15978 | Published: 4/18/11 |

How to reset the OTASL Patch Availability Server address for BlackBerry Administration Service
With the introduction of the BlackBerry Administration Service in BlackBerry Enterprise Server 5.0, the BlackBerry Administration Service is now…

ID: KB19193 | Published: 4/18/11 |

How Application Control Policies adhere to the permission ceiling on BlackBerry smartphones
On a BlackBerry® smartphone, the software configuration is pushed down using the standard unlisted optional Application Control Polic y. Third-party…

ID: KB25816 | Published: 4/18/11 |

How to configure BlackBerry MDS Connection Service to perform certificate searches using LDAPS
The Mobile Data Service – Connection Service (MDS-CS) can be configured to allow LDAP (Lightweight Directory Access Protocol) certificate search…

ID: KB20197 | Published: 4/18/11 |

After a fresh installation, Administrative users are unable to log into the BlackBerry Administration Service web console using Active Directory authentication
The web page loads, but upon entering the user name and password the login…

ID: KB24973 | Published: 4/18/11 |

Turning off external services disables the browser push
Turning off ‘External services for selected devices’ disables a browser push or a bookmark push for that BlackBerry smartphone. · BlackBerry® smartphones When attempting to do a…

ID: KB26002 | Published: 4/18/11 |

IT policies introduced in BlackBerry Device Software 6.0
With the introduction of BlackBerry® Device Software 6.0, the following IT policies are available to BlackBerry Enterprise Server administrators. For instructions on how to import…

ID: KB23701 | Published: 4/18/11 |

What are the required permissions in the Microsoft SQL Server to create and manage the BlackBerry Configuration Database
To create the BlackBerry® Configuration Database, the administrator requires access to a Windows® account (Trusted) or…

ID: KB03633 | Published: 4/18/11 |

How to submit BlackBerry Enterprise Server logs through the BlackBerry Expert Support Center
This article will explain, in step by step detail, how to use the BlackBerry® Expert Support Center to submit debug logs from the Blac kBerry®…

ID: KB26576 | Published: 4/15/11 |

BlackBerry Monitoring Service does not start after upgrade to Windows Server 2008 R2 SP1
After a server running the BlackBerry® Monitoring Service is upgraded from Windows® Server 2008 R2 to Windows Server 2008 R2 SP1, the BlackBerry…

ID: KB26571 | Published: 4/15/11 |

Cross-site scripting (XSS) vulnerability in the BlackBerry Web Desktop Manager component of the BlackBerry Enterprise Server
CDO no longer supported by BlackBerry® Enterprise Server for Microsoft ® Exchange 2010 SP1 Hosting Mode
As of BlackBerry® Enterprise Server 5.0 SP3 for Microsoft® Exchange 2010 SP1 Hosting Mode, Collaboration Data Objects (CDO) will no…

ID: KB26555 | Published: 4/14/11 |

BlackBerry Attachment Service is unable to process Microsoft Office 2010 documents that are saved in compatibility mode – Word 97 to 2003
When trying to convert a Microsoft Office 2010 document that is saved in compatibility mode (Microsoft…

ID: KB23912 | Published: 4/14/11 |

How to configure the BlackBerry Enterprise Server to connect to a different BlackBerry Infrastructure
To configure the BlackBerry Enterprise Server to connect to a different BlackBerry® Infrastructure, complete the steps appropriate for the…

ID: KB05227 | Published: 4/14/11 |

BlackBerry Administration Service fails to start when special characters are used in the key store password
The BlackBerry® Administration Service fails to start when special characters are used in the key store password. · BlackBerry®…

ID: KB20521 | Published: 4/13/11 |

How to recreate the BlackBerry Enterprise Server MAPI profile
The Messaging Application Programming Interface (MAPI) profile is used to facilitate data communication between the Microsoft® Outlook® email application and the Microsoft®…

ID: KB10285 | Published: 4/13/11 |

How to install and set up SNMP for the BlackBerry Monitoring Service
To install the Simple Network Management Protocol (SNMP) for the BlackBerry® Monitoring Service from Windows Server® 2003, complete the following steps: 1) In the Windows®…

ID: KB12855 | Published: 4/13/11 |

Inbox folder redirection is randomly disabled for BlackBerry smartphone users
The BlackBerry® smartphone is not enabled to process a PURGED_MESSAGE_LIST command, but it sends the command. The BlackBerry® Enterprise Server receives this…

ID: KB18549 | Published: 4/13/11 |

Vulnerabilities in Apache Tomcat implementation impact BlackBerry Enterprise Server components
“Unable to access mailbox” error is received in the BlackBerry Manager when accessing user properties
The following error is displayed when viewing BlackBerry® Smartphone User Properties or BlackBerry Smartphone User Stats through the…

ID: KB02546 | Published: 4/12/11 |

Folder Redirection option is missing from the BlackBerry smartphone
The Folder Redirection option is missing from the Email Settings menu in the Messages application of the BlackBerry® smartphone. · BlackBerry® Enterprise Server ·…

ID: KB13650 | Published: 4/12/11 |

How to enable and what databases are included in an Automatic Wireless Backup for a BlackBerry smartphone on a BlackBerry Enterprise Server
To enable Automatic Wireless Backup on BlackBerry Enterprise Server 4.0 SP1, complete the following…

ID: KB11202 | Published: 4/12/11 |

“Returned FAILED” error message appears in the BlackBerry Enterprise Server Mail Agent (MAGT) log
The following message appears in the BlackBerry Enterprise Server Mail Agent (MAGT) log:
“Returned FAILED” · BlackBerry® Enterprise Server for…

ID: KB11481 | Published: 4/11/11 |

Unable to receive PIN messages from users who are not in the same BlackBerry domain
The BlackBerry® smartphone user is able to send Personal Identification Number (PIN) messages within the same organization, but when sending to a user in…

ID: KB13016 | Published: 4/11/11 |

The domain field in the BlackBerry Administration Service login page is missing when using Active Directory authentication
When Active Directory authentication is selected on the BlackBerry Administration Service page, the domain field does…

ID: KB24524 | Published: 4/11/11 |

SMS text message is logged on the BlackBerry Enterprise Server as “@” symbols
When SMS text message logging is enabled on the BlackBerry® Enterprise Server, the body of some SMS messages is logged as number of “@” symbols in the SMS log….

ID: KB19944 | Published: 4/11/11 |

Port conflict on 8443 between MDS-CS and BlackBerry Monitoring
Both the BlackBerry Monitoring Service and the BlackBerry® Mobile Data System Connection Service use port 8443 by default. As a result, the two services should not both be…

ID: KB21514 | Published: 4/11/11 |

“The enablement process has not completed” error message appears when attempting to configure folder redirection settings within the BlackBerry Administration Service console
When attempting to configure folder redirection settings for a…

ID: KB26143 | Published: 4/11/11 |

Can the JBoss security update 4.3.0.GA_CP08 be applied to the BlackBerry Administration Service?
The BlackBerry Administration Service uses JBoss® and there has been a recent security patch (4.3.0.GA_CP08) released to correct…

ID: KB25292 | Published: 4/11/11 |

BlackBerry Administration Server Console very slow when loading and navigating
When logging into the BlackBerry® Administration Console it is very slow to respond. The following log events are present in the BAS logs: (04/01…

ID: KB26405 | Published: 4/11/11 |

“Invalid instance name as it contains invalid characters” is seen in the Installer log for MR3
For RIM internal use only. Not for external distribution. When installing MR3 for BlackBerry Enterprise Server 5.0 SP2 the following error is…

ID: KB25830 | Published: 4/11/11 |

Configure a VPN profile on the BlackBerry smartphone
A virtual private network (VPN) profile contains the user account information required to log in to a VPN. Note: To be valid, the VPN profile created on the BlackBerry® smartphone must…

ID: KB13469 | Published: 4/11/11 |

How to configure regular expressions for BlackBerry MDS proxy exclusions
The BlackBerry MDS Connection Service and the BlackBerry® Mobile Data System use regular expressions to exclude a URL from being forwarded to a corporate proxy server….

ID: KB14053 | Published: 4/8/11 |

Global Address List fields
When a Global Address List (GAL) lookup is performed from a BlackBerry® smartphone, the BlackBerry® Enterprise Server queries the following fields within the Microsoft® Active Directory® schema: Field Value…

ID: KB03111 | Published: 4/8/11 |

How to trim the BlackBerry Monitoring Service database size
The BlackBerry Monitoring Service stores statistical information into its database via the Data Collection Subsystem. By default it will limit it’s database size to 4GB for…

ID: KB22559 | Published: 4/8/11 |

Upgrading the software required for BlackBerry Enterprise Server
For more information regarding the software requirements for the BlackBerry Enterprise Server for Microsoft Exchange and possible reasons for upgrading required software, see…

ID: KB12184 | Published: 4/8/11 |

Unable to receive email messages from the BlackBerry Enterprise Server to the BlackBerry smartphone
The BlackBerry smartphone user is unable to receive email messages from the BlackBerry Enterprise Server, but is able to send email me ssages…

ID: KB11172 | Published: 4/8/11 |

BlackBerry Dispatcher service fails to start and DISP log shows “SQL Network Interfaces: Error Locating Server/Instance Specified”
The BlackBerry® Dispatcher service fails to start and the following is displayed in the DISP log: [25000]…

ID: KB20710 | Published: 4/8/11 |

BlackBerry Messaging Agent Agent 1 failed to start. Error code 5402
The BlackBerry Messaging Agent fails to start and this results in no users being able to send or receive mail. The following log lines are shown in the BlackBerry…

ID: KB24613 | Published: 4/8/11 |

BlackBerry Manager crashes when selecting unreachable BlackBerry MDS Connection Service host.
BlackBerry Manager crashes when selecting unreachable BlackBerry MDS Connection Service host. If the BlackBerry Manager is running on BlackBerry®…

ID: KB17825 | Published: 4/8/11 |

Administration accounts in protected Microsoft Active Directory groups
When using the SetSendAsPermission tool to address problems with the Send As permission being revoked for the BlackBerry Enterprise Server administration account (for…

ID: KB12309 | Published: 4/7/11 |

How to deploy BlackBerry Smart Card Reader Software over the air using a software configuration
To deploy BlackBerry Smart Card Reader Software over the air using a software configuration from a BlackBerry Enterprise Server, complete the…

ID: KB26375 | Published: 4/7/11 |

Cannot start BlackBerry Enterprise Server services automatically after an upgrade to Java 1.6.0 Update 22
After following the steps listed in KB17872 (www.blackberry.c om/btsc/KB17872) to perform an upgrade to the JRE, th e BlackBerry…

ID: KB25011 | Published: 4/7/11 |

Unable to log into the BlackBerry Administration Service Console page error: “HTTP Status 404 – /app/webconsole”
When the BlackBerry administrator tries to log in to the BlackBerry Administration Service Console, the administrator received…

ID: KB25750 | Published: 4/7/11 |

“The username, password, or domain is not correct. Please correct the entry” appears at BlackBerry Administration Service login
This article contains an overview of several causes that prevent BlackBerry® smartphone users or administrators…

ID: KB17894 | Published: 4/7/11 |

How to deploy BlackBerry Smart Card Reader drivers over the air using a software configuration
To deploy BlackBerry Smart Card Reader drivers over the air using a software configuration, complete the following steps: 1) Download the…

ID: KB26376 | Published: 4/7/11 |

How to use the Erase Data and Disable Handheld command
The Erase Data and Disable Handheld command can be sent to a BlackBerry® smartphone over the wireless network to erase all data and disable it so that it is no longer connected to the…

ID: KB04529 | Published: 4/6/11 |

“New email address has been specified, wipe handheld data before activating this user” is displayed on the BlackBerry smartphone when performing an enterprise activation
While activating a BlackBerry® smartphone over the wireless ne twork,…

ID: KB15878 | Published: 4/6/11 |

BlackBerry Enterprise Server installation fails to install Java with the error “Java Runtime 6.0 update 15 has failed. Please check the install log for more information.”
When installing BlackBerry Enterprise Server 5.0 SP1, the…

ID: KB22971 | Published: 4/5/11 |

EventID 6008 “The previous system shutdown at (previous time) on (previous date) was unexpected.” appears in the Application Log when the BlackBerry Enterpise Server is rebooted
When shutting down Windows 2008 R2 over a Remote Desktop…

ID: KB24882 | Published: 4/5/11 |

Highlight of Calendar synchronization errors “MarkAppointmentAsSynchronized() failed: ERR_FAIL” and “pStateRecordMsg is NULL”
The Calendar Synchronization errors of MarkA ppointmentAsSynchronized() failed: ERR_FAIL and pStateRecordMsg is…

ID: KB25243 | Published: 4/5/11 |

“Cannot process invocation request” appears in the BAS_AS logs and the BlackBerry Administration Service console is inaccessible
When the BlackBerry Administration Service is accessed from an Internet browser, the following message appears…

ID: KB22553 | Published: 4/5/11 |

BlackBerry smartphone support for private keys and certificates
BlackBerry smartphones support PKCS#12 (.p12 and .pfx file extensions) digital certificates, including private keys, and digital certificates with .cer, .cert, .crt, .der,…

ID: KB18586 | Published: 4/5/11 |

How to add a user to the BlackBerry Enterprise Server using the BlackBerry Administration Service
How to add a user to the BlackBerry® Enterprise Server using the BlackBerry® Administration Service. · BlackBerry® Enterprise Server E xpress…

ID: KB21967 | Published: 4/5/11 |

Find the MAC address of a Wi-Fi enabled BlackBerry smartphone
To find the Media Access Control (MAC) address of a Wi-Fi® enabled BlackBerry smartphone, complete the following steps: 1) Click Options. 2) Click Status. 3) The WLAN MAC field…

ID: KB13233 | Published: 4/5/11 |

“Authentication Failed” error when attempting to access remote files share using Remote File Access
The BlackBerry® smartphone user receives Authentication failed error when attempting to access remote file share The following error…

ID: KB20593 | Published: 4/4/11 |

BlackBerry Mailbox Agent process crashes with an Access Violation during an Address Book rescan
During an Address Book or Memos rescan, the BlackBerry® Mailbox Agent crashes with an Access Violation error. [40800] (07/20…

ID: KB24018 | Published: 4/4/11 |

“The following message was not delivered More Details (Error ID 504)” appears when sending a message to a BlackBerry Client for use with Microsoft Office Communications Server from the Microsoft Lync Server desktop client
If this issue is…

ID: KB25525 | Published: 4/4/11 |

How to troubleshoot one-way wireless calendar synchronization from the BlackBerry smartphone to Microsoft Outlook
Only one-way wireless calendar synchronization occurs from the Microsoft® Outlook® calendar to the calendar on the B lackBerry®…

ID: KB05270 | Published: 4/4/11 |

The BlackBerry Administration Service lists the same user multiple times
A BlackBerry® Administrator may see the same user listed multiple times when searching in the BlackBerry Administration Service. · BlackBerry® Enterprise Server 5.0 to…

ID: KB25229 | Published: 4/4/11 |

How to update previously deployed third-party applications to BlackBerry smartphones
A third-party application was previously deployed through a software configuration and an update to the application is required. To update a third-party…

ID: KB17353 | Published: 4/4/11 |

“Convert property write (PR_BODY_HTML) (0x00000057) failed” is seen in the agent logs when a user fails to receive an email attachment
A user reports that an external email arrived with an attachment, that is visible in Microsoft® Outlook®…

ID: KB26014 | Published: 4/4/11 |

“Cannot connect to server” appears when attempting to use the BlackBerry Client for use with Microsoft Office Communications Server 2007 to connect to Microsoft Lync 2010
When attempting to use the BlackBerry Client for use with Micr osoft…

ID: KB25288 | Published: 4/4/11 |

Identifying and troubleshooting issues with the enterprise activation process
The following table lists knowledge base articles with information about errors that appear during the enterprise activation process. Note: For an overview of the…

ID: KB13852 | Published: 4/4/11 |

April 2011 Daylight Savings Time Update for Chile
The Chilean government has announced that Daylight Savings Time will now end at midnight between May 7 and 8, 2011. This update also contains the changes from the March 2011 Daylight Savings…

ID: KB26394 | Published: 4/4/11 |

How to add or change the auto signature feature
The signature appears at the bottom of email messages sent from the BlackBerry® smartphone. The signature can be added or changed using the BlackBerry® Desktop Manager, the BlackBerry®…

ID: KB02035 | Published: 4/4/11 |

Allow BlackBerry Enterprise Server SNMP traffic
To enable Simple Network Management Protocol (SNMP) traffic on the BlackBerry Enterprise Server, complete the following: 1) Open the Registry Editor and go to…

ID: KB05027 | Published: 4/4/11 |

After configuring the BlackBerry Administration Service Single Sign-On the Webconsole Login Page is still displayed
When accessing the BlackBerry® Administration Service Webconsole URL https://ser ver01.example.com/webconsole/login the login…

ID: KB25534 | Published: 4/1/11 |

Database Notification System support for Windows Server 2008 and SQL 2008
Support for the Database Notification System (DBNS) on Windows Server® 2008 is one of the new features in BlackBerry® Enterprise Server 5.0 SP1. In add ition…

ID: KB19542 | Published: 4/1/11 |

Some BlackBerry smartphone user accounts do not recover after a Microsoft Exchange fail over
When a Microsoft® Exchange 2000 or 2003 server cluster fails over to another node, the BlackBerry® Enterprise Server does not completely recover….

ID: KB01990 | Published: 4/1/11 |


+ _key
+ ‘

+ _value
+ ‘
]*?>/gi, ”);
_contents = _contents.replace(/
June 2017
M T W T F S S
« May    
 1234
567891011
12131415161718
19202122232425
2627282930  

Blog Stats

  • 79,352 hits