var nbsp = 160;         // non-breaking space char
var node_text = 3;      // DOM text node-type
var emptyString = /^\s*$/ ;
var proceed = 2 ;       // nice arbitrary status that isn't true or false...

function trim(str)
{
    return str.replace(/^\s+|\s+$/g, '');
}

function tonumeric(str)
{
    return str.replace(/[^0-9]/g, '');
}

function getObjectById(id)
{        
    var obj;                                            
    if (document.getElementById){
        obj = document.getElementById(id);
    }else if(document.layers){ obj = document.layers[id];
    }else{
        obj = document.all.item(id);
    } return obj;
}

function msg(   fld,     // id of element to display message in
                msgtype, // class to give element ("warn" or "error")
                message) // string to display
{
	// no field to fill so do nowt
	if (emptyString.test(fld))
		return;
    // setting an empty string can give problems if later set to a
    // non-empty string, so ensure a space present. (For Mozilla and Opera one could
    // simply use a space, but IE demands something more, like a non-breaking space.)
    var dispmessage;
    if (emptyString.test(message))
        dispmessage = String.fromCharCode(nbsp);
    else
        dispmessage = message;

    var elem = getObjectById(fld);
    elem.firstChild.nodeValue = dispmessage;

    elem.className = msgtype;   // set the CSS class to adjust appearance of message
}

 // validation functions

function commonCheck    (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
    var elem ;
    var elem_info;

    if (!(elem= getObjectById(valfield)))
        return true;  /// validation is server side only
    if (!(elem_info = getObjectById(infofield)))
        return proceed;   /// validation can occur, but no status field available
    if (!elem_info.firstChild) return true;  // not available on this browser
    if (elem_info.firstChild.nodeType != node_text) return true;  // infofield is wrong type of node
    if (emptyString.test(elem.value))
    {
        if (required)
        {
            msg (infofield, "form_error", "Value required");
                                                //setfocus(valfield);
            return false;
        } else {
            msg (infofield, "form_warning", "");   // OK
            return true;
        }
    } else
    {
        msg (infofield, "form_warning", "");
    }
    return proceed;
}

function validatePhone(fieldName, format_field, statusSpan, required)
{
    var stat = commonCheck(fieldName, statusSpan, required) ;
    if (stat != proceed) return stat;

	var format = '' ;
	var format_source_field ;
	if (format_field != '')
	{
		format_source_field = getObjectById(format_field);
		// if it's a select get the format from the source field selected index
		if (format_source_field)
		{
			if (format_source_field.selectedIndex && format_source_field.options)
				format = format_source_field.options[format_source_field.selectedIndex].value;
		} else
		{
			// no field, so assume it's the format direct
			format = format_field;
		}
	}
    var field = getObjectById(fieldName) ;
   	var tfld = trim(field.value);  // value of field with whitespace trimmed off
    var telnr = /^\+?[0-9 ()-]+[0-9]$/ ;
    if (!telnr.test(tfld))
    {
        msg (statusSpan, "form_error", "ERROR: not a valid telephone number. Characters permitted are digits, space ()- and leading +");
        return false;
    }

    var numdigits = 0;
    for (var j=0; j<tfld.length; j++)
        if (tfld.charAt(j)>='0' && tfld.charAt(j)<='9') numdigits++;

    if (numdigits<8)
    {
        msg (statusSpan, "form_error", "Phone number is too short");
        return false;
    }

    // now do individual format related checks

	var numericPhone = tonumeric(tfld);

    // US format : [1] YZX YXX XXXX (Y=[2-9], Z=[0-8], X=[0-9])
    switch (format)
    {
        case 'US':
		case 2:
		case '2':
		case 'CA':
		case '9':
		case 9:
			// US and Canadian phone numbers
            var telnrUS = /^1?[2-9][0-8][0-9][2-9][0-9]{2}[0-9]{4}$/ ;
            if (!telnrUS.test(numericPhone))
            {
                msg (statusSpan, "form_error", "Not a valid US/Canadian telephone number.");
                return false;
            } else
            {
				field.value = numericPhone;
                msg (statusSpan, "form_warning", "");
            }
            break;
        default:
			
            break;
    }

    return true;
}

function validateEmail  (fieldName,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
    var stat = commonCheck (fieldName, infofield, required);
    if (stat != proceed) return stat;

    var valfield = getObjectById(fieldName);

    var tfld = trim(valfield.value);  // value of field with whitespace trimmed off
    var email = /^[^@]+@[^@.]+\.[^@]+\w\w$/  ;
    if (!email.test(tfld))
    {
        msg (infofield, "form_error", "That is not a valid e-mail address");
        //setfocus(valfield);
        return false;
    }

    var email2 = /^[A-Za-z][\w.-]+@\w[\w.-]+\.[\w.-]*[A-Za-z][A-Za-z]$/  ;
    if (!email2.test(tfld))
        msg (infofield, "form_warning", "Unusual e-mail address - check if correct");
    else
        msg (infofield, "form_warning", "");
    return true;
}

function validateField(fieldName,
                       infofield,
                       required)
{
    var stat = commonCheck(fieldName, infofield, required);
    if (stat != proceed) return stat;

    return true;
}

// form specifics

function validateSMBcstUForm()
{
	var i;
	var bDoDelete;	// flag that the row should be deleted, do nowt for now	
	var sIdField;
	var lId ;
	var sNameField;
	var sMsisdnField;
	var sEmailField;
	var bResult =true;
	var bThisResult;
    var aDuplicatesContainer;
    var dupe_msisdn_error_message = "";
    var dupe_email_error_message = "";

	for (i=0; i <20; i++)
	{
		sNameField = getObjectById('contact_name_'+i);
		sMsisdnField = getObjectById('contact_msisdn_'+i);
		sEmailField = getObjectById('contact_email_'+i);
		sIdField = getObjectById('contact_id_'+i);
		if (sIdField)
		{
			// check for delete
			lId = Math.abs(sIdField.value);
			//if (emptyString.test(sNameField.value) && emptyString.test(sMsisdnField.value) && emptyString.test(sEmailField.value))
			//	sIdField.value = -lId;	// delete by negating Id value
		}
		if (emptyString.test(sMsisdnField.value) && emptyString.test(sEmailField.value) && !emptyString.test(sNameField.value))
		{
			msg('contact_status_'+i, 'form_error', 'Please provide either a phone number or email address');
			if (bResult) bResult = false;
		}
		if (!emptyString.test(sMsisdnField.value))
		{
			bThisResult = validatePhone('contact_msisdn_'+i, 'country_code', 'contact_status_'+i, false);
			if (bResult) bResult = bThisResult;
		}
		if (!emptyString.test(sEmailField.value))
		{
			bThisResult = validateEmail('contact_email_'+i, 'contact_status_'+i, false);
			if (bResult) bResult = bThisResult;
		}
    }
    
    aDuplicatesContainer = deDupSMBcstEditForm();
    if (aDuplicatesContainer[0].length > 0) {
        dupe_msisdn_error_message = "You have included the same phone number more than once - please check and try again";
        if (bResult) bResult = false;
    } else {}
    if (aDuplicatesContainer[1].length > 0) {
        dupe_email_error_message = "You have included the same email address more than once - please check and try again";
        if (bResult) bResult = false;
    } else {}
	
    if (!bResult)
		msg('form_error', 'form_error', 'There are problems with your input - please check below and try again');
        if (dupe_msisdn_error_message.length > 0) {
            msg('msisdn_dupe_error', 'form_error', dupe_msisdn_error_message );
        } else {}
        if (dupe_email_error_message.length > 0) {
            msg('email_dupe_error', 'form_error', dupe_email_error_message );
        } else {}
    if (!bResult) {
        window.location = "#top";
    } else {}
	return bResult;
}

function changeSignupCarrierList( 	country_field, 
									network_id_field,
									carrier_list,preselect_choice)
{
	var oCountryField = getObjectById(country_field);
	var oNetworkField = getObjectById(network_id_field);

	if (oCountryField && oNetworkField )
	{
		if (!carrier_list || carrier_list == null) carrier_list = global_carrier_list;
		if (choice = oCountryField.options[oCountryField.selectedIndex].value)
		{
			oNetworkField.options.length = 0 ;
        	for (var j=0; j < carrier_list[choice].length; j++)
			{
        	    oNetworkField.options[j] = new Option(carrier_list[choice][j]['network_name'], carrier_list[choice][j]['network_id'] );
				if (preselect_choice)
					if (oNetworkField.options[j].value == preselect_choice) oNetworkField.options[j].selected = true;
			}
		}

	}
}

function deDupSMBcstEditForm() {
    var aMsisdns = new Array();
    var aEmails = new Array();
    var aMsisdnsDuplicates = new Array();
    var aEmailsDuplicates = new Array();
    var aReturnContainer = new Array();
    for (i=0; i <20; i++) {
        sMsisdnField = getObjectById('contact_msisdn_'+i);
        aMsisdns[i] = sMsisdnField.value;
        sEmailField = getObjectById('contact_email_'+i);
        aEmails[i] = sEmailField.value;
    }
    aMsisdns.sort(sortNumber);
    aEmails.sort(sortNumber);
    for (var i = 0; i < 20; i++) {
        if ( aMsisdns[ i ] == aMsisdns[ ( i + 1 ) ] && aMsisdns[ i ].length > 0 ) {
            aMsisdnsDuplicates[ ( aMsisdnsDuplicates.length + 1 ) ] = aMsisdns[ ( i + 1 ) ]; 
        } else {}
        if ( aEmails[ i ] == aEmails[ ( i + 1 ) ] && aEmails[ i ].length > 0 ) {
            aEmailsDuplicates[ ( aEmailsDuplicates.length + 1 ) ] = aEmails[ ( i + 1 ) ];
        } else {}
    }
    aReturnContainer[0] = aMsisdnsDuplicates;
    aReturnContainer[1] = aEmailsDuplicates;
    return aReturnContainer;
}

function validateSMBcstQuickForm()
{
}


function isNumberKey(evt)
{
	var charCode = (evt.which) ? evt.which : event.keyCode
	if (charCode > 31 && (charCode < 48 || charCode > 57))
		return false;
	return true;
}

function sortNumber( a, b ) {
    return a - b;
}

function changeSignupCarrierList(country_field, carrier_field, carrier_list, iId)
{   
    var countrySelect = getObjectById(country_field);
    var carrierSelect = getObjectById(carrier_field);
    var currentLength ;

	if (!countrySelect)
	{
		return false;
	}

	if (!carrierSelect)
	{
		return false;
	}


    if (choice = countrySelect.options[countrySelect.selectedIndex].value)
    {
		carrierChoice = carrier_list;
		if (!carrier_list) 
		{
			carrierChoice= global_carrier_list;
		}
		//alert(choice + ' ; ' + carrierChoice[choice].length);
        carrierSelect.options.length = 0 ;
        for (var j=0; j < carrierChoice[choice].length; j++)
        {
            carrierSelect.options[j] = new Option(carrierChoice[choice][j]['network_name'], carrierChoice[choice][j]['network_id'] );
            if (iId)
                if (carrierSelect.options[j].value == iId) carrierSelect.options[j].selected = true;
        }
        return true;
    }
    return false;
}

function validateTopLoginForm(name)
{
	var theForm = getObjectById(name);
	var thePhoneField = getObjectById(name + '_msisdn');

	if (theForm)
	{
		if (thePhoneField)
		{
			if (!validatePhone(name+'_msisdn', '', 'toplogin_status', true))
			{
				return false;
			}
		}
	}
	document.forms[name].elements['msisdn'].value = document.forms[name].elements[name + '_msisdn'].value;
	document.forms[name].submit();
}
