// registration.js
// added validation by days in month and Maine state law compliance. 9/10/09 -GV

if (!window.validation) var validation
if (!window.reg) var reg

reg = {
  wait_for_response_time: 5000, 
  server: 'http://users-intl.icarly.com/register',
  submit_button: '#registration .submit_button',
  wrap: '#registration ',
  // start language translationes here
  check_month_msg: 'controlla mese',
  check_day_msg: 'controlla giorno', 
  check_year_msg: 'controlla anno', 
  title_msg: '¡Ups! Existen algunos errores en tu registración, por favor revisa las instrucciones en rojo…',
  error1: '1. Nombres de usuarios no pueden ser menor a 3 caracteres o mayor a 10.',
  error2_0: '2. Por favor escribe una clave válida. (Max 10 caracteres)(No HTML por favor)',
  error2_1: '2. ¡Las claves no son iguales!',
  error3_0: '3. Selecciona una pregunta',
  error3_1: '3. ¡Escribe una respuesta!',
  error4_0: '4. Por favor ingresa una fecha de nacimiento válida',
  error_date_sentence: ['4. there are only ', ' days in ', ' (leap year)', ' (regular year)', 'invalid date'],
  error5_0: '5. Por favor seleccionar niño o niña',
  error6_0: '6. Por favor dinos de donde eres',
  error_maine_minor: 'Lo sentimos, la registración no está disponible en este momento. ¡Pronto regresará!',  
  // end translationes
  form: {}
} 

// Set Up Validation Rules

validation = {
  addrule: function(kind, rule) {
    // method for defining a validation rule
    // kind is the name of the validation rule
    // rule is a function that takes a string paramter and returns true or false
    
    if (!window['validation']) window['validation'] = {}  
    if (typeof(rule) !== 'function') {
      return false  
    }
    //if(validation[kind]) {
      //alert ('overwriting validation rule: ' + kind) }
    validation[kind] = rule
    return true 
  }
}

validation.addrule ('string', function(arg) {
  if ((typeof(arg) === 'string') && (arg.length > 0)) {
    return true
  }
  return false
})

validation.addrule ('login', function(arg) {
  var MIN_LENGTH = 3
  var MAX_LENGTH = 10
  if ((validation.string(arg)) && 
    (arg.length >= MIN_LENGTH) && (arg.length <= MAX_LENGTH)) {    
    if (arg.indexOf(' ') === -1) {
      return true
    }
  }
  return false
})

validation.addrule ('retyped', function(arg, other) {
  if (validation.string(arg) && validation.string(other)) {
    if (arg === other) {
      return true
    }
  }
  return false
})

validation.addrule ('select', function(arg) {
  if (validation.string(arg)) {
    if (arg.toLowerCase().indexOf('select') !== 0) {
      return true
    }
  }
  return false
})

validation.addrule ('radio', function() {
  for (var i=0; i<arguments.length; i++) {
    if (arguments[i].checked) {
      return true
    }
  }
  return false
})

validation.addrule ('number', function(arg, max, min) {
  if (typeof(arg) === 'string') {
    arg = parseInt(arg, 10)
  }
  if ((typeof(arg) === 'number') && (arg > 0)) {
    if ((typeof(max) === 'number') && (max > 0)) {
      if (arg > max) {
        return false
      }
      if ((typeof(min) === 'number') && (min > 0)) {
        if (arg < min) {
          return false
        }
      }
    }
    return true
  }
  return false
})

validation.addrule ('month', function(arg) {
  return (validation.number(arg, 12))
})
validation.addrule ('day', function(arg) {
  return (validation.number(arg, 31))
})

validation.addrule ('year', function(arg) {
  var year_now = new Date().getFullYear()
  var oldest_birth_year = 1894
  return (validation.number(arg, year_now, oldest_birth_year))
})

validation.DAYS_IN_MONTHS = {1:31, 2:29, 3:31, 4:30, 
  5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12:31 };
    
validation.leap_year = function(year) {
  var leap_day
  year % 4 === 0 ?
    year % 100 === 0 ?
      year % 1000 === 0 ?
        leap_day = true :
      leap_day = false :
    leap_day = true :
  leap_day = false
  return leap_day
}

validation.date = function(day, month, year, msg) { 
  
  day = parseInt(day, 10) || 0;
  month = parseInt(month, 10) || 1;
  year = parseInt(year, 10) || 1;
  var error_sentence = reg.error_date_sentence
  if ( !validation.day(day) || !validation.month(month) )
    return false;
  else if (day <= 28)
    return true; 
  var max_days
  month === 2 ?
    max_days = validation.leap_year(year)? 
      29: 
      28:
    max_days = validation.DAYS_IN_MONTHS[month] || 0; 
  var valid = ( day <= max_days )
  if (typeof msg === 'object' && !valid) {
    msg.str = error_sentence[4]; 
    if (typeof MONTH_NAMES === 'object') {
      msg.str = error_sentence[0] + max_days + error_sentence[1] + MONTH_NAMES[month-1];
      if (month === 2 && typeof year == 'number') 
        msg.str +=  validation.leap_year(year)? 
          error_sentence[2] : error_sentence[3]
    } 
  }
  return valid
}
reg.is_from_Maine = function() {
  return (reg.form.region.value.indexOf('Maine') !== -1)
}

reg.is_minor = function() {
  return (get_age( parseInt(reg.form.born_on_month.value),
                   parseInt(reg.form.born_on_day.value),
                   parseInt(reg.form.born_on_year.value) ) < 18)
}

reg.init = function() {
  // set up unfocus validation
  reg.form = document['register']
  // prevent enter key from submitting form
  reg.form.onsubmit = function() {return false}
    
  reg.form.login.onkeypress = function() {
    (validation.login(reg.form.login.value)) ?
    $(reg.wrap + '.username .msg').hide(): 
    $(reg.wrap + '.username .msg').show()
  }
  reg.form.login.onkeyup = reg.form.login.onkeypress
  
  reg.form.password.onkeypress = function() {
    (validation.login(reg.form.password.value)) ?
    $(reg.wrap + '.password .msg:eq(0)').hide(): 
    $(reg.wrap + '.password .msg:eq(0)').show()
    reg.recheck_password()
  }
  reg.form.password.onkeyup = reg.form.password.onkeypress
  
  reg.recheck_password = function() {
    (validation.retyped(reg.form.retype.value, reg.form.password.value)) ?
    $(reg.wrap + '.password .msg:eq(1)').hide(): 
    $(reg.wrap + '.password .msg:eq(1)').show()
  }
  
  reg.form.retype.onkeypress = reg.recheck_password
  reg.form.retype.onkeyup = reg.recheck_password
  
  reg.check_hint = function() {
    (validation.string(reg.form.answer.value)) ?
      $(reg.wrap + '.hint .msg:eq(1)').hide(): 
      $(reg.wrap + '.hint .msg:eq(1)').show();
    (validation.select(reg.form.question.value)) ?
      $(reg.wrap + '.hint .msg:eq(0)').hide(): 
      $(reg.wrap + '.hint .msg:eq(0)').show()
  }

  reg.form.answer.onkeyup = reg.check_hint
  reg.form.answer.onkeypress = reg.check_hint
  reg.form.question.onchange = reg.check_hint
  
  reg.checkDate = function() {
    var str
    if (validation.month(reg.form.born_on_month.value) === false)
      (str) ? str += ', month': str = '* ' + reg.check_month_msg
    if (validation.day(reg.form.born_on_day.value) === false)
      (str) ? str += ', day': str = '* ' + reg.check_day_msg 
    if (validation.year(reg.form.born_on_year.value) === false)
      (str) ? str += ', year': str = '* ' + reg.check_year_msg
    if (!str) str=''
    $(reg.wrap + '.born .msg').show().text(str)
  }
  reg.form.born_on_month.onkeypress = reg.checkDate
  reg.form.born_on_month.onkeyup = reg.checkDate
  reg.form.born_on_day.onkeypress = reg.checkDate
  reg.form.born_on_day.onkeyup = reg.checkDate
  reg.form.born_on_year.onkeypress = reg.checkDate
  reg.form.born_on_year.onkeyup = reg.checkDate
  
  // set site id
  if ($('div#site_id').length > 0){
    reg.form.site_id.value = parseInt( $('div#site_id').text() )
  }

  // whole form validation
  
  reg.validate = function() {
    var error = ''
    if (!validation.login(reg.form.login.value))
      error += reg.error1 +'\n'
    if (!validation.login(reg.form.password.value))
      error += reg.error2_0 +'\n'
    if (!validation.retyped(reg.form.retype.value, reg.form.password.value))
      error += reg.error2_1 +'\n'
    if (!validation.select(reg.form.question.value))
      error += reg.error3_0 +'\n'
    if (!validation.string(reg.form.answer.value))
      error += reg.error3_1+'\n'
    if (!validation.month(reg.form.born_on_month.value))
      error += reg.error4_0 +'\n'
    if (!validation.day(reg.form.born_on_day.value))
      error += reg.error4_1 +'\n'
    if (!validation.year(reg.form.born_on_year.value))
      error += reg.error4_2 +'\n'
    var date_msg = {}
    validation.date(reg.form.born_on_day.value, reg.form.born_on_month.value, reg.form.born_on_year.value, date_msg)
    if (date_msg.str)
      error += date_msg.str + '\n'
    if (!validation.radio(reg.form.gender_f, reg.form.gender_m))
      error += reg.error5_0 +'\n'
    if (!validation.select(reg.form.region.value))
      error += reg.error6_0 +'\n'
      
    // reject anyone under 18 from Maine because of a state law
    var isMinorFromMaine = ((error.length === 0) && reg.is_from_Maine() && reg.is_minor())
    if (isMinorFromMaine)
      error = reg.error_maine_minor
    
    if (error.length > 0) {
      error = reg.title_msg + '\n\n' + error
      if (isMinorFromMaine)
        error = reg.error_maine_minor
      alert(error)
      return false
    }   
    return true    
  }
  
  // set submit function
  $(reg.submit_button).click( function () { reg.submit_form() } )
}

reg.submit_form = function () {
  reg.response_flag = false
  if (reg.validate()) {
    // If the form passes validation, submit it
    reg.request = $.getJSON(reg.server + '?callback=?' + formToStr(), 
    function (data, textStatus) {
      //return false //simulate no server response
      reg.response_flag = true
      if (typeof data === 'object') {
        if (data.error) {
          // Show the serverside error to user, if it is one of these errors
          var ok_errors = ['username not allowed', 'username already exists']
          var display_error = false
          for (var i=0; i<ok_errors.length; i++) {
            if (data.error.toLowerCase() === ok_errors[i])
              display_error = true
          }
          if (display_error) {
            $(reg.wrap + '.username .msg').text('* ' + data.error).show()
          } else {
            reg.on_server_error()
            reg.error = data.error
          }
          reg.form.login.onkeyup = function () {
            $(reg.wrap + '.username .msg').text('*')
            reg.form.login.onkeyup = reg.form.login.onkeypress
          }
          window.scrollTo(0, 285)
        } else {
          //alert('You have successfully registered!')
          reg.success()
        }
        // str = ''
        //for (var id in data)
        //  str += id + ' = ' + data[id] + '\n'
        //alert(str)
      }
    })
    // alert user if there is no response
    setTimeout(" if (!reg.response_flag) reg.on_server_error()", reg.wait_for_response_time)
  }
}

reg.success = function() {
  if (window.login) {
    reg.username = reg.form.login.value
    set_cookie(login.cookie_name, reg.username, login.day_limit, '/')
    login.show_user()
    reg.form.reset()
    // set up confirmation display
    $('#registration').hide()
    $('#confirmation').show()
    $('#confirmation .newsletter').height(400)
    $('#confirmation .signup').css('top', '377px')
    $('#confirmation .home').hide()
    window.scrollTo(0, 285)
  } else {
    reg.error = 'login object not found'
  }
}

reg.on_server_error = function() {
  $('#registration').hide()
  $('#confirmation').show()
  $('#confirmation .registered').css('background-position', 'bottom left')
  $('#confirmation .dontforget').hide()
  $('#confirmation .sendus').hide()
  window.scrollTo(0, 285)
}

// Utilities

var get_age = function(month, day, year) {
  var today = new Date()
  var y = today.getFullYear()
  var m = today.getMonth()+1
  var d = today.getDate()
  var age = y - year
  if (m < month)
    age -= 1
  else if (month == m)
    if (d < day)
      age -= 1
  return age
}

function formToStr(parent_id) {
  parent_id = parent_id || 'content'
  var inputs = $('#' + parent_id + ' input')
  //var obj = {}
  var str = ''
  for (var i=0; i<inputs.length-1; i++) {
    //obj[inputs[i].name] = inputs[i].value
    var input_type = inputs[i].type
    if (input_type === 'text') {
      // for inputs, escape for strings and parse int for numbers 
      if (inputs[i].name.indexOf('born_on') !== -1)
        var val = parseInt(inputs[i].value, 10)
      else
        var val = escape(inputs[i].value)
      str += '&' + inputs[i].name + '=' + val
    } else if (input_type === 'radio') {
      if (inputs[i].checked)
        str += '&' + inputs[i].name + '=' + inputs[i].value
    }
  }
  var selects = [reg.form.region, reg.form.question]
  for (var i=0; i<selects.length; i++) {
    var selected = selects[i].selectedIndex
    var value = escape(selects[i].options[selected].value)
    str += '&' + selects[i].name + '=' + value
  }
  if ((window['reg']) && (reg.form) && (reg.form.password))
    str += '&password=' + reg.form.password.value
  //alert(str)
  return str
}

//swaps day and month if eu_format is true

$(function() {
 var eu_format = true;
 var jpath = 'li.born div.col';
 var swap = function() {
      if (eu_format) {
        var col_jquery = $(jpath);
        var day_html = col_jquery.eq(1).html();
        col_jquery.eq(1).html( col_jquery.eq(0).html() );
        col_jquery.eq(0).html( day_html );
      }
   }
 swap()
})