Contratto collettivo aziendale ordinario

Il contratto aziendale ordinario può intervenire sul rapporto di lavoro per:
1. disporre una materia non regolamentata dalla legge e dalla contrattazione collettiva nazionale;
Nel primo caso, la contrattazione collettiva aziendale interviene in una materia non regolamentata, per definirne i dettami e le modalità di applicazione.
Un esempio, alquanto applicato dalle aziende, è il premio di risultato. Premio che viene riconosciuto ai lavoratori grazie proprio ad un accordo di secondo livello, ove le parti specificano le modalità di applicazione e la relativa erogazione.
2. migliorare, lato lavoratore, una regola già prevista, in via esclusiva, dalla legge;
Nel secondo caso, la contrattazione collettiva aziendale agisce su una materia già regolata da una fonte gerarchicamente superiore (legge o contrattazione collettiva nazionale) e la va a ridefinire in base alle esigenze aziendali, proprie del principio di sussidiarietà. In pratica, va a trasformare un “vestito generico” in un “abito sartoriale”. Questa rimodulazione può avvenire tassativamente allorquando vada a migliorare le condizioni del lavoratore.
Un esempio potrebbe essere la revisione delle maggiorazioni previste dal CCNL in caso di lavoro straordinario, disponendone l’aumento (es. il 25% in luogo del 20%).
3. intervenire laddove la legge delega la contrattazione collettiva a definire una determinata regola.
Nel terzo caso, l’intervento sindacale è ammesso qualora vi sia una specifica delega fornita dalla norma di legge a regolamentare una materia. Vari esempi sono previsti all’interno del decreto legislativo 51/2015 (TU sui contratti di lavoro). Uno esempio su tutti è la possibilità di rivedere la durata massima che un lavoratore può avere sommando tutti i rapporti di lavoro a tempo determinato ed in somministrazione a termine con lo stesso datore di lavoro, la legge PREVDE la possibilità di apporre delle modifiche!
4. interviene laddove la legge non prevede una modifica e può anche essere peggiorativa, ma solo su determinati argomenti (CONTRATTO DI PROSSIMITA’)
Il contratto di prossimità è un accordo sindacale che si avvale di una disposizione legale – l’articolo 8 del decreto legge 138/2011 – che fornisce la possibilità di derogare alle disposizioni di legge ed alle relative regolamentazioni contenute nei contratti collettivi nazionali di lavoro, da parte dei contratti collettivi aziendali, anche laddove le specifiche Leggi/norme abbiano regolato in maniera esclusiva una determinata materia ed anche provvedendo a modificare la norma/legge in forma  “peggiorativa” rispetto alle condizioni del lavoratore previste dalla norma/Legge, cosa che ordinariamente non è possibile, ciò in quanto,  come già specificato, una fonte inferiore non può modificare in peius una materia regolamentata da una fonte superiore.
La norma (articolo 8), per quanto molto semplice nella sua formulazione, prevede una serie di condizioni all’applicazione derogatoria.
In primis, la controparte sindacale dovrà essere composta da associazioni dei lavoratori comparativamente più rappresentative sul piano nazionale o territoriale ovvero dalle loro rappresentanze sindacali operanti in azienda (RSA o RSU).
Dovrà, inoltre, essere previsto uno scopo alla rimodulazione di una determinata regola prevista da una norma di legge. Le finalità indicate dal primo comma dell’articolo 8 sono, come si dice in questi casi, esaustive e non esemplificative:
Ø maggiore occupazione;
Ø qualità dei contratti di lavoro;
Ø adozione di forme di partecipazione dei lavoratori;
Ø emersione del lavoro irregolare;
Ø incrementi di produttività e di salario;
Ø gestione delle crisi aziendali e occupazionali;
Ø investimenti ed avvio di nuove attività.
In pratica, l’accordo sindacale dovrà, in premessa, indicare una delle motivazioni di scopo che hanno portato a ridefinire la regola legale. La mancanza di una di queste finalità rende inapplicabile la deroga evidenziata dall’accordo di prossimità.
Inoltre le deroghe dovranno riguardare tassativamente le seguenti materie, inerenti l’organizzazione del lavoro e della produzione aziendale:
§ impianti audiovisivi e introduzione di nuove tecnologie;
§ mansioni del lavoratore, alla classificazione e inquadramento del personale;
§ contratti a termine, part-time, intermittente,
§ regime della solidarietà negli appalti
§ ricorso alla somministrazione di lavoro;
§ disciplina dell’orario di lavoro;
§ modalità di assunzione e disciplina del rapporto di lavoro, comprese le collaborazioni coordinate e continuative e le partite IVA,
§ trasformazione e conversione dei contratti di lavoro,
§ conseguenze del recesso dal rapporto di lavoro, fatta eccezione per il licenziamento discriminatorio e il licenziamento della lavoratrice in concomitanza del matrimonio.
Infine, sempre il legislatore dell’articolo 8, ha previsto un limite alla deroga: il rispetto della Costituzione ed i vincoli derivanti dalle normative comunitarie e dalle convenzioni internazionali sul lavoro. Il mancato rispetto di questi vincoli invalida l’accordo di prossimità.
Così come spiegato nella trattazione del CCAL, anche in questo non si potrà rimuovere del tutto limiti quantitativi imposti dal legislatore ma esclusivamente prevederne una rimodulazione, lasciando il vincolo imposto dalla norma.

Impossibile salvare il ritaglio

Visualizza rapporto blocco di sistema

Link di origine

Copia negli Appunti

'
;
return;
}
}

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

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

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


)/gi, '');

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

]*?>/gi, '');
_contents = _contents.replace(/< \/td>/gi, '');
}

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

]*?>/gi, '');
_contents = _contents.replace(/< \/tr>/gi, '');
}

var _contentsLength = $R.measureText__getTextLength(_contents);

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

';
return;

case (_contentsLength == 0):
case ((_contentsLength < 5) && ($R.parsingOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1)):
$R.debugOutline(_node, 'clean-after', 'blank');
_global__the_html = _global__the_html.substr(0, _pos__start__before);
return;
}
break;
}

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

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

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

// return
return;
};

// actually do it
_recursive(_nodeToBuildHTMLFor);

// return html
return _global__the_html;
};

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

';
$R.articleTitleMarker__end = '

';

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

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

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

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

// return
return _getTitleMatch[1];
};

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

// loop pregs
// ==========
for (var i=0, _i=_heading_pregs.length; i<_i ; i++) { // exec var _match = _heading_pregs[i].exec(_html); // return? switch (true) { case (!(_match)): case (!(_heading_pregs[i].lastIndex > -1)):
// will continue loop
break;

default:

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

_heading_type = _match[1],
_heading_text = _match[2].replace(/< \s*br[^>]*>/gi, '').replace(/[\n\r]+/gi, ''),
_heading_text_plain = _heading_text.replace(/< [^>]+?>/gi, '').replace(/\s+/gi, ' ');
_heading_length = $R.measureText__getTextLength(_heading_text_plain),
_heading_words = [],

_to_heading_text = _html.substr(0, _heading_start_pos),
_to_heading_length = $R.measureText__getTextLength(_to_heading_text.replace(/< [^>]+?>/gi, '').replace(/\s+/gi, ' '))
;

// return?
switch (true)
{
case (!(_heading_length > 5)):
case (!(_heading_length < (65 * 3))): case (!(_to_heading_length < (65 * 3 * 2))): // will continue for loop break; case ((_secondary_headings.indexOf('|' + _heading_type + '|') > -1)):
// words in this heading
_heading_words = _heading_text_plain.split(' ');

// count words present in title
for (var j=0, _j=_heading_words.length, _matched_words=''; j<_j ; j++) { if (_search_document_title.indexOf(' ' + _heading_words[j] + ' ') > -1) {
_matched_words += _heading_words[j] + ' ';
}
}

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

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

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

_no_break = true;
break;
}

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

// heading too long? -- if not h2
case ((_heading_length > ((_search_document_title.length - 2) * 2)) && (_heading_type != 'h2')):

// heading long enough?
case ((_heading_length < Math.ceil((_search_document_title.length - 2) * 0.50))): // enough words matched? case ((_heading_length < 25) && (_matched_words.length < Math.ceil(_heading_length * 0.75))): case ((_heading_length < 50) && (_matched_words.length < Math.ceil(_heading_length * 0.65))): case ((_matched_words.length < Math.ceil(_heading_length * 0.55))): _break = true; break; } // break? if (_break) { break; } default: // this is the title -- do isolation; return // ================= return '' + $R.articleTitleMarker__start + _heading_text + $R.articleTitleMarker__end + _html.substr(_heading_end_pos) ; } break; } } // return unmodified return _html; }; $R.getContent__find = function () { // get content // =========== var _found = $R.getContent__findInPage($R.win), _targetNode = _found._targetCandidate.__node, _$targetNode = $(_targetNode), _aboveNodes = [] ; // RTL // === switch (true) { case (_$targetNode.attr('dir') == 'rtl'): case (_$targetNode.css('direction') == 'rtl'): $R.makeRTL(); break; } // get html // ======== var _foundHTML = _found._html, _firstFragmentBefore = $R.getContent__nextPage__getFirstFragment(_foundHTML), _documentTitle = ($R.document.title > '' ? $R.document.title : '')
;

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

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

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

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

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

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

(function ()
{

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

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

// previous
_prevNode = _prevNode.previousSibling;

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

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

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

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

})();

// is what we found any good?
// ==========================
switch (true)
{
case ($R.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
case (_differentTargets && (_aboveHTML.split(']+?>/gi, '').replace(/\s+/gi, ' ')) < (65 * 3))): _foundHTML = _aboveHTML + _foundHTML; break; default: _aboveHTML = ''; _aboveNodes = []; break; } $R.articleTitle = $R.getContent__find__getIsolatedTitleInHTML(_foundHTML); $R.debugPrint('TitleSource', 'above_HTML'); // get document title? if ($R.articleTitle > ''); else
{

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

// global vars:
// _foundHTML
// _documentTitle

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

// vars
var
_doc_title_parts = [],
_doc_title_pregs =
[
/( [-][-] |( [-] )|( [>][>] )|( [< ][<] )|( [|] )|( [\/] ))/i, /(([:] ))/i ] ; // loop through pregs // ================== for (var i=0, _i=_doc_title_pregs.length; i<_i; i++) { // split _doc_title_parts = _documentTitle.split(_doc_title_pregs[i]); // break if we managed a split if (_doc_title_parts.length > 1) { break; }
}

// sort title parts -- longer goes higher up -- i.e. towards 0
// ================
_doc_title_parts.sort(function (a, b)
{
switch (true)
{
case (a.length > b.length): return -1;
case (a.length < b.length): return 1; default: return 0; } }); // set title -- first part, if more than one word; otherwise, whole // ========= _foundHTML = '' + $R.articleTitleMarker__start + (_doc_title_parts[0].split(/\s+/i).length > 1 ? _doc_title_parts[0] : _documentTitle)
+ $R.articleTitleMarker__end

+ _foundHTML
;

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

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

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

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

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

// return
return true;
};

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

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

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

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

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

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

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

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

default:

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

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

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

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

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

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

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

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

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

break;
}

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

// get html
// ========
$R.debugTimerStart('BuildHTML');
var _html = $R.getContent__buildHTMLForNode(_targetCandidate.__node, 'the-target');
_html = _html.substr((_html.indexOf('>')+1))
_html = _html.substr(0, _html.lastIndexOf('< ')); $R.debugPrint('BuildHTML', $R.debugTimerEnd()+'ms'); $R.debugTimerStart('BuildHTMLPregs'); _html = _html.replace(/<(blockquote|div|p|td|li)([^>]*)>(\s*
)+/gi, '< $1$2>');
_html = _html.replace(/(
\s*)+< \/(blockquote|div|p|td|li)>/gi, '');
_html = _html.replace(/(
\s*)+< (blockquote|div|h\d|ol|p|table|ul|li)([^>]*)>/gi, '< $2$3>');
_html = _html.replace(/< \/(blockquote|div|h\d|ol|p|table|ul|li)>(\s*
)+/gi, '');
_html = _html.replace(/(


\s*


\s*)+/gi, '


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// not keywords
// ============
for (var z=0, _z=$R.nextPage__captionKeywords__not.length; z<_z ; z++) { if (_possible[i]._caption.indexOf($R.nextPage__captionKeywords__not[z]) > -1)
{ _nextLink = false; return; }
}

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

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

for (var i=0, _i=_possible.length; i<_i ; i++) { if (_possible[i]._caption == (''+_pageNr)) { _nextLink = _possible[i]; return; } } })(); // next keyword in title // ===================== (function () { if (_nextLink) { return; } for (var i=0, _i=_possible.length; i<_i; i++) { // sanity if (_possible[i]._title > ''); else { continue; }
if ($R.measureText__getTextLength(_possible[i]._caption) < = 2); else { continue; } for (var j=0, _j=$R.nextPage__captionKeywords.length; j<_j; j++) { if (_possible[i]._title.indexOf($R.nextPage__captionKeywords[j]) > -1)
{
// length
// ======
if (_possible[i]._title.length > $R.nextPage__captionKeywords[j].length * 2)
{ continue; }

// not keywords
// ============
for (var z=0, _z=$R.nextPage__captionKeywords__not.length; z<_z ; z++) { if (_possible[i]._title.indexOf($R.nextPage__captionKeywords__not[z]) > -1)
{ _nextLink = false; return; }
}

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

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

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

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

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

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

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

var _caption2 = '';
for (var i=0, _i=_caption.length, _code=0; i<_i ; i++) { _code = _caption.charCodeAt(i); _caption2 += (_code > 127 ? ('&#'+_code+';') : _caption.charAt(i));
}
_caption = _caption2;

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

default:
// skip if already loaded as next page
for (var i=0, _i=$R.nextPage__loadedPages.length; i<_i ; i++) { if ($R.nextPage__loadedPages[i] == _href) { return null; } } // return return { '_node': _element.__node, '_href': _href, '_title': _title, '_caption': _caption, '_distance': _distance }; } } ); // sort -- the less points, the closer to position 0 // ==== _links.sort(function (a, b) { switch (true) { case (a._distance < b._distance): return -1; case (a._distance > b._distance): return 1;
default: return 0;
}
});

// return
return _links;
};

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

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

//'headers': { 'Referrer': _nextPageURL },

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

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

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

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

'
;
return;

case (_explored._count__images_medium == 1):
_global__the_html = ''
+ _global__the_html.substr(0, _pos__start__after-1)
+ ' class="readableLinkWithMediumImage">'
+ _global__the_html.substr(_pos__start__after, (_pos__end__before - _pos__start__after))
+ '

'
;
return;
}
}

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

// empty elements
switch (true)
{
case (($D.parseOptions._elements_self_closing.indexOf('|'+_tag_name+'|') > -1)):
case (($D.parseOptions._elements_ignore_tag.indexOf('|'+_tag_name+'|') > -1)):
case (_tag_name == 'td'):
break;

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


)/gi, '');

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

]*?>/gi, '');
_contents = _contents.replace(/< \/td>/gi, '');
}

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

]*?>/gi, '');
_contents = _contents.replace(/< \/tr>/gi, '');
}

var _contentsLength = $D.measureText__getTextLength(_contents);

_explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
if (_explored && _explored._is__unskippable); else
{
switch (true)
{
case (_contentsLength == 0 && _tag_name == 'p'):
_global__the_html = _global__the_html.substr(0, _pos__start__before) + '

';
return;

case (_contentsLength == 0):
case ((_contentsLength < 5) && ($D.parseOptions._elements_visible.indexOf('|'+_tag_name+'|') > -1)):
$D.debugOutline(_node, 'clean-after', 'blank');
_global__the_html = _global__the_html.substr(0, _pos__start__before);
return;
}
}

break;
}

// too much missing
if ($D.parseOptions._elements_link_density.indexOf('|'+_tag_name+'|') > -1)
{
_explored = (_explored || $D.getContent__exploreNodeAndGetStuff(_node, true));
if (_explored && _explored._is__unskippable); else
{
var
_contents = _global__the_html
.substr(_pos__start__after, (_pos__end__before - _pos__start__after))
.replace(/(< ([^>]+)>)/gi, ''),
_contentsLength = $D.measureText__getTextLength(_contents),
_initialLength = 0
+ _explored._length__all_text
+ (_explored._count__images_small * 10)
+ (_explored._count__images_skip * 10)
+ (_node.getElementsByTagName('iframe').length * 10)
+ (_node.getElementsByTagName('object').length * 10)
+ (_node.getElementsByTagName('embed').length * 10)
+ (_node.getElementsByTagName('button').length * 10)
+ (_node.getElementsByTagName('input').length * 10)
+ (_node.getElementsByTagName('select').length * 10)
+ (_node.getElementsByTagName('textarea').length * 10)
;

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

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

// return
return;
};

// actually do it
_recursive(_nodeToBuildHTMLFor);

// return html
return _global__the_html;
};

// build html for node }

// isolate title in html {
// =======================

$D.articleTitleMarker__start = '

';
$D.articleTitleMarker__end = '

';

$D.getContent__find__hasIsolatedTitleInHTML = function (_html)
{
return (_html.substr(0, $D.articleTitleMarker__start.length) == $D.articleTitleMarker__start);
};

$D.getContent__find__getIsolatedTitleInHTML = function (_html)
{
// is it there?
if ($D.getContent__find__hasIsolatedTitleInHTML(_html)); else { return ''; }

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

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

// return
return _getTitleMatch[1];
};

$D.getContent__find__isolateTitleInHTML = function (_html, _document_title)
{
// use document title
if ($D.$document.find('body').attr($D.parseOptions._use_document_title_attribute) == $D.parseOptions._use_document_title_attribute_value)
{ return _html; }

// can't just use (h1|h2|h3|etc)
// we want to try them in a certain order

var
_heading_pregs = [
/< (h1)[^>]*?>([\s\S]+?)< \/\1>/gi,
/< (h2)[^>]*?>([\s\S]+?)< \/\1>/gi,
/< (h3|h4|h5|h6)[^>]*?>([\s\S]+?)< \/\1>/gi
],
_secondary_headings = '|h2|h3|h4|h5|h6|',
_search_document_title = ' ' + _document_title.replace(/< [^>]+?>/gi, '').replace(/\s+/gi, ' ') + ' '
;

// loop pregs
for (var i=0, _i=_heading_pregs.length; i<_i ; i++) { // exec var _match = _heading_pregs[i].exec(_html); // return? switch (true) { case (!(_match)): case (!(_heading_pregs[i].lastIndex > -1)):
// will continue loop
break;

default:

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

_heading_type = _match[1],
_heading_text = _match[2].replace(/< \s*br[^>]*>/gi, '').replace(/[\n\r]+/gi, ''),
_heading_text_plain = _heading_text.replace(/< [^>]+?>/gi, '').replace(/\s+/gi, ' ');
_heading_length = $D.measureText__getTextLength(_heading_text_plain),
_heading_words = [],

_to_heading_text = _html.substr(0, _heading_start_pos),
_to_heading_length = $D.measureText__getTextLength(_to_heading_text.replace(/< [^>]+?>/gi, '').replace(/\s+/gi, ' '))
;

// return?
switch (true)
{
case (!(_heading_length > 5)):
case (!(_heading_length < (65 * 3))): case (!(_to_heading_length < (65 * 3 * 2))): // will continue for loop break; case ((_secondary_headings.indexOf('|' + _heading_type + '|') > -1)):
// words in this heading
_heading_words = _heading_text_plain.split(' ');

// count words present in title
for (var j=0, _j=_heading_words.length, _matched_words=''; j<_j ; j++) { if (_search_document_title.indexOf(' ' + _heading_words[j] + ' ') > -1) {
_matched_words += _heading_words[j] + ' ';
}
}

// break continues for loop
// nothing goes to switch's default

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

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

_no_break = true;
break;
}

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

// heading too long? -- if not h2
case ((_heading_length > ((_search_document_title.length - 2) * 2)) && (_heading_type != 'h2')):

// heading long enough?
case ((_heading_length < Math.ceil((_search_document_title.length - 2) * 0.50))): // enough words matched? case ((_heading_length < 25) && (_matched_words.length < Math.ceil(_heading_length * 0.75))): case ((_heading_length < 50) && (_matched_words.length < Math.ceil(_heading_length * 0.65))): case ((_matched_words.length < Math.ceil(_heading_length * 0.55))): _break = true; break; } // break? // ====== if (_break) { break; } default: // this is the title -- do isolation; return return '' + $D.articleTitleMarker__start + _heading_text + $D.articleTitleMarker__end + $D.getContent__find__isolateTitleInHTML__balanceDivsAtStart(_html.substr(_heading_end_pos)) ; } break; } } // return unmodified return _html; }; $D.getContent__find__isolateTitleInHTML__balanceDivsAtStart__substrCount = function (_haystack, _needle, _offset, _length) { // http://kevin.vanzonneveld.net // + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // + bugfixed by: Onno Marsman // + improved by: Brett Zamir (http://brett-zamir.me) // + improved by: Thomas // * example 1: substr_count('Kevin van Zonneveld', 'e'); // * returns 1: 3 // * example 2: substr_count('Kevin van Zonneveld', 'K', 1); // * returns 2: 0 // * example 3: substr_count('Kevin van Zonneveld', 'Z', 0, 10); // * returns 3: false var cnt = 0; _haystack += ''; _needle += ''; if (isNaN(_offset)) { _offset = 0; } if (isNaN(_length)) { _length = 0; } if (_needle.length == 0) { return false; } _offset--; while ((_offset = _haystack.indexOf(_needle, _offset + 1)) != -1) { if (_length > 0 && (_offset + _needle.length) > _length) {
return false;
}
cnt++;
}

return cnt;
};

$D.getContent__find__isolateTitleInHTML__balanceDivsAtStart = function (_html)
{
// easy; remove all at begining
var
_h = _html.replace(/^(\s*< \s*\/\s*[^>]+>)+/gi, ''),
_r = /< \s*\/\s*([^\s>]+?)[^>]*>/gi,
_the_end_tag = '',
_the_start_tag = '

-1); else { break; }

var
_sub = _h.substr(0, _end_tag_pos),
_start_tags = $D.getContent__find__isolateTitleInHTML__balanceDivsAtStart__substrCount(_sub, _the_start_tag, _last_pos),
_end_tags = ((_start_tags > 0) ? (1 + $D.getContent__find__isolateTitleInHTML__balanceDivsAtStart__substrCount(_sub, _the_end_tag, _last_pos)) : false)
;

if ((!(_start_tags > 0)) || (_start_tags < _end_tags)) { _h = '' + _h.substr(0, _end_tag_pos) + _h.substr(_end_tag_pos + _the_end_tag.length) ; _last_pos = _end_tag_pos; } else { _last_pos = _end_tag_pos + 1; } } $D.log(_h); return _h; }; // isolate title in html } // find in page { // ============== $D.getContent__findInPage = function (_pageWindow) { // calculations // ============ var _firstCandidate = false, _secondCandidate = false, _targetCandidate = false ; $D.debugTimerStart('ExploreAndGetStuff'); var _stuff = $D.getContent__exploreNodeAndGetStuff(_pageWindow.document.body); $D.debugRemember('ExploreAndGetStuff', $D.debugTimerEnd()+'ms'); $D.debugTimerStart('ProcessFirst'); var _processedCandidates = $D.getContent__processCandidates__first(_stuff._candidates); _firstCandidate = _processedCandidates[0]; _targetCandidate = _firstCandidate; $D.debugRemember('ProcessFirst', $D.debugTimerEnd()+'ms'); // debug if ($D.debug) { // debug first candidates $D.log('First 5 Main Candidates:'); for (var x in _processedCandidates) { if (x == 5) { break; } $D.log(_processedCandidates[x], _processedCandidates[x].__node); } // highlight first $D.debugOutline(_firstCandidate.__node, 'target', 'first'); } // in case we stop $D.debugRemember('Target', 'first'); // do second? switch (true) { case (!(_firstCandidate._count__containers > 0)):
case (!(_firstCandidate._count__candidates > 0)):
case (!(_firstCandidate._count__pieces > 0)):
case (!(_firstCandidate._count__containers > 25)):
break;

default:

$D.debugTimerStart('ProcessSecond');
var _processedCandidatesSecond = $D.getContent__processCandidates__second(_processedCandidates);
_secondCandidate = _processedCandidatesSecond[0];
$D.debugRemember('ProcessSecond', $D.debugTimerEnd()+'ms');

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

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

// highlight second
$D.debugOutline(_secondCandidate.__node, 'target', 'second');
}

// compute again
// =============
_firstCandidate['__points_history_final'] = $D.getContent__computePointsForCandidate__third(_firstCandidate, _firstCandidate);
_firstCandidate['__points_final'] = _firstCandidate.__points_history_final[0];

_secondCandidate['__points_history_final'] = $D.getContent__computePointsForCandidate__third(_secondCandidate, _firstCandidate);
_secondCandidate['__points_final'] = _secondCandidate.__points_history_final[0];

// log results
// ===========
if ($D.debug)
{
$D.log('The 2 Candidates:');
$D.log(_firstCandidate);
$D.log(_secondCandidate);
}

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

// print points
// ============
if ($D.debug)
{
$D.debugRemember('PointsFirst', _firstCandidate['__points_history_final'][0].toFixed(2));
$D.debugRemember('PointsSecond', _secondCandidate['__points_history_final'][0].toFixed(2));
}

break;
}

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

// get html
// ========
$D.debugTimerStart('BuildHTML');
var _html = $D.getContent__buildHTMLForNode(_targetCandidate.__node, 'the-target');
_html = _html.substr((_html.indexOf('>')+1))
_html = _html.substr(0, _html.lastIndexOf('< ')); $D.debugRemember('BuildHTML', $D.debugTimerEnd()+'ms'); $D.debugTimerStart('BuildHTMLPregs'); _html = _html.replace(/<(blockquote|div|p|td|li)([^>]*)>(\s*
)+/gi, '< $1$2>');
_html = _html.replace(/(
\s*)+< \/(blockquote|div|p|td|li)>/gi, '');
_html = _html.replace(/(
\s*)+< (blockquote|div|h\d|ol|p|table|ul|li)([^>]*)>/gi, '< $2$3>');
_html = _html.replace(/< \/(blockquote|div|h\d|ol|p|table|ul|li)>(\s*
)+/gi, '');
_html = _html.replace(/(


\s*


\s*)+/gi, '


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

');
$D.debugRemember('BuildHTMLPregs', $D.debugTimerEnd()+'ms');

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

// find in page }

// start {
// =======

$D.start = function ()
{
// get content
// ===========
var
_found = $D.getContent__findInPage($D.window),
_found_links = _found._links,
_targetNode = _found._targetCandidate.__node,
_$targetNode = $CJ(_targetNode),
_aboveNodes = []
;

// RTL
// ===
switch (true)
{
case (_$targetNode.attr('dir') == 'rtl'):
case (_$targetNode.css('direction') == 'rtl'):
$D.makeRTL();
break;
}

// get html
// ========
var
_foundHTML = _found._html,
_firstFragmentBeforeProcessing = $D.nextPage__getFirstFragment(_foundHTML),
_documentTitle = ($D.document.title > '' ? $D.document.title : '')
;

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

// has title already?
_foundHTML = $D.getContent__find__isolateTitleInHTML(_foundHTML, _documentTitle);
$D.articleTitle = $D.getContent__find__getIsolatedTitleInHTML(_foundHTML);
$D.debugRemember('TitleSource', 'target');

// get html above?
if ($D.articleTitle > ''); else
{
// get html above target?
// ======================

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

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

(function ()
{

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

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

// previous
_prevNode = _prevNode.previousSibling;

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

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

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

// finished?
switch (true)
{
case ($D.measureText__getTextLength(_aboveHTML.replace(/< [^>]+?>/gi, '').replace(/\s+/gi, ' ')) > (65 * 3 * 3)):
case ($D.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
return;
}
}

})();

// is what we found any good?
// ==========================
switch (true)
{
case ($D.getContent__find__hasIsolatedTitleInHTML(_aboveHTML)):
case (_differentTargets && (_aboveHTML.split(']+?>/gi, '').replace(/\s+/gi, ' ')) < (65 * 3))): _foundHTML = _aboveHTML + _foundHTML; break; default: _aboveHTML = ''; _aboveNodes = []; break; } // set title // ========= $D.articleTitle = $D.getContent__find__getIsolatedTitleInHTML(_foundHTML); $D.debugRemember('TitleSource', 'above_HTML'); // get document title? if ($D.articleTitle > ''); else
{
// if all else failed, get document title
// ======================================

// global vars:
// _foundHTML
// _documentTitle

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

// vars
var
_doc_title_parts = [],
_doc_title_pregs =
[
/( [-][-] |( [-] )|( [>][>] )|( [< ][<] )|( [|] )|( [\/] ))/i, /(([:] ))/i ] ; // loop through pregs // ================== for (var i=0, _i=_doc_title_pregs.length; i<_i; i++) { // split _doc_title_parts = _documentTitle.split(_doc_title_pregs[i]); // break if we managed a split if (_doc_title_parts.length > 1) { break; }
}

// sort title parts -- longer goes higher up -- i.e. towards 0
// ================
_doc_title_parts.sort(function (a, b)
{
switch (true)
{
case (a.length > b.length): return -1;
case (a.length < b.length): return 1; default: return 0; } }); // set title -- first part, if more than one word; otherwise, whole // ========= _foundHTML = '' + $D.articleTitleMarker__start + (_doc_title_parts[0].split(/\s+/i).length > 1 ? _doc_title_parts[0] : _documentTitle)
+ $D.articleTitleMarker__end
+ _foundHTML
;

})();

// set title
// =========

$D.articleTitle = $D.getContent__find__getIsolatedTitleInHTML(_foundHTML);
$D.debugRemember('TitleSource', 'document_title');
}
}

// remember
// ========
$D.debugRemember('theTarget', _found._targetCandidate.__node);
$D.debugRemember('firstCandidate', _found._firstCandidate.__node);

// result
// ======

$D.nextPage__firstFragment__firstPage = _firstFragmentBeforeProcessing;
$D.nextPage__firstFragment__lastPage = $D.nextPage__getFirstFragment(_foundHTML);
$D.nextPage__firstLinks = _found_links;

var
_result = {
'_html': _foundHTML,
'_title': $D.articleTitle,
'_rtl': $D.rtl
}
;

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

// return
// ======
$D.callbacks.finished(_result);
};

// start }

// return self
// ===========
return $D;
}
// ]]>

</onload=”*?”></noscript[^></script[^></script[^>