function OffermaticaImpression(id, campaign_name, recipe_name, offer_name) { 
    this.id = id;
    this.campaign_name = campaign_name;
    this.recipe_name = recipe_name;
    this.offer_name = offer_name;

    YAHOO.util.Event.onContentReady(id, this.handleOnContentReady, this);  
} 

OffermaticaImpression.prototype.handleOnContentReady = function(me) { 
    var reference_node = document.getElementById(me.id);
    if(reference_node != null) {
      try {
            var offermatica_edw_impression = new edd().toString();
            
            if(offermatica_edw_impression && offermatica_edw_impression.length > 0) {
                var parsed_offermatica_edw_impression = offermatica_edw_impression.replace(/edw.edmunds.com/, 'offermatica.edmunds.com');

                var impression_data = parsed_offermatica_edw_impression + '&campaignName=' + escape(me.campaign_name) + '&recipeName='
                    + escape(me.recipe_name) + '&offerMbox='
                    + escape(me.id) + '&offerName='
                    + escape(me.offer_name);

                var new_node = new Image(1, 1);
                new_node.src = impression_data;
                reference_node.appendChild(new_node);
            }
      } catch(e) {
          alert("Problem with offermatica impression!");
      }
    }
}

function generate_offermatica_impression(campaign_name, recipe_name, offer_mbox_name, offer_name) {
    try {
        if(document != null && offer_mbox_name != null && offer_mbox_name != undefined) {
            var impression = new OffermaticaImpression(offer_mbox_name, campaign_name, recipe_name, offer_name);
        }
    } catch(e) {
    }
}

function search_offermatica_array(array, searchStr) {  
    var returnArray = false;  
    for (i=0; i<array.length; i++) {
        if (typeof(searchStr) == 'function') {
          if (searchStr.test(array[i])) {
            if (!returnArray) {
                returnArray = [];
            }        
          
            returnArray.push(i);
          }
        } else {
          if (array[i] == searchStr) {
                if (!returnArray) {
                    returnArray = [];
                }
                
                returnArray.push(i);
          }
        }
    }

    return returnArray;
}

function generate_offermatica_dldisplay_impression(dealer_impression_array, campaign_name, recipe_name, offer_mbox_name, offer_name) {
    try {        
        if(dealer_impression_array != null && dealer_impression_array != undefined && offer_mbox_name != null && offer_mbox_name != undefined) {
            var i = 0;
            var btotal = 0;
            var ptotal = 0;
            var atotal = 0;
            var dlimprss = '';
            var coverageType = 'coverage';
            if (dealer_impression_array.length > 0) {
              for(i = 0; i < dealer_impression_array.length; i++) {
                  var num = i + 1;
                  var cdealer = dealer_impression_array[i];
                  if(cdealer.indexOf('a') > -1) {
                      atotal++;
                  } else if(cdealer.indexOf('p') > -1) {
                      ptotal++;
                  } else {
                      btotal++;
                  }
                  dlimprss += '&dl' + num + '=' + cdealer;
              }
            } else {
              dlimprss = '&dl1=&dl2=&dl3=&dl4=&dl5=';
              coverageType = 'nocoverage';
            }
            var totalDealers = atotal + ptotal + btotal;
 
            var dlimpforoffermatica = 'http://offermatica.edmunds.com/media/trans1x1.gif?&tstatus=displayed&type=' + coverageType + '&Total='
                + totalDealers + '&adTotal=' + atotal + '&prefTotal=' + ptotal + '&basicTotal=' + btotal + '&styleid='
                + offermatica_styleid + dlimprss + '&zip=' + offermatica_zip + '&synpartner=edmunds&page_code='
                + offermatica_pagecode + '&ps_partner=&finance=nd&insurance=nd&dlts=%20' + new Date().valueOf();

            var impression_data = dlimpforoffermatica + '&campaignName=' + escape(campaign_name) + '&recipeName='
                + escape(recipe_name) + '&offerMbox='
                + escape(offer_mbox_name) + '&offerName='
                + escape(offer_name);

            var impression = new Impression(offer_mbox_name, impression_data);
        }
    } catch(e) {
    }
}

function generate_offermatica_dlthankyou_impression(data, dealers, zip, pagecode, styleid, campaign_name, recipe_name, offer_mbox_name, offer_name) {

    if(data != null && data != undefined && offer_mbox_name != null && offer_mbox_name != undefined) {

        var adTotal = parseInt(data.outputParameters.numPDPDealers);
        var prefTotal = parseInt(data.outputParameters.numPrefDealers);
        var basicTotal = parseInt(data.outputParameters.numBasicDealers);
        var total = adTotal + prefTotal + basicTotal;
        var impression_data = "http://offermatica.edmunds.com/media/trans1x1.gif?tstatus=submitted&Total=" + total + '&adTotal=' + adTotal + '&prefTotal=' + prefTotal + '&basicTotal=' + basicTotal + '&synpartner=edmunds&finance=nd&insurance=nd&dlts=' + new Date().getTime();

        for(var i = 0; i < data.outputParameters.dealers.length; i++) {
          var num = i + 1;
          var dealertype = "";

          var dealertype_prefix = '';
          if (data.outputParameters.dealers[i].dealerType == 'PREMIUM') {
            dealertype_prefix = 'a';
          } else if (data.outputParameters.dealers[i].dealerType == 'PREFERRED') {
            dealertype_prefix = 'p';
          } else if (data.outputParameters.dealers[i].dealerType == 'BASIC') {
            dealertype_prefix = 'b';
          }

          if (search_offermatica_array(dealers, i)) {
            dealertype = '=' + dealertype_prefix + '_y_' + data.outputParameters.dealers[i].id;
            impression_data = impression_data + "&dl" + num + dealertype;
          } {
            dealertype = '=' + dealertype_prefix + '_n_' + data.outputParameters.dealers[i].id;
            impression_data = impression_data + "&dl" + num + dealertype;
          }
        }

        if(zip != null && zip != undefined) {
          impression_data = impression_data + '&zip=' + zip;
        }

        if(pagecode != null && pagecode != undefined) {
          impression_data = impression_data + '&page_code=' + pagecode;
        }

        if(styleid != null && styleid != undefined) {
          impression_data = impression_data + '&styleid=' + styleid;
        }

        impression_data = impression_data + '&campaignName=' + escape(campaign_name) + '&recipeName='
            + escape(recipe_name) + '&offerMbox='
            + escape(offer_mbox_name) + '&offerName='
            + escape(offer_name);

        var impression = new Impression(offer_mbox_name, impression_data);
    }
}

function checkDealerSelected(formName) {
    var checkedDealerCount = 0;
    var hasDealer = false;
    var dealerCount = 0;
    for(i = 0; i < formName.elements.length; i++) {
        var e = formName.elements[i];
        if(e.name == 'emailblastdealers' &&
           e.type == 'checkbox') {
            hasDealer = true;
            dealerCount++;
            if(e.checked == true)
                checkedDealerCount++;
        }
    }

    if(hasDealer && checkedDealerCount < 1) {
        if(dealerCount == 1) {
            alert("At least one dealer must be selected.");
        }
        else if(dealerCount > 1) {
            alert("Select up to " + dealerCount + " dealers for free price quotes.");
        }
        return false;
    }
    return true;
}

function checkRequiredField(fields) {
    for(var i = 0; i < fields.length; i++) {
        if(i.value == '') {
            alert(i.name + 'is required');
            i.focus();
            return false;
        }
    }
    return true;
}


function checkNameFields(fields) {
    var tests = new Tests();
    // see createTests for tests to run
    createTests(tests);

    // run all tests created in create tests.
    for(var test = null; (test = tests.next() ) != null;) {
        for(var j = 0; j < 2; j++) {
            // trims value
            fields[j].value = trimAll(fields[j].value);
            if(test.test(fields[j].value) == false) {
                // do the following if validation fails ...
                test.msg((j == 0?"First Name":"Last Name"));
                fields[j].focus();
                return false;
            }
        }
    }
    return true;
}

function checkEmailFields(fields) {
    var retval = true;
    for(var i = 0; i < fields.length; i++) {
        var field = fields[i];
        if(field != undefined && field != null && field != '') {
            var str = field.value;
            retval = isEmailFormatValid(str);
            if(retval == false) {
                field.focus();
                break;
            }
        }
    }
    return retval;
}

function checkPhoneTupleFields(fields) {

    for(var i = 0; i < fields.length; i++) {
        // check if field items is an array
        if (fields[i].constructor.toString().indexOf("Array") != -1) {
            var phoneTuple = fields[i];
            for(var j = 0; j < phoneTuple.length; j++) {
                if(phoneTuple[j].value.length == 0) {
                    alert("Please enter your phone number.");
                    phoneTuple[j].focus();
                    return false;
                }
            }
            
            var areaCode = phoneTuple[0];
            var phonePrefix = phoneTuple[1];
            var phoneSuffix = phoneTuple[2];
            if((areaCode.value.length != 0) || (phonePrefix.value.length != 0)
                || (phoneSuffix.value.length != 0)) {
                if(!validatePhoneOffermatica(areaCode, phonePrefix, phoneSuffix)) {
                    alert("Phone Number was considered INVALID, please re-enter a valid 10 digit telephone number.");
                    areaCode.focus();
                    return false;
                }
            }
        } else {
        // otherwise if field itself is an array
            if(fields[i].value.length == 0) {
                alert("Please enter your phone number.");
                fields[i].focus();
                return false;
            }

            var areaCode = fields[0];
            var phonePrefix = fields[1];
            var phoneSuffix = fields[2];

            if((areaCode.value.length != 0) || (phonePrefix.value.length != 0)
                || (phoneSuffix.value.length != 0)) {
                if(!validatePhoneOffermatica(areaCode, phonePrefix, phoneSuffix)) {
                    alert("Phone Number was considered INVALID, please re-enter a valid 10 digit telephone number.");
                    areaCode.focus();
                    return false;
                }
            }
        }
    }

    return true;
}

function checkBlackListTupleFields(fields) {
    for(var i = 0; i < fields.length; i++) {
        var blackListTuple = fields[i];
        var firstName = blackListTuple[0];
        var lastName = blackListTuple[1];
        var email = blackListTuple[2];
        var emailPat = /^(.+)@(.+)$/;
        var matchArray = email.value.match(emailPat);
        var domain = matchArray[2];
        var values = new Array();
        values[0] = 'FIRST_NAME=' + escape(firstName.value);
        values[1] = 'LAST_NAME=' + escape(lastName.value);
        values[2] = 'EMAIL=' + escape(email.value);
        values[3] = 'EMAIL_DOMAIN=' + escape(domain.substring(domain.lastIndexOf(".") + 1));

        if(!validateBlacklist(values)) {
            return false;
        }
    }
    return true;
}

function checkStreetAddressFields(fields) {
    for(var i = 0; i < fields.length; i++) {
        var field = fields[i];
        if((field.value == '') || (field.value == '1 Not Available')) {
            if(field) {
                field.value = '';
            }
            alert("Please enter your street address.");
            field.focus();
            return false;
        }
    }
    return true;
}

function validatePhoneOffermatica(acode, pfix, sfix) {
    var acode_deny = new Array
        ("222",
            "333",
            "411",
            "444",
            "456",
            "500",
            "555",
            "666",
            "777",
            "911",
            "900",
            "999");
    var acode_accept = new Array
        ("800",
            "876",
            "877",
            "888");

    var pfix_deny = new Array
        ("411",
            "555",
            "611",
            "911");

    var pfix_accept = new Array();
    var sfix_deny = new Array();
    var sfix_accept = new Array();

    var phone_concat_deny = new Array
        ("0000000000",
            "1111111111",
            "2222222222",
            "3333333333",
            "4444444444",
            "5555555555",
            "6666666666",
            "7777777777",
            "8888888888",
            "9999999999");

    var numbersOnly = /^[0-9]+$/;
    if(numbersOnly.test(acode.value) == false) return false;
    if(numbersOnly.test(pfix.value) == false) return false;
    if(numbersOnly.test(sfix.value) == false) return false;

    // validate area code
    if(!validate_phone_field(acode, 3, acode_deny, acode_accept)) {
        return false;
    }

    // validate prefix
    if(!validate_phone_field(pfix, 3, pfix_deny, pfix_accept)) {
        return false;
    }

    // validate suffix
    if(!validate_phone_field(sfix, 4, sfix_deny, sfix_accept)) {
        return false;
    }

    var phone_concat = acode.value + pfix.value + sfix.value;
    if(value_is_in_array(phone_concat, phone_concat_deny)) {
        return false;
    }

    // last 7 digits cannot be all of the same value;
    if(phone_concat.length != 10) {
        return false;
    } else {
        // if last 7 digits all the same value
        if((/^(.)(\1)+$/).test(phone_concat.substring(3))) {
            return false;
        }
    }

    // area code prefix cannot start with 0 or 1
    if((/^[01]/).test(pfix) || (/^[01]/).test(acode)) {
        return false;
    }

    return true;
}

