/* javafuncs.js -- Contains all javascript function used on
 * the site.
 *
 * Authors: Adam Hooper
 *          Robert Cotran
 *          Felix Labrecque
 *
 * $Id: javafuncs.js,v 1.13 2004/04/22 16:17:46 robert Exp $
 */

function setBackImage(elementId, imageurl) { // {{{
    if (imageurl=='') {
        document.getElementById(elementId).style.backgroundImage='';
    } else {
        document.getElementById(elementId).style.backgroundImage='url(' + imageurl + ')';
    }
} /* }}} */
function setColor(elementId, Color) { // {{{
    document.getElementById(elementId).style.color=Color;
} /* }}} */
function switchTabBack(state, tabId) { // {{{
    if (state) {
        setBackImage(tabId + 'l', '/images/tabs/tab_l_s.gif');
        setBackImage(tabId + 'm', '/images/tabs/tab_m_s.gif');
        setBackImage(tabId + 'r', '/images/tabs/tab_r_s.gif');
    } else {
        setBackImage(tabId + 'l', '/images/tabs/tab_l_n.gif');
        setBackImage(tabId + 'm', '/images/tabs/tab_m_n.gif');
        setBackImage(tabId + 'r', '/images/tabs/tab_r_n.gif');
    }
} /* }}} */
function switchSectBtnBack(state, btnId, b2b) { // {{{
    if (state) {
    	if (b2b=='B') {
       	    setBackImage(btnId, '/images/buttons/red_s.gif');
    	} else {
            setBackImage(btnId, '/images/buttons/blue_s.gif');
    	}
    } else {
        setBackImage(btnId, '');
    }
} /* }}} */
function setPackagingImage(imgId, imgPath) { // {{{
    document.images[imgId].src = imgPath;
} /* }}} */
function switchBtnBack(state, btnId, type) { // {{{
    if (state) {

        Color = 'white';

        setBackImage(btnId, '/images/buttons/t' + type + '_s.gif');
    } else {

        if (type == 1)
            Color = '#62584a';
        else
            Color = 'white';
        setBackImage(btnId, '/images/buttons/t' + type + '_n.gif');
    }
    setColor(btnId, Color);
} /* }}} */
function setFocus(focusObject) { // {{{
    document.getElementById(focusObject).focus();
    document.getElementById(focusObject).select();
} // }}}
function updateInStock() { // {{{
    var selected = document.getElementsByName('warehouse_id')[0].value;

    var stockcodeInputs = document.getElementsByName('stockcodes_shown[]');
    var warehouseInputs = document.getElementsByName('warehouses_shown[]');

    for (var i = 0; i < stockcodeInputs.length; i++) {
        var stockcode = stockcodeInputs[i].value;
        for (var j = 0; j < warehouseInputs.length; j++) {
            var warehouse = warehouseInputs[j].value;

            var elemId = 'in_stock_' + stockcode + '_' + warehouse;

            document.getElementById(elemId).style.display =
                (selected == warehouse) ? "inline" : "none";
        }
    }
} /* }}} */
function changeBrand(stockcodeId) { // {{{
    var selected
        = document.getElementsByName('brand_id[' + stockcodeId + ']')[0].value;

    var brands = document.getElementsByName('brands_shown_'
                                            + stockcodeId + '[]');

    for (var i = 0; i < brands.length; i++) {
        var brandId = brands[i].value;

        var oemsId = 'oems_' + stockcodeId + '_' + brandId;
        oem = document.getElementById(oemsId);
        if (oem) {
          oem.style.display
            = (selected == brandId) ? "inline" : "none";
        }

        var modelsId = 'models_' + stockcodeId + '_' + brandId;
        model = document.getElementById(modelsId);
        if (model) {
          model.style.display
            = (selected == brandId) ? "inline" : "none";
        }
    }
} /* }}} */
function updateShipAndBo() { // {{{
    var selected = document.getElementsByName('warehouse_id')[0].value;

    var stockcodeInputs = document.getElementsByName('stockcodes_shown[]');
    var warehouseInputs = document.getElementsByName('warehouses_shown[]');

    for (var i = 0; i < stockcodeInputs.length; i++) {
        var stockcode = stockcodeInputs[i].value;
        for (var j = 0; j < warehouseInputs.length; j++) {
            var warehouse = warehouseInputs[j].value;

            var elemId = 'qty_ship_' + stockcode + '_' + warehouse;
            document.getElementById(elemId).style.display =
                (selected == warehouse) ? "inline" : "none";

            elemId = 'qty_bo_' + stockcode + '_' + warehouse;
            document.getElementById(elemId).style.display =
                (selected == warehouse) ? "inline" : "none";
        }
    }
} /* }}} */
// {{{ checkCarrier()
function checkCarrier(carrierObj, defaultCarrier, defaultCollect, defaultHoldForPickup)
{
    // re set the carrier name correctly
    if (carrier_with_price_sel !== '') {
      carrierObj.options[carrier_with_price_sel].text = carrier_with_price;
      carrier_with_price = carrier_without_price = carrier_with_price_sel = '';
    }
    
    var carrierSel = carrierObj.options[carrierObj.selectedIndex].value;
    var other_carrier_name = document.getElementById('other_carrier_name');
    var other_carrier_title = document.getElementById('other_carrier_title');
    var carrier_collect_title = document.getElementById('carrier_collect_title');
    var carrier_collect_number = document.getElementById('carrier_collect_number');
    var carrier_collect_number_title = document.getElementById('carrier_collect_number_title');
    var carrier_collect = document.getElementById('carrier_collect');
    var carrier_hfp_title = document.getElementById('carrier_hfp_title');
    var carrier_hfp = document.getElementById('carrier_hfp');
    
    var csr_must_call_row = document.getElementById('csr_must_call_row');
    var csr_must_call = document.getElementById('csr_must_call');
    
    var provinceCASel = document.getElementById('provinceCA');
    var provinceUSSel = document.getElementById('provinceUS');
    var countrySel = document.getElementById('country');
        

    // remove phantom input hidden fields, if they exist
    jQuery(carrier_collect).parent().find('input[type=hidden][name=carrier_collect],input[type=hidden][name=carrier_collect_number]').remove();
    
    switch (carrierSel) {
        case '' :
            // no selection
            other_carrier_title.style.display = 'none';
            other_carrier_name.style.display = 'none';
            other_carrier_name.disabled = true;
            other_carrier_name.value = '';
            carrier_collect_title.style.display = 'none';
            carrier_collect.style.display = 'none';
            carrier_collect.disabled = true;
            carrier_collect.checked = false;
            carrier_collect_number_title.style.display = 'none';
            carrier_collect_number.style.display = 'none';
            carrier_collect_number.disabled = true;
            carrier_collect_number.value = '';
            carrier_hfp_title.style.display = 'none';
            carrier_hfp.style.display = 'none';
            carrier_hfp.disabled = true;
            carrier_hfp.checked = false;
            
            if (csr_must_call_row != null) {
              csr_must_call_row.style.display = 'none';
              csr_must_call.disabled = true;
              csr_must_call.checked = false;
            }
            break;
        case 'other' :
            other_carrier_title.style.display = '';
            other_carrier_name.value = '';
            other_carrier_name.disabled = false;
            other_carrier_name.style.display = '';
            carrier_collect_title.style.display = '';
            carrier_collect.style.display = '';
            carrier_collect.disabled = false;
            carrier_collect.checked = false;
            carrier_collect_number_title.style.display = 'none';
            carrier_collect_number.style.display = 'none';
            carrier_collect_number.disabled = true;
            carrier_collect_number.value = '';
            carrier_hfp_title.style.display = 'none';
            carrier_hfp.style.display = 'none';
            carrier_hfp.disabled = true;
            carrier_hfp.checked = false;
            
            // will never know the price
            if (csr_must_call_row != null) {
              csr_must_call_row.style.display = '';
              csr_must_call.disabled = false;
              csr_must_call.checked = false;
            }
            break;
        default :
            other_carrier_title.style.display = 'none';
            other_carrier_name.style.display = 'none';
            other_carrier_name.disabled = true;
            other_carrier_name.value = '';
                        
            // collect
            if (globalCarrierOptions[carrierSel]['collect'] == 1) {
                carrier_collect_title.style.display = '';
                carrier_collect.style.display = '';
                carrier_collect.disabled = false;
                if (carrierSel == defaultCarrier &&
                    defaultCollect) {
                    carrier_collect.checked = true;
                    carrier_collect_number_title.style.display = '';
                    carrier_collect_number.style.display = '';
                    carrier_collect_number.disabled = false;
                    carrier_collect_number.value = globalCarrierOptions[defaultCarrier]['AccountNumber'];
                } else {
                    carrier_collect.checked = false;
                    carrier_collect_number_title.style.display = 'none';
                    carrier_collect_number.style.display = 'none';
                    carrier_collect_number.disabled = true;
                    carrier_collect_number.value = '';
                }
                
                if (globalCarrierOptions[carrierSel]['force_collect'] == 'E' ||
                    (globalCarrierOptions[carrierSel]['force_collect'] == 'Y' &&
                     !isFreeFreight())) {
                  carrier_collect.checked = true;
                  carrier_collect.disabled = true;
                  carrier_collect_number.style.display = '';
                  carrier_collect_number.disabled = true;
                  carrier_collect_number.value = globalCarrierOptions[carrierSel]['AccountNumber'];
                  // create phantom input hidden fields
                  jQuery(carrier_collect).after("<input type='hidden' name='carrier_collect' value='1' /><input type='hidden' name='carrier_collect_number' value='" + globalCarrierOptions[carrierSel]['AccountNumber'] + "' />");
                  if (carrier_with_price == '') {
                    carrier_with_price = carrierObj.options[carrierObj.selectedIndex].text;
                    carrier_without_price = stripPriceFromCarrier(carrier_with_price);
                    carrier_with_price_sel = carrierObj.selectedIndex;
                  }                                  
                  carrierObj.options[carrierObj.selectedIndex].text = carrier_without_price;
                }
            } else {
                // carrier doesn't support collect
                carrier_collect_title.style.display = 'none';
                carrier_collect.style.display = 'none';
                carrier_collect.disabled = true;
                carrier_collect.checked = false;
                carrier_collect_number_title.style.display = 'none';
                carrier_collect_number.style.display = 'none';
                carrier_collect_number.disabled = true;
                carrier_collect_number.value = '';
            }
            
            // hfp
            if (globalCarrierOptions[carrierSel]['holdForPickup'] == 1) {
                carrier_hfp_title.style.display = '';
                carrier_hfp.disabled = false;
                if (defaultCarrier == carrierSel &&
                    defaultHoldForPickup) {
                    carrier_hfp.checked = true;
                } else {
                    carrier_hfp.checked = false;
                }
                carrier_hfp.style.display = '';
            } else {
                carrier_hfp_title.style.display = 'none';
                carrier_hfp.style.display = 'none';
                carrier_hfp.disabled = true;
                carrier_hfp.checked = false; 
            }
         
            checkNoFreightMessage();
            
            break;
    }
}
// }}}
// {{{ updateNewShippingAddress()
function updateNewShippingAddress(forceNewAddr, min_pickup, min_shipping, checkout_text, creditcard_text, defaultCarrier, defaultCollect, defaultHoldForPickup, lang, other_carrier_possible, drop_ship_possible) {
    var addr = document.getElementsByName('ship_address')[0].value;
    if (undefined !== forceNewAddr) {
        addr = forceNewAddr;
    }
    var show = addr == '' || addr == '0' ? 0 : 1;
    var table = document.getElementById('new_shipping_address');

    var firstOpen = true;
    if (show) {
        if (table.style.display == 'none') {
            firstOpen = true;
        }
        table.style.display = 'block';
    } else {
        table.style.display = 'none';
    }
    
    // show|hide edit button
    var edit_ship = document.getElementById('edit_ship_address');
    if (addr == '' || addr == '0' || addr == 'new') {
      // hide
      edit_ship.style.display = 'none';
      edit_ship.disabled = true;
    } else {
      // show
      edit_ship.style.display = '';
      edit_ship.disabled = false;
    }
    
    // creditcard
    if (creditcard_text !== null) {
        var cc_row = document.getElementById('cc_row');
        var cc_list = document.getElementById('cc_list');
        switch (addr) {
            case '':
                // no shipping address selected
                cc_row.style.display = 'none';
                // remove pickup option
                if (cc_list.options[1].value == 'pickup') {
                    cc_list.remove(1);
                }
                break;
            /*
            case '0' :
                // pickup selected; add 'cc pickup option'
                var elOptPickup = document.createElement('option');
                elOptPickup.text = creditcard_text;
                elOptPickup.value = 'pickup';
                var elOptFirst = cc_list.options[1];
                try {
                    cc_list.add(elOptPickup, elOptFirst);   // standards compliant; doesn't work in IE    
                } catch (ex) {
                    cc_list.add(elOptPickup, 1);
                }
                cc_row.style.display = '';
                break;
            */
            default:
                // shipping address selected; remove 'cc pickup option' if present
                if (cc_list.options[1].value == 'pickup') {
                    cc_list.remove(1);
                }
                cc_row.style.display = '';
                break;
        }
    }
    
    // carrier SELECT
    var carrierList_row = document.getElementById('carrierList_row');
    var carrierList = document.getElementById('carrierList');
    var other_carrier_name = document.getElementById('other_carrier_name');
    var other_carrier_title = document.getElementById('other_carrier_title');
    var carrier_collect_title = document.getElementById('carrier_collect_title');
    var carrier_collect = document.getElementById('carrier_collect');
    var carrier_collect_number_title = document.getElementById('carrier_collect_number_title');
    var carrier_collect_number = document.getElementById('carrier_collect_number');
    var carrier_hfp_title = document.getElementById('carrier_hfp_title');
    var carrier_hfp = document.getElementById('carrier_hfp');
    
    var csr_must_call_row = document.getElementById('csr_must_call_row');
    var csr_must_call = document.getElementById('csr_must_call');
        
    // default carrier
    defaultCarrierIndex = 0;
    if (defaultCarrier !== null) {
        for (var i = 0; i < carrierList.options.length; i++) {
            if (carrierList.options[i].value == defaultCarrier) {
                defaultCarrierIndex = i;
                break;
            }      
        }
    }
    
        // update New address field content
    var are_we_drop_shipping = false;
    if (show) {
        changeProvince();   // to make sure the correct province is selected for the country
        var name = document.getElementById('new_ship_name');
        var nameRow = document.getElementById('new_ship_name_row');
        var ship1 = document.getElementById('new_ship_address1');
        var ship1Req = document.getElementById('new_ship_address1_req');
        var ship2 = document.getElementById('new_ship_address2');
        var ship3 = document.getElementById('new_ship_address3');
        var city = document.getElementById('new_ship_city');
        var cityReq = document.getElementById('new_ship_city_req');
        var postalcode = document.getElementById('new_ship_postalcode');
        var postalcodeReq = document.getElementById('new_ship_postalcode_req');
        var drop_ship = document.getElementById('new_ship_drop_shipping');
        var drop_ship_row = document.getElementById('new_ship_drop_shipping_row');
        var residential = document.getElementById('new_ship_residential');
        var residential_row = document.getElementById('new_ship_residential_row');
        var save_addr = document.getElementById('save_addr');
        var save_addrRow = document.getElementById('save_addr_row');
        var required_fields = document.getElementById('required_fields');
        
        var countryReq = document.getElementById('new_ship_country_req');
        var provinceReq = document.getElementById('new_ship_province_req');
        
        var country = document.getElementById('country');
                
        if (addr == 'new') {
            nameRow.style.display = '';
            name.value = '';
            
            ship1.disabled = false;
            ship1.value = '';
            ship1Req.style.display = '';
            
            ship2.disabled = false;
            ship2.value = '';
            
            ship3.disabled = false;
            ship3.value = '';
            
            city.disabled = false;
            city.value = '';
            cityReq.style.display = '';
            
            postalcode.disabled = false;
            postalcode.value = '';
            postalcodeReq.style.display = '';
            
            if (drop_ship_possible) {
              drop_ship_row.style.display = '';
              drop_ship.disabled = false;
              drop_ship.checked = false;
            } else {
              drop_ship_row.style.display = 'none';
              drop_ship.disabled = true;
              drop_ship.checked = false;
            }
            are_we_drop_shipping = false;
            
            residential.disabled = false;
            residential.checked = false;
            residential_row.style.display = '';
            
            save_addr.checked = false;
            save_addrRow.style.display = '';
            
            countryReq.style.display = '';
            provinceReq.style.display = '';
            
            required_fields.style.display = '';
            
            // customer attribute
            country.disabled = country.getAttribute('alwaysdisabled') == 'disabled' ? true : false;
            for (var i = 0; i < country.options.length; i++) {
                if (country.options[i].value == globalDefaultCountry) {
                    country.selectedIndex = i;
                    switch (country.options[i].value) {
                        case 'CA' :
                            var province = document.getElementById('provinceCA');
                            for (var j = 0; j < province.options.length; j++) {
                                if (province.options[j].value == globalDefaultProvince) {
                                    province.selectedIndex = j;
                                    break;
                                }
                            }
                            break;
                        case 'US' :
                            var province = document.getElementById('provinceUS');
                            for (var j = 0; j < province.options.length; j++) {
                                if (province.options[j].value == globalDefaultProvince) {
                                    province.selectedIndex = j;
                                    break;
                                }
                            }
                            break;
                        default:
                            var province = document.getElementById('new_ship_province');
                            province.value = globalDefaultProvince;
                            break;
                    }
                    break;
                }
            }
            changeProvince();
        } else {
            nameRow.style.display = 'none';
            
            ship1.disabled = true;
            ship1.value = globalAddressDetails[addr]['address1'];
            ship1Req.style.display = 'none';
            
            ship2.disabled = true;
            ship2.value = globalAddressDetails[addr]['address2'];
            
            ship3.disabled = true;
            ship3.value = globalAddressDetails[addr]['address3'];
            
            city.disabled = true;
            city.value = globalAddressDetails[addr]['city'];
            cityReq.style.display = 'none';
            
            postalcode.disabled = true;
            postalcode.value = globalAddressDetails[addr]['postalcode'];
            postalcodeReq.style.display = 'none';
            
            drop_ship_row.style.display = '';
            drop_ship.disabled = true;
            
            drop_ship.checked = globalAddressDetails[addr]['drop_shipping'] == undefined ||
                                globalAddressDetails[addr]['drop_shipping'] == 0 ? false : true;
            
            are_we_drop_shipping = drop_ship.checked;
            
            residential_row.style.display = '';
            residential.disabled = true;
            
            residential.checked = globalAddressDetails[addr]['residential'] == undefined ||
                                  globalAddressDetails[addr]['residential'] == 0 ? false : true;
            
            save_addrRow.style.display = 'none';
            
            required_fields.style.display = 'none';
            
            countryReq.style.display = 'none';
            provinceReq.style.display = 'none';
            
            country.disabled = true;
            var countryFound = 0;
            countryToSet = globalAddressDetails[addr]['country'] || globalDefaultCountry;
            for(var i = 0; i < country.options.length; i++) {
                if (country.options[i].value == countryToSet) {
                    countryFound = 1;
                    country.options.selectedIndex = i;
                    switch (country.options[i].value) {
                        case 'CA' :
                            var province = document.getElementById('provinceCA');
                            for (var j = 0; j < province.options.length; j++) {
                                if (province.options[j].value == globalAddressDetails[addr]['province']) {
                                    province.selectedIndex = j;
                                    break;
                                }
                            }
                            break;
                        case 'US' :
                            var province = document.getElementById('provinceUS');
                            for (var j = 0; j < province.options.length; j++) {
                                if (province.options[j].value == globalAddressDetails[addr]['province']) {
                                    province.selectedIndex = j;
                                    break;
                                }
                            }
                            break;
                        default:
                            var province = document.getElementById('new_ship_province');
                            province.value = globalAddressDetails[addr]['province'];
                            break;
                    }
                    changeProvince(1);
                    break;
                }
            }
            if (!countryFound) {
                var province = document.getElementById('provinceCA');
                province.disabled = true;
                province = document.getElementById('provinceUS');
                province.disabled = true;
                province = document.getElementById('new_ship_province');
                province.disabled = true;
            }    
        }
    }
    
    if (addr != '' && addr != '0') {
      // shipping
      
      // build carrier list
      buildCarrierList(lang, other_carrier_possible, are_we_drop_shipping);
    }    
    
    if (addr == '') {
        // no selection
        carrierList_row.style.display = 'none';
        carrierList.style.display = 'none';
        carrierList.selectedIndex = defaultCarrierIndex;
        carrierList.disabled = true;
        other_carrier_title.style.display = 'none';
        other_carrier_name.style.display = 'none';
        other_carrier_name.disabled = true;
        other_carrier_name.value = '';
        carrier_collect_title.style.display = 'none';
        carrier_collect.style.display = 'none';
        carrier_collect.disabled = true;
        carrier_collect.checked = false;
        carrier_collect_number_title.style.display = 'none';
        carrier_collect_number.style.display = 'none';
        carrier_collect_number.disabled = true;
        carrier_collect_number.value = '';
        carrier_hfp_title.style.display = 'none';
        carrier_hfp.style.display = 'none';
        carrier_hfp.disabled = true;
        carrier_hfp.checked = false;
        
        if (csr_must_call_row != null) {
          csr_must_call_row.style.display = 'none';
          csr_must_call.disabled = true;
          csr_must_call.checked = false;
        }
    } else if (addr == '0') {
        // pickup
        carrierList.style.display = 'none';
        carrierList_row.style.display = 'none';
        carrierList.selectedIndex = defaultCarrierIndex;
        carrierList.disabled = true;
        other_carrier_title.style.display = 'none';
        other_carrier_name.style.display = 'none';
        other_carrier_name.disabled = true;
        other_carrier_name.value = '';
        carrier_collect_title.style.display = 'none';
        carrier_collect.style.display = 'none';
        carrier_collect.disabled = true;
        carrier_collect.checked = false;
        carrier_collect_number_title.style.display = 'none';
        carrier_collect_number.style.display = 'none';
        carrier_collect_number.disabled = true;
        carrier_collect_number.value = '';
        carrier_hfp_title.style.display = 'none';
        carrier_hfp.style.display = 'none';
        carrier_hfp.disabled = true;
        carrier_hfp.checked = false;
        
        if (csr_must_call_row != null) {
          csr_must_call_row.style.display = 'none';
          csr_must_call.disabled = true;
          csr_must_call.checked = false;
        }
    } else {
        // shipping
        if (firstOpen) {
          
            // remove phantom input hidden fields, if they exist
            jQuery(carrier_collect).parent().find('input[type=hidden][name=carrier_collect],input[type=hidden][name=carrier_collect_number]').remove();
          
            carrierList.selectedIndex = defaultCarrierIndex;
            carrierList_row.style.display = '';    
            carrierList.disabled = false;
            carrierList.style.display = '';
            
            // is the only option 'other carrier' ?
            var other = carrierList.options[carrierList.selectedIndex].value == 'other' ? true : false;
            
            if (other) {
              other_carrier_title.style.display = '';
              other_carrier_name.style.display = '';
              other_carrier_name.disabled = false;
              other_carrier_name.value = '';
            } else {
              other_carrier_title.style.display = 'none';
              other_carrier_name.style.display = 'none';
              other_carrier_name.disabled = true;
              other_carrier_name.value = '';
            }
                  
            // collect
            if ((defaultCarrier !== null &&
                globalCarrierOptions[defaultCarrier]['collect'] == 1) ||
                other) {
                carrier_collect_title.style.display = '';
                carrier_collect.style.display = '';
                carrier_collect.disabled = false;
                carrier_collect.checked = defaultCollect ? true : false;
                
                if (defaultCollect) {
                    carrier_collect_number_title.style.display = '';
                    carrier_collect_number.style.display = '';
                    carrier_collect_number.disabled = false;
                    carrier_collect_number.value = globalCarrierOptions[defaultCarrier]['AccountNumber'];
                } else {
                    carrier_collect_number_title.style.display = 'none';
                    carrier_collect_number.style.display = 'none';
                    carrier_collect_number.disabled = true;
                    carrier_collect_number.value = '';
                }
                
                if (globalCarrierOptions[carrierList.options[carrierList.selectedIndex].value]['force_collect'] == 'E' ||
                    (globalCarrierOptions[carrierList.options[carrierList.selectedIndex].value]['force_collect'] == 'Y' && !isFreeFreight())) {
                  carrier_collect.checked = true;
                  carrier_collect.disabled = true;
                  carrier_collect_number.style.display = '';
                  carrier_collect_number.disabled = true;
                  carrier_collect_number.value = globalCarrierOptions[carrierList.options[carrierList.selectedIndex].value]['AccountNumber'];
                  // create phantom input hidden fields
                  jQuery(carrier_collect).after("<input type='hidden' name='carrier_collect' value='1' /><input type='hidden' name='carrier_collect_number' value='" + globalCarrierOptions[carrierList.options[carrierList.selectedIndex].value]['AccountNumber'] + "' />");
                  if (carrier_with_price == '') {
                    carrier_with_price = carrierList.options[carrierList.selectedIndex].text;
                    carrier_without_price = stripPriceFromCarrier(carrier_with_price);
                    carrier_with_price_sel = carrierList.selectedIndex;
                  }                                  
                  carrierList.options[carrierList.selectedIndex].text = carrier_without_price;
                }
            } else {
                // carrier doesn't support collect
                carrier_collect_title.style.display = 'none';
                carrier_collect.style.display = 'none';
                carrier_collect.disabled = true;
                carrier_collect.checked = false;
                carrier_collect_number_title.style.display = 'none';
                carrier_collect_number.style.display = 'none';
                carrier_collect_number.disabled = true;
                carrier_collect_number.value = '';
            }
                
            // hfp
            if ((defaultCarrier !== null &&
                globalCarrierOptions[defaultCarrier]['holdForPickup'] == 1) ||
                other) {
                carrier_hfp_title.style.display = '';
                carrier_hfp.disabled = false;
                carrier_hfp.checked = defaultHoldForPickup ? true : false;
                carrier_hfp.style.display = '';
            } else {
                carrier_hfp_title.style.display = 'none';
                carrier_hfp.style.display = 'none';
                carrier_hfp.disabled = true;
                carrier_hfp.checked = false; 
            }   
        }
    }

    updateCheckoutAllowed(checkout_text, min_pickup, min_shipping);
    
    updateSalesTax(addr);
         
    return;
} /* }}} */
// {{{ isFreeFreight()
/*
 Check if the carrier selected is free freight or not.
*/
function isFreeFreight()
{
  var carrierList = document.getElementById('carrierList');
  var countrySel = document.getElementById('country');
  countrySel = countrySel.options[countrySel.selectedIndex].value;
  
  // fetch which province code we should use for the price
  switch (countrySel) {
    case 'CA':
      var province = document.getElementById('provinceCA');
      province = province.options[province.selectedIndex].value;
      break;
    case 'US':
      var province = document.getElementById('provinceUS');
      province = province.options[province.selectedIndex].value;
      break;
    default :
      var province = '';  // default -> none
      break;
  }
    
  // check if the carrier freight is free
  var carrier = carrierList.options[carrierList.selectedIndex].value;
    if (province in globalFreightRates[carrier]) {
      if (globalFreightRates[carrier][province] == '0') {
        return true;
      } else {
        return false
      }
    } else if (province != '' && '*' in globalFreightRates[carrier]) {
      if (globalFreightRates[carrier]['*'] == '0') {
        return true;
      } else {
        return false;
      }
    }
    
    return false;
}
// }}}
// {{{
function checkNoFreightMessage()
{
  var carrierList = document.getElementById('carrierList');
  var carrierSel = carrierList.options[carrierList.selectedIndex].value;
  var provinceCASel = document.getElementById('provinceCA');
  var provinceUSSel = document.getElementById('provinceUS');
  var countrySel = document.getElementById('country');
  
  var csr_must_call_row = document.getElementById('csr_must_call_row');
  var csr_must_call = document.getElementById('csr_must_call');
  
  var rateIsKnown = false;
  switch (countrySel.options[countrySel.selectedIndex].value) {
    case 'US' :
      provinceCASel = provinceUSSel;
    case 'CA' :
      var province = provinceCASel.options[provinceCASel.selectedIndex].value;
      if (carrierSel in globalFreightRates &&
          ((province in globalFreightRates[carrierSel] &&
            globalFreightRates[carrierSel][province] != '') ||
           ('*' in globalFreightRates[carrierSel] &&
           globalFreightRates[carrierSel]['*'] != ''))) {
        rateIsKnown = true;   
      } else {
        rateIsKnown = false;
      }
      break;
    default :
      // If we ship to another country, we don't know the price then
      rateIsKnown = false;
      break;
  }

  if (csr_must_call_row != null) { 
    if (rateIsKnown) {
      // we know the rate (amount or free)
      csr_must_call_row.style.display = 'none';
      csr_must_call.disabled = true;
      csr_must_call.checked = false;
    } else {
      csr_must_call_row.style.display = '';
      csr_must_call.disabled = false;
      csr_must_call.checked = false;
    }
  }
}
// }}}
// {{{ buildCarrierList()
function buildCarrierList(lang, other_carrier_possible, dropshipping)
{
  // densi|seldrum (other carrier)
  // default selection
  // price or free or *
  // carrier options
  // carrier options default
  
  // reset collect carrier
  carrier_with_price = carrier_without_price = ''; carrier_with_price_sel = '';
  
  var carrierList = document.getElementById('carrierList');
  carrierList.innerHTML = '';
  var countrySel = document.getElementById('country');
  countrySel = countrySel.options[countrySel.selectedIndex].value;
  
  // fetch which province code we should use for the price
  switch (countrySel) {
    case 'CA':
      var province = document.getElementById('provinceCA');
      province = province.options[province.selectedIndex].value;
      break;
    case 'US':
      var province = document.getElementById('provinceUS');
      province = province.options[province.selectedIndex].value;
      break;
    default :
      var province = '';  // default -> none
      break;
  }
  
  var carrierFormatted = new Array();
  
  // fetch all carrier name & prices
  for (carrier in globalFreightRates) {
    if (dropshipping == true && globalCarrierOptions[carrier]['drop_ship'] != 1) {
      continue;
    }
    var name = globalCarrierNames[carrier][0];
    var price = '';
    if (province in globalFreightRates[carrier]) {
      price = globalFreightRates[carrier][province];
    } else if (province != '' && '*' in globalFreightRates[carrier]) {
      price = globalFreightRates[carrier]['*'];
    }
    
    carrierFormatted[carrier] = {'name' : name, 'price' : price};
  }
  
  // add other carrier
  if (other_carrier_possible) {
    carrierFormatted['other'] = {'name' : lang['other_carrier'], 'price' : ''};
  }
  
  // concatenate with correct length
  // take name & price key and transform then in text, free & selected
  carrierFormatted = formatCarrierList(carrierFormatted, lang);
  
  
  var i = 0;
  var carrierSelected = 0;
  for (carrier in carrierFormatted) {
    var carrierOptionW3C = document.createElement('option');
    var carrierOptionIE = document.createElement('option');
    // IE doesn't like innerHTML
    carrierOptionW3C.innerHTML = carrierFormatted[carrier]['text'];
    var IE_text = carrierFormatted[carrier]['text'];
    carrierOptionIE.text = IE_text.replace(/&nbsp;/g, ' ');
    carrierOptionW3C.value = carrier;
    carrierOptionIE.value = carrier;
    if (carrierFormatted[carrier]['selected'] == 1) {
      carrierSelected = i;
    }
    if (carrierFormatted[carrier]['free'] == 1) {
      carrierOptionW3C.style.backgroundColor = 'yellow';
      carrierOptionIE.style.backgroundColor = 'yellow';
    }
    try {
        carrierList.add(carrierOptionW3C, null);   // standards compliant; doesn't work in IE    
    } catch (ex) {
        carrierList.add(carrierOptionIE);
    }
    i++;
  }
  
  carrierList.selectedIndex = carrierSelected;
  
  checkCarrierOptions();
  
  checkNoFreightMessage();
}
// }}}
// {{{
function checkCarrierOptions()
{
  var carrierList = document.getElementById('carrierList');
  var carrierSel = carrierList.options[carrierList.selectedIndex].value;
  
  if (!(carrierSel in globalCarrierOptions)) {
    // other carrier
    
    // open description (blank)
    // open collect (uncheck)
    // close collect_number (blank)
    // open hfp (uncheck)
    
    openCarrierDescription();
    openCollect();
    closeCollectNumber();
    openHFP();
    
  } else {
    // close description (blank)
    closeCarrierDescription();
    
    if (!isFreeFreight() &&
        globalCarrierOptions[carrierSel]['collect'] == 1) {
      // open collect (uncheck)
      // close collect_number (blank)
      
      openCollect();
      closeCollectNumber();
    } else {
      // close collect (uncheck)
      // close collect_number (blank)
      
      closeCollect();
      closeCollectNumber();
    }
    
    if (globalCarrierOptions[carrierSel]['holdForPickup'] == 1) {
      // open hfp (uncheck)
      openHFP();
    } else {
      // close hfp (uncheck)
      closeHFP();
    }
  }
}
// }}}
// {{{ openCarrierDescription()
function openCarrierDescription()
{
  var other_carrier_name = document.getElementById('other_carrier_name');
  var other_carrier_title = document.getElementById('other_carrier_title');
  
  other_carrier_title.style.display = '';
  other_carrier_name.value = '';
  other_carrier_name.disabled = false;
  other_carrier_name.style.display = '';
}
// }}}
// {{{ closeCarrierDescription()
function closeCarrierDescription()
{
  var other_carrier_name = document.getElementById('other_carrier_name');
  var other_carrier_title = document.getElementById('other_carrier_title');
  
  other_carrier_title.style.display = 'none';
  other_carrier_name.style.display = 'none';
  other_carrier_name.disabled = true;
  other_carrier_name.value = '';
}
// }}}
// {{{ openCollect()
function openCollect()
{
  var carrier_collect_title = document.getElementById('carrier_collect_title');
  var carrier_collect = document.getElementById('carrier_collect');
  
  carrier_collect_title.style.display = '';
  carrier_collect.style.display = '';
  carrier_collect.disabled = false;
  carrier_collect.checked = false;
}
// }}}
// {{{ closeCollect()
function closeCollect()
{
  var carrier_collect_title = document.getElementById('carrier_collect_title');
  var carrier_collect = document.getElementById('carrier_collect');
  
  carrier_collect_title.style.display = 'none';
  carrier_collect.style.display = 'none';
  carrier_collect.disabled = true;
  carrier_collect.checked = false;
}
// }}}
// {{{ closeCollectNumber()
function closeCollectNumber()
{
  var carrier_collect_number = document.getElementById('carrier_collect_number');
  var carrier_collect_number_title = document.getElementById('carrier_collect_number_title');
  
  carrier_collect_number_title.style.display = 'none';
  carrier_collect_number.style.display = 'none';
  carrier_collect_number.disabled = true;
  carrier_collect_number.value = '';
}
// }}}
// {{{ openHFP()
function openHFP()
{
  var carrier_hfp_title = document.getElementById('carrier_hfp_title');
  var carrier_hfp = document.getElementById('carrier_hfp');
  
  carrier_hfp_title.style.display = '';
  carrier_hfp.disabled = false;
  carrier_hfp.checked = false;
  carrier_hfp.style.display = '';
}
// }}}
// {{{ closeHFP()
function closeHFP()
{
  var carrier_hfp_title = document.getElementById('carrier_hfp_title');
  var carrier_hfp = document.getElementById('carrier_hfp');
  
  carrier_hfp_title.style.display = 'none';
  carrier_hfp.style.display = 'none';
  carrier_hfp.disabled = true;
  carrier_hfp.checked = false;
}
// }}}
// {{{ formatCarrierList()
function formatCarrierList(list, lang)
{
  var pad = 3;  // DEFAULT SPACE PADDING
  
  // get max length name
  var max_length_name = 0;
  for (carrier in list) {
    var len = (list[carrier]['name']).length;
    if (len > max_length_name) {
      max_length_name = len;
    }
  }
  
  // get max length price
  var max_length_price = 0;
  for (carrier in list) {
    if (list[carrier]['price'] === '') {
      var price = '*';
    } else if (list[carrier]['price'] === '0') {
      var price = lang['free'];
    } else {
      // TODO we should format the price specific for each language
      var price = number_format(list[carrier]['price'], 2, '.', '') + '$';
    }
    
    var len = price.length;
    
    if (len > max_length_price) {
      max_length_price = len;
    }
  }
  
  var max = max_length_name + pad + max_length_price;
  
  var can_select = true;
  for (carrier in list) {
    if (list[carrier]['price'] === '0') {
      // free
      var pad_length = max - (lang['free']).length - (list[carrier]['name']).length;
      var price = lang['free'];
      var free = 1;
      if (can_select) {
        var selected = 1;
        can_select = false;
      } else {
        var selected = 0; 
      }
    } else if (list[carrier]['price'] === '') {
      // don't know the freight
      var pad_length = max - 1 - (list[carrier]['name']).length;
      var price = '*';
      var free = 0;
      var selected = 0;
    } else {
      // price $$$
      var price = number_format(list[carrier]['price'], 2, '.', '') + '$';
      var pad_length = max - price.length - (list[carrier]['name']).length;
      var free = 0;
      var selected = 0;
    }
    
    var pad_text = '';
    for (var i = 0; i < pad_length; i++) {
      pad_text += '&nbsp;';
    }
    
    list[carrier]['text'] = list[carrier]['name'] + pad_text + price;
    list[carrier]['free'] = free;
    list[carrier]['selected'] = selected;
    
    delete list[carrier]['name']; // unset
    delete list[carrier]['price'];  // unset
  }
  
  return list;
}
// }}}
// {{{
function updateSalesTax(addr) {
    var salesTaxRow = document.getElementById('salesTaxRow');
    var salesTaxCell = document.getElementById('salesTaxCell');
    if (addr == '') {
        salesTaxRow.style.display = 'none';
    } else {
        if (addr == 'new') {
            var country = document.getElementById('country');
            countryVal = country.selectedIndex;
            country = country.options[countryVal].value;
            switch (country) {
                case 'US' :
                    tax = '0';
                    break;
                case 'CA' :
                    var province = document.getElementById('provinceCA');
                    tax = globalSalesTaxList[province.options[province.selectedIndex].value];
                    break;
                default:
                    tax = '0';
                    break;
            }
            
        } else {
            tax = globalSalesTaxList[addr];
        }
        if (tax == '0') {
            salesTaxRow.style.display = 'none';
        } else {
            salesTaxCell.innerHTML = tax + '%';
            salesTaxRow.style.display = '';
        }
    }
}
function updateCheckoutAllowed(checkout_text, min_pickup, min_shipping) {	// {{{
	var superprice = document.getElementById('subt').value;
	if (checkout_text.default_address == undefined) {
		var destination = document.checkout.ship_address.selectedIndex;
		destination = document.checkout.ship_address.options[destination].value;
	} else {
		var destination = checkout_text.default_address;
	}
		
	var submit_button = document.getElementById('checkout_submit');
	
	// empty when price 'call'
	// ship when drop-down list is not first item (pickup)
	if (superprice != '' && destination != '' &&
	    destination == 0 && parseFloat(superprice) < min_pickup) {
		submit_button.disabled = true;
		submit_button.value = checkout_text.disabled_pickup;
  } else if (superprice != '' && destination != '' &&
             destination != 0 && parseFloat(superprice) < min_shipping) {
    submit_button.disabled = true;
    submit_button.value = checkout_text.disabled_shipping;
	} else {
		//submit_button.style.display = 'block';
		submit_button.disabled = false;
		submit_button.value = checkout_text.enabled;
	}
	
} // }}}
// {{{ function checkSubtotal
function checkSubtotal(force, min_pickup, min_shipping)
{
    if (force == undefined) {
        if (document.checkout.ship_address.tagName == 'INPUT') {
            var indexed = '0';
        } else {
            var selindex = document.checkout.ship_address.selectedIndex;
            var indexed  = document.checkout.ship_address.options[selindex].value;
        }
    } else {
        var indexed = '';
    }
    
    switch(indexed) {
        case '0':
            checkPickup(min_pickup);
            break;
        default:
            checkShipping(min_shipping);
    }
}
// }}}
// {{{ checkPickup
function checkPickup(min_pickup) 
{
    var table = document.getElementById('warning');
    var subt_temp  = document.getElementById('subt').value;  
    // when subt is '', it means false which means CALL
    if (subt_temp != '' && parseFloat(subt_temp) < min_pickup) {
        table.style.display = '';
    } else {
        table.style.display = 'none';
    }
}
// }}}
// {{{ checkShipping
function checkShipping(min_shipping)
{
    var table = document.getElementById('warning');
    var subt_temp  = document.getElementById('subt').value;
    // when subt_temp is '', it means false which means CALL
    if (subt_temp != '' && parseFloat(subt_temp) < min_shipping) {
        table.style.display = '';
    } else {
        table.style.display = 'none';
    }
}
// }}}
// {{{ search_check
function search_check(el){
		if (el.value == '') {
			el.value = "";	
		}
	
			//el.select();
	
}

var inSearchBox = '';

function search_inside(param) {
	if (param == 0) {
		inSearchBox = 0;
	} else if (param == 1) {
		inSearchBox = 1;
	}
	
	return inSearchBox;
}

var empty = '';

function search_empty(param) {
	if (param == 0) {
		empty = 0;
	} else if (param == 1) {
		empty = 1;
	}
	
	return empty;
}
// }}}
// {{{ checkQty
function cartAdd(stockcodeId) {
		x1 = document.getElementsByName('qty[' + stockcodeId + ']')[0].value ? parseInt(document.getElementsByName('qty[' + stockcodeId + ']')[0].value) : 0;
		var x2 = x1 + 1;
		document.getElementsByName('qty[' + stockcodeId + ']')[0].value = x2;
		document.getElementsByName('single')[0].value = stockcodeId;
		document.getElementById('cart').submit();
}
// }}}
// {{{ checkQty
function checkQty(stockcodeId) {
	
	
		document.getElementsByName('single')[0].value = stockcodeId;
}
// }}}
// {{{ popUp()
function popUp(URL, sku, width, height) {
day = new Date();

id = day.getTime();
var data;
var data;
    data = "<form name='tata' id='tata' action='" + URL + "' method='POST'>";
    data = data + "<input type='hidden' name='id' value='" + sku + "' />";
    data = data + "<input type='hidden' name='width' value='" + width + "' />";
    data = data + "</form>";
    data = data + "<script type='text/javascript'>";
    data = data + "document.tata.submit();</sc" + "ript>";  // require to split the </sc ript> tag;

handle = window.open('', id, 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width='+width+',height='+height);
handle.document.write(data);
}// }}}

// 20070507 felixl
// Ajax method
function sendRequest(url,callback,postData) {
    // If postData == array -> escape
    if (typeof(postData) == 'object' && postData != null) {
        postData = arrayToStringURI(postData);
    }

	var req = createXMLHTTPObject();
	if (!req) return;
	var method = (postData) ? "POST" : "GET";
	req.open(method,url,true);
	req.setRequestHeader('User-Agent','XMLHTTP/1.0');
	if (postData)
		req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
        //req.setRequestHeader('charset', 'UTF-8'); // TODO
	req.onreadystatechange = function () {
		if (req.readyState != 4) return;
		if (req.status != 200 && req.status != 304) {
//			alert('HTTP error ' + req.status);
			return;
		}
		callback(req);
	}
	if (req.readyState == 4) return;
	req.send(postData);
}

var XMLHttpFactories = [
	function () {return new XMLHttpRequest()},
	function () {return new ActiveXObject("Msxml2.XMLHTTP")},
	function () {return new ActiveXObject("Msxml3.XMLHTTP")},
	function () {return new ActiveXObject("Microsoft.XMLHTTP")}
];

function createXMLHTTPObject() {
	var xmlhttp = false;
	for (var i=0;i<XMLHttpFactories.length;i++) {
		try {
			xmlhttp = XMLHttpFactories[i]();
		}
		catch (e) {
			continue;
		}
		break;
	}
	return xmlhttp;
}

function arrayToStringURI(arr) {
    var str = '';
    for (var i = 0; i < arr.length; i++) {
        for (var j in arr[i]) {
            if (str != '') {
             str += '&';
            }
            // 20070510 felixl
            // TODO
            // only support latin-1 character (english, spanish & french)
            // reason: mysql DB string are in latin
            // replace with encodeURIComponent for UTF-8
            str += j + '=' + escape(arr[i][j]);
        }
    }
    return str;
}

function headerBlink(id) {
        var ele = document.getElementById(id);
        if (jscss('check', ele, 'headerblink')) {
            jscss('remove', ele, 'headerblink');
        } else {
            jscss('add', ele, 'headerblink');
        }
}

/* http://onlinetools.org/articles/unobtrusivejavascript/cssjsseparation.html */

function jscss(a,o,c1,c2)
{
  switch (a){
    case 'swap':
      o.className=!jscss('check',o,c1)?o.className.replace(c2,c1): o.className.replace(c1,c2);
    break;
    case 'add':
      if(!jscss('check',o,c1)){o.className+=o.className?' '+c1:c1;}
    break;
    case 'remove':
      var rep=o.className.match(' '+c1)?' '+c1:c1;
      o.className=o.className.replace(rep,'');
    break;
    case 'check':
      return new RegExp('\\b'+c1+'\\b').test(o.className)
    break;
  }
}


/*
	Written by Jonathan Snook, http://www.snook.ca/jonathan
	Add-ons by Robert Nyman, http://www.robertnyman.com
*/

function getElementsByClassName(oElm, strTagName, strClassName){
	var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	strClassName = strClassName.replace(/\-/g, "\\-");
	var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
	var oElement;
	for(var i=0; i<arrElements.length; i++){
		oElement = arrElements[i];
		if(oRegExp.test(oElement.className)){
			arrReturnElements.push(oElement);
		}
	}
	return (arrReturnElements)
}

// Add javascript on form onsubmit
// fname: form name attribute
// func: javascript function
// n.b.: func must return false when the loop should return false in onsubmit
function addFormSubmitEvent(fname, func) {
    var formid = 0;
    var formLength = document.forms.length;
    for (var x = 0; x < formLength; x++) {
    	if (document.forms[x].name == fname) {
    		formid = x;
    		break;
    	}
    }
   	var oldonload = document.forms[formid].onsubmit;
   	if (typeof document.forms[formid].onsubmit != 'function') {
   		document.forms[formid].onsubmit = func;
   	} else {
   		document.forms[formid].onsubmit = function () {
   			if (oldonload) {
   				var res = oldonload(document.forms[formid]);
   				if (res === false) {
   					return res;
   				}
   			}
   			return func(document.forms[formid]);
   		}
   	}
}

function new_creditcard() {
    var new_cc = document.getElementById('new_creditcard');
    var cc_list = document.getElementById('cc_list');
    var cc_type = document.getElementById('cc_type');
    var cc_name = document.getElementById('cc_name');
    var cc_number = document.getElementById('cc_number');
    var cc_month = document.getElementById('cc_month');
    var cc_year = document.getElementById('cc_year');
    var cc_save = document.getElementById('cc_save');
    var cc_cvv2_row = document.getElementById('cc_cvv2_row');
    if (cc_list.value == 'new') {
        new_cc.style.display = '';
        cc_cvv2_row.style.display = 'none';
    } else {
        new_cc.style.display = 'none';
    }
    
    cc_type.value = '';
    cc_name.value = '';
    cc_number.value = '';
    
    // pickup first values for cc_year but
    // select the current month
    var today = new Date();
    
    var cur_year = today.getFullYear();
    var cur_month = today.getMonth() + 1;
    for(var i = 0; i < cc_year.options.length; i++) {
        if (cc_year.options[i].value == cur_year) {
            cc_year.selectedIndex = i;
            break;
        }
    }
    
    for(var i = 0; i < cc_month.options.length; i++) {
        if (cc_month.options[i].value == cur_month) {
            cc_month.selectedIndex = i;
            break;
        }
    }

    cc_save.checked = false;
}

function creditCardTypeChanged()
{
    var cc_type = document.getElementById('cc_type');
    var cc_cvv2_row = document.getElementById('cc_cvv2_row');
    var cc_cvv2 = document.getElementById('cc_cvv2');
    if (globalCreditCardInfo[cc_type.value]['cvvMandatory'] == '1') {
        // show cvv2 field
        cc_cvv2.disabled = false;
        cc_cvv2.value = '';
        cc_cvv2.style.display = '';
        cc_cvv2_row.style.display = '';
    } else {
        // hide cvv2 field
        cc_cvv2_row.style.display = 'none';
        cc_cvv2.style.display = 'none';
        cc_cvv2.value = '';
        cc_cvv2.disabled = true;
    }
}

/**
 * Keep the same length but remove from the end until we find a space character
*/
function stripPriceFromCarrier(text)
{
  var last_space = text.lastIndexOf(String.fromCharCode(160));
  if (last_space == -1) {
    last_space = text.lastIndexOf(' ');
  }
  var l = text.length;
  //@see str_repeat from  http://phpjs.org/functions/str_repeat
  return text.substring(0, last_space) + new Array(l - last_space + 1).join(' ');
}

// @see http://bassistance.de/jquery-plugins/jquery-plugin-validation/
// @see http://ajax.microsoft.com/ajax/jquery.validate/1.7/jquery.validate.js
function isValidEmail(value) {
  return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value);
}

function creditcard_checkLength(type, number)
{
  // using global variable globalCreditCardInfo
  var ccInfo = window.globalCreditCardInfo;
  
  var lengths = creditcard_extractChoices(ccInfo[type]['min_length']);
    
  if (in_array(number.length, lengths)) {
    return true;
  }
  
  return false;
}

function creditcard_checkFirstNumbers(type, number)
{
  var ccInfo = window.globalCreditCardInfo;
  
  var starts = creditcard_extractChoices(ccInfo[type]['start_with']);
  
  for (var i in starts) {
      if (strpos(number, starts[i]) === 0) {
        return true;
      }
    }
  
  return false;
}

// format : 1,2,3,4 or 1-5 which should expand
//
function creditcard_extractChoices(val)
{
  var choices = new Array();
  
  var e = explode(',', val);
  for (var i in e) {
    if (e[i].indexOf('-') != -1) {
      // range
      var r = explode('-', e[i]);
      r[0] = parseInt(r[0]);
      r[1] = parseInt(r[1]);
      if (r.length != 2 ||
          r[0] >= r[1]) {
        // error in range settings
        continue;
      }
           
      choices = array_merge(choices, array_map(create_function('a', 'return a.toString();'), range(r[0], r[1])));
    } else {
      // single value
      array_push(choices, e[i]);
    }
  }
  
  return array_unique(choices);
}

