// http://javascriptcompressor.com/

function isset( varname )
{
  return ( typeof(varname) != 'undefined' );
}

function getElement( elementId )
{
  return document.getElementById( elementId );
}

function zeroPad( n, totalDigits )
{ 
  n = n.toString();
  for( i = 0; n.length < totalDigits; i++)
    n = '0' + n; 

  return n; 
}

function handleError( elementId, label, errorObj )
{
  if( errorObj.code )
  {
    error_border( elementId, 1 );
    if( !errorObj.flag )
    {
      if( errorObj.code == 1 )
        errorObj.str = "Please enter a value for '" + label + "'.";
      else if( errorObj.code == 2 )
        errorObj.str = "The value for '" + label + "' is improperly formatted";
      else if( errorObj.code == 3 )
        errorObj.str = "Please select a value for '" + label + "'.";
      else if( errorObj.code == 4 )
        errorObj.str = "Please enter a valid date for '" + label + "'.";
      else if( errorObj.code == 5 )
        errorObj.str = "The value for '" + label + "' is out of range.";
      else if( errorObj.code == 6 )
        errorObj.str = "Sorry, that " + label + " is already in use. Please enter a different one.";
        
      //alert( errorObj.code + ' ' + elementId + ' ' + errorObj.str );
      
      getElement( elementId ).focus();
    }
    errorObj.flag = true;
  }
  else error_border( elementId, 0 );
}

// return codes - 
//   0: success
//   1: no data entered
//   2: improper format
//   4: invalid date
function validateDate( date_in, required, yearRequired, date_obj )
{
  // TODO: year required not implemented
  if( !date_in )
  {
    if( required )
      return 1;
    else
      return false;
  }
  
  var dateMatch = 2; // invalid format
  
  var date_regex = new Array( );
  date_regex[0] = /^(((19|20)?\d\d)[\-|* \/.])?(0?[1-9]|1[012])[\-|* \/.](0?[1-9]|[12][0-9]|3[01])$/;
  date_regex[1] = /^(0?[1-9]|1[012])[\-|* \/.](0?[1-9]|[12][0-9]|3[01])([\-|* \/.]((19|20)?\d\d))?$/;
  date_regex[2] = /^(0?[1-9]|[12][0-9]|3[01])[\-|* \/.](0?[1-9]|1[012])([\-|* \/.]((19|20)?\d\d))?$/;
  
  var date_get = new Array( );
  date_get[0] = function (bits) { return {"m":(bits[4] - 1), "d":bits[5]} };
  date_get[1] = function (bits) { return {"m":(bits[1] - 1), "d":bits[2]} };
  date_get[2] = function (bits) { return {"m":(bits[2] - 1), "d":bits[1]} };
  
  var date_handler = new Array( );
  date_handler[0] = function (bits, date_in) { date_in.setFullYear( bits[2], (bits[4] - 1), bits[5] ) };
  date_handler[1] = function (bits, date_in) { date_in.setFullYear( bits[4], (bits[1] - 1), bits[2] ) };
  date_handler[2] = function (bits, date_in) { date_in.setFullYear( bits[4], (bits[2] - 1), bits[1] ) };

  // loop through each regex
  for( var i = 0; ((i < 3) && dateMatch); i++ )
  {
    // check if the regex matched
    bits = date_regex[ i ].exec( date_in );
    if( bits )
    {
      // check if we have a valid date
      var c_1 = date_get[ i ]( bits );
      var c_2 = new Date ( );
      date_handler[ i ]( bits, c_2 );
      // only possible error at this point is that month has more days than allowed
      if( (c_2.getMonth() == c_1.m) && (c_2.getDate() == c_1.d) )
      {
        dateMatch = 0; // success
        //set the date in the object if one was passed in
        if( date_obj != undefined )
          date_handler[ i ]( bits, date_obj );
      }
      else
        dateMatch = 4; // invalid date
    }
  }

  return dateMatch;
}

// return codes - 
//   0: success
//   1: no data entered
//   2: improper format
function validateTime( timeVal, required, isDuration )
{
  var regex;
  
  if( !timeVal )
  {
    if( required )
      return 1;
    else
      return false;
  }
  
  if( isDuration && isDuration != "0" )
    regex = /^((\d{1,3})(:([0-5]\d))?((')|[':]([0-5]\d))?)?((")|[".](\d*))?$/;
  else
    regex = /^(([0-1])?\d|2[0-3])(:([0-5]\d))?(:([0-5]\d))? *(([aA]|[pP]).?[mM].?)?$/;
    
  if( regex.test( timeVal ) )
    return false;
  else
    return 2;
}

// return codes - 
//   0: success
//   1: no data entered
//   2: improper format
function validateNumber( numVal, required, unsigned, decimals, dec_point, thousands_sep )
{
  var neg='', extra='', regex='';
    
  if( !numVal )
  {
    if( required )
      return 1;
    else
      return false;
  }
  
  if( !unsigned || unsigned == "0" )
    neg = '-?';
  if( decimals && decimals != "0" )
    extra = '([' + dec_point + '][\\d]*){0,1}';
  if( thousands_sep && thousands_sep != "0" )
    regex = new RegExp( '^\\s*(' + neg + '(((\\d{1,2}[' + thousands_sep + '])?(\\d{3}[' + thousands_sep + '])*?(\\d{3}))|(\\d*?))' + extra +')\\s*$' );
  else
    regex = new RegExp( '^\\s*(' + neg + '(\\d*)' + extra + ')\\s*$' );
  
  if( regex.test( numVal ) )
    return false;
  else
    return 2;
}


// return codes - 
//   0: success
//   3: required value not selected
function validateEnum( enumVal )
{
  if( !enumVal || enumVal == "0" )
    return 3;
  return false;
}

// return codes - 
//   0: success
//   1: no data entered
function validateString( strVal )
{
  if( !strVal )
    return 1;
  return false;
}

function hide( divName )
{
  if( getElement( divName ) )
    getElement( divName ).style.display = "none";
}

function show( divName )
{
  if( getElement( divName ) )
    getElement( divName ).style.display = "block";
}

function hide_sys_msg( )
{
  if( getElement( 'sys_msg' ) )
    setTimeout( "hide('sys_msg');", 5000 );
}

function error_border( elementName, errorOn )
{
  myElement = getElement( elementName );
  if( myElement )
  {
    if( errorOn )
      myElement.style.borderColor = "#ff4040";
    else
      myElement.style.borderColor = "#b0b0b0";
  }
}


function show_popup ( id, reset_form )
{
  var top, left;

  show_popup_iframe( id, document.body, 49 );
  
  // if the frame does not exist, create it
  if( !document.getElementById( id + "_popup_frame" ) )
  {
    var popup_frame = document.createElement("div");
  
    popup_frame.innerHTML = '<table class="popup_frame"><tr><td colspan="3" class="popup_frame"></td></tr><tr><td class="popup_frame"></td>'+
              '<td class="popup_content" id="' + id + '_popup_content" >' +
              '</td><td class="popup_frame"></td></tr><tr><td colspan="3" class="popup_frame"></td></tr></table>';
    popup_frame.className = "popup";
    popup_frame.id = id + "_popup_frame";
    
    document.body.appendChild( popup_frame );

    var popup_content = document.getElementById( id + "_popup" );
    var content_area = document.getElementById( id + "_popup_content" );
    var old_content = popup_content.parentNode.removeChild( popup_content );
    content_area.appendChild( old_content );
    old_content.style.display = "block";

    top = (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop )+140+'px';
    left = (document.body.offsetWidth-old_content.offsetWidth)/2+'px';
    popup_frame.style.top = top;
    popup_frame.style.left = left;
  }
  
  // if the form is currently invisible, it is unlocked, so show it
  if( document.getElementById( id + "_popup_frame" ).style.display == "none" || document.getElementById( id ).style.display == "none" )
  {
    if( reset_form )
      eval( 'resetForm_' + id + '()' );
    show_popup_iframe( id, document.body, 49 );
    show( id + "_popup_frame" );
  }
  adjust_popup_iframe( id );
  document.getElementById( id ).elements[0].focus();
}

function show_popup_iframe( id, parent, zindex )
{
  if( document.body.insertAdjacentHTML )
  {
    if( !document.getElementById( id + "_popup_iframe" ) )
    {
      var ieMat = document.createElement("iframe");

      ieMat.src = "about:blank";
      ieMat.scrolling = "no";
      ieMat.frameborder = "0";
      ieMat.id = id + "_popup_iframe";
      ieMat.className = "popup_iframe";
      ieMat.style.filter = "progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0);";
      ieMat.style.zIndex = zindex;
      parent.appendChild( ieMat );
    }
    else
      show( id + "_popup_iframe" );
  }
}

function show_tooltip( id )
{ 
  show_popup_iframe( id, getElement( id + "_frame" ), 74 );
  show( id );
}

function hide_tooltip( id )
{
  hide( id );
  hide( id + "_popup_iframe" );
}

function hide_popup ( id )
{
  if( document.getElementById( id + "_popup_frame" ) )
    hide( id + "_popup_frame" );
  
  if( document.getElementById( id + "_popup_iframe" ) )
    hide( id + "_popup_iframe" );
}

function adjust_popup_iframe( id )
{
  var ieMat = getElement( id + "_popup_iframe" );
  if( ieMat )
  {
    var popup = getElement( id + "_popup_frame" );
  
    ieMat.style.top = popup.style.top;
    ieMat.style.left = popup.style.left;
    ieMat.style.width = popup.offsetWidth + "px";
    ieMat.style.height = popup.offsetHeight + "px";
  }
}


function handle_response_generic( id, resObj, hide_sys_msgs )
{
  var errorObj = { "str":"","code":0,"flag":false };
  
  // display returned html
  if( resObj.db && (resObj.html || resObj.action) )
  {
    var target = document.getElementById( resObj.target );
    // actions: 0=replace, 1=append, 2=delete, 3=delete and append, 4=delete and replace
    // do delete actions
    switch( resObj.action )
    {
      case( 4 ):
      case( 3 ):
        if( resObj.target2 )
        {
          var target2 = document.getElementById( resObj.target2 );
          if( target2 )
            target2.parentNode.removeChild( target2 );
        }
        break;
      case( 2 ):
        if( target )
          target.parentNode.removeChild( target );
        break;
    }
    // do append/replace actions
    if( target )
    {
      switch( resObj.action )
      {
        case( undefined ):
        case( 0 ):
        case( 4 ):
          target.innerHTML = resObj.html;
          break;
        case( 1 ):
        case( 3 ):        
          var newDiv = document.createElement("div");
          newDiv.innerHTML = resObj.html;
          target.appendChild( newDiv );
          break;          
      }
    }
  }
  // set values if get operation
  if( resObj.act == 1 )
  {
    //if( !resObj.db ) return;
    for( var i = 0; resObj.disp[i]; i++ )
    {
      var my_element = document.getElementById( id + resObj.disp[i][0] );
      if( my_element )
      {
        if( my_element.value != undefined )
          my_element.value = resObj.disp[i][1];
        else
          my_element.innerHTML = resObj.disp[i][1];
      }
    }
    if( getElement( id + '_popup' ) )
      show_popup( id );
    return;
  }
  // check for errors
  if( isset(resObj.err) )
  {
    for( var i = 0; resObj.err[i]; i++ )
    {
      errorObj.code = resObj.err[i][2];
      handleError( id + resObj.err[i][0], resObj.err[i][1], errorObj );
    }
  }
  
  if( !hide_sys_msgs )
  {
    hide( id + "_processing");
    if( errorObj.flag )
    {
      document.getElementById( id + "_error" ).innerHTML = errorObj.str;
      show( id + "_error" );
    }
    else if( !resObj.db )
    {
      document.getElementById( id + "_error" ).innerHTML = "There was a problem saving your entry to the database, please try again later.";
      show( id + "_error");
    }
    else
    {
      show( id + "_success" );
    }
  }
  return errorObj;
}

function confirmDelete( form_name, del_id )
{
  if( confirm( 'Do you really want to delete this?' ) )
  {
    document.getElementById( 'f_del_'+form_name+'_delete_id' ).value = del_id;
    document.getElementById( 'f_del_'+form_name ).submit();
  }
}

function getRadioValue( radioObj )
{
  for( var i = 0; i < radioObj.length; i++ )
    if( radioObj[i].checked )
      return radioObj[i].value;
  
  return false;
}



var timeoutDropdown;
var currentDropdown;

function hideDropdown( myObj )
{
  currentDropdown = myObj;
  timeoutDropdown = setTimeout( "hide( \'" + myObj + "\' );", 25 );
}

function refreshDropdown( myObj )
{
  if( timeoutDropdown )
    clearTimeout( timeoutDropdown );
  if( currentDropdown != myObj )
    hide( currentDropdown );
  
  show( myObj );
}

