var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

// This function is called from preProcess() for form elements whit names that start with "b64"
function encode64(input) {
   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;

   do {
      chr1 = input.charCodeAt(i++);
      chr2 = input.charCodeAt(i++);
      chr3 = input.charCodeAt(i++);

      enc1 = chr1 >> 2;
      enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
      enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
      enc4 = chr3 & 63;

      if (isNaN(chr2)) {
         enc3 = enc4 = 64;
      } else if (isNaN(chr3)) {
         enc4 = 64;
      }

      output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + 
         keyStr.charAt(enc3) + keyStr.charAt(enc4);
   } while (i < input.length);
   
   return output;
}

function decode64(input) {
   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;

   // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
   input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

   do {
      enc1 = keyStr.indexOf(input.charAt(i++));
      enc2 = keyStr.indexOf(input.charAt(i++));
      enc3 = keyStr.indexOf(input.charAt(i++));
      enc4 = keyStr.indexOf(input.charAt(i++));

      chr1 = (enc1 << 2) | (enc2 >> 4);
      chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
      chr3 = ((enc3 & 3) << 6) | enc4;

      output = output + String.fromCharCode(chr1);

      if (enc3 != 64) {
         output = output + String.fromCharCode(chr2);
      }
      if (enc4 != 64) {
         output = output + String.fromCharCode(chr3);
      }
   } while (i < input.length);

   return output;
}

// base64 encoding and validation will be called from the preProcess function 
function preProcess(val,btnName,btnValue)
{
// Create a new form called tempForm and keep it hidden

	var tempForm = document.createElement('form');
	var cssString = "display:none;visibility: hidden;";
	var newElem = "";

	// Not all browsers support setAttribute for styling
	tempForm.setAttribute("style",cssString);
	tempForm.style.cssText = cssString;

// Assign original form attributes to the tempForm from the original form
	tempForm.setAttribute("action",document.getElementsByTagName('form')[val].getAttribute("action"));
	tempForm.setAttribute("method",document.getElementsByTagName('form')[val].getAttribute("method"));

// Assign a name to the tempForm
	tempForm.setAttribute("name","tempForm");

// Assign an id to the tempForm
	tempForm.setAttribute("id","tempForm");

// Append TempForm to the "body" node in the DOM
	document.body.appendChild(tempForm);

// Get the original form's elements
var elem = document.getElementsByTagName('form')[val].elements;

// Create new form elements that are copies of the original elements except for buttons and textareas
for(var i = 0; i < elem.length; i++) {

	// skip buttons for now
	switch (elem[i].type)
	{
	case "button" :
		break;
	case "submit" :
		break;
	case "textarea" :
		newElem = document.createElement("textarea");
		newElem.setAttribute("name",elem[i].name);
		newElemText = document.createTextNode(elem[i].value.replace(/(\r\n)+/g,'\n')); 
		newElem.appendChild(newElemText);
		if(newElem.name.substring(0,3) == "b64") {
			newElem.value = encode64(newElem.value);
		}
		tempForm.appendChild(newElem);
		newElem = "";
		break;
	case "radio" :
		if (elem[i].checked == true){
		newElem = document.createElement("input");
		newElem.setAttribute("name",elem[i].name);
		newElem.setAttribute("value",elem[i].value);
		if(newElem.name.substring(0,3) == "b64") {
			newElem.value = encode64(newElem.value);
		}
		tempForm.appendChild(newElem);
		newElem = "";
		}
		break;
	case "checkbox" :
		if (elem[i].checked == true){
			newElem = document.createElement("input");
			newElem.setAttribute("name",elem[i].name);
			newElem.setAttribute("value",elem[i].value);
		if(newElem.name.substring(0,3) == "b64") {
			newElem.value = encode64(newElem.value);
		}
		tempForm.appendChild(newElem);
		newElem = "";
		}
		break;
	default :
		newElem = document.createElement("input");
		newElem.setAttribute("name",elem[i].name);
		newElem.setAttribute("value",elem[i].value);
		newElem.setAttribute("type",elem[i].type);
		if(newElem.name.substring(0,3) == "b64") {
			newElem.value = encode64(newElem.value);
		}
		tempForm.appendChild(newElem);
		newElem = "";
	}
}

// Create a field for button information
	if (btnName) {
		newElem = document.createElement("input");
		newElem.setAttribute("type","hidden");

		newElem.setAttribute("name",btnName);

		// If the button's value is diferent from the name, assign it that value, else
		// Make it the same as the name value
		if (btnValue) {
			newElem.setAttribute("value",btnValue);
			} 
			else {
				newElem.setAttribute("value",btnName);
			}

		// Append the new element to tempForm
		tempForm.appendChild(newElem);
		}

// Submit TempForm for processing
	 document.getElementById("tempForm").submit();
}
