var LinkReplacer = {};

LinkReplacer.scroll_parent = null;


LinkReplacer._anchors = {};


LinkReplacer.lnk2span = function ( txt )
{
	if ( ! txt ) return "";
	var s = txt.replace ( /<(.?)lnk/ig, "<$1span" );
	return s;
};

LinkReplacer.replace = function ( replace_link_cback )
{
	var lnks = document.getElementsByTagName ( "span" );
	var lnk, l, t;
	var txt;
	var a, href;
	var res = [];

	l = lnks.length;

	for ( t = 0; t < l; t ++ )
	{
		lnk = lnks [ t ];

		if ( ! lnk.getAttribute ( 'opera' ) && ! lnk.getAttribute ( 'tipolink' ) ) continue;

		txt = lnk.innerHTML;
		href = replace_link_cback ( lnk );

		a = document.createElement ( 'a' );
		a.setAttribute ( 'href', href );
		a.innerHTML = txt;

		res.push ( [ a, lnk ] );
	}

	l = res.length;
	for ( t = 0; t < l; t ++ )
	{
		lnk = res [ t ] [ 1 ];
		lnk.parentNode.replaceChild ( res [ t ] [ 0 ], lnk );
	}
};


LinkReplacer.replace_anchors = function ( el, skip_class_check )
{
	if ( ! el ) el = document;

	var as = el.getElementsByTagName ( "a" );
	var a, l, t;
	var name, href = false;

	l = as.length;

	for ( t = 0; t < l; t ++ )
	{
		a = as [ t ];

		name = a.getAttribute ( 'name' );
		if ( name )
			LinkReplacer._anchors [ name ] = a;

		try {
			href = a.getAttribute ( 'href' );
		} catch ( e ) {
			href = false;
		}

		if ( ! href ) continue;

		if ( ! skip_class_check && a.className != "cds_rif_nota" && a.className != "cds_rimando_nota" ) continue;

		href = href.split ( "#" );
		if ( href.length > 1 && ( ( ! href [ 0 ] ) || href [ 0 ] == ( location.protocol + "//" + location.hostname + location.pathname + location.search ) ) )
		{
			href = href [ 1 ];
			a.setAttribute ( 'href', "javascript:LinkReplacer.scroll('" + href + "')" );
		}
	}
};


LinkReplacer.scroll = function ( name )
{
	var a = LinkReplacer._anchors [ name ];
	if ( ! a )
	{
		var i, l = document.anchors.length;
		for ( i = 0; i < l; i ++ )
		{
			if ( document.anchors [ i ].name == name )
			{
				a = document.anchors [ i ];
				break;
			}
		}
	}
	if ( ! a )
	{
		console.warn ( "Manca l'anchor con NAME '" + name + "'" );
		return;
	}

	var pos = liwe.dom.get_offset_top ( a );

	if ( LinkReplacer.scroll_parent )
	{
		var p2 = liwe.dom.get_offset_top ( LinkReplacer.scroll_parent );
		LinkReplacer.scroll_parent.scrollTop = pos - p2;
	}
	else
		window.scrollTo ( 0, pos );
};


LinkReplacer.set_hl_navi = function ( el, first_el )
{
	if ( ! el ) el = document;

	var spans = el.getElementsByTagName ( "span" );
	var i, l = spans.length;
	var count = 0;
	var h, dest;
	var s_spans = [];
	var l_spans = [];

	for ( i = 0; i < l; i ++ )
	{
		var span = spans [ i ];
		if ( span.className != "highlight" ) continue;

		var p = span.parentNode;
		while ( p )
		{
			if ( p.tagName == "A" )
			{
				span._in_link = p;
				l_spans.push ( span );
				break;
			}

			p = p.parentNode;
		}

		LinkReplacer._anchors [ "_hl_span" + count ] = span;

		s_spans.push ( span );
		count ++;
	}

	l = l_spans.length;
	for ( i = 0; i < l; i ++ )
		LinkReplacer._fix_span_in_link ( l_spans [ i ] );

	for ( i = 0; i < count; i ++ )
	{
		span = s_spans [ i ];

		if ( span._in_link )
			span = span._in_link;

		if ( i > 0 )
		{
			// aggiungo la freccia PRIMA
			h = document.createElement ( "a" );
			h.href = "javascript:LinkReplacer.scroll('_hl_span" + ( i - 1 ) + "')";
			h.innerHTML = '<img border="0" alt="" src="/gfx/ft_prev.gif" style="margin-right: 2px" />';

			span.parentNode.insertBefore(h, span);
		}

		if ( i < count - 1 )
		{
			// aggiungo la freccia DOPO
			h = document.createElement ( "a" );
			h.href = "javascript:LinkReplacer.scroll('_hl_span" + ( i + 1 ) + "')";
			h.innerHTML = '<img border="0" alt="" src="/gfx/ft_next.gif" style="margin-left: 2px" />';

			dest = span.nextSibling;
			if (dest)
				span.parentNode.insertBefore(h, dest);
			else
				span.parentNode.appendChild(h);
		}
	}

	if ( first_el )
	{
		if ( count )
		{
			first_el.innerHTML = '<a href="javascript:LinkReplacer.scroll(\'_hl_span0\')">' +
				'<img alt="Prima occurrenza" border="0" src="/gfx/ft_first.gif" /></a>';
			first_el.style.display = "block";
		}
		else
			first_el.style.display = "none";
	}
};


LinkReplacer._fix_span_in_link = function ( s )
{
	var before = [];

	var lnk = s._in_link;
	while (lnk.childNodes.length > 0)
	{
		var el = lnk.childNodes [ 0 ];

		lnk.removeChild ( el );

		if ( el == s )
			break;
		else
			before.push ( el );
	}

	var a = lnk.cloneNode(false);

	var i, l = before.length;
	for ( i = 0; i < l; i ++ )
		a.appendChild ( before [ i ] );

	lnk.parentNode.insertBefore ( a, lnk );

	a = lnk.cloneNode(false);
	a.appendChild ( s );
	lnk.parentNode.insertBefore ( a, lnk );

	s._in_link = a;
};

