DJTechiMixReload = new function(){
    this.buttons = {
    "deck1play" :0x11,
    "deck1cue" : 0x0b,
    "deck1sync": 0x05,
    "deck1hotcue1": 0x08,
    "deck1hotcue2": 0x0e,
    "deck1hotcue3": 0x14,
    "deck1set":0x02,
    "deck1loop":0x01,
    "deck1loopsize-": 0x07,
    "deck1loopsize+": 0x0d,
    "deck1relooper":0x13,
    "deck1fx1": 0x04,
    "deck1fx2": 0x0a,
    "deck1keylock": 0x03,
    "deck1downbeat": 0x17,
    "deck2play" :0x2f,
    "deck2cue" : 0x29,
    "deck2sync": 0x23,
    "deck2hotcue1": 0x20,
    "deck2hotcue2": 0x26,
    "deck2hotcue3": 0x2c,
    "deck2set":0x1a,
    "deck2loop":0x19,
    "deck2loopsize-": 0x1f,
    "deck2loopsize+": 0x25,
    "deck2relooper":0x2b,
    "deck2fx1": 0x10,
    "deck2fx2": 0x16,
    "deck2keylock": 0x2d,
    "deck2downbeat": 0x1d,
    "mixerch1pfl" :0x15,
    "mixerch1highkill" : 0x1c,
    "mixerch1midkill": 0x18,
    "mixerch1lowkill": 0x12,
    "mixerch2pfl" :0x1b,
    "mixerch2highkill" : 0x22,
    "mixerch2midkill": 0x1e,
    "mixerch2lowkill": 0x24
    };
    this.scratching = {"deck1":false, "deck2":false};
    this.alpha = 0.125;
    this.beta = this.alpha/32;
};


DJTechiMixReload.ledfunctions = function (ledname)
{
    return function(value){
    var eval = ledname;
    if(value != 0)
        midi.sendShortMsg(0x90,DJTechiMixReload.buttons[ledname],0x7f);
    else
        midi.sendShortMsg(0x90,DJTechiMixReload.buttons[ledname],0x00);
    };
};
DJTechiMixReload.allleadson = function (){
    for(var i in DJTechiMixReload.buttons){
    DJTechiMixReload.ledfunctions(i)(1,false);
    }
};
DJTechiMixReload.allleadsoff = function (){
    for(var i in DJTechiMixReload.buttons){
    DJTechiMixReload.ledfunctions(i)(0,false);
    }
};
DJTechiMixReload.init = function(ID)
{
    for(var key1 in DJTechiMixReload.buttons){
    print("Button " + key1 + " -> MIDI " + DJTechiMixReload.buttons[key1]);
    for(var key2 in DJTechiMixReload.buttons){
        if (key1 != key2){
        if (DJTechiMixReload.buttons[key1] == DJTechiMixReload.buttons[key2]){
            print("Warning: " + key1 + " and " + key2 + "have same midi note!");
        }
        }
    }
    }


    DJTechiMixReload.setbutton = new Object();
    DJTechiMixReload.setbutton["[Channel1]"] = false;
    DJTechiMixReload.setbutton["[Channel2]"] = false;

    DJTechiMixReload.allleadson();
    engine.beginTimer(4000, DJTechiMixReload.allleadsoff ,true);
    for(var deck = 1; deck <= 2; deck++){
    engine.connectControl("[Channel" + deck + "]","play","DJTechiMixReload.deck" + deck + "play");
    engine.connectControl("[Channel" + deck + "]","cue_default","DJTechiMixReload.deck" + deck + "cue");
    engine.connectControl("[Channel" + deck + "]","loop_enabled","DJTechiMixReload.deck" + deck + "loop");
    for(var hotcue = 1; hotcue <= 3; hotcue++){
        engine.connectControl("[Channel" + deck + "]","hotcue_"+ hotcue + "_enabled","DJTechiMixReload.deck" + deck + "hotcue" + hotcue);
    }
    engine.connectControl("[Channel" + deck + "]","flanger","DJTechiMixReload.deck" + deck + "fx1");
    engine.connectControl("[Channel" + deck + "]","filterHighKill","DJTechiMixReload.mixerch" + deck + "highkill");
    engine.connectControl("[Channel" + deck + "]","filterMidKill","DJTechiMixReload.mixerch" + deck + "midkill");
    engine.connectControl("[Channel" + deck + "]","filterLowKill","DJTechiMixReload.mixerch" + deck + "lowkill");
    engine.connectControl("[Channel" + deck + "]","pfl","DJTechiMixReload.mixerch" + deck + "pfl");
    }
};
DJTechiMixReload.shutdown = function(ID)
{
    DJTechiMixReload.allleadsoff();
};

DJTechiMixReload.setfunction = function(channel, control, value, status,group)
{
    if(value == 0x7f){
    DJTechiMixReload.setbutton[group] = true;
    print("set button pressed");
    }
    else
    DJTechiMixReload.setbutton[group] = false;

};
DJTechiMixReload.hotcuefunction = function(channel, control, value, status,group)
{
    if(value == 0x00){
    return;
    }
    print("one hotcue button pressed");
    var hotcue = null;
    switch(control){
    case DJTechiMixReload.buttons["deck1hotcue1"]:
    case DJTechiMixReload.buttons["deck2hotcue1"]:
    hotcue = "hotcue_1";
    break;
    case DJTechiMixReload.buttons["deck1hotcue2"]:
    case DJTechiMixReload.buttons["deck2hotcue2"]:
    hotcue = "hotcue_2";
    break;
    case DJTechiMixReload.buttons["deck1hotcue3"]:
    case DJTechiMixReload.buttons["deck2hotcue3"]:
    hotcue = "hotcue_3";
    break;
    default:
    print("Something wrong: value = " + value);
    }

    if(DJTechiMixReload.setbutton[group]){
    engine.setValue(group,hotcue+"_clear",1);
    midi.sendShortMsg(0x90,control,0x7f);
    }
    else{
    engine.setValue(group,hotcue+"_activate",1);
    midi.sendShortMsg(0x90,control,0x00);
    }
};

DJTechiMixReload.wheeltouch = function(channel, control, value, status,group)
{
    print("value: " + value + " control: " + control);
    print(group + group[8]);
    if(value == 0x00)
    engine.scratchDisable(group[8]);
    else
    engine.scratchEnable(group[8],148,33+1/3.0,DJTechiMixReload.alpha,DJTechiMixReload.beta);
};

DJTechiMixReload.scratch = function(channel, control, value, status,group)
{
    print("value: " + value + " control: " + control);
    switch(control){
    case 0x60:
    case 0x62:
    engine.scratchTick(group[8],1);
    break;
    case 0x61:
    case 0x63:
    engine.scratchTick(group[8],-1);
    break;
    }

};

DJTechiMixReload.deck1play = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["deck1play"],value?0x7f:0x00);
};
DJTechiMixReload.deck1cue = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["deck1cue"],value?0x7f:0x00);
};
DJTechiMixReload.deck1sync = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["deck1sync"],value?0x7f:0x00);
};
DJTechiMixReload.deck1hotcue1 = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["deck1hotcue1"],value?0x7f:0x00);
};
DJTechiMixReload.deck1hotcue2 = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["deck1hotcue2"],value?0x7f:0x00);
};
DJTechiMixReload.deck1hotcue3 = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["deck1hotcue3"],value?0x7f:0x00);
};
DJTechiMixReload.deck1loop = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["deck1loop"],value?0x7f:0x00);
};
DJTechiMixReload.deck1fx1 = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["deck1fx1"],value?0x7f:0x00);
};
DJTechiMixReload.deck1downbeat = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["deck1downbeat"],value?0x7f:0x00);
};
DJTechiMixReload.deck2play = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["deck2play"],value?0x7f:0x00);
};
DJTechiMixReload.deck2cue = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["deck2cue"],value?0x7f:0x00);
};
DJTechiMixReload.deck2sync = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["deck2sync"],value?0x7f:0x00);
};
DJTechiMixReload.deck2hotcue1 = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["deck2hotcue1"],value?0x7f:0x00);
};
DJTechiMixReload.deck2hotcue2 = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["deck2hotcue2"],value?0x7f:0x00);
};
DJTechiMixReload.deck2hotcue3 = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["deck2hotcue3"],value?0x7f:0x00);
};
DJTechiMixReload.deck2loop = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["deck2loop"],value?0x7f:0x00);
};
DJTechiMixReload.deck2fx1 = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["deck2fx1"],value?0x7f:0x00);
};
DJTechiMixReload.deck2downbeat = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["deck2downbeat"],value?0x7f:0x00);
};
DJTechiMixReload.mixerch1pfl = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["mixer1ch1pfl"],value?0x7f:0x00);
};
DJTechiMixReload.mixerch1highkill = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["mixerch1highkill"],value?0x7f:0x00);
};
DJTechiMixReload.mixerch1midkill = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["mixerch1midkill"],value?0x7f:0x00);
};
DJTechiMixReload.mixerch1lowkill = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["mixerch1lowkill"],value?0x7f:0x00);
};
DJTechiMixReload.mixerch2pfl = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["mixerch2pfl"],value?0x7f:0x00);
};
DJTechiMixReload.mixerch2highkill = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["mixerch2highkill"],value?0x7f:0x00);
};
DJTechiMixReload.mixerch2midkill = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["mixerch2midkill"],value?0x7f:0x00);
};
DJTechiMixReload.mixerch2lowkill = function(value)
{
    midi.sendShortMsg(0x90,DJTechiMixReload.buttons["mixerch2lowkill"],value?0x7f:0x00);
};
