// JavaScript for RotaFota
// Copyright Matthew J Heaton 2009

// Calling HTML should include one or more calls to AddRotaFota(id, szImagePrefix) and optional parameters:
// szID = The image id, e.g. from <img id='rotafota1' src='...
// szImagePrefix = folder path and start of filename (e.g. 'images/image' or 'images/' or 'http://www.site.com/images/')
// nNumImages = The number of images in the rotation, default is 36
// nAutoSpinInterval = milliseconds between auto spin animation frames, -ve = reverse spin, 0 = no auto spin
// nStartIndex = the index of the first image to display, default is image 0
// szImageSuffix = file extension (e.g. '.jpg' or '.png'), default is .jpg
// For example:
//<script language='JavaScript' src='rotafota.js' type='text/javascript'></script>
//<script language='JavaScript' type='text/javascript'>
//AddRotaFota('rotafota1', 'rotafota/image_', 36, 100, 0, '.png');
//</script>

var RotaFotas = new Array;
var nActiveRotaFota = 0;


function AddRotaFota(szID, szImagePrefix, nNumImages, nAutoSpinInterval, nStartIndex, szImageSuffix)
{
    var imageNew = new RotaFota(szImagePrefix, nNumImages, nAutoSpinInterval, nStartIndex, szImageSuffix);
    var nItem = RotaFotas.push( imageNew );
    var szPreload = 'PreLoad('+nItem+')';
    setTimeout(szPreload, 100);
    imageNew.Img = document.getElementById(szID);
    imageNew.Img.onmousedown = StartRotate;
    imageNew.Img.name = nItem;
    imageNew.Img.style.cursor = 'e-resize';
    imageNew.Img.addEventListener("touchstart", touchHandler, true);
}

function RotaFota(szImagePrefix, nNumImages, nAutoSpinInterval, nStartIndex, szImageSuffix)
{
    this.Img = document.images[0];
    this.szImagePrefix = !szImagePrefix? 'images/image_': szImagePrefix;
    this.nNumImages = !nNumImages? 36: nNumImages;
    this.nStartIndex = !nStartIndex? 0: nStartIndex;
    this.szImageSuffix = !szImageSuffix? '.jpg': szImageSuffix;
    this.nAutoSpinInterval = !nAutoSpinInterval? 0: nAutoSpinInterval;
    this.arrayImages = new Array(this.nNumImages);
    this.nLastImage = 0;
    this.nStartX = -1;
    this.timerSpin = null;
    this.PreLoad = PreLoad;
    this.IdleSpin = IdleSpin;
}

function PreLoad(nItem)
{
    var imageThis = RotaFotas[nItem>1?nItem-1:0];
    for(i=0; i<imageThis.nNumImages; i++)
    {
      var nImage = imageThis.nAutoSpinInterval<0? imageThis.nNumImages - i :
                   imageThis.nAutoSpinInterval>0? i:
                 				  (i&1)? imageThis.nNumImages-1-(i>>1): (i>>1);
      nImage = (nImage + imageThis.nStartIndex) % imageThis.nNumImages;
      var szZeros = nImage<10? '00': nImage<100? '0': '';
      imageThis.arrayImages[nImage]=new Image();
      imageThis.arrayImages[nImage].src=imageThis.szImagePrefix+szZeros+nImage+imageThis.szImageSuffix;
    }
    if (imageThis.nAutoSpinInterval!=0) imageThis.IdleSpin(imageThis.nAutoSpinInterval, nItem);
}

function IdleSpin(nInterval, nItem)
{
  var nDirection = nInterval>0?1:-1;
  var szFuncCall = 'ShowNextImage('+nDirection+','+nItem+')';
  this.timerSpin = setInterval(szFuncCall,
                              nInterval>0?nInterval:-nInterval);
}

var isIE = document.all?true:false;
if (!isIE) document.captureEvents(Event.MOUSEMOVE);

function GetX(e) {
  if (!isIE) return e.pageX;
  else return event.clientX + document.body.scrollLeft;
}

function StartRotate(e)
{
  // mouse-down - start tracking the mouse move events
  var nItem = this.name;
  var imageThis = RotaFotas[nItem>1?nItem-1:0];
  if (imageThis.timerSpin) clearInterval(imageThis.timerSpin);
  if (!e) e = window.event;
  imageThis.nStartX = GetX(e);
  nActiveRotaFota = nItem;
  document.onmousedown = Dummy;
  document.onmouseup = StopRotate;
  document.onmousemove = Animate;
  document.addEventListener("touchmove", touchHandler, true);
  document.addEventListener("touchend", touchHandler, true);
  return false;  // false = no default event handling
}
function Dummy(e)
{
  // prevent default document mouse-down processing in Gecko browsers
  return false;
}
function ShowNextImage(nDirection, nItem)
{
    imageThis = RotaFotas[nItem>1?nItem-1:0];
    var nImage = imageThis.nLastImage + nDirection;
    while (nImage<0) nImage+=imageThis.nNumImages;
    nImage = nImage%imageThis.nNumImages;
    imageThis.Img.src = imageThis.arrayImages[nImage].src;
    imageThis.nLastImage = nImage;
}
function Animate(e)
{
  // track left-right mouse movement and display corresponding 3D image
  var nItem = nActiveRotaFota;
  var imageThis = RotaFotas[nItem>1?nItem-1:0];
  if (!e) e = window.event;
  var nImage;
  if (imageThis.nStartX >= 0)
  {
    nNewx = GetX(e);
    nImage = Math.round((nNewx-imageThis.nStartX)*imageThis.nNumImages/360);
    if (nImage != 0)
    {
        ShowNextImage(nImage, nItem);
       	imageThis.nStartX = nNewx;
    }
 }
 return false;  // false = no default event handling
}
function StopRotate()
{
  // mouse up - stop tracking the mouse move events
  var nItem = nActiveRotaFota;
  var imageThis = RotaFotas[nItem>1?nItem-1:0];
  imageThis.nStartX = -1;
  document.onmousedown = null;
  document.onmouseup = null;
  document.onmousemove = null;
  document.removeEventListener("touchmove", touchHandler, true);
  document.removeEventListener("touchend", touchHandler, true);
}

function touchHandler(event)
{
  var touches = event.changedTouches,
      first = touches[0],
      type = "";

  switch(event.type)
  {
  case "touchstart": type="mousedown"; break;
  case "touchmove":  type="mousemove"; break;
  case "touchend":   type="mouseup"; break;
  default: return;
  }

  var simulatedEvent = document.createEvent("MouseEvent");
  simulatedEvent.initMouseEvent(type, true, true, window, 1,
                              first.screenX, first.screenY,
                              first.clientX, first.clientY, false,
                              false, false, false, 0/*left*/, null);

  first.target.dispatchEvent(simulatedEvent);
  event.preventDefault();
}
