/* - - - - - - - - - - - - - - - - - - - - - - -
 JavaScript
 3 aprilie 2010 02:41:03
 HAPedit 3.1.11.111
 - - - - - - - - - - - - - - - - - - - - - - - */

/* require
  <SCRIPT type=text/javascript src="animator.js"></SCRIPT>
  <SCRIPT type=text/javascript src="JSFX1.js"></SCRIPT>
  <SCRIPT type=text/javascript src="JSN.js"></SCRIPT>
*/


JSN.randomHex = function() {
    var s = parseInt(Math.random()*256).toString(16);
    if (s.length==2) return s;
    return "0"+s;
}

JSN.borderRules = 5;

// variabile definite in animator.extension: step, side, borders, subjects
// functii definite in animator.extension: nextFrame(), interChange(), interCopy()

// defineste animatia
JSN.borderRule1 = function(animatorExtension) {
    return function(pos) {
          with (animatorExtension) {
               switch (true) {
               case pos > 3/4:
                    if (step < 3) {
                       step++;
                       // latura anterioara
                       subjects[borders[side-1]].setState(1/2);
                       // latura urmatoare
                       subjects[borders[side+1]].setState(1/2);
                       // o dimensiune
                       subjects[dimensions[side]].setState(0);
                    }
                    // latura opusa
                    subjects[borders[side+2]].setState(4-pos*4);
                    // latura activa
                    subjects[borders[side]].setState(pos*4-3);
                    break;
               case pos > 2/4:
                    if (step < 2) {
                       step++;
                       // latura urmatoare
                       subjects[borders[side+1]].setState(0);
                       // latura anterioara
                       subjects[borders[side-1]].setState(0);
                       // o dimensiune
                       subjects[dimensions[side]].setState(1);
                       // interschimb borderWidth, borderColor
                       interChange("Width", side, side+2);
                       interChange("Color", side, side+2);
                       // urmatoarea imagine
                       nextFrame();
                    }
                    // latura anterioara
                    subjects[borders[side-1]].setState(pos*2-1);
                    // latura urmatoare
                    subjects[borders[side+1]].setState(pos*2-1);
                    // o dimensiune
                    subjects[dimensions[side]].setState(3-4*pos);
                    break;
               case pos > 1/4:
                    if (step < 1) {
                       step++;
                       // latura activa
                       subjects[borders[side]].setState(1);
                       // latura opusa
                       subjects[borders[side+2]].setState(0);
                    }
                    // latura urmatoare
                    subjects[borders[side+1]].setState(1-pos*2);
                    // latura anterioara
                    subjects[borders[side-1]].setState(1-pos*2);
                    // o dimensiune
                    subjects[dimensions[side]].setState(pos*4-1);
                    break;
               default:
                    // latura activa
                    subjects[borders[side]].setState(pos*4);
                    // latura opusa
                    subjects[borders[side+2]].setState(1-pos*4);
                    break;
               }
          }
    }
}
// initializare animatie
// Culoare si Dimensiune border pt. latura anterioara, activa, urmatoare, opusa
// Axa corespondenta pt. latura activa (intrare in tabela animator.extension.dimensions)
JSN.borderRule1.onStart = {
                       "Color" : ["transparent", "", "transparent", "transparent"],
                       "Width" : [1/2, 0, 1/2, 1],
                       "Dim"   : [0, 0],
                       "Pos"   : [0, 0]
                       }

JSN.borderRule2 = function(animatorExtension) {
    return function(pos) {
          with (animatorExtension) {
               switch (true) {
               case pos > 3/4:
                    if (step < 3) {
                       step++;
                       // latura anterioara
                       subjects[borders[side-1]].setState(1);
                       // latura urmatoare
                       subjects[borders[side+1]].setState(0);
                       // preluare borderColor
                       interCopy("Color", side-1, side);
                    }
                    // latura opusa
                    subjects[borders[side+2]].setState(4-pos*4);
                    // latura activa
                    subjects[borders[side]].setState(pos*4-3);
                    break;
               case pos > 2/4:
                    if (step < 2) {
                       step++;
                       // latura urmatoare
                       subjects[borders[side+1]].setState(1);
                       // latura anterioara
                       subjects[borders[side-1]].setState(0);
                       // preluare borderColor
                       interCopy("Color", side+1, side+2);
                       // interschimb borderWidth
                       interChange("Width", side, side+2);
                       // urmatoarea imagine
                       nextFrame();
                    }
                    // latura anterioara
                    subjects[borders[side-1]].setState(pos*4-2);
                    // latura urmatoare
                    subjects[borders[side+1]].setState(3-pos*4);
                    break;
               case pos > 1/4:
                    if (step < 1) {
                       step++;
                       // latura activa
                       subjects[borders[side]].setState(1);
                       // latura opusa
                       subjects[borders[side+2]].setState(0);
                    }
                    // latura urmatoare
                    subjects[borders[side+1]].setState(pos*4-1);
                    // latura anterioara
                    subjects[borders[side-1]].setState(2-pos*4);
                    break;
               default:
                    // latura activa
                    subjects[borders[side]].setState(pos*4);
                    // latura opusa
                    subjects[borders[side+2]].setState(1-pos*4);
                    break;
               }
          }
    }
}
JSN.borderRule2.onStart = {
                       "Color" : ["transparent", "", "", "transparent"],
                       "Width" : [1, 0, 0, 1],
                       "Dim"   : [0, 0],
                       "Pos"   : [0, 0]
                       }

JSN.borderRule3 = function(animatorExtension) {
    return function(pos) {
          with (animatorExtension) {
               switch (true) {
               case pos > 3/4:
                    if (step < 3) {
                       step++;
                       // latura activa
                       subjects[borders[side]].setState(1);
                       // latura opusa
                       subjects[borders[side+2]].setState(0);
                    }
                    // latura anterioara
                    subjects[borders[side-1]].setState(2-pos*2);
                    // latura urmatoare
                    subjects[borders[side+1]].setState(2-pos*2);
                    // o dimensiune
                    subjects[dimensions[side]].setState(pos*4-3);
                    break;
               case pos > 2/4:
                    if (step < 2) {
                       step++;
                       // latura activa
                       subjects[borders[side]].setState(1);
                       // latura opusa
                       subjects[borders[side+2]].setState(0);
                       // interschimb borderWidth, borderColor
                       interChange("Width", side, side+2);
                       interChange("Color", side, side+2);
                       // urmatoarea imagine
                       nextFrame();
                    }
                    // latura activa
                    subjects[borders[side]].setState(pos*4-2);
                    // latura opusa
                    subjects[borders[side+2]].setState(3-pos*4);
                    break;
               case pos > 1/4:
                    if (step < 1) {
                       step++;
                       // latura anterioara
                       subjects[borders[side-1]].setState(1/2);
                       // latura urmatoare
                       subjects[borders[side+1]].setState(1/2);
                       // o dimensiune
                       subjects[dimensions[side]].setState(0);
                    }
                    // latura activa
                    subjects[borders[side]].setState(pos*4-1);
                    // latura opusa
                    subjects[borders[side+2]].setState(2-pos*4);
                    break;
               default:
                    // latura anterioara
                    subjects[borders[side-1]].setState(pos*2);
                    // latura urmatoare
                    subjects[borders[side+1]].setState(pos*2);
                    // o dimensiune
                    subjects[dimensions[side]].setState(1-pos*4);
                    break;
               }
          }
    }
}
JSN.borderRule3.onStart = {
                       "Color" : ["", "", "", "transparent"],
                       "Width" : [0, 0, 0, 1],
                       "Dim"   : [0, 1],
                       "Pos"   : [0, 0]
                       }

JSN.borderRule4 = function(animatorExtension) {
    return function(pos) {
          with (animatorExtension) {
               switch (true) {
               case pos > 3/4:
                    if (step < 3) {
                       step++;
                       // latura activa
                       subjects[borders[side]].setState(1/2);
                       // latura opusa
                       subjects[borders[side+2]].setState(1/2);
                       // alta dimensiune
                       subjects[dimensions[side-1]].setState(0);
                    }
                    // latura anterioara
                    subjects[borders[side-1]].setState(2-pos*2);
                    // latura urmatoare
                    subjects[borders[side+1]].setState(2-pos*2);
                    // o dimensiune
                    subjects[dimensions[side]].setState(pos*4-3);
                    break;
               case pos > 2/4:
                    if (step < 2) {
                       step++;
                       // o dimensiune
                       subjects[dimensions[side]].setState(0);
                       // latura anterioara
                       subjects[borders[side-1]].setState(1/2);
                       // latura urmatoare
                       subjects[borders[side+1]].setState(1/2);
                       // alta dimensiune
                       subjects[dimensions[side-1]].setState(1);
                       // latura activa
                       subjects[borders[side]].setState(0);
                       // latura opusa
                       subjects[borders[side+2]].setState(0);
                       // interschimb borderColor
                       interChange("Color", side+2, side+1);
                       interChange("Color", side, side-1);
                       // urmatoarea imagine
                       nextFrame();
                    }
                    // latura activa
                    subjects[borders[side]].setState(pos*2-1);
                    // latura opusa
                    subjects[borders[side+2]].setState(pos*2-1);
                    // alta dimensiune
                    subjects[dimensions[side-1]].setState(3-4*pos);
                    break;
               case pos > 1/4:
                    if (step < 1) {
                       step++;
                       // latura activa
                       subjects[borders[side]].setState(1/2);
                       // latura opusa
                       subjects[borders[side+2]].setState(1/2);
                       // alta dimensiune
                       subjects[dimensions[side-1]].setState(0);
                    }
                    // latura anterioara
                    subjects[borders[side-1]].setState(1-pos*2);
                    // latura urmatoare
                    subjects[borders[side+1]].setState(1-pos*2);
                    // o dimensiune
                    subjects[dimensions[side]].setState(pos*4-1);
                    break;
               default:
                    // latura activa
                    subjects[borders[side]].setState(pos*2);
                    // latura opusa
                    subjects[borders[side+2]].setState(pos*2);
                    // alta dimensiune
                    subjects[dimensions[side-1]].setState(1-pos*4);
                    break;
               }
          }
    }
}
JSN.borderRule4.onStart = {
                       "Color" : ["transparent", "", "transparent", ""],
                       "Width" : [1/2, 0, 1/2, 0],
                       "Dim"   : [1, 0],
                       "Pos"   : [0, 0]
                       }

JSN.borderRule5 = function(animatorExtension) {
    return function(pos) {
          with (animatorExtension) {
               switch (true) {
               case pos > 3/4:
                    if (step < 3) {
                       step++;
                       // latura anterioara
                       subjects[borders[side-1]].setState(1/2);
                       // latura urmatoare
                       subjects[borders[side+1]].setState(1/2);
                       // o dimensiune
                       subjects[dimensions[side]].setState(0);
                    }
                    // latura anterioara
                    subjects[borders[side-1]].setState(2-pos*2);
                    // latura urmatoare
                    subjects[borders[side+1]].setState(2-pos*2);
                    // o pozitie
                    subjects[positions[side]].setState(pos*2-3/2);
                    break;
               case pos > 2/4:
                    if (step < 2) {
                       step++;
                       // o dimensiune
                       subjects[dimensions[side]].setState(1);
                       // latura anterioara
                       subjects[borders[side-1]].setState(0);
                       // latura urmatoare
                       subjects[borders[side+1]].setState(0);
                       // alta dimensiune
                       subjects[dimensions[side-1]].setState(0);
                       // latura activa
                       subjects[borders[side]].setState(1/2);
                       // latura opusa
                       subjects[borders[side+2]].setState(1/2);
                       // interschimb borderColor
                       interChange("Color", side+2, side+1);
                       interChange("Color", side, side-1);
                       // urmatoarea imagine
                       nextFrame();
                    }
                    // latura anterioara
                    subjects[borders[side-1]].setState(pos*2-1);
                    // latura urmatoare
                    subjects[borders[side+1]].setState(pos*2-1);
                    // o dimensiune
                    subjects[dimensions[side]].setState(3-4*pos);
                    break;
               case pos > 1/4:
                    if (step < 1) {
                       step++;
                       // latura activa
                       subjects[borders[side]].setState(1/2);
                       // latura opusa
                       subjects[borders[side+2]].setState(1/2);
                       // alta pozitie
                       subjects[positions[side-1]].setState(0);
                    }
                    // latura activa
                    subjects[borders[side]].setState(1-pos*2);
                    // latura opusa
                    subjects[borders[side+2]].setState(1-pos*2);
                    // alta dimensiune
                    subjects[dimensions[side-1]].setState(pos*4-1);
                    break;
               default:
                    // latura activa
                    subjects[borders[side]].setState(pos*2);
                    // latura opusa
                    subjects[borders[side+2]].setState(pos*2);
                    // alta pozitie
                    subjects[positions[side-1]].setState(1/2-pos*2);
                    break;
               }
          }
    }
}
JSN.borderRule5.onStart = {
                       "Color" : ["", "transparent", "", "transparent"],
                       "Width" : [1/2, 0, 1/2, 0],
                       "Dim"   : [0, 0],
                       "Pos"   : [1/2, 0]
                       }

JSFX.Clasor.prototype.setBorder = function(rule, bg, side, options) {
    var thisObj = this;
    var border = new Animator({duration: this.settings[this.page].frameTime});

    border.extension = Animator.applyDefaults({
         resetOnPlay: false,
         resetOnStop: false
    }, options);
    border.extension.rule = rule; // definitia animatiei sau "random"
    border.extension.bg   = bg;   // culoarea sau "random"
    border.extension.side = side; // 1=top, 2=right, 3=bottom, 4=left sau "random"

    border.extension.borders    = ["Left", "Top", "Right", "Bottom", "Left", "Top", "Right"];
    border.extension.dimensions = ["Height", "Width", "Height", "Width", "Height"];
    border.extension.positions  = ["NewTop", "NewLeft", "NewTop", "NewLeft", "NewTop"];

    border.extension.nextFrame = function() {thisObj.nextFrame(this.sens)}; // apelata de rule

    border.extension.interChange = function(property, from, to) { // apelata de rule
        with (this.newImg) {
             var p = style["border"+this.borders[to]+property];
             style["border"+this.borders[to]+property] = style["border"+this.borders[from]+property];
             style["border"+this.borders[from]+property] = p;
        }
    }
    border.extension.interCopy = function(property, from, to) { // apelata de rule
        with (this.newImg) {
             style["border"+this.borders[to]+property] = style["border"+this.borders[from]+property];
        }
    }

    border.resetOnPlay = function(state) {
        if (this.extension.newImg) return;

        if (!thisObj.height)
           thisObj.setState(state);

        this.extension.refer = this.cloneImg(thisObj);
        with (this.extension.newImg.style) {
             borderStyle = "solid";
        }

// defineste subiectele animatiei
        this.extension.subjects = {
             "Left":   new NumericalStyleSubject(this.extension.newImg, "border-left-width",   0, thisObj.img.offsetWidth),
             "Top":    new NumericalStyleSubject(this.extension.newImg, "border-top-width",    0, thisObj.img.offsetHeight),
             "Right":  new NumericalStyleSubject(this.extension.newImg, "border-right-width",  0, thisObj.img.offsetWidth),
             "Bottom": new NumericalStyleSubject(this.extension.newImg, "border-bottom-width", 0, thisObj.img.offsetHeight),

             "Height": new NumericalStyleSubject(this.extension.newImg, "height", 0, thisObj.img.offsetHeight),
             "Width":  new NumericalStyleSubject(this.extension.newImg, "width",  0, thisObj.img.offsetWidth),

             "NewTop": new NumericalStyleSubject(this.extension.newImg, "top",    this.extension.refer.top,  this.extension.refer.top+thisObj.img.offsetHeight),
             "NewLeft":new NumericalStyleSubject(this.extension.newImg, "left",   this.extension.refer.left, this.extension.refer.left+thisObj.img.offsetWidth)
                                  };

        if (rule!="random")
           this.addSubject(this.extension.rule(this.extension));
    }

    border.resetOnStop = function() {
        if (!this.extension.newImg) return;
        thisObj.el.removeChild(this.extension.newImg);
        this.extension.newImg = null;
        this.extension.subjects = null;
        this.clearSubjects();
    };

    border.jumpTo = border.resetOnPlay;

    border.options.onStart = function() {
        this.extension.sens = this.state < this.target? 1 : -1;
        if (this.extension.resetOnPlay) this.resetOnPlay((1-this.extension.sens)/2);

        if (bg=="random")   this.extension.bg   = "#"+JSN.randomHex()+JSN.randomHex()+JSN.randomHex();
        if (side=="random") this.extension.side = Math.ceil(Math.random()*4);
        if (rule=="random") {
           this.clearSubjects();
           this.extension.rule = JSN["borderRule"+Math.ceil(Math.random()*JSN.borderRules)];
           this.addSubject(this.extension.rule(this.extension));
        }
        // initializare proprietati si variabile de lucru
        with (this.extension) {
             for (var i=0; i<4; i++) {
                 var bgColor = rule.onStart["Color"][i];
                 if (!bgColor) bgColor = bg;
                 newImg.style["border"+borders[side+i-1]+"Color"] = bgColor;
                 subjects[borders[side+i-1]].setState(rule.onStart["Width"][i]);
             }

             subjects[dimensions[side-1]].setState(rule.onStart["Dim"][0]);
             subjects[dimensions[side]].setState(rule.onStart["Dim"][1]);

             subjects[positions[side-1]].setState(rule.onStart["Pos"][0]);
             subjects[positions[side]].setState(rule.onStart["Pos"][1]);
        }
        this.extension.step = 0;
    }

    border.options.onComplete = function() {
        if (this.extension.resetOnStop) this.resetOnStop();
    };

    border.options.transition = function(pos) {// inhiva partial reverse
        return Animator.makeEaseIn(0.8)(1*(0.5+border.extension.sens*(pos-0.5)));
    }

    return border;
}


