var message_integer = "Polje \"%s\" mora biti cijeli broj!";
var message_required = "Polje \"%s\" je obavezno!";
var message_date 	= "Polje \"%s\" mora biti datum!";
var message_border_crossing_date = "Niste dobro unijeli datum i vrijeme prelaska granice!";
var message_first_border_crossing_date = "Niste dobro unijeli datum i vrijeme prelaska granice!";
var message_money 	= "Polje \"%s\" mora biti oblika \"1.234,56\" !";

var debugvar = null;

function ISclone(container, cloner, changeFunc, changeFunc2)
{
	var doChange = false;
	if(changeFunc != undefined)
	{
		doChange = true;
	}
		
	var newNode = cloner.cloneNode(true);
	if(doChange)
	{
		if(changeFunc[0] == undefined)
			changeFunc(newNode, container);
		else
		{
			for(var i=0; i < changeFunc.length; i++)
			{
				changeFunc[i](newNode, container);
			}
		}
	}
	if(changeFunc2 != undefined && typeof changeFunc2 == 'function')
	{
		changeFunc2(cloner,container);
	}
	if(newNode.tagName == 'TR')
	{
		var tbody = document.createElement('tbody');
		tbody.appendChild(newNode);
	}
	container.appendChild(newNode.tagName == 'TR' ? tbody : newNode);
	return newNode;
}

var nameSerialize_clearStyles = true;
var nameSerialize_clearInputs = true;
var nameSerialize = function (node, container)
{
	var els = Array('input', 'select');
	var container_number = container.getAttribute('current_index');
	for(key in els)
	{
		var inputs = node.getElementsByTagName(els[key]);

		for(var i=0; i < inputs.length; i++)
		{
			if(container_number)
			{
				var number = container_number;
				number++;
				container.setAttribute('current_index', number);
			}
			else
			{
				var number = inputs[i].getAttribute('ordinalnumber');
				number++;
			}
			var partone = inputs[i].getAttribute('namepartone');
			var parttwo = inputs[i].getAttribute('nameparttwo');
			inputs[i].name = partone + number + parttwo;
			inputs[i].setAttribute('ordinalnumber', number);
			
			if(nameSerialize_clearInputs && els[key] == 'input')
				inputs[i].value = '';
				
			if(nameSerialize_clearStyles && els[key] == 'input')
				inputs[i].className = '';
				
			if(nameSerialize_clearStyles && els[key] == 'select')
				inputs[i].selectedIndex = 0;
		}
	}
}

var nidSerialize_clearStyles = true;
var nidSerialize_clearInputs = true;
var customChange = null;
var nidSerialize = function (node, container)
{
	var els = Array('input', 'select', 'div');
	var container_number = container.getAttribute('current_index');
	for(key in els)
	{
		var inputs = node.getElementsByTagName(els[key]);

		for(var i=0; i < inputs.length; i++)
		{
			if(container_number)
			{
				var number = container_number;
				number++;
				container.setAttribute('current_index', number);
			}
			else
			{
				var number = inputs[i].getAttribute('ordinalnumber');
				number++;
			}
			if(inputs[i].name != '')
			{
				var partone = inputs[i].getAttribute('namepartone');
				var parttwo = inputs[i].getAttribute('nameparttwo');
				inputs[i].name = partone + number + parttwo;
				inputs[i].setAttribute('ordinalnumber', number);

				if(nidSerialize_clearInputs && els[key] == 'input')
					inputs[i].value = '';
					
				if(nidSerialize_clearStyles && els[key] == 'input')
					inputs[i].className = '';
			}
			if(inputs[i].id != '')
			{
				var partone = inputs[i].getAttribute('idpartone');
				var parttwo = inputs[i].getAttribute('idparttwo');
				inputs[i].id = partone + number + parttwo;
				inputs[i].setAttribute('ordinalnumber', number);
			}
			if(customChange != null)
				customChange(els[key], inputs[i]);
		}
	}
}
var reset_expense_type = 0;
var reset_expense_clone = function (eltype, el)
{
	if(reset_expense_type)
	{
		if(eltype == 'div')
			el.style.display = 'block';
		if(eltype == 'input' && el.getAttribute('shouldreset') == 'true')
		{
			el.value = '';
			el.disabled = false;
			el.setAttribute('required', 1)
		}
		
	}
	else
	{
		if(eltype == 'div')
			el.style.display = 'none';
		if(eltype == 'input' && el.getAttribute('shouldreset') == 'true')
		{
			el.value = '1';
			el.disabled = true;
			el.setAttribute('required', 0)
		}
		if(eltype == 'select')
		{
			el.selectedIndex = 0;
		}
	}
}

function parse_expense_selection(select)
{
	var ordnm = select.getAttribute('ordinalnumber');
	var val =  select.value
	var divcont = $('qty_' + ordnm);

// 	alert(ordnm + ' - ' + val);
	if(in_array(val, liquid_expenses)) // == 8 || val == 10 || val == 48)
	{
		var els = divcont.getElementsByTagName('input');
		for (var i = 0; i < els.length; i++)
		{
			els[i].disabled = false;
			els[i].value = '';
			els[i].setAttribute('required', 1)
		}
		divcont.style.display = 'block';
	}
	else
	{
		divcont.style.display = 'none';
		var els = divcont.getElementsByTagName('input');
		for (var i = 0; i < els.length; i++)
		{
			els[i].disabled = true;
			els[i].value = 1;
			els[i].setAttribute('required', 0)
		}
	}
}

function $(id)
{
	return document.getElementById(id);
}

function clog_expen_ctot()
{
	calculate_totals('car_log_expense', ['input', 'select'], $('popis_troškova'),  $('car_log_expense_total'), formatAsMoney);
}

var formatAsMoney = function(val)
{
	var tmp = new String(val);
	var output = '';
	var connector = '';
	var sign = '';
	
	if(tmp.substr(0,1) == '-')
	{
		sign = tmp.substr(0,1);
		tmp = tmp.substr(1,tmp.length);
	}

	if(tmp.indexOf('.') == -1)
		tmp = tmp+'.00';
	
	tmp = tmp.replace('.',',');
// 	alert(tmp);
	while(tmp.length > 0)
	{
		if(tmp.length <= 3)
			connector = '';
		
		var start = tmp.length-3 < 0 ? 0 : tmp.length-3;
		output = connector + tmp.substr(start, 3) + output;
		tmp = tmp.substr(0,start);
		connector = '.';
		
	}
	if(sign == '-')
		output = sign+output;
	return output;
}

function money2float(value)
{
	if(isFloat(value))
		return value;
	else
	{
		var regex = /^(((([1-9]{1})([0-9]{0,2})){0,1})|(0))(\.[0-9]{3})*(\,[0-9]{2}){0,1}$/;
		if(regex.test(value))
		{
			value = new String(value);
			value = value.replace(/\./g, '');
			value = value.replace(/\,/g, '.');
			value = value*1.00;
		}
		else
		{
			value = 0.00;	
		}
		return value;
	}
}

function calculate_totals(group, fieldTypes, fieldsContainer, totalField, totalTransformFunc)
{
	var fields = Array();
	var finalArray = Array();
	for(key in fieldTypes)
	{
		fields = fieldsContainer.getElementsByTagName(fieldTypes[key]);
		for(var i = 0; i < fields.length; i++)
		{
			var unit_price = fields[i].getAttribute('unit_price');
			var amount = fields[i].getAttribute('amount');
			var connector = fields[i].getAttribute('connector');
			var standalone = fields[i].getAttribute('standalone');
			var sign = fields[i].getAttribute('sign');
			var value = fields[i].value;
			if(standalone)
			{
				var j = finalArray.length;
				finalArray[j] = Array();
				if(fields[i].getAttribute('number_type')=='money')
				{
					value = money2float(value);						
				}
				if(sign == '-')
					value = value * -1;
// 				if(isRealNumber(value)) {alert('no a real number');continue;}
				finalArray[j]['unit_price'] = value;
				finalArray[j]['amount'] = 1;
			}
			if(connector)
			{
				if(finalArray[connector] == undefined)
					finalArray[connector] = Array();
				if(unit_price && isRealNumber(value))
					finalArray[connector]['unit_price'] = value;
				if(amount && isInteger(value))
					finalArray[connector]['amount'] = value;
			}
		}
	}

	totals = 0;
	for(key in finalArray)
	{
		if(isRealNumber(finalArray[key]['unit_price']))
			totals += (finalArray[key]['unit_price'] * finalArray[key]['amount']);		
	}
	if(totalTransformFunc != undefined)
	{
		totalField.value = totalTransformFunc(totals.toFixed(2));
	}
	else
		totalField.value = totals.toFixed(2);
		
	totalField.setAttribute('size', totalField.value.length);
}
// ----------------------------------------------------------------------------------------//
function isRealNumber(value)
{
	return !isNaN(value);
}

function isInteger(value)
{
	return !isNaN(value);
}

function dump(obj){
	var string = '';

	for(x in obj){
		try{
			if(typeof(obj[x]) != 'function')
				string += x + '=' + obj[x] + "\n";
		} catch(e){
		}
	}
		alert(string);
}

function go_report_print(url)
{
	if($('reports_all').checked)
		url += '&data[all]=1';
		
	var reports_user = $('reports_user');
	url += '&data[user]='+reports_user.options[reports_user.selectedIndex].value;
	var reports_car = $('reports_car');
	url += '&data[car]='+reports_car.options[reports_car.selectedIndex].value;
	url += '&data[date][from]='+$('reports_time_from').value;
	url += '&data[date][to]='+$('reports_time_to').value;
	
	window.open(url);
}


function validate(form)
{
	var validation_fields = ['input', 'textarea'];
	var error_fields = [];
	var error_message = [];
	var no_errors = true;
	var ok_fields = [];
	for(var i=0; i < validation_fields.length; i++)
	{
		var flds = form.getElementsByTagName(validation_fields[i]);
		for(var j=0; j < flds.length; j++)
		{
			var description = flds[j].getAttribute('description');
			var validation = flds[j].getAttribute('validation');
			var opis = description ? description : flds[j].name;
			if(validation)
			{
				eval('var success = validate_' + validation + '(flds[j]);');
				if(!success)
				{
					no_errors = false;
					error_fields[error_fields.length] = flds[j];
					var evl = 'var tmp = new String(message_'+validation+'); error_message[error_message.length] = tmp.replace("%s", "'+opis+'"); ';
// 					alert(evl);
					eval(evl);
				}
			}
			var required = flds[j].getAttribute('required');
			if(required)
			{
				if(!flds[j].value.length)
				{
					no_errors = false;
					error_fields[error_fields.length] = flds[j];
					var evl = 'var tmp = new String(message_required); error_message[error_message.length] = tmp.replace("%s", "'+opis+'"); ';
// 					alert(evl);
					eval(evl);
				}
			}
			var required_special = flds[j].getAttribute('required_special');
			if(required_special)
			{
				eval('var success = required_' + required_special + '(flds[j]);');
				if(!success)
				{
					no_errors = false;
					error_fields[error_fields.length] = flds[j];
					var evl = 'var tmp = new String(message_required_' + required_special + '); error_message[error_message.length] = tmp.replace("%s", "'+opis+'"); ';
// 					alert(evl);
					eval(evl);
				}
			}
			
			if(!in_array(flds[j], error_fields))
				ok_fields[ok_fields.length] = flds[j];
		}
	}
	if(error_message.length > 0)
	{
		alert(error_message.join("\n"));
	}
	
	for(var i = 0; i < error_fields.length; i++)
	{
		if(i == 0)
			error_fields[i].focus();
		error_fields[i].style.border = "1px solid red";
	}
	for(var i = 0; i < ok_fields.length; i++)
	{
		if(!ok_fields[i].readonly)
			ok_fields[i].style.border = "1px solid black";
	}
// 	return false;
	return no_errors;
}

function required_if_costs_are_cash(field)
{
	var selects = document.getElementsByTagName('select');
	for(var i = 0; i < selects.length; i++)
	{
		var check = selects[i].getAttribute('if_cash_napomena_required');
		if(check == '1')
		{
			if(selects[i].value == 'COMVC')
			{
				if(field.value.length == 0)
					return false;
			}
		}
	}
	
	return true;
}
function validateInPlace(form, dont_alert_error)
{
	var validation_fields = ['input', 'textarea'];
	var firstErrField = null;
	var error_fields = [];
	var error_message = [];
	var no_errors = true;
	var ok_fields = [];
	for(var i=0; i < validation_fields.length; i++)
	{
		var flds = form.getElementsByTagName(validation_fields[i]);
		for(var j=0; j < flds.length; j++)
		{
			if(!validateField(flds[j]))
			{
				if(firstErrField == null)
					firstErrField = flds[j];
					
				no_errors = false;
			}
		}
	}
	
	if(!no_errors && !dont_alert_error)
	{
		alert('Niste ispravno popunili sva polja. Molimo obratite pažnju na polja sa crvenom pozadinom.');
		if(firstErrField != null)
		{
			firstErrField.focus();
			firstErrField.className = 'validationError';
		}	
	}
	
	return no_errors;
}


function validateField(field)
{
	var validationOK = true;
	var description = field.getAttribute('description');
	var validation = field.getAttribute('validation');
	var opis = description ? description : field.name;
	if(validation)
	{
		eval('var success = validate_' + validation + '(field);');
		if(!success)
		{
			var evl = 'var tmp = new String(message_'+validation+'); tmp = tmp.replace("%s", "'+opis+'"); ';
			eval(evl);
			validationOK = false;
			validationError(field, tmp);
		}
		else validationSuccess(field);
	}
	
	
	var required = field.getAttribute('required');
	if(required)
	{
		if(!field.value.length)
		{
			var evl = 'var tmp = new String(message_required); tmp = tmp.replace("%s", "'+opis+'"); ';
			eval(evl);
			validationOK = false;
			validationError(field,tmp);
		}
		else
			validationSuccess(field);
	}
	
	
	var required_special = field.getAttribute('required_special');
	if(required_special)
	{
		eval('var success = required_' + required_special + '(field);');
		if(!success)
		{
			var evl = 'var tmp = new String(message_required_' + required_special + '); tmp = tmp.replace("%s", "'+opis+'"); ';
			eval(evl);
			validationOK = false;
			validationError(field,tmp);
		}
		else
			validationSuccess(field);
	}
	
	return validationOK;
}

function validationError(field, tmp)
{
	field.className = 'validationError';
}

function validationSuccess(field)
{
	var t = field.getAttribute('validationOKclass');
	if(t)
		field.className = t;
	else
		if(field.value.length > 0)
			field.className = 'down'; //'validationSuccess';
}

function focusField(field)
{
	return;
	var t = field.getAttribute('validationclass');
	if(t)
		field.className = t;
	else
		field.className= 'down';	
}

function validate_integer(field)
{
	if(field.value.length > 0 && !isInteger(field.value))
		return false;
	return true;
}

function validate_date(field)
{
	var regex = /^([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})\.{0,1}$/;
	if(field.value.length > 0 && !regex.test(field.value))
		return false;
	return true;
}


function validate_date_less_than_now(field)
{
	var dt = new Date();
	var mon = dt.getMonth()+1;
	var gthan = dt.getDate()+'.'+mon+'.'+dt.getFullYear()+'.';
	var regex = /^([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})\.{0,1}$/;
	if(field.value.length > 0 && (!regex.test(field.value) || compareDates(field.value) >= 0))
	{
		message_date_less_than_now = message_date_less_than_now + ' (' + gthan + ')';
		return false;
	}
	return true;
}


function validate_float(field)
{
	if(field.value.length > 0 && !isRealNumber(field.value))
		return false;
	return true;
}

function validate_money(field)
{
	if(isFloat(field.value))
	{
		field.value = formatAsMoney(field.value);
		return true;
	}	
	var regex = /^(((([1-9]{1})([0-9]{0,2})){0,1})|(0))(\.[0-9]{3})*(\,[0-9]{2}){0,1}$/;
	if(!regex.test(field.value))
		return false
	else
		return true;
}

function validate_integer_greater_than(field)
{
	var gthan = field.getAttribute('greater_than');
	if(field.value.length > 0 && (!isInteger(field.value) || (field.value*1) <= (gthan*1) ))
	{
		message_integer_greater_than = 'Polje "%s" mora sadržavati cijeli broj veći od ' + gthan;
		return false;
	}
	return true;
}


function validate_length(field)
{
	var smthan = field.getAttribute('length_limit');
	if(smthan && field.value.length > smthan)
	{
		var tmp = new String(field.value);
		field.value = tmp.substr(0,254);
		return false;
	}
	
	return true;
}

function validate_length(field)
{
	var smthan = field.getAttribute('length_limit');
	if(smthan && field.value.length > smthan)
	{
		var tmp = new String(field.value);
		field.value = tmp.substr(0,254);
		return false;
	}
	
	return true;
}

function validate_length_and_cash_required(field)
{
	var smthan = field.getAttribute('length_limit');
	if(smthan && field.value.length > smthan)
	{
		var tmp = new String(field.value);
		field.value = tmp.substr(0,254);
		return false;
	}
	
	return true;
}

function special_acc_approval_validation(form, field)
{
	var valid = true;
	if(!validate(form))
		valid = false;
	if(field.value.length < 1)
	{
		var tmp = new String(message_required); 
		alert(tmp.replace("%s", field.getAttribute('description')));
		field.style.borderColor="red";
		valid = false;
	}
	return valid;
}


function in_array(element, array)
{
	for(var i = 0; i < array.length; i++)
		if(element == array[i])
			return true;	
	return false;
}

function convToDate(strDate){
	var aryDate = new Array();
	var year = strDate.substring(6,10);
	var month = strDate.substring(3,5);
	month = month == '' ? 0 : month - 1;
	var day = strDate.substring(0,2);
	var hour = strDate.substring(12,14);
	hour = hour == '' ? 0 : hour;
	var min = strDate.substring(15,17);
	min = min == '' ? 0 : min;
	var second = strDate.substring(18,20);
	second = second == '' ? 0 : second;

	return new Date(year, month, day, hour, min, second);
}

function compareDates(dt1, dt2)
{
	var date1 = convToDate(dt1);
	if(dt2 != undefined)
	{
		var date2 = convToDate(dt2);
	}
	else
		var date2 = new Date();
		
	return date1.getTime() - date2.getTime();
}

function validate_border_crossing_date(field)
{
	var indx = field.getAttribute('ordinal');
	var ttl = $('destinations_add').getAttribute('destinations_count');
	var success = true;
	if(!validate_date(field) || (field.style.display != 'none' && field.value == ''))
		return success = false;
		
	var dt = field.value;
	dt += ' '+($('border_hour_'+indx).value ? $('border_hour_'+indx).value : '00')+':'+ ($('border_min_'+indx).value ? $('border_min_'+indx).value : '00')+':00';
	var refdt = dt;
	
	var start = $('date_of_departure');
	if(!validate_date(start))
		return success = false;
	dt = start.value+' '+($('hour_of_departure').value ? $('hour_of_departure').value : '00')+':'+ ($('min_of_departure').value ? $('min_of_departure').value : '00')+'00'; 
	var f = compareDates(refdt,dt);
	if(f < 0)
	{
		success = false;
		return success;
	}
	
	for(var i = 1; i < indx; i++)
	{
		var prev = $('border_date_'+i);
		if(prev && prev.style.display != 'none') // mozda nekih prelazaka nema, jer se išlo u više mjesta u istoj državi
		{
			if(!validate_date(prev))
				return success = false;
				
			dt = prev.value+' '+($('border_hour_'+i).value ? $('border_hour_'+i).value : '00')+':'+ ($('border_min_'+i).value ? $('border_min_'+i).value : '00')+':00';
			var f = compareDates(refdt,dt);
			if(f < 0)
			{
				success = false;
				return success;
			}
		}
	}
	
	for(var i = indx; i < ttl; i++)
	{
		var nxt = $('border_date_'+i);
		if(nxt && nxt.style.display != 'none')
		{
			if(!validate_date(nxt))
				return success = false;
				
			dt = nxt.value+' '+($('border_hour_'+i).value ? $('border_hour_'+i).value : '00')+':'+ ($('border_min_'+i).value ? $('border_min_'+i).value : '00')+':00';
			if(compareDates(refdt,dt) > 0)
			{
				success = false;
				return success;
			}
		}
	}
	
	var end = $('date_of_return');
	if(!validate_date(end))
		return success = false;
	dt = end.value+' '+($('hour_of_return').value ? $('hour_of_return').value : '00')+':'+ ($('min_of_return').value ? $('min_of_return').value : '00')+'00';
	var f = compareDates(refdt,dt);
	if(f > 0)
	{
		success = false;
		return success;
	}
	
	return success;
}

function indirectBorderValidate(field)
{
	var indx = field.getAttribute('ordinal');
	validateField($('border_date_'+indx));
}
