
ProductChoice.prototype.preselect = function(preselects) {
    var preselectsCount = preselects ? preselects.length : 0;
    for (var i = 0; i < preselectsCount; i++) {
        var cntrl = document.getElementById(preselects[i]);
        if (cntrl && cntrl.type == "checkbox") {
            cntrl.checked = true;
            this.selectProduct(cntrl);
        }
    }
}

ProductChoice.prototype.resetPage = function() {
    var checks = document.getElementsByTagName('INPUT');
    var count = checks.length;
    for(var i = 0; i < count; i++) {
        if(checks[i].type == "checkbox") {
            checks[i].checked = false;
        }
    }
    var selects = document.getElementsByTagName('SELECT');
    for(var i = 0; i < selects.length; i++) {
        selects[i].selectedIndex = 0;
    }
}

ProductChoice.prototype.redisplay = function() {
    var result = '';
    var productCount = this.products.length;
    if (productCount > 0) {
        for (var i = 0; i < this.products.length; i++) {
            var product = this.products[i];
            result += '<li>' + product.desc + '</li>';
        }
    } else {
        // emptyBasketMessage defined in page.
        result = emptyBasketMessage;
    }
    if (document.getElementById(this.sectionName) != null) {
        document.getElementById(this.sectionName).innerHTML = result;
    }
}

ProductChoice.prototype.synchronize = function(preselects) {
    this.resetPage();    
    var productCount = this.products.length;
    if (productCount == 0) {
        this.preselect(preselects);
    } else {
        for (var i = 0; i < productCount; i++) {
            var product = this.products[i];
            var cntrl = document.getElementById(product.element);
            if (cntrl && cntrl.type == "checkbox") {
                cntrl.checked = true;
            } else if (cntrl && cntrl.options) {  // Drop down
                var optionCount = cntrl.options.length;
                for(var j = 0; j < optionCount; j++) {
                    var sp = cntrl.options[j].value;
                    if(sp != '') {
                        var p = eval(sp);
                        if(p.sku == product.sku) {
                            cntrl.selectedIndex = j;
                            break;
                        }
                    }
                }
            }
        }
    }
    this.redisplay();    
}

ProductChoice.prototype.selectProduct = function(productWidget) {
    if (productWidget.type == 'checkbox') {
        var product = eval(productWidget.value);
        var contains = this.containsProduct(product);
        if (productWidget.checked && !contains) {
            if(product.type == 'coverplan') {
                this.removeCoverplans();
            }
            this.addProduct(product);
        } else if (contains) {
            if(product.type == 'coverplan') {
                this.removeCoverplans();
            } else {
                this.removeProduct(product);
            }
        }
    } else if (productWidget.options) { // Drop down list
        this.removeProductByElement(productWidget.id);
        var serialproduct = productWidget.options[productWidget.selectedIndex].value;
        if (serialproduct != '') {
            var product = eval(serialproduct);
            var contains = this.containsProduct(product);
            if (!contains) {
                this.addProduct(product);
            }
        } 
    }
    this.redisplay();
}

ProductChoice.prototype.containsProduct = function(product) {
    var productCount = this.products.length;
    for (var i = 0; i < productCount; i ++) {
        if (product.sku == this.products[i].sku) {
            return true;
        }
    }
    return false;
}

ProductChoice.prototype.addProduct = function(product) {
    this.products.push(product);
}

ProductChoice.prototype.removeProduct = function(product) {
    var productCount = this.products.length;
    var newList = new Array();
    for (var i = 0; i < productCount; i ++) {
        if (product.sku != this.products[i].sku) {
            newList.push(this.products[i]);
        }
    }
    this.products = newList;
}

ProductChoice.prototype.removeCoverplans = function() {
    var productCount = this.products.length;
    var newList = new Array();
    for (var i = 0; i < productCount; i ++) {
        if (this.products[i].type != 'coverplan') {
            newList.push(this.products[i]);
        } else {
            var checkbox = document.getElementById('coverplan_' + this.products[i].sku);
            if(checkbox && checkbox.type == 'checkbox') {
                checkbox.checked = false;
            }
        }
    }
    this.products = newList;
}

ProductChoice.prototype.removeProductByElement = function(element) {
    var productCount = this.products.length;
    var newList = new Array();
    for (var i = 0; i < productCount; i ++) {
        if (element != this.products[i].element) {
            newList.push(this.products[i]);
        }
    }
    this.products = newList;
}

ProductChoice.prototype.removeAll = function() {
    this.products = new Array();
}

ProductChoice.prototype.createHiddenField = function(name, value) {
    var e = document.createElement("input");
    e.type = "hidden";
    e.name = name
    e.value = value;
    return e;
}

ProductChoice.prototype.addToBasket = function(target, bundleSku) {
    var productForm = document.getElementById("productCart");
    productForm.appendChild(this.createHiddenField("page", "MultibuyRouter"));
    productForm.appendChild(this.createHiddenField("routerOperation", "validateMultibuyAndAddItems"));
    productForm.appendChild(this.createHiddenField("sku", this.sku));
    productForm.appendChild(this.createHiddenField("coverplan_for", this.sku));
    productForm.appendChild(this.createHiddenField("installation_for", this.sku));
    var productCount = this.products.length;
    for (var i = 0; i < productCount; i ++) {
        var product = this.products[i];
        productForm.appendChild(this.createHiddenField(product.type, product.sku));
    }
    if (bundleSku) {
        productForm.appendChild(this.createHiddenField("bundle", bundleSku));
    } else {
        var picknmixOptions = document.getElementsByName("picknmix-opts");
        var count = picknmixOptions.length;
        for (var i = 0; i < count; i++) {
            var opt = picknmixOptions[i];
            if (opt.checked && opt.value != this.sku) {
                productForm.appendChild(this.createHiddenField("picknmix", opt.value));
                break;
            }
        }
    }
    this.removeAll();
    productForm.submit();
}

function ProductChoice(sku) {
    this.sku = sku;
    this.sectionName = 'selectedProducts';
    this.products = new Array();
}