// $Id: func.js,v 1.16.2.15 2007/01/05 08:06:25 max 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 (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;
var select_avail = min_avail;
/* Update product quantity selector */
if (!availObj)
availObj = document.getElementById('product_avail');
if (availObj && availObj.tagName.toUpperCase() == 'SELECT') {
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) {
/* New and old first value in quantities list is equal */
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 {
/* New and old first value in quantities list is differ */
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)
availObj.options[0] = new Option(txt_out_of_stock, 0);
}
select_avail = availObj.options[availObj.selectedIndex].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+"
");
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 += '
'+lbl_quantity+': | ';
str += ''+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 += ' '+(product_wholesale[x][0] == 1 ? lbl_item : lbl_items)+' | ';
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])+'
';
}
}
/* Display wholesale prices */
str += '
'+lbl_price+(tax_str.length > 0 ? '*' : '')+': | ';
for (var x in product_wholesale) {
if (product_wholesale[x][0] == 0)
continue;
str += ''+price_format(product_wholesale[x][2] < 0 ? 0 : product_wholesale[x][2])+' | ';
}
str += '
';
if (tax_str.length > 0)
str += '
*'+txt_note+': | '+tax_str+' |
';
str += '
';
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;
}
/*
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;
}