function validateField(obj, fieldId, fieldDesc, regex){
	var field = document.getElementById(fieldId);
	
	if(field && obj.isValid){
		var value = null;
		
		obj.div.innerHTML = "";
		
		switch(field.tagName)
		{
			case "INPUT" : value = field.value;break;
			case "SELECT" : if(field.selectedIndex > -1) value = field.options[field.selectedIndex].value;break;
		}
		
		if(!value || value == ""){
			obj.div.innerHTML = "O Campo " + fieldDesc + " é obrigatório.";
		}else if(typeof(regex) == 'object' && !regex.test(value.toString())){
			obj.div.innerHTML = "O Campo " + fieldDesc + " esta preenchido com formato inválido.";
		}
		
		obj.isValid = obj.div.innerHTML == "";
	}
}

function getObj(div){ return { isValid : true, div: document.getElementById(div)};}

function handleObj(obj, form){
	obj.div.style.display = obj.isValid ? "none" : "block";
	if(obj.isValid)form.submit();
	
	return obj.isValid;
}

function validaLJ(form){
	var obj = getObj("divError");
	
	validateField(obj, 'player', "Jogador");
	validateField(obj, 'bloco', "Bloco", /^(\d{3})$/);
	validateField(obj, 'distancia', "Distância", /^(\d{3}(([.]\d{1,3})?))$/);
	validateField(obj, 'prestrafe', "Prestrafe", /^(\d{3}(([.]\d{1,3})?))$/);
	validateField(obj, 'maxspeed', "Maxspeed", /^(\d{3}(([.]\d{1,3})?))$/);
	validateField(obj, 'ljType', "Tipo");
	validateField(obj, 'map', "Mapa");
	validateField(obj, 'upload', "Demo");
	
	return handleObj(obj, form);
}

function validaMaxDemos(form){
	var tabMaxDemos = document.getElementById("tabMaxDemos");
	var obj = getObj("divMaxDemosError");
	
	for(var i = 0; i < tabMaxDemos.rows.length; i++)
	{
		var desc = tabMaxDemos.rows[i].cells[0].textContent;
		var fieldId = findFirstElement(tabMaxDemos.rows[i].cells[1], "INPUT");
		
		if(fieldId){
			validateField(obj, fieldId, desc, /^(\d{2})$/);
		}
	}
	
	return handleObj(obj, form);
}

function findFirstElement(container, tagName){
	for(var i = 0; i < container.childNodes.length; i++)
	{
		if(container.childNodes.item(i) && container.childNodes.item(i).tagName == tagName){
			return container.childNodes.item(i).id;
		}
	}
	return null;
}

function validaMapRecords(form){
	var obj = getObj("divError");
	
	validateField(obj, 'player', "Jogador");
	validateField(obj, 'mapa', "Mapa");
	validateField(obj, 'tempo', "Tempo", /^(\d{2}):(\d{2})([.]\d{2})$/);
	validateField(obj, 'upload', "Demo");
	
	return handleObj(obj, form);
}

function Trim(str){return str.replace(/^\s+|\s+$/g,"");}

function handleMapChoose(){
	var demoCombo = document.getElementById('upload');
	
	if(demoCombo.selectedIndex > -1 ){
		var selectedDemo = demoCombo.options[demoCombo.selectedIndex].text;
		var searchParts = selectedDemo.split('_');
		
		var length = 0;
		var currIdx = 0;
		
		for(var i = 0; i < searchParts.length;i++)
		{
			var searchStr = Trim(searchParts[i]);
			currIdx = handleMapSearch(length, searchStr, currIdx);

			if(currIdx != null){
				length += searchStr.length + 1;
			}
			else{
				break;
			}
		}
	   
		handlePlayerSearch(length, selectedDemo);
	}
}

function handlePlayerSearch(length, demoName){
	var playerName = demoName.substr(length, demoName.length - (length - 1) - 13).toUpperCase();
	
	var foundExactMatch = searchPlayer(playerName);
	
	if(!foundExactMatch){
		var regex = /[^a-zA-Z0-9]/g;	
		var replace = '';
		var searchText = playerName.replace(regex, replace);
		
		searchPlayer(searchText, regex, replace);
	}
}

function searchPlayer(text, regex, replace){
	var playerCombo = document.getElementById('player');
	
	for(var i = 0; i < playerCombo.options.length;i++)
	{
		var option =  playerCombo.options[i];
		var searchMatchableStr = null;
		
		searchMatchableStr =  option.text.toUpperCase();
		
		if(regex){
			 searchMatchableStr = searchMatchableStr.replace(regex, '');
		}
		
		if(text.toUpperCase() == searchMatchableStr){
			option.selected = true;
			return true;
		}
	}
	
	return false;
}
	
function handleMapSearch(length, search, idx){
	var mapCombo = document.getElementById('mapa');
	
	for(var i = idx; i < mapCombo.options.length;i++)
	{
		var option = mapCombo.options[i];
		var searchMatchableStr = Trim(option.text.substr(length, search.length));
		
		if(searchMatchableStr == search){
			option.selected = true;
			return i;
		}
	}
	
	return null;
}

function handleUploadPost(){
	var form = document.getElementById('uploadForm');
	var fileField = document.getElementById('uploadFile');
	
	if(fileField){
		var fileName = fileField.value;
		
		if(doSomeBasicValidation(fileName)){
			var typeCombo = document.getElementById('tipo');
			var selectedType  = typeCombo.options[typeCombo.selectedIndex].value;
			
			if(selectedType){
				if(selectedType == 1 && !validateMapRecordFileName(fileName)){
					return;
				}
				
				form.submit();
			}
		}
	}
}

function validateMapRecordFileName(fileName){
	if(!fileName.match(/_\d{4}.\d{2}.rar/)){
		setError('O nome da demo esta com formato de tempo inválido (Ex. 2222.22).');	
		return false;
	}
	return true;
}

function doSomeBasicValidation(fileName){
	if(!fileName){
		setError('É preciso selecionar uma demo para fazer o upload.');
	}
	else if(fileName.match(/\.dem/)){
		setError('O nome da demo contêm .dem. O arquivo precisa ser da extenção .RAR.');
	}
	else if(!fileName.match(/\.rar/)){
		setError('A demo precisa estar compactada e com a extenção .RAR.');
	}
	else if(fileName.match(/\s/)){
		setError('O nome da demo selecionada possui espaços.');	
	}
	else {
		return true;
	}
	
	return false;
}

function setError(msg){
	var div = document.getElementById('divError');
	div.style.display = 'block';
	div.innerHTML = msg;
}
	
