var d4m_act   = 'd4m_act';
var d4m_arg   = 'd4m_arg';
var d4m_src   = 'd4m_src';
var d4m_cmb   = '_cmb';
var d4m_radio = '_r';
var d4m_rlb   = '_rlb'; // reodered list box
var d4m_cl    = '_cl'; // checkbox list

function list_val( ctrl ) {
  if( !ctrl || ctrl == null || !ctrl.options || ctrl.options == null || ctrl.selectedIndex < 0 )
    return null;
  return parseInt( ctrl.options[ ctrl.selectedIndex ].value );
} // list_val


function getform() {
var theform   = null;

  // check form exists
  if( null == theform ) {
    if( window.navigator.appName.toLowerCase().indexOf("netscape") > -1 )
      theform = document.forms[ 'main' ];
    else
      theform = document.main;

    if( ( !theform || theform == null ) && document.forms != null && document.forms.length > 0 )
      theform = document.forms[ 0 ];

  } // form exists?

  return theform;
} // getform

// Reordered list box - move items up / down
function rlb_move( list, to ) {
var list_str = '';
var items = new Array;
var values = new Array;
var index = list.selectedIndex;
var total = list.options.length-1;
var hdn;
var tmp;

  // All that stuff because of values of list box items not reordered only items text
  hdn = ___get_inp( list.id + d4m_rlb );

  if( hdn ) {
    tmp = hdn.value;
    values = tmp.split(",");
  } else
    return false;

  if (index == -1) return false;
  if (to == +1 && index == total) return false;
  if (to == -1 && index == 0) return false;

  for (i = 0; i <= total; i++) {
    items[i] = list.options[i].text;
    //values[i] = list.options[i].value;
  }

  for (i = total; i >= 0; i--) {
    if (index == i) {
      list.options[i + to] = new Option(items[i],values[i + to], 0, 1);
      list.options[i] = new Option(items[i + to], values[i]);
      i--;
    } else {
      list.options[i] = new Option(items[i], values[i]);
    }
  }

  for (i = 0; i <= total; i++) {

    if( ( to == -1 && index == i + 1 ) || ( to == 1 && index == i ) ) {
      list_str += values[i+1];
      list_str += ',';
      list_str += values[i];
      list_str += ',';
      i++;
    } else {
      list_str += values[i];
      list_str += ',';
    }
  }

  list_str = list_str.substring(0, list_str.length - 1 );
  hdn.value = list_str;

  list.focus();
} // rlb_move


function __4chk( src ) {
var theform   = null;
var chk_src = null;

  theform = getform();
  // Submit form
  if( null != src && '' != src ) {
    chk_src = ___get_inp( d4m_src );
    if( null != chk_src )
	    chk_src.value = src;
	}

  theform.submit();

  return;
} // __4chk

function __4chk_lbl( ctrl, is_submit, src ) {
// var ctrl;
var theform   = null;
var chk_src = null;

  if( !ctrl || ctrl == null )
    return null;

  ctrl.checked = !ctrl.checked;

  theform = getform();
  // Submit form
	if( true == is_submit ) {

    if( null != src && '' != src ) {
      cmb_src = ___get_inp( d4m_src );
	    if( null != cmb_src )
  	    cmb_src.value = src;
  	}

    theform.submit();
  }

  return null;

} // __4chk_lbl

function __4chk_list_lbl( hdn, ctrl, idx ) {

  if( !ctrl || ctrl == null )
    return false;

  ctrl.checked = !ctrl.checked;

  return __4chk_list( hdn, ctrl, idx );
}

function __4chk_list( hdn, ctrl, idx ) {
//var theform   = null;
//var chk_src = null;
var ids;
var a_ids = new Array();

  if( hdn )
    ids = hdn.value;
  else
    return false;

  if( !ctrl.checked ) {
    // remove id from ids
    a_ids = ids.split(",");
    ids = '';
    for (i = 0; i < a_ids.length; i++) {
      if( idx == a_ids[ i ] )
        continue;
      ids += a_ids[ i ] + ',';
    }

    if( ids.length > 0 )
      ids = ids.substring( 0, ids.length - 1 ); // cut last comma

  } else {
     if( ids.length > 0 )
      ids += ',' + idx;
     else
      ids += idx;
  }


  hdn.value = ids;

//  theform = getform();
  // Submit form
//  if( null != src && '' != src ) {
//    chk_src = ___get_inp( d4m_src );
//    if( null != chk_src )
//	    chk_src.value = src;
//	}

//  theform.submit();

  return;
} // __4chk_list

function __4cmb( cmb, is_submit, src ) {
var val;
var theform   = null;
var cmb_src = null;

  val = list_val( cmb );

  if( val != null ) {
    var hdn = ___get_inp( cmb.id + d4m_cmb );

    if( hdn )
      hdn.value = val;
  }

  theform = getform();
  // Submit form
	if( true == is_submit ) {

    if( null != src && '' != src ) {
      cmb_src = ___get_inp( d4m_src );
	    if( null != cmb_src )
  	    cmb_src.value = src;
  	}

    theform.submit();
    return;
  }

} // 4cmb

/* Radio list control + text box - functional "other" enter samething that not in list*/
function __4adv_radio( radio, is_submit, src, adv_txt, enable_txt ) {

  adv_txt.disabled = !enable_txt;
  __4radio( radio, is_submit, src );

} // __4adv_radio


/* Radio list control + text box - functional "other" enter samething that not in list*/
function __4adv_radio_lbl( ctrl, is_submit, src, adv_txt, enable_txt ) {

  adv_txt.disabled = !enable_txt;
  __4radio_lbl( ctrl, is_submit, src );

} // __4adv_radio_lbl

/* Radio list control */
function __4radio_lbl( ctrl, is_submit, src ) {
// var ctrl;
var theform   = null;
var radio_src = null;

  if( !ctrl || ctrl == null )
    return;

  ctrl.checked = true;

  val = ctrl.value;

  if( val != null ) {
    var hdn = ___get_inp( ctrl.name + d4m_radio );

    if( hdn )
      hdn.value = ctrl.value;
  }

  theform = getform();
  // Submit form
	if( true == is_submit ) {

    if( null != src && '' != src ) {
      radio_src = ___get_inp( d4m_src );
	    if( null != radio_src )
  	    radio_src.value = src;
  	}

    theform.submit();
    return;
  }

} // __4radio_lbl


function __4radio( radio, is_submit, src ) {
var val;
var theform   = null;
var radio_src = null;

  val = radio.value;
  if( val != null ) {
    var hdn = ___get_inp( radio.name + d4m_radio );
    if( hdn )
      hdn.value = val;
  } // if not null


  theform = getform();
  // Submit form
	if( true == is_submit ) {

    if( null != src && '' != src ) {
      radio_src = ___get_inp( d4m_src );
	    if( null != radio_src )
  	    radio_src.value = src;
  	}

    theform.submit();
    return;
  }


} // 4radio

/* / Radio list control */

/*
 * MS PostBack wrappers
 */

/*
 * Description: Lookup for input control by ID on current page
 * Returns:     true if form found; false otherwise.
 */
function ___get_inp( nm ) {
var ctrl, objs, i;

	objs = document.getElementsByTagName( 'input' );
	for( i = objs.length; --i >= 0 && ( ctrl = objs[ i ] ); )
		if( 'object' == typeof( ctrl ) && nm == ctrl.name )
			return ctrl;

  return null;
} // ___get_inp

/*
 * Description: Wrap around Microsoft ASP.NET postback problems:
 *              This method allows to get button Act and Arguments values
 *              on Init stage of Page processing.
 *
 * Arguments:
 * d4m_act       Name of hidden control for store Act value
 * d4m_arg       Name of hidden control for store Argument value
 * d4m_src       Name of hidden control for store Source value
 * et           Event Target (for standart PostBack)
 * ea           Event Argument (for standart PostBack)
 * act          Act value
 * arg          Argument value
 * src          Source value
 * tgt          URI of form for submit to, null for simple submit form
 * is_reset     Flag for reset ViewState value if Act not empty
 */
function __4pb( et, ea, act, arg, src, tgt, is_reset ) {
var is_submit = false;
var theform   = null;
var lbtn_act  = null, tmp = null;
var lbtn_arg  = null;
var lbtn_src  = null;

  // Always reset 'act' for get rid of 'Back' button problem
  tmp = ___get_inp( d4m_act );
  if( null != tmp )
    tmp.value = '';

  // check form exists
  if( null == theform ) {
    if( window.navigator.appName.toLowerCase().indexOf("netscape") > -1 )
      theform = document.forms[ 'main' ];
    else
      theform = document.main;

    if( ( !theform || theform == null ) && document.forms != null && document.forms.length > 0 )
      theform = document.forms[ 0 ];

    if( theform == null ) {
      // let ASP.NET handle this :)
      if( 'function' == typeof( __doPostBack ) )
        __doPostBack( et, ea );
      return;
    }
  } // form exists?

  if( null != act && '' != act ) {
    lbtn_act = ___get_inp( d4m_act );
    if(	null != lbtn_act ) {
	    lbtn_act.value = act;
	    if( 1 == is_reset && 'undefined' != typeof( theform.__VIEWSTATE ) && null != theform.__VIEWSTATE ) {
        theform.__VIEWSTATE.value = '';
        is_submit = true;
      } // if need reset ViewState
    } // if control for store Act exists
	} // if need send Act

  if( null != arg && '' != arg ) {
    lbtn_arg = ___get_inp( d4m_arg );
	  if( null != lbtn_arg )
	    lbtn_arg.value = arg;
	} // if need send Argument


  if( null != src && '' != src ) {
    lbtn_src = ___get_inp( d4m_src );
	  if( null != lbtn_src )
	    lbtn_src.value = src;
	} // if need send Source


  // Do 'onsubmit' stuff -- ASP.NET don't do this
  if( 'function' == typeof( theform.onsubmit ) && null != theform.onsubmit )
    theform.onsubmit();

  // Allow post to other URL
  if( tgt && null != tgt && '' != tgt ) {
    var bk_tgt = theform.action;
    theform.action = tgt;
    theform.submit();
    theform.action = bk_tgt;
    return;
	}

  // Submit form byself if ViewState was resetted
	if( true == is_submit ) {
    //alert( "SUBMIT\nact\t'" + lbtn_act.value + "'\narg\t'" + lbtn_arg.value + "'" );
    theform.submit();
    return;
  }

  // No special arguments, lets ASP.NET stuff works
  if( 'function' == typeof( __doPostBack ) )
    __doPostBack( et, ea );
} // __doPostBack_lbtn


// Backward-compatibility wrapper
function __doPostBackD4M( et, ea, act, arg, src, tgt, is_reset ) {
  __4pb( et, ea, act, arg, src, tgt, true );
} // __doPostBackD4M