/* ----- Utils.js PART ----- */
function byteToHexStr(value){
  var result = value.toString(16);
  switch(result.length){
  case 0:
    return "00";
  case 1:
    return "0"+result;
  default:
    return result;
  }  
}

function hexToColor(hexValue){
  var result = "#";
  var initial = hexValue;
  var temp = Math.ceil(initial/0x010000);
  result = result+ byteToHexStr(temp);
  
  initial = initial%0x010000;
  temp = Math.ceil(initial/0x000100);
  result = result+ byteToHexStr(temp);
  
  initial = initial%0x000100;
  temp = Math.ceil(initial);
  result = result+byteToHexStr(temp);
  
  return result;
}

function rgbToColor(red, green, blue){
  return result = "#"+byteToHexStr(red)+byteToHexStr(green)+byteToHexStr(blue);
}

/* ----- OverAnim.js PART ----- */
function OverAnim(name){
  this.nextId = 0;
  this.name = name;
  this.nodeList = new Array();
  
  this._getNewId = function(node, speed){
    var id = this.nextId;
    this.nextId = this.nextId + 1;
    
    var nodeContent = new Array();
    nodeContent["node"] = node;
    nodeContent["status"] = "static";
    nodeContent["step"] = 0;
    nodeContent["speed"] = speed;
    nodeContent["lastTime"] = 0;
    this.nodeList[id] = nodeContent;
    return id;
  }
  
  this.handleOver = function(event,animId){
    this.nodeList[animId]["status"]="animIn";
    this.nodeList[animId]["lastTime"]=(new Date()).valueOf();
    window.setTimeout(this.name+".animate("+animId+")", 50);
  }

  this.handleOut = function(event,animId){
    this.nodeList[animId]["status"]="animOut";
    this.nodeList[animId]["lastTime"]=(new Date()).valueOf();
    window.setTimeout(this.name+".animate("+animId+")", 50);
  }
  
  this.animate = function(animId){
    var r,g,b;
    if(this.nodeList[animId]["status"]=="animIn"){      
      var time = (new Date()).valueOf();
      this.nodeList[animId]["step"] = this.nodeList[animId]["step"] + (time-this.nodeList[animId]["lastTime"]);
      this.nodeList[animId]["lastTime"] = time;
      if(this.nodeList[animId]["step"]>=this.nodeList[animId]["speed"]){
        this.nodeList[animId]["step"]=this.nodeList[animId]["speed"];
        this.endAnimIn(animId);
        this.nodeList[animId]["status"] = "static";
        return;
      }
      this.stepAnimIn(animId, this.nodeList[animId]["step"], this.nodeList[animId]["speed"]);
      window.setTimeout(this.name+".animate("+animId+")", 5);
    } else if(this.nodeList[animId]["status"]=="animOut"){
      var time = (new Date()).valueOf();
      this.nodeList[animId]["step"] = this.nodeList[animId]["step"] - (time-this.nodeList[animId]["lastTime"]);
      this.nodeList[animId]["lastTime"] = time;
      if(this.nodeList[animId]["step"]<=0){
        this.nodeList[animId]["step"]=0;
        this.nodeList[animId]["status"] = "static";
        this.endAnimOut(animId);
        return;
      }
      this.stepAnimOut(animId, this.nodeList[animId]["step"], this.nodeList[animId]["speed"]);
      window.setTimeout(this.name+".animate("+animId+")", 5);
    }
  }
  
  this.stepAnimIn = function(animId, step, speed){
    //Implement your animation method here.
  }

  this.stepAnimOut = function(animId, step, speed){
    //Implement your animation method here.
  }

  this.endAnimIn = function(animId){
    //Implement your animation method here.
  }

  this.endAnimOut = function(animId){
    //Implement your animation method here.
  }
}
/* ----- SizeAnim.js PART ----- */
function SizeAnim(name){
  this.parent=OverAnim;
  this.parent(name);

  this.getNewId = function(node, speed, startWidth, startHeight, endWidth, endHeight){
    var id = this._getNewId(node, speed);
    this.nodeList[id]["startWidth"] = startWidth;
    this.nodeList[id]["startHeight"] = startHeight;
    this.nodeList[id]["endWidth"] = endWidth;
    this.nodeList[id]["endHeight"] = endHeight;
    this.nodeList[id]["deltaWidth"] = endWidth-startWidth;
    this.nodeList[id]["deltaHeight"] = endHeight-startHeight;
    return id;
  }
  
  this.stepAnim = function(id, step, speed){
    var sW = this.nodeList[id]["startWidth"];
    var sH = this.nodeList[id]["startHeight"];
    var dW = this.nodeList[id]["deltaWidth"];
    var dH = this.nodeList[id]["deltaHeight"];
    var x = step/speed;
    var y = 1-Math.pow(1-x,4);
    
    var w = sW+(dW*y);
    var h = sH+(dH*y);
    this.nodeList[id]["node"].style.visibility="visible";
    this.nodeList[id]["node"].style.width = w+"em";
    this.nodeList[id]["node"].style.height = h+"em";
  }

  this.stepAnimIn = function(id, step, speed){
    this.stepAnim(id, step, speed);
  }

  this.stepAnimOut = function(id, step, speed){
    this.stepAnim(id, step, speed);
  }

  this.endAnimIn = function(id){
    this.nodeList[id]["node"].style.width=this.nodeList[id]["endWidth"]+"em";
    this.nodeList[id]["node"].style.height=this.nodeList[id]["endHeight"]+"em";
  }

  this.endAnimOut = function(id){
    this.nodeList[id]["node"].style.width=this.nodeList[id]["startWidth"]+"em";
    this.nodeList[id]["node"].style.height=this.nodeList[id]["startHeight"]+"em";
    if((this.nodeList[id]["startWidth"]==0)||(this.nodeList[id]["startHeight"]==0)){
      this.nodeList[id]["node"].style.visibility="hidden";
    }
  }
}
SizeAnim.prototype=new OverAnim();

