// www.lipka.ru
// версия 1.1


function randomSort(a,b){
 return a*Math.random() > b*Math.random();
}

function prepareImg(source_name, container) {

 this.h=this.length;
 this.w=this[0].length;
 this.source_name=source_name;

 this.container = document.getElementById(container);

 this.order = new Array();
 for(var i=0; i<this.h; i++){
  this.order[i] = new Array();
  for(var j=0; j<this.w; j++){
   this.order[i][j]=j;
  }
  this.order[i].sort(randomSort);
 }

 var emptyRow='';
 for(var i=0; i<this.w; i++){
  emptyRow+=' ';
 }

 this.transform = new Array();
 this.empty = new Array();
 for(var i=0; i<this.h; i++){
  this.transform[i]=emptyRow;
  this.empty[i]=emptyRow;
 }

 this.col=0;
}



function drawImg(speed){

 if(this.col < this.w){
  this.done=false;
  this.active=true;
  for(var k=0; k<speed; k++){
   if(this.col < this.w){
    for(var row=0; row<this.h; row++){
     var c = this.order[row][this.col];
     this.transform[row]=this.transform[row].substr(0, c)+this[row].substr(c,1)+this.transform[row].substring(c+1);
    }
    this.col++;
   }
  }

  var out='';
  for(var y=0; y<this.h; y++){
   out+="<pre>"+this.transform[y]+"</pre>";
  }
  this.container.innerHTML=out;

  var d=setTimeout(this.source_name+".draw("+speed+")",50);
 }else{
  this.done=true;
  this.active=false;
  this.col=0;
 }
}


function alarmImg(speed, shift){

 if(this.col < this.w){
  this.active=true;
  for(var k=0; k<speed; k++){
   if(this.col < this.w){
    for(var row=0; row<this.h; row++){

     var c = this.order[row][this.col];
     this.transform[row]=this.transform[row].substr(0, c)+" "+this.transform[row].substring(c+1);

     if((this.col>shift)){
      var c = this.order[row][this.col-shift];
      this.transform[row]=this.transform[row].substr(0, c)+this[row].substr(c,1)+this.transform[row].substring(c+1);
     }

     if(this.col==this.w-1){
      this.transform[row]=this[row];
     }

    }
    this.col++;
   }
  }

  var out='';
  for(var y=0; y<this.h; y++){
   out+="<pre>"+this.transform[y]+"</pre>";
  }
  this.container.innerHTML=out;

  var d=setTimeout(this.source_name+".alarm("+speed+","+shift+")",50);

 }else{
  this.active=false;
  this.col=0;
 }

}


function eraseImg(speed){

 if(this.col < this.w){
  this.done=false;
  this.active=true;
  for(var k=0; k<speed; k++){
   if(this.col < this.w){
    for(var row=0; row<this.h; row++){
     var c = this.order[row][this.col];
     this.transform[row]=this.transform[row].substr(0, c)+" "+this.transform[row].substring(c+1);
    }
   }
   this.col++;
  }

  var out='';
  for(var y=0; y<this.h; y++){
   out+="<pre>"+this.transform[y]+"</pre>";
  }
  this.container.innerHTML=out;

  var d=setTimeout(this.source_name+".erase("+speed+")",50);
 }else{
  this.active=false;
  this.col=0;
 }
}


Array.prototype.prepare = prepareImg;
Array.prototype.draw = drawImg;
Array.prototype.alarm = alarmImg;
Array.prototype.erase = eraseImg;


function prepareStr(source_name, container){
 this.source_name = source_name;
 this.container = document.getElementById(container);
 this.l = this.length;
 this.i=0;
}

function drawStr(speed){
 if(this.i <= this.l){
  this.i+=speed;
  this.container.innerHTML=this.substr(0, this.i);
  var d=setTimeout(this.source_name+".draw("+speed+")",10);
 }
}

function eraseStr(speed){
 if(this.i >= 0){
  this.i-=speed;
  this.container.innerHTML=this.substr(0, this.i);
  var d=setTimeout(this.source_name+".erase("+speed+")",10);
 }
}

String.prototype.prepare = prepareStr;
String.prototype.draw = drawStr;
String.prototype.erase = eraseStr;
