function dec(hex)
{
 return parseInt(hex,16);
}
function hex(dec, len)
{
 var hexString=Number(dec).toString(16);

 if(len&&hexString.length<len)
  for(var c=hexString.length;c<len;c++)
   hexString="0"+hexString;

 return hexString;
}

//flash class
function Flash(obj)
{
 var self=this;
 self.obj=obj;

 self.init=init;

 self.accelerate=accelerate;
 self.decelerate=decelerate;

 self.move=move;
 self.resize=resize;
 self.moveResize=moveResize;

 self.fontSize=fontSize;
 self.fontColor=fontColor;

 self.backgroundMove=backgroundMove;
 self.backgroundColor=backgroundColor;

 self.opacity=opacity;

 self.end=end;
 self.pause=pause;
 self.stop=stop;
 self.go=go;
 self.loop=loop;

 self.init();

 function init()
 {
  self.updateSpeed=10;

  self.x=0; //current X, Y, Z coordinate
  self.y=0;
  self.z=0;
  self.xSpeed=0; //X, Y, Z speed (can be negative) 
  self.ySpeed=0;
  self.zSpeed=0;

  self.w=0; //current width and height
  self.h=0;
  self.wSpeed=0; //width and height speed (can be negative) 
  self.hSpeed=0;

  self.f=0;
  self.fSpeed=0; 

  self.bx=0;
  self.by=0;
  self.bxSpeed=0;
  self.bySpeed=0;

  self.fr=0; 
  self.fg=0;
  self.fb=0;
  self.frSpeed=0; 
  self.fgSpeed=0;
  self.fbSpeed=0;

  self.br=0; 
  self.bg=0;
  self.bb=0;
  self.brSpeed=0; 
  self.bgSpeed=0;
  self.bbSpeed=0;

  self.o=0;
  self.oSpeed=0; 

  self.wp=Array();

  self.loopStartTime=false;
  self.stopLooping=false;
  self.looping=false;
 }

 function accelerate(entry, speed)
 {
  if(!speed)
   speed=4;

  if(self.wp[entry])
  {
   self.wp[entry].accelerate=speed;
   return true;
  }

  return false;
 }
 function decelerate(entry)
 {
  return self.accelerate(entry, 0.25);
 }

 function move(x, y, z, ms, entry)
 {
  if(self.wp[entry])
   var wp=self.wp[entry];
  else
  {
   var wp=Object();
   entry=self.wp.length;
  }

  wp.move=Object();

  if(tmp=x.toString().match(/(\d+)(%)/))
  {
   wp.move.x=tmp[1];
   wp.move.xt=tmp[2];
  }
  else
  {
   wp.move.x=x;
   wp.move.xt="px";
  }
  if(tmp=y.toString().match(/(\d+)(%)/))
  {
   wp.move.y=tmp[1];
   wp.move.yt=tmp[2];
  }
  else
  {
   wp.move.y=y;
   wp.move.yt="px";
  }

  wp.move.z=z;

  if(ms<self.updateSpeed)
   ms=self.updateSpeed;

  wp.step=0;
  wp.steps=ms/self.updateSpeed;
  wp.ms=ms;

  self.wp[entry]=wp;
  return entry;
 }

 function resize(w, h, ms, entry)
 {
  if(self.wp[entry])
   var wp=self.wp[entry];
  else
  {
   var wp=Object();
   entry=self.wp.length;
  }

  wp.size=Object();

  if(tmp=w.toString().match(/(\d+)(%)/))
  {
   wp.size.w=tmp[1];
   wp.size.wt=tmp[2];
  }
  else
  {
   wp.size.w=w;
   wp.size.wt="px";
  }
  if(tmp=h.toString().match(/(\d+)(%)/))
  {
   wp.size.h=tmp[1];
   wp.size.ht=tmp[2];
  }
  else
  {
   wp.size.h=h;
   wp.size.ht="px";
  }

  if(ms<self.updateSpeed)
   ms=self.updateSpeed;

  wp.step=0;
  wp.steps=ms/self.updateSpeed;
  wp.ms=ms;

  self.wp[entry]=wp;
  return entry;
 }

 function fontSize(size, ms, entry)
 {
  if(self.wp[entry])
   var wp=self.wp[entry];
  else
  {
   var wp=Object();
   entry=self.wp.length;
  }

  wp.fontSize=Object();

  if(tmp=size.toString().match(/(\d+)(\w+)/))
  {
   wp.fontSize.size=tmp[1];
   wp.fontSize.sizeType=tmp[2];
  }
  else
  {
   wp.fontSize.size=size;
   wp.fontSize.sizeType="px";
  }

  if(ms<self.updateSpeed)
   ms=self.updateSpeed;

  wp.step=0;
  wp.steps=ms/self.updateSpeed;
  wp.ms=ms;

  self.wp[entry]=wp;
  return entry;
 }

 function backgroundMove(x, y, ms, entry)
 {
  if(self.wp[entry])
   var wp=self.wp[entry];
  else
  {
   var wp=Object();
   entry=self.wp.length;
  }

  wp.backgroundMove=Object();

  if(tmp=x.toString().match(/(\d+)(%)/))
  {
   wp.backgroundMove.x=tmp[1];
   wp.backgroundMove.xt=tmp[2];
  }
  else
  {
   wp.backgroundMove.x=x;
   wp.backgroundMove.xt="px";
  }
  if(tmp=y.toString().match(/(\d+)(%)/))
  {
   wp.backgroundMove.y=tmp[1];
   wp.backgroundMove.yt=tmp[2];
  }
  else
  {
   wp.backgroundMove.y=y;
   wp.backgroundMove.yt="px";
  }

  if(ms<self.updateSpeed)
   ms=self.updateSpeed;

  wp.step=0;
  wp.steps=ms/self.updateSpeed;
  wp.ms=ms;

  self.wp[entry]=wp;
  return entry;
 }

 function fontColor(color, ms, entry)
 {
  if(self.wp[entry])
   var wp=self.wp[entry];
  else
  {
   var wp=Object();
   entry=self.wp.length;
  }

  wp.fontColor=Object();

  if(!(colors=color.match(/([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})/i)))
   alert("can't match color code: "+color);

  wp.fontColor.r=dec(colors[1]);
  wp.fontColor.g=dec(colors[2]);
  wp.fontColor.b=dec(colors[3]);

  if(ms<self.updateSpeed)
   ms=self.updateSpeed;

  wp.step=0;
  wp.steps=ms/self.updateSpeed;
  wp.ms=ms;

  self.wp[entry]=wp;
  return entry;
 }

 function backgroundColor(color, ms, entry)
 {
  if(self.wp[entry])
   var wp=self.wp[entry];
  else
  {
   var wp=Object();
   entry=self.wp.length;
  }

  wp.backgroundColor=Object();

  if(!(colors=color.match(/([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})/i)))
   alert("can't match color code: "+color);

  wp.backgroundColor.r=dec(colors[1]);
  wp.backgroundColor.g=dec(colors[2]);
  wp.backgroundColor.b=dec(colors[3]);

  if(ms<self.updateSpeed)
   ms=self.updateSpeed;

  wp.step=0;
  wp.steps=ms/self.updateSpeed;
  wp.ms=ms;

  self.wp[entry]=wp;
  return entry;
 }

 function end(end, entry)
 {
  if(self.wp[entry])
   var wp=self.wp[entry];
  else
  {
   var wp=Object();
   entry=self.wp.length;
  }

  wp.onEnd=function End(){eval(end)};

  self.wp[entry]=wp;

  return entry
 }
 
 function opacity(opacity, ms, entry)
 {
  if(self.wp[entry])
   var wp=self.wp[entry];
  else
  {
   var wp=Object();
   entry=self.wp.length;
  }

  wp.opacity=Object();

  if(opacity<1)
   opacity*=100;

  if(ms<self.updateSpeed)
   ms=self.updateSpeed;

  wp.opacity.o=opacity;

  wp.step=0;
  wp.steps=ms/self.updateSpeed;
  wp.ms=ms;

  self.wp[entry]=wp;
  return entry;
 }

 function pause(ms)
 {
  var wp=Object();
  entry=self.wp.length;

  if(ms<self.updateSpeed)
   ms=self.updateSpeed;

  wp.step=0;
  wp.steps=ms/self.updateSpeed;
  wp.ms=ms;

  self.wp[entry]=wp;
  return entry;
 }
 function moveResize(x, y, z, w, h, ms)
 {
  entry=self.move(x, y, z, ms);
  entry=self.resize(w, h, ms, entry);
  return entry;
 }

 function go()
 {
  if(self.looping==false)
  {
   self.loopStartTime=false;
   self.looping=true;
   self.loop();
  }
 }

 function stop()
 {
  if(self.looping==true)
  {
   self.stopLooping=true;
   self.loop();
  }
 }

 function loop()
 {
  if(self.wp.length==0)
   return;

  var wp=self.wp[0];

  if(wp.step==0) //new waypoint
  {
   //set travel speed and direction
   if(wp.move)
   {
    self.xSpeed=(wp.move.x-self.x)/wp.steps;
    self.ySpeed=(wp.move.y-self.y)/wp.steps;
    self.zSpeed=(wp.move.z-self.z)/wp.steps;
   }
   
   if(wp.size)
   {
    self.wSpeed=(wp.size.w-self.w)/wp.steps;
    self.hSpeed=(wp.size.h-self.h)/wp.steps;
   }

   if(wp.backgroundMove)
   {
    self.bxSpeed=(wp.backgroundMove.x-self.bx)/wp.steps;
    self.bySpeed=(wp.backgroundMove.y-self.by)/wp.steps;
   }

   if(wp.fontSize)
   {
    self.fSpeed=(wp.fontSize.size-self.f)/wp.steps;
   }

   if(wp.fontColor)
   {
    self.frSpeed=(wp.fontColor.r-self.fr)/wp.steps;
    self.fgSpeed=(wp.fontColor.g-self.fg)/wp.steps;
    self.fbSpeed=(wp.fontColor.b-self.fb)/wp.steps;
   }
   
   if(wp.backgroundColor)
   {
    self.brSpeed=(wp.backgroundColor.r-self.br)/wp.steps;
    self.bgSpeed=(wp.backgroundColor.g-self.bg)/wp.steps;
    self.bbSpeed=(wp.backgroundColor.b-self.bb)/wp.steps;
   }
   
   if(wp.opacity)
   {
    self.oSpeed=(wp.opacity.o-self.o)/wp.steps;
   }
   
  }

  wp.step++;

  if(wp.accelerate)
  {
   step=Math.pow((wp.step/wp.steps), wp.accelerate)*wp.steps;

   if(step<0.01)
    step=0.01;
  }
  else
   step=wp.step;

  if(wp.move)
  {
   var left=Math.round(self.x+(self.xSpeed*step));
   var top=Math.round(self.y+(self.ySpeed*step));
   var zIndex=Math.round(self.z+(self.zSpeed*step));
   self.obj.style.marginLeft=left+wp.move.xt;
   self.obj.style.marginTop=top+wp.move.yt;
   self.obj.style.zIndex=zIndex;
  }

  if(wp.size)
  {
   var width=Math.round(self.w+(self.wSpeed*step));
   var height=Math.round(self.h+(self.hSpeed*step));

   if(width<0)
    width=0;
   if(height<0)
    height=0;

   self.obj.style.width=width+wp.size.wt;
   self.obj.style.height=height+wp.size.ht;
  }

  if(wp.backgroundMove)
  {
   var bg_left=Math.round(self.bx+(self.bxSpeed*step));
   var bg_top=Math.round(self.by+(self.bySpeed*step));
   self.obj.style.backgroundPosition=bg_left+wp.backgroundMove.xt+" "+bg_top+wp.backgroundMove.yt;
  }

  if(wp.fontSize)
  {
   var fontSize=self.f+(self.fSpeed*step);
   self.obj.style.fontSize=fontSize+wp.fontSize.sizeType;
  }

  if(wp.fontColor)
  {
   var font_red=Math.round(self.fr+(self.frSpeed*step));
   var font_green=Math.round(self.fg+(self.fgSpeed*step));
   var font_blue=Math.round(self.fb+(self.fbSpeed*step));

   tmp=Array();
   tmp[0]=hex(font_red);
   tmp[1]=hex(font_green);
   tmp[2]=hex(font_blue);
   if(tmp[0].length==1)
    tmp[0]="0"+tmp[0];
   if(tmp[1].length==1)
    tmp[1]="0"+tmp[1];
   if(tmp[2].length==1)
    tmp[2]="0"+tmp[2];

   self.obj.style.color="#"+tmp[0]+tmp[1]+tmp[2];
  }

  if(wp.backgroundColor)
  {
   var bg_red=Math.round(self.br+(self.brSpeed*step));
   var bg_green=Math.round(self.bg+(self.bgSpeed*step));
   var bg_blue=Math.round(self.bb+(self.bbSpeed*step));

   tmp=Array();
   tmp[0]=hex(bg_red);
   tmp[1]=hex(bg_green);
   tmp[2]=hex(bg_blue);
   if(tmp[0].length==1)
    tmp[0]="0"+tmp[0];
   if(tmp[1].length==1)
    tmp[1]="0"+tmp[1];
   if(tmp[2].length==1)
    tmp[2]="0"+tmp[2];

   self.obj.style.backgroundColor="#"+tmp[0]+tmp[1]+tmp[2];
  }

  if(wp.opacity)
  {
   var opacity=self.o+(self.oSpeed*step);

   if(typeof self.obj.style.opacity!='undefined')
    self.obj.style.opacity=opacity/100;
   else
    self.obj.style.filter="alpha(opacity="+opacity+")";
  }

  if(!self.stopLooping&&wp.step<wp.steps)
  {
   setTimeout(self.loop, self.updateSpeed);
  }
  else
  {
   if(wp.move)
   {
    self.x=left; //set new coordinates
    self.y=top;
    self.z=zIndex;
   }

   if(wp.size)
   {
    self.w=width;
    self.h=height;
   }

   if(wp.fontSize)
   {
    self.f=fontSize;
   }

   if(wp.fontColor)
   {
    self.fr=font_red;
    self.fg=font_green;
    self.fb=font_blue;
   }

   if(wp.backgroundColor)
   {
    self.br=bg_red;
    self.bg=bg_green;
    self.bb=bg_blue;
   }

   if(wp.backgroundMove)
   {
    self.bx=bg_left;
    self.by=bg_top;
   }

   if(wp.opacity)
   {
    self.o=opacity;
   }

   if(self.wp.length>0)
   {
    var lll=self.wp.length;
    for(ccc=1;ccc<lll;ccc++) 
     self.wp[ccc-1]=self.wp[ccc];

    self.wp.length=lll-1;
   }

   if(self.wp.length>0)
    setTimeout(self.loop, self.updateSpeed);

   if(wp.onEnd)
    wp.onEnd();

   self.stopLooping=false;
   self.looping=false;
  }
 }
}
