//array for previous;y added values in the fields will be placed here
var prev_operations = [];

//extend Number
Number.prototype.toDecimals=function(n){
    if (this.toFixed) {
      return this.toFixed(n)
    }
    n=(isNaN(n))?
        2:
        n;
    var
        nT=Math.pow(10,n);
    function pad(s){
            s=s||'.';
            return (s.length>n)?
                s:
                pad(s+'0');
    }
    return (isNaN(this))?
        this:
        (new String(
            Math.round(this*nT)/nT
        )).replace(/(\.\d*)?$/,pad);
}

function calculate_workerTimeSheet(txt) {
  if (txt.value == '') {
    field = 0;
  } else {
    field = parseInt(txt.value);
  }

  var vars    = txt.id.split('_');
  //table num 1-10
  var tbl_num = parseInt((vars[0]).replace(/^worker/, ''));
  //field type
  var ftype   = vars[1];
  //section Reg, OT or DT
  var section = vars[2];

  //flag that defines whether the rates are changed or not
  var rates_changed = false;

  labor_cost = document.getElementById('work' + tbl_num + '_labercost_excl_hf');
  if (labor_cost.value == '') {
    labor_cost.value = '0.00';
  }

  if (section == 'reg') {
    //start calculations for Reg Hrs
    reg_hrs         = document.getElementById('worker' + tbl_num + '_ttl_reg_hrs');
    reg_hrs_rate    = document.getElementById('worker' + tbl_num + '_insertrate_reg_hrs');
    reg_hrs_subttl  = document.getElementById('worker' + tbl_num + '_subttl_reg_hrs');
    reg_hrs_pr      = document.getElementById('worker' + tbl_num + '_workcomp_reg_hrs');
    reg_hrs_linettl = document.getElementById('worker' + tbl_num + '_linettl_reg_hrs');

    if (reg_hrs.value == '') {
      reg_hrs.value = 0;
    }

    sum_hrs = 0;
    for (i=0;i<7 ; i++) {
      temp_value = document.getElementById('worker' + tbl_num + '_' + i +'_reg_hrs').value;
      if (temp_value) {
        sum_hrs = parseFloat(sum_hrs) + parseFloat(temp_value);
      }

    }

    reg_hrs.value = sum_hrs.toDecimals(0);

    if (!reg_hrs_rate.value) {
      //reg_hrs_rate.value = 0;
      rate = 0;
    } else {
      rate = reg_hrs_rate.value;
    }

    reg_hrs_subttl.value = (parseFloat(rate)*parseFloat(reg_hrs.value)).toDecimals(2);
    reg_hrs_pr.value = (parseFloat(reg_hrs_subttl.value)*0.2171).toDecimals(2);
    reg_hrs_linettl.value = (parseFloat(reg_hrs_subttl.value)*1.2171).toDecimals(2);

    //check if the rates are changed
    //this should recalculate rates for OT and DT
    //OT = Reg*1.5
    //DT = Reg*2
    if (ftype == 'insertrate') {
      var rates_changed = true;
      var ot_hrs_rate = document.getElementById('worker' + tbl_num + '_insertrate_ot_hrs');
      var dt_hrs_rate = document.getElementById('worker' + tbl_num + '_insertrate_dt_hrs');

      ot_hrs_rate.value = parseFloat(txt.value*1.5).toDecimals(2);
      dt_hrs_rate.value = parseFloat(txt.value*2).toDecimals(2);
    }
  }

  //if OT Hrs
  if (section == 'ot' || rates_changed) {
    //start calculations for OT Hrs
    ot_hrs         = document.getElementById('worker' + tbl_num + '_ttl_ot_hrs');
    ot_hrs_rate    = document.getElementById('worker' + tbl_num + '_insertrate_ot_hrs');
    ot_hrs_subttl  = document.getElementById('worker' + tbl_num + '_subttl_ot_hrs');
    ot_hrs_pr      = document.getElementById('worker' + tbl_num + '_workcomp_ot_hrs');
    ot_hrs_linettl = document.getElementById('worker' + tbl_num + '_linettl_ot_hrs');

    if (ot_hrs.value == '') {
      ot_hrs.value = 0;
    }

    sum_hrs = 0;
    for (i=0;i<7 ; i++) {
      temp_value = document.getElementById('worker' + tbl_num + '_' + i +'_ot_hrs').value;
      if (temp_value) {
        sum_hrs = parseFloat(sum_hrs) + parseFloat(temp_value);
      }

    }

    ot_hrs.value = sum_hrs.toDecimals(0);

    if (!ot_hrs_rate.value) {
      //ot_hrs_rate.value = 0;
      rate = 0;
    } else {
      rate = ot_hrs_rate.value;
    }

    ot_hrs_subttl.value = (parseFloat(rate)*parseFloat(ot_hrs.value)).toDecimals(2);
    ot_hrs_pr.value = (parseFloat(ot_hrs_subttl.value)*0.2171).toDecimals(2);
    ot_hrs_linettl.value = (parseFloat(ot_hrs_subttl.value)*1.2171).toDecimals(2);
  }

  //if DT Hrs
  if (section == 'dt' || rates_changed) {
    //start calculations for DT Hrs
    dt_hrs         = document.getElementById('worker' + tbl_num + '_ttl_dt_hrs');
    dt_hrs_rate    = document.getElementById('worker' + tbl_num + '_insertrate_dt_hrs');
    dt_hrs_subttl  = document.getElementById('worker' + tbl_num + '_subttl_dt_hrs');
    dt_hrs_pr      = document.getElementById('worker' + tbl_num + '_workcomp_dt_hrs');
    dt_hrs_linettl = document.getElementById('worker' + tbl_num + '_linettl_dt_hrs');

    if (dt_hrs.value == '') {
      dt_hrs.value = 0;
    }

    sum_hrs = 0;
    for (i=0;i<7 ; i++) {
      temp_value = document.getElementById('worker' + tbl_num + '_' + i +'_dt_hrs').value;
      if (temp_value) {
        sum_hrs = parseFloat(sum_hrs) + parseFloat(temp_value);
      }

    }

    dt_hrs.value = sum_hrs.toDecimals(0);

    if (!dt_hrs_rate.value) {
      //dt_hrs_rate.value = 0;
      rate = 0;
    } else {
      rate = dt_hrs_rate.value;
    }

    dt_hrs_subttl.value = (parseFloat(rate)*parseFloat(dt_hrs.value)).toDecimals(2);
    dt_hrs_pr.value = (parseFloat(dt_hrs_subttl.value)*0.2171).toDecimals(2);
    dt_hrs_linettl.value = (parseFloat(dt_hrs_subttl.value)*1.2171).toDecimals(2);
  }

  //if Flat Fee
  if (section == 'flatfee') {
    //start calculations for Flat Fee
    flatfee_ttl     = document.getElementById('worker' + tbl_num + '_ttl_flatfee');
    flatfee_subttl  = document.getElementById('worker' + tbl_num + '_subttl_flatfee');
    flatfee_pr      = document.getElementById('worker' + tbl_num + '_workcomp_flatfee');
    flatfee_linettl = document.getElementById('worker' + tbl_num + '_linettl_flatfee');

    //apply the new value to the total
    if (flatfee_ttl.value == '') {
      flatfee_ttl.value = 0;
    }

    sum_ff = 0;
    for (i=0;i<7 ; i++) {
      temp_value = document.getElementById('worker' + tbl_num + '_' + i +'_flatfee').value;
      if (temp_value) {
        sum_ff = parseFloat(sum_ff) + parseFloat(temp_value);
      }
    }

    flatfee_ttl.value     = sum_ff.toDecimals(2);
    flatfee_subttl.value  = sum_ff.toDecimals(2);
    flatfee_pr.value      = (parseFloat(sum_ff)*0.2171).toDecimals(2);
    flatfee_linettl.value = (parseFloat(flatfee_pr.value)+parseFloat(flatfee_subttl.value)).toDecimals(2);
  }


  //calculate laber cost
  reghrs_linettl  = document.getElementById('worker' + tbl_num + '_linettl_reg_hrs')
  othrs_linettl   = document.getElementById('worker' + tbl_num + '_linettl_ot_hrs')
  dthrs_linettl   = document.getElementById('worker' + tbl_num + '_linettl_dt_hrs')
  flatfee_linettl = document.getElementById('worker' + tbl_num + '_linettl_flatfee');

  reghrs_linettl_value  = (reghrs_linettl.value)  ? parseFloat(reghrs_linettl.value)  : 0;
  othrs_linettl_value   = (othrs_linettl.value)   ? parseFloat(othrs_linettl.value)   : 0;
  dthrs_linettl_value   = (dthrs_linettl.value)   ? parseFloat(dthrs_linettl.value)   : 0;
  flatfee_linettl_value = (flatfee_linettl.value) ? parseFloat(flatfee_linettl.value) : 0;

  labor_cost_value =  reghrs_linettl_value + 
                      othrs_linettl_value  + 
                      dthrs_linettl_value  + 
                      flatfee_linettl_value;

  labor_cost.value = (labor_cost_value) ? labor_cost_value.toDecimals(2) : '0.00';


  //calculate grand total of all worksheets
  grand_ttl = document.getElementById('grand_ttl');
  grand_ttl_value = 0;
  for (i=0; i<10 ; i++) {
    var current_worksheet_id = 'work' + i + '_labercost_excl_hf';
    var current_worksheet = document.getElementById(current_worksheet_id);

    if (current_worksheet && current_worksheet.value != '') {
      grand_ttl_value = grand_ttl_value + parseFloat(current_worksheet.value);
    }
  }

  grand_ttl.value = (parseFloat(grand_ttl_value)).toDecimals(2);
}





//global vars containing the field names
var err_index = [];
var required_fields = [];
var date_fields     = [];
var required_dates  = [];
var date_format     = 'MM/DD/YY';

/**
* validation of the form
*/
function validate() {
    required_fields = ['name', 'company', 'email', 'telephone','fax', 'jobname', 'po', 'approxworkdates'];
    date_fields     = [];
    required_dates  = [];
    //init the error array
    err_index = ['name', 'company', 'email', 'telephone','fax', 'jobname', 'po', 'approxworkdates', 'worker1_insertrate_reg_hrs', 'worker1_insertrate_ot_hrs', 'worker1_insertrate_dt_hrs', 'worker2_insertrate_reg_hrs', 'worker2_insertrate_ot_hrs', 'worker2_insertrate_dt_hrs', 'worker3_insertrate_reg_hrs', 'worker3_insertrate_ot_hrs', 'worker3_insertrate_dt_hrs', 'worker4_insertrate_reg_hrs', 'worker4_insertrate_ot_hrs', 'worker4_insertrate_dt_hrs', 'worker5_insertrate_reg_hrs', 'worker5_insertrate_ot_hrs', 'worker5_insertrate_dt_hrs', 'worker6_insertrate_reg_hrs', 'worker6_insertrate_ot_hrs', 'worker6_insertrate_dt_hrs', 'worker7_insertrate_reg_hrs', 'worker7_insertrate_ot_hrs', 'worker7_insertrate_dt_hrs', 'worker8_insertrate_reg_hrs', 'worker8_insertrate_ot_hrs', 'worker8_insertrate_dt_hrs', 'worker9_insertrate_reg_hrs', 'worker9_insertrate_ot_hrs', 'worker9_insertrate_dt_hrs', 'worker0_insertrate_reg_hrs', 'worker0_insertrate_ot_hrs', 'worker0_insertrate_dt_hrs'];

  return do_validate();
}



/**
* validation of the form
*/
function do_validate() {
  var valid  = true;
  var errors = [];
  //check for valid email
  var email = trim(document.getElementById('email').value);
  var label = document.getElementById('lbl_email');
  regex = /^[A-Za-z][-\.A-Za-z0-9_]+@[A-Za-z][-A-Za-z0-9_]+(\.[A-Za-z][-A-Za-z0-9_]+)+$/;
  var class_name = '';
  if (!email.match(regex, email)) {
    valid = false;
    class_name = 'error';
    errors['email'] = 'Please insert valid "Email"';
  }
  if (label) {
    label.className = class_name;
    //remove the asterisks at the end
    label.innerHTML = label.innerHTML.replace(/\**$/, '');
    if (class_name == 'error') {
      label.innerHTML += '*';
    }
  }

  //check required fields
  for (i=0; i<required_fields.length ;i++ ) {
    field_id = required_fields[i];
    var field = document.getElementById(field_id);
    var label = document.getElementById('lbl_' + field_id);
    var class_name = '';
    if (!trim(field.value)) {
      valid = false;
      class_name = 'error'
      errors[field_id] = 'Please insert "' + label.innerHTML.replace(/\**$/, '') + '"';
    }
    if (label) {
      label.className = class_name;
      //remove the asterisks at the end
      label.innerHTML = label.innerHTML.replace(/\**$/, '');
      if (class_name == 'error') {
        label.innerHTML += '*';
      }
    }
  }


  //check date fields
  for (i=0; i<date_fields.length ;i++ ) {
    field_id = date_fields[i];
    var field = document.getElementById(field_id);
    var label = document.getElementById('lbl_' + field_id);
    var class_name = '';
    if (field.value != date_format && !valid_date(field.value)) {
      valid = false;
      class_name = 'error'
      errors[field_id] = 'Please insert valid "' + label.innerHTML.replace(/\**$/, '') + '"' +
                         '<br />Format date exactly as shown';
    }
    if (label) {
      label.className = class_name;
      //remove the asterisks at the end
      label.innerHTML = label.innerHTML.replace(/\**$/, '');
      if (class_name == 'error') {
        label.innerHTML += '*';
      }
    }
  }

  //check required date fields
  for (i=0; i<required_dates.length ;i++ ) {
    field_id = required_dates[i];
    var field = document.getElementById(field_id);
    var label = document.getElementById('lbl_' + field_id);
    var class_name = '';
    if (!trim(field.value) || field.value == date_format || !valid_date(field.value)) {
      valid = false;
      class_name = 'error'
      errors[field_id] = 'Please insert valid "' + label.innerHTML.replace(/\**$/, '') + '"' +
                         '<br />Format date exactly as shown';
    }
    if (label) {
      label.className = class_name;
      //remove the asterisks at the end
      label.innerHTML = label.innerHTML.replace(/\**$/, '');
      if (class_name == 'error') {
        label.innerHTML += '*';
      }
    }
  }

  //validate timesheets

  for (i=0; i<=9; i++) {
    var timesheet_num = i;
    if (timesheet_num == 0) {
      timesheet_num = 10;
    }
    //Start check for Reg Hrs
    var class_name = 'sm';
    reg_hrs_total = parseFloat(document.getElementById('worker' + i + '_ttl_reg_hrs').value);
    ot_hrs_total  = parseFloat(document.getElementById('worker' + i + '_ttl_ot_hrs').value);
    dt_hrs_total  = parseFloat(document.getElementById('worker' + i + '_ttl_dt_hrs').value);

    reg_hrs_rate_element = document.getElementById('worker' + i + '_insertrate_reg_hrs')
    reg_hrs_rate = parseFloat(reg_hrs_rate_element.value);
    if (isNaN(reg_hrs_rate)) {
      reg_hrs_rate = 0;
    }

    //check if at least on of the hours SUBTOTALS is not empty
    if ((reg_hrs_total != 0 || ot_hrs_total != 0 || dt_hrs_total != 0) && reg_hrs_rate == 0) {
      valid = false;
      class_name += ' error';
      errors['worker' + i + '_insertrate_reg_hrs'] = 'Please insert Regular Hours Rate of Timesheet ' + timesheet_num;
    }

    reg_hrs_rate_element.className = class_name;

  }




  //display the errors
  var err = document.getElementById('errors');

  if (!valid) {
    //display the errors
    var err = document.getElementById('errors');
    var err_str = '';
    for (var idx in err_index) {
      var e = err_index[idx];
      if (errors[e]) {
        var lbl = document.getElementById('lbl_'+e);
        var title = 'Click to correct this error';
        if (lbl) {
          lbl_title = lbl.innerHTML.replace(/\**$/, '');
          title = 'Click to correct error in ' + lbl_title;
          title = title.replace(/ *<br ?\/?>\n*\ */, ' ');
        }
        err_str += '<li><a href="#" id="err_'+e+'" onclick="focusError(this); return false;" title="'+title+'">'+errors[e]+'</a></li>\n';
      }
    }
    err.style.display = 'block';
    err.innerHTML = '<ul>'+err_str+'</ul>';
    scroll(0,0);
    alert('There are errors. Please fill in all fields with a red asterisk.\nThe details are displayed at the top of the page.\nPlease click an error message to target and fix the error.');

  } else {
    err.style.display = 'none';
    //clear dates with default date format
    for (i=0; i<date_fields.length ;i++ ) {
      field_id = date_fields[i];
      var field = document.getElementById(field_id);
      if (field.value == date_format) {
        //clear the default format
        field.value = 'MM/DD/YY';
      }
    }

    return (confirm('Are you sure you want to submit this form?'));

  }

  return valid;
}

function focusError(err) {
  try { 
    eid = err.id.replace(/^err_/, '');
    document.getElementById(eid).focus();
  }
  catch (e) {}
}

/**
* Removes spaces from the beginning and the end ot the text. 
*/
function trim(text){
    // Removes spaces from the beginning of the text.
    var re = /^ /;
    while(re.test(text)){
        text = text.replace(re, "");
    }
    
    // Removes spaces from the end of the text.
    var re1 = / $/;
    while(re1.test(text)){
        text = text.replace(re1, "");
    }

    return text;
};

function removeLeadingZero(num) {
  num = parseInt(num.replace(/^0*/, ''));

  return num;
}
/**
* get fields value MM/DD/YYYY and splits it into three vars and 
*/
function valid_date(txt) {

  var vars = txt.split('/');

  //check for valid format MM/DD/YYYY
  if (vars.length != 3) {
    return false;
  }

  var month = removeLeadingZero(vars[0]);
  var day   = removeLeadingZero(vars[1]);
  var year  = parseInt('20' + vars[2]);


/*
  var month = (txt.substring(0,2));
  var day = (txt.substring(2,4));
  var year = ('20' + txt.substring(4,6));
*/


  if (txt.length != 8) {
      return false;
  }

  return isValidDate(month, day, year);
}

/**
* validates date
*/
function isValidDate(month, day, year) {
  //check if all the items have values
  if (!month || !day || !year) {
    return false;
  }

  //check the year
  if (year < 1000 || year > 9999) {
    return false;
  }
  //check if the year is leap
  var leap_year = false;
  if (year % 4 != 0) {
    leap_year = false;
  } else if (year % 400 == 0) {
    leap_year = true;
  } else if (year % 100 == 0) {
    leap_year = false;
  } else {
    leap_year = true;
  }

  //check the month
  if (month <= 0 || month > 12) {
    return false;
  }
  //get the max days for the month
  var max_days = 0;
  if((month == 4) || (month == 6) || (month == 9) || (month == 11)) {
    max_days = 30;
  } else if(month == 2) {
    //check for leap year
    max_days = leap_year ? 29 : 28;
  } else {
    max_days = 31;
  }

  //check the day
  if (day <= 0 || day > max_days) {
    return false;
  }

  return true;
}

//set the default value, which timesheet is next to be displayed
timesheet_number = 2;

function display_timesheet() {
  //which timesheet is next to be displayed
  //timesheet_number = parseInt(document.getElementById('timesheet_number').value);
  if (timesheet_number > 10) {
    timesheet_number = 2;
  }

  timesheet = document.getElementById('timesheet_' + timesheet_number);
  class_name = 'display_timesheet';
  timesheet.className = class_name;

  timesheet_number++;
  document.getElementById('timesheet_number').value = timesheet_number;
  if (timesheet_number > 10) {
    document.getElementById('add_timesheet_btn').className = "hide_add_btn";
    document.getElementById('add_timesheet_btn_txt').className = "hide_add_btn";
  }

}

/*Macromedia*/
function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

