function urldecode( str ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Philip Peterson
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: AJ
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Brett Zamir (http://brettz9.blogspot.com)
    // +      input by: travc
    // +      input by: Brett Zamir (http://brettz9.blogspot.com)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // %          note 1: info on what encoding functions to use from: http://xkr.us/articles/javascript/encode-compare/
    // *     example 1: urldecode('Kevin+van+Zonneveld%21');
    // *     returns 1: 'Kevin van Zonneveld!'
    // *     example 2: urldecode('http%3A%2F%2Fkevin.vanzonneveld.net%2F');
    // *     returns 2: 'http://kevin.vanzonneveld.net/'
    // *     example 3: urldecode('http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a');
    // *     returns 3: 'http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a'
    
    var histogram = {};
    var ret = str.toString();
    
    var replacer = function(search, replace, str) {
        var tmp_arr = [];
        tmp_arr = str.split(search);
        return tmp_arr.join(replace);
    };
    
    // The histogram is identical to the one in urlencode.
    histogram["'"]   = '%27';
    histogram['(']   = '%28';
    histogram[')']   = '%29';
    histogram['*']   = '%2A';
    histogram['~']   = '%7E';
    histogram['!']   = '%21';
    histogram['%20'] = '+';
    histogram['\u20AC'] = '%80';
    histogram['\u0081'] = '%81';
    histogram['\u201A'] = '%82';
    histogram['\u0192'] = '%83';
    histogram['\u201E'] = '%84';
    histogram['\u2026'] = '%85';
    histogram['\u2020'] = '%86';
    histogram['\u2021'] = '%87';
    histogram['\u02C6'] = '%88';
    histogram['\u2030'] = '%89';
    histogram['\u0160'] = '%8A';
    histogram['\u2039'] = '%8B';
    histogram['\u0152'] = '%8C';
    histogram['\u008D'] = '%8D';
    histogram['\u017D'] = '%8E';
    histogram['\u008F'] = '%8F';
    histogram['\u0090'] = '%90';
    histogram['\u2018'] = '%91';
    histogram['\u2019'] = '%92';
    histogram['\u201C'] = '%93';
    histogram['\u201D'] = '%94';
    histogram['\u2022'] = '%95';
    histogram['\u2013'] = '%96';
    histogram['\u2014'] = '%97';
    histogram['\u02DC'] = '%98';
    histogram['\u2122'] = '%99';
    histogram['\u0161'] = '%9A';
    histogram['\u203A'] = '%9B';
    histogram['\u0153'] = '%9C';
    histogram['\u009D'] = '%9D';
    histogram['\u017E'] = '%9E';
    histogram['\u0178'] = '%9F';
 
    for (replace in histogram) {
        search = histogram[replace]; // Switch order when decoding
        ret = replacer(search, replace, ret) // Custom replace. No regexing   
    }
    
    // End with decodeURIComponent, which most resembles PHP's encoding functions
    ret = decodeURIComponent(ret);
 
    return ret;
}
function unserialize(data){
    // http://kevin.vanzonneveld.net
    // +     original by: Arpad Ray (mailto:arpad@php.net)
    // +     improved by: Pedro Tainha (http://www.pedrotainha.com)
    // +     bugfixed by: dptr1988
    // +      revised by: d3x
    // +     improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: Brett Zamir (http://brettz9.blogspot.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // %            note: We feel the main purpose of this function should be to ease the transport of data between php & js
    // %            note: Aiming for PHP-compatibility, we have to translate objects to arrays 
    // *       example 1: unserialize('a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}');
    // *       returns 1: ['Kevin', 'van', 'Zonneveld']
    // *       example 2: unserialize('a:3:{s:9:"firstName";s:5:"Kevin";s:7:"midName";s:3:"van";s:7:"surName";s:9:"Zonneveld";}');
    // *       returns 2: {firstName: 'Kevin', midName: 'van', surName: 'Zonneveld'}
    
    var error = function (type, msg, filename, line){throw new window[type](msg, filename, line);};
    var read_until = function (data, offset, stopchr){
        var buf = [];
        var chr = data.slice(offset, offset + 1);
        var i = 2;
        while (chr != stopchr) {
            if ((i+offset) > data.length) {
                error('Error', 'Invalid');
            }
            buf.push(chr);
            chr = data.slice(offset + (i - 1),offset + i);
            i += 1;
        }
        return [buf.length, buf.join('')];
    };
    var read_chrs = function (data, offset, length){
        var buf;
        
        buf = [];
        for(var i = 0;i < length;i++){
            var chr = data.slice(offset + (i - 1),offset + i);
            buf.push(chr);
        }
        return [buf.length, buf.join('')];
    };
    var _unserialize = function (data, offset){
        var readdata;
        var readData;
        var chrs = 0;
        var ccount;
        var stringlength;
        var keyandchrs;
        var keys;
 
        if(!offset) offset = 0;
        var dtype = (data.slice(offset, offset + 1)).toLowerCase();
        
        var dataoffset = offset + 2;
        var typeconvert = new Function('x', 'return x');
        
        switch(dtype){
            case "i":
                typeconvert = new Function('x', 'return parseInt(x)');
                readData = read_until(data, dataoffset, ';');
                chrs = readData[0];
                readdata = readData[1];
                dataoffset += chrs + 1;
            break;
            case "b":
                typeconvert = new Function('x', 'return (parseInt(x) == 1)');
                readData = read_until(data, dataoffset, ';');
                chrs = readData[0];
                readdata = readData[1];
                dataoffset += chrs + 1;
            break;
            case "d":
                typeconvert = new Function('x', 'return parseFloat(x)');
                readData = read_until(data, dataoffset, ';');
                chrs = readData[0];
                readdata = readData[1];
                dataoffset += chrs + 1;
            break;
            case "n":
                readdata = null;
            break;
            case "s":
                ccount = read_until(data, dataoffset, ':');
                chrs = ccount[0];
                stringlength = ccount[1];
                dataoffset += chrs + 2;
                
                readData = read_chrs(data, dataoffset+1, parseInt(stringlength));
                chrs = readData[0];
                readdata = readData[1];
                dataoffset += chrs + 2;
                if(chrs != parseInt(stringlength) && chrs != readdata.length){
                    error('SyntaxError', 'String length mismatch');
                }
            break;
            case "a":
                readdata = {};
                
                keyandchrs = read_until(data, dataoffset, ':');
                chrs = keyandchrs[0];
                keys = keyandchrs[1];
                dataoffset += chrs + 2;
                
                for(var i = 0;i < parseInt(keys);i++){
                    var kprops = _unserialize(data, dataoffset);
                    var kchrs = kprops[1];
                    var key = kprops[2];
                    dataoffset += kchrs;
                    
                    var vprops = _unserialize(data, dataoffset);
                    var vchrs = vprops[1];
                    var value = vprops[2];
                    dataoffset += vchrs;
                    
                    readdata[key] = value;
                }
                
                dataoffset += 1;
            break;
            default:
                error('SyntaxError', 'Unknown / Unhandled data type(s): ' + dtype);
            break;
        }
        return [dtype, dataoffset - offset, typeconvert(readdata)];
    };
    return _unserialize(data, 0)[2];
}
function getUrlVars(){    var vars = [], hash;    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');     for(var i = 0; i < hashes.length; i++)    {        hash = hashes[i].split('=');        vars.push(hash[0]);        vars[hash[0]] = hash[1];    }     return vars;}
function checkData() {
  var urls = getUrlVars()
  if (urls['confirm']) fillForm(unserialize(urldecode(urls['confirm'])))
  }
function setOption(sel,optionText) {
  if (sel.options) {
    for (var i=0; i<sel.options.length; i++) if (sel.options[i].innerHTML.toUpperCase() == optionText.toUpperCase()) {
      sel.selectedindex = sel.options[i].index
      sel.options[i].setAttribute('selected','selected')
      return true
      }
    }
  return false
  }
function fillForm(data) {
  //alert(data[0])
  for (var i=0; i<document.getElementsByTagName('FORM').length; i++)
    if (document.getElementsByTagName('FORM')[i].name == "aspnetForm")
      var Form = document.getElementsByTagName('FORM')[i]
  if (Form) {
    var html = '<p>These details will be sent to National Truck Rental, please click below to confirm</p><h5>Vehicle Rental</h5>'
    setOption(Form.ctl00$MainContent$ctl03$field1,data[0])
    html += '<div class="field"><div>&nbsp;</div><label>Vehicle</label><span>'+data[0]+'</span><div>&nbsp;</div></div>'
    Form.ctl00$MainContent$ctl03$field2.value = data[1]
    html += '<div class="field"><label>Number of days</label><span>'+data[1]+'</span><div>&nbsp;</div></div>'
    Form.ctl00$MainContent$ctl03$field3.value = data[2]
    html += '<div class="field"><label>Pick-up Date</label><span>'+data[2]+'</span><div>&nbsp;</div></div>'
    Form.ctl00$MainContent$ctl03$field4.value = data[3]
    html += '<div class="field"><label>Pick-up Time</label><span>'+data[3]+'</span><div>&nbsp;</div></div>'
    
    html += '<h5>Your Details</h5>'
    Form.ctl00$MainContent$ctl03$field5.value = data[4]
    html += '<div class="field"><div>&nbsp;</div><label>First name</label><span>'+data[4]+'</span><div>&nbsp;</div></div>'
    Form.ctl00$MainContent$ctl03$field6.value = data[5]
    html += '<div class="field"><label>Last Name</label><span>'+data[5]+'</span><div>&nbsp;</div></div>'
    Form.ctl00$MainContent$ctl03$field7.value = data[6]
    html += '<div class="field"><label>Email Address</label><span>'+data[6]+'</span><div>&nbsp;</div></div>'
    Form.ctl00$MainContent$ctl03$field8.value = data[7]
    html += '<div class="field"><label>Phone Number</label><span>'+data[7]+'</span><div>&nbsp;</div></div>'
    Form.ctl00$MainContent$ctl03$field14.value = data[11]
    html += '<div class="field"><label>Address 1</label><span>'+data[11]+'</span><div>&nbsp;</div></div>'
    Form.ctl00$MainContent$ctl03$field15.value = data[12]
    html += '<div class="field"><label>Address 2</label><span>'+data[12]+'</span><div>&nbsp;</div></div>'
    Form.ctl00$MainContent$ctl03$field16.value = data[13]
    html += '<div class="field"><label>City/Town</label><span>'+data[13]+'</span><div>&nbsp;</div></div>'
    Form.ctl00$MainContent$ctl03$field17.value = data[14]
    html += '<div class="field"><label>County</label><span>'+data[14]+'</span><div>&nbsp;</div></div>'
    Form.ctl00$MainContent$ctl03$field18.value = data[15]
    html += '<div class="field"><label>Postal Code</label><span>'+data[15]+'</span><div>&nbsp;</div></div>'
    
    html += '<h5>Accessories</h5>'
    if (data[8] !== 'No') {
      var htrollies = data[8].split(', ')
      Form.ctl00$MainContent$ctl03$field9$0.setAttribute('checked','checked')
      Form.ctl00$MainContent$ctl03$field10.value = htrollies[1]
      }
    html += '<div class="field"><div>&nbsp;</div><label>Hand Trollies</label><span>'+data[8]+'</span><div>&nbsp;</div></div>'
    if (data[9] !== 'No') {
      var bblwrap = data[9].split(', ')
      Form.ctl00$MainContent$ctl03$field11$0.setAttribute('checked','checked')
      Form.ctl00$MainContent$ctl03$field12.value = bblwrap[1]
      }
    html += '<div class="field"><label>Bubble Wrap</label><span>'+data[9]+'</span><div>&nbsp;</div></div>'
    if (data[10] !== 'No') {
      Form.ctl00$MainContent$ctl03$field13$0.setAttribute('checked','checked')
      }
    html += '<div class="field"><label>Tail Lift</label><span>'+data[10]+'</span><div>&nbsp;</div></div>'
    
    html += '<h5>Driver&#39;s Details</h5>'
    Form.ctl00$MainContent$ctl03$field19.value = data[17]
    html += '<div class="field"><div>&nbsp;</div><label>Driver&#39;s License Number</label><span>'+data[17]+'</span><div>&nbsp;</div></div>'
    Form.ctl00$MainContent$ctl03$field20.value = data[16]
    html += '<div class="field"><label>Driver&#39;s Date of Birth</label><span>'+data[16]+'</span><div>&nbsp;</div></div>'
    setOption(Form.ctl00$MainContent$ctl03$field21,data[18])
    html += '<div class="field"><label>Country of Issue</label><span>'+data[18]+'</span><div>&nbsp;</div></div>'
    Form.ctl00$MainContent$ctl03$field22.value = data[19]
    html += '<div class="field"><label>Issue Date</label><span>'+data[19]+'</span><div>&nbsp;</div></div>'
    setOption(Form.ctl00$MainContent$ctl03$field23,data[20])
    html += '<div class="field"><label>Insurance Option</label><span>'+data[20]+'</span><div>&nbsp;</div></div>'
    Form.ctl00$MainContent$ctl03$field24.value = data[21]
    Form.ctl00$MainContent$ctl03$field24.innerHTML = data[21]
    html += '<div class="field"><label>Special Requests / Comments</label><span>'+data[21]+'</span><div>&nbsp;</div></div>'
    
    document.getElementById('bookingformAPI').style['width'] = '1px'
    document.getElementById('bookingformAPI').style['height'] = '1px'
    document.getElementById('bookingformAPI').style['overflow'] = 'hidden'
    document.getElementById('bookingformAPI').style['top'] = '-9999px'
    document.getElementById('bookingformAPI').style['left'] = '-9999px'
    document.getElementById('bookingformAPI').style['position'] = 'absolute'
    
    for (var i=0; i<document.getElementsByTagName('H1').length; i++)
      if (document.getElementsByTagName('H1')[i].innerHTML == 'Book Truck Rental Online')
        document.getElementsByTagName('H1')[i].innerHTML = 'Confirm quotation details'
    for (var i=0; i<document.getElementsByTagName('INPUT').length; i++)
      if (document.getElementsByTagName('INPUT')[i].value == 'Request a Quote') {
        document.getElementsByTagName('INPUT')[i].value = 'Confirm & Send'
        document.getElementsByTagName('INPUT')[i].style['margin'] = '0 0 0 360px'
        }
    
    document.getElementById('BFAPIresults').innerHTML = html
    var restoreAction = Form.action.split('?')
    Form.action = restoreAction[0]
    }
  }
