﻿/**************************************************
Our QueryString object
**************************************************/
function obj_queryString()
{
    qs = document.URL.substring(document.URL.indexOf('?')+1,document.URL.length);
    queries=qs.split(/\&/);
    for(i=0; i < queries.length; i++)
    {
        query = queries[i].split(/\=/);
        this[query[0]]=unescape(query[1]);
    }
}
queryString = new obj_queryString();

// This is the failed callback function.
function AjaxFailedCallback(error)
{
    var stackTrace = error.get_stackTrace();
    var message = error.get_message();
    var statusCode = error.get_statusCode();
    var exceptionType = error.get_exceptionType();
    var timedout = error.get_timedOut();
   
    // Display the error.
    alert(
        "An exception occurred:\n" +
        "Stack Trace: " +  stackTrace + "\n" +
        "Service Error: " + message + "\n" +
        "Status Code: " + statusCode + "\n" +
        "Exception Type: " + exceptionType + "\n" +
        "Timedout: " + timedout);
}

// Register onload events
Event.observe(window, 'load', function() {
  WireUpMultiLineTextBoxesToShowCharsLeft();
  FocusToDetailsView();
});

var isIE = (window.navigator.userAgent.indexOf("MSIE") > 0);

if (typeof HTMLElement != "undefined" &&
    typeof HTMLElement.prototype.__defineGetter__ != "undefined") {
  HTMLElement.prototype.__defineGetter__("innerText", 
              function () { return(this.textContent); });
  HTMLElement.prototype.__defineSetter__("innerText", 
              function (txt) { this.textContent = txt; });
}

function FocusToDetailsView()
{
    var detailsViewContainers = document.getElementsByClassName("DetailsViewContainer");
    var alreadyFocused = false;
    if (detailsViewContainers.length > 0)
    {
        var detailsViewContainer = detailsViewContainers[0];
        detailsViewContainer.descendants().each
        (
            function (elm)
            {
                if (!alreadyFocused && elm.nodeName.toLowerCase() == "input")
                {
                    elm.focus();
                    alreadyFocused = true;
                }
            }
        )
    }
}

function WireUpMultiLineTextBoxesToShowCharsLeft()
{
    var multiLineTextBoxes = $A(document.getElementsByClassName("multiline-charsleft"));
    multiLineTextBoxes.each(
        function(o)
        {
            // Check if this is a text area
            if (o.type == "textarea")
            {
                var maxLength = parseInt(o.title);
                if (!isNaN(maxLength))
                {
                    // Create an HTML element to show chars left
                    new Insertion.After(o.id, "<div id='" + o.id + "CharsLeft'></div>");
                    // Event handlers
                    Event.observe(o.id, 'change', ShowCharsLeftForMultiLineTextBoxes.bindAsEventListener(this, o, $(o.id + 'CharsLeft'), maxLength));
                    // Event.observe(o.id, 'keyup', ShowCharsLeftForMultiLineTextBoxes.bindAsEventListener(this, o, $(o.id + 'CharsLeft'), maxLength));
                    Event.observe(o.id, 'keydown', ShowCharsLeftForMultiLineTextBoxes.bindAsEventListener(this, o, $(o.id + 'CharsLeft'), maxLength));
                    // Do the initial call
                    ShowCharsLeftForMultiLineTextBoxes(this, o, $(o.id + 'CharsLeft'), maxLength);
                }
            }
        }
    );
}

function ShowCharsLeftForMultiLineTextBoxes(evt, obj, charsLeftArea, maxLength) {
    obj             = $(obj);
    charsLeftArea   = $(charsLeftArea);
	var nCharLeft = maxLength - obj.value.length;
	if (nCharLeft < 0)
	{
		 obj.value =  obj.value.substring(0, maxLength);
		 nCharLeft = 0;
	}
    charsLeftArea.update(nCharLeft + " character(s) remaining");
};

// Constants
var PAYMENTTYPEID_UNKNOWN           = "1";
var PAYMENTTYPEID_CHECK             = "2";
var PAYMENTTYPEID_AMEX              = "3";
var PAYMENTTYPEID_DISCOVER          = "4";
var PAYMENTTYPEID_MASTERCARD        = "5";
var PAYMENTTYPEID_VISA              = "6";
var PAYMENTTYPEID_DINERSCLUB        = "8";
var OTHERID_LETTEREMAILTYPE         = "2";
var OTHERID_CANCELLATIONREASON      = "2";
var OTHERID_CREDITREASON            = "2";
var PRODUCTTYPEID_CREDITBACKBILLING = "5";
var PRICEOVERRIDESTRING             = "THIS IS OVERRIDE";

// Custom validation functions
String.prototype.isValidDate = function() {
    var IsoDateRe = new RegExp("^([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{4}|[0-9]{2})$");
    var matches = IsoDateRe.exec(this);
    if (!matches) return false;  
    var yearParsed = "";
    if (matches[3].length == 2)
    {
        if (parseInt(matches[3]) < 50)
            yearParsed = "20" + matches[3];
        else
            yearParsed = "19" + matches[3];
    }
    else
        yearParsed = matches[3];
        
    if (parseInt(yearParsed) < 1753 || parseInt(yearParsed) > 9999)
        return false;
        
    var composedDate = new Date(yearParsed, (matches[1] - 1), matches[2]);
    return ((composedDate.getMonth() == (matches[1] - 1)) &&
          (composedDate.getDate() == matches[2]) &&
          (composedDate.getFullYear() == yearParsed));
}

String.prototype.isValidPrice = function() {
    var pricePattern = new RegExp("^-?(0(\.[0-9]{2})?|[1-9][0-9]*(\.[0-9]{2})?)$");
    if (!pricePattern.exec(this))
        return false;
    else
        return true;
}
String.prototype.isValidTime = function() {
    var pricePattern = new RegExp("^(0[1-9]|1[0-9]):[0-9]{2} (AM|PM)$");
    if (!pricePattern.exec(this))
        return false;
    else
        return true;
}

String.prototype.isValidZipCode = function() {
    var pricePattern = new RegExp("^[0-9]{5}(-[0-9]{4})?$");
    if (!pricePattern.exec(this))
        return false;
    else
        return true;
}

String.prototype.nl2br = function ()
{
    // Replace out the new line character.
    return this.replace(/\n/g, "<br />");
}

String.prototype.isValidEmail = function() {
    var emailPattern = new RegExp("^([0-9a-zA-Z]([-.\w_]*[0-9a-zA-Z])*@(([0-9a-zA-Z])+([-\w]*[0-9a-zA-Z])*\.)+[a-zA-Z]{2,9})$");
    if (!emailPattern.exec(this))
        return false;
    else
        return true;
}

String.prototype.isValidInteger = function() {
    var regExPattern = new RegExp("^(0|-?[1-9][0-9]*)$");
    if (!regExPattern.exec(this))
        return false;
    else
        return true;
}

String.prototype.isValidPhoneNumber = function() {
    //var replaceNonDigitPattern = new RegExp("\D");
    var numbersOnly = this.replace(/\D/g,"");
    
    if (numbersOnly.lenght() >= 10)
        return true;
    else 
        return false;
}

/**
* public string base64_encode()
* @note Encodes data with MIME base64
* @description string base64_encode()
* Returns data encoded with base64. This encoding is designed to make binary
* data survive transport through transport layers that are not 8-bit clean,
* such as mail bodies. Base64-encoded data takes about 33% more space than the original data.
*
* @return string
* @acces public
*/
String.prototype.base64_encode=function()
{
    var ascii=new String("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
    var encode=new String();
    var bits,dual,i=0;
 
    while(this.length>=i+3)
    {
        bits=(this.charCodeAt(i++) & 0xff) <<16
            | (this.charCodeAt(i++) & 0xff) <<8
            | this.charCodeAt(i++) & 0xff;
        
        encode+= ascii.charAt((bits & 0x00fc0000) >>18)
                + ascii.charAt((bits & 0x0003f000) >>12)
                + ascii.charAt((bits & 0x00000fc0) >> 6)
                + ascii.charAt((bits & 0x0000003f));
    }

    if((this.length-i)>0 && (this.length-i)<3)
    {
        dual=Boolean(this.length -i -1);
        bits=((this.charCodeAt(i++) & 0xff) <<16) | (dual ? (this.charCodeAt(i) & 0xff) <<8 : 0);

        encode+= ascii.charAt((bits & 0x00fc0000) >>18)
                + ascii.charAt((bits & 0x0003f000) >>12)
                + (dual ? ascii.charAt((bits & 0x00000fc0) >>6) : '=')
                + '=';
    }
    return encode;
};

/**
* public string base64_decode()
* @note Decodes data encoded with MIME base64
* @description string base64_decode()
* Decodes encoded64_data and returns the original data.
*
* @return string
* @acces public
*/
String.prototype.base64_decode=function()
{
    var ascii=new String("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
    var decode,buffer=new String();
    var bits,i;

    for(i=0;i<this.length; i += 4)
    {
        bits=(ascii.indexOf(this.charAt(i)) & 0xff) <<18
            | (ascii.indexOf(this.charAt(i +1)) & 0xff) <<12
            | (ascii.indexOf(this.charAt(i +2)) & 0xff) << 6
            | ascii.indexOf(this.charAt(i +3)) & 0xff;

        buffer+=String.fromCharCode((bits & 0xff0000) >>16,(bits & 0xff00) >> 8,bits & 0xff);
    }

    if(this.charCodeAt(i-2)==61)
        decode=buffer.substring(0,buffer.length-2);
    else if(this.charCodeAt(i-1)==61)
        decode=buffer.substring(0,buffer.length-1);
    else
        decode=buffer;

    return decode;
};

function GetCreditCardType(cardNumber)
{
    var isValid = false;
    var ccCheckRegExp = /[^\d ]/;
    isValid = !ccCheckRegExp.test(cardNumber);
    
    if(isValid)
    {
        var cardNumbersOnly = cardNumber.replace(/ /g,"");
        var cardNumberLength = cardNumbersOnly.length;
        var cardNumberCheck;
        
        // AMEX -- 34 or 37 -- 15 length
        cardNumberCheck = /^(34|37)/;
        if(cardNumberCheck.test(cardNumbersOnly) && cardNumberLength == 15)
            return PAYMENTTYPEID_AMEX;
        
        // MasterCard -- 51 through 55 -- 16 length
        cardNumberCheck = /^(51|52|53|54|55)/;
        if(cardNumberCheck.test(cardNumbersOnly) && cardNumberLength == 16)
            return PAYMENTTYPEID_MASTERCARD;
        
        // VISA -- 4 -- 13 and 16 length    
        cardNumberCheck = /^(4)/;
        if(cardNumberCheck.test(cardNumbersOnly) && (cardNumberLength == 16 || cardNumberLength == 13))
            return PAYMENTTYPEID_VISA;
            
        // Diners Club -- 300-305, 36 or 38 -- 14 length
        cardNumberCheck = /^(300|301|302|303|304|305|36|38)/;
        if(cardNumberCheck.test(cardNumbersOnly) && cardNumberLength == 14)
            return PAYMENTTYPEID_DINERSCLUB;
            
        // Discover -- 6011 -- 16 length
        cardNumberCheck = /^(6011)/;
        if(cardNumberCheck.test(cardNumbersOnly) && cardNumberLength == 16)
            return PAYMENTTYPEID_DISCOVER;
        
        return "";
    }
}
function IsValidCreditCardNumberAndPaymentType(cardNumber, paymentTypeId) {
    var paymentTypeText = '';
    
    switch (paymentTypeId) {
        case PAYMENTTYPEID_MASTERCARD:
            paymentTypeText = "mastercard";
            break;
        case PAYMENTTYPEID_VISA:
            paymentTypeText = "visa";
            break;
        case PAYMENTTYPEID_AMEX:
            paymentTypeText = "amex";
            break;
        case PAYMENTTYPEID_DINERSCLUB:
            paymentTypeText = "dinersclub";
            break;
        case PAYMENTTYPEID_DISCOVER:
            paymentTypeText = "discover";
            break;
        default:
            return false;
    }
    
    return IsValidCreditCardNumber(cardNumber, paymentTypeText);
}
function IsValidCreditCardNumber(cardNumber, cardType)
{
  var isValid = false;
  var ccCheckRegExp = /[^\d ]/;
  isValid = !ccCheckRegExp.test(cardNumber);

  if (isValid)
  {
    var cardNumbersOnly = cardNumber.replace(/ /g,"");
    var cardNumberLength = cardNumbersOnly.length;
    var lengthIsValid = false;
    var prefixIsValid = false;
    var prefixRegExp;

    switch(cardType)
    {
      case "mastercard":
        lengthIsValid = (cardNumberLength == 16);
        prefixRegExp = /^5[1-5]/;
        break;

      case "visa":
        lengthIsValid = (cardNumberLength == 16 || cardNumberLength == 13);
        prefixRegExp = /^4/;
        break;

      case "amex":
        lengthIsValid = (cardNumberLength == 15);
        prefixRegExp = /^3(4|7)/;
        break;

      case "dinersclub":
        lengthIsValid = (cardNumberLength == 14);
        prefixRegExp  = /^(300|301|302|303|304|305|36|38)/;
        break;
      
      case "discover":
        lengthIsValid = (cardNumberLength == 16);
        prefixRegExp = /^(6011)/;

      default:
        prefixRegExp = /^$/;
        return true;
    }

    prefixIsValid = prefixRegExp.test(cardNumbersOnly);
    isValid = prefixIsValid && lengthIsValid;
  }

  if (isValid)
  {
    var numberProduct;
    var numberProductDigitIndex;
    var checkSumTotal = 0;

    for (digitCounter = cardNumberLength - 1; 
      digitCounter >= 0; 
      digitCounter--)
    {
      checkSumTotal += parseInt (cardNumbersOnly.charAt(digitCounter));
      digitCounter--;
      numberProduct = String((cardNumbersOnly.charAt(digitCounter) * 2));
      for (var productDigitCounter = 0;
        productDigitCounter < numberProduct.length; 
        productDigitCounter++)
      {
        checkSumTotal += 
          parseInt(numberProduct.charAt(productDigitCounter));
      }
    }

    isValid = (checkSumTotal % 10 == 0);
  }

  return isValid;
}



function validatePrice(v, e)
{
    // Get the price in the database
    var priceToRestoreTextBox = $(e.id.substring(0, e.id.length - 'PriceTextBox'.length) + 'PriceToRestore');
    
    if (PRICEOVERRIDESTRING == v || $F(priceToRestoreTextBox) == v)
        return true;

    if (!v.isValidPrice())
    {
        e.value = $F(priceToRestoreTextBox);
        return false;
    }
    else
    {
        var price = parseFloat(v);
        price = Math.round(price * 100) / 100;
        if (price >= 0 && price <= 99999.99)
            return true;
        else
        {
            e.value = $F(priceToRestoreTextBox);
            return false;
        }
    }
}

function validatePriceRegular(v, e)
{
    return v.isValidPrice()
}

function validateSalesRepresentative(v, e)
{
    var textHiddenField = $(e.id.replace(/(.*)(_AutoCompleteTextBox)/, "$1_TextHiddenField"));
    var idHiddenField = $(e.id.replace(/(.*)(_AutoCompleteTextBox)/, "$1_IdHiddenField"));
    var customerServiceRepresentative = $(e.id.replace(/(.*MemberTransactionEditor1_)(.*)(_AutoCompleteTextBox)/, "$1CustomerServiceRepresentativeIdDropDownList"));

    if ($F(customerServiceRepresentative) == "")
        return Validation.get('required').test(idHiddenField.value);
    else
        return true;
}

function validateAuthorizedRepresentative(v, e)
{
    // Get the price textbox
    var priceTextBox = $(e.id.substring(0, e.id.length - 'CustomerServiceRepresentativeIdDropDownList'.length) + 'PriceTextBox');
    
    // Get the original price
    var originalPrice = parseFloat($(e.id.substring(0, e.id.length - 'CustomerServiceRepresentativeIdDropDownList'.length) + 'DefaultPrice').innerText);

    // Parse the price entered
    var priceParsed = parseFloat($F(priceTextBox));

    if (PRICEOVERRIDESTRING == $F(priceTextBox) || priceParsed == originalPrice)
        return true;
    else
        return Validation.get('required').test(v);
}

var lastMailCodeVerified = true;

function CheckIfMailCodeIsVerified(e)
{
    if (!lastMailCodeVerified && false)// TODO: this is temporary solution to disable mail code validation
    {
        alert("You have entered an invalid mail code.");
        Event.stop(e);
    }
}

Event.observe(window, 'load', function() {
    Event.observe($("aspnetForm"), 'submit', CheckIfMailCodeIsVerified, false);
});

function OnQueryMailCodeComplete(result)
{
    if (!result && false) // TODO: this is temporary solution to disable mail code validation
        alert("You have entered an invalid mail code.");

    lastMailCodeVerified = result;
}
function OnQueryMailCodeFailure(error)
{
    alert('Could not connect to the server to verify the mail code. Please try again.');
    lastMailCodeVerified = false;
}
function QueryMailCode(mailCode, FormID)
{
    if (mailCode == '')
        lastMailCodeVerified = true; 
    else
    {
        lastMailCodeVerified = false;
    
        CambridgeWhosWhoWebServices.MailCodeExists(
            mailCode,
            FormID,
            OnQueryMailCodeComplete,
            OnQueryMailCodeFailure);
    }
}

function validateMailCode(v, e)
{
        
    var customerServiceRepresentative = $(e.id.substring(0, e.id.length - 'MailingCodeTextBox'.length) + 'CustomerServiceRepresentativeIdDropDownList');
    if ($F(customerServiceRepresentative) == "")
        return Validation.get('required').test(v);
    else
        return true;
    ++validateMailCodeCallCount;
}

function validateMailCodeVerify(v, e)
{
    var mailCode = $F($(e.id.substring(0, e.id.length - 'MailingCodeConfirmTextBox'.length) + 'MailingCodeTextBox'));
    if (mailCode != v)
        return false;
    else
        return true;
}

function validateTrackingNumberConfirm(v, e)
{
    var mailCode = $F($(e.id.substring(0, e.id.length - 'TrackingNumberConfirmTextBox'.length) + 'TrackingNumberTextBox'));
    if (mailCode != v)
        return false;
    else
        return true;
}

function tabberGetContainer(elm)
{
    var tabContainer = null;
    elm.ancestors().each(
        function (o)
        {
            if (o.className.strip() == "tabberlive")
                tabContainer = $(o);
        }
    );
    return tabContainer;
}

function validateMTEBillingZipCode(v, e)
{
    // Get the tab the control is on
    var tabContainer = null;
    var currentTab = null;
    var validationResult;
    e.ancestors().each(
        function (o)
        {
            if (o.className.strip() == "tabberlive")
                tabContainer = $(o);
            if (o.className.indexOf("tabbertab") != -1)
                currentTab = $(o);
        }
    );
    // Get the index of the current tab
    var currentTabIndex = parseInt(currentTab.id.substring(currentTab.id.length - 1, currentTab.id.length));

    validationResult = (!Validation.get('required').test(v) || v.isValidZipCode());

    if (!validationResult)
        tabContainer.tabber.tabShow(currentTabIndex);
        
    return validationResult;
}

function validateMTECheckNumber(v, e)
{
    if (window.validateMTECheckNumber_DisableValidation === undefined)
    {    
        // Get the tab the control is on
        var tabContainer = null;
        var currentTab = null;
        var validationResult;
        e.ancestors().each(
            function (o)
            {
                if (o.className.strip() == "tabberlive")
                    tabContainer = $(o);
                if (o.className.indexOf("tabbertab") != -1)
                    currentTab = $(o);
            }
        );
        // Get the index of the current tab
        var currentTabIndex = parseInt(currentTab.id.substring(currentTab.id.length - 1, currentTab.id.length));
        var currentObjectName = "CheckNumberTextBox";

        var paymentType = document.getElementById(e.id.substring(0, e.id.length - currentObjectName.length) + 'PaymentTypeIdDropDownList');
        
        if (paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_CHECK)
            validationResult =  (Validation.get('required').test(v) && Validation.get('validate-digits').test(v));
        else
            validationResult = !Validation.get('required').test(v);

        if (!validationResult)
            tabContainer.tabber.tabShow(currentTabIndex);
            
        return validationResult;
    }
    else
        return true;
}

function validateMTECardNumber(v, e)
{
    // Get the tab the control is on
    var tabContainer = null;
    var currentTab = null;
    var validationResult;
    e.ancestors().each(
        function (o)
        {
            if (o.className.strip() == "tabberlive")
                tabContainer = $(o);
            if (o.className.indexOf("tabbertab") != -1)
                currentTab = $(o);
        }
    );
    // Get the index of the current tab
    var currentTabIndex = parseInt(currentTab.id.substring(currentTab.id.length - 1, currentTab.id.length));
    var currentObjectName = "CardNumberTextBox";
    
    var paymentType = document.getElementById(e.id.substring(0, e.id.length - currentObjectName.length) + 'PaymentTypeIdDropDownList');
    var last4DigitsLabel = document.getElementById(e.id.substring(0, e.id.length - currentObjectName.length) + 'CardNumberLast4DigitsLabel');

    // Check if payment type is correct and set the payment type based on card number if not correct
    var paymentTypeBasedOnCardNumber = GetCreditCardType(v);
    if(paymentTypeBasedOnCardNumber != "" &&
         paymentTypeBasedOnCardNumber != paymentType[paymentType.selectedIndex].value)
    {
        paymentType.value = paymentTypeBasedOnCardNumber;
    }

    if (paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_AMEX ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_DISCOVER ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_MASTERCARD ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_VISA ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_DINERSCLUB)
    {
        if (last4DigitsLabel != null && v == "")
            return true;
        paymentTypeText = "";
        switch (paymentType[paymentType.selectedIndex].value)
        {
        case PAYMENTTYPEID_MASTERCARD:
            paymentTypeText = "mastercard";
            break;
        case PAYMENTTYPEID_VISA:
            paymentTypeText = "visa";
            break;
        case PAYMENTTYPEID_AMEX:
            paymentTypeText = "amex";
            break;
        }
        validationResult = (Validation.get('required').test(v) && Validation.get('validate-digits').test(v) && IsValidCreditCardNumber(v, paymentTypeText) );
    }
    else
        validationResult = !Validation.get('required').test(v);
        
    if (!validationResult)
        tabContainer.tabber.tabShow(currentTabIndex);
        
    return validationResult;
}

function validateMTENameOnCard(v, e)
{
    // Get the tab the control is on
    var tabContainer = null;
    var currentTab = null;
    var validationResult;
    e.ancestors().each(
        function (o)
        {
            if (o.className.strip() == "tabberlive")
                tabContainer = $(o);
            if (o.className.indexOf("tabbertab") != -1)
                currentTab = $(o);
        }
    );
    // Get the index of the current tab
    var currentTabIndex = parseInt(currentTab.id.substring(currentTab.id.length - 1, currentTab.id.length));
    var currentObjectName = "NameOnCardTextBox";

    var paymentType = document.getElementById(e.id.substring(0, e.id.length - currentObjectName.length) + 'PaymentTypeIdDropDownList');
    if (paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_AMEX ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_DISCOVER ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_MASTERCARD ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_VISA ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_DINERSCLUB)
        validationResult = Validation.get('required').test(v);
    else
        validationResult = !Validation.get('required').test(v);
        
    if (!validationResult)
        tabContainer.tabber.tabShow(currentTabIndex);
        
    return validationResult;
}

function validateCardNumberVerify(v, e)
{
    // Get the tab the control is on
    var tabContainer = null;
    var currentTab = null;
    var validationResult;
    e.ancestors().each(
        function (o)
        {
            if (o.className.strip() == "tabberlive")
                tabContainer = $(o);
            if (o.className.indexOf("tabbertab") != -1)
                currentTab = $(o);
        }
    );
    // Get the index of the current tab
    var currentTabIndex = parseInt(currentTab.id.substring(currentTab.id.length - 1, currentTab.id.length));
    var currentObjectName = "CardNumberConfirmTextBox";
    
    var cardNumber = document.getElementById(e.id.substring(0, e.id.length - currentObjectName.length) + 'CardNumberTextBox');
    if ($F(cardNumber) != v)
        return false;
    else
        return true;
}

function validateMTECVV(v, e)
{
    // Get the tab the control is on
    var tabContainer = null;
    var currentTab = null;
    var validationResult;
    e.ancestors().each(
        function (o)
        {
            if (o.className.strip() == "tabberlive")
                tabContainer = $(o);
            if (o.className.indexOf("tabbertab") != -1)
                currentTab = $(o);
        }
    );
    // Get the index of the current tab
    var currentTabIndex = parseInt(currentTab.id.substring(currentTab.id.length - 1, currentTab.id.length));
    var currentObjectName = "SecurityCodeTextBox";
    
    var paymentType = document.getElementById(e.id.substring(0, e.id.length - currentObjectName.length) + 'PaymentTypeIdDropDownList');

    if (paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_AMEX ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_DISCOVER ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_MASTERCARD ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_VISA ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_DINERSCLUB)
        validationResult = /^[0-9]{3,4}$/.test(v);
    else
        validationResult = !Validation.get('required').test(v);
        
    if (!validationResult)
        tabContainer.tabber.tabShow(currentTabIndex);
        
    return validationResult;
}

function validateMTECardType(v, e)
{
    // Get the tab the control is on
    var tabContainer = null;
    var currentTab = null;
    var validationResult;
    e.ancestors().each(
        function (o)
        {
            if (o.className.strip() == "tabberlive")
                tabContainer = $(o);
            if (o.className.indexOf("tabbertab") != -1)
                currentTab = $(o);
        }
    );
    // Get the index of the current tab
    var currentTabIndex = parseInt(currentTab.id.substring(currentTab.id.length - 1, currentTab.id.length));
    var currentObjectName = "CardTypeDropDownList";
    
    var paymentType = document.getElementById(e.id.substring(0, e.id.length - currentObjectName.length) + 'PaymentTypeIdDropDownList');
    if (paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_AMEX ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_DISCOVER ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_MASTERCARD ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_VISA ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_DINERSCLUB)
        validationResult = (v != "");
    else
        validationResult = (v == "");
        
    if (!validationResult)
        tabContainer.tabber.tabShow(currentTabIndex);
        
    return validationResult;
}

function validateMTEExpirationMonth(v, e)
{
    // Get the tab the control is on
    var tabContainer = null;
    var currentTab = null;
    var validationResult;
    e.ancestors().each(
        function (o)
        {
            if (o.className.strip() == "tabberlive")
                tabContainer = $(o);
            if (o.className.indexOf("tabbertab") != -1)
                currentTab = $(o);
        }
    );
    // Get the index of the current tab
    var currentTabIndex = parseInt(currentTab.id.substring(currentTab.id.length - 1, currentTab.id.length));
    var currentObjectName = "CardExpirationMonthDropDownList";
    
    var paymentType = document.getElementById(e.id.substring(0, e.id.length - currentObjectName.length) + 'PaymentTypeIdDropDownList');
    if (paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_AMEX ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_DISCOVER ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_MASTERCARD ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_VISA ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_DINERSCLUB)
        validationResult = (v != "");
    else
        validationResult = (v == "");
        
    if (!validationResult)
        tabContainer.tabber.tabShow(currentTabIndex);
        
    return validationResult;
}

function validateMTEExpirationYear(v, e)
{
    // Get the tab the control is on
    var tabContainer = null;
    var currentTab = null;
    var validationResult;
    e.ancestors().each(
        function (o)
        {
            if (o.className.strip() == "tabberlive")
                tabContainer = $(o);
            if (o.className.indexOf("tabbertab") != -1)
                currentTab = $(o);
        }
    );
    // Get the index of the current tab
    var currentTabIndex = parseInt(currentTab.id.substring(currentTab.id.length - 1, currentTab.id.length));
    var currentObjectName = "CardExpirationYearDropDownList";
    
    var paymentType = document.getElementById(e.id.substring(0, e.id.length - currentObjectName.length) + 'PaymentTypeIdDropDownList');
    if (paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_AMEX ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_DISCOVER ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_MASTERCARD ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_VISA ||
        paymentType[paymentType.selectedIndex].value == PAYMENTTYPEID_DINERSCLUB)
        validationResult = (v != "");
    else
        validationResult = (v == "");
        
    if (!validationResult)
        tabContainer.tabber.tabShow(currentTabIndex);
        
    return validationResult;
}

function validateDateLetterEmailSent(v, e)
{
    var letterEmailType = $(e.id.substring(0, e.id.length - 'DateLetterEmailSentTextBox'.length) + 'LetterEmailTypeIdDropDownList');
    var letterEmailTypeOther = $(e.id.substring(0, e.id.length - 'DateLetterEmailSentTextBox'.length) + 'LetterEmailTypeOtherReasonTextBox');
    
    if (letterEmailType[letterEmailType.selectedIndex].value != "" || Validation.get('required').test(letterEmailTypeOther.value) || Validation.get('required').test(v))
        return Validation.get('required').test(v) && v.isValidDate();
    else
        return true;
}

function validateLetterEmailType(v, e)
{
    var dateLetterEmailSent = $(e.id.substring(0, e.id.length - 'LetterEmailTypeIdDropDownList'.length) + 'DateLetterEmailSentTextBox');
    
    if (Validation.get('required').test(dateLetterEmailSent.value))
        return Validation.get('required').test(v);
    else
        return true;
}

function validateLetterEmailTypeOther(v, e)
{
    var dateLetterEmailSent = $(e.id.substring(0, e.id.length - 'LetterEmailTypeOtherReasonTextBox'.length) + 'DateLetterEmailSentTextBox');
    var letterEmailType = $(e.id.substring(0, e.id.length - 'LetterEmailTypeOtherReasonTextBox'.length) + 'LetterEmailTypeIdDropDownList');
    
    if (Validation.get('required').test(dateLetterEmailSent.value) && letterEmailType[letterEmailType.selectedIndex].value == OTHERID_LETTEREMAILTYPE)
        return Validation.get('required').test(v);
    else
        return true;
}

function validateCancellationReasonOther(v, e)
{
    var cancellationReasonIdDropDownList = $(e.id.substring(0, e.id.length - 'CancellationReasonOtherTextBox'.length) + 'CancellationReasonIdDropDownList');

    var returnValue = 
    (
        ( Validation.get('required').test(v) && ($F(cancellationReasonIdDropDownList) == OTHERID_CANCELLATIONREASON) )
        ||
        ( !Validation.get('required').test(v) && ($F(cancellationReasonIdDropDownList) != OTHERID_CANCELLATIONREASON) )
    );
    return returnValue;
}

function validateCreditReasonOther(v, e)
{
    var creditReasonIdDropDownList = $(e.id.substring(0, e.id.length - 'CreditReasonOtherTextBox'.length) + 'CreditReasonIdDropDownList');

    var returnValue = 
    (
        ( Validation.get('required').test(v) && ($F(creditReasonIdDropDownList) == OTHERID_CREDITREASON) )
        ||
        ( !Validation.get('required').test(v) && ($F(creditReasonIdDropDownList) != OTHERID_CREDITREASON) )
    );
    return returnValue;
}

function validateBackBillingDeclineDate(v, e)
{
    var backBillingDeclineReason = $(e.id.substring(0, e.id.length - 'BackBillingDeclineDateTextBox'.length) + 'BackBillingDeclineReasonIdDropDownList');
    
    if (backBillingDeclineReason[backBillingDeclineReason.selectedIndex].value != "" || Validation.get('required').test(v))
        return Validation.get('required').test(v) && v.isValidDate();
    else
        return true;
}

function validateBackBillingDeclineReason(v, e)
{
    var backBillingDeclineDate = $(e.id.substring(0, e.id.length - 'BackBillingDeclineReasonIdDropDownList'.length) + 'BackBillingDeclineDateTextBox');
    
    if (Validation.get('required').test(backBillingDeclineDate.value))
        return Validation.get('required').test(v);
    else
        return true;
}

function validateSubscriptionEndDate(v, e)
{
    var subscriptionStartDateTextBox = $(e.id.substring(0, e.id.length - 'SubscriptionEndDateTextBox'.length) + 'SubscriptionStartDateTextBox');
    var subscriptionIntervalIdDropDownList = $(e.id.substring(0, e.id.length - 'SubscriptionEndDateTextBox'.length) + 'SubscriptionIntervalIdDropDownList');
    if (!isNaN($F(subscriptionIntervalIdDropDownList)) &&
        $F(subscriptionStartDateTextBox).isValidDate() &&
        v.isValidDate()) 
    {
        CambridgeWhosWhoWebServices.GetSubscriptionEndDate(
                $F(subscriptionIntervalIdDropDownList),
                $F(subscriptionStartDateTextBox),
                v,
                function(result) {
                    e.value = result;
                },
                function(error) {
                });
     
    }
    return true;
}

// This array is used to validate no-backbilling reason
var backBillingItems = new Array();
function validateNoBackBillingReason(v, e)
{
    // Check if the program has back-billing
    var hasBackBillingByDefault = false;
    if (window.programHasBackBilling != undefined)
        hasBackBillingByDefault = programHasBackBilling;
    
    if (hasBackBillingByDefault)
    {
        if (backBillingItems.length == 0) // No backbilling items    
            return Validation.get('required').test(v);
        else // There are backbilling items, get the total
        {
            var totalBilling = 0;
            for (var i = 0; i < backBillingItems.length; i++)
            {
                var billingAmount = parseFloat($F($(backBillingItems[i][0])));
                if (isNaN(billingAmount))
                {
                    billingAmount = parseFloat($(backBillingItems[i][1]).innerText);
                }
                totalBilling += billingAmount;
            }
            if (totalBilling == 0)
                return Validation.get('required').test(v);
            else
                return true;
        }
    }
    else
        return true;
}

// Initialize the validator
function initializeValidator(f)
{
    new Validation(f,
                {
                        stopOnFirst  : true,
                        immediate   : true,
                        useTitles   : true,
                        onFormValidate : OnFormValidate
                });
    Validation.add('validate-date-accurate', 'Invalid entry.', function(v) {
        return !Validation.get('required').test(v) || v.isValidDate();
    });
    Validation.add('validate-time', 'Invalid entry.', function(v) {
        return !Validation.get('required').test(v) || v.isValidTime();
    });
    Validation.add('validate-email', 'Invalid entry.', function(v) {
        return !Validation.get('required').test(v) || v.isValidEmail();
    });
    Validation.add('validate-zipcode', 'Invalid entry.', function(v) {
        return !Validation.get('required').test(v) || v.isValidZipCode();
    });
    Validation.add('validate-price', 'Invalid entry.', function(v, e) {
        return validatePrice(v, e);
    });
    Validation.add('validate-price-regular', 'Invalid entry', function(v, e)    {
        return validatePriceRegular(v, e);
    });
    Validation.add('validate-quantity', 'Invalid entry.', {
        pattern : new RegExp("^([0-9]|[1-9][0-9]+)$", ""),
         minLength : 1,
         maxLength : 2,
         min : 1,
         max : 99
    });
    Validation.add('validate-mte-checknumber', 'Invalid entry.', function(v, e) {
        return validateMTECheckNumber(v, e);
    });
    Validation.add('validate-mte-cardnumber', 'Invalid entry.', function(v, e) {
        return validateMTECardNumber(v, e);
    });
    Validation.add('validate-mte-cardtype', 'Invalid entry.', function(v, e) {
        return validateMTECardType(v, e);
    });
    Validation.add('validate-mte-cvv', 'Invalid entry.', function(v, e) {
        return validateMTECVV(v, e);
    });
    Validation.add('validate-mte-expirationmonth', 'Invalid entry.', function(v, e) {
        return validateMTEExpirationMonth(v, e);
    });  
    Validation.add('validate-mte-expirationyear', 'Invalid entry.', function(v, e) {
        return validateMTEExpirationYear(v, e);
    });
    Validation.add('validate-mte-nameoncard', 'Invalid entry.', function(v, e) {
        return validateMTENameOnCard(v, e);
    });
    Validation.add('validate-mte-billingzipcode', 'Invalid entry.', function(v, e) {
        return validateMTEBillingZipCode(v, e);
    });
    Validation.add('validate-dateletteremailsent', 'Invalid entry.', function(v, e) {
        return validateDateLetterEmailSent(v, e);
    });
    Validation.add('validate-letteremailtype', 'Invalid entry.', function(v, e) {
        return validateLetterEmailType(v, e);
    });   
    Validation.add('validate-letteremailtypeother', 'Invalid entry.', function(v, e) {
        return validateLetterEmailTypeOther(v, e);
    });
    Validation.add('validate-cancellationreasonother', 'Invalid entry.', function(v, e) {
        return validateCancellationReasonOther(v, e);
    });
    Validation.add('validate-creditreasonother', 'Invalid entry.', function(v, e) {
        return validateCreditReasonOther(v, e);
    });    
    Validation.add('validate-nobackbillingreason', 'Invalid entry.', function(v, e) {
        return validateNoBackBillingReason(v, e);
    });     
    Validation.add('validate-backbillingdeclinedate', 'Invalid entry.', function(v, e) {
        return validateBackBillingDeclineDate(v, e);
    });  
    Validation.add('validate-backbillingdeclinereason', 'Invalid entry.', function(v, e) {
        return validateBackBillingDeclineReason(v, e);
    });
    Validation.add('validate-subscriptionenddate', 'Invalid entry.', function(v, e) {
        return validateSubscriptionEndDate(v, e);
    }); 
    Validation.add('validate-salesrepresentative', 'Please select a sales representative.', function(v, e) {
        return validateSalesRepresentative(v, e);
    });  
    Validation.add('validate-authorizedrepresentative', 'Invalid entry.', function(v, e) {
        return validateAuthorizedRepresentative(v, e);
    });  
    Validation.add('validate-mailcode', 'Invalid entry.', function(v, e) {
        return validateMailCode(v, e);
    });       
    Validation.add('validate-mailcode-verify', 'Invalid entry.', function(v, e) {
        return validateMailCodeVerify(v, e);
    }); 
    Validation.add('validate-trackingnumber-confirm', 'Invalid entry.', function(v, e) {
        return validateTrackingNumberConfirm(v, e);
    }); 
    Validation.add('validate-cardnumberconfirm', 'Invalid entry.', function(v, e) {
        return validateCardNumberVerify(v, e);
    }); 
}

/**********************************************
Quick member search functionality
/*********************************************/
var qs_paramMemberId = "";
var qs_paramDivisions = "";
var qs_paramFirstName = "";
var qs_paramLastName = "";
var qs_paramEmailAddress = "";
var qs_paramStatusID = "";
var qs_recordPerPage = 20;
var qs_startRowIndex = 0;
var qs_recordCount = 0;
var qs_pageCount = 0;
function OnQuickMemberSearchComplete(result)
{
    qs_recordCount = result.RecordCount;
    qs_pageCount = result.PageCount;
    
    var lastRecordNumber = (qs_startRowIndex + qs_recordPerPage + 1 > qs_recordCount) ? qs_recordCount : qs_startRowIndex + qs_recordPerPage;
    $("QuickSearchBoxMessage").innerText = result.RecordCount + " record(s) found.";
    if (qs_recordCount > 0)
        $("QuickSearchBoxMessage").innerText += " Displaying records " + (qs_startRowIndex + 1) + " - " + lastRecordNumber + ".";    
    
    if (qs_recordCount <= qs_recordPerPage)
        $("QuickSearchPager").update("");
    else
    {
        var pagerContent = "";
        if (qs_startRowIndex > 0)
            pagerContent += "<a href='javascript: QuickMemberSearchLoadPage(" + (qs_startRowIndex - qs_recordPerPage) + ");'>&lt;&lt; Previous Page</a> ";
        if ((qs_startRowIndex + qs_recordPerPage) < qs_recordCount)
            pagerContent += "<a href='javascript: QuickMemberSearchLoadPage(" + (qs_startRowIndex + qs_recordPerPage) + ");'>Next Page &gt;&gt;</a>";
        $("QuickSearchPager").update(pagerContent);        
    }
    
    // Clean the results
    $('QuickSearchResults').innerText = '';
   
    if (result.RecordCount > 0)
    {
        // Show the results
        table = Builder.node('table', {width:'100%',cellpadding:'2',cellspacing:'0',border:'0'});
        tbody = Builder.node('tbody');
        tr = Builder.node('tr');
        td = Builder.node('td',[ Builder.node('strong','Member Id')]);
        tr.appendChild(td);
        td = Builder.node('td',[ Builder.node('strong','Name')]);
        tr.appendChild(td);   
        td = Builder.node('td',[ Builder.node('strong','Division(s)')]);
        tr.appendChild(td); 
        td = Builder.node('td',[ Builder.node('strong','Status')]);
        tr.appendChild(td);  
        td = Builder.node('td',[ Builder.node('strong','Date Of Registration')]);
        tr.appendChild(td);         
        tbody.appendChild(tr);
        
        var registrationDate = "";
        
        
        // Iterate through the results
        for (var i = 0; i < result.Members.length; ++i)
        {
            var deactivatedString = "";
            if (!result.Members[i].Active)
                deactivatedString = "(D) ";
            
            var statusString = "";
            switch(result.Members[i].Pending)
            {
                case 0: statusString = "NotPending";
                        break;
                case 1: statusString = "BasicListing";
                        break;
                case 2: statusString = "MailFormMember";
                        break;
                case 3: statusString = "PendingPayment";
                        break;
                case 4: statusString = "UnapprovedLead";
                        break;
                case 5: statusString = "Nominated";
                        break;
            }
                            
            registrationDate = "";
            if (result.Members[i].DateOfRegistration.format("d") != "01/01/1")
                registrationDate = result.Members[i].DateOfRegistration.format("d");
            tr = Builder.node('tr',{onmouseout: 'javascript: $(\'QuickSearchAdditionalInfoBox\').hide();'});
            td = Builder.node('td', [
                    Builder.node('a', {href:'/Admin/MemberAdmin/MemberTransactionHistory/Default.aspx?MemberId=' + result.Members[i].MemberId, title:'zipcode:' + result.Members[i].ZipCode + ' - memberIdCode:' + result.MemberIdCode[i]}, result.Members[i].MemberId)
                ]);
            tr.appendChild(td);
            td = Builder.node('td', [
                    Builder.node('div', {onmouseover: 'javascript: QuickMemberSearchAdditioralInfo(this.parentNode);'}, [
                        Builder.node('span', {style:'color:red'}, deactivatedString),
                        Builder.node('a', {href:'/Admin/MemberAdmin/MemberTransactionHistory/Default.aspx?MemberId=' + result.Members[i].MemberId, title:'zipcode: ' + result.Members[i].ZipCode + ' - memberIdCode:' + result.MemberIdCode[i]}, result.Members[i].FirstName + ' ' + result.Members[i].LastName)
                    ])
                ]);     
            tr.appendChild(td);
            td = Builder.node('td', [
                    Builder.node('a', {href:'/Admin/MemberAdmin/MemberTransactionHistory/Default.aspx?MemberId=' + result.Members[i].MemberId}, result.MemberDivisions[i] )
                ]);
            tr.appendChild(td);  
            td = Builder.node('td', [
                    Builder.node('a', {href:'/Admin/MemberAdmin/MemberTransactionHistory/Default.aspx?MemberId=' + result.Members[i].MemberId}, statusString )
                ]); 
            tr.appendChild(td);
            td = Builder.node('td', registrationDate);
            tr.appendChild(td);         
            tbody.appendChild(tr);

            
        }
        table.appendChild(tbody);

        $('QuickSearchResults').appendChild(table);
        
    }
}

function QuickMemberSearchLoadPage(startRowIndex)
{
    $('QuickSearchResults').update("");
    $("QuickSearchPager").update("");
    $("QuickSearchBoxMessage").innerText = "Loading page...";
    
    qs_startRowIndex = startRowIndex;
    CambridgeWhosWhoWebServices.QuickMemberSearch(
    qs_recordPerPage,
    startRowIndex,
    qs_paramMemberId,
    qs_paramDivisions,
    qs_paramFirstName,
    qs_paramLastName,
    qs_paramEmailAddress,
    qs_paramStatusID,
    qs_searchMemberIdOnlyInMemberTable,
    OnQuickMemberSearchComplete,
    AjaxFailedCallback);
}

function QuickMemberSearchAdditioralInfo(column)
{
    var tableRow = column.parentNode;
    var tableCell = tableRow.firstChild;
    var memberId = parseInt(tableCell.innerText);
    var x_position = tableRow.offsetLeft;
    var y_position = tableRow.offsetTop;
    
    $('QuickSearchAdditionalInfoBox').setStyle({
                position: 'absolute',
                right: parseInt(x_position) + 620 + 'px',
                top: parseInt(y_position) + 230 +  'px'
                });
                
    //$('QuickSearchAdditionalInfoBox').innerText = memberId;
    //$('QuickSearchAdditionalInfoBox').show();
    
    CambridgeWhosWhoWebServices.QuickMemberSearchExtendedData(
        memberId,
        QuickMemberSearchAdditionalInfoComplete,
        AjaxFailedCallback);
}

function QuickMemberSearchAdditionalInfoComplete(result)
{
    $('QuickSearchAdditionalInfoBox').update("");
    $('QuickSearchAdditionalInfoBox').hide();
    
    if(result == null)
        return;
        
    // Show the results
    table = Builder.node('table', {width:'100%',cellpadding:'2',cellspacing:'0',border:'0'});
    tbody = Builder.node('tbody');
    tr = Builder.node('tr');
    // MemberId 
    td = Builder.node('td', {width: '40%'}, [ Builder.node('strong','Member Id')]);
    tr.appendChild(td);
    td = Builder.node('td',[ Builder.node('span', result.MemberId)]);
    tr.appendChild(td);
    tbody.appendChild(tr);
    // Last Sales Rep        
    tr = Builder.node('tr');
    td = Builder.node('td', {width: '40%'}, [ Builder.node('strong','Last Sales Rep')]);
    tr.appendChild(td); 
    td = Builder.node('td',[ Builder.node('span', result.LastSalesRepFirstName + ' ' + result.LastSalesRepLastName)]);
    tr.appendChild(td);  
    tbody.appendChild(tr);
    // Last Sales Rep Extension       
    tr = Builder.node('tr');
    td = Builder.node('td', {width: '40%'}, [ Builder.node('strong','Sales Rep Ext')]);
    tr.appendChild(td); 
    td = Builder.node('td',[ Builder.node('span', result.CurrentExtension)]);
    tr.appendChild(td);  
    tbody.appendChild(tr);
    // Last End Call Reason Date 
    tr = Builder.node('tr');
    td = Builder.node('td', {width: '40%'}, [ Builder.node('strong','Last Call Date')]);
    tr.appendChild(td); 
    td = Builder.node('td',[ Builder.node('span', result.LastEndCallReasonDate)]);
    tr.appendChild(td);  
    tbody.appendChild(tr);
    // Last End Call Reason 
    tr = Builder.node('tr');
    td = Builder.node('td', {width: '40%'}, [ Builder.node('strong','Last End Call')]);
    tr.appendChild(td); 
    td = Builder.node('td',[ Builder.node('span', result.EndCallReason)]);
    tr.appendChild(td);  
    tbody.appendChild(tr);
    
    table.appendChild(tbody);
    
    $('QuickSearchAdditionalInfoBox').update("");
    $('QuickSearchAdditionalInfoBox').appendChild(table);
    $('QuickSearchAdditionalInfoBox').show();
}

function QuickMemberSearch(memberid, divisions, firstName, lastName, emailAddress, statusid, divisionSelected, searchMemberIdOnlyInMemberTable)
{
    var memberIdParsed = memberid.strip();
            
    if (firstName == '' && lastName == '' && emailAddress == '' && memberIdParsed == '')
    {
        alert('Please use one of the search fields.')
        return;
    }
    
    if (statusid == '')
        statusid = null;
    
    $('QuickSearchResults').update("");
    $("QuickSearchPager").update("");
    $("QuickSearchBoxMessage").innerText = "Searching...";
    
    var divisionsToPull = divisions;
    // Check if any division is selected
    if (divisionSelected != "")
        divisionsToPull = "," + divisionSelected + ",";

    qs_paramMemberId = memberIdParsed;
    qs_paramDivisions = divisionsToPull;
    qs_paramFirstName = firstName;
    qs_paramLastName = lastName;
    qs_paramEmailAddress = emailAddress;
    qs_paramStatusID = statusid;
    qs_startRowIndex = 0;
    qs_recordCount = 0;
    qs_pageCount = 0;
    qs_searchMemberIdOnlyInMemberTable = searchMemberIdOnlyInMemberTable;
    
    CambridgeWhosWhoWebServices.QuickMemberSearch(
    qs_recordPerPage,
    0,
    memberIdParsed,
    divisionsToPull,
    firstName,
    lastName,
    emailAddress,
    statusid,
    searchMemberIdOnlyInMemberTable,
    OnQuickMemberSearchComplete,
    AjaxFailedCallback);
}

function OpenMailSelectorPopUp(mailCodeHiddenFieldId, mailCodeSpanId)
{
    var mailCodeWindow = window.open("/Admin/MemberAdmin/MailCodeSelector/Default.aspx?mailCodeHiddenFieldId=" + mailCodeHiddenFieldId + "&mailCodeSpanId=" + mailCodeSpanId,"mailCodeWindow","width=550,height=400,scrollbars=1;,status=yes");
}

function GetMailCode(mailCode, mailCodeHiddenFieldId, mailCodeSpanId)
{
    $(mailCodeHiddenFieldId).value = mailCode;
    $(mailCodeSpanId).innerText = mailCode;
}

function DeleteMailingCode(mailCodeHiddenFieldId, mailCodeSpanId)
{
    $(mailCodeHiddenFieldId).value = '';
    $(mailCodeSpanId).innerText = '';
}

function HideAllCustomerFields() 
{
    $$('div').findAll(
        function(elm)
        {
            elm.classNames().each(
                function(className)
                {
                    if (className == "CSField")
                        elm.hide();
                }
            );
        }
    )
}

var showCustomerFieldsStatus = true;
function ShowCustomerFields(wrapperElm)
{    
    if (!$(wrapperElm).visible())
        showCustomerFieldsStatus = true

    $(wrapperElm).show();
    var csElements = $(wrapperElm).getElementsByClassName('CSField');

    for (var i = 0; i < csElements.length; i++) {
        var elm = csElements[i];

        if (showCustomerFieldsStatus)
            elm.show();
        else
            elm.hide();
    }

    showCustomerFieldsStatus = !showCustomerFieldsStatus;
}

function ExtendWrapperToEnoughHeightForNotesField(elm)
{
    var heightMinimum = 360;
    // Make the wrapper div tall enough to show the notes field
    if (elm.ancestors()[0].getDimensions().height < heightMinimum)
    elm.ancestors()[0].style.height = heightMinimum + "px";
}

function PopulateAddressCopyOption(objDropDownList, addressTypeId)
{
    objDropDownList = $(objDropDownList);
    // Clean the item list
    objDropDownList.options.length = 0;
    objDropDownList.options[0] = new Option("Select", "");
    
    if (window.companyAddressEditorUserControl != undefined && addressTypeId != 1)
    {
        var optionElement = new Option("Copy from the company address", companyAddressEditorUserControl);
        objDropDownList.options[objDropDownList.options.length] = optionElement;
    }
    if (window.alternativeAddressEditorUserControl != undefined && addressTypeId != 2)
    {
        var optionElement = new Option("Copy from the alternative address", alternativeAddressEditorUserControl);
        objDropDownList.options[objDropDownList.options.length] = optionElement;
    }
    if (window.shippingAddressEditorUserControl != undefined && addressTypeId != 3)
    {
        var optionElement = new Option("Copy from the shipping address", shippingAddressEditorUserControl);
        objDropDownList.options[objDropDownList.options.length] = optionElement;
    }    
    var optionElement = new Option("Copy from the billing address from the last sale", "LastBillingAddress");
    objDropDownList.options[objDropDownList.options.length] = optionElement;
}

function SetSelectedItemInDropDownList(ddl, selectedValue)
{
    ddl = $(ddl);
    for (var i = 0; i < ddl.options.length; i++)
    {
        if (ddl.options[i].value == selectedValue)
        {
            ddl.options[i].selected = true;
            break;
        }
    }
}

function CopyAddressFromUserControl(sourceControl, destinationControl)
{
    if (sourceControl != "")
    {
        if (sourceControl == "LastBillingAddress" && !window.lastBillingAddress_AddressLine1)
        {
            alert("No billing address exists in the system.");
            return;
        }
        if (confirm("Are you sure you want to copy the address information?\n\nIf the source address information is empty, the destination address will be emptied out as well."))
        {            
            if (sourceControl == "LastBillingAddress")
            {
                SetSelectedItemInDropDownList($(destinationControl + "_AddressCategoryIdDropDownList"), "");
                $(destinationControl + "_AddressLine1TextBox").value = lastBillingAddress_AddressLine1;
                $(destinationControl + "_AddressLine2TextBox").value = lastBillingAddress_AddressLine2;
                $(destinationControl + "_CityTextBox").value = lastBillingAddress_City;
                SetSelectedItemInDropDownList($(destinationControl + "_StateIdDropDownList"), lastBillingAddress_StateId);
                $(destinationControl + "_ZipCodeTextBox").value = lastBillingAddress_ZipCode;
                SetSelectedItemInDropDownList($(destinationControl + "_CountryIdDropDownList"), lastBillingAddress_CountryId);
            }
            else
            {
                SetSelectedItemInDropDownList($(destinationControl + "_AddressCategoryIdDropDownList"), $F($(sourceControl + "_AddressCategoryIdDropDownList")));
                $(destinationControl + "_AddressLine1TextBox").value = $(sourceControl + "_AddressLine1TextBox").value;
                $(destinationControl + "_AddressLine2TextBox").value = $(sourceControl + "_AddressLine2TextBox").value;
                $(destinationControl + "_CityTextBox").value = $(sourceControl + "_CityTextBox").value;
                SetSelectedItemInDropDownList($(destinationControl + "_StateIdDropDownList"), $F($(sourceControl + "_StateIdDropDownList")));
                $(destinationControl + "_ZipCodeTextBox").value = $(sourceControl + "_ZipCodeTextBox").value;
                SetSelectedItemInDropDownList($(destinationControl + "_CountryIdDropDownList"), $F($(sourceControl + "_CountryIdDropDownList")));
            }
        }
    }
}

var addressValidationInProgress = false;
var validateAddressCityTextBox = null;
var validateAddressStateIdDropDownList = null;
var validateAddressZipCodeTextBox = null;

function OnValidateAddressComplete(result)
{
    addressValidationInProgress = false;    
    if (result.length == 0)
    {
        alert("No matches found.");
    }
    else
    {
        var suggestions = "Here are the suggestions based on your entry:\n";
        for ( var i = 0; i < result.length; i++ )
        {
            if (result[0].Match == "True")
            {
                alert("Address is valid.");
                return;
            }
            suggestions += result[i].City + ", " + result[i].State + " " + result[i].ZipCode + "\n";
        }
        alert(suggestions);
    }    
}

function OnValidateAddressFail(error)
{
    alert("Address could not be validated. An exception has occured: " + error.get_message());
    addressValidationInProgress = false;
}

function BeginValidateAddress(cityTextBox, stateIdDropDownList, zipCodeTextBox)
{
    if (!addressValidationInProgress)
    {
        // Check the field values
        var city = cityTextBox.value;
        var state = stateIdDropDownList[stateIdDropDownList.selectedIndex].text;    
        var zipCode = zipCodeTextBox.value;
        if ($F(stateIdDropDownList) == "")
        {
            alert("You must select a state for address validation.");
            return;
        }
        if (zipCode != "" && ( zipCode.length != 5 || !zipCode.isValidZipCode()))
        {
            alert("Zip code should be a 5 digit value.");
            return;
        }
        if (city == "" && zipCode == "")
        {
            alert("You muster enter either a state or a zipcode.");
            return;
        }
        addressValidationInProgress = true;
        validateAddressCityTextBox          = cityTextBox;
        validateAddressStateIdDropDownList  = stateIdDropDownList;
        validateAddressZipCodeTextBox       = zipCodeTextBox;
        // Make a request to validate the address
        CwwWebServices.ValidateAddress(
            city,
            zipCode,
            state,
            OnValidateAddressComplete,
            OnValidateAddressFail);
    }
}
/*
 *
 * BEGIN: AutoCompleteTextBox related methods
 *
 */
function HandleAutoCompleteSelection(obj, text, itemId)
{
    // Find the hidden fields and the label
    var textHiddenField = $(obj.id.replace(/(.*)(_AutoCompleteTextBox)/, "$1_TextHiddenField"));
    var idHiddenField = $(obj.id.replace(/(.*)(_AutoCompleteTextBox)/, "$1_IdHiddenField"));
    var selectedItemLabel = $(obj.id.replace(/(.*)(_AutoCompleteTextBox)/, "$1_SelectedItemLabel"));
    // Set the value of the hidden field and the label
    textHiddenField.value = text;
    idHiddenField.value = itemId;
    selectedItemLabel.innerText = text;
    // Find the panel
    var textBoxPanel = $(obj.ancestors()[0]);
    textBoxPanel.hide();
}

function SelectFromAutoCompleteList(obj, selectItemString)
{
    // Find the hidden fields and the label
    var textHiddenField = $(obj.id.replace(/(.*)(_AutoCompleteTextBox)/, "$1_TextHiddenField"));
    var idHiddenField = $(obj.id.replace(/(.*)(_AutoCompleteTextBox)/, "$1_IdHiddenField"));
    var selectedItemLabel = $(obj.id.replace(/(.*)(_AutoCompleteTextBox)/, "$1_SelectedItemLabel")); 
    // Set the values   
    idHiddenField.value = "";
    textHiddenField.value = "";
    selectedItemLabel.innerText = selectItemString;    
    // Find the panels
    var textBoxPanel = $(obj.ancestors()[0]);
    var selectPanel = $(textBoxPanel.id.replace(/(.*)(_TextBoxPanel)/, "$1_SelectPanel"));
    // Show/Hide panels
    textBoxPanel.show();
    selectPanel.hide();
}
/*
 *
 * END: AutoCompleteTextBox related methods
 *
 */
 
/*
 * BEGIN: Methods that handle the automatic update of back billing date
 */
var backbillingDateTextBoxes = $A();
function RegisterBackBillingDate(obj)
{
    backbillingDateTextBoxes.push($(obj));
}
function UpdateBackBillingDate(dateOfTransaction)
{
    if (dateOfTransaction.isValidDate())
    {
        var backBillingDate = Date.parseString(dateOfTransaction);
        backBillingDate = backBillingDate.add("d", 30);
        backbillingDateTextBoxes.each(function(obj){            
            obj.value = backBillingDate.format("MM/dd/yyyy");
        });
    }
}
/*
 * END: Methods that handle the automatic update of back billing date
 */
function ClearListBox(obj)
{
    var optionsLength = $(obj).options.length;
    for (var i = 0; i < optionsLength; i++)
        $(obj).remove(0);  
}

function AddOptionToListBox(obj, value, text, selected)
{
    var el = document.createElement('OPTION');
    
    if(selected == null) selected = null;
    
    if(selected != null && selected == 'true')
    {
        el.setAttribute('selected', 'selected');   
    }
    el.setAttribute('value', value);
    el.appendChild( document.createTextNode(text) );
    // Add the option to the dropdown
    $(obj).appendChild(el);
}

function SetSelectedItemInListBoxByValue(obj, value)
{
    obj = $(obj);
    for (var i = 0; i < obj.length; i++)
    {
        if (obj[i].value == value)
        {
            obj[i].selected = true;
            return;
        }
    }
}

var authorizationCodeControls = $A();

function AddAuthorizationCodeControls(obj)
{
    obj = $(obj);
    if (obj == null)
        return;
    obj.hide();
    authorizationCodeControls.push(obj);
}

function ToggleAuthorizationCodeControls(enabled)
{
    if (enabled)
        authorizationCodeControls.each(function(obj) { obj.show() });
    else
        authorizationCodeControls.each(function(obj) { obj.hide() });
}

function VerifiyAuthorizationCode(sender, code, message)
{
    if(code == authCode.base64_decode())
    {
        authorizedCodeVerified = true;
        ToggleAuthorizationCodeControls(authorizedCodeVerified);
        sender.disable();
        if(message != '')
            alert(message);
    }
    else
    {
        alert("Authorization code could not be verified");
    }
}

var priceOverrideControls = $A();

function AddPriceOverrideControl(obj)
{
    if (obj == null)
        return;
    obj = $(obj);
    obj.disable();
    priceOverrideControls.push(obj);
}

function TogglePriceOverrideControls(enabled)
{
    if (enabled)
        priceOverrideControls.each(function(obj){obj.enable()});
    else
        priceOverrideControls.each(function(obj){obj.disable()});    
}

function VerifyPriceOverrideCode(sender, code)
{
    if (code == authCode.base64_decode())
    {
        authorizedToOverridePrices = true;
        TogglePriceOverrideControls(true);
        sender.disable();
        alert("Price override feature is unlocked.");
    }
    else
    {
        alert("Authorization code could not be verified");
    }
}

var initializedProcessingPanel = false;
function InitializeProcessingPanel()
{
    if (!initializedProcessingPanel)
    {
        YAHOO.namespace("ProcessingPanel");
        
        // Initialize the temporary Panel to display while waiting for external content to load
        YAHOO.ProcessingPanel.wait = 
	            new YAHOO.widget.Panel("wait",  
		            { width:"240px", 
		              fixedcenter:true, 
		              close:false, 
		              draggable:false, 
		              zindex:99999,
		              modal:true,
		              visible:false
		            } 
	            );

        YAHOO.ProcessingPanel.wait.setHeader("Processing, please wait...");
        YAHOO.ProcessingPanel.wait.setBody('<img src="/Images/Icons/loading.gif" />');
        YAHOO.ProcessingPanel.wait.render(document.body);
        
        initializedProcessingPanel = true;
    }
}

function InitializeLoadingPanel(className, panelName, messageText, width)
{
    YAHOO.namespace(className);    
    // Initialize the temporary Panel to display while waiting for external content to load
    var script = "YAHOO." + className + "." + panelName + " = \n" +
	     "   new YAHOO.widget.Panel(\"" + panelName + "\",{\n";
    if (width != null)
		 script += "    width:\"" + width + "\",\n";
    script += "         fixedcenter:true,\n" +
		 "         close:false,\n" +
		 "         draggable:false,\n" +
		 "         zindex:99999,\n" +
		 "         modal:true,\n" +
		 "         visible:false\n" +
		 "       }\n" + 
	     "   );\n" +
         "YAHOO." + className + "." + panelName + ".setHeader(\"" + messageText + "\");\n" + 
         "YAHOO." + className + "." + panelName + ".setBody('<img src=\"/Images/Icons/loading.gif\" />');\n" + 
         "YAHOO." + className + "." + panelName + ".render(document.body);\n";
    eval(script);
}

function InitializeModalDialog(controlIdToCreate, contentId, contentWidth, contentHeight, dialogHeaderText, okButtonText, okButtonHandler, cancelButtonText, cancelButtonHandler)
{
    YAHOO.namespace(controlIdToCreate);
    var script = "YAHOO." + controlIdToCreate + "." + contentId + " = " +
    "    new YAHOO.widget.Dialog\n" +
    "    (" +
    "       \"" + contentId + "\",\n" +  
    "        {\n";
    
    if (contentWidth != null)
        script += " width:          contentWidth,\n";
    
    if (contentHeight != null)
        script += " height:          contentHeight,\n";        
        
    script +=
    "            buttons : [ { text:okButtonText, handler:okButtonHandler, isDefault:true }";
    
    if (cancelButtonHandler != null)
        script += ",\n" +
	        "                       { text:cancelButtonText, handler:cancelButtonHandler }";
	
	script += " ],\n" +
	"	         fixedcenter:    true,\n" + 
	"            constraintoviewport : true,\n" +
    "            close:          false,\n" + 
    "            draggable:      false,\n" + 
    "            zindex:         99999,\n" +
    "            modal:          true,\n" +
    "            visible:        false\n" +
    "        }\n" +
    "    );\n" + 
    "YAHOO." + controlIdToCreate + "." + contentId + ".setHeader(dialogHeaderText);\n" +
    "YAHOO." + controlIdToCreate + "." + contentId + ".render(document.body);\n";
    eval(script); 
}

var TimeEntryValues = new Array();
var TimeEntryOnFocusHandler = function(eventElement)
{
    // Store the value
    TimeEntryValues["TimeEntry_" + eventElement.target.id] = eventElement.target.value;
};

var TimeEntryOnChangeHandler = function(eventElement)
{
    var valueEntered = eventElement.target.value;

    // Check if the value is valid
    if (valueEntered != "" && !valueEntered.isValidTime())
    {
        //Restore to old value
        eventElement.target.value = TimeEntryValues["TimeEntry_" + eventElement.target.id];
    }
};

function CheckBoxListChangeStatus(cbControl, state) 
{    
    //generated control name starts with a colon
    var re = new RegExp(cbControl);
    for(var j = 0; j < document.forms[0].elements.length; j++) 
    {
        var elm = document.forms[0].elements[j];
        if ((elm.type == 'checkbox') && (!elm.disabled))
            if (elm.name.gsub(cbControl))
                elm.checked = state;
    }    
}


/**********************************************
Quick member search by sales rep functionality
/*********************************************/
function QuickMemberSearchBySalesRep(objectName, salesRepresentativeId, salesTypeId, resultPanel, pagerPanel, messagePanel)
{
    this.objectName = objectName;
    this.salesRepresentativeId = salesRepresentativeId;
    this.salesTypeId = salesTypeId;
    this.resultPanel = resultPanel;
    this.pagerPanel = pagerPanel;
    this.messagePanel = messagePanel;
    // Quick Search Parameters 
    this.memberId = "";
    this.firstName = "";
    this.lastName = "";
    this.dateOfPurchase = "";
    this.recordPerPage = 20;
    this.startRowIndex = 0;
    this.recordCount = 0;
    this.pageCount = 0;
    
    this.Search = function(memberId, firstName, lastName, dateOfPurchase)
        {
            // Save search params to local variables 
            this.memberId = memberId.strip();
            this.firstName = firstName;
            this.lastName = lastName;
            this.dateOfPurchase = dateOfPurchase.strip();
            
            if(this.firstName == '' && this.lastName == '' && this.memberId == '' && this.dateOfPurchase == '')
            {
                alert('Please use one of the search fields.');
                return;
            }      
            
            // Update the user interface 
            $(this.resultPanel).update("");
            $(this.pagerPanel).update("");
            $(this.messagePanel).innerText = "Searching...";
            
            // Call search web service
            CambridgeWhosWhoWebServices.QuickMemberSearchBySalesRepresentative(
                this.recordPerPage,
                0,
                this.salesRepresentativeId,
                this.memberId,
                this.firstName,
                this.lastName,
                this.dateOfPurchase,
                this.GetEventFn('search_complete',this),
                AjaxFailedCallback);
        }
    
    this.OnQuickMemberBySalesRepSearchComplete = function(result)
        {
            // Retrieve object 
            this.recordCount = result.RecordCount;
            this.pageCount = result.PageCount;
            
            var lastRecordNumber = (this.startRowIndex + this.recordPerPage + 1 > this.recordCount) ? this.recordCount : this.startRowIndex + this.recordPerPage;
            
            $(this.messagePanel).innerText = result.RecordCount + " record(s) found.";
            if(this.recordCount > 0)
                $(this.messagePanel).innerText += " Displaying records " + (parseInt(this.startRowIndex) + 1) + " - " + lastRecordNumber + ".";
            
            // Generate the paging panel 
            if(this.recordCount <= this.recordPerPage)
                $(this.pagerPanel).update("");
            else 
            {
                var pagerContent = "";
                if(this.startRowIndex > 0)
                    pagerContent += "<a href='javascript: " + this.objectName + ".QuickMemberSearchLoadPage(" + (this.startRowIndex - this.recordPerPage) + ");'>&lt;&lt; Previous Page</a> ";
                if ((this.startRowIndex + this.recordPerPage) < this.recordCount)
                    pagerContent += "<a href='javascript: " + this.objectName + ".QuickMemberSearchLoadPage(" + (this.startRowIndex + this.recordPerPage) + ");'>Next Page &gt;&gt;</a>";
                
                $(this.pagerPanel).update(pagerContent);
            }
            
            // Clean the results 
            $(this.resultPanel).innerText = '';
            
            if (result.RecordCount > 0)
            {
                // Show the results
                table = Builder.node('table', {width:'100%',cellpadding:'2',cellspacing:'0',border:'0'});
                tbody = Builder.node('tbody');
                tr = Builder.node('tr');
                td = Builder.node('td',[ Builder.node('strong','Member Id')]);
                tr.appendChild(td);
                td = Builder.node('td',[ Builder.node('strong','Name')]);
                tr.appendChild(td);   
                tbody.appendChild(tr);
                
                var registrationDate = "";
                
                // Iterate through the results
                for (var i = 0; i < result.Members.length; ++i)
                {
                    var deactivatedString = "";
                    if (!result.Members[i].Active)
                        deactivatedString = "(D) ";
                                    
                    tr = Builder.node('tr');
                    td = Builder.node('td', [
                            Builder.node('a', {href:'/Admin/SalesRepresentativeConsole/Common/SalesHistory/Default.aspx?SalesTypeId=1&MemberId=' + result.Members[i].MemberId, title:'' }, result.Members[i].MemberId)
                        ]);
                        
                    tr.appendChild(td);
                    td = Builder.node('td', [
                            Builder.node('a', {href:'/Admin/SalesRepresentativeConsole/Common/SalesHistory/Default.aspx?SalesTypeId=1&MemberId=' + result.Members[i].MemberId, title:'' }, result.Members[i].FirstName + ' ' + result.Members[i].LastName)
                      ]);
                    tr.appendChild(td);
                    tbody.appendChild(tr);
                }
                table.appendChild(tbody);

                $(this.resultPanel).appendChild(table);
            }
        }
        
    this.QuickMemberSearchLoadPage = function(startRowIndex)
        {
            $(this.resultPanel).update("");
            $(this.pagerPanel).update("");
            $(this.messagePanel).innerText = "Loading page...";
            this.startRowIndex = startRowIndex;
            
            CambridgeWhosWhoWebServices.QuickMemberSearchBySalesRepresentative(
                this.recordPerPage,
                this.startRowIndex,
                this.salesRepresentativeId,
                this.memberId,
                this.firstName,
                this.lastName,
                this.dateOfPurchase,
                this.GetEventFn('search_complete',this),
                AjaxFailedCallback);
        }  
       
    // Function closure for the search object 
    this.GetEventFn = function(type, instance)
        {
            var fn = function() {};
            switch (type)
            {
                case 'search_complete':
                    fn = function(result) 
                    {
                        instance.OnQuickMemberBySalesRepSearchComplete(result);
                    };
                    break;
                case 'search_failure':
                    fn = function(result)
                    {
                        instance.SearchFailure();
                    };
                    break;
            }
            return fn;
        };  
}




/*
    This class handles the member's profile change confirmation 
*/
function MemberProfileChangeConfirmation(approvedCallback, cancelledCallback) {
    this.IsProfileApproved = false;
    // initialize the popup box

    this.InitModalBox = function() {
        InitializeModalDialog("ModalDialog1", "ConfirmProfileUpdatePanel", "450px", null, "Confirm Profile Changes",
                                "Save", this.ApprovedProfileChanges,
                                "Cancel", this.CancelledProfileChanged);
        
        $('ConfirmProfileUpdatePanelContent').update('<p>I Understand that Saving my Biography will Result in My Biography Being Locked for Cambridge Who’s Who Editorial Staff Review</p>' + 
            '<p>Please click <b>"Save"</b> to confirm the changes or <b>"Cancel"</b> if you still have changes you wish to make at this time.</p>');
    }

    this.ShowConfirmationBox = function() {
        YAHOO.ModalDialog1.ConfirmProfileUpdatePanel.show();
    }

    this.HideConfirmationBox = function() {
        YAHOO.ModalDialog1.ConfirmProfileUpdatePanel.hide();
    }

    this.ApprovedProfileChanges = function() {
        approvedCallback();
    }

    this.CancelledProfileChanged = function() {
        cancelledCallback();
    }
}


var MemberProfileArchive = function(objectName, memberId, displayPanel, initialRowCount) {
    this.displayPanel = displayPanel;
    this.initialRowCount = initialRowCount;
    this.objectName = objectName;
    this.panel;
    this.resize;
    this.memberId = memberId;
    this.CalleeXPosition;
    this.CalleeYPosition;
    this.IsInitialCall = true;

    this.displayArchiveProfileHandler = function(event, object, memberId, fieldName, rowCount, skipRows) {
        // assign calle position only for the initial call 
        if (rowCount != 99) {
            object.CalleeXPosition = event.clientX;
            object.CalleeYPosition = event.clientY;
        }
        // initial call returns only 3 rows 
        IsInitialCall = rowCount != 99;

        object.displayArchiveProfile(memberId, fieldName, rowCount, skipRows);
    };

    this.displayArchiveProfile = function(memberId, fieldName, rowCount, skipRows) {

        this.fieldName = fieldName;
        this.memberId = memberId;

        CwwWebServices.GetMemberArchiveProfileHistory(memberId,
                fieldName,
                rowCount,
                skipRows,
                this.GetEventFn('search_complete', this),
                this.GetEventFn('search_failure', this));
    };

    this.renderProfileArchivePanel = function(result) {

        if (!this.panel) {
            this.panel = new YAHOO.widget.Panel(this.displayPanel, {
                draggable: true,
                width: "330px",
                height: "300px",
                autofillheight: "body",
                xy: [50, 50],
                constraintoviewport: true,
                visible: false,
                close: true,
                context: ["showbtn", "tl", "bl"]
            });

            this.panel.setHeader("Profile History");
        } else {
            if (IsInitialCall) {
                // update position
                this.panel.cfg.setProperty('x', 50);
                this.panel.cfg.setProperty('y', 50);
            }
        }

        this.panel.setBody(this.populateProfileHistory(result));
        this.panel.render();
        this.panel.show();
    };

    this.populateProfileHistory = function(result) {
        // Create the rows
        var table = Builder.node('table', { id: 'ProfileArchiveTable', width: '290px', cellpadding: '0', cellspacing: '0', border: '0' });
        var tbody = Builder.node('tbody');

        if (result.ProfileArchiveList.length > 0) {
            for (var index = 0; index < result.ProfileArchiveList.length; index++) {

                var tr = Builder.node('tr', { className: 'ProfileHistoryHeader' });
                var td = Builder.node('td', { width: '100%', height: '30px;' });
                td.appendChild(Builder.node('span', { className: 'ProfileHistoryHeaderLabel' }, "Updated by : "));
                td.appendChild(Builder.node('span', { className: 'ProfileHistoryHeaderLogin' }, (result.ProfileArchiveList[index].LoginName == '' ? 'unknown' : result.ProfileArchiveList[index].LoginName)));
                td.appendChild(Builder.node('span', { className: 'ProfileHistoryHeaderLabel' }, " on "));
                td.appendChild(Builder.node('span', { className: 'ProfileHistoryHeaderDate' }, result.ProfileArchiveList[index].DateAdded.format('MM/dd/yyyy')));

                tr.appendChild(td);
                tbody.appendChild(tr);

                tr = Builder.node('tr', { className: 'ProfileHistoryEntry' });
                td = Builder.node('td', { width: '100%' }, result.ProfileArchiveList[index].Value)
                tr.appendChild(td);
                tbody.appendChild(tr);
            }

            // add see more 
            if (result.MoreResults) {
                tr = Builder.node('tr', { className: 'ProfileHistoryMoreResults' });
                var profileHistoryLink = Builder.node('a', { id: 'profileHistoryLink', href: 'javascript:void();', title: '' }, 'more records');

                td = Builder.node('td', { height: '30px;' }, [profileHistoryLink]);
                tr.appendChild(td);
                tbody.appendChild(tr);

                Event.observe(profileHistoryLink, 'click', this.displayArchiveProfileHandler.bindAsEventListener(this, this, this.memberId, this.fieldName, 99, 0));
            }
        } else {
            var tr = Builder.node('tr', { className: 'ProfileHistoryHeader' });
            var td = Builder.node('td', { width: '100%', height: '30px;' }, "No results");

            tr.appendChild(td);
            tbody.appendChild(tr);
        }

        table.appendChild(tbody);
        var wrapper = Builder.node('div', { style: 'overflow-y:auto;overflow-x:hide;height:260px;' });
        wrapper.appendChild(table);

        return wrapper;
    };

    this.OnDisplayArchiveProfileComplete = function(result) {
        this.renderProfileArchivePanel(result);
    };

    this.OnDisplayArchiveProfileFailure = function(error) {
        alert(error);
    };

    // Function closure for the search object 
    this.GetEventFn = function(type, instance) {
        var fn = function() { };
        switch (type) {
            case 'search_complete':
                fn = function(result) {
                    instance.OnDisplayArchiveProfileComplete(result);
                };
                break;
            case 'search_failure':
                fn = function(result) {
                    instance.OnDisplayArchiveProfileFailure(result);
                };
                break;
        }
        return fn;
    };
};