#import "NGSElement.h"

@implementation Element

- (id)initWithType:(NSString *)typeValue andLabel:(NSString *)labelValue
{
	// sets values directly for speed reasons (less messaging overhead)
	self = [super init];
	type = [typeValue copy];
	label = [labelValue copy];
	return self;
}

+ (id)elementOfType:(NSString *)typeValue withLabel:(NSString *)labelValue
{
	Element *element = [[Element allocWithZone:[self zone]] initWithType:typeValue andLabel:labelValue];
	return [element autorelease];
}

- (id)copy
{
	Element *element = [[Element alloc] initWithType:type andLabel:label];
	// bug: copy other stuff here
	return element;
}

/* ACCESSORS */

- (NSString *)label
{
	return label;
}

- (NSString *)type
{
	return type;
}

- (unsigned long)typeAsLong
{
	return *(unsigned long *)[type cString];
}
/*
- (NSMutableArray *)subelements;
{
	long myType = [self typeAsLong];
	if( myType == 'LSTB' || myType == 'LSTC' )
	{
		if( subelements == nil )
			subelements = [[NSMutableArray alloc] init];
	}
	else subelements = nil;
	return subelements;
}
*/
/* DATA ACCESSORS */

- (NSString *)string
{
	return elementData.string;
}

- (void)setString:(NSString *)string
{
	elementData.string = [string retain];
}

- (NSNumber *)number
{
	return elementData.number;
}

- (void)setNumber:(NSNumber *)number
{
	elementData.number = [number retain];
}

- (long)numberAsLong
{
	return [elementData.number longValue];
}

- (void)setNumberWithLong:(long)number
{
	elementData.number = [[NSNumber numberWithLong:number] retain];
}

- (NSData *)data
{
	return elementData.data;
}

- (void)setData:(NSData *)data
{
	elementData.data = [data retain];
}

- (BOOL)boolean
{
	return elementData.boolean;
}

- (void)setBoolean:(BOOL)boolean
{
	elementData.boolean = boolean;
}

- (NSString *)description
{
	return [NSString stringWithFormat:@"{ %@, %@ }", type, label];
}

@end
