var TipCollection = {};
TipCollection.collection = [];
TipCollection.layerConfig = {tagName: 'div',id: 'tip-layer', className: 'info', delta: {deltaX: 10, deltaY: 0}};

TipCollection.tipConfig = {element: {tagName: 'input', className: 'info'},event: 'click'};

TipCollection.addDefinition = function(defObj)
{
	if(defObj instanceof TipDefinition)
	{
		TipCollection.collection.push(defObj);
	}
}

TipCollection.getDefinitionFromKey = function(defK)
{
	var rtD = null;

	for(var i=0; i<TipCollection.collection.length; i++)
	{
		if(TipCollection.collection[i].getKey() == defK)
		{
			rtD = TipCollection.collection[i];
			break;
		}
	}

	return rtD;
}

TipCollection.displayTip = function(ev)
{
	if(window.Prototype)
	{
		var layer = $(TipCollection.layerConfig['id']);
		
		if(Object.isInitialized(layer))
		{
			var currentKey = Event.element(ev);
			
			var key;
			
			if(!!currentKey['name'])
			{
				key = currentKey['name'];
				/* Invalide en xhtml 1.1, ne plus utiliser */
			}
			if(!!currentKey.getAttribute('property'))
			{
				key = currentKey.getAttribute('property');
				/* Usage approprié ???? */
			}
			if(!!currentKey.getAttribute('data-tip'))
			{
				key = currentKey.getAttribute('data-tip');
				/* Attribut à préfixe réservé, compatible (X)HTML 5 */
			}
			
			if(Object.isInitialized(key))
			{
				if(key == 'portathd')
				{
					key = 'tip-porta-thd';
				}
				
				var currentInfo = TipCollection.getDefinitionFromKey(key);
				//alert(currentInfo)
				if(Object.isInitialized(currentInfo))
				{
					var layerInfo = currentInfo.getLayer();
					
					if(layerInfo != null)
					{
						if(Object.isInitialized(layerInfo['className']))
						{
							layer.className = layerInfo['className'];
						}
					}
					
					Element.removeAllNodes(layer);
					
					var closeObj = document.createElement('a');
					closeObj.setAttribute('href','javascript:TipCollection.hideTip()');
					closeObj.className = 'fermer';
					closeObj.appendChild(document.createTextNode('Fermer'));
					layer.appendChild(closeObj);
					
					var tit = document.createElement('h3');
					var titText = currentInfo.getTitle();
					var lnTit = String.getLinesFromText(titText);
					for(var i=0; i<lnTit.length; i++)
					{
						tit.appendChild(document.createTextNode(lnTit[i]));
						if(i != lnTit.length-1)
						{
							tit.appendChild(document.createElement('br'));
						}
					}
					layer.appendChild(tit);
					
					var paraC = currentInfo.getText();
					
					var contObj = document.createElement('div');

					if(paraC.length > 0)
					{
						var inner = contObj;
					
						if(layerInfo != null)
						{
							if(Object.isInitialized(layerInfo['innerContainer']))
							{
								try
								{
									inner = document.createElement(layerInfo['innerContainer']['tagName']);
									Element.addClassName(inner,layerInfo['innerContainer']['className']);
								}
								catch(e)
								{}
							}
						}
						
						for(var i=0; i<paraC.length; i++)
						{
							var pObj = document.createElement('p');
							
							if(Object.objectOfType(paraC[i],'string'))
							{
								var lnC = String.getLinesFromText(paraC[i]);

								for(var j=0; j<lnC.length; j++)
								{
									pObj.appendChild(document.createTextNode(lnC[j]));

									if(j != lnC.length-1)
									{
										pObj.appendChild(document.createElement('br'));
									}
								}
							}
							else if(Object.objectOfType(paraC[i],Array))
							{
								for(var j=0; j<paraC[i].length; j++)
								{
									var cToken = paraC[i][j];
									
									if(Object.objectOfType(cToken,'string'))
									{
										pObj.appendChild(document.createTextNode(cToken));
									}
									if(Object.objectOfType(cToken,Object))
									{
										if(Object.isInitialized(cToken['tagName']))
										{
											var cTag = document.createElement(cToken['tagName']);
											
											if(Object.isInitialized(cToken['attributes']) && Object.objectOfType(cToken['attributes'],Array))
											{
												var attr = cToken['attributes'];
												
												for(var k=0; k<attr.length; k++)
												{
													if(Object.isInitialized(attr[k]['name']) && Object.isInitialized(attr[k]['value']))
													{
														cTag.setAttribute(attr[k]['name'],attr[k]['value']);
													}
												}
											}
											if(Object.isInitialized(cToken['content']))
											{
												cTag.appendChild(document.createTextNode(cToken['content']));
											}
											
											pObj.appendChild(cTag);
										}
									}
								}
							}
							else if(Object.objectOfType(paraC[i],Object))
							{
								var cToken = paraC[i];
								if(Object.isInitialized(cToken['tagName']))
								{
									var cTag = document.createElement(cToken['tagName']);
									
									if(Object.isInitialized(cToken['attributes']) && Object.objectOfType(cToken['attributes'],Array))
									{
										var attr = cToken['attributes'];
										
										for(var k=0; k<attr.length; k++)
										{
											if(Object.isInitialized(attr[k]['name']) && Object.isInitialized(attr[k]['value']))
											{
												cTag.setAttribute(attr[k]['name'],attr[k]['value']);
											}
										}
									}
									if(Object.isInitialized(cToken['content']))
									{
										cTag.appendChild(document.createTextNode(cToken['content']));
									}
									
									pObj.appendChild(cTag);
								}
							}
							inner.appendChild(pObj);
						}
						
						if(inner != contObj)
						{
							contObj.appendChild(inner);
						}
					}
					
					layer.appendChild(contObj);
						
					/* Rustine retour home mag */
					if(!!window.Offre && !!Offre.config["mag"] && (key == 'tip-porta-thd'))
					{
						var lnkColl = Element.select(layer,'div a');

						lnkColl.each(function(cEl)
						{
							cEl.setAttribute('href','/redbox-frontoffice/mac-forwardAction.do');
						});
					}
					
					var winDim = document.viewport.getDimensions();
					
					var curPos = Window.getCursorWindowCoordinates(ev); //getCursorDocumentCoordinates(ev);
					var curDPos = Window.getCursorDocumentCoordinates(ev);
					var layerDim = layer.getDimensions();
					
					var layerCoordX = curPos.x+TipCollection.layerConfig['delta']['deltaX'];
					var layerCoordY = curPos.y+TipCollection.layerConfig['delta']['deltaY'];
					
					var layerDCoordX = curDPos.x+TipCollection.layerConfig['delta']['deltaX'];
					var layerDCoordY = curDPos.y+TipCollection.layerConfig['delta']['deltaY'];
					
					if(layerCoordX+layerDim['width'] > winDim['width'])
					{
						var fPosX = curDPos.x - (layerDim['width']+TipCollection.layerConfig['delta']['deltaX']);
						layerDCoordX = (fPosX > 0) ? fPosX : 0;
					}

					if(layerCoordY+layerDim['height'] > winDim['height'])
					{
						var fPosY = curDPos.y - (layerDim['height']+TipCollection.layerConfig['delta']['deltaY']);
						layerDCoordY = (fPosY > 0) ? fPosY : 0;
					}

					Element.setCoordinate(layer,layerDCoordX,layerDCoordY);
					layer.style.visibility = 'visible';
				}
			}
			
		}
	}
}

TipCollection.hideTip = function()
{
	var layer = $(TipCollection.layerConfig['id']);
		
	if(Object.isInitialized(layer))
	{
		layer.style.visibility = 'hidden';
	}
}

TipCollection.init = function()
{
	if(Object.isInitialized(window.tipConfig))
	{
		TipCollection.tipConfig = tipConfig;
	}
	
	var searchElement = TipCollection.tipConfig['element']['tagName'];
	
	if(Object.isInitialized(TipCollection.tipConfig['element']['className']))
	{
		searchElement += '.'+TipCollection.tipConfig['element']['className'];
	}
	
	var infoColl = Element.select(document,searchElement);
	
	infoColl.each(function(elem)
	{
		elem.observe(TipCollection.tipConfig['event'],TipCollection.displayTip);
	}
	);
	
	/* Construction et insertion du layer */
	var tipLayer = document.createElement(TipCollection.layerConfig['tagName']);
	tipLayer.id = TipCollection.layerConfig['id'];
	tipLayer.className = TipCollection.layerConfig['className'];
	document.getElementsByTagName('body').item(0).appendChild(tipLayer);
}

function TipDefinition(tipData)
{
	var _layer = null;
	var _key = '';
	var _title = '';
	var _text = new Array();
	
	for(var i in tipData)
	{
		if(i == 'layer')
		{
			_layer = tipData[i];
		}
		if(i == 'key')
		{
			_key = tipData[i];
		}
		if(i == 'title')
		{
			_title = tipData[i];
		}
		if(i == 'text')
		{
			//_key = tipData[i];
			var textAr = tipData[i];
			
			for(var j=0; j<textAr.length; j++)
			{
				_text.push(textAr[j]);
			}
		}
	}

	this.getLayer = function()
	{
		return _layer;
	}
	
	this.getKey = function()
	{
		return _key;
	}

	this.getTitle = function()
	{
		return _title;
	}

	this.getText = function()
	{
		return _text;
	}
}

if(window.Prototype)
{
	document.observe('dom:loaded',TipCollection.init);
}
