var the_cursor_position = [128,128];
var the_busy_count = 0;

document.onmousemove = function(e) {
	if (navigator.userAgent.indexOf('MSIE') != -1) {
		var de = document.documentElement;
		var bo = document.body;
		if (window != null && window.event != null && de != null && bo != null) {
			the_cursor_position = [window.event.x + (de.scrollLeft || bo.scrollLeft) - (de.clientLeft || 0),
			                       window.event.y + (de.scrollTop || bo.scrollTop) - (de.clientTop || 0)];
		}
	} else {
		the_cursor_position = [e.pageX, e.pageY];
	}

	if (the_busy_count > 0) {
		var busy = elem('BUSY');
		busy.style.left = (the_cursor_position[0]+8) + 'px';
		busy.style.top = (the_cursor_position[1]+8) + 'px';
	}
}

function busy_on() {
	if (the_busy_count <= 0) {
		var busy = document.createElement('div');
		busy.setAttribute('id','BUSY');
		busy.setAttribute('class','busyicon');
		busy.style.position = 'absolute';
		busy.style.left = (the_cursor_position[0]+8) + 'px';
		busy.style.top = (the_cursor_position[1]+8) + 'px';
		document.body.appendChild(busy);
	}
	++the_busy_count;
}
function busy_off() {
	--the_busy_count;
	if (the_busy_count <= 0) {
		document.body.removeChild(elem('BUSY'));
	}
}
function enable_form(prefix) {
	set_tree_disabled(elem(prefix), false);
}
function disable_form(prefix) {
	set_tree_disabled(elem(prefix), true);
}
function set_tree_disabled(el, dis) {
	if (el != null) {
		if ( el.nodeName == 'INPUT' ||
		     el.nodeName == 'TEXTAREA' ||
		     el.nodeName == 'SELECT' ||
		     el.nodeName == 'BUTTON' ) {
		     	el.disabled = dis;
			return true;
		} else for (var i = 0 ; i < el.childNodes.length ; ++i) {
			set_tree_disabled(el.childNodes[i], dis);
		}
	}
	return false;
}


////////////////////////////////////////////////////////////////////////////////


function validate_submit(id,extra,fun) {
	if ( ! validate(id, true) )
		return false;

	// XXX browsers supporting Javascript but not AJAX?

	busy_on();
	disable_form(id);
	request(elem(id), extra, function(req,ok) {
		enable_form(id);
		busy_off();

		if (ok) {
			if (fun!=null) return fun(req);
		} else {
			complain(req.responseText, id);
		}
	});
}

var constraints = [];
function constrain(prefix,name,rule,param) {
	var cns = {'prefix':prefix,'id':(prefix+'_'+name),'rule':rule,'param':param};
	constraints.push(cns);
}
function validate(prefix, docomplain) {
	var mistakes=[];

	for (var i = 0 ; i < constraints.length ; ++i) {
		var cns = constraints[i];
		if (cns.prefix != prefix)
			continue;

		validate_one(cns, false, mistakes);
	}
	if (mistakes.length > 0) {
		if (docomplain) complain(mistakes, prefix);
		return false;
	}
	return true;
}
function validate_one(cns, docomplain, mistakes) {
	if (mistakes == null)
		mistakes = [];

	var elem = element(cns.id);
	if (elem == null) return;

	var ismistake = false;

	switch (cns.rule) {
	case 'len':
		ismistake = (elem.value.length < (cns.param!=null?cns.param:1));
		if (ismistake) mistakes.push([elem, ((cns.param>1) ? 'Χρειάζεται να συμπληρώσετε τουλάχιστον '+cns.param+' χαρακτήρες σε αυτό το πεδίο.'
		                                                   : 'Δε συμπληρώσατε αυτό το πεδίο.' )]);
		break;
	case 'nz':
		if (elem.value != '') ismistake = ( elem.value == 0 ) ;
		if (ismistake) mistakes.push([elem, 'Αυτό το πεδίο δεν επιτρέπεται να είναι μηδέν.']);
		break;
	case 'int':
		if (elem.value != '') { var x = parseInt(str,10); ismistake = (x!=x); }
		if (ismistake) mistakes.push([elem, 'Αυτό δεν είναι αριθμός.']);
		break;
	case 'real':
		if (elem.value != '') { var x = parseFloat(str); ismistake = (x!=x || x==Infinity); }
		if (ismistake) mistakes.push([elem, 'Αυτό δεν είναι αριθμός.']);
		break;
	case 'date':
		if (elem.value != '') {
			var d = parseDate(elem.value, cns.param);
			if (d==null) {
				ismistake = true;
			} else {
				elem.value = unparseDate(d);
			}
		}
		if (ismistake) mistakes.push([elem, 'Η ημερομηνία δεν είναι σωστή.']);
		break;
	case 'fun':
		{ var result = cns.param(elem); ismistake = ( result == null || result == '' ); }
		if (ismistake) mistakes.push([elem, result]);
		break;
	}

	set_mistake_style(elem, ismistake);

	if (mistakes.length > 0) {
		if (docomplain) complain(mistakes, prefix);
		return false;
	}
	return true;
}

function set_mistake_style(el, ismistake) {
	var s = el.getAttribute('class');
	if (s == null) {
		s = (ismistake ? 'mistake' : '')
	} else {
		s = String(s).replace(/ mistake/,'') + (ismistake ? ' mistake' : '');
	}
	el.setAttribute('class',s);
}

function complain(mistakes, form) {
	var i, tosay=[], topoint=null;
	for (i = 0 ; i < mistakes.length ; ++i) {
		var mist = mistakes[i];
		if (mist.length >= 2) {
			if (mist[0] != null) {
				if (topoint == null)
					topoint = mist;
			} else {
				tosay.push(mist[1]);
			}
		} else if (mist.length == 1) {
			tosay.push(mist[0]);
		}
	}

	var alerted = false;
	var something = false;

	//
	// show balloon over first mistake (or simply alert)
	//
	if (topoint != null) {
		var el = topoint[0];
		try {
			var bal = new_balloon(topoint[1], el, 0);
			$(bal).fadeIn(150, function() {
				timeout(53*topoint[1].length+2000, function() {
					$(bal).fadeOut(500);
				});
			});
			something = true;
			el.focus();
		} catch(x) {
			el.focus();
			alert(topoint[1]);
			alerted = true;
		}
	}

	//
	// write inside <div name="form_mistakes"> and show it
	//
	var mistakes_div = elem(form+'_mistakes');
	if (mistakes_div != null) {
		mistakes_div.innerHTML = (tosay.length>1)
			? "<ul><li>"+tosay.join("</li><li>")+"</li></ul>"
			: '';
		$(mistakes_div).slideDown();
	} else if (!alerted) {
		if (tosay.length > 1) {
			alert('* '+tosay.join("\n* "));
		} else if (tosay.length > 0) {
			alert(tosay[0]);
		} else if (!something) {
			alert('Γ‘Γ°Γ―Γ΄Γ΅Γ·ΓΓ‘');
		}
	}
}

function open_inline(url) {
	var id = 'ROOT_mainview';

	url += (/\?/.test(url)?'&':'?') + '_PREFIX_=' + urlencode(id);

	busy_on();
	request(url,null,function(req,ok){
		busy_off();
		if (ok) {
			elem('PLACE_'+id).innerHTML = req.responseText;
		} else {
			complain(req.responseText);
		}
	});
}
