﻿var WG = {
    BasePath: '',
    ServicePath: '/masterfiles/webservices',
    QuickOrderForm: {
        MultiplesInUse: [{ Value: 0, Description: ''}], AvailablePricing: [], AvailableBins: [], MAX_DDL_QTY_OPTS: 5,
        Price: {
            Calculate: function(i, ref, dotnet) {
                var ddlQuantity = jQuery(ref).find(dotnet ? 'select[id$="ddlQuantity"]' : '#ddlQuantity');
                if (jQuery(ddlQuantity).length > 0) {
                    var total = 0, m1 = 0, m2 = 0; // m1,m2 used for base rate * multiples
                    var selectedQuantity = jQuery(ddlQuantity).val();
                    if ('+' != selectedQuantity) {
                        jQuery(ref).find(dotnet ? 'input[id$="txtQuantity"]' : 'input#txtQuantity').val('0');
                        jQuery(ref).find(dotnet ? 'span[id$="lblCalculatedMulti"]' : 'span#lblCalculatedMulti').html('');
                        jQuery(ref).find(dotnet ? 'div[id$="pnlAddlQuantityContainer"]' : 'div#pnlAddlQuantityContainer').css('display', 'none');
                    }
                    else // more than 5+ requested, init text entry for quantity
                        jQuery(ref).find(dotnet ? 'div[id$="pnlAddlQuantityContainer"]' : 'div#pnlAddlQuantityContainer').css('display', 'block');

                    // either a valid multiple was selected from the dropdownlist or the free-entry multiple
                    // box value has changed, thus, we need to take that entered number times the current multiple
                    if ('+' == selectedQuantity)
                        selectedQuantity = parseInt(jQuery(ref).find(dotnet ? 'input[id$="txtQuantity"]' : 'input#txtQuantity').val());
                    // if the unit of measure is a case, then we need to take the base price times the quantity only.
                    // otherwise, we take the price per plants times the number of plants in a multi
                    m1 = parseInt(selectedQuantity) * parseInt(WG.QuickOrderForm.MultiplesInUse[i].Value);
                    if ('case' == WG.QuickOrderForm.MultiplesInUse[i].Description.toLowerCase()) m1 = parseInt(selectedQuantity);
                    m2 = this.BaseRate(i, m1); total = m1 * m2;
                    jQuery(ref).find(dotnet ? 'span[id$="lblPrice"]' : 'span#lblPrice').html('$ ' + formatNumber(total, 2, true));

                    if (!dotnet)
                        WG.QuickOrderForm.Quantity.Set(ref);
                }
            },
            BaseRate: function(i, val) {
                val = parseInt(val);
                var pricing = WG.QuickOrderForm.AvailablePricing[i];
                for (var p = 0; p < pricing.length; p++) {
                    if (val >= pricing[p].QuantityFrom && val <= pricing[p].QuantityTo)
                        return pricing[p].Value;
                }
                return 0;
            },
            Adjust: function(i, obj, dotnet) {
                var ref = jQuery(obj).parents(dotnet ? 'tr[id$="trCartRow"]' : 'div.item-control-container');
                WG.QuickOrderForm.Price.Calculate(i, ref, dotnet);
                var plants = formatNumber((jQuery(obj).val() * WG.QuickOrderForm.MultiplesInUse[i].Value), 0, true);
                var html = 'unit' + (parseInt(jQuery(obj).val()) > 1 ? 's' : '') + '/' + plants + ' plants';
                jQuery(obj).next(dotnet ? 'span[id$="lblCalculatedMulti"]' : '#lblCalculatedMulti').html(html);
            }
        },

        Quantity: {
            Display: function(ControlIndex, Key, ref, val) {
                var Bins = WG.QuickOrderForm.AvailableBins[ControlIndex];
                for (a = 0; a < Bins.length; a++) {
                    if (Bins[a].Key == Key) {
                        for (b = 0; b < Bins[a].Bins.length; b++) {
                            var bin = Bins[a].Bins[b];
                            if (bin.Id == val) {
                                var quantityAvail = formatNumber(bin.QuantityOnHand, 0, true);
                                jQuery(ref).find('span#lblQuantityAvailable').html('(' + quantityAvail + ' plants available)');
                                return quantityAvail;
                            }
                            //console.log('Control: ' + ControlIndex + ': array(' + a + ') ' + Bins[a].Key + ' - ' + bin.Key);
                        }
                        break; // found unique bin for scoped plant
                    }
                }
                jQuery(ref).find('span#lblQuantityAvailable').html('');
                return 0;
            },
            Enable: function(ctrl) {
                var ddl = jQuery(ctrl).find('select#ddlQuantity');
                if (jQuery(ddl).find('option:first').val() == '0')
                    jQuery(ddl).find('option:first').remove();
                jQuery(ddl).val(1).removeAttr('disabled').trigger('change');
            },
            // disables quantity dropdownlist, supresses addl quantity box, places subtotal to 0, and resets 
            // any hidden quantity fields
            Disable: function(ctrl) {
                var ddlQuantity = jQuery(ctrl).find('select#ddlQuantity');
                var txtQuantity = jQuery(ctrl).find('input#txtQuantity');
                var hdnQuantity = jQuery(ctrl).find('input#hdnQuantity');
                var ddlAvailability = jQuery(ctrl).find('select[id$=ddlAvailability]');

                WG.QuickOrderForm.ToggleDefaultDdlItem({ ddl: jQuery(ddlQuantity), state: true });

                // if we have only one acceptable availability then this control won't have any options, make sure not to disable
                // it's accompanying quantity, just reset it
                if (jQuery(ddlAvailability).find('option').length > 0)
                    jQuery(ddlQuantity).val(0).attr('disabled', 'disabled');

                jQuery(txtQuantity, hdnQuantity).val('0'); jQuery('div[id$="pnlAddlQuantityContainer"]').css({ 'display': 'none' });
                jQuery(ctrl).find('span#lblPrice').html('$ 0.00');
            },
            Get: function(ref) {
                var ddlQuantity = jQuery(ref).find('select#ddlQuantity');
                var txtQuantity = jQuery(ref).find('input#txtQuantity');
                if (jQuery(ddlQuantity).val() > 0 && jQuery(ddlQuantity).val() != '+')
                    return jQuery(ddlQuantity).val();
                else if (parseInt(jQuery.trim(jQuery(txtQuantity).val())) > 0 && jQuery(ddlQuantity).val() == '+')
                    return parseInt(jQuery.trim(jQuery(txtQuantity).val()));
                return 0;
            },
            Set: function(ref) {
                var value = WG.QuickOrderForm.Quantity.Get(ref);
                jQuery(ref).find('input#hdnQuantity').val(value);
            }
        },
        RequestedShipDateAlt: {
            Enable: function(ctrl) {
                var txt = jQuery(ctrl).find('input[id^=txtRequestedShipDateAlt]');
                var hdn = jQuery(ctrl).find('input#hdnRequestedShipDateAlt');
                jQuery(txt).val('').removeAttr('disabled'); jQuery(hdn).val('');
            },
            // disables alternate request shipdate dropdownlist, supresses addl quantity box, places subtotal to 0, and resets 
            // any hidden quantity fields
            Disable: function(ctrl) {
                var txt = jQuery(ctrl).find('input[id^=txtRequestedShipDateAlt]');
                var hdn = jQuery(ctrl).find('input#hdnRequestedShipDateAlt');
                jQuery(txt).val('').attr('disabled', 'disabled'); jQuery(hdn).val('');
            }
        },

        Controls: {
            NewRow: function(i, obj) {
                if (i > 10) jQuery(obj).parents('div.quick-order-items').next('div.quick-order-items').find('table:first').show();
            },
            NewRowNeeded: function() {
                jQuery('table[id$="tblQuickOrderItem"]').each(function(index) {
                    // iterate and find the first hidden table, we'll use this index as a reference to which
                    // row we will forcefully unhide next
                    if (jQuery(this).is(':hidden') && index > 0) {
                        WG.QuickOrderForm.Controls.NewRow(0, jQuery('table[id$="tblQuickOrderItem"]:eq(' + (index - 1) + ')'));
                        return false;
                    }
                });
            },
            RemoveRow: function(obj) {
                var subsChildren = jQuery(obj).parents('div.quick-order-items').find('#item-substitution-container').children().length;
                var ref = jQuery(obj).parents('div#item-container');
                var nextRef = jQuery(obj).parents('div.quick-order-items').next('div.quick-order-items');
                if (ref.length > 0) {
                    if (subsChildren > 0) {
                        jQuery(ref).prev('div#item-number-container').empty(); // empty just main item, leaving subs
                        jQuery(ref).empty();
                    }
                    else {
                        jQuery(ref).parents('div.quick-order-items').empty(); // empty all
                        if (nextRef.length == 1) {
                            WG.QuickOrderForm.Controls.NewRowNeeded(); jQuery(nextRef).find('input#txtItemNumber').focus();
                        }
                    }
                }
                else {
                    ref = jQuery(obj).parents('div#item-substitution-container');
                    if (subsChildren == 2) // if one item + header, then just remove all children
                    {
                        jQuery(ref).empty();
                        if (nextRef.length == 1) {
                            WG.QuickOrderForm.Controls.NewRowNeeded(); jQuery(nextRef).find('input#txtItemNumber').focus();
                        }
                    }
                    else // else multiple substitution items exist, just delete the single entity
                        jQuery(obj).parents('div[id^="item-substitution-container-"]').remove();
                }
            },
            SuppressRows: function(obj) {
                var scrollToView = false;
                jQuery('div.quick-order-items').each(function(index) {
                    if (jQuery(this).find('#item-container, #item-substitution-container').children().length > 0) {
                        jQuery(this).find('img#imgNoToAll').remove();
                        jQuery(this).find('table:first').css('border', '0px none');

                        var mainChild = jQuery(this).find('#item-container');
                        var subsChildren = jQuery(this).find('#item-substitution-container').children();
                        if (subsChildren.length > 0) {
                            jQuery.each(subsChildren, function() {
                                var hdnQuantity = jQuery(this).find('input#hdnQuantity');
                                // all children will have the quantity field with the exception of the substitution header
                                if (hdnQuantity.length > 0 && parseInt(jQuery(hdnQuantity).val()) == 0)
                                    jQuery(this).remove();
                            });
                            jQuery(this).find('#item-substitution-container #substitutions-header').remove();
                        }
                        var soldOut = parseInt(jQuery(mainChild).find('input#hdnStatusOfAvailability').val()) == GP.Item.StatusOfAvailability.SoldOut;
                        if (soldOut && parseInt(jQuery(mainChild).find('input#hdnQuantity').val()) == 0) {
                            jQuery(mainChild).empty(); jQuery(this).find('#item-number-container:first').remove();
                        }
                        // finally, if all items have been ignored and no children exist, then remove the whole item
                        if (jQuery(this).find('#item-container, #item-substitution-container').children().length == 0)
                            jQuery(this).remove();
                    }
                });
            }
        },

        Queue: {
            Loading: [], // {index, ref, itemNumber}
            Exists: function(index, ref) {
                for (var i = 0; i < WG.QuickOrderForm.Queue.Loading.length; i++) {
                    var queue = WG.QuickOrderForm.Queue.Loading[i];
                    if (queue.index == index && queue.itemNumber == jQuery.trim(jQuery(ref).val()))
                        return true;
                }
                return false;
            },
            Add: function(index, ref) {
                if (!WG.QuickOrderForm.Queue.Exists(index, ref))
                    WG.QuickOrderForm.Queue.Loading.push({ 'index': index, 'ref': jQuery(ref), 'itemNumber': jQuery.trim(jQuery(ref).val()) });
            },
            Remove: function(index) {
                for (var i = 0; i < WG.QuickOrderForm.Queue.Loading.length; i++) {
                    if (WG.QuickOrderForm.Queue.Loading[i].index == index)
                        WG.QuickOrderForm.Queue.Loading.splice(i, 1);
                }
            }
        },

        Cache: {
            Loading: [], // {index, ref, itemNumber}
            Exists: function(i, ref) {
                for (var i = 0; i < WG.QuickOrderForm.Cache.Loaded.length; i++) {
                    var cache = WG.QuickOrderForm.Cache.Loaded[i];
                    if (cache.index == i && cache.valueLoaded != jQuery.trim(jQuery(ref).val())) {
                        WG.QuickOrderForm.Cache.Loaded[i].valueLoaded = jQuery.trim(jQuery(ref).val());
                        return false;
                    }
                }
                return true;
            }
        },
        ResetControls: function(i) {
            var ctrl = WG.QuickOrderForm.Controls[i];
            if (ctrl) {
                docObj(ctrl.ddlQuantity).disabled = false;
                docObj(ctrl.pnlItemContainer).style.display = docObj(ctrl.pnlAddlQuantityContainer).style.display = 'none';
                docObj(ctrl.pnlDescription).innerHTML = ''; docObj(ctrl.ddlQuantity).options.length = 0;
                docObj(ctrl.hdnPlantId).value = docObj(ctrl.txtQuantity).value = docObj(ctrl.hdnRequestedShipDateAlt).value = '';
                docObj(ctrl.lblNotice).innerHTML = ''; docObj(ctrl.lblNotice).className = '';
                docObj(ctrl.lblQuantityAvailable).innerHTML = '';
                docObj(ctrl.divDisclaimer).style.display = 'none'; docObj(ctrl.divDisclaimer).innerHTML = '';
                docObj(ctrl.hdnStatusOfAvailability).value = '4';
                if (docObj(ctrl.chkReInstate))
                    docObj(ctrl.chkReInstate).checked = false;
            }
        },
        BindQuantityList: function(index, obj) {
            var text, multi = WG.QuickOrderForm.MultiplesInUse[index].Value;
            jQuery(obj).empty();
            for (var i = 1; i <= WG.QuickOrderForm.MAX_DDL_QTY_OPTS; i++) {
                text = (i * multi) + ' plants/' + i + ' unit' + (i > 1 ? 's' : '');
                jQuery(obj).append(jQuery("<option />").attr('value', i).text(text));
            }
            jQuery(obj).append(jQuery("<option />").attr('value', '+').text('+ More than 5 units'));
            if (this.IsSubstituteItem(obj))
                jQuery('<option value="0">--</option>').prependTo(jQuery(obj));
            jQuery(obj).val(0); //.find('option:first').attr('selected','selected');
        },
        ParseSelectedSizeList: function(Sizes, Key) {
            for (var i = 0; i < Sizes.length; i++)
            { if (Sizes[i].GPKey == Key.SizeId) { return Sizes[i]; } }
            return false;
        },
        FindUofMIndexUsed: function(Details, SelectedSize) {
            for (var i = 0; i < Details.length; i++) {
                if (Details[i].Key.UofMScheduleKey.Id == SelectedSize.Multiples
                                && Details[i].UofM.toUpperCase() == 'EACH')
                    return i;
            }
            return 0;
        },


        Reinstate: {
            Toggle: function(containerIndex, obj) {
                var mainRef = jQuery('div#item-container-' + containerIndex);
                var subRefs = jQuery('div[id^="item-substitution-container-' + containerIndex + '-"]');
                var type = jQuery(obj).attr('type'); var chkState = true;
                var ddlMain = jQuery(mainRef).find('select[id$=ddlQuantity]');

                if ('checkbox' == type) {
                    if (jQuery(obj).is(':checked')) {
                        jQuery(ddlMain).removeAttr('disabled');
                        chkState = false;
                        jQuery.each(subRefs, function() {
                            jQuery(this).find('select[id$=ddlQuantity]').val(0).attr('disabled', 'disabled');
                        });
                        jQuery(mainRef).find('img#imgThumb, div#pnlDescription, div#pnlItemContainer tr:first td')
                            .each(function() { jQuery(this).fadeTo(250, 1); });
                    }
                    else {
                        jQuery(ddlMain).attr('disabled', 'disabled');
                        jQuery.each(subRefs, function() {
                            jQuery(this).find('select[id$=ddlQuantity]').removeAttr('disabled');
                        });
                        jQuery(mainRef).find('img#imgThumb, div#pnlDescription, div#pnlItemContainer tr:first td')
                            .each(function() { jQuery(this).fadeTo(250, 0.75); });
                    }
                }
                else {
                    // disable quantity
                    jQuery(ddlMain).attr('disabled', 'disabled');
                    // uncheck reinstate (if present)
                    jQuery(mainRef).find('input#chkReInstate').removeAttr('checked');
                    // unselect bin and alt ship date (if present)
                    jQuery(mainRef).find('select#ddlAvailability').val('');
                    jQuery(mainRef).find('select#ddlAvailability').trigger('change');

                    jQuery.each(subRefs, function() { jQuery(this).removeAttr('disabled'); });
                }

                WG.QuickOrderForm.ToggleDefaultDdlItem({ ddl: ddlMain, state: chkState });
                jQuery(ddlMain).val(0); jQuery(mainRef).find('input#hdnIsReinstate').val(chkState ? 0 : 1);
                WG.QuickOrderForm.Price.Calculate(containerIndex, mainRef);
                jQuery.each(subRefs, function() { WG.QuickOrderForm.Price.Calculate(containerIndex, jQuery(this)); })
            }
        },

        Notice: {
            Availability: function(args) {
                jQuery(args.ctrl).find('span#lblNotice')
                            .html('<div class="message">' + args.msg + '</div><div class="arrow"></div>')
                            .addClass('item_message');
                if (args.status != 1) {
                    var ddlQuantity = jQuery(args.ctrl).find('select#ddlQuantity');
                    jQuery(ddlQuantity).val(0).attr('disabled', 'disabled');
                    jQuery(args.ctrl).find('span#lblPrice').html('N/A');
                    WG.QuickOrderForm.Quantity.Disable(args.ctrl, true);
                    WG.QuickOrderForm.ToggleDefaultDdlItem({ ddl: ddlQuantity, state: true });
                }
            },
            Error: function(args) {
                // in case of a system error, display an appropriate message to the user. If this is a single "add-to-cart"
                // form, then allow a "retry" link to re-send the web service.. otherwise the user must take a different action
                var msg = "Plant data could not be retrieved at this time.";
                if (!args.multiform) {
                    var js = "FindPlantByPartialGreatPlainsId('" + args.msg + "','" + jQuery('select[id$="ddlSize"]').val() + "');";
                    msg += "<a href=\"javascript:" + js + ">Please try again</a>";
                }
                jQuery(args.ctrl).find('span#lblNotice')
                            .html('<div class="message">' + msg + '</div><div class="arrow"></div>')
                            .addClass('item_message');

                WG.QuickOrderForm.Quantity.Disable(args.ctrl, true);
            },
            Worker: function(args) {
                var id = 'axload-' + args.index;
                var path = WG.BasePath.replace('http:', location.protocol);
                var str = '&nbsp; <img src="' + path + '/images/forms/ajax-loader.gif" align="absmiddle"/>&nbsp; Loading, please wait...';
                if (args.load) {
                    if (jQuery('#' + id).length == 1) jQuery('#' + id).remove();
                    if (jQuery(args.ctrl).parents('td').find('#item-container').length > 0)
                        jQuery(args.ctrl).parents('td').find('#item-container').append('<span id="' + id + '" style="margin:7px 0 0 35px;width:250px;display:block;float:left">' + str + '</span>');
                    else
                        jQuery('#loader').append('<span id="' + id + '">' + str + '</span>');
                }
                else {
                    if (!args.error) { jQuery('span#' + id).remove(); }
                    else {
                        var str = '<img src="' + path + '/images/forms/ajax-loader.gif" style=\"visibility:hidden;height:32px;width:15px\" align="absmiddle"/>';
                        jQuery('span#' + id).html(str + args.error);
                    }
                }
            }
        },
        RemoveItem: function(i) {
            this.ResetControls(i);

            var ctrl = WG.QuickOrderForm.Controls[i];
            docObj(ctrl.txtItemNumber).value = '';
        },
        IsSubstituteItem: function(ref) {
            return (jQuery(ref).attr('id') == 'item-substitution-container' || jQuery(ref).parents('div#item-substitution-container').length > 0)
        },
        ToggleDefaultDdlItem: function(obj) {
            if (obj.state) {
                jQuery(obj.ddl).each(function(index) {
                    if (jQuery(this).attr('id').match(/Quantity/g)) {
                        if (jQuery(this).find('option[value="0"]').length == 0)
                            jQuery('<option value="0">-- </option>').prependTo(jQuery(this));
                        jQuery(this).val('0');
                    }
                    else if (jQuery(this).attr('id').match(/Availability/g))
                        jQuery(this).val(''); // default, empty
                });
            }
            else {
                jQuery(obj.ddl).each(function(index) {
                    if (jQuery(this).attr('id').match(/Quantity/g))
                        jQuery(this).find('option:first').remove();
                });
            }
        },
        HasValidSelection: function(obj) {
            var mainRef = jQuery('div#item-container');
            var subRef = jQuery('div#item-substitution-container .item-control-container');
            var returnVal = false;
            jQuery(mainRef).find('div#pnlItemContainer').each(function(index) {
                if (WG.QuickOrderForm.Quantity.Get(jQuery(this)) > 0) {
                    var hdnBin = jQuery(mainRef).find('#hdnBin');
                    var trRequestedShipDateAlt = jQuery(mainRef).find('#trRequestedShipDateAlt');
                    var hdnRequestedShipDateAlt = jQuery(mainRef).find('#hdnRequestedShipDateAlt');
                    var chkReinstate = jQuery(mainRef).find('#chkReInstate');

                    if (jQuery(chkReinstate).is(':checked')) {
                        // if this plant is to be reinstated (and is checked)
                        returnVal = true; return false;
                    }
                    else if (jQuery(hdnBin).val().length > 0 && jQuery(trRequestedShipDateAlt).is(':visible') && jQuery(hdnRequestedShipDateAlt).val().length > 0) {
                        // if an alternate bin was selected.. and ship date was required, and a value is present
                        returnVal = true; return false;
                    }
                    else if (jQuery(hdnBin).val().length > 0 && !jQuery(trRequestedShipDateAlt).is(':visible')) {
                        // if the auto-selected bin value within the global ship date
                        returnVal = true; return false;
                    }
                }
            });
            if (returnVal)
                return returnVal;
            else {
                jQuery(subRef).each(function(index) {
                    if (WG.QuickOrderForm.Quantity.Get(jQuery(this)) > 0) {
                        var hdnBin = jQuery(this).find('#hdnBin');
                        if (jQuery(hdnBin).val().length > 0) {
                            returnVal = true;
                            return false;
                        }
                    }
                });
            }
            return returnVal;
        },
        ProcessingItems: function(replacement) {
            var path = WG.BasePath.replace('http:', location.protocol);
            var str = '<div style="padding: 15px 30px 30px 30px"><img src="' + path + '/images/forms/ajax-loader.gif" style="float:left;margin-top:-2px"/>';
            str += '&nbsp; Please wait...<br /> &nbsp; We are validating your plant selections and adding them to your order.</div>';
            WG.Dialog.Create(str);
            WG.Dialog.ToggleOverlay(true);
            setTimeout('WG.QuickOrderForm.StillProcessingItems()', 7500);
        },
        StillProcessingItems: function() {
            if (docObj('on_the_fly_dialog')) {
                var str = docObj('on_the_fly_dialog').innerHTML;
                docObj('on_the_fly_dialog').innerHTML = str.replace('Please wait', 'Still processing, please be patient');
            }
        }
    },


    Dialog: {
        Create: function(str) {
            if (!docObj('on_the_fly_dialog')) {
                var div = document.createElement('div');
                div.id = 'on_the_fly_dialog'; div.className = 'dialog';
                document.body.appendChild(div);
            }
            var obj = docObj('on_the_fly_dialog');
            obj.innerHTML = str; obj.className = 'dialog_up';
            var path = WG.BasePath.replace('http:', location.protocol);
            obj.style.backgroundImage = "url('" + path + "/images/layout/dialog-inner-shadow.gif')"
            //this.ToggleShadow(obj,true);
        },
        Close: function() {
            var arDiv = docObjs('div');
            for (i = 0; i < arDiv.length; i++) {
                if (arDiv[i].id && arDiv[i].id == 'on_the_fly_dialog') {
                    arDiv[i].className = 'dialog';
                    this.ToggleOverlay(false);
                    //this.ToggleShadow(arDiv[i],false);
                }
            }
        },
        ToggleOverlay: function(create) {
            if (create) {
                var overlay = document.createElement('div');
                overlay.id = 'shadow_overlay'; overlay.className = 'dialog_overlay';
                overlay.style.height = ((document.documentElement.offsetHeight || document.body.clientHeight) + 100) + 'px';
                document.body.insertBefore(overlay, document.body.firstChild);
            }
            else {
                if (docObj('shadow_overlay'))
                    document.body.removeChild(docObj('shadow_overlay'));
            }
        },
        ToggleShadow: function(obj, create) {
            var bid = '_dialog_shadow_box';
            var bclass = '_dialog_shadow_';
            if (create) {
                for (var i = 0; i < 4; i++) {
                    var div = document.createElement('div');
                    div.id = bid + i; div.className = bclass + i;
                    div.style.width = parseInt(obj.offsetWidth) - 2 + 'px';  // 2px offset.. not sure why
                    div.style.height = parseInt(obj.offsetHeight) - 2 + 'px'; // 2px offset.. not sure why
                    div.style.top = parseInt(obj.style.top) + (i + 1) + 'px';
                    div.style.left = findPos(obj).left + (i + 1) + 'px';
                    document.body.appendChild(div);
                }
            }
            else {
                for (var i = 0; i < 5; i++)
                { var obj = docObj(bid + i); if (obj) document.body.removeChild(obj); }
            }
        }
    },

    Copyright: function() { if (window.location.href.indexOf('192.168')) return; var d = new Date(); alert('©Walters Gardens, Inc. ' + d.getFullYear()); return false; }
}

/*************************************************************************************************/
/*************************************************************************************************/
/***
/*** Common/Shared Methods
/***
/*************************************************************************************************/
/*************************************************************************************************/

function docObj(id)   { return document.getElementById(id); }
function docObjs(tag) { return document.getElementsByTagName(tag); }
function dotNetObj(id,tag)
{
    if (!tag) tag = 'input';
        
    var arFld = docObjs(tag);
    if (id)
    {
        var serverCtrlName = id.replace(/_/g,'$');
        var regExId = new RegExp(id+"$", "i");

        for (var i = 0; i < arFld.length; i++)
        {
            if (arFld[i].id)
            {            
                if (arFld[i].id.match(regExId))
                    return arFld[i];
            }
            else if (arFld[i].name)
            {
                (arFld[i].name == serverCtrlName)
                    return arFld[i];
            }
        }
    }
    
    return false;
}
function findPos(obj) 
{
	var curleft = curtop = 0;
	if (obj.offsetParent)
	{
		curleft = obj.offsetLeft;
		curtop = obj.offsetTop;
		while (obj = obj.offsetParent)
		{
			curleft += obj.offsetLeft
			curtop  += obj.offsetTop
		}
	}
	return { left:parseInt(curleft), top:parseInt(curtop) };
}