//----------------------------------------------------------------
//
// Scroll Script 4.1
//
//   Copyright ® 2000 Yannick Delwiche
//                                                    2000-10-03
//----------------------------------------------------------------

var ns = navigator.appName.indexOf("Netscape")>=0;
var ti = new Array();
var cid = -1;
var interval = 20;
var res = 16;
var mouse = false;
var scrolltype = 0;
var speedtype = 0;
var nlayers = 0;
var lastlayer = -1;

//----------------------------------------------------------------
// Scrolling initialization
//----------------------------------------------------------------
// init(
//    i    = scrolling interval (milliseconds)
//    r    = scrolling resolution
//    m    = mouse capture (boolean)
//    s    = scrolling type ('linear','smooth','resonant','fade')
//    t    = speed type
// )
//----------------------------------------------------------------

function init(i,r,m,s,t)
{
 interval = i;
 res = r;
 mouse = m;
 if (mouse){
  if (ns){ document.captureEvents(Event.MOUSEDOWN); }
  document.onmousedown = mdown;
 }
 if (s=='smooth'){ scrolltype = 1; }
 else if (s=='resonant'){ scrolltype = 2; }
 else if (s=='fade'){ scrolltype = 3; }
 if (t=='constant'){ speedtype = 1; }
}

function uninit()
{
 if (ns){ document.releaseEvents(Event.MOUSEDOWN); }
 document.onmousedown = null;
}

//----------------------------------------------------------------
// Layer initialization
//----------------------------------------------------------------
// initlayer(
//     i    = layer index
//     t    = layer id
//     ox   = origin x
//     oy   = origin y
//     dx   = destination x
//     dy   = destination y
//     lx   = leaving x 
//     ly   = leaving y
//            coordinates can be 'left','top','right','bottom',
//                               'middle' or 'def'
//     hide = hide when left (boolean)
//     s    = scrolling speed
//     *act = action when layer reaches dest
//     *st  = scrolling type
//     *q   = resonance
// )
//----------------------------------------------------------------

function initlayer(i,t,ox,oy,dx,dy,lx,ly,hide,s,act,st,q)
{
 var cl;

 if (i>=nlayers){ nlayers = i+1; }
 cl = document.getElementById(t);
 ti[i] = new Object();
 ti[i].layer = cl;
 ti[i].id = null;
 ti[i].orig = new Object();
 ti[i].dest = new Object();
 ti[i].leave = new Object();
 ti[i].cpos = new Object();
 ti[i].cdest = new Object();
 ti[i].hide = hide;
 ti[i].speed = (s)?s:4;
 ti[i].speedtype = speedtype;
 ti[i].dest.x = solve(dx,cl,0,(ns)?cl.left:cl.style.pixelLeft);
 ti[i].dest.y = solve(dy,cl,1,(ns)?cl.top:cl.style.pixelTop);
 ti[i].orig.x = solve(ox,cl,0,ti[i].dest.x);
 ti[i].orig.y = solve(oy,cl,1,ti[i].dest.y);
 ti[i].leave.x = solve(lx,cl,0,ti[i].orig.x);
 ti[i].leave.y = solve(ly,cl,1,ti[i].orig.y);
 ti[i].zindex = 1000+i;
 ti[i].action = act;
 ti[i].scrolling = 0;
 ti[i].lastaction = 0;
 ti[i].active = false;
 ti[i].remember = false;
 if (arguments.length>11){
  if (st=='def'){ ti[i].st = scrolltype; }
  else if (st=='smooth'){ ti[i].st = 1; }
  else if (st=='resonant'){ ti[i].st = 2; }
  else if (st=='fade'){ ti[i].st = 3; }
  else{ ti[i].st = 0; }
 }
 else{ ti[i].st = scrolltype; }
 if (arguments.length>12){ ti[i].q = q; }
 else{ ti[i].q = 0.75; }
 ti[i].sx = 0;
 ti[i].sy = 0;
 if (ns){
  if (ti[i].hide){ cl.visibiliy = "hide"; }
  cl.left = ti[i].leave.x;
  cl.top = ti[i].leave.y;
 }
 else{
  if (ti[i].st==3){ cl.style.filter = "alpha(opacity = 0)"; }
  if (ti[i].hide){ cl.style.visibility = "hidden"; }
  cl.style.pixelLeft = ti[i].leave.x;
  cl.style.pixelTop = ti[i].leave.y;
 }
 ti[i].cpos.x = ti[i].orig.x*res;
 ti[i].cpos.y = ti[i].orig.y*res;
}

//----------------------------------------------------------------
// Remember layer for lastlayer variable
//----------------------------------------------------------------
// remember(
//     i    = layer index
// }
//----------------------------------------------------------------

function remember(i)
{
 ti[i].remember = true; 
}

//----------------------------------------------------------------
// Show layer
//----------------------------------------------------------------
// show(
//     i    = layer index
//     inv  = inversed motion (boolean)
// )
//----------------------------------------------------------------

function show(i,inv)
{
 var d;

 if (ti[i].remember) lastlayer = i;
 ti[i].lastaction = 1;
 for (x=i+1;x<nlayers;x++){
  if (ti[x]==null){ break; }
  if (ti[x].active){ hide(x,inv); }
 }
 for (x=i-1;x>=0;x--){
  if (ti[x]==null){ break; }
  if (ti[x].active){ hide(x,inv); }
 }
 cid = i;
 if (i>=0){
  ti[i].active = true;
  if (ti[i].id){
   clearInterval(ti[i].id);
   ti[i].id = 0;
  }
  if (ns){
   ti[i].layer.visibility = "show";
   ti[i].layer.zIndex = ti[i].zindex;
  }
  else{
   ti[i].layer.style.visibility = "visible";
   ti[i].layer.style.zIndex = ti[i].zindex;
  }
  if (ti[i].scrolling==0){
   if (inv){
    x = ti[i].leave.x;
    y = ti[i].leave.y;
   }
   else{
    x = ti[i].orig.x;
    y = ti[i].orig.y;
   }
   ti[i].cpos.x = x*res;
   ti[i].cpos.y = y*res;
   if (ns){
    ti[i].layer.left = x;
    ti[i].layer.top = y;
   }
   else{
    ti[i].layer.style.pixelLeft = x;
    ti[i].layer.style.pixelTop = y;
   }
  }
  ti[i].cdest.x = ti[i].dest.x*res;
  ti[i].cdest.y = ti[i].dest.y*res;
  if ((ti[i].st==0) || (ti[i].st==3)){
   if (ti[i].speedtype==1){
    ti[i].sx = ti[i].cdest.x-ti[i].cpos.x;
    ti[i].sy = ti[i].cdest.y-ti[i].cpos.y;
    d = Math.sqrt(ti[i].sx*ti[i].sx+ti[i].sy*ti[i].sy);
    ti[i].sx = (ti[i].sx/d)*ti[i].speed*res;
    ti[i].sy = (ti[i].sy/d)*ti[i].speed*res;
   }
   else{
    ti[i].sx = (ti[i].cdest.x-ti[i].cpos.x)/ti[i].speed;
    ti[i].sy = (ti[i].cdest.y-ti[i].cpos.y)/ti[i].speed;
   }
  }
  ti[i].scrolling = 1;
  ti[i].id = setInterval("scroll("+i+")",interval);
 }
}

//----------------------------------------------------------------
// Simple show command
//----------------------------------------------------------------
//  show2{
//     i    = layer index
//  }
//----------------------------------------------------------------

function show2(i)
{
 var t;

 ti[i].lastaction = 1;
 if (ns){ t = ti[i].layer; }
 else{ t = ti[i].layer.style; }
 t.visibility = (ns)?"show":"visible";
}

//----------------------------------------------------------------
// Hide layer
//----------------------------------------------------------------
// hide(
//     i    = layer index
//     inv  = inversed motion (boolean)
// )
//----------------------------------------------------------------

function hide(i,inv)
{
 ti[i].lastaction = 2;
 if (ti[i].id){
  clearInterval(ti[i].id);
  ti[i].id = 0;
 }
 if (inv){
  ti[i].cdest.x = ti[i].orig.x*res;
  ti[i].cdest.y = ti[i].orig.y*res;
 }
 else{
  ti[i].cdest.x = ti[i].leave.x*res;
  ti[i].cdest.y = ti[i].leave.y*res;
 }
 if (ns){
  ti[i].layer.zIndex = ti[i].zindex-10;
 }
 else{
  ti[i].layer.style.zIndex = ti[i].zindex-10;
 }
 if ((ti[i].st==0) || (ti[i].st==3)){
  if (ti[i].speedtype==1){
   ti[i].sx = ti[i].cdest.x-ti[i].cpos.x;
   ti[i].sy = ti[i].cdest.y-ti[i].cpos.y;
   d = Math.sqrt(ti[i].sx*ti[i].sx+ti[i].sy*ti[i].sy);
   ti[i].sx = (ti[i].sx/d)*ti[i].speed*res;
   ti[i].sy = (ti[i].sy/d)*ti[i].speed*res;
  }
  else{
   ti[i].sx = (ti[i].cdest.x-ti[i].cpos.x)/ti[i].speed;
   ti[i].sy = (ti[i].cdest.y-ti[i].cpos.y)/ti[i].speed;
  }
 }
 ti[i].scrolling = 2;
 ti[i].id = setInterval("scroll("+i+")",interval);
 ti[i].active = false;
 cid = -1;
}

//----------------------------------------------------------------
// Simple hide command
//----------------------------------------------------------------
//  show2{
//     i    = layer index
//  }
//----------------------------------------------------------------

function hide2(i)
{
 var t;
 
 ti[i].lastaction = 2;
 if (ns){ t = ti[i].layer; }
 else{ t = ti[i].layer.style; }
 t.visibility = (ns)?"hide":"hidden";
}

//----------------------------------------------------------------
// Swap layer
//----------------------------------------------------------------
// swap(
//     i    = layer index
// )
//----------------------------------------------------------------

function swap(i)
{
 if (ti[i].lastaction==1){ hide(i); }
 else{ show(i); }
}

//----------------------------------------------------------------
// Private functions
//----------------------------------------------------------------

function mdown(evt)
{
 var el;
 var inlayer = false;
	
 if (ns){
  document.routeEvent(evt);
  if (cid>=0){
   el = ti[cid].layer;
   if ((evt.pageX<el.pageX) ||
       (evt.pageY<el.pageY) ||
       (evt.pageX>=el.pageX+el.clip.width) ||
       (evt.pageY>=el.pageY+el.clip.height)){
    hide(cid);
   } 
  }
 }
 else if (cid>=0){
  el = window.event.srcElement;
  do{
   if (el==ti[cid].layer){
    inlayer = true; break;
   }
   el = el.parentElement;
  } while (el!=null)
  if (!inlayer){ hide(cid); };
 }
}

function solve(val,layer,axis,def)
{
 if (axis==0){
  if (val=='left'){ return (ns)?(-layer.clip.width):(-layer.offsetWidth); }
  else if (val=='right'){ return (ns)?(window.innerWidth):(document.body.clientWidth); }
  else if (val=='middle'){ return (ns)?(window.innerWidth-layer.clip.width)/2:(document.body.clientWidth-layer.offsetWidth)/2; }
  else if (val=='def'){ return def; }
  else if (val<0){ return (ns)?(val-layer.clip.width):(val-layer.offsetWidth); }
  else return val;
 }
 else{
  if (val=='top'){ return (ns)?(-layer.clip.height):(-layer.offsetHeight); }
  else if (val=='bottom'){ return (ns)?(window.innerHeight):(document.body.clientHeight); }
  else if (val=='middle'){ return (ns)?(window.innerHeight-layer.clip.height)/2:(document.body.clientHeight-layer.offsetHeight)/2; }
  else if (val=='def'){ return def; }
  else if (val<0){ return (ns)?(val-layer.clip.height):(val-layer.offsetHeight); }
  else return val;
 }
}

function scroll(i)
{
 var t,x,y,dx,dy,d,md;
 
 if (ns){ t = ti[i].layer; }
 else{ t = ti[i].layer.style; }
 x = ti[i].cpos.x;
 y = ti[i].cpos.y;
 if (ti[i].st==1){
  dx = (ti[i].cdest.x-x)/ti[i].speed;
  dy = (ti[i].cdest.y-y)/ti[i].speed;
  if ((((dx>0) && (dx<res/4)) || ((dx<0) && (dx>-(res/4)))) && (x!=ti[i].cdest.x)){ dx = ti[i].cdest.x-x; }
  if ((((dy>0) && (dy<res/4)) || ((dy<0) && (dy>-(res/4)))) && (y!=ti[i].cdest.y)){ dy = ti[i].cdest.y-y; }
 }
 else if (ti[i].st==2){
  dx = ti[i].sx*ti[i].q+(ti[i].cdest.x-x)/ti[i].speed;
  dy = ti[i].sy*ti[i].q+(ti[i].cdest.y-y)/ti[i].speed;
  ti[i].sx = dx;
  ti[i].sy = dy;
  if ((((dx>0) && (dx<res/4)) || ((dx<0) && (dx>-(res/4)))) && (x!=ti[i].cdest.x)){ dx = ti[i].cdest.x-x; }
  if ((((dy>0) && (dy<res/4)) || ((dy<0) && (dy>-(res/4)))) && (y!=ti[i].cdest.y)){ dy = ti[i].cdest.y-y; }
 } 
 else{
  dx = ti[i].cdest.x-x;
  dy = ti[i].cdest.y-y;
  if (((dx>0) && (dx>ti[i].sx)) || ((dx<0) && (dx<ti[i].sx))){ dx = ti[i].sx; };
  if (((dy>0) && (dy>ti[i].sy)) || ((dy<0) && (dy<ti[i].sy))){ dy = ti[i].sy; };
 }
 x = x+dx;
 y = y+dy;
 ti[i].cpos.x = x;
 ti[i].cpos.y = y;
 if (ns){ t.left = x/res; t.top = y/res; }
 else{
  t.pixelLeft = x/res; t.pixelTop = y/res;
  if (ti[i].st==3){
   dx = t.pixelLeft-ti[i].orig.x;
   dy = t.pixelTop-ti[i].orig.y;
   d = (dx*dx+dy*dy);
   dx = ti[i].dest.x-ti[i].orig.x;
   dy = ti[i].dest.y-ti[i].orig.y;
   md = (dx*dx+dy*dy);
   ti[i].layer.filters.alpha.opacity = d*100/md;
  }
 }
 if ((x==ti[i].cdest.x) && (y==ti[i].cdest.y)){
  clearInterval(ti[i].id); ti[i].id = null;
  if ((ti[i].action) && (x==ti[i].dest.x*res) && (y==ti[i].dest.y*res)){ eval(ti[i].action); }
  if ((ti[i].hide) && (ti[i].scrolling==2)){ t.visibility = (ns)?"hide":"hidden"; }
  ti[i].scrolling = 0;
 }
}
//----------------------------------------------------------------
