/*
Copyright (C) 2019 Nathan Nichols
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
console.log("main.js");
function is_in(a, arr){
for(var i = 0; i < arr.length; i++){
if(a == arr[i]){
return true;
}
}
return false;
}
function disable(name){
off = document.getElementsByName(name);
for(var i = 0; i < off.length; i++){
off[i].style = "display:none;"
}
}
function enable(name){
on = document.getElementsByName(name);
for(var i = 0; i < on.length; i++){
on[i].style = ""
}
}
function tag(name){
return "<"+name+">";
}
function etag(name){
return ""+name+">";
}
function surround(name,content){
return tag(name) + content + etag(name);
}
function visible(name){
if(document.getElementsByName(name)[0].style.display == "none"){
return false;
}else{
return true;
}
}
function gen_package(data){
var res = '';
res = res + surround("Service", data["Service"]);
if(visible("FirstClassMailType")){
res=res+surround("FirstClassMailType", data["FirstClassMailType"]);
}
res = res + surround("ZipOrigination", data["ZipOrigination"]);
res = res + surround("ZipDestination", data["ZipDestination"]);
res = res + surround("Pounds", data["Pounds"]);
res = res + surround("Ounces", "0");
res = res + surround("Container", data["Container"]);
res = res + surround("Machinable", data["Machinable"]);
res = res + etag("Package");
return res;
}
function build_xml_domestic(data){
var res = '';
res = res + "2";
res = res + gen_package(data);
res = res + etag("RateV4Request");
return res;
}
function check_domestic(req){
console.log("Form changed.");
serv = req["Service"];
// "Machinable" required for:
mach=["FIRST CLASS","LETTER","FLAT","RETAIL GROUND","ALL","ONLINE"];
if(is_in(serv, mach) == true){
enable("Machinable");
}else{
disable("Machinable")
}
if(serv == "Retail Ground"){
enable("GroundOnly");
}else{
disable("GroundOnly");
}
fcmt=["FIRST CLASS","FIRST CLASS COMMERCIAL","FIRST CLASS HFP COMMERCIAL"];
if(is_in(serv, fcmt)){
enable("FirstClassMailType");
}else{
disable("FirstClassMailType");
}
if(resp["ContentType"] == "LIVES"){
enable("ContentDescription");
}else{
disable("ContentDescription");
}
};
function check_intl(req){
console.log("Form changed.");
};
function byname(name){
return document.getElementsByName(name)[0].value;
}
// Return an array of the selected opion values
function select_values(name) {
var opts = document.getElementsByName(name)[0].options
var res = [];
for(var i = 0; i < opts.length; i++){
if(opts[i].selected){
res.push(opts[i].value);
}
}
return res;
}
// reads the form and returns a dictionary
function read_domestic(){
resp = {};
resp["USERID"] = byname("USERID");
resp["Service"] = byname("Service");
resp["FirstClassMailType"] = byname("FirstClassMailType");
resp["Machinable"] = byname("Machinable");
resp["ZipOrigination"] = byname("ZipOrigination");
resp["ZipDestination"] = byname("ZipDestination");
resp["Pounds"] = byname("Pounds");
resp["Container"] = byname("Container");
//resp["Size"] = byname("Size");
resp["Width"] = byname("Width");
resp["Length"] = byname("Length");
resp["Height"] = byname("Height");
resp["Girth"] = byname("Girth");
resp["Value"] = byname("Value");
resp["AmountToCollect"] = byname("AmountToCollect");
resp["SpecialServices"] = select_values("SpecialService");
resp["ContentType"] = byname("ContentType");
if(resp["ContentType"] == "DEFAULT"){
resp["ContentType"] = "";
}
return resp;
}
// reads the form and returns a dictionary
function read_intl(){
resp = {};
resp["USERID"] = byname("USERID2");
resp["Machinable"] = byname("Machinable2");
resp["MailType"] = byname("MailType");
//resp["POBoxFlag"] = byname("POBoxFlag");
//resp["GiftFlag"] = byname("GiftFlag");
resp["ValueOfContents"] = byname("ValueOfContents");
resp["Country"] = byname("Country");
resp["Pounds"] = byname("Pounds2");
resp["GiftFlag"] = byname("GiftFlag");
resp["POBoxFlag"] = byname("POBoxFlag");
resp["OriginZip"] = byname("OriginZip");
resp["Width"] = byname("Width2");
resp["Length"] = byname("Length2");
resp["Height"] = byname("Height2");
resp["Girth"] = byname("Girth2");
resp["Container"] = byname("Container2");
resp["CommercialFlag"] = byname("CommercialFlag");
resp["CommercialPlusFlag"] = byname("CommercialPlusFlag");
resp["Size"] = byname("Size2");
return resp;
}
function decode_html(input){
var e = document.createElement('div');
e.innerHTML = input;
return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue;
}
function make_row(name, avail, price){
res = "";
res = res+""+name+" | ";
res = res+""+avail+" | ";
res = res+""+price+" | ";
res = res+"
\n";
return res;
}
function parse_response(resp){
console.log(resp.documentElement.outerHTML);
xml_doc = $.parseXML(resp.documentElement.outerHTML);
$xml = $(xml_doc);
errs = $xml.find("Error");
console.log(errs);
var res = "";
if(errs.length > 0){
for(var i = 0; i < errs.length; i++){
res = res+i.toString()+": "+$(errs[i]).find("Description")[0].innerHTML;
res = res +"
";
}
$("#errors").html(res)
$("#mainrate").html("");
$("#results").html("");
return "";
}
$pack = $($xml.find("Package")[0]);
// Get Parse the main result
mailserv = decode_html($pack.find("MailService")[0].innerHTML);
rate = $pack.find("Rate")[0].innerHTML;
var res = "";
res = "Mail Service:"+mailserv+"
";
res = res+"Rate:"+rate+"
\n"
// Generate a table of the services available
servs = $pack.find("SpecialService");
table = make_row(" Service name ", "Available", "Price");
for(var i = 0; i < servs.length; i++){
serv = $(servs[i]);
name = decode_html(serv.find("ServiceName")[0].innerHTML);
avail = serv.find("Available")[0].innerHTML;
price = serv.find("Price")[0].innerHTML;
table = table + make_row(name,avail,price);
}
table = ""+table+"";
$("#mainrate").html(res);
$("#results").html(table);
return table;
}
function make_api_call(url){
$.ajax({
url: url,
cache: false,
type: 'post',
}).done(function(d){
console.log("Success");
var res = parse_response(d);
//$("#results").html(res);
}).always(function(){
}).fail(function(d){
console.log("Failed");
console.log(d);
});
}
function gen_package_intl(data){
var res = "";
res = res + '';
res = res + surround("Pounds",data["Pounds"])
res = res + surround("Ounces","0");
res = res + surround("Machinable",data["Machinable"]);
res = res + surround("MailType",data["MailType"]);
/*
res = res + ""
res = res + surround("POBoxFlag",data["POBoxFlag"]);
res = res + surround("GiftFlag",data["GiftFlag"]);
res = res + ""
*/
res = res + surround("ValueOfContents", data["ValueOfContents"]);
res = res + surround("Country",data["Country"]);
//res = res + surround("Size",data["Size"]);
//res = res + surround("Container",data["Container"]);
//res = res + surround("Width",data["Width"]);
//res = res + surround("Length",data["Length"]);
//res = res + surround("Height",data["Height"]);
//res = res + surround("Girth",data["Girth"]);
res = res + surround("OriginZip",data["OriginZip"]);
res = res + '';
return res;
}
function build_xml_intl(data){
res = "";
res = res + '';
res = res + gen_package_intl(data);
res = res + "";
console.log(res);
return res;
};
window.addEventListener('load', (event) => {
$("#button_domestic").bind("click",function(){
console.log("Making request");
r = read_domestic();
check_domestic(r);
url = "http://production.shippingapis.com/ShippingAPI.dll?API=RateV4&XML=";
url = url + build_xml_domestic(r);
console.log(url);
make_api_call(url);
});
console.log("Window loaded.")
disable("Machinable");
disable("FirstClassMailType");
disable("ContentDescription");
disable("GroundOnly");
document.getElementById("button_intl").style = "display:none;";
document.forms[1].style = "display:none;";
document.forms[0].addEventListener("change", function(){
r = read_domestic();
check_domestic(r);
url = "http://production.shippingapis.com/ShippingAPI.dll?API=RateV4&XML=";
url = url + build_xml_domestic(r);
console.log(url);
});
$("#button_intl").bind("click",function(){
console.log("Making request");
r = read_intl();
check_intl(r);
url = "http://production.shippingapis.com/ShippingAPI.dll?API=IntlRateV2&XML=";
url = url + build_xml_intl(r);
console.log(url);
make_api_call(url);
});
document.forms[1].addEventListener("change", function(){
r = read_intl();
url = "http://production.shippingapis.com/ShippingAPI.dll?API=IntlRateV2&XML=";
url = url + build_xml_intl(r);
console.log(url);
});
});