view Blast output page example trimmed_files/formatRes.js @ 20:53cd304c5f26

Add index for multiple results; fix layout of query ruler for edge case The query ruler did not layout nicely if the last segment was too short to contain the text. For very short last segments the text is now displayed after the ruler.
author Jan Kanis <jan.code@jankanis.nl>
date Wed, 14 May 2014 16:20:29 +0200
parents ffe82516a83c
children
line wrap: on
line source

// JScript source code
/*************************new code begin *******************************************************/

function getHiddenFieldVal(elemName) {
    var val;
    var elem = document.getElementsByName(elemName);
    if (elem) {
        val = (elem.length > 1) ? elem[0].value : elem.value;
    }
    return val;
}

function getHiddenFieldParamString(elemName) {
    var ret = "";
    var val = getHiddenFieldVal(elemName);
    if (val) {
        ret = "&" + elemName + "=" + val;
    }
    return ret;
}

function elementInViewport(el) {
    if (!el) return;
    var rect = el.getBoundingClientRect();

    var myWidth = 0, myHeight = 0;
    if (typeof (window.innerWidth) == 'number') {
        //Non-IE
        myWidth = window.innerWidth;
        myHeight = window.innerHeight;
    } else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
        //IE 6+ in 'standards compliant mode'
        myWidth = document.documentElement.clientWidth;
        myHeight = document.documentElement.clientHeight;
    } else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
        //IE 4 compatible
        myWidth = document.body.clientWidth;
        myHeight = document.body.clientHeight;
    }
    //window.alert('Width = ' + myWidth);
    //window.alert('Height = ' + myHeight);


    //return (rect.top >= 0 && rect.left >= 0 && rect.bottom <= window.innerHeight && rect.right <= window.innerWidth)
    //return (rect.top >= 0 && rect.left >= 0 && rect.bottom <= myHeight && rect.right <= myWidth)
    return (rect.top >= 0 && rect.bottom <= myHeight);
}

function DisplayAlignFromDescription(elem) {
    var alignView = $("FormatForm").ALIGNMENT_VIEW;
    if (alignView[alignView.selectedIndex].value == "Pairwise" || alignView[alignView.selectedIndex].value == "PairwiseWithIdentities") {
        DisplayDynamicAlign(elem);
    }
    else {
        location.href = "#" + elem.getAttribute("seqID");        
    }
}	

//<a class="deflnDesc" hsp=<hsp_num> ind="<index>" gi="<gi>" id="deflnDesc_gi" href="#AlnHdrgi">desc</a>
//<div class="alnHdr" gi="<gi>" id="alnHdr_<index>">
function DisplayDynamicAlign(elem) {
    var currGi = elem.getAttribute("gi");
    var currInd = elem.getAttribute("ind");
    var stat = elem.getAttribute("stat");
    if (!currInd || !currGi) return;
    
    if (!stat || stat == "") {
        //Get 4(5) aligns before currInd and 4(5) aligns after
        ReadCurrentSeqAligns(currInd, 5);        
    }
    else if (stat == "read") {
        var indexes = getCurrIndexRange(currInd);
        if (indexes) {
            var msgID = "alnShow_" + indexes[0];
            location.href = "#" + msgID;
        }
    }
    else {
        //error status handling        
    }
}


function goToNextAlign(dtrID, next) {
    var currInd = parseInt($(dtrID).getAttribute("ind"));
    var rid = $("Rid").value;
    nextInd = (next) ? currInd + 1 : currInd - 1;

    if ($("deflnDesc_" + nextInd)) {
        currGi = $("deflnDesc_" + nextInd).getAttribute("seqID");
        scrollToGI = currGi;
        if (!$("deflnDesc_" + nextInd).getAttribute("stat") || $("deflnDesc_" + nextInd).getAttribute("stat") == "") {

            if (!next) {
                ReadPrevSeqAligns(currInd, 5, scrollToGI);
            }
            else {
                //Use this indexes = wasAlignRead(nextInd); to determine insertAfterID in ReadNextAligns!!!
                ReadNextSeqAligns(currInd, 5, scrollToGI);
            }

        }
        else {
            location.href = "#" + scrollToGI;
        }
    }
}

function goToDefLine(dtrID) {
    if ($("psiInp")) {
        var tbl = jQuery($(dtrID)).parents(".jig-ncbigrid"); //parent table
        togglerID = PsiBelowThresh(tbl[0].id) ? "showDescB1" : "showDescG1";
        jQuery($(togglerID)).ncbitoggler("open");
    }
}

/*
readAln.rid = rid;
readAln.startIndex = parseInt(currInd);
readAln.numSeq = parseInt(maxNumAligns);

readAln.insertAfterID = insertAfterID;
readAln.seqList = giList;
readAln.scrollToSeqID = scrollToGI;
*/
function ReadNextSeqAligns(currInd, maxNumAligns, scrollToGI) {
    var lastDispIdx = 0;
    var rid = $("Rid").value;

    var readAln = new Object();
    readAln.seqList = ""; //giList
    readAln.rid = rid;

    currInd = parseInt(currInd);

    if (currInd != 0 && $("deflnDesc_" + currInd)) {
        var par = utils.getParent($("aln_" + $("deflnDesc_" + currInd).getAttribute("seqID"))); //"alnShowReal_<ind>
        //alert(par.id);
        if (par) par = utils.getParent(par); //"alnShow_<ind>
        //alert(par.id);
        if (par) readAln.insertAfterID = par.id;
    }
    else {
        readAln.insertAfterID = "alnStart";
    }



    readAln.startIndex = currInd + 1;
    readAln.numSeq = maxNumAligns;
        
    checkIfAlnExceedsThreshold(readAln, currInd, maxNumAligns, "next");
        
    readAln.scrollToSeqID = (scrollToGI && scrollToGI != "") ? scrollToGI : "";
    readAln.hspSort = 0;
    ReadSeqAlignByIndex(readAln);
}

function ReadPrevSeqAligns(currInd, maxNumAligns, scrollToGI) {
    var lastDispIdx = 0;
    var rid = $("Rid").value;

    var readAln = new Object();
    readAln.seqList = ""; //giList
    readAln.rid = rid;

    currInd = parseInt(currInd);


    //sets readAln.insertAfterID and returns lastDispIdx;
    //Find the index of the previously displayed alignment
    lastDispIdx = getPrevDisplyedAlignInfo(currInd, readAln);

    readAln.startIndex = (currInd - lastDispIdx > maxNumAligns) ? (currInd - maxNumAligns) : lastDispIdx + 1;
    readAln.numSeq = currInd - readAln.startIndex;    //stopIndex = currInd
    
    checkIfAlnExceedsThreshold(readAln, currInd, readAln.numSeq, "prev");
        
    readAln.scrollToSeqID = (scrollToGI && scrollToGI != "") ? scrollToGI : $("deflnDesc_" + (currInd)).getAttribute("seqID");
    readAln.hspSort = 0;
    ReadSeqAlignByIndex(readAln);
}

//When descriptions is clicked - display maxNumAligns before currInd and maxNumAligns after currInd
function ReadCurrentSeqAligns(currInd, maxNumAligns) {
    var rid = $("Rid").value;
    var readAln = new Object();
    readAln.seqList = ""; //giList
    readAln.rid = rid;

    currInd = parseInt(currInd);


    //sets readAln.insertAfterID and returns lastDispIdx;
    //Find the index of the previously displayed alignment
    var lastDispIdx = getPrevDisplyedAlignInfo(currInd, readAln);

    //lastDispIdx = parseInt(lastDispIdx);
    readAln.startIndex = (currInd - lastDispIdx > maxNumAligns) ? (currInd - maxNumAligns) : lastDispIdx + 1;
    readAln.numSeq = parseInt(maxNumAligns * 2);
        
    checkIfAlnExceedsThreshold(readAln, currInd, maxNumAligns, "curr");
        
    readAln.scrollToSeqID = $("deflnDesc_" + currInd).getAttribute("seqID");
    readAln.hspSort = 0;
    ReadSeqAlignByIndex(readAln);
    g_DisableAutoCheck = true;
    location.href = "#alnShow_" + readAln.startIndex;
}




function setupDynHSPParams(readAln) 
{
    var currSeqInd = readAln.startIndex;
    hspNum = parseInt($("deflnDesc_" + currSeqInd).getAttribute("hsp"));
    alnLen = parseInt($("deflnDesc_" + currSeqInd).getAttribute("len"));
    var maxDispLen = parseInt($("maxDispAlnLen").value);//20000
    var minDispLen = parseInt($("minDispAlnLen").value);//2000
    if (alnLen > maxDispLen) {
        var lenPerMatch = alnLen / hspNum;        
        readAln.AlignDbPageSize = (lenPerMatch > minDispLen) ? 1 : Math.floor(minDispLen / lenPerMatch);
        readAln.AlignDbPageNum = 0;
        $("deflnDesc_" + currSeqInd).setAttribute("dynHsps", readAln.AlignDbPageSize);
    }
}



function getCurrSeqsAlnLen(currSeqInd) 
{
    var alnLen = 0;
    if ($("deflnDesc_" + currSeqInd) && (!$("deflnDesc_" + currSeqInd).getAttribute("stat") || $("deflnDesc_" + currSeqInd).getAttribute("stat") == "")) {
        alnLen = $("deflnDesc_" + currSeqInd).getAttribute("len");            
    }
    alnLen = (alnLen) ? parseInt(alnLen) : 0;
    return alnLen;
}

function checkTotalAlignLen(startIndex,stopIndex)
{
    var dispAlnLen = 0;
    var maxDispLen = parseInt($("maxDispAlnLen").value);    
    for (var i = startIndex; i <= stopIndex; i++) {
        alnLen = getCurrSeqsAlnLen(i);
        if (alnLen == 0) break;
        dispAlnLen += alnLen;        
    }
    return dispAlnLen;
}
//Get total align length for seq currSeqInd and
//"curr" surrounding countSeqs seqs + current, "prev" - previous countSeqs seqs, "next" - next countSeqs seqs
function getTotalAlignLen(readAln, currSeqInd, countSeqs, dispType) 
{
    var startIndex = readAln.startIndex;
    var stopIndex = readAln.startIndex + readAln.numSeq - 1;
    if (dispType == "curr") {//checks countSeqs before and countSeqs after current, including current                
        startIndex = Math.max(startIndex, currSeqInd - countSeqs);        
        stopIndex = Math.min(stopIndex, currSeqInd + countSeqs);        
    }
    else if(dispType == "prev") {        
        startIndex = Math.max(startIndex, currSeqInd - 1 - countSeqs);
        stopIndex = currSeqInd - 1;        
    }
    else {//next                                
        stopIndex = Math.min(stopIndex, currSeqInd + countSeqs + 1);
    }
    var totAlnLen = checkTotalAlignLen(startIndex,stopIndex);
    return totAlnLen;
}

function checkIfAlnExceedsThreshold(readAln,currSeqInd,maxNumAligns, dispType) 
{
    var maxDispLen = parseInt($("maxDispAlnLen").value);
    var totAlnLen = 0;
    var exc = false;
    for (var numSeq = 0; numSeq <= maxNumAligns; numSeq++) {
        totAlnLen = getTotalAlignLen(readAln, currSeqInd, numSeq, dispType);
        if(totAlnLen > maxDispLen) {
            break;
        }
    }
    if (totAlnLen > maxDispLen) {
        if (numSeq != 0) numSeq--;      
        if (dispType == "curr") {
            readAln.startIndex = Math.max(readAln.startIndex, currSeqInd - numSeq);
            //prev + 1(curr) + next            
            readAln.numSeq = (currSeqInd - readAln.startIndex) + 1 + numSeq;
        }
        else if (dispType == "prev") {
            readAln.startIndex = Math.max(readAln.startIndex, currSeqInd - 1 - numSeq);
            readAln.numSeq = numSeq + 1;
        }
        else { //"next" - readAln.startIndex stays
            readAln.numSeq = numSeq + 1;
        }
        
        if (readAln.numSeq == 1 && $("useAlignDB") && $("useAlignDB").value == "true") {
            setupDynHSPParams(readAln);            
        } 
                   
        exc = true;   
    }
    return exc;
}


//readAln.startIndex, readAln.numSeq, readAln.scrollToSeqID,readAln.insertAfterID should be set
function ReadSeqAlignByIndex(readAln) {
    var numAligns = 0;
    for (var i = readAln.startIndex; i < readAln.startIndex + readAln.numSeq; i++) {

        if (!$("deflnDesc_" + i)) {
            break;
        }
        if (!$("deflnDesc_" + i).getAttribute("stat") || $("deflnDesc_" + i).getAttribute("stat") == "") {            
            currGi = $("deflnDesc_" + i).getAttribute("seqFSTA");
            if (readAln.seqList != "") readAln.seqList += ",";
            readAln.seqList += currGi;
            numAligns++;
        }
        else {
            break;
        }
    }
    if (readAln.seqList != "") {        
        readAln.numSeq = parseInt(numAligns);
        ReadSeqAlignForSeqList(readAln);
    }
}


var g_DisplayeAlignsRanges = ""; //String in the format start1-stop1,start2-stop2...
//Find the range of indexes of displayed alignments for currAlnInd
//Returns array of 2 startIndex, stopIndex
function getCurrIndexRange(currAlinInd) {
    var currRange;
    var ranges = g_DisplayeAlignsRanges.split(",");
    for (var i = 0; i < ranges.length; i++) {
        var indexes = ranges[i].split("-");
        if (currAlinInd >= parseInt(indexes[0]) && currAlinInd <= parseInt(indexes[1])) {
            currRange = indexes;
            break;
        }
    }
    return currRange;
}


//Find the index of the previous  displayed alignment
function getPrevDisplyedAlignInfo(currInd, readAln) {
    readAln.insertAfterID = "alnStart";
    lastDispIdx = 0;
    for (var i = currInd - 1; i >= 1; i--) {
        indexes = getCurrIndexRange(i);
        if (indexes) {
            lastDispIdx = indexes[1];
            readAln.insertAfterID = "alnShow_" + indexes[0];
            break;
        }
    }
    return parseInt(lastDispIdx);
}


//setReadStatus
function setSeqAlnReadStatus(readAln, status) {
    for (var i = readAln.startIndex; i < readAln.startIndex + readAln.numSeq; i++) {
        if ($("deflnDesc_" + i)) {
            jQuery($($("deflnDesc_" + i))).attr("stat", status);
            if (status == "disp") {
                g_MaxDisplayedIndex = (i > g_MaxDisplayedIndex) ? i : g_MaxDisplayedIndex;
            }
        }
    }
}

/*
readAln.rid = rid;
readAln.seqList = giList;
readAln.startIndex = parseInt(idx);
readAln.insertAfterID = insertAfterID;
readAln.numSeq = parseInt(numSeq);
readAln.scrollToSeqID = scrollToGI;
*/
function SendReadSeqAlinRequest(readAln) {        
    blastUrl = "t2g.cgi";
    
    var rp = new RemoteDataProvider(blastUrl);


    rp.onSuccess = function(obj) {
        if ($("alignView")) utils.removeClass($("alignView"), "hidden");

        if ($("alnShow_" + readAln.startIndex)) {
            var moreHspsLink = getNextHspsLink(readAln);            
            jQuery($($("alnShowReal_" + readAln.startIndex))).html(obj.responseText + moreHspsLink, {
                'widgets': ['ncbipopper', 'ncbitoggler'],
                'configs': {
                    'ncbipopper': { hasArrow: true, arrowDirection: 'top' }
                }
            }); 
            setSeqAlnReadStatus(readAln, "disp");
            jQuery($("alnMsg_" + readAln.startIndex)).addClass("hidden");        
            //Saves start and stop indexes of loaded alignments in global variables
            saveIdxesForAutomaticLoad(readAln);
            jQuery($($("alnShowReal_" + readAln.startIndex))).find(".alnHdr").each(function(index) {
                var seqID = this.getAttribute("seqID");
                if(seqID) initAlignBatch(seqID);
            });

        }

        if (readAln.scrollToSeqID) {
            location.href = "#" + readAln.scrollToSeqID;
        }

    };
    rp.onError = function(obj) {        
        if ($("alignView")) utils.removeClass($("alignView"), "hidden");
        jQuery($("alnMsg_" + readAln.startIndex)).addClass("hidden");
        $("alnShowReal_" + readAln.startIndex).innerHTML = "<div class=\"erm\" id=\"erm_" + readAln.startIndex + "\">Error loading alignment ...<span class=\"db\">requests:" + this.iActiveRequests + " status:" + obj.status +
                          "</span><a class=\"gbd\" href=\"#\" onclick=\"ReSubmitReadSeqAligns(event," + readAln.startIndex + ")\">Try again<\a></div>";
    }
    var params = constructURLParams(readAln);
    if (readAln.numSeq == 1) {
        params += "&TOTAL_HSPS=" + $("deflnDesc_" + readAln.startIndex).getAttribute("hsp");
    }
    params += "&SEQ_LIST_START=" + readAln.startIndex;    
    
    var formatParams = constructFormatParams();
    params += formatParams;    
    
    //alert(params);
    rp.Request(params);
}


function constructURLParams(readAln) {
    var params;

    if ($("useAlignDB") && $("useAlignDB").value == "true") {

        var alignDbParams = "&USE_ALIGNDB=true";
        var batchID = document.getElementsByName("ALIGNDB_BATCH_ID");
        if (batchID) {
            alignDbParams += getHiddenFieldParamString("ALIGNDB_BATCH_ID");
            alignDbParams += getHiddenFieldParamString("ALIGNDB_MASTER_ALIAS");
            alignDbParams += getHiddenFieldParamString("ALIGNDB_CGI_HOST");
            alignDbParams += getHiddenFieldParamString("ALIGNDB_CGI_PATH");
        }
        alignDbParams += "&ALIGN_SEQ_LIST=" + readAln.seqList;
        alignDbParams += "&HSP_SORT=" + readAln.hspSort;

        if (readAln.hasOwnProperty("AlignDbPageNum")) {
            alignDbParams += "&ALIGNDB_PAGE_NUM=" + readAln.AlignDbPageNum;
            alignDbParams += "&ALIGNDB_PAGE_SIZE=" + readAln.AlignDbPageSize;
            alignDbParams += "&HSP_START=" + readAln.AlignDbPageSize * readAln.AlignDbPageNum;
        }

        params = "CMD=Get&RID=" + readAln.rid + "&OLD_BLAST=false&DESCRIPTIONS=0&NUM_OVERVIEW=0&DYNAMIC_FORMAT=on" + alignDbParams;
    }
    else {
        params = "CMD=Get&RID=" + readAln.rid + "&OLD_BLAST=false&DESCRIPTIONS=0&NUM_OVERVIEW=0&GET_SEQUENCE=on&DYNAMIC_FORMAT=on&ALIGN_SEQ_LIST=" + readAln.seqList + "&HSP_SORT=" + readAln.hspSort;
    }    
    if ($("phiPtInd")) {
        params += "&PHI_PTTRN_INDEX=" + $("phiPtInd")[$("phiPtInd").selectedIndex].value;
    }
    return params;
}

/*
readAln.rid = rid;
readAln.seqList = giList;
readAln.startIndex = parseInt(idx);
readAln.insertAfterID = insertAfterID;
readAln.numSeq = parseInt(numSeq);
readAln.scrollToSeqID = scrollToGI;
*/
/*1. Draw div with id="alnShow_index" class ="alnMsg" with the message listing gis nad indexes
2. Insert another div with id="alnShowReal_index and class="alnMsgR"
3. For "alnShow_index" set atrr indexes="startInd-stopInd"
4. Set global g_MaxReadMessageIndex - max index of displayed seqalign ??? - check this 
5. Add string "startInd-stopInd" to g_DisplayeAlignsRanges - comma separated indexes
6. Send read request
*/

function ReadSeqAlignForSeqList(readAln) {
    var text = "<div id=\"alnShow_" + readAln.startIndex + "\" class=\"alnMsg\"><div class=\"alnMsgS\" id=\"alnMsg_" + readAln.startIndex + "\">Loading alignment...<span class=\"db\"> for sequences " + readAln.seqList;
    var stopIndex = readAln.startIndex + readAln.numSeq - 1;
    var useAlignDB = ($("useAlignDB") && $("useAlignDB").value == "true") ? "AlignDB=on " : "";
    text += " " + useAlignDB + "Reading indexes " + readAln.startIndex + "-" + stopIndex + "</span></div>";
    text += "<div id=\"alnShowReal_" + readAln.startIndex + "\" class=\"alnMsgR\"></div></div>";
    var debugControl = "<div id=\"debug\"></div>";
    if (!$("debug")) {
        jQuery($($("descriptions"))).before(debugControl);
    }
    if (!$("alnShow_" + readAln.startIndex)) {        
        jQuery($($(readAln.insertAfterID))).after(text);
        jQuery($($("alnShow_" + readAln.startIndex))).attr("indexes", readAln.startIndex + "-" + stopIndex);
        jQuery($($("alnShow_" + readAln.startIndex))).attr("seqlist", readAln.seqList);
        g_MaxReadMessageIndex = (readAln.startIndex > g_MaxReadMessageIndex) ? readAln.startIndex : g_MaxReadMessageIndex;
        setSeqAlnReadStatus(readAln, "read");
        $("debug").innerHTML += ", " + useAlignDB + "Reading indexes " + readAln.startIndex + "-" + stopIndex;

        if (g_DisplayeAlignsRanges != "") g_DisplayeAlignsRanges += ",";
        g_DisplayeAlignsRanges += readAln.startIndex + "-" + stopIndex;

        SendReadSeqAlinRequest(readAln);
    }
    else if ($("alnShowReal_" + readAln.startIndex).innerHTML.indexOf("Error") != -1) {
        jQuery($("alnMsg_" + readAln.startIndex)).removeClass("hidden");
        jQuery($("erm_" + readAln.startIndex)).remove();        
        SendReadSeqAlinRequest(readAln);
    }
}


function ReSubmitReadSeqAligns(e,currInd) {
    var rid = $("Rid").value;
    if ($("alnShow_" + currInd)) {
        var indexRange = jQuery($("alnShow_" + currInd)).attr("indexes");
        var range = indexRange.split("-");


        var readAln = new Object();
        readAln.seqList = ""; //giList
        readAln.rid = rid;
        readAln.seqList = jQuery($("alnShow_" + currInd)).attr("seqlist");
        readAln.startIndex = parseInt(range[0]);
        readAln.numSeq = parseInt(range[1]) - parseInt(range[0]) + 1;
        readAln.hspSort = 0;
        ReadSeqAlignForSeqList(readAln);
        utils.preventDefault(e);
    }
}


var g_MaxReadMessageIndex = 0; //alnShow_idx with the message, deflnDesc_idx with stat="read"
var g_MaxDisplayedIndex = 0; //deflnDesc_idx with stat="disp" - last one in the set of N
var g_DisableAutoCheck = false;

var g_autoStartIdx = new Array();
var g_autoStopIdx = new Array();

function saveIdxesForAutomaticLoad(readAln) {
    var stopIndex = readAln.startIndex + readAln.numSeq - 1;
    g_autoStartIdx.push(readAln.startIndex); //1,20,25
    g_autoStopIdx.push(stopIndex);  //4,24,29    
    $("debug").innerHTML += ", displaying indexes " + readAln.startIndex + "-" + stopIndex;
}

function getNextHspsLink(readAln)
{
    var moreHspsLink = ""
    if (readAln.hasOwnProperty("AlignDbPageNum")) {
        var nextPageNum = readAln.AlignDbPageNum + 1;
        var currHspInd = readAln.AlignDbPageSize * nextPageNum;
        var argstring = readAln.startIndex + "," + currHspInd;                
        var currGi = $("deflnDesc_" + readAln.startIndex).getAttribute("seqId");
        var accs = $("deflnDesc_" + readAln.startIndex).getAttribute("accs");        
        var totalHsps = $("deflnDesc_" + readAln.startIndex).getAttribute("hsp");
        var prevHspInd = readAln.AlignDbPageSize * nextPageNum;
        var segs = (prevHspInd + 1) + "-" + (prevHspInd + readAln.AlignDbPageSize);        
        var moreHspsID = "nxHsp" + currGi + "_" + (prevHspInd + 1);

        moreHspsLink = $("dynHspTmpl").innerHTML.replace("@moreHspsID@", moreHspsID);        
        moreHspsLink = moreHspsLink.replace(/@accs@/g, accs);
        moreHspsLink = moreHspsLink.replace("@argstring@", argstring);
        moreHspsLink = moreHspsLink.replace(/@segs@/g, segs);
        moreHspsLink = moreHspsLink.replace("@totalHSP@", totalHsps);        
        moreHspsLink = moreHspsLink.replace(/@alignDbPageSize@/g, readAln.AlignDbPageSize);
        moreHspsLink = moreHspsLink.replace("@aln_prev_num@", prevHspInd);
        moreHspsLink = moreHspsLink.replace("@alnSeqGi@", currGi);
    }
    return moreHspsLink;
}


function ReadNextHSPSet(currSeqInd, currHSPNum) {
    var readAln = new Object();

    readAln.rid = $("Rid").value;
    readAln.seqList = $("deflnDesc_" + currSeqInd).getAttribute("seqFSTA");
    readAln.gi = $("deflnDesc_" + currSeqInd).getAttribute("seqId");
    dynHsps = $("deflnDesc_" + currSeqInd).getAttribute("dynHsps");
    readAln.startIndex = currSeqInd;
    readAln.numSeq = 1;
    if (dynHsps) {
        readAln.AlignDbPageNum = parseInt(currHSPNum) / parseInt(dynHsps);
        readAln.AlignDbPageSize = parseInt(dynHsps); //number of HSps to retrieve
    }
    if (currHSPNum != 0) {
        readAln.scrollToSeqID = "hsp" + +readAln.gi + "_" + (parseInt(currHSPNum) + 1);
        readAln.insertAfterID = "ar_" + readAln.gi + "_" + currHSPNum;
    }
    var sortLink = $("sa_" + readAln.gi);
    readAln.hspSort = (sortLink) ? parseInt(sortLink[sortLink.selectedIndex].value) : 0;
    SendReadSeqAlinSortHSPRequest(readAln);
}

function ReadNextHSPSetEvt(e, currSeqInd, currHSPNum) {
    ReadNextHSPSet(currSeqInd, currHSPNum);    
    utils.preventDefault(e);
}



function checkAutoAlignArray() {
    var stop = false;
    var start = false;
    var currAlignViewPos = $("alignView").getBoundingClientRect().top;
    if (currAlignViewPos < g_alignViewPos) {//scrolling down
        g_alignViewPos = currAlignViewPos;
        if (g_DisableAutoCheck) {
            g_DisableAutoCheck = false;
            return;
        }        
        for (i = 0; i < g_autoStopIdx.length; i++) {
            if (elementInViewport($("alnHdr_" + $("deflnDesc_" + g_autoStopIdx[i]).getAttribute("seqID")))) {
                //alert("Reading more aligns scrolling down!");
                var nextInd = parseInt(g_autoStopIdx[i] + 1);
                var currInd = g_autoStopIdx[i];
                if ($("deflnDesc_" + nextInd) && (!$("deflnDesc_" + nextInd).getAttribute("stat") || $("deflnDesc_" + nextInd).getAttribute("stat") == "")) {
                    ReadNextSeqAligns(currInd, 5);
                    stop = true;
                    break;
                }
            }
        }
        if (stop) g_autoStopIdx.splice(i, 1); //delete index from the array
    }
    else if (currAlignViewPos > g_alignViewPos) {//scrolling up
        g_alignViewPos = currAlignViewPos;
        //here maybe return if autoStop found!!!
        /* commenting automic read when scroll up */
        for (i = 0; i < g_autoStartIdx.length; i++) {
            if (elementInViewport($("alnHdr_" + $("deflnDesc_" + g_autoStartIdx[i]).getAttribute("seqID")))) {
                //alert("Reading more aligns scrolling up!");
                var currInd = g_autoStartIdx[i];
                //Check for condition here if go there at all!!! Check if do the same thing as for ReadNext!!!!
                if (currInd > 1) {
                    ReadPrevSeqAligns(currInd, 5);
                    start = true;
                    break;
                }
            }
        }
        if (start) g_autoStartIdx.splice(i, 1);
    }
    /*end of comment*/
}

var g_alignViewPos = 0;

function checkAutoAlignLoad() {


    checkAutoAlignArray();

    if (jQuery($($(window))).scrollTop() + jQuery($($(window))).height() >= jQuery($($(document))).height() - 100) {
        //alert("bottom!");       

        if ($("alnShowReal_" + g_MaxReadMessageIndex) && $("alnShowReal_" + g_MaxReadMessageIndex).innerHTML != "") {
            //if(!$("alnShow_" + maxReadMessageIndex)) {//g_MaxReadMessageIndex
            ReadNextSeqAligns(g_MaxDisplayedIndex, 5);
        }
    }
}


function GetPatternLocResults()
{
    form = $("results");
    if (!form.PHI_PTTRN_INDEX) {
        var el = document.createElement("input");
        el.name = "PHI_PTTRN_INDEX";
        el.value = $("phiPtInd")[$("phiPtInd").selectedIndex].value;
        form.appendChild(el);
    }
    else {
        form.PHI_PTTRN_INDEX.value = $("phiPtInd")[$("phiPtInd").selectedIndex].value;
    }
    form.submit();
}

function goToNextHSP(elem, next) {    
    var par = jQuery(elem).parent(); //parent span with class="alnParLinks"
    var parts = par[0].id.split("_"); //"hsp<seqid>_hspnum "hsp207524544_2"
    if (parts[0].indexOf("nxHsp") != -1) {
        parts[0] = parts[0].replace("nxHsp", "hsp");
    }
    nextID = (next) ? parts[0] + "_" + (parseInt(parts[1]) + 1) : parts[0] + "_" + (parseInt(parts[1]) - 1)
    
    gotoElem = jQuery($(nextID));
    if (gotoElem[0]) {
        a = jQuery(gotoElem).offset();
        window.scroll(0, a.top);
    }
    
    else {
        retrieveNextHSP(parts[0],parts[1]);
    }
    
}


//parts[0]//hsp<seqid>,    parts[1] hspnum
function retrieveNextHSP(currLinkID, currHSPNum) 
{
    var desLineID = currLinkID.replace("hsp", "dtr_"); //tr id
    var currSeqInd, totalHsps;
    jQuery($($(desLineID))).find(".deflnDesc").each(function(index) {
        currSeqInd = parseInt(this.getAttribute("ind"));
        totalHsps = parseInt(this.getAttribute("hsp"));
        dynHsps = this.getAttribute("dynHsps");
    });
    currHSPNum = parseInt(currHSPNum);
    if (currHSPNum < totalHsps && dynHsps) {        
        ReadNextHSPSet(currSeqInd, currHSPNum);
    }
}
/********Adding those functions back to formatRes.js to identify Uncaught ReferenceError: getUrlCompForCheckedField is not defined error********************************/
function getUrlCompForEntryField(elem) {
    var url = "";
    if (elem && elem.value != "") {
        url = "&" + elem.name + "=" + escape(elem.value);
    }
    return url;
}


function getUrlCompForCheckedField(elem) {
    var url = "";
    if (elem && elem.checked) {
        url = "&" + elem.name + "=" + elem.value;
    }
    return url;

}

function getUrlCompForOptionsField(elem) {
    var url = "";
    if (elem) {
        url = "&" + elem.name + "=" + elem[elem.selectedIndex].value;
    }
    return url;
}
/****************************************/

function constructFormatParams() {
    var formatParams = "";

    if ($("queryList")) {
        formatParams += "&QUERY_INDEX=" + $("queryList")[$("queryList").selectedIndex].value;
    }

    
    formatParams += getUrlCompForCheckedField($("FormatForm").SHOW_LINKOUT);
    formatParams += getUrlCompForCheckedField($("FormatForm").SHOW_CDS_FEATURE);
    formatParams += getUrlCompForCheckedField($("FormatForm").NCBI_GI);
    formatParams += getUrlCompForOptionsField($("FormatForm").ALIGNMENT_VIEW);
    formatParams += getUrlCompForOptionsField($("FormatForm").MASK_CHAR);
    formatParams += getUrlCompForOptionsField($("FormatForm").MASK_COLOR);    
    formatParams += getUrlCompForEntryField($("FormatForm").EXPECT_LOW);
    formatParams += getUrlCompForEntryField($("FormatForm").EXPECT_HIGH);
    formatParams += getUrlCompForEntryField($("FormatForm").PERC_IDENT_LOW);
    formatParams += getUrlCompForEntryField($("FormatForm").PERC_IDENT_HIGH);
    formatParams += getUrlCompForEntryField($("FormatForm").LINE_LENGTH);
    

    formatParams += getHiddenFieldParamString("BUILD_NAME");
    
    var serviceType = "";
    if ($("serviceType").value == "sra") {
        serviceType = "sra";
    }
    else if ($("clientType").value == "TMSmart_restricted") {
        serviceType = "restricted";
    }
    if (serviceType != "") {
        formatParams += "&BOBJSRVC=" + serviceType;
    }
    if ($("currQuery").value != "") {
        formatParams += "&CURR_QUERY_ID=" + $("currQuery").value;
    }
    
    return formatParams;
}

//readAln.seqList contains one gi only for this
function SendReadSeqAlinSortHSPRequest(readAln) {
    blastUrl = "t2g.cgi";    
    var rp = new RemoteDataProvider(blastUrl);


    rp.onSuccess = function(obj) {
        var moreHspsLink = (readAln.hasOwnProperty("AlignDbPageNum")) ? getNextHspsLink(readAln) : "";        
        var alnHtml = obj.responseText + moreHspsLink;
        initHSPRequest(readAln, obj.responseText + moreHspsLink,false);        
        if (readAln.scrollToSeqID) {
            location.href = "#" + readAln.scrollToSeqID;
        }                
    };
    rp.onError = function(obj) {        
        var currHspInd = (readAln.hasOwnProperty("AlignDbPageNum")) ? readAln.AlignDbPageSize * readAln.AlignDbPageNum : 0;
        var msgID = "erm_" + readAln.gi + "_" + (currHspInd + 1);
        if (!$(msgID)) {
            var msg = "<div class=\"erm\" att=\"1\" id=\"" + msgID + "\">Error loading alignment ...<span class=\"db\">status:" + obj.status +
                          "</span><a class=\"gbd\" href=\"#\" onclick=\"ReadNextHSPSetEvt(event," + readAln.startIndex + "," + currHspInd + 
                          ")\">Try again <span class=\"attmt\"></span> <\a></div>";
            initHSPRequest(readAln, msg, true);
        }
        else {
            var attNum = parseInt($(msgID).getAttribute("att")) + 1;
            $(msgID).setAttribute("att", attNum);
            jQuery($(msgID)).find(".attmt").each(function(index) {
                jQuery(this).html(", attempt " + attNum);
            });
        }
    }
    
    var params = constructURLParams(readAln);
    if (readAln.AlignDbPageSize) {    
        params += "&TOTAL_HSPS=" + $("deflnDesc_" + readAln.startIndex).getAttribute("hsp");
    }    
    params += "&SORT_ONE_ALN=on";
    var formatParams = constructFormatParams();
        
    params += formatParams;
    
    //alert(params);
    rp.Request(params);
}
function initHSPRequest(readAln, alnHtml, err) {
    var currHspInd = (readAln.hasOwnProperty("AlignDbPageNum")) ? readAln.AlignDbPageSize * readAln.AlignDbPageNum : 0;    
    if (currHspInd != 0) {
        readAln.insertAfterID = "ar_" + readAln.gi + "_" + currHspInd;
        jQuery($(readAln.insertAfterID)).after(alnHtml);
        moreHspsID = "nxHsp" + readAln.gi + "_" + (currHspInd + 1);
        jQuery($(moreHspsID)).remove();
        if (!err) {
            errMsgID = "erm_" + readAln.gi + "_" + (currHspInd + 1);
            jQuery($(errMsgID)).remove();            
        }
    }
    else {
        jQuery($("alnAll_" + readAln.gi)).html(alnHtml);
    }    
}

function SortHSPAlnSel(e, sortLink) {//example id="sa_207524544"
    var readAln = new Object();

    
    var desLineID = sortLink.id.replace("sa", "dtr"); //tr id
    var seqInd;

    jQuery($($(desLineID))).find(".deflnDesc").each(function(index) {        
        seqInd = this.getAttribute("ind");
    });    
    
    ReadNextHSPSet(parseInt(seqInd), 0);
}


function configDescriptions(e,btn,dlgId) 
{
    var suffix = PsiBelowThresh(dlgId);    
    var colmnsInfId = "cfcDsInf" + suffix;
    var tblID = "dscTable" + suffix; //"dscTable[_psiw]"
    var showAllColId = "shcl" + suffix;    
    var chkBoxes = $C("checkbox", "type", $(dlgId), "input");
    if (!utils.hasClass(btn, "cnc")) $(colmnsInfId).value = "";    
    for (i = 0; i < chkBoxes.length; i++) {
        var check;
        if (utils.hasClass(btn, "cnc")) {//cancel
            if ($(colmnsInfId).value.indexOf(chkBoxes[i].value) != -1 && !chkBoxes[i].checked) {
                check = true;
            }
            else if ($(colmnsInfId).value.indexOf(chkBoxes[i].value) == -1 && chkBoxes[i].checked) {
                check = false;
            }
        }
        else if (utils.hasClass(btn, "rdf") && !chkBoxes[i].checked) {
            check = true;
        }
        if (typeof (check) != 'undefined') {
            chkBoxes[i].checked = check;
            showHideCol(tblID,parseInt(chkBoxes[i].value), !check);
        }
        if (!utils.hasClass(btn, "cnc")) {
            if (chkBoxes[i].checked) { //OK
                if ($(colmnsInfId).value != "") $(colmnsInfId).value += ",";
                $(colmnsInfId).value += chkBoxes[i].value;
            }
        }
    }
    if ($(colmnsInfId).value != $(colmnsInfId).getAttribute("defval")) {//defval = "2,3,4,5,6,7,8"
        jQuery($(showAllColId)).removeClass("hidden");
    }
    else {
        jQuery($(showAllColId)).addClass("hidden");
    }

    var chConfig = $("cfcDsSave").value != $(colmnsInfId).value;
    
    var cfds = document.getElementsByName("CONFIG_DESCR");        
    if (cfds) {
        for (i = 0; i < cfds.length; i++) {
            cfds[i].value = $(colmnsInfId).value;
        }
    }    
    $("cfcDsSave").value = $(colmnsInfId).value;
    if (chConfig) SaveConfigTable();
    jQuery(document.body).click();
    utils.preventDefault(e);
}



function initDescConfig() 
{
    initConfigColumns("dsConfig");
    if ($("psiw") && utils.hasClass($("psiw"), "shown")) {
        initConfigColumns("dsConfig_psiw");
    }        
}


function initConfigColumns(cnfDlgID) 
{
    var suffix = PsiBelowThresh(cnfDlgID);
    //cnfDlgID is "dsConfig[_psiw]"
    var colmnsInfId = "cfcDsInf" + suffix;
    var tblID = "dscTable" + suffix; //"dscTable[_psiw]"
    var showAllColId = "shcl" + suffix;
    
    if (navigator.userAgent.match(/ie/i)) {
        if ($("FormatForm").NCBI_GI.checked || $("serviceType").value == "sra") {        
            jQuery($(tblID)).find("th.c1").each(function(index) {            
                db = getHiddenFieldVal("DATABASE");
                var width = (db.match(/WGS/i) || db.match(/Whole_Genome_Shotgun_contigs/i)) ? "16em" : "14em";
                jQuery(this).css("width", width);
            });        
        }
    }

    jQuery($(tblID)).find("tr.first").each(function(index) {
        jQuery(this).find("a.dcs").each(function(index) {        
           jQuery(this).bind("click", function(e) { checkConfig(this); });           
        });
    });

    jQuery($(cnfDlgID)).find("button").each(function(index) {
        jQuery(this).bind("click", function(e) { configDescriptions(e, this, cnfDlgID); });
    });

        
    jQuery($(cnfDlgID)).bind("click", function(e) { e.stopPropagation(); });

    $(colmnsInfId).value = getHiddenFieldVal("CONFIG_DESCR");
    if ($(colmnsInfId).value == "" || $(colmnsInfId).value == "undefined") {
        $(colmnsInfId).value = $(colmnsInfId).getAttribute("defval");
    }
    if ($(colmnsInfId).value != $(colmnsInfId).getAttribute("defval")) {//defval = "2,3,4,5,6,7,8"
        jQuery($(showAllColId)).removeClass("hidden");
    }    
    else {
        jQuery($(showAllColId)).addClass("hidden");
    }
    var chkBoxes = $C("checkbox", "type", $(cnfDlgID), "input")
    for (i = 0; i < chkBoxes.length; i++) {
        jQuery(chkBoxes[i]).bind("click", configColumn);
        if ($(colmnsInfId).value.indexOf(chkBoxes[i].value) != -1) {
            chkBoxes[i].checked = true;
        }
        else {
            //jQuery($(tblID)).ncbigrid("hideColumn", chkBoxes[i].value);
            showHideCol($(tblID), chkBoxes[i].value, true); 
        }
    }
}
function showAllCol(e,elem) 
{
    var suffix = PsiBelowThresh(elem.id);
    var rdf = "dscRsDf" + suffix;
    jQuery($(rdf)).click();//click "restore defaults'
    utils.preventDefault(e);
}


function configColumn() {
    var suffix = PsiBelowThresh(this.id);
    var tblID = "dscTable" + suffix; //"dscTable[_psiw]"
    
    cCls = "c" + this.value;
    if (this.checked) {//show        
        showHideCol(tblID,parseInt(this.value), false);        
    }
    else {
        showHideCol(tblID,parseInt(this.value), true);        
    }
}

function showHideCol(tblID, columnIndex, hide) {

    if ($("Transcr")) {
        colHidden = utils.hasClass($("c" + columnIndex), "ui-ncbigrid-column-hidden");
        hide = hide && !colHidden;
        show = !hide && colHidden;
    }
    else {
        show = !hide;
    }    
    if (hide) {
        jQuery($(tblID)).ncbigrid("hideColumn", columnIndex);        
    }
    else if (show) {
        jQuery($(tblID)).ncbigrid("showColumn", columnIndex);    
    }
    if ($("Transcr") && (hide || show) ) {
        var colsp = parseInt($("Transcr").getAttribute("colspan"));
        colsp = (hide) ? colsp - 1 : colsp + 1;
        $("Transcr").setAttribute("colSpan", colsp);
        if ($("GnmSeq")) $("GnmSeq").setAttribute("colSpan", colsp);
    }
}

function checkConfig(lnk) {
    var cnfCol = "&CONFIG_DESCR=" + $("cfcDsSave").value;
    lnk.href = lnk.href + cnfCol + "#sort_mark";    
}

function DisplayAlignFromGraphics(seqID,e) //SeqID = gi if exists
{
    var dflLineLinks = $C(seqID, "gi", document, "a");    
    for (i = 0; i < dflLineLinks.length; i++) {
        jQuery(dflLineLinks[i]).click();
        break;
    }    
    location.href = dflLineLinks[i].href;
}



function initDescSelect() 
{

    jQuery("#cntDesc").find("a").each(function(index) {
        jQuery(this).bind("click", configDescrSelect);
    });
    jQuery("#cntSelN").click();
    jQuery("#descTblCtrl").find("a[view]").each(function(index) {
        jQuery(this).bind("click", DisplaySelectedView);
    });
    if ($("psiw") && utils.hasClass($("psiw"), "shown")) {
        jQuery("#cntDesc_psiw").find("a").each(function(index) {
            jQuery(this).bind("click", configDescrSelect);
        });
        jQuery("#cntSelN_psiw").click();
        jQuery("#descTblCtrl_psiw").find("a[view]").each(function(index) {
            jQuery(this).bind("click", DisplaySelectedView);
        });
    }
    
    
    //jQuery("#dsConfig").bind("click", function(e) { e.stopPropagation(); });??

}

function DisplaySelectedView(e) {
    if (this.getAttribute("view") == "graph") {    //seqviewer
        ViewSelectedSeqViewer(e,this);
    }
    else {
        if (this.getAttribute("view") == "tree") {    //seqviewer
            $("scrWidth").value = screen.width;
            $("scrHeight").value = screen.height;
        }
        ViewSelectedSeqsEx(e, this);
    }
}

function PsiBelowThresh(elemID) 
{
    var suffix = "";
    if (elemID.indexOf("_psiw") != -1) {
        suffix = "_psiw";
    }
    return suffix;
}

function ViewSelectedSeqsEx(e,elem) {
    var sbmForm = elem.getAttribute("frm");
    var seqList = elem.getAttribute("seqList");

    var cnfElem = utils.getParent(elem); //.cnf div    
    var suffix = PsiBelowThresh(cnfElem.id);
    var tblID = "dscTable" + suffix;

    $(seqList).value = createSelseqString(tblID,true);
    $(seqList).value = $(seqList).value.replace(/ti:/g, ""); //For traces
    if ($(seqList).value.indexOf("dbSNP") != -1) {
        $(seqList).value = $(seqList).value.replace(/dbSNP:rs/g, ""); //For snp
        elem.href = $(sbmForm).action + $(seqList).value;
        elem.target = "new";
    }
    else {
        $(sbmForm).submit();
        utils.preventDefault(e);
    }    
}

function ViewSelectedSeqsTree(e) {
    $("scrWidth").value = screen.width;
    $("scrHeight").value = screen.height;
}

function initSeqViewerGet(seqList) {
    if (seqList.length >= 2000) {    
        seqList = seqList.substr(0,2000);
        lastComma = seqList.lastIndexOf(",");
        seqList = seqList.substr(0,lastComma);             
    }
    $("seqViewParams").name = "RID";
    $("seqViewParams").value = $("ridParam").value + "[" + seqList + "]";
}

function ViewSelectedSeqViewer(e, elem) 
{
    var cnfElem = utils.getParent(elem); //.cnf div    
    var suffix = PsiBelowThresh(cnfElem.id);
    var tblID = "dscTable" + suffix;

    //change to false when new verison of seqVier is installed in production
    var seqList = createSelseqString(tblID, false);
    $("sbmtGraphics").action = $("seqViewUrl").value;
    
    var rp = new RemoteDataProvider("url2nc.cgi");
    rp.onSuccess = function(obj) {
        var jsnResp = JSON.parse(obj.responseText);
        ncid = jsnResp.ncid;

        if (ncid != "") {
            $("seqViewParams").name = "rkey";
            $("seqViewParams").value = ncid;
        }
        else {
            initSeqViewerGet(seqList);
        }
        $("sbmtGraphics").submit();        
    };
    rp.onError = function(obj) {
        initSeqViewerGet(seqList);
        $("sbmtGraphics").submit();
        utils.preventDefault(e);   
    }
    var params = $("ridParam").value + "[" + seqList + "]";    
    rp.Request(params, "POST");
    utils.preventDefault(e);   
}

function configDescrSelect(e) {    
    var sel = this.getAttribute("sel");    
    if (sel) {
        var selNum = 0;
        var check = (sel == "all") ? true : false;

        var suffix = PsiBelowThresh(this.id);
        var tblID = "dscTable" + suffix;
        var toolbarID = "descTblCtrl" + suffix;
        var selElID = "slcNum" + suffix;

        jQuery($(tblID)).find("input[type='checkbox'].cb").each(function(index) {
            jQuery(this)[0].checked = check;
            if (check) selNum++;
        });
        enableDescrLinks(selNum, toolbarID, selElID);        
    }     
    utils.preventDefault(e);
}



function enableDescrLinks(selNum, toolbarID, selElID) {
    jQuery($(toolbarID)).find("a[minSlct]").each(function(index) {
        var minSelected = this.getAttribute("minSlct");
        minSelected = parseInt(minSelected);
        if (selNum >= minSelected) {
            this.removeAttribute("disabled");
        }
        else {
            this.setAttribute("disabled", "disabled");
        }
    });    
    $(selElID).innerHTML = selNum;
}



function configDescrLinks(e, elem) 
{

    ncbi.sg.ping(elem, "click", elem.checked ? "checked=true" : "checked=false");     
    var par = jQuery(elem).parents(".jig-ncbigrid");//parent table
    if (par) {
        var suffix = PsiBelowThresh(par[0].id);
        var tblID = "dscTable" + suffix;
        var toolbarID = "descTblCtrl" + suffix;
        var selElID = "slcNum" + suffix;
        
        var currSelNum = parseInt($(selElID).innerHTML);
        var selNum = elem.checked ? currSelNum + 1 : currSelNum - 1;
        enableDescrLinks(selNum, toolbarID, selElID);
    }
}
/***Download code begin****/

function initDownLoadPopup(dwnDialog) {

    jQuery(dwnDialog).find("button").each(function(index) {        
        jQuery(this).bind("click", execDownLoad);        
    });

    jQuery(dwnDialog).bind("click", function(e) { e.stopPropagation(); });
}

function initDescDownLoad() {
    initDownLoadPopup($("dsDownload"));

    if ($("psiw") && utils.hasClass($("psiw"), "shown")) {
        initDownLoadPopup($("dsDownload_psiw"));        
    }
}

function initAlignDownLoad(navObj) 
{
    var seqID = navObj.seqID;
    var dwnDialog = $("dlgDwnl_" + seqID);
    jQuery(dwnDialog).find("button").each(function(index) {        
        jQuery(this).bind("click", execDownLoad);        
    });

    var dwnFSTW = $("dwFST_" + seqID);//whole seq
    var dwnFSTAl = $("dwFSTAl_" + seqID);//aligned regions
    
    if(dwnFSTW) dwnFSTW.setAttribute("seqfsta", navObj.currSeqID); 
    if(dwnFSTAl) dwnFSTAl.setAttribute("seqfsta", navObj.currSeqID); 
    
    jQuery(dwnDialog).bind("click", function(e) { e.stopPropagation(); });    
}

    
function execDownLoad(e) {
    if (!utils.hasClass(this, "cnc")) {
        par = utils.getParent(this);
        dwnDialog = utils.getParent(par); //parent dialog with popDl class
        var descr = (this.id == "dw_cont" || this.id == "dw_cont_psiw") ? true : false;
        jQuery(dwnDialog).find("input").each(function(index) {
            if (this.checked) {
                submitDownLoad(this, descr);
            }
        });
    }
    jQuery(document.body).click();
    utils.preventDefault(e);      
}

function submitDownLoad(radioElem, descr) {    
    var toolURL = radioElem.getAttribute("url");
    if (toolURL) {
        if (descr) {
            var getGi = radioElem.getAttribute("getGi");
            getGi = (getGi) ? true : false;
            
            var tblID = "dscTable";
            var suffix = PsiBelowThresh(radioElem.id);
            tblID += suffix;

            $("selDnSeqs").value = createSelseqString(tblID,getGi);
        }
        else {
            var seqfsta = radioElem.getAttribute("seqfsta");
            $("selDnSeqs").value = (seqfsta) ? seqfsta : radioElem.getAttribute("getGi");
        }
        var addParams = "";
        if (radioElem.getAttribute("addParam")) {
            addParams = addDwnlParams();
        }
        var submitName = radioElem.getAttribute("sbName")
        $("selDnSeqs").name = (submitName) ? submitName : "ALIGN_SEQ_LIST";
        $("dwdlSubmit").action = toolURL + addParams;
        $("dwdlSubmit").submit();
    }       
    else {
        var sbFunction = radioElem.getAttribute("sbFunc");        
        if (sbFunction) {
            eval(sbFunction + "(radioElem, descr)");
        }        
    }
}


function initDownLoadFSTA(radioElem, descr) 
{
    if (descr) {
    
        var tblID = "dscTable";
        var suffix = PsiBelowThresh(radioElem.id);
        tblID += suffix;

        $("sbmtFASTA").ALIGN_SEQ_LIST.value = createSelseqString(tblID,false);
    }
    else {        
        $("sbmtFASTA").ALIGN_SEQ_LIST.value = radioElem.getAttribute("seqfsta");
    }
    $("sbmtFASTA").DOWNLOAD_TYPE.value = radioElem.getAttribute("fstaDWType");
    
    $("sbmtFASTA").DATABASE.value = getHiddenFieldVal("DATABASE");
    if ($("useAlignDB") && $("useAlignDB").value == "true") {//temp checkbox    
        var batchID = document.getElementsByName("ALIGNDB_BATCH_ID");
        if (batchID) {
            $("sbmtFASTA").ALIGNDB_BATCH_ID.value = getHiddenFieldVal("ALIGNDB_BATCH_ID");
            $("sbmtFASTA").ALIGNDB_MASTER_ALIAS.value = getHiddenFieldVal("ALIGNDB_MASTER_ALIAS");
            $("sbmtFASTA").ALIGNDB_CGI_HOST.value = getHiddenFieldVal("ALIGNDB_CGI_HOST");
            $("sbmtFASTA").ALIGNDB_CGI_PATH.value = getHiddenFieldVal("ALIGNDB_CGI_PATH");
        }
    }
    $("sbmtFASTA").submit();    
}

function createSelseqString(tblID,getGi) {    
    var selSeqs = "";
    jQuery($(tblID)).find("input[type='checkbox'].cb").each(function(index) {
        if (jQuery(this)[0].checked) {
            if (selSeqs != "") selSeqs += ",";
            if (getGi) {
                selSeqs += jQuery(this)[0].value;
            }
            else {
                var linkID = jQuery(this)[0].id.replace("chk", "deflnDesc");
                selSeqs += $(linkID).getAttribute("seqFSTA");
            }
        }
    });
    return selSeqs;
}

/***Download code end****/

/***Init navigation code begin **/

function initNavigation(navObj) {    
    initNextAlnLink(navObj, true);
    initNextAlnLink(navObj, false);        
}


function initNavInfo(navObj) {
    var currInd = parseInt($("dtr_" + navObj.seqID).getAttribute("ind"));
    nextInd = currInd + 1;
    prevInd = currInd - 1;
    
    navObj.currSeqID = "";
    navObj.nextSeqID = "";
    navObj.prevSeqID = "";
        
    if ($("deflnDesc_" + nextInd)) {
        navObj.nextSeqID = $("deflnDesc_" + nextInd).getAttribute("accs");
        if(navObj.nextSeqID =="") navObj.nextSeqID = $("deflnDesc_" + nextInd).getAttribute("seqFSTA");
    }
    if ($("deflnDesc_" + prevInd)) {
        navObj.prevSeqID = $("deflnDesc_" + prevInd).getAttribute("accs");
        if (navObj.prevSeqID == "") navObj.prevSeqID = $("deflnDesc_" + prevInd).getAttribute("seqFSTA");
    }
    if ($("deflnDesc_" + currInd)) {
        navObj.currSeqID = $("deflnDesc_" + currInd).getAttribute("seqFSTA");        
    }
}


function initNextAlnLink(navObj, next) {

    var nextLinkEl = (next) ? $("alnNxt_" + navObj.seqID) : $("alnPrv_" + navObj.seqID);
    var nextSeqid = (next) ? navObj.nextSeqID : navObj.prevSeqID;
    
    if (nextLinkEl) {
        if (nextSeqid != "") {
            var text = (next) ? "next" : "previous";
            nextLinkEl.setAttribute("title", "Go to " + text + " alignment for " + nextSeqid);
        }
        else {
            nextLinkEl.setAttribute("disabled", "disabled");
        }
    }
}
function scan(link) {
    var init = link.getAttribute("init");
    if (!init) {
        ncbi.sg.scanLinks(link);
        link.setAttribute("init","on");
    }
}

function initWidth(seqID) {
    var lineLengthElem = $("FormatForm").LINE_LENGTH;
    var lineLength = parseInt(lineLengthElem[lineLengthElem.selectedIndex].value);
    if (parseInt(lineLengthElem.getAttribute("defval")) == lineLength) return;
    
    var relWidth = (lineLength > 90) ? "12%" : "15%";
    var charWidth = (navigator.userAgent.match(/ie/i)) ? 8 : 7;
    lineLength = (lineLength + parseInt(17)) * charWidth;
    var width = lineLength + "px";
    jQuery($("alnAll_" + seqID)).find("div.dflLnk").each(function(index) {
        jQuery(this).css("width", width);
    });
    jQuery($("alnAll_" + seqID)).find("table.alnParams").each(function(index) {
        jQuery(this).css("width", width);
    });    
    jQuery($("relInf_" + seqID)).css("width", relWidth);
}


/***Init navigation code end **/
function initAlignBatch(seqID)
{
    var navObj = new Object();
    navObj.seqID = seqID;
    initNavInfo(navObj);

    initAlignDownLoad(navObj);
    initNavigation(navObj);
    ncbi.sg.scanLinks($("alnNxt_" + seqID));
    ncbi.sg.scanLinks($("alnPrv_" + seqID));
    if ($("serviceType").value == "vecscreen") {
        utils.addClass($("alnDsc_" + seqID), "hidden");
    }
    ncbi.sg.scanLinks($("alnDwnld_" + seqID));
    jQuery($("csLinks_" + seqID)).find("a").each(function(index) {
        ncbi.sg.scanLinks(this);
    });
    jQuery($("relInf_" + seqID)).find("a").each(function(index) {
        ncbi.sg.scanLinks(this);
    });
    jQuery($("rng_" + seqID)).find("a").each(function(index) {
        ncbi.sg.scanLinks(this);
    });
    jQuery($("dln_" + seqID)).find("a").each(function(index) {
        ncbi.sg.scanLinks(this);
    });
    initWidth(seqID); 
/*        
    jQuery($("alnHdr_" + seqID)).find("a").each(function(index) {
        ncbi.sg.scanLinks(this);
    });
    jQuery($("aln_" + seqID)).find("a").each(function(index) {
        ncbi.sg.scanLinks(this);
    });
*/    
}

function SaveConfigTable() {
    blastUrl = "fmtsave.cgi";
    

    var rp = new RemoteDataProvider(blastUrl);


    rp.onSuccess = function(obj) {
        //alert("success");
    };
    rp.onError = function(obj) {
        //alert("error");
    }    

    var program = getHiddenFieldVal("PROGRAM");
    var rid = getHiddenFieldVal("RID");
    var blastSpec = getHiddenFieldVal("BLAST_SPEC");
    var params = "CMD=Get&RID=" + rid + "&ViewReport=on&PROGRAM=" + program + "&SAVE_INDV_FRM_OPTION=on&CONFIG_DESCR=" + $("cfcDsSave").value;
    if(blastSpec) {
        params += "&BLAST_SPEC=" + blastSpec;
    }     
    rp.Request(params,"POST");
}

function removeRID() {
    var rid = document.getElementsByName("RID");
    for (var i = 0; i <= rid.length; i++) {
        jQuery(rid[i]).remove();        
    }
}

function initAdvancedView()
{
    if ($("dsConfig")) {
    
        var alnView = getHiddenFieldVal("ALIGNMENT_VIEW");
        if (alnView == "Pairwise" || alnView == "PairwiseWithIdentities") {
            var rid = getHiddenFieldVal("RID");        
            ReadNextSeqAligns(0, 5);            
            g_alignViewPos = $("alignView").getBoundingClientRect().top;
            utils.addEvent(window, "scroll", checkAutoAlignLoad, false);
        }
        list = $("phiPtInd");
        if (list) {
            utils.addEvent(list, "change", GetPatternLocResults, false);
        }                
        initDescConfig();
        initDescSelect();
        initDescDownLoad();
        if ($("psiInp")) {
            var nextIter = document.getElementsByName("NEXT_I");
            for (var i = 0; i < nextIter.length; i++) {
                utils.addEvent(nextIter[i], "click", removeRID, false);
            }
        }
    }
}

//takes care of jQuery calls to elements that have dots in id like id= "SRA34456.3.4"
function initjQry() 
{
    var oldCreate = jQuery.ui.ncbipopper.prototype._create;
    jQuery.ui.ncbipopper.prototype._create = function() {
        var destSelector = this.options.destSelector || this.options.sourceSelector || this.element.prop("hash");
        this.options.destSelector = destSelector.replace(/\./g, "\\.");
        oldCreate.apply(this, arguments);
    }
}
utils.addEvent(window,
				"load", initAdvancedView,
				false);

initjQry()

/* If user agent has "safari" in it, include safari-specific stylesheet. */
if (navigator.userAgent.match(/ie/i)) {
    document.write("<link rel='stylesheet' type='text/css' href='css/ie-descriptions.css'  media='screen'/>");
}
/*****************************new code end*********************************************************************/