/* function to handle field selection */
function fieldChanged(subCat, thisRef) {
    /* remember heights of container elements */
    var contHeightsArr = new Array();
    for (var i = 0; i < preserveHeightContArr.length; i++) {
        var elem = document.getElementById(preserveHeightContArr[i]);
        var h = null;
        if (elem) {
            h = +elem.clientHeight;
        }
        contHeightsArr[i] = h;
    }
    /* check if a value from select tag was selected */
    var selectNotSelected = false;
    if (thisRef.tagName == 'SELECT' && thisRef.selectedIndex < 1) {
        selectNotSelected = true;
    }
    /* find current subcategory */
    var flagFound = false;
    for (var i = 0; i < subCatArr.length; i++) {
        if (subCatArr[i] == subCat) {
            flagFound = true;
            var curSubCatIndex = i;
        }
    }
    if (!flagFound) {
        /* current subcategory is not found */
        return false;
    }
    if (curSubCatIndex + 1 < subCatArr.length) {
        if (selectNotSelected) {
            /* disable the next subcategory */
            enableDisableSubCat(curSubCatIndex + 1, false);
        } else {
            /* update options in the next subcategory */
            var updated = updateNextSubCat(curSubCatIndex);
            /* enable the next subcategory */
            enableDisableSubCat(curSubCatIndex + 1, updated);
        }
    }
    /* disable all subcategories further than the next one */
    if (curSubCatIndex + 2 < subCatArr.length) {
        for (var i = curSubCatIndex + 2; i < subCatArr.length; i++) {
            enableDisableSubCat(i, false);
        }
    }
    /* update source resources */
    if ((subCat == 'source' || subCat == 'remod_source') && thisRef.tagName == 'SELECT'
            && thisRef.selectedIndex >= 0) {
        var selVal = +thisRef.options[thisRef.selectedIndex].value;
        /* find resources associated with this value */
        var resIndex = -1;
        for (var i = 0; i < sourceResArr.length; i++) {
            if (sourceResArr[i][0] == selVal) {
                /* resource found */
                resIndex = i;
                break;
            }
        }
        if (resIndex != -1) {
            /* change logo */
            var logo = document.getElementById('page_logo');
            if (logo) {
                logo.src = sourceResArr[resIndex][3].src;
            }
            /* change bar above catgeory picture */
            var prodPic = document.getElementById('product_picture');
            if (prodPic) {
                prodPic.style.borderColor = sourceResArr[resIndex][1];
            }
            /* change info pane border */
            var brd = document.getElementById('sp_info_pane');
            if (brd) {
                brd.style.borderColor = sourceResArr[resIndex][1];
            }
        }
    }
    /* update depth images if nessessary */
    if (subCat == 'orientation' && (thisRef.value == "1"
            || thisRef.value == "2")) {
        /* loop throu depth pictures array */
        for (var i = 0; i < depthPicArr.length; i++) {
            var depthEntry = depthPicArr[i];
            /* find depth option image */
            var elem = document.getElementById("img_depth_" + depthEntry[0]);
            if (!elem) {
                /* depth option image is not found, go to the next option */
                continue;
            }
            if (thisRef.value == "1") {
                /* horizontal orientation */
                elem.src = depthEntry[4].src;
            } else if (thisRef.value == "2") {
                /* vertical orientation */
                elem.src = depthEntry[3].src;
            }
        }
    }
    /* restore heights of container elements */
    for (var i = 0; i < preserveHeightContArr.length; i++) {
        var elem = document.getElementById(preserveHeightContArr[i]);
        var h = contHeightsArr[i];
        if (elem && h) {
            elem.style.height = h + 'px';
        }
    }
}

/* function to update content of the next subcategory
   by given index of current catgeory */
function updateNextSubCat(subCatIndex) {
    /* prepare request parameters */
    var params = '?subcat=' + subCatArr[subCatIndex + 1];
    params += '&category_id=' + categoryID;
    params += '&refresh=' + Math.floor(Math.random()*2147483647);
    var frm = document.getElementById('select_product_form');
    if (!frm) {
        return false;
    }
    for (var i = 0; i <= subCatIndex; i++) {
        var fieldName = subCatArr[i] + '_id';
        var fieldValue = null;
        /* search for select */
        var elem = document.getElementById('control_' + subCatArr[i]);
        if (elem && elem.tagName == 'SELECT') {
            /* select found */
            fieldValue = elem.options[elem.selectedIndex].value;
        } else {
            /* search for radio inputs */
            var elem = document.getElementById('opt_cont_' + subCatArr[i]);
            if (elem) {
                /* radio inputs */
                var nestedElems = elem.getElementsByTagName('input');
                if (nestedElems && nestedElems.length > 0) {
                    for (var j = 0; j < nestedElems.length; j++) {
                        var nestedElem = nestedElems[j];
                        if (nestedElem.type == 'radio' && nestedElem.checked) {
                            fieldValue = nestedElem.value;
                            break;
                        }
                    }
                }
            }
        }
        if (fieldValue) {
            /* include this field into request */
            params += '&' + fieldName + '=' + fieldValue;
        }
    }
    /* send request */
    var response = sendHTTPRequest('get_subs.php' + params);
    if (!response) {
        return false;
    }
    /* update next subcategory */
    /* try to update select */
    var elem = document.getElementById('control_' + subCatArr[subCatIndex + 1]);
    if (elem && elem.tagName == 'SELECT') {
        /* select tag found */
        /* remove all existing options except the first one */
        elem.options.length = 1;
        /* add new options */
        var optIndex = 1;
        for (var i = 0; i < selectArr[subCatIndex + 1].length; i++) {
            if (response.indexOf(selectArr[subCatIndex + 1][i][0] + ',') != -1) {
                /* add this option */
                elem.options[optIndex] = new Option(selectArr[subCatIndex + 1][i][1],
                        selectArr[subCatIndex + 1][i][0]);
                optIndex++;
            }
        }
    } else {
        /* try to update radio inputs */
        var optContIdStr = 'opt_' + subCatArr[subCatIndex + 1] + '_';
        var elem = document.getElementById('opt_cont_' + subCatArr[subCatIndex + 1]);
        if (elem) {
            /* loop throu radio inputs */
            var nestedElems = elem.getElementsByTagName('input');
            if (nestedElems && nestedElems.length > 0) {
                for (var i = 0; i < nestedElems.length; i++) {
                    var nestedElem = nestedElems[i];
                    if (nestedElem.type == 'radio') {
                        /* uncheck the option */
                        nestedElem.checked = false;
                        /* loop throu parents */
                        var curElem = nestedElem.parentNode;
                        var flagFound = false;
                        while (curElem && curElem != document) {
                            if (curElem.id.indexOf(optContIdStr) == 0) {
                                /* found parent containing radio input and label */
                                flagFound = true;
                                break;
                            }
                            curElem = curElem.parentNode;
                        }
                        if (!flagFound) {
                            /* go to next radio input */
                            continue;
                        }
                        /* show/hide option block */
                        var subCatID = curElem.id.substr(optContIdStr.length);
                        if (response.indexOf(subCatID + ',') != -1) {
                            /* show this option */
                            curElem.style.display = '';
                        } else {
                            /* hide this option */
                            curElem.style.display = 'none';
                        }
                    }
                }
            }
        }
    }
    /* successfull exit */
    return true;
}

/* function to send HTTP request */
function sendHTTPRequest(page) {
    /* try to create XMLHttpRequest object */
    var req = null;
    if (!req) try {
        req = new ActiveXObject('Msxml2.XMLHTTP');
    } catch (e) {
    }
    if (!req) try {
        req = new ActiveXObject('Microsoft.XMLHTTP');
    } catch (e) {
    }
    if (!req) try {
        req = new XMLHttpRequest();
    } catch (e) {
    }
    if (!req) {
        /* cannot create XMLHttpRequest object */
        return false;
    }
    /* send request */
    req.open('GET', page, false);
    req.send(null);
    /* return response string */
    return req.responseText;
}

/* function to enable / disable subcategory by given index */
function enableDisableSubCat(subCatIndex, enable) {
    /* subcategory label */
    var elem = document.getElementById('label_' + subCatArr[subCatIndex]);
    if (elem) {
        if (enable) {
            elem.className = 'sp_subcat_label';
        } else {
            elem.className = 'sp_subcat_label_ia';
        }
    }
    /* main control element such as select tag (if exists) */
    var elem = document.getElementById('control_' + subCatArr[subCatIndex]);
    if (elem) {
        if (enable) {
            elem.disabled = false;
        } else {
            elem.disabled = true;
        }
        /* deselect */
        elem.selectedIndex = -1;
    }
    /* radio options (if exist) */
    var elem = document.getElementById('opt_cont_' + subCatArr[subCatIndex]);
    if (elem) {
        /* radio inputs */
        var nestedElems = elem.getElementsByTagName('input');
        if (nestedElems && nestedElems.length > 0) {
            for (var i = 0; i < nestedElems.length; i++) {
                var nestedElem = nestedElems[i];
                if (nestedElem.type == 'radio') {
                    if (enable) {
                        nestedElem.disabled = false;
                    } else {
                        nestedElem.disabled = true;
                    }
                    /* uncheck */
                    nestedElem.checked = false;
                }
            }
        }
        /* labels for radio options */
        var nestedElems = elem.getElementsByTagName('span');
        if (nestedElems && nestedElems.length > 0) {
            for (var i = 0; i < nestedElems.length; i++) {
                var nestedElem = nestedElems[i];
                if (nestedElem.className == 'sp_radio_label'
                        || nestedElem.className == 'sp_radio_label_ia') {
                    if (enable) {
                        nestedElem.className = 'sp_radio_label';
                    } else {
                        nestedElem.className = 'sp_radio_label_ia';
                    }
                }
            }
        }
    }
}

/* function to preload pictures */
function preloadPics() {
    /* source pictures */
    if (sourceResArr && sourceResArr.length) {
        for (var i = 0; i < sourceResArr.length; i++) {
            sourceResArr[i][3] = new Image();
            sourceResArr[i][3].src = sourceResArr[i][2];
        }
    }
    /* product pictures */
    if (productPicArr && productPicArr.length) {
        for (var i = 0; i < productPicArr.length; i++) {
            productPicArr[i][1] = new Image();
            productPicArr[i][1].src = productPicArr[i][0];
        }
    }
    /* depth option pictures */
    if (depthPicArr && depthPicArr.length) {
        for (var i = 0; i < depthPicArr.length; i++) {
            depthPicArr[i][3] = new Image();
            depthPicArr[i][3].src = depthPicArr[i][1];
            depthPicArr[i][4] = new Image();
            depthPicArr[i][4].src = depthPicArr[i][2];
        }
    }
}

/* function to change product picture */
function selectPicture(picNum) {
    var picIndex = picNum - 1;
    if (productPicArr && productPicArr.length > picIndex) {
        /* change picture */
        var elem = document.getElementById('product_picture');
        if (elem) {
            elem.src = productPicArr[picIndex][1].src;
        }
        /* update picture number links */
        for (var i = 1; i <= productPicArr.length; i++) {
            var elemLink = document.getElementById('pic_num_link_' + i);
            var elemActive = document.getElementById('pic_num_active_' + i);
            if (elemLink && elemActive) {
                if (i == picNum) {
                    elemLink.style.display = 'none';
                    elemActive.style.display = 'inline';
                } else {
                    elemLink.style.display = 'inline';
                    elemActive.style.display = 'none';
                }
            }
        }
    }
}

