//**************************************************************************************
// Dynamic truncate functions
// @parameter: String elt (container where we need truncate text)
// @require: 
//		* web page using these functions need include this css:
//				.textTroncatured {
//					width: 100%;
//					display: block;
//					visibility: hidden;
//					overflow: hidden;
//					text-overflow: ellipsis;
//					white-space: nowrap;
//				}
//				#textTroncaturedTemp {
//					position: absolute;
//					visibility: hidden;
//				}
//		* <div id="textTroncaturedTemp"></div> (write just after body tag)
//		* class="textTroncatured" (write in each container where we need truncate text. 
//				These container dont must contain html tag, because end tag can be delete during truncating)
//		* width of containers must be define in css (px or %)
//		* table-layout: fixed (if containers are in table, this table must be use this style)
// @return  This function doesn't return a value
// @date : 25/11/2005
// tested and supported by:
//		* windows XP SP2
//			* firefox 1.0.7
//			* internet explorer 6.0
// @author : Voxmobili, Laurent SALIERES
//**************************************************************************************
	var ns4 = document.layers;
	var op5 = (navigator.userAgent.indexOf("Opera 5")!=-1) 
		||(navigator.userAgent.indexOf("Opera/5")!=-1);
	var op6 = (navigator.userAgent.indexOf("Opera 6")!=-1) 
		||(navigator.userAgent.indexOf("Opera/6")!=-1);
	var op9 = (navigator.userAgent.indexOf("Opera/9")!=-1)
		|| (navigator.userAgent.indexOf("Opera 9")!=-1);
	var agt=navigator.userAgent.toLowerCase();
	var mac = (agt.indexOf("mac")!=-1);
	var ie = (agt.indexOf("msie") != -1); 
	var mac_ie = mac && ie;
	
	function getElementWidth(elt) {
		var paddingWidth = 0;
		try{paddingWidth += parseInt(elt.getStyle('paddingRight').replace("px",""))}catch(e){}
		try{paddingWidth += parseInt(elt.getStyle('paddingLeft').replace("px",""))}catch(e){}
		if (op5) {
			xPos = elt.style.pixelWidth - paddingWidth;
		} else {
			xPos = elt.offsetWidth - paddingWidth;
		}
		return xPos;
	}

	//wait for a cssRules described like that {fontSize:"font-size"} with only names
	function copyStyles(from,to, cssRules){
	    if(document.defaultView && document.defaultView.getComputedStyle){
	        var currentStyle = document.defaultView.getComputedStyle(from, "");
	        for(i in cssRules){
	        	to.style[i] = currentStyle.getPropertyValue(cssRules[i]);
	        }
	    }
	    else if(from.currentStyle){
	        for(i in cssRules){
	        	to.style[i] = from.currentStyle[i];
	        }
	    }
	}
Truncator = {
	init:function(elt){
		var container_temp = document.getElementById('textTroncaturedTemp');
		if(container_temp==null){
			// Add for Opera 9
			var body = document.body;
			var div = document.createElement("div");
			div.setAttribute("id", "textTroncaturedTemp");
			body.appendChild(div);
			// Replace for Opera 9 supported
			//document.body.innerHTML += "<div id=\"textTroncaturedTemp\"></div>";
			container_temp = document.getElementById('textTroncaturedTemp');
		}
		Selector.findChildElements(elt, ['.textTroncatured']).each(function(node){
			if(node.origHTML==null){
				node.origHTML = node.innerHTML;
				if(node.title == "" && !node.hasClassName('notitle'))node.title = DefaultErrorHandler.htmlToText(node.origHTML);
			}
		});
		this.truncate(elt);
	},
	truncate:function(elt){
		var container_temp = document.getElementById('textTroncaturedTemp');
		var needTruncation = Selector.findChildElements(elt, ['.textTroncatured']);
		var truncFunc = function(node){
			var width_max = getElementWidth(node);
			copyStyles(node,container_temp,{fontSize:"font-size",fontWeight:"font-weight",fontFamily:"font-family"});
			container_temp.innerHTML = node.origHTML;
			var width_init = getElementWidth(container_temp);
			if(width_init > width_max){
				var text_init = node.origHTML;
				var width_temp = width_init;
				var nb_char_removed_old = 0;
				var nb_char_removed = text_init.length;
				var delta = Math.abs(nb_char_removed);
				var status_troncature = true;
				while(!status_troncature || delta != 1){
					nb_char_removed_old = nb_char_removed;
					nb_char_removed += Math.ceil(delta/2) * ((status_troncature)?-1:1);
					delta = Math.abs(nb_char_removed_old - nb_char_removed);
					if(text_init.length >= nb_char_removed){
						container_temp.innerHTML =  text_init.substring(0, text_init.length - nb_char_removed)+" ...";
						width_temp = getElementWidth(container_temp);
						status_troncature = width_temp < width_max;
					}else{
						container_temp.innerHTML =  text_init.substring(0, 0)+" ...";
						status_troncature = true;
					}
				}
				node.innerHTML = text_init.substring(0, text_init.length - nb_char_removed)+" ...";
				node.hasChange = true;
			}else if(node.hasChange){
				node.innerHTML = node.origHTML;
				node.hasChange = false;
			}
			node.style.visibility = "visible";
		}
		needTruncation.splice(0,100).each(truncFunc);
		setTimeout(function(){needTruncation.each(truncFunc)},200)
	},
	truncateThis:function(elt){
		var container_temp = document.getElementById('textTroncaturedTemp');

		node = elt;

//		setTimeout(
//			function(node){
				var width_max = getElementWidth(node);
				copyStyles(node,container_temp,{fontSize:"font-size",fontWeight:"font-weight",fontFamily:"font-family"});
				container_temp.innerHTML = node.origHTML;
				var width_init = getElementWidth(container_temp);
				if(width_init > width_max){
					var text_init = node.origHTML;
					var width_temp = width_init;
					var nb_char_removed_old = 0;
					var nb_char_removed = text_init.length;
					var delta = Math.abs(nb_char_removed);
					var status_troncature = true;
					while(!status_troncature || delta != 1){
						nb_char_removed_old = nb_char_removed;
						nb_char_removed += Math.ceil(delta/2) * ((status_troncature)?-1:1);
						delta = Math.abs(nb_char_removed_old - nb_char_removed);
						if(text_init.length >= nb_char_removed){
							container_temp.innerHTML =  text_init.substring(0, text_init.length - nb_char_removed)+" ...";
							width_temp = getElementWidth(container_temp);
							status_troncature = width_temp < width_max;
						}else{
							container_temp.innerHTML =  text_init.substring(0, 0)+" ...";
							status_troncature = true;
						}
					}
					node.innerHTML = text_init.substring(0, text_init.length - nb_char_removed)+" ...";
					node.hasChange = true;
				}else if(node.hasChange){
					node.innerHTML = node.origHTML;
					node.hasChange = false;
				}
				node.style.visibility = "visible";
//			}, 200);
	}

}

// 
//if(ie){
//	Truncator.init = function(elt){
//		Selector.findChildElements(elt, ['.textTroncatured']).each(function(node){
//			if(node.title == "" && !node.hasClassName('notitle')){
//				node.title = DefaultErrorHandler.htmlToText(node.innerHTML);
//			}	
//		});
//	}
//	Truncator.truncate = Prototype.emptyFunction;
//	Truncator.truncateThis = Prototype.emptyFunction;
//}

window.onloadpassive = EventConcat( function(event,obj){Truncator.init(obj || document.body);}, window.onloadpassive);
window.onresize = function(){Truncator.truncate(document.body);}
