/**
 * AUDI JavaScript library: Layer.Advice
 * 
 * @projectDescription	Advice-layer, kind of tooltip 
 * @namespace			layer.advice
 *
 * @author 				$Author: mkrause $
 * @version				$Revision: 3646 $
 * @copyright			NEUE DIGITALE GmbH, Berlin
 * 
 * @jslint: 2008-10-31
 * 
 * @file:				audi_ngw.layer.advice.js
 * $URL: https://svn.pvtool.org/svn/day_audi_ngw/trunk/ngw_base/frontend/js/audi/audi.layer.advice.js $
 */


/* create namespace */
audi_ngw.namespace(audi_ngw,'layer.advice.api');

///**
// * External interface for audi_ngw.api.openAdvice. Acts as a proxy to audi_ngw.layer.advice.showAnimated().
// * "Öffnet die angegebene Seite im Advice-Modul. Als Parameter können Callbacks für open/close angegeben werden."
// * @method audi_ngw.api.openAdvice 
// * @see audi_ngw.api.openAdvice 
// * @see audi_ngw.layer.advice.showAnimated
// * @param {String} URL 
// * @param {Object} Parameters: {Function} Callback .onOpen, {Function} Callback .onClose
// * @return {Void}
// */
//
//audi_ngw.layer.advice.api.show = function (sUrl,oParam) {
//}

/* create namespace */
audi_ngw.namespace(audi_ngw,'layer.advice');
 
/**
 * Set up Environment
 * @method _setUp
 * @param {String} Wrapper Id narrowing scope
 * @return {Void}
 * @private
 */
audi_ngw.layer.advice._setUp = function(sIdWrapper){
	
	// cache scope
	var _scope = this;
	
	if (!_scope._options) { _scope.initialize(); }
	var _aIds = [];
	// set up links
	var _sSelector = (sIdWrapper) ? ('#'+sIdWrapper+' ') : '';
	_sSelector += ' a[rel="layerAdvice"]';
	jQuery(_sSelector)
		.unbind('click.advice')
		.bind('click.advice',_scope.showAnimated)
		.unbind('click.mouseover')
		.bind('click.mouseover',_scope.markerShow)
		.unbind('click.mouseout')
		.bind('click.mouseout',_scope.markerHide)
		.unbind('click.mousemove')
		.bind('click.mousemove',_scope.markerShow)
//		.mouseover(_scope.markerShow)
//		.mouseout(_scope.markerHide)
//		.mousemove(_scope.markerShow)
		.map(function(){
			// push id into array
			_aIds.push(jQuery(this).attr('href').split('#')[1]);
		});
	_sSelector = null;
	// setup footnotes
	_sSelector = (sIdWrapper) ? ('#'+sIdWrapper+' ') : '';
	_sSelector += 'div[id^="';
	_sSelector += _scope._options.sIdSliceAdviceLayer.slice(1);
	_sSelector += '"]';
	// grab all id=footnote* elements
	jQuery(_sSelector)
		// hide popups
		.map(function(){
			// check for current id at id array
			var _iPos = jQuery.inArray( jQuery(this).attr('id'),_aIds);
			if (_iPos !== -1) {
				// remove from array, just the missing footnotes will remain at this id
				_aIds.splice(_iPos, 1);
			}
		})
		.end()
		.hide()
		// add classname for layerlookalike
		.addClass(_scope._options.sCNAdviceLayer.slice(1))
		.css('position','absolute')
		.css('display','none')
		// add close icon before h4
		.find('h4')
		.before(_scope._options.sHTMLIconClose)
		// find close icon 
		.end()
		.find('img.close')
		// add click event "close"
		.unbind('click.layerAdvice')
		.bind('click.layerAdvice',_scope.layerHideAnimated);
 

	_scope._aMissingFootnotes = _aIds;

	// create single advice marker 
	if (!jQuery(_scope._options.sIdAdviceMarker).size()) {
		jQuery('body').append('<img src="' + _scope._options.sSrcAdviceMarker + '" id="' + _scope._options.sIdAdviceMarker.slice(1) + '"></div>');
		_scope._$elAdviceMarker = jQuery(_scope._options.sIdAdviceMarker).hide();
	}
	if (_scope._aMissingFootnotes.length  > 0 ){ //&& jQuery('body').hasClass('integrator')) {
		audi_ngw.layer.advice.getAllFootnotes();
	}
};

/**
 * Grabs the "missing" HTML-Snippets for advice footnotes if necessary (scope._aMissingFootnotes).
 * @return {Void}
 */
audi_ngw.layer.advice.getAllFootnotes = function(){

	var scope = audi_ngw.layer.advice;
	var _oOpt = scope._oReqGetAll;
	var _sUrl = _oOpt.sUrlBase;
	var _sSuffix = _oOpt.sUrlSuffix;
	var _sDivider = _oOpt.sUrlDivider;
	var _n = scope._aMissingFootnotes.length;
	var _aIds  = scope._aMissingFootnotes;
	var _j = 0;
	var _aUrls = [''];
	var _aFragments = [];
	
	for (var _i = 0; _i<=_n; _i++) {
//console.log(_aFragments)
		// if the current joined fragment + base url length exceeds the max length or its the last run 
		if ( ( (_aFragments.join('_')+'.shtml').length + _sUrl.length + 1 ) > 1700 || _i == _n) {
			// push url to url arry
			_aUrls[_j] = _sUrl + _sDivider+_aFragments.join(_sDivider)+_sSuffix;
			// reset fragments
			_aFragments = [];
			// increase url counter
			_j++;
		}
		// push current fragment into current url container
		var _cId = _aIds.pop();
		if (_cId) {
			_aFragments.push(_cId.slice(9));
		}
	}
	_n = _aUrls.length;
	for(_i = 0; _i<_n; _i++) {
		audi_ngw.log("[audi_ngw.layer.advice.getAllFootnotes] grab missing footnotes from: "+audi_ngw.url.getContext(_aUrls[_i]));
 
		jQuery.ajax({
			url: audi_ngw.url.getContext(_aUrls[_i]),
			type: _oOpt.sType,
			cache: true,
			success: function(html){
				jQuery("#audi_content_wrapper").append(html);
				audi_ngw.layer.advice._setUp('audi_content_wrapper');
	//			//@TODO prepare content
				audi_ngw.dom.rounded_corners.createOn('audi_content_wrapper');
				audi_ngw.flash.adviceLayerHeadlines();
				audi_ngw.navigation.prepareLinks('audi_content_wrapper');
			}
		});
	}
};

/**
 * Shows advice marker image next to cursor. Bridge _doMarkerShow
 * @method markerShow
 * @param {Event}
 * @return {Void}
 */
audi_ngw.layer.advice.markerShow = function(event){
	audi_ngw.layer.advice._doMarkerShow(this,event.pageX,event.pageY);
};

/**
 * Shows advice marker image next to cursor
 * @method _doMarkerShow
 * @param {HTMLElement} element
 * @param {Integer} Cursor x
 * @param {HTMLElement} Cursor y
 * @private
 */
audi_ngw.layer.advice._doMarkerShow = function(element, iPageX, iPageY){
	// cache scope
	var _scope = audi_ngw.layer.advice;

	// cache and remove title 
	var $element = jQuery(this);
	_scope._sTitle = $element.attr('title');
	$element.attr('title', '');

	// show marker
	_scope._$elAdviceMarker.css({
		left: iPageX + _scope._options.iAdvideMarkerOffsetX,
		top: iPageY + _scope._options.iAdvideMarkerOffsetY
	}).show();
};

/**
 * Hides advice marker image next to cursor. Bridge _doHideAdviceMarker
 * @method markerHide
 * @param {Event}
 * @return {Void}
 */
audi_ngw.layer.advice.markerHide = function(event){
	audi_ngw.layer.advice._doMarkerHide(this);
};

/**
 * Hides advice marker image
 * @method _doMarkerHide
 * @param {Object} element
 * @return {Void}
 * @private
 */
audi_ngw.layer.advice._doMarkerHide = function(element){
	// cache scope
	var _scope = audi_ngw.layer.advice;
	// hide element
	_scope._$elAdviceMarker.hide();
	// restore title 
	jQuery(element).attr('title',_scope._sTitle);
};

/**
 * Hides advice layer, bridge to _doLayerHideAnimated
 * @method layerHideAnimated
 * @param {Event} Event
 * @return {Void}
 */
audi_ngw.layer.advice.hide = function(){
	audi_ngw.layer.advice.layerHideAnimated();
};

/**
 * Hides advice layer, bridge to _doLayerHideAnimated
 * @method layerHideAnimated
 * @param {Event} Event
 * @return {Void}
 */
audi_ngw.layer.advice.layerHideAnimated = function(event){
	if (audi_ngw.animation.getRunning(audi_ngw.layer.advice.__className) === true || !audi_ngw.layer.advice._$elLayer) {
		return;
	}
	audi_ngw.animation.setRunning(audi_ngw.layer.advice.__className);
	// cache scope
	var _scope = audi_ngw.layer.advice;	
	// get element to hide 
	var $element = _scope._$elLayer ; //jQuery(this).parent().parent();
	// somethings wrong ...
	if (!_scope._$elLayer || (_scope._$elLayer.attr('id') != $element.attr('id')) ) {
		// remove all 
		_scope._doHideAllFootnotes();
	}
	// hide 
	audi_ngw.layer.advice._doLayerHideAnimated($element);
};

/**
 * Hides advice layer
 * @method _doLayerHideAnimated
 * @param {Event} Event
 * @return {Void}
 * @private
 */
audi_ngw.layer.advice._doLayerHideAnimated = function(element){
	// cache scope
	var _scope = audi_ngw.layer.advice;	
	// hide
 
	jQuery(element).slideUp(300,function(){
		audi_ngw.animation.onComplete(audi_ngw.layer.advice.__className);
		audi_ngw.layer.unsetIE6Fix();
		// reset cached footnote
		_scope._$elLayer = null;
	});
};

/**
 * Hides all footnotes in case of discrepancies
 * @method _doHideAllFootnotes
 * @return {Void}
 * @private
 */
audi_ngw.layer.advice._doHideAllFootnotes = function(){
	var _scope = audi_ngw.layer.advice;
	if (!_scope._options) {audi_ngw.layer.advice.initialize({});}
	var _sSelector = 'div[@id^="';
	_sSelector += _scope._options.sIdSliceAdviceLayer.slice(1);
	_sSelector += '"]';
	// grab all id=footnote* elements, force display: none;
	jQuery(_sSelector).hide();
	audi_ngw.layer.unsetIE6Fix();
	// reset cached footnote
	_scope._$elLayer = null;
};

/**
 * Shows advice layer, bridge to _doShowAnimated
 * @method showAnimated
 * @param {Event} Event
 * @return {Void}
 */
audi_ngw.layer.advice.showAnimated = function(event){
	if (audi_ngw.animation.getRunning(audi_ngw.layer.advice.__className) === true) {
		return;
	}
	event.preventDefault();
	audi_ngw.animation.setRunning(audi_ngw.layer.advice.__className);
	audi_ngw.layer.advice._doShowAnimated(event,event.target);
//	audi_ngw.layer.advice._doShowAnimated(this);
};

/**
 * Shows advice layer using animation slideDown
 * @method _doShowAnimated
 * @param {HTMLElement} 
 * @return {Void}
 * @private
 */
audi_ngw.layer.advice._doShowAnimated = function(event,element){
	// cache scope
	var _scope = audi_ngw.layer.advice;	
	// hide exisitng footnote
	if (_scope._$elLayer) {
		_scope._$elLayer.hide();
	}
	
	// cache jQuery object
	var $element = jQuery(element);
	var _sHref = ($element.get(0).tagName.toLowerCase() === 'a') ? $element.attr('href').split('#')[1] : $element.parents('a').eq(0).attr('href').split('#')[1];

	
	// construct selector for footnote div to show - find by href="#ID";
	var _sSelector = '#';
	_sSelector += _sHref;
	var $elFootnote = jQuery(_sSelector);
	var _useXHR = false;
	if (!$elFootnote.size()) {
		$elFootnote = jQuery(_scope._sHTMLFootnote)
			.clone(true)
			.attr('id',$element.attr('href').split('#')[1])
			.audi_setLoading()
			.appendTo("#audi_content_wrapper")
			.find('img.close')
			// add click event "close"
			.bind('click.layerAdvice',_scope.layerHideAnimated)
			.end();
			_useXHR = true;
	}

	_scope._$elLayer = $elFootnote;
	// decide if this element should be displayed above a modal layer
	var _isModal = ($element.parents('#audi_modal_body').size()) ? true : false;

	// get position for advice layer
	var _oPos = _scope._calculatePosition(event,$element,_isModal);

	// set start position, animate
	//_scope.
		$elFootnote
		.css({
			visibility: 'hidden',
			display: 'block',
			left: _oPos.sLeft, // _iLeft+'px',
			bottom: _oPos.sBottom //( $elWrapperHeight - _oPos.top  + _scope._options.iAdvideLayerOffsetY) +'px'
		});
	// set ie fix: add an iframe below this element to prevent <select> bleeding through
	audi_ngw.layer.setIE6Fix(_scope._$elLayer,{top:'',right:'',bottom:_oPos.sBottom,left:_oPos.sLeft} , _isModal);

	//_scope.
	$elFootnote
		.css({
			display:'none',
			visibility: 'visible'
		})
		.slideDown(300, function(){
			if (_useXHR === true) {
				//console.log("URL",$element.attr('href').split('#')[0])
				jQuery.get($element.attr('href').split('#')[0],{},function(html){
						$elFootnote.find('.ajax_content').replaceWith(html);
						// set iframe height to match xhr-content height 
						audi_ngw.layer.setIE6FixResize($elFootnote);
					}
				);
			}
			audi_ngw.animation.onComplete(audi_ngw.layer.advice.__className);
		});
};



/**
 * Returns new position for the advice element in relation to link position
 * @method _calculatePosition
 * @param {Object} $element (Link)
 * @return {Object} sLeft , sBottom
 * @private
 */
audi_ngw.layer.advice._calculatePosition = function (event,$element,isModal) {

	// cache scope
	var _scope = audi_ngw.layer.advice;	
	
	var _sIdWrapper = (isModal) ? "#audi_modal_body" :  _scope._options.sIdWrapper;
	
	//console.log("WRAPPER: ",_sIdWrapper);
	
	// cache wrapper height 
	var $elWrapperHeight = jQuery(_sIdWrapper).outerHeight();
	var $elWrapperOffsetTop = jQuery(_sIdWrapper).offset().top;
	
	// get link position
//	var _oLinkPos = $element.position();
	var _oLinkPos = {
		left: event.pageX,
		top: event.pageY
	};

	// calculate left related to link
//	var _iElementTotalWidth = _scope._$elLayer.outerWidth();
	var _left = $element.position().left + _scope._options.iAdvideLayerOffsetX;
	_left += 'px';
	// calculate bottom related to link
//	var _bottom  = $elWrapperHeight - _oLinkPos.top  + _scope._options.iAdvideLayerOffsetY;
	var _bottom  = $elWrapperHeight + $elWrapperOffsetTop - _oLinkPos.top  + _scope._options.iAdvideLayerOffsetY;
	_bottom  += 'px';

	return {
		sLeft:_left ,
		sBottom:_bottom
	};
};

/**
 * Custom Event: wil be fired as soon as we filled the ajax-content into the modal layer, just before "xhrReallocate"
 * @param {Object} event
 * @param {Object} xhr
 */
audi_ngw.layer.advice.onAjaxModalContentReady = function(event,xhr){
	// check if this xhr-response contains valid content
	if (!audi_ngw.url.hasXHRContent(xhr,event.timeStamp)) {return false;}
	//audi_ngw.log("EVENT - ajaxModalContentReady: audi_ngw.layer.advice.onAjaxModalContentReady",arguments);
	// execute funtions on new content
	audi_ngw.layer.advice._setUp(audi_ngw.url.getContentId());
	
	// trigger event 
	audi_ngw.event.trigger('ajaxModalContentPrepared');
};

/**
 * Custom Event: wil be fired as soon as we injected the xhr-snippet 
 * @param {Object} event
 * @param {Object} data {sId: new HTML parent Id}
 */
audi_ngw.layer.advice.onAjaxSnippetReady = function(event,data){
 
	//audi_ngw.log("EVENT - ajaxSnippetPrepared: audi_ngw.layer.advice.onAjaxSnippetReady ",arguments);

	// execute funtions on new content
 	audi_ngw.layer.advice._setUp(data.sId.slice(1));
 	
	// trigger event 
	audi_ngw.event.trigger('ajaxSnippetPrepared');
};
 
/**
 *Initialize advice layer
 * @method initialize
 * @constructor
 * @param {Object} Options 
 * @return {Void}
 */
audi_ngw.layer.advice.initialize = function(options){
	
	this.__className =  'audi_ngw.layer.advice';
	this.__classVersion= '1.4';
	
	this._$elLayer = null;
	this._oReqGetAll = {
		sType: 'GET',
		sUrlBase : audi_ngw.config.sURLGetAllFootnotesBase,
		sUrlSuffix : audi_ngw.config.sURLGetAllFootnotesSuffix,
		sUrlDivider : audi_ngw.config.sURLGetAllFootnotesDivider
	};
	this._aMissingFootnotes = [];
	options = 	{
			sIdWrapper:'audi_container_main',
			sSrcAdviceMarker: ''+audi_ngw.docroot+'img/advice/advice_marker.png',
			sIdAdviceMarker: 'audi_template_d_advice_marker',
			sCNAdviceLayer: 'audi_template_d',
			sIdSliceAdviceLayer: 'footnote',
			sHTMLIconClose: '<img src="'+audi_ngw.docroot+'img/advice/icon_close_advice_layer.gif" class="close" width="11" height="11" alt="close layer" />',
			iAdvideMarkerOffsetX: 18,
			iAdvideMarkerOffsetY: 17,
			iAdvideLayerOffsetX: -40,
			iAdvideLayerOffsetY: 10
		};
	this._options = {};
	this._options.sIdWrapper =  '#'+options.sIdWrapper;
	this._options.sIdAdviceMarker =  '#'+options.sIdAdviceMarker;
	this._options.sCNAdviceLayer =  '.'+options.sCNAdviceLayer;
	this._options.sSrcAdviceMarker = options.sSrcAdviceMarker;
	this._options.sIdSliceAdviceLayer = '#'+options.sIdSliceAdviceLayer;
	this._options.sHTMLIconClose = options.sHTMLIconClose;
	this._options.iAdvideMarkerOffsetX = options.iAdvideMarkerOffsetX;
	this._options.iAdvideMarkerOffsetY = options.iAdvideMarkerOffsetY;
	this._options.iAdvideLayerOffsetX = options.iAdvideLayerOffsetX;
	this._options.iAdvideLayerOffsetY = options.iAdvideLayerOffsetY;
	this._sHTMLFootnote = '<div class="audi_template_d advice has_audi_generated_corners" id="" style="display: none; position: absolute;"><div class="audi_generated_corners_background"><span class="audi_generated_top"><span class="generated_right"></span><span class="generated_middle"></span><span class="generated_left"></span></span><img width="11" height="11" alt="close layer" class="close" src="/img/advice/icon_close_advice_layer.gif"/><div class="ajax_content" style="text-align: center;"><img src="'+audi_ngw.docroot+'img/preloader_modal.gif" height="30" width="30" style="padding: 20px; text-align: center;"/></div><span class="audi_generated_bottom"><span class="generated_right"></span><span class="generated_middle"></span><span class="generated_left"></span></span></div></div>';
	this._setUp();
};


/**
 * Initialize 
 * @method initialize
 * @constructor
 * @param {Object} Options 
 * @return {Void}
 */
jQuery(document).ready(function(){
	audi_ngw.layer.advice.initialize({});
	// register ajaxModalContentReady event
	audi_ngw.event.bind('ajaxModalContentReady',audi_ngw.layer.advice.onAjaxModalContentReady);
	audi_ngw.event.bind('ajaxSnippetReady',audi_ngw.layer.advice.onAjaxSnippetReady);
	
});
