var saved_vars = new Array();
var res_arr = new Array();
//define cell state variables
var SELECTED = 1;
var ERROR = 2;
var DFI	= -13;
var DEF_NA = -9999;
var NA_RADIO = 1;
var NA_NON_RADIO = 2;
var NA_TABLE_RADIO = 3;
var NA_TABLE_NON_RADIO = 4;
var NAME_SEP = "_";
var SEP = "|";
var NA_EXT = "na";
var str_na = "";

function correct_sort_height(list_from, list_to)
{
	el_from = document.getElementById(list_from);
	el_to = document.getElementById(list_to);
	lis = el_to.getElementsByTagName("li");
	if(lis.length > 0)//goback
	{
		height = lis[0].clientHeight;
		height1 = lis.length*(height+6);
		lis = el_from.getElementsByTagName("li");
		height1+=(height+6)*lis.length;
		if(el_to.clientHeight < height1) el_to.style.height = height1;
		return;
	}
	if(!el_from || !el_to)
	{
		return;
	}
	el_from_h = el_from.clientHeight;
	el_to_h = el_to.clientHeight;
	if(!el_to_h || el_from_h > el_to_h)
	{
		el_to.style.height = el_from_h;
	}
}
/**
  * \brief  if  the user drags a text entered by him, make list element from  it
  */
function change_text(li)
{
	elm = li.getElementsByTagName("*");
	if(elm)
	{
		for(k=0;k<elm.length;k++)
		{
			if(elm[k].type == "text" && elm[k].value != "")
			{
				return elm[k].value;
			}
		}
	}
	return false;
}
/**
  * \brief  when user drags a new element to right, update the list elements order
  */
function update_order(to_name, qname, max)
{
	//res = Sortable.serialize(to_name);
	ul = document.getElementById(to_name);
	if(ul)
	{
		lis = ul.getElementsByTagName("li");
		ct = lis.length;
		for(i=0;i<ct;i++)
		{
			text = lis[i].innerHTML;
			idx = text.indexOf(".");
			er = change_text(lis[i]);
			if(er != false)
			{
				text = er;
			}
			else
			{
				if(idx<=15)
				{
					text = text.substring((idx + 1), text.length);
				}
			}
			lis[i].innerHTML = "&nbsp;<b>" + (i+1) + "</b>" + ". " + text;
		}
		if(typeof(max) != "undefined" && typeof(qname) != "undefined" && ct == max)
		{
			name = to_name.substr(0, to_name.length - 2);
			namefrom = name + "from";
			nameto = name + "to";			
			namh = "DQ_H" + qname;
			set_hidden_elements(nameto, qname);
			Sortable.destroy(namefrom);
			Sortable.create(nameto,{dropOnEmpty:true,handle:'handle',containment:[nameto],constraint:false, onUpdate: function () { update_order(nameto); } });
			fromdiv = name + "fromDIV";
			div = document.getElementById(fromdiv);
			if(!div) return;
			elms = div.getElementsByTagName("li");
			if(!elms) return;
			for(i=0;i<elms.length;i++)
			{
				elms[i].style.backgroundColor = "#e1e1e1";
				elms[i].style.color = "#aeaeae";
			}
		}		
	}
	
}
/**
 * \brief check if an element from an array of elements is set
 */
function check_elements(arr)
{
	ct = arr.length;
	for(i=0;i<ct;i++)
	{
		obj2 = document.getElementsByName(arr[i]);
		if(obj2)
		{
			if(obj2.length != 0)
			{
				for(j=0;j<obj2.length;j++)
				{
					if(is_set(obj2[j])) return true;
				}
			}
		}
	}
	return false;
}
/**
 * \brief  force user to answer to every row
	\param  qname - question name
	\param  ex an array(separated by '|') of exceptions from force - when  one of the exceptions are set, the functions retun true
	\param single - when is set to true, a single input is enough to let the user go to the next page
 */
function force_table(qname, from, to, single, str_rows, exceptions)
{
	var ret = true;
	typ = typeof exceptions;
	if(typ != "undefined")
	{
		var arr_ex = new Array();	
		arr_ex = exceptions.split('|');	
		if(check_elements(arr_ex)) return true;
	}
	var f_rows_arr = new Array();
	if(typeof str_rows != "undefined" && str_rows != "")
	{
		f_rows_arr = str_rows.split('|');
	}
	// if(typeof single == "undefined")//set single when it's not set
	// {
		// single = false;
	// }
	tname = "TQ_" + qname;
	table = document.getElementById(tname);//get table
	if(!table)
	{
		return true;
	}
	rows = table.getElementsByTagName("tr");//get rows
	if(!rows)
	{
		return true;
	}
	ct_arr	= new Array();
	ct = 0;
	found = false;
	for(i=0;i<rows.length;i++)
	{
		if((from != DFI && i < from) || (to != DFI && i > to))
		{
			continue;
		}
		if(f_rows_arr.length > 0)
		{
			if(!is_in(f_rows_arr, i)) continue;
		}
		inputs = gfe(rows[i]);
		if(!inputs || inputs.length == 0)
		{
			continue;
		}
		found = false;
		for(j=0;j<inputs.length;j++)
		{
			if(is_set(inputs[j]))
			{
				if(single)
				{
					return true;
				}
				found = true;
				break;
			}
		}
		if(!found)
		{
			if(!single)
			{
				for(j=1;j<rows[i].cells.length;j++)
				{
					cell = rows[i].cells[j];
					cell.className = "cellerror";
					saved_vars[cell.id] = ERROR;
				}
			}
			ret = false;
		}
	}
	if((typeof single)!="undefined" && single == true)
	{
		color_question(qname);
		message+= msgqforce.replace("{QNAME}", qname) + "\n";		
		return false;		
	}
	if (!ret)
	{
		var msg = "";
		if(f_rows_arr.length > 0)
		{
			msg = msgforcetableftr.replace("{QNAME}", qname) + "\n";	
		}
		else
		{
			if(from !=  DFI && to != DFI)
			{
				msg = msgforcetableftr.replace("{QNAME}", qname) + "\n";	
			}
			else
			{
				msg = msgforcetable.replace("{QNAME}", qname) + "\n";	
			}
		}
		message+=msg;
		return false;	
	}
	return true;
}

function color_question(qname)
{
	tdqid = "TD_" + qname + "_ID";
	tdq = document.getElementById(tdqid);
	if(tdq)
	{
		tdq.className = "qcellerror";
		saved_vars["force_question_" + qname] = 1;
	}
}

function force_messages(qname, min, max, forced, count, sort_list)
{
	 if(forced && count == 0)//simple forced question
	 {
		color_question(qname);
		msg = msgqforce.replace("{QNAME}",qname);
		message+=msg + "\n";
		return false;
	 }
	if(min != DFI && count < min)//forced question with min max answer number
	{
		color_question(qname);
		if(sort_list)
		{
			//message+=msglistmin + min + " (" + qname + ")\n";
			tmp = msglistmin.replace("{MIN}", min) + "\n";
			message+= tmp.replace("{QNAME}", qname);			
		}
		else
		{
			tmp = msgmin.replace("{MIN}", min) + "\n";
			message+= tmp.replace("{QNAME}", qname);
		}
		return false;
	}
	if(max != DFI && count > max)
	{
		color_question(qname);	
		if(sort_list)
		{
			message+=msglistmax + min + " (" + qname + ")\n";
		}
		else
		{
			tmp = msgmax.replace("{MAX}", max) + "\n";
			message+= tmp.replace("{QNAME}", qname);
		}
		return false;
	}
	return true;
}

function force_sort_list(qname, min, max, forced)
{
 var ret;
 ret = false;
 dname = "DQ_" + qname;
 div = document.getElementById(dname);
 count = 0;
 if(div)
 {
		 inputs = div.getElementsByTagName("input");
		 for(i=0;i<inputs.length;i++)
		 {
			if(is_set(inputs[i]))
			{
				count++;
			}
			if(min == DFI && max == DFI && count != 0)
			{
				break;
			}
		 }
		 qname = qname.substr(1, qname.length);
		 return force_messages(qname, min, max, forced, count, true);
  }
 return true;
}
/*
 * \brief search inputs collection for inputs
 */
function search_for_inputs(inputs, neg)
{
	for(j=0;j<inputs.length;j++)
	{
		if(is_set(inputs[j])) 
		{
			if(is_neg(inputs[j]))//negative answer
			{
				return -1;
			}		
			return true;
		}
	}
	return false;
}
/**
 *
 */
function force_sort_list(qname, min, max, forced)
{
	dname = "DQ_H" + qname;
	 div = document.getElementById(dname);
	 count = 0;
	 if(div)
	 {
		elms = div.getElementsByTagName("input");
		count = 0; 
		for(i=0;i<elms.length;i++)
		{
			if(elms[i].value != "")
			{
				count++;
			}
		}
		return force_messages(qname, min, max, forced, count, true);
	 }
	 return true;
}
/**
 * \brief force uset to answer a question
 */
function force_question(qname, min, max, forced, timesnr)
{
 dname = "DQ_" + qname;
 div = document.getElementById(dname);
 count = 0;
 if(div)
 {
	 tables = div.getElementsByTagName("table");
	 if(tables.length == 0 || !tables[1]) return true;
	 trs = tables[1].getElementsByTagName("tr");
	 if(trs.length == 0) return true;
	 for(i=0;i<trs.length;i++)
	 {
		found = false;
		inputs = gfe(trs[i]);
		var neg =  false;
		found = search_for_inputs(inputs, neg);
		if(found == -1) return true;//negative answer found
		if(found)
		{
			count++;
		}
		if(min == DFI && max == DFI && found == true)
		{
			break;
		}
	 }
	 if(!forced && count == 0)//not forced just min max
	 {
		return true;
	}
	if(typeof(timesnr) != "undefined")//force question timesnr 
	{
		if(res_arr[qname] == undefined) res_arr[qname] = 0;
		res_arr[qname]++;
		if(res_arr[qname] > timesnr) return true;
	}
	 return force_messages(qname, min, max, forced, count);
  }
  return true;
}

function disableEnterKey(e)
{
    var key;
    if(window.event)
	{
        key = window.event.keyCode;     //IE
	}
    else
	{
          key = e.which;     //firefox\
	}
    if(key == 13)
	{
          return false;
	}
    else
	{
          return true;
	}
}

function force_num(ename, emin, emax, qname, direkt)
{
		var noerror = true;
		box = document.getElementById(ename);
		if(!box)
		{
			return true;
		}
		if(box.value == "")
		{	
			box.className = "";		
			return true;
		}
		else
		{
			if(isNaN(box.value))
			{
				if(direkt)
				{
					box.className = "texterror";
					return true;
				}
				message+=msgnumforce + " (" +  qname + ")\n";
				noerror = false;
			}
			else 
			{
				if(emin != '' && parseInt(box.value, 10) < parseInt(emin))
				{
					if(direkt)
					{
						box.className = "texterror";
						return true;
					}				
					message+=msgnumforcemin.replace("{NUM}",emin) + "(" +  qname + ")\n";
					noerror = false;
				}
				if(emax != '' && parseInt(box.value, 10) > parseInt(emax))
				{
					if(direkt)
					{
						box.className = "texterror";						
						return true;
					}				
					message+=msgnumforcemax.replace("{NUM}",emax) + " (" +  qname + ")\n";
					noerror = false;
				}
			}
		}
		if(noerror)
		{
			box.className = "";
		}
		return noerror;
 }
 function limitText(obj, limit)
 {
	if(!obj)
	{
		return true;
	}
	val = obj.value;
 	if (val.length > limit) 
	{
		msg = msglimittext.replace("{LIMITVALUE}", limit);
		alert(msg);
		obj.value = val.substr(0, limit);
	} 
 }
 
function force_sum(enames, value, qname)
{
	var sumval = 0;
	editnames = enames.split("|");
	if(editnames.length != 0)
	{	
		exist = false;
		for(i=0;i<editnames.length;i++)
		{
			if(editnames[i] == "")
			{
				continue;
			}
			force_num(editnames[i], '', '', qname, true);
			box = document.getElementById(editnames[i]);
			if(box.type == "text" && box.value!="")
			{
				exist = true;
				if(!isNaN(parseInt(box.value)))
				{
					sumval+=parseInt(box.value);
				}
			}
		}
	}
	if(sumval != parseInt(value) && exist == true)
	{
		message+= msgsum.replace("{NUM}",value);
		message+=" (" + qname + ")\n";
		return false;
	}
	return true;	
}

function clear_all_input(dname, exception, colorneg, colorall)
{
	 div = document.getElementById(dname);
	 if(div)
	 {
		arr = gfe(div);
		for (var i = 0; i < arr.length; i++)
		{
			if(arr[i] == exception) 
			{
				//arr[i].style.backgroundColor = "#FFFFFF";
				continue;
			}
			if(typeof(colorneg) != "undefined" && colorneg == true)//colorneg, and answer is pos
			{
				//alert(arr[i] + " " + is_ck(arr[i]) + " " + is_neg(arr[i]));
				if(is_ck(arr[i]) && is_neg(arr[i]))
				{
					//alert(arr[i].name);				
					unset_obj(arr[i]);
					//arr[i].style.color= "#e5e5e5";
					set_cell_color(arr[i], "", true);	
					continue;
				}
				//arr[i].style.backgroundColor = "#FFFFFF";					
				continue;
			}
			if(typeof(colorall) != "undefined" && colorall == true)
			{
				unset_obj(arr[i]);				
				//arr[i].style.backgroundColor = "#e5e5e5";
				set_cell_color(arr[i], "", true);					
				continue;
			}
			if(exception.id == arr[i].id)//exception
			{
				continue;
			}
			unset_obj(arr[i]);
			set_cell_color(arr[i], "", true);			
		}
	}	 
}

function set_hidden_elements(listname, qname)
{
  dname = "DQ_H" + qname;
  res = Sortable.serialize(listname);
  var result = new Array();
  key = listname + "[]=";
  result = res.split(key);
  var arr = new Array();
  for(i=1;i<result.length;i++)
  {
		result[i] = result[i].replace("&", "");
		arr[result[i]] = i;
  }
  div = document.getElementById(dname);
  if(!div) return;
  els = div.getElementsByTagName("input");
  for(i=0; i<els.length;i++)
  {
	if(arr[i+1])//take just the defined ones
	{
		els[i].value = arr[i+1];
	}
  }
}

function $RF(el, radioGroup)
{ 
    if($(el).type && $(el).type.toLowerCase() == 'radio') { 
        var radioGroup = $(el).name; 
        var el = $(el).form; 
    } else if ($(el).tagName.toLowerCase() != 'form') { 
        return false; 
    } 
    var checked = $(el).getInputs('radio', radioGroup).find( 
        function(re) {return re.checked;} 
    ); 
    return (checked) ? $F(checked) : null; 
} 
/**
 * \brief unset all input elements
 */
function unset_all(qname, obj, colorneg, colorother)
{
	dname = "DQ_" + qname;
	if(obj)
	{
		clear_all_input(dname, obj, colorneg, colorother);
	}
}
/**
 * \brief unset an input element
 */
function unset_obj(obj)
{
	if(!obj) return;
	switch (obj.type)
	{
		case "radio":
		case "checkbox":
			obj.checked = false;
		break;
		case "text":
			obj.value = "";
		break;
		case "select-one":
		case "select-multiple":
			obj.selectedIndex = 0;
		break;
	}
}
/**
 * \brief unset ann array aof element
 * \param str_arr the names of the elements separated by '|'
 */
function unset_arr(str_arr)
{
	arr = str_arr.split('|');
	ct = arr.length;
	for(i=0;i<ct;i++)
	{
		obj2 = document.getElementsByName(arr[i]);
		if(obj2)
		{
			if(obj2.length != 0)
			{
				for(j=0;j<obj2.length;j++)
				{
					unset_obj(obj2[j]);
					set_cell_color(obj2[j], "", true);
				}
			}
		}
	}
}
/**
 * \brief used for single usable input elements
 * unset all the elements from the row where belongs the obj element
 */
function unset_row(qname, obj)
{
	if(!obj) return;
	tname = "TQ_" + qname;
	td_parent = obj.parentNode;
	if(!td_parent) return;
	tr_parent = td_parent.parentNode;
	if(!tr_parent) return;
	elms = gfe(tr_parent);
	for(var i=0;i<elms.length;i++)
	{
		if(elms[i].id != obj.id)
		{
			unset_obj(elms[i]);
			var td = elms[i].parentNode;
			if(td)
			{
				td.className = "cellNormal";
				delete saved_vars[td.id];
			}
		}
	}
}
/**
 * \brief used for single usable input elements
 * unset all the elements from the row where belongs the obj element
 */
function unset_neg_row(qname, obj)
{
	if(!obj) return;
	tname = "TQ_" + qname;
	td_parent = obj.parentNode;
	if(!td_parent) return;
	tr_parent = td_parent.parentNode;
	if(!tr_parent) return;
	elms = gfe(tr_parent);
	for(var i=0;i<elms.length;i++)
	{
		if(elms[i].id != obj.id && is_neg(elms[i]))
		{
			unset_obj(elms[i]);
			var td = elms[i].parentNode;
			if(td)
			{
				td.className = "cellNormal";
				delete saved_vars[td.id];
			}
		}
	}
}
/**
 * \brief set na for table
 */
function set_table_na(qname, type, dname)
{
	var table = document.getElementById(dname);
	if(!table) return;
	var  trs = table.rows;
	if(!trs) return;
	for(i=0;i<trs.length;i++)
	{
		inputs = gfe(trs[i]);
		if(inputs.length == 0) 
		{
			continue;
		}
		var found = false;
		for(j=0;j<inputs.length;j++)
		{
			if(is_set(inputs[j]))
			{
				found = true;
				break;
			}
		}
		if(!found)
		{
			if(type == NA_TABLE_RADIO)
			{
				add_na_name(inputs[0].name);
				continue;
			}		
			row_nr = get_row_from_name(inputs[0].name);
			if(row_nr == "")
			{
				continue;
			}
			var name = qname + NAME_SEP + row_nr + NAME_SEP + "na";
			add_na_name(name);
		}
	}
	return false;
}
/**
 * \brief set na for classic question
 */
function set_classic_na(qname, type, dname)
{
	question = document.getElementById(dname);
	if(!question) 
	{ 
		return;
	}
	elms = gfe(question);
	for(i=0;i<elms.length;i++)
	{
		if(is_set(elms[i])) 
		{
			return;
		}
	}
	name = qname;
	if(type == NA_NON_RADIO)
	{
		name = qname + "_" + NA_EXT;
		add_na_name(name);
	}
	else
	{
		add_na_name(qname);
	}	
}
/*
 * \brief set the extra field, which tells if a user answered a question
 * type:  1 radio question
*         2 checkbox, editbox, textarea,
*	      3 table radio
*	      4 table non radio
*	      5 unknown type
 */
function set_na(qname, type, dname)
{
	if(type == 5) return;
	if(type == NA_TABLE_RADIO || type == NA_TABLE_NON_RADIO)
	{
		set_table_na(qname, type, dname);
		return;
	}
	set_classic_na(qname, type, dname);

}
/**
 * \brief when the question is radio type, and none is checked, must create a hidden element with the same name
 */
function add_na_name(qname)
{
	if(str_na != "") str_na+= SEP;
	str_na+=qname;
	//if(!question) return;
	//var rad = document.createElement('input');
	//rad.setAttribute("name", qname);
	//rad.setAttribute("type", "hidden");
	//rad.setAttribute("value", DEF_NA);
	//rad.setAttribute("id", "");	
	//question.appendChild(rad);	
}
/**
 * \brief somtimes there are answers between checkboxes that must act like radio(single select), when one of this are clicked, disable all other element
 */
function disable_elements(dname, obj)
{
	div = document.getElementById(dname);
	if(!div) return;
	objs = gfe(div);
	for(i=0;i<objs.length;i++)
	{
		if(objs[i] != obj)
		{
			if(is_set(obj))
			{
				unset_obj(objs[i]);
				objs[i].disabled = true;
			}
			else
			{
				objs[i].disabled = false;
			}
		}
	}
}
/** 
 * \brief disable all elemnts int the row where belongs "obj"
 */
function disable_row(dname, obj)
{
	table = document.getElementById(dname);
	if(!table) return;
	found = false;
	st = is_set(obj);
	for(i=0;i<table.rows.length;i++)
	{
		elms = table.rows[i].getElementsByTagName("input");
		if(elms.length > 0)
		{
			for(j=0;j<elms.length;j++)
			{
				if(elms[j] == obj)
				{
					found = true;
					break;
				}
			}
		}
		if(found)
		{
			for(j=0;j<elms.length;j++)
			{
				if(obj != elms[j])
				{
					if(st)
					{
						unset_obj(elms[j]);
						elms[j].style.backgroundColor= "#CCCCCC";												
						elms[j].disabled = true;
					}
					else
					{
						elms[j].disabled = false;
						elms[j].style.backgroundColor= "#FFFFFF";						
					}
					
				}
			}
			break;
		}
	}
}
/**
 * \brief when the element before other was clicked, force to enter text into "other" to
 */
function force_other(objname, value, forcedid)
{
	rval = true;
	obj = document.getElementsByName(objname);
	if(!obj) return true;
	forced = document.getElementById(forcedid);
	if(!forced) return true;
	if(obj.length == 1 && forced.value == "")
	{
		if(obj[0] && obj[0].type == "checkbox" && obj[0].checked == true )//chrome
		{
			rval = false;
		}
		//if(obj && obj.type == "checkbox" && obj[0].checked == true )
		//{
		//	rval = false;
		//}
	}
	if(obj.length > 1)
	{
		for(i=0;i<obj.length;i++)
		{
			if(obj[i].value == value && obj[i].checked && forced.value == "")
			{
				rval = false;
				break;
			}
		}
	}
	if(!rval) message+="K\u00E9rj\u00FCk fejtse ki mire gondol!";
	return rval;
}
/**
 * unset all element but obj, color just neg or all answer
 */
function unset_all2(qname, obj, colorneg, colorpos)
{
	if(!obj) return;
	if(typeof(colorneg) != "undefined" && colorneg == true)
	{
		unset_all(qname, obj, true);
		return;
	}
	if(typeof(colorpos) != "undefined" && colorpos == true)
	{
		unset_all(qname, obj, false, true);
		return;
	}
	unset_all(qname, obj);
}
/**
 * \brief calculate sum, for those who can't calculate
 * qname - question name
 * sumval - the forced sum , if sumval is missing than only calculate and show sum
 */
function calc_sum(qname, sumval)
{
	if(typeof(qname) == "undefined") return;
	divid = "DQ_" + qname;
	div = document.getElementById(divid);
	if(!div) return;
	objs = gfe(div);
	sum = 0;
	for(i=0;i<objs.length;i++)
	{
		if(is_text(objs[i]) && objs[i].value != "")
		{
			num = parseInt(objs[i].value);
			if(num)
			{
				sum+=num;
			}
		}
	}
	res = document.getElementById(qname + "_sumval");
	res2 = document.getElementById(qname + "_sumtext");
	if(res) 
	{
		res.style.display = "block";
		res2.style.display = "block";
		if(typeof(sumval) != "undefined" && sum != sumval)
		{
			res.style.color = "#FF0000";
		}
		else
		{
			res.style.color = "#0000FF";
		}
		res.innerHTML = sum;
	}
}
/**
 * \brief show slider value over slider handle
 */
function refresh_slider_val(id, val)
{
	if(id == "") return;
	handle = document.getElementById("handle" + id);
	div = document.getElementById("actval" + id);
	if(!div || !handle) return;
	div.innerHTML = val;
	t = handle.offsetTop;
	l = handle.offsetLeft;
	offsetlength = (div.offsetWidth-handle.offsetWidth)/2;
	div.style.left = l-offsetlength + 'px';
	offsetheight = (parseInt(handle.style.height)/2+3);
	div.style.top  = t-offsetheight  + 'px';
}

function force_another(objid, qname)
{
	if(objid == "") return true;
	obj = document.getElementById(objid);
	if(!obj) return;
	row = search_for_row(obj);
	if(!row) return true;
	objs = gfe(row);
	if(objs.length == 0) return true; 
	for(i=0;i<objs.length;i++)
	{
		if(objs[i] != obj && is_set(objs[i]))
		{
			return true;
		}
	}
	color_question(qname);	
	for(j=1;j<row.cells.length;j++)
	{
		cell = row.cells[j];
		cell.className = "cellerror";
		saved_vars[cell.id] = ERROR;
	}	
	msg = msgforcetableftr.replace("{QNAME}", qname) + "\n";	
	message+=msg;
	return false;
}
