1. Procedimento amministrativo – Mancata comunicazione di avvio del procedimento – Dimostrazione che il contenuto del provvedimento non avrebbe potuto essere diverso da quello in concreto adottato – Conseguenze
2. Beni culturali e paesaggio – Espropriazione di beni culturali di valore archeologico appartenenti a privati – Disciplina applicabile – Presupposti e finalità
3. Beni culturali e paesaggio – Dichiarazione di interesse particolarmente importante ai sensi degli artt. 13 e 10 D.Lgs. n. 42/2004 – Area archeologica – Valore storico-culturale – Individuazione
4. Beni culturali e paesaggio – Dichiarazione di interesse particolarmente importante ai sensi degli artt. 13 e 10 D.Lgs. n. 42/2004 – Area archeologica – Carattere unitario del complesso ai fini dell’apposizione del vincolo – Necessità
5. Beni culturali e paesaggio – Dichiarazione di interesse particolarmente importante ai sensi degli artt. 13 e 10 D.Lgs. n. 42/2004 – Area archeologica – Ipotesi in cui il relativo decreto deve ritenersi illegittimo
6. Beni culturali e paesaggio – Dichiarazione di interesse particolarmente importante ai sensi degli artt. 13 e 10 D.Lgs. n. 42/2004 – Beni mobili e beni immobili – Soggezione ad identica disciplina
1. La dimostrazione in
giudizio dell’impossibilità per l’Amministrazione di emettere un provvedimento
di contenuto diverso rispetto a quello adottato impedisce, ai sensi dell’art.
21 octies l.n. 241/90, l’annullamento dello stesso per mancata comunicazione di
avvio del procedimento.
2. Nei
confronti di beni culturali di valore archeologico di proprietà dei privati,
l’Amministrazione può procedere all’esproprio seguendo il procedimento
disciplinato dagli artt. 95 e ss. D. Lgs. 42/2004, solo quando l’espropriazione
risponda ad un importante interesse a migliorare le condizioni di tutela ai
fini del godimento pubblico dei beni. Il fine previsto dalla legge è, quindi,
quello di garantire la conservazione o la valorizzazione delle cose d’interesse
storico o artistico o di effettuare le ricerche archeologiche.
3. In
tema di dichiarazione d’interesse particolarmente importante di un’area
archeologica, deve considerarsi il valore storico-archeologico della stessa
individuabile con riferimento alle strutture materiali, ai reperti contenuti in
edifici, ai percorsi viari e mura, ed al collegamento di tali beni e della loro
utilizzazione con gli eventi storico – culturali dell’insediamento.
4. Nel caso
di aree archeologiche risulta determinante, ai fini dell’apposizione del
vincolo e della conseguente dichiarazione di appartenenza allo Stato, il
carattere unitario del complesso, quale risulta dall’affioramento di resti
murari e di materiale mobile, dall’omogeneità delle strutture, dalla dimensione
e dalla continuità degli allineamenti murari tra i singoli settori scavati e
visibili o ricoperti e parzialmente sommersi.
5. Ove
motivato con riferimento all’esistenza di un complesso archeologico, il decreto
che dichiara i beni di interesse particolarmente importante può considerarsi
illegittimo solo quando si dimostri che nella zona vincolata in realtà non
esiste alcun bene archeologico suscettibile di protezione. 6. L’art.
10 D.Lgs. n. 42/2004 non distingue tra beni mobili e immobili, accomunando
entrambe le categorie nella medesima disciplina e consentendo, pertanto, la
dichiarazione di interesse particolarmente importante e la conseguente
inclusione del demanio ex art. 91 anche dei beni immobili.
N. 01388/2011 REG.PROV.COLL.
N. 01787/2005 REG.RIC.
REPUBBLICA ITALIANA
IN NOME DEL POPOLO ITALIANO
Il Tribunale Amministrativo Regionale per la Puglia
(Sezione Terza)
ha pronunciato la presente
SENTENZA
sul ricorso numero di registro generale 1787 del 2005, proposto da:
Cacciaguerra Giorgio, in proprio e quale procuratore di Cacciaguerra Ilaria, e Cacciaguerra Ambretta, rappresentati e difesi dall’avv. Aldo Valentini, con domicilio eletto con quest’ultimo in Bari, presso l’avv. Mastroviti in via M. di Montrone, 47;
contro
Ministero per i beni e le attività culturali, Soprintendenza ai Beni Archeologici di Taranto, Dirigente Settore Musei, Beni Culturali Regione Puglia, rappresentati e difesi dall’Avvocatura Distrettuale dello Stato di Bari, domiciliata per legge in Bari, via Melo, 97;
per l’annullamento
del provvedimento di dichiarazione di interesse particolarmente importante, in quanto aerea archeologica, dei beni immobili di proprietà dei ricorrenti.
Visti il ricorso e i relativi allegati;
Visti gli atti di costituzione in giudizio del Ministero per i beni e le attività culturali e della Soprintendenza ai beni archeologici di Taranto e del Dirigente del Settore Musei, Beni Culturali Regione Puglia;
Viste le memorie difensive;
Visti tutti gli atti della causa;
Relatore nell’udienza pubblica del giorno 29 giugno 2011 la dott. Francesca Petrucciani, nessuno comparso per le parti;
Ritenuto e considerato in fatto e diritto quanto segue.
FATTO
Con il ricorso in epigrafe Giorgio, Ilaria e Ambretta Cacciaguerra hanno impugnato il decreto del 4.7.2005 con il quale il Direttore regionale del Ministero per i beni e le attività culturali ha dichiarato i resti dell’antica città di Herdonia nel Comune di Ordona, in catasto al fg. 57 part. 406, 407, 411 e 413 di interesse particolarmente importante e appartenenti allo Stato ex art. 91 d.lgs. 42/2004.
I ricorrenti hanno esposto che con atto del 7.9.2000 il Ministero dei beni culturali aveva autorizzato la Soprintendenza archeologica ad avviare l’esproprio dei terreni in questione, e che con successivo atto dell’11.10.2000, non notificato a Ilaria Cacciaguerra, la Soprintendenza aveva comunicato l’avvio del procedimento ex art. 91 d.lgs. 490/99; quindi veniva notificato avviso per assistere alla redazione del verbale di consistenza a Cacciaguerra Ambretta e a Cacciaguerra Giorgio per due date diverse, mentre la convocazione per un successivo accesso del 19.1.2001 veniva inviata con telegramma non ritirato da Cacciaguerra Ambretta, tanto che nessuno si era presentato; veniva poi redatto un verbale di consistenza mai notificato nè comunicato ai proprietari, e notificata la stima dei terreni soggetti ad esproprio in data 12.11.2001, impugnata innanzi alla Corte d’Appello di Bari che aveva dichiarato inammissibile l’opposizione non essendo stato emesso il decreto di occupazione.
Ai ricorrenti, inoltre, non era mai stato liquidato il premio dovuto per i ritrovamenti effettuati nei terreni di loro proprietà , tanto che veniva accolto il ricorso presentato al TAR Bari per porre fine all’inerzia dell’amministrazione e ottenere la declaratoria dell’obbligo dell’amministrazione di liquidare le somme dovute.
A sostegno del ricorso sono state articolate, in unico motivo, le censure di violazione degli artt. 10, 91, 95, 96 e 97 d.lgs. 42/2004 e degli artt. 1, 3, 7 e ss. L. 241/90, eccesso di potere per difetto dei presupposti e motivazioni, contraddittorietà , perplessità , contrasto tra atti e comportamenti della P.A..
Con riferimento alle aree in questione, infatti, l’amministrazione aveva già avviato procedura espropriativa, poi decaduta per decorso di oltre un quinquennio senza che fosse intervenuto il provvedimento ablatorio, di tal che i terreni in questione erano tuttora di proprietà dei ricorrenti e non dello Stato; solo i beni mobili rinvenuti appartenevano allo Stato, e su di essi i ricorrenti avevano diritto alla liquidazione del premio; infatti l’art. 10 d.lgs. 42/2004 si riferisce esclusivamente alle cose ritrovate e non a quelle emergenti, che restano di proprietà e privata e semmai sono soggette ad esproprio.
Inoltre il provvedimento non era stato preceduto dalla comunicazione di avvio ex art. 7 L. 241/90.
Si sono costituite le amministrazioni resistenti chiedendo il rigetto del ricorso.
Alla pubblica udienza del 29.6.2011 il ricorso è stato trattenuto in decisione.
DIRITTO
Il ricorso deve essere respinto in quanto infondato.
In primo luogo deve evidenziarsi, al riguardo, che le circostanze afferenti alla procedura espropriativa iniziata e non conclusa dall’amministrazione non attengono al merito del presente ricorso, proposto avverso il provvedimento con il quale il Ministero dei beni culturali ha proceduto alla declaratoria di interesse particolarmente importante e di appartenenza allo Stato ai sensi dell’art. 91 d.lgs. 42/2004 dei beni di proprietà dei ricorrenti.
L’amministrazione, infatti, nel caso di beni culturali di valore archeologico di proprietà dei privati, può procedere all’esproprio degli stessi, seguendo il procedimento disciplinato dagli artt. 95 e ss. D.lgs. 42/2004 solo nel caso in cui “l’espropriazione risponda ad un importante interesse a migliorare le condizioni di tutela ai fini del godimento pubblico dei beni”. Il fine previsto dalla legge è quindi quello di garantire la conservazione o la valorizzazione delle cose di interesse storico o artistico o di effettuare le ricerche archeologiche.
Nel caso di specie, invece, la procedura espropriativa non è stata conclusa, ma il Ministero ha proceduto a dichiarare i beni appartenenti allo Stato ai sensi dell’art. 91 del d.lgs. 42/2004, secondo il quale “Le cose indicate nell’articolo 10, da chiunque e in qualunque modo ritrovate nel sottosuolo
o sui fondali marini, appartengono allo Stato e, a seconda che siano immobili o mobili, fanno parte del demanio o del patrimonio indisponibile, ai sensi degli articoli 822 e 826 del codice civile”.
A sua volta l’art. 10 dispone che “Sono altresì beni culturali, quando sia intervenuta la dichiarazione prevista dall’articolo 13:
a) le cose immobili e mobili che presentano interesse artistico, storico, archeologico o etnoantropologico particolarmente importante, appartenenti a soggetti diversi da quelli indicati al comma 1 (soggetti pubblici e persone giuridiche private senza fini di lucro);
b) gli archivi e i singoli documenti, appartenenti a privati, che rivestono interesse storico particolarmente importante;
c) le raccolte librarie, appartenenti a privati, di eccezionale interesse culturale;
d) le cose immobili e mobili, a chiunque appartenenti, che rivestono un interesse particolarmente importante a causa del loro riferimento con la storia politica, militare, della letteratura, dell’arte, della scienza, della tecnica, dell’industria e della cultura in genere, ovvero quali testimonianze dell’identità e della storia delle istituzioni pubbliche, collettive o religiose;
e) le collezioni o serie di oggetti, a chiunque appartenenti, che non siano ricomprese fra quelle indicate al comma 2 e che, per tradizione, fama e particolari caratteristiche ambientali, ovvero per rilevanza artistica, storica, archeologica, numismatica o etnoantropologica, rivestano come complesso un eccezionale interesse”.
Nel caso di specie, quindi, con l’atto impugnato è stato dichiarato ai sensi dell’art. 13 del decreto legislativo l’interesse particolarmente importante del complesso archeologico dell’antica città di Herdonia; il compendio è stato poi dichiarato appartenente allo Stato in virtù del combinato disposto dagli artt. 10 lett. a) e 91 dello stesso, secondo l’iter procedimentale previsto dalla norma e senza che l’amministrazione si sia discostata dai parametri previsti dal decreto.
Quanto alla dichiarazione di interesse particolarmente importante, infatti, il provvedimento è correttamente motivato dal riferimento alla relazione tecnica allegata allo stesso e notificata in allegato ai ricorrenti, nella quale si riportano le caratteristiche essenziali, la storia e l’attuale consistenza del complesso archeologico.
In relazione a tali aspetti deve rilevarsi che i valori storico-culturali del complesso archeologico sono riferibili alle strutture materiali, individuabili dai reperti in edifici, percorsi viari e mura, ed al collegamento di tali beni e della loro utilizzazione con gli eventi storico culturali dell’insediamento; l’unitarietà di un’area archeologica deriva dalla vastità del complesso insistente su di essa e dalla unitarietà del “praedium”, documentata dalle fonti antiche, oltre che dalle modalità , storicamente stratificatesi, di fruizione estetica e visiva dei beni del complesso archeologico medesimo (Cons. Stato, sez. VI, n. 4429 del 2002); ove motivato con riferimento all’esistenza di un complesso archeologico, il decreto che dichiara i beni di interesse particolarmente importante può considerarsi illegittimo solo ove si dimostri che nella zona vincolata in realtà non esiste alcun bene archeologico suscettibile di protezione (Cons. Stato, sez. VI, n. 25225 del 2002); il giudice amministrativo, infatti, in tal caso non può penetrare la sfera di discrezionalità tecnica di pertinenza dell’amministrazione per il tramite di un sindacato sostitutivo eccedente anche i limiti del controllo intrinseco ormai reputato praticabile dalla giurisprudenza amministrativa in subiecta materia (Cons. Stato, sezione VI, 3 maggio 2002, n. 2334).
Nel caso in esame la dettagliata relazione allegata al decreto impugnato fornisce ampia e adeguata motivazione in ordine all’importanza dei reperti archeologici esistenti nella zona e all’interesse storico e artistico degli stessi.
Deve aggiungersi, con riferimento all’eccezione relativa alla perdurante proprietà dei ricorrenti dei beni mobili, in quanto solo i beni mobili rinvenuti apparterrebbero allo Stato, che l’art. 10 sopra riportato non distingue tra beni mobili e immobili, accomunando entrambe le categorie nella medesima disciplina e consentendo, pertanto, la dichiarazione di interesse particolarmente importante e la conseguente inclusione del demanio ex art. 91 anche dei beni immobili.
Inoltre, come già accennato, nel caso di aree archeologiche risulta determinante ai fini dell’apposizione del vincolo e della conseguente appartenenza allo Stato il carattere unitario del complesso, quale risulta “dall’affioramento di resti murari e di materiale mobile, dall’omogeneità delle strutture, dalla dimensione e dalla continuità degli allineamenti murari tra i singoli settori scavati e visibili o ricoperti e parzialmente sommersi” (Cons. Stato, sezione VI, 6 ottobre 1986 n. 758); tale carattere unitario impedisce di operare la distinzione tra quanto è ancora sommerso e quanto è già affiorato, non potendosi scindere, evidentemente, le singole parti di un monumento o dei resti di un antico insediamento a seconda del grado di interramento delle stesse.
Alla luce di tali considerazioni va anche respinto il vizio attinente il difetto della comunicazione di avvio del procedimento, in quanto, da un lato, i ricorrenti sono sempre stati a conoscenza delle attività poste in essere dall’amministrazione a tutela del complesso archeologico sito sulle particelle fondiarie di loro proprietà avendo più volte interloquito anche per iscritto con l’amministrazione (come risulta dalla documentazione in atti), controdeducendo anche nei numerosi giudizi già intentati (avanti alla Corte d’Appello, al TAR e al Consiglio di Stato); dall’altro, la relazione allegata al decreto dimostra la non praticabilità di un provvedimento di contenuto diverso, con conseguente impossibilità di annullamento ai sensi dell’art. 21 octies L. 241/90.
Il ricorso deve quindi essere respinto.
La natura della causa e la peculiarità della questione controversa giustificano la compensazione delle spese di lite.
P.Q.M.
Il Tribunale Amministrativo Regionale per la Puglia (Sezione Terza)
definitivamente pronunciando sul ricorso, come in epigrafe proposto, lo respinge;
compensa le spese.
Ordina che la presente sentenza sia eseguita dall’autorità amministrativa.
Così deciso in Bari nella camera di consiglio del giorno 29 giugno 2011 con l’intervento dei magistrati:
Paolo Amovilli, Presidente FF
Francesca Petrucciani, Referendario, Estensore
Rosalba Giansante, Referendario
L’ESTENSORE | IL PRESIDENTE | |
DEPOSITATA IN SEGRETERIA
Il 22/09/2011
IL SEGRETARIO
(Art. 89, co. 3, cod. proc. amm.)
/////////// SEARCH ///////////
var g_aEng;
var g_loc;
// Initialize namespace, use existing context
var searchshield = searchshield || {};
searchshield.clockUrl;
// constants
searchshield.SCORE_SS_SAFE = 1;
searchshield.SCORE_SS_CAUTION = 2;
searchshield.SCORE_SS_WARNING = 3;
searchshield.SCORE_SS_BLOCK = 4;
searchshield.SCORE_SS_VERISIGN = 7;
searchshield.BLOCK_NONE = 0;
searchshield.BLOCK_NORMAL = 1;
searchshield.BLOCK_PHISH = 2;
searchshield.BLOCK_YAHOO = 3;
searchshield.XPLCHECK_RESULT_SEV_NONE = 0;
searchshield.XPLCHECK_RESULT_SEV_LOW = 1;
searchshield.XPLCHECK_RESULT_SEV_MED = 2;
searchshield.XPLCHECK_RESULT_SEV_BLOCK = 3;
searchshield.VERISIGN_SPLIT_NOTEST = 0;
searchshield.VERISIGN_SPLIT_TESTA = 1;
searchshield.VERISIGN_SPLIT_TESTB = 2;
searchshield.needLivePhishCheck = false;
searchshield.allowedSites = [];
searchshield.enabled = function (doc)
{
var result = searchshield.avgCallFunc(doc, ‘GetSearchEnabled’);
return (result == ‘1’ ? 1 : 0);
};
searchshield.init = function (doc)
{
if ((doc == null) || (doc.location == null) || (doc.location.href.search(/about:/) != -1))
return;
if (!searchshield.enabled(doc))
return;
if (!g_aEng)
g_aEng = searchshield.Search.prototype.detectEngine(doc.location.href);
if (!g_aEng)
return;
// init search object (not declared or is null)
if (typeof xplSearch === ‘undefined’)
{
// global
xplSearch = new searchshield.Search();
// reset the links added flag
xplSearch.new_links = false;
xplSearch.doc = doc;
xplSearch.href = xplSearch.doc.location.href;
xplSearch.uri = searchshield.parseLink(xplSearch.href);
xplSearch.engine = new searchshield[g_aEng+’SearchEngine’](xplSearch)
xplSearch.addEngine(xplSearch.engine);
searchshield.launch(doc);
}
if (doc.location.href != g_loc)
{
g_loc = doc.location.href;
if ((typeof xplSearch !== ‘undefined’) && (xplSearch != null))
searchshield.launch(doc);
}
};
searchshield.launch = function (doc)
{
// IE specific check
searchshield.quirksMode = (self.top.document.compatMode == ‘BackCompat’);
searchshield.docMode = parseInt(navigator.userAgent.split(‘MSIE’)[1]);
if ((self === top) && (self.document === doc))
{
if (!xplSearch.engine)
return;
// set verdict display config
xplSearch.engine.setRatingsConfig(doc);
// init the alert popup
searchshield.initPopupAlert(doc);
if (xplSearch.engine.type != ‘inline’)
{
// save function reference for memory clean up later
var fn = function(event){avglsflyover.hide(null)};
//hide flyover if these events occur
window.detachEvent(‘onscroll’, fn);
window.attachEvent(‘onscroll’, fn);
doc.detachEvent(‘onkeydown’, fn);
doc.attachEvent(‘onkeydown’, fn);
}
// only start monitor on top doc
searchshield.avgPageMonitor.start(doc);
}
return;
};
// search monitors and processors – doc is always top most document
searchshield.avgPageMonitor = {
previousUrl: null,
start: function(doc){
searchshield.avgPageMonitor.stop();
searchshield.avgPageMonitor.process(doc);
searchshield.avgPageMonitor.timeoutID = window.setTimeout(function(){searchshield.avgPageMonitor.start(doc)}, 1000);
},
process: function(doc){
var currentUrl = doc.location.href;
var refresh = 0;
if (this.previousUrl != currentUrl) {
this.previousUrl = currentUrl;
avgreport.scanResult(doc, currentUrl);
refresh = (xplSearch.engine.name == ‘google’) ? 1 : 0;
}
searchshield.avgProcessSearch(doc, refresh);
},
stop: function(){
if (searchshield.avgPageMonitor.timeoutID)
{
window.clearTimeout(searchshield.avgPageMonitor.timeoutID);
delete searchshield.avgPageMonitor.timeoutID;
}
}
};
searchshield.avgProcessSearch = function (doc, refresh)
{
// doc may be about:Tabs or about:Blank
if (!doc)
return;
if (!searchshield.enabled(doc))
return;
if (!searchshield.clockUrl)
searchshield.clockUrl = searchshield.avgCallFunc(doc, ‘GetIconUrl’, ‘0’);
xplSearch.clockUrl = searchshield.clockUrl
if (!xplSearch.engine)
return;
// get result links
xplSearch.links = [];
var links = searchshield.avgGetSearchLinks(doc, xplSearch.engine, refresh);
searchshield.needLivePhishCheck = false;
for (var i=0; i < links.length; i++)
{
var isPhishing = searchshield.avglsCheckandUpdate(links[i]);
if (isPhishing)
searchshield.needLivePhishCheck = true;
}
if (searchshield.needLivePhishCheck)
{
var prev = '1';
if ( xplSearch.engine.type == 'inline' )
prev = '0';
searchshield.avgCallFunc(doc, 'GetPhishingResults', prev);
searchshield.needLivePhishCheck = false;
}
else if (links.length > 0 && xplSearch.engine.type != ‘inline’)
{
searchshield.avgCallFunc(doc, ‘FinalScanComplete’);
}
// attach click handlers for popup alerts
doc.body.detachEvent(“onclick”, searchshield.blockClick);
doc.body.attachEvent(“onclick”, searchshield.blockClick);
doc.body.detachEvent(“ondblclick”, searchshield.blockClick);
doc.body.attachEvent(“ondblclick”, searchshield.blockClick);
};
searchshield.avgGetSearchLinks = function (doc, engine, refresh)
{
if (!doc.body)
return;
var alltags = doc.body.getElementsByTagName(‘a’);
for (var i = 0; i < alltags.length; i++)
{
if ( !refresh )
{ // no checked test if refreshing - google
if (alltags[i].getAttribute('avglschecked'))
continue;
}
// mark search result anchor so it isn't processed repeatedly
alltags[i].setAttribute('avglschecked', '1');
// ignore linked resources
if (alltags[i].tagName == 'LINK')
continue;
// ignore in-page bookmarks and javascript
if ((!alltags[i].href) ||
(alltags[i].href.charAt(0) == '#') || // in-page bookmark
(alltags[i].href.indexOf("javascript") == 0))
continue;
// ignore verdicts
if (/XPLSS_/.test(alltags[i].id))
continue;
// ignore flyover anchors
if (/avgthreatlabs/.test(alltags[i].host))
continue;
var href = engine.includeLink(alltags[i]);
if (!href)
continue;
var newNode = engine.search.addLink(alltags[i], href);
engine.addImage(newNode, engine.search.clockUrl, false);
}
// recursivesly process all frames
var docFrames = doc.frames;
if (docFrames && engine.processFrames)
{
for (var j = 0; j < docFrames.length; j++)
{
var attr;
var frameDoc;
try {
attr = docFrames[j].frameElement.className;
frameDoc = docFrames[j].document;
}
catch(err){}
//TODO: make frame processing an engine function or at least make exclusions an engine property
// 'editable' frame it's probably a gmail reply
if (attr && (attr.indexOf("editable") != -1))
continue;
if (frameDoc)
searchshield.avgGetSearchLinks(frameDoc, engine, 0);
}
}
return engine.search.links;
};
searchshield.avglsCheckandUpdate = function (linkNode)
{
if (!xplSearch)
return;
// element is the search result anchor
var element = linkNode.element;
var href = linkNode.href;
var result = searchshield.avgCallFunc(xplSearch.doc, 'CheckSite', href, element.href);
if (result == null)
return;
var resultParse = result.split('::');
var phishing = resultParse[0]; // if phishing then rest of array does not exist.
if (phishing == 1)
return true;
if (resultParse.length < 8)
return;
var hash = resultParse[1];
var score = resultParse[2];
var new_image = resultParse[3];
var alt_image = resultParse[4];
var flyover = resultParse[5];
var click_thru= resultParse[6];
var altClick_thru = resultParse[7];
// iterate to get verdict anchor
nextElem = element.nextSibling;
while (nextElem)
{
if (nextElem.nodeType == 1 && nextElem.id && (nextElem.id.indexOf("XPLSS_") != -1))
break;
nextElem = nextElem.nextSibling;
}
return xplSearch.engine.updateImage(hash, xplSearch.searchHash, score, new_image, alt_image, flyover, click_thru, altClick_thru);
};
// click event handler - shows popup for links of caution and warning severity
searchshield.blockClick = function(event)
{
if (!event)
event = window.event;
// no action needed if click is not the left mouse button
if (event.button != 0)
return;
var anchor = searchshield.getAnchorNode(event.srcElement,
function(node) {return ((node.tagName.charAt(0) == "H") ||
(node.tagName.charAt(0) == "D") ||
(node.tagName.charAt(0) == "T"))} );
if ((anchor == null) || (anchor.href == null))
return true;
// ignore if anchor is on an xpl verdict
if (!!anchor.id)
{
if (anchor.id.indexOf('LXPLSS_') == 0)
return true;
if (anchor.id.indexOf('XPLSS_INTR') == 0)
{
searchshield.allowedSites.push(searchshield.GetDomain(anchor.href));
return true;
}
}
// VeriSign A/B Split reporting - only for VerSign domains
var avglschecked = anchor.getAttribute("avglschecked");
if (avglschecked && avglschecked != 1)
{
var sPos = avglschecked.indexOf("S");
var hash = (sPos > -1) ? avglschecked.substring(0, sPos) : null;
var split = (sPos > -1) ? avglschecked.substring(sPos+1) : null;
if (hash && split && split != searchshield.VERISIGN_SPLIT_NOTEST)
{
// check updated verdict anchor for verisign domain
var d = event.srcElement.ownerDocument;
if (d.getElementById(“LXPLSS_” + hash + “U” + searchshield.SCORE_SS_VERISIGN))
{
searchshield.avgCallFunc(d, “RecordVSClick”, hash, d.location.href);
}
}
}
var link = anchor.href;
var verdict = searchshield.getAvgImage(anchor);
var score = -1;
var img_id = ”;
if (verdict != null)
{
score = verdict.score;
img_id = verdict.rawId;
}
// show popup alert (upper left)
if ((score >= searchshield.SCORE_SS_CAUTION) && (score = elementRect.bottom) &&
(nextImgRect.left -1)
return true;
return false;
};
searchshield.FilterUrl = function (url, filter)
{
if (!url || (url.length < 1))
return false;
if (!filter || !(filter instanceof Array))
return false;
var parts = url.split('/');
if ((parts == null) || (parts.length < 3))
return false;
var domain = parts[2];
for (var i = 0; i < filter.length; i++)
{
if (domain.indexOf(filter[i]) != -1)
return true;
}
return false;
};
searchshield.GetDomain = function (url)
{
if (url != null)
{
// get url domain
var parts = url.split('/');
if ((parts != null) && (parts.length >= 3))
{
return parts[2].toLowerCase();
}
}
return url;
};
searchshield.getUrlContents = function (url)
{
if (url == null)
return null;
// don’t query if local url
if (url.indexOf(“linkscanner://”) != -1)
return null;
try
{
req = new XMLHttpRequest();
req.open(“GET”, url, false);
req.send(null);
if (req.status == 200)
return req.responseText;
else
return null;
}
catch (err)
{
// nothing to do
return null;
}
};
searchshield.parseLink = function (href, simpleMode)
{
var uri = {};
var parameter = {
complex: {
pattern: /^(?:([a-z]+):(?:([a-z]*):)?//)?(?:([^:@]*)(?::([^:@]*))?@)?((?:[a-z0-9_-]+.)+[a-z]{2,})(?::(d+))?(?:([^:?#]+))?(?:?([^#]+))?(?:#([^s]+))?$/i,
element: [‘source’,’scheme’,’subscheme’,’user’,’pass’,’host’,’port’,’path’,’query’,’fragment’]
},
simple: {
pattern: /^(?:([a-z]+)://)?((?:[a-z0-9_-]+.)+[a-z]{2,})(?:/)([^:?]+)?(?:([?|#])([^?]+))?$/i,
element: [‘source’,’scheme’,’host’,’path’,’delimiter’,’query’]
}
};
var mode = simpleMode !== false ? ‘simple’ : ‘complex’;
var pattern = parameter[mode].pattern;
var element = parameter[mode].element;
if (!href)
return uri;
var matches = href.match(pattern);
if (matches)
{
// ——————–
// iterate over the matches array and populate uri properties
// using the respective element parameter as the name.
// NOTE: set raw property type as String to make inArray()
// work properly with instanceof.
// ——————–
for (var i=0; i < matches.length; i++)
uri[element[i]] = new String(matches[i] || "");
// --------------------
// create an array, hostArray, from host, for example,
// host="www.google.com" and hostArray=["www","google","com"]
// --------------------
uri.hostArray = uri.host.split(".");
// --------------------
// create an array, qsArray, from query, for example,
// query='hl=en&q=javascript&btnG=Search&aq=f&aqi=g10&aql=&oq=&gs_rfai='
// qsArray=[{hl:'en'},{q:javascript}, ... ,(qs_rfai:''}]
//
// $0=entire match, $1=capture 1, $2=capture 2
// must include $0 even though it is unused so
// the replace works properly
// --------------------
uri.qsArray = searchshield.parseQuery(uri.query);
}
//non-standard urls require a fail-safe that relies on simply splitting the href
function splitLink(href)
{
// split the href on '/'
var linkParts = href.split("/");
// need domain and path
if ((linkParts == null) || (linkParts.length < 2))
return false;
var uri = {
delimiter: (linkParts[3]).substring(0,1),
host: linkParts[2],
hostArray: (linkParts[2]).split('.'),
path: (linkParts[3]).substring(1),
qsArray: [],
query: '',
scheme: (linkParts[0]).substring(0, linkParts[0].length-1),
source: href
};
return uri;
}
if (!uri.host)
uri = splitLink(href);
return uri;
};
searchshield.parseQuery = function (qs)
{
var qsArray = [];
qs.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,
function ($0, $1, $2) {
if ($1) qsArray[$1] = $2;
}
);
return qsArray;
};
// general functions
searchshield.arrayKeys = function (array)
{
var keys = new Array();
for(k in array)
keys.push(k);
return keys;
};
searchshield.inArray = function (key, array, caseSensitive, exactMatch)
{
if (! array instanceof Array)
return false;
if (caseSensitive !== true)
caseSensitive = false;
if (exactMatch !== false)
exactMatch = true;
if (key instanceof String)
{
for (var i=0; i < array.length; i++)
{
var k = caseSensitive ? key.valueOf() : key.valueOf().toLowerCase();
var a = caseSensitive ? array[i] : array[i].toLowerCase();
if(exactMatch && k === a)
return true;
else if (!exactMatch && (-1 !== k.indexOf(a)))
return true;
}
}
else if (key instanceof Array)
{
for (var i=0; i < array.length; i++)
for (var j=0; j < key.length; j++)
{
var k = caseSensitive ? key[j] : key[j].toLowerCase();
var a = caseSensitive ? array[i] : array[i].toLowerCase();
if (exactMatch && k === a)
return true;
else if (!exactMatch && (-1 !== k.indexOf(a)))
return true;
}
}
return false;
};
searchshield.getClickHandlerParams = function(clickHandler)
{
var re = /((?:'[^']*')|[w]*)(?:,|))/ig;
var chParams = [];
clickHandler.replace(re,
function($0, $1, $2){
if ($1)
chParams.push($1);
}
);
return chParams;
};
// general use functions - end
// Search constructor
searchshield.Search = function()
{
this.doc = null;
this.engine = null;
this.engines = null;
this.links = null;
this.uri = null;
this.searchHash = null;
this.checkUrl = null;
this.useLocalImgs = null;
this.clockUrl = null;
// create engine list (actually key/value object will be used)
this.engineList = {};
};
searchshield.Search.prototype.getSearchNames = function()
{ // order is important
var names = [
'Google',
'AVGGoogle',
'AltaVista',
'AVGYahoo',
'Yahoo',
'Bing',
'MSN', // MSN redirects to BING
'Baidu',
'Earthlink',
'AOL',
'Ask',
'Yandex',
'Seznam',
'Webhledani',
'eBay',
///temp 'Digg',
'Slashdot',
'Twitter',
'GMail',
'Facebook',
'MySpace'
];
return names;
};
searchshield.Search.prototype.detectEngine = function(href)
{
if (!href)
return;
var aEng = searchshield.Search.prototype.getSearchNames();
var aEngLen = aEng.length;
for (var i=0; i < aEngLen; i++)
{
if (searchshield[aEng[i] + 'SearchEngine'].prototype.validSearch(href))
return aEng[i];
}
return;
};
searchshield.Search.prototype.addEngine = function(engine)
{
if (!this.engines)
this.engines = new Array();
this.engines.push(engine);
};
searchshield.Search.prototype.addLink = function(inElement, inHref)
{
if (!this.links)
this.links = new Array();
var hrefHash;
try
{
hrefHash = searchshield.avgCallFunc(this.doc, 'GetHash', inHref);
}
catch (e){}
var newNode = {
element: inElement,
href: inHref,
hash: hrefHash,
search: this.searchHash
};
this.links.push(newNode);
return newNode;
}
// process the search result page after all search engines have been added
searchshield.Search.prototype.process = function(doc)
{
// only process when searchshield is enabled
if (!searchshield.enabled(doc))
return;
this.doc = doc;
this.href = this.doc.location.href;
this.uri = searchshield.parseLink(this.href);
try
{
this.searchHash = searchshield.avgCallFunc(this.doc, 'GetHash', this.href);
// get any previously active engine
this.engine = this.engineList[this.searchHash.toString()];
}
catch (e) {}
/*
Process Steps:
1. Add all supported search engines
2. Identify the active search engine
3. Get all document links and add AVG images
*/
// STEP 1 - Add all supported search engines
if (!this.engines)
{
var aEng = xplSearch.getSearchNames();
var aEngLen = aEng.length;
for (var i=0; i < aEngLen; i++)
{
xplSearch.addEngine(new searchshield[aEng[i]+'SearchEngine'](this));
}
}
// search the engines if we didn't find one
if (!this.engine)
{
// STEP 2 - Identify the active search engine
var engLen = this.engines.length;
for (var i = 0; i < engLen; i++)
{
if (this.engines[i].validSearch())
{
this.engine = this.engines[i];
break;
}
}
// create a new engine instance to store
this.engineList[this.searchHash.toString()] = this.engine;
// init this search, if < 1 either an error or disabled
//var sdkInit = 0;
//try {
// sdkInit = xpl_sdk.SXPL_InitSearch(this.href);
//}
//catch(e){}
//if (sdkInit < 1)
// return false;
}
// return immediately if there is not an active search engine
if (!this.engine)
return false;
try {
// base url to check for icons
this.checkUrl = searchshield.avgCallFunc(this.doc, 'GetIconUrl', '1');
// check if using linked or local icons
this.useLocalImgs = !searchshield.getUrlContents(this.checkUrl);
// get the clock url
this.clockUrl = searchshield.avgCallFunc(this.doc, 'GetIconUrl', '0');
}
catch(e){}
// STEP 3 - Get all document links and add AVG images
var alltags = this.doc.getElementsByTagName("*"); // this method works for IE, FF and Chrome
for (var i=0; i < alltags.length; i++)
{
// ignore verdicts
if (alltags[i].id && (alltags[i].id.indexOf("LXPLSS_") != -1))
continue;
//should the link be included? Make sure includeLink always returns an href else FALSE,
var href = this.engine.includeLink(alltags[i]);
if (!href)
continue;
var newNode = this.addLink(alltags[i], href);
this.engine.addImage(newNode, this.clockUrl, false);
}
return (this.links ? this.links.length : false);
};
//////////////// SEARCH ////////////////
//////////////// SEARCH ENGINE ////////////////
// Interface for a SearchEngine object
searchshield.SearchEngine = function(search)
{
this.search = search;
this.type = 'standard';
this.processFrames = false;
this.new_links = true;
this.onlyPrimaries = true;
this.inline = {
clockImage: "linkscanner://clock12.png",
image: [ "linkscanner://safe12.png",
"linkscanner://caution12.png",
"linkscanner://warning12.png",
"linkscanner://blocked12.png"
],
color: {
classname: ["green","yellow","orange","red"],
border: ["#00A120", "#EAA500", "#F57301", "#D20003"],
background: ["#C3E5CA", "#FEEFAE", "#FFD3B0", "#F5D4C1"]
}
};
this.filter_urls = [
"ad.doubleclick.net", "ads1.revenue.net", "aslads.ask.com",
"bluestreak.com", "clickbacktrack.net", "clickbank.net",
"clickboothlnk.com", "clickmanager.com", "clickserve.cc-dt.com",
"dartsearch.net", "clicktraxmedia.com", "clk.atdmt.com",
"dpi-digialphoto.com", "feedpoint.net", "hypertracker.com",
"jdoqocy.com", "kqzyfj.com", "m1428.ic-live.com",
"mediaplex.com", "mr.mdmngr.com", "n339.asp-cc.com",
"offeredby.net", "offerweb.com", "pinktrax.com",
"pinktrax.com", "pixel1523.everesttech.net", "qckjmp.com",
"r.rd06.com", "revenuewire.net", "s0b.bluestreak.com",
"s2.srtk.net", "servedby.advertising.com", "store.yahoo.com",
"tf8.cpcmanager.com", "thetoptracker.com", "track.searchignite.com",
"tracking.searchmarketing.com", "www.dpbolvw.net", "www.rkdms.com",
"www.yellowbookleads.com"
];
this.shortened_urls = [
"3.ly", "bit.ly", "is.gd", "tr.im", "short.to", "tiny.cc", "tinyurl.com", "lnk.ms", "msplinks.com", "t.co", "qr.net"
];
this.showCleanVerdicts = true;
this.showLowRiskVerdicts = true;
this.showMedRiskVerdicts = true;
this.VeriSignSplit = searchshield.VERISIGN_SPLIT_NOTEST;
};
searchshield.SearchEngine.prototype.flyoverExists = function (doc)
{
return !!doc.getElementById("XPLSS_Flyover");
};
searchshield.SearchEngine.prototype.inlineExists = function (doc)
{
return !!doc.getElementById("XPLSS_InlineFlyover");
};
searchshield.SearchEngine.prototype.validSearch = function(href) { return false; };
searchshield.SearchEngine.prototype.includeLink = function(link) { return false; };
searchshield.SearchEngine.prototype.insertNodes = function(node, doc)
{
var element = node.element;
var parentNode = node.element.parentNode;
if (parentNode == null)
{
// try and find element again based on the hash
element = doc.getElementById("xplid_" + node.hash);
parentNode = !!element ? element.parentNode : null;
}
var insertNode = !!element ? element.nextSibling : null;
while ((insertNode != null) &&
(insertNode.tagName != null) &&
(insertNode.tagName == "SPAN"))
{
insertNode = insertNode.nextSibling;
}
return [insertNode, parentNode];
};
searchshield.SearchEngine.prototype.addImage = function(node, image, hidden)
{
var element = node.element;
var hash = node.hash;
var score = node.score;
// set verdict display configuration
var doc = element.ownerDocument;
if (this.type != 'inline' && !doc.getElementById('XPLSS_Flyover'))
searchshield.initFlyover(doc, this);
// get the proper insertion point for the image
var insertNodes = this.insertNodes(node, doc);
var insertNode = insertNodes[0];
var parentNode = insertNodes[1];
if (!parentNode)
return;
// see if we already have an image
if ((insertNode != null) &&
(insertNode.id != null) &&
(insertNode.id.indexOf("XPLSS_") > -1))
{
return;
}
// mark search result anchor so it isn’t processed repeatedly
if (score == undefined)
element.setAttribute(“avglschecked”, hash + “S” + this.VeriSignSplit);
// create a new image
var img = doc.createElement(‘img’);
img.src = image;
img.id = “XPLSS_” + hash;
img.style.borderStyle = “none”;
img.style.margin = “0 3px”;
// for IE, specify these style attributes to prevent inadvertent inheritance from parent
if (img.width && img.height)
{
img.style.width = img.width + ‘px’;
img.style.height = img.height + ‘px’;
}
// apply custom element styles
this.updateElementStyle(img, this.addImageStyle);
// create the link element
var anchor = doc.createElement(“A”);
anchor.setAttribute(“id”, “LXPLSS_” + hash);
if ((hidden != null) && (hidden == true))
{ // hiding the parent will also hide its child nodes
anchor.style.display = “none”;
}
// Default anchor styles
//Over-ride possible border style with inline declaration
anchor.style.borderStyle = “none”;
// apply custom element styles
this.updateElementStyle(anchor, this.addAnchorStyle);
if (score == searchshield.SCORE_SS_VERISIGN)
{
anchor.style.textDecoration = “none”;
anchor.style.background = “none repeat scroll 0 0 transparent”;
}
// append the image to the link
anchor.appendChild(img);
// insert the node as either a sibling or a child
if (insertNode != null)
parentNode.insertBefore(anchor, insertNode);
else
parentNode.appendChild(anchor);
return anchor;
};
searchshield.SearchEngine.prototype.updateImage = function (hash, search, score, image, alt_image, flyover, click_thru, altClick_thru)
{
var updated = false;
var frameDoc = this.search.doc;
var docFrames = frameDoc.frames;
var frameElem;
if (docFrames && this.processFrames)
{
for (var i=0; i < docFrames.length; i++)
{
try {
if (docFrames[i].document.getElementById(hash))
{
frameElem = docFrames[i].frameElement;
frameDoc = docFrames[i].document;
break;
}
}
catch(err){}
}
}
while ((element = frameDoc.getElementById(hash)) != null)
{
// check configuration to determine if verdict display property
var showVerdict = true;
var nSeverity = Number(score - 1);
switch (nSeverity)
{
case searchshield.XPLCHECK_RESULT_SEV_LOW:
showVerdict = this.showLowRiskVerdicts;
break;
case searchshield.XPLCHECK_RESULT_SEV_MED:
showVerdict = this.showMedRiskVerdicts;
break;
case searchshield.XPLCHECK_RESULT_SEV_NONE:
showVerdict = this.showCleanVerdicts;
break;
default:
if (score == searchshield.SCORE_SS_VERISIGN)
showVerdict = this.showCleanVerdicts;
break;
}
// remove image if no url specified
if ((!showVerdict) || (image == null) || (image.length < 1))
{
// hide the parent anchor node
element.parentNode.style.display = "none";
// mark the id as being hidden (element is the image)
element.id = element.id + "H";
updated = true;
// if not a verisign score
if (score != searchshield.SCORE_SS_VERISIGN)
continue;
}
// cleanup flyover, replace any new lines or single quotes
flyover = searchshield.CleanupHTML(flyover);
// mark the id as having been updated
element.id = element.id + "U" + score;
element.src = image;
element.attachEvent("onmouseover", function(e){avglsflyover.popup(e, hash, search, flyover)});
element.attachEvent("onmouseout", function(e){avglsflyover.hide(e)});
// check for attribute updates (elementAttribute is an associative array (i.e., object)
if (this.elementAttribute)
{
for (a in this.elementAttribute)
{
if(this.elementAttribute[a])
element.setAttribute(a, this.elementAttribute[a]);
}
}
// To dynamically reduce verdict image size if it causes its container to scroll
// when not showing alt images determine if the element containing
// the verdict image is scrolling and decrease the image size by
// the scroll amount (min size is 80% or original)
var reduceBy = 0.8;
var scrl = 0;
if (!alt_image || this.omitAltImage || this.VeriSignSplit == searchshield.VERISIGN_SPLIT_TESTB)
{
try{
var maxLoop = 5;
var cN = element.parentNode.parentNode; //image->anchor->containerNodes…
while (cN && maxLoop–)
{
if (cN.tagName == “DIV” || cN.tagName == “SPAN”)
{
// get object height depending on ie document mode
var clientHeight = (cN.clientHeight == 0 ||
(this.search.doc.documentMode && this.search.doc.documentMode < 8)) ?
cN.offsetHeight :
cN.clientHeight;
scrl = cN.scrollHeight - clientHeight;
break;
}
cN = cN.parentNode;
}
if (0 < scrl)
{
var eH = (element.height - scrl)/element.height;
if (reduceBy > eH)
eH = reduceBy;
var newDim = Math.ceil(eH*element.height);
element.height = newDim;
element.width = newDim;
element.style.height = newDim + “px”;
element.style.width = newDim + “px”;
}
}
catch(e){}
}
// set default style attributes
element.style.display = “”;
// if verisign icon showing move our icon up for better centering of the 2
// except for IE7 browser – it does not like this style
try {
var ieVersion = parseFloat(navigator.appVersion.split(“MSIE”)[1]);
if (alt_image && (alt_image.length > 0) && ieVersion != 7)
element.style.verticalAlign = “10%”;
}
catch(err){};
// apply custom element styles
this.updateElementStyle(element, this.updateImageStyle)
// update the click thru
var link = this.search.doc.getElementById(“L” + hash);
if (link)
{
link.href = click_thru;
link.id = link.id + “U” + score;
}
updated = true;
// add the alternate image if supplied BUT not on avg yahoo
if ((alt_image) &&
(alt_image.length > 0) &&
(!this.omitAltImage) &&
(this.VeriSignSplit != searchshield.VERISIGN_SPLIT_TESTB))
{
var vhash = hash.substring(hash.indexOf(“_”)+1);
// create a temporary link node
var tmp_node = {
element: element.parentNode,
href: altClick_thru,
hash: vhash + “VU” + score,
search: this.searchHash,
score: score
};
var altAnchor = this.addImage(tmp_node, alt_image, false);
if (altAnchor && altAnchor.firstChild)
{
altAnchor.firstChild.setAttribute(“onmouseover”, “”);
altAnchor.href = altClick_thru;
}
}
}
if (updated != false)
{
this.resizeFrame(frameElem);
return true;
}
return false;
};
searchshield.SearchEngine.prototype.updateElementStyle = function (element, elementStyle)
{
if (elementStyle)
{ // a NULL attribte value will unset it
for(attr in elementStyle)
{
try {
if (element.style.setAttribute)
element.style.setAttribute(attr, elementStyle[attr]);
else
element.style[attr] = elementStyle[attr];
} catch(err){}
}
}
};
searchshield.SearchEngine.prototype.resizeFrame = function (frameElem)
{ // resize frame to prevent unwanted scrolling after inserting verdicts
// ignore inline and non-frame engines
if ((this.type == ‘inline’) || (!this.processFrames))
return;
// ensure all required elements are available
if ((frameElem == null) || (frameElem.style == null) || (frameElem.contentWindow == null))
return;
// if frame is scrolling vertically then resize
var frameHeight = parseInt(frameElem.style.height, 10);
if (!isNaN(frameHeight) && (frameHeight < frameElem.contentWindow.document.body.scrollHeight))
frameElem.style.height = frameElem.contentWindow.document.body.scrollHeight + 'px';
return;
};
searchshield.SearchEngine.prototype.getImgElement = function (element)
{ // return an xpl img element associated with a given element
if (element == null)
return null;
// go up the parent tree looking for a header or div
while ( (element.parentNode != null) &&
(element.tagName.charAt(0) != "H") &&
(element.tagName.charAt(0) != "D") &&
(element.tagName.charAt(0) != "T") )
{
element = element.parentNode;
}
// if all the way to the top, nothing
if ((element.tagName == "HTML") || (element == null))
return null;
// get image tags, if none we are done
var imgTags = element.getElementsByTagName("IMG");
if ((imgTags == null) || (imgTags.Length < 1))
return null;
for (var i = 0; i < imgTags.length; i++)
{
if ((imgTags[i].id == null) || (imgTags[i].id.indexOf("XPLSS_") == -1))
continue;
return imgTags[i];
}
// else didn't find anything
return null;
};
searchshield.SearchEngine.prototype.setRatingsConfig = function (doc)
{
// get verdict configuration, need at least severity
var results = searchshield.avgCallFunc(doc, 'GetRatingsConfig');
var parts = !!results ? results.split('::') : null;
if (parts != null && parts.length >= 5)
{ //if set to default then get config value
if (this.showCleanVe