// *******************************************************
// Developed by dyersWeb (c) 2006. All rights reserved.
//
// @package validate.js.php
// @description Checks bitlengths before submission
// *******************************************************

// Global vars
var hasError	= 0;
var called		= 0;
var normal		= "Binary/ASCII Converter";

var errstr = {
	'empty'		: 'Nothing to convert, if both fields are empty.',	// Both fields empty
	'bitlen'	: 'Binary string length must be divisible by 8.',	// Bitlength is wrong
	'not_bin'	: 'You did not enter a binary number.'				// Not binary
};

function validateBytes(errorId, binField, asciiField) {
	if ( !document.getElementById || !document.createElement ) return false;

	// Form fields
	var bin = binField.value, len = bin.length;
	// Legend
	var errNode = typeof errorId=="string" ? document.getElementById(errorId) : errorId;

	// Remove anything not a 1 or a 0.
	binField.value = bin.replace(/[^10]/g, '');

	// Now that unnecessary stuff is removed, are we still valid?
	// "Valid" includes if we have an empty form
	if ( binField.value.length % 8 == 0 && binField.value.length >= 0 && hasError === 0 )
	{
		return true;
	}

	// Determines if binary field contains only binary
	var isBinary = /[^10]/.test(bin);
	
	// Catch anything that fell through from binary field clean
	if ( (len % 8 != 0 || isBinary) && len > 0  ) {

		hasError = 1; // We have an error
		
		if ( called == 0 && hasError == 1 ) {
			errNode.innerHTML = isBinary ? errstr['not_bin']+"\n" : '';
			
			if ( errNode.innerHTML == errstr['not_bin']+"\n" && len % 8 != 0 )
				errNode.innerHTML += "<br>\n" + errstr['bitlen'];
			else if ( len % 8 != 0 )
				errNode.innerHTML = errstr['bitlen'];

			if ( errNode.className != "error" )
				errNode.className = "error";

			binField.className = "errbox";
			binField.focus();

			called = 1; // Set error flag on
			
			return false;
		}
	}
	else {
		if ( (len % 8 == 0 && !isBinary && hasError == 1) || len == 0 ) {
			// Return textarea style to normal
			binField.className = '';
			errNode.innerHTML = normal;
			errNode.className = '';

			// Reset global flags
			hasError = 0;
			called = 0;
			
			// Tell them the problem is fixed
			if ( len != 0 )
				msgFixed(errorId);
			
			return false;
		}
	}
	
	return 0;
}

function msgFixed(err) {
	// Set error node object
	var errNode = typeof(err)=="string" ? document.getElementById(err) : err;

	// Append message on the end of legend
	errNode.appendChild(document.createTextNode(' - All Fixed!'));
	// Remove message 3 seconds later
	setTimeout(function() { removeFixed(err); }, 3000);
}
function removeFixed(err) {
	// Remove fixed message text node
	var errNode = typeof(err)=="string" ? document.getElementById(err) : err;
	if ( errNode.childNodes.length >= 2 ) errNode.removeChild(errNode.lastChild);
}

// Authenticate submission
function checkSubmit(err, bin, ascii) {
	// JavaScript isn't current enough, go ahead and have PHP authenticate
	if ( !document.getElementById || !document.createElement )
		return true;

	// Error already exists?
	if ( hasError == 1 )
		return false;
	
	var binVal = bin.value, binLen = binVal.length;
	var asciiVal = ascii.value, asciiLen = asciiVal.length;
	var errNode = typeof err == "string" ? document.getElementById(err) : err;

	if ( binLen < 1 && asciiLen < 1 ) {
		errNode.innerHTML = errstr['empty'];
		if ( errNode.className != "error" )
			errNode.className = "error";
		bin.style.border = "2px solid #f00";
		ascii.style.border = "2px solid #f00";
		
		return false;
	}
	else {
		if ( binLen > 0 || asciiLen > 0) {
			errNode.innerHTML = normal;
			errNode.className = '';
			bin.style.border = '';
			ascii.style.border = '';
			ascii.focus();
			
			return true;
		}
	}
	
	return true;
}