var Sg = {
    range: function (low, high) {
        low = parseInt(low);
        high = parseInt(high);
        if (isNaN(low) || isNaN(high)) {
            return [];
        }
        var result = [];
        var step = (low < high ? 1 : -1);
        var op = (low < high ? operator.le : operator.ge);
        while (op(low, high)) {
            result.push(low);
            low += step;
        }
        return result;
    },
    
    validate: function (form) {
    	var achtung = "";
    	for (var id in form.__config__) {
    		var dfn = form.__config__[id];
    		/*if (!dfn.required) {
    			continue;
    		}*/
    		var entered = false;
    		switch (dfn.javaType) {
    			case "ListBox":
    			    entered = form[dfn.name + "[]"].selectedIndex != -1;
    				break;
    			case "RadioGroup":
    			    if (form[dfn.name][0]) {
    			    	for (var i = 0; i < form[dfn.name].length; i++) {
    			    		if (form[dfn.name][i].checked) {
    			    			entered = true;
    			    			break;
    			    		}
    			    	}
    			    } else {
    			    	entered = form[dfn.name].checked; 
    			    }
    				break;
    			default:
    			    entered = form[dfn.name].value.length > 0;
    		}
    		if (dfn.required) {
    			if (!entered) {
    				achtung += (dfn.alert ? dfn.alert : dfn.label + " is required") + "\n";
    			}
    		}
    		if (entered || dfn.type == "MATCH") {
                var fname = dfn.name;
                if (dfn.javaType == 'ListBox') {
                    fname += "[]";
                }
    			var ctl = form[fname];
    			if (dfn.useBadWordFilter && form.__badwords__ && (ctl.type == "text" || ctl.type == "textarea")) {
    				forEach(form.__badwords__,
    				function (badword) {
    					ctl.value = ctl.value.replace(new RegExp("\\b" + badword + "\\b", "gi"), "");
    				});
    			}
    			var value = ctl.value;
    			var valid = false;
    			switch (dfn.type) {
    			    case "MATCH":
    			        if (dfn.matchType == "STRING") {
    			            valid = (value == dfn.match);
    			        } else {
    			            valid = (value == form[dfn.match].value);
    			        }
    			        break;
    				case "EMAIL":
    					valid = /^.+@[^@]+\.[a-z]{2,}$/i.test(value);
    					break;
    				case "PHONE_INTERNATIONAL":
    					valid = /^\+\d-\d{3}-\d{3}-\d{4}$/.test(value);
    					break;
    				case "PHONE_US":
    					valid = /^\d{3}-\d{3}-\d{4}$/.test(value);
    					break;
    				default:
    					valid = true;
    			}
    			if (!valid) {
    				achtung += dfn.alert + "\n";
    			}
    		}
    	}
    	if (achtung.length > 0) {
    		alert(achtung);
    		return false;
    	}
    	if (form.__name__ == "${form-name}") {
    		alert("It is time to submit...");
    		return false;
    	}
    	return true;
    }
};

connect(window, "onload",
function () {
	var form_name;
	var prefix;
	if (location.protocol == "file:") {
		form_name = "${form-name}";
		prefix = "";
	} else {
		var m = location.pathname.match(/(.*)\/([^\/]*)\.php/);
		var ctx_path = m[1];
		form_name = m[2];
		prefix = ctx_path + "/";
	}
	forEach(getElementsByTagAndClassName("FORM", "seagreen-form"),
	function (form) {
		form.__name__ = form_name;
		loadJSONDoc(prefix + form_name + "_files/config.js").addCallback(
		function (config) {
			form.__config__ = config;
		});
		if (form_name != "${form-name}") {
		    loadJSONDoc(prefix + form_name + ".php/badwords").addCallback(
		    function (badwords) {
			    form.__badwords__ = badwords;
		    });
		} else {
			form.__badwords__ = [];
		}
		var ph = form.parentNode;
		if (ph.tagName != "BODY") {
            var formPos = elementPosition(form);
            var formDim = elementDimensions(form);
            var minX = 1000000;
            var minY = 1000000;
            for (var kid = form.firstChild; kid; kid = kid.nextSibling) {
                if (kid.nodeType != 1) {
                    continue;
                }
                var kidPos = elementPosition(kid, formPos);
                if (!kidPos || kidPos.x < 0 || kidPos.y < 0) {
                    continue;
                }
                minX = Math.min(minX, kidPos.x);
                minY = Math.min(minY, kidPos.y);
            }
            for (var kid = form.firstChild; kid; kid = kid.nextSibling) {
                if (kid.nodeType != 1) {
                    continue;
                }
                var kidPos = elementPosition(kid, formPos);
                if (!kidPos) {
                    continue;
                }
                kidPos.x -= minX;
                kidPos.y -= minY;
                setElementPosition(kid, kidPos);
            }
            formDim.w -= minX;
            formDim.h -= minY;
            setElementDimensions(form, formDim);
			setElementDimensions(ph, formDim);
			if (ph.tagName == "TD") {
				ph.style.verticalAlign = "top";
			}
		}
		var str = location.pathname + location.search;
		if (str.indexOf('am:update') != -1) {
			for (var i = 0; i < form.elements.length; i++) {
				var e = form.elements[i];
				if (e.type == 'submit') {
					var cancel = BUTTON({}, 'Cancel');
					cancel.style.position = 'absolute';
					var xy = elementPosition(e);
					var wh = elementDimensions(e);
					document.body.appendChild(cancel);
					setElementPosition(cancel, {x: xy.x + wh.w + 15, y: xy.y});
					setElementDimensions(cancel, wh);
					connect(cancel, 'onclick', function(){history.back();});
					break;
				}
			}
		}
        
		//tabindex
		var form_elements = [];
		for (var i = 0; i < form.elements.length; i++) {
            form_elements.push(form.elements[i]);
		}
        form_elements.sort(function (a, b) {
            var axy = elementPosition(a);
            var bxy = elementPosition(b);
            if (!axy && !bxy) {
                return 0;
            }
            if (!axy) {
                return 1;
            }
            if (!bxy) {
                return -1;
            }
            if (axy.y == bxy.y) {
                return axy.x - bxy.x;
            }
            return axy.y - bxy.y;
        });
        for (var i = 0; i < form_elements.length; i++) {
            form_elements[i].tabIndex = i + 1;
        }
        
        // jump menus
        forEach(getElementsByTagAndClassName("*", "seagreen-jumpmenu"),
        function (jumpMenu) {
            if (jumpMenu.tagName == "SELECT") {
                connect(jumpMenu, "onchange",
                function (e) {
                    var select = e.src();
                    if (hasElementClass(select[select.selectedIndex], "message")) {
                        return;
                    }
                    if (hasElementClass(select, "newwindow")) {
                        window.open(select.value, "seagreen_jumpmenu");
                    } else {
                        location.href = select.value;
                    }
                });
            } else if (jumpMenu.tagName == "TABLE") {
                connect(getElementsByTagAndClassName("INPUT", "gobutton", jumpMenu)[0], "onclick",
                function (e) {
                    var button = e.src();
                    var tr = button.parentNode.parentNode;
                    var select = tr.getElementsByTagName("SELECT")[0];
                    if (hasElementClass(select[select.selectedIndex], "message")) {
                        return;
                    }
                    if (hasElementClass(select, "newwindow")) {
                        window.open(select.value, "seagreen_jumpmenu");
                    } else {
                        location.href = select.value;
                    }
                });
            }
        });
	});
    
    // go buttons
    forEach(getElementsByTagAndClassName("INPUT", "gobutton"),
    function (b) {
        var jm = b.parentNode.parentNode.getElementsByTagName("SELECT")[0];
        setElementDimensions(b, {w: elementDimensions(b).w, h: elementDimensions(jm).h});
    });
	
    registerComparator("seagreen-dyncombo-options-comparator",
                       function (a, b) { return a.tagName == "OPTION" && b.tagName == "OPTION"; },
                       keyComparator("value"));
    forEach(getElementsByTagAndClassName("SELECT", "seagreen-dyncombo"),
    function (dynCombo) {
        if (hasElementClass(dynCombo, "year")) {
            var option0 = dynCombo.options[0];
            forEach(Sg.range.apply(null, option0.value.split("-")),
            function (i) {
                var year = (new Date()).getFullYear() + i;
                appendChildNodes(dynCombo, OPTION({value: year}, year));
            });
            removeElement(option0);
        }
        /*if (hasElementClass(dynCombo, "state")) {
            //
        } else {
            listMin(dynCombo.options).selected = true;
        }*/
    });

	if (/MSIE [56].*Windows/.test(navigator.userAgent)) {
		var blank = new Image();
		blank.src = prefix + "SG_code/blank.gif";
		forEach(getElementsByTagAndClassName("IMG", "seagreen-shape"),
		function (img) {
			var s = img.runtimeStyle;
			s.width = img.offsetWidth + "px";
			s.height = img.offsetHeight + "px";
			s.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + img.src + "',sizingMethod='scale')";
			img.src = blank.src;
		});
	}
    
    fix_safari2_buttons();
});

function fix_safari2_buttons()
{
    if (!/, like Gecko\) Safari/.test(navigator.userAgent)) {
        return;
    }
    forEach(document.getElementsByTagName('BUTTON'), fix_safari2_button);
}

function fix_safari2_button(button)
{
    var wh = elementDimensions(button);
    button.style.lineHeight = wh.h + "px";
    button.style.textAlign = "center";
}

