/* 
 * Functions.js
 * Provides all the functions neccessary for the fedex dimweight calclulator.
 * Author: Kevin Poorman (with portions of code pre-existing but heavily refactored.)
 * For: Trigger Marketing and Fedex.
 * Copyright Fedex / Trigger Marketing 2009.
 */

/*
 * Global Variables
 */
// Dim weight conversion numbers 
var dim_weight_factor_standard_domestic = 194;
var dim_weight_factor_standard_international = 166;
var dim_weight_factor_metric_domestic = 7000;
var dim_weight_factor_metric_international = 6000;
var errorOrder = new Array('error_required', 'error_numerical', 'error_weight', 'error_length_domestic', 'error_length_international', 'error_ipf_only', 'error_girth', 'error_ipf_weight_only');
var ipFriendly = false;
var ipfFriendly = false;
var l_lang; 

// Dimensions and weight maximums 
var length_maximum_standard_international = 119;
var length_maximum_metric_international = 302;
var girth_maximum_standard_international = 300;
var girth_maximum_metric_international = 762;
var ipf_min_metric = 274;
var ipf_min_standard = 108;
var weight_maximum_standard = 2204;
var weight_maximum_metric = 1000;
var ipf_weight_maximum_metric = 1000;
var ipf_weight_maximum_standard = 2204;
var ip_weight_maximum_metric = 68;
var ip_weight_maximum_standard = 150;

var localNumberDecimal = '.';
var localNumberSeparator = ',';

/*
 * Output Messages by Langauge
 * Determine Language of the user and load the language file that matches.
 */

//Language Overrides
var sOverrideToEnglish = "ae, at_english, be, bh, ch, cz_english, de_english, dk_english, ee, es_english, fi, fr_english, gb, hu_english, ie, in, it_english, kw, lt, lu, lv, nl_english, no, pl_english, se_english,";
var sOverrideToFrench = "be_francais, ch_francais,";
var sOverrideToGerman = "at,";
var sOverrideToItalian = "ch_italiano,";
var sOverrideToDutch = "be_nederlands,";
var sOverrideToArabic = "ae_arabic,";
var aUrlLang = document.referrer.split("/");
var urlLang = aUrlLang[3]; //we want the the third array member

userLang = urlLang;
(sOverrideToEnglish.search(userLang + ",") != -1) ? userLang="en" : a=0;
// console.log(userLang);
(sOverrideToFrench.search(userLang + ",") != -1) ? userLang="fr" : a=0;
(sOverrideToGerman.search(userLang + ",") != -1) ? userLang="de" : a=0;
(sOverrideToItalian.search(userLang + ",") != -1) ? userLang="it" : a=0;
(sOverrideToDutch.search(userLang + ",") != -1) ? userLang="nl" : a=0;
(sOverrideToArabic.search(userLang + ",") != -1) ? userLang="sa" : a=0;

// console.log("userLang post transformation: " + userLang);
if (userLang != 'ch_deutsch') {
	var userLang = userLang.substring(0,2);
}
// var userLang = userLang.substring(0,2);
console.log("userLang post transformation: " + userLang);
var linkLang = urlLang;

var error_required = 'Length, Width, and Height are required to calculate Dimensional Weight';
var error_numerical = 'Please use only numerical values (including decimal points)';
var error_weight = 'This shipment can not be shipped with FedEx IP or IPF services because the actual weight is greater than 1000 kg.<Br> Please contact our <a href="http://fedex.com/' + linkLang + '/contact/" target="_top">Customer Service</a> for more information.';
var error_girth = 'This shipment can not be shipped with FedEx IP or IPF services because the dimensions are larger than 302cm in length or 762cm in length and girth combined (girth = 2 x height + 2 x width). <br>Please contact our <a href="http://fedex.com/' + linkLang + '/contact/" target="_top">Customer Service</a> for more information.';
var error_length_domestic = 'Maximum allowed package length is ' + getLengthMax("standard", "domestic") + ' inches (' + getLengthMax("metric", "domestic") + ' cm)';
var error_length_international = 'This shipment can not be shipped with FedEx IP or IPF services because the dimensions are larger than 302cm in length or 762cm in length and girth combined (girth = 2 x height + 2 x width). <br>Please contact our <a href="http://fedex.com/' + linkLang + '/contact/" target="_top">Customer Service</a> for more information.';
var error_ipf_only = 'The shipment can only be shipped with FedEx International Priority® Freight because the dimensions are larger than 274cm in width or 330 cm in length and girth combined (girth = 2 x height + 2 x width)';
var error_ipf_weight_only = 'The shipment can only be shipped with FedEx International Priority® Freight because of its weight';

// Output messages 
var output_dim_weight = 'The Dimensional Weight (%%dim_weight_formula%%) is greater than the Actual Weight of the package and will be used for rates calculations.';
var output_actual_weight = 'The Actual Weight is greater than the Dimensional Weight (%%dim_weight_formula%%) of the package and will be used for rates calculations.';
var output_min_dim_weight = 'Because your package dimensions are less than 1 cubic foot, the actual weight will be used for rates calculations.';
var generic_error_message = 'To continue, please address all comments in red below.';

// Default classes needed for Netscape ilayer/layer approach 
var class_default = 'content';
var class_error = 'error';

// console.log(userLang2[3]);
// userLang = "fr";

switch(userLang){
	case "hu":
		// Error messages 
		error_required = 'A dimenzionális súly kiszámításához a hosszúságra, a szélességre és a magasságra van szükség.';
		error_numerical = 'Kérjük, csak számszerű értékeket használjon (ide értve a tizedesvesszőt)';
		error_weight = 'Ez a küldemény nem szállítható FedEx IP vagy IPF szolgáltatással, mert a tényleges súly nagyobb 1000 kg-nál. <Br> <a href="http://fedex.com/' + linkLang + '/contact/" target="_top">További információkért forduljon az Ügyfélszolgálathoz!</a>';
		error_girth = 'Ez a küldemény nem szállítható FedEx IP vagy IPF szolgáltatással, mert a méret hosszabb 302 cm-nél, vagy a hossza és a kerülete (kerület = 2 x magasság + 2 x szélesség) együtt nagyobb 762 cm-nél. <br><a href="http://fedex.com/' + linkLang + '/contact/" target="_top">További információkért forduljon az Ügyfélszolgálathoz!</a>';
		error_length_domestic = 'A csomagok megengedett legnagyobb hossza:' + getLengthMax("standard", "domestic") + ' inches (' + getLengthMax("metric", "domestic") + ' cm)';
		error_length_international = 'Ez a küldemény nem szállítható FedEx IP vagy IPF szolgáltatással, mert a méret hosszabb 302 cm-nél, vagy a hossza és a kerülete (kerület = 2 x magasság + 2 x szélesség) együtt nagyobb 762 cm-nél. <br><a href="http://fedex.com/' + linkLang + '/contact/" target="_top">További információkért forduljon az Ügyfélszolgálathoz!</a>';
		error_ipf_only = 'Ez a küldemény nem szállítható FedEx International Priority® Freight szolgáltatással, mert a méret szélesebb 274 cm-nél, vagy a hossza és a kerülete (kerület = 2 x magasság + 2 x szélesség) együtt meghaladja a 330 cm-t';
		error_ipf_weight_only = 'Ez a küldemény csak FedEx International Priority® Freight szolgáltatással szállítható a súlya miatt';

		// Output messages 
		output_dim_weight = 'A dimenzionális súly nagyobb a csomag tényleges súlyánál, és a díjak kiszámolásához azt fogjuk használni.';
		output_actual_weight = 'A tényleges súly nagyobb a csomag dimenzionális súlyánál, és a díjak kiszámolásához azt fogjuk használni.';
		output_min_dim_weight = 'Mivel a csomag mérete kisebb 1 köbméternél, a díjak kiszámításához a tényleges súlyt használjuk.';
		generic_error_message = 'A folytatáshoz először oldja meg az alábbi pirossal írt megjegyzésben foglaltakat.';

		// Default classes needed for Netscape ilayer/layer approach 
		class_default = 'content';
		class_error = 'error';
	break;
	case "pl":
		// Error messages 
		error_required = 'Do obliczenia Wagi Gabarytowej (Objętościowej) konieczne jest podanie Długości, Szerokości i Wysokości. ';
		error_numerical = 'Prosimy o używanie jedynie wartości numerycznych (w tym znaków dziesiętnych)';
		error_weight = 'Przesyłka nie może zostać wysłana jako FedEx IP lub IPF, ponieważ rzeczywista waga przekracza 1000 kg. <Br> <a href="http://fedex.com/' + linkLang + '/contact/" target="_top">W celu uzyskania szczegółów prosimy o kontakt z Biurem Obsługi Klienta.</a>';
		error_girth = 'Przesyłka nie może zostać wysłana jako FedEx IP lub IPF, ponieważ jej wymiary przekraczają 302 cm długości lub 762 cm dla sumy długości i obwodu (obwód = 2 x wysokość + 2 x szerokość). <br><a href="http://fedex.com/' + linkLang + '/contact/" target="_top">W celu uzyskania szczegółów prosimy o kontakt z Biurem Obsługi Klienta.</a>';
		// error_length_domestic = 'La longueur maximum autorisée par un colis est ' + getLengthMax("standard", "domestic") + ' inches (' + getLengthMax("metric", "domestic") + ' cm)';
		error_length_international = 'Przesyłka może zostać wysłana jako FedEx International Priority® Freight, ponieważ jej wymiary przekraczają 274 cm szerokości lub 330 cm dla sumy długości i obwodu (obwód = 2 x wysokość + 2 x szerokość) <br><a href="http://fedex.com/' + linkLang + '/contact/" target="_top">W celu uzyskania szczegółów prosimy o kontakt z Biurem Obsługi Klienta.</a>';
		error_ipf_only = 'Przesyłka może zostać wysłana jako FedEx International Priority® Freight, ponieważ jej wymiary przekraczają 274 cm szerokości lub 330 cm dla sumy długości i obwodu (obwód = 2 x wysokość + 2 x szerokość)';
		error_ipf_weight_only = 'Przesyłka może zostać wysłana jedynie jako FedEx International Priority® Freight z powodu swojej wagi.';

		// Output messages 
		output_dim_weight = 'Waga wolumetryczna przewyższa ciężar rzeczywisty paczki i zostanie wykorzystana do obliczenia stawek.';
		output_actual_weight = 'Ciężar rzeczywisty przewyższa wagę wolumetryczną paczki i zostanie wykorzystany do obliczenia stawek.';
		output_min_dim_weight = 'Ze względu na fakt, że wymiary paczki są mniejsze niż 1 stopa sześcienna, do obliczenia stawek zostanie wykorzystana waga rzeczywista.';
		generic_error_message = 'Aby kontynuować, prosimy o odniesienie się do wszystkich  poniższych miejsc zaznaczonych na czerwono.';

		// Default classes needed for Netscape ilayer/layer approach 
		class_default = 'content';
		class_error = 'error';
	break;
	case "de": //german
		// Error messages 
		error_required = 'Für die Berechnung des Volumengewichts sind die Länge, Breite und Höhe Ihres Pakets erforderlich.';
		error_numerical = 'Bitte verwenden Sie nur numerische Werte (einschließlich Dezimalpunkt).';
		error_weight = 'Diese Sendung kann nicht mit dem FedEx International Priority® oder FedEx International Priority® Freight Service verschickt werden, da das aktuelle Gewicht 1.000 kg überschreitet. <br><a href="http://fedex.com/' + linkLang + '/contact/" target="_top"> Bitte wenden Sie sich für weiterführende Informationen an Ihren FedEx Kundendienst.</a>';
		error_girth = 'Diese Sendung kann nicht mit dem FedEx International Priority® oder FedEx International Priority® Freight Service verschickt werden, da die Abmessungen die max. zulässige Länge von 302 cm oder das max. Gurtmaß von 762 cm (Gurtmaß = 1 x längste Seite + 2 x Höhe + 2 x Breite) überschreiten. <br><a href="http://fedex.com/' + linkLang + '/contact/" target="_top">Bitte wenden Sie sich für weiterführende Informationen an Ihren FedEx Kundendienst.</a>';
		// error_length_domestic = 'La longueur maximum autorisée par un colis est ' + getLengthMax("standard", "domestic") + ' inches (' + getLengthMax("metric", "domestic") + ' cm)';
		error_length_international = 'Diese Sendung kann nicht mit dem FedEx International Priority® oder FedEx International Priority® Freight Service verschickt werden, da die Abmessungen die max. zulässige Länge von 302 cm oder das max. Gurtmaß von 762 cm (Gurtmaß = 1 x längste Seite + 2 x Höhe + 2 x Breite) überschreiten. <br><a href="http://fedex.com/' + linkLang + '/contact/" target="_top">Bitte wenden Sie sich für weiterführende Informationen an Ihren FedEx Kundendienst.</a>';
		error_ipf_only = 'Diese Sendung kann nur mit dem FedEx International Priority® Freight Service verschickt werden, da die Abmessungen die max. zulässige Länge von 274 cm oder das max. Gurtmaß von 330 cm (Gurtmaß = 1 x längste Seite + 2 x Höhe + 2 x Breite) überschreiten. ';
		error_ipf_weight_only = 'Diese Sendung kann aufgrund ihres Gewichts nur mit dem FedEx International Priority® Freight Service verschickt werden.';

		// Output messages 
		output_dim_weight = 'Das Volumengewicht ist größer als das tatsächliche Gewicht des Pakets und wird deshalb als Grundlage für die Berechnung der Transportkosten angewendet.';
		output_actual_weight = 'Das tatsächliche Gewicht ist größer als das Volumengewicht des Pakets und wird deshalb als Grundlage für die Berechnung der Transportkosten angewendet.';
		output_min_dim_weight = 'Da die Abmessungen Ihres Pakets weniger als 0,03 m3 (1 Kubikfuß) betragen, wird das tatsächliche Gewicht als Grundlage für die Berechnung der Transportkosten angewendet.';
		generic_error_message = 'Um weiterzufahren, beantworten Sie bitte alle nachfolgend in Rot gezeigten Hinweise.';

		// Default classes needed for Netscape ilayer/layer approach 
		class_default = 'content';
		class_error = 'error';
	break;
	case "ch_deutsch": //german
		// Error messages 
		error_required = 'Für die Berechnung des Volumengewichts sind die Länge, Breite und Höhe Ihres Pakets erforderlich.';
		error_numerical = 'Bitte verwenden Sie nur numerische Werte (einschließlich Dezimalpunkt).';
		error_weight = 'Diese Sendung kann nicht mit dem FedEx International Priority® oder FedEx International Priority® Freight Service verschickt werden, da das aktuelle Gewicht 1.000 kg überschreitet. <br><a href="http://fedex.com/' + linkLang + '/contact/" target="_top"> Bitte wenden Sie sich für weiterführende Informationen an Ihren FedEx Kundendienst.</a>';
		error_girth = 'Diese Sendung kann nicht mit dem FedEx International Priority® oder FedEx International Priority® Freight Service verschickt werden, da die Abmessungen die max. zulässige Länge von 302 cm oder das max. Gurtmass von 762 cm (Gurtmass = 1 x längste Seite + 2 x Höhe + 2 x Breite) überschreiten. <br><a href="http://fedex.com/' + linkLang + '/contact/" target="_top">Bitte wenden Sie sich für weiterführende Informationen an Ihren FedEx Kundendienst.</a>';
		// error_length_domestic = 'La longueur maximum autorisée par un colis est ' + getLengthMax("standard", "domestic") + ' inches (' + getLengthMax("metric", "domestic") + ' cm)';
		error_length_international = 'Diese Sendung kann nicht mit dem FedEx International Priority® oder FedEx International Priority® Freight Service verschickt werden, da die Abmessungen die max. zulässige Länge von 302 cm oder das max. Gurtmass von 762 cm (Gurtmass = 1 x längste Seite + 2 x Höhe + 2 x Breite) überschreiten. <br><a href="http://fedex.com/' + linkLang + '/contact/" target="_top">Bitte wenden Sie sich für weiterführende Informationen an Ihren FedEx Kundendienst.</a>';
		error_ipf_only = 'Diese Sendung kann nur mit dem FedEx International Priority® Freight Service verschickt werden, da die Abmessungen die max. zulässige Länge von 274 cm oder das max. Gurtmass von 330 cm (Gurtmass = 1 x längste Seite + 2 x Höhe + 2 x Breite) überschreiten. ';
		error_ipf_weight_only = 'Diese Sendung kann aufgrund ihres Gewichts nur mit dem FedEx International Priority® Freight Service verschickt werden.';

		// Output messages 
		output_dim_weight = 'Das Volumengewicht ist grösser als das tatsächliche Gewicht des Pakets und wird deshalb als Grundlage für die Berechnung der Transportkosten angewendet.';
		output_actual_weight = 'Das tatsächliche Gewicht ist grösser als das Volumengewicht des Pakets und wird deshalb als Grundlage für die Berechnung der Transportkosten angewendet.';
		output_min_dim_weight = 'Da die Abmessungen Ihres Pakets weniger als 0,03 m3 (1 Kubikfuss) betragen, wird das tatsächliche Gewicht als Grundlage für die Berechnung der Transportkosten angewendet.';
		generic_error_message = 'Um weiterzufahren, beantworten Sie bitte alle nachfolgend in Rot gezeigten Hinweise.';

		// Default classes needed for Netscape ilayer/layer approach 
		class_default = 'content';
		class_error = 'error';
	break;
	case "cz": //Czech
		// Error messages 
		error_required = 'Pro výpočet rozměrové váhy je třeba délka, šířka a výška zásilky.';
		error_numerical = 'Používejte prosím pouze číselné hodnoty (včetně desetinných čárek).';
		error_weight = 'Tuto zásilku nelze přepravovat prostřednictvím služby FedEx IP nebo IPF, neboť její skutečná váha přesahuje 1 000 kg. <br><a href="http://fedex.com/' + linkLang + '/contact/" target="_top"> Pro více informací prosím kontaktujte náš zákaznický servis.</a>';
		error_girth = 'Tuto zásilku nelze přepravovat prostřednictvím služby FedEx IP nebo IPF, neboť její rozměry přesahují 302 cm na délku nebo 762 cm na délku a v obvodu (obvod = 2 x výška + 2 x šířka). <br><a href="http://fedex.com/' + linkLang + '/contact/" target="_top">Pro více informací prosím kontaktujte náš zákaznický servis.</a>';
		// error_length_domestic = 'La longueur maximum autorisée par un colis est ' + getLengthMax("standard", "domestic") + ' inches (' + getLengthMax("metric", "domestic") + ' cm)';
		error_length_international = 'Tuto zásilku nelze přepravovat prostřednictvím služby FedEx IP nebo IPF, neboť její rozměry přesahují 302 cm na délku nebo 762 cm na délku a v obvodu (obvod = 2 x výška + 2 x šířka).<br><a href="http://fedex.com/' + linkLang + '/contact/" target="_top">Pro více informací prosím kontaktujte náš zákaznický servis.</a>';
		error_ipf_only = 'Tuto zásilku lze přepravovat pouze prostřednictvím služby FedEx International Priority® Freight, neboť její rozměry přesahují 274 cm na šířku nebo 330 cm na délku a v obvodu (obvod = 2 x výška + 2 x šířka).';
		error_ipf_weight_only = 'Tuto zásilku lze vzhledem k její váze přepravovat pouze prostřednictvím služby FedEx International Priority® Freight.';

		// Output messages 
		output_dim_weight = 'Rozměrová váha je větší než skutečná váha zásilky a bude použita pro výpočet sazeb.';
		output_actual_weight = 'Skutečná váha je větší než rozměrová váha zásilky a bude použita pro výpočet sazeb.';
		output_min_dim_weight = 'Vzhledem k tomu, že rozměry vaší zásilky jsou menší než  0,03 m3 (kubická stopa), bude pro výpočet sazeb použita skutečná váha zásilky.';
		generic_error_message = 'Pro pokračování prosím reagujte na všechny poznámky níže psané červeně.';

		// Default classes needed for Netscape ilayer/layer approach 
		class_default = 'content';
		class_error = 'error';
	break;
	case "fr":
		// Error messages 
		error_required = 'Longueur, Hauteur et Largeur sont obligatoires pour calculer le poids volumétrique.';
		error_numerical = 'Merci d\'indiquer des chiffres (les décimales sont acceptées).';
		error_weight = 'Cet envoi ne peut être expédié par les services FedEx International Priority® et FedEx International Priority® Freight car le poids total est supérieur à 1 000 kg.<Br> <a href="http://fedex.com/' + linkLang + '/contact/" target="_top">Contactez votre Service Clientèle pour plus de précisions.</a>';
		error_girth = 'Cet envoi ne peut être expédié par les services FedEx International Priority® et FedEx International Priority® Freight car les dimensions sont supérieurs à 302 cm de longueur et 762 cm de longueur et circonférence combinées (circonférence = 2 x longueur + x Largeur). <br><a href="http://fedex.com/' + linkLang + '/contact/" target="_top">Contactez votre Service Clientèle pour plus de précisions.</a>';
		error_length_domestic = 'La longueur maximum autorisée par un colis est ' + getLengthMax("standard", "domestic") + ' inches (' + getLengthMax("metric", "domestic") + ' cm)';
		error_length_international = 'Cet envoi ne peut être expédié par les services FedEx International Priority® et FedEx International Priority® Freight car les dimensions sont supérieurs à 302 cm de longueur et 762 cm de longueur et circonférence combinées (circonférence = 2 x longueur + x Largeur). <br><a href="http://fedex.com/' + linkLang + '/contact/" target="_top">Contactez votre Service Clientèle pour plus de précisions.</a>';
		error_ipf_only = 'Cet envoi ne peut être expédié par le service FedEx International Priority® Freight car les dimensions sont supérieurs à 274 cm de hauteur et 330 cm de longueur et circonférence combinées (circonférence = 2 x longueur + x largeur).';
		error_ipf_weight_only = 'Cet envoi peut être expédié uniquement par FedEx International Priority® compte tenu de son poids.';

		// Output messages 
		output_dim_weight = 'Le poids volumétrique est supérieur au poids réel du colis et sera utilisé pour calculer les frais de transport.';
		output_actual_weight = 'Le poids réel est supérieur au poids volumétrique du colis et sera utilisé pour calculer les frais de transport.';
		output_min_dim_weight = 'Comme le volume de votre colis est inférieur à 0,03 m3, le poids réel sera utilisé pour calculer les frais de transport.';
		generic_error_message = 'Pour continuer, merci de prendre connaissance de tous les commentaires en rouge indiqués ci-dessous.';

		// Default classes needed for Netscape ilayer/layer approach 
		class_default = 'content';
		class_error = 'error';
	break;
	case "es":
		// Error messages 
		error_required = 'Longitud, Anchura, y Altura, son indispensables para calcular el Peso Dimensional';
		error_numerical = 'Por favor utilice sólo valores numéricos (incluyendo puntos decimales)';
		error_weight = 'Este envío no puede ser transportado con FedEx IP o servicios IPF porque el peso real es mayor de 1000 kg.<br> <a href="http://www.fedex.com/' + linkLang + '/contact/">Por favor póngase en contacto con nuestro Servicio de Atención al Cliente para más detalles.</a>';
		error_girth = 'Este envío no puede ser transportado con FedEx IP o servicios IPF porque las dimensiones son mayores de 302cm en la longitud o 762 cm en la longitud y la circunferencia combinado (la circunferencia = 2 x altura + 2 x anchura).<br> <a href="http://www.fedex.com/' + linkLang + '/contact/" target="_top">Por favor póngase en contacto con nuestro Servicio de Atención al Cliente para más detalles.</a>';
		error_length_domestic = 'La máxima longitud permitida por paquete es: ' + getLengthMax("standard", "domestic") + ' inches (' + getLengthMax("metric", "domestic") + ' cm)';
		error_length_international = 'Este envío no puede ser transportado con FedEx IP o servicios IPF porque las dimensiones son mayores de 302cm en la longitud o 762 cm en la longitud y la circunferencia combinado (la circunferencia = 2 x altura + 2 x anchura). <a href="http://www.fedex.com/' + linkLang + '/contact/" target="_top">Por favor póngase en contacto con nuestro Servicio de Atención al Cliente para más detalles.</a>';
		error_ipf_only = 'Este envío solo puede ser transportado con FedEx International Priority® Freight porque las dimensiones son mayores de 274 cm en la longitud o 330 cm en la longitud y la circunferencia combinado (la circunferencia = 2 x altura + 2 x anchura). ';
		error_ipf_weight_only = 'Debido a su  peso, este envío solo puede ser transportado con FedEx International Priority® Freight';

		// Output messages 
		output_dim_weight = 'El Peso Dimensional del envío es mayor que el peso real y afectará al cálculo de la tarifa.';
		output_actual_weight = 'El Peso Real es mayor que el Peso dimensional y afectará al cálculo de la tarifa.';
		output_min_dim_weight = 'Como las dimensiones de su envío son menores de 1 pie cúbico, el peso real será utilizado para calcular de tarifa.';
		generic_error_message = 'Para continuar, por favor rellene los campos en rojo';

		// Default classes needed for Netscape ilayer/layer approach 
		class_default = 'content';
		class_error = 'error';
	break;
	case "it":
		// Error messages 
		error_required = 'Per il calcolo del peso dimensionale sono necessari lunghezza, larghezza e altezza.';
		error_numerical = 'Utilizzate solo valori numerici (inclusi i decimali).';
		error_weight = 'Questo collo non può essere spedito con i servizi FedEx IP o IPF perché il suo peso reale supera i 1.000 kg. <a href="http://www.fedex.com/' + linkLang + '/contact/">Contattate il Servizio Clienti FedEx per maggiori informazioni al riguardo.</a>';
		error_girth = 'Questo collo non può essere spedito con i servizi FedEx IP o IPF perché la lunghezza è superiore a 302 cm e la sua larghezza e circonferenza combinate sono maggiori di 762 cm (circonferenza = altezza x2 + larghezza x 2). <a href="http://www.fedex.com/' + linkLang + '/contact/" target="_top">Contattate il Servizio Clienti FedEx per maggiori informazioni al riguardo.</a>';
		error_length_domestic = 'La lunghezza massima consentita per collo è di: ' + getLengthMax("standard", "domestic") + ' inches (' + getLengthMax("metric", "domestic") + ' cm)';
		error_length_international = 'Questo collo non può essere spedito con i servizi FedEx IP o IPF perché la lunghezza è superiore a 302 cm e la sua larghezza e circonferenza combinate sono maggiori di 762 cm (circonferenza = altezza x2 + larghezza x 2). <a href="http://www.fedex.com/' + linkLang + '/contact/" target="_top">Contattate il Servizio Clienti FedEx per maggiori informazioni al riguardo.</a>';
		error_ipf_only = 'Questo collo può essere spedito solo tramite il servizio FedEx International Priority® Freight perché le sue dimensioni eccedono  i 274 cm di larghezza  o i 330 cm di lunghezza e  circonferenza  (circonferenza = altezza x 2 + larghezza x 2)';
		error_ipf_weight_only = 'Il collo può essere spedito solo attraverso il servizio FedEx International Priority® Freight a causa del suo peso.';

		// Output messages 
		output_dim_weight = 'Il peso dimensionale supera il peso reale del collo e sarà quindi utilizzato per calcolare il costo della spedizione.';
		output_actual_weight = 'Il peso attuale supera il peso dimensionale e sarà quindi utilizzato per calcolare il costo della spedizione.';
		output_min_dim_weight = 'Poiché le dimensioni del vostro collo sono inferiori a 30,48 cm³ sarà utilizzato il peso reale per calcolare il costo della spedizione.';
		generic_error_message = 'Per continuare, inserite i vostri commenti in rosso negli spazi qui sotto.';

		// Default classes needed for Netscape ilayer/layer approach 
		class_default = 'content';
		class_error = 'error';
	break;
	case "nl":
		// Error messages 
		error_required = 'Lengte, Breedte en Hoogte zijn nodig om het volumegewicht te berekenen';
		error_numerical = 'Gebruik a.u.b. alleen numerieke waarden';
		error_weight = 'Deze zending kan niet verstuurd worden met FedEx IP of IPF omdat het werkelijke gewicht zwaarder is dan 1000 kg. <a href="http://www.fedex.com/' + linkLang + '/contact/" target="_top">Neem contact op met onze Klantenservice voor meer informatie.</a>';
		error_girth = 'Deze zending kan niet verstuurd worden met FedEx IP of IPF omdat de afmetingen groter zijn dan 302 cm lang of 762 cm van de omtrek en de lengte samen. (omtrek = 2 x hoogte + 2 x breedte) <a href="http://www.fedex.com/' + linkLang + '/contact/" target="_top">Neem contact op met onze Klantenservice voor meer informatie.</a>';
		error_length_domestic = 'Maximale lengte van het pakket is: ' + getLengthMax("standard", "domestic") + ' inches (' + getLengthMax("metric", "domestic") + ' cm)';
		error_length_international = 'Deze zending kan niet verstuurd worden met FedEx IP of IPF omdat de afmetingen groter zijn dan 302 cm lang of 762 cm van de omtrek en de lengte samen. (omtrek = 2 x hoogte + 2 x breedte) <a href="http://www.fedex.com/' + linkLang + '/contact/" target="_top">Neem contact op met onze Klantenservice voor meer informatie.</a>';
		error_ipf_only = 'Should not be used';
		error_ipf_weight_only = 'Should not be used';

		// Output messages 
		output_dim_weight = 'Het volumegewicht is meer dan het werkelijke gewicht van het pakket en zal worden gebruikt voor het berekenen van het verzendtarief.';
		output_actual_weight = 'Het werkelijke gewicht is meer dan het volumegewicht van het pakket en zal worden gebruikt voor het berekenen van het verzendtarief.';
		output_min_dim_weight = 'Gezien de kleine afmetingen van uw pakket zal het werkelijke gewicht worden gebruikt voor het berekenen van het verzendtarief';
		generic_error_message = 'Venligst ret alle fejl anført i rødt nedenfor for at fortsætte';
		
		//Default side messages
		canBeShippedWithIp = 'Dit pakket kan verstuurd worden met FedEx International Priority®.**';
		canBeShippedWithIpF = 'Dit pakket kan verstuurd worden met FedEx International Priority® Freight**';
		shipItNow = 'Klanten: Direct verzenden';
		newCustomers = 'Nieuw bij FedEx: Registreer eenvoudig';
    
		// Default classes needed for Netscape ilayer/layer approach 
		class_default = 'content';
		class_error = 'error';
	break;
	case "dk":
		// Error messages 
		error_required = 'Længde, bredde og højde skal bruges til at beregne den dimensionerede vægt';
		error_numerical = 'Brug kun talværdier (inklusive decimaltegn)';
		error_weight = 'Denne forsendelse kan ikke sendes med FedEx IP- eller IPF-service, fordi den faktiske vægt er større end 1.000 kg. Kontakt vores kundeservice for yderligere oplysninger.';
		error_girth = 'Denne forsendelse kan ikke sendes med FedEx IP- eller IPF-service, fordi målene er større end 302 cm i længden eller 762 cm i længden og omkredsstørrelsen kombineret (omkredsstørrelsen = 2 x højden + 2 x bredden). <a href="http://www.fedex.com/' + linkLang + '/contact/" target="_top">Kontakt vores kundeservice for yderligere oplysninger.</a>';
		error_length_domestic = 'Den mindste tilladte pakkelængde er: ' + getLengthMax("standard", "domestic") + ' inches (' + getLengthMax("metric", "domestic") + ' cm)';
		error_length_international = 'Denne forsendelse kan ikke sendes med FedEx IP- eller IPF-service, fordi målene er større end 302 cm i længden eller 762 cm i længden og omkredsstørrelsen kombineret (omkredsstørrelsen = 2 x højden + 2 x bredden). <a href="http://www.fedex.com/' + linkLang + '/contact/" target="_top">Kontakt vores kundeservice for yderligere oplysninger.</a>';
		error_ipf_only = 'Denne forsendelse kan kun sendes med FedEx International Priority® Freight, fordi målene er større end 274 cm i bredden eller 330 cm i længden og omkredsstørrelsen kombineret (omkredsstørrelsen = 2 x højden + 2 x bredden)';
		error_ipf_weight_only = 'Denne forsendelse kan kun sendes med FedEx International Priority® Freight på grund af dens vægt';

		// Output messages 
		output_dim_weight = 'Den dimensionerede vægt er større end pakkens faktiske vægt og vil blive anvendt til prisberegning.';
		output_actual_weight = 'Den faktiske vægt er større end pakkens dimensionerede vægt og vil blive anvendt til prisberegning.';
		output_min_dim_weight = 'Din pakkes mål er under 1 kubikfod, og derfor anvendes den faktiske vægt til prisberegning.';
		generic_error_message = 'Løs alle problemer, der er omtalt i kommentarerne nedenfor, for at fortsætte.';

		// Default classes needed for Netscape ilayer/layer approach 
		class_default = 'content';
		class_error = 'error';
	break;
	case "se":
		// Error messages 
		error_required = 'Längd, bredd och höjd krävs för att beräkna den dimensionella vikten';
		error_numerical = 'Använd enbart numeriska värden (inklusive decimaltecken)';
		error_weight = 'Leveransen kan inte skickas med FedEx eller IPF på grund av att den faktiska vikten är större än 1 000 kg. <br> <a href="http://www.fedex.com/' + linkLang + '/contact/" target="_top">Kontakta kundtjänst för mer information.</a>';
		error_girth = 'Leveransen kan inte skickas med FedEx eller IPF på grund av att måtten är större än 302 cm i längd, eller 762 cm i längd plus omkrets (omkrets = 2 x höjd + 2 x bredd).<br> <a href="http://www.fedex.com/' + linkLang + '/contact/"target="_top" >Kontakta kundtjänst för mer information.</a>';
		error_length_domestic = 'Maximalt tillåten paketlängd är: ' + getLengthMax("standard", "domestic") + ' inches (' + getLengthMax("metric", "domestic") + ' cm)';
		error_length_international = 'Leveransen kan inte skickas med FedEx eller IPF på grund av att måtten är större än 302 cm i längd, eller 762 cm i längd plus omkrets (omkrets = 2 x höjd + 2 x bredd).<br> <a href="http://www.fedex.com/' + linkLang + '/contact/">Kontakta kundtjänst för mer information.</a>';
		error_ipf_only = 'Leveransen kan endast skickas med FedEx International Priority® Freight eftersom måtten är större än 274 cm i bredd, eller 330 cm i längd plus omkrets (omkrets = 2 x höjd + 2 x bredd) ';
		error_ipf_weight_only = 'Leveransen kan endast skickas med FedEx International Priority® Freight på grund av dess vikt';

		// Output messages 
		output_dim_weight = 'Den dimensionella vikten är större än den faktiska vikten på paketet och kommer att användas vid prisberäkningen.';
		output_actual_weight = 'Den faktiska vikten är större än den dimensionella vikten på paketet och kommer att användas vid prisberäkningen.';
		output_min_dim_weight = 'Eftersom paketets dimensioner är mindre än 1 kubikfot, kommer den faktiska vikten att användas vid prisberäkningen.';
		generic_error_message = 'Fortsätt genom att läsa alla kommentarer i rött nedan.';

		// Default classes needed for Netscape ilayer/layer approach 
		class_default = 'content';
		class_error = 'error';
	break;
default:
	
}

// Dynamic text defaults 
var defaultUnitsButton = "";
/*
 * Boilerplate code. Run on script evaluation
 * Browser detection and environemental setup.
 */ 

// Set localization variables 
setLocalNumberDecimal('.');
setLocalNumberSeparator(',');

//Browser detection
var is;
var isIE3Mac = false;
// this section is designed specifically for IE3 for the Mac
if ((navigator.appVersion.indexOf("Mac") != -1) && (navigator.userAgent.indexOf("MSIE") != -1) && (parseInt(navigator.appVersion, 10) == 3)) isIE3Mac = true;
else is = new Is();

// Inputs to preserve for partial reset (for unit switch) 
//resetInputs = new Array("dim_length", "dim_width", "dim_height", "actual_weight", "dim_weight");
resetInputs = new Array("dim_length", "dim_width", "dim_height", "actual_weight");

/*
 * Functions
 */
//Calculate the Dim Weight of the package.
function calculateDimWeight(units, destination, length, width, height) {
	// Dim weight is L*W*H/destination_factor_number 
	return eval('length*width*height/dim_weight_factor_' + units.toLowerCase() + '_' + 'international');
}

// Verify the Girth is below the Max.
function checkGirth(dim1, dim2, dim3, units, destination) {
	if (! (validateNumber(dim1) && validateNumber(dim2) && validateNumber(dim3))) {
		return "";
	}
	// Set order of dimensions by length (length is longest one, etc.) 
	dims = sortDims(new Array(dim1, dim2, dim3));

	// Package girth is L + 2 * (W + H), where length is longest dimension 
	var packageGirth = Number(dims[0]) + 2 * (Number(dims[1]) + Number(dims[2]));

	return eval('packageGirth <= girth_maximum_' + units.toLowerCase() + '_' + 'international');
}

// checkLength -- check dimension isn't longer than maximum allowed 
function checkIPFLength(length, units, destination) {
	return eval('length <= ipf_min_' + units.toLowerCase());
}

// checkWeight -- check actual weight of package against IPFmaximum 
function checkIPFWeight(actualWeight, units) {
	// if (units.toLowerCase() == 'metric') {
	// 	return eval("actualWeight <= ipf_weight_maximum_metric");
	// } else	{
	// 	return eval("actualWeight <= ipf_weight_maximum_standard");
	// }
	// // //console.log("checkIPFWeight", actualWeight, units);
	// // //console.log(ipf_weight_maximum_ + units.toLowerCase());
	return eval('actualWeight <= ipf_weight_maximum_' + units.toLowerCase());
}

// checkIPWeight -- check actual weight of package against IP maximum 
function checkIPWeight(actualWeight, units) {
	return eval('actualWeight <= ip_weight_maximum_' + units.toLowerCase());
}

// checkLength -- check dimension isn't longer than maximum allowed 
function checkLength(length, units, destination) {
	return eval('length <= length_maximum_' + units.toLowerCase() + '_' + 'international');
}

// checkWeight -- check actual weight of package against maximum 
function checkWeight(actualWeight, units) {
	return eval('actualWeight <= weight_maximum_' + units.toLowerCase());
}

// compareNumericalDescending -- compare 2 numbers, return value<=>0 accordingly 
function compareNumericalDescending(a, b) {
	return (Number(b) - Number(a));
}

//Creates the Dynamic Text fields needed to update values.
function dtCreate(sectionName, initialContent, sectionClass, width, height) {
	if (initialContent.toLowerCase() == "%none%") {
		initialContent = "";
	}

	if (!isIE3Mac && is.nav4) {
		if (dtRequiresImages(sectionName, initialContent)) {
			document.write('<IMG NAME="' + sectionName + '" SRC="');
			if (initialContent == "") {
				document.write(blank_image.src);
			}
			else {
				document.write(eval(sectionName + '_' + initialContent + '.src'));
			}
			document.write('" ALT="" WIDTH="' + width + '" HEIGHT="' + height + '" BORDER="0">');
		}
		else {
			document.write('<ILAYER NAME="' + sectionName + '" WIDTH="' + width + '" HEIGHT="' + height + '" Z-LEVEL="1"><LAYER NAME="' + sectionName + '_inner" WIDTH="' + width + '" HEIGHT="' + height + '" Z-LEVEL="2"><SPAN CLASS="' + sectionClass + '">' + initialContent + '</SPAN></LAYER></ILAYER>');
		}
	}
	//	Default to IE span setup (same for NS6, etc.) 
	else {
		document.write('<SPAN ID="' + sectionName + '">' + initialContent + '</SPAN>');
	}
}

// dtImagesUpdate -- update image for dynamic text for Netscape 4.x 
// Assumes page-specific function has set up needed images 
function dtImagesUpdate(sectionName, content) {
	if (!isIE3Mac && is.nav4) {
		if (content == "") {
			eval('document.images["' + sectionName + '"].src = blank_image.src');
		}
		else {
			eval('document.images["' + sectionName + '"].src = ' + sectionName + '_' + content + '.src');
		}
	}
}

// dtRequiresImages -- Specify dynamic text sections that require images for Netscape 4.x instead of dynamic text 
function dtRequiresImages(sectionName, content) {
	return (sectionName.match(/_units$/i));
}

// dtUpdate -- update dynamic text 
function dtUpdate(sectionName, content, sectionClass) {
	hideContent('ip');
	hideContent('ipf');
	if (content.toLowerCase() == "%none%") {
		content = "";
	}

	if (!isIE3Mac && is.nav4) {
		if (dtRequiresImages(sectionName, content)) {
			dtImagesUpdate(sectionName, content);
		}
		else {
			innerDocument = eval('document.' + sectionName + '.document.' + sectionName + '_inner.document');
			innerDocument.write('<SPAN CLASS="' + sectionClass + '">' + content + '</SPAN>');
			innerDocument.close();
		}
	}
	else if (!isIE3Mac && is.nav6up) {
		document.getElementById(sectionName).innerHTML = '<SPAN CLASS="' + sectionClass + '">' + content + '</SPAN>';
	}
	else {
		document.all[sectionName].innerHTML = '<SPAN CLASS="' + sectionClass + '">' + content + '</SPAN>';
	}
}

// generalNumber -- return generic number string from localized version 
function generalNumber(numberString) {
	numberString = numberString.replace(/\s+/g, '');
	numberString = numberString.replace(eval('/\\' + getLocalNumberDecimal() + '/g'), '.');
	numberString = numberString.replace(eval('/\\' + getLocalNumberSeparator() + '/g'), '');
	numberString = numberString.replace(/^\./, '0.');
	numberString = numberString.replace(/\.$/, '');
	return numberString;
}

// getDimWeightFactor -- return factor used for dim weight calculation based on units and destination 
function getDimWeightFactor(units, destination) {
	return eval('dim_weight_factor_' + units.toLowerCase() + '_' + 'international');
}

// Determines element type and returns value accordingly 
// Currently only supports text fields and radio buttons 
function getElementValue(element) {

	var elementType = element.type;

	if (! (elementType)) {
		elementType = element[0].type;
	}
	if (! (elementType)) {
		return "";
	}

	switch (elementType) {
		case("text"):
		return element.value;
		// Breaks never reached, but just for the heck of it........
		break;
		case ("radio"):
		for (j = 0; j < element.length; j++) {
			if (element[j].checked) {
				return element[j].value;
			}
		}
		return "";
		break;
		case ("select-one"):
		return element.options[element.selectedIndex].value;
		break;
		default:
		return "";
	}
	return "";
	// should never be reached but it prevents JS warnings and presents cleaner code.
}

// getGirthMax -- return maximum girth allowed  based on units and destination. Currently only based on units, but just in case want it based on destination in future as well, etc. 
function getGirthMax(units, destination) {
	return eval('girth_maximum_' + units.toLowerCase() + '_' + 'international');
}

// checkIp -- determine if package is IP compatible
function getIpfStatus(dim1, dim2, dim3, weight, units) {
	dims = sortDims(new Array(dim1, dim2, dim3));

	var packageGirth = Number(dims[0]) + 2 * (Number(dims[1]) + Number(dims[2]));

	if (units.toLowerCase() == 'standard') {
		if (dims[0] > 118.89) {
			return false;
		}
		if (dims[2] > 70.07) {
			return false;
		}
		else if (packageGirth > 300) {
			return false;
		} else if (weight > ipf_weight_maximum_metric) {
			return false;
		}
		else return true;
	}

	if (units.toLowerCase() == 'metric') {
		if (dims[0] > 302) {
			return false;
		}
		if (dims[2] > 178) {
			return false;
		}
		else if (packageGirth > 762) {
			return false;
		}
		else if (weight > ipf_weight_maximum_metric) {
			return false;
		}
		else return true;
	}
}

// checkIp -- determine if package is IP compatible
function getIpStatus(dim1, dim2, dim3, weight, units) {
	if( dim1 == 0 || dim2 == 0 || dim3 == 0 || weight == 0) {
		return false;
	}
	dims = sortDims(new Array(dim1, dim2, dim3));

	// Package girth is L + 2 * (W + H), where length is longest dimension 
	var packageGirth = Number(dims[0]) + 2 * (Number(dims[1]) + Number(dims[2]));
	//return (packageGirth);
	if (units.toLowerCase() == 'standard') {
		if (dims[0] > 107.87) {
			//107.87 is a number from the provided spreadsheet.
			return false;
		}
		else if (packageGirth > 129.92) {
			return false;
		} else if (ipFriendly == false) {
			return false;
		} else if (weight > ip_weight_maximum_standard) {
			return false;
		} else {
			return true;
		}
	}

	if (units.toLowerCase() == 'metric') {
		if (dims[0] > 274) {
			return false;
		}
		else if (packageGirth > 330) {
			return false;
		} else if (ipFriendly == false) {
			return false;
		} else if (weight > ip_weight_maximum_metric) {
			return false;
		} else {
			return true;
		}
	}
}

// getLengthMax -- return maximum length allowed based on units and destination Currently only based on units, but just in case want it based on destination in future as well, etc. 
function getLengthMax(units, destination) {
	return eval('length_maximum_' + units.toLowerCase() + '_' + 'international');
}

// getLocalNumberDecimal -- return localized numerical decimal character 
function getLocalNumberDecimal() {
	return localNumberDecimal;
}

// getLocalNumberSeparator -- return localized numerical separator (e.x. "," in 100,000) 
function getLocalNumberSeparator() {
	return localNumberSeparator;
}

// getWeightMax -- return maximum weight allowed based on units and destination currently only based on units, but just in case want it based on destination in future as well, etc. 
function getWeightMax(units, destination) {
	return eval('weight_maximum_' + units.toLowerCase());
}

// handleFormErrors -- handles form validation errors 
function handleFormErrors(errors, errorFocus) {
	// Clear error message area if no errors 
	if (errors == "") {
		dtUpdate('output', "");
		dtUpdate('errors', "");
		dtUpdate('general', "");
	}
	else {
		// alert(errorOrder.length);
		// Only showing one error at a time, so prioritize errors 
		for (i = 0; i < errorOrder.length; i++) {
			// alert(errorOrder[i]);
			// alert(errors.match(eval('/' + errorOrder[i] + '/i')));
			if (errors.match(eval('/' + errorOrder[i] + '/i'))) {
				dtUpdate('errors', eval(errorOrder[i]), class_error);
				//dtUpdate('general', 'To continue, please address all comments in red below.', class_error);
				dtUpdate('general', generic_error_message, class_error);
				errorFocus.focus();
				break;
			}
		}
	}
}

function hideContent(d) {
	document.getElementById(d).style.display = "none";
}

// inputOverride -- determine form containing input and set input value 
function inputOverride(inputName, value) {
	setElementValue(eval('document.dim_weight_form.' + inputName), value);
	if (inputName.toLowerCase() == "units") {
		// Since Netscape 4.x doesn't update this correctly when 
		//	 input overrides called when page loading, repeated 
		//	 in onLoad event handler for body tag, etc. 
		updateUnits(document.dim_weight_form);
	}
}

/* 
 * Browser_detect_lite.js -- Browser sniffer, with only browser version 
 *	 detection (no javascript detection, os detection, etc.) 
 *	 Based on Mozilla.org sniffer version 3.03 found at 
 *	   http://www.mozilla.org/docs/web-developer/sniffer/browser_type[_oo].html 
 *	 Used with the following permission 
 *	   (C) Netscape Communications 1999-2001.  Permission granted to reuse and distribute. 
 *	 Last modified 04/2002, OnlineFocus, Inc. 
 */
function Is() {
	// convert all characters to lowercase to simplify testing 
	var agt = navigator.userAgent.toLowerCase();

	// *** BROWSER VERSION ***
	// Note: On IE5, these return 4, so use is.ie5up to detect IE5
	// or is.ie6up to detect IE6.
	this.major = parseInt(navigator.appVersion, 10);
	this.minor = parseFloat(navigator.appVersion);

	// Note: Opera and WebTV spoof Navigator.  We do strict client detection.
	// If you want to allow spoofing, take out the tests for opera and webtv.
	this.nav = ((agt.indexOf('mozilla') != -1) && (agt.indexOf('spoofer') == -1) && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera') == -1) && (agt.indexOf('webtv') == -1) && (agt.indexOf('hotjava') == -1));
	this.nav2 = (this.nav && (this.major == 2));
	this.nav3 = (this.nav && (this.major == 3));
	this.nav4 = (this.nav && (this.major == 4));
	this.nav4up = (this.nav && (this.major >= 4));
	this.navonly = (this.nav && ((agt.indexOf(";nav") != -1) || (agt.indexOf("; nav") != -1)));
	this.nav6 = (this.nav && (this.major == 5));
	this.nav6up = (this.nav && (this.major >= 5));
	this.gecko = (agt.indexOf('gecko') != -1);

	this.ie = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
	this.ie3 = (this.ie && (this.major < 4));
	this.ie4 = (this.ie && (this.major == 4) && (agt.indexOf("msie 4") != -1));
	this.ie4up = (this.ie && (this.major >= 4));
	this.ie5 = (this.ie && (this.major == 4) && (agt.indexOf("msie 5.0") != -1));
	this.ie5_5 = (this.ie && (this.major == 4) && (agt.indexOf("msie 5.5") != -1));
	this.ie5up = (this.ie && !this.ie3 && !this.ie4);
	this.ie5_5up = (this.ie && !this.ie3 && !this.ie4 && !this.ie5);
	this.ie6 = (this.ie && (this.major == 4) && (agt.indexOf("msie 6.") != -1));
	this.ie6up = (this.ie && !this.ie3 && !this.ie4 && !this.ie5 && !this.ie5_5);

	// KNOWN BUG: On AOL4, returns false if IE3 is embedded browser
	// or if this is the first browser window opened.  Thus the
	// variables is.aol, is.aol3, and is.aol4 aren't 100% reliable.
	this.aol = (agt.indexOf("aol") != -1);
	this.aol3 = (this.aol && this.ie3);
	this.aol4 = (this.aol && this.ie4);
	this.aol5 = (agt.indexOf("aol 5") != -1);
	this.aol6 = (agt.indexOf("aol 6") != -1);

	this.opera = (agt.indexOf("opera") != -1);
	this.opera2 = (agt.indexOf("opera 2") != -1 || agt.indexOf("opera/2") != -1);
	this.opera3 = (agt.indexOf("opera 3") != -1 || agt.indexOf("opera/3") != -1);
	this.opera4 = (agt.indexOf("opera 4") != -1 || agt.indexOf("opera/4") != -1);
	this.opera5 = (agt.indexOf("opera 5") != -1 || agt.indexOf("opera/5") != -1);
	this.opera5up = (this.opera && !this.opera2 && !this.opera3 && !this.opera4);

	this.webtv = (agt.indexOf("webtv") != -1);

	this.TVNavigator = ((agt.indexOf("navio") != -1) || (agt.indexOf("navio_aoltv") != -1));
	this.AOLTV = this.TVNavigator;

	this.hotjava = (agt.indexOf("hotjava") != -1);
	this.hotjava3 = (this.hotjava && (this.major == 3));
	this.hotjava3up = (this.hotjava && (this.major >= 3));
}

//This Function commented out as it's not needed anymore but included for archival purposes.
// loadDtImages -- load images for dynamic text swap for Netscape 4.x 
function loadDtImages() {

	if (!isIE3Mac && is.nav4) {
		// Dim units images 
		dim_units_in = new Image();
		dim_units_in.src = '/images/shared/rates/units/shared_rates_units_in.gif';
		dim_units_cm = new Image();
		dim_units_cm.src = '/images/shared/rates/units/shared_rates_units_cm.gif';

		// Weight units images 
		weight_units_lb = new Image();
		weight_units_lb.src = '/images/shared/rates/units/shared_rates_units_lb.gif';
		weight_units_kg = new Image();
		weight_units_kg.src = '/images/shared/rates/units/shared_rates_units_kg.gif';

		// Blank image 
		blank_image = new Image();
		blank_image.src = '/images/shared/shared_dot_clear.gif';
	}
}

// localNumber -- return localized version of number 
function localNumber(numberString) {
	numberString = numberString.replace(/\s+/g, '');
	numberString = numberString.replace(/\./g, getLocalNumberDecimal());
	numberString = numberString.replace(eval('/^\\' + getLocalNumberDecimal() + '/'), '0' + getLocalNumberDecimal());
	numberString = numberString.replace(eval('/\\' + getLocalNumberDecimal() + '$/'), '');
	return numberString;
}

//Sets up modal output warnings
function outputWarn(element) {
	if (element.value.match(/^\s*$/) || element.value.match(/^\s*results\s*$/i)) {
		element.blur();
	}
}

// preparePage -- functions to call to prepare page after loading 
// Functions, etc. to be called as page is loading in main processing, this theoretically gets called after loading complete, etc. 
function preparePage() {
	updateUnits(document.dim_weight_form);
}

// processConversion -- process conversion request 
function processConversion(form) {
	destination = 'international';
	// Update units 
	updateUnits(form);

	if (validateForm(form, "extended")) {
		var units,
		destination;
		var docalc_dimweight = true;
		//whether we calculate dim weight or not
		var area_cap;
		// package area limit for business rule (1 cubic foot)
		units = getElementValue(form.units);
		destination = getElementValue(form.destination);

		docalc_dimweight = true;
		if (docalc_dimweight) {
			// Calculate dim weight 
			dimWeight = 0;
			var dimWeight = calculateDimWeight(units, destination, generalNumber(form.dim_length.value), generalNumber(form.dim_width.value), generalNumber(form.dim_height.value));
			form.dim_weight.value = localNumber(roundNumberString(dimWeight.toString(), 3, true));
			// Compare actual and dim weights 
			var dim_weight_formula = "L x W x H / " + localNumber(getDimWeightFactor(units, destination).toString());
			if (useDimWeight(generalNumber(form.actual_weight.value), generalNumber(form.dim_weight.value))) {
				dtUpdate('output', output_dim_weight.replace(/\%\%\s*dim_weight_formula\s*\%\%/i, dim_weight_formula), class_default);
			}
			else {
				dtUpdate('output', output_actual_weight.replace(/\%\%\s*dim_weight_formula\s*\%\%/i, dim_weight_formula), class_default);
			}
		}
		else
		// docalc_dimweight
		{
			form.dim_weight.value = form.actual_weight.value;
			dtUpdate('output', output_min_dim_weight, class_default);
		}
	}
}

// Determines element type and resets to default value accordingly 
// Currently only supports text fields and radio buttons 
function resetElementValue(element) {
	var elementType = element.type;

	if (! (elementType)) {
		elementType = element[0].type;
	}
	if (! (elementType)) {
		return false;
	}

	switch (elementType) {
		case("text"):
		element.value = element.defaultValue;
		return true;
		// Breaks never reached, but just to be official, etc. 
		break;
		case ("radio"):
			for (j = 0; j < element.length; j++) {
				if (element[j].defaultChecked) {
					element[j].checked = true;
					break;
				}
			}
			return true;
			break;
		default:
			return "";
	}
	return ""; // should never be reached but it prevents JS warnings and presents cleaner code.
}

function resetForm(form, type, resetInputs) {
	var i, j;

	if ((type) && (type.toLowerCase() == "partial")) {
		// Would rather take an approach of give a list of inputs 
		//	 to preserve, do a full reset, and restore the 
		//	 preserve input values
		for (i = 0; i < resetInputs.length; i++) {
			resetElementValue(eval('form.' + resetInputs[i]));
		}
	}
	else {
		// Netscape 4.x form.reset() doesn't take effect until entire onClick call 
		//	 done, so need to switch units button earlier to update units 
		//	 dynamic text 
		if (defaultUnitsButton == "") {
			for (i = 0; i < form.units.length; i++) {
				if (form.units[i].defaultChecked) {
					defaultUnitsButton = form.units[i];
					break;
				}
			}
		}
		defaultUnitsButton.checked = true;
		// Although called here, won't take effect until after entire onClick 
		//	 call done 
		form.reset();
	}
	updateUnits(form);
	dtUpdate('output', '', class_default);
	dtUpdate('general', '', class_default);
	dtUpdate('errors', '', class_error);
	return false;
}

// roundNumberString -- rounds number to specified number of decimal places (if rounding is needed) 
// Inputs: number in string format, number of decimal places to round to, whether should return all decimal places (e.x. 23.20 vs. 23.2 for 2  decimal places) 
// Returns: rounded number in string format 
function roundNumberString(numberString, places, fill) {
	var i,
	fillCount;

	numberString = numberString.replace(/\.$/, "");
	if (numberString.match(/\d*\.?\d+/)) {
		var adjustDecimal = Math.pow(10, places);
		if (fill) {
			var resultString = Math.round(numberString * adjustDecimal).toString();
			fillCount = places - resultString.length;
			for (i = 0; i < fillCount; i++) {
				resultString = "0" + resultString;
			}
			return resultString.slice(0, 0 - places) + "." + resultString.substr(resultString.length - places);
		}
		else {
			var result = Math.round(numberString * adjustDecimal) / adjustDecimal;
			return result.toString();
		}
	}
	return numberString;
}

// Determines element type and sets value accordingly Currently only supports text fields, radio buttons and select-one dropdowns 
function setElementValue(element, value) {
	var elementType = element.type;

	if (! (elementType)) {
		elementType = element[0].type;
	}
	if (! (elementType)) {
		return false;
	}

	switch (elementType) {
		case("text"):
		element.value = value;
		return true;
		// Breaks never reached, but just to be official, etc. 
		break;
		case ("radio"):
		for (j = 0; j < element.length; j++) {
			if (element[j].value == value) {
				element[j].checked = true;
			}
		}
		return true;
		break;
		case ("select-one"):
			for (j = 0; j < element.options.length; j++) {
				if (element.options[j].value == value) {
					element.selectedIndex = j;
				}
			}
			return true;
		break;
		default:
		return false;
	}
	return "";
}

// setLocalNumberDecimal -- set localized numerical decimal character 
function setLocalNumberDecimal(value) {
	localNumberDecimal = value;
	return true;
}

// setLocalNumberSeparator -- sets localized numerical separator 
function setLocalNumberSeparator(value) {
	localNumberSeparator = value;
	return true;
}

function showContent(d) {
	document.getElementById(d).style.display = "";
}

// sortDims -- return dimensions in order will be used for dim weight calculation (i.e. length longest, etc.) 
function sortDims(dims) {
	// Compare function will compare numerically, and string entries will get sorted accordingly 
	dims = dims.sort(compareNumericalDescending);
	return dims;
}

// updateUnits -- update units when units input switched 
function updateUnits(form) {
	var unitsValue = getElementValue(form.units).toLowerCase();

	switch (unitsValue) {
		case "standard":
			dtUpdate('dim_units', 'in', class_default);
			dtUpdate('weight_units', 'lb', class_default);
			dtUpdate('weight_units2', 'lb', class_default);
		break;
		case "metric":
			dtUpdate('dim_units', 'cm', class_default);
			dtUpdate('weight_units', 'kg', class_default);
			dtUpdate('weight_units2', 'kg', class_default);
		break;
		default:
			dtUpdate('dim_units', '', class_default);
			dtUpdate('weight_units', '', class_default);
			dtUpdate('weight_units2', '', class_default);
	}
}

// useDimWeight -- determine which weight will be used for rates calculations 
// Inputs: actual weight and dim weight 
// Outputs: true if dim weight used, false if actual weight, etc. 
function useDimWeight(actualWeight, dimWeight) {
	return (Number(dimWeight) > Number(actualWeight));
}

// validateForm -- check form for errors 
function validateForm(form, validateType) {
	var errors = "";
	var errorFocus;

	// Validate form elements 
	for (i = 0; i < form.elements.length; i++) {
		results = validateFormElement(form.elements[i]);
		if (results[0] != "") {
			errors = errors + results[0] + '|';
			if (! (errorFocus)) {
				errorFocus = results[1];
			}
		}
	}

	// Check for additional error checks 
	if ((validateType) && (validateType.toLowerCase() == "extended")) {
		results = validateFormOther(form);
		if (results[0] != "") {
			errors = errors + results[0] + '|';
			if (! (errorFocus)) {
				errorFocus = results[1];
			}
		}
	}
	handleFormErrors(errors, errorFocus);
	return (errors == "");
}

// validateFormElement -- validation loop called for each element in a form 
//	 Inputs: element object 
//	 Outputs: array of error message and form element object to switch focus to for element error correction (usually same element, etc.) 
function validateFormElement(element) {
	destination = 'international';

	if ((element.name == "dim_length") || (element.name == "dim_width") || (element.name == "dim_height")) {
		if (element.value.match(/^\s*$/)) {
			return (Array)("error_required", element);
		}
		valueAdjusted = validateNumber(generalNumber(element.value));
		if (valueAdjusted == "") {
			return (Array)("error_numerical", element);
		}
		// Check not zero, already not allowed to be negative, etc.
		if (valueAdjusted == 0) {
			return (Array)("error_required", element);
		}
		element.value = localNumber(valueAdjusted);
		//function checkLength(length, units, destination)
		if (! (checkIPFLength(generalNumber(element.value), getElementValue(element.form.units), 'international'))) {
			if ((checkLength(generalNumber(element.value), getElementValue(element.form.units), 'international'))) {
				//return (Array)("error_ipf_only", element.form.dim_length);
				}
			else {
				return (Array)("error_length_international", element.form.dim_length);
			}
		}
	}
	else if (element.name == "actual_weight") {
		//console.log("Actual Weight");
		if (! (element.value.match(/^\s*$/))) {
			valueAdjusted = validateNumber(generalNumber(element.value));
			if (valueAdjusted == "") {
				return (Array)("error_numerical", element);
			}
			//console.log("mark 2");
			element.value = localNumber(valueAdjusted);
			//console.log(element.value);
			//console.log(getElementValue(element.form.units));
			//console.log(checkIPFWeight(generalNumber(element.value), getElementValue(element.form.units)));
			if ((checkIPFWeight(generalNumber(element.value), getElementValue(element.form.units)))) {
				//console.log("mark 3");
				if ((checkIPWeight(generalNumber(element.value), getElementValue(element.form.units)))) {
					//console.log("mark 4");
					ipFriendly = true;
				}
				else {
					ipFriendly = false;
					ipfFriendly = true;
				}
			} else {
				return (Array)("error_weight", element.form.actual_weight);
			//console.log("too heavy!");
			}
		}
	}
	return (Array)("", "");
}

// validateFormOther -- additional validation checks 
function validateFormOther(form) {
	if (! (checkGirth(generalNumber(form.dim_length.value), generalNumber(form.dim_width.value), generalNumber(form.dim_height.value), getElementValue(form.units), 'international'))) {
		//getElementValue(form.destination)
		return (Array)("error_girth", form.dim_length);
	}

	if (form.actual_weight.value == "") {
		form.actual_weight.value = 0;
	}
	return (Array)("", "");
}

// validateNumber -- checks string to verify it's numerical 
// Inputs: non-localized number, in string format 
// Outputs: validated number in string format, or null string if not valid number 
function validateNumber(numberString) {
	// Remove whitespace and numerical separators
	numberString = numberString.toString();
	numberString = numberString.replace(/\s+/g, '');

	if (numberString.match(/^\d*\.?\d*$/) && numberString.match(/\d+/)) {
		return numberString;
	}
	return "";
}

// validateSingleFormElement -- error checks and reports for one element (wrapper to validation for onChange calls 
function validateSingleFormElement(element) {
	var results = validateFormElement(element);
	handleFormErrors(results[0], results[1]);
	return (results[0] == "");
}