﻿// x.js
// X v3.10-mjk, Cross-Browser DHTML Library from Cross-Browser.com
// Copyright (c) 2002,2003 Michael Foster (mike@cross-browser.com)
// This library is distributed under the terms of the LGPL (gnu.org)
// Variables:
var xVersion='3.10',xOp7=false,xOp5or6=false,xIE4Up=false,xNN4=false,xUA=navigator.userAgent.toLowerCase();
if(window.opera){
  xOp7=(xUA.indexOf('opera 7')!=-1 || xUA.indexOf('opera/7')!=-1);
  if (!xOp7) xOp5or6=(xUA.indexOf('opera 5')!=-1 || xUA.indexOf('opera/5')!=-1 || xUA.indexOf('opera 6')!=-1 || xUA.indexOf('opera/6')!=-1);
}
else if(document.layers) xNN4=true;
else {xIE4Up=document.all && xUA.indexOf('msie')!=-1 && parseInt(navigator.appVersion)>=4;}

// Appearance:
function xShow(e) {
  if(!(e=xGetElementById(e))) return;
  if(e.style && xDef(e.style.visibility)) e.style.visibility='inherit';
  else if(xDef(e.visibility)) e.visibility='show';
}
function xHide(e) {
  if(!(e=xGetElementById(e))) return;
  if(e.style && xDef(e.style.visibility)) e.style.visibility='hidden';
  else if(xDef(e.visibility)) e.visibility='hide';
}
// Position:
function xMoveTo(e,iX,iY) {
  xLeft(e,iX);
  xTop(e,iY);
}
function xLeft(e,iX) {
  if(!(e=xGetElementById(e))) return 0;
  var css=xDef(e.style);
  if (css && xDef(e.style.left) && typeof(e.style.left)=="string") {
    if(arguments.length>1) e.style.left=iX+"px";
    else {
      iX=parseInt(e.style.left);
      if(isNaN(iX)) iX=0;
    }
  }
  else if(css && xDef(e.style.pixelLeft)) {
    if(arguments.length>1) e.style.pixelLeft=iX;
    else iX=e.style.pixelLeft;
  }
  else if(xDef(e.left)) {
    if(arguments.length>1) e.left=iX;
    else iX=e.left;
  }
  return iX;
}
function xTop(e,iY) {
  if(!(e=xGetElementById(e))) return 0;
  var css=xDef(e.style);
  if(css && xDef(e.style.top) && typeof(e.style.top)=="string") {
    if(arguments.length>1) e.style.top=iY+"px";
    else {
      iY=parseInt(e.style.top);
      if(isNaN(iY)) iY=0;
    }
  }
  else if(css && xDef(e.style.pixelTop)) {
    if(arguments.length>1) e.style.pixelTop=iY;
    else iY=e.style.pixelTop;
  }
  else if(xDef(e.top)) {
    if(arguments.length>1) e.top=iY;
    else iY=e.top;
  }
  return iY;
}
function xPageX(e) {
  if (!(e=xGetElementById(e))) return 0;
  if (xDef(e.pageX)) return e.pageX;
  var x = 0;
  while (e) {
    if (xDef(e.offsetLeft)) x += e.offsetLeft;
    e = xParent(e);
  }
  return x;
}
function xPageY(e) {
  if (!(e=xGetElementById(e))) return 0;
  if (xDef(e.pageY)) return e.pageY;
  var y = 0;
  while (e) {
    if (xDef(e.offsetTop)) y += e.offsetTop;
    e = xParent(e);
  }
  return y;
}

// Size:
function xWidth(e,uW) {
  if(!(e=xGetElementById(e)) || (uW && uW<0)) return 0;
  uW=Math.round(uW);
  var css=xDef(e.style);
  if(css && xDef(e.style.width,e.offsetWidth) && typeof(e.style.width)=="string") {
    if(arguments.length>1) xSetCW(e, uW);
    uW=e.offsetWidth;
  }
  else if(css && xDef(e.style.pixelWidth)) {
    if(arguments.length>1) e.style.pixelWidth=uW;
    uW=e.style.pixelWidth;
  }
  else if(xDef(e.clip) && xDef(e.clip.right)) {
    if(arguments.length>1) e.clip.right=uW;
    uW=e.clip.right;
  }
  else if(e.width)
  {
    uW = e.width
  }
  return uW;
}
function xHeight(e,uH) {
  if(!(e=xGetElementById(e)) || (uH && uH<0)) return 0;
  uH=Math.round(uH);
  var css=xDef(e.style);
  if(css && xDef(e.style.height,e.offsetHeight) && typeof(e.style.height)=="string") {
    if(arguments.length>1) xSetCH(e, uH);
    uH=e.offsetHeight;
  }
  else if(css && xDef(e.style.pixelHeight)) {
    if(arguments.length>1) e.style.pixelHeight=uH;
    uH=e.style.pixelHeight;
  }
  else if(xDef(e.clip) && xDef(e.clip.bottom)) {
    if(arguments.length>1) e.clip.bottom=uH;
    uH=e.clip.bottom;
  }
  else if(e.height)
  {
    uH = e.height
  }
  return uH;
}

function xClip(e,iTop,iRight,iBottom,iLeft) {
  if(!(e=xGetElementById(e))) return;
  if (iTop==null) iTop = xClipValues(e,'t');
  if (iRight==null) iRight = xClipValues(e,'r');
  if (iBottom==null) iBottom = xClipValues(e,'b');
  if (iLeft==null) iLeft = xClipValues(e,'l');

  if(e.style) {
    if (arguments.length == 5) e.style.clip="rect("+iTop+"px "+iRight+"px "+iBottom+"px "+iLeft+"px)";
    else e.style.clip="rect(0 "+parseInt(e.style.width)+"px "+parseInt(e.style.height)+"px 0)";
  }
  else if(e.clip) {
    if (arguments.length == 5) { e.clip.top=iTop; e.clip.right=iRight; e.clip.bottom=iBottom; e.clip.left=iLeft; }
    else { e.clip.top=0; e.clip.right=xWidth(e); e.clip.bottom=xHeight(e); e.clip.left=0; }
  }
}

// Event:
function xAddEventListener(e,eventType,eventListener,useCapture) {
  if(!(e=xGetElementById(e))) return;
  eventType=eventType.toLowerCase();
  if((!xIE4Up && !xOp7) && e==window) {
    if(eventType=='resize') { window.xPCW=xClientWidth(); window.xPCH=xClientHeight(); window.xREL=eventListener; xResizeEvent(); return; }
    if(eventType=='scroll') { window.xPSL=xScrollLeft(); window.xPST=xScrollTop(); window.xSEL=eventListener; xScrollEvent(); return; }
  }
  var eh="e.on"+eventType+"=eventListener";
  if(e.addEventListener) e.addEventListener(eventType,eventListener,useCapture);
  else if(e.attachEvent) e.attachEvent("on"+eventType,eventListener);
  else if(e.captureEvents) {
    if(useCapture||(eventType.indexOf('mousemove')!=-1)) { e.captureEvents(eval("Event."+eventType.toUpperCase())); }
    eval(eh);
  }
  else eval(eh);
}

function xEvent(evt) { // cross-browser event object prototype
  this.type = "";
  this.target = null;
  this.pageX = 0;
  this.pageY = 0;
  this.offsetX = 0;
  this.offsetY = 0;
  this.keyCode = 0;
  var e = evt ? evt : window.event;
  if(!e) return;
  // type
  if(e.type) this.type = e.type;
  // target
  if(xNN4) this.target = xLayerFromPoint(e.pageX, e.pageY);
  if(!(this.target))
    {
    if(e.target) this.target = e.target;
    else if(e.srcElement) this.target = e.srcElement;
    }
  //if ((! this.keyCode) & (e.keyCode)) { this.keyCode = e.keyCode; }
  // pageX, pageY
  if(xOp5or6) { this.pageX = e.clientX; this.pageY = e.clientY; }
  else if(xDef(e.pageX,e.pageY)) { this.pageX = e.pageX; this.pageY = e.pageY; }
  else if(xDef(e.clientX,e.clientY)) { this.pageX = e.clientX + xScrollLeft(); this.pageY = e.clientY + xScrollTop(); }
  // offsetX, offsetY
  if(xDef(e.layerX,e.layerY)) { this.offsetX = e.layerX; this.offsetY = e.layerY; }
  else if(xDef(e.offsetX,e.offsetY)) { this.offsetX = e.offsetX; this.offsetY = e.offsetY; }
  else { this.offsetX = this.pageX - xPageX(this.target); this.offsetY = this.pageY - xPageY(this.target); }
  // keycode
  if (xDef(e.keyCode)) { this.keyCode = e.keyCode; }
  else if (xDef(e.which)) { this.keyCode = e.which; }
}
function xResizeEvent() { // window resize event simulation
  if (window.xREL) setTimeout("xResizeEvent()", 250);
  var cw = xClientWidth(), ch = xClientHeight();
  if (window.xPCW != cw || window.xPCH != ch) { window.xPCW = cw; window.xPCH = ch; if (window.xREL) window.xREL(); }
}
function xScrollEvent() { // window scroll event simulation
  if (window.xSEL) setTimeout("xScrollEvent()", 250);
  var sl = xScrollLeft(), st = xScrollTop();
  if (window.xPSL != sl || window.xPST != st) { window.xPSL = sl; window.xPST = st; if (window.xSEL) window.xSEL(); }
}

function xLayer(id,root) { // only for nn4
  var i,j,layer,formiterator,formelement,found=null;
  if (!root) root=window;
  var e=root.document.images[id.toString()];
  if (e) return e;
  for(i=0; i<root.document.forms.length; i++) {
    formiterator=root.document.forms[i];
    for (j=0; j<formiterator.elements.length; j++)
      {
        formelement=formiterator.elements[j];
	if (formelement.name == id) return formelement;
      }
  }
  for(i=0; i<root.document.layers.length; i++) {
    layer=root.document.layers[i];
    if(layer.id==id) return layer;
    found=xLayer(id,layer);
    if(found) return found;
  }
  return null;
}
function xLayerFromPoint(x,y,root) { // only for nn4
  var i, hn=null, hz=-1, cn;
  if (!root) root = window;
  for (i=0; i < root.document.layers.length; ++i) {
    cn = root.document.layers[i];
    if (cn.visibility != "hide" && x >= cn.pageX && x <= cn.pageX + cn.clip.right && y >= cn.pageY && y <= cn.pageY + cn.clip.bottom ) {
      if (cn.zIndex > hz) { hz = cn.zIndex; hn = cn; }
    }
  }
  if (hn) {
    cn = xLayerFromPoint(x,y,hn);
    if (cn) hn = cn;
  }
  return hn;
}
function xParent(e){
  if (!(e=xGetElementById(e))) return null;
  var p=null;
  if (e.parentLayer){if (e.parentLayer!=window) p=e.parentLayer;}
  else{
    if (e.offsetParent) p=e.offsetParent;
    else if (e.parentNode) p=e.parentNode;
    else if (e.parentElement) p=e.parentElement;
  }
  return p;
}
function xDef() {
  for(var i=0; i<arguments.length; ++i){if(typeof(arguments[i])=="" || typeof(arguments[i])=="undefined") return false;}
  return true;
}

// Window:
function xScrollLeft() {
  var offset=0;
  if(xDef(window.pageXOffset)) offset=window.pageXOffset;
  else if(document.documentElement && document.documentElement.scrollLeft) offset=document.documentElement.scrollLeft;
  else if(document.body && xDef(document.body.scrollLeft)) offset=document.body.scrollLeft;
  return offset;
}
function xScrollTop() {
  var offset=0;
  if(xDef(window.pageYOffset)) offset=window.pageYOffset;
  else if(document.documentElement && document.documentElement.scrollTop) offset=document.documentElement.scrollTop;
  else if(document.body && xDef(document.body.scrollTop)) offset=document.body.scrollTop;
  return offset;
}

// Object:
function xGetElementById(e, src) {
  if(typeof(e)!="string") return e;
  if(document.getElementById) e=document.getElementById(e);
  else if(document.all) e=document.all[e];
  else if(document.layers) 
    {
      e = xLayer(e);
    }
  else 
    {
      e=null;
    }
  return e;
}
// end x.js
// **************************************************************************
//                  360 Degree Panorama Image Viewer
// **************************************************************************
// 			Written by Martin Krolik
// 			http://krolik.net/PIV.jsp
// 			martin@krolik.net
// **************************************************************************
function pivManager( ctlPref ) {
	// vars below
	var mytimer,xdist,ydist,xoffset,yoffset,xviewport,yviewport,defaulttravel,defaulttimeout,borderheight,borderwidth,bwidth,bheight,myobject,outerimgdiv,mypframe,myloadingdiv,myimage,mysecondimage,initialized,loaded,xoffsetwithinpic,yoffsetwithinpic,origimagewidth,origimageheight,maxtravel,basictravel;
	// vars above
	// ----------------------  Parameters below --------------------------------//
	xoffset = 0;   
	yoffset = 0;
	xoffsetwithinpic = 0; 	// messes everything up in IE5.  IE6 and all others seem to work fine... see note in code - not implemented 
	yoffsetwithinpic = 0; 	// messes everything up in IE5.  IE6 and all others seem to work fine... see note in code - not implemented
	xviewport = 400;   		// size of view window ... must be less than size of image
	yviewport = 160;
	defaulttravel = 3; 		// how many pixels at a time we move .... choppy'ness VS. slowness
	basictravel = 1; 		// how many pixels at a time we move .... choppy'ness VS. slowness	
	defaulttimeout = 20; 	// how many milliseconds between moves
	maxtravel = 8; 			// max number of pixels to move with mouse move event
	borderheight = 25; 		// actually should be derived from NORTH or SOUTH BORDER image, but isn't
	borderwidth = 25; 		// actualy should be derived from EAST or WEST BORDER image, but isn't
	var pOldOnLoadPIV = null;
	var pOldOnResizePIV = null;
	var vstate = false;
	var startx = 0;
	var starty = 0;
	// ----------------------  Parameters above --------------------------------//
	// init code below - no modifications required
	initialized = false;
	loaded = false;
	
	this.initialize = function() {
		if( window.onload != null ) {
			pOldOnLoadPIV = window.onload;
		}
		window.onload = initpiv;
		if( window.onresize != null ) {
			pOldOnResizePIV = window.onresize;
		}
		window.onresize = positionpiv;
		
		this.move_W = function( dir ) {
		if( dir == "on" ) {
			//imgW.src = borderWsourceOver;
			xdist =- defaulttravel;
			ydist = 0;
			shiftover();
		} else {
			//imgW.src = this.borderWsource;
			quitmoving( true );
			xdist = -basictravel;
			ydist = 0;
			shiftover();
		}
	}
	
	this.move_E = function( dir ) {
		if( dir == "on" ) {
			//imgE.src = borderEsourceOver;
			xdist = defaulttravel;
			ydist = 0;
			shiftover();
		} else {
			//imgE.src = this.borderEsource;
			quitmoving( true );
			xdist = basictravel;
			ydist = 0;
			shiftover();
		}
	}

	this.move_Q = function( dir ) {
		if( dir == "on" ) {
			quitmoving( true );
		} else {
			xdist = basictravel;
			ydist = 0;
			shiftover();
		}
	}
		
		
	}
	
	function getOverSource( source ) {
		if( source == null )
			source = '';
		var index = source.lastIndexOf( '.' );
		if( index < 0 )
			return( source );
		else
			return( source.substring( 0, index ) + '_over' + source.substring( index ) );
	}

	function initpiv() {
		myobject = xGetElementById(ctlPref + '_dimg');
		outerimgdiv = xGetElementById(ctlPref + '_dimgOuter');
		mypframe = xGetElementById(ctlPref + '_mypicframe');
		myloadingdiv = xGetElementById(ctlPref + '_nowloading');
		myimage = xGetElementById(ctlPref + '_ione');
		mysecondimage = xGetElementById(ctlPref + '_itwo');

		origimagewidth = xWidth(myimage);
		origimageheight = xHeight(myimage); 
		loaded = true;
		positionpiv();
		if( pOldOnLoadPIV != null ) {
			pOldOnLoadPIV();
		}
		
		//xMoveTo(myloadingdiv, xLeft('PlaceHolderDiv'), xTop('PlaceHolderDiv'));
	}
	
	this.positionpiv = function() {
		positionpiv();
	}
	
	function positionpiv() {
		xoffset = xPageX(ctlPref + '_PlaceHolderDiv') + borderwidth;
		yoffset = xPageY(ctlPref + '_PlaceHolderDiv') + borderheight;
		if( loaded ) {
			xMoveTo(outerimgdiv,xoffset,yoffset);
			xMoveTo(mypframe,xoffset-borderwidth,yoffset-borderheight+1);
		}
		//xHide(myloadingdiv);
		//xClip(myloadingdiv,0,0,0,0);
		xShow(outerimgdiv);
		xShow(myobject);
		xShow(mypframe);
		xClip(mypframe,0,(xviewport+borderwidth+borderwidth),(yviewport+borderheight+borderheight),0);
		xClip(mypframe,0,(xviewport+borderwidth+borderwidth),(yviewport+borderheight+borderheight),0);
		
		xdist = xoffsetwithinpic;
		ydist = yoffsetwithinpic;

		shiftover();
		quitmoving();
		xdist=1;
		ydist=0;
		shiftover();
		if( pOldOnResizePIV != null ) {
			pOldOnResizePIV();
		}	
	}	

	function mdevent( objEvent ) {
		if( vstate == false ) {
			var oEvent = new xEvent( objEvent );
			quitmoving();
			xdist = 0;
			ydist = 0;
			startx = oEvent.pageX;
			starty = oEvent.pageY;
			vstate = true;
		}
	}
	
	function mmevent( objEvent ) {
		if( vstate ) {
			var oEvent = new xEvent( objEvent );
			var xdelta, ydelta;
			xdelta = oEvent.pageX - startx;
			ydelta = oEvent.pageY - starty;
			if( xdelta > 0 ) {
				xdist = Math.round(Math.min(( xdelta / 2) , maxtravel));
			} else {
				xdist = Math.round(Math.max(( xdelta / 2) , 0-maxtravel));
			}
			if( ydelta > 0 ) {
				ydist = Math.round(Math.min(( ydelta / 2) , maxtravel));
			} else {
				ydist = Math.round(Math.max(( ydelta / 2) , 0-maxtravel));
			}
			shiftover(); 
		}
	}
	
	function muevent( objEvent ) {
		if( vstate ) {
			var oEvent = new xEvent( objEvent );
			vstate = false;
		}
	}

	function shiftover() {
		if( loaded ) {
			quitmoving();
			if( ((xTop(myobject) - ydist ) >= 0) && (ydist<0) ) {
				ydist = 0; 
			} else
				if( ((xTop(myobject) - ydist ) <= ( yviewport - xHeight(myimage) ) ) && (ydist>0) ) {
					ydist = 0; 
				}

			xMoveTo(myobject, xLeft(myobject) - xdist, xTop(myobject) - ydist);
 
			if( xLeft(myobject) > 0 ) {
				xLeft(myobject, 0 - xWidth(myimage));
			} else 
				if( xLeft(myobject) < (0 - xWidth(myimage) ) ) {
					xLeft(myobject, 0);
				} 

			if( document.layers ) {
				xClip(myobject,null, xviewport - xLeft(myobject) ,null,null);
			}
			initialized == true;
			if( (xdist != 0) || (ydist != 0) ) {
				mytimer = setTimeout( shiftover, defaulttimeout );
			}
		}
	}
	
	function quitmoving() {
		if( mytimer ) {
			clearTimeout(mytimer);
		}
		if( quitmoving.arguments.length > 0 ) {
			var blnClearDist = quitmoving.arguments[0];
			if( blnClearDist == true ) {
				xdist = 0;
				ydist = 0;
			}
		}
	}
	
}