/// <reference path="D:\SiteData\scripts\wsi.js"/>


/******************************************
*
*  Prototypes 
*
*******************************************/

if (typeof(Array.prototype.findAt) == "undefined")
{
    Array.prototype.findAt = function(needle, p_nStartLoc, p_cMatch, p_cExclusions){
     if (typeof(p_cMatch) == 'undefined') p_cMatch = 'exact';
     if (typeof(p_cExclusions) == 'undefined') p_cExclusions = '';

	    if (p_cExclusions.length > 0)
	    {
		    //	p_cExclusions = a string containing chars to remove from the search_string
		    //		before performing the compare. For example, to remove all instances
		    //		of "a', "b", and "c" p_cExclusions would equal "abc".
    		
		    var regExp = eval('/['+p_cExclusions+']/g');
	    }
	    else
	    {
		    var regExp = null;
	    }
    	
     var i = p_nStartLoc;

     if (p_cMatch == 'exact'){
	    for (i=p_nStartLoc; i<this.length; i++)
	    {
		    var l_cSearch = this[i];
    		
		    if (regExp != null)
		    {
			    //alert(l_cSearch);
			    l_cSearch = l_cSearch.replace(regExp,"");
			    //alert(l_cSearch);
		    }
    		
		    if (l_cSearch != null)
		    {
			    if (l_cSearch == needle) break;
		    }
	    }
     }
     else if (p_cMatch == 'contains'){
	    for (i=0; i<this.length; i++){
		    if (this[i] != null){
			    var v_numtostr = this[i].toString()
			    if (v_numtostr.indexOf(needle) != -1) break;
		    }
	    }
     }
     else if (p_cMatch == 'containswhole'){
	    for (i=0; i<this.length; i++){
		    if (this[i] != null){
			    var v_numtostr = this[i].toString()
			    if (parseInt(needle) == parseInt(this[i])) break;
		    }
	    }
     }

     else if (p_cMatch == 'containsround'){
	    for (i=0; i<this.length; i++){
		    if (this[i] != null){
			    var v_numtostr = this[i].toString()
			    if (Math.round(parseFloat(needle)) == Math.round(parseFloat(this[i]))) break;
		    }
	    }
     }

     if (i==this.length){
	    i= -1;
     }
     return (i);
    }
}

/******************************************
*
*  General Classes, functions and Properties 
*
*******************************************/

 /// public variables
ProductSku = null;

// Root level namespace for this js file
Safemart = new Object();
SWH = new Object();

Safemart.Init = function()
{
    if (document.getElementById("CustomerCenterPage") != null)
    {
        /// Initialize the CustomerCenter
       //CustomerCenter = new Safemart.CustomerCenter();
       CustomerCenter.Login();
    }
    
    if (document.getElementById("MainProductData") != null)
    {
        Safemart.ProductPage = new Safemart.ProductPageHandler();
        ProductSku = Safemart.ProductPage.GetSku();
        Safemart.EnableCheckAvailability();

    }
    
    
}

Safemart.EnableCheckAvailability = function()
{
    if (document.getElementById("BreadCrumb") != null)
    {
        var BodyHTML = document.body.innerHTML;
        var BreadCrumb = document.getElementById("BreadCrumb").innerHTML;
        if (BreadCrumb.match("Trade Products") && !BodyHTML.match("Availability: Out of Stock"))
        {
            document.getElementById("availcheck").style.display = "block";
        }
    }
}

SWH.RoundMoney = function(value)
{
    return Math.round(parseFloat(value)*100)/100
}

/// Converts a float value to a Money String
SWH.ToMoney = function(value,includeSign)
{

    if (typeof(includeSign) == "undefined")
    {
        includeSign = true;
    }
        
    // convert to string
    value = "" + value;
    
    if (value.indexOf(".") == -1)
    {
        value += ".00";
    }
    
    if (value.indexOf(".") < value.length - 3)
    {/// round to two decimals
        //value = Math.round(parseFloat(value)*100)/100
        
        value = Checkout.RoundMoney(value);
        
        /// Make the value a string again
        value = ""+value;
        
    }
       
    //alert(value + "  " + value.slice(-2,-1))
    if (value.slice(-2,-1) == ".")
    {/// second to last char is a . -- pad the value with zero.
        value += "0";
    }
   
    if (includeSign)
    {
        // add the $        
        value = "$" + value;
    }
        
    return value;
}

/******************************************
*
*  Constructor Classes for base safemart objects
*
*******************************************/
Safemart.Address = function()
{
/// <summary>Basic Address Constructor</summary>
/// <returns>Address Object</returns>
    this.InternalId = "";
    this.FirstName = "";
    this.LastName = "";
    this.Company = "";
    this.AddressLine1 = "";
    this.AddressLine2 = "";
    this.City = "";
    this.State = "";//"AL";
    this.Zip = "";
    this.Country = "";//"US";
    this.Phone = "";
    this.Type = ""; /// Shipping type for a purchase order
    this.Cost = 0; /// Shipping cost for a purchase order
    this.Memo = "";
    this.Raw = ""; /// The raw data string from the server.
    
    this.IsPhoneValid = function()
    {
        /// 99 9999 9999
        /// 999-999-9999
        /// +99 (9) 9 9999 9999
        /// (999) 999-9999
        /// 999-999-9999 ext9999
        /// 999-999-9999 ext 9999
        var _sPhoneReg = /^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,5})|(\(?\d{2,6}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( ext | ext)\d{1,5}){0,1}$/;
        
        var _oRegex = new RegExp(_sPhoneReg);
        var _bPassed = _oRegex.test(this.Phone);
        
        return _bPassed;
    }
    
    this.InvalidPhoneMsg = "Please enter a valid phone number";
}

Safemart.CreditCard = function()
{
    this.InternalId = "";
    this.Type = "Visa";
    this.NameOnCard = "";
    this.Number = "";
    this.ExpirationMonth = "";
    this.ExpirationYear = "";
    this.CVV2 = "";
}


Safemart.Item = function()
{
    this.Sku = "";
    this.Description = "";
    this.Rate = 0;
    this.Amount = 0;
}

Safemart.Transaction = function()
{
    var _xml = null;
    this.GetDate = function(){return _xml.getElementsByTagName("month")[0].firstChild.nodeValue;};
    this.OrderNumber = "";
    this.Total = "";
    this.Status = "";
    this.Items = new Array();
    
    this.AddItem = function(sku)
    {
        this.Items.push(new Safemart.Item());
        var _NewItem = this.Items[this.Items.length-1];
        _NewItem.Sku = sku;
        return _NewItem;
    }
    
    
    this.Xml = function(xml)
    {
        if (typeof(xml) != "undefined")
        {
            _xml = getDomAdapter().parseXml(xml);
            //alert(getDomAdapter().serialize(_xml));
        }
        //alert(this.GetDate());
        if (_xml != null)
        {
            return _xml;
        }
    }
}

Safemart.Transactions = function()
{
    this.SalesOrders = new Array();
    
    this.AddSalesOrder = function(xml)
    {
        this.SalesOrders.push(new Safemart.Transaction());
        var _xNewSalesOrder = this.SalesOrders[this.SalesOrders.length-1]
        _xNewSalesOrder.Xml(xml);
        
        return _xNewSalesOrder;
    }
    
    var _xml = null;
    
    this.Xml = function(xml)
    {
        if (typeof(xml) != "undefined")
        {
            _xml = getDomAdapter().parseXml(xml);
            
            var _xSalesOrder = _xml.getElementsByTagName("salesorder");
            
            for (var i=0; i < _xSalesOrder.length; i++)
            {
                this.AddSalesOrder(getDomAdapter().serialize(_xSalesOrder[i]));
            }
            
            //alert(getDomAdapter().serialize(_xml));
        }
        
        if (_xml != null)
        {
            return _xml;
        }
    }
}

Safemart.Person = function()
{
/// <summary>Base class for create a person</summery>
///<returns>Person Object</returns>
    this.SalesRep = "";
    //this.InternalID = "";
    var InternalID = "";
    this.SSN = "";
    this.Email = "";
    var HasAccount = null; /// a null = an unknown state
    this.Password = "";
    this.PassConfirm = "";
    this.Ship = new Safemart.Address();
    this.Bill = new Safemart.Address();
    this.Bill.SameAsShip = true;
    var _PaymentMethod = "";
    this.CreditCard = new Safemart.CreditCard();
    this.CreditCard.CardsOnFile = new Array();
    this.IP = "";
    this.InternalIP = false;
    
    /// <summary>Get or Set Internal NetSuite Id</summery>
    ///<param name="ID">(Optional) Set Internal NetSuite Id</param>
    ///<returns>Internal NetSuite Id</returns>
    this.InternalID = function(Id)
    {
        if (typeof(Id) != "undefined" && Id != null && Id.length > 0) InternalID = Id;
        return InternalID;
    }
    
    this.PaymentMethod = function(paymentMethod)
    {
        if (typeof(paymentMethod) != "undefined" && paymentMethod != null && paymentMethod.length > 0) _PaymentMethod = paymentMethod;
        return _PaymentMethod;
    }
    
    this.Transactions = new Safemart.Transactions();
    
    this.HasAccount = function(){return HasAccount};
    
    this.HasAccountCheckReturn = function(returnData)
    {
trace = "";

        if (returnData.toLowerCase() == "false")
        {
trace += "Account not found";
            HasAccount = false;
        }
        else
        {
trace += " return: " + returnData;        
trace += " ID: " + InternalID;
trace += " len: " + InternalID.length;
            HasAccount = true;

            if (returnData != "true" && InternalID.length == 0 && InternalID.indexOf("error") == -1)
            {
                
                InternalID = returnData;
            }
        }
//window.status = trace;        
    }
    
    
    var _sLoginReturn = null;
    this.LoginEventHandler = function(handler)
    {
        _sLoginReturn = handler;
    }
    
    this.login = function()
    {
    /// <summary>Login the person</summary>
    /// <param name="callBack">Call Back Function</param>
    /// <returns>void</returns>
    
    	document.getElementById("CheckoutNotificationCaption").innerHTML = "Customer Login";
	    document.getElementById("CheckoutNotificationMessage").innerHTML = "<br /><br /><center>Login in progress...</center><br /><br />";
        YAHOO.example.container.panel1.show();
       
        var SessionID = (wsi._Cookie.GetCrumb("SessionID") == null ? "" : wsi._Cookie.GetCrumb("SessionID"));
    
        var aParameters = new wsi._Parameters();
        aParameters.Add("sessionID",SessionID);
        aParameters.Add("email",this.Email);
        aParameters.Add("password",this.Password);
        
        wsi._Soap.AddCall("CustomerLogin", _sLoginReturn, aParameters);
    }
    
    this.LoginPrompt = function(loginProcesser)
    {
        var _sLoginScreen = '' +
                '<div id="substepAccount" class="basicContainer-Body" style="display: block;">'+
                '<table border="0" cellspacing="5px">'+
                   '<tr>'+
                        '<td colspan="2">'+
                            '<b>To login enter your email and password.</b>'+
                        '</td>'+
                    '</tr>'+
                    '<tr>'+
                        '<td>'+
                            'Email Address:'+
                            '<br />'+
                            '<input type="text" id="LoginPromptEmail" />'+
                            '<br />'+
                            'Password:'+
                            '<br />'+
                            '<input type="password" id="LoginPromptPassword" />'+
                            '<br />'+
                        '</td>'+
                        '<td>'+
                        '</td>'+
                    '</tr>'+
                    '<tr>'+
                       '<td style="color:red;">'+
                            '<div id="LoginPromptMessage" style="visibility:hidden;">Please enter both your email address and password<div>'+
                        '</td>'+
                        '<td align="right" valign="bottom">'+
                            '<input id="LoginPromptButtonClick" type="hidden" value="" />'+
	                        '<input type="button" onclick="document.getElementById(\'LoginPromptButtonClick\').value = \'Login\'; '+loginProcesser+';" value="Login" />'+
	                        '&nbsp;'+
                            '<input type="button" onclick="document.getElementById(\'LoginPromptButtonClick\').value = \'Cancel\'; '+loginProcesser+';" value="Cancel" />'+
                        '</td>'+
                    '</tr>'+
                '</table>'+
            '</div>';
            
        document.getElementById("CheckoutNotificationCaption").innerHTML = "Customer Login";
        document.getElementById("CheckoutNotificationMessage").innerHTML = _sLoginScreen;
        YAHOO.example.container.panel1.show();
    }
    
    this.LoginPromptCallback = function()
    {
        /// reset the failure message.
        document.getElementById("LoginPromptMessage").style.visibility = "hidden";
        
        if (document.getElementById("LoginPromptButtonClick").value == "Cancel")
        {
            alert("You must enter a valid Email and Password to access your account");
            YAHOO.example.container.panel1.hide();
        }
        else
        {
            var _sEmail = document.getElementById("LoginPromptEmail").value;
            var _sPassword = document.getElementById("LoginPromptPassword").value;

            if(_sEmail.length > 0 && _sPassword.length > 0)
            {
                this.Email = _sEmail;
                this.Password = _sPassword;
                YAHOO.example.container.panel1.hide();
                
                this.login();
            }
            else
            {
                document.getElementById("LoginPromptMessage").style.visibility = "visible";
            }
        }
    }
    this.LoginCallback = function(returnData)
    {
        
        if (returnData.substring(0,5) == "error")
        {
            //document.getElementById("LoginMessage").innerHTML = returnData.substring(7);
            //document.getElementById("LoginMessage").style.color = "Red";
            
        }
        else
        {
       
            //document.getElementById("substepLogin").style.display = "none";
            //Checkout.ShowStep(Checkout.Steps[1]);
              
            var Rows = returnData.split("||");
            
            for(var iRow=0; iRow<Rows.length; iRow++)
            {
                var Fields = Rows[iRow].split("|");
                
                if (Rows[iRow].indexOf("Customer|") > -1)
                {
                    for (var iFields=0; iFields<Fields.length; iFields++)
                    {
                        var Values = Fields[iFields].split("=");
                        switch(Values[0])
                        {
                            case "InternalId":
                                this.InternalID = Values[1];
                                break;
                               
                            case "FirstName":
                                this.Ship.FirstName = Values[1];
                                break;
                                
                            case "LastName":
                                this.Ship.LastName = Values[1];
                                break;
                                
                            case "CompanyName":
                                this.Ship.Company = Values[1];
                                break;
                                
                            case "Email":
                                this.Email = Values[1];
                                break;
                        }
                    }
                }
                
                if (Rows[iRow].indexOf("isShip=True") > 0)
                {
                    for (var iFields=0; iFields<Fields.length; iFields++)
                    {
                        var Values = Fields[iFields].split("=");
                        switch(Values[0])
                        {
                        
                            case "InternalId":
                                this.Ship.InternalId = Values[1];
                                break;
                                
                           case "Addressee":
                                this.Ship.Company = Values[1];
                                break;
                                
                           case "Attention":
                                // Override the Customer First and Last Name
                    	        var l_nDelimiter = Values[1].indexOf(' ');
				                var First = Values[1].substring(0,l_nDelimiter)
				                var Last = Values[1].substring(l_nDelimiter + 1, Values[1].length);
        				
                                this.Ship.FirstName = First;
                                this.Ship.LastName = Last;
                                break;
                                                
                            case "Address1":
                                this.Ship.AddressLine1 = Values[1];
                                break;
                                    
                            case "Address2":
                                this.Ship.AddressLine2 = Values[1];
                                break;
                            
                            case "City":
                                this.Ship.City = Values[1];
                                break;
                            
                            case "State":
                                this.Ship.State = Values[1];
                                break;
                                
                            case "Zip":
                                this.Ship.Zip = Values[1];
                                break;
                                
                            case "Country":
                                this.Ship.Country = Values[1];
                                break;
                                
                            case "Phone":
                                this.Ship.Phone = Values[1];
                                break;
                        }
                    }
                }
                
                if (Rows[iRow].indexOf("isBill=True") > 0 && Rows[iRow].indexOf("isShip=True") > 0)
                {
                    this.Bill.SameAsShip = true;
                }
                else if(Rows[iRow].indexOf("isBill=True") > 0)
                {
                    this.Bill.SameAsShip = false;
                    
                    for (var iFields=0; iFields<Fields.length; iFields++)
                    {
                        var Values = Fields[iFields].split("=");
                        switch(Values[0])
                        {
                            case "InternalId":
                                this.Bill.InternalId = Values[1];
                                break;
                                
                            case "Addressee":
                                this.Bill.Company = Values[1]
                                break;
                                
                            case "Attention":
                    	        var l_nDelimiter = Values[1].indexOf(' ');
				                var First = Values[1].substring(0,l_nDelimiter)
				                var Last = Values[1].substring(l_nDelimiter + 1, Values[1].length);
        				
                                this.Bill.FirstName = First;
                                this.Bill.LastName = Last;
                                break;
                                
                            case "Address1":
                                this.Bill.AddressLine1 = Values[1];
                                break;
                                    
                            case "Address2":
                                this.Bill.AddressLine2 = Values[1];
                                break;
                            
                            case "City":
                                this.Bill.City = Values[1];
                                break;
                            
                            case "State":
                                this.Bill.State = Values[1];
                                break;
                                
                            case "Zip":
                                this.Bill.Zip = Values[1];
                                break;
                                
                            case "Country":
                                this.Bill.Country = Values[1];
                                break;
                                
                            case "Phone":
                                this.Bill.Phone = Values[1];
                                break;
                        }
                    }
                }
                
                if (Rows[iRow].indexOf("Card|") > -1)
                {
                this.CreditCard.CardsOnFile[this.CreditCard.CardsOnFile.length] = Checkout._NewCard();
                Card = this.CreditCard.CardsOnFile[this.CreditCard.CardsOnFile.length-1];
                
                    for (var iFields=0; iFields<Fields.length; iFields++)
                    {
                        var Values = Fields[iFields].split("=");
                        switch(Values[0])
                        {
                            case "InternalId":
                                Card.InternalId = Values[1];
                                break;
                                
                            case "isDefault":
                                if (Values[1] == "true")
                                {
                                    Card.Default = true;
                                }
                                break;  
                                
                            case "Type":
                                Card.Type = Values[1];
                                break; 
                                
                            case "NameOnCard":
                                Card.NameOnCard = Values[1];
                                break;  
                                
                            case "Number":
                                Card.Number = Values[1];
                                break; 
                                
                            case "Expiration":
                                Card.Expiration = Values[1];
                                break;                          
                        }
                    }
                }
            }
        }
    }
    
    this.IsEmailValid = function()
    {
    
        //var _sEmailReg = "^[\\w-_\.]*[\\w-_\.]\@[\\w]\.+[\\w]+[\\w]$";
        //var _sEmailReg = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$";
        //var _sEmailReg = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$";
        var _sEmailReg = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/;
        var _oRegex = new RegExp(_sEmailReg);
        var _bPassed = _oRegex.test(this.Email);
        //
        return _bPassed;
    }
    
    this.IsSsnValid = function()
    {
        /// Matches 078-05-1120 | 078 05 1120 | 078051120
        /// Non-Matches 987-65-4320 | 000-00-0000 | (555) 555-5555
        var _SsnReg = /^(?!000)([0-6]\d{2}|7([0-6]\d|7[012]))([ -]?)(?!00)\d\d\3(?!0000)\d{4}$/;
        var _oRegex = new RegExp(_SsnReg);
        var _bPassed = _oRegex.test(this.SSN);
        
        return _bPassed; 
    }
    
    this.ValidatePassword = function()
    {
        // Must be at least 6 characters
        // Must contain at least 1 number
        // Must contain at least 1 Alpha character
        //var sEmailReg = /^(?=.*\d)(?=.*[A-Za-z])\w{6,}$/; ; 
        
        // Original ^.*(?=.{10,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$
        var sEmailReg = /^.*(?=.{6,})(?=.*\d)(?=.*[a-zA-Z]).*$/
                
        var oRegex = new RegExp(sEmailReg);
        var bValid = oRegex.test(this.Password);
//window.status = bValid;
        return bValid;
       //return true;
    }
}

Safemart.FormHandler = function(formName, submitTo, submittedAt)
{
    var _FormName = formName;
    var _SubmitTo = submitTo;
    var _SubmittedAt = submittedAt;
    
    this.OnSubmited = function(){};
    this.OnError = function(){"",""}; // param1 = exception; param2 = message
    
    this.AdvanceField = function(fromField, toField, onCharCount)
    {
        if (fromField.value.length == onCharCount)
        {
            toField.focus();
        }
    }
    
    this.Submit = function()
    {
        var bPassedRequired = true;
        var sFormData = "";
        
        for(var i=0; i<document.getElementById(_FormName).elements.length; i++)
        {
            if (sFormData.length > 0)
            {
                sFormData += "|";
            }
            
            var sName = document.getElementById(_FormName).elements[i].name;
            var sTag = document.getElementById(_FormName).elements[i].tagName.toLowerCase();
            var InputType = document.getElementById(_FormName).elements[i].type.toLowerCase();
            var sValue = "";
            
            switch(sTag)
            {
                case "select":
                    var s = document.getElementById(_FormName).elements[i];
                    //var s = document.getElementById("citySelector");
                    sValue = s.options[s.selectedIndex].text;
                    break;
                    
                default:
                    switch(InputType)
                    {
                        case "checkbox":
                            sValue = document.getElementById(_FormName).elements[i].checked;
                            break;
                            
                        default:
                            sValue = document.getElementById(_FormName).elements[i].value;
                    }
            }
 
            /// add parameters to the subject line
            var sSubjectParam = document.getElementById(_FormName).elements[i].getAttribute("subjectparam")

            if (sSubjectParam != null && sSubjectParam.toLowerCase() == "true")
            {
                _SubmittedAt += " - " + sValue;
            }
            
            sFormData += sName + " = " + sValue;
            
            sReqired = document.getElementById(_FormName).elements[i].getAttribute("required");
            
            if (sReqired != null && sReqired.toLowerCase() == "true")
            {
                switch(InputType)
                {
                    case "checkbox":
                        if (!sValue)
                        {
                            bPassedRequired = false;
                        }
                        
                    default:
                        if (document.getElementById(_FormName).elements[i].value.length == 0)
                        {
                            bPassedRequired = false;
                        }
                }
                
                if (!bPassedRequired)
                {
                    break;
                }
            }
        }
        
        if (bPassedRequired)
        {
            var aParameters = new wsi._Parameters();
            aParameters.Add("submitTo", _SubmitTo);
            aParameters.Add("submitedAt", _SubmittedAt);
            aParameters.Add("formData", sFormData);
            wsi._Soap.AddCall("SubmitForm", this.OnSubmited, aParameters);
        }
        else
        {
            this.OnError("SubmissionError", "Please complete all required fields");
        }

        return "";
    }
}


Safemart.QueryString = function()
{
    var _QueryList = document.location.search.substring(1).split("&"); 
    
    this.Find = function(param)
    {
        param+="=";
        var i = _QueryList.findAt(param,0,"contains");
        var value = null; /// default return value
        if (i != -1)
        {
            var delimiter = param.length;
            value = _QueryList[i].substring(delimiter);
        }
        
        return value;
    }
}

Safemart.SmartMoneyPageHandler = function()
{
    CheckRequired = function()
    {
        var i=0;
        var Continue = true;
        do
        {
            ++i;
            var AddOn = document.getElementById("AddOn"+i);

            if (AddOn == null)
            {
                Continue = false;
            }
            else
            {
                var CartData = document.getElementById("AddOn"+i).value;
                var CartRequired = document.getElementById("AddOn"+i).getAttribute("requiredtext");

                if (CartData == "nonoption" && CartRequired != null)
                {
                    alert(CartRequired);
                    return false;
                }
            }

        }while(Continue);
        
        return true;
    }
    
    this.ShowTerms = function()
    {
        /// Insure that a Session Id is set before adding items to the cart.
        /// Otherwise, all Items may not show in the cart as they could be
        /// assigned different Ids by the "Add to Cart" code.
        if(wsi._Cookie.GetCrumb("SessionID") == null)
        {
            wsi.GetNewSessionId();   
        }
        
        if (CheckRequired())
        {
            document.getElementById("NotificationCaption").innerHTML = document.getElementById("uiTermsCaption").innerHTML;
            document.getElementById("NotificationBody").innerHTML = document.getElementById("uiTermsNotification").innerHTML;
            YAHOO.example.container.panel1.show();
        }
    }
    
    this.VerifyConditions = function()
    {
        if (document.getElementById("uiTermsAgree").checked && document.getElementById("uiCreditCheckAgree").checked)
        {
            document.getElementById("uiAccept").disabled = false;
        }
        else
        {
            document.getElementById("uiAccept").disabled = true;
        }
    }
    
    this.TermsAccepted = function()
    {
        this.AddItemsToCart();
        
    }
    
    this.TermsDeclined = function()
    {
        this.HideTerms();
    }
    
    this.HideTerms = function()
    {
        YAHOO.example.container.panel1.hide();
    }
    
    this.ShowDetails = function()
    {
        YAHOO.example.container.overlay1.cfg.setProperty("context", ["uiExtrasDetails","tl","tr"]);
        YAHOO.example.container.overlay1.setBody(document.getElementById("ExtrasOverlay").innerHTML);
        YAHOO.example.container.overlay1.show();
    }

    this.HideDetails = function()
    {
        YAHOO.example.container.overlay1.hide()
    }

    var DefaultOverlayText = "";
    ClearOverlay = function()
    {
        /// Before the Overlay is cleared get the default text
        if (DefaultOverlayText.length == 0)
        {
            DefaultOverlayText = document.getElementById("ExtrasOverlay").innerHTML;
        }
        
        document.getElementById("ExtrasOverlay").innerHTML = DefaultOverlayText;
    }
    
    this.AddItemsToCart = function()
    {
    
   
        /// The ShowTerms functions checks for and gets a session Id if one is not set.
        /// Therefore, this code should always return a valid Session Id. If not, the user may have cookies disabled.
        var SessionID = (wsi._Cookie.GetCrumb("SessionID") == null ? "" : wsi._Cookie.GetCrumb("SessionID"));

        if (SessionID.length > 0)
        {
            document.getElementById("NotificationCaption").innerHTML = document.getElementById("uiAddtoCartCaption").innerHTML;
	        document.getElementById("NotificationBody").innerHTML = document.getElementById("uiAddToCartNotification").innerHTML;
            YAHOO.example.container.panel1.show();
        
            var CartData = document.getElementById("SmartMoneyProductData").value + "|" + document.location.href;
            
             ItemCount += 1;
             
            var aParameters = new wsi._Parameters();
            aParameters.Add("sessionID",SessionID);
            aParameters.Add("cartData",CartData);

            wsi._Soap.AddCall("SaveToCart", this.CartReturn, aParameters);
                            
            
            var i=0;
            ContinueLoop = true;
            do
            {
                ++i;
                var AddOn = document.getElementById("AddOn"+i);

                if (AddOn == null)
                {
                    ContinueLoop = false;
                }
                else
                {
                    CartData = document.getElementById("AddOn"+i).value;
                    if (CartData.length > 0)
                    {
                        ItemCount += 1;
                        //window.status = ItemCount;

                        CartData += "|"+document.location.href;
                        
                        var aParameters = new wsi._Parameters();
                        aParameters.Add("sessionID",SessionID);
                        aParameters.Add("cartData",CartData);

                        wsi._Soap.AddCall("SaveToCart", this.CartReturn, aParameters);
                    }
                }

            }while(ContinueLoop);
        }
        else
        {
            YAHOO.example.container.panel1.hide();
            setTimeout('alert("Unable to add items to your cart.\\r\\n\\r\\nInsure you have cookies enabled and try again.")',1000);
        }
        
    }
    
    var ItemCount = 0;
    
    
    
    this.CartReturn = function(returnValue)
    {
    //alert(returnValue);
        ItemCount -= 1;
       // window.status = ItemCount;
        
       
        /// When all the items have been added to the cart go to the checkout page.
        if (ItemCount == 0)
        {
        
   
            document.location.href = "https://" + window.location.hostname + "/checkout.htm";
        }
    }
    
    this.CaculateSubtotal = function()
    {
        /// sample format
        ///284|WS4945|284|Additional Sensor|1|29.00|.25|/img/landing_pages/smart-money-detail2.jpg            
        
        /// reset the overlay to default.
        ClearOverlay();
        
        var DetailsTitle = "";
        var DetailsQty = "";
        var DetailsItemPrice = "";
        var DetailsPrice = "";
        
        var CostOfExtras = 0;
        var i=0;
        ContinueLoop = true;
        do
        {
            ++i;
            var AddOn = document.getElementById("AddOn"+i);

            if (AddOn == null)
            {
                ContinueLoop = false;
            }
            else
            {
                CartData = document.getElementById("AddOn"+i).value;
                if (CartData.length > 0 && CartData != "nonoption")
                {
                    var AddOnFields = CartData.split("|");
                    
                    /// Add the price of the addon to the extras
                    CostOfExtras += parseInt(AddOnFields[4]) * parseFloat(AddOnFields[5]);
                    
                    if (DetailsTitle.length > 0)
                    {
                        DetailsTitle +=  "<br />";
                        DetailsQty += "<br />";
                        DetailsItemPrice += "<br />";
                        DetailsPrice += "<br />";
                    }
                    
                    /// Add item to the details overlay
                    DetailsTitle +=  AddOnFields[3];
                    DetailsQty += AddOnFields[4];
                    DetailsItemPrice += SWH.ToMoney(parseFloat(AddOnFields[5]),true);
                    DetailsPrice += SWH.ToMoney(parseInt(AddOnFields[4]) * parseFloat(AddOnFields[5]),true);
                }
            }

        }while(ContinueLoop);

        if (DetailsTitle.length > 0)
        {
            /// Populate the Overlay
            var Template = document.getElementById("ExtrasTemplate").innerHTML;
            Template = Template.replace(/_#Title#_/,DetailsTitle);
            Template = Template.replace(/_#Qty#_/g,DetailsQty);
            Template = Template.replace(/_#ItemPrice#_/g,DetailsItemPrice);
            Template = Template.replace(/_#Price#_/g,DetailsPrice);
            document.getElementById("ExtrasOverlay").innerHTML = Template;
        }
        
        document.getElementById("uiExtras").innerHTML = SWH.ToMoney(CostOfExtras,true);
        document.getElementById("uiSubtotal").innerHTML = SWH.ToMoney(78.95 + CostOfExtras,true);
    }
}

Safemart.ProductPageHandler = function()
{
    var _MainProductCaptured = false;
    var _MainProductTitle;
    var _MainShortTitle;
    var _MainProductSku;
    var _MainProductID;
    var _MainProductPrice;
    var _MainProductYourPrice; /// contains HTMl markup
    var _MainProductWeight;
    var _MainProductImage;
    var _Addons = new Array();

    if (!_MainProductCaptured)
    {
        _MainProductCaptured = true;
        
        _MainProductTitle = document.getElementById("ProductTitle").innerHTML;
        _MainShortTitle = document.getElementById("ShortTitle").innerHTML;
        _MainProductSku = document.getElementById("PartNumber").innerHTML.substring(13);// remove "Part Number: "
        _MainProductID = document.getElementById("MainProductData").getAttribute("pd_nsid");
        _MainProductPrice = document.getElementById("MainProductData").getAttribute("pd_price");
        _MainProductYourPrice = document.getElementById("ProdPrice").innerHTML; /// contains HTML markup
        _MainProductWeight = document.getElementById("MainProductData").getAttribute("pd_weight");
        _MainProductImage = document.getElementById("ProductImage").src;
     }
         
    var UpdateYourPrice = function()
    {
           
            
        var YourPrice = parseFloat(document.getElementById("MainProductData").getAttribute("pd_price"));
            
        for (var i=0; i<_Addons.length; i++)
        {
                //AddOn = document.getElementById("AddOn"+(i+1)).value;
                AddOn = _Addons[i].value;
                
                if (AddOn.length > 0 && AddOn.toLowerCase() != "none" && AddOn.indexOf('REPLACEMENT') == -1)
                {
                    var AddOnValues = AddOn.split("|");
                    if (AddOnValues.length == 6)
                    {/// If the data does not contain a sku, add a blank field
                        for (var isku = AddOnValues.length; isku > 1; isku--)
                        {
                            AddOnValues[isku] = AddOnValues[isku-1];
                        }
                    }

                AddOnValues[1] = "-"; /// replace the sku with a dash
                
                    /// <Type>|<SKU>|<NetSuiteID>|<Title>|<Qty>|<Unit Price>|<Unit Weight>|<Img>|<URL>
                    /// BUNDLE|4849|Power Cord - by the foot|6|0.33|1.00

//alert(parseInt(AddOnValues[4]) * parseFloat(AddOnValues[5]))
                    YourPrice += parseInt(AddOnValues[4]) * parseFloat(AddOnValues[5]);
                }
                

        }
        
            var NewPrice = SWH.ToMoney(YourPrice,false);
            
            var Delimit1 = _MainProductYourPrice.indexOf("Your Price: $")+13;
            var Delimit2 = _MainProductYourPrice.indexOf(".",Delimit1)+3;
            var OldPrice = _MainProductYourPrice.substring(Delimit1,Delimit2);
            var NewYourPrice = _MainProductYourPrice.replace(OldPrice, NewPrice);
            
            document.getElementById("ProdPrice").innerHTML = NewYourPrice;
    }
        
    var AddonCount=0;
    var ContinueLoop = true;
    do
    {
        ++AddonCount;
        var AddOn = document.getElementById("AddOn"+AddonCount);
//alert("AddOn"+AddonCount);
        if (AddOn == null)
        {
            ContinueLoop = false;
        }
        else
        {
            AddOnChangeEvent = document.getElementById("AddOn"+AddonCount).onchange;
                     
            /// Replacements already have an onchange event
            /// Don't overwrite the event
            if (AddOnChangeEvent == null)
            {
                AddOn.onchange = UpdateYourPrice;
                _Addons[_Addons.length] = AddOn;
            }
            
        }

    }while(ContinueLoop);
    
    this.ReplaceProduct = function(product)
    {
        //alert(product);
        

        
        ///REPLACEMENT|1448|sku|1Touch Fingerprint Door Lock|1|249.00|1.00
        var ReplacementProduct = product.split("|");

        if (ReplacementProduct[0].length == 0 || ReplacementProduct[0].toLowerCase() == "none")
        {
            document.getElementById("ProductTitle").innerHTML = _MainProductTitle

            document.getElementById("MainProductData").setAttribute("pd_nsid", _MainProductID);
            document.getElementById("PartNumber").innerHTML = "Part Number: " + _MainProductSku;// remove "Part Number: "
            document.getElementById("ShortTitle").innerHTML = _MainShortTitle;
            document.getElementById("MainProductData").setAttribute("pd_price", _MainProductPrice);
            document.getElementById("ProdPrice").innerHTML = _MainProductYourPrice;
            document.getElementById("MainProductData").setAttribute("pd_weight", _MainProductWeight);
            //document.getElementById("ProductImage").src;        
        }
        else
        {
            //var NewPrice = parseFloat(ReplacementProduct[5])+parseFloat(_MainProductPrice);
            var NewPrice = ReplacementProduct[5];
            
            var Delimit1 = _MainProductYourPrice.indexOf("Your Price: $")+13;
            var Delimit2 = _MainProductYourPrice.indexOf(".",Delimit1)+3;
            var OldPrice = _MainProductYourPrice.substring(Delimit1,Delimit2);
            var NewYourPrice = _MainProductYourPrice.replace(OldPrice, NewPrice);
            
            document.getElementById("ProductTitle").innerHTML = ReplacementProduct[3]
            document.getElementById("MainProductData").setAttribute("pd_nsid", ReplacementProduct[2]);
            document.getElementById("PartNumber").innerHTML = "Part Number: " + ReplacementProduct[1];// remove "Part Number: "
            document.getElementById("ShortTitle").innerHTML = ReplacementProduct[3];
            document.getElementById("MainProductData").setAttribute("pd_price", NewPrice);
            document.getElementById("ProdPrice").innerHTML = NewYourPrice;
            document.getElementById("MainProductData").setAttribute("pd_weight", ReplacementProduct[6]);
            //document.getElementById("ProductImage").src;
        }
        
        UpdateYourPrice();
    }
    
    this.GetSku = function()
    {
        if (document.getElementById("PartNumber") != null)
        {
            return document.getElementById("PartNumber").innerHTML.substring(13);// remove "Part Number: "
        }
        else
        {
            return "";
        }
    }
}

/******************************************
*                                         *
*        End Constructor Classes          *
*                                         *
*******************************************/


/******************************************
*                                         *
*             Customer Center             *
* Page specific functions and objects     *
*                                         *
*******************************************/
CustomerCenter = function()
{
}

CustomerCenter.Customer = new Safemart.Person();

CustomerCenter.Login = function()
{
    document.getElementById("LoginFailure").style.display = "none";
    CustomerCenter.Customer.LoginEventHandler(CustomerCenter.Customer.LoginReturn);
    CustomerCenter.Customer.LoginPrompt("CustomerCenter.Customer.LoginPromptCallback()");
}

CustomerCenter.Customer.GetSalesOrderReturn = function(returnValue)
{
    CustomerCenter.Customer.Transactions.Xml(unescape(returnValue));
    
    
}

CustomerCenter.Customer.LoginReturn = function(returnValue)
{
    CustomerCenter.Customer.LoginCallback(returnValue);
    //document.getElementById("CustomerWelcome").innerHTML = returnValue;
    var aParameters = new wsi._Parameters();
    aParameters.Add("internalId",CustomerCenter.Customer.InternalID);
    wsi._Soap.AddCall("GetSalesOrder", CustomerCenter.Customer.GetSalesOrderReturn, aParameters);
    
    YAHOO.example.container.panel1.hide();
    
    if (CustomerCenter.Customer.InternalID.length > 0)
    {
        
        var _sName = CustomerCenter.Customer.Ship.FirstName;
        _sName += " " + CustomerCenter.Customer.Ship.LastName;
        
        document.getElementById("CustomerCenter_Name").innerHTML = _sName;

        var _sShipCompanyName = CustomerCenter.Customer.Ship.Company;
        var _sShipAddress1 = CustomerCenter.Customer.Ship.AddressLine1;
        var _sShipAddress2 = CustomerCenter.Customer.Ship.AddressLine2;
        var _sShipCity = CustomerCenter.Customer.Ship.City;
        var _sShipState = CustomerCenter.Customer.Ship.State;
        var _sShipZip = CustomerCenter.Customer.Ship.Zip;
        var _sShipCountry = CustomerCenter.Customer.Ship.Country;
        
        if (_sShipCompanyName.length > 0)
        {
            with(document.getElementById("CustomerCenter_ShipCompanyName"))
            {
                innerHTML = _sShipCompanyName;
                style.display = "block";
            }
        }
        
        if (_sShipAddress1.length > 0)
        {
            with (document.getElementById("CustomerCenter_ShipAddress1"))
            {
                innerHTML = _sShipAddress1;
                style.display = "block";
            }
        }
        
        if (_sShipAddress2.length > 0)
        {
            with (document.getElementById("CustomerCenter_ShipAddress2"))
            {
                innerHTML = _sShipAddress2;
                style.display = "block";
            }
        }
        
        if (_sShipCity.length > 0)
        {
            with (document.getElementById("CustomerCenter_ShipCity"))
            {
                innerHTML = _sShipCity;
                style.display = "block";
            }
        }
        
        if (_sShipState.length > 0)
        {
            with (document.getElementById("CustomerCenter_ShipState"))
            {
                innerHTML = _sShipState;
                style.display = "block";
            }
        }
        
        if (_sShipZip.length > 0)
        {
            with (document.getElementById("CustomerCenter_ShipZip"))
            {
                innerHTML = _sShipZip;
                style.display = "block";
            }
        }
        
        if (_sShipCountry.length > 0)
        {
            with (document.getElementById("CustomerCenter_ShipCountry"))
            {
                innerHTML = _sShipCountry;
                style.display = "block";
            }
        }
        
        
        if(CustomerCenter.Customer.Bill.SameAsShip)
        {
            document.getElementById("CustomerCenter_BillSameAsShip").innerHTML = "Same as Shipping";
            document.getElementById("CustomerCenter_BillSameAsShip").style.display = "block";
        }
        else
        {
        
            var _sBillCompanyName = CustomerCenter.Customer.Bill.Company;
            var _sBillAddress1 = CustomerCenter.Customer.Bill.AddressLine1;
            var _sBillAddress2 = CustomerCenter.Customer.Bill.AddressLine2;
            var _sBillCity = CustomerCenter.Customer.Bill.City;
            var _sBillState = CustomerCenter.Customer.Bill.State;
            var _sBillZip = CustomerCenter.Customer.Bill.Zip;
            var _sBillCountry = CustomerCenter.Customer.Bill.Country;
                
            if (_sBillCompanyName.length > 0)
            {
                with (document.getElementById("CustomerCenter_BillCompanyName"))
                {
                    innerHTML = _sBillCompanyName;
                    style.display = "block";
                }
            }
            
            if (_sBillAddress1.length > 0)
            {
                with (document.getElementById("CustomerCenter_BillAddress1"))
                {
                    innerHTML = _sBillAddress1;
                    style.display = "block";
                }
            }
            
            if (_sBillAddress2.length > 0)
            {
                with (document.getElementById("CustomerCenter_BillAddress2"))
                {
                    innerHTML = _sBillAddress2;
                    style.display = "block";
                }
            }
            
            if (_sBillCity.length > 0)
            {
                with (document.getElementById("CustomerCenter_BillCity"))
                {
                    innerHTML = _sBillCity;
                    style.display = "block";
                }
            }

            if (_sBillState.length > 0)
            {
                with (document.getElementById("CustomerCenter_BillState"))
                {
                    innerHTML = _sBillState;
                    style.display = "block";
                }
            }

            if (_sBillZip.length > 0)
            {
                with (document.getElementById("CustomerCenter_BillZip"))
                {
                    innerHTML = _sBillZip;
                    style.display = "block";
                }
            }
                
            if (_sBillCountry.length > 0)
            {
                with (document.getElementById("CustomerCenter_BillCountry"))
                {
                    innerHTML = _sBillCountry;
                    style.display = "block";
                }
            }
              
        }
        
        document.getElementById("CustomerCenterPage").style.display = "block";
    }
    else
    {
         document.getElementById("LoginFailure").style.display = "block";
    }
    
   
}
/******************************************
*                                         *
*             Customer Center             *
*                                         *
*******************************************/


/// Product Page Oject and Methods
/// Use these functions to get Product Data from the page.
/// Or, perform functions to manipulate the page.
//Safemart.ProductPage = new Object();

// Get the Product Sku
/*
Safemart.ProductPage.GetSku = function()
{
    if (document.getElementById("PartNumber") != null)
    {
        return document.getElementById("PartNumber").innerHTML.substring(13);// remove "Part Number: "
    }
    else
    {
        return "";
    }
}
*/


// Review Class
Safemart.Review = new Object();

Safemart.Review.Customer = new Safemart.Person();

Safemart.Review.Stars = "Not Set";
// Save Review function
Safemart.Review.Save = function()
{
    
    _bValidated = true;
    
    var _sDisplayName = document.getElementById("DisplayName").value;
    var _sEmail = document.getElementById("Email").value;
    Safemart.Review.Customer.Email = _sEmail;
    var _sHeadline = document.getElementById("Headline").value;
    var _sRating = document.getElementsByName("");
    var _sReview = document.getElementById("Comments").value;
    
    if (_sDisplayName.length == 0) _bValidated = false;
    if (_sEmail.length == 0) _bValidated = false;
    if (_sHeadline.length == 0) _bValidated = false;
    if (_sReview.length == 0) _bValidated = false;
    if (Safemart.Review.Stars == "Not Set") _bValidated = false;


    if (!_bValidated)
    {
        document.getElementById("ReviewKickbackMessage").innerHTML = "Please complete all fields.";
    }
    else if (!Safemart.Review.Customer.IsEmailValid())
    {
        document.getElementById("ReviewKickbackMessage").innerHTML = "Please include a valid email address.";
    }
    else
    {
        document.getElementById("MyReview").style.display = "none";
        document.getElementById("ReviewThankyou").style.display = "block";
//alert(Safemart.ProductPage.GetSku() + "\r\n" + _sDisplayName + "\r\n" + _sEmail + "\r\n" + _sHeadline + "\r\n" + Safemart.Review.Stars + "\r\n" + _sReview);     
        var aParameters = new wsi._Parameters();
        aParameters.Add("productSku",Safemart.ProductPage.GetSku());
        aParameters.Add("displayName",_sDisplayName);
        aParameters.Add("email",_sEmail);
        aParameters.Add("headline",_sHeadline);
        aParameters.Add("rating",Safemart.Review.Stars);
        aParameters.Add("review",_sReview);

        wsi._Soap.AddCall("SaveReview", Safemart.Review.SaveReturn, aParameters);
    }
}

/// Save Review Callback function
Safemart.Review.SaveReturn = function(returnValue)
{
//alert(returnValue);
    //document.getElementById("ReviewThankyou").innerHTML = returnValue;
}




function getDomAdapter()
{
	var adapter = '';
	if ('undefined' != typeof ActiveXObject) {
		adapter = 'MS';
	} else if ('undefined' != typeof document
		&& document.implementation
		&& document.implementation.createDocument
		&& 'undefined' != typeof DOMParser)
	{
		adapter = 'default';
	}
	switch (adapter) {
		case 'MS':
			return new (function () {
				this.createDocument = function () {
					var names = ["Msxml2.DOMDocument.6.0","Msxml2.DOMDocument.3.0", "MSXML2.DOMDocument","MSXML.DOMDocument", "Microsoft.XMLDOM"];
					//var names = ["Microsoft.XMLDOM"];
					//var names = ["Microsoft.XMLDOM"];
					for (var key in names) {
						try {
							return new ActiveXObject(names[key]);
						} catch (e) {}
					}
					throw new Error('Unable to create DOMDocument');
				};
				this.serialize = function (doc) {
					return doc.xml;
				};
				this.parseXml = function (xml) {
					var doc = this.createDocument();
					if (!doc.loadXML(xml)) {
						throw new Error('Parse error');
					}
					//return doc.documentElement;
					return doc
				};
			})();
		case 'default':
			return new (function () {
				this.createDocument = function () {
					return document.implementation.createDocument("", "", null);
				};
				this.serialize = function (doc) {
					return new XMLSerializer().serializeToString(doc);
				};
				this.parseXml = function (xml) {
					var doc = new DOMParser().parseFromString(xml, "text/xml");
					if ("parsererror" == doc.documentElement.nodeName) {
						throw new Error('Parse error');
					}
					return doc;
				};
			})();
		default:
			throw new Error('Unable to select the DOM adapter');
	}
};