﻿var printedObjectBlocks = new Array(); //IJR 2010.06.30
var usingInitialColor = false; //IJR 2010.06.30
var contentLayerColorSources = new Array(); //IJR 2010.06.29
var controllerColor = ""; //IJR 2010.06.30

aspdnsf.Products.KitProductItem = function(id, itemCode, itemType, name, selected, color) {
    aspdnsf.Products.KitProductItem.initializeBase(this, [id, itemCode, itemType]);
        
    this.name = name;
    
    this.deltaPrice = 0;
    this.selected = selected;
    
    this.selectedChangedEventHandlers = new Array();
    this.deltaPriceChangedEventHandlers = new Array();
    
    this.color = color; //IJR 2010.06.29
    this.isInitial = selected; //IJR 2010.06.30
        
}
aspdnsf.Products.KitProductItem.registerClass('aspdnsf.Products.KitProductItem', aspdnsf.Products.Product);
aspdnsf.Products.KitProductItem.prototype = {
    
    getName : function() {
        return this.name;
    },
    
    compareWith : function(other) {
        var delta = 0;
        if(other == this) {
            delta = 0;
        }
        else {
            delta = this.getPrice() - other.getPrice();
        }
        delta = Math.round(delta * 100) / 100;  //IJR Veriodesign 2009.05.22
        this.setDeltaPrice(delta);

    },
    
    computeDelta : function() {
        var delta = this.getPrice();
        this.setDeltaPrice(delta);
    },
    
    setDeltaPrice : function(delta) {
        this.deltaPrice = delta;
        this.onDeltaPriceChanged();
    },
    
    getDeltaPrice : function() {
        return this.deltaPrice;
    },
    
    getIsSelected : function() {
        return this.selected;
        this.onSelectedChanged();
    },
    
    setIsSelected : function(selected, invoker) {
        this.selected = selected;        
        this.onSelectedChanged(invoker);        
        return this.selected;
    },
    
    addSelectedChangedEventHandler : function(handler) {
        this.selectedChangedEventHandlers.push(handler);
    },
    
    addDeltaPriceChangedEventHandler : function(handler) {
        this.deltaPriceChangedEventHandlers.push(handler);
    },
    
    onSelectedChanged : function(invoker) {
        for(var ctr=0; ctr<this.selectedChangedEventHandlers.length; ctr++) {
            var handler = this.selectedChangedEventHandlers[ctr];
            handler(this, invoker);
        }
    },
    
    onDeltaPriceChanged : function() {
        for(var ctr=0; ctr<this.deltaPriceChangedEventHandlers.length; ctr++) {
            var handler = this.deltaPriceChangedEventHandlers[ctr];
            handler(this);
        }
    }

}

aspdnsf.Products.KitProductItemGroup = function(id, groupCode) {
    this.id = id;
    this.code = groupCode;
    this.items = new Array();
    
    this.selectionChangedEventHandlers = new Array();
    
    // virtual methods
    this.afterKitItemRegisteredDelegate = null;
    this.chooseItemsDelegate = null;
    this.inspectDelegate = this.baseInspect;
}
aspdnsf.Products.KitProductItemGroup.registerClass('aspdnsf.Products.KitProductItemGroup');
aspdnsf.Products.KitProductItemGroup.prototype = {

    getId : function() {
        return this.id;
    },
    
    getGroupCode : function() {
        return this.code;
    },
    
    getSelectedItems : function() {
        var selectedItems = new Array();
        
        for(var ctr=0; ctr<this.items.length; ctr++) {
            var current = this.items[ctr];
            if(current.getIsSelected()) {
                selectedItems.push(current);
            }
        }
        
        return selectedItems;
    },
    
    registerKitItem : function(kitItem) {
        if(kitItem) {
            this.items.push(kitItem);
            var handler = Function.createDelegate(this, this.kitItemSelectedChangedEventHandler);
            kitItem.addSelectedChangedEventHandler(handler);
            
            if(this.afterKitItemRegisteredDelegate) {
                this.afterKitItemRegisteredDelegate(kitItem);
            }
        }
    },
    
    inspect : function() {
        if(this.inspectDelegate) {
            this.inspectDelegate();
        }
    },
    
    baseInspect : function() {
        // meant to be overridden
    },
    
    kitItemSelectedChangedEventHandler : function(item, invoker) {
        if(invoker && this == invoker) {
            return;
        }
        
        if(this.chooseItemsDelegate) {
            this.chooseItemsDelegate(item);
        }
        
        this.onSelectionChanged();
    },
    
    addSelectionChangedEventHandler : function(handler) {
        this.selectionChangedEventHandlers.push(handler);
    },
    
    onSelectionChanged : function() {
        for(var ctr=0; ctr<this.selectionChangedEventHandlers.length; ctr++) {
            var handler = this.selectionChangedEventHandlers[ctr];
            handler(this);
        }
    }
    
}

aspdnsf.Products.KitProductItemRequiredGroup = function(id, groupCode) {
    aspdnsf.Products.KitProductItemRequiredGroup.initializeBase(this, [id, groupCode]);
    
    var handler = Function.createDelegate(this, this.chooseItems);
    this.chooseItemsDelegate = handler;//this.chooseItems.bind(this);
    this.inspectDelegate = handler; //this.chooseItems.bind(this);
}
aspdnsf.Products.KitProductItemRequiredGroup.registerClass('aspdnsf.Products.KitProductItemRequiredGroup', aspdnsf.Products.KitProductItemGroup);
aspdnsf.Products.KitProductItemRequiredGroup.prototype = {

    chooseItems : function(selectedItem) {
        if(arguments.length == 0) {
            selectedItem = this.getSelectedItems()[0];
        }
        
        for(var ctr=0; ctr<this.items.length; ctr++) {
            var current = this.items[ctr];
            if(current != selectedItem) {
                current.setIsSelected(false, this);
            }
            
            current.compareWith(selectedItem);
        }
    }
}

aspdnsf.Products.KitProductItemMultiSelectGroup = function(id, groupCode) {
    aspdnsf.Products.KitProductItemMultiSelectGroup.initializeBase(this, [id, groupCode]);    
    
    this.chooseItemsDelegate = Function.createDelegate(this, this.chooseItems); //this.chooseItems.bind(this);
    this.inspectDelegate = Function.createDelegate(this, this.displayDefault); //this.displayDefault.bind(this);
}
aspdnsf.Products.KitProductItemMultiSelectGroup.registerClass('aspdnsf.Products.KitProductItemMultiSelectGroup', aspdnsf.Products.KitProductItemGroup);
aspdnsf.Products.KitProductItemMultiSelectGroup.prototype = {

    displayDefault : function() {
        for(var ctr=0; ctr<this.items.length; ctr++) {
            var current = this.items[ctr];
            current.computeDelta();
        }
    },
    
    chooseItems : function(selectedItem) {
        if(arguments.length == 0) {
            selectedItem = this.getSelectedItems()[0];
        }
        
        if(!selectedItem.getIsSelected()) {
            var hasOtherSelected = false;
            
            for(var ctr=0; ctr<this.items.length; ctr++) {
                var current = this.items[ctr];
                if(current != selectedItem) {
                    if(current.getIsSelected()) {
                        hasOtherSelected = true;
                        break;
                    }
                }
            }
            
            if(!hasOtherSelected) {
                selectedItem.setIsSelected(true, this);
            }
        }
        
        selectedItem.computeDelta();
    }
        
}

aspdnsf.Products.KitProductItemOptionalGroup = function(id, groupCode) {
    aspdnsf.Products.KitProductItemOptionalGroup.initializeBase(this, [id, groupCode]);
    
    this.chooseItemsDelegate = Function.createDelegate(this, this.chooseItems); //this.chooseItems.bind(this);
    this.inspectDelegate = Function.createDelegate(this, this.chooseItems); //this.chooseItems.bind(this);
}
aspdnsf.Products.KitProductItemOptionalGroup.registerClass('aspdnsf.Products.KitProductItemOptionalGroup', aspdnsf.Products.KitProductItemGroup);
aspdnsf.Products.KitProductItemOptionalGroup.prototype = {

    unSelectAll : function() {
        for(var ctr=0; ctr<this.items.length; ctr++) {
            var current = this.items[ctr];
            current.setIsSelected(false, this);
        }
        
        this.chooseItems(null);
        
        this.onSelectionChanged();
    },
    
    chooseItems : function(selectedItem) {
        if(arguments.length == 0) {
            var selectedItems = this.getSelectedItems();
            if(selectedItems.length > 0) {
                selectedItem = selectedItems[0];
            }
            else {
                selectedItem = null;
            }
        }
        
        for(var ctr=0; ctr<this.items.length; ctr++) {
            var current = this.items[ctr];
            if(selectedItem) {
                if(current != selectedItem) {
                    current.setIsSelected(false, this);
                }
                
                current.compareWith(selectedItem);
            }
            else {
                current.computeDelta();
            }
        }
    }
    
}

aspdnsf.Products.KitProduct = function(id, itemCode, itemType) {
    aspdnsf.Products.KitProduct.initializeBase(this, [id, itemCode, itemType]);
    
    this.items = new Array();
    this.compositionChangedEventHandlers = new Array();
    this.groups = new Array();
    
    var handler = Function.createDelegate(this, this.onCompositionChanged);
    this.addUnitMeasureChangedEventHandler(handler); //this.onCompositionChanged.bind(this));

    this.assemblyControl = null; 
}
aspdnsf.Products.KitProduct.registerClass('aspdnsf.Products.KitProduct', aspdnsf.Products.Product);
aspdnsf.Products.KitProduct.prototype = {
    
    setAssemblyControl : function() {
        this.assemblyControl = new aspdnsf.Products.AssemblyControl();
        this.assemblyControl.setKitProduct(this);
    }, 
   
    getGroup : function(id) {
        for(var ctr=0; ctr<this.groups.length; ctr++) {
            var group = this.groups[ctr];
            if(group.getId() == id) {
                return group;
            }
        }
        
        return null;
    },
    
    getGroups : function() {
        return this.groups;
    },
    
    getKitPrice : function() {
        var kitPrice = 0;
        
        for(var ctr=0; ctr<this.groups.length; ctr++) {
            var group = this.groups[ctr];
            var items = group.getSelectedItems();
            for(var ictr=0; ictr<items.length; ictr++) {
                var item = items[ictr];
                if(item) {
                    kitPrice += item.getPrice();
                }
            }
        }
        kitPrice = kitPrice * this.getUnitMeasureQuantity();
        kitPrice = Math.round(kitPrice * 100) / 100; //IJR Veriodesign 2009.05.22
        return kitPrice;
    },
    getKitListPrice : function() { //IJR Veriodesign 2009.11.14
        var kitPrice = 0;
        
        for(var ctr=0; ctr<this.groups.length; ctr++) {
            var group = this.groups[ctr];
            var items = group.getSelectedItems();
            for(var ictr=0; ictr<items.length; ictr++) {
                var item = items[ictr];
                if(item && item.name != "Promotional Discount") {
                    kitPrice += item.getPrice();
                }
            }
        }
        kitPrice = kitPrice * this.getUnitMeasureQuantity();
        kitPrice = Math.round(kitPrice * 100) / 100; //IJR Veriodesign 2009.05.22
        return kitPrice;
    },
    
    getKitPrice_Bling : function() { //IJR Veriodesign 2009.7.21
        var kitPrice = 0;
        var bcount = 0;
        for(var ctr=0; ctr<this.groups.length; ctr++) {
           var group = this.groups[ctr];
           if (group.code != "BLING-ASSEMBLY" && group.code.indexOf("BLING") == 0) {
               var items = group.getSelectedItems();
               for(var ictr=0; ictr<items.length; ictr++) {
                   var item = items[ictr];
                   if(item) {
                       for (var tctr=0; tctr<this.assemblyControl.blingYesTriggers.length; tctr++) {
                        if (this.assemblyControl.blingYesTriggers[tctr][0] == item.id) {
                           bcount += parseInt(this.assemblyControl.blingYesTriggers[tctr][1]);
                           break;
                        }
                       }
                   }
               }
           }       
        } 
        var asmblyid = null;
        for (var yctr=0; yctr<this.assemblyControl.blingYesVals.length; yctr++) {
            if (this.assemblyControl.blingYesVals[yctr][0] == bcount) {
               asmblyid = this.assemblyControl.blingYesVals[yctr][1];
               this.assemblyControl.setBlingYesVal(asmblyid);
               break;
            }
        } 
        if (asmblyid != null) {
           for(var ctr=0; ctr<this.groups.length; ctr++) {
               var group = this.groups[ctr];
               if (group.code == "BLING-ASSEMBLY") { //|| group.code == "Assembly?"
                  var items = group.items;//getSelectedItems();
                  for(var ictr=0; ictr<items.length; ictr++) {
                      var item = items[ictr];
                      if(item) {
                        if (item.id == asmblyid) {
                           var p = item.getPrice(); 
                           kitPrice += p;
                           break;
                        }
                      }
                  }
               }
           }
        }
        for(var ctr=0; ctr<this.groups.length; ctr++) {
            var group = this.groups[ctr];
            if (group.code == "Assembly?") { 
               var items = group.items;
               for(var ictr=0; ictr<items.length; ictr++) {
                   var item = items[ictr];
                   if(item) {
                     if (item.id == this.assemblyControl.nonblingYesVal) {
                        var p = item.getPrice(); 
                        kitPrice += p;
                        break;
                     }
                   }
               }
            }
        }
        kitPrice = kitPrice * this.getUnitMeasureQuantity();
        kitPrice = Math.round(kitPrice * 100) / 100; 
        return kitPrice;
    },
    
    getComposition : function() {
        var compositions = new Array();
        for(var gctr=0; gctr<this.groups.length; gctr++) {
            var group = this.groups[gctr];
            var items = group.getSelectedItems();
            for(var ictr=0; ictr<items.length; ictr++) {
                var item = items[ictr];
                var itemId = Math.abs((this.id - item.getId()));
                compositions.push(group.getId()+'+'+itemId);         
            }
        }
        return compositions;
    },
    
    persistComposition : function() {
        var compositions = this.getComposition();        
        
        var items = getElementsByClassName('input', 'KitItems');
        for(var ctr=0; ctr<items.length; ctr++) {
            var elem = items[ctr];
            elem.value = compositions;
        }
    },
    
    registerGroup : function(group) {
        if(group) {
            this.groups.push(group);
            var handler = Function.createDelegate(this, this.groupSelectionChangedEventHandler);
            group.addSelectionChangedEventHandler(handler); //this.groupSelectionChangedEventHandler.bind(this));
        }
    },
    
    groupSelectionChangedEventHandler : function() {
        this.onCompositionChanged();
    },
    
    addCompositionChangedEventHandler : function(handler) {
        this.compositionChangedEventHandlers.push(handler);
    },
    
    onCompositionChanged : function() {
        for(var ctr=0; ctr<this.compositionChangedEventHandlers.length; ctr++) {
            var handler = this.compositionChangedEventHandlers[ctr];
            handler(ctr);
        }
    }
    
}

/*************************************************************/

// uses numberFormat154.js internally

/*
aspdnsf.CurrencyFormatter = {
    
    initialize : function() {
        // set defaults
        this.symbol = '';
        this.decimalDigits = 2;
    },
    
    setSymbol : function(symbol) {
        this.symbol = symbol;
    },
    
    setDecimalDigits : function(digits) {   
        this.decimalDigits = digits;
    },
    
    format : function(price) {    
        var formatter = new NumberFormat(); 
        formatter.setCurrencyValue(this.symbol);
        formatter.setPlaces(this.decimalDigits, false);
        formatter.setInputDecimal('.');
        formatter.setCurrency(true);
        formatter.setCurrencyPosition(formatter.LEFT_OUTSIDE);
        formatter.setNegativeFormat(formatter.LEFT_DASH);
        formatter.setNegativeRed(false);
        formatter.setSeparators(true, ',', ',');
        formatter.setNumber(price);
        
        return formatter.toFormatted();
    }
    
}
*/

/*************************************************************/


aspdnsf.Products.PriceDeltaControl = function(id, clientId) {
    this.id = id;
    this.ctrl = $getElement(clientId);
},
aspdnsf.Products.PriceDeltaControl.registerClass('aspdnsf.Products.PriceDeltaControl');
aspdnsf.Products.PriceDeltaControl.prototype = {

    setProduct : function(product) {
        if(product) {
            this.product = product;
            var handler = Function.createDelegate(this, this.controlDeltaPriceChangedEventHandler);
            this.product.addDeltaPriceChangedEventHandler(handler); //this.controlDeltaPriceChangedEventHandler.bind(this));
            this.buildDisplay();
        }
    },
    
    buildDisplay : function() {
        if(this.product.getIsSelected()) {
            this.ctrl.innerHTML = aspdnsf.StringResource.getString('showproduct.aspx.100');
        }
        else {
            var delta = this.product.getDeltaPrice();
            var display = '';
            if(delta>=0) {
                display = aspdnsf.StringResource.getString('showproduct.aspx.14') + ' ' + delta.localeFormat('c'); //aspdnsf.CurrencyFormatter.format(delta);
            }
            else {
                display = aspdnsf.StringResource.getString('showproduct.aspx.15') + ' ' + Math.abs(delta).localeFormat('c'); //aspdnsf.CurrencyFormatter.format(Math.abs(delta));
            }
            
            if(this.product.getHasVat()) {
                display += ' <span class="VATLabel">' + aspdnsf.StringResource.getString('is_showproduct.aspx.56') + '</span>';
            }
            this.ctrl.innerHTML = display;
        }
    },
    
    controlDeltaPriceChangedEventHandler : function(product) {
        this.buildDisplay();
    }
    
}

aspdnsf.Products.KitItemRadioControl = function(id, clientId) {
    this.id = id;
    
    this.ctrl = $getElement(clientId);
    this.ctrl.onclick = Function.createDelegate(this, this.onControlSelected); //this.onControlSelected.bind(this);
    
    this.product = null;
}
aspdnsf.Products.KitItemRadioControl.registerClass('aspdnsf.Products.KitItemRadioControl');
aspdnsf.Products.KitItemRadioControl.prototype = {

    getId : function() {
        return this.id;
    },
    
    setProduct : function(product) {
        if(product) {
            this.product = product;
            if(this.product.addSelectedChangedEventHandler) {
                var handler = Function.createDelegate(this, this.onProductSelectedChanged);
                this.product.addSelectedChangedEventHandler(handler); //this.onProductSelectedChanged.bind(this));
            }
        }
    },

    getProduct : function() {
        return this.product;
    },
    
    onProductSelectedChanged : function() {
        this.ctrl.checked = this.product.getIsSelected();
    },
    
    onControlSelected : function() {
        if(this.product) {
            this.product.setIsSelected(this.ctrl.checked);
        }
    }
    
}

aspdnsf.Products.KitItemCheckBoxControl = function(id, clientId) {
    this.id = id;
    
    this.ctrl = $getElement(clientId);
    this.ctrl.onclick = Function.createDelegate(this, this.onControlSelected); //this.onControlSelected.bind(this);
    
    this.product = null;
}
aspdnsf.Products.KitItemCheckBoxControl.registerClass('aspdnsf.Products.KitItemCheckBoxControl');
aspdnsf.Products.KitItemCheckBoxControl.prototype = {

    getId : function() {
        return this.id;
    },
    
    setProduct : function(product) {
        if(product) {
            this.product = product;
            var handler = Function.createDelegate(this, this.onProductSelectedChanged);
            this.product.addSelectedChangedEventHandler(handler); //this.onProductSelectedChanged.bind(this));
        }
    },

    getProduct : function() {
        return this.product;
    },
    
    onProductSelectedChanged : function() {
        this.ctrl.checked = this.product.getIsSelected();
    },
    
    onControlSelected : function() {
        if(this.product) {
            this.product.setIsSelected(this.ctrl.checked);
        }
    }

}

aspdnsf.Products.KitDropDownOptionControl = function(id) {
    this.id = id;
    
    this.product = null;
    this.shouldDisplayPriceDelta = true;
}
aspdnsf.Products.KitDropDownOptionControl.registerClass('aspdnsf.Products.KitDropDownOptionControl');
aspdnsf.Products.KitDropDownOptionControl.prototype = {

    getId : function() {
        return this.id;
    },
    
    setProduct : function(product) {
        if(product) {
            this.product = product;
        }
    },
    
    compareWith : function(other) {
        this.product.compareWith(other.product);
    },
    
    getIsSelected : function() {
        return this.product && this.product.getIsSelected();
    },
    
    setIsSelected : function(included) {
        this.product.setIsSelected(included);
    },
    
    setShouldDisplayPriceDelta : function(shouldDisplay) {
        this.shouldDisplayPriceDelta = shouldDisplay;
    },
    
    getDisplay : function() {
        if(this.shouldDisplayPriceDelta && this.product) {
            if(this.product.getIsSelected()) {
                return this.product.getName();
            }
            else {
                var display = '';
                
                if(this.product.getDeltaPrice) {
                    var delta = this.product.getDeltaPrice();
                    
                    if (Math.abs(delta) == 0) { //IJR 2009.04.30
                        display = this.product.getName();
                    }
                    else if(delta>0) {
                        display = this.product.getName() +  ', ' + aspdnsf.StringResource.getString('showproduct.aspx.14') + ' ' + delta.localeFormat('c'); //aspdnsf.CurrencyFormatter.format(delta);
                    }
                    else {
                        display = this.product.getName() +  ', ' + aspdnsf.StringResource.getString('showproduct.aspx.15') + ' ' + Math.abs(delta).localeFormat('c'); //aspdnsf.CurrencyFormatter.format(Math.abs(delta));
                    }
                    
                    if(this.product.getHasVat()) {
                        display += ' ' + aspdnsf.StringResource.getString('is_showproduct.aspx.56');
                    }
                }
                else {
                    display = this.product.getName();
                }
                
                return display;
            }
        }
        else {
            return this.product.getName();
        }
    }
    
}

aspdnsf.Products.KitDropDownGroupControl = function(id, clientId) {
    this.id = id;
    this.ctrl = $getElement(clientId);
    this.ctrl.onchange = Function.createDelegate(this, this.onOptionChanged); //this.onOptionChanged.bind(this);
    
    this.controls = new Array();
    this.imageLayers = new Array(); //IJR 2009.05.22
    this.imageLayer = ""; //IJR 2009.05.22
    this.imageTarget = ""; //IJR 2009.05.22
    this.imageMaster = ""; //IJR 2009.05.22
    
    this.product = null;
    //if is a bling dropdown, on change need also to recalc assembly control
    
    this.isColorController = false; //IJR 2010.06.29
    this.contentLayer = ""; //IJR 2010.06.29

}
aspdnsf.Products.KitDropDownGroupControl.registerClass('aspdnsf.Products.KitDropDownGroupControl');
aspdnsf.Products.KitDropDownGroupControl.prototype = {

    getId : function() {
        return this.id;
    },
    
    setPrintedBlockInitialColor : function(color) {
        var ob = new Array('imgProduct_' + this.id, color);
        printedObjectBlocks.push(ob);
    },
    
    setProduct : function(product) {
        if(product) {
            this.product = product;
        }
    },
    
    setIsColorController : function() {
        this.isColorController = true;
        controllerColor = this.product.color;
    },
    
    setContentLayer : function(id) {
        this.contentLayer = id; 
    },

    getProduct : function() {
        return this.product;
    },
    
    addContentLayerColorSource : function(backcolor, forecolor, contentsource) {
        var cs = new Array();
        cs.push(backcolor);
        cs.push(forecolor);
        cs.push(contentsource);
        contentLayerColorSources.push(cs);
    },
    
    registerControl : function(control) {
        if(control) {
            this.controls.push(control);
            if(control.getIsSelected()) {
                this.selectedControl = control;
            }
        }
    },
    
    onOptionChanged : function() { 
        var index = this.ctrl.selectedIndex;
        if(index < this.controls.length) {
            this.selectedControl = this.controls[index];
            this.selectedControl.setIsSelected(true);
            this.imageLayer = this.imageLayers[index];
            var mstr = $getElement(this.imageMaster);
            if (mstr != null && mstr != 'undefined') {
               mstr.style.visibility = 'hidden';
            }           
            if (this.isColorController) {
                controllerColor = this.selectedControl.product.color;
                if (this.contentLayer.length > 0) {
                    usingInitialColor = this.selectedControl.product.isInitial;
                    if (usingInitialColor) {
                        //for initial, return all layers to initial state regardless of default)
                        $getElement(this.contentLayer).src = $getElement(this.contentLayer).longDesc;
                        for (var ob=0;ob<printedObjectBlocks.length;ob++) {
                            var p = $getElement(printedObjectBlocks[ob][0]);
                            var sku = "";
                            var newsku = "";
                            if (p.src.indexOf('-NONE.') < 0) {
                                var urlparts = p.src.split('/');
                                urlparts.reverse();
                                var fileparts = urlparts[0].split('.');
                                sku = fileparts[0];
                                var skuparts = sku.split('-').reverse();
                                newsku = printedObjectBlocks[ob][1].toUpperCase();
                                for (var x=1;x<skuparts.length;x++) {
                                    newsku = skuparts[x]+'-'+newsku;
                                }
                                p.src = p.src.replace(sku,newsku);
                            }
                         }
                    }
                    else { //(is not initial, so get corresponding default color)
                        for (var i=0; i<contentLayerColorSources.length; i++) {
                            if (contentLayerColorSources[i][0] == this.selectedControl.product.color) {
                                $getElement(this.contentLayer).src = contentLayerColorSources[i][2];
                                //change all color-selectable printed object blocks to color contentLayerColorSources[i][1]
                                var thisColor = contentLayerColorSources[i][1].replace(' ', '');                                
                                for (var ob=0;ob<printedObjectBlocks.length;ob++) {
                                    var p = $getElement(printedObjectBlocks[ob][0]);
                                    var sku = "";
                                    var newsku = "";
                                    if (p.src.indexOf('-NONE.') < 0) {
                                        var urlparts = p.src.split('/');
                                        urlparts.reverse();
                                        var fileparts = urlparts[0].split('.');
                                        sku = fileparts[0];
                                        var skuparts = sku.split('-').reverse();
                                        newsku = thisColor.toUpperCase();
                                        for (var x=1;x<skuparts.length;x++) {
                                            newsku = skuparts[x]+'-'+newsku;
                                        }
                                        //alert(printedObjectBlocks[ob][0]+': '+p.src+': '+sku+' ---> '+newsku);
                                        p.src = p.src.replace(sku,newsku);
                                    }
                                }
                                break;
                            }
                        }
                    }
                }
            } 
            var refr = "";
            if (isArray(this.imageTarget) && isArray(this.imageLayer)) {   //IJR 2009.09.21
                for (var i=0; i<this.imageTarget.length; i++) {
                    var tgt = $getElement(this.imageTarget[i]); 
                    if (tgt != null && tgt != 'undefined') {                        
                        if (tgt.name.toUpperCase() == "GIF" && this.imageLayer[i].toUpperCase().indexOf("-NONE.") < 0 && this.imageLayer[i].toUpperCase().indexOf("-NO.") < 0) {
                            now = new Date();
                            refr = "?" + now.getTime();
                            $getElement('pBlingSparkleWarning').style.display = 'block';
                        }
                        tgt.src = this.imageLayer[i] + '.' + tgt.name.toUpperCase() + refr;
                    }                
                }
            }
            else {
                var tgt = $getElement(this.imageTarget); 
                if (tgt != null && tgt != 'undefined') {
                    var refr = "";
                    if (tgt.name.toUpperCase() == "GIF" && this.imageLayer.toUpperCase().slice(-5) != "-NONE" && this.imageLayer.toUpperCase().slice(-3) != "-NO") {
                        now = new Date();
                        refr = "?" + now.getTime();
                        $getElement('pBlingSparkleWarning').style.display = 'block';
                    }
                    tgt.src = this.imageLayer + '.' + tgt.name.toUpperCase() + refr;  //IJR 2009.05.22
                }
            }
        }
        this.buildDisplay();
        if (this.isColorController ==  false) { 
            for (var ob=0;ob<printedObjectBlocks.length;ob++) { 
                if (printedObjectBlocks[ob][0] == 'imgProduct_' + this.id) {
                    var p = $getElement(printedObjectBlocks[ob][0]);
                    var sku = "";
                    var newsku = "";
                    if (p.src.indexOf('-NONE.') < 0) {
                        if (usingInitialColor) {
                            var urlparts = p.src.split('/');
                            urlparts.reverse();
                            var fileparts = urlparts[0].split('.');
                            sku = fileparts[0];
                            var skuparts = sku.split('-').reverse();
                            newsku = printedObjectBlocks[ob][1];
                            for (var x=1;x<skuparts.length;x++) {
                                newsku = skuparts[x]+'-'+newsku;
                            }
                            p.src = p.src.replace(sku,newsku);
                        }
                        else {
                           for (var i=0; i<contentLayerColorSources.length; i++) {
                                if (contentLayerColorSources[i][0] == controllerColor) {                              
                                    var urlparts = p.src.split('/');
                                    urlparts.reverse();
                                    var fileparts = urlparts[0].split('.');
                                    sku = fileparts[0];
                                    var skuparts = sku.split('-').reverse();
                                    newsku = contentLayerColorSources[i][1].replace(' ', '');
                                    for (var x=1;x<skuparts.length;x++) {
                                        newsku = skuparts[x]+'-'+newsku;
                                    }
                                    //alert(printedObjectBlocks[ob][0]+': '+p.src+': '+sku+' ---> '+newsku);
                                    p.src = p.src.replace(sku,newsku);
                                    break;                              
                                }
                            }                            
                        }
                    }
                }
            }
        }
    },
    
    buildDisplay : function() {
        if(this.controls.length == 0) return;
        
        if(this.selectedControl) {
            this.ctrl.options.length = 0;
                        
            var index = 0;
            
            for(var ctr=0; ctr<this.controls.length; ctr++) {
                var currentControl = this.controls[ctr];
                if(currentControl == this.selectedControl) {
                    index = ctr;
                }
                this.ctrl.options[ctr] = new Option(currentControl.getDisplay(), currentControl.getId());
            }            
            this.ctrl.selectedIndex = index;            
        }
        else {
            this.selectedControl = this.controls[0];
        }
    },
    
    registerImageLayer : function (sku) { //IJR 2009.05.22
      this.imageLayers.push(sku);
    },    
      
    registerImageTarget : function(target) { //IJR 2009.05.22
      this.imageTarget = target;
    },
      
    registerImageMaster : function(master) { //IJR 2009.05.22
      this.imageMaster = master;
    }

}


aspdnsf.Products.KitProductNoneItem = function(selected) {
    this.selected = selected;
    this.group = null;
}
aspdnsf.Products.KitProductNoneItem.registerClass('aspdnsf.Products.KitProductNoneItem');
aspdnsf.Products.KitProductNoneItem.prototype = {

    setGroup : function(group) {
        this.group = group;
    },
    
    getName : function() {
        return "None";
    },
    
    setIsSelected : function(selected) {
        if(selected) {
            this.group.unSelectAll();
        }
        this.selected = selected;
    },
    
    getIsSelected : function() {
        return this.selected;
    }
    
}

aspdnsf.Products.KitPriceControl = function(id, clientId) {
    this.id = id;
    this.ctrl = $getElement(clientId);
    
    this.kitProduct = null;
    this.lblPrice = $getElement(clientId + '_Price');
    this.priceQualifier = 'Each'; //IJR Veriodesign 2008.12.01
    this.lblPrice2 = $getElement(clientId + '_Price_2'); //IJR Veriodesign 2009.05.21 (see below for implementation - if not exists, safely ignored)
    this.qty = $('Quantity'); //IJR Veriodesign 2009.06.28
}
aspdnsf.Products.KitPriceControl.registerClass('aspdnsf.Products.KitPriceControl');
aspdnsf.Products.KitPriceControl.prototype = {

    setKitProduct : function(kitProduct) {
        if(kitProduct) {
            this.kitProduct = kitProduct;
            var handler = Function.createDelegate(this, this.kitCompositionChangedEventHandler);
            this.kitProduct.addCompositionChangedEventHandler(handler); //this.kitCompositionChangedEventHandler.bind(this));
            this.buildDisplay();
        }
        else {
            aspdnsf.Products.ProductController.addObserver(this);
        }
         var q = $('Quantity');
         var p = $('Priceholder');
         var st = $('spanSubtotal');
         if (st != null && st != 'undefined' && q != null && q != 'undefined' && p != null && p != 'undefined') { //IJR Veriodesign 2009.06.28
            if (this.qty.tagName == "INPUT"){
                this.qty.observe('keyup', function(event){
                   if (isNaN(p.value) || isNaN(q.value)) {return;}
                   var pq = Math.round(p.value * q.value * 100) / 100;
                   st.innerHTML = (pq).localeFormat('c');
                });
            } 
            else {
                this.qty.observe('change', function(event){
                   if (isNaN(p.value) || isNaN(q.value)) {return;}
                   var pq = Math.round(p.value * q.value * 100) / 100;
                   st.innerHTML = (pq).localeFormat('c');
                });
            }
         }
    },
    
    notify : function(product) {
        if(product.getId() == this.id) {
            this.setKitProduct(product);
        }
    },
    
    kitCompositionChangedEventHandler : function() {
        this.buildDisplay();
    },
    
    buildDisplay : function() {
        this.lblPrice.innerHTML = '';

        if( this.kitProduct.getHasVat() &&
            this.kitProduct.getVatSetting() == aspdnsf.Constants.VAT_SETTING_INCLUSIVE ) {
            
            var lblPriceLabel = document.createElement('SPAN');
            lblPriceLabel.innerHTML = aspdnsf.StringResource.getString('is_showproduct.aspx.47');
            this.lblPrice.appendChild(lblPriceLabel);
            
            var lblPriceValue = document.createElement('SPAN');
            lblPriceValue.innerHTML = '<i>' + aspdnsf.StringResource.getString('is_showproduct.aspx.72') + '<i>';
            this.lblPrice.appendChild(lblPriceValue);
            
            var params = "ItemCode=" + this.kitProduct.getItemCode() + "&ItemType=" + this.kitProduct.getItemType() + "&UMCode=" + this.kitProduct.getUnitMeasure() + "&KitItems=" + this.kitProduct.getComposition();
            
            var delUpdatePrice = function(price){
                lblPriceValue.innerHTML = price.localeFormat('c') + ' ' + aspdnsf.StringResource.getString('is_showproduct.aspx.57');
            };
            lblPriceValue.innerHTML +=  ('&nbsp;' + this.priceQualifier).replace('$','$ '); ///IJR Veriodesign 2008.12.17     
            var service = new ActionService();
            service.GetItemPrice(this.kitProduct.getItemCode(), 
                            this.kitProduct.getItemType(),
                            this.kitProduct.getUnitMeasure(),
                            this.kitProduct.getComposition().toString(),
                            delUpdatePrice);
        }
        else {
            var kitPrice = this.kitProduct.getKitPrice();
            var ph = $('Priceholder');
            ph.value = kitPrice; //IJR Veriodesign 2009.06.28
            var lblPriceValue = document.createElement('SPAN');
            lblPriceValue.innerHTML = aspdnsf.StringResource.getString('is_showproduct.aspx.47') + ' ' + kitPrice.localeFormat('c').replace('$','$ '); //aspdnsf.CurrencyFormatter.format(kitPrice);
            lblPriceValue.innerHTML +=  ('&nbsp;' + this.priceQualifier); ///IJR Veriodesign 2008.12.17     
            this.lblPrice.appendChild(lblPriceValue);
            
            if(this.kitProduct.getHasVat()) {
                var lblVat = document.createElement('SPAN');
                lblVat.innerHTML = '&nbsp;' + aspdnsf.StringResource.getString('is_showproduct.aspx.56');
                lblVat.className = 'VATLabel';
                this.lblPrice.appendChild(lblVat);
            }
        }
        //IJR Veriodesign 2009.05.21 hack to support second (dynamic) price display on single page
        if (this.lblPrice2) {
            //IJR 2009.11.14
            var listPrice = this.kitProduct.getKitListPrice();
            if (kitPrice != listPrice){
                this.lblPrice2.innerHTML = aspdnsf.StringResource.getString('is_showproduct.aspx.47') + ' <span style="text-decoration:line-through;">' + listPrice.localeFormat('c').replace('$','$ ') + '&nbsp;' + this.priceQualifier.replace('&nbsp;(As Shown)', '') + '</span>';
                this.lblPrice2.innerHTML += '<br><span style="color:red;">SALE:&nbsp;' + kitPrice.localeFormat('c').replace('$','$ ') + '&nbsp;' + this.priceQualifier.replace('&nbsp;(As Shown)', '') + '</span>';
            } else {
                this.lblPrice2.innerHTML = this.lblPrice.innerHTML.replace('&nbsp;(As Shown)', '');  
            }
        }
        var st = $('spanSubtotal');
        var q = $('Quantity');
        if (st != null && st != 'undefined' && q != null && q != 'undefined') { //IJR Veriodesign 2009.06.28
          var pq = Math.round(kitPrice * q.value * 100) / 100;
          st.innerHTML = (pq).localeFormat('c').replace('$','$ ');
       }
       //IJR Veriodesign 2009.07.21
       if (this.kitProduct.assemblyControl) {
         var blingPrice = this.kitProduct.getKitPrice_Bling();
         var stringBling = blingPrice.localeFormat('c');
         if (blingPrice == 0) {
            this.kitProduct.assemblyControl.setPrice(blingPrice);
         } else {
            stringBling +=  ('&nbsp;' + this.priceQualifier);
            this.kitProduct.assemblyControl.setPrice(stringBling);
         }         
       }
    }
    
}

aspdnsf.Products.KitDetailsControl = function(id) {
    this.id = id;
    
    this.lnkHeader = $getElement('lnkKitDetailHeader_' + id);
    this.lnkHeader.onclick = Function.createDelegate(this, this.onHeaderLinkClicked); //this.onHeaderLinkClicked.bind(this);
    
    this.pnlDetails = $getElement('pnlKitDetails_' + id);
    this.pnlDetailsMain = $('pnlKitDetailsMain_' + id); //IJR 2008.2.27
    
    this.kitProduct = null;
}
aspdnsf.Products.KitDetailsControl.registerClass('aspdnsf.Products.KitDetailsControl');
aspdnsf.Products.KitDetailsControl.prototype = {

    setKitProduct : function(kitProduct) {
        this.kitProduct = kitProduct;
        var handler = Function.createDelegate(this, this.kitCompositionChangedEventHandler);
        this.kitProduct.addCompositionChangedEventHandler(handler); //this.kitCompositionChangedEventHandler.bind(this));
        this.buildDisplay();
    },
    
    onHeaderLinkClicked : function() {
        if(this.pnlDetails.style.display == "") {
            this.lnkHeader.innerHTML = aspdnsf.StringResource.getString('is_showproduct.aspx.45');
            this.pnlDetails.style.display = "none";
        }
        else {
            this.lnkHeader.innerHTML = aspdnsf.StringResource.getString('is_showproduct.aspx.46');
            this.pnlDetails.style.display = "";
        }
    },
    
    kitCompositionChangedEventHandler : function() {
        this.buildDisplay();
    },
    
    buildDisplay : function() {
        //IJR 2008.2.22 exclude group from display if its id is stored in hidden field
        this.pnlDetails.innerHTML = '';
        
        var ul = document.createElement('ul');
        this.pnlDetails.appendChild(ul);
        
        var kitGroups = this.kitProduct.getGroups();
        var arrExclusions = []; 
        if (document.getElementById('KitDisplayExclusions')) {
				arrExclusions = document.getElementById('KitDisplayExclusions').value.split(',');
			}
		  var lictr = 0;
        for(var gctr=0; gctr<kitGroups.length; gctr++) {
            var currentGroup = kitGroups[gctr];                
            var items = currentGroup.getSelectedItems();
            var isExclude = false;
            for(var exctr=0; exctr<arrExclusions.length; exctr++) {
					if (currentGroup.id == arrExclusions[exctr]) {
						isExclude = true;
						break;
					}
            }
            if (isExclude == false) {
               for(var ictr=0; ictr<items.length; ictr++) {
                   var item = items[ictr];
                   var li = document.createElement('li');
                   li.innerHTML = item.getName();                   
                   ul.appendChild(li);
                   lictr++;
               }
            }
        }
        if (lictr == 0) {
			 this.pnlDetailsMain.style.display = 'none';
        }
    }
}

aspdnsf.Products.KitSideBarControl = function() {
    this.placeHolder = $getElement('KitPlaceHolder');
    this.sideBar = $getElement('KitSideBar');    
    
    this.vOffset = 10;
    this.hOffset = 10;
}

function floatKitSideBar() {
    var placeHolder = $getElement('KitPlaceHolder');
    var sideBar = $getElement('KitSideBar');
    
    var vOffset = 10;
    var hOffset = 10;

    var py = 0;
    var px = 0;
    var mv = 0;
    
    var pageY = 0;
    pageY = (document.body.scrollTop > 0) ? document.body.scrollTop : pageY;
    pageY = (document.documentElement.scrollTop > 0) ? document.documentElement.scrollTop : pageY;     
    
    // requires aspnet client components
    var phY = WebForm_GetElementPosition(placeHolder).y;
    
    if(pageY < phY) {
        py = phY;
    }
    else {
        py = pageY + vOffset;
        mv = ( py + sideBar.offsetTop) / 2;            
    }
    
    mv = Math.abs(py - sideBar.offsetTop) / 2;
    mv = mv > 1 ? mv : 0;
    
    sideBar.style.top = (py + mv) + px;
    
    /*********************************/
    var mm = $getElement('KitPlaceHolder');
    if($getElement('KitPlaceHolder') == null) {
        return;
    }
    
    var my = 0;
    my = (document.body.scrollTop > 0) ? document.body.scrollTop : my;
    my = (document.documentElement.scrollTop > 0) ? document.documentElement.scrollTop : my;
    var mmy = WebForm_GetElementPosition(mm).y;

    var sideBar = $getElement("KitSideBar");
    
    if (my < mmy) {
        my = mmy;
    }      
    else {
        my = my + 10;
        mv = (my + sideBar.offsetTop) / 2;
    }
    
    var mv = Math.abs(my - sideBar.offsetTop) / 2;
    mv = mv > 1 ? mv : 0;
    
    sideBar.style.top = (my + mv) + "px";

    var dw = 0;
    dw = (document.body.clientWidth > 0) ? document.body.clientWidth : dw;
    dw = (document.documentElement.clientWidth > 0) ? document.documentElement.clientWidth : dw;

    var hx = WebForm_GetElementPosition(mm).x;
    var sw = WebForm_GetElementPosition(sideBar).width;
    var bx =  (dw - (sw + 10));
    
    if(bx > hx) {
        sideBar.style.left = hx + "px";
    }
    else {
        sideBar.style.left = bx + "px";
    }        

    setTimeout("floatKitSideBar()", 50);
}

//Sys.Application.add_load(floatKitSideBar);