
/**
 * Navigation.js
 * $URL: https://svn.pvtool.org/svn/day_audi_ngw/trunk/ngw_base/frontend/js/audi/audi.navigation.breadcrumb.js $
 *
 * @author 		$Author: hhoettecke $
 * @copyright   NEUE DIGITALE GmbH, Berlin
 * 
 * @jslint: 2008-10-31
 * 
 * @TODO	refactor
 */
/* create namespace */
audi_ngw.namespace(audi_ngw,'breadcrumb');

/**
 * Creates HTML Template for new breadcrumb elements
 * @method _createHTMLTemplate
 * @private
 * @return {Void}
 */
audi_ngw.breadcrumb._createHTMLTemplate = function () {
	// create li
	var _htmlLi = document.createElement('li');
	// create a
	var _htmlA = document.createElement('a');
	_htmlA.className="";
	_htmlA.rel="";
	_htmlLi.appendChild(_htmlA);
	return _htmlLi;
};

/**
 * Adds a new HTML element to the existing HTML breadcrumb
 * @method _addHTMLElement
 * @param {Object} oOption .depht, .text, .href
 * @private
 * @return {Void}
 */
audi_ngw.breadcrumb._addHTMLElement = function (oOption) {
	var scope = audi_ngw.breadcrumb;
	var _html = scope._htmlTemplate.cloneNode(true);
	// 'xcept first element, everyone get's a nice divider
	if (oOption.depth !== 0) {
		jQuery(_html).prepend(document.createTextNode(scope._oOptions.sTextDivider));
	}
	// set properties and append li element
	jQuery(_html).children()
		.attr({ 'href': oOption.href || '#', 'rel': 'breadcrumb'})
		.attr('class','breadcrumb') // use classname as storage for rel, rel=breadcrumb is used by flash to decide what to do
		.text(oOption.text || '&nbsp;' )
		.parent()
		.appendTo(jQuery(scope._elBreadcrumbStage).children('ul')); 
 
};

/**
 * Clears HTML breadcrumb
 * @method _emptyBreadcrumbHTML
 * @private
 * @return {Void}
 */
audi_ngw.breadcrumb._emptyBreadcrumbHTML = function () {
	// set up environment
	var _oOpt = this._oOptions;

	// construct selector
	var _sSelector = '#';
	_sSelector += _oOpt.sIdBreadcrumb;

	// clear
	jQuery(_sSelector).empty();
	
};
 
 

audi_ngw.breadcrumb.update= function($element){
	var scope = audi_ngw.breadcrumb;

	if (!scope._oOptions) {
			audi_ngw.breadcrumb.initialize({});
	}

	if (jQuery('#'+scope._oOptions.sIdBreadcrumb+' a[href="'+$element.attr('href')+'"]').length !== 0 || !$element.size() ) {
		scope.removeLastDOM();
	}
	else {
		scope.addDOM($element);
	}
	
	audi_ngw.breadcrumb.toggleLastElement(audi_ngw.navigation.parameters.source);
	
	scope._updateFlash();
};

/**
 * Replaces all <span> except the last one with <a>-Elements
 */
audi_ngw.breadcrumb.resetSpans = function() {
	var scope = audi_ngw.breadcrumb;
	var _c = jQuery(scope._elBreadcrumbStage)
		// get all <li>
		.find('li')
		// except the last one
		.not(':last-child')
		// get their <span>
		.children('span')
		// replace them with <a>
		.each(
			function (_i,_item) {
				var _$item = jQuery(_item);
				jQuery('<a href="" rel="" class=""></a>')
				.attr('href',_$item.attr('rel')) // use classname as storage for rel, rel=breadcrumb is used by flash to decide what to do
				.attr('class',_$item.attr('class')) // use classname as storage for rel, rel=breadcrumb is used by flash to decide what to do
				.attr('rel',(_$item.hasClass('breadcrumb') ? 'breadcrumb': 'pagelevel' ))
				.text(_$item.text())
				.replaceAll(_$item);
			}
		);
	scope._updateFlash();
};

/**
 * Toggle last breadcrumb element between <a> and <span> because the last 
 * element shouldn't be an anchor if this page is part of the breadcrumb lists
 * @param {String} sUrl
 */
audi_ngw.breadcrumb.toggleLastElement = function(sUrl){
	
	var scope = audi_ngw.breadcrumb;

	// reset spans forcing a proper breadcrumb
	scope.resetSpans();
	
	// get all elements inside the breadcrumb's <li>
	var _$col = jQuery(scope._elBreadcrumbStage).find('li').children();
	// get the last one
	var $element = _$col.eq(_$col.size()-1);
	// get last element's tagname
	var _sTagName = $element.get(0).tagName.toLowerCase();
	// get .rel from <spans> or .href from <a>
	var _sRel = ( $element.attr('rel') != 'breadcrumb') ? $element.attr('rel') : $element.attr('href');
	// grab text
	var _sText = $element.text();
	
	// if the last element is a span and the rel/url doesn't equals the current site, show anchor
	// if is span && rel != sUrl, create a.href=sUrl
	if (_sTagName === 'span' && _sRel != sUrl ) {
		jQuery('<a href="" rel=""></a>')
			.attr('href', _sRel)
			.attr('class',$element.attr('class')) // use classname as storage for rel, rel=breadcrumb is used by flash to decide what to do
			.attr('rel',($element.hasClass('breadcrumb') ? 'breadcrumb': 'pagelevel' )) // use classname as storage for rel, rel=breadcrumb is used by flash to decide what to do
			.text(_sText)
			.replaceAll($element);
	}
	// if the last element rel/url represents the current site, create span 
	// if is anchor && href == sUrl, create span.rel=sUrl
	if ( !sUrl || (_sTagName === 'a' && _sRel == sUrl) ) {
		jQuery('<span rel=""></span>')
			.attr('class',$element.attr('class')) // use classname as storage for rel, rel=breadcrumb is used by flash to decide what to do
			.attr('rel', _sRel)
			.text(_sText)
			.replaceAll($element);
	}
	
	scope._updateFlash();

};

audi_ngw.breadcrumb.addDOM = function($element){
	var scope = audi_ngw.breadcrumb;
	var _sText = $element.text();
	if (!_sText || _sText == "&nbsp;") {return;}
	var _oOption = {depth : null , text: _sText, href: $element.attr('href')};
	scope._addHTMLElement(_oOption);

};

audi_ngw.breadcrumb.removeLastDOM = function(){
	var scope = audi_ngw.breadcrumb;
	var _$col = jQuery(scope._elBreadcrumbStage).find('ul').children();
	_$col.eq(_$col.size()-1).remove();
};

audi_ngw.breadcrumb._updateFlash = function(){
 
	var scope = audi_ngw.breadcrumb;
	var _sText = (jQuery("#"+scope._oOptions.sIdBreadcrumb).html());
	// ie fails on creating a valid xml structure
	if (jQuery.browser.msie) {
		_sText = _sText
					.toString()
					.replace(/&gt;/g,'')
					// add missing </li> tags after </a> or </span>
					//(<(li|LI))(.*?)(<\/(a|A|span|SPAN)>)(?!\s*<\/(li|LI)>)
					.replace(/((<(li|LI))(.*?)(<\/(a|A|span|SPAN)>)(?!\s*<\/(li|LI)>))/g,'$1</$3>')
	//					.replace(/(<(.*?)><a.*?>.*?<\/a>\s([^<\/$2]))/gi, '$1</$2>')
					// add quotes on unquoted attributes
					.replace(/(\w+)(=+)([^"<>\' ]+)(\s+|\/|>)+/g,"$1$2\"$3\"$4");
	}			
	try {
		audi_ngw.flash.getFlashMovie(scope._oOptions.sIdBreadcrumb + '_replaced').refreshReplacement(encodeURI(_sText));
	} catch (e) {
		window.setTimeout(arguments.callee,250);
	}
};
 

audi_ngw.breadcrumb.initialize = function (oOptions){
	var scope = audi_ngw.breadcrumb;
	scope.__className =  'audi_ngw.breadcrumb';
	scope.__classVersion= '1.2';

	scope._oOptions = {};
	// set otpions 
	scope._oOptions.aOPrefix = oOptions.aOPrefix || [{depth : 0, text: "Startseite", href: "/"}]; // prefix is static! 
	scope._oOptions.sIdBreadcrumb = oOptions.sIdBreadcrumb || 'audi_navigation_breadcrumb';
	scope._oOptions.sIdNavigation = oOptions.sIdNavigation || 'audi_nav_distributor';
	scope._oOptions.sTextDivider = oOptions.sTextDivider || ' > ';
	scope._htmlTemplate =scope._createHTMLTemplate();
	scope._elBreadcrumbStage = document.getElementById(scope._oOptions.sIdBreadcrumb);
//	this.getCurrent({});
//	this.redraw(this._oCurrentBreadcrumb,this._oCurrentBreadcrumb.length);

//	audi_ngw.flash.replace('breadcrumb');
};

