IkariamCRFormatter = {
	colorize:true,
	format:'bbcode',
	get:function() {
		return IkariamCRFormatter.Formats[IkariamCRFormatter.format];
	},
	init:function(format, colors, tags, colorize) 
	{
		if (colorize != null) {
			IkariamCRFormatter.colorize = colorize;
		}
		if (format != null) {
			IkariamCRFormatter.format = format;
		}

		colors = colors != null ? colors : IkariamCRFormatter.Defaults.Colors;
		for (var c in colors) {
			IkariamCRFormatter.Colors[c] = IkariamCRFormatter.Defaults.Colors[c]
		}

		tags = tags != null ? tags : IkariamCRFormatter.Defaults.Formats;
		for (var f in IkariamCRFormatter.Defaults.Formats) {
			if (IkariamCRFormatter.Formats[f] == null) IkariamCRFormatter.Formats[f] = {};
			for (var t in IkariamCRFormatter.Defaults.Formats[f]) {
				IkariamCRFormatter.Formats[f][t] = IkariamCRFormatter.Defaults.Formats[f][t];
			}
		}
	},
	defaultColors:function() 
	{
		IkariamCRFormatter.Colors = {};
		for (var c in IkariamCRFormatter.Defaults.Colors) {
			IkariamCRFormatter.Colors[c] = IkariamCRFormatter.Defaults.Colors[c]
		}
	},
	defaultFormat:function(format) {
		if (format != null) {
			IkariamCRFormatter.Formats[format] = {};
			for (var t in IkariamCRFormatter.Defaults.Formats[format]) {
				IkariamCRFormatter.Formats[format][t] = IkariamCRFormatter.Defaults.Formats[format][t];
			}
		}
		else {
			for (var f in IkariamCRFormatter.Defaults.Formats) {
				IkariamCRFormatter.Formats[f] = {};
				for (var t in IkariamCRFormatter.Defaults.Formats[f]) {
					IkariamCRFormatter.Formats[f][t] = IkariamCRFormatter.Defaults.Formats[f][t];
				}
			}
		}
	},
	updateTag:function(tag, value) {
		IkariamCRFormatter.get()[tag] = value;
	},
	Colors: {
	},
	Formats: {
	},
	Defaults: {
		Colors: {
			"scene"     : '0000CC',
			"attacking" : 'C00000',
			"defending" : '00CC00',
			"left"      : '000000',
			"lost"      : 'FF0000',
			"victor"    : '0000CC',
			"results"   : '444444'
		},
		Formats: {
			"ajaxchat" : { 
				open	: '[', 		close	: ']', 			separator	: '─', 
				center	: '{TEXT}',
				color	: '[color={COLOR}]{TEXT}[/color]', 	
				bold	: '{TEXT}', 
				font	: '[code]{TEXT}[/code]', 
				link	: '[url={LINK}]{TEXT}[/url]',
		 		image	: '[img]{IMAGE}[/img]', 
				size 	: '{TEXT}' 
			},
			"bbcode"  : {  
				open	: '[', 		close	: ']', 			separator	: '─', 
				center	: '[align=center]{TEXT}[/align]',
				color	: '[color=#{COLOR}]{TEXT}[/color]', 
				bold	: '[b]{TEXT}[/b]', 
				font	: '[font={FONT}]{TEXT}[/font]', 
				link	: '[url={LINK}]{TEXT}[/url]', 
				image	: '[img]{IMAGE}[/img]', 
				size	: '{TEXT}' 
			},
			"circular" : { 
				open	: '&lt;',	close 	: '&gt;',		separator	: '─', 
				center	: '&lt;div style="text-align: center"&gt;{TEXT}&lt;/div&gt;', 
				color	: '&lt;span style="color: #{COLOR}"&gt;{TEXT}&lt;/span&gt;', 
				bold	: '&lt;b&gt;{TEXT}&lt;/b&gt;', 
				font	: '&lt;span style="font-family: {FONT}"&gt;{TEXT}&lt;/span&gt;', 
				link	: '&lt;a href="{LINK}"&gt;{TEXT}&lt;/a&gt;', 
				image	: '&lt;img src={IMAGE} /&gt;', 
				size	: '{TEXT}' 
			},
			"plaintext" : {  
				open	: '[', 		close	: ']', 			separator	: '-', 
				center	: '{TEXT}', 
				color	: '{TEXT}', 
				bold	: '{TEXT}', 
				font	: '{TEXT}', 
				link	: '{TEXT}: {LINK} ', 
				image	: '', 
				size	: '{TEXT}' 
			}
		}
	},
	AddAlignment:function(text)  { 
		return IkariamCRFormatter.get().center.replace(/{TEXT}/g, text); 
	},
	AddColor:function(text, color) { 
		if (IkariamCRFormatter.colorize && color != '') 
			return IkariamCRFormatter.get().color.replace(/{COLOR}/g, color).replace(/{TEXT}/g, text); 
		return text; 
	},
	AddBold:function(text) { 
		return IkariamCRFormatter.get().bold.replace(/{TEXT}/g, text); 
	},
	AddFont:function(text, font) { 
		return IkariamCRFormatter.get().font.replace(/{FONT}/g, font).replace(/{TEXT}/g, text); 
	},
	AddLink:function(text, link) { 
		return IkariamCRFormatter.get().link.replace(/{LINK}/g, link).replace(/{TEXT}/g, text); 
	},
	AddImage:function(image) { 
		return IkariamCRFormatter.get().image.replace(/{IMAGE}/g, image); 
	},
	AddSize:function(text, size) { 
		return IkariamCRFormatter.get().size.replace(/{SIZE}/g, size).replace(/{TEXT}/g, text); 
	},
	AddSeparator:function(count) {
		var text = "";
		for (var c = 0; c < count; c++)
			text += IkariamCRFormatter.get().separator;
		return text;
	},
	PadString:function(dir, str, len, c, color) {
		str += "";
		var pad = '';
		var numChars = 0;
		var count = true;
		for(i = 0; i < str.length; i++) 
		{
			if (str.substr(i, IkariamCRFormatter.get().open.length) == IkariamCRFormatter.get().open )   
			{ 
				count = false; 
				i += IkariamCRFormatter.get().open.length - 1; 
			}
			if (count == true) numChars++;
			if (str.substr(i, IkariamCRFormatter.get().close.length) == IkariamCRFormatter.get().close ) 
			{ 
				count = true;  
				i += IkariamCRFormatter.get().close.length - 1; 
			}
		}
		for(i = 0; i < len - numChars; i++) 
		{ 
			pad += c; 
		}
		if (str != '') str = IkariamCRFormatter.AddColor(str, color);
		return (dir == "left") ? pad + str : str + pad;
	},
	ReplaceColors:function(report) { 
		if (this.format == "ajaxchat") {
			report = report.replace(/UNITLOST/g,  'red');
			report = report.replace(/ATTACKING/g, 'red');
			report = report.replace(/DEFENDING/g, 'green');
		}
		else {
			report = report.replace(/UNITLEFT/g,  IkariamCRFormatter.Colors["left"]);
			report = report.replace(/UNITLOST/g,  IkariamCRFormatter.Colors["lost"]);
			report = report.replace(/ATTACKING/g, IkariamCRFormatter.Colors["attacking"]);
			report = report.replace(/DEFENDING/g, IkariamCRFormatter.Colors["defending"]);
			report = report.replace(/HEADER/g,    IkariamCRFormatter.Colors["scene"]);
			report = report.replace(/VICTOR/g,    IkariamCRFormatter.Colors["victor"]);
			report = report.replace(/RESULTS/g,   IkariamCRFormatter.Colors["results"]);
		}
		return report;
	}

}
