/***************************************************************** * file: remote.js * * Abundatrade calculator communication and processing scripts. * Handles the AJAX calls to the Abundatrade server. * *****************************************************************/ /* jQuery('td:contains("024543525998")').parent() .find('td') .wrapInner('
') .parent() .find('td > div') .slideUp("slow", function(){ jQuery(this).parent().parent().remove(); }); ^^ Hides a row ^^ jQuery('#my_table > tbody > tr') .find('td') .wrapInner('
') .parent() .find('td > div') .slideDown("slow", function(){ var $set = jQuery(this); $set.replaceWith($set.contents()); ^^ adds a row ^^ }); */ var number_item = 1; var itemsToDispose = []; /* * function: clear_product_code() * * Format the product code with alphanumerics only. * */ function clean_product_code(element) { element.value = element.value.replace(/\W+/g, ""); } /* * function: validateEmail() * * Validates an email address * */ function validateEmail(email, confirm) { if (email.toLowerCase() == confirm.toLowerCase()) { var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return re.test(email); } else return 'nomatch'; } /* * function: clear_session() * * Clear out all data for this session, including prior saved data. * Request goes to the backend to clear data. * */ function clear_session(obj) { if (!jQuery(obj).hasClass('disabled')) { jQuery.prompt( 'Are you sure you want to delete the entire listing?', { buttons: { Delete: true, Cancel: false }, callback: function (v, m, f) { if (v) { var request = jQuery.ajax( { type: 'GET', url: 'http://' + abundacalc.server + '/trade/process/request.php', data: 'action=clear_session', dataType: 'jsonp' }); request.done(function (data) { //jQuery('#abundaCalcTbl > tbody').children().remove(); jQuery('#abundaCalcBody_request').children().remove(); data.total_qty = "0.00"; data.currency_for_total = "$"; data.total = "0.00"; display_totals(data); }); request.fail(function (jqXHR, textStatus, errorThrown) { alert("Request failed: " + textStatus + " - " + errorThrown); }); } } } ); } number_item = 1; } /* * function: new_session() * * Give user a new session id. This detaches any prior connection to the backend data. * */ function new_session(this_link) { number_item = 1; var request = jQuery.ajax( { type: 'GET', url: 'http://' + abundacalc.server + '/trade/process/request.php', data: 'action=new_session', dataType: 'jsonp' }); request.done(function (data) { }); request.fail(function (jqXHR, textStatus, errorThrown) { alert("Request failed: " + textStatus + " - " + errorThrown); please_wait(false); }); } /* * function: display_totals() * * Render the header/footer totals from JSONP data. * */ function display_totals(data) { jQuery('#product_code').val(''); jQuery('#item_count').html(data.total_qty); jQuery('#total_item_count').html(data.total_qty); jQuery('#grand_total').html(data.currency_for_total + data.total); jQuery('#total_prevaluation').html(data.currency_for_total + data.total); // Turn off the UI Lock // please_wait(false); // Enable/Disable Submit based on Total Qty // if (jQuery('#total_item_count').text() > 0) { jQuery('#submitList').removeClass('disabled'); jQuery('#submitList').removeAttr('style'); } else { jQuery('#submitList').addClass('disabled'); jQuery('#submitList').attr('style', 'cursor:default'); } // Set the delete button // jQuery('.delete_this_row').attr('onclick', 'delete_the_row(this); return false;'); jQuery('#product_qty').val('1'); jQuery('#product_code').focus(); } function bulk_open() { //do accordian stuff jQuery("#bulk_button").slideUp(1000); jQuery("#abundaCalcTbl").fadeOut(400).delay(100); jQuery("#second_content").slideUp(500); jQuery("#top_input_section").fadeOut(500); jQuery("#bulk").slideDown(500); } function bulk_close_window() { jQuery("#bulk").slideUp(500); jQuery("#top_input_section").fadeIn(500); jQuery("#second_content").slideDown(500); jQuery("#abundaCalcTbl").delay(100).fadeIn(400); jQuery("#bulk_button").slideDown(1000); load_previous_session(false); } function rows() { var lines; var TA = jQuery("#bulk_upload").val(); if (document.all) { // IE lines = TA.split("\r\n"); } else { //Mozilla lines = TA.split("\n"); } return lines; } function bulk_submit_items() { var taLineHeight = 20; // This should match the line-height in the CSS var taHeight = jQuery("#bulk_upload").get(0).scrollHeight; // Get the scroll height of the textarea jQuery("#bulk_upload").get(0).style.height = taHeight; // This line is optional, I included it so you can more easily count the lines in an expanded textarea var numberOfLines = Math.floor(taHeight / taLineHeight); byline = rows(); if (numberOfLines <= 1 && byline[0] == '') return; if (numberOfLines > 250) { submit_modal(submit_bulk); return; } jQuery.prompt({ state: { html: "
Processing your upload
0%
", buttons: {} } }); // Handle smaller line sets control = 0; waitforfinish = false; jQuery("#bar").css('width', "0%") jQuery("#progress").get(0).innerHTML = "0/" + byline.length; jQuery("#percent").get(0).innerHTML = "0%"; var stop = setInterval(function () { send = []; str = ""; str += 'control=' + control + '&bulkinput=' for (i = control * 10; i < (control * 10) + 10; i++) { if (i >= byline.length) { waitforfinish = true; } else { str += encodeURI(byline[i] + "\n"); } } var request = jQuery.ajax( { type: 'POST', url: 'http://' + abundacalc.server + '/trade/process/bulk_copy.php', data: str, dataType: 'jsonp' }); request.success(function (data) { var percent = 0; if (waitforfinish && data[0].type == 'complete') { jQuery("#bar").css('width', "100%") jQuery("#progress").get(0).innerHTML = byline.length + "/" + byline.length; jQuery("#percent").get(0).innerHTML = "100%"; jQuery.prompt.close(); bulk_close_window(); clearInterval(stop); return; } else if (data[0].type == 'complete') { if (!waitforfinish) control += 1; percent = ((control - 1) * 10) / byline.length * 100; percent = Math.round(percent); jQuery("#bar").css('width', percent + "%") jQuery("#progress").get(0).innerHTML = ((control - 1) * 10) + "/" + byline.length; jQuery("#percent").get(0).innerHTML = percent + "%"; } else if (data[0].type != 'complete') { percent = data[0].status / byline.length * 100; percent = Math.round(percent); jQuery("#bar").css('width', percent + "%") jQuery("#progress").get(0).innerHTML = data[0].status + "/" + byline.length; jQuery("#percent").get(0).innerHTML = percent + "%"; } }); }, 1000); } function submit_bulk(val) { str = ""; jQuery.each(val, function (i, obj) { str += '&' + i + '=' + obj; }); str += '&bulkinput='+encodeURI(jQuery("#bulk_upload").val()); var request = jQuery.ajax( { type: 'POST', url: 'http://' + abundacalc.server + '/trade/process/bulk_copy.php', data: str, dataType: 'jsonp' }); request.success(function (data) { display_totals(data); }); } /* * function: delete_the_row() * * Delete a selected row. * */ function delete_the_row(obj) { var product_code = jQuery(obj).parents('tr').children('.upc').text(); var request = jQuery.ajax( { type: 'GET', url: 'http://' + abundacalc.server + '/trade/process/deleteItem.php', data: 'product=' + product_code, dataType: 'jsonp' }); request.success(function (data) { display_totals(data); }); //count affected rows x = jQuery('td:contains("' + product_code + '")'); number_item -= x.length; //jQuery(obj).parents('tr').remove(); jQuery('td:contains("' + product_code + '")').parent() .find('td') .wrapInner('
') .parent() .find('td > div') .slideUp("slow", function () { jQuery(this).parent().parent().remove(); }); } /* * function: load_previous_session() * * Lookup the session on the Abundatrade backend and * load up the table based on the results. * */ function load_previous_session(pretty) { var request = jQuery.ajax( { type: 'GET', url: 'http://' + abundacalc.server + '/trade/process/request.php', data: 'action=load_previous_session', dataType: 'jsonp' }); request.success(function (data) { for (i = 0; i < data.length; i++) { part = data[i]; part.row = jQuery.parseJSON(part.row); part = build_row(part); jQuery('#abundaCalcTbl').prepend(part.row_html); if (pretty) { jQuery('td:contains("' + part.product_code + '")').parent() .find('td') .wrapInner('
') .parent() .find('td > div') .slideDown("slow", function () { var $set = jQuery(this); $set.replaceWith($set.contents()); }) } display_totals(part); } //build_row(data); //jQuery('#abundaCalcTbl > tbody').prepend(data.row_html); //jQuery('#abundaCalcTbl').prepend(data.row_html); //display_totals(data); }); request.fail(function (jqXHR, textStatus, errorThrown) { alert("Request failed: " + textStatus + " - " + errorThrown); }); } function addDuplicatesToQuantity(inputUPC) { var upcs = $$('td.upc'); var quantities = $$('td.quantity'); var duplicateQuantity = 0; //Compare the new UPC to each UPC in the existing list for (var idx = 0; idx < upcs.length; idx++) { //Check for existing UPCs matching the new UPC if (inputUPC == upcs[idx].children[0].innerHTML) { //Add the found UPC's quantity to the new UPC's //quantity duplicateQuantity += parseInt(quantities[idx].children[0].innerHTML); queueForDisposal(upcs[idx].getParent()); } } } var lastItem; function Remove_Item(product_code) { var selector = 'td:contains("' + product_code + '")'; x = jQuery(selector); number_item -= x.length; number_item++; jQuery(selector).parents('tr').remove(); } function waitFor(product_code) { jQuery('#product_code').val(''); row_html = " " + product_code + "
Getting the realtime values for your item
waiting
"; jQuery('#abundaCalcTbl').prepend(row_html); } /* * function: lookup_item * */ function lookup_item(obj) { if (!jQuery(obj).hasClass('disabled')) { // The product code must be at least 6 digits // if (jQuery('#product_code').val().length > 5) { //please_wait(true); serial = jQuery("#abundaInput").serialize(); item = jQuery('#product_code').val(); //Remove_Item(item); waitFor(item); var request = jQuery.ajax( { type: 'GET', url: 'http://' + abundacalc.server + '/trade/process/request.php', data: serial, dataType: 'jsonp' }); request.done(function (data) { Remove_Item(item); data.row = jQuery.parseJSON(data.row); build_row(data); lastItem = data; jQuery('#abundaCalcTbl').prepend(data.row_html); jQuery('td:contains("' + data.product_code + '")').parent() .find('td') .wrapInner('
') .parent() .find('td > div') .slideDown("slow", function () { var $set = jQuery(this); $set.replaceWith($set.contents()); }) display_totals(data); }); request.fail(function (jqXHR, textStatus, errorThrown) { alert("Request failed: " + textStatus + " - " + errorThrown); please_wait(false); }); // Warn if not at least 3 digits // } else { jQuery.prompt('The product code must be at least 6 characters long.
Enter a UPC or Amazon ASIN.'); } } return false; } /* * function: please_wait() * * = true, show wait (lock UI) * false, hide wait (unlock UI) */ function please_wait(UILocked) { // Wait Mode // if (UILocked) { //jQuery.prompt({ state: { html: "

Getting information ...

", buttons: {}} }); /*jQuery('#abunda_please_wait').show(); jQuery('#lookupItem').addClass('disabled'); jQuery('#submitList').addClass('disabled'); jQuery('#delete_all_top').addClass('disabled'); jQuery('#delete_all_bottom').addClass('disabled'); jQuery('.delete_this_row').addClass('disabled');*/ // Go,Go,Go... // } else { //jQuery.prompt.close(); } } function submit_modal(callback_to_submit) { var state = 0; var states = { state0: { html: '

' + '

' + '

' + '
' + '', buttons: { Cancel: 0, Next: 1 }, focus: 1, submit: function (ev, but, message, val) { fname = message.children('#name_first'); lname = message.children('#name_last'); if (but != 0) { if (val['first_name'] == '') { fname.css("border", "solid #ff0000 2px"); return false; } else { fname.css("border", ""); } if (val['last_name'] == '') { lname.css("border", "solid #ff0000 2px"); return false; } else { lname.css("border", ""); } if (validateEmail(val['email'], val['confirm_email']) == 'nomatch') { jQuery.prompt.goToState('nomatch'); } else if (validateEmail(val['email'], val['confirm_email'])) { state += but; jQuery.prompt.goToState('state' + state); } else { jQuery.prompt.goToState('invalid'); } return false; } else { jQuery.prompt.close(); } } }, state1: { buttons: { Back: -1, Cancel: 0, Next: 1 }, focus: 2, submit: function (ev, but, message, val) { if (but != 0) { lname = message.children('#referrals'); if (val['ddlReferrals'] == '-1') { jQuery('#referrals').css("border", "solid #ff0000 2px"); return false; } else { jQuery('#referrals').css("border", "") } if (val['phone_request'] == 'on') { state += but; } else { if (but == 1) { state += 2; } else { state += but; } } jQuery.prompt.goToState('state' + state); return false; } else { jQuery.prompt.close(); } }, html: 'How did you hear about us?
' + '
' + '' + '' + '

' + '
' + '

' + '
' + '
' }, state2: { html: '', buttons: { Back: -1, Cancel: 0, Next: 1 }, focus: 2, submit: function (ev, but, message, val) { if (but != 0) { lname = message.children('#phone_type'); if (val['phone_type'] == '') { lname.css("border", "solid #ff0000 2px"); return false; } else { lname.css("border", ""); } state += but; jQuery.prompt.goToState('state' + state); return false; } else { jQuery.prompt.close(); } } }, state3: { html: '

Please Note

The values shown on the calculator are a pre-valuation.

Item quality needs to be verified for final valuation.

This valuation is not a commitment.

All data is kept private.

', buttons: [{ title: 'Back', value: -1 }, { title: 'Cancel', value: 0 }, { title: 'Agree and Submit', value: 'submit'}], focus: 2, submit: function (ev, but, message, val) { if (but == "submit") { jQuery.prompt.goToState('finish'); callback_to_submit(val); return false; } if (but != 0) { if (val['scanner'] == 'on') { state += but; } else if (but == -1) { state -= 2; } else { state += but; } jQuery.prompt.goToState('state' + state); return false; } else { jQuery.prompt.close(); } } }, invalid: { html: '

Email address invalid


Please enter a valid email address.

', buttons: { OK: true }, focus: 0, submit: function (v, m, f) { jQuery.prompt.goToState('state0'); return false; } }, nomatch: { html: '

Email Addresses don\'t match!


Please check your email address to make sure it is correct.

', buttons: { OK: true }, focus: 0, submit: function (v, m, f) { jQuery.prompt.goToState('state0'); return false; } }, finish: { html: "

Sending your trade request and locking in your quote!
Give our pecking pigeons a second

", buttons: {} } }; var str = ''; jQuery.prompt(states, { callback: function (ev, v, m, f) { if (v) { } else { please_wait(false); } } }); } /* * function: submit_the_list() * * Submit The List via AJAX request. * */ function submit_the_list(obj) { if (!jQuery(obj).hasClass('disabled') && (jQuery('#total_item_count').text() > 0)) { submit_modal(submit_my_list); } } function submit_my_list(f) { str = ""; jQuery.each(f, function (i, obj) { str += '&' + i + '=' + obj; }); var request = jQuery.ajax( { type: 'GET', url: 'http://' + abundacalc.server + '/trade/process/submit.php', data: 'action=submit_list' + str, dataType: 'jsonp' }); request.done(function (data) { // No errors // if (data.error == '') { jQuery('#abundaCalcTbl > tbody').children().remove(); display_totals(data); //jQuery.prompt('Your list has been received.
Thank you for submitting your list to Abundatrade.'); window.location = abundacalc.thanks; new_session(); } else { jQuery.prompt('Your list could not be sent.
' + data.error); please_wait(false); } }); request.fail(function (jqXHR, textStatus, errorThrown) { alert("Request failed: " + textStatus + " - " + errorThrown); please_wait(false); }); } /* * When the document has been loaded... * */ jQuery(document).ready(function () { /* * Load previous session data from backend. * */ load_previous_session(false); /* Form Submit * * Capture the form submit, and just use it to lookup items. * */ jQuery('#abundaInput').submit(function () { lookup_item(jQuery('#lookupItem').text()); return false; }); /* Lookup Item.click() * * uses Ajax to talk to Abundatrade server. * must use JSONP to allow for cross-site calls and processing * of return data without error. */ //jQuery('#lookupItem').on('click', function () { lookup_item(this); return false; }); /* Submit List.click() * * uses Ajax to talk to Abundatrade server. * must use JSONP to allow for cross-site calls and processing * of return data without error. */ //jQuery('#submitList').on('click', function () { submit_the_list(this); }); /* Delete All.click() * * uses Ajax to talk to Abundatrade server. * and send the delete all action. */ jQuery('#delete_all_top').on('click', function () { clear_session(this); }); jQuery('#delete_all_bottom').on('click', function () { clear_session(this); }); }); function build_unknown(code, quantity, id) { return " " + code + "
Unknown Item
Item not found. You may send for valuation
Unkown item
" + quantity + "
$0.00 $0.00 Delete"; } function build_row(data) { data.row_html = ""; if (jQuery.isArray(data.row)) { for (var i = 0; i < data.row.length; i++) { row = data.row[i]; if (row.title == "Unknown") { data.row_html = build_unknown(row.product_code, row.quantity, row.item_id); } else { row_price = new Number(row.price_per / 100).toFixed(2); row_total = new Number(row.total_price / 100).toFixed(2); data.row_html += write_html(data, row); } number_item++; } } else { row = data.row; if (row.title == "Unknown") { data.row_html = build_unknown(row.product_code, row.quantity, row.item_id); } else { row_price = new Number(row.price_per / 100).toFixed(2); row_total = new Number(row.total_price / 100).toFixed(2); data.row_html += write_html(data, row); } number_item++; } return data; } function write_html(data, row) { return " " + row.product_code + "
" + row.title + "
" + row.title + "
" + (row.author == null ? '' : row.author) + "
" + (row.category == null ? "" : row.category) + "
" + row.quantity + " " + (row.worthless == true ? "

No Abunda Value

" : "") + (row.overstocked == true ? "Over Stocked Item" : "") + "
" + data.currency_for_total + row_price + "
" + data.currency_for_total + row_total + " Delete"; } /****************************** New Stuff *******************************/ function queueForDisposal(productcode) { var selector = 'td:contains("' + productcode + '")'; itemsToDispose.push(selector); } function disposeQueued() { for (var i = 0; i < itemsToDispose.length; i++) { jQuery(itemsToDispose[i]).parents('tr').remove(); } itemsToDispose = []; }