﻿/// <reference name="MicrosoftAjax.js"/>
/// <reference name="MicrosoftAjaxTimer.js"/>
/// <reference name="MicrosoftAjaxWebForms.js"/>






/******** Class MrGene.Modules.Data_Cloning(elem) ********/

Type.registerNamespace("MrGene.Modules.Data_Cloning");

/******** Constructur ********/
MrGene.Modules.Data_Cloning = function() {
    this._txtSequenceID = null;
    this._lblSequenceStartID = null;
    this._lblSequenceEndID = null;
    this._ProjectTypeID = null;
    this._txtGBID = null;
    this._txtProjectNameID = null;
    this._ddlCloningSiteID = null;
    this._cloning5textareaID = null;
    this._UTR5textareaID = null;
    this._txtSequenceID = null;
    this._UTR3textareaID = null;
    this._cloning3textareaID = null;
    this._cloningBackboneID = null;

}


MrGene.Modules.Data_Cloning.prototype = {

    /******** Method CheckInputSequence(elem) ********/
    CheckInputSequence: function() {
        var elem = $get(this._txtSequenceID);


        var sequence = "";

        sequence = elem.value.toUpperCase();
        sequence = sequence.replace(/[^A-Z]/ig, "");
        elem.value = sequence;

        var startStr;
        var endStr;

        if (sequence.length > 6) {
            startStr = sequence.substr(0, 6);
            if (this._lblSequenceStartID != null) $get(this._lblSequenceStartID).innerHTML = startStr.toUpperCase() + "...";
        }

        if (sequence.length > 12) {
            endStr = sequence.substr((sequence.length - 6), 6);
            if (this._lblSequenceEndID != null) $get(this._lblSequenceEndID).innerHTML = "..." + endStr.toUpperCase();
        }


        elem.value = MrGene.Tools.CreateBlocksAndRowString(sequence, 10, 8);

        this.UpdateGBData();
    },


    /******** Method Expand(width, height, layer, element, hide, edit, visedit, tooltip, vistooltip, pnwidth, pnheigth) ********/
    Expand: function(width, height, layer, element, hide, edit, visedit, tooltip, vistooltip, pnwidth, pnheigth) {
        document.getElementById(element).style.width = width;
        document.getElementById(element).style.height = height;
        document.getElementById(element).style.overflow = hide;
        document.getElementById(element).parentNode.style.zIndex = layer;
        document.getElementById(element).parentNode.style.width = pnwidth;
        document.getElementById(element).parentNode.style.height = pnheigth;
        //document.getElementById(element).value = document.getElementById(element).parentNode.style.zIndex;
        document.getElementById(edit).style.visibility = visedit;
        document.getElementById(tooltip).style.visibility = vistooltip;
    },


    /******** Method CheckInputUTR(elem) ********/
    CheckInputUTR: function(elem) {
        var sequence = "";
        sequence = elem.value.toUpperCase();
        sequence = sequence.replace(/[^A-Z]/ig, "");
        elem.value = sequence;
        this.UpdateGBData();
    },

    /******** Method ResizeControl(elem, x) ********/
    ResizeControl: function(elem, x) {
        elem.style.height = x;
    },

    /******** Method ValidateMultipleOfThree(source, clientside_arguments) ********/
    ValidateMultipleOfThree: function(source, clientside_arguments) {
        if ($get(this._ProjectTypeID).value == "optimized") {

            var len = clientside_arguments.Value.toUpperCase().replace(/[^A-Z]/ig, "").length;
            var mod = len % 3;

            if (mod == 0) {
                clientside_arguments.IsValid = true;
            }
            else { clientside_arguments.IsValid = false };
        }
    },

    /******** Method ValidateLength(source, clientside_arguments) ********/
    ValidateLength: function(source, clientside_arguments) {
        var elem = document.getElementById(this._txtSequenceID);
        var seq = new String();
        seq = elem.value.toUpperCase().replace(/[^A-Z]/ig, "");
        if (seq.length > 4000 || seq.length < 120) {
            clientside_arguments.IsValid = false;
        }
        else { clientside_arguments.IsValid = true };
    },


    /******** Method UpdateGBData() ********/
    UpdateGBData: function() {
        if (this._txtGBID == null) return;

        var txtGB = $get(this._txtGBID);
        var gbHeader = ">" + $get(this._txtProjectNameID).value.trim().replace(/\s/g, "_") + "_";
        var el = $get(this._ddlCloningSiteID);
        gbHeader += el.options[el.selectedIndex].text + "\n";

        var vectorSeq = new String();

        // 1. cloning5   
        var val;
        el = $get(this._cloning5textareaID);
        if (el != null) {
            val = el.value.trim();
            if (val.length > 0) vectorSeq += val;
        }

        // 2. UTR3
        el = $get(this._UTR5textareaID);
        val = el.value.trim();
        if (val.length > 0) vectorSeq += val;

        // 3. Sequence
        vectorSeq += $get(this._txtSequenceID).value.replace(/[^A-Z]/ig, "");

        // 4. UTR3
        el = $get(this._UTR3textareaID);
        val = el.value.trim();
        if (val.length > 0) vectorSeq += val;

        // 5. cloning3   
        el = $get(this._cloning3textareaID);
        if (el != null) {
            val = el.value.trim();
            if (val.length > 0) vectorSeq += val;
        }

        // 6. Backbone
        vectorSeq += $get(this._cloningBackboneID).value;

        // add each 80 nucleotids a \n
        var i = 0;
        var seqFormatted = new String();
        do {
            seqFormatted += vectorSeq.substr(i, 80) + "\n";
            i += 80
        } while (i < vectorSeq.length);


        txtGB.value = gbHeader + seqFormatted;
    }

}

MrGene.Modules.Data_Cloning.registerClass("MrGene.Modules.Data_Cloning");



/******** Class MrGene.Modules.Data_Cloning(elem) ********/
Type.registerNamespace("MrGene.Modules.Start");

/******** Constructur ********/
MrGene.Modules.Start = function() {
    this._sequenceTextBoxID = null;
    this._messageLabelID = null;
    this._errorMessage = null;
}


MrGene.Modules.Start.prototype = {

    /******** Method CheckInputSequence(elem) ********/
    CheckInput: function() {
        var elem = $get(this._sequenceTextBoxID);
        var sequence = "";
        sequence = elem.value.toUpperCase();
        sequence = sequence.replace(/[^A-Z]/ig, "");
        elem.value = MrGene.Tools.CreateBlocksAndRowString(sequence, 10, 8);


        //        sequence = elem.value; //.toUpperCase();
        //        sequence = sequence.replace(/\n|\r|\t|\s|[0-9]/ig, "");
        //        elem.value = sequence;

    },

    /******** Method CheckInputSequence(elem) ********/
    Amino2DNA_Click: function() {
        var elem = $get(this._sequenceTextBoxID);

        var errorLabel = $get(this._messageLabelID);
        errorLabel.style.display = "none";

        var seq = elem.value.replace(/[^A-Z]/ig, "");
        var result = MrGene.Tools.Amino2DNA(seq);
        if (result == "-1") {
            var errorMessage = this._errorMessage;
            errorLabel.innerHTML = errorMessage;
            errorLabel.style.display = "inline";
        }
        else {
            elem.value = result;
        }
        this.CheckInput();
    },

    /******** Method ValidateLength(source, clientside_arguments) ********/
    ValidateLength: function(source, clientside_arguments) {
        var elem = document.getElementById(this._sequenceTextBoxID);
        var seq = new String();
        seq = elem.value.toUpperCase().replace(/[^A-Z]/ig, "");
        if (seq.length > 4000 || seq.length < 120) {
            clientside_arguments.IsValid = false;
        }
        else { clientside_arguments.IsValid = true };
    }

}




/******** Class MrGene.Tools ********/
/******** Static Method CreateBlocksAndRowString(seq, blockSize, blocksPerRow) ********/
Type.registerNamespace("MrGene.Tools");

MrGene.Tools = function() { }

MrGene.Tools.CreateBlocksAndRowString = function(seq, blockSize, blocksPerRow) {
    var seqFormatted = new String();

    var j = 0;
    var i = 0;
    var row;
    var col;
    var currIndex;

    var charsPerRow = blockSize * blocksPerRow;

    do {

        row = seq.substr(i, charsPerRow);

        currIndex = (i + 1);

        var indexString = new String(currIndex.format("d4"));
        indexString = indexString.replace(/^000/ig, "   ").replace(/^00/ig, "  ").replace(/^0/ig, " ");

        seqFormatted += indexString + " ";

        j = 0;
        do {
            col = row.substr(j, blockSize);
            seqFormatted += col + " ";
            j += blockSize;
        } while (j < row.length);


        seqFormatted += "\n";

        i += charsPerRow
    } while (i < seq.length);


    return seqFormatted.substr(0, seqFormatted.length - 1);
}

/******** Static Method Amino2DNA(asr) ********/
MrGene.Tools.Amino2DNA = function(asr) {
    asr = asr.toUpperCase();
    var s2 = "";
    var curr;
    for (i = 0; i < asr.length; i++) {
        curr = asr.substr(i, 1);
        switch (curr) {
            case "A":
                s2 += "GCG";
                break;
            case "C":
                s2 += "TGC";
                break;
            case "D":
                s2 += "GAT";
                break;
            case "E":
                s2 += "GAA";
                break;
            case "F":
                s2 += "TTT";
                break;
            case "G":
                s2 += "GGC";
                break;
            case "H":
                s2 += "CAT";
                break;
            case "I":
                s2 += "ATT";
                break;
            case "K":
                s2 += "AAA";
                break;
            case "L":
                s2 += "CTG";
                break;
            case "M":
                s2 += "ATG";
                break;
            case "N":
                s2 += "AAC";
                break;
            case "P":
                s2 += "CCG";
                break;
            case "Q":
                s2 += "CAG";
                break;
            case "R":
                s2 += "CGT";
                break;
            case "S":
                s2 += "AGC";
                break;
            case "T":
                s2 += "ACC";
                break;
            case "V":
                s2 += "GTG";
                break;
            case "W":
                s2 += "TGG";
                break;
            case "Y":
                s2 += "TAT";
                break;
            case "*":
                s2 += "TAA";
                break;
            default:
                return -1;
        }
    }
    return s2;
}

MrGene.Tools.registerClass("MrGene.Tools");








/* Diverse functions*/

function deactivateSubmitButton(el) {
    var valid = true;
    if (typeof (Page_IsValid) != "undefined") valid = Page_IsValid;

    if (valid) {          

        var hiddenCopy = document.createElement("input");
        hiddenCopy.type = "hidden";
        hiddenCopy.name = el.name;
        hiddenCopy.value = el.value;

        el.parentNode.insertBefore(hiddenCopy, el);

        el.value = 'Wait';
        el.disabled = "disabled";
        the_function = "animatedInput('" + el.id + "', 'Wait', '')";
        window.setTimeout(the_function, 500);
    }
}

function animatedInput(id, text, suffix) {
    if (suffix.length > 8) {
        suffix = "";
    } else {
        suffix = suffix + " .";
    }

    var el = document.getElementById(id);
    
    if (typeof (el) != "undefined" && el != null) {
        el.value = text + suffix;
        the_function = "animatedInput('" + id + "', '" + text + "', '" + suffix + "')"
        window.setTimeout(the_function, 500);
    }
}


