// $Id: func.js,v 1.16.2.20 2008/11/27 08:41:55 avg Exp $

var current_taxes = [];
var product_thumbnail = document.getElementById('product_thumbnail');
var availObj = document.getElementById('product_avail');

/*
        Rebuild page if some options is changed
*/
function check_options() {
        var local_taxes = [];
        var is_rebuild_wholesale = false;
        var variantid = false;

        for (var t in taxes)
                local_taxes[t] = taxes[t][0];
        price = default_price;

        /* Find variant */
        for (var x in variants) {
                if (variants[x][1].length == 0)
                        continue;

                variantid = x;
                for (var c in variants[x][1]) {
                        if (getPOValue(c) != variants[x][1][c]) {
                                variantid = false;
                                break;
                        }
                }

                if (variantid)
                        break;
        }

        /* If variant found ... */
        if (variantid) {
                price = variants[variantid][0][0];
                orig_price = variants[variantid][0][4];
                avail = variants[variantid][0][1];

                /* Get variant wholesale prices */
                if (variants[variantid][3]) {
                        product_wholesale = [];
                        for (var t in variants[variantid][3]) {
                                var _tmp = modi_price(variants[variantid][3][t][2], cloneObject(variants[variantid][3][t][3]), variants[variantid][3][t][4]);
                                product_wholesale[t] = [
                                        variants[variantid][3][t][0],
                                        variants[variantid][3][t][1],
                                        _tmp[0],
                                        []
                                ];

                                /* Get variant wholesale taxes */
                                for (var c in _tmp[1]) {
                                        product_wholesale[t][3][c] = _tmp[1][c];
                                }
                        }
                        is_rebuild_wholesale = true;
                }

                /* Get variant taxes */
                for (var t in local_taxes) {
                        if (variants[variantid][2][t])
                                local_taxes[t] = parseFloat(variants[variantid][2][t]);
                }

                if (!product_thumbnail)
                        product_thumbnail = document.getElementById('product_thumbnail');

                /* Change product thumbnail */
                if (product_thumbnail) {
                        if (variants[variantid][0][2].src && variants[variantid][0][2].width > 0 && variants[variantid][0][2].height > 0) {
                                if (product_thumbnail.src != variants[variantid][0][2].src) {
                                        product_thumbnail.src = variants[variantid][0][2].src;
                                        product_thumbnail.width = variants[variantid][0][2].width;
                                        product_thumbnail.height = variants[variantid][0][2].height;
                                }
                        } else if (document.getElementById('product_thumbnail').src != product_image.src) {
                                product_thumbnail.src = product_image.src;
                                if (product_image.width > 0 && product_image.height > 0) {
                                        product_thumbnail.width = product_image.width;
                                        product_thumbnail.height = product_image.height;
                                }
                        }
                }

                /* Change product weight */
                if (document.getElementById('product_weight'))
                        document.getElementById('product_weight').innerHTML = price_format(variants[variantid][0][3]);
                if (document.getElementById('product_weight_box'))
                        document.getElementById('product_weight_box').style.display = parseFloat(variants[variantid][0][3]) > 0 ? "" : "none";

                /* Change product code */
                if (document.getElementById('product_code'))
                        document.getElementById('product_code').innerHTML = variants[variantid][0][5];

        }

        if (pconf_price > 0)
                price = pconf_price;

        /* Find modifiers */
        var _tmp = modi_price(price, local_taxes, orig_price);
        price = _tmp[0];
        local_taxes = _tmp[1];
        if (!variantid) {
                product_wholesale = [];
                for (var t in _product_wholesale) {
                        _tmp = modi_price(_product_wholesale[t][2], _product_wholesale[t][3].slice(0), _product_wholesale[t][4]);
                        product_wholesale[t] = [
                                _product_wholesale[t][0],
                                _product_wholesale[t][1],
                                _tmp[0],
                                _tmp[1]
                        ];
                }
                is_rebuild_wholesale = true;
        }

        /* Update taxes */
        for (var t in local_taxes) {
                if (document.getElementById('tax_'+t)) {
                        document.getElementById('tax_'+t).innerHTML = currency_symbol+price_format(local_taxes[t] < 0 ? 0 : local_taxes[t]);
                }
                current_taxes[t] = local_taxes[t];
        }

        if (is_rebuild_wholesale)
                rebuild_wholesale();

        /* Update form elements */
        /* Update price */
        if (document.getElementById('product_price'))
                document.getElementById('product_price').innerHTML = currency_symbol+price_format(price < 0 ? 0 : price);

        /* Update alt. price */
        if (alter_currency_rate > 0 && alter_currency_symbol != "" && document.getElementById('product_alt_price')) {
                var altPrice = price*alter_currency_rate;
                document.getElementById('product_alt_price').innerHTML = "("+alter_currency_symbol+" "+price_format(altPrice < 0 ? 0 : altPrice)+")";
        }

        /* Update Save % */
        if (document.getElementById('save_percent') && document.getElementById('save_percent_box') && list_price > 0 && dynamic_save_money_enabled) {
                var save_percent = Math.round(100-(price/list_price)*100);
                if (save_percent > 0) {
                        document.getElementById('save_percent_box').style.display = '';
                        document.getElementById('save_percent').innerHTML = save_percent;
                } else {
                        document.getElementById('save_percent_box').style.display = 'none';
                        document.getElementById('save_percent').innerHTML = '0';
                }
        }

        /* Update product quantity */
/*
        if (avail) {
                if (document.getElementById('product_avail_txt')) {
                        if (avail > 0) {
                                document.getElementById('product_avail_txt').innerHTML = substitute(txt_items_available, "items", (variantid ? avail : product_avail));
                        } else {
                                document.getElementById('product_avail_txt').innerHTML = lbl_no_items_available;
                        }
                }

                if ((mq > 0 && avail > mq+min_avail) || is_unlimit)
                        avail = mq+min_avail-1;

                avail = avail > mq ? mq : avail;

                var select_avail = min_avail;
                if (!availObj)
                        availObj = document.getElementById('product_avail');
        }
*/
/*
        if (availObj && availObj.tagName.toUpperCase() == 'SELECT') {

                // Select box
                if (!isNaN(min_avail) && !isNaN(avail)) {
                        var first_value = -1;
                        if (availObj.options[0])
                                first_value = availObj.options[0].value;

                        if (first_value == min_avail) {

                                if ((avail-min_avail+1) != availObj.options.length) {
                                        if (availObj.options.length > avail) {
                                                var cnt = availObj.options.length;
                                                for (var x = (avail < 0 ? 0 : avail); x < cnt; x++)
                                                        availObj.options[availObj.options.length-1] = null;
                                        } else {
                                                var cnt = availObj.options.length;
                                                for (var x = cnt+1; x <= avail; x++)
                                                        availObj.options[cnt++] = new Option(x, x);
                                        }
                                }
                        } else {

                                while (availObj.options.length > 0)
                                        availObj.options[0] = null;
                                var cnt = 0;
                                for (var x = min_avail; x <= avail; x++)
                                        availObj.options[cnt++] = new Option(x, x);
                        }
                        if (availObj.options.length == 0 || min_avail > avail)
                                availObj.options[0] = new Option(txt_out_of_stock, 0);
                }
                select_avail = availObj.options[availObj.selectedIndex].value;

        } else
*/

        if (availObj && availObj.tagName.toUpperCase() == 'INPUT' && availObj.type.toUpperCase() == 'TEXT') {

                // Input box
/*        if (!isNaN(min_avail) && !isNaN(avail)) {
                        availObj.minQuantity = min_avail;
                        availObj.maxQuantity = avail;
                }
*/        select_avail = availObj.value;
          check_wholesale(select_avail);
        }

        if ((alert_msg == 'Y') && (min_avail > avail))
                alert(txt_out_of_stock);

        /* Check exceptions */
        var ex_flag = check_exceptions();
        if (!ex_flag && (alert_msg == 'Y'))
                alert(exception_msg);

        if (document.getElementById('exception_msg'))
                document.getElementById('exception_msg').innerHTML = (ex_flag ? '' : exception_msg_html+"<br /><br />");

        return true;
}

/*
        Calculate product price with price modificators
*/
function modi_price(_price, _taxes, _orig_price) {
        var return_price = round(_price, 2);

        /* List modificators */
        for (var x2 in modifiers) {
                var value = getPOValue(x2);
                if (!value || !modifiers[x2][value])
                        continue;

                /* Get selected option */
                var elm = modifiers[x2][value];
                return_price += parseFloat(elm[1] == '$' ? elm[0] : (_price*elm[0]/100));

                /* Get tax extra charge */
                for (var t2 in _taxes) {
                        if (elm[2][t2]) {
                                _taxes[t2] += parseFloat(elm[1] == '$' ? elm[2][t2] : (_orig_price*elm[2][t2]/100));
                        }
                }
        }

        return [return_price, _taxes];
}

/*
        Check product options exceptions
*/
function check_exceptions() {
        if (!exceptions)
                return true;

        /* List exceptions */
        for (var x in exceptions) {
                if (isNaN(x))
                        continue;

                var found = true;
        for (var c in exceptions[x]) {
                        var value = getPOValue(c);
                        if (!value)
                                return true;

            if (value != exceptions[x][c]) {
                                found = false;
                                break;
                        }
                }
                if (found)
                        return false;
        }

        return true;
}

/*
        Rebuild wholesale tables
*/
function rebuild_wholesale() {

        var obj = document.getElementById('wl_table');
        if (!obj)
                return false;

        /* Clear wholesale span object if product wholesale prices service array is empty */
        if (!product_wholesale || product_wholesale.length == 0) {
                obj.innerHTML = "";
                return false;
        }

        /* Display headline */
        var str = '';
        var i = 0;
        for (var x in product_wholesale) {
                if (product_wholesale[x][0] == 0)
                        continue;

                if (i == 0)
                        str += '<br /><table cellpadding="2" cellspacing="2"><tr class="TableHead"><td align="right"><b>'+lbl_quantity+':&nbsp;</b></td>';

                str += '<td>'+product_wholesale[x][0];
                if (x == product_wholesale.length-1) {
                        str += '+';
                } else if (product_wholesale[x][0] < product_wholesale[x][1]) {
                        str += '-'+product_wholesale[x][1];
                }
                str += '&nbsp;'+(product_wholesale[x][0] == 1 ? lbl_item : lbl_items)+'</td>';
                i++;
        }

        if (i == 0)
                return false;

    /* Display wholesale prices taxes */
        var tax_str = '';
    if (taxes.length > 0) {
        for (var x in taxes) {
            if (current_taxes[x] > 0)
                tax_str += substitute(lbl_including_tax, 'tax', taxes[x][1])+'<br />';
        }
    }

        /* Display wholesale prices */
        str += '</tr><tr bgcolor="#EEEEEE"><td align="right"><b>'+lbl_price+(tax_str.length > 0 ? '*' : '')+':&nbsp;</b></td>';
        for (var x in product_wholesale) {
                if (product_wholesale[x][0] == 0)
                        continue;
		str += '<td>'+currency_symbol+price_format(product_wholesale[x][2] < 0 ? 0 : product_wholesale[x][2])+'</td>';
        }

        str += '</tr></table>';

        if (tax_str.length > 0)
                str += '<br /><table><tr><td class="FormButton" valign="top"><b>*'+txt_note+':</b>&nbsp;</td><td nowrap="nowrap" valign="top">'+tax_str+'</td></tr></table>';

        str += '<br />';
        obj.innerHTML = str;

        return true;
}

/*
        Display current wholesale price as product price
*/
function check_wholesale(qty) {
        if (product_wholesale.length == 0)
                return true;

        var wl_taxes = current_taxes.slice(0);
        var wl_price = price;
        var found = false;
        for (var x = 0; x < product_wholesale.length; x++) {
                if (product_wholesale[x][0] <= qty && (product_wholesale[x][1] >= qty || product_wholesale[x][1] == 0)) {
                        wl_price = product_wholesale[x][2];
                        wl_taxes = product_wholesale[x][3].slice(0);
                        found = true;
                }
                if (document.getElementById('wp'+x)) {
                        var wPrice = price-default_price+product_wholesale[x][2];
                        document.getElementById('wp'+x).innerHTML = currency_symbol+price_format(wPrice < 0 ? 0 : wPrice);
                }
        }

        if (document.getElementById('product_price'))
                document.getElementById('product_price').innerHTML = currency_symbol+price_format(wl_price < 0 ? 0 : wl_price);
        if (alter_currency_rate > 0 && alter_currency_symbol != "" && document.getElementById('product_alt_price')) {
                var altPrice = wl_price*alter_currency_rate;
                document.getElementById('product_alt_price').innerHTML = "("+alter_currency_symbol+" "+price_format(altPrice < 0 ? 0 : altPrice)+")";
        }

        /* Update Save % */
        if (document.getElementById('save_percent') && document.getElementById('save_percent_box') && list_price > 0 && dynamic_save_money_enabled) {
                var save_percent = Math.round(100-((wl_price < 0 ? 0 : wl_price)/list_price)*100);
                if (save_percent > 0) {
                        document.getElementById('save_percent_box').style.display = '';
                        document.getElementById('save_percent').innerHTML = save_percent;
                } else {
                        document.getElementById('save_percent_box').style.display = 'none';
                        document.getElementById('save_percent').innerHTML = '0';
                }
        }


        for (var x in taxes) {
                if (document.getElementById('tax_'+x) && wl_taxes[x] && current_taxes[x]) {
                        document.getElementById('tax_'+x).innerHTML = currency_symbol+price_format(wl_taxes[x] < 0 ? 0 : wl_taxes[x]);
                }
        }

        return true;
}

// Check quantity input box
function check_quantity_input_box(inp) {
        if (isNaN(inp.minQuantity))
                inp.minQuantity = min_avail;

        if (isNaN(inp.maxQuantity))
                inp.maxQuantit = avail;

        if (!isNaN(inp.minQuantity) && !isNaN(inp.maxQuantity)) {
                var q = parseInt(inp.value);
                if (isNaN(q)) {
                        alert(substitute(lbl_product_quantity_type_error, "min", inp.minQuantity, "max", inp.maxQuantity));
                        return false;
                }

                if (q < inp.minQuantity) {
                        alert(substitute(lbl_product_minquantity_error, "min", inp.minQuantity));
                        return false;
                }

                if (q > inp.maxQuantity) {
                        alert(substitute(lbl_product_maxquantity_error, "max", inp.maxQuantity));
                        return false;
                }

                check_wholesale(inp.value);
        }
        return true;
}

/*
        Get product option value
*/
function getPOValue(c) {
        if (!document.getElementById('po'+c) || document.getElementById('po'+c).tagName.toUpperCase() != 'SELECT')
                return false;
        return document.getElementById('po'+c).options[document.getElementById('po'+c).selectedIndex].value;
}

/*
    Get product option object by class name / class id
*/
function product_option(classid) {
        if (!isNaN(classid))
                 return document.getElementById("po"+classid);

        if (!names)
                return false;

        for (var x in names) {
                if (names[x]['class_name'] != classid)
                        continue;
                return document.getElementById('po'+x);
    }

        return false;
}

/*
        Get product option value by class name / or class id
*/
function product_option_value(classid) {
        var obj = product_option(classid);
        if (!obj)
                return false;

        if (obj.type != 'select-one')
                return obj.value;

        var classid = parseInt(obj.id.substr(2));
        var optionid = parseInt(obj.options[obj.selectedIndex].value);
        if (names[classid] && names[classid]['options'][optionid])
                return names[classid]['options'][optionid];

        return false;
}
