comparison NCBI Blast reference example_files/formatRes.js @ 31:344cd76f6fd2

rename NCBI reference example
author Jan Kanis <jan.code@jankanis.nl>
date Thu, 15 May 2014 16:59:18 +0200
parents Blast output page example_files/formatRes.js@bad241dc701f
children
comparison
equal deleted inserted replaced
30:2143f62809d0 31:344cd76f6fd2
1 // JScript source code
2 /*************************new code begin *******************************************************/
3
4 function getHiddenFieldVal(elemName) {
5 var val;
6 var elem = document.getElementsByName(elemName);
7 if (elem) {
8 val = (elem.length > 1) ? elem[0].value : elem.value;
9 }
10 return val;
11 }
12
13 function getHiddenFieldParamString(elemName) {
14 var ret = "";
15 var val = getHiddenFieldVal(elemName);
16 if (val) {
17 ret = "&" + elemName + "=" + val;
18 }
19 return ret;
20 }
21
22 function elementInViewport(el) {
23 if (!el) return;
24 var rect = el.getBoundingClientRect();
25
26 var myWidth = 0, myHeight = 0;
27 if (typeof (window.innerWidth) == 'number') {
28 //Non-IE
29 myWidth = window.innerWidth;
30 myHeight = window.innerHeight;
31 } else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
32 //IE 6+ in 'standards compliant mode'
33 myWidth = document.documentElement.clientWidth;
34 myHeight = document.documentElement.clientHeight;
35 } else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
36 //IE 4 compatible
37 myWidth = document.body.clientWidth;
38 myHeight = document.body.clientHeight;
39 }
40 //window.alert('Width = ' + myWidth);
41 //window.alert('Height = ' + myHeight);
42
43
44 //return (rect.top >= 0 && rect.left >= 0 && rect.bottom <= window.innerHeight && rect.right <= window.innerWidth)
45 //return (rect.top >= 0 && rect.left >= 0 && rect.bottom <= myHeight && rect.right <= myWidth)
46 return (rect.top >= 0 && rect.bottom <= myHeight);
47 }
48
49 function DisplayAlignFromDescription(elem) {
50 var alignView = $("FormatForm").ALIGNMENT_VIEW;
51 if (alignView[alignView.selectedIndex].value == "Pairwise" || alignView[alignView.selectedIndex].value == "PairwiseWithIdentities") {
52 DisplayDynamicAlign(elem);
53 }
54 else {
55 location.href = "#" + elem.getAttribute("seqID");
56 }
57 }
58
59 //<a class="deflnDesc" hsp=<hsp_num> ind="<index>" gi="<gi>" id="deflnDesc_gi" href="#AlnHdrgi">desc</a>
60 //<div class="alnHdr" gi="<gi>" id="alnHdr_<index>">
61 function DisplayDynamicAlign(elem) {
62 var currGi = elem.getAttribute("gi");
63 var currInd = elem.getAttribute("ind");
64 var stat = elem.getAttribute("stat");
65 if (!currInd || !currGi) return;
66
67 if (!stat || stat == "") {
68 //Get 4(5) aligns before currInd and 4(5) aligns after
69 ReadCurrentSeqAligns(currInd, 5);
70 }
71 else if (stat == "read") {
72 var indexes = getCurrIndexRange(currInd);
73 if (indexes) {
74 var msgID = "alnShow_" + indexes[0];
75 location.href = "#" + msgID;
76 }
77 }
78 else {
79 //error status handling
80 }
81 }
82
83
84 function goToNextAlign(dtrID, next) {
85 var currInd = parseInt($(dtrID).getAttribute("ind"));
86 var rid = $("Rid").value;
87 nextInd = (next) ? currInd + 1 : currInd - 1;
88
89 if ($("deflnDesc_" + nextInd)) {
90 currGi = $("deflnDesc_" + nextInd).getAttribute("seqID");
91 scrollToGI = currGi;
92 if (!$("deflnDesc_" + nextInd).getAttribute("stat") || $("deflnDesc_" + nextInd).getAttribute("stat") == "") {
93
94 if (!next) {
95 ReadPrevSeqAligns(currInd, 5, scrollToGI);
96 }
97 else {
98 //Use this indexes = wasAlignRead(nextInd); to determine insertAfterID in ReadNextAligns!!!
99 ReadNextSeqAligns(currInd, 5, scrollToGI);
100 }
101
102 }
103 else {
104 location.href = "#" + scrollToGI;
105 }
106 }
107 }
108
109 function goToDefLine(dtrID) {
110 if ($("psiInp")) {
111 var tbl = jQuery($(dtrID)).parents(".jig-ncbigrid"); //parent table
112 togglerID = PsiBelowThresh(tbl[0].id) ? "showDescB1" : "showDescG1";
113 jQuery($(togglerID)).ncbitoggler("open");
114 }
115 }
116
117 /*
118 readAln.rid = rid;
119 readAln.startIndex = parseInt(currInd);
120 readAln.numSeq = parseInt(maxNumAligns);
121
122 readAln.insertAfterID = insertAfterID;
123 readAln.seqList = giList;
124 readAln.scrollToSeqID = scrollToGI;
125 */
126 function ReadNextSeqAligns(currInd, maxNumAligns, scrollToGI) {
127 var lastDispIdx = 0;
128 var rid = $("Rid").value;
129
130 var readAln = new Object();
131 readAln.seqList = ""; //giList
132 readAln.rid = rid;
133
134 currInd = parseInt(currInd);
135
136 if (currInd != 0 && $("deflnDesc_" + currInd)) {
137 var par = utils.getParent($("aln_" + $("deflnDesc_" + currInd).getAttribute("seqID"))); //"alnShowReal_<ind>
138 //alert(par.id);
139 if (par) par = utils.getParent(par); //"alnShow_<ind>
140 //alert(par.id);
141 if (par) readAln.insertAfterID = par.id;
142 }
143 else {
144 readAln.insertAfterID = "alnStart";
145 }
146
147
148
149 readAln.startIndex = currInd + 1;
150 readAln.numSeq = maxNumAligns;
151
152 checkIfAlnExceedsThreshold(readAln, currInd, maxNumAligns, "next");
153
154 readAln.scrollToSeqID = (scrollToGI && scrollToGI != "") ? scrollToGI : "";
155 readAln.hspSort = 0;
156 ReadSeqAlignByIndex(readAln);
157 }
158
159 function ReadPrevSeqAligns(currInd, maxNumAligns, scrollToGI) {
160 var lastDispIdx = 0;
161 var rid = $("Rid").value;
162
163 var readAln = new Object();
164 readAln.seqList = ""; //giList
165 readAln.rid = rid;
166
167 currInd = parseInt(currInd);
168
169
170 //sets readAln.insertAfterID and returns lastDispIdx;
171 //Find the index of the previously displayed alignment
172 lastDispIdx = getPrevDisplyedAlignInfo(currInd, readAln);
173
174 readAln.startIndex = (currInd - lastDispIdx > maxNumAligns) ? (currInd - maxNumAligns) : lastDispIdx + 1;
175 readAln.numSeq = currInd - readAln.startIndex; //stopIndex = currInd
176
177 checkIfAlnExceedsThreshold(readAln, currInd, readAln.numSeq, "prev");
178
179 readAln.scrollToSeqID = (scrollToGI && scrollToGI != "") ? scrollToGI : $("deflnDesc_" + (currInd)).getAttribute("seqID");
180 readAln.hspSort = 0;
181 ReadSeqAlignByIndex(readAln);
182 }
183
184 //When descriptions is clicked - display maxNumAligns before currInd and maxNumAligns after currInd
185 function ReadCurrentSeqAligns(currInd, maxNumAligns) {
186 var rid = $("Rid").value;
187 var readAln = new Object();
188 readAln.seqList = ""; //giList
189 readAln.rid = rid;
190
191 currInd = parseInt(currInd);
192
193
194 //sets readAln.insertAfterID and returns lastDispIdx;
195 //Find the index of the previously displayed alignment
196 var lastDispIdx = getPrevDisplyedAlignInfo(currInd, readAln);
197
198 //lastDispIdx = parseInt(lastDispIdx);
199 readAln.startIndex = (currInd - lastDispIdx > maxNumAligns) ? (currInd - maxNumAligns) : lastDispIdx + 1;
200 readAln.numSeq = parseInt(maxNumAligns * 2);
201
202 checkIfAlnExceedsThreshold(readAln, currInd, maxNumAligns, "curr");
203
204 readAln.scrollToSeqID = $("deflnDesc_" + currInd).getAttribute("seqID");
205 readAln.hspSort = 0;
206 ReadSeqAlignByIndex(readAln);
207 g_DisableAutoCheck = true;
208 location.href = "#alnShow_" + readAln.startIndex;
209 }
210
211
212
213
214 function setupDynHSPParams(readAln)
215 {
216 var currSeqInd = readAln.startIndex;
217 hspNum = parseInt($("deflnDesc_" + currSeqInd).getAttribute("hsp"));
218 alnLen = parseInt($("deflnDesc_" + currSeqInd).getAttribute("len"));
219 var maxDispLen = parseInt($("maxDispAlnLen").value);//20000
220 var minDispLen = parseInt($("minDispAlnLen").value);//2000
221 if (alnLen > maxDispLen) {
222 var lenPerMatch = alnLen / hspNum;
223 readAln.AlignDbPageSize = (lenPerMatch > minDispLen) ? 1 : Math.floor(minDispLen / lenPerMatch);
224 readAln.AlignDbPageNum = 0;
225 $("deflnDesc_" + currSeqInd).setAttribute("dynHsps", readAln.AlignDbPageSize);
226 }
227 }
228
229
230
231 function getCurrSeqsAlnLen(currSeqInd)
232 {
233 var alnLen = 0;
234 if ($("deflnDesc_" + currSeqInd) && (!$("deflnDesc_" + currSeqInd).getAttribute("stat") || $("deflnDesc_" + currSeqInd).getAttribute("stat") == "")) {
235 alnLen = $("deflnDesc_" + currSeqInd).getAttribute("len");
236 }
237 alnLen = (alnLen) ? parseInt(alnLen) : 0;
238 return alnLen;
239 }
240
241 function checkTotalAlignLen(startIndex,stopIndex)
242 {
243 var dispAlnLen = 0;
244 var maxDispLen = parseInt($("maxDispAlnLen").value);
245 for (var i = startIndex; i <= stopIndex; i++) {
246 alnLen = getCurrSeqsAlnLen(i);
247 if (alnLen == 0) break;
248 dispAlnLen += alnLen;
249 }
250 return dispAlnLen;
251 }
252 //Get total align length for seq currSeqInd and
253 //"curr" surrounding countSeqs seqs + current, "prev" - previous countSeqs seqs, "next" - next countSeqs seqs
254 function getTotalAlignLen(readAln, currSeqInd, countSeqs, dispType)
255 {
256 var startIndex = readAln.startIndex;
257 var stopIndex = readAln.startIndex + readAln.numSeq - 1;
258 if (dispType == "curr") {//checks countSeqs before and countSeqs after current, including current
259 startIndex = Math.max(startIndex, currSeqInd - countSeqs);
260 stopIndex = Math.min(stopIndex, currSeqInd + countSeqs);
261 }
262 else if(dispType == "prev") {
263 startIndex = Math.max(startIndex, currSeqInd - 1 - countSeqs);
264 stopIndex = currSeqInd - 1;
265 }
266 else {//next
267 stopIndex = Math.min(stopIndex, currSeqInd + countSeqs + 1);
268 }
269 var totAlnLen = checkTotalAlignLen(startIndex,stopIndex);
270 return totAlnLen;
271 }
272
273 function checkIfAlnExceedsThreshold(readAln,currSeqInd,maxNumAligns, dispType)
274 {
275 var maxDispLen = parseInt($("maxDispAlnLen").value);
276 var totAlnLen = 0;
277 var exc = false;
278 for (var numSeq = 0; numSeq <= maxNumAligns; numSeq++) {
279 totAlnLen = getTotalAlignLen(readAln, currSeqInd, numSeq, dispType);
280 if(totAlnLen > maxDispLen) {
281 break;
282 }
283 }
284 if (totAlnLen > maxDispLen) {
285 if (numSeq != 0) numSeq--;
286 if (dispType == "curr") {
287 readAln.startIndex = Math.max(readAln.startIndex, currSeqInd - numSeq);
288 //prev + 1(curr) + next
289 readAln.numSeq = (currSeqInd - readAln.startIndex) + 1 + numSeq;
290 }
291 else if (dispType == "prev") {
292 readAln.startIndex = Math.max(readAln.startIndex, currSeqInd - 1 - numSeq);
293 readAln.numSeq = numSeq + 1;
294 }
295 else { //"next" - readAln.startIndex stays
296 readAln.numSeq = numSeq + 1;
297 }
298
299 if (readAln.numSeq == 1 && $("useAlignDB") && $("useAlignDB").value == "true") {
300 setupDynHSPParams(readAln);
301 }
302
303 exc = true;
304 }
305 return exc;
306 }
307
308
309 //readAln.startIndex, readAln.numSeq, readAln.scrollToSeqID,readAln.insertAfterID should be set
310 function ReadSeqAlignByIndex(readAln) {
311 var numAligns = 0;
312 for (var i = readAln.startIndex; i < readAln.startIndex + readAln.numSeq; i++) {
313
314 if (!$("deflnDesc_" + i)) {
315 break;
316 }
317 if (!$("deflnDesc_" + i).getAttribute("stat") || $("deflnDesc_" + i).getAttribute("stat") == "") {
318 currGi = $("deflnDesc_" + i).getAttribute("seqFSTA");
319 if (readAln.seqList != "") readAln.seqList += ",";
320 readAln.seqList += currGi;
321 numAligns++;
322 }
323 else {
324 break;
325 }
326 }
327 if (readAln.seqList != "") {
328 readAln.numSeq = parseInt(numAligns);
329 ReadSeqAlignForSeqList(readAln);
330 }
331 }
332
333
334 var g_DisplayeAlignsRanges = ""; //String in the format start1-stop1,start2-stop2...
335 //Find the range of indexes of displayed alignments for currAlnInd
336 //Returns array of 2 startIndex, stopIndex
337 function getCurrIndexRange(currAlinInd) {
338 var currRange;
339 var ranges = g_DisplayeAlignsRanges.split(",");
340 for (var i = 0; i < ranges.length; i++) {
341 var indexes = ranges[i].split("-");
342 if (currAlinInd >= parseInt(indexes[0]) && currAlinInd <= parseInt(indexes[1])) {
343 currRange = indexes;
344 break;
345 }
346 }
347 return currRange;
348 }
349
350
351 //Find the index of the previous displayed alignment
352 function getPrevDisplyedAlignInfo(currInd, readAln) {
353 readAln.insertAfterID = "alnStart";
354 lastDispIdx = 0;
355 for (var i = currInd - 1; i >= 1; i--) {
356 indexes = getCurrIndexRange(i);
357 if (indexes) {
358 lastDispIdx = indexes[1];
359 readAln.insertAfterID = "alnShow_" + indexes[0];
360 break;
361 }
362 }
363 return parseInt(lastDispIdx);
364 }
365
366
367 //setReadStatus
368 function setSeqAlnReadStatus(readAln, status) {
369 for (var i = readAln.startIndex; i < readAln.startIndex + readAln.numSeq; i++) {
370 if ($("deflnDesc_" + i)) {
371 jQuery($($("deflnDesc_" + i))).attr("stat", status);
372 if (status == "disp") {
373 g_MaxDisplayedIndex = (i > g_MaxDisplayedIndex) ? i : g_MaxDisplayedIndex;
374 }
375 }
376 }
377 }
378
379 /*
380 readAln.rid = rid;
381 readAln.seqList = giList;
382 readAln.startIndex = parseInt(idx);
383 readAln.insertAfterID = insertAfterID;
384 readAln.numSeq = parseInt(numSeq);
385 readAln.scrollToSeqID = scrollToGI;
386 */
387 function SendReadSeqAlinRequest(readAln) {
388 blastUrl = "t2g.cgi";
389
390 var rp = new RemoteDataProvider(blastUrl);
391
392
393 rp.onSuccess = function(obj) {
394 if ($("alignView")) utils.removeClass($("alignView"), "hidden");
395
396 if ($("alnShow_" + readAln.startIndex)) {
397 var moreHspsLink = getNextHspsLink(readAln);
398 jQuery($($("alnShowReal_" + readAln.startIndex))).html(obj.responseText + moreHspsLink, {
399 'widgets': ['ncbipopper', 'ncbitoggler'],
400 'configs': {
401 'ncbipopper': { hasArrow: true, arrowDirection: 'top' }
402 }
403 });
404 setSeqAlnReadStatus(readAln, "disp");
405 jQuery($("alnMsg_" + readAln.startIndex)).addClass("hidden");
406 //Saves start and stop indexes of loaded alignments in global variables
407 saveIdxesForAutomaticLoad(readAln);
408 jQuery($($("alnShowReal_" + readAln.startIndex))).find(".alnHdr").each(function(index) {
409 var seqID = this.getAttribute("seqID");
410 if(seqID) initAlignBatch(seqID);
411 });
412
413 }
414
415 if (readAln.scrollToSeqID) {
416 location.href = "#" + readAln.scrollToSeqID;
417 }
418
419 };
420 rp.onError = function(obj) {
421 if ($("alignView")) utils.removeClass($("alignView"), "hidden");
422 jQuery($("alnMsg_" + readAln.startIndex)).addClass("hidden");
423 $("alnShowReal_" + readAln.startIndex).innerHTML = "<div class=\"erm\" id=\"erm_" + readAln.startIndex + "\">Error loading alignment ...<span class=\"db\">requests:" + this.iActiveRequests + " status:" + obj.status +
424 "</span><a class=\"gbd\" href=\"#\" onclick=\"ReSubmitReadSeqAligns(event," + readAln.startIndex + ")\">Try again<\a></div>";
425 }
426 var params = constructURLParams(readAln);
427 if (readAln.numSeq == 1) {
428 params += "&TOTAL_HSPS=" + $("deflnDesc_" + readAln.startIndex).getAttribute("hsp");
429 }
430 params += "&SEQ_LIST_START=" + readAln.startIndex;
431
432 var formatParams = constructFormatParams();
433 params += formatParams;
434
435 //alert(params);
436 rp.Request(params);
437 }
438
439
440 function constructURLParams(readAln) {
441 var params;
442
443 if ($("useAlignDB") && $("useAlignDB").value == "true") {
444
445 var alignDbParams = "&USE_ALIGNDB=true";
446 var batchID = document.getElementsByName("ALIGNDB_BATCH_ID");
447 if (batchID) {
448 alignDbParams += getHiddenFieldParamString("ALIGNDB_BATCH_ID");
449 alignDbParams += getHiddenFieldParamString("ALIGNDB_MASTER_ALIAS");
450 alignDbParams += getHiddenFieldParamString("ALIGNDB_CGI_HOST");
451 alignDbParams += getHiddenFieldParamString("ALIGNDB_CGI_PATH");
452 }
453 alignDbParams += "&ALIGN_SEQ_LIST=" + readAln.seqList;
454 alignDbParams += "&HSP_SORT=" + readAln.hspSort;
455
456 if (readAln.hasOwnProperty("AlignDbPageNum")) {
457 alignDbParams += "&ALIGNDB_PAGE_NUM=" + readAln.AlignDbPageNum;
458 alignDbParams += "&ALIGNDB_PAGE_SIZE=" + readAln.AlignDbPageSize;
459 alignDbParams += "&HSP_START=" + readAln.AlignDbPageSize * readAln.AlignDbPageNum;
460 }
461
462 params = "CMD=Get&RID=" + readAln.rid + "&OLD_BLAST=false&DESCRIPTIONS=0&NUM_OVERVIEW=0&DYNAMIC_FORMAT=on" + alignDbParams;
463 }
464 else {
465 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;
466 }
467 if ($("phiPtInd")) {
468 params += "&PHI_PTTRN_INDEX=" + $("phiPtInd")[$("phiPtInd").selectedIndex].value;
469 }
470 return params;
471 }
472
473 /*
474 readAln.rid = rid;
475 readAln.seqList = giList;
476 readAln.startIndex = parseInt(idx);
477 readAln.insertAfterID = insertAfterID;
478 readAln.numSeq = parseInt(numSeq);
479 readAln.scrollToSeqID = scrollToGI;
480 */
481 /*1. Draw div with id="alnShow_index" class ="alnMsg" with the message listing gis nad indexes
482 2. Insert another div with id="alnShowReal_index and class="alnMsgR"
483 3. For "alnShow_index" set atrr indexes="startInd-stopInd"
484 4. Set global g_MaxReadMessageIndex - max index of displayed seqalign ??? - check this
485 5. Add string "startInd-stopInd" to g_DisplayeAlignsRanges - comma separated indexes
486 6. Send read request
487 */
488
489 function ReadSeqAlignForSeqList(readAln) {
490 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;
491 var stopIndex = readAln.startIndex + readAln.numSeq - 1;
492 var useAlignDB = ($("useAlignDB") && $("useAlignDB").value == "true") ? "AlignDB=on " : "";
493 text += " " + useAlignDB + "Reading indexes " + readAln.startIndex + "-" + stopIndex + "</span></div>";
494 text += "<div id=\"alnShowReal_" + readAln.startIndex + "\" class=\"alnMsgR\"></div></div>";
495 var debugControl = "<div id=\"debug\"></div>";
496 if (!$("debug")) {
497 jQuery($($("descriptions"))).before(debugControl);
498 }
499 if (!$("alnShow_" + readAln.startIndex)) {
500 jQuery($($(readAln.insertAfterID))).after(text);
501 jQuery($($("alnShow_" + readAln.startIndex))).attr("indexes", readAln.startIndex + "-" + stopIndex);
502 jQuery($($("alnShow_" + readAln.startIndex))).attr("seqlist", readAln.seqList);
503 g_MaxReadMessageIndex = (readAln.startIndex > g_MaxReadMessageIndex) ? readAln.startIndex : g_MaxReadMessageIndex;
504 setSeqAlnReadStatus(readAln, "read");
505 $("debug").innerHTML += ", " + useAlignDB + "Reading indexes " + readAln.startIndex + "-" + stopIndex;
506
507 if (g_DisplayeAlignsRanges != "") g_DisplayeAlignsRanges += ",";
508 g_DisplayeAlignsRanges += readAln.startIndex + "-" + stopIndex;
509
510 SendReadSeqAlinRequest(readAln);
511 }
512 else if ($("alnShowReal_" + readAln.startIndex).innerHTML.indexOf("Error") != -1) {
513 jQuery($("alnMsg_" + readAln.startIndex)).removeClass("hidden");
514 jQuery($("erm_" + readAln.startIndex)).remove();
515 SendReadSeqAlinRequest(readAln);
516 }
517 }
518
519
520 function ReSubmitReadSeqAligns(e,currInd) {
521 var rid = $("Rid").value;
522 if ($("alnShow_" + currInd)) {
523 var indexRange = jQuery($("alnShow_" + currInd)).attr("indexes");
524 var range = indexRange.split("-");
525
526
527 var readAln = new Object();
528 readAln.seqList = ""; //giList
529 readAln.rid = rid;
530 readAln.seqList = jQuery($("alnShow_" + currInd)).attr("seqlist");
531 readAln.startIndex = parseInt(range[0]);
532 readAln.numSeq = parseInt(range[1]) - parseInt(range[0]) + 1;
533 readAln.hspSort = 0;
534 ReadSeqAlignForSeqList(readAln);
535 utils.preventDefault(e);
536 }
537 }
538
539
540 var g_MaxReadMessageIndex = 0; //alnShow_idx with the message, deflnDesc_idx with stat="read"
541 var g_MaxDisplayedIndex = 0; //deflnDesc_idx with stat="disp" - last one in the set of N
542 var g_DisableAutoCheck = false;
543
544 var g_autoStartIdx = new Array();
545 var g_autoStopIdx = new Array();
546
547 function saveIdxesForAutomaticLoad(readAln) {
548 var stopIndex = readAln.startIndex + readAln.numSeq - 1;
549 g_autoStartIdx.push(readAln.startIndex); //1,20,25
550 g_autoStopIdx.push(stopIndex); //4,24,29
551 $("debug").innerHTML += ", displaying indexes " + readAln.startIndex + "-" + stopIndex;
552 }
553
554 function getNextHspsLink(readAln)
555 {
556 var moreHspsLink = ""
557 if (readAln.hasOwnProperty("AlignDbPageNum")) {
558 var nextPageNum = readAln.AlignDbPageNum + 1;
559 var currHspInd = readAln.AlignDbPageSize * nextPageNum;
560 var argstring = readAln.startIndex + "," + currHspInd;
561 var currGi = $("deflnDesc_" + readAln.startIndex).getAttribute("seqId");
562 var accs = $("deflnDesc_" + readAln.startIndex).getAttribute("accs");
563 var totalHsps = $("deflnDesc_" + readAln.startIndex).getAttribute("hsp");
564 var prevHspInd = readAln.AlignDbPageSize * nextPageNum;
565 var segs = (prevHspInd + 1) + "-" + (prevHspInd + readAln.AlignDbPageSize);
566 var moreHspsID = "nxHsp" + currGi + "_" + (prevHspInd + 1);
567
568 moreHspsLink = $("dynHspTmpl").innerHTML.replace("@moreHspsID@", moreHspsID);
569 moreHspsLink = moreHspsLink.replace(/@accs@/g, accs);
570 moreHspsLink = moreHspsLink.replace("@argstring@", argstring);
571 moreHspsLink = moreHspsLink.replace(/@segs@/g, segs);
572 moreHspsLink = moreHspsLink.replace("@totalHSP@", totalHsps);
573 moreHspsLink = moreHspsLink.replace(/@alignDbPageSize@/g, readAln.AlignDbPageSize);
574 moreHspsLink = moreHspsLink.replace("@aln_prev_num@", prevHspInd);
575 moreHspsLink = moreHspsLink.replace("@alnSeqGi@", currGi);
576 }
577 return moreHspsLink;
578 }
579
580
581 function ReadNextHSPSet(currSeqInd, currHSPNum) {
582 var readAln = new Object();
583
584 readAln.rid = $("Rid").value;
585 readAln.seqList = $("deflnDesc_" + currSeqInd).getAttribute("seqFSTA");
586 readAln.gi = $("deflnDesc_" + currSeqInd).getAttribute("seqId");
587 dynHsps = $("deflnDesc_" + currSeqInd).getAttribute("dynHsps");
588 readAln.startIndex = currSeqInd;
589 readAln.numSeq = 1;
590 if (dynHsps) {
591 readAln.AlignDbPageNum = parseInt(currHSPNum) / parseInt(dynHsps);
592 readAln.AlignDbPageSize = parseInt(dynHsps); //number of HSps to retrieve
593 }
594 if (currHSPNum != 0) {
595 readAln.scrollToSeqID = "hsp" + +readAln.gi + "_" + (parseInt(currHSPNum) + 1);
596 readAln.insertAfterID = "ar_" + readAln.gi + "_" + currHSPNum;
597 }
598 var sortLink = $("sa_" + readAln.gi);
599 readAln.hspSort = (sortLink) ? parseInt(sortLink[sortLink.selectedIndex].value) : 0;
600 SendReadSeqAlinSortHSPRequest(readAln);
601 }
602
603 function ReadNextHSPSetEvt(e, currSeqInd, currHSPNum) {
604 ReadNextHSPSet(currSeqInd, currHSPNum);
605 utils.preventDefault(e);
606 }
607
608
609
610 function checkAutoAlignArray() {
611 var stop = false;
612 var start = false;
613 var currAlignViewPos = $("alignView").getBoundingClientRect().top;
614 if (currAlignViewPos < g_alignViewPos) {//scrolling down
615 g_alignViewPos = currAlignViewPos;
616 if (g_DisableAutoCheck) {
617 g_DisableAutoCheck = false;
618 return;
619 }
620 for (i = 0; i < g_autoStopIdx.length; i++) {
621 if (elementInViewport($("alnHdr_" + $("deflnDesc_" + g_autoStopIdx[i]).getAttribute("seqID")))) {
622 //alert("Reading more aligns scrolling down!");
623 var nextInd = parseInt(g_autoStopIdx[i] + 1);
624 var currInd = g_autoStopIdx[i];
625 if ($("deflnDesc_" + nextInd) && (!$("deflnDesc_" + nextInd).getAttribute("stat") || $("deflnDesc_" + nextInd).getAttribute("stat") == "")) {
626 ReadNextSeqAligns(currInd, 5);
627 stop = true;
628 break;
629 }
630 }
631 }
632 if (stop) g_autoStopIdx.splice(i, 1); //delete index from the array
633 }
634 else if (currAlignViewPos > g_alignViewPos) {//scrolling up
635 g_alignViewPos = currAlignViewPos;
636 //here maybe return if autoStop found!!!
637 /* commenting automic read when scroll up */
638 for (i = 0; i < g_autoStartIdx.length; i++) {
639 if (elementInViewport($("alnHdr_" + $("deflnDesc_" + g_autoStartIdx[i]).getAttribute("seqID")))) {
640 //alert("Reading more aligns scrolling up!");
641 var currInd = g_autoStartIdx[i];
642 //Check for condition here if go there at all!!! Check if do the same thing as for ReadNext!!!!
643 if (currInd > 1) {
644 ReadPrevSeqAligns(currInd, 5);
645 start = true;
646 break;
647 }
648 }
649 }
650 if (start) g_autoStartIdx.splice(i, 1);
651 }
652 /*end of comment*/
653 }
654
655 var g_alignViewPos = 0;
656
657 function checkAutoAlignLoad() {
658
659
660 checkAutoAlignArray();
661
662 if (jQuery($($(window))).scrollTop() + jQuery($($(window))).height() >= jQuery($($(document))).height() - 100) {
663 //alert("bottom!");
664
665 if ($("alnShowReal_" + g_MaxReadMessageIndex) && $("alnShowReal_" + g_MaxReadMessageIndex).innerHTML != "") {
666 //if(!$("alnShow_" + maxReadMessageIndex)) {//g_MaxReadMessageIndex
667 ReadNextSeqAligns(g_MaxDisplayedIndex, 5);
668 }
669 }
670 }
671
672
673 function GetPatternLocResults()
674 {
675 form = $("results");
676 if (!form.PHI_PTTRN_INDEX) {
677 var el = document.createElement("input");
678 el.name = "PHI_PTTRN_INDEX";
679 el.value = $("phiPtInd")[$("phiPtInd").selectedIndex].value;
680 form.appendChild(el);
681 }
682 else {
683 form.PHI_PTTRN_INDEX.value = $("phiPtInd")[$("phiPtInd").selectedIndex].value;
684 }
685 form.submit();
686 }
687
688 function goToNextHSP(elem, next) {
689 var par = jQuery(elem).parent(); //parent span with class="alnParLinks"
690 var parts = par[0].id.split("_"); //"hsp<seqid>_hspnum "hsp207524544_2"
691 if (parts[0].indexOf("nxHsp") != -1) {
692 parts[0] = parts[0].replace("nxHsp", "hsp");
693 }
694 nextID = (next) ? parts[0] + "_" + (parseInt(parts[1]) + 1) : parts[0] + "_" + (parseInt(parts[1]) - 1)
695
696 gotoElem = jQuery($(nextID));
697 if (gotoElem[0]) {
698 a = jQuery(gotoElem).offset();
699 window.scroll(0, a.top);
700 }
701
702 else {
703 retrieveNextHSP(parts[0],parts[1]);
704 }
705
706 }
707
708
709 //parts[0]//hsp<seqid>, parts[1] hspnum
710 function retrieveNextHSP(currLinkID, currHSPNum)
711 {
712 var desLineID = currLinkID.replace("hsp", "dtr_"); //tr id
713 var currSeqInd, totalHsps;
714 jQuery($($(desLineID))).find(".deflnDesc").each(function(index) {
715 currSeqInd = parseInt(this.getAttribute("ind"));
716 totalHsps = parseInt(this.getAttribute("hsp"));
717 dynHsps = this.getAttribute("dynHsps");
718 });
719 currHSPNum = parseInt(currHSPNum);
720 if (currHSPNum < totalHsps && dynHsps) {
721 ReadNextHSPSet(currSeqInd, currHSPNum);
722 }
723 }
724 /********Adding those functions back to formatRes.js to identify Uncaught ReferenceError: getUrlCompForCheckedField is not defined error********************************/
725 function getUrlCompForEntryField(elem) {
726 var url = "";
727 if (elem && elem.value != "") {
728 url = "&" + elem.name + "=" + escape(elem.value);
729 }
730 return url;
731 }
732
733
734 function getUrlCompForCheckedField(elem) {
735 var url = "";
736 if (elem && elem.checked) {
737 url = "&" + elem.name + "=" + elem.value;
738 }
739 return url;
740
741 }
742
743 function getUrlCompForOptionsField(elem) {
744 var url = "";
745 if (elem) {
746 url = "&" + elem.name + "=" + elem[elem.selectedIndex].value;
747 }
748 return url;
749 }
750 /****************************************/
751
752 function constructFormatParams() {
753 var formatParams = "";
754
755 if ($("queryList")) {
756 formatParams += "&QUERY_INDEX=" + $("queryList")[$("queryList").selectedIndex].value;
757 }
758
759
760 formatParams += getUrlCompForCheckedField($("FormatForm").SHOW_LINKOUT);
761 formatParams += getUrlCompForCheckedField($("FormatForm").SHOW_CDS_FEATURE);
762 formatParams += getUrlCompForCheckedField($("FormatForm").NCBI_GI);
763 formatParams += getUrlCompForOptionsField($("FormatForm").ALIGNMENT_VIEW);
764 formatParams += getUrlCompForOptionsField($("FormatForm").MASK_CHAR);
765 formatParams += getUrlCompForOptionsField($("FormatForm").MASK_COLOR);
766 formatParams += getUrlCompForEntryField($("FormatForm").EXPECT_LOW);
767 formatParams += getUrlCompForEntryField($("FormatForm").EXPECT_HIGH);
768 formatParams += getUrlCompForEntryField($("FormatForm").PERC_IDENT_LOW);
769 formatParams += getUrlCompForEntryField($("FormatForm").PERC_IDENT_HIGH);
770 formatParams += getUrlCompForEntryField($("FormatForm").LINE_LENGTH);
771
772
773 formatParams += getHiddenFieldParamString("BUILD_NAME");
774
775 var serviceType = "";
776 if ($("serviceType").value == "sra") {
777 serviceType = "sra";
778 }
779 else if ($("clientType").value == "TMSmart_restricted") {
780 serviceType = "restricted";
781 }
782 if (serviceType != "") {
783 formatParams += "&BOBJSRVC=" + serviceType;
784 }
785 if ($("currQuery").value != "") {
786 formatParams += "&CURR_QUERY_ID=" + $("currQuery").value;
787 }
788
789 return formatParams;
790 }
791
792 //readAln.seqList contains one gi only for this
793 function SendReadSeqAlinSortHSPRequest(readAln) {
794 blastUrl = "t2g.cgi";
795 var rp = new RemoteDataProvider(blastUrl);
796
797
798 rp.onSuccess = function(obj) {
799 var moreHspsLink = (readAln.hasOwnProperty("AlignDbPageNum")) ? getNextHspsLink(readAln) : "";
800 var alnHtml = obj.responseText + moreHspsLink;
801 initHSPRequest(readAln, obj.responseText + moreHspsLink,false);
802 if (readAln.scrollToSeqID) {
803 location.href = "#" + readAln.scrollToSeqID;
804 }
805 };
806 rp.onError = function(obj) {
807 var currHspInd = (readAln.hasOwnProperty("AlignDbPageNum")) ? readAln.AlignDbPageSize * readAln.AlignDbPageNum : 0;
808 var msgID = "erm_" + readAln.gi + "_" + (currHspInd + 1);
809 if (!$(msgID)) {
810 var msg = "<div class=\"erm\" att=\"1\" id=\"" + msgID + "\">Error loading alignment ...<span class=\"db\">status:" + obj.status +
811 "</span><a class=\"gbd\" href=\"#\" onclick=\"ReadNextHSPSetEvt(event," + readAln.startIndex + "," + currHspInd +
812 ")\">Try again <span class=\"attmt\"></span> <\a></div>";
813 initHSPRequest(readAln, msg, true);
814 }
815 else {
816 var attNum = parseInt($(msgID).getAttribute("att")) + 1;
817 $(msgID).setAttribute("att", attNum);
818 jQuery($(msgID)).find(".attmt").each(function(index) {
819 jQuery(this).html(", attempt " + attNum);
820 });
821 }
822 }
823
824 var params = constructURLParams(readAln);
825 if (readAln.AlignDbPageSize) {
826 params += "&TOTAL_HSPS=" + $("deflnDesc_" + readAln.startIndex).getAttribute("hsp");
827 }
828 params += "&SORT_ONE_ALN=on";
829 var formatParams = constructFormatParams();
830
831 params += formatParams;
832
833 //alert(params);
834 rp.Request(params);
835 }
836 function initHSPRequest(readAln, alnHtml, err) {
837 var currHspInd = (readAln.hasOwnProperty("AlignDbPageNum")) ? readAln.AlignDbPageSize * readAln.AlignDbPageNum : 0;
838 if (currHspInd != 0) {
839 readAln.insertAfterID = "ar_" + readAln.gi + "_" + currHspInd;
840 jQuery($(readAln.insertAfterID)).after(alnHtml);
841 moreHspsID = "nxHsp" + readAln.gi + "_" + (currHspInd + 1);
842 jQuery($(moreHspsID)).remove();
843 if (!err) {
844 errMsgID = "erm_" + readAln.gi + "_" + (currHspInd + 1);
845 jQuery($(errMsgID)).remove();
846 }
847 }
848 else {
849 jQuery($("alnAll_" + readAln.gi)).html(alnHtml);
850 }
851 }
852
853 function SortHSPAlnSel(e, sortLink) {//example id="sa_207524544"
854 var readAln = new Object();
855
856
857 var desLineID = sortLink.id.replace("sa", "dtr"); //tr id
858 var seqInd;
859
860 jQuery($($(desLineID))).find(".deflnDesc").each(function(index) {
861 seqInd = this.getAttribute("ind");
862 });
863
864 ReadNextHSPSet(parseInt(seqInd), 0);
865 }
866
867
868 function configDescriptions(e,btn,dlgId)
869 {
870 var suffix = PsiBelowThresh(dlgId);
871 var colmnsInfId = "cfcDsInf" + suffix;
872 var tblID = "dscTable" + suffix; //"dscTable[_psiw]"
873 var showAllColId = "shcl" + suffix;
874 var chkBoxes = $C("checkbox", "type", $(dlgId), "input");
875 if (!utils.hasClass(btn, "cnc")) $(colmnsInfId).value = "";
876 for (i = 0; i < chkBoxes.length; i++) {
877 var check;
878 if (utils.hasClass(btn, "cnc")) {//cancel
879 if ($(colmnsInfId).value.indexOf(chkBoxes[i].value) != -1 && !chkBoxes[i].checked) {
880 check = true;
881 }
882 else if ($(colmnsInfId).value.indexOf(chkBoxes[i].value) == -1 && chkBoxes[i].checked) {
883 check = false;
884 }
885 }
886 else if (utils.hasClass(btn, "rdf") && !chkBoxes[i].checked) {
887 check = true;
888 }
889 if (typeof (check) != 'undefined') {
890 chkBoxes[i].checked = check;
891 showHideCol(tblID,parseInt(chkBoxes[i].value), !check);
892 }
893 if (!utils.hasClass(btn, "cnc")) {
894 if (chkBoxes[i].checked) { //OK
895 if ($(colmnsInfId).value != "") $(colmnsInfId).value += ",";
896 $(colmnsInfId).value += chkBoxes[i].value;
897 }
898 }
899 }
900 if ($(colmnsInfId).value != $(colmnsInfId).getAttribute("defval")) {//defval = "2,3,4,5,6,7,8"
901 jQuery($(showAllColId)).removeClass("hidden");
902 }
903 else {
904 jQuery($(showAllColId)).addClass("hidden");
905 }
906
907 var chConfig = $("cfcDsSave").value != $(colmnsInfId).value;
908
909 var cfds = document.getElementsByName("CONFIG_DESCR");
910 if (cfds) {
911 for (i = 0; i < cfds.length; i++) {
912 cfds[i].value = $(colmnsInfId).value;
913 }
914 }
915 $("cfcDsSave").value = $(colmnsInfId).value;
916 if (chConfig) SaveConfigTable();
917 jQuery(document.body).click();
918 utils.preventDefault(e);
919 }
920
921
922
923 function initDescConfig()
924 {
925 initConfigColumns("dsConfig");
926 if ($("psiw") && utils.hasClass($("psiw"), "shown")) {
927 initConfigColumns("dsConfig_psiw");
928 }
929 }
930
931
932 function initConfigColumns(cnfDlgID)
933 {
934 var suffix = PsiBelowThresh(cnfDlgID);
935 //cnfDlgID is "dsConfig[_psiw]"
936 var colmnsInfId = "cfcDsInf" + suffix;
937 var tblID = "dscTable" + suffix; //"dscTable[_psiw]"
938 var showAllColId = "shcl" + suffix;
939
940 if (navigator.userAgent.match(/ie/i)) {
941 if ($("FormatForm").NCBI_GI.checked || $("serviceType").value == "sra") {
942 jQuery($(tblID)).find("th.c1").each(function(index) {
943 db = getHiddenFieldVal("DATABASE");
944 var width = (db.match(/WGS/i) || db.match(/Whole_Genome_Shotgun_contigs/i)) ? "16em" : "14em";
945 jQuery(this).css("width", width);
946 });
947 }
948 }
949
950 jQuery($(tblID)).find("tr.first").each(function(index) {
951 jQuery(this).find("a.dcs").each(function(index) {
952 jQuery(this).bind("click", function(e) { checkConfig(this); });
953 });
954 });
955
956 jQuery($(cnfDlgID)).find("button").each(function(index) {
957 jQuery(this).bind("click", function(e) { configDescriptions(e, this, cnfDlgID); });
958 });
959
960
961 jQuery($(cnfDlgID)).bind("click", function(e) { e.stopPropagation(); });
962
963 $(colmnsInfId).value = getHiddenFieldVal("CONFIG_DESCR");
964 if ($(colmnsInfId).value == "" || $(colmnsInfId).value == "undefined") {
965 $(colmnsInfId).value = $(colmnsInfId).getAttribute("defval");
966 }
967 if ($(colmnsInfId).value != $(colmnsInfId).getAttribute("defval")) {//defval = "2,3,4,5,6,7,8"
968 jQuery($(showAllColId)).removeClass("hidden");
969 }
970 else {
971 jQuery($(showAllColId)).addClass("hidden");
972 }
973 var chkBoxes = $C("checkbox", "type", $(cnfDlgID), "input")
974 for (i = 0; i < chkBoxes.length; i++) {
975 jQuery(chkBoxes[i]).bind("click", configColumn);
976 if ($(colmnsInfId).value.indexOf(chkBoxes[i].value) != -1) {
977 chkBoxes[i].checked = true;
978 }
979 else {
980 //jQuery($(tblID)).ncbigrid("hideColumn", chkBoxes[i].value);
981 showHideCol($(tblID), chkBoxes[i].value, true);
982 }
983 }
984 }
985 function showAllCol(e,elem)
986 {
987 var suffix = PsiBelowThresh(elem.id);
988 var rdf = "dscRsDf" + suffix;
989 jQuery($(rdf)).click();//click "restore defaults'
990 utils.preventDefault(e);
991 }
992
993
994 function configColumn() {
995 var suffix = PsiBelowThresh(this.id);
996 var tblID = "dscTable" + suffix; //"dscTable[_psiw]"
997
998 cCls = "c" + this.value;
999 if (this.checked) {//show
1000 showHideCol(tblID,parseInt(this.value), false);
1001 }
1002 else {
1003 showHideCol(tblID,parseInt(this.value), true);
1004 }
1005 }
1006
1007 function showHideCol(tblID, columnIndex, hide) {
1008
1009 if ($("Transcr")) {
1010 colHidden = utils.hasClass($("c" + columnIndex), "ui-ncbigrid-column-hidden");
1011 hide = hide && !colHidden;
1012 show = !hide && colHidden;
1013 }
1014 else {
1015 show = !hide;
1016 }
1017 if (hide) {
1018 jQuery($(tblID)).ncbigrid("hideColumn", columnIndex);
1019 }
1020 else if (show) {
1021 jQuery($(tblID)).ncbigrid("showColumn", columnIndex);
1022 }
1023 if ($("Transcr") && (hide || show) ) {
1024 var colsp = parseInt($("Transcr").getAttribute("colspan"));
1025 colsp = (hide) ? colsp - 1 : colsp + 1;
1026 $("Transcr").setAttribute("colSpan", colsp);
1027 if ($("GnmSeq")) $("GnmSeq").setAttribute("colSpan", colsp);
1028 }
1029 }
1030
1031 function checkConfig(lnk) {
1032 var cnfCol = "&CONFIG_DESCR=" + $("cfcDsSave").value;
1033 lnk.href = lnk.href + cnfCol + "#sort_mark";
1034 }
1035
1036 function DisplayAlignFromGraphics(seqID,e) //SeqID = gi if exists
1037 {
1038 var dflLineLinks = $C(seqID, "gi", document, "a");
1039 for (i = 0; i < dflLineLinks.length; i++) {
1040 jQuery(dflLineLinks[i]).click();
1041 break;
1042 }
1043 location.href = dflLineLinks[i].href;
1044 }
1045
1046
1047
1048 function initDescSelect()
1049 {
1050
1051 jQuery("#cntDesc").find("a").each(function(index) {
1052 jQuery(this).bind("click", configDescrSelect);
1053 });
1054 jQuery("#cntSelN").click();
1055 jQuery("#descTblCtrl").find("a[view]").each(function(index) {
1056 jQuery(this).bind("click", DisplaySelectedView);
1057 });
1058 if ($("psiw") && utils.hasClass($("psiw"), "shown")) {
1059 jQuery("#cntDesc_psiw").find("a").each(function(index) {
1060 jQuery(this).bind("click", configDescrSelect);
1061 });
1062 jQuery("#cntSelN_psiw").click();
1063 jQuery("#descTblCtrl_psiw").find("a[view]").each(function(index) {
1064 jQuery(this).bind("click", DisplaySelectedView);
1065 });
1066 }
1067
1068
1069 //jQuery("#dsConfig").bind("click", function(e) { e.stopPropagation(); });??
1070
1071 }
1072
1073 function DisplaySelectedView(e) {
1074 if (this.getAttribute("view") == "graph") { //seqviewer
1075 ViewSelectedSeqViewer(e,this);
1076 }
1077 else {
1078 if (this.getAttribute("view") == "tree") { //seqviewer
1079 $("scrWidth").value = screen.width;
1080 $("scrHeight").value = screen.height;
1081 }
1082 ViewSelectedSeqsEx(e, this);
1083 }
1084 }
1085
1086 function PsiBelowThresh(elemID)
1087 {
1088 var suffix = "";
1089 if (elemID.indexOf("_psiw") != -1) {
1090 suffix = "_psiw";
1091 }
1092 return suffix;
1093 }
1094
1095 function ViewSelectedSeqsEx(e,elem) {
1096 var sbmForm = elem.getAttribute("frm");
1097 var seqList = elem.getAttribute("seqList");
1098
1099 var cnfElem = utils.getParent(elem); //.cnf div
1100 var suffix = PsiBelowThresh(cnfElem.id);
1101 var tblID = "dscTable" + suffix;
1102
1103 $(seqList).value = createSelseqString(tblID,true);
1104 $(seqList).value = $(seqList).value.replace(/ti:/g, ""); //For traces
1105 if ($(seqList).value.indexOf("dbSNP") != -1) {
1106 $(seqList).value = $(seqList).value.replace(/dbSNP:rs/g, ""); //For snp
1107 elem.href = $(sbmForm).action + $(seqList).value;
1108 elem.target = "new";
1109 }
1110 else {
1111 $(sbmForm).submit();
1112 utils.preventDefault(e);
1113 }
1114 }
1115
1116 function ViewSelectedSeqsTree(e) {
1117 $("scrWidth").value = screen.width;
1118 $("scrHeight").value = screen.height;
1119 }
1120
1121 function initSeqViewerGet(seqList) {
1122 if (seqList.length >= 2000) {
1123 seqList = seqList.substr(0,2000);
1124 lastComma = seqList.lastIndexOf(",");
1125 seqList = seqList.substr(0,lastComma);
1126 }
1127 $("seqViewParams").name = "RID";
1128 $("seqViewParams").value = $("ridParam").value + "[" + seqList + "]";
1129 }
1130
1131 function ViewSelectedSeqViewer(e, elem)
1132 {
1133 var cnfElem = utils.getParent(elem); //.cnf div
1134 var suffix = PsiBelowThresh(cnfElem.id);
1135 var tblID = "dscTable" + suffix;
1136
1137 //change to false when new verison of seqVier is installed in production
1138 var seqList = createSelseqString(tblID, false);
1139 $("sbmtGraphics").action = $("seqViewUrl").value;
1140
1141 var rp = new RemoteDataProvider("url2nc.cgi");
1142 rp.onSuccess = function(obj) {
1143 var jsnResp = JSON.parse(obj.responseText);
1144 ncid = jsnResp.ncid;
1145
1146 if (ncid != "") {
1147 $("seqViewParams").name = "rkey";
1148 $("seqViewParams").value = ncid;
1149 }
1150 else {
1151 initSeqViewerGet(seqList);
1152 }
1153 $("sbmtGraphics").submit();
1154 };
1155 rp.onError = function(obj) {
1156 initSeqViewerGet(seqList);
1157 $("sbmtGraphics").submit();
1158 utils.preventDefault(e);
1159 }
1160 var params = $("ridParam").value + "[" + seqList + "]";
1161 rp.Request(params, "POST");
1162 utils.preventDefault(e);
1163 }
1164
1165 function configDescrSelect(e) {
1166 var sel = this.getAttribute("sel");
1167 if (sel) {
1168 var selNum = 0;
1169 var check = (sel == "all") ? true : false;
1170
1171 var suffix = PsiBelowThresh(this.id);
1172 var tblID = "dscTable" + suffix;
1173 var toolbarID = "descTblCtrl" + suffix;
1174 var selElID = "slcNum" + suffix;
1175
1176 jQuery($(tblID)).find("input[type='checkbox'].cb").each(function(index) {
1177 jQuery(this)[0].checked = check;
1178 if (check) selNum++;
1179 });
1180 enableDescrLinks(selNum, toolbarID, selElID);
1181 }
1182 utils.preventDefault(e);
1183 }
1184
1185
1186
1187 function enableDescrLinks(selNum, toolbarID, selElID) {
1188 jQuery($(toolbarID)).find("a[minSlct]").each(function(index) {
1189 var minSelected = this.getAttribute("minSlct");
1190 minSelected = parseInt(minSelected);
1191 if (selNum >= minSelected) {
1192 this.removeAttribute("disabled");
1193 }
1194 else {
1195 this.setAttribute("disabled", "disabled");
1196 }
1197 });
1198 $(selElID).innerHTML = selNum;
1199 }
1200
1201
1202
1203 function configDescrLinks(e, elem)
1204 {
1205
1206 ncbi.sg.ping(elem, "click", elem.checked ? "checked=true" : "checked=false");
1207 var par = jQuery(elem).parents(".jig-ncbigrid");//parent table
1208 if (par) {
1209 var suffix = PsiBelowThresh(par[0].id);
1210 var tblID = "dscTable" + suffix;
1211 var toolbarID = "descTblCtrl" + suffix;
1212 var selElID = "slcNum" + suffix;
1213
1214 var currSelNum = parseInt($(selElID).innerHTML);
1215 var selNum = elem.checked ? currSelNum + 1 : currSelNum - 1;
1216 enableDescrLinks(selNum, toolbarID, selElID);
1217 }
1218 }
1219 /***Download code begin****/
1220
1221 function initDownLoadPopup(dwnDialog) {
1222
1223 jQuery(dwnDialog).find("button").each(function(index) {
1224 jQuery(this).bind("click", execDownLoad);
1225 });
1226
1227 jQuery(dwnDialog).bind("click", function(e) { e.stopPropagation(); });
1228 }
1229
1230 function initDescDownLoad() {
1231 initDownLoadPopup($("dsDownload"));
1232
1233 if ($("psiw") && utils.hasClass($("psiw"), "shown")) {
1234 initDownLoadPopup($("dsDownload_psiw"));
1235 }
1236 }
1237
1238 function initAlignDownLoad(navObj)
1239 {
1240 var seqID = navObj.seqID;
1241 var dwnDialog = $("dlgDwnl_" + seqID);
1242 jQuery(dwnDialog).find("button").each(function(index) {
1243 jQuery(this).bind("click", execDownLoad);
1244 });
1245
1246 var dwnFSTW = $("dwFST_" + seqID);//whole seq
1247 var dwnFSTAl = $("dwFSTAl_" + seqID);//aligned regions
1248
1249 if(dwnFSTW) dwnFSTW.setAttribute("seqfsta", navObj.currSeqID);
1250 if(dwnFSTAl) dwnFSTAl.setAttribute("seqfsta", navObj.currSeqID);
1251
1252 jQuery(dwnDialog).bind("click", function(e) { e.stopPropagation(); });
1253 }
1254
1255
1256 function execDownLoad(e) {
1257 if (!utils.hasClass(this, "cnc")) {
1258 par = utils.getParent(this);
1259 dwnDialog = utils.getParent(par); //parent dialog with popDl class
1260 var descr = (this.id == "dw_cont" || this.id == "dw_cont_psiw") ? true : false;
1261 jQuery(dwnDialog).find("input").each(function(index) {
1262 if (this.checked) {
1263 submitDownLoad(this, descr);
1264 }
1265 });
1266 }
1267 jQuery(document.body).click();
1268 utils.preventDefault(e);
1269 }
1270
1271 function submitDownLoad(radioElem, descr) {
1272 var toolURL = radioElem.getAttribute("url");
1273 if (toolURL) {
1274 if (descr) {
1275 var getGi = radioElem.getAttribute("getGi");
1276 getGi = (getGi) ? true : false;
1277
1278 var tblID = "dscTable";
1279 var suffix = PsiBelowThresh(radioElem.id);
1280 tblID += suffix;
1281
1282 $("selDnSeqs").value = createSelseqString(tblID,getGi);
1283 }
1284 else {
1285 var seqfsta = radioElem.getAttribute("seqfsta");
1286 $("selDnSeqs").value = (seqfsta) ? seqfsta : radioElem.getAttribute("getGi");
1287 }
1288 var addParams = "";
1289 if (radioElem.getAttribute("addParam")) {
1290 addParams = addDwnlParams();
1291 }
1292 var submitName = radioElem.getAttribute("sbName")
1293 $("selDnSeqs").name = (submitName) ? submitName : "ALIGN_SEQ_LIST";
1294 $("dwdlSubmit").action = toolURL + addParams;
1295 $("dwdlSubmit").submit();
1296 }
1297 else {
1298 var sbFunction = radioElem.getAttribute("sbFunc");
1299 if (sbFunction) {
1300 eval(sbFunction + "(radioElem, descr)");
1301 }
1302 }
1303 }
1304
1305
1306 function initDownLoadFSTA(radioElem, descr)
1307 {
1308 if (descr) {
1309
1310 var tblID = "dscTable";
1311 var suffix = PsiBelowThresh(radioElem.id);
1312 tblID += suffix;
1313
1314 $("sbmtFASTA").ALIGN_SEQ_LIST.value = createSelseqString(tblID,false);
1315 }
1316 else {
1317 $("sbmtFASTA").ALIGN_SEQ_LIST.value = radioElem.getAttribute("seqfsta");
1318 }
1319 $("sbmtFASTA").DOWNLOAD_TYPE.value = radioElem.getAttribute("fstaDWType");
1320
1321 $("sbmtFASTA").DATABASE.value = getHiddenFieldVal("DATABASE");
1322 if ($("useAlignDB") && $("useAlignDB").value == "true") {//temp checkbox
1323 var batchID = document.getElementsByName("ALIGNDB_BATCH_ID");
1324 if (batchID) {
1325 $("sbmtFASTA").ALIGNDB_BATCH_ID.value = getHiddenFieldVal("ALIGNDB_BATCH_ID");
1326 $("sbmtFASTA").ALIGNDB_MASTER_ALIAS.value = getHiddenFieldVal("ALIGNDB_MASTER_ALIAS");
1327 $("sbmtFASTA").ALIGNDB_CGI_HOST.value = getHiddenFieldVal("ALIGNDB_CGI_HOST");
1328 $("sbmtFASTA").ALIGNDB_CGI_PATH.value = getHiddenFieldVal("ALIGNDB_CGI_PATH");
1329 }
1330 }
1331 $("sbmtFASTA").submit();
1332 }
1333
1334 function createSelseqString(tblID,getGi) {
1335 var selSeqs = "";
1336 jQuery($(tblID)).find("input[type='checkbox'].cb").each(function(index) {
1337 if (jQuery(this)[0].checked) {
1338 if (selSeqs != "") selSeqs += ",";
1339 if (getGi) {
1340 selSeqs += jQuery(this)[0].value;
1341 }
1342 else {
1343 var linkID = jQuery(this)[0].id.replace("chk", "deflnDesc");
1344 selSeqs += $(linkID).getAttribute("seqFSTA");
1345 }
1346 }
1347 });
1348 return selSeqs;
1349 }
1350
1351 /***Download code end****/
1352
1353 /***Init navigation code begin **/
1354
1355 function initNavigation(navObj) {
1356 initNextAlnLink(navObj, true);
1357 initNextAlnLink(navObj, false);
1358 }
1359
1360
1361 function initNavInfo(navObj) {
1362 var currInd = parseInt($("dtr_" + navObj.seqID).getAttribute("ind"));
1363 nextInd = currInd + 1;
1364 prevInd = currInd - 1;
1365
1366 navObj.currSeqID = "";
1367 navObj.nextSeqID = "";
1368 navObj.prevSeqID = "";
1369
1370 if ($("deflnDesc_" + nextInd)) {
1371 navObj.nextSeqID = $("deflnDesc_" + nextInd).getAttribute("accs");
1372 if(navObj.nextSeqID =="") navObj.nextSeqID = $("deflnDesc_" + nextInd).getAttribute("seqFSTA");
1373 }
1374 if ($("deflnDesc_" + prevInd)) {
1375 navObj.prevSeqID = $("deflnDesc_" + prevInd).getAttribute("accs");
1376 if (navObj.prevSeqID == "") navObj.prevSeqID = $("deflnDesc_" + prevInd).getAttribute("seqFSTA");
1377 }
1378 if ($("deflnDesc_" + currInd)) {
1379 navObj.currSeqID = $("deflnDesc_" + currInd).getAttribute("seqFSTA");
1380 }
1381 }
1382
1383
1384 function initNextAlnLink(navObj, next) {
1385
1386 var nextLinkEl = (next) ? $("alnNxt_" + navObj.seqID) : $("alnPrv_" + navObj.seqID);
1387 var nextSeqid = (next) ? navObj.nextSeqID : navObj.prevSeqID;
1388
1389 if (nextLinkEl) {
1390 if (nextSeqid != "") {
1391 var text = (next) ? "next" : "previous";
1392 nextLinkEl.setAttribute("title", "Go to " + text + " alignment for " + nextSeqid);
1393 }
1394 else {
1395 nextLinkEl.setAttribute("disabled", "disabled");
1396 }
1397 }
1398 }
1399 function scan(link) {
1400 var init = link.getAttribute("init");
1401 if (!init) {
1402 ncbi.sg.scanLinks(link);
1403 link.setAttribute("init","on");
1404 }
1405 }
1406
1407 function initWidth(seqID) {
1408 var lineLengthElem = $("FormatForm").LINE_LENGTH;
1409 var lineLength = parseInt(lineLengthElem[lineLengthElem.selectedIndex].value);
1410 if (parseInt(lineLengthElem.getAttribute("defval")) == lineLength) return;
1411
1412 var relWidth = (lineLength > 90) ? "12%" : "15%";
1413 var charWidth = (navigator.userAgent.match(/ie/i)) ? 8 : 7;
1414 lineLength = (lineLength + parseInt(17)) * charWidth;
1415 var width = lineLength + "px";
1416 jQuery($("alnAll_" + seqID)).find("div.dflLnk").each(function(index) {
1417 jQuery(this).css("width", width);
1418 });
1419 jQuery($("alnAll_" + seqID)).find("table.alnParams").each(function(index) {
1420 jQuery(this).css("width", width);
1421 });
1422 jQuery($("relInf_" + seqID)).css("width", relWidth);
1423 }
1424
1425
1426 /***Init navigation code end **/
1427 function initAlignBatch(seqID)
1428 {
1429 var navObj = new Object();
1430 navObj.seqID = seqID;
1431 initNavInfo(navObj);
1432
1433 initAlignDownLoad(navObj);
1434 initNavigation(navObj);
1435 ncbi.sg.scanLinks($("alnNxt_" + seqID));
1436 ncbi.sg.scanLinks($("alnPrv_" + seqID));
1437 if ($("serviceType").value == "vecscreen") {
1438 utils.addClass($("alnDsc_" + seqID), "hidden");
1439 }
1440 ncbi.sg.scanLinks($("alnDwnld_" + seqID));
1441 jQuery($("csLinks_" + seqID)).find("a").each(function(index) {
1442 ncbi.sg.scanLinks(this);
1443 });
1444 jQuery($("relInf_" + seqID)).find("a").each(function(index) {
1445 ncbi.sg.scanLinks(this);
1446 });
1447 jQuery($("rng_" + seqID)).find("a").each(function(index) {
1448 ncbi.sg.scanLinks(this);
1449 });
1450 jQuery($("dln_" + seqID)).find("a").each(function(index) {
1451 ncbi.sg.scanLinks(this);
1452 });
1453 initWidth(seqID);
1454 /*
1455 jQuery($("alnHdr_" + seqID)).find("a").each(function(index) {
1456 ncbi.sg.scanLinks(this);
1457 });
1458 jQuery($("aln_" + seqID)).find("a").each(function(index) {
1459 ncbi.sg.scanLinks(this);
1460 });
1461 */
1462 }
1463
1464 function SaveConfigTable() {
1465 blastUrl = "fmtsave.cgi";
1466
1467
1468 var rp = new RemoteDataProvider(blastUrl);
1469
1470
1471 rp.onSuccess = function(obj) {
1472 //alert("success");
1473 };
1474 rp.onError = function(obj) {
1475 //alert("error");
1476 }
1477
1478 var program = getHiddenFieldVal("PROGRAM");
1479 var rid = getHiddenFieldVal("RID");
1480 var blastSpec = getHiddenFieldVal("BLAST_SPEC");
1481 var params = "CMD=Get&RID=" + rid + "&ViewReport=on&PROGRAM=" + program + "&SAVE_INDV_FRM_OPTION=on&CONFIG_DESCR=" + $("cfcDsSave").value;
1482 if(blastSpec) {
1483 params += "&BLAST_SPEC=" + blastSpec;
1484 }
1485 rp.Request(params,"POST");
1486 }
1487
1488 function removeRID() {
1489 var rid = document.getElementsByName("RID");
1490 for (var i = 0; i <= rid.length; i++) {
1491 jQuery(rid[i]).remove();
1492 }
1493 }
1494
1495 function initAdvancedView()
1496 {
1497 if ($("dsConfig")) {
1498
1499 var alnView = getHiddenFieldVal("ALIGNMENT_VIEW");
1500 if (alnView == "Pairwise" || alnView == "PairwiseWithIdentities") {
1501 var rid = getHiddenFieldVal("RID");
1502 ReadNextSeqAligns(0, 5);
1503 g_alignViewPos = $("alignView").getBoundingClientRect().top;
1504 utils.addEvent(window, "scroll", checkAutoAlignLoad, false);
1505 }
1506 list = $("phiPtInd");
1507 if (list) {
1508 utils.addEvent(list, "change", GetPatternLocResults, false);
1509 }
1510 initDescConfig();
1511 initDescSelect();
1512 initDescDownLoad();
1513 if ($("psiInp")) {
1514 var nextIter = document.getElementsByName("NEXT_I");
1515 for (var i = 0; i < nextIter.length; i++) {
1516 utils.addEvent(nextIter[i], "click", removeRID, false);
1517 }
1518 }
1519 }
1520 }
1521
1522 //takes care of jQuery calls to elements that have dots in id like id= "SRA34456.3.4"
1523 function initjQry()
1524 {
1525 var oldCreate = jQuery.ui.ncbipopper.prototype._create;
1526 jQuery.ui.ncbipopper.prototype._create = function() {
1527 var destSelector = this.options.destSelector || this.options.sourceSelector || this.element.prop("hash");
1528 this.options.destSelector = destSelector.replace(/\./g, "\\.");
1529 oldCreate.apply(this, arguments);
1530 }
1531 }
1532 utils.addEvent(window,
1533 "load", initAdvancedView,
1534 false);
1535
1536 initjQry()
1537
1538 /* If user agent has "safari" in it, include safari-specific stylesheet. */
1539 if (navigator.userAgent.match(/ie/i)) {
1540 document.write("<link rel='stylesheet' type='text/css' href='css/ie-descriptions.css' media='screen'/>");
1541 }
1542 /*****************************new code end*********************************************************************/