(function(){

var imgurl = 'images/';
var sndurl = 'sounds/';


//LOCAL DATE FORMAT
if (navigator)
	var language = (navigator.language||navigator.userLanguage||navigator.systemLanguage||'en-us');
else
	var language = 'en-us';
var dateformat;
language = language.toLowerCase();
switch (language) {
	case 'pt-br': boolformat = ['Não','Sim'];dateformat = '$3/$2/$1';break;
	default: dateformat = '$2/$3/$1'; //USA
}
var datetimeformat = dateformat+' $4:$5:$6';

var audiosupport = !!document.createElement('audio').canPlayType;
try {
	var a = new Audio("");
}
catch(e) {
	audiosupport = false;
}

if (audiosupport) {
	//window.status = 'Sound OK.';
}
else {
	//window.status = 'Your browser doesn\'t support sound. Use Firefox, Chrome or Safari to enable sound.';
	function Audio(filename) {
		var self = this;
		var f = filename;
		this.play = function() {
			playAudio(f);
		}
		this.canPlayType = function(type) {
			return (type=='audio/mpeg');
		}
		this.addEventListener = function() {}
		this.setAttribute = function() {}
	}
}


function Action (pattern,func) {
	this.pattern = pattern;
	this.func = func;
}
function sortLocale(a,b) {
	var pieces1 = a.split('=');
	var pieces2 = b.split('=');
	a = pieces1[0];
	b = pieces2[0];
	if (a.length > b.length || pieces1[1].indexOf('$') > -1) return -1;
	if (a.length < b.length || pieces2[1].indexOf('$') > -1) return 1;
	if (a.length == b.length) return 0;
}

function formatFieldName(str) {
	var tokens = str.split('_');
	for (var i in tokens) {
		tokens[i] = tokens[i].charAt(0).toUpperCase()+tokens[i].substr(1);
	}
	return tokens.join(' ');
}

function objectToString(obj,formats) {
	var arr = [];
	var contents ='';
	var prefix = '';
	if (!formats) formats ={};
	for (var i in obj) {
		if (obj[i] == '' || typeof obj[i] == 'function' || formats[i] == 'hidden') continue;
		prefix = formatFieldName(i)+': ';
		if (formats[i] == 'bool')
			contents = ((obj[i] == '0')?'No':'Yes');
		else if (formats[i] == 'gender')
			contents = ((obj[i] == 'M')?'Male':'Female');
		else if (typeof obj[i] == 'object' && obj[i].src)
			contents = '<br /><img alt="'+i+'" src="'+obj[i].src+'" />';
		else
			contents = obj[i];
		arr[arr.length] = prefix+contents;
	}
	return NetFighters.translate(arr.join('<br />'));
}

function createFields(obj,fields,args,formats,template) {
	if (args.length == 1 && args[0].length)
		args = args[0];
	for (var i = 0; i< args.length; ++i) {
		if (!fields[i] || i == '_SKIP_') continue;
		if ((!formats || !formats[fields[i]] || formats[fields[i]] == 'image') && args[i].match(/[a-z0-9_]+\.(gif|jpg|png|bmp|jpeg)$/i)) {
			var img = new Image();
			if (args[i].substr(0,7) != 'http://')
				img.src = imgurl+args[i];
			else
				img.src = args[i];
			args[i] = img;
		}
		else if (formats && formats[fields[i]] && (formats[fields[i]] == 'audio') && args[i].match(/[a-z0-9_]+\.(mp3|ogg|wav)$/i)) {
			var audio;
			try {
				if (args[i].substr(0,7) != 'http://')
					audio = new Audio(sndurl+args[i]);
				else
					audio = new Audio(args[i]);
				//alert('::'+audio.src);
			}
			catch (e) {}
			args[i] = audio;
			//alert(fields[i]);
		}
		obj[fields[i]] = args[i];
	}
	obj.toString = function() {
		if (template && NetFighters.templates[template])
			return NetFighters.processTemplate(template,obj,formats);
		else
			return objectToString(obj,formats);
	};
}

function matchesToArray(matches) {
	return matches[1].split(';');
}

function matchesToUser(matches) {
	var m = matches[1].split(';');
	return new User(m);
}

function matchesToChar(matches) {
	var m = matches[1].split(';');
	return new Character(m);
}
function matchesToArena(matches) {
	var m = matches[1].split(';');
	return new Arena(m);
}
function matchesToTech(matches) {
	var m = matches[1].split(';');
	return new Tech(m);
}

function matchesToType(matches) {
	var m = matches[1].split(';');
	return new Type(m);
}

function matchesToElement(matches) {
	var m = matches[1].split(';');
	return new Element(m);
}

function matchesToArrayOf(matches,obj) {
	if (!matches[1]) return new Array();
	var m = matches[1].split('|');
	var arr = new Array();
	for (var i = 0; i < m.length; i++) {
		var m2 = m[i].split(';');
		arr[i] = new obj(m2);
	}
	return arr;	
}

function matchesToTechArray(matches) {
	return matchesToArrayOf(matches,Tech);
}

function matchesToImprovementArray(matches) {
	return matchesToArrayOf(matches,Improvement);
}

function matchesToTechElementArray(matches) {
	return matchesToArrayOf(matches,TechElement);
}

function matchesToTechStateArray(matches) {
	return matchesToArrayOf(matches,TechState);
}

function matchesToStateArray(matches) {
	if (!matches[1]) return new Array();
	var m = matches[1].split('|');
	var arr = new Array();
	for (var i = 0; i < m.length; i++) {
		var m2 = m[i].split(';');
		arr[i] = new CharState(m2);
	}
	return arr;
}

function matchesToCharArray(matches) {
	if (!matches[1]) return new Array();
	var m = matches[1].split('|');
	var arr = new Array();
	for (var i = 0; i < m.length; i++) {
		var m2 = m[i].split(';');
		arr[i] = new Character(m2);
	}
	return arr;
}

function matchesToArenaArray(matches) {
	if (!matches[1]) return new Array();
	var m = matches[1].split('|');
	var arr = new Array();
	for (var i = 0; i < m.length; i++) {
		var m2 = m[i].split(';');
		arr[i] = new Arena(m2);
	}
	return arr;
}

function matchesToMessageArray(matches) {
	if (!matches[1]) return new Array();
	var m = matches[1].split('|');
	var arr = new Array();
	for (var i = 0; i < m.length; i++) {
		var m2 = m[i].split(';');
		arr[i] = new Message(m2);
	}
	return arr;	
}


function User() {
	var fields = ['id','name','money','arena'];
	createFields(this,fields,arguments);
	NetFighters.cache.users[this.id] = this;
}

function Element() {
	var fields = ['id','name','icon'];
	createFields(this,fields,arguments);
	this.icon.id = 'element'+this.id;
	this.icon.className = 'element';
	this.icon.alt = this.name;
	this.icon.title = this.name;
	this.icon.width = 16;
	this.icon.height = 16;
	NetFighters.cache.elements[this.id] = this;
}

function Type() {
	var fields = ['id','name','icon','equip','attack_Cost','defense_Cost','resistance_Cost','distance_Cost','weight_Cost','projectile'];
	var formats = {attack_Cost: 'hidden',defense_Cost: 'hidden',resistance_Cost: 'hidden', distance_Cost: 'hidden', weight_Cost: 'hidden'};
	createFields(this,fields,arguments);
	this.icon.id = 'type'+this.id;
	this.icon.className = 'type';
	this.icon.alt = this.name;
	this.icon.title = this.name;
	this.icon.width = 16;
	this.icon.height = 16;
	NetFighters.cache.types[this.id] = this;
}

function CharState() {
	var fields = ['id','name','value','attribute','change'];
	createFields(this,fields,arguments);
	switch (this.attribute) {
		case 'H': this.attribute = 'HP';break;
		case 'S': this.attribute = 'Strength';break;
		case 'D': this.attribute = 'Dexterity';break;
		case 'R': this.attribute = 'Resistance';break;
		case 'K': this.attribute = 'KI';break;
		case 'M': this.attribute = 'Max KI';break;
		case 'L': this.attribute = 'Limit';break;
	}
	switch (this.change) {
		case 'D': this.change = 'Down';break;
		case 'U': this.change = 'Up';break;
		case 'Z': this.change = 'Zero';break;
	}
}

function Message() {
	var fields = ['from','date','text'];
	var formats = {text:'text'};
	createFields(this,fields,arguments,formats);
}

function Character() {
	var fields = ['user_id','user_nick','id','owner','name','x','y','z','gender','hp','ki','str','dex','res','temp_str','temp_dex','temp_res','temp_max_ki','max_ki','limit','time','defend','avatar','icon','wins','losses','date','summon','end_turn','selected','last_round','last_def_round','timeouts','race_id','race_name','arena_id','arena_name','max_hp','hp_pc','ki_pc','winning_rate','balance','age','str_progress','dex_progress','res_progress','max_ki_progress','temp_max_hp','temp_hp_pc','temp_ki_pc','gender_icon','time_pc','battle_power','temp_battle_power','fighting','ready'];
	var formats = {id: 'hidden', user_id: 'hidden', race_id: 'hidden', arena_id: 'hidden', x: 'hidden', y: 'hidden', z: 'hidden', time: 'hidden', gender: 'gender', defend: 'bool', summon: 'bool', selected: 'bool', last_round: 'datetime', last_def_round: 'datetime', date: 'datetime', time_pc: 'number', temp_hp_pc: 'number', hp_pc: 'number', ki_pc: 'number', winning_rate: 'number', str_progress: 'number', dex_progress: 'number', res_progress: 'number', max_ki_progress: 'number', temp_max_hp: 'number', temp_hp_pc: 'number', temp_ki_pc: 'number', owner: 'text', fighting: 'bool', ready: 'bool', arena_name: 'text', avatar: 'image'};
	createFields(this,fields,arguments,formats,'character');
	this.avatar.id = 'avatar'+this.id;
	this.avatar.className = 'avatar';
	this.avatar.alt = this.name;
	this.avatar.title = this.name;
	this.avatar.width = 48;
	this.avatar.height = 48;
	this.icon.id = 'sprite'+this.id;
	this.icon.className = 'sprite';
	this.icon.alt = this.name;
	this.icon.title = this.name;
	this.icon.width = 32;
	this.icon.height = 32;
	NetFighters.cache.chars[this.id] = this;
}

function Arena() {
	var fields = ['id','user','name','desc','icon','background','ground','mode','time','min','max','char_round_id','round','alwaysopen','permanent','training','ringout','beatnrun','inviteonly','user_name','char_round_name','fight','total','open'];
	var formats = {id: 'hidden', time: 'hidden', user_id: 'hidden', char_round_id: 'hidden', fight: 'bool', total: 'number', open: 'bool', desc: 'text'};
	createFields(this,fields,arguments,formats,'arena');
	this.background.id = 'background'+this.id;
	this.background.className = 'background';
	this.background.alt = this.name;
	this.background.title = this.name;
	this.background.width = 504;
	this.background.height = 68;
	this.ground.id = 'ground'+this.id;
	this.ground.className = 'ground';
	this.ground.alt = this.name;
	this.ground.title = this.name;
	this.ground.width = 504;
	this.ground.height = 10;
	NetFighters.cache.arenas[this.id] = this;
}

function Tech() {
	var fields = ['id','summon_id','chain_To_id','chain_From_id','type_id','character_id','name','desc','avatar','icon','learning','level','progress','center_X','center_Y','center_Z','teach_desc','sound','summon_name','user_id','character_name','type_name','type_icon','chain_From_name','chain_To_name','usable','progress_pc'];
	var formats = {id: 'hidden', progress: 'hidden', center_X: 'hidden', center_Y: 'hidden', center_Z: 'hidden', summon_name: 'text', usable: 'bool', learning: 'bool', chain_To_name: 'text', chain_From_name: 'text', type_name: 'text', sound: 'audio'};
	createFields(this,fields,arguments,formats,'technique');
	//alert(objectToString(this));
	//alert(this.sound);
	this.improvements = [];
	this.elements = [];
	this.states = [];
	NetFighters.sendCommands('improvements '+this.id,'tech_elements '+this.id,'tech_states '+this.id);
//	NetFighters.improvements(this.id);
//	NetFighters.tech_elements(this.id);
//	NetFighters.tech_states(this.id);
	this.avatar.id = 'techavatar'+this.id;
	this.avatar.className = 'techavatar';
	this.avatar.alt = this.name;
	this.avatar.title = this.name;
	this.avatar.width = 48;
	this.avatar.height = 48;
	this.icon.id = 'techsprite'+this.id;
	this.icon.className = 'techsprite';
	this.icon.alt = this.name;
	this.icon.title = this.name;
	this.icon.width = 32;
	this.icon.height = 32;
	NetFighters.cache.techs[this.id] = this;
}

function Improvement() {
	var fields = ['id','conflict_id','name','description','icon','cost','min','max','defend','tech_id','value'];
	var formats = {id: 'hidden', conflict_id: 'hidden', tech_id: 'hidden'};
	createFields(this,fields,arguments,formats,'improvement');
	this.icon.id = 'improvementicon'+this.id;
	this.icon.className = 'improvementicon';
	this.icon.alt = this.name;
	this.icon.title = this.name;
	this.icon.width = 16;
	this.icon.height = 16;
	var imps = NetFighters.cache.techs[this.tech_id].improvements;
	imps[imps.length] = this;
}

function TechElement() {
	var fields = ['id','name','icon','tech_id','value'];
	var formats = {id: 'hidden', tech_id: 'hidden'};
	createFields(this,fields,arguments,formats,'tech_element');
	this.icon.id = 'techelementicon'+this.id;
	this.icon.className = 'techelementicon';
	this.icon.alt = this.name;
	this.icon.title = this.name;
	this.icon.width = 16;
	this.icon.height = 16;
	var elms = NetFighters.cache.techs[this.tech_id].elements;
	elms[elms.length] = this;
}

function TechState() {
	var fields = ['id','element_id','name','description','icon','msg','action','unset_on_hurt','permanent','attribute','change','value','color','special','tech_id','base_attribute'];
	var formats = {id: 'hidden', element_id: 'hidden', tech_id: 'hidden'};
	createFields(this,fields,arguments,formats,'tech_state');
	this.icon.id = 'techstateicon'+this.id;
	this.icon.className = 'techstateicon';
	this.icon.alt = this.name;
	this.icon.title = this.name;
	this.icon.width = 16;
	this.icon.height = 16;
	var states = NetFighters.cache.techs[this.tech_id].states;
	states[states.length] = this;
}

NetFighters = {

serverURL: "server.php",
alternativeServerURL: "server.php",

cache: {
	chars: [],
	arenas: [],
	techs: [],
	states: [],
	elements: [],
	items: [],
	users: []
},

commands: 0,

actions: [],

addAction: function(response,mode,func) {
	NetFighters.actions[NetFighters.actions.length] = new Action(new RegExp(response,mode),func);
},


onReceive: function(data) {
	var matches;
	var responses = data.split('\r\n');
	NetFighters.commands--;
	for (var j in responses) {
		for (var i = 0; i < NetFighters.actions.length; i++) {
			matches = NetFighters.actions[i].pattern.exec(responses[j]);
			if (matches && matches.length > 0)
				NetFighters.actions[i].func(matches);
		}
		responses[j] = responses[j].split(' ');
	}
	if (NetFighters.commands === 0 && NetFighters.onComplete)
		NetFighters.onComplete(responses);
},

templates: {},

processed_templates: {},

loadTemplate: function (name) {
	$.get(name+'.tpl',{},function (data) {NetFighters.onLoadTemplate(name,data)});
},
onLoadTemplate: function (name,data) {
	NetFighters.templates[name] = data;
},
processTemplate: function(name,data,formats) {
	if (data.length && data.length === 0) return 'None';
	var html = NetFighters.templates[name];
	var value = '';
	var valuecss = '';
	for (var i in data) {
		if (data[i] === '')	{//To remove src="" and url(0) when data[i] is an image
			html = html.replace(new RegExp('src="\\['+i+'\\]"','g'),'style="display:none"');
			html = html.replace(new RegExp('url\\(/\\*'+i+'\\*/\\);','g'),'none');
		}
		if (typeof data[i] == 'function') //Skip functions
			continue;
		if (typeof data[i] == 'object' && data[i].src) //Images
			value = data[i].src;
		else if (data[i].join) //Arrays
			value = data[i].join('\r\n<br />');
		else
			value = data[i].toString(); //Other
		//Apply formats
		if (formats && formats[i]) {
			switch (formats[i]) {
				case 'bool':value=((value=='0')?'No':'Yes');break;
				case 'number': if (!value) value=0;break;
				case 'text': if (!value) value='-';break;
				case 'gender':value=((value=='M')?'Male':'Female');break;
				case 'date':value=value.replace(/^(\d{4})-(\d{2})-(\d{2})$/,dateformat);
				case 'datetime':value=value.replace(/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/,datetimeformat);
				case 'datebr':value=value.replace(/^(\d{4})-(\d{2})-(\d{2})$/,'$3/$2/$1');
				case 'dateusa':value=value.replace(/^(\d{4})-(\d{2})-(\d{2})$/,'$2/$3/$1');
				case 'datetimebr':value=value.replace(/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/,'$3/$2/$1 $4:$5:$6');
				case 'datetimeusa':value=value.replace(/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/,'$2/$3/$1 $4:$5:$6');
			}
		}
		valuecss = value;
		if (!valuecss || valuecss == '?') //Output correct CSS for numbers
			valuecss = 0;
		html = html.replace(new RegExp('\\['+i+'\\]','g'),value);
		html = html.replace(new RegExp('\\/\\*'+i+'\\*\\/','g'),valuecss);
	}
	html = NetFighters.translate(html);
	NetFighters.processed_templates[name+data.id] = html;
	return html;
},

dictionary: {},

loadLocale: function (name) {
	if (!NetFighters.dictionary[name]) return;
	$.get(name+'.loc',{},function (data) {NetFighters.onLoadLocale(name,data)});	
},
onLoadLocale: function (name,data) {
	var lines = data.split('\r\n');
	lines.sort(sortLocale);
	var pieces;
	for (var i in lines) {
		pieces = lines[i].split('=');
		NetFighters.dictionary[name][pieces[0]] = pieces[1];
	}
},
translate: function (text) {
	if (NetFighters.dictionary[language])
		for (i in NetFighters.dictionary[language]) {
			if (text == i) {
				text = NetFighters.dictionary[language][i];
				break;
			}
			else
				text = text.replace(new RegExp('\\b'+i+'\\b','g'),NetFighters.dictionary[language][i]);
		}
	return text;
},

//Callback pre-processings
_onResponse: function (matches) {if (NetFighters.onResponse) NetFighters.onResponse(matches[1])},
_onError: function (matches) {if (NetFighters.onError) NetFighters.onError(matches[1])},
_onUserCode: function (matches) {if (NetFighters.onUserCode) NetFighters.onUserCode(matches[1])},
_onUserName: function (matches) {if (NetFighters.onUserName) NetFighters.onUserName(matches[1])},
_onMsgRead: function (matches) {if (NetFighters.onMsgRead) NetFighters.onMsgRead(matchesToMessageArray(matches))},
_onLongPollMsgRead: function (matches) {if (NetFighters.onLongPollMsgRead) NetFighters.onLongPollMsgRead(matchesToMessageArray(matches))},
_onHelp: function(matches) {if (NetFighters.onHelp) NetFighters.onHelp(matchesToArray(matches))},
_onUserChars: function(matches) {if (NetFighters.onUserChars) NetFighters.onUserChars(matchesToArray(matches))},
_onUserCharsInfo: function(matches) {if (NetFighters.onUserCharsInfo) NetFighters.onUserCharsInfo(matchesToCharArray(matches))},
_onUserIsFighting: function(matches) {if (NetFighters.UserIsFighting) NetFighters.onUserIsFighting(matches[1])},
_onFindUser: function(matches) {if (NetFighters.onFindUser) NetFighters.onFindUser(matchesToArray(matches))},
_onChar: function(matches) {if (NetFighters.onChar) NetFighters.onChar(matchesToChar(matches))},
_onFindChar: function(matches) {if (NetFighters.onFindChar) NetFighters.onFindChar(matchesToArray(matches))},
_onUser: function(matches) {var a = matchesToUser(matches); if (NetFighters.onUser) NetFighters.onUser(a)},
_onArenas: function(matches) {if (NetFighters.onArenas) NetFighters.onArenas(matchesToArray(matches))},
_onArenasInfo: function(matches) {if (NetFighters.onArenasInfo) NetFighters.onArenasInfo(matchesToArenaArray(matches))},
_onArena: function(matches) {if (NetFighters.onArena) NetFighters.onArena(matchesToArena(matches))},
_onInArena: function(matches) {if (NetFighters.onInArena) NetFighters.onInArena(matchesToArray(matches))},
_onInArenaInfo: function(matches) {if (NetFighters.onInArenaInfo) NetFighters.onInArenaInfo(matchesToCharArray(matches))},
_onArenaEdit: function(matches) {if (NetFighters.onArenaEdit) NetFighters.onArenaEdit(matches)},
_onArenasNames: function(matches) {if (NetFighters.onArenasNames) NetFighters.onArenasNames(matchesToArray(matches))},
_onArenaJoin: function(matches) {if (NetFighters.onArenaJoin) NetFighters.onArenaJoin(matchesToArray(matches))},
_onArenaJoinBest: function(matches) {if (NetFighters.onArenaJoinBest) NetFighters.onArenaJoinBest(matchesToArray(matches))},
_onArenaLeave: function(matches) {if (NetFighters.onArenaLeave) NetFighters.onArenaLeave(matchesToArray(matches))},
_onArenaOpen: function(matches) {if (NetFighters.onArenaOpen) NetFighters.onArenaOpen(matchesToArray(matches))},
_onArenaPermanent: function(matches) {if (NetFighters.onArenaPermanent) NetFighters.onArenaPermanent(matchesToArray(matches))},
_onArenaTraining: function(matches) {if (NetFighters.onArenaTraining) NetFighters.onArenaTraining(matchesToArray(matches))},
_onArenaBuy: function(matches) {if (NetFighters.onArenaBuy) NetFighters.onArenaBuy(matchesToArray(matches))},
_onCurrentArena: function(matches) {if (NetFighters.onCurrentArena) NetFighters.onCurrentArena(matches[1])},
_onIsSummon: function(matches) {if (NetFighters.onIsSummon) NetFighters.onIsSummon(matches[1])},
_onSelectedChar: function(matches) {if (NetFighters.onSelectedChar) NetFighters.onSelectedChar(matches[1])},
_onSelectChar: function(matches) {if (NetFighters.onSelectChar) NetFighters.onSelectChar(matches[1])},
_onSay: function(matches) {if (NetFighters.onSay) NetFighters.onSay(matches)},
_onMsg: function(matches) {if (NetFighters.onMsg) NetFighters.onMsg(matchesToArray(matches))},
_onStart: function(matches) {if (NetFighters.onStart) NetFighters.onStart(matches)},
_onEndTurn: function(matches) {if (NetFighters.onEndTurn) NetFighters.onEndTurn(matches)},
_onCurrentTurn: function(matches) {if (NetFighters.onCurrentTurn) NetFighters.onCurrentTurn(matches)},
_onViewHP: function(matches) {if (NetFighters.onViewHP) NetFighters.onViewHP(matches[1])},
_onViewTime: function(matches) {if (NetFighters.onViewTime) NetFighters.onViewTime(matches[1])},
_onGameTime: function(matches) {if (NetFighters.onGameTime) NetFighters.onGameTime(matches[1])},
_onGameTurn: function(matches) {if (NetFighters.onGameTurn) NetFighters.onGameTurn(matches[1])},
_onMoonPhase: function(matches) {if (NetFighters.onMoonPhase) NetFighters.onMoonPhase(matches[1])},
_onCharStates: function(matches) {if (NetFighters.onCharStates) NetFighters.onCharStates(matchesToStateArray(matches))},
_onCharPosX: function(matches) {if (NetFighters.onCharPosX) NetFighters.onCharPosX(matches[1])},
_onCharPosY: function(matches) {if (NetFighters.onCharPosY) NetFighters.onCharPosY(matches[1])},
_onTech: function(matches) {if (NetFighters.onTech) NetFighters.onTech(matchesToArray(matches))},
_onTechs: function(matches) {if (NetFighters.onTechs) NetFighters.onTechs(matchesToArray(matches))},
_onTechsInfo: function(matches) {var a = matchesToTechArray(matches); if (NetFighters.onTechsInfo) NetFighters.onTechsInfo(a)},
_onLearnedTechs: function(matches) {if (NetFighters.onLearnedTechs) NetFighters.onLearnedTechs(matchesToArray(matches))},
_onTechData: function(matches) {if (NetFighters.onTechData) NetFighters.onTechData(matchesToTech(matches))},
_onImprovements: function(matches) {var a = matchesToImprovementArray(matches);if (NetFighters.onImprovements) NetFighters.onImprovements(a)},
_onTechElements: function(matches) {var a = matchesToTechElementArray(matches);if (NetFighters.onTechElements) NetFighters.onTechElements(a)},
_onTechStates: function(matches) {var a = matchesToTechStateArray(matches);if (NetFighters.onTechStates) NetFighters.onTechStates(a)},
_onType: function(matches) {if (NetFighters.onType) NetFighters.onType(matchesToType(matches))},
_onElement: function(matches) {if (NetFighters.onElement) NetFighters.onElement(matchesToElement(matches))},
_onState: function(matches) {if (NetFighters.onState) NetFighters.onState(matchesToState(matches))},
_onRace: function(matches) {if (NetFighters.onRace) NetFighters.onRace(matchesToRace(matches))},
_onItem: function(matches) {if (NetFighters.onItem) NetFighters.onItem(matchesToItem(matches))},
_onUsableTechs: function(matches) {if (NetFighters.onUsableTechs) NetFighters.onUsableTechs(matchesToArray(matches))},

//Commands
sendCommand: function (cmd/*,params*/) {
	var params = '';
	if (arguments.length > 1) {
		var arr = Array.prototype.slice.call(arguments,1);
		for (var i in arr)
			if (!arr[i]) arr.splice(i,1);
		if (arr.length > 0) {
			params = ' '+arr.join(' ');
		}
	}
	if (cmd == 'longpoll_msgread') {
//		$.get(NetFighters.alternativeServerURL+'?send='+cmd+params,{},NetFighters.onReceive);
		$.getScript(NetFighters.alternativeServerURL+'?send='+cmd+params+'&callback=NetFighters.onReceive');
	}
	else
		$.get(NetFighters.serverURL+'?send='+cmd+params,{},NetFighters.onReceive);
	NetFighters.commands++;
	if (NetFighters.onRequest)
		NetFighters.onRequest(cmd);
},
sendCommands: function (/*arguments*/) {
	var cmds = [];
	for (var i = 0; i < arguments.length; ++i) {
		cmds[i] = 'send'+i+'='+arguments[i];
		if (NetFighters.onRequest)
			NetFighters.onRequest(arguments[i]);
	}
	var send = cmds.join('&');
	$.get(NetFighters.serverURL+'?'+send,{},NetFighters.onReceive);		
	NetFighters.commands++;
},
username: function (userCode) {NetFighters.sendCommand('username',userCode)},
help: function () {NetFighters.sendCommand('help')},
usercode: function () {NetFighters.sendCommand('usercode')},
userchars: function () {NetFighters.sendCommand('userchars')},
userchars_info: function () {NetFighters.sendCommand('userchars_info')},
selectablechars_info: function () {NetFighters.sendCommand('selectablechars_info')},
msgread: function (userCode) {NetFighters.sendCommand('msgread',userCode)},
longpoll_msgread: function (userCode) {NetFighters.sendCommand('longpoll_msgread',userCode)},
userisfighting: function (userCode) {NetFighters.sendCommand('userisfighting',userCode)},
finduser: function (userCode) {NetFighters.sendCommand('finduser',userCode)},
char_: function (charCode) {NetFighters.sendCommand('char',charCode)},
findchar: function (charCode) {NetFighters.sendCommand('findchar',charCode)},
user: function (userCode) {NetFighters.sendCommand('user',userCode)},
arenas: function () {NetFighters.sendCommand('arenas')},
arenas_info: function () {NetFighters.sendCommand('arenas_info')},
openarenas_info: function () {NetFighters.sendCommand('openarenas_info')},
arena: function (arenaCode) {NetFighters.sendCommand('arena',arenaCode)},
inarena: function (arenaCode) {NetFighters.sendCommand('inarena',arenaCode)},
inarena_info: function (arenaCode) {NetFighters.sendCommand('inarena_info',arenaCode)},
arenaedit: function (arenaCode) {NetFighters.sendCommand('arenaedit',arenaCode)},
arenasnames: function () {NetFighters.sendCommand('arenasnames')},
arena: function (arenaCode) {NetFighters.sendCommand('arena',arenaCode)},
arenajoin: function (arenaCode) {NetFighters.sendCommand('arenajoin',arenaCode)},
arenajoinbest: function () {NetFighters.sendCommand('arenajoinbest')},
arenaleave: function (arenaCode) {NetFighters.sendCommand('arenaleave',arenaCode)},
arenaopen: function () {NetFighters.sendCommand('arenaopen')},
arenapermanent: function () {NetFighters.sendCommand('arenapermanent')},
arenatraining: function () {NetFighters.sendCommand('arenatraining')},
arenabuy: function () {NetFighters.sendCommand('arenabuy')},
currentarena: function (arenaCode) {NetFighters.sendCommand('currentarena',arenaCode)},
issummon: function (charCode) {NetFighters.sendCommand('issummon',charCode)},
selectedchar: function () {NetFighters.sendCommand('selectedchar')},
selectchar: function (charCode) {NetFighters.sendCommand('selectchar',charCode)},
say: function (text) {NetFighters.sendCommand('say',text)},
msg: function (target,text) {NetFighters.sendCommand('msg',target,text)},
start: function () {NetFighters.sendCommand('start')},
endturn: function () {NetFighters.sendCommand('endturn')},
currentturn: function () {NetFighters.sendCommand('currentturn')},
viewhp: function (charCode) {NetFighters.sendCommand('viewhp',charCode)},
viewtime: function (arenaCode) {NetFighters.sendCommand('viewtime',arenaCode)},
gametime: function () {NetFighters.sendCommand('gametime')},
gameturn: function () {NetFighters.sendCommand('gameturn')},
moonphase: function () {NetFighters.sendCommand('moonphase')},
charstates: function (charCode) {NetFighters.sendCommand('charstates',charCode)},
charposx: function (charCode) {NetFighters.sendCommand('charposx',charCode)},
charposy: function (charCode) {NetFighters.sendCommand('charposy',charCode)},
tech: function (techCode,x,y) {NetFighters.sendCommand('tech',techCode,x,y)},
techs: function (charCode) {NetFighters.sendCommand('techs',charCode)},
techs_info: function (charCode) {NetFighters.sendCommand('techs_info',charCode)},
learnedtechs: function (charCode) {NetFighters.sendCommand('learnedtechs',charCode)},
techdata: function (techCode) {NetFighters.sendCommand('techdata',techCode)},
improvements: function (techCode) {NetFighters.sendCommand('improvements',techCode)},
tech_elements: function (techCode) {NetFighters.sendCommand('tech_elements',techCode)},
tech_states: function (techCode) {NetFighters.sendCommand('tech_states',techCode)},
type: function (typeCode) {NetFighters.sendCommand('type',typeCode)},
element: function (elementCode) {NetFighters.sendCommand('element',elementCode)},
state: function (stateCode) {NetFighters.sendCommand('state',stateCode)},
race: function (raceCode) {NetFighters.sendCommand('race',raceCode)},
item: function (itemCode) {NetFighters.sendCommand('item',itemCode)},
usable_techs: function (charCode) {NetFighters.sendCommand('usable_techs',charCode)}

};

//Callback Bindings
NetFighters.addAction("^(.+)","",NetFighters._onResponse);
NetFighters.addAction("^ERROR: (.+)","",NetFighters._onError);
NetFighters.addAction("^help (.+)","",NetFighters._onHelp);
NetFighters.addAction("^usercode (\d+)$","",NetFighters._onUserCode);
NetFighters.addAction("^username (.+)$","",NetFighters._onUserName);
NetFighters.addAction("^userchars (.+)","",NetFighters._onUserChars);
NetFighters.addAction("^userchars_info (.+)","",NetFighters._onUserCharsInfo);
NetFighters.addAction("^selectablechars_info (.+)","",NetFighters._onUserCharsInfo);
NetFighters.addAction("^msgread (.*)","",NetFighters._onMsgRead);
NetFighters.addAction("^longpoll_msgread (.*)","",NetFighters._onLongPollMsgRead);
NetFighters.addAction("^userisfighting (.+)","",NetFighters._onUserIsFighting);
NetFighters.addAction("^finduser (.+)","",NetFighters._onFindUser);
NetFighters.addAction("^char (.+)","",NetFighters._onChar);
NetFighters.addAction("^findchar (.+)","",NetFighters._onFindChar);
NetFighters.addAction("^user (.+)","",NetFighters._onUser);
NetFighters.addAction("^arenas (.*)","",NetFighters._onArenas);
NetFighters.addAction("^arenas_info (.*)","",NetFighters._onArenasInfo);
NetFighters.addAction("^openarenas_info (.*)","",NetFighters._onOpenArenasInfo);
NetFighters.addAction("^arena (.+)","",NetFighters._onArena);
NetFighters.addAction("^inarena (.*)","",NetFighters._onInArena);
NetFighters.addAction("^inarena_info (.*)","",NetFighters._onInArenaInfo);
NetFighters.addAction("^arenaedit (.*)","",NetFighters._onArenaEdit);
NetFighters.addAction("^arenasnames (.*)","",NetFighters._onArenasNames);
NetFighters.addAction("^arenajoin (.*)","",NetFighters._onArenaJoin);
NetFighters.addAction("^arenajoinbest (.*)","",NetFighters._onArenaJoinBest);
NetFighters.addAction("^arenaleave (.*)","",NetFighters._onArenaLeave);
NetFighters.addAction("^arenaopen (.*)","",NetFighters._onArenaOpen);
NetFighters.addAction("^arenapermanent (.*)","",NetFighters._onArenaPermanent);
NetFighters.addAction("^arenabuy (.*)","",NetFighters._onArenaBuy);
NetFighters.addAction("^arenatraining (.*)","",NetFighters._onArenaTraining);
NetFighters.addAction("^currentarena (.*)","",NetFighters._onCurrentArena);
NetFighters.addAction("^issummon (.*)","",NetFighters._onIsSummon);
NetFighters.addAction("^selectedchar (.*)","",NetFighters._onSelectedChar);
NetFighters.addAction("^selectchar (.*)","",NetFighters._onSelectChar);
NetFighters.addAction("^say (.*)","",NetFighters._onSay);
NetFighters.addAction("^msg (.*)","",NetFighters._onMsg);
NetFighters.addAction("^start (.*)","",NetFighters._onStart);
NetFighters.addAction("^endturn (.*)","",NetFighters._onEndTurn);
NetFighters.addAction("^currentturn (.*)","",NetFighters._onCurrentTurn);
NetFighters.addAction("^viewhp (.*)","",NetFighters._onViewHP);
NetFighters.addAction("^viewtime (.*)","",NetFighters._onViewTime);
NetFighters.addAction("^gametime (.*)","",NetFighters._onGameTime);
NetFighters.addAction("^gameturn (.*)","",NetFighters._onGameTurn);
NetFighters.addAction("^moonphase (.*)","",NetFighters._onMoonPhase);
NetFighters.addAction("^charstates (.*)","",NetFighters._onCharStates);
NetFighters.addAction("^charposx (.*)","",NetFighters._onCharPosX);
NetFighters.addAction("^charposy (.*)","",NetFighters._onCharPosY);
NetFighters.addAction("^tech (.*)","",NetFighters._onTech);
NetFighters.addAction("^techs (.*)","",NetFighters._onTechs);
NetFighters.addAction("^techs_info (.*)","",NetFighters._onTechsInfo);
NetFighters.addAction("^learnedtechs (.*)","",NetFighters._onLearnedTechs);
NetFighters.addAction("^techdata (.*)","",NetFighters._onTechData);
NetFighters.addAction("^improvements (.*)","",NetFighters._onImprovements);
NetFighters.addAction("^tech_elements (.*)","",NetFighters._onTechElements);
NetFighters.addAction("^tech_states (.*)","",NetFighters._onTechStates);
NetFighters.addAction("^type (.*)","",NetFighters._onType);
NetFighters.addAction("^element (.*)","",NetFighters._onElement);
NetFighters.addAction("^state (.*)","",NetFighters._onState);
NetFighters.addAction("^race (.*)","",NetFighters._onRace);
NetFighters.addAction("^item (.*)","",NetFighters._onItem);
NetFighters.addAction("^usable_techs (.*)","",NetFighters._onUsableTechs);

NetFighters.loadTemplate('character');
NetFighters.loadTemplate('technique');
NetFighters.loadTemplate('improvement');
NetFighters.loadTemplate('arena');
NetFighters.loadTemplate('tech_state');
NetFighters.loadTemplate('tech_element');
NetFighters.dictionary['pt-br'] = {};
NetFighters.loadLocale(language);

})();
