/*	Javascript universal prompter. Usage :
		var prompter1=new NC.prompter.set(obj);		// obj = object or object ID of the object to animate
		prompter1.step=xx;
		...
		NC.prompter.run('prompter1');
*/

if(typeof(NC)=='undefined') NC={};
NC.prompter= {

	nb:0,						// Nb of promter running, to allocate automatic IDs when required

	// Parameters set constructor
	set:function(obj) {

		// public parameters
		this.step=1;
		this.path=0;				// 0=vertical, 1=horizontal
		this.delay=40;				// Délai en msec, permet contrôler les basses vitesses de manière plus fluide
		this.continuous=false;		// True -> mouvement continu
		this.continuousSpace=0;		// Pour un mouvement continu : espace à laisser entre la dernière news et la première rebouclée
		this.pauseClassName='';			// Nom de class des élémenst sur lequels marquer une pause
		this.pauseDelay=3000;		// Durée de pause lorsque pauseClassName est positionné

		// Private vars
		this.init=false;
		this.stop=false;
		this.pos=0;
		this.content_size=0;
		this.container_size=0;
		this.obj=obj;
		this.offsets=new Array();	// offset des objets provoquant une pause
		this.offset=0;				// pointeur courant dans offsets[]
		this.restart=new Array;		// prompter restart required
	},

	/* main entry
	 * pname=name of a parameters block, obj=object or object ID to prompt
	 */ 
	
	run:function(pname) {
		var params=eval(pname);
		if(params) {
			var path=params.path, obj=params.obj;

			// Initialisation (first display or restart)
			if(!params.init) {
				if(typeof(obj)=='string') {
					objID=obj;
					obj=document.getElementById(obj);
					params.obj=obj;
				}
				else {
					if(!obj.id) obj.id='NC-prompter-'+params.nb++;
					objID=obj.id;
				}

				// Identification des offsets des éléments déclanchant une pause
				var trailer=document.getElementById(objID+'-trailer');
				if(trailer) trailer.innerHTML='';
				if(params.pauseClassName) params.offsets=this.getOffsets(obj, params.pauseClassName);

				// Arrêt du défilement au mouseover, sauf sur un Pad
				var	nav=navigator.userAgent.toLowerCase();
				if(nav.indexOf('iphone;')==-1 && nav.indexOf('ipad;')==-1) {
					obj.onmouseover= function() { eval(pname).stop=true };
					obj.onmouseout= function() { eval(pname).stop=false };
				}

				if(path) obj.style['whiteSpace']='nowrap';
				params.container_size=document.getElementById(objID+'-wrapper')[path? 'offsetWidth' : 'offsetHeight'];
				params.content_size=obj[path? 'offsetWidth' : 'offsetHeight'];
				if(params.continuous && params.content_size>params.container_size) {
					if(trailer) trailer.innerHTML=obj.innerHTML;
					else obj.innerHTML+='<div style="'
						+ (path? 'display:inline;padding-left:' : 'padding-top:') + params.continuousSpace + 'px" '
						+ 'id="' + objID + '-trailer">'
						+ obj.innerHTML
						+ '</div>'
					;
				}
				params.pos=params.step;		// Permet d'analyser le démarrage comme un passage par 0
				params.init=true;
			}

			// Scroll
			var delay=params.delay, restart=true;
			if(!params.stop && params.content_size>params.container_size) {
				var pos=params.pos, nextpos=pos-params.step;
				if(nextpos<0 && nextpos <= -params.content_size) nextpos= params.continuous? params.continuousSpace : params.container_size;
				// Pause ?
				var what=path ? 'left' : 'top';
				if(params.offsets.length) {
					restart=false;
					var distance=nextpos+params.offsets[params.offset][what];
					if(distance<=0 && params.step>-distance) {
						if(params.offset==0) restart=true;
						nextpos=-params.offsets[params.offset++][what];
						delay=params.pauseDelay;
						if(params.offset>=params.offsets.length) params.offset=0;
					}
				}
				params.obj.style[what]=nextpos+'px';
				params.pos=nextpos;
			}

			// Restart required ?
			if(restart && params.restart.length) {
				params.init=false;
				// Add new className to object restart[0] ?
				while(params.restart.length) {
					var tomod=params.restart.shift();
					if(tomod[0] && tomod[1]) {
						var target=document.getElementById(tomod[0]);
						if(target) NC.tools.changeClass(target, tomod[1])
					}
				}
			}

			// Next step
			setTimeout("NC.prompter.run('" + pname + "')",delay);

		}
	},


	/* Restart the prompter when its offset is 0
	 * this function is called by applications modifying the prompter contents on the fly
	 * if container is specified, className will be applied to this object. Use it to turn container to visible after it has been updated
	 */
	restart:function(pname, container, className) {
		var params=eval(pname);
		if(typeof(container)=='undefined') var container='';
		if(typeof(className)=='undefined') var className='';
		if(params) params.restart[params.restart.length]=new Array(container, className);
	},


	// Lecture des offsets des éléments dont le nom de class=cname
	getOffsets:function(obj,cname,offsets, offset) {
		if(!offsets) var offsets=new Array();
		if(obj.nodeType!=3) {
			var	child=obj.childNodes,
				left, top
			;
			if(obj.nodeType==1 && obj.className && obj.className==cname) offsets[offsets.length]={ left:obj.offsetLeft, top:obj.offsetTop};
			for(var i=0;i<child.length;i++) offsets=this.getOffsets(child[i], cname, offsets);
		}
		return offsets;
	}

}

