function checkMail(field)
{
	$(field).removeClass("requiredmarker");
	if (field.value != '')
	{
		$.get("exists.php", {type: "contact", fld: "email", name: field.value, gosmile: "false"}, function(a)
		{
		    if (a == 'true')
		    	$(field).addClass("requiredmarker");
		});
	}
}
function checkAccount(field, account)
{
	if (!account) account = "klachtenmanagement";
	
	$(field).removeClass("requiredmarker");
	$(field).removeClass("exists");
	if (field.value != '')
	{
		$.get("exists.php", {type: "account", fld: "code", name: field.value, gosmile: account}, function(a)
		{
		    if (a == 'true') 
		    {
		    	$(field).addClass("requiredmarker");
		    	$(field).addClass("exists");
		    }
		});
	}
}
function checkAccountUser(field)
{
	$(field).removeClass("requiredmarker");
	if (field.value != '')
	{
		$.get("exists.php", {type: "user", fld: "name", name: field.value}, function(a)
		{
		    if (a == 'true')
		    	$(field).addClass("requiredmarker");
		});
	}
}

/**
 * Check a value on a regular expression
 *
 * String mask: regular expression
 * String value: the value to test
 * Returns boolean
 * if(!checkRegExp('^([a-zA-Z0-9_\\-\\.]+)@(\\[?([0-9]{1,3}\\.){3}|([a-zA-Z0-9\\-]+\\.)+)([a-zA-Z]{2,4}|[0-9]{1,3}\\]?)$',document.subscriptionform.email.value)){messages.push('E-mail adres. Vul hier een e-mail adres in met het volgende formaat: naam@domein.nl, voorbeeld: \'j.jansen@hetnet.nl\'');}
 * if(!checkRegExp('^([0-9]{4})(\\\s)([A-Z]{2})$',document.subscriptionform.zip.value)){messages.push('Postcode. Vul hier postcode in met het volgende formaat \'NNNN AA\', voorbeeld: \'1234 AB\' ');} 
 * if(!checkRegExp('^([0-9]{1,2})(\\-)([0-9]{1,2})(\\-)([0-9]{4})$',document.subscriptionform.birthdate.value)){messages.push('Geboortedatum. Vul hier een datum in met het volgende formaat \'dd-mm-jjjj\', voorbeeld: \'01-01-1970\'');} 
 * if(!checkRegExp('^([0-9]{1,10})$',value)){messages.push('Telefoon. Vul hier alleen cijfers in');} 
 */
function checkRegExp(mask, value)
{
	if (!isEmpty(value))
	{
		var re = new RegExp(mask);
		var ok = re.test(value);
		return ok;
	}
	return true;
}

/**
 * Check a required status for a field, if empty returns true
 */
function checkRequired(field)
{
	if(field==null){return false;}
	if (field.type=="checkbox") return !field.checked;
	if (field.type == "select-one") return (isEmpty(field.value) || field.value=='-1')
	return isEmpty(field.value);
}

function checkWithRequiredMarker(field)
{
	if (checkRequired(field)) {
		setRequiredMarker(field);
		return true;
	}
	return false;
}

/*
 * Some set/reset requiredmarker 
*/
function setRequiredMarker(myObject) 
{
	if(myObject==null){return;}
	clazz = myObject.className;
	if (clazz.indexOf("requiredmarker")<0) {
		clazz = clazz + " requiredmarker";
		myObject.className=clazz;
	}
	// also try _dpl field recursive
	name = myObject.name
	if (name.indexOf("_dpl")<0) {
		setRequiredMarker(document.getElementById(name+"_dpl"));
	}
}
function resetRequiredMarker(myObject) 
{
	if(myObject==null){return;}
	clazz = myObject.className;
	clazz = clazz.replace(/requiredmarker/ig," ");
	clazz = clazz.replace(/  /ig," ");
	myObject.className=clazz;
}
function resetAllRequiredMarkers(myForm) 
{
	if(myForm==null){return;}
	for (var i=0;i<myForm.length;i++) {
		resetRequiredMarker(myForm.elements[i]);
	}
}

/**
 * Loop all formfields and check if requiredmessage is filled and value is empty
 * If so then add a required message to messages
 */
function addRequiredFormFields(form,messages,marker)
{
	if(marker==null)
		marker=true;
	if (form!=null && messages!=null)
	{
		for(var i=0;i<form.length;i++)
		{
			e = form.elements[i];
			if (e.getAttribute('requiredmessage')>' ')
			{
				if (e.type=="checkbox") {
					if (!e.checked) {
						messages.push(e.getAttribute('requiredmessage'));
						if (marker) setRequiredMarker(e);
					}
				}
				else if(e.type == "select-one"){
					if (e.value<' ' || e.value=='-1') {
						messages.push(e.getAttribute('requiredmessage'));
						if (marker) setRequiredMarker(e);
					}
				}
				else if (isEmpty(e.value)) {
					messages.push(e.getAttribute('requiredmessage'));
					if (marker) setRequiredMarker(e);
				}
			}
		}
	}
}
function validateForm(form,messages)
{
	var message = "";
	if(messages.length>0){
		for(var i=0;i<messages.length;i++){
			message=message+"- "+messages[i]+"\n";
		}
		alert(message);
		return false;
	}
	else
	{
		return true;
	}
}


function isEmpty(value)
{
	if (value==null) return true;
	if (trim(value).length==0) return true;
	return false;
}

function trim(string)
{
	if (string==null) return "";
	while(string.length>0 && string.substr(0,1)==" ") // remove leading spaces
		string = string.substring(1,string.length) ;
	while(string.length>0 && string.substr(string.length-1,1)==" ") // remove trailing spaces 
		string = string.substring(0,string.length-2) ;
	return string;
}



function compareValues(field1,field2)
{
	if(field1==null || field2==null){return false;}
	return field1.value==field2.value;
}

function getNewLine(){return "\n";}
function showHand(element){element.style.cursor='hand';}
function showCursor(element){element.style.cursor='default';}

// Check for mail function

function checkmail(button)
{
	if(!compareValues(document.emailform.email1,document.emailform.email2))
	{
			alert('Beide adressen dienen gelijk te zijn');
	}
	else
	{
			document.emailform.submit();
	}
}

function getkey(e)
{
	if (window.event) return window.event.keyCode;
	if (e) return e.which;
	return null;
}

function fieldclear(element)
{
	if(element!=null){
		element.value='';
	}
}
function enableOnValue( parentelement, element, value ) {
		var control = document.getElementById(element);
		if (!control) {
			alert ("Besturingselement " + element + " is niet gevonden in het formulier!" );
			return;
		}
		var parentvalue;
		switch (parentelement.type) {
		case 'checkbox':
			parentvalue = (parentelement.checked ? parentelement.value : '');
			break;
		default:
			parentvalue = parentelement.options[parentelement.selectedIndex].value
			break;
		}
		if (parentvalue == value) {
			control.disabled = false;
		} else {
			control.disabled = true;
			switch (control.type) {
			case 'checkbox':
				control.checked = false;
				break;
			case 'select':
				if (control.selectedIndex) {
					control.selectedIndex=0;
				} else {
					control.value='';
				}
				break;
			default:
				control.value='';
			}
		}			
	}

// value is formatted as dd-mm-jjjj hh:mm:ss or dd-mm-jjjj
function datePastToday(value) {
	var hh,mm,ss;
	var jjjj,mon,dd;
	var timepart = '';
	if (!value) return false;
	var parts = value.split('-');
	if (parts.length != 3) return false;
	dd = parts[0];
	mon = parts[1];
	var tmp = parts[2];
	tmp = tmp.split(' ');
	jjjj = tmp[0];
	if (tmp.length > 1) {
		timepart = tmp[1].split(':');
	}
	if (timepart.length != 3) {
		hh = 0;
		mm = 0;
		ss = 0;
	}			
	if (timepart.length > 0) 
		hh = timepart[0];
	if (timepart.length > 1) 
		mm = timepart[1];
	if (timepart.length > 2) 
		ss = timepart[2];

	var fieldvalue = "" + padZeroLeft(jjjj,4) + padZeroLeft(mon,2) + padZeroLeft(dd,2) + padZeroLeft(hh,2) + padZeroLeft(mm,2) + padZeroLeft(ss,2);
	var now = new Date();
	var nowvalue = "";
	nowvalue += padZeroLeft(now.getYear(),4); 
	nowvalue += padZeroLeft(now.getMonth()+1,2);
	nowvalue += padZeroLeft(now.getDate(),2);
	nowvalue += padZeroLeft(now.getHours(),2);
	nowvalue += padZeroLeft(now.getMinutes(),2);
	nowvalue += padZeroLeft(now.getSeconds(),2);	
	return nowvalue < fieldvalue;
}
	
// value is formatted as dd-mm-jjjj hh:mm:ss or dd-mm-jjjj
function parseDateTime(value){
	var hh,mm,ss;
	var jjjj,mon,dd;
	var timepart = '';
	if (!value) return false;
	var parts = value.split('-');
	if (parts.length != 3) return false;
	dd = parts[0];
	mon = parts[1];
	var tmp = parts[2];
	tmp = tmp.split(' ');
	jjjj = tmp[0];
	if (tmp.length > 1) {
		timepart = tmp[1].split(':');
	}
	hh = 0;
	mm = 0;
	ss = 0;
	if (timepart.length > 0) 
		hh = timepart[0];
	if (timepart.length > 1) 
		mm = timepart[1];
	if (timepart.length > 2) 
		ss = timepart[2];
	var myDate=new Date();
	myDate.setFullYear(jjjj,mon-1,dd);
	myDate.setHours(hh,mm,ss,0);
	return myDate;
}
	
function padZeroLeft( value, positions ) {
	var strvalue = "" + value;
	while (strvalue.length < positions) {
		strvalue = "0" + strvalue;
	}
	return strvalue;
}
	
/**
 * check wether a variable exists within object
 */
function isDefined(object, variable)
{
	return (typeof(eval(object)[variable])!='undefined');
}
	
/**
 * Obj: the object of wich to check wether it is a array
 */
function isArray(obj)
{
	if(obj == null) return false;
	return(typeof(obj.length)=="undefined")?false:true;
}

function fillAliasSelectFields(form)
{
	if (form!=null)
	{
		for(var i=0;i<form.length;i++)
		{
			e = form.elements[i];
			if (e.type == "select-one")
			{
				alias = document.getElementById("alias_"+e.name);
				if (e!=null)
				{
					alias.value=e.options[e.selectedIndex].text;
					//alert (e.name+" aliasvalue="+alias.value+" alias type="+alias.type);
				}
			}
		}
	}
}

function hideOrShowDivs(prefix,show, clearNotShown) 
{
	hideOrShowElements("div",prefix,show, clearNotShown);
}

function hideOrShowElements(element,prefix,show, clearNotShown) 
{
	var style = (show) ? "block" : "none";
	
	arr_nodes = document.getElementsByTagName(element); 
	for (i = 0; i < arr_nodes.length; i++) { 
		obj_node = arr_nodes[i];
		if (obj_node.id>'' && obj_node.id.length>=prefix.length && obj_node.id.substr(0,prefix.length)==prefix) {
			if (/tr/i.test(obj_node.tagName))
				style = (show) ? tableRow() : "none";
			if (/td/i.test(obj_node.tagName))
				style = (show) ? ((document.all) ? "block" : "table-cell") : "none"; // Only IE thinks that cells are blocks.
			obj_node.style.display=style;
			
			if (clearNotShown === true && !show) {
				var clear = function(elem) { elem.value = "-1"; elem.value = ""; elem.checked = false; }
				map(obj_node.getElementsByTagName("input"), clear);
				map(obj_node.getElementsByTagName("textarea"), clear);
				map(obj_node.getElementsByTagName("select"), clear);
			}
		}
	}
}

/**
 * Return either the IE or Firefox string for the style.display property of a table row. 
 */
function tableRow() {
	if (document.all)
		return "";
	return "table-row";
}

function map(arr, func) {
	var newArr = new Array();
	for (var i = 0; i < arr.length; i++)
		newArr.push(func(arr[i], i));
	return newArr;
}

function clear(element)
{
	if (element!=null)
	{
		if (element.type=="checkbox") {
			element.checked=false;
		}
		else if(element.type == "select-one"){
			element.selectedIndex=0;
		}
		else {
			element.value='';
		}
		if (element.onchange)
			element.onchange();
		if (element.onblur)
			element.onblur();
	}
}
	
function setCheckBoxField(element) 
{
	if(element==null){return;}
	if ("checkbox"==element.type)
	{
		fld = document.getElementById(element.name.substr(3));
		if (fld!=null)
		{
			fld.value=element.checked;
		}
	}
}

/**
 * Checks if the checkboxes starting with name have at least 1 check. If the checkbox expands another level it also checks for at least 1 check there.
 * @param name
 * @return
 */
function hasOneCheck(name) {
	function getChecksStartingWith(elemName) {
		var elements = document.getElementsByTagName('input');
		var result = new Array();
		for (var i = 0; i < elements.length; i++) {
			if (new RegExp("^" + elemName).test(elements[i].id) && elements[i].id.substring(elemName.length).indexOf("_") == -1) {
				result.push(elements[i]);
			} 
		}
		return result;
	}
	
	var result = getChecksStartingWith(name + '_');
	var check = true;

	if (result.length > 0)
	{
		// Minimaal 1 veld aangevinkt.
		var hasCheck = false;
		for (var i = 0; i < result.length; i++)
		{
			if (result[i].checked)
				hasCheck = true;
		}
		if (!hasCheck) {
			map(result, function(elem) {setRequiredMarker(elem);});
			return false;
		}
		
		for (var i = 0; i < result.length; i++)
		{
			if (result[i].checked) 
			{
				check = check && hasOneCheck(result[i].id);
			}
		}
	}
	if (!check) {
		map(result, function(elem) {setRequiredMarker(elem);});
	}
	return check;
}

/**
* returns true if one of the checbox is checked
* TODO if main checked then sub must also be checked ALWAYS
* @deprecated hasOneCheck kan oneindig veel subniveau's aan maar verwacht wel id's ipv name's.
*/
function checkRequiredCheckBoxRange(form,prefix)
{
	if (prefix<='') return;
	onechecked = false;	
	// first loop to check
	main = 1;
	while(main>0 && !onechecked) {
		me = document.getElementById(prefix+"_"+main);
		if (me) {
			sub = 1;
			while(sub>0 && !onechecked) {
				se = document.getElementById(prefix+"_"+main+"_"+sub);
				if (se) {
					if (se.checked) {
						onechecked=true;
					}
					sub = sub + 1;
				}
				else { // geen subs meer
					if (sub==1) {// no subs defined so main is required 
						if (me.checked) {
							onechecked=true;
						}
					}
					sub=0; // quit loop
				}
			}
			main = main+1;
		}
		else {
			main=0; // quit loop
		}
	}
	if (!onechecked) {
		// loop to set marker
		main = 1;
		while(main>0) {
			me = document.getElementById(prefix+"_"+main);
			if (me) {
				setRequiredMarker(me);
				sub = 1;
				while(sub>0) {
					se = document.getElementById(prefix+"_"+main+"_"+sub);
					if (se) {
						setRequiredMarker(se);
					sub = sub + 1;
					}
					else {
						sub=0; // quit loop
					}
				}
				main = main+1;
			}
			else {
				main=0; // quit loop
			}
		}
	}
	return onechecked;
}

function isFunction(o) {
	return typeof(o) == 'function';
} 

/**
 * Checks if the value is a number and if it is between low and high. low < value < high
 * @param value
 * @param low
 * @param high
 * @return
 */
function checkNumberRange(value, low, high) {
	if (!/^\d+$/.test(value))
		return false;
	if (low && low > value) return false;
	if (high && high < value) return false;
	return true;
}

/**
 * Performs an action if the pressed key from the event object has the given keycode.
 * @return
 */
function onKey(event, key, method) {
	if (getKey(event) == key)
		if (typeof(method) == "function")
			return method();
		else
			return eval(method);
	return false;
}

/**
 * Return the keycode from an event object.
 * @param event
 * @return
 */
function getKey(event) {
	return event.which ? event.which : event.keyCode;
}
/**
 * Checks if the given object has the specified classname.
 * @param object The object on which the test will be done.
 * @param className The classname to check.
 * @return If the object has the classname.
 */
function hasClass(object, className) {
	return new RegExp("(^|\\s)"+className+"(\\s|$)").test(object.className);
}

function gridEdit(row)
{
    var cells = $(row).find("td");
    var isGridEditing  = $(row).find("input").length > (hiddenFieldCount?hiddenFieldCount : 0);
    if (isGridEditing) return;
    cells.each(function(i, o) {
        var type = "text";
        var value = o.innerHTML;
        if ($(o).hasClass("nofield")) return true;
        if ($(o).hasClass("hidden")) type = "hidden";
        if ($(o).hasClass("password")) { type = "password"; value = ""; }

        value = value.replace(/"/g, '&quot;');
        o.innerHTML = '<input name="c'+i+'" type="'+type+'" value="'+value+'" />';
    });

    var saveBtn = $('<td class="button"><button>Opslaan</button></td>');
    saveBtn.click(function() {
        saveGridEdit(row);
    })
    row.appendChild(saveBtn[0]);
}

function saveGridEdit(row) {
    if (!inputPaths) { alert('inputPaths not specified.'); return; }
    var inputs = $(row).find("input");
    var post = {};
    for (var i = 0; i < inputs.length; i++)
    {
        post[inputPaths[i]] = inputs[i].value;
    }

    $.post("useraction.php?action=update&accountId=" + accountId + "&installbase=" + installbase, post, function(data) {
        if (data != "true") { alert(data); return; }
        var rows = $(row).find("td");
        rows.each(function(i, o) {
            var inputs = $(o).find("input");
            if (inputs.length == 0) return;
            var value = $(o).find("input")[0].value;
            if ($(o).hasClass("nofield")) return;;
            if ($(o).hasClass("password")) value = "********";
            o.innerHTML = value;
        });
        $(row).find(".button").each(function (i,o) {
            row.removeChild(o);
        });
        updatePriceDiv();
    });
}

function toggleUserActive(btn) {
    var fld = $(btn).parent("td").find("input")[0];
    var img = $(btn).parent("td").find("img")[0];

    var imgPre;
    if (fld.value == 1) {
        imgSrc = "inactive"
        fld.value = 0;
    } else {
        imgSrc = "active";
        fld.value = "1";
    }
    img.src = img.src.replace(/(in)?active/, imgSrc);
}

function changeUserType(btn) {
    var row = $(btn).parents("tr:first");
    var idCell = row.find("td:first");
    var id;
    if (idCell.find("input").length > 0)
        id = idCell.find("input")[0].value;
    else
        id = trim(idCell[0].innerHTML);
    
    $.post("useraction.php?action=toggletype&accountId=" + accountId + "&installbase=" + installbase, {'employee_id' : id}, function(data) {
        eval("var obj = " + data);
        if (obj.msg) { alert(obj.msg); return; }
        row[0].parentNode.removeChild(row[0]);
        addUserToTable(obj);
        updatePriceDiv();
    });
}

function addUser(type)
{
    var fields = $("#add_" + type).find("input");
    var add = {};
    for (var i = 0; i < fields.length; i++)
        add[inputPaths[i]] = fields[i].value;

    $.post("useraction.php?action=add&accountId=" + accountId + "&installbase=" + installbase, add, function(data) {
    	eval("var obj = " + data);
        if (obj.msg) { alert(obj.msg); return; }
        for (var i = 1; i < fields.length; i++)
            fields[i].value = '';
        
        addUserToTable(obj);
        updatePriceDiv();
    });
}

function addUserToTable(obj) {
	var newRow = $('<tr onclick="gridEdit(this);">');
    newRow.append($('<td style="display:none" class="hidden">'+obj.employee_id+'</td>'))
    newRow.append($('<td>'+obj.employee_email+'</td>'));
    newRow.append($('<td>********</td>'));
    newRow.append($('<td>'+obj.employee_firstname+'</td>'));
    newRow.append($('<td>'+obj.employee_prefix+'</td>'));
    newRow.append($('<td>'+obj.employee_lastname+'</td>'));
    newRow.append($('<td class="nofield">' +
			        '	<input type="hidden" name="employee_active" value="'+(obj.employee_active == "Ja" ? 1 : 0) +'" />' +
			        '	<button onclick="toggleUserActive(this); return false;"><img src="images/'+(obj.employee_active == "Ja" ? "" : "in")+'active.gif" /></button>' +
			        '</td>'));
    newRow.append($('<td class="nofield"> <button onclick="changeUserType(this); return false;">Wissel type</button> </td>'));

    $("#add_" + obj.employee_type).before(newRow);
}

function updatePriceDiv() {
	$.get("useraction.php?action=price&accountId=" + accountId + "&installbase=" + installbase, function(data) {
		var priceDiv = document.getElementById("priceDiv");
		if (priceDiv) priceDiv.innerHTML = data;
	});
}

