
/**
 * Script de mise en colonnes
 * 
 * @author Roland Dufour <roland@rentashop.fr> pour Rentashop eCommerce
 */

var RSPlug_Cols = function (element, json, options){
	if (null === options || undefined === options){
		options = {};
	}
	this._config = { 
		cols: 0,
		allowCutBlock: false,
		allowCutFirstLineNiv1: false,
		allowCutFirstLineNiv2: false,
		optimizeCutting: false,
		lineHeightNiv1: 1.5,
		lineHeightNiv2: 1,
		dontCutIfNumberOfRemainingLinesIs: 1,
		niv1Element: 'h2',
		niv1ClassName: 'niv1',
		niv2ClassName: 'niv2',
		noLinkNiv1IfNiv2: false,
		colContainerClassName: 'colsContainer',
		colClassName: 'col',
		colClassNameNumber: 'col-num[col_index]',
		prepend: '',
		append: '',
		setColHeight: false,
		alphaMode: false	// Crée des niveaux 1 automatiquement avec l'initiale du lien 
	};
	for (var optName in options){
		if (null !== this._config[optName] && undefined !== this._config[optName]){
			this._config[optName] = options[optName];
		}
	}

	if (typeof element == 'string'){
		element = document.getElementById(element);
	}
	if (element){
		var colsContainer = document.createElement('div');
		colsContainer.className = this._config.colContainerClassName;
		element.parentNode.insertBefore(colsContainer, element);
		element.parentNode.removeChild(element);
		this.generate(colsContainer, (this._config.alphaMode ? this.toAlphaMode(json) : json));
	}
};

RSPlug_Cols.prototype.toAlphaMode = function (links){
	var new_links = [];
	var initiales = '';
	for (var i=0; i<links.length; i++){
		if (links[i]){
			var initiale = links[i].linkName.replace(/^\s+/, '').replace(/\s+$/, '').substr(0, 1).toLowerCase();
			if (initiale != ''){
				var posInitiale = initiales.indexOf(initiale);
				if (posInitiale == -1){
					initiales += ''+initiale;
					if (initiale == '&'){
						initiale = '&amp;'; // Evite un bug IE dû aux entites html commencant pas un &
					}
					new_links.push({ linkName: initiale, linkUrl: '#', linkChilds: [] });
					posInitiale = new_links.length -1;
				}
				new_links[posInitiale].linkChilds.push(links[i]);
			}
		}
	}
	return new_links;
};

RSPlug_Cols.prototype.generate = function (bigSubMenu, links){
	bigSubMenu.innerHTML = this._config.prepend;
	var nbLinks = 0;
	var nbLinksNiv1 = 0;
	for (var i=0; i<links.length; i++){
		nbLinksNiv1++;
		if (links[i].linkChilds){
			nbLinks += links[i].linkChilds.length;
		}
	}
	
	var remaining = ((nbLinksNiv1 * this._config.lineHeightNiv1) + (nbLinks * this._config.lineHeightNiv2));
	var cutAfter = null;
	if (this._config.cols > 0){
		cutAfter = Math.ceil(remaining / this._config.cols);
	}
	
	var cols = 1;
	var colsArray = [];
	var col = document.createElement('div');
	colsArray.push(col);
	col.className = this._config.colClassName + ' ' + this._config.colClassNameNumber.replace('[col_index]', cols);;
	var counter = 0;
	var maxCounter = 0, maxColHeight = 0;
	for (var i=0; i<links.length; i++){
		var nbLinkChilds = links[i].linkChilds ? links[i].linkChilds.length : 0;
		if (null !== cutAfter && counter > 0 && cols < this._config.cols && (this._config.allowCutFirstLineNiv1 || counter >= cutAfter || (this._config.optimizeCutting && nbLinkChilds > 0 && (remaining <= maxCounter || (counter + this._config.lineHeightNiv1 + this._config.lineHeightNiv2) > (maxCounter > cutAfter ? maxCounter : cutAfter))))){
			bigSubMenu.appendChild(col);
			cols++;
			if (col.offsetHeight && col.offsetHeight > maxColHeight){
				maxColHeight = col.offsetHeight;
			}
			var col = document.createElement('div');
			colsArray.push(col);
			col.className = this._config.colClassName + ' ' + this._config.colClassNameNumber.replace('[col_index]', cols);
			if (counter > maxCounter){
				maxCounter = counter;
			}
			counter = 0;
		}
		
		var linkContainer = document.createElement(this._config.niv1Element);
		linkContainer.className = this._config.niv1ClassName;
		if (!this._config.alphaMode && (!this._config.noLinkNiv1IfNiv2 || nbLinkChilds == 0)){
			var link = document.createElement('a');
			link.href = links[i].linkUrl;
			link.innerHTML = links[i].linkName;
			if (null !== links[i].linkClass && undefined !== links[i].linkClass && '' != links[i].linkClass){
				linkContainer.className = links[i].linkClass;
			}
		} else {
			var link = document.createElement('span');
			link.innerHTML = links[i].linkName;
			if (null !== links[i].linkClass && undefined !== links[i].linkClass && '' != links[i].linkClass){
				linkContainer.className = links[i].linkClass;
			}
		}
		linkContainer.appendChild(link);
		col.appendChild(linkContainer);
		counter += this._config.lineHeightNiv1;
		remaining -= this._config.lineHeightNiv1;
		
		if (nbLinkChilds > 0){
			var subLinks = document.createElement('ul');
			subLinks.className = this._config.niv2ClassName;
			for (var j=0; j<nbLinkChilds; j++){
				if (this._config.allowCutBlock &&  counter > cutAfter && (this._config.allowCutFirstLineNiv2 || (!this._config.allowCutFirstLineNiv2 && j > 0)) && cols < this._config.cols){
					if (!this._config.optimizeCutting || ((nbLinkChilds -j) > this._config.dontCutIfNumberOfRemainingLinesIs && (nbLinkChilds -j <= this._config.dontCutIfNumberOfRemainingLinesIs || counter >= maxCounter))){
						col.appendChild(subLinks);
						bigSubMenu.appendChild(col);
						cols++;
						if (col.offsetHeight && col.offsetHeight > maxColHeight){
							maxColHeight = col.offsetHeight;
						}
						var col = document.createElement('div');
						colsArray.push(col);
						col.className = this._config.colClassName + ' ' + this._config.colClassNameNumber.replace('[col_index]', cols);;
						var subLinks = document.createElement('ul');
						subLinks.className = this._config.wideMenuNiv2ClassName;
						if (counter > maxCounter){
							maxCounter = counter;
						}
						counter = 0;
					}
				}
				
				var liLink = document.createElement('li');
				var subLink = document.createElement('a');
				subLink.href = links[i].linkChilds[j].linkUrl;
				subLink.innerHTML = links[i].linkChilds[j].linkName;
				liLink.appendChild(subLink);
				subLinks.appendChild(liLink);
				counter += this._config.lineHeightNiv2;
				remaining -= this._config.lineHeightNiv2;
			}
			col.appendChild(subLinks);
		}
	}
	bigSubMenu.appendChild(col);
	if (col.offsetHeight && col.offsetHeight > maxColHeight){
		maxColHeight = col.offsetHeight;
	}
	
	if (this._config.setColHeight){
		for (var i=0; i<colsArray.length; i++){
			colsArray[i].style.height = maxColHeight +'px';
		}
	}
	
	if (this._config.append != ''){
		bigSubMenu.innerHTML += this._config.append;
	}
};

