/************************************************* 

 *      Version light de Yajev : Yaj3v :         * 

 * Yet Another JavaScript Virtual Visit Viewer   *

 *                                               *

 * Documentation et aide disponible sur mon site *

 *	- Site Web : http://astre.henri.free.fr      *

 *	- Développé par Henri ASTRE                  *

 *	                                             *

 *************************************************/



/***************************

 *	Définition de YajevLE  *

 ***************************/ 



function YajevLE(identifiant) 

{	

	// variables de YajevLE

	this.pic           = "url(pano/pano0.jpg)"; // nom du fichier image sous la forme url(pano/pano0.jpg)

	this.width         = 640;                   // largeur du panorama (pas du fichier jpeg)

	this.height        = 480;                   // hauteur du panorama (pas du fichier jpeg)

	this.identifiant   = identifiant;           // identifiant du div contenant le panorma

	this.dec           = 0;                     // decalage initial du panorama

	this.stepSize      = 20;                    // pas de decalage en pixel

	this.quickness     = 40;                    // intervalle de temps entre chaque decalage en ms

	this.panoWidth     = 5200;                  // largeur du panorama en pixel (recalculé automatiquement)

	this.panoHeight    = 480;                   // hauteur du panorama en pixel (recalculé automatiquement)

	this.actif         = 0;

	this.angle         = 0;                     // angle correspondant à la rotation du panorama

	this.autoRotate    = false;

	this.div           = FindID(identifiant);   // div qui contient le panorama

	this.mouseX        = 0;

	this.maxSpeed      = 2;

	this.loaded        = false;

	this.tabLoad       = new Array();

	

	//méthodes de YajevLE

	this.getCssProperty   = YajevLE_getCssProperty; // permet d'initialiser YajevLE avec les propriétés CSS

	this.refresh          = YajevLE_refresh;        // permet de déplacer le panorama et de 

	this.startMoveLeft    = YajevLE_startMoveLeft;  // permet de lancer moveLeft  à intervalle régulier

	this.startMoveRight   = YajevLE_startMoveRight; // permet de lancer moveRight à intervalle régulier

	this.moveLeft         = YajevLE_moveLeft;       // permet de déplacer le panorama vers la gauche

	this.moveRight        = YajevLE_moveRight;      // permet de déplacer le panorama vers la droite

	this.stopMove         = YajevLE_stopMove;       // permet de stopper le mouvement du panorama

	this.getAngle         = YajevLE_getAngle;       // permet de récupérer l'angle correspondant à la rotation du panorama

	this.setAngle         = YajevLE_setAngle;       // permet de faire tourner le panorama d'un certain angle

	this.setQuickness     = YajevLE_setQuickness;   // permet de spécifier l'intervalle de temps en ms entre chaque déplacement du panorama (réglage de la fluidité)

	this.setStepSize      = YajevLE_setStepSize;    // permet de spécifier de combien de pixel se déplace le panorama à chaque déplacement

	this.getPanoWidth     = YajevLE_getPanoWidth;   // donne la largeur du fichier image du panorama 

	this.getPanoHeight    = YajevLE_getPanoHeight;  // donne la hauteur du fichier image du panorama

	this.getWidth         = YajevLE_getWidth;       // donne la largeur du div de la zone panoramique

	this.getHeight        = YajevLE_getHeight;      // donne la hauteur du div de la zone panoramique

	this.getShift         = YajevLE_getShift;

	this.setShift         = YajevLE_setShift;

	this.getStepSize      = YajevLE_getStepSize;	

	this.getQuickness     = YajevLE_getQuickness;

	this.setAutoRotate    = YajevLE_setAutoRotate;

	this.setMaxSpeed      = YajevLE_setMaxSpeed;

	this.getMousePos      = YajevLE_getMousePos;

	this.addElementToLoad = YajevLE_addElementToLoad;

	this.buildHtml        = YajevLE_buildHtml;

	this.launch           = YajevLE_launch;

	this.tryLaunch        = YajevLE_tryLaunch;	

	this.destroy          = YajevLE_destroy;

	this.getCssProperty();

}



/***************************

 *	méthodes de YajevLE    *

 ***************************/ 



function YajevLE_addElementToLoad(type, variable) {

	this.tabLoad.push({t: type, v: variable});

}



function YajevLE_buildHtml() {

	this.scrollWidth = this.width/3;

	this.div.innerHTML  = '<div id="'+this.identifiant+'scrollLeft" onmousemove=\"'+this.identifiant+'.getMousePos(event);\" onmouseover=\"'+this.identifiant+'.startMoveLeft();\"  onmouseout="'+this.identifiant+'.stopMove();" style=\"float: left;  height: '+this.height+'px; width: '+this.scrollWidth+'px; margin-bottom: 0px;\"></div>';

	this.div.innerHTML += '<div id="'+this.identifiant+'scrollRight" onmousemove=\"'+this.identifiant+'.getMousePos(event);\" onmouseover=\"'+this.identifiant+'.startMoveRight();\" onmouseout="'+this.identifiant+'.stopMove();" style=\"float: right; height: '+this.height+'px; width: '+this.scrollWidth+'px; margin-bottom: 0px;\"></div>';

	

	var scrollLeft = FindID(this.identifiant+'scrollLeft');

	//this.scrollLeftOffset  = scrollLeft.offsetLeft; 

	this.scrollLeftOffset = 0;



	while (scrollLeft.offsetParent){

		this.scrollLeftOffset += scrollLeft.offsetLeft;

		scrollLeft     = scrollLeft.offsetParent;

	}



	var scrollRight = FindID(this.identifiant+'scrollRight');

	//this.scrollRightOffset  = scrollRight.offsetLeft; 

	this.scrollRightOffset = 0;



	while (scrollRight.offsetParent){

		this.scrollRightOffset += scrollRight.offsetLeft;

		scrollRight     = scrollRight.offsetParent;

	}

}



function YajevLE_launch()

{

	var local_this = this;

	if (arguments.length > 0)

		local_this.actif = setInterval(function(){local_this.tryLaunch(1);}, local_this.quickness); 	

	else

		local_this.actif = setInterval(function(){local_this.tryLaunch();}, local_this.quickness); 

}



function YajevLE_tryLaunch()

{

	for (var i=0; i<this.tabLoad.length; ++i) 

	{	

		switch (this.tabLoad[i].t)

		{

			default :

			case 'pic': if (this.tabLoad[i].v.complete == false) return false; 

						 break;

			case 'var': if (this.tabLoad[i].v == false) return false;

						 break;

		}

	}

	this.panoWidth  = this.pano.width;

	this.panoHeight = this.pano.height;

	if (arguments.length == 0)

		this.buildHtml();

	this.loaded = true;

	clearInterval(this.actif);

	this.refresh();	

}



function YajevLE_getCssProperty() {

	this.width  = parseInt(this.div.style.width);

	this.height = parseInt(this.div.style.height);

	

	if (this.div.style.backgroundPosition) 

		this.dec = parseInt(this.div.style.backgroundPosition); 

	else 

		this.dec = 0;

		

	var panoUrl   = extractUrl(this.div.style.backgroundImage);

	this.pano     = new Image;

	this.pano.src = panoUrl; 

	this.addElementToLoad('pic',this.pano);

}



function YajevLE_refresh() {

	if (this.loaded)

		this.angle = (360 - (this.dec * 360 / this.panoWidth)) % 360;

	this.div.style.backgroundPosition = this.dec+'px 0px';

	if (this.onstatechange)

		this.onstatechange();

}



function YajevLE_startMoveLeft() {

	if (this.autorotate)

		return;

		

	if (arguments.length > 0) {

		var speed = arguments[0];

		var local_this = this;

		local_this.actif = setInterval(function(){local_this.moveLeft(speed);}, local_this.quickness); 

	}

	else {

		var local_this = this;

		local_this.actif = setInterval(function(){local_this.moveLeft();}, local_this.quickness); 

	}

} 



function YajevLE_startMoveRight() {

	if (this.autorotate)

		return;



	if (arguments.length > 0) {

		var speed = arguments[0];

		var local_this = this;

		local_this.actif = setInterval(function(){local_this.moveRight(speed);}, local_this.quickness); 

	}

	else {

		var local_this = this;

		local_this.actif = setInterval(function(){local_this.moveRight();}, local_this.quickness); 

	}

}



function YajevLE_moveLeft() {

	if (arguments.length > 0) 

		var speed = arguments[0];

	else {

		var relativeX = this.mouseX - this.scrollLeftOffset;

		var speed = (1-relativeX/this.scrollWidth)*this.maxSpeed;

	}

	this.dec = parseInt((this.dec + this.stepSize*speed + this.panoWidth) % this.panoWidth);

	this.refresh();

}



function YajevLE_moveRight() {

	if (arguments.length > 0) 

		var speed = arguments[0];

	else {

		var relativeX = this.mouseX - this.scrollRightOffset;

		var speed = (relativeX/this.scrollWidth)*this.maxSpeed;

	}

	this.dec = parseInt((this.dec - this.stepSize*speed + this.panoWidth) % this.panoWidth);

	this.refresh();

}



function YajevLE_stopMove() {

this.autorotate = false;

	clearInterval(this.actif);

}



function YajevLE_getAngle() {

	return this.angle;

}   



function YajevLE_setAngle(angle) {

	this.angle = angle;

	this.dec = Math.round(this.panoWidth * angle / 360);

	this.refresh();

}



function YajevLE_setQuickness(quickness) {

	this.quickness = quickness;

}



function YajevLE_setStepSize(stepSize) {

	this.stepSize = stepSize;

}



function YajevLE_getPanoWidth() {

	return this.panoWidth;

}



function YajevLE_getPanoHeight() {

	return this.panoHeight;

}



function YajevLE_getWidth() {

	return this.width;

}



function YajevLE_getHeight() {

	return this.height;

}



function YajevLE_getShift() {

	return this.dec;

}

function YajevLE_setShift(shift) {

	this.dec = shift;

	this.refresh();

}



function YajevLE_getQuickness(quickness) {

	return this.quickness;

}



function YajevLE_getStepSize(stepSize) {

	return this.stepSize;

}



function YajevLE_setAutoRotate(speed) {

	this.startMoveRight(speed,1);

}



function YajevLE_setMaxSpeed(speed) {

	this.maxSpeed = speed;

}



function YajevLE_getMousePos(e) {

	if (!e) { //IE  

		var e = window.event

	}

	if (e.pageX) { //Moz

		this.mouseX = e.pageX; 

	}

	else if (e.clientX) { //IE

		this.mouseX = e.clientX-2; 

	}

}



function YajevLE_destroy() {

	this.div.innerHTML = "";

}



/******************************************

 *	Ajout de fonctionnalités à YajevLE    *

 ******************************************/ 



YajevLE.prototype.loadPano     = YajevLE_loadPano;     // permet de changer l'image du panorama



function YajevLE_loadPano(panoUrl)

{

	this.loaded = false;

	this.div.style.backgroundImage = 'url('+panoUrl+')';

	this.pano = new Image;

	this.pano.src = panoUrl; 

	this.addElementToLoad('pic',this.pano);

	this.launch(1);

}



//permet de transformer "url(pano/pano0.jpg)" en "pano/pano0.jpg"

function extractUrl(strIn) {

	var strOut = strIn.substring(4,strIn.length-1);



	if (strOut.charAt(0) == '"') //Merci Opera... d'utiliser : url("pano/pano0.jpg") ;-(

		strOut = strOut.substring(1,strOut.length-1);

	

	return strOut;

}