function clearBox() {
	if (confirm('Really clear it??')) document.getElementById('i_code').value='';
}
function setBytesIn() {
	var code=document.getElementById('i_code').value;
	var box=document.getElementById('i_bytes');
	box.value=code.length;
}
function runCodeIn() {
	setBytesIn();
	var code=document.getElementById('i_code').value;
	try {
		eval(code);
	} catch (e) {
		var s="There was an error!\n\n";
		//s+="Line: "+e.lineNumber+"\n";
		s+=e.name+": "+e.message+"\n";
		//s+="Stack:\n"+e.stack;
		alert(s);
	}
}
function runCrunchination() {
	setBytesIn();
	var code=document.getElementById('i_code').value;

	//code=unescape(code);                   //in case we pasted in an old bookmarklet
	code=code.replace(/^javascript:/, ''); //strip it if it's there so we can add it in to be sure it's there later
	code=code.replace(/void\(.*\)$/, '');  //to make sure our end of line anchors will work in the future

	//remove line comments
	if (document.getElementById("c_removeComments").checked) {
		code=code.replace(/\/\/.*/g, "");
	}

	//remove spaces / tabs
	if (document.getElementById("c_removeSpace").checked) {
		code=code.replace(/^\s+/g, '');            //remove leading space
		code=code.replace(/\s+$/g, '');            //remove leading space
		code=code.replace(/\n\s+/g, '\n');         //remove leading space from each line
		code=code.replace(/\s+\n/g, '\n');         //remove trailing space from each line
		code=code.replace(/[	 ]+/g, ' ');       //[  ] = tab and space, replace all tabs and spaces with one space
		code=code.replace(/\s?([,!=(),;:{}])\s?/g, '$1'); //no need for space around these characters
	}

	//remove newlines
	if (document.getElementById("c_removeNewlines").checked) {
		code=code.replace(/\n/g, '');
	}

	//remove multiline comments
	if (document.getElementById("c_removeComments").checked) {
		code=code.replace(/\/\*.*\*\//g, "");
	}

	//semicolons .. big one
	if (document.getElementById("c_removeSemis").checked) {
		code=code.replace(/;}/g, '}');
		code=code.replace(/;$/g, '');
		code=code.replace(/;;+/g, ';');
	}

	//collapse long variables
	if (document.getElementById("c_collapseVars").checked || document.getElementById("c_collapseFuncs").checked) {
		var varNames=[],l=code.split(/[{};]/);
		
		//lines that start "var ...."
		for (var i=0; i<l.length; i++) {
			var line=l[i];
			line=line.replace(/".*?"/g, "");   //strip out strings in case they happen to 
			line=line.replace(/'.*?'/g, "");   //contain the delimters we will look for soon
			if (line.match(/var /) && document.getElementById("c_collapseVars").checked) {
				line=line.replace(/.*var\s/, "");  //pull out the var statement and anything that might be before it
				line=line.replace(/\s+/g, "");      //strip out whitespace
				if (""==line) continue;
				var vars=line.split(/,/);
				for (var j=0; j<vars.length; j++) {
					var varName=vars[j].replace(/=.*/, ""); //strip assignment if it's there
					if (varName.length>1) varNames[varNames.length]=varName;
				}
			} else if (line.match(/function /)) {
				//figure out function names
				if (document.getElementById("c_collapseFuncs").checked) {
					varNames[varNames.length]=line.replace(/\n?.*function\s+(.*)\s*\(.*/, "$1");
				}
				//variables declared as func argument names
				var v=line.replace(/\n?.*function.*\((.*)\).*/, "$1");
				v=v.replace(/\s/g, "");
				if (0==v.length) continue;
				v=v.split(/\s*,\s*/);
				for (var j=0; j<v.length; j++) {
					varNames[varNames.length]=v[j];
				}
			}
		}
		if (varNames.length>0) {
			var s='WVUTSRQPONMLHGFEDCABwvutsrqponmlhgfedcab';
			for (var i=0; i<varNames.length; i++) {
				if (i>s.length) break; //if we've used up our single letter variables, forget it

				if (!varNames[i].match(/^[a-z_$]/i)) continue;

				var r=new RegExp(varNames[i], 'g');
				code=code.replace(r, s[i]);
			}
		}
	}

	//escape spaces
	if (document.getElementById("c_escapeSpaces").checked) {
		code=code.replace(/%(\d\d)/g, '%25$1'); //escape out existing % signs
		code=code.replace(/ /g, '%20');         //escape out space as %20
	}

	//anonymous function wrap
	if (document.getElementById("c_anonFunc").checked) {
		code='(function(){'+code+'}())';
	}

	code='javascript:'+code; //quite necessary for the link! ;-)
	//trailing void
	if (document.getElementById("c_void").checked) {
		code=code+";void(0)";
	}


	//record code out length before translating html entities
	document.getElementById('o_size').value=code.length;
	document.getElementById('ie_warn').style.display=(code.length>508?"inline":"none");

	//escape html entities
	if (document.getElementById("c_transHTML").checked) {
		code=code.replace(/&/g, '&amp;');
		code=code.replace(/</g, '&lt;');
		code=code.replace(/>/g, '&gt;');
	}

	//set code out and bookmarklet
	var codeOutBox=document.getElementById('o_code');
	codeOutBox.value=code;
	var codeOutLink=document.getElementById('o_link');
	codeOutLink.href=code;
	var linkName=document.getElementById('i_name').value;
	if (''==linkName) linkName='Bookmarklet';
	codeOutLink.innerHTML=linkName;

	//errors
	var error="";
	if (code.match(/"/)) {
		//error="Double quote detected.  Link above will not work.<br />";
		if (code.match(/'/)) {
			error="Double and single quotes detected.  No bookmarklet link in external HTML will work.<br />";
		}
	}
	document.getElementById('o_error').innerHTML=error;
}
