/* Copyright (c) 2011 Allard Consulting. All Rights Reserved. */

/* Copyright (c) 2011 Allard Consulting. All Rights Reserved. 
*
* jQuery Validations
*/

function password_strength(password) {
  var result = true;
  if ("[a-zA-Z0-9]{6,}" !== "") {
    if (!password.match(/[a-zA-Z0-9]{6,}/)) {
      result = false;
    }
  } else {
    var points = 0;
    if (value.length > 5) { points++; }
    if (value.length > 7) { points++; }
    if (value.length > 10) { points++; }
    if (value.length > 14) { points++; }
    if ( ( value.match(/[a-z]/) ) && ( value.match(/[A-Z]/) ) ) { points++; }
    if (value.match(/\d+/)) { points++; }
    if (value.match(/.[!,@,#,$,%,&,*,?,_,~,-,(,)]/)) { points++; }

    if (value.length > 0 && points < 4) {
      result = false;
    }
  }
  return result;
}


jQuery.validator.addMethod("password", function( value, element ) {
  var result = true;
  if (value.length > 0) {
    if ("[a-zA-Z0-9]{6,}" !== "") {
      if (!value.match(/[a-zA-Z0-9]{6,}/)) {
        result = false;
      }
    } else {
      var points = 0;
      if (value.length > 5) points++;
      if (value.length > 7) points++;
      if (value.length > 10) points++;
      if (value.length > 14) points++;
      if ( ( value.match(/[a-z]/) ) && ( value.match(/[A-Z]/) ) ) points++;
      if (value.match(/\d+/)) points++;
      if (value.match(/.[!,@,#,$,%,^,&,*,?,_,~,-,(,)]/)) points++;
  
      if (value.length > 0 && points < 4) {
        result = false;
      }
    }
  }

  if (result) {
    var validator = this;
  }
  return result;
}, " Please select a stronger password");

jQuery.validator.addMethod("domains", function( value, element ) {
  var result = true;
  jQuery.each(value.split(/[,;\s]+/), function(i, val) {
    if (val && !val.match(/^(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,4})(\]?)$/i)) {
      result = false;
    }    
  });
  if (result) {
    var validator = this;
  }
  return result;
}, "At least one invalid domain");

jQuery.validator.addMethod("domain", function( value, element ) {
  var result = true;
  if (value && !value.match(/^(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,4})(\]?)$/i)) {
    result = false;
  }    
  if (result) {
    var validator = this;
  }
  return result;
}, " Invalid domain");

jQuery.validator.addMethod("hostname", function( value, element ) {
  var result = true;
  if (value && !value.match(/^(\[?)[a-zA-Z0-9\-\_]+$/i)) {
    result = false;
  }    
  if (result) {
    var validator = this;
  }
  return result;
}, " Invalid hostname");

jQuery.validator.addMethod("ip_address", function( value, element ) {
  var result = true;
  if (value && !value.match(/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/)) {
    result = false;
  }    
  if (result) {
    var validator = this;
  }
  return result;
}, " Invalid ip address");

jQuery.validator.addMethod("ipv6_address", function( value, element ) {
  var result = true;
  if (value && !value.match(/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/)) {
    result = false;
  }    
  if (result) {
    var validator = this;
  }
  return result;
}, " Invalid ip address");

jQuery.validator.addMethod("netmask", function( value, element ) {
  var result = true;
  if (value && !value.match(/^(?:\d{1,3}\.){3}\d{1,3}$/)) {
    result = false;
  }    
  if (result) {
    var validator = this;
  }
  return result;
}, " Invalid netmask");

jQuery.validator.addMethod("posint", function( value, element ) {
  var result = true;
  if (value && !value.match(/^[1-9]\d*$/)) {
    result = false;
  }    
  if (result) {
    var validator = this;
  }
  return result;
}, " Invalid number");


jQuery.validator.addMethod("less_than_hundred", function( value, element ) {
  var result = true;
  if (value && !value.match(/^\d{1,2}$/)) {
    result = false;
  }    
  if (result) {
    var validator = this;
  }
  return result;
}, "Invalid number");

jQuery.validator.addMethod("no_script_tag", function( value, element ) {
  var result = true;
  if (value && value.match(/\<(script|iframe)/)) {
    result = false;
  }    
  if (result) {
    var validator = this;
  }
  return result;
}, "script tag not allowed");

$.validator.addMethod("emails", function( value, element ) {
  var result = true;
  $.each(value.split(/[,;\s]+/), function(i, val) {
    if (val && !val.match(/^\S+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,4})(\]?)$/i)) {
      result = false;
    }    
  });
  if (result) {
    var validator = this;
  }
  return result;
}, "<p style='text-align: right;'>At least one invalid email address</p>");


$(function() {
// This caused the timezone select to fail
//  jQuery.ajaxSetup({ 'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")} });

  function preload(arrayOfImages) {
    $(arrayOfImages).each(function(){
      $('<img/>')[0].src = this;
    });
  }

  preload([
    '/images/jquery/aristo/progress_bar.gif',
    '/images/jquery/aristo/ui-icons_222222_256x240.png',
    '/images/jquery/aristo/ui-icons_454545_256x240.png',
    '/images/jquery/aristo/icon_sprite.png',
    '/images/jquery/aristo/slider_handles.png',
    '/images/jquery/aristo/bg_fallback.png'
  ]);

  $(':submit').button();
  $('.link_button').button();
  $('.validate_form').validate();

  $(".enable_tooltip").tooltip({ effect: 'fade', opacity: 0.9, offset: [-10, 0] });


  $.datepicker.setDefaults({
    dateFormat: "mm/dd/yy",
    monthNamesShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
    monthNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
    dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
    dayNamesShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
    dayNamesMin: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
    prevText: "Previous",
    nextText: "Next",
    closeText: "Close"
  });

  $('.upload_form').uploadProgress({
    /* scripts locations for safari */
    jqueryPath: "/javascripts/jquery/jquery-1.4.4.min.js",
    uploadProgressPath: "/javascripts/jquery/jquery.upload_progress.js",
    start:function() {
      if ($('.validate_form').valid()) {
        $('#progress').dialog({
          closeOnEscape: true,
          modal: true,
          draggable: false,
          width: 550,
          height: 220,
          resizable: false,
          beforeclose: function () {
            location.reload(true);
          },
          buttons: [{
            text: "Abort Transfer",
            click: function() { $(this).dialog("Close"); }
          }]
        });
        $('#progressbar').progressbar({ value: 0 });
        startTime = new Date().getTime();
      }
    },
    uploading: function(upload) {
      if (upload.size > max_file_size) {
        alert("File(s) too big");
        location.reload(true);
      }
      var now = new Date().getTime();
      upload.percents = Math.floor((upload.received / upload.size)*1000)/10;
      progress_time = ((now - startTime) / 1000);
      MBs = ((upload.received/1048576) / progress_time).toFixed(2);
      upload.remaining = (upload.size - upload.received) / 1048576;
      time_left = Math.floor(upload.remaining / MBs);
      $("#progressbar").progressbar('value', upload.percents );
      $('#percents').html(Math.floor(upload.received/1048576) + 'M / ' + Math.floor(upload.size/1048576) + 'M (' + upload.percents+'%)');
      $('#speed').html(upload_speed(upload.received, progress_time));
      $('#remaining').html(TimeCounter(time_left));
    },
    interval: 1000
  });

});

function toggle_disabled(domId) {
  if ($(domId).attr("disabled") == false) {
    $(domId).attr("disabled", true);
    $(domId).val('');
  } else {
    $(domId).removeAttr("disabled");
  }
}

function toggle_disabled_and_background(domId) {
  if ($(domId).attr("disabled") == false) {
    $(domId).attr("disabled", true);
    $(domId).val('');
    $(domId).css('background-color', '#ccc');
  } else {
    $(domId).removeAttr("disabled");
    $(domId).css('background-color', '#fff');
  }
}

function show_spinner(domId) {
  var spinner = document.createElement('img');
  spinner.src = "/images/spinner.gif";
  $(domId).innerHTML = '';
  $(domId).html("<img src='/images/spinner.gif' />");
}

function show_red_bullet(domId) {
  var bullet = document.createElement('img');
  bullet.src = "/images/bullet_green.png";
  $(domId).innerHTML = '';
  $(domId).appendChild(bullet);
}

function TimeCounter(seconds){
  var t = parseInt(seconds);
  var days = parseInt(t/86400);
  t = t-(days*86400);
  var hours = parseInt(t/3600);
  t = t-(hours*3600);
  var minutes = parseInt(t/60);
  t = t-(minutes*60);
  var content = "";
  if(days)content+=days+" days";
  if(hours||days){ if(content)content+=", "; content+=hours+" hours"; }
  if(content)content+=", "; content+=minutes+" min "+t+" s";
  return content;
}

function upload_speed(received, time) {
  var speed = (received / time);
  if (speed > 1048576) {
    return (speed / 1048576).toFixed(2) + " MB/s";
  } else if (speed > 1024) {
    return (speed / 1024).toFixed(2) + " KB/s";
  } else {
    return speed.toFixed(2) + " B/s";
  }
}


