Card = function(restaurant, data) {
  this.restaurant = restaurant;
  this.errors = [];
  this.data = {};
  
  for (var key in data) {
    this.data[key] = data[key];
  }
  
};

Card.prototype = {
  
  fields: [
    { name: 'number',             sel: 'input[name=card_number]',    validations: 'credit card' },
    { name: 'month',              sel: 'select[name=card_expires_month]' },
    { name: 'year',               sel: 'select[name=card_expires_year]' },
    { name: 'verification_value', sel: 'input[name=card_ccv]' },
    { name: 'issue',              sel: 'input[name=issue]' }
  ],
  
  fetch_attributes: function() {
    for (field in this.fields) {
      var val = $('#confirmation_inner_' + this.restaurant.data._id + ' ' + this.fields[field].sel).val();
      this.data[this.fields[field].name] = val;
    }
    if(this.data.year && this.data.year.length == 4) {
      this.data.year = this.data.year.substr(2,2)
    }
    if(this.data.month && this.data.month.length == 1) {
      this.data.month = "0" + this.data.month
    }
  },
  
  validate: function() {
    var valid = true;
    for (field_idx in this.fields) {
      var field = $('#confirmation_inner_' + this.restaurant.data._id + ' ' + this.fields[field_idx].sel);
      
      if(this.fields[field_idx].name == 'number') {
        var card_type = this.card_type(field.val());
        if(card_type && card_type.match(/(MAESTRO|SOLO)/)) {
          $('#confirmation_inner_' + this.restaurant.data._id + ' .row.card_start').show();
          $('#confirmation_inner_' + this.restaurant.data._id + ' .row.issue').show();
        } else {
          $('#confirmation_inner_' + this.restaurant.data._id + ' .row.card_start').hide();          
          $('#confirmation_inner_' + this.restaurant.data._id + ' .row.issue').hide();          
        }
      }

      if(this.fields[field_idx].validations) {
        if(this.fields[field_idx].validations == "cannot be blank" && field.val() == '') {
          valid = false;
          field.parent().removeClass('ok').addClass('err');
          if(field.next().length == 0) {
            field.parent().append(Jaml.render('under_err', "Please type in your full name"));
            field.next().slideDown();
          }
        } else if(this.fields[field_idx].validations == "credit card" && this.card_type(field.val()) == null) {
          valid = false;
          field.parent().removeClass('ok').addClass('err');
          if(field.next().length == 0) {
            field.parent().append(Jaml.render('under_err', "Must be Visa, Mastercard or Maestro"));
            field.next().slideDown();
          }
        } else {
          field.parent().removeClass('err').addClass('ok');
          if(field.next().length != 0) {
            field.next().slideUp(300, function(){ $(this).remove() })
          }
        }
      }
    }
    return valid;
  },
  
  valid: function() {
    this.fetch_attributes();
    return this.validate();
  },
  
  card_type: function() {
    var card_types = {
      'VISA'               : /^4\d{12}(\d{3})?$/,
      'MC'                 : /^(5[1-5]\d{4}|677189)\d{10}$/,
      'AMEX'               : /^3[47]\d{13}$/,
      'DC'                 : /^3(0[0-5]|[68]\d)\d{11}$/,
      'JCB'                : /^3528\d{12}$/,
      'MAESTRO'            : /^6759\d{12}(\d{2,3})?$/,  
      'SOLO'               : /^6767\d{12}(\d{2,3})?$/,
      'MAESTRO'            : /^(5[06-8]|6\d)\d{10,17}$/
    }
    for(var card_type in card_types) {
      if(this.data.number.match(card_types[card_type])) {
        return card_type
      }
    }
    return null;    
  }
  

};

