E-Comm Shipping Calculator

Implements a shipping calculator on the current page.

31.08.2017 itibariyledir. En son verisyonu görün.

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

You will need to install an extension such as Tampermonkey to install this script.

Bu komut dosyasını yüklemek için bir kullanıcı komut dosyası yöneticisi uzantısı yüklemeniz gerekecek.

(Zaten bir kullanıcı komut dosyası yöneticim var, kurmama izin verin!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Zateb bir user-style yöneticim var, yükleyeyim!)

// ==UserScript==
// @name        E-Comm Shipping Calculator
// @namespace   https://greatest.deepsurf.us
// @include     https://sellers.shopgoodwill.com/sellers/newAuctionItem-catsel.asp*
// @include     https://sellers.shopgoodwill.com/sellers/modifyItem.asp*
// @include     *info*center/shipping.html*
// @version     2.3.0.1
// @description Implements a shipping calculator on the current page.
// @grant       none
// ==/UserScript==

var url = document.URL;
if (url.indexOf('enter/shipping.html') > 0) {
    $('body').children().remove();
}

$('head').append('<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css"><script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>');
$('body').append("<div id='dummyButton' class='fakeButton'></div>");
var minimumWeight = 3; // This is the minimum weight we'll charge.
upsDivisor = 225;

// These are editable! Format is as follows:
//
// "Button name" : price,
//
// Important notes:
// 1. Name MUST be in quotation marks.
// 2. A comma MUST be at the end of each "price", "note", "method", "tooltip", etc. line,
$('body').append("<scr"+"ipt id=\"calcUSPS\">"+
								
	"function calculateUSPS(weight) {"+
		"if (weight > 2) {"+
			"$('#calc-general').trigger('click');"+
			"$('#UPS').trigger('click');"+
		"} else {"+
			"if (weight <= 1) {"+
				"charge = 5.99;"+
			"} else if (weight <= 2) {"+
				"charge = 8.99;"+
			"}"+
			"$('#itemShippingPrice').val(charge);"+
			"shippingMethod('USPS');"+
		"}"+
	"}"+

  "function shippingMethod(method)  {"+
        "$('#UPS, #pickup').css('background-color', '#EEE');"+
        "$('#itemShipMethod > option').removeAttr('selected');"+
        "if (method == 'UPS') {"+
           "$('#itemShipMethod').val(2);"+
           "$('#itemAutoInsurance').attr('checked', false);"+
           "$('#itemShippingPrice').val(0);"+
           "$('#UPS').css('background-color', '#AAA');"+
        "} else if (method =='pickup') {"+
           "$('#itemShipMethod').val(0);"+
           "$('#itemAutoInsurance').attr('checked', false);"+
           "$('#itemShippingPrice').val(0);"+
           "$('#itemWeight').val(150);"+
           "$('#pickupOnly').css('background-color', '#AAA');"+
        "} else if (method == 'USPS') {"+
           "$('#itemShipMethod').val(3);"+
           "$('#itemAutoInsurance').attr('checked', true);"+
//           $('#itemWeight').val(Math.ceil($('#actualWeight').val()) + Math.ceil($('#addPounds').html()));
             "$('#itemWeight').val($('#actualWeight').val());"+
        "}"+
    "}"+

								 
"</scr"+"ipt>");
var shippingMethods = {
    "Sm flat rate box" : {
        "price" : 6.80,
        "note" : "Small flat rate box",
        "method" : "USPS",
        "tooltip" : "Interior dimensions: 5x8.5x1.5 - NOTE: remember room for packing material!",
    },
    "Bubble mailer" : {
        "price" : 6.80,
        "note" : "Bubble mailer",
        "tooltip" : "Bubble mailers are padded, but consider if your item needs extra padding as well.",
        "method" : "USPS"
    },
    "Med flat rate box" : {
        "price" : 13.00,
        "note" : "Medium flat rate box",
        "method" : "USPS",
        "tooltip" : "Interior dimensions: 12x13.5x3.5 OR 11x8.5x5.5 - NOTE: remember room for packing material!"
    },
    "Media" : {
        "note" : "Media",
        "tooltip" : "Any: book; movie (VHS, DVD, Blu-Ray, laserdisc, film reel); music (record, 8-track, tape, CD) - regardless of size or weight. NOT comic books, magazines, newspapers, or video games.",
        "method" : "USPS"
    },
/*    "Lt clothing" : {
        "price" : 4.99,
        "note" : "Poly-mailer",
        "tooltip" : "Poly-mailer. Use if a clothing item is light - like a t-shirt.",
        "method" : "USPS"
    },
    "Med clothing" : {
        "price" : 6.99,
        "note" : "Poly-mailer",
        "tooltip" : "Poly-mailer. Use if a clothing item is a bit heavier - like a pair of jeans.",
        "method" : "USPS"
    },*/
    "Clothing" : {
        "note" : "Clothing",
        "tooltip" : "Clothing, excluding e.g. largeish coats",
    },
    "Sm guitar box" : {
        "note" : "6x18x44 guitar box",
        "tooltip" : "Interior dimensions: 6x18x44; shipping weight: " + Math.ceil((7*19*45)/upsDivisor),
        "weight" : Math.ceil((7*19*45)/upsDivisor),
        "method" : "UPS"
    },
    "Lg guitar box" : {
        "note" : "8x20x50 guitar box",
        "tooltip" : "Interior dimensions: 8x20x50; shipping weight: " + Math.ceil((9*21*51)/upsDivisor),
        "weight" : Math.ceil((9*21*51)/upsDivisor),
        "method" : "UPS"
    },
    "Sm print box" : {
        "note" : "5x24x30 print box",
        "tooltip" : "Interior dimensions: 5x24x30; shipping weight: " + Math.ceil((6*24*31)/upsDivisor),
        "weight" : Math.ceil((6*24*31)/upsDivisor),
        "method" : "UPS"
    },
    "Lg print box" : {
        "note" : "5x30x36 print box",
        "tooltip" : "Interior dimensions: 5x30x36; shipping weight: " + Math.ceil((6*31*37)/upsDivisor),
        "weight" : Math.ceil((6*31*37)/upsDivisor),
        "method" : "UPS"
    },
/*    "Huge print box" : {
        "note" : "5.5x36x48 print box",
        "tooltip" : "Interior dimensions: 5.5x36x48; shipping weight: " + Math.ceil((7*37*49)/upsDivisor),
        "weight" : Math.ceil((7*37*49)/upsDivisor),
        "method" : "UPS"
    },*/
/*    "8x8 long box" : {
        "note" : "8x8 long box",
        "tooltip" : "Interior dimensions: 8x8x?",
        "method" : "UPS"
    },
    "12x12 long box" : {
        "note" : "12x12 long box",
        "tooltip" : "Interior dimensions: 8x8x?",
        "method" : "UPS"
    },*/
    "Sm coat box" : {
        "note" : "9x12x12 coat box",
        "tooltip" : "Interior dimensions: 9x12x12; shipping weight: " + Math.ceil((10*13*13)/upsDivisor),
        "weight" : Math.ceil((10*13*13)/upsDivisor),
        "method" : "UPS"
    },
    "Med coat box" : {
        "note" : "6x14x18 coat box",
        "tooltip" : "Interior dimensions: 6x14x18; shipping weight: " + Math.ceil((7*15*19)/upsDivisor),
        "weight" : Math.ceil((7*15*19)/upsDivisor),
        "method" : "UPS"
    },
    "Very lg coat box" : {
        "note" : "10x14x18 coat box",
        "tooltip" : "Interior dimensions: 10x14x18; shipping weight: " + Math.ceil((11*15*19)/upsDivisor),
        "weight" : Math.ceil((11*15*19)/upsDivisor),
        "method" : "UPS"
    },
    "Standard sm UPS box" : {
       "note" : "6.25x7.25x10.25 small box",
       "tooltip" : "Interior dimensions: 6.25x7.25x10.25; shipping weight: " + Math.ceil((7*8*11)/upsDivisor),
       "weight" : Math.ceil((7*8*11)/upsDivisor),
       "method" : "UPS",
    },
    "Small&light" : {
       "price" : 2.99,
       "note" : "Game/cards",
       "tooltip" : "One or two small games (or several Gameboy games), a small stack of cards, an iPod... err on the side of checking with shipping!",
       "method" : "USPS",
    },
/*    "Sew mchn w/case" : {
       "note" : "20x14x18 box",
       "tooltip" : "Interior dimensions: 14x18x20; shipping weight: " + Math.ceil((15*19*21)/upsDivisor),
       "weight" : Math.ceil((15*19*21)/upsDivisor),
       "method" : "UPS",
    },
    "Sew mchn, no case" : {
       "note" : "10x14x18 box",
       "tooltip" : "Interior dimensions: 10x14x18; shipping weight: " + Math.ceil((11*15*19)/upsDivisor),
       "weight" : Math.ceil((11*15*19)/upsDivisor),
       "method" : "UPS",
    }*/
};




// This next section sets up our default boxes.

// It's CRITICALLY IMPORTANT that the dimensions for these boxes get listed in ascending order (e.g. 8, 17, 36).

// "Interior" is the interior dimensions of the box - how large an item can fit inside. "Exterior" is the set of dimensions used to calculate the weight.
// The reason that these are defined separately is so that we can require a varying amount of padding per dimension and per box.

var guitarBoxes = {
	"default" : {
		0 : 7,
		1 : 16,
		2 : 35
		/* The interior/exterior doesn't matter here: the default "box" is used to decide "this doesn't need to go in a special box, and should be treated like a regular item". */
	},
	"boxes" : {
		1 : {
			"interior" : {
				0 : 6,
				1 : 17,
				2 : 42,
			},
			"exterior" : {
				0 : 7,
				1 : 19,
				2 : 45
			},
			"name" : "Small guitar box",
      "corresponds" : "Sm guitar box"
		},
		2 : {
			"interior" : {
				0 : 8,
				1 : 20,
				2 : 48
			},
			"exterior" : {
				0 : 9,
				1 : 21,
				2 : 51
			},
			"name" : "Large guitar box",
      "corresponds" : "Lg guitar box"
		}
	}
};

var artBoxes = {
	"default" : {
		0 : 5,
		1 : 17,
		2 : 19
	},
	"boxes" : {
		1 : {
			"interior" : {
				0 : 3,
				1 : 23,
				2 : 23
			},
			"exterior" : {
				0 : 5,
				1 : 25,
				2 : 25
			},
			"name" : "Small print box",
      "corresponds" : "Sm print box"
		},
		2 : {
			"interior" : {
				0 : 4,
				1 : 23,
				2 : 29
			},
			"exterior" : {
				0 : 6,
				1 : 25,
				2 : 31
			},
			"name" : "Medium print box",
      "corresponds" : "Med print box"
		},
		3 : {
			"interior" : {
				0 : 4,
				1 : 29,
				2 : 35
			},
			"exterior" : {
				0 : 6,
				1 : 31,
				2 : 37
			},
			"name" : "Large print box",
      "corresponds" : "Lg print box"
		},
/*    4 : {
			"interior" : {
				0 : 4,
				1 : 33,       // are these dimensions right???
				2 : 45
			},
			"exterior" : {
				0 : 6,
				1 : 36,
				2 : 48
			},
			"name" : "Huge print box",
      "corresponds" : "Huge print box"
		},*/
	}
};

var generalBoxes = [
	{
		"interior" : [
			8,
			8.75,
			11.25
		],
		"name" : "11.25x8.75x8",
		"cut" : "1",
	},
	{
		"interior" : [
			9,
			12,
			12
		],
		"name" : "12x12x9",
		"cut" : "0",
	},
	{
		"interior" : [
			5,
			18,
			24
		],
		"name" : "24x5x18",
		"cut" : "1",
	},
	{
		"interior" : [
			10,
			14,
			18
		],
		"name" : "18x14x10",
		"cut" : "0",
	},
	{
		"interior" : [
			5,
			24,
			24
		],
		"name" : "24x5x24",
		"cut" : "2",
	},
	{
		"interior" : [
			8,
			8,
			60
		],
		"name" : "8x8x48",
		"cut" : "2",
	},
	{
		"interior" : [
			5,
			24,
			30
		],
		"name" : "30x5x24",
		"cut" : "1",
	},
	{
		"interior" : [
			14,
			16,
			20
		],
		"name" : "20x16x14",
		"cut" : "0",
	},
	{
		"interior" : [
			6,
			18,
			48
		],
		"name" : "18x6x45",
		"cut" : "2",
	},
	{
		"interior" : [
			14,
			18,
			20
		],
		"name" : "20x14x18",
		"cut" : "1",
	},
	{
		"interior" : [
			12,
			12,
			36
		],
		"name" : "36x12x12",
		"cut" : "1",
	},
	{
		"interior" : [
			5,
			30,
			36
		],
		"name" : "36x5x30",
		"cut" : "1",
	},
	{
		"interior" : [
			12,
			12,
			60
		],
		"name" : "12x12x40",
		"cut" : "2",
	},
	{
		"interior" : [
			8,
			20,
			50
		],
		"name" : "20x8x50",
		"cut" : "2",
	},
	{
		"interior" : [
			5.5,
			36,
			40
		],
		"name" : "36x5.5x40",
		"cut" : "2",
	},
	{
		"interior" : [
			10,
			12,
			22
		],
		"name" : "22x12x10",
		"cut" : "0",
	},
];

$.each(generalBoxes, function(){
	this.exterior = [
		Math.ceil(this.interior[0]+1),
		Math.ceil(this.interior[1]+1),
		Math.ceil(this.interior[2]+1),
	]
});

$('body').append('<input id="myUPSBox" type="hidden">');

var uspsBoxes = {
	"smallFlat1" : {
	/* Because these are billed at a flat rate, they also don't need two separate sets of dimensions. All we need to know is if the item will fit. */
		0 : 1.25,
		1 : 4.75,
		2 : 8.25,
		"name" : "small ($6.80) flat rate box",
    "corresponds" : "Sm flat rate box",
    "price" : "6.80",
	},
/*	"medFlat1" : {                             // The shipping calculator is no longer going to suggest
		0 : 3.25,                                  // medium flat-rate boxes, as UPS seems to universally be
		1 : 11.75,                                 // cheaper.
		2 : 13.25,
		"name" : "medium ($13.00) flat rate box",
    "corresponds" : "Med flat rate box",
    "price" : "13.00",
	},
	"medFlat2" : {
		0 : 5.25,
		1 : 8.25,
		2 : 10.75,
		"name" : "medium ($13.00) flat rate box",
    "corresponds" : "Med flat rate box",
    "price" : "13.00",
	},*/
};

$("body").prepend("<input id='upsDivisor' type='hidden' value='"+upsDivisor+"'>");
var shippingOptions = "";
var buttonCount = 0;
$.each( shippingMethods, function( key, value ) {
       shippingOptions = shippingOptions + "<div name='" + key + "'  id='" + key + "' class='shipCharge shipType fakeButton'>" + key + "</div>";
       if (key == 'Clothing' || key == 'Med coat box') {
           shippingOptions = shippingOptions + "<br><br>";
       }
       buttonCount++;
}); 
             
$('.shipType').css('font-size','4');
if (url.indexOf('enter/shipping.html') <= 0) {
  $("body").append("<div class='shippingOptions' style='position:relative; bottom:20px; margin-top:30px; margin-bottom: 10px; font-size:14px'></div><br><br>");
} else {
  $('body').prepend('<br><br>');
}

$("body").prepend("<div id='boxDefinitions' style='display:none;'></div>");
$("#boxDefinitions").data(shippingMethods);

shippingOptions = shippingOptions + "<br><br><span class='shipType fakeButton' id='UPS'><b>UPS</b></span>";
shippingOptions = shippingOptions + "<span class='shipType fakeButton' id='pickupOnly' name='pickupOnly'><b>Pickup Only</b></span>";

$(".shippingOptions").html(shippingOptions);

calcButtonList = {
    "general" : "General",
    "guitar" : "Guitar",
    "art" : "Frame/print",
//    "long" : "Long item"
}

var myCalcButtons = "";

$.each(calcButtonList, function(index, value) {
   myCalcButtons += "<span class='calcButton fakeButton' id='calc-" + index + "' calctype='" + index + "'>" + value + "</span>";
});
//good
$('body').append("<div style='margin-top: -20px; margin-bottom: 10px; padding: 4px; border: 1px solid #AAA; width:400px;' id='shipCalcContainer'>"
      + "<b>Shipping calculator</b><br><br>"
      + "<div style='padding:2px;'><b>Dimensions:</b> <input id='dim1' class='shipCalcInput' size=5 style='position:relative; left:2px;'> <input id='dim2' class='shipCalcInput' size=5> <input id='dim3' class='shipCalcInput' size=5> OR<br>"
				+ "<b style='margin-left: 5px;'>Paste</b>: <input id='dimPaste' tabindex='-1'>"
			+"</div>"
      + "<div style='padding:2px;'><b>Real weight:</b> <input id='actualWeight'  class='shipCalcInput' size=5></div>"
	    + "<div style='padding:2px; margin-top:8px;'><b>Add</b> <span type='text' readonly id='addInches' size=2 style='border:0; font-size:120%;'>2</span> <span id='inches'>inches</span> to each side<div id='inchesSlider'></div></div>"
	    + "<div style='padding:2px; margin-bottom:8px;'><b>Add</b> <span type='text' readonly id='addPounds' size=2 style='border:0; font-size:120%;'>2</span> <span id='pounds'>pounds</span> of packing material<div id='poundsSlider'></div></div>"
      + "<div style='padding:2px;' id='ownBoxContainer'><b id='ownBoxText'>Ship in own (current) box?</b> <input type='checkbox' id='ownBox' class='shipCalcInput' ></div>"
      + "<div style='padding:4px; margin-top:3px;'>"
           + "<table>"
             + "<tr>"
               + "<td>"
                 + "<b>Calculate:</b> "
               + "</td>"
               + "<td>"
                 + "<span class='calcButton fakeButton' id='calc-general' calctype='general'>General</span>"
                 + "<span class='calcButton fakeButton' id='calc-guitar' calctype='guitar'>Guitar</span>"
                 + "<span class='calcButton fakeButton' id='calc-art' calctype='art'>Frame/print</span>"
                 + "<!--span class='calcButton fakeButton' id='calc-long' calctype='long'>Long item</span-->"
               + "</td>"
             + "</tr>"
             + "<tr>"
               + "<td>"
               + "</td>"
               + "<td>"
                 + "<span class='fakeButton' id='calc-media' calctype='media'>Media</span>"
                 + "<span class='fakeButton' id='calc-clothing' calctype='clothing'>Clothing</span>"
								 + "<span class='calcButton fakeButton' id='calc-override' calctype='override'>Override</span>"
               + "</td>"
           + "</table>"
      + "</div>"
      + "<div style='padding:2px; margin-top:5px; margin-bottom:15px; display: none;' id='printGlassContainer'><b>Glass/plexiglass/etc. front?</b> <input type='checkbox' id='printGlass' class='shipCalcInput' ></div>"
      + "<div style='padding:2px; margin-top:10px; display:none;' id='myDimWeight'>Shipping weight: <span id='shipCalcShippingWeight' style='font-size:24px; font-weight: bold;'></span> </div>"
      + "<div style='padding:2px; display:none;' id='myPickupDiv'>Shipping weight: <s><span id='pickupShippingWeight' style='color:#f00;'></span></s><br><span style='color: #f00; font-weight: bold; font-size: 20px;'>This item should probably be pickup only.</span><br> Please check with a manager if you think it should be shipped. </div>"
      + "<div style='padding:2px; display:none; color:#00f;' id='uspsDiv'>This item <strong><em>may</em></strong> fit into a $<span id='uspsSuggPrice'></span> flat-rate box. <strong style='color:#f00;'><em>Please use discretion!</em></strong><br></div>"
    + "</div>"
);
//alert(1);
$('#printGlass').attr('checked', true);
//alert(2);
//bad
if (url.indexOf('enter/shipping.html') <= 0) {
  makeButton().addClass('upsButton useButton').text('Use this (UPS)').appendTo($('#myDimWeight'));
  makeButton().addClass('uspsButton useButton').text('Use this (Post Office)').css({'color' : '#000', 'margin-top' : '5px'}).appendTo($('#uspsDiv'));
  makeButton().addClass('pickupOnlyButton useButton').text('Use this (Pickup Only)').appendTo($('#myPickupDiv'));
}

$("body").append("<div id='myBoxes' style='display:none;'></div>");
$("#myBoxes").data('guitarBoxes', guitarBoxes);
$("#myBoxes").data('artBoxes', artBoxes);
$("#myBoxes").data('uspsBoxes', uspsBoxes);
$("#myBoxes").data('generalBoxes', generalBoxes);

$('body').append('<input type="hidden" id="currentShipCalcType">');
$('body').append('<input type="hidden" id="currentShippingNote">');

var bindingTimeouts = window.setTimeout(function(){ // if this isn't on a timeout, it doesn't work right.
  var calcOverride = false;
	function setInches(value) {
		$('#addInches').html(value);
		if (value == 1) {
			$('#inches').html('inch');
		} else {
			$('#inches').html('inches');
		}
		calculateShipping();
	}
	
	$('#inchesSlider').slider({
    'value' : 2,
    'min' : 0,
    'max' : 3,
    'step' : 1,
    'slide' : function(event, ui){
      setInches(ui.value);
    },
		'change' : function(event, ui){
			if (ui.value == 0) {
				if (!confirm("Are you SURE this item doesn't need ANY packing material?")) {
					$('#inchesSlider').slider('value', 1);
					setInches(1);
				}
			}
		}
  }).css({
    'width' : '200px',
  });
  $('#poundsSlider').slider({
    'value' : 2,
    'min' : 1,
    'max' : 20,
    'step' : 1,
    'slide' : function(event, ui){
       $('#addPounds').html(ui.value);
      if (ui.value == 1) {
        $('#pounds').html('pound');
      } else {
        $('#pounds').html('pounds');
      }
      calculateShipping();
    }
  }).css({
    'width' : '200px',
  });
  $('.ui-slider').css({
    'transform':'scale(.9,.9)',
  });

	
	$('#dimPaste').bind('blur', function(){
			var re = new RegExp(/[\d.]+/g);
		  if (pasteDims = $('#dimPaste').val().match(re)) {
				console.log(pasteDims);
				$.each(pasteDims, function(dimIndex, dimValue){
					$('#dim'+(dimIndex+1)).val(dimValue);
				});
				$('#dimPaste').val('');
				$('.shipCalcInput').each(function(){
					if ($(this).val().length < 1) {
						var inputTimeouts = window.setTimeout(function(){
						   $(this).css('background-color', 'rgb(255, 136, 136)');
						}, 1000);
					}
				})
			}
		});
	
	
  function weightPrompt() {
    if (url.indexOf('enter/shipping.html') > 0) {
      return;
    } else {
      while ($('#actualWeight').val().length < 1) {
        var actualWeight = prompt('Item\'s actual weight?');
        actualWeight = actualWeight.replace(/[^\d.-]/g,'');
        $('#actualWeight').val(actualWeight);
        $('#calc-'+$('#currentShipCalcType').val()).trigger("click");
      }
    }
  }
	
  function fixNumber(val) {
    if (val.length > 0) {
      val = val.replace(/[^\d.-]/g,'');
      return Math.ceil(val);
    } else {
      return 0;
    }
  }
	
  function getDimensions(){
		var validInputs = ensureNumeric([$('#dim1'), $('#dim2'), $('#dim3'), $('#actualWeight')]);
		if (validInputs === false) {
			return false;
		}
    getDims = ['dim1', 'dim2', 'dim3'];
    var dimList = [];
    $.each(getDims, function(i, dim){
      val = $('#'+dim).val();
      dimList.push(fixNumber(val));
    });
    dimList.sort(function(a, b){return a-b});
    return dimList;
  }
	
  function checkAgainstUSPS(dimList) {
    var uspsBoxes = $('#myBoxes').data('uspsBoxes');
    var uspsBox = {};
    $.each(uspsBoxes, function(index, boxArray) {
//      if ($.isEmptyObject(uspsBox) && (dimList[0] < boxArray[0] && dimList[1] < boxArray[1] && dimList[2] < boxArray[2])) {
      if ($.isEmptyObject(uspsBox) && checkFit(dimList, boxArray)) {
        $.each(boxArray, function(key, val){
          uspsBox[key] = val;
        });
      }
    });
    $('#uspsDiv').hide();
    if (!$.isEmptyObject(uspsBox)){
      $('#uspsDiv').show();
//      $('#uspsButton').text('Use this ')
//      console.dir(uspsBox);
      $('#uspsSuggPrice').html(uspsBox['price']);
      $('#uspsDiv, .uspsButton').attr('title', 'Box interior dimensions: ' + uspsBox[0] + '" by ' + uspsBox[1] + '" by ' + uspsBox[2] + '"');
      
    }
    return;
  }
	
  function shippingWeight(dimList, type) {
    var volume = 1;
    var pickup = false;
    var dimWeight = 0;
    var myShipType = $('#currentShipCalcType').val();
    $.each(dimList, function(i, dim){
      volume *= dim;
    });
    dimWeight = volume/fixNumber($('#upsDivisor').val());
    dimWeight = Math.ceil(dimWeight);
    var actualWeight = fixNumber($('#actualWeight').val()) + fixNumber($('#addPounds').html());
    if ($('#ownBox:checked:visible').length > 0) {
      pickup = false;
    } else {
      if (actualWeight > 150) {
        pickup = true; // TODO: THIS SHOULD NOT BE HERE
      } else if (volume > 6000 && type != 'long') { // TODO: Determine if this is a reasonable volume threshold
//        pickup = true;
      }
    }
    var shippingWeight = Math.max(dimWeight, actualWeight);
    return {'shippingWeight' : shippingWeight, 'pickup' : pickup};
  }
	
  function checkFit(itemDims, boxArray) {
    boxDims = [boxArray[0], boxArray[1], boxArray[2]];
    if (itemDims.length != boxDims.length) {
      return false;
    } else {
      var fit = true;
      $.each(itemDims, function(dimIndex, dimValue){
//        console.log(Math.ceil(dimValue) + " ? " + Math.ceil(boxDims[dimIndex]));
        if (Math.ceil(dimValue) > Math.ceil(boxDims[dimIndex])) {
          fit = false;
        }
      });
//			console.log(itemDims[0] + 'x' + itemDims[1] + 'x' + itemDims[2] + ' fits ' + boxArray[0] + 'x' + boxArray[1] + 'x' + boxArray[2] + ': ' + fit);
      return fit;
    }
  }
	
  function chooseBox(dimList, boxes) {
    console.log('choosing box');
		console.dir(boxes);
		console.dir(dimList);
    var boxWeight = 9999;
    var boxName = '';
		var calcType = $('#currentShipCalcType').val();
		var myBoxDims = [];
		var cutString = '';
		var boxNoteString = '';
		var boxDimensions = [];
    $.each(boxes, function(boxIndex, boxArray){
      if (checkFit(dimList, boxArray['interior']) !== false) {
				myCutDim = boxArray['cut'];
//				boxNoteString = boxArray['exterior'][0] + 'x' + boxArray['exterior'][1] + 'x' + boxArray['exterior'][2];
				boxNoteString = boxArray['name'];
			  if (calcType == 'general' || calcOverride == true) {
//					if (boxArray['exterior'][myCutDim] != dimList[myCutDim]) {
						boxArray['exterior'][myCutDim] = dimList[myCutDim];
						boxNoteString += ', ext cut ' + (boxArray['exterior'][0]) + 'x' + (boxArray['exterior'][1]) + 'x' + (boxArray['exterior'][2]);
					  boxDimensions = [boxArray['exterior'][0], boxArray['exterior'][1], boxArray['exterior'][2]];
//					}
					
//					console.log('cut' + boxArray['cut'] + '(' + boxArray['exterior'][myCutDim] + ') to ' + dimList[myCutDim]);
			  } else {
					boxDimensions = [boxArray['exterior'][0], boxArray['exterior'][1], boxArray['exterior'][2]];
				}
        var thisBoxShipping = shippingWeight(boxArray['exterior']);
        if (thisBoxShipping['shippingWeight'] < boxWeight) {
          boxWeight = thisBoxShipping['shippingWeight'];
          boxName = boxArray['name'];
					$.each(boxArray['exterior'], function(i, v){
						myBoxDims.push(v);
					});
        }
      } else {
//         console.log('DOES NOT FIT:');
//				 console.dir(boxArray['interior']);
      }
    });

    if (boxName.length) {
//			boxNoteString = boxName + cutString;
			if ($('#calc-long').css('background-color') == 'rgb(187, 187, 187)') {
				boxNoteString = boxName;
			}
			var returnObject = {
				'weight' : boxWeight, 'name' : boxName, 'boxNoteString' : boxNoteString, 'boxDimensions' : boxDimensions,
			};
			setSGWDims(boxDimensions);
			console.dir(returnObject);
      return returnObject; // TODO: Return cut down size!
    } else {

      return false;
    }
  }
	
	function setSGWDims(dimList){
		$('#itemShipLength').val(dimList[0]);
		$('#itemShipWidth').val(dimList[1]);
		$('#itemShipHeight').val(dimList[2]);
	}
	
  function calculateShipping() {
    var shipType = $('#currentShipCalcType').val();
//    console.log('calculateShipping():' + shipType);
    var dimList = getDimensions();
		if (dimList === false) {
			return false;
		}
    var realDims = getDimensions(); // TODO: plug dimensions into SGW fields
    var pickup = false;
    var long = '';
    if ($('#dim1').val().length && $('#dim2').val().length && $('#dim3').val().length && shipType.length > 0) {
			// here is the calculate shipping function
        weightPrompt();
        $('#myDimWeight').hide();
        $('#myPickupDiv').hide();
        $('#uspsDiv').hide();
      if (shipType == 'art' && $('#ownBox:checked').length > 0) {
        dimList[0] = 1;
        dimList[1] += 3;
        dimList[2] += 3;
        shipping = shippingWeight(dimList);
        $('#myDimWeight').show();
        $('#shipCalcShippingWeight').html(shipping['shippingWeight'])
        $('.upsButton').text('Use this (UPS)');        
      } else if (shipType == 'guitar' || shipType == 'art') {
        
        var boxesName = shipType + 'Boxes';
        var myBoxes = $('#myBoxes').data(boxesName);
        if (checkFit(dimList, myBoxes['default']) !== false) {
          shipType = 'general'; // If an item is small enough, we won't even try to put it in a guitar box.
        } else {
					if (shipType == 'art' && $('#printGlass:checked').length > 0) {
						dimList[0] += 1;
						dimList[1] += 3;
						dimList[2] += 3;
					}
          var box = chooseBox(dimList, myBoxes['boxes']);
          if (box !== false) {
            $('#myDimWeight').show();
            $('#shipCalcShippingWeight').html(box['weight'])
            $('.upsButton').text('Use this (' + box['name'] + ')');
          } else {
            pickup = true;
          }
        }
      } else if (shipType == 'long') {
        if ($('#ownBox:checked').length > 0) {
          var addInches = 0;
        } else {
          var addInches = 2 * fixNumber($('#addInches').html());
        }
        
        if (dimList[0] <= 12 && dimList[1] <= 12) {
          if (dimList[0] <= 8 && dimList[1] <= 8) {
            dimList[0] = 8;      // So what's happening here is, if the item (plus padding) is
            dimList[1] = 8;      // <= 12"x12"xX", its dimensions are going to become 8x8 or 12x12
          } else {               // Then, we set long to true, which will prevent MORE inches from
            dimList[0] = 12;     // being added later.
            dimList[1] = 12;     // whether it's too big or not, we then treat it as a general item.
          }
          long = 'long';
        }
        shipType = 'general';
      }
			
			console.dir(box);
			
      // This is not an else so that things that can't fit into, or are too small for, the above box types
      // can fall through to general shipping.
			if ($('#ownBox:checked').length > 0 && shipType == 'general') {
				addInches = 1;
				$('#myDimWeight').show();
				$.each(dimList, function(i, dim) {
          dimList[i] += addInches;
        });
				var shipping = shippingWeight(dimList);
				$('#shipCalcShippingWeight').html(shipping['shippingWeight']);
				$('#myDimWeight').show();
			} else if (shipType == 'general') {
        checkAgainstUSPS(dimList);
				if ($('#itemTitle').length  > 0 && $('#s1').length) {
				  var myTitle = $('#itemTitle').val().toLowerCase();
				  var myCategory = $('#s1').val().toLowerCase();
				} else {
					var myTitle = '';
				  var myCategory = '';
				}
        if (long == 'long') {
          var addInches = 0;
				} else if (myTitle.indexOf('sewing machine') >= 0 || myCategory.indexOf('sewing machine') >= 0) {
				  // BAD! The shipping calculator shouldn't have site-specific stuff!
//					console.log('butts');
					var addInches = 0;
        } else {
          var addInches = 2 * fixNumber($('#addInches').html());
        }
        $.each(dimList, function(i, dim) {
            dimList[i] += addInches;
        });
        if (realDims[2] > 60) {
          pickup = true;
        }
				var myBoxes = $("#myBoxes").data('generalBoxes');
				calcOverride = true;
				// butts butts butts
				var box = chooseBox(dimList, myBoxes);
//				console.log('box:');
//				console.dir(box);
				if (box !== false) {
					//            $('#myDimWeight').html('Shipping weight: <span id="shipCalcShippingWeight">' + box['weight'] + "</span> ");
					$('#myDimWeight').show();
					$('#shipCalcShippingWeight').html(box['weight']);
					$('#currentShippingNote').val(box['boxNoteString']);
//					$('.upsButton').text('Use this (' + box['name'] + ')');
//					$('.upsButton').after(box['boxNoteString']+"<br>");
//				  $('.upsButton').text('Use this (UPS)');
					console.log(box['boxNoteString']);
				} else {
					pickup = true;
					$('#currentShippingNote').val('');
				}

        if ($('#ownBox:checked:visible').length > 0) {
          pickup = false;
        }
        
        if (pickup === true) {
          $('#myPickupDiv').show();
          $('#pickupShippingWeight').html($('#shipCalcShippingWeight').html());
        } else {
          $('#myDimWeight').show();
          $('.upsButton').text('Use this (UPS)');   
        }
      }
			if (shipType == 'override') {
				  var addInches = 2 * fixNumber($('#addInches').html());
					$.each(dimList, function(i, dim) {
						dimList[i] += addInches;
					});
					var shipping = shippingWeight(dimList);
				  $('#shipCalcShippingWeight').html(shipping['shippingWeight']);
				  $('#myDimWeight').show();
          $('.upsButton').text('Use this (UPS)');
				  $('.useButton').css({'background-color' : '#f00', 'border-color' : '#b00'});
				  $('#calc-override').css({'background-color' : '#f00', 'border-color' : '#d00'});
			} else {
				$('#calc-override').css({'background-color' : '#eee', 'border-color' : 'rgb(204, 204, 204)'});
//				$('.upsButton').css();
				$('.useButton').css({'background-color' : '#cce0ff', 'border-color' : '#80b3ff'});
			}
      if ($('#ownBox:checked:visible').length > 0) {
          pickup = false;
        }
      if (pickup === true) {
//        console.log('PICKUP!!');
        $('#myDimWeight').hide();
        $('#myPickupDiv').show();
        $('#pickupShippingWeight').html('9999');
      }
    } else {
//      console.log($('#dim1').val() + " " + $('#dim2').val() + " " + $('#dim3').val() + " " + shipType);
    }
		
  }
	
	
	
  function toggleOwnBoxDisable() {
    $('#ownBox').attr('disabled', false);
    if ($('#currentShipCalcType').val()=='art') {
      dimList = getDimensions();
			if (dimList === false) {
				return false;
			}
      if (dimList[0] > 1) {
        $('#ownBox').attr('checked', false);
        $('#ownBox').attr('disabled', true);
      }
    }
  }
  $('.shipCalcInput').bind('keyup', function(){
    calculateShipping();
    toggleOwnBoxDisable();
  });
  $('#ownBox, #printGlass').bind('change', function(){
    calculateShipping();
  });
  $('.calcButton').bind('click', function(){
    $('.fakeButton').css('background-color', '#EEE');
    $(this).css('background-color', '#BBB');
    $('#printGlassContainer').hide();
    shipType = this.id.substr(5);
    if (shipType == 'guitar' || shipType == 'override') {
      $('#ownBoxContainer').hide();
    } else {
      $('#ownBoxContainer').show();
      if (shipType == 'art') {
        $('#ownBoxText').html('Ship between cardboard? (Check with shipping) ');
        $('#printGlassContainer').show();
      } else{ 
        if (shipType == 'long') {
          $('#ownBoxText').html('Skip packing material (e.g. rugs) ');
        } else {
          $('#ownBoxText').html("Ship in own (current) box? ");
        }
      }
    }
    
		
		
		
    $('#currentShipCalcType').val(shipType);
    toggleOwnBoxDisable();
    calculateShipping();
  });
}, 1000);



// because cloning this will keep the CSS.

$.each( shippingMethods, function( key, value ) {
    if (value['tooltip']) {
        $(".shipType:contains('" + key + "')").attr('title', value['tooltip']);
    }
});

$('.fakeButton').css({
  'border' : '1px solid #CCC',
  'background-color' : '#EEE',
  'padding' : '3px',
  'margin-left' : '3px',
  'margin-right' : '3px',
  'display' : 'inline-block',
});

$('.useButton').css('background-color', '#e9f7fb');

$('#dummyButton').hide();

function makeButton() {
  return $('#dummyButton').clone().removeAttr('id').css('display','inline-block');
}



function ensureNumeric(elementArray) {
	var isValid = true;
	$.each(elementArray, function(elementIndex, element) {
		var elementValue = element.val();
		elementValue = elementValue.replace(' ', '');
		element.val(elementValue);
		if (elementValue != elementValue.replace(/[^\d\.]/g, '')) {
      isValid = false;
			element.css('background-color', 'rgb(255, 136, 136)');
		} else {
			element.css('background-color', '#fff');
		}
	});
  return isValid;
}

// End