//--------------------------------------------//
// ADG javascript panorama and aspect viewer. //
//      Albatross Design Group.  22/02/2006   //
//--------------------------------------------//

// createPanorama (width,height,url,vel)
// createAspect   (width,height,url,vel)
//
// width  - window width 
// height - window height 
// url    - url of pnoramic/aspect image 
// vel    - initial velocity (optional)

var interval    = 20;	 // redraw interval ms
var sensitivity = 0.1; // mouse sensitivity

function createPanorama(width,height,url,vel) {
	return createObject  (width,height,url,vel,0);
}

function createAspect  (width,height,url,vel) {
	return createObject  (width,height,url,vel,1);
}

function createObject(width,height,url,vel,aspect) {
  var onload  = ' onload="ADGLoad(this,'+width+','+height+',\''+url+'\','+vel+','+aspect+');"' 
	var content = ''
	content	+= '<table cellspacing=0 cellpadding=0 border=0><tr>\n'
	if (!aspect)
	content	+= ' <td><img src="'+url+'" galleryimg="no"></td>\n'
	content	+= ' <td><img src="'+url+'" galleryimg="no"'+onload+'></td>\n'
	content	+= '</tr></table>\n'

	if (document.layers) {
		content = ''
			+'<ilayer'  
		  +' width="' +width +'"'
		  +' height="'+height+'"'
			+'>\n'	
			+' <layer'  
		  +'  width="' +width +'"'
		  +'  height="'+height+'"'
		  +'  clip="0,0,'+width+','+height+'"'
			+' >\n'	
			+'  <layer'  
		  +'   width="' +width +'"'
		  +'   height="'+height+'"\n'
			+'   onmouseover="ADGOver(this,'+width+','+height+',\''+url+'\','+aspect+');"\n'
			+'  >\n'	
			
			+ content
			
			+'  </layer>\n'	
			+' </layer>\n'	
			+'</ilayer>\n';	
	} else {
		content = ''
			+'<div style="position:relative;' 
			+' overflow:hidden;'
			+' width:'  + width +'px;'
			+' height:' + height+'px;'
			+'">\n'
			
			+' <div style="position:absolute;'
			+'  left:0px;top:0px;'
			+'  width:'  + width  +'px;'
			+'  height:' + height +'px;'
			+'  clip:rect(0px '+width +'px '+height+'px 0px);'
			+' ">\n'
			
			+'  <div style="position:absolute;left:0px;top:0px;'
			+'   width:'  +width +'px;'
			+'   height:' +height+'px;'
			+'   "\n'
			+' onmouseover="ADGOver(this,'+width+','+height+',\''+url+'\','+aspect+');"\n'
			+' ondragstart  ="return false;"'
			+' onselectstart="return false;"'
			+'   >\n'

			+ content
			
			+'  </div>\n'
			+' </div>\n'
			+'</div>\n'
	}		
	document.write(content);
}

function ADGMouse(e) {
	if (!e) e=window.event;  if (!e) return [0,0]; 
	if (typeof(e.pageX  )=='number') return [e.pageX  ,e.pageY  ];
	if (typeof(e.clientX)=='number') return [e.clientX,e.clientY];
	return [0,0]; 
}

function ADGLoad(layer,width,height,url,vel,aspect) {
	if (!vel)	return;	
	
	for (i=0; layer && i<5; i++) if (layer.parentNode) layer = layer.parentNode;
	if (!layer)	return; // NS4 not support parentNode, so NS4 has not initial velocity.
	
	if (!window.ADGLayer) window.ADGLayer	= new Array;	
	layer.index = window.ADGLayer.length;
	window.ADGLayer[layer.index] = layer;
	
	ADGOver(layer,width,height,url,aspect);

	layer.curVelocity	= [-60*vel,0];
	layer.curTimer		= window.setInterval("onTimer("+layer.index+")",interval);
}

function ADGOver(layer,width,height,url,aspect) {
	if (window.curTimer) return true;
	if (layer.captureEvents) layer.captureEvents(Event.MOUSEDOWN); 
	layer.onmousedown=ADGStart;
	layer.aspect = aspect;
	window.curLayer	= layer;
	
	if (!layer.curImage) {
		layer.curWidth  = width;
		layer.curHeight = height;
		layer.curImage  = new Image();
		layer.curImage.src = url;
	}	
	return false;
}

function ADGStart(e) {
	if (document.captureEvents) 
		document.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP); 
	
	window.storeMOUSEMOVE = document.onmousemove; 
	window.storeMOUSEUP		= document.onmouseup; 
	document.onmousemove  = ADGMove; 
	document.onmouseup    = ADGMove; 
	
	if (document.all||document.getElementById)
		document.body.style.cursor = "move";
	
	var layer = this;
	if (layer.setCapture) layer.setCapture();	
	
	layer.curVelocity	= [0,0];
	layer.curMouse		= ADGMouse(e);
	if (layer.curTimer) clearInterval(layer.curTimer); 
	window.curTimer		= window.setInterval("onTimer()",interval);
	return false;
}
	
function ADGMove(e){
	if (!window.curTimer) return true;
	
	layer = window.curLayer;  var ms = ADGMouse(e); 
	layer.curVelocity[0] = layer.curMouse[0]-ms[0]; 
	layer.curVelocity[1] = layer.curMouse[1]-ms[1]; 

	if (!e) e = window.event; 	
	if (e && e.type && e.type.toLowerCase()=='mouseup') { 
		if (document.all||document.getElementById) document.body.style.cursor = "";
		document.onmousemove = window.storeMOUSEMOVE; 
		document.onmouseup   = window.storeMOUSEUP; 
		if (document.releaseCapture) document.releaseCapture();
		if (window.curTimer) clearInterval(window.curTimer); window.curTimer = null;
	}
}

function onTimer(id) {
	if (id==null && !window.curTimer) return;
	var layer = id==null ? window.curLayer:window.ADGLayer[id];
	if (!layer) return;
	
	if (!layer.curOffset) layer.curOffset = [0,0];
	layer.curOffset[0] += sensitivity*layer.curVelocity[0];
	layer.curOffset[1] += sensitivity*layer.curVelocity[1];
	
	var x = layer.curOffset[0];
	var y = layer.curOffset[1];
	
	if (layer.curImage) {
		var w = layer.curImage.width;
		var h = layer.curImage.height;
		
		if (layer.aspect) { 
			x = 20*x; y = 0;
			if (w<layer.curWidth) x = 0; else {
				while (x<-w) x += w;
				while (x> 0) x -= w;
			}
			x -= x%layer.curWidth;
		} else {
			if (w<layer.curWidth ) x = 0; else {
				while (x<-w) x += w;
				while (x> 0) x -= w;
			}	
			if (h<layer.curHeight) y = 0;  else {
				h -= layer.curHeight;
				while (y<-h) y  =-h;
				while (y> 0) y  = 0;
			}	
			layer.curOffset[0] = x;
			layer.curOffset[1] = y;
		}		
	}	
	
	if (document.layers) {
		layer.left = x;
		layer.top  = y;
	} else {
		layer.style.left = x;
		layer.style.top  = y;
	}		
}

