
	var eval_form_min = function(k,p,c) {
		if (!k[p].value.replace(/^\s+|\s+$/g,"").length)
			return false;
		return true;
	}

	var eval_form_select = function(k,p,c) {
		if (!k[p].value.length || k[p].value == '~~~~' ||
		    k[p].value == '~~' || k[p].value == '~')
			return false;
		return true;
	}

	var eval_form_region = function(k,p,c) {
		if (k[c] && (k[c].value == 'US' || k[c].value == 'CA'))
			return true;
		if (!k[p].value.length || k[p].value == '~~')
			return false;
		return true;
	}

	var eval_form_state = function(k,p,c) {
		if (k[c] && k[c].value != 'US')
			return true;
		if (!k[p].value.length || k[p].value == '~~')
			return false;
		return true;
	}

	var eval_form_prov = function(k,p,c) {
		if (k[c] && k[c].value != 'CA')
			return true;
		if (!k[p].value.length || k[p].value == '~~')
			return false;
		return true;
	}

	var eval_form_card = function(k,p,c) {
		var v = "0123456789";
		var w = "";
		var s = k[p].value;
		for (i=0; i < s.length; i++) {
			x = s.charAt(i);
			if (v.indexOf(x,0) != -1)
				w += x;
		}
		j = w.length / 2;
		if (j < 6.5 || j > 8 || j == 7)
			return false;
		k = Math.floor(j);
		m = Math.ceil(j) - k;
		c = 0;
		for (i=0; i<k; i++) {
			a = w.charAt(i*2+m) * 2;
			c += a > 9 ? Math.floor(a/10 + a%10) : a;
		}
		for (i=0; i<k+m; i++)
			c += w.charAt(i*2+1-m) * 1;
		return (c%10 == 0);
	}

	var eval_form_check = function(k,p,c) {
		return k[p].checked;
	}

	function eval_form_parse(k,m) {
		for (var j=0;j<m.length;j++) {
			var s=m[j][1];
			for (var i=0;i<s.length;i++) {
				var p=s[i];
				if (!k[p[0]])
					continue;
				if (!p[1](k,p[0],p[3])) {
					var err='';
					err+="The entered value under \"" + m[j][0] + " Information\"" +
						" is empty or invalid:\n\n";
					err+="  * " + p[2] + "\n\n";
					err+="This field is required, please enter it now\n";
					alert(err);
					k[p[0]].focus();
					return false;
				}
			}
		}
		return true;
	}

	function eval_form_first(k) {
		var m=[
			[ 'Billing', [
				[    'b[name]',    eval_form_min,      'Full name',           '' ],
				[  'b[f_name]',    eval_form_min,     'First name',           '' ],
				[  'b[l_name]',    eval_form_min,      'Last name',           '' ],
				[    'b[addr]',    eval_form_min, 'Street address',           '' ],
				[    'b[city]',    eval_form_min,           'City',           '' ],
				[ 'b[country]', eval_form_select,        'Country',           '' ],
				[  'b[region]', eval_form_region,   'State/Region', 'b[country]' ],
				[   'b[state]',  eval_form_state,          'State', 'b[country]' ],
				[    'b[prov]',   eval_form_prov,       'Provence', 'b[country]' ],
				[     'b[zip]',    eval_form_min,            'Zip',           '' ],
				[   'b[phone]',    eval_form_min,          'Phone',           '' ],
				[   'b[email]',    eval_form_min,          'Email',           '' ]
			] ]
		];
		if (k['bill_diff'] && k['bill_diff'].checked) {
			var m2=[
				[ 'Shipping', [
					[    's[name]',    eval_form_min,      'Full name',           '' ],
					[  's[f_name]',    eval_form_min,     'First name',           '' ],
					[  's[l_name]',    eval_form_min,      'Last name',           '' ],
					[    's[addr]',    eval_form_min, 'Street address',           '' ],
					[    's[city]',    eval_form_min,           'City',           '' ],
					[ 's[country]', eval_form_select,        'Country',           '' ],
					[  's[region]', eval_form_region,   'State/Region', 's[country]' ],
					[   's[state]',  eval_form_state,          'State', 's[country]' ],
					[    's[prov]',   eval_form_prov,       'Provence', 's[country]' ],
					[     's[zip]',    eval_form_min,            'Zip',           '' ],
					[   's[phone]',    eval_form_min,          'Phone',           '' ],
					[   's[email]',    eval_form_min,          'Email',           '' ]
				] ]
			];
			m=m.concat(m,m2);
		}
		return eval_form_parse(k,m);
	}

	function eval_form_second(k) {
		var m=[
			[ 'Payment', [
				[      'c[type]', eval_form_select,   'Credit card type', '' ],
				[      'c[name]',    eval_form_min,       'Name on card', '' ],
				[       'c[num]',   eval_form_card, 'Credit card number', '' ],
				[ 'c[exp_month]', eval_form_select,   'Expiration month', '' ],
				[  'c[exp_year]', eval_form_select,    'Expiration year', '' ],
				[      'c[cvv2]',    eval_form_min,          'Card CVV2', '' ],
				[    'c[issuer]',    eval_form_min,  'Card issuing bank', '' ]
			] ],
			[ 'Contract', [
				[       'terms',  eval_form_check, 'Accept Terms & Conditions', '' ]
			] ]
		];
		return eval_form_parse(k,m);
	}

	function eval_form_both(n) {
		return (eval_form_first(n.elements) &&
			eval_form_second(n.elements));
	}


