// © 2008 United States Postal Service. All rights reserved. //flash input variables var flashCount = 0; var flashInput = null; var objTrackingObjectToAddToAlertCollection = null; //Main javascript collection This is populated with TrackAlertObj objects. This array is used to hold all the saved updates for the user while the Gadget is loaded. var trackingAlerts = new Object(); trackingAlerts.collection = new Array(); //This function is run when the Gadget is first loaded to run some initilizing code. function OnLoad(){ LoadTrackingObjArrayFromUserPref(); //This section of code loads the updates tab if the user has saved tracking numbers. var prefs = new _IG_Prefs(); var strTNs = prefs.getString("trackingAlerts"); if(strTNs.length > 0){ showTrackingAlertPane(); } else{ showTrackConfirmPane(); } } //This function is used to make a single update request function UpdateTrackingStatusSingleRequest(TrackingNumber){ var url = OnGenerateUrlSingle(TrackingNumber); document.getElementById("divConfirmError").innerHTML = "An issue was encountered with the tracking number. Click here for more information."; document.getElementById("divConfirmUpdating").style.visibility = "visible"; _IG_FetchXmlContent(url, function(response){ParseSingleResponseObject(response);}); } //this function is called when the response is returned from the UpdateTrackingStatusSingleRequest function. function ParseSingleResponseObject(response){ document.getElementById("divConfirmUpdating").style.visibility = "hidden"; //Error in the response if (response == null || typeof(response) != "object" || response.firstChild == null) { ClearRowsFromTable(document.getElementById("trackConfirmResults")); document.getElementById("divConfirmError").style.display = "inline"; return; } //Error returned if(response.getElementsByTagName("Error").length > 0){ ClearRowsFromTable(document.getElementById("trackConfirmResults")); document.getElementById("divConfirmError").style.display = "block"; return; } else{ document.getElementById("divConfirmError").style.display = "none"; } var trackNumber, eventTime, eventDate, event, eventCity, eventState, eventZIPCode, eventCountry, firmName, name, authorizedAgent; eventTime = ""; eventDate = ""; eventCity = ""; eventState = ""; eventZIPCode = ""; eventCountry = ""; firmName = ""; name = ""; authorizedAgent = ""; //XML response parsing trackNumber = response.getElementsByTagName("TrackInfo").item(0).attributes.item(0).nodeValue var trackSummaryNode = response.getElementsByTagName("TrackSummary"); for (var i = 0; i < trackSummaryNode.length ; i++){ var nodeList = trackSummaryNode.item(i).childNodes; for(var j = 0; j < nodeList.length; j++){ var node = nodeList.item(j); if(node.firstChild != null){ switch(node.nodeName){ case "EventTime": eventTime = node.firstChild.nodeValue; break; case "EventDate": eventDate = node.firstChild.nodeValue; break; case "Event": event = node.firstChild.nodeValue; break; case "EventCity": eventCity = node.firstChild.nodeValue; break; case "EventState": eventState = node.firstChild.nodeValue; break; case "EventZipCode": eventZIPCode = node.firstChild.nodeValue; break; case "EventCountry": eventCountry = node.firstChild.nodeValue; break; case "FirmName": firmName = node.firstChild.nodeValue; break; case "Name": name = node.firstChild.nodeValue; break; case "AuthorizedAgent": authorizedAgent = node.firstChild.nodeValue; break; } } } } objTrackingObjectToAddToAlertCollection = new TrackingAlertObj(trackNumber, eventTime, eventDate, event, eventCity, eventState, eventZIPCode, eventCountry, firmName, name, authorizedAgent); AddRowToTrackingResults("" + AddSpacesToTN(objTrackingObjectToAddToAlertCollection.getTrackingNumber()) + " " + objTrackingObjectToAddToAlertCollection.AlertMessage() , objTrackingObjectToAddToAlertCollection.getTrackingNumber()); } //This function is called when the Gadget is first loaded in the browser to get the tracking numbers from the userpref which is stored as a cookie. function LoadTrackingObjArrayFromUserPref(){ var prefs = new _IG_Prefs(); var strTNs = prefs.getString("trackingAlerts"); //alert(strTNs); if(strTNs.length > 0){ var arrayTNs = new Array(); arrayTNs = strTNs.split("~"); var arrayFirstTen = arrayTNs.slice(0,10); var arrayRest = arrayTNs.slice(10); //create url var url = OnGenerateUrlMultiple(arrayFirstTen.join("~")); document.getElementById("divAlertUpdating").style.display = "inline"; document.getElementById("divNumAlerts").style.display = "none"; //alert("presend"); _IG_FetchXmlContent(url, function(response){ParseSavedAlerts(response, arrayRest.join("~"), 0);}); } } //this function parses the response given when the LoadTrackingObjArrayFromUserPref function recieves it. function ParseSavedAlerts(response, remainingTNs, startlocation){ // alert("recieved " + startlocation); //Error in the response if (response == null || typeof(response) != "object" || response.firstChild == null) { return; } var numberforNext = startlocation; var trackNumber, eventTime, eventDate, event, eventCity, eventState, eventZIPCode, eventCountry, firmName, name, authorizedAgent; eventTime = ""; eventDate = ""; eventCity = ""; eventState = ""; eventZIPCode = ""; eventCountry = ""; firmName = ""; name = ""; authorizedAgent = ""; var trackInfoNodes = response.getElementsByTagName("TrackInfo"); for(var k = 0; k < trackInfoNodes.length; k++){ trackNumber = trackInfoNodes.item(k).attributes.item(0).nodeValue var trackSummaryNode = trackInfoNodes[k].getElementsByTagName("TrackSummary"); for (var i = 0; i < trackSummaryNode.length ; i++){ var nodeList = trackSummaryNode.item(i).childNodes; for(var j = 0; j < nodeList.length; j++){ var node = nodeList.item(j); if(node.firstChild != null){ switch(node.nodeName){ case "EventTime": eventTime = node.firstChild.nodeValue; break; case "EventDate": eventDate = node.firstChild.nodeValue; break; case "Event": event = node.firstChild.nodeValue; break; case "EventCity": eventCity = node.firstChild.nodeValue; break; case "EventState": eventState = node.firstChild.nodeValue; break; case "EventZipCode": eventZIPCode = node.firstChild.nodeValue; break; case "EventCountry": eventCountry = node.firstChild.nodeValue; break; case "FirmName": firmName = node.firstChild.nodeValue; break; case "Name": name = node.firstChild.nodeValue; break; case "AuthorizedAgent": authorizedAgent = node.firstChild.nodeValue; break; } } } } numberforNext += 1; trackingAlerts.collection[k + startlocation] = new TrackingAlertObj(trackNumber, eventTime, eventDate, event, eventCity, eventState, eventZIPCode, eventCountry, firmName, name, authorizedAgent); eventTime = ""; eventDate = ""; eventCity = ""; eventState = ""; eventZIPCode = ""; eventCountry = ""; firmName = ""; name = ""; authorizedAgent = ""; } updateAlertNumber(); //alert("Processed " + startlocation); if(remainingTNs.length > 0){ var arrayTNs = new Array(); arrayTNs = remainingTNs.split("~"); var arrayFirstTen = arrayTNs.slice(0,10); var arrayRest = arrayTNs.slice(10); //create url var url = OnGenerateUrlMultiple(arrayFirstTen.join("~")); //alert("pre-request" + numberforNext); _IG_FetchXmlContent(url, function(response){ParseSavedAlerts(response, arrayRest.join("~"),numberforNext);}); } else{ document.getElementById("divAlertUpdating").style.display = "none"; document.getElementById("divNumAlerts").style.display = "inline"; if(document.getElementById("divAlertTable").style.visibility == "visible"){ LoadTrackingAlertTable(); } } } //This function is called everytime there is a change in the trackingAlerts array. This is called so that the userpref variable is updated so as to maintain the proper list of tracking numbers for the user. function SaveTrackingObjArrayToUserPref(){ // use join from the TN array to the string var arrayTNs = new Array(); for(var i = 0;ihere for more information."; _IG_FetchXmlContent(url, function(response){ParseSingleAlertResponseObject(response);}); } //This function is run when the response is recieved from UpdateTrackingStatusSingleAlertRequest. function ParseSingleAlertResponseObject(response){ document.getElementById("divAlertUpdating").style.display = "none"; document.getElementById("divNumAlerts").style.display = "inline"; if (response == null || typeof(response) != "object" || response.firstChild == null) { //throw error message return; } //clear error message if(response.getElementsByTagName("Error").length > 0){ document.getElementById("divAlertError").style.display = "block"; document.getElementById("divAlertTable").style.height = "94px"; return; } document.getElementById("divAlertError").style.display = "none"; document.getElementById("divAlertTable").style.height = "133px"; var maxLength = 25; if(trackingAlerts.collection.length >= maxLength){ trackingAlerts.collection.pop(); } var index = trackingAlerts.collection.length; for(var i = index - 1; i >= 0; i--){ trackingAlerts.collection[i+1] = trackingAlerts.collection[i]; } var trackNumber, eventTime, eventDate, event, eventCity, eventState, eventZIPCode, eventCountry, firmName, name, authorizedAgent; eventTime = ""; eventDate = ""; eventCity = ""; eventState = ""; eventZIPCode = ""; eventCountry = ""; firmName = ""; name = ""; authorizedAgent = ""; trackNumber = response.getElementsByTagName("TrackInfo").item(0).attributes.item(0).nodeValue var trackSummaryNode = response.getElementsByTagName("TrackSummary"); for (var i = 0; i < trackSummaryNode.length ; i++){ var nodeList = trackSummaryNode.item(i).childNodes; for(var j = 0; j < nodeList.length; j++){ var node = nodeList.item(j); if(node.firstChild != null){ switch(node.nodeName){ case "EventTime": eventTime = node.firstChild.nodeValue; break; case "EventDate": eventDate = node.firstChild.nodeValue; break; case "Event": event = node.firstChild.nodeValue; break; case "EventCity": eventCity = node.firstChild.nodeValue; break; case "EventState": eventState = node.firstChild.nodeValue; break; case "EventZipCode": eventZIPCode = node.firstChild.nodeValue; break; case "EventCountry": eventCountry = node.firstChild.nodeValue; break; case "FirmName": firmName = node.firstChild.nodeValue; break; case "Name": name = node.firstChild.nodeValue; break; case "AuthorizedAgent": authorizedAgent = node.firstChild.nodeValue; break; } } } } trackingAlerts.collection[0] = new TrackingAlertObj(trackNumber, eventTime, eventDate, event, eventCity, eventState, eventZIPCode, eventCountry, firmName, name, authorizedAgent); eventTime = ""; eventDate = ""; eventCity = ""; eventState = ""; eventZIPCode = ""; eventCountry = ""; firmName = ""; name = ""; authorizedAgent = ""; SaveTrackingObjArrayToUserPref(); LoadTrackingAlertTable(); updateAlertNumber(); document.getElementById("divAlertTable").style.visibility = "visible"; document.getElementById("labelNumberInput").value = "Enter Label Number"; } //Since the USPS tracking number actually has spaces every 4 characters even thought the response returned from the TrackV2 API does not, this function adds the spaces when displayed by the Gadget function AddSpacesToTN(trackingnumber){ var tnArray = trackingnumber.split(""); var m = 4; for(var i=1;i < tnArray.length;i++){ if(i%m==0){ tnArray.splice(i,0, " "); m = 5; } } return tnArray.join(""); } //This function is called when the checkbox in the header row is clicked. It checks or unchecks all the checkboxes in the rows of the updates table. function CheckBoxHeaderClicked(){ for(var i=0;i 0){ var rowTR = document.getElementById("trackAlertsResults").insertRow(0); rowTR.id = "trackingheader"; var checkboxCell = rowTR.insertCell(0); checkboxCell.innerHTML = ""; var leftCell = rowTR.insertCell(1); leftCell.align = "center"; leftCell.innerHTML = "Tracking Status"; } for(var i = 0; i < trackingAlerts.collection.length; i++){ AddRowToTrackingAlertTable(trackingAlerts.collection[i], i + 1); } } //this function adds a row to the updates table based on data recieved. function AddRowToTrackingAlertTable(trackingAlertObj, rowindex){ var row = rowindex - 1; var rowTR = document.getElementById("trackAlertsResults").insertRow(rowindex); rowTR.id = "trackingrow" + row; var checkboxCell = rowTR.insertCell(0); checkboxCell.innerHTML = ""; var leftCell = rowTR.insertCell(1); leftCell.innerHTML = "" + AddSpacesToTN(trackingAlertObj.getTrackingNumber()) + " " + trackingAlertObj.AlertMessage(); } //this function removes a row from the updates table and removes it from the trackingAlerts Array and from the userprefs function RemoveRowFromTrackingAlertTable(row){ trackingAlerts.collection.splice(row, 1); LoadTrackingAlertTable(); updateAlertNumber(); document.getElementById("divAlertTable").style.visibility = "visible"; SaveTrackingObjArrayToUserPref(); } //this function removes all the checked rows from the table function deleteCheckedRows(){ for(var i=trackingAlerts.collection.length - 1;i >= 0; i--){ if(document.getElementById("checkboxAlert" + i).checked){ trackingAlerts.collection.splice(i,1); } } SaveTrackingObjArrayToUserPref(); LoadTrackingAlertTable(); updateAlertNumber(); } //This function updates the statuses of all the checked rows in the statuses table. function updateCheckedRows(){ var arrayTNs = new Array(); var arrayTNlength = 0; for(var i=0;i < trackingAlerts.collection.length ;i++){ if(document.getElementById("checkboxAlert" + i).checked == true){ arrayTNs[arrayTNlength] = trackingAlerts.collection[i].getTrackingNumber(); arrayTNlength += 1; } } if(arrayTNlength > 0){ var arrayFirstTen = arrayTNs.slice(0,10); var arrayRest = arrayTNs.slice(10); //create url var url = OnGenerateUrlMultiple(arrayFirstTen.join("~")); document.getElementById("divAlertUpdating").style.display = "inline"; document.getElementById("divNumAlerts").style.display = "none"; _IG_FetchXmlContent(url, function(response){processUpdateCheckedRows(response, arrayRest.join("~"));}); } } //this function is called as part of the updateCheckedRows funtion. Because the TrackV2 API only returns results for 10 tracking numbers (no matter how many it is sent), this method is recursive //with each sucessive iteration processing the next batch of returned responses. If the user has more than 20 updates this means that the function will be run up to 3 times. function processUpdateCheckedRows(response, remainingTNs){ if (response == null || typeof(response) != "object" || response.firstChild == null) { document.getElementById("divAlertError").style.display = "block"; return; } document.getElementById("divAlertUpdating").style.display = "none"; document.getElementById("divNumAlerts").style.display = "inline"; var trackNumber, eventTime, eventDate, event, eventCity, eventState, eventZIPCode, eventCountry, firmName, name, authorizedAgent; eventTime = ""; eventDate = ""; eventCity = ""; eventState = ""; eventZIPCode = ""; eventCountry = ""; firmName = ""; name = ""; authorizedAgent = ""; var trackInfoNodes = response.getElementsByTagName("TrackInfo"); for(var k = 0; k < trackInfoNodes.length; k++){ trackNumber = trackInfoNodes.item(k).attributes.item(0).nodeValue var trackSummaryNode = trackInfoNodes[k].getElementsByTagName("TrackSummary"); for (var i = 0; i < trackSummaryNode.length ; i++){ var nodeList = trackSummaryNode.item(i).childNodes; for(var j = 0; j < nodeList.length; j++){ var node = nodeList.item(j); if(node.firstChild != null){ switch(node.nodeName){ case "EventTime": eventTime = node.firstChild.nodeValue; break; case "EventDate": eventDate = node.firstChild.nodeValue; break; case "Event": event = node.firstChild.nodeValue; break; case "EventCity": eventCity = node.firstChild.nodeValue; break; case "EventState": eventState = node.firstChild.nodeValue; break; case "EventZipCode": eventZIPCode = node.firstChild.nodeValue; break; case "EventCountry": eventCountry = node.firstChild.nodeValue; break; case "FirmName": firmName = node.firstChild.nodeValue; break; case "Name": name = node.firstChild.nodeValue; break; case "AuthorizedAgent": authorizedAgent = node.firstChild.nodeValue; break; } } } } for(var m = 0;m 0){ var arrayTNs = new Array(); arrayTNs = remainingTNs.split("~"); var arrayFirstTen = arrayTNs.slice(0,10); var arrayRest = arrayTNs.slice(10); //create url var url = OnGenerateUrlMultiple(arrayFirstTen.join("~")); document.getElementById("divAlertUpdating").style.display = "inline"; document.getElementById("divNumAlerts").style.display = "none"; _IG_FetchXmlContent(url, function(response){processUpdateCheckedRows(response, arrayRest.join("~"));}); } } //removes all the rows from the table. this is used to clear out the table right before it's rebuilt based upon what's currently in the trackingAlerts Array function ClearRowsFromTable(table){ while(table.rows.length){ table.deleteRow(table.rows.length-1); } } //used to display the results returned from the single request on the Track & Confirm tab. function AddRowToTrackingResults(description, trackingnumber){ ClearRowsFromTable(document.getElementById("trackConfirmResults")); var rowTR = document.getElementById("trackConfirmResults").insertRow(0); rowTR.id = "resultsTblRow0"; var leftCell = rowTR.insertCell(0); leftCell.innerHTML = description; var rightCell = rowTR.insertCell(1); rightCell.innerHTML = "Add to your updates"; document.getElementById("trackConfirmResults").style.visibility = "visible"; return rowTR; } //Adds a tracking number to the trackingAlerts array function AddTrackingNumberToAlerts(){ //This is the maximum number of tracking numbers stored as required by the business rules. var maxLength = 25; if(trackingAlerts.collection.length >= maxLength){ trackingAlerts.collection.pop(); } var index = trackingAlerts.collection.length; for(var i = index - 1; i >= 0; i--){ trackingAlerts.collection[i+1] = trackingAlerts.collection[i]; } trackingAlerts.collection[0] = objTrackingObjectToAddToAlertCollection; SaveTrackingObjArrayToUserPref(); LoadTrackingAlertTable(); updateAlertNumber(); document.getElementById("divAlertTable").style.visibility = "visible"; showTrackingAlertPane(); } //removes a row from the specified table. I'm not sure this is still used. function RemoveRowFromResultsTable(sender, tableId) { var table = document.getElementById(tableId); var rowIndex = sender.parentNode.parentNode.parentNode.rowIndex; table.deleteRow(rowIndex); } //If the user doesn't have anything in one of the textboxes and presses the corresponding button, the textbox will flash reminding the user to enter in a tracking number. function flashInputControl(input) { if(document.getElementById(input) != null) flashInput = document.getElementById(input); if(flashCount < 4) { var className; if(flashCount % 2 == 0){ flashInput.style.border = "solid 3px #005a9c"; flashInput.style.borderStyle = "solid"; } else{ flashInput.style.borderTop = "solid 1px #b2b2b2"; flashInput.style.borderLeft = "solid 1px #b2b2b2"; flashInput.style.borderRight = "solid 1px #b2b2b2"; flashInput.style.borderBottom = "solid 1px #e6e6e6"; } flashCount++; setTimeout(flashInputControl, 100); } else { flashCount = 0; flashInput = null; } } //----Timer Call Methods (delegates) function flashTrackingNumberInput() { flashInputControl("textTrackingNumber"); } function flashAddTrackingAlertInput() { flashInputControl("labelNumberInput"); } function protoTypeAlert() { setTrackingAlertOn(true); } //----Object Tracking Alert (Class) // this is the base class that holds all the information about a tracking number. Since JavaScript isn't natively object oriented this little workaround closely simulates a custom object. function TrackingAlertObj(trackNumber, eventTime, eventDate, event, eventCity, eventState, eventZIPCode, eventCountry, firmName, name, authorizedAgent) { //These are the internal variables for the object var m_trackNumber = ""; var m_EventTime = ""; var m_EventDate = ""; var m_Event = ""; var m_EventCity = ""; var m_EventState = ""; var m_EventZIPCode = ""; var m_EventCountry = ""; var m_FirmName = ""; var m_Name = ""; var m_AuthorizedAgent = ""; //These methods are necessary to avoid null pointer exceptions if(trackNumber != null){m_trackNumber = trackNumber;} if(eventTime != null){m_EventTime = eventTime;} if(eventDate != null){m_EventDate = eventDate;} if(event != null){m_Event = event;} if(eventCity != null){m_EventCity = eventCity;} if(eventState != null){m_EventState = eventState;} if(eventZIPCode != null){m_EventZIPCode = eventZIPCode;} if(eventCountry != null){m_EventCountry = eventCountry;} if(firmName != null){m_FirmName = firmName;} if(name != null){m_Name = name;} if(authorizedAgent != null){m_AuthorizedAgent = authorizedAgent;} //provides multiple instance support...(Encapsulation) this.getTrackingNumber = getTrackingNumber; this.setTrackingNumber = setTrackingNumber; this.AlertMessage = AlertMessage; this.getEventTime = getEventTime; this.setEventTime = setEventTime; this.getEventDate = getEventDate; this.setEventDate = setEventDate; this.getEvent = getEvent; this.setEvent = setEvent; this.getEventCity = getEventCity; this.setEventCity = setEventCity; this.getEventState = getEventState; this.setEventState = setEventState; this.getEventZIPCode = getEventZIPCode; this.setEventZIPCode = setEventZIPCode; this.getEventCountry = getEventCountry; this.setEventCountry = setEventCountry; this.getFirmName = getFirmName; this.setFirmName = setFirmName; this.getName = getName; this.setName = setName; this.getAuthorizedAgent = getAuthorizedAgent; this.setAuthorizedAgent = setAuthorizedAgent; //These are the getter and setter methods for the variables contained in the object function getTrackingNumber(){return m_trackNumber;} function setTrackingNumber(value){m_trackNumber = value;} function getEventTime(){return m_EventTime;} function setEventTime(value){m_EventTime = value;} function getEventDate(){return m_EventDate;} function setEventDate(value){m_EventDate = value;} function getEvent(){return m_Event;} function setEvent(value){m_Event = value;} function getEventCity(){return m_EventCity;} function setEventCity(value){m_EventCity = value;} function getEventState(){return m_EventState;} function setEventState(value){m_EventState = value;} function getEventZIPCode(){return m_EventZIPCode;} function setEventZIPCode(value){m_EventZIPCode = value;} function getEventCountry(){return m_EventCountry;} function setEventCountry(value){m_EventCountry = value;} function getFirmName(){return m_FirmName;} function setFirmName(value){m_FirmName = value;} function getName(){return m_Name;} function setName(value){m_Name = value;} function getAuthorizedAgent(){return m_AuthorizedAgent;} function setAuthorizedAgent(value){m_AuthorizedAgent = value;} //this function displays data in the specified format function AlertMessage(){ var msg = getEvent() + " " + getEventTime() + " - " + getEventDate() + " " + getEventCity(); if(getEventState() != null){ if(getEventState().length > 0){ msg += ", " + getEventState(); } } if(getEventCountry() != null){ if(getEventCountry().length > 0){ if(getEventCountry() != "UNITED STATES"){ msg += ", " + getEventCountry(); } } } return msg; } } //Handles when the mouse is hovered over one of the tabs. function LinkOnMouseOver(source, color){ source.style.color = color; source.style.textDecoration = "underline"; source.parentNode.style.backgroundImage = "url('http://trackandconfirmgadget.googlecode.com/svn/trunk/images/tab_on.gif')" } //Handles when the mouse moves off one of the tabs. function LinkOnMouseOut(source, color){ source.style.color = color; source.style.textDecoration = "none"; source.parentNode.style.backgroundImage = "url('http://trackandconfirmgadget.googlecode.com/svn/trunk/images/tab_off.gif')" } //these functions are used to build and encode the XML request for the TrackV2 API. It returns a properly encoded url that can be sent off in the functions above that make the call. function UrlBuilder() { this.$target = ""; this.setTarget = _setTarget; this.toString = _buildUrl; } //Set the target page of the URL (i.e. 'http://mydomain/mypage.aspx') function _setTarget(targetPage) {this.$target = targetPage; } //Build the url function _buildUrl() { var queryString = "" if (this.$target.length > 0) queryString = this.$target + "?"; for(var prop in this) { // Ignore all methods and properties with names that begin with '$'. if (prop.charAt(0) == "$" || (typeof this[prop]) == "function") continue; if (queryString.charAt(queryString.length -1) != "?") queryString += "&"; queryString += encodeURL(prop) + "=" + encodeURL(this[prop].toString()); } return queryString } function encodeURL(szValue) { if (typeof szValue == "undefined") return szValue; szValue = szValue.toString(); var szRet = encodeURI(szValue); return szRet; } //Sample method for building URL. This is the method that is called to encode the tracking number request before being sent off to the TrackV2 API function OnGenerateUrlSingle(trackingNumber) { var builder = new UrlBuilder(); builder.setTarget("http://production.shippingapis.com/ShippingApi.dll"); builder["API"] = "TrackV2"; //Developers- In the code below is a unique User ID that is designed for use with this google gadget ONLY. If you wish to use this functionality in your own code, DO NOT USE THIS USER ID. //Using this userID with your application will cause it to stop working for this gadget. Your very own user id is free and easy to obtain at http://www.usps.com/webtools/technical.htm. builder["XML"] = " "; var url = builder.toString(); return url; } //This function is used to build the URL for the XML request to the TrackV2 API when there are mulitple tracking numbers being sent at the same time. function OnGenerateUrlMultiple(trackingNumbers) { var builder = new UrlBuilder(); builder.setTarget("http://production.shippingapis.com/ShippingApi.dll"); builder["API"] = "TrackV2"; //Developers- In the code below is a unique User ID that is designed for use with this google gadget ONLY. If you wish to use this functionality in your own code, DO NOT USE THIS USER ID. //Using this userID with your application will cause it to stop working for this gadget. Your very own user id is free and easy to obtain at http://www.usps.com/webtools/technical.htm. var stringbuilder = ""; var arrayTNs = new Array(); arrayTNs = trackingNumbers.split("~"); for(var i = 0;i < arrayTNs.length;i++){ stringbuilder += ""; } stringbuilder += ""; builder["XML"] = stringbuilder; var url = builder.toString(); return url; }