packaging.js 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902
  1. /**
  2. * Copyright © Magento, Inc. All rights reserved.
  3. * See COPYING.txt for license details.
  4. */
  5. define(['prototype'], function () {
  6. window.Packaging = Class.create();
  7. Packaging.prototype = {
  8. /**
  9. * Initialize object
  10. */
  11. initialize: function (params) {
  12. this.packageIncrement = 0;
  13. this.packages = [];
  14. this.itemsAll = [];
  15. this.createLabelUrl = params.createLabelUrl ? params.createLabelUrl : null;
  16. this.itemsGridUrl = params.itemsGridUrl ? params.itemsGridUrl : null;
  17. this.errorQtyOverLimit = params.errorQtyOverLimit;
  18. this.titleDisabledSaveBtn = params.titleDisabledSaveBtn;
  19. this.window = $('packaging_window');
  20. this.messages = this.window.select('.message-warning')[0];
  21. this.packagesContent = $('packages_content');
  22. this.template = $('package_template');
  23. this.paramsCreateLabelRequest = {};
  24. this.validationErrorMsg = params.validationErrorMsg;
  25. this.defaultItemsQty = params.shipmentItemsQty ? params.shipmentItemsQty : null;
  26. this.defaultItemsPrice = params.shipmentItemsPrice ? params.shipmentItemsPrice : null;
  27. this.defaultItemsName = params.shipmentItemsName ? params.shipmentItemsName : null;
  28. this.defaultItemsWeight = params.shipmentItemsWeight ? params.shipmentItemsWeight : null;
  29. this.defaultItemsProductId = params.shipmentItemsProductId ? params.shipmentItemsProductId : null;
  30. this.defaultItemsOrderItemId = params.shipmentItemsOrderItemId ? params.shipmentItemsOrderItemId : null;
  31. this.shippingInformation = params.shippingInformation ? params.shippingInformation : null;
  32. this.thisPage = params.thisPage ? params.thisPage : null;
  33. this.customizableContainers = params.customizable ? params.customizable : [];
  34. this.eps = 0.000001;
  35. },
  36. /**
  37. * Get Package Id
  38. */
  39. getPackageId: function (packageBlock) {
  40. return packageBlock.id.match(/\d{0,}$/)[0];
  41. },
  42. //******************** Setters **********************************//
  43. setLabelCreatedCallback: function (callback) {
  44. this.labelCreatedCallback = callback;
  45. },
  46. setCancelCallback: function (callback) {
  47. this.cancelCallback = callback;
  48. },
  49. setConfirmPackagingCallback: function (callback) {
  50. this.confirmPackagingCallback = callback;
  51. },
  52. setItemQtyCallback: function (callback) {
  53. this.itemQtyCallback = callback;
  54. },
  55. setCreateLabelUrl: function (url) {
  56. this.createLabelUrl = url;
  57. },
  58. setParamsCreateLabelRequest: function (params) {
  59. Object.extend(this.paramsCreateLabelRequest, params);
  60. },
  61. //******************** End Setters *******************************//
  62. showWindow: function () {
  63. if (this.packagesContent.childElements().length == 0) {
  64. this.newPackage();
  65. }
  66. jQuery(this.window).modal('openModal');
  67. },
  68. cancelPackaging: function () {
  69. if (Object.isFunction(this.cancelCallback)) {
  70. this.cancelCallback();
  71. }
  72. },
  73. confirmPackaging: function (params) {
  74. if (Object.isFunction(this.confirmPackagingCallback)) {
  75. this.confirmPackagingCallback();
  76. }
  77. },
  78. checkAllItems: function (headCheckbox) {
  79. $(headCheckbox).up('table').select('tbody input[type="checkbox"]').each(function (checkbox) {
  80. checkbox.checked = headCheckbox.checked;
  81. this._observeQty.call(checkbox);
  82. }.bind(this));
  83. },
  84. cleanPackages: function () {
  85. this.packagesContent.update();
  86. this.packages = [];
  87. this.itemsAll = [];
  88. this.packageIncrement = 0;
  89. this._setAllItemsPackedState();
  90. this.messages.hide().update();
  91. },
  92. sendCreateLabelRequest: function () {
  93. var self = this;
  94. if (!this.validate()) {
  95. this.messages.show().update(this.validationErrorMsg);
  96. return;
  97. }
  98. this.messages.hide().update();
  99. if (this.createLabelUrl) {
  100. var weight, length, width, height = null;
  101. var packagesParams = [];
  102. this.packagesContent.childElements().each(function (pack) {
  103. var packageId = this.getPackageId(pack);
  104. weight = parseFloat(pack.select('input[name="container_weight"]')[0].value);
  105. length = parseFloat(pack.select('input[name="container_length"]')[0].value);
  106. width = parseFloat(pack.select('input[name="container_width"]')[0].value);
  107. height = parseFloat(pack.select('input[name="container_height"]')[0].value);
  108. packagesParams[packageId] = {
  109. container: pack.select('select[name="package_container"]')[0].value,
  110. customs_value: parseFloat(pack.select('input[name="package_customs_value"]')[0].value, 10),
  111. weight: isNaN(weight) ? '' : weight,
  112. length: isNaN(length) ? '' : length,
  113. width: isNaN(width) ? '' : width,
  114. height: isNaN(height) ? '' : height,
  115. weight_units: pack.select('select[name="container_weight_units"]')[0].value,
  116. dimension_units: pack.select('select[name="container_dimension_units"]')[0].value
  117. };
  118. if (isNaN(packagesParams[packageId]['customs_value'])) {
  119. packagesParams[packageId]['customs_value'] = 0;
  120. }
  121. if ('undefined' != typeof pack.select('select[name="package_size"]')[0]) {
  122. if ('' != pack.select('select[name="package_size"]')[0].value) {
  123. packagesParams[packageId]['size'] = pack.select('select[name="package_size"]')[0].value;
  124. }
  125. }
  126. if ('undefined' != typeof pack.select('input[name="container_girth"]')[0]) {
  127. if ('' != pack.select('input[name="container_girth"]')[0].value) {
  128. packagesParams[packageId]['girth'] = pack.select('input[name="container_girth"]')[0].value;
  129. packagesParams[packageId]['girth_dimension_units'] = pack.select('select[name="container_girth_dimension_units"]')[0].value;
  130. }
  131. }
  132. if ('undefined' != typeof pack.select('select[name="content_type"]')[0] && 'undefined' != typeof pack.select('input[name="content_type_other"]')[0]) {
  133. packagesParams[packageId]['content_type'] = pack.select('select[name="content_type"]')[0].value;
  134. packagesParams[packageId]['content_type_other'] = pack.select('input[name="content_type_other"]')[0].value;
  135. } else {
  136. packagesParams[packageId]['content_type'] = '';
  137. packagesParams[packageId]['content_type_other'] = '';
  138. }
  139. var deliveryConfirmation = pack.select('select[name="delivery_confirmation_types"]');
  140. if (deliveryConfirmation.length) {
  141. packagesParams[packageId]['delivery_confirmation'] = deliveryConfirmation[0].value;
  142. }
  143. }.bind(this));
  144. for (var packageId in this.packages) {
  145. if (!isNaN(packageId)) {
  146. this.paramsCreateLabelRequest['packages[' + packageId + ']' + '[params]' + '[container]'] = packagesParams[packageId]['container'];
  147. this.paramsCreateLabelRequest['packages[' + packageId + ']' + '[params]' + '[weight]'] = packagesParams[packageId]['weight'];
  148. this.paramsCreateLabelRequest['packages[' + packageId + ']' + '[params]' + '[customs_value]'] = packagesParams[packageId]['customs_value'];
  149. this.paramsCreateLabelRequest['packages[' + packageId + ']' + '[params]' + '[length]'] = packagesParams[packageId]['length'];
  150. this.paramsCreateLabelRequest['packages[' + packageId + ']' + '[params]' + '[width]'] = packagesParams[packageId]['width'];
  151. this.paramsCreateLabelRequest['packages[' + packageId + ']' + '[params]' + '[height]'] = packagesParams[packageId]['height'];
  152. this.paramsCreateLabelRequest['packages[' + packageId + ']' + '[params]' + '[weight_units]'] = packagesParams[packageId]['weight_units'];
  153. this.paramsCreateLabelRequest['packages[' + packageId + ']' + '[params]' + '[dimension_units]'] = packagesParams[packageId]['dimension_units'];
  154. this.paramsCreateLabelRequest['packages[' + packageId + ']' + '[params]' + '[content_type]'] = packagesParams[packageId]['content_type'];
  155. this.paramsCreateLabelRequest['packages[' + packageId + ']' + '[params]' + '[content_type_other]'] = packagesParams[packageId]['content_type_other'];
  156. if ('undefined' != typeof packagesParams[packageId]['size']) {
  157. this.paramsCreateLabelRequest['packages[' + packageId + ']' + '[params]' + '[size]'] = packagesParams[packageId]['size'];
  158. }
  159. if ('undefined' != typeof packagesParams[packageId]['girth']) {
  160. this.paramsCreateLabelRequest['packages[' + packageId + ']' + '[params]' + '[girth]'] = packagesParams[packageId]['girth'];
  161. this.paramsCreateLabelRequest['packages[' + packageId + ']' + '[params]' + '[girth_dimension_units]'] = packagesParams[packageId]['girth_dimension_units'];
  162. }
  163. if ('undefined' != typeof packagesParams[packageId]['delivery_confirmation']) {
  164. this.paramsCreateLabelRequest['packages[' + packageId + ']' + '[params]' + '[delivery_confirmation]'] = packagesParams[packageId]['delivery_confirmation'];
  165. }
  166. for (var packedItemId in this.packages[packageId]['items']) {
  167. if (!isNaN(packedItemId)) {
  168. this.paramsCreateLabelRequest['packages[' + packageId + ']' + '[items]' + '[' + packedItemId + '][qty]'] = this.packages[packageId]['items'][packedItemId]['qty'];
  169. this.paramsCreateLabelRequest['packages[' + packageId + ']' + '[items]' + '[' + packedItemId + '][customs_value]'] = this.packages[packageId]['items'][packedItemId]['customs_value'];
  170. this.paramsCreateLabelRequest['packages[' + packageId + ']' + '[items]' + '[' + packedItemId + '][price]'] = self.defaultItemsPrice[packedItemId];
  171. this.paramsCreateLabelRequest['packages[' + packageId + ']' + '[items]' + '[' + packedItemId + '][name]'] = self.defaultItemsName[packedItemId];
  172. this.paramsCreateLabelRequest['packages[' + packageId + ']' + '[items]' + '[' + packedItemId + '][weight]'] = self.defaultItemsWeight[packedItemId];
  173. this.paramsCreateLabelRequest['packages[' + packageId + ']' + '[items]' + '[' + packedItemId + '][product_id]'] = self.defaultItemsProductId[packedItemId];
  174. this.paramsCreateLabelRequest['packages[' + packageId + ']' + '[items]' + '[' + packedItemId + '][order_item_id]'] = self.defaultItemsOrderItemId[packedItemId];
  175. }
  176. }
  177. }
  178. }
  179. new Ajax.Request(this.createLabelUrl, {
  180. parameters: this.paramsCreateLabelRequest,
  181. onSuccess: function (transport) {
  182. var response = transport.responseText;
  183. if (response.isJSON()) {
  184. response = response.evalJSON();
  185. if (response.error) {
  186. this.messages.show().innerHTML = response.message;
  187. } else if (response.ok && Object.isFunction(this.labelCreatedCallback)) {
  188. this.labelCreatedCallback(response);
  189. }
  190. }
  191. }.bind(this)
  192. });
  193. if (this.paramsCreateLabelRequest['code'] &&
  194. this.paramsCreateLabelRequest['carrier_title'] &&
  195. this.paramsCreateLabelRequest['method_title'] &&
  196. this.paramsCreateLabelRequest['price']
  197. ) {
  198. var a = this.paramsCreateLabelRequest['code'];
  199. var b = this.paramsCreateLabelRequest['carrier_title'];
  200. var c = this.paramsCreateLabelRequest['method_title'];
  201. var d = this.paramsCreateLabelRequest['price'];
  202. this.paramsCreateLabelRequest = {};
  203. this.paramsCreateLabelRequest['code'] = a;
  204. this.paramsCreateLabelRequest['carrier_title'] = b;
  205. this.paramsCreateLabelRequest['method_title'] = c;
  206. this.paramsCreateLabelRequest['price'] = d;
  207. } else {
  208. this.paramsCreateLabelRequest = {};
  209. }
  210. }
  211. },
  212. validate: function () {
  213. var dimensionElements = $('packaging_window').select(
  214. 'input[name=container_length],input[name=container_width],input[name=container_height],input[name=container_girth]:not("._disabled")'
  215. );
  216. var callback = null;
  217. if (dimensionElements.any(function (element) {
  218. return !!element.value;
  219. })) {
  220. callback = function (element) {
  221. $(element).addClassName('required-entry');
  222. };
  223. } else {
  224. callback = function (element) {
  225. $(element).removeClassName('required-entry');
  226. };
  227. }
  228. dimensionElements.each(callback);
  229. return result = $$('[id^="package_block_"] input').collect(function (element) {
  230. return this.validateElement(element);
  231. }, this).all();
  232. },
  233. validateElement: function (elm) {
  234. var cn = $w(elm.className);
  235. return result = cn.all(function (value) {
  236. var v = Validation.get(value);
  237. if (Validation.isVisible(elm) && !v.test($F(elm), elm)) {
  238. $(elm).addClassName('validation-failed');
  239. return false;
  240. }
  241. $(elm).removeClassName('validation-failed');
  242. return true;
  243. });
  244. },
  245. validateCustomsValue: function () {
  246. var items = [];
  247. var isValid = true;
  248. var itemsPrepare = [];
  249. var itemsPacked = [];
  250. this.packagesContent.childElements().each(function (pack) {
  251. itemsPrepare = pack.select('[data-role="package-items"]')[0];
  252. if (itemsPrepare) {
  253. items = items.concat(itemsPrepare.select('.grid tbody tr'));
  254. }
  255. itemsPacked = pack.select('.package_items')[0];
  256. if (itemsPacked) {
  257. items = items.concat(itemsPacked.select('.grid tbody tr'));
  258. }
  259. });
  260. items.each(function (item) {
  261. var itemCustomsValue = item.select('[name="customs_value"]')[0];
  262. if (!this.validateElement(itemCustomsValue)) {
  263. isValid = false;
  264. }
  265. }.bind(this));
  266. if (isValid) {
  267. this.messages.hide().update();
  268. } else {
  269. this.messages.show().update(this.validationErrorMsg);
  270. }
  271. return isValid;
  272. },
  273. newPackage: function () {
  274. var pack = this.template.cloneNode(true);
  275. pack.id = 'package_block_' + ++this.packageIncrement;
  276. pack.addClassName('package-block');
  277. pack.select('[data-role=package-number]')[0].update(this.packageIncrement);
  278. this.packagesContent.insert({
  279. top: pack
  280. });
  281. pack.select('[data-action=package-save-items]')[0].hide();
  282. pack.show();
  283. },
  284. deletePackage: function (obj) {
  285. var pack = $(obj).up('[id^="package_block"]');
  286. var packItems = pack.select('.package_items')[0];
  287. var packageId = this.getPackageId(pack);
  288. delete this.packages[packageId];
  289. pack.remove();
  290. this.messages.hide().update();
  291. this._setAllItemsPackedState();
  292. },
  293. deleteItem: function (obj) {
  294. var item = $(obj).up('tr');
  295. var itemId = item.select('[type="checkbox"]')[0].value;
  296. var pack = $(obj).up('[id^="package_block"]');
  297. var packItems = pack.select('.package_items')[0];
  298. var packageId = this.getPackageId(pack);
  299. delete this.packages[packageId]['items'][itemId];
  300. if (item.offsetParent.rows.length <= 2) { /* head + this last row */
  301. $(packItems).hide();
  302. }
  303. item.remove();
  304. this.messages.hide().update();
  305. this._recalcContainerWeightAndCustomsValue(packItems);
  306. this._setAllItemsPackedState();
  307. },
  308. recalcContainerWeightAndCustomsValue: function (obj) {
  309. var pack = $(obj).up('[id^="package_block"]');
  310. var packItems = pack.select('.package_items')[0];
  311. if (packItems) {
  312. if (!this.validateCustomsValue()) {
  313. return;
  314. }
  315. this._recalcContainerWeightAndCustomsValue(packItems);
  316. }
  317. },
  318. getItemsForPack: function (obj) {
  319. if (this.itemsGridUrl) {
  320. var parameters = $H({
  321. 'shipment_id': this.shipmentId
  322. });
  323. var packageBlock = $(obj).up('[id^="package_block"]');
  324. var packagePrapare = packageBlock.select('[data-role=package-items]')[0];
  325. var packagePrapareGrid = packagePrapare.select('.grid_prepare')[0];
  326. new Ajax.Request(this.itemsGridUrl, {
  327. parameters: parameters,
  328. onSuccess: function (transport) {
  329. var response = transport.responseText;
  330. if (response) {
  331. packagePrapareGrid.update(response);
  332. this.processPackagePrepare(packagePrapareGrid);
  333. if (packagePrapareGrid.select('.grid tbody tr').length) {
  334. packageBlock.select('[data-action=package-add-items]')[0].hide();
  335. packageBlock.select('[data-action=package-save-items]')[0].show();
  336. packagePrapare.show();
  337. } else {
  338. packagePrapareGrid.update();
  339. }
  340. }
  341. }.bind(this)
  342. });
  343. }
  344. },
  345. getPackedItemsQty: function () {
  346. var items = [];
  347. for (var packageId in this.packages) {
  348. if (!isNaN(packageId)) {
  349. for (var packedItemId in this.packages[packageId]['items']) {
  350. if (!isNaN(packedItemId)) {
  351. if (items[packedItemId]) {
  352. items[packedItemId] += this.packages[packageId]['items'][packedItemId]['qty'];
  353. } else {
  354. items[packedItemId] = this.packages[packageId]['items'][packedItemId]['qty'];
  355. }
  356. }
  357. }
  358. }
  359. }
  360. return items;
  361. },
  362. _parseQty: function (obj) {
  363. var qty = $(obj).hasClassName('qty-decimal') ? parseFloat(obj.value) : parseInt(obj.value);
  364. if (isNaN(qty) || qty <= 0) {
  365. qty = 1;
  366. }
  367. return qty;
  368. },
  369. packItems: function (obj) {
  370. var anySelected = false;
  371. var packageBlock = $(obj).up('[id^="package_block"]');
  372. var packageId = this.getPackageId(packageBlock);
  373. var packagePrepare = packageBlock.select('[data-role=package-items]')[0];
  374. var packagePrepareGrid = packagePrepare.select('.grid_prepare')[0];
  375. // check for exceeds the total shipped quantity
  376. var checkExceedsQty = false;
  377. this.messages.hide().update();
  378. packagePrepareGrid.select('.grid tbody tr').each(function (item) {
  379. var checkbox = item.select('[type="checkbox"]')[0];
  380. var itemId = checkbox.value;
  381. var qtyValue = this._parseQty(item.select('[name="qty"]')[0]);
  382. item.select('[name="qty"]')[0].value = qtyValue;
  383. if (checkbox.checked && this._checkExceedsQty(itemId, qtyValue)) {
  384. this.messages.show().update(this.errorQtyOverLimit);
  385. checkExceedsQty = true;
  386. }
  387. }.bind(this));
  388. if (checkExceedsQty) {
  389. return;
  390. }
  391. if (!this.validateCustomsValue()) {
  392. return;
  393. }
  394. // prepare items for packing
  395. packagePrepareGrid.select('.grid tbody tr').each(function (item) {
  396. var checkbox = item.select('[type="checkbox"]')[0];
  397. if (checkbox.checked) {
  398. var qty = item.select('[name="qty"]')[0];
  399. var qtyValue = this._parseQty(qty);
  400. item.select('[name="qty"]')[0].value = qtyValue;
  401. anySelected = true;
  402. qty.disabled = 'disabled';
  403. checkbox.disabled = 'disabled';
  404. packagePrepareGrid.select('.grid th [type="checkbox"]')[0].up('th label').hide();
  405. item.select('[data-action=package-delete-item]')[0].show();
  406. } else {
  407. item.remove();
  408. }
  409. }.bind(this));
  410. // packing items
  411. if (anySelected) {
  412. var packItems = packageBlock.select('.package_items')[0];
  413. if (!packItems) {
  414. packagePrepare.insert(new Element('div').addClassName('grid_prepare'));
  415. packagePrepare.insert({
  416. after: packagePrepareGrid
  417. });
  418. packItems = packagePrepareGrid.removeClassName('grid_prepare').addClassName('package_items');
  419. packItems.select('.grid tbody tr').each(function (item) {
  420. var itemId = item.select('[type="checkbox"]')[0].value;
  421. var qtyValue = parseFloat(item.select('[name="qty"]')[0].value);
  422. qtyValue = qtyValue <= 0 ? 1 : qtyValue;
  423. if ('undefined' == typeof this.packages[packageId]) {
  424. this.packages[packageId] = {
  425. 'items': [], 'params': {}
  426. };
  427. }
  428. if ('undefined' == typeof this.packages[packageId]['items'][itemId]) {
  429. this.packages[packageId]['items'][itemId] = {};
  430. this.packages[packageId]['items'][itemId]['qty'] = qtyValue;
  431. } else {
  432. this.packages[packageId]['items'][itemId]['qty'] += qtyValue;
  433. }
  434. }.bind(this));
  435. } else {
  436. packagePrepareGrid.select('.grid tbody tr').each(function (item) {
  437. var itemId = item.select('[type="checkbox"]')[0].value;
  438. var qtyValue = parseFloat(item.select('[name="qty"]')[0].value);
  439. qtyValue = qtyValue <= 0 ? 1 : qtyValue;
  440. if ('undefined' == typeof this.packages[packageId]['items'][itemId]) {
  441. this.packages[packageId]['items'][itemId] = {};
  442. this.packages[packageId]['items'][itemId]['qty'] = qtyValue;
  443. packItems.select('.grid tbody')[0].insert(item);
  444. } else {
  445. this.packages[packageId]['items'][itemId]['qty'] += qtyValue;
  446. var packItem = packItems.select('[type="checkbox"][value="' + itemId + '"]')[0].up('tr').select('[name="qty"]')[0];
  447. packItem.value = this.packages[packageId]['items'][itemId]['qty'];
  448. }
  449. }.bind(this));
  450. packagePrepareGrid.update();
  451. }
  452. $(packItems).show();
  453. this._recalcContainerWeightAndCustomsValue(packItems);
  454. } else {
  455. packagePrepareGrid.update();
  456. }
  457. // show/hide disable/enable
  458. packagePrepare.hide();
  459. packageBlock.select('[data-action=package-save-items]')[0].hide();
  460. packageBlock.select('[data-action=package-add-items]')[0].show();
  461. this._setAllItemsPackedState();
  462. },
  463. validateItemQty: function (itemId, qty) {
  464. return this.defaultItemsQty[itemId] < qty ? this.defaultItemsQty[itemId] : qty;
  465. },
  466. changeMeasures: function (obj) {
  467. var incr = 0;
  468. var incrSelected = 0;
  469. obj.childElements().each(function (option) {
  470. if (option.selected) {
  471. incrSelected = incr;
  472. }
  473. incr++;
  474. });
  475. var packageBlock = $(obj).up('[id^="package_block"]');
  476. packageBlock.select('.measures').each(function (item) {
  477. if (item.name != obj.name) {
  478. var incr = 0;
  479. item.select('option').each(function (option) {
  480. if (incr == incrSelected) {
  481. item.value = option.value;
  482. //option.selected = true
  483. }
  484. incr++;
  485. });
  486. }
  487. });
  488. },
  489. checkSizeAndGirthParameter: function (obj, enabled) {
  490. if (enabled == 0) {
  491. return;
  492. }
  493. var currentNode = obj;
  494. while (currentNode.nodeName != 'TBODY') {
  495. currentNode = currentNode.parentNode;
  496. }
  497. if (!currentNode) {
  498. return;
  499. }
  500. var packageSize = currentNode.select('select[name=package_size]');
  501. var packageContainer = currentNode.select('select[name=package_container]');
  502. var packageGirth = currentNode.select('input[name=container_girth]');
  503. var packageGirthDimensionUnits = currentNode.select('select[name=container_girth_dimension_units]');
  504. if (packageSize.length <= 0) {
  505. return;
  506. }
  507. var girthEnabled = packageContainer[0].value == 'NONRECTANGULAR' || packageContainer[0].value == 'VARIABLE';
  508. if (!girthEnabled) {
  509. packageGirth[0].value = '';
  510. packageGirth[0].disable();
  511. packageGirth[0].addClassName('_disabled');
  512. packageGirthDimensionUnits[0].disable();
  513. packageGirthDimensionUnits[0].addClassName('_disabled');
  514. } else {
  515. packageGirth[0].enable();
  516. packageGirth[0].removeClassName('_disabled');
  517. packageGirthDimensionUnits[0].enable();
  518. packageGirthDimensionUnits[0].removeClassName('_disabled');
  519. }
  520. var sizeEnabled = packageContainer[0].value == 'NONRECTANGULAR' || packageContainer[0].value == 'RECTANGULAR' ||
  521. packageContainer[0].value == 'VARIABLE';
  522. if (!sizeEnabled) {
  523. option = document.createElement('OPTION');
  524. option.value = '';
  525. option.text = '';
  526. packageSize[0].options.add(option);
  527. packageSize[0].value = '';
  528. packageSize[0].disable();
  529. packageSize[0].addClassName('_disabled');
  530. } else {
  531. for (i = 0; i < packageSize[0].length; i++) {
  532. if (packageSize[0].options[i].value == '') {
  533. packageSize[0].removeChild(packageSize[0].options[i]);
  534. }
  535. }
  536. packageSize[0].enable();
  537. packageSize[0].removeClassName('_disabled');
  538. }
  539. },
  540. changeContainerType: function (obj) {
  541. if (this.customizableContainers.length <= 0) {
  542. return;
  543. }
  544. var disable = true;
  545. for (var i in this.customizableContainers) {
  546. if (this.customizableContainers[i] == obj.value) {
  547. disable = false;
  548. break;
  549. }
  550. }
  551. var currentNode = obj;
  552. while (currentNode.nodeName != 'TBODY') {
  553. currentNode = currentNode.parentNode;
  554. }
  555. if (!currentNode) {
  556. return;
  557. }
  558. $(currentNode).select(
  559. 'input[name=container_length],input[name=container_width],input[name=container_height],select[name=container_dimension_units]'
  560. ).each(function (inputElement) {
  561. if (disable) {
  562. Form.Element.disable(inputElement);
  563. inputElement.addClassName('_disabled');
  564. if (inputElement.nodeName == 'INPUT') {
  565. $(inputElement).value = '';
  566. }
  567. } else {
  568. Form.Element.enable(inputElement);
  569. inputElement.removeClassName('_disabled');
  570. }
  571. });
  572. },
  573. changeContentTypes: function (obj) {
  574. var packageBlock = $(obj).up('[id^="package_block"]');
  575. var contentType = packageBlock.select('[name=content_type]')[0];
  576. var contentTypeOther = packageBlock.select('[name=content_type_other]')[0];
  577. if (contentType.value == 'OTHER') {
  578. Form.Element.enable(contentTypeOther);
  579. contentTypeOther.removeClassName('_disabled');
  580. } else {
  581. Form.Element.disable(contentTypeOther);
  582. contentTypeOther.addClassName('_disabled');
  583. }
  584. },
  585. //******************** Private functions **********************************//
  586. _getItemsCount: function (items) {
  587. var count = 0;
  588. items.each(function (itemCount) {
  589. if (!isNaN(itemCount)) {
  590. count += parseFloat(itemCount);
  591. }
  592. });
  593. return count;
  594. },
  595. /**
  596. * Show/hide disable/enable buttons in case of all items packed state
  597. */
  598. _setAllItemsPackedState: function () {
  599. var addPackageBtn = $$('[data-action=add-packages]')[0];
  600. var savePackagesBtn = $$('[data-action=save-packages]')[0];
  601. if (this._getItemsCount(this.itemsAll) > 0 &&
  602. this._checkExceedsQtyFinal(this._getItemsCount(this.getPackedItemsQty()), this._getItemsCount(this.itemsAll))
  603. ) {
  604. this.packagesContent.select('[data-action=package-add-items]').each(function (button) {
  605. button.disabled = 'disabled';
  606. button.addClassName('_disabled');
  607. });
  608. addPackageBtn.addClassName('_disabled');
  609. Form.Element.disable(addPackageBtn);
  610. savePackagesBtn.removeClassName('_disabled');
  611. Form.Element.enable(savePackagesBtn);
  612. savePackagesBtn.title = '';
  613. // package number recalculation
  614. var packagesRecalc = [];
  615. this.packagesContent.childElements().each(function (pack) {
  616. if (!pack.select('.package_items .grid tbody tr').length) {
  617. pack.remove();
  618. }
  619. });
  620. var packagesCount = this.packagesContent.childElements().length;
  621. this.packageIncrement = packagesCount;
  622. this.packagesContent.childElements().each(function (pack) {
  623. var packageId = this.getPackageId(pack);
  624. pack.id = 'package_block_' + packagesCount;
  625. pack.select('[data-role=package-number]')[0].update(packagesCount);
  626. packagesRecalc[packagesCount] = this.packages[packageId];
  627. --packagesCount;
  628. }.bind(this));
  629. this.packages = packagesRecalc;
  630. } else {
  631. this.packagesContent.select('[data-action=package-add-items]').each(function (button) {
  632. button.removeClassName('_disabled');
  633. Form.Element.enable(button);
  634. });
  635. addPackageBtn.removeClassName('_disabled');
  636. Form.Element.enable(addPackageBtn);
  637. savePackagesBtn.addClassName('_disabled');
  638. Form.Element.disable(savePackagesBtn);
  639. savePackagesBtn.title = this.titleDisabledSaveBtn;
  640. }
  641. },
  642. processPackagePrepare: function (packagePrepare) {
  643. var itemsAll = [],
  644. qty,
  645. itemId,
  646. qtyValue = 0,
  647. value = 1;
  648. packagePrepare.select('.grid tbody tr').each(function (item) {
  649. qty = item.select('[name="qty"]')[0],
  650. itemId = item.select('[type="checkbox"]')[0].value,
  651. qtyValue = parseFloat(qty.value);
  652. if (Object.isFunction(this.itemQtyCallback)) {
  653. value = this.itemQtyCallback(itemId);
  654. if (typeof value !== 'undefined') {
  655. qtyValue = parseFloat(value);
  656. qtyValue = this.validateItemQty(itemId, qtyValue);
  657. qty.value = qtyValue;
  658. }
  659. } else {
  660. value = item.select('[name="qty"]')[0].value;
  661. qtyValue = typeof value == 'string' && value.length == 0 ? 0 : parseFloat(value);
  662. if (isNaN(qtyValue) || qtyValue < 0) {
  663. qtyValue = 1;
  664. }
  665. }
  666. if (qtyValue == 0) {
  667. item.remove();
  668. return;
  669. }
  670. var packedItems = this.getPackedItemsQty();
  671. itemsAll[itemId] = qtyValue;
  672. for (var packedItemId in packedItems) {
  673. if (!isNaN(packedItemId)) {
  674. var packedQty = packedItems[packedItemId];
  675. if (itemId == packedItemId) {
  676. if (qtyValue == packedQty || qtyValue <= packedQty) {
  677. item.remove();
  678. } else if (qtyValue > packedQty) {
  679. /* fix float number precision */
  680. qty.value = Number(Number(Math.round(qtyValue - packedQty + 'e+4') + 'e-4').toFixed(4));
  681. }
  682. }
  683. }
  684. }
  685. }.bind(this));
  686. if (!this.itemsAll.length) {
  687. this.itemsAll = itemsAll;
  688. }
  689. packagePrepare.select('tbody input[type="checkbox"]').each(function (item) {
  690. $(item).observe('change', this._observeQty);
  691. this._observeQty.call(item);
  692. }.bind(this));
  693. },
  694. _observeQty: function () {
  695. /** this = input[type="checkbox"] */
  696. var tr = jQuery(this).closest('tr')[0],
  697. qty = $(tr.cells[tr.cells.length - 1]).select('input[name="qty"]')[0];
  698. if (qty.disabled = !this.checked) {
  699. $(qty).addClassName('_disabled');
  700. } else {
  701. $(qty).removeClassName('_disabled');
  702. }
  703. },
  704. _checkExceedsQty: function (itemId, qty) {
  705. var packedItemQty = this.getPackedItemsQty()[itemId] ? this.getPackedItemsQty()[itemId] : 0;
  706. var allItemQty = this.itemsAll[itemId];
  707. return qty * (1 - this.eps) > allItemQty * (1 + this.eps) - packedItemQty * (1 - this.eps);
  708. },
  709. _checkExceedsQtyFinal: function (checkOne, defQty) {
  710. return checkOne * (1 + this.eps) >= defQty * (1 - this.eps);
  711. },
  712. _recalcContainerWeightAndCustomsValue: function (container) {
  713. var packageBlock = container.up('[id^="package_block"]');
  714. var packageId = this.getPackageId(packageBlock);
  715. var containerWeight = packageBlock.select('[name="container_weight"]')[0];
  716. var containerCustomsValue = packageBlock.select('[name="package_customs_value"]')[0];
  717. containerWeight.value = 0;
  718. containerCustomsValue.value = 0;
  719. container.select('.grid tbody tr').each(function (item) {
  720. var itemId = item.select('[type="checkbox"]')[0].value;
  721. var qtyValue = parseFloat(item.select('[name="qty"]')[0].value);
  722. if (isNaN(qtyValue) || qtyValue <= 0) {
  723. qtyValue = 1;
  724. item.select('[name="qty"]')[0].value = qtyValue;
  725. }
  726. var itemWeight = parseFloat(this._getElementText(item.select('[data-role=item-weight]')[0]));
  727. containerWeight.value = parseFloat(containerWeight.value) + itemWeight * qtyValue;
  728. var itemCustomsValue = parseFloat(item.select('[name="customs_value"]')[0].value) || 0;
  729. containerCustomsValue.value = parseFloat(containerCustomsValue.value) + itemCustomsValue * qtyValue;
  730. this.packages[packageId]['items'][itemId]['customs_value'] = itemCustomsValue;
  731. }.bind(this));
  732. containerWeight.value = parseFloat(parseFloat(Math.round(containerWeight.value + 'e+4') + 'e-4').toFixed(4));
  733. containerCustomsValue.value = parseFloat(Math.round(containerCustomsValue.value + 'e+2') + 'e-2').toFixed(2);
  734. if (containerCustomsValue.value == 0) {
  735. containerCustomsValue.value = '';
  736. }
  737. },
  738. _getElementText: function (el) {
  739. if ('string' == typeof el.textContent) {
  740. return el.textContent;
  741. }
  742. if ('string' == typeof el.innerText) {
  743. return el.innerText;
  744. }
  745. return el.innerHTML.replace(/<[^>]*>/g, '');
  746. }
  747. //******************** End Private functions ******************************//
  748. };
  749. });