<commit_before>$(function() {
  
  $('.error').dialog({ autoOpen: false, buttons: { 'Close': function() { $(this).dialog('close') } } });
  $('.confirm').dialog({ autoOpen: false, modal: true })
  
  $('select.protein').combobox({invalid: _add_protein, change: _validate_container, select: _validate_container})
  
  $('input.sname,input.comment,input[name=container]').unbind("change keyup input").bind("change keyup input", function() {
    _validate_container()
  })
  
  $('table.samples tr td button.clone').button({ icons: { primary: 'ui-icon-circle-plus' }, text: false }).click(function(e) {
    e.preventDefault();
    _clone($(this))
  })
  
  $('table.samples tr td .top a').button({ icons: { primary: 'ui-icon-triangle-1-n' } })

  $('table.samples tr td button.delete').button({ icons: { primary: 'ui-icon-close' }, text: false }).click(function(e) {
    e.preventDefault();
                                                                                                            
    var idx = $('table.samples tr td button.delete').index($(this))
                                   
    $('select.protein').eq(idx).combobox('value', -1)
    $('input.sname').eq(idx).val('')
    $('select.sg').eq(idx).val('')
    $('input.code').eq(idx).val('')
    $('input.comment').eq(idx).val('')
                                   
    _validate_container()
  })
  
  _get_proteins(function() { _validate_container })

  $('table.samples tr td button.insert').button({ icons: { primary: 'ui-icon-carat-1-s' }, text: false }).click(function(e) {
    e.preventDefault();
  })
  
  
  // Generate a confirmation dialog
  function _confirm(t, q, ok_fn) {
    $('.confirm').html(q).dialog('option', 'title', t)
    $('.confirm').dialog('option', 'buttons', {
      'Ok': function() {
        ok_fn()
        $(this).dialog('close');
      },
      'Cancel': function () {
        $(this).dialog('close');
      }
    });

    $('.confirm').dialog('open');
  }
  
  
  // Add a new protein
  function _add_protein(ui,val) {
    var safe = val.replace(/\W/g, '')
    _confirm('Add new protein', 'Do you want to add a new protein called: ' + safe, function() {
      $.ajax({
        url: '/shipment/ajax/addp/name/'+safe,
        type: 'GET',
        dataType: 'json',
        timeout: 5000,
        success: function(pid){
          if (pid) {
            _get_proteins(function() {
              ui.combobox('value', pid)
              _validate_container()
            })
          }
        }
      })
    })
  }
  
  
  // Get protein acronyms
  function _get_proteins(fn) {
    var old = $('select.protein').map(function(i,e) { return $(e).combobox('value') }).get()

    $.ajax({
      url: '/shipment/ajax/pro',
      type: 'GET',
      dataType: 'json',
      timeout: 5000,
      success: function(json){
        var opts = '<option value="-1"></option>'
        $.each(json, function(i,p) {
            opts += '<option value="'+p['PROTEINID']+'">'+p['ACRONYM']+'</option>'
        })
        
        $('select.protein').html(opts)
           
        $('select.protein').each(function(i,e) {
            if (old[i] > -1) $(e).combobox('value', old[i])
        })
           
        if (fn) fn()
      }
    })  
  
  }
  
  
  // Clone from previous sample
  function _clone(sel) {
    var sidx = $('button.clone').index(sel)
    var sn = $('input.sname').eq(sidx)
               
    if (sn.val()) {
        var snt = sn.val().replace(/\d+$/, '')
        var nx = $('input.sname').filter(function(i) { return i > sidx && !$(this).val() }).first()
        var rx = new RegExp(snt)
        var nxn = $('input.sname').filter(function() { return $(this).val().match(rx) }).last().val()
      
        var no = nxn.match(/\d+$/)
  
        if (no) no = no.length > 0 ? parseInt(no[0]) : 1
        else no = 1
      
        var nidx = $('input.sname').index(nx)
        $('select.protein').eq(nidx).combobox('value', $('select.protein').eq(sidx).combobox('value'))
        nx.val(snt+(no+1))
        $('select.sg').eq(nidx).val($('select.sg').eq(sidx).val())
      
        _validate_container()
    }
  }
  
  
  // Validate container
  function _validate_container(show_msg) {
    var ret = true, msg
  
    if (!$('input[name=container]').val().match(/^(\w|\-)+$/)) {
        $('input[name=container]').removeClass('fvalid').addClass('ferror')
        ret = false
        msg = 'Your container name is blank, contains special characters and/or spaces'
    } else $('input[name=container]').addClass('fvalid').removeClass('ferror')
  
    $('select.protein').each(function(i,e) {
        var samp = true
        if ($(this).val() > -1) {

          $('input.sname').eq(i).prop('disabled', false).removeClass('disabled')
          $('input.comment').eq(i).prop('disabled', false).removeClass('disabled')
          $('input.code').eq(i).prop('disabled', false).removeClass('disabled')
         
          if (!$('input.sname').eq(i).val().match(/^([\w-])+$/)) {
            $('input.sname').eq(i).removeClass('fvalid').addClass('ferror')
            ret = false
            samp = false
            msg = 'Your sample name is blank, contains special characters and/or spaces. Sample names may only contain letters, numbers, and underscores.'
                             
          } else $('input.sname').eq(i).removeClass('ferror').addClass('fvalid')
                             
          /*if ($('input.comment').eq(i).val() && !$($('input.comment')[i]).val().match(/^[a-zA-Z0-9_ ]+$/)) {
            $('input.comment').eq(i).removeClass('fvalid').addClass('ferror')
            ret = false
            samp = false
            msg = 'Your comment contains special characters. Comments may only contain letters, numbers, spaces, and underscores.'
                             
          } else $('input.comment').eq(i).removeClass('ferror').addClass('fvalid')*/

          if ($('input.code').eq(i).val() && !$($('input.code')[i]).val().match(/^\w+$/)) {
            $('input.code').eq(i).removeClass('fvalid').addClass('ferror')
            ret = false
            samp = false
            msg = 'Your barcode contains special characters. Barcodes may only contain letters and numbers'
                             
          } else $('input.comment').eq(i).removeClass('ferror').addClass('fvalid')
                        
          $(e).parent('td').parent('tr').removeClass('v').removeClass('iv').addClass(samp ? 'v' : 'iv')
                             
        } else {
          $('input.sname').eq(i).prop('disabled', true).addClass('disabled').removeClass('fvalid').removeClass('ferror')
          $('input.comment').eq(i).prop('disabled', true).addClass('disabled').removeClass('fvalid').removeClass('ferror')
          $('input.code').eq(i).prop('disabled', true).addClass('disabled').removeClass('fvalid').removeClass('ferror')
        }
    })
  
    if (ret == false && show_msg == true) {
        $('.error .message').html(msg)
        $('.error').dialog('open')
    }
  
    _draw()
  
    return ret
  }
  <commit_msg>update puck when deleting sample<commit_after>$(function() {
  
  $('.error').dialog({ autoOpen: false, buttons: { 'Close': function() { $(this).dialog('close') } } });
  $('.confirm').dialog({ autoOpen: false, modal: true })
  
  $('select.protein').combobox({invalid: _add_protein, change: _validate_container, select: _validate_container})
  
  $('input.sname,input.comment,input[name=container]').unbind("change keyup input").bind("change keyup input", function() {
    _validate_container()
  })
  
  $('table.samples tr td button.clone').button({ icons: { primary: 'ui-icon-circle-plus' }, text: false }).click(function(e) {
    e.preventDefault();
    _clone($(this))
  })
  
  $('table.samples tr td .top a').button({ icons: { primary: 'ui-icon-triangle-1-n' } })

  $('table.samples tr td button.delete').button({ icons: { primary: 'ui-icon-close' }, text: false }).click(function(e) {
    e.preventDefault();
                                                                                                            
    var idx = $('table.samples tr td button.delete').index($(this))
                                   
    $('select.protein').eq(idx).combobox('value', -1)
    $('input.sname').eq(idx).val('')
    $('select.sg').eq(idx).val('')
    $('input.code').eq(idx).val('')
    $('input.comment').eq(idx).val('')
                                   
    _validate_container()
  })
  
  _get_proteins(function() { _validate_container })

  $('table.samples tr td button.insert').button({ icons: { primary: 'ui-icon-carat-1-s' }, text: false }).click(function(e) {
    e.preventDefault();
  })
  
  
  // Generate a confirmation dialog
  function _confirm(t, q, ok_fn) {
    $('.confirm').html(q).dialog('option', 'title', t)
    $('.confirm').dialog('option', 'buttons', {
      'Ok': function() {
        ok_fn()
        $(this).dialog('close');
      },
      'Cancel': function () {
        $(this).dialog('close');
      }
    });

    $('.confirm').dialog('open');
  }
  
  
  // Add a new protein
  function _add_protein(ui,val) {
    var safe = val.replace(/\W/g, '')
    _confirm('Add new protein', 'Do you want to add a new protein called: ' + safe, function() {
      $.ajax({
        url: '/shipment/ajax/addp/name/'+safe,
        type: 'GET',
        dataType: 'json',
        timeout: 5000,
        success: function(pid){
          if (pid) {
            _get_proteins(function() {
              ui.combobox('value', pid)
              _validate_container()
            })
          }
        }
      })
    })
  }
  
  
  // Get protein acronyms
  function _get_proteins(fn) {
    var old = $('select.protein').map(function(i,e) { return $(e).combobox('value') }).get()

    $.ajax({
      url: '/shipment/ajax/pro',
      type: 'GET',
      dataType: 'json',
      timeout: 5000,
      success: function(json){
        var opts = '<option value="-1"></option>'
        $.each(json, function(i,p) {
            opts += '<option value="'+p['PROTEINID']+'">'+p['ACRONYM']+'</option>'
        })
        
        $('select.protein').html(opts)
           
        $('select.protein').each(function(i,e) {
            if (old[i] > -1) $(e).combobox('value', old[i])
        })
           
        if (fn) fn()
      }
    })  
  
  }
  
  
  // Clone from previous sample
  function _clone(sel) {
    var sidx = $('button.clone').index(sel)
    var sn = $('input.sname').eq(sidx)
               
    if (sn.val()) {
        var snt = sn.val().replace(/\d+$/, '')
        var nx = $('input.sname').filter(function(i) { return i > sidx && !$(this).val() }).first()
        var rx = new RegExp(snt)
        var nxn = $('input.sname').filter(function() { return $(this).val().match(rx) }).last().val()
      
        var no = nxn.match(/\d+$/)
  
        if (no) no = no.length > 0 ? parseInt(no[0]) : 1
        else no = 1
      
        var nidx = $('input.sname').index(nx)
        $('select.protein').eq(nidx).combobox('value', $('select.protein').eq(sidx).combobox('value'))
        nx.val(snt+(no+1))
        $('select.sg').eq(nidx).val($('select.sg').eq(sidx).val())
      
        _validate_container()
    }
  }
  
  
  // Validate container
  function _validate_container(show_msg) {
    var ret = true, msg
  
    if (!$('input[name=container]').val().match(/^(\w|\-)+$/)) {
        $('input[name=container]').removeClass('fvalid').addClass('ferror')
        ret = false
        msg = 'Your container name is blank, contains special characters and/or spaces'
    } else $('input[name=container]').addClass('fvalid').removeClass('ferror')
  
    $('select.protein').each(function(i,e) {
        var samp = true
        if ($(this).val() > -1) {

          $('input.sname').eq(i).prop('disabled', false).removeClass('disabled')
          $('input.comment').eq(i).prop('disabled', false).removeClass('disabled')
          $('input.code').eq(i).prop('disabled', false).removeClass('disabled')
         
          if (!$('input.sname').eq(i).val().match(/^([\w-])+$/)) {
            $('input.sname').eq(i).removeClass('fvalid').addClass('ferror')
            ret = false
            samp = false
            msg = 'Your sample name is blank, contains special characters and/or spaces. Sample names may only contain letters, numbers, and underscores.'
                             
          } else $('input.sname').eq(i).removeClass('ferror').addClass('fvalid')
                             
          /*if ($('input.comment').eq(i).val() && !$($('input.comment')[i]).val().match(/^[a-zA-Z0-9_ ]+$/)) {
            $('input.comment').eq(i).removeClass('fvalid').addClass('ferror')
            ret = false
            samp = false
            msg = 'Your comment contains special characters. Comments may only contain letters, numbers, spaces, and underscores.'
                             
          } else $('input.comment').eq(i).removeClass('ferror').addClass('fvalid')*/

          if ($('input.code').eq(i).val() && !$($('input.code')[i]).val().match(/^\w+$/)) {
            $('input.code').eq(i).removeClass('fvalid').addClass('ferror')
            ret = false
            samp = false
            msg = 'Your barcode contains special characters. Barcodes may only contain letters and numbers'
                             
          } else $('input.comment').eq(i).removeClass('ferror').addClass('fvalid')
                        
          $(e).parent('td').parent('tr').removeClass('v').removeClass('iv').addClass(samp ? 'v' : 'iv')
                             
        } else {
          $('input.sname').eq(i).prop('disabled', true).addClass('disabled').removeClass('fvalid').removeClass('ferror')
          $('input.comment').eq(i).prop('disabled', true).addClass('disabled').removeClass('fvalid').removeClass('ferror')
          $('input.code').eq(i).prop('disabled', true).addClass('disabled').removeClass('fvalid').removeClass('ferror')
          $(e).parent('td').parent('tr').removeClass('v').removeClass('iv')
        }
    })
  
    if (ret == false && show_msg == true) {
        $('.error .message').html(msg)
        $('.error').dialog('open')
    }
  
    _draw()
  
    return ret
  }
  
{'fraction_non_alphanumeric': 0.20383287536109349, 'fraction_numerical': 0.0029592052420207146, 'mean_word_length': 2.179659498207885, 'pattern_counts': {'":': 0, '<': 11, '<?xml version=': 0, '>': 19, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 10, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2746555', 'n_tokens_mistral': 4438, 'n_tokens_neox': 4353, 'n_words': 761}