/* DO NOT CHANGE ANYTHING BELLOW THIS LINE !!! */
var default_rates = {
  'depthead':    {'reg': depthead_rate_reg,      'ot': depthead_rate_reg*1.5, 
                  'dt' : depthead_rate_reg*2,    'mp': depthead_rate_reg}, 
  'multimedia':  {'reg': multimedia_rate_reg,    'ot': multimedia_rate_reg*1.5, 
                  'dt' : multimedia_rate_reg*2,  'mp': multimedia_rate_reg}, 
  'stagecrafts': {'reg': stagecrafts_rate_reg,   'ot': stagecrafts_rate_reg*1.5, 
                  'dt' : stagecrafts_rate_reg*2, 'mp': stagecrafts_rate_reg}, 
  'genavtech':   {'reg': genavtech_rate_reg,     'ot': genavtech_rate_reg*1.5, 
                  'dt' : genavtech_rate_reg*2,   'mp': genavtech_rate_reg}, 
  'crew':        {'reg': 0}
}
var rates = {
  'depthead':    {'reg': depthead_rate_reg,      'ot': depthead_rate_reg*1.5, 
                  'dt' : depthead_rate_reg*2,    'mp': depthead_rate_reg}, 
  'multimedia':  {'reg': multimedia_rate_reg,    'ot': multimedia_rate_reg*1.5, 
                  'dt' : multimedia_rate_reg*2,  'mp': multimedia_rate_reg}, 
  'stagecrafts': {'reg': stagecrafts_rate_reg,   'ot': stagecrafts_rate_reg*1.5, 
                  'dt' : stagecrafts_rate_reg*2, 'mp': stagecrafts_rate_reg}, 
  'genavtech':   {'reg': genavtech_rate_reg,     'ot': genavtech_rate_reg*1.5, 
                  'dt' : genavtech_rate_reg*2,   'mp': genavtech_rate_reg}, 
  'crew':        {'reg': 0}
}
var subtotals = {
  'depthead':    {'reg': 0, 'ot':  0, 'dt':  0, 'mp':  0},
  'multimedia':  {'reg': 0, 'ot':  0, 'dt':  0, 'mp':  0},
  'stagecrafts': {'reg': 0, 'ot':  0, 'dt':  0, 'mp':  0},
  'genavtech':   {'reg': 0, 'ot':  0, 'dt':  0, 'mp':  0},
  'crew':        {'reg': 0}
}
var sections = {
  'depthead':    {title: 'Department Head',          columns: {'reg': 'Reg', 'ot': 'OT', 'dt': 'DT', 'mp': 'M.P.'}}, 
  'multimedia':  {title: 'Multimedia Techs',         columns: {'reg': 'Reg', 'ot': 'OT', 'dt': 'DT', 'mp': 'M.P.'}}, 
  'stagecrafts': {title: 'Traditional Stage Crafts', columns: {'reg': 'Reg', 'ot': 'OT', 'dt': 'DT', 'mp': 'M.P.'}}, 
  'genavtech':   {title: 'General AV Techs',         columns: {'reg': 'Reg', 'ot': 'OT', 'dt': 'DT', 'mp': 'M.P.'}}, 
  'crew':        {title: 'Crew',                     columns: {'reg': 'Show Call'}}

}

//when loading page calculate the rates
function calculate_rates(type) {
  if (type) {
    calc_rates = {type: default_rates[type]};
  } else {
    calc_rates = default_rates;
  }

  //rtype rate type - dephead, multimedia, stagecrafts, gecavtech, crew
  //ctype column type - reg, ot, dt, mp
  for (var rtype in calc_rates) {
    for (var ctype in calc_rates[rtype]) {
      if (calc_rates[rtype][ctype]) {
        //calculate rates
        f_rate = document.getElementById(rtype + '_rate_' + ctype);
        if (calc_rates[rtype][ctype] && typeof calc_rates[rtype][ctype] == 'number') {
          f_rate.value = calc_rates[rtype][ctype].toDecimals(2);
        } else {
          f_rate.value = '';
        }

        //calculate hourly rates
        //Hour Rate Includes P/R Benefits is calculated as follows: 
        //$34.65 x 1.08=$37.42 
        //Then add H&W, Pension, P/R Tax and Work comp: 13%+6%+15%+6.71%=40.71% 
        //Then $37.42 x 1.4071=$52.65 
        //In a single equation: ($34.65 x 1.08) x 1.4071 = $52.65
        f_hrate = document.getElementById(rtype + '_hourly_rate_' + ctype);
        if (f_rate && f_hrate) {
          if (f_rate.value) {
            f_hrate_value = (parseFloat(f_rate.value) * 1.08) * 1.4071;
            f_hrate.value = f_hrate_value.toDecimals(2);
          } else {
            f_hrate.value = '';
          }
        }
      }
    }
  }
}

//when changing the rates recalculate the hourly rates
function recalculate_rates(field) {

  var vars = field.id.split('_');
  //rtype rate type - dephead, multimedia, stagecrafts, gecavtech, crew
  var rtype = vars[0];
  var base = field.value;


  //recalculate for the 
  for (var ctype in rates[rtype]) {
    //ctype column type - reg, ot, dt, mp
    var f_rate = document.getElementById(rtype + '_rate_' + ctype);
    switch(ctype) {
      case 'ot':
        f_rate.value = parseFloat(base*1.5).toDecimals(2)
        break;
      case 'dt':
        f_rate.value = parseFloat(base*2).toDecimals(2)
        rates[rtype][ctype] = f_rate.value;
        break;
      case 'mp':
        f_rate.value = parseFloat(base).toDecimals(2)
        rates[rtype][ctype] = f_rate.value;
        break;
    }

    //update global array
    rates[rtype][ctype] = f_rate.value;

    //calculate hourly rates
    //Hour Rate Includes P/R Benefits is calculated as follows: 
    //$34.65 x 1.08=$37.42 
    //Then add H&W, Pension, P/R Tax and Work comp: 13%+6%+15%+6.71%=40.71% 
    //Then $37.42 x 1.4071=$52.65 
    //In a single equation: ($34.65 x 1.08) x 1.4071 = $52.65
    var f_hrate = document.getElementById(rtype + '_hourly_rate_' + ctype);
    if (f_rate && f_hrate) {
      if (f_rate.value) {
        f_hrate_value = (parseFloat(f_rate.value) * 1.08) * 1.4071;
        f_hrate.value = f_hrate_value.toDecimals(2);
      } else {
        f_hrate.value = '';
      }
    }

    //recalculate the totals
    calculate_laberCost(f_rate);
  }

}

//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_laberCost(txt) {
  if (txt.value == '') {
    field = 0;
  } else {
    field = parseInt(txt.value);
  }

  var vars = txt.id.split('_');
  var column_type = vars[2];

  var tbl_type = vars[0];

  //start calculations
  lbrf_empl     = document.getElementById(tbl_type + '_empl_' + column_type);
  lbrf_hrate    = document.getElementById(tbl_type + '_hourly_rate_' + column_type);
  lbrf_ttl_hrs  = document.getElementById(tbl_type + '_ttl_hours_' + column_type);
  lbrf_ttl_cost = document.getElementById(tbl_type + '_ttl_cost_' + column_type);

  if (!lbrf_hrate.value) {
    calculate_rates(tbl_type);
  } else {
    hrate = lbrf_hrate.value;
  }

  if (!lbrf_empl) {
    //show call case, number of people is within the week days fields
    lbrf_empl_value = 1;
  } else if (lbrf_empl && lbrf_empl.value == '') {
    lbrf_empl_value = 0;
  } else {
    lbrf_empl_value = lbrf_empl.value;
  }

  //calculate the daily working hours total
  //the ids of the week days are containg digits
  //e.g. name="depthead_sun_reg" id="depthead_0_reg"
  sum_hrs = 0;
  for (i=0;i<7 ; i++) {
    temp_value = document.getElementById(tbl_type + '_' + i +'_' + column_type).value;
    if (temp_value) {
      sum_hrs = parseFloat(sum_hrs) + parseFloat(temp_value);
    }
  }

  //calculate working hours for the week
  lbrf_ttl_hrs.value = sum_hrs.toDecimals(0);

  //calculate subtotal
  subtotals[tbl_type][column_type] = parseFloat(lbrf_empl_value) * 
                                     parseFloat(lbrf_ttl_hrs.value) * 
                                     parseFloat(hrate);

  if (lbrf_ttl_cost && !isNaN(subtotals[tbl_type][column_type])) {
    lbrf_ttl_cost.value = subtotals[tbl_type][column_type].toDecimals(2);
  }


  //calculate labor cost total
  labor_cost = document.getElementById(tbl_type + '_ttl_cost');

  //for precision get the lement from the subtotals array
  //the values there are not rounded
  //however sometimes the browser cashes some form values, then take the rounded field.value
  ttl_cost_reg = document.getElementById(tbl_type + '_ttl_cost_reg');
  ttl_cost_ot  = document.getElementById(tbl_type + '_ttl_cost_ot');
  ttl_cost_dt  = document.getElementById(tbl_type + '_ttl_cost_dt');
  ttl_cost_mp  = document.getElementById(tbl_type + '_ttl_cost_mp');

  labor_cost_reg = (subtotals[tbl_type].reg > 0) ? 
                     subtotals[tbl_type].reg : (ttl_cost_reg) ?
                       ttl_cost_reg.value : 0;
  labor_cost_ot = (subtotals[tbl_type].ot > 0) ? 
                     subtotals[tbl_type].ot : (ttl_cost_ot) ?
                       ttl_cost_ot.value : 0;
  labor_cost_dt = (subtotals[tbl_type].dt > 0) ? 
                     subtotals[tbl_type].dt : (ttl_cost_dt) ?
                       ttl_cost_dt.value : 0;
  labor_cost_mp = (subtotals[tbl_type].mp > 0) ? 
                     subtotals[tbl_type].mp : (ttl_cost_mp) ?
                       ttl_cost_mp.value : 0;

  if (isNaN(parseFloat(labor_cost_reg))) {
    labor_cost_reg = 0;
  }
  if (isNaN(parseFloat(labor_cost_ot))) {
    labor_cost_ot = 0;
  }
  if (isNaN(parseFloat(labor_cost_dt))) {
    labor_cost_dt = 0;
  }
  if (isNaN(parseFloat(labor_cost_mp))) {
    labor_cost_mp = 0;
  }

  //accumulate the 4 values
  labor_cost_value = parseFloat(labor_cost_reg) + 
                     parseFloat(labor_cost_ot)  + 
                     parseFloat(labor_cost_dt)  + 
                     parseFloat(labor_cost_mp);

  labor_cost.value = 0.00;
  if (!isNaN(labor_cost_value)) {
    labor_cost.value = labor_cost_value.toDecimals(2);
  }

  //calculate labor cost GRAND total
  grand_ttl = document.getElementById('grand_ttl');

  //get all totals
  depthead_ttl    = document.getElementById('depthead_ttl_cost');
  multimedia_ttl  = document.getElementById('multimedia_ttl_cost');
  stagecrafts_ttl = document.getElementById('stagecrafts_ttl_cost');
  genavtech_ttl   = document.getElementById('genavtech_ttl_cost');
  crew_ttl        = document.getElementById('crew_ttl_cost');

  depthead_ttl_value    = (depthead_ttl.value)    ? parseFloat(depthead_ttl.value)    : 0;
  multimedia_ttl_value  = (multimedia_ttl.value)  ? parseFloat(multimedia_ttl.value)  : 0;
  stagecrafts_ttl_value = (stagecrafts_ttl.value) ? parseFloat(stagecrafts_ttl.value) : 0;
  genavtech_ttl_value   = (genavtech_ttl.value)   ? parseFloat(genavtech_ttl.value)   : 0;
  crew_ttl_value        = (crew_ttl.value)        ? parseFloat(crew_ttl.value)        : 0;

  grand_ttl_value = depthead_ttl_value +
                    multimedia_ttl_value +
                    stagecrafts_ttl_value +
                    genavtech_ttl_value +
                    crew_ttl_value;

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

}

//resets form
function resetForm(form) {
  form.reset();

  //clear subtotals
  for (var i in subtotals) {
    for (var j in subtotals[j]) {
      subtotals[i][j] = 0;
    }
  }

  calculate_rates();
}

//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', 
                       'approx_work_dates', 'work_location', 'local16_contact'];
    date_fields     = [];
    required_dates  = [];
    //init the error array
    err_index = ['name', 'company', 'email', 'telephone','fax', 'jobname', 
                 'approx_work_dates', 'work_location', 'local16_contact'];

    //add the tables employee elements (No of People)
    var idx = err_index.length;
    for (var tbl_type in sections) {
      section = sections[tbl_type];
      for (var column_type in section.columns) {
        err_index[idx] = tbl_type + '_empl_' + column_type;
        idx++;
      }
    }

  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 (field && !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 (var tbl_type in sections) {
    section = sections[tbl_type];
    for (var column_type in section.columns) {
      lbrf_empl      = document.getElementById(tbl_type + '_empl_' + column_type);
      lbrf_ttl_hours = document.getElementById(tbl_type + '_ttl_hours_' + column_type);

      if (lbrf_empl && lbrf_ttl_hours) {
        var class_name = 'sm';

        lbrf_ttl_hours_value = parseFloat(lbrf_ttl_hours.value);
        lbrf_empl_value = parseFloat(lbrf_empl.value);

        if (isNaN(lbrf_ttl_hours_value)) {
          lbrf_ttl_hours_value = 0;
        }
        if (isNaN(lbrf_empl_value)) {
          lbrf_empl_value = 0;
        }

        if (lbrf_ttl_hours_value != 0 && lbrf_empl_value == 0) {
          valid = false;
          class_name += ' error';
          errors[tbl_type + '_empl_' + column_type] = 'Please insert Number of People in "' + 
                                                        section.title + '" (' +
                                                        section.columns[column_type] + ')';
        }

        lbrf_empl.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";
  }

}

/*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];}
}
