var hexTab = '0123456789ABCDEF';

function getEncoded(_code){
	return '%'+hexTab.charAt((_code>>4)&0x0F)+hexTab.charAt(_code&0x0F);
}

function urlEncode(s) {
  var sbuf = new StringBuffer();
  var len = s.length;
  var i;
  for (i = 0; i < len; i++) {
    var ch = s.charAt(i);
    if ('A' <= ch && ch <= 'Z' || 'a' <= ch && ch <= 'z' || '0' <= ch && ch <= '9') {
      sbuf.append(ch);
    } else if (ch == ' ') {			// space
      sbuf.append('+');
    } else if (ch == '-' || ch == '_'		// unreserved
        || ch == '.' || ch == '!'
        || ch == '~' || ch == '*'
        || ch == '\'' || ch == '('
        || ch == ')') {
      sbuf.append(ch);
    } else {
    	ch = s.charCodeAt(i);
	    if (ch <= 0x007f) {		// other ASCII
	      sbuf.append(getEncoded(ch));
	    } else if (ch <= 0x07FF) {		// non-ASCII <= 0x7FF
	      sbuf.append(getEncoded(0xc0 | (ch >> 6)));
	      sbuf.append(getEncoded(0x80 | (ch & 0x3F)));
	    } else {					// 0x7FF < ch <= 0xFFFF
	      sbuf.append(getEncoded(0xe0 | (ch >> 12)));
	      sbuf.append(getEncoded(0x80 | ((ch >> 6) & 0x3F)));
	      sbuf.append(getEncoded(0x80 | (ch & 0x3F)));
	    }
    }
  }
  return sbuf.toString();
}

function buildURLEncodedFormData(_form){
	var
		len = _form.elements.length;
	var 
		sbuf = new StringBuffer();
	var
		first = true;
	var
		i;
	for (i=0; i < len; i++){
		var
			element = _form.elements[i];
		var
			type = element.type;
		var
			name = element.name;
		var
			value;
		if (type == 'checkbox' || type == 'radio'){
			if (!element.checked)
				continue;
			value = element.value;
		}else
		if (type == 'text'){
			value = element.value;
		}else
		if (type == 'textarea'){			
			value = element.value;
		}else
		if (type == 'select-one'){
			value = element.options[element.selectedIndex].value;
		}else
		if (type == 'hidden'){
			value = element.value;
		}
		
		if (!first){
			sbuf.append('&');
		}else
			first = false;
		
		sbuf.append(name);
		sbuf.append('=');
		sbuf.append(urlEncode(value));
	}
			
	return sbuf.toString();
}
