/*============================================================================

    FARRAR FOCUS JAVASCRIPT LIBRARY v6 - COPYRIGHT 2006 FARRAR FOCUS LLP

============================================================================*/
// CLAMP ( A, B, C ) - A/C IN ANY ORDER
function Clamp(a,b,c) { var va=Math.min(a,c); var vc=Math.max(a,c);
 if(b<va) b=va; if(b>vc) b=vc; return b; }

// GOTO ( URL )
function Go(u) { document.location=u; }

// DO NOTHING
function Nop() {}

// WRITE MAIL LINK ( NAME, ADDRESS ) 
function Mail(n,a){return n+'@'+a;}

// WRITE MAIL LINK ( NAME, ADDRESS ) 
function MailL(n,a){return '<a href="mailto:'+n+'@'+a+'">'+n+'@'+a+'</a>'; }

/*----------------------------------------------------------------------------
ARRAY PROTOTYPES
----------------------------------------------------------------------------*/
// PUSH ( ITEM )
Array.prototype.P=function(v) { this[this.length]=v; }; 

// ARRAY REMOVE ( INDEX ) - KEEPS SORTED, SLOW 
Array.prototype.R=function(i) { if(i<0) return; var n=this.length; 
 for(;i<n;i++) { this[i]=this[i+1]; } this.length--; };

// ARRAY UNSORTED FIND ( VALUE ) RETURNS INDEX OR -1
Array.prototype.F=function(v) { var i=0,n=this.length;
 for(;i<n;i++) { if(this[i]==v) return i; } return -1; };

// MAP FUNCTION TO ARRAY 
// ( FUNCTION(ELEMENT,ARGUMENT,INDEX,START,END), ARGUMENT, START, END )
Array.prototype.M=function(f,a,s,e) { 
 var r=[],i=(s==null)?0:s,e=(e==null)?this.length-1:e;
 for(;i<=e;i++) { r[i]=f(this[i],a,i,s,e); } return r; };

// APPLY FUNCTION TO ELEMENTS OF ARRAY 
// ( FUNCTION(ELEMENT,RETURN,ARGUMENT,INDEX,START,END), 
//   RETURN, ARGUMENT, START, END )
Array.prototype.A=function(f,r,a,s,e) { 
 var i=(s==null)?0:s,e=(e==null)?this.length-1:e;
 for(;i<=e;i++) { r=f(this[i],r,a,i,s,e); } return r; };

// REMOVE REPEATED ITEMS IN SEQUENCE
Array.prototype.U=function(v) { var i=1,j=0,n=this.length;
 for(;i<n;i++) { if(this[i]!=this[j]) { j++; this[j]=this[i]; }
 } this.length=j+1; };

// ARRAY FUNCTION TO RETURN TOP ITEM OF ARRAY
Array.prototype.T=function() { return this[this.length-1]; }

/*----------------------------------------------------------------------------
DEBUG HELPERS
----------------------------------------------------------------------------*/
// DEBUG MESSAGE ( MESSAGE )
function Bug(m) { document.getElementById('Bug').innerHTML=m; }

// PRINT OBJECT ( OBJECT )
function BugO(o, _i) { var r=''; 
 switch(typeof(o)) {
  case 'boolean': r=(o?'true':'false'); break;
  case 'string': r='"'+o+'"'; break; 
  case 'object': if(o===null) { r="null"; break; }
   r=[]; var t=['{ ',0,' }'];
   if(o.reverse) { t=['[ ',0,' ]'];
    for(var j in o) { if(!isNaN(parseInt(j))) r.P(j+":"+BugO(o[j])); } }
   else { for(var j in o) { r.P(j+":"+BugO(o[j])); } }
   t[1]=r.join(', '); r=t.join(''); break;
  default: r+=o; }
 return r; }

// PRINT VARIABLE ( NAME, VAR )
function BugP(n,v) { return '<code>'+n+' = '+BugO(v)+';</code><br>'; }

/*============================================================================

DOCUMENT OBJECT MODEL 

============================================================================*/
// HTML FILE NAME
var domFile=document.URL.match(/\w+\.htm/); 
if(domFile==null) domFile='index.htm'; else domFile=domFile[0];

// HTML FILE NAME WITHOUT EXTENSION
var domFileB=domFile.slice(0,-4);

// HTML FILE NAME PRE UNDERSCORE
var domFileU=(domFileB.split('_'))[0];

// MOUSE POSITION RELATIVE TO DOCUMENT NOT WINDOW
var domMxy=[0,0]; 

/*----------------------------------------------------------------------------
GENERAL
----------------------------------------------------------------------------*/
// MOUSE INTERRUPT HANDLER ( EVENT )
function DomIH(e) { var x=0,y=0;
 if(!e) var e=window.event;
 if(e.pageX || e.pageY) { x=e.pageX; y=e.pageY; }
 else if (e.clientX || e.clientY) {
  x=e.clientX+document.body.scrollLeft+document.documentElement.scrollLeft;
  y=e.clientY+document.body.scrollTop+document.documentElement.scrollTop; }
 domMxy=[x,y]; }

// SETUP MOUSE POSITION INTERRUPT
function DomI() { document.onmousemove=DomIH; } 

// LOOKUP ELEMENT ( ID )
function DomL(i) { return document.getElementById(i); }

// MOVE TO POSITION ( ELEMENT, [X,Y] )
function DomM(e,xy) { if(e&&e.style) { 
 var s=e.style; s.left=xy[0]+"px"; s.top=xy[1]+"px"; } }

// NO BUBBLE ( EVENT )
function DomNB(e) { if(window.event) { 
  var a=window.event; a.cancelBubble=true; a.returnValue=false; } 
 if(e&&e.stopPropagation&&e.preventDefault) { 
  e.stopPropagation(); e.preventDefault(); } }

// SET OPACITY ( ELEMENT, OPACITY 0-1 )
function DomO(e,p) { e.style.opacity=p;
 e.style.filter='alpha(opacity='+Math.floor(p*100)+')'; }

// PRINT INTO ELEMENT ( ELEMENT, STRING )
function DomP(e,s) { e.innerHTML=s; } 

// GET ABSOLUTE PAGE POSITION [x,y] OF ( ELEMENT )
function DomPxy(e) { var t=[0,0]; 
 if(e.offsetParent) { 
  while(e.offsetParent) { 
   t[0]+=e.offsetLeft; t[1]+=e.offsetTop; e=e.offsetParent; } } 
 else if(e.x||e.y) { t[0]=e.x; t[1]=e.y; } return t; }

// 0=HIDE|1=SHOW ELEMENT
function DomS(e,s) { e.style.display=(["none","block"])[s]; }

// DOM SCROLL BAR OFFSET [ X, Y ]
function DomSO() { var x,y; 
 if(window.pageYOffset || window.pageXOffset) { 
  x=window.pageXOffset; y=window.pageYOffset; } 
 else if(document.documentElement && 
  (document.documentElement.scrollLeft || 
   document.documentElement.scrollTop)) { 
    x=document.documentElement.scrollLeft; 
    y=document.documentElement.scrollTop; } 
 else if(document.body) { 
  x=document.body.scrollLeft; y=document.body.scrollTop; } 
 return [x,y]; }

// GET SIZE [x,y] OF ( ELEMENT )
function DomSxy(e) { return [e.offsetWidth,e.offsetHeight]; }

// RESIZE ( ELEMENT, [X,Y] )
function DomRxy(e,xy) { 
 e.style.width=xy[0]+'px'; 
 e.style.height=xy[1]+'px'; }

// WRITE INTO DOCUMENT ( HTML )
function DomW(t) { document.write(t); }

// GET WINDOW [ WIDTH, HEIGHT ]
function DomWxy() { var x,y; 
 if(self.innerWidth) { x=self.innerWidth; y=self.innerHeight; } 
 else { t=document.documentElement; 
  if(t.clientWidth) { x=t.clientWidth; y=t.clientHeight; } 
  else { t=document.body; x=t.clientWidth; y=t.clientHeight;} } 
 return [x,y]; }

/*============================================================================

CLASS NAME HELPER

------------------------------------------------------------------------------
Ability to build a multi-state class name, for example "active-over".
States seperated by a "-" and kept alpha sorted.
============================================================================*/
// ADD STATE TO CLASS NAME ( ELEMENT, STATE ) - SAFE IF EXISTS
function ClassA(e,s) { var t='';
 if(e) {
  if(!e.className) { e.className=s; return; }
  var a=e.className;
  a=a.split('-'); a.P(s);
  a.R(a.F("")); a.sort(); a.U(); t=a.join('-'); if(e.className!=t) e.className=t; } }

// REMOVE STATE FROM CLASS NAME ( ELEMENT, STATE ) - SAFE IF EXISTS
function ClassR(e,s) { var t='';
 if(e&&e.className) {
  var a=e.className;
  a=a.split('-'); 
  a.R(a.F(s)); t=a.join('-'); if(e.className!=t) e.className=t; } }

/*============================================================================
POSITIONING
------------------------------------------------------------------------------
[x,y] -> x = [reference, anchor, offset]
         y = [reference, anchor, offset]
------------------------------------------------------------------------------
REFERENCE
 null/0 - relative to mouse
 1 - relative to viewport
 object - relative to reference object
------------------------------------------------------------------------------
ANCHORS (relative to left or top)
 -2 - xx|________|
 -1 -   |xx______|     
  0 -   |___xx___|   (centered)
  1 -   |______xx|      
  2 -   |________|xx
------------------------------------------------------------------------------
OFFSET
 [ pixels, multiply times popup size, multiply times reference size ]
============================================================================*/
// CONSTRAIN TO PAGE VIEWPORT ( POSITION, SIZE, SCROLL OFFSET, WINDOW SIZE )
function PosC(p,s,o,w) { var h=Math.floor(s/2);
 return Clamp(o+h,p+h,o+w-h)-h; }

// POSITION POPUP XY ( XY, SIZE, RAO, WINDOW, SCROLL OFFSET )
function PosXY(xy,s,rao,w,o) {  var rp=domMxy[xy],rs=0,p=0;
 if(typeof(rao[0])=='object') { 
  rp=DomPxy(rao[0])[xy]; rs=DomSxy(rao[0])[xy]; }  
 else if(rao[0]==1) { rp=o; rs=w; }
 switch(rao[1]) {
  case -2: p=rp-s; break;
  case -1: p=rp; break;
  case 0: p=Math.floor(rp+(rs/2)-(s/2)); break;
  case 1: p=rp+rs-s; break;
  case 2: p=rp+rs; break; }
 return Math.floor(p+rao[2][0]+rao[2][1]*s+rao[2][2]*rs); }
 
// POSITION POPUP ( POPUP SIZE [x,y], REFERENCE/ANCHOR/OFFSET [x,y] ) -> [x,y]
function Pos(s,rao) { var w=DomWxy(); var o=DomSO(); 
 return [PosC(PosXY(0,s[0],rao[0],w[0],o[0]),s[0],o[0],w[0]),
         PosC(PosXY(1,s[1],rao[1],w[1],o[1]),s[1],o[1],w[1])]; }

/*============================================================================

SLIDESHOWS

------------------------------------------------------------------------------
0: ID, 
1: REFRESH FREQUENCY MS,
2: TIME BETWEEN SLIDES MS,
3: FADE TIME MS,
4: PATH INCLUDING SLASH, 
5: [ IMAGE, ... ],
6: WAITING ON SLIDE (1)
7: NEXT INDEX (1)
8: REFRESH COUNTER
9: INTERVAL HANDLE
10: MAX X
11: MAX Y
12: CURRENT X
13: CURRENT Y
14: NEXT X
15: NEXT Y
16: NEXT IMAGE
============================================================================*/
// SLIDE SHOW PARAMETER OBJECT
var slideA={};

// SET IMAGE SOURCE ( DATA, SLIDE 0|1, INDEX ) 
function SlideI(d,s,n) { 
 var e=DomL(d[0]+"Slide"+s);
 d[16]=new Image();
 var r=d[4]+d[5][n]+".jpg";
 d[16].src=e.src=r; }

// SET IMAGE POSITIONS ( DATA, X, Y) 
function SlideXY(d,x,y) { var e;
 var x2=Math.round((d[10]-x)/2);
 var y2=Math.round((d[11]-y)/2);
 e=DomL(d[0]+"Slide"+0); DomM(e,[x2,y2]); DomRxy(e,[x,y]); 
 e=DomL(d[0]+"Slide"+1); DomM(e,[x2,y2]); DomRxy(e,[x,y]); }

// CANCEL INTERVAL TIMER ( DATA )
function SlideC(d) { if(d[9]) { clearInterval(d[9]); } d[8]=0;}

// SET OPACITY ( DATA, SLIDE, PER )
function SlideO(d,s,p) { 
 var pp=1-p;
 SlideXY(d,
  Math.round(d[12]*pp+d[14]*p),
  Math.round(d[13]*pp+d[15]*p));
 if(s==1) { pp=p; p=1-p; }
 var e=DomL(d[0]+"Slide0"); DomO(e,p); 
 e=DomL(d[0]+"Slide1"); DomO(e,pp); }

// ADVANCE INDEX
function SlideA(d) { d[7]++; if(d[7]>=(d[5].length)) d[7]=0; }

// ON INTERVAL TIMER ( ID, IMAGE NUM ) 
function SlideT(i,n) { var d=slideA[i]; d[8]+=d[1]; 
 if(d[8]<d[3]) { SlideO(d,n,d[8]/d[3]); } else { SlideO(d,n,1.0); }
 if((d[8]>d[2])&&(d[6]==n)) { 
  d[6]=(d[6]+1)&1; SlideI(d,d[6],d[7]); SlideA(d); } }
 
// ON LOAD IMAGE ( DATA, IMAGE NUM )
function SlideL(i,n) { 
var d=slideA[i]; if(d[6]==n) { 
 SlideC(d); 
 var e=d[16];
 if(!e) e=DomL(d[0]+"Slide"+n);
 var x=e.width,y=e.height;
 d[12]=d[14];
 d[13]=d[15];
 d[14]=x;
 d[15]=y;
 d[9]=setInterval("SlideT('"+i+"',"+n+");",d[1]); } }

// START SLIDE SHOW ( [ 
//  ID, 
//  MAX X, 
//  MAX Y, 
//  REFRESH FREQUENCY MS,
//  TIME BETWEEN SLIDES MS,
//  FADE TIME MS,
//  PATH INCLUDING SLASH, 
//  [ IMAGE, ... ],
//  START INDEX | -1=RANDOM ] )
function Slide(i,x,y,r,b,f,p,a,s) {
 var sa=s;
 if(sa==-1) { sa=Math.floor(Math.random()*(a.length-1)); } 
 var sb=sa+1;
 if(sb>=a.length) sb=0;
 var ia=i+'Slide0';
 var ib=i+'Slide1';
 var d=[i,r,b,f,p,a,1,((sb+1)>=(a.length-1)?0:sb+1),0,0,x,y,0,0,0,0]; 
 slideA[i]=d;
 var xy=' style="width='+x+'px;height='+y+'px;position:';
 DomP(DomL(i),'<div'+xy+'relative">'+
  '<img id="'+ia+'" onload="SlideL(\''+i+'\',0);" src=""'+
   xy+'absolute;z-index:12;width:0;height:0;left:'+Math.round(x/2)+'px;right:'+Math.round(y/2)+'px;">'+
  '<img id="'+ib+'" onload="SlideL(\''+i+'\',1);" src=""'+
   xy+'absolute;z-index:11;width:0;height:0;left:'+Math.round(x/2)+'px;right:'+Math.round(y/2)+'px;">'+
  '</div>'); 
 SlideI(d,0,sa); SlideI(d,1,sb); }

/*============================================================================

POPOVER

============================================================================*/
// BOUNDS FOR UNPOPING
var popoverB=[0,0,0,0]; 

// CURRENT OBJECT OVER
var popoverC;

// NEW POPUP COUNTER ( 0=OFF, 1=COUNTING ..., 6=DISPLAY, 7=DISPLAYING )
var popoverD=0; 

// POPUP ELEMENT
var popoverE;

// POSITIONING
var popoverP;

// OUT 
function PopoverO() { if(popoverE) DomM(popoverE,[-3000,-3000]); popoverD=0; } 

// TIMER INTERRUPT BOUNDS CHECK
function PopoverB() { 
 if((domMxy[0] < popoverB[0]) || (domMxy[0] > popoverB[2]) ||
   (domMxy[1] < popoverB[1]) || (domMxy[1] > popoverB[3])) { PopoverO(); } }

// TIMER INTERRUPT
function PopoverI() { 
 // MUCH CHECK IF OUT OF BOUNDS EVEN IF NOT DISPLAYING
 PopoverB(); 
 if(popoverD==0) return;
 // CHECK FOR NEW OBJECT
 if((popoverD>=1)&&(popoverD<=5)) { popoverD++; return; }
 // CHECK IF NEW DISPLAY
 if(popoverD==6) { popoverD=7; }
 if(popoverP!=0) { DomM(popoverE,Pos(DomSxy(popoverE),popoverP)); } }

// POPOVER SETUP
function PopoverS() { setInterval("PopoverI();",1000/10); } 

// POPOVER CALL ON MOUSEOVER ( OBJECT OVER, OBJECT POPUP, POS | 0=JUST DSP )
function Popover(o,u,po) { 
 if((popoverC==o)&&popoverD) return; 
 if(popoverD) PopoverO();
 var p=DomPxy(o),s=DomSxy(o); 
 popoverB=[p[0],p[1],p[0]+s[0],p[1]+s[1]];
 popoverC=o; popoverE=u; popoverD=1; popoverP=po; }

/*============================================================================

COOKIE CART 

------------------------------------------------------------------------------
[quanity, item, return url, option, price]
============================================================================*/
// CART CONTENTS
var cart=[];

// CART SET COOKIE
function CartS(t) { document.cookie=t; } 

// CART UPLOAD TO COOKIE
function CartU() { if(cart.length==0) { CartE(); return; }
 CartS('cart='+(cart.M(function(t) { return t.join('`'); })).join('~')); }

// CART DOWNLOAD FROM COOKIE
function CartD() { cart=[]; 
 document.cookie.split(';').A(function(t) { 
  var s=t.split('='); if(s[0]=='cart'&&s.length>1) 
   s[1].split('~').A(function(t) { 
    var s=t.split('`'); if(s.length==5) cart.P(s); }); }); }

// CART EMPTY
function CartE() { cart=[]; CartS('cart=;'); }

// CART QUANTITY
function CartQ() { return (cart.length==0)?0:cart.A(function(t,r) { 
 return r+parseInt(t[0]) },0); }

// CART TOTAL INDEX ( INDEX, BASE )
function CartTI(t,r) { return r+parseInt(t[0])*parseFloat(t[4]); }

// CART TOTAL 
function CartT() { return (cart.length==0)?0:cart.A(CartTI,0); }

// CART ADD ITEM ( QUANITY, ITEM, URL, OPTION, PRICE )
function CartA(q,i,u,o,p) { cart.P([q,i,u,o,p]); CartU(); }

// CART REMOVE ITEM ( INDEX )
function CartR(i) { cart.R(i); CartU(); }

// DOWNLOAD CURRENT CART CONTENTS
CartD();

/*============================================================================

DELAYED HIDING OF ELEMENTS

============================================================================*/
// DELAYED HIDE TIMEOUT HANDLE
var hideH=null;

// DELAYED HIDE ELEMENT
var hideE=null;

// DELAYED HIDE ( ELEMENT )
function Hide(e) { 
 if(hideH!=null) { 
  clearTimeout(hideH); hideH=null; DomM(hideE,[-3000,-3000]); } 
 hideE=e; hideH=setTimeout("DomM(hideE,[-3000,-3000]); hideH=null;",10); }

// REMOVE HIDE ON ( ELEMENT )
function HideR(e) { 
 if(hideH==null||hideE!=e) return;
 clearTimeout(hideH); hideH=null; }

/*============================================================================

POPUPS

============================================================================*/
// POPUP [ [ PARENT, CONTAINER, SELF ] ... ] ARRAY
var popA=[];

// POPUP TIMEOUT HANDLE
var popH=null;

// POPUP DEATH TO TIMER
function PopD() { if(popH) { clearTimeout(popH); popH=null; } }

// POPUP KILL POPUP ( ITEM )
function PopK(i) { 
 ClassR(i[0],'over');
 ClassR(i[1],'over');
 ClassR(i[2],'over');
 Hide(i[1]); }

// POPUP NONE - REMOVE ALL POPUPS
function PopN() { PopD(); popA.A(PopK); popA.length=0; }

// POPUP MOUSE OUT ( THIS, EVENT )
function PopU(t,e) {
 if(popH==null) { 
  popH=setTimeout("popA.A(PopK); popA.length=0; popH=null;",500); } }

// POPUP MOUSE OVER TERMINAL ( THIS, EVENT, CONTAINER ID )
function PopT(t,e,c) { 
 PopD(); var i,a=popA; c=DomL(c); 
 while(a.length>0) { 
  i=a.T(); 
  if(i[1]==c) { 
   ClassR(i[2],'over'); 
   i[2]=t; ClassA(t,'over'); ClassA(i[0],'over'); return; } 
  PopK(i); a.length--; } }

// POPUP MOUSE OVER CONTAINER ( THIS, EVENT )
function PopC(t,e) {
 PopD(); var i,j,a=popA; j=a.length-1;
 for(;j>=0;j--) { i=a[j]; 
  if(i[1]==t) { ClassA(i[0],'over'); return; } } }

// LOCATE POPUP ( THIS, CONTAINER, POSITIONING )
function PopL2(t,c,p) { HideR(c); DomM(c,Pos(DomSxy(c),p)); }
function PopL(t,c,p) { PopL2(t,c,p); PopL2(t,c,p); }

// POPUP NEW ( THIS, EVENT, PARENT CONTAINER ID, CONTAINER ID, POSITION )
function Pop(t,e,g,c,p) {
 PopD(); c=DomL(c); g=DomL(g); var i,a=popA;
 while(a.length>0) { 
  i=a.T(); if(i[1]==g) { ClassR(i[2],'over'); break; } 
  PopK(i); a.length--; } 
 a.P([t,c,null]); ClassA(t,'over'); PopL(t,c,p); }

/*============================================================================
EOF
============================================================================*/
// RUN THE LIBRARY
function FFJL() { DomI(); PopoverS(); }
























/*============================================================================

var CssHack={
 In:function() { this.className+=" in"; },
 Out:function() { 
  this.className=this.className.replace(new RegExp(" in\\b"), ""); },
 Down:function() { this.className+=" down"; },
 Up:function() { 
  this.className=this.className.replace(new RegExp(" down\\b"), ""); },
 Focus:function() { this.className+=" focus";  },
 Blur:function() { 
  this.className=this.className.replace(new RegExp(" focus\\b"), ""); },
 Setup:function(e) { var i,n,s=e.className;
  if(typeof(s)=='string') { s=s.split(' '); n=s.length;
   for(i=0;i<n;i++) {
    if((s[i]==domFileU)||(s[i]==domFileB)) e.className+=" me"; }
   for(i=0;i<n;i++) { 
    if(s[i]=='ie') {
     e.onmouseover=CssHack.In;
     e.onmouseout=CssHack.Out;
     e.onfocus=CssHack.Focus;
     e.onblur=CssHack.Blur;
     e.onmousedown=CssHack.Down;
     e.onmouseup=CssHack.Up; } } }
  for(i=0;i<e.childNodes.length;i++) { CssHack.Setup(e.childNodes[i]); } }
};



FIX BROKEN CSS PSEUDO-CLASSES

============================================================================*/












/*


// WRITE MAIL LINK ( NAME, ADDRESS ) 
function mail(n,a){var t=n+'@'+a;return '<a href="mailto:'+t+'">'+t+'</a>';}


// ARRAY
Array.prototype.P=function(v){this[this.length]=v;}; // PUSH ( ITEM )
Array.prototype.M=function(f,v){var a=[],j,i=0,n=this.length;if(n<0)return a;for(;i<n;i++){j=f(this[i],i,v);if(j){a.P(j);}}return a;}; // MAP ( FUNCTION )


// DOM SET CLASS NAME ( ELEMENT, CLASS )
function DomClass(e,c){if(e)e.className=c;}

// DOM SCROLL BAR OFFSET [ X, Y ]
function DomSO() { var x,y; if (window.pageYOffset || window.pageXOffset) { x=window.pageXOffset; y=window.pageYOffset; } else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) { x=document.documentElement.scrollLeft; y=document.documentElement.scrollTop; } else if (document.body) { x=document.body.scrollLeft; y=document.body.scrollTop; } return [x,y]; }

// LOOKUP ELEMENT ( ID ) 
function DomL(i) { return document.getElementById(i); }

// PRINT INTO ELEMENT ( ID, STRING )
function DomP(i,s) { DomL(i).innerHTML=s; } 

// PRINT INTO ELEMENT VALUE ( ID, STRING )
function DomPV(i,s) { DomL(i).value=s; } 

// GET VALUE ( ID )
function DomV(i) { return DomL(i).value; }


// GET WINDOW [ WIDTH, HEIGHT ]
function DomWxy() { var x,y; if(self.innerWidth) { x=self.innerWidth; y=self.innerHeight; } else { t=document.documentElement; if(t.clientWidth) { x=t.clientWidth; y=t.clientHeight; } else { t=document.body; x=t.clientWidth; y=t.clientHeight;} } return [x,y]; }

// DOM FIX INPUT FOCUS MODEL
function DomFH(e) { e.setAttribute("autocomplete","OFF"); } 
// HACK! - BUG FIX FOR FIREFOX
function DomFB() { this.blur(); }
function DomFF() { this.focus(); }
function DomF(e) { var i=0,n=e.nodeName.toLowerCase(); if(n=='input' || n=='textarea') { DomFH(e); e.onmouseover=DomFF; e.onmouseout=DomFB; } for(;i<e.childNodes.length;i++) { DomF(e.childNodes[i]); } }


// POPUP IMAGE LIBRARY


var imageI; // IMAGE USED FOR LOADING
var imageXS=1,imageYS=1; // IMAGE SIZE
var imageX=0,imageY=0; // MOUSE POSITION
var imageOB=[0,0,0,0]; // IMAGE OUT OF BOUNDS
var imageP=""; // IMAGE URL PATH
var imageD=0; // 0=HIDDEN, 1=VISABLE
var imagePP=""; // LOADED IMAGE PATH

// IMAGE OUT (WAS) DELAYED EVENT
function ImageOD() { ImageUC(); DomS("Image",0); DomS("ImageLoading",0); imageD=0; } 

var imageU; // IMAGE IN TIMER

// IMAGE IN DELAYED EVENT
function ImageUD() { imageD=1; ImageI(); DomS("ImageLoading",1); imageI=new Image(); imageI.onload=ImageL; imageI.src=imageP; var i=DomL("ImageImg"); i.src=imageP; } 

// CLEAR TIMEOUT
function ImageUC() { if(imageU) clearTimeout(imageU); imageU=null; }

// SIZE/SHOW IMAGE
function ImageSS(x,y) { var e=DomL("Image").style; e.width=x+"px"; e.height=y+"px"; e.display="block"; imageD=1; } 

// IMAGE ALLREADY LOADED 
function ImageAL() { DomS("Image",1); imageD=1; }

// IMAGE ON LOAD
function ImageL() { imagePP=imageP; var x=imageI.width, y=imageI.height, i=DomL("ImageImg"); imageXS=x; imageYS=y; i.width=x; i.height=y; imageD=1; ImageI(); ImageSS(x,y); } 

// MOUSE MOVE
function ImageP(e) { var x=0,y=0;
if(!e) var e=window.event;
if(e.pageX || e.pageY) { x=e.pageX; y=e.pageY; }
else if (e.clientX || e.clientY) {
x=e.clientX+document.body.scrollLeft+document.documentElement.scrollLeft;
y=e.clientY+document.body.scrollTop+document.documentElement.scrollTop; }
imageX=x; imageY=y; }

// IMAGE TOOLTIP SETUP
function ImageS() { var d=document; d.onmousemove=ImageP; setInterval("ImageI();",1000/10); } 

// TIMER INTERRUPT BOUNDS CHECK
function ImageBC() { if((imageX < imageOB[0]) || (imageX > imageOB[2]) ||
(imageY < imageOB[1]) || (imageY > imageOB[3])) { ImageOD(); } }

// TIMER INTERRUPT
function ImageI() { ImageBC(); if(imageD==0) return; var xy=DomWxy(); var sxy=DomSO(); xy[0]+=sxy[0]; xy[1]+=sxy[1]; var x=imageX-Math.floor(imageXS/2), y=imageY-Math.floor(imageYS/2); if(x<sxy[0]) x=sxy[0]; if((x+imageXS)>xy[0]) x=xy[0]-=imageXS; if(y<sxy[1]) y=sxy[1]; if((y+imageYS)>xy[1]) y=xy[1]-=imageYS; var e=DomL("Image").style; e.left=x+"px"; e.top=y+"px"; e=DomL("ImageLoading").style; e.left=(imageX-50)+"px"; e.top=(imageY-25)+"px"; }

// MOUSEOVER, UPDATE IMAGE ( OBJECT FOR BOUNDS, IMAGE URL )
function ImageU(o,i) { var pxy=DomPxy(o),sxy=DomSxy(o); imageOB=[pxy[0],pxy[1],pxy[0]+sxy[0],pxy[1]+sxy[1]];
if((imageP==i)&&imageU) return; 
if(imagePP==i) { ImageUC(); ImageAL(); return; }
imageP=i; ImageUC(); imageU=setTimeout("ImageUD();",1000/2); } 

*/
