Merge pull request #5205 from solgenomics/topic/generic_trial_upload
[sgn.git] / js / source / legacy / solGS / solGS.js
blob5582a849e6a3aa39304963195fe8a69464e8b014
1 /**
2  * @class solgs
3  * general solGS app wide and misc functions
4  * @author Isaak Y Tecle <iyt2@cornell.edu>
5  *
6  */
8 JSAN.use("jquery.blockUI");
9 JSAN.use("jquery.form");
11 var solGS = solGS || function solGS() {};
13 solGS.submitJob = {
14   waitPage: function (page, args) {
15     var host = window.location.protocol + "//" + window.location.host;
16     page = page.replace(host, "");
18     var matchItems =
19       "solgs/population/" +
20       "|solgs/populations/combined/" +
21       "|solgs/trait/" +
22       "|solgs/model/combined/trials/" +
23       "|solgs/search/trials/trait//" +
24       "|solgs/selection/\\d+|\\w+_\\d+/model/" +
25       "|solgs/combined/model/\\d+|\\w+_\\d+/selection/" +
26       "|solgs/models/combined/trials/" +
27       "|solgs/traits/all/population/" +
28       "|pca/analysis/" +
29       "|kinship/analysis/" +
30       "|cluster/analysis/";
32     if (page.match(matchItems)) {
33       var multiTraitsUrls = "solgs/traits/all/population/" + "|solgs/models/combined/trials/";
35       if (page.match(multiTraitsUrls)) {
36         this.getTraitsSelectionId(page, args);
37       } else {
38         //if (page.match(/list_/)) {
39         //      askUser(page, args)
40         // } else {
41         this.checkCachedResult(page, args);
42         // }
43       }
44     } else {
45       this.goToPage(page, args);
46     }
47   },
49   checkCachedResult: function (page, args) {
50     var trainingTraitsIds = solGS.getTrainingTraitsIds();
52     if (trainingTraitsIds) {
53       if (!args) {
54         args = { training_traits_ids: trainingTraitsIds };
55       } else {
56         args["training_traits_ids"] = trainingTraitsIds;
57       }
58     }
60     args = this.getArgsFromUrl(page, args);
61     args = JSON.stringify(args);
63     jQuery.ajax({
64       type: "POST",
65       dataType: "json",
66       data: { page: page, arguments: args },
67       url: "/solgs/check/cached/result/",
68       success: function (response) {
69         if (response.cached) {
70           args = JSON.parse(args);
71           solGS.submitJob.goToPage(page, args);
72         } else {
73           if (document.URL.match(/solgs\/population\/|solgs\/populations\/combined\//)) {
74             solGS.submitJob.checkTrainingPopRequirement(page, args);
75           } else {
76             args = JSON.parse(args);
77             solGS.submitJob.askUser(page, args);
78           }
79         }
80       },
81       error: function () {
82         alert("Error occured checking for cached output.");
83       },
84     });
85   },
87   checkTrainingPopRequirement: function (page, args) {
88     jQuery.ajax({
89       dataType: "json",
90       type: "POST",
91       data: { args: args },
92       url: "/solgs/check/training/pop/size/",
93       success: function (res) {
94         var trainingPopSize = res.member_count;
95         if (trainingPopSize >= 20) {
96           args = JSON.parse(args);
97           solGS.submitJob.askUser(page, args);
98         } else {
99           var msg =
100             "The training population size (" +
101             trainingPopSize +
102             ") is too small. Minimum required is 20.";
104           solGS.alertMessage(msg);
105         }
106       },
107     });
108   },
110   askUser: function (page, args) {
111     var title =
112       "<p>Since the job takes long time, you can only submit and wait for an email with a link to the results. " +
113       "Do you want to submit it and get an email when it completes?</p>";
115     var jobSubmit = '<div id= "job_submission">' + title + "</div>";
117     jQuery(jobSubmit).appendTo("body");
119     jQuery("#job_submission").dialog({
120       height: 200,
121       width: 600,
122       modal: true,
123       title: "Job submission",
124       buttons: {
125         OK: {
126           text: "Yes",
127           class: "btn btn-success",
128           id: "queue_job",
129           click: function () {
130             jQuery(this).dialog("close");
132             solGS.submitJob.checkUserLogin(page, args);
133           },
134         },
135         // No: {
136         //     text: 'No, I will wait...',
137         //     class: 'btn btn-primary',
138         //     id   : 'no_queue',
139         //     click: function() {
140         //      jQuery(this).dialog("close");
142         //      analyzeNow(page, args);
143         //     },
144         // },
145         Cancel: {
146           text: "No",
147           class: "btn btn-info",
148           id: "cancel_queue_info",
149           click: function () {
150             jQuery(this).dialog("close");
151           },
152         },
153       },
154     });
155   },
157   checkUserLogin: function (page, args) {
158     if (args === undefined) {
159       args = {};
160     }
162     jQuery.ajax({
163       type: "POST",
164       dataType: "json",
165       url: "/solgs/check/user/login/",
166       success: function (res) {
167         if (res.loggedin) {
168           var contact = res.contact;
170           args["first_name"] = contact.first_name;
171           args["user_email"] = contact.email;
172           args["user_name"] = contact.user_name;
173           solGS.submitJob.getProfileDialog(page, args);
174         } else {
175           solGS.submitJob.loginAlert();
176         }
177       },
178     });
179   },
181   loginAlert: function () {
182     jQuery("<div />")
183       .html("To use this feature, you need to log in and start over the process.")
184       .dialog({
185         height: 200,
186         width: 250,
187         modal: true,
188         title: "Login",
189         buttons: {
190           OK: {
191             click: function () {
192               jQuery(this).dialog("close");
193               solGS.submitJob.loginUser();
194             },
195             class: "btn btn-success",
196             text: "OK",
197           },
199           Cancel: {
200             click: function () {
201               jQuery(this).dialog("close");
202             },
203             class: "btn btn-primary",
204             text: "Cancel",
205           },
206         },
207       });
208   },
210   loginUser: function () {
211     window.location = "/user/login?goto_url=" + window.location.pathname;
212   },
214   getTraitsSelectionId: function (page, args) {
215     var traitIds = args.training_traits_ids;
216     var protocolId = solGS.genotypingProtocol.getGenotypingProtocolId();
218     jQuery.ajax({
219       dataType: "json",
220       type: "POST",
221       data: { trait_ids: traitIds },
222       url: "/solgs/get/traits/selection/id",
223       success: function (res) {
224         var traitsSelectionId = res.traits_selection_id;
225         page = page + "/traits/" + traitsSelectionId + "/gp/" + protocolId;
227         //if (page.match(/list_/)) {
228         //    askUser(page, args)
229         //} else {
230         solGS.submitJob.checkCachedResult(page, args);
231         //}
232       },
233       error: function (res, st, error) {
234         alert("error: " + error);
235       },
236     });
237   },
239   goToPage: function (page, args) {
240     jQuery.blockUI.defaults.applyPlatformOpacityRules = false;
241     jQuery.blockUI({ message: "Please wait.." });
243     var matchItems =
244       "solgs/submission/feedback" +
245       "|solgs/trait/" +
246       "|solgs/traits/all/population/" +
247       "|solgs/models/combined/trials/" +
248       "|solgs/model/combined/trials/" +
249       "|pca/analysis" +
250       "|kinship/analysis/" +
251       "|cluster/analysis/";
253     if (page.match(matchItems)) {
254       window.location = page;
255     } else if (page.match(/solgs\/populations\/combined\//)) {
256       solGS.combinedTrials.displayCombinedTrialsTrainingPopPage(args);
257     } else if (page.match(/solgs\/population\//)) {
258       // if (page.match(/solgs\/population\/list_/)) {
259       //        var listId = args.list_id;
260       //        loadPlotListTypeTrainingPop(listId);
261       // } else {
262       window.location = page;
263       // }
264     } else if (page.match(/solgs\/selection\//)) {
265       var listTypePages =
266         "solgs/selection/\\w+_\\d+/model/\\w+_\\d+/" + "|solgs/selection/\\d+/model/\\w+_\\d+/";
268       if (page.match(/listTypePages/)) {
269         loadGenotypesListTypeSelectionPop(args);
270       } else {
271         window.location = page;
272       }
273     } else {
274       window.location = window.location.href;
275     }
276   },
278   submitTraitSelections: function (page, args) {
279     wrapTraitsForm();
281     if (args == "undefined") {
282       document.getElementById("traits_selection_form").submit();
283       document.getElementById("traits_selection_form").reset();
284     } else {
285       jQuery("#traits_selection_form").ajaxSubmit();
286       jQuery("#traits_selection_form").resetForm();
287     }
288   },
290   wrapTraitsForm: function () {
291     var popId = jQuery("#population_id").val();
292     var protocolId = solGS.genotypingProtocol.getGenotypingProtocolId();
294     var formId = ' id="traits_selection_form"';
296     var action;
297     var referer = window.location.href;
299     if (referer.match(/solgs\/populations\/combined\//)) {
300       action = ' action="/solgs/models/combined/trials/' + popId + "/gp/" + protocolId + '"';
301     }
303     if (referer.match(/solgs\/population\//)) {
304       action = ' action="/solgs/traits/all/population/' + popId + "/gp/" + protocolId + '"';
305     }
307     var method = ' method="POST"';
309     var traitsForm = "<form" + formId + action + method + ">" + "</form>";
311     jQuery("#population_traits_list").wrap(traitsForm);
312   },
314   getProfileDialog: function (page, args) {
315     var matchItems =
316       "/solgs/population/" +
317       "|solgs/trait/" +
318       "|solgs/model/combined/trials/" +
319       "|solgs/combined/model/\\d+|\\w+_\\d+/selection/" +
320       "|solgs/selection/\\d+|\\w+_\\d+/model/";
322     if (page.match(matchItems)) {
323       args = this.getArgsFromUrl(page, args);
324     }
326     var form = this.getProfileForm(args);
327     jQuery("<div />", { id: "email-form" })
328       .html(form)
329       .dialog({
330         height: 400,
331         width: 400,
332         modal: true,
333         title: "Info about the analysis",
334         buttons: {
335           Submit: {
336             click: function (e) {
337               var analysisProfile = solGS.submitJob.structureAnalysisProfile(page, args);
338               solGS.submitJob.validateAnalysisInput(analysisProfile);
339             },
340             id: "submit_job",
341             class: "btn btn-success",
342             text: "Submit",
343           },
345           Cancel: {
346             click: function () {
347               jQuery(this).dialog("close");
348             },
349             class: "btn btn-primary",
350             text: "Cancel",
351           },
352         },
353       });
354   },
356   structureAnalysisProfile: function (page, args) {
357     var userEmail = jQuery("#user_email").val();
358     var analysisName = jQuery("#analysis_name").val();
359     var analysisType = args.analysis_type;
360     var userName = args.user_name;
361     var dataSetType = args.data_set_type;
363     args["user_email"] = userEmail;
364     args["analysis_name"] = analysisName;
365     args["analysis_page"] = page;
367     var hostname = `${location.protocol}//${location.hostname}`;
368     args['hostname'] = hostname;
370     args = JSON.stringify(args);
372     var analysisProfile = {
373       user_name: userName,
374       analysis_name: analysisName,
375       analysis_page: page,
376       analysis_type: analysisType,
377       data_set_type: dataSetType,
378       arguments: args,
379     };
381     return analysisProfile;
382   },
384   validateAnalysisInput: function (analysisProfile) {
385     var analysisName = jQuery("#analysis_name").val();
387     if (!analysisName) {
388       jQuery("#form-feedback-analysis-name").text("Analysis name is blank. Please give a name.");
389     } else {
390       var checkName = solGS.submitJob.checkAnalysisName(analysisName);
392       checkName.done(function (res) {
393         if (res.analysis_exists) {
394           jQuery("#analysis_name").css("border", "solid #FF0000");
396           jQuery("#form-feedback-analysis-name").text(
397             "The same name exists for another analysis. Please give a new name."
398           );
399         } else {
400           var email = jQuery("#user_email").val();
401           var emailPass = solGS.submitJob.checkEmail(email);
403           if (emailPass) {
404             jQuery("#email-form").dialog("close");
405             solGS.submitJob.saveAnalysisProfile(analysisProfile);
406           }
407         }
408       });
409     }
411     checkName.fail(function (res) {
412       var message =
413         "Error occured submitting the job. Please contact the developers." +
414         "\n\nHint: " +
415         response.result;
416       solGS.alertMessage(message);
417     });
418   },
420   checkEmail: function (email) {
421     var emailPass;
422     var emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/i;
423     if (!email.match(emailRegex)) {
424       jQuery("#user_email").css("border", "solid #FF0000");
426       jQuery("#form-feedback-user-email").text("Please provide a proper email address.");
428       emailPass = 0;
429     } else {
430       emailPass = 1;
431     }
433     return emailPass;
434   },
436   checkAnalysisName: function (name) {
437     var analysisName = jQuery.ajax({
438       dataType: "json",
439       type: "POST",
440       data: { name: name },
441       url: "/solgs/check/analysis/name",
442     });
444     return analysisName;
445   },
447   getArgsFromUrl: function (url, args) {
448     var referer = document.URL;
449     var host = window.location.protocol + "//" + window.location.host;
450     referer = referer.replace(host, "");
452     if (args === undefined) {
453       args = {};
454     }
456     if (window.Prototype) {
457       delete Array.prototype.toJSON;
458     }
460     if (url.match(/solgs\/trait\//)) {
461       var urlStr = url.split(/\/+/);
463       args["trait_id"] = [urlStr[3]];
464       args["training_pop_id"] = [urlStr[5]];
465       args["analysis_type"] = "training_model";
466       args["data_set_type"] = "single_population";
467     } else if (url.match(/solgs\/model\/combined\/trials\//)) {
468       var urlStr = url.split(/\/+/);
470       var traitId = [];
471       var populationId = [];
472       var comboPopsId = [];
473       var protocolId;
475       if (referer.match(/solgs\/search\/trials\/trait\//)) {
476         populationId.push(urlStr[5]);
477         comboPopsId.push(urlStr[5]);
478         traitId.push(urlStr[7]);
479         protocolId = urlStr[9];
480       } else if (referer.match(/solgs\/populations\/combined\//)) {
481         populationId.push(urlStr[5]);
482         comboPopsId.push(urlStr[5]);
483         traitId.push(urlStr[7]);
484         protocolId = urlStr[9];
485       }
487       args["trait_id"] = traitId;
488       args["training_pop_id"] = populationId;
489       args["combo_pops_id"] = comboPopsId;
490       args["analysis_type"] = "training_model";
491       args["data_set_type"] = "combined_populations";
492       args["genotyping_protocol_id"] = protocolId;
493     } else if (url.match(/solgs\/population\//)) {
494       var urlStr = url.split(/\/+/);
496       args["training_pop_id"] = [urlStr[3]];
497       args["analysis_type"] = "training_dataset";
498       args["data_set_type"] = "single_population";
499       args["genotyping_protocol_id"] = urlStr[5];
500     } else if (url.match(/solgs\/selection\//)) {
501       var traitId = jQuery("#trait_id").val();
502       var modelId = jQuery("#model_id").val();
503       var urlStr = url.split(/\/+/);
505       var dataSetType;
507       if (referer.match(/solgs\/model\/combined\/trials\/|solgs\/models\/combined\//)) {
508         dataSetType = "combined_populations";
509       } else if (referer.match(/solgs\/trait\/|solgs\/traits\/all\/population\//)) {
510         dataSetType = "single_population";
511       }
513       args["trait_id"] = [traitId];
514       args["training_pop_id"] = [urlStr[5]];
515       args["selection_pop_id"] = [urlStr[3]];
516       args["analysis_type"] = "selection_prediction";
517       args["data_set_type"] = dataSetType;
518     } else if (url.match(/solgs\/combined\/model\//)) {
519       var urlStr = url.split(/\/+/);
520       //var protocolId = urlStr[10];
521       var dataSetType = "combined_populations";
523       args["training_pop_id"] = [urlStr[4]];
524       args["selection_pop_id"] = [urlStr[6]];
525       args["trait_id"] = [urlStr[8]];
526       args["analysis_type"] = "selection_prediction";
527       args["data_set_type"] = dataSetType;
528     }
530     var trainingTraitsIds = jQuery("#training_traits_ids").val();
532     if (trainingTraitsIds) {
533       trainingTraitsIds = trainingTraitsIds.split(",");
534       args["training_traits_ids"] = trainingTraitsIds;
535       args["trait_id"] = trainingTraitsIds;
536     }
538     var protocolId = args.genotyping_protocol_id;
539     if (!protocolId) {
540       protocolId = solGS.genotypingProtocol.getGenotypingProtocolId();
541     }
543     var popDesc = jQuery("#training_pop_desc").val();
545     args["training_pop_desc"] = jQuery("#training_pop_desc").val();
546     args["selection_pop_desc"] = jQuery("#selection_pop_desc").val();
547     args["genotyping_protocol_id"] = protocolId;
548     args["referer"] = referer;
550     return args;
551   },
553   getProfileForm: function (args) {
554     var email = "";
555     if (args.user_email) {
556       email = args.user_email;
557     }
559     var firstName = "";
560     if (args.first_name) {
561       firstName = args.first_name;
562     }
564     var emailForm =
565       '<form><div class="form-group">' +
566       '<label for="first_name">Name:</label>' +
567       '<input type="text" class="form-control" id="first_name"  value="' +
568       firstName +
569       '"/>' +
570       "</div>" +
571       '<div class="form-group">' +
572       '<label for="analysis_name">Analysis name:</label>' +
573       '<input type="text" class="form-control" id="analysis_name">' +
574       '<div style="color:red" id="form-feedback-analysis-name"> </div>' +
575       "</div>" +
576       '<div class="form-group">' +
577       '<label for="user_email">Email:</label>' +
578       '<input type="email" class="form-control" id="user_email" value="' +
579       email +
580       '"/>' +
581       '<div style="color:red" id="form-feedback-user-email"> </div>' +
582       "</div>" +
583       "</form>";
585     return emailForm;
586   },
588   saveAnalysisProfile: function (profile) {
589     jQuery.ajax({
590       type: "POST",
591       dataType: "json",
592       data: profile,
593       url: "/solgs/save/analysis/profile/",
594       success: function (response) {
595         if (response.result) {
596           solGS.submitJob.runAnalysis(profile);
597         } else {
598           var message = "Failed saving your analysis profile.";
599           solGS.alertMessage(message);
600         }
601       },
602       error: function () {
603         var message = "Error occured calling the function to save your analysis profile.";
604         solGS.alertMessage(message);
605       },
606     });
607   },
609   runAnalysis: function (profile) {
610     jQuery.ajax({
611       dataType: "json",
612       type: "POST",
613       data: profile,
614       url: "/solgs/run/saved/analysis/",
615       success: function (res) {
616         if (res.result.match(/Submitted/)) {
617           solGS.submitJob.submissionFeedback(res.arguments);
618         } else {
619           var message =
620             "Error occured submitting the job. Please contact the developers." +
621             "\n\nHint: " +
622             res.result;
623           solGS.alertMessage(message);
624         }
625       },
626       error: function (response) {
627         var message =
628           "Error occured submitting the job. Please contact the developers." +
629           "\n\nHint: " +
630           res.result;
631         solGS.alertMessage(message);
632       },
633     });
634   },
636   submissionFeedback: function (args) {
637     args = JSON.parse(args);
638     var analysisType = args.analysis_type;
639     analysisType = analysisType.replace(/\s+|-/g, "_");
641     solGS.submitJob.goToPage("/solgs/submission/feedback/?job=" + analysisType);
642   },
644   selectTraitMessage: function () {
645     var message =
646       '<p style="text-align:justify;">' +
647       "Please select one or more traits to build prediction models.</p>";
649     jQuery("<div />")
650       .html(message)
651       .dialog({
652         height: 200,
653         width: 400,
654         modal: true,
655         title: "Prediction Modeling Message",
656         buttons: {
657           Yes: {
658             text: "OK",
659             class: "btn btn-success",
660             id: "select_trait_message",
661             click: function () {
662               jQuery(this).dialog("close");
663             },
664           },
665         },
666       });
667   },
670 solGS.waitPage = function (page, args) {
671   solGS.submitJob.waitPage(page, args);
674 jQuery(document).ready(function () {
675   jQuery("#runGS").on("click", function () {
676     if (window.Prototype) {
677       delete Array.prototype.toJSON;
678     }
680     var traitIds = jQuery("#traits_selection_div :checkbox").fieldValue();
681     var popId = jQuery("#training_pop_id").val();
682     var protocolId = solGS.genotypingProtocol.getGenotypingProtocolId();
684     if (traitIds.length) {
685       var page;
686       var analysisType;
687       var dataSetType;
689       var referer = window.location.href;
691       if (referer.match(/solgs\/populations\/combined\//)) {
692         dataSetType = "combined_populations";
693       }
695       if (referer.match(/solgs\/population\//)) {
696         dataSetType = "single_population";
697       }
699       if (traitIds.length == 1) {
700         analysisType = "training_model";
702         if (referer.match(/solgs\/populations\/combined\//)) {
703           page =
704             "/solgs/model/combined/trials/" + popId + "/trait/" + traitIds[0] + "/gp/" + protocolId;
705         } else if (referer.match(/solgs\/population\//)) {
706           page = "/solgs/trait/" + traitIds[0] + "/population/" + popId + "/gp/" + protocolId;
707         }
708       } else {
709         analysisType = "multiple_models";
711         if (referer.match(/solgs\/populations\/combined\//)) {
712           page = "/solgs/models/combined/trials/" + popId;
713         } else {
714           page = "/solgs/traits/all/population/" + popId;
715         }
716       }
718       var args = {
719         trait_id: traitIds,
720         training_traits_ids: traitIds,
721         training_pop_id: [popId],
722         analysis_type: analysisType,
723         data_set_type: dataSetType,
724       };
726       solGS.submitJob.waitPage(page, args);
727     } else {
728       solGS.submitJob.selectTraitMessage();
729     }
730   });
733 solGS.alertMessage = function (msg, msgTitle, divId) {
734   if (!msgTitle) {
735     msgTitle = "Message";
736   }
738   if (!divId) {
739     divId = "error_message";
740   }
742   jQuery("<div />", { id: divId })
743     .html(msg)
744     .dialog({
745       height: "auto",
746       width: "auto",
747       modal: true,
748       title: msgTitle,
749       buttons: {
750         OK: {
751           click: function () {
752             jQuery(this).dialog("close");
753             //window.location = window.location.href;
754           },
755           class: "btn btn-success",
756           text: "OK",
757         },
758       },
759     });
762 solGS.getTraitDetails = function (traitId) {
763   if (!traitId) {
764     traitId = jQuery("#trait_id").val();
765   }
767   if (traitId) {
768     jQuery.ajax({
769       dataType: "json",
770       type: "POST",
771       data: { trait_id: traitId },
772       url: "/solgs/details/trait/" + traitId,
773       success: function (trait) {
774         jQuery(document.body).append(
775           '<input type="hidden" id="trait_name" value="' + trait.name + '"></input>'
776         );
777         jQuery(document.body).append(
778           '<input type="hidden" id="trait_abbr" value="' + trait.abbr + '"></input>'
779         );
780       },
781     });
782   }
785 solGS.getTrainingTraitsIds = function () {
786   var trainingTraitsIds = jQuery("#training_traits_ids").val();
787   var trainingTraitsCode = jQuery("#training_traits_code").val();
788   var traitId = jQuery("#trait_id").val();
790   if (trainingTraitsIds) {
791     trainingTraitsIds = trainingTraitsIds.split(",");
793   } else if (traitId) {
794     trainingTraitsIds = [traitId];
795   }
797   return trainingTraitsIds;
800 solGS.getModelArgs = function () {
801   var args = this.getTrainingPopArgs();
802   var trainingTraitsIds = this.getTrainingTraitsIds();
804   if (trainingTraitsIds) {
805     args["training_traits_code"] = jQuery("#training_traits_code").val();
806     args["training_traits_ids"] = trainingTraitsIds;
807   }
809   if (trainingTraitsIds.length == 1) {
810     args["trait_id"] = trainingTraitsIds[0];
811   }
813   return args;
816 solGS.selectMenuModelArgs = function() {
817     var modelArgs = this.getModelArgs();
819     return {
820       id: modelArgs.training_pop_id,
821       name: modelArgs.training_pop_name,
822       pop_type: "training",
823     };
826 solGS.getSelectionPopArgs = function () {
827   var args = this.getModelArgs();
828   var selPopGenoProtocolId = jQuery("#selection_pop_genotyping_protocol_id").val();
829   var selPopId = jQuery("#selection_pop_id").val();
831   if (!selPopGenoProtocolId) {
832     selPopGenoProtocolId = jQuery("#genotyping_protocol_id").val();
833   }
834   if (selPopGenoProtocolId) {
835     args["selection_pop_genotyping_protocol_id"] = selPopGenoProtocolId;
836     args["selection_pop_id"] = selPopId;
837   }
839   return args;
842 solGS.getTrainingPopArgs = function () {
843   var args = {
844     training_pop_id: jQuery("#training_pop_id").val(),
845     training_pop_name: jQuery("#training_pop_name").val(),
846     genotyping_protocol_id: jQuery("#genotyping_protocol_id").val(),
847     data_set_type: jQuery("#data_set_type").val(),
848     analysis_type: jQuery("#analysis_type").val(),
849   };
851   return args;
854 solGS.getPopulationDetails = function () {
855   var trainingPopId = jQuery("#population_id").val();
856   var trainingPopName = jQuery("#population_name").val();
858   if (!trainingPopId) {
859     trainingPopId = jQuery("#training_pop_id").val();
860     trainingPopName = jQuery("#training_pop_name").val();
861   }
863   var selectionPopId = jQuery("#selection_pop_id").val();
864   var selectionPopName = jQuery("#selection_pop_name").val();
866   if (!trainingPopId) {
867     trainingPopId = jQuery("#model_id").val();
868     traininPopName = jQuery("#model_name").val();
869   }
871   var comboPopsId = jQuery("#combo_pops_id").val();
873   var dataSetType;
875   if (comboPopsId) {
876     dataSetType = "combined_populations";
877     trainingPopId = comboPopsId;
878   } else {
879     dataSetType = "single_population";
880   }
882   var protocolId = jQuery("#genotyping_protocol_id").val();
883   return {
884     training_pop_id: trainingPopId,
885     population_name: trainingPopName,
886     training_pop_name: trainingPopName,
887     selection_pop_id: selectionPopId,
888     selection_pop_name: selectionPopName,
889     combo_pops_id: comboPopsId,
890     data_set_type: dataSetType,
891     genotyping_protocol_id: protocolId,
892   };
895 solGS.showMessage = function (divId, msg) {
896   divId = divId.match(/#/) ? divId : "#" + divId;
898   jQuery(divId).html(msg).show().delay(4000).fadeOut("slow");
901 solGS.checkPageType = function () {
902   var pageType = jQuery.ajax({
903     dataType: "json",
904     type: "POST",
905     data: { page: document.URL },
906     url: "/solgs/check/page/type",
907   });
909   return pageType;
913 solGS.blockSolgsSearchInterface = function () {
915         jQuery("#solgs_search_interfaces").hide();
920 //executes two functions alternately
921 jQuery.fn.alternateFunctions = function (a, b) {
922   return this.each(function () {
923     var clicked = false;
924     jQuery(this).bind("click", function () {
925       if (clicked) {
926         clicked = false;
927         return b.apply(this, arguments);
928       }
929       clicked = true;
930       return a.apply(this, arguments);
931     });
932   });
935 jQuery.fn.doesExist = function () {
936   return jQuery(this).length > 0;
939 jQuery(document).on("keyup", "#user_email", function (e) {
940   jQuery("#user_email").css("border", "solid #96d3ec");
942   jQuery("#form-feedback-user-email").empty();
945 jQuery(document).on("keyup", "#analysis_name", function (e) {
946   jQuery("#analysis_name").css("border", "solid #96d3ec");
948   jQuery("#form-feedback-analysis-name").empty();