/**
 * This is a folder inherit, for putting documents, leaflets, etc. in.
 * The two things you need to set when creating a folder, are the the
 * maximum weight of a single paper that fits in the folder (so we can't
 * put huge papers in small folders that are supposed to only fit heaps
 * of small ones), and the total number of sheets of that maximum size
 * that should fit in the folder.
 *
 * NOTE: If the size is more than 1, then the folder will fit double the
 * amount of papers that are half or less the maximum sheet size.
 *
 * @author Mahray 20/04/02
 * @changed Changed it to work with other documents as well -
 * Sandoz, 10. Sept. 2002.
 *
 * @example
 *     setup_folder( 1, 20 ); // Max size 1, total number 20.
 */
inherit BAGGAGE_OBJ;
int sheets, sheet_size;
/** @ignore yes */
void create() {
    do_setup++;
    baggage::create();
    do_setup--;
    sheets = 10;
    sheet_size = 1;
    set_unlockable( 1 );
    add_extra_look(TO);
    if( !do_setup )
        TO->setup();
} /* create() */
/**
 * This method sets the number of documents this folder can hold,
 * and the maximum sheet size.  Be reasonable.  The maximum number
 * is capped at 100, and the maximum size is capped at 3, no paper
 * should weight more than that.
 * @param size the maximum size of a sheet the folder can hold
 * @param number the amount of documents the folder can hold
 * @see query_sheet_size()
 * @see query_no_sheets()
 */
void setup_folder( int size, int number ) {
    if( number > 100 )
        number = 100;
    if( size > 3 )
        size = 3;
    sheets = number;
    sheet_size = size;
    set_max_weight( number * size );
} /* setup_folder() */
/**
 * This method returns the maximum sheet size this folder can hold.
 * @return the maximum sheet size we can hold
 * @see setup_folder()
 * @see query_no_sheets()
 */
int query_sheet_size() { return sheet_size; }
/**
 * This method returns the number of sheets this folder can hold.
 * @return the number of sheets we can hold
 * @see setup_folder()
 * @see query_sheet_size()
 */
int query_no_sheets() { return sheets; }
/** @ignore yes */
int test_add( object ob, int i ) {
    int ret;
    if( i )
        return 0;
    if( !ENV( ob ) )
        return ::test_add( ob, i );
    if( !ob->query_paper() && !ob->query_leaflet() ) {
        write( ob->the_short()+" "+verbalize("don't", "doesn't")+" appear to "
            "be of the right shape to fit in "+the_short()+".\n");
        return 0;
    }
    if( ob->query_weight() > sheet_size || sizeof(INV(TO)) > 2 * sheets ||
        !( ret = ::test_add( ob, i ) ) ) {
        write( ob->the_short()+" "+verbalize("don't", "doesn't")+" fit very "
            "well in "+the_short()+".\n");
        return 0;
    }
    return ret;
} /* test_add() */
/** @ignore yes */
mapping int_query_static_auto_load() {
    return ([
        "::" : ::int_query_static_auto_load(),
        "sheets" : sheets,
        "sheet size" : sheet_size,
    ]);
} /* int_query_static_auto_load() */
/** @ignore yes */
void init_static_arg( mapping m ) {
    if( mapp( m ) ) {
        if( m["::"] )
            ::init_static_arg( m["::"] );
        if( m["sheets"] )
            sheets = m["sheets"];
        if( m["sheet size"] )
            sheet_size = m["sheet size"];
        set_max_weight( sheets * sheet_size );
    }
} /* init_static_arg() */
/** @ignore yes */
mapping query_static_auto_load() {
    if( query_name() && query_name() != "object" &&
        base_name(TO)+".c" == __FILE__ )
        return int_query_static_auto_load();
    return 0;
} /* query_static_auto_load() */
/** @ignore yes */
string extra_look( object ob ) {
    string size;
    if( ob != TO || !sheets )
        return "";
    switch( sheet_size ) {
      case 1:
        size = "medium-sized";
      break;
      case 2:
        size = "large";
      break;
      case 3:
        size = "huge";
      break;
      default:
        size = "extremely buggy";
    }
    return "It can hold about "+query_num(sheets)+" "+size+" sheet"+
        ( sheets > 1 ? "s" : "")+" of paper.\n";
} /* extra_look() */
/** @ignore yes */
mixed stats() {
    return ::stats() + ({
        ({"sheets", sheets }),
        ({"sheet size", sheet_size }),
    });
} /* stats() */