﻿///
/// ArticleAttribute functions
///

// Versie 1.7.2 (LR)
function getArticleAttributes() {
	var attrArray = new Array();
	$("[id^=articleAttribute-]").each(function() {
		var id = $(this).attr("id");
		var name = $(this).attr("name");
		var type = $(this).attr("type");
		var value = $(this).val();

		if (type == "radio" || type == "checkbox") {
			if (this.checked) {
				attrArray.push("[[" + name + "::" + value + "]]");
			}
		} else if (type == "select-multiple") {
			if ($(this).children(":selected").length > 0) {
				var result = "[[" + id + "::";
				var values = "";

				$(this).children(":selected").each(function() {
					values += $(this).val() + "|";
				});

				if (values != "")
					values = values.substring(0, values.length - 1);

				attrArray.push(result + values + "]]");
			}
		} else if (type == "select-one") {
			if ($(this).children(":selected").length > 0) {
				if ($(this).val() != undefined && $(this).val() != "")
					attrArray.push("[[" + id + "::" + value + "]]");
			}
		} else {
			if (value != "") {
				attrArray.push("[[" + id + "::" + value + "]]");
			}
		}
	});
	attrArray = attrArray.sort();
	return attrArray.join(".@.");
}

// Versie 1.7.2 (LR)
function attributeArraySorter(a, b) {
	return b - a;
}

// Versie 1.7.2 (LR)
function attributesValid(sender) {
	var result = true;
	$("[id^=articleAttribute-]").each(function() {
		var accesskey = $(this).attr("accesskey"); 						// {Rule:Integer,Required:true}
		if (accesskey != undefined && accesskey.length > 2) {
			tmp = accesskey.substring(1, accesskey.length - 1).split(","); // strip: "{" .. "}"
			var rule = tmp[0].split(":")[1];
			var required = tmp[1].split(":")[1] == "true" ? true : false;

			if (!chckFieldAttr(this, null, rule, required))
				result = false;
		} else {
			result = false;
		}
	});

	if (result == true && sender != null)
		$(sender).parent("form").find("INPUT[id=attributes]").val(getArticleAttributes());

	return result;
}

// Versie 1.7.2 (LR)
function chckFieldAttr(o, e, rule) {    
    var onkeydown = (e != null);
    var required = ((o.type == "select-one" || o.type == "select-multiple" ? $(o).attr("title") : $(o).attr("accesskey")) != "");
    switch (o.type) {
        case "text":
            {
                if (required && !onkeydown) {
                    // Field is required, and event = onblur()
                    if (rule != undefined && rule != "") {
                        // Validate field
                        var r = getRuleRegex(rule);
                        if (!r.test(trim(o.value))) {
                            errorLayoutAttr(o, false, "Ongeldige " + rule + " waarde.");
                            return false;
                        } else {
                        errorLayoutAttr(o, true, "");
                            return true;
                        }
                    }
                    // No rule specified, check if not empty
                    if (trim(o.value) == "") {
                        errorLayoutAttr(o, false, "Verplicht");
                        return false;
                    }
                } else if (onkeydown) {
                    return keyAllowed(e, rule);
                }
                errorLayoutAttr(o, true, "");
                return true;
                break;
            }
        case "textarea":
            {
                if (required && o.value == "") {
                    errorLayoutAttr(o, false, "Verplicht");
                    return false;
                } else {
                    errorLayoutAttr(o, true, "");
                    return true;
                }
                break;
            }
        case "radio":
        case "select-one":
        case "select-multiple":
            {
                if (required) {
                    var nrSelected = (o.type == "radio" ? $(o).parent().find(":checked").length : $(o).find(":selected").length);
                    if (nrSelected == 0 || o.value == "") {
                        errorLayoutAttr(o, false, "Verplicht");
                        return false;
                    } else {
                        errorLayout(o, true, "");
                        return true;
                    }
                }
                break;
            }
        default:
            break;
    }
    return true;

}

// Versie 1.7.2 (LR)
function getRuleRegex(rule) {
    switch (rule) {
        case "Decimal": return /^(\-?[0-9]+[\,\.]+[0-9]+)+$/;
        case "Money": return /^(\-?[0-9]+[\,\.]+[0-9]+)+$/;
        case "Integer": return /^([0-9])+$/;
        case "Email": return /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
        case "Letters": return /^[a-zA-Z ]+$/;
        case "LettersAndNumbers": return /^[a-zA-Z0-9 ]+$/;
        case "Date": return /^([0-3]?[0-9]+)[\-\/]{1}([0-1]?[0-9]+)[\-\/]{1}([0-9]{4})$/;
        case "ZipcodeNL": return /^[1-8]{1}[0-9]{3}[A-Za-z]{2}$/;
        case "PhoneNL": return /^(0{1}\d{9})+$/;
    }
}


// Versie 1.7.2 (LR)
function keyAllowed(e, rule) {
    var k = (document.all ? e.keyCode : e.which);
    switch (rule) {
        case "Decimal": return isControlKey(k) || isDecimalKey(k, e);
        case "Money": return isControlKey(k) || isDecimalKey(k, e);
        case "Integer": return isControlKey(k) || isNumberKey(e,k);
        case "Letters": return isControlKey(k) || isAlphaKey(k);
        case "LettersAndNumbers": return isControlKey(k) || isAlphaKey(k) || isNumberKey(e, k);
        case "Date": return isControlKey(k) || isDateKey(k, e);
        case "ZipcodeNL": return isControlKey(k) || isAlphaKey(k) || isNumberKey(e, k);
        case "PhoneNL": return isControlKey(k) || isNumberKey(e, k);
    }
}

// Versie 1.7.2 (LR)
function isControlKey(k) {
    return (
            k == 8 ||                    // (backspace)
            k == 9 ||                    // (tab)
            k == 35 ||                   // (home)
            k == 36 ||                   // (end)
            k == 37 ||                   // (left)
            k == 39 ||                   // (right)
            k == 46);                    // (delete)
}

// Versie 1.7.2 (LR)
function isNumberKey(e,k) {
    if (!k) { document.all ? k = e.keyCode : k = e.which }    
    return (
            (k > 47 && k < 58 && e.shiftKey != 1) ||       // 0-9
            (k >= 96 && k <= 105) ||                               // (numpad keys)
            (isControlKey(k))
      );
}

// Versie 1.7.2 (LR)
function isDecimalKey(k, e) {
    return (isNumberKey(e,k) || k == 46);               // 0-9.
}

// Versie 1.7.2 (LR)
function isAlphaKey(k) {    
    return (
            (k >= 65 && k <= 90) ||                              // A-Z
            (k >= 97 && k <= 122) ||                                // a-z
            (k==32) //Spacebar
      );
}

// Versie 1.7.2 (LR)
function isDateKey(k, e) {
    return (
            isNumberKey(k, e) ||                                 // 0-9
            k == 45                                                          // -
      );
}

function errorLayoutAttr(o, OK, errorMessage) {
	if (OK) {
	    $(o).removeClass("error2");
		if ($("#marker_" + (o.type == "radio" ? o.name : o.id)).length > 0)
			$("#marker_" + (o.type == "radio" ? o.name : o.id)).html("Correct");
	}
	else {
	    $(o).addClass("error2");
		if ($("#marker_" + (o.type == "radio" ? o.name : o.id)).length > 0)
			$("#marker_" + (o.type == "radio" ? o.name : o.id)).html(errorMessage);
	}
}

function trim(str) {
    var str = str.replace(/^\s\s*/, ''),
            ws = /\s/,
            i = str.length;
    while (ws.test(str.charAt(--i)));
    return str.slice(0, i + 1);
}
