//
//  JSviewer - Dynamic HTML Javascript image viewer
//  jsviewer.js
//  version 1.0
// 
//  Copyright (c) 2002 Seann Herdejurgen (seann@herdejurgen.com)
//  All rights reserved.
//
//  Redistribution and use in source and binary forms, with or without
//  modification, are permitted provided that the following conditions
//  are met:
//
//  1. Redistributions of source code must retain the above copyright
//     notice, this list of conditions and the following disclaimer.
//  2. Redistributions in binary form must reproduce the above copyright
//     notice, this list of conditions and the following disclaimer in the
//     documentation and/or other materials provided with the distribution.
//  3. The name of the author may not be used to endorse or promote products
//     derived from this software without specific prior written permission.
//
//  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
//  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
//  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
//  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
//  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
//  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
//  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
//  AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
//  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
//  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
//  SUCH DAMAGE.
//
//  JSviewer is distributed as freeware for non-commercial use.
//
//  Documentation and updates available on-line at http://www.jsviewer.com/
//

var images=new Array()
var scroller,timeout=0
var offset=75
var out,X,Y,H,W,width,height,scrollx,scrolly
var R=new Array(0,  0,  0, 11,128,255,255,128, 64,128,255,255,255,128, 11,  0)
var G=new Array(0, 11,128,255,255,255,255,128, 11,  0,  0, 11, 64, 64, 64,  0)
var B=new Array(0,128,255,128, 11, 11,255,128, 64,128,255,128, 11,  0,  0,  0)
var gradient=16

if (document.all) {
   width=document.body.clientWidth
   height=document.body.clientHeight
} else {
   width=window.innerWidth
   height=window.innerHeight
} 

var XC=Math.round((width-(R.length-1)*gradient)/2)

document.writeln('<div id=navbar style="position:absolute; top:5"></div>')
document.writeln('<div id=advbar style="position:absolute; top:35; visibility:'+(GetCookie('advanced')==0?"hidden":"visible")+'"></div>')
document.writeln('<div id=colorbar style="position:absolute; top:65; left:'+XC+'; visibility:'+(GetCookie('advanced')==0?"hidden":"visible")+'"><img src=spectrum.png alt="Choose a background color"></div>')
document.writeln('<div id=picture style="position:absolute; left:0; top:'+offset+'; clip:rect(0,'+width+','+(height-offset)+',0); overflow:hidden"></div>')
document.writeln('<div id=caption style="position:absolute; left:0; top:100"></div>')

function GetCookie(name) {
   var cookies=document.cookie.split('; ')
   if (document.cookie=='') cookies.length=0
   for (var i=0;i<cookies.length;i++) {
      if (cookies[i].indexOf(name+'=')==0) {
         var cookie=cookies[i].split('=')
         return unescape(cookie[1])
      }
   }
   return ''
}

function getdoc(name) {
   if (document.layers) {
      return eval("document."+name+".document")
   } else if (document.all) {
      return eval("document.all."+name+".document")
   } else {
      return document.getElementById(name).ownerDocument
   }
}

function getlayer(name) {
   if (document.layers) {
      return eval("document."+name)
   } else if (document.all) {
      return eval("document.all."+name+".style")
   } else {
      return document.getElementById(name).style
   }
}

function setclip(layer,x,y,t,r,b,l) {
   if (document.layers) {
      layer.clip.top=t
      layer.clip.right=r
      layer.clip.bottom=b
      layer.clip.left=l
      layer.moveTo(x,y)
   } else if (document.all) {
      layer.clip="rect("+t+"px "+r+"px "+b+"px "+l+"px)"
      layer.pixelLeft=x
      layer.pixelTop=y
   } else {
      layer.left=x
      layer.top=y
      layer.clip="rect("+t+" "+r+" "+b+" "+l+")"
   }
}

function output(layer,html) {
   if (document.layers) {
      var doc=getdoc(layer)
      doc.open()
      doc.writeln(html)
      doc.close()
   } else if (document.all) {
      layer=eval(layer)
      layer.innerHTML=html
   } else {
      document.getElementById(layer).innerHTML=html
   }
}

window.onload=function init() {
   if (GetCookie('advanced')=='') document.cookie='advanced=0; path=/'
   if (GetCookie('cache')=='') document.cookie='cache=1; path=/'
   if (GetCookie('slideshow')=='') document.cookie='slideshow=Stop; path=/'
   if (GetCookie('thumbnails')=='') document.cookie='thumbnails=0; path=/'
   if (GetCookie('timer')=='') document.cookie='timer=8000; path=/'
   if (GetCookie('transitions')=='') document.cookie='transitions=1; path=/'
   if (parent && parent.frames[0] && parent.frames[0].document) {
      document.bgColor=parent.frames[0].document.bgColor
      document.fgColor=parent.frames[0].document.fgColor
      document.linkColor=parent.frames[0].document.linkColor
      document.alinkColor=parent.frames[0].document.alinkColor
      document.vlinkColor=parent.frames[0].document.vlinkColor
   }

   // Create navbar
   var datasrc=getdoc("data")
   if (datasrc.forms[0].pictures) {
      out='<table width='+width+'><tr><td align=center><form name=navform><font face=Arial,Helvetica>'

      //rkh out+='<a href="Javascript:void makethumbs(1)" onmouseover="window.status=(GetCookie(\'thumbnails\')==0?\'Show thumbnail images\':\'Show individual pictures\'); return true" onmouseout="window.status=\'\'; return true"+>thumbnails</a> '

      out+='<select name=pictures onchange=displayimage() onmouseover="window.status=\'Select an image to display\'; return true" onmouseout="window.status=\'\'; return true"> '

      for (var i=0; i<datasrc.forms[0].pictures.options.length; i++) {
//rkh         out+='<option value="'+datasrc.forms[0].pictures.options[i].value+'"> '+(i+1)+'. '+datasrc.forms[0].pictures.options[i].text
         out+='<option value="'+datasrc.forms[0].pictures.options[i].value+'"> '+datasrc.forms[0].pictures.options[i].text
      }
      out+='</select>'

      out+='<input type=button value="|<<" onclick=firstimage(this.form) onmouseover="window.status=\'First Picture\'; return true" onmouseout="window.status=\'\'; return true"> '
      out+='<input type=button value="<<" onclick=previmage(this.form) onmouseover="window.status=\'Previous Picture\'; return true" onmouseout="window.status=\'\'; return true"> '
      out+='<input type=button value=">>" onclick=nextimage(this.form) onmouseover="window.status=\'Next Picture\'; return true" onmouseout="window.status=\'\'; return true"> '
      out+='<input type=button value=">>|" onclick=lastimage(this.form) onmouseover="window.status=\'Last Picture\'; return true" onmouseout="window.status=\'\'; return true"> '

      out+='<input type=button value='+GetCookie('slideshow')+' onclick=slideshow(this) onmouseover="window.status=GetCookie(\'slideshow\')+\' slideshow\'; return true" onmouseout="window.status=\'\'; return true"> '
      //rkh out+='<a href="Javascript:void toggleadvbar()" onmouseover="window.status=(GetCookie(\'advanced\')==0?\'Show\':\'Hide\')+\' advanced controls\'; return true" onmouseout="window.status=\'\'; return true">advanced</a>'

      out+='</font></form></td></tr></table>'
      output("navbar",out)
   }

   // Start pre-fetching images in the background
   prefetch(0)

   // Create advanced bar
   out='<table width='+width+'><tr><td align=center><form><font face=Arial,Helvetica>'
   out+='<a href="" onclick="faster(); return false" onmouseover="window.status=\'Display images faster\'; return true" onmouseout="window.status=\'\'; return true">faster</a> '
   out+='<a href="" onclick="slower(); return false" onmouseover="window.status=\'Display images slower\'; return true" onmouseout="window.status=\'\'; return true">slower</a> '
   if (document.all) out+='<input type=checkbox name=filter '+(GetCookie('transitions')==1?'checked':'')+' onclick=togglefilter(this)> transitions '
   out+='<input type=checkbox name=entropy '+(GetCookie('entropy')==1?'checked':'')+' onclick=togglerandom(this)> random '
   out+='<input type=checkbox name=cache '+(GetCookie('cache')==1?'checked':'')+' onclick=toggleprefetch(this)> prefetch images'
   out+='</font></form></td></tr></table>'
   output("advbar",out)

   // Create picture frame
   out='<table width='+width+' height='+height+'><tr valign=center><td align=center><font face=Arial,Helvetica>'
   out+='Loading images...'
   out+='</font></td></tr></table>'
   output("picture",out)

   // Display image or thumbnails
   if (GetCookie('thumbnails')==0) {
      displayimage()
   } else {
      makethumbs()
   }

   // Start slideshow
   if (GetCookie('slideshow')=="Stop") {
      timeout=window.setTimeout("slides()",GetCookie('timer'))
   }

   // Setup hooks to zoom image
   if (document.all || navigator.userAgent.indexOf('Netscape6')!=-1) {
      document.onmouseup=zoomimage
   } else {
      document.onmousedown=zoomimage
   }
   document.onmousemove=roam

   // Capture Netscape resize events
   if (document.layers) {
      parent.window.onresize=redraw
      parent.window.captureEvents(Event.RESIZE)
      document.captureEvents(Event.MOUSEDOWN|Event.MOUSEMOVE)
   }
}

function redraw() {
init()
   window.location.reload()
   return false
}

function navform() {
   var doc=getdoc("navbar")
   return doc.forms["navform"]
}

function prefetch(num) {
   form=navform()
   if (GetCookie('cache')==1 && num<form.pictures.length) {
      images[num]=new Image()
      images[num].src=form.pictures.options[num].value.split(';')[0]
      images[num].zoom=1.0
      images[num].top=0
      images[num].left=0
      images[num].onload=function() { prefetch(num+1) }
      images[num].onabort=function() { refetch(num) }
      images[num].onerror=function() { refetch(num) }
   }
}

function refetch(num) {
   var cache=new Image()
   cache.src=images[num].src
   images[num].onabort=function() { }
   images[num].onerror=function() { }
   images[num].src=cache.src
}

function makethumbs(toggle) {
   if (toggle && GetCookie('thumbnails')==1) { return displayimage() }
   if (GetCookie('thumbnails')==0) { document.cookie='thumbnails=1; path=/' }
   var layer=getlayer("caption")
   layer.visibility="hidden"
   layer=getlayer("picture")
   setclip(layer,0,offset,0,width,height,0)
   var doc=getdoc("picture")
   out=""
   var form=navform()
   if (form.pictures) {
      for (var i=0; i<form.pictures.length; i++) {
         var pic=form.pictures.options[i]
         var comment=pic.text
         while (comment.indexOf("'")!=-1) comment=comment.replace("'","")
         var thumb=pic.value.split(';')[0]
         var path=thumb.split('/')
         var p=path.length
         path[p]=path[p-1]
         path[p-1]=".thumbs"
         thumb=path.join('/')
         out+='<a href="" onclick="form=window.navform(); form.pictures.selectedIndex='+i+'; window.displayimage(); return false" onmouseover="window.status=\''+comment+'\'; return true" onmouseout="window.status=\'\'; return true">'
         out+='<img border=0 hspace=10 vspace=10 src="'+thumb+'" alt="'+pic.text+'"></a>'
      }
   } else {
      out+='No thumbnails available'
   }
   output("picture",out)
}

function displayimage(zoom) {
   var form=navform()
   var layer=getlayer("picture")
   var num=form.pictures.selectedIndex
   var pic=form.pictures.options[num]
   var comment=pic.value.split(';')[1]
   if (!comment) comment=""
   if (GetCookie('thumbnails')==1) document.cookie='thumbnails=0; path=/'
   if (images && images[num] && images[num].width && images[num].height) {
      W=Math.round(images[num].width*images[num].zoom)
      H=Math.round(images[num].height*images[num].zoom)
      if (W>width-20) W=width-20
      if (H>height-140) H=height-140
      if (images[num].top>(images[num].height-H/images[num].zoom)) { images[num].top=Math.round(images[num].height-H/images[num].zoom) }
      if (images[num].left>(images[num].width-W/images[num].zoom)) { images[num].left=Math.round(images[num].width-W/images[num].zoom) }
      if (images[num].top<0) { images[num].top=0 }
      if (images[num].left<0) { images[num].left=0 }
      var x=images[num].left
      var y=images[num].top
      var z=images[num].zoom
      var t=Math.round(y*z)
      var r=Math.round(x*z+W)
      var b=Math.round(y*z+H)
      var l=Math.round(x*z)
      X=Math.round(width/2-W/2-l)
      Y=Math.round(height/2-H/2-t)

      out='<img border=0 src="'+pic.value.split(';')[0]+'" alt="'+pic.text+'" width='+(images[num].width*z)+' height='+(images[num].height*z)+'>'
      if (document.all && GetCookie('transitions')==1 && !zoom) {
         var d=Math.round(GetCookie('timer')/4000)
         var trans

         //rkh switch (Math.floor(Math.random()*17)) {
	 switch(3) {
            case 0: trans="Barn(duration="+d+",motion="+randompick('in','out')+",orientation=",randompick('horizontal','vertical')+")"
                    break;
            case 1: trans="Blinds(duration="+d+",bands="+randompick(2,4,6,8)+",direction="+randompick('up','down','right','left')+")"
                    break;
            case 2: trans="CheckerBoard(duration="+d+",squaresX="+randompick(2,4,8,12)+",squaresY="+randompick(2,4,8,12)+",direction="+randompick('up','down','right','left')+")"
                    break;
            case 3: trans="Fade(duration="+d+",overlap="+randompick(0.25,0.5,0.75,1)+")"
                    break;
            case 4: trans="GradientWipe(duration="+d+",gradientSize="+randompick(0,0.1,0.3,0.5,0.7,0.9,1)+",wipeStyle="+randompick(0,1)+",motion="+randompick('forward','reverse')+")"
                    break;
            case 5: trans="Inset(duration="+d+")"
                    break;
            case 6: trans="Iris(duration="+d+",irisStyle="+randompick('DIAMOND','CIRCLE','CROSS','PLUS','SQUARE','STAR')+",motion="+randompick('in','out')+")"
                    break;
            case 7: trans="Pixelate(duration="+d+",maxSquare="+randompick(5,10,20,30,40,50)+")"
                    break;
            case 8: trans="RadialWipe(duration="+d+",wipeStyle="+randompick('CLOCK','WEDGE','RADIAL')+")"
                    break;
            case 9: trans="RandomBars(duration="+d+",orientation="+randompick('horizontal','vertical')+")"
                    break;
            case 10: trans="RandomBars(duration="+d+")"
                    break;
            case 11: trans="Slide(duration="+d+",pushStyle="+randompick('HIDE','PUSH','SWAP')+",bands="+randompick(1,2,3,4,5,6,7)+")"
                    break;
            case 12: trans="Spiral(duration="+d+",gridSizeX="+randompick(8,16,32,64)+",gridSizeY="+randompick(8,16,32,64)+")"
                    break;
            case 13: trans="Stretch(duration="+d+",stretchStyle="+randompick('HIDE','PUSH','SPIN')+")"
                    break;
            case 14: trans="Strips(duration="+d+",motion="+randompick('leftdown','leftup','rightdown','rightup')+")"
                    break;
            case 15: trans="Wheel(duration="+d+",spokes="+randompick(2,4,10,16,20)+")"
                    break;
            case 16: trans="Zigzag(duration="+d+",gridSizeX="+randompick(8,16,32,64)+",gridSizeY="+randompick(8,16,32,64)+")"
                    break;
         }
         document.all.picture.style.filter="progid:DXImageTransform.Microsoft."+trans
         if (navigator.appVersion.indexOf("MSIE 5.0")!=-1) document.all.picture.style.filter="revealTrans(duration="+d+",transition="+Math.floor(Math.random()*23)+")"
         document.all.picture.filters[0].Apply()
      }
      output("picture",out)
      if (document.all && GetCookie('transitions')==1 && !zoom) document.all.picture.filters[0].Play()
      if (Y+t<offset) Y=offset-t
      setclip(layer,X,Y,t,r,b,l)
      X+=l
      Y+=t

      layer=getlayer("caption")
      output("caption",'<table width='+width+'><tr><td align=center><font face="Arial,Helvetica">'+comment+'</font></td></tr></table>')
      setclip(layer,0,Y+H+10,0,width,H,0)
      layer.visibility="visible"

      window.status=pic.text
   } else {
      // Cache image before displaying it
      images[num]=new Image()
      images[num].src=pic.value.split(';')[0]
      images[num].zoom=1.0
      images[num].top=0
      images[num].left=0
      window.setTimeout("displayimage()",100)
   }
}

function randompick() {
  return randompick.arguments[Math.floor(Math.random()*randompick.arguments.length)]
}

function pick(n,c) {
  var i=n
  if (c>1) while (i==n) i=Math.floor(Math.random()*c)
  return i
}

function firstimage(form) {
  form.pictures.selectedIndex=0
  displayimage()
}

function lastimage(form) {
  form.pictures.selectedIndex=form.pictures.options.length-1
  displayimage()
}

function previmage(form) {
  var pics=form.pictures.options.length
  var pic=form.pictures.selectedIndex
  if (GetCookie('entropy')==1) {
     pic=pick(pic,pics)
  } else {
     pic=(pic+pics-1)%pics
  }
  form.pictures.selectedIndex=pic
  displayimage()
}

function nextimage(form) {
  var pics=form.pictures.options.length
  var pic=form.pictures.selectedIndex
  if (GetCookie('entropy')==1) {
     pic=pick(pic,pics)
  } else {
     pic=(pic+1)%pics
  }
  form.pictures.selectedIndex=pic
  displayimage()
}

function slideshow(button) {
   if (button.value=="Start") {
      button.value="Stop"
      document.cookie='slideshow=Stop; path=/'
      nextimage(button.form)
      timeout=window.setTimeout("slides()",GetCookie('timer'))
   } else {
      button.value="Start"
      document.cookie='slideshow=Start; path=/'
      window.clearTimeout(timeout)
   }
}

function slides() {
   var form=navform()
   if (GetCookie('thumbnails')=='0') nextimage(form)
   timeout=window.setTimeout("slides()",GetCookie('timer'))
}

function toggleadvbar() {
   document.cookie="advanced="+(1-GetCookie('advanced'))+"; path=/"
   var layer=getlayer("advbar")
   layer.visibility=(GetCookie('advanced')==0?"hidden":"visible");
   layer=getlayer("colorbar")
   layer.visibility=(GetCookie('advanced')==0?"hidden":"visible");
   return false
}

function togglefilter(box) {
   document.cookie='transitions='+(box.checked?"1":"0")+'; path=/'
}

function togglerandom(box) {
   document.cookie='entropy='+(box.checked?"1":"0")+'; path=/'
}

function toggleprefetch(box) {
   document.cookie='cache='+(box.checked?"1":"0")+'; path=/'
   if (box.checked) prefetch(0)
}

function faster() {
   if (GetCookie('timer')>125) {
      document.cookie="timer="+(GetCookie('timer')/2)+"; path=/"
      if (GetCookie('slideshow')=="Stop") {
         window.clearTimeout(timeout)
         slides()
      }
   } else {
      alert('I can\'t push her any faster captain!')
   }
}

function slower() {
   document.cookie="timer="+(GetCookie('timer')*2)+"; path=/"
}

function color(a,b,c) {
   if (a==b) {
      return a
   } else if (a<b) {
      return Math.round(a+(b-a)*c/gradient)
   } else {
      return Math.round(b+(a-b)*(gradient-c)/gradient)
   }
}

function hex(n) {
   var digits=new Array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F')
   return digits[Math.floor(n/16)]+digits[n%16]
}

function getcolor(n,c) {
   var r,g,b
   var i=Math.floor(n/gradient)
   n%=gradient
   r=color(R[i],R[i+1],n)
   g=color(G[i],G[i+1],n)
   b=color(B[i],B[i+1],n)
   if (c) {
      return '#'+hex(255-r)+hex(255-g)+hex(255-b)
   } else {
      return '#'+hex(r)+hex(g)+hex(b)
   }
}

function zoomimage(event) {
   var button,x,y,z
   if (document.all) {
      event=window.event
      x=event.clientX
      y=event.clientY
      button=event.button
      if (button==1) { z=0.25 }
      if (button==2) { z=-0.25 }
   } else {
      x=event.pageX
      y=event.pageY
      button=event.which
      if (button==1) { z=0.25 }
      if (button==3) { z=-0.25 }
   }
   if (GetCookie('advanced')==1 && y>=65 && y<=69 && x>=XC && x<=XC+(R.length-1)*gradient) {
      var bg=getcolor(x-XC,0)
      var fg=getcolor(x-XC,1)
      document.bgColor=bg
      document.fgColor=fg
      if (parent && parent.frames[0] && parent.frames[0].document) {
         parent.frames[0].document.bgColor=bg
         parent.frames[0].document.fgColor=fg
      }
   }
   if (GetCookie('thumbnails')==0 && x>X && x<X+W && y>Y && y<Y+H) {
      var form=navform()
      var num=form.pictures.selectedIndex
      z+=images[num].zoom
      if (z<0.1 || z>4) {
         images[num].zoom=1
         images[num].top=0
         images[num].left=0
      } else {
         images[num].top+=Math.round((y-Y)/images[num].zoom-H/(2*z))
         images[num].left+=Math.round((x-X)/images[num].zoom-W/(2*z))
         images[num].zoom=z
      }
      if (images[num].width*images[num].zoom<width-20) images[num].left=0
      if (images[num].height*images[num].zoom<height-140) images[num].top=0
      displayimage(1)
      if (document.all) window.event.cancelBubble=true
      return false
   } else {
      if (document.layers) document.routeEvent(event)
      return true
   }
}

function roam(event) {
   var x,y
   if (document.all) {
      event=window.event
      x=event.clientX
      y=event.clientY
   } else {
      x=event.pageX
      y=event.pageY
   }
   if (GetCookie('thumbnails')==0 && x>X && x<X+W && y>Y && y<Y+H) {
      var form=navform()
      var num=form.pictures.selectedIndex
      if (x<X+50) { scrollx=-1 } else if (x>X+W-50) { scrollx=1 } else { scrollx=0 }
      if (y<Y+50) { scrolly=-1 } else if (y>Y+H-50) { scrolly=1 } else { scrolly=0 }
      if (scrollx!=0 || scrolly!=0) {
         scrollimage()
      }
   } else {
      if (scroller) {
         window.clearTimeout(scroller)
         scroller=0
      }
      return false
   }
}

function scrollimage() {
   var form=navform()
   var num=form.pictures.selectedIndex
   if (images[num].width*images[num].zoom<=W && images[num].height*images[num].zoom<=H) return false
   var l,t
   l=images[num].left
   t=images[num].top
   images[num].left+=scrollx
   images[num].top+=scrolly
   if (images[num].top>(images[num].height-H/images[num].zoom)) { images[num].top=Math.round(images[num].height-H/images[num].zoom) }
   if (images[num].left>(images[num].width-W/images[num].zoom)) { images[num].left=Math.round(images[num].width-W/images[num].zoom) }
   if (images[num].top<0) { images[num].top=0 }
   if (images[num].left<0) { images[num].left=0 }
   if (images[num].left!=l || images[num].top!=t) {
      var layer=getlayer("picture")
      var x=images[num].left
      var y=images[num].top
      var z=images[num].zoom
      var t=Math.round(y*z)
      var r=Math.round(x*z+W)
      var b=Math.round(y*z+H)
      var l=Math.round(x*z)
      X=Math.round(width/2-W/2-l)
      Y=Math.round(height/2-H/2-t)
      if (Y+t<offset) Y=offset-t
      setclip(layer,X,Y,t,r,b,l)
      X+=l
      Y+=t
      scroller=window.setTimeout("scrollimage()",150)
   } else {
      scroller=0
   }
}


