// JavaScript Document
function findAndReplace(searchText, replacement) {
	fullExpression = regexEscape(searchText);
	input = new RegExp(fullExpression,"gi"); 
	output = replacement;
	domIterator(input, output);
	//document.body.innerHTML = document.body.innerHTML.replace(input,output); 


}

function IsNumeric(sText) {
	var ValidChars = "0123456789.";
	var IsNumber=true;
	var Char;
	
	
	for (i = 0; i < sText.length && IsNumber == true; i++) { 
		Char = sText.charAt(i); 
		if (ValidChars.indexOf(Char) == -1) {
			IsNumber = false;
		}
	}
	return IsNumber;
}

function domIterator(regex,replacementNumber, node) {
	var childNodes = (node || document.body).childNodes;
    var cnLength = childNodes.length;
    var excludes = ['html','head','style','link','title','meta','script','object','iframe'];
        //for(var i=0; i<cnLength; i++) {
        while (cnLength--) {
            
            var currentNode = childNodes[cnLength];

            if(currentNode.nodeType === 1) {
                if(currentNode.nodeName == 'A' && currentNode.href.match(/^tel:/)) {
                        currentNode.href = currentNode.href.replace(regex,replacementNumber);
                }
                if(excludes.indexOf(currentNode.nodeName.toLowerCase())  === -1) {
                    arguments.callee(regex,replacementNumber,currentNode);
                }
            }
            if(currentNode == null || currentNode.nodeType !== 3 || currentNode.data === undefined) {
                    continue;
            }
            // a match was found if still here
            // assign the replaced value
            var newText = currentNode.data.replace(regex, replacementNumber);
            // only replace if a change was made
            // and replace only the data of the current node.
            if(newText != currentNode.data) {
                currentNode.data = newText;
            }
        
        }
}

function replaceAll (numToInsert,numberFormat,numToExclude){
	var fullExpression = "";
	var iteration=new Array();

	iteration[0] = addExclude("\\(\\s?\\d{3}\\s?\\)[\\-\\.\\s]?\\d{3}[\\-\\.\\s]?\\d{4}(?!\\d)(?=[<\\s\\.\\!\\?\\,]?)",numToExclude);
	iteration[1] = addExclude("\\b\\d{3}\\s?[\\-\\.\\s]?\\d{3}[\\-\\.\\s]?\\d{4}(?!\\d)\\b(?=[<\\s\\.\\!\\?\\,]?)",numToExclude);
	iteration[2] = addExclude("\\b(\\d{4,5})\\s\\d{3}\\s?(\\d{3,4})(?!\\d)\\b(?=[<\\s\\.\\!\\?\\,]?)",numToExclude);
	
	var iCount = iteration.length - 1;
	for (i=0;i<=iCount;i++){
		if (i == 0){
			fullExpression = iteration[i];			
		}else{
			fullExpression = fullExpression + "|" + iteration[i];
		}
	}
	
	input = new RegExp(fullExpression,"gi"); 
	if (numberFormat > -1){
		output = formatnumber(numToInsert,numberFormat);
	}else{
		output = numToInsert;		
	}
// 	if (numToExclude){
//	 	var numCheck = numToExclude.search(",");
// 		if (numCheck != -1){
// 			excludeSplit = numToExclude.split(",");
//			var eCount = excludeSplit.length - 1;
//			for (e=0;e<=eCount;e++){
// 				replaceSingleRegex(trim(excludeSplit[e]),'xxxyyyzzz'+e);	
// 			}
// 		}else{
// 			replaceSingleRegex(numToExclude,'xxxyyyzzz0');	
// 		}
// 	}
 	if (mm_replace_ids){
		idSplit = mm_replace_ids.split(",");
		var iCount = idSplit.length - 1;
	
		for (i=0;i<=iCount;i++){
			if (document.getElementById(idSplit[i])) {
				domIterator(input, output, document.getElementById(idSplit[i]));
				// document.getElementById(idSplit[i]).innerHTML = document.getElementById(idSplit[i]).innerHTML.replace(input,output); 	
			}
		}
	}else{
		domIterator(input, output);
		//document.body.innerHTML = document.body.innerHTML.replace(input,output); 
	}
// 	if (numToExclude){
//	 	var numCheck = numToExclude.search(",");
// 		if (numCheck != -1){
// 			excludeSplit = numToExclude.split(",");
//			var eCount = excludeSplit.length - 1;
//			for (e=0;e<=eCount;e++){
// 				replaceSingle('xxxyyyzzz'+e,formatnumber(trim(excludeSplit[e]),numberFormat));	
// 			}
// 		}else{
// 			replaceSingle('xxxyyyzzz0',formatnumber(numToExclude,numberFormat));	
// 		}
// 	}
}

function replaceSingle (numToFind, numToInsert){
	fullExpression = regexEscape(numToFind);
	input = new RegExp(fullExpression,"gi"); 
	output = numToInsert;
	domIterator(input, output);
	//document.body.innerHTML = document.body.innerHTML.replace(input,output); 
}

function replaceSingleRegex (numToFindS, numToInsertS,numberFormatS){
	var fullExpressionS = "";
	var iterationS=new Array();
	if (numToFindS.substring(0,1) == '0'){
		var areaCode = numToFindS.substring(0,4);
		var exchange = numToFindS.substring(4,7);
		var remain = numToFindS.substring(7,11);
		var exchangeCombo = numToFindS + remain;	
		var areaCode2 = numToFindS.substring(0,5);
		var exchange2 = numToFindS.substring(5,8);
		var remain2 = numToFindS.substring(8,11);
		var exchangeCombo2 = numToFindS + remain2;				
	}else{
		var areaCode = numToFindS.substring(0,3);
		var exchange = numToFindS.substring(3,6);
		var remain = numToFindS.substring(6,10);
		var exchangeCombo = exchange + remain;
	}
	//alert (areaCode);
	//alert (exchange);
	//alert (remain);
	//alert (exchangeCombo);
	iterationS[0] = "\\(\\s?"+areaCode+"\\s?\\)[\\-\\.\\s]?"+exchange+"[\\-\\.\\s]?"+remain+"(?!\\d)(?=[<\\s\\.\\!\\?\\,]?)";
	iterationS[1] = "\\b"+areaCode+"\\s?[\\-\\.\\s]?"+exchange+"[\\-\\.\\s]?"+remain+"\\b(?!\\d)(?=[<\\s\\.\\!\\?\\,]?)";
	iterationS[2] = "\\b("+areaCode+"|"+areaCode2+")\\s("+exchange+"|"+exchange2+")\\s("+remain+"|"+remain2+")\\b(?!\\d)(?=[<\\s\\.\\!\\?\\,]?)";

	var iCountS = iterationS.length - 1;
	for (i=0;i<=iCountS;i++){
		if (i == 0){
			fullExpressionS = iterationS[i];			
		}else{


			fullExpressionS = fullExpressionS + "|" + iterationS[i];
		}
	}
	//alert(fullExpression);
	inputS = new RegExp(fullExpressionS,"gi"); 
	if (numberFormatS > -1){
		outputS = formatnumber(numToInsertS,numberFormatS);
	}else{
		outputS = numToInsertS;		
	}
//	if (numToExclude){
//		replaceAll('xxxyyyxxx1');	
//	}
	domIterator(inputS, outputS);
	//document.body.innerHTML = document.body.innerHTML.replace(inputS,outputS); 
}

function regexEscape (safesearch){
	bs=String.fromCharCode(92);  
	unsafe=bs+".+*?[^]$(){}=!<>|:";
	for (i=0;i<unsafe.length;++i){  
		safesearch=safesearch.replace(new RegExp("\\"+unsafe.charAt(i),"g"),bs+unsafe.charAt(i)); 
	}
	return safesearch;
}

function getURLVariable( name )
{
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if( results == null )
    return "";
  else
    return results[1];
}

function trim(stringToTrim) {
	return stringToTrim.replace(/^\s+|\s+$/g,"");
}

function addExclude (incomingRegex, numExclude){
	//alert(incomingRegex);
	//alert(numExclude);
	var outgoingRegex = "";
	var preEx = "(?!";
	var postEx = "\\b)";
	
	if (numExclude){
		excludeSplit = numExclude.split(",");
		
		var eCount = excludeSplit.length - 1;
	
		for (e=0;e<=eCount;e++){
			exNumber = trim(excludeSplit[e]);
			if (exNumber.substring(0,1) == '0'){
				var areaCode = exNumber.substring(0,4);
				var exchange = exNumber.substring(4,7);
				var remain = exNumber.substring(7,11);
				var exchangeCombo = exchange + remain;	
				var areaCode2 = exNumber.substring(0,5);
				var exchange2 = exNumber.substring(5,8);
				var remain2 = exNumber.substring(8,11);
				var exchangeCombo2 = exchange2 + remain2;				

			}else{
				var areaCode = exNumber.substring(0,3);
				var exchange = exNumber.substring(3,6);
				var remain = exNumber.substring(6,10);
				var exchangeCombo = exchange + remain;
			}
			switch(incomingRegex){
				case "\\(\\s?\\d{3}\\s?\\)[\\-\\.\\s]?\\d{3}[\\-\\.\\s]?\\d{4}(?!\\d)(?=[<\\s\\.\\!\\?\\,]?)":
					outgoingRegex = outgoingRegex + preEx+"\\(\\s?"+areaCode+"\\s?\\)[\\-\\.\\s]?"+exchange+"[\\-\\.\\s]?"+remain+postEx;
					break;
				case "\\b\\d{3}\\s?[\\-\\.\\s]?\\d{3}[\\-\\.\\s]?\\d{4}(?!\\d)\\b(?=[<\\s\\.\\!\\?\\,]?)":
					outgoingRegex = outgoingRegex + preEx+""+areaCode+"\\s?[\\-\\.\\s]?"+exchange+"[\\-\\.\\s]?"+remain+postEx;
					break;
				case "\\b(\\d{4,5})\\s\\d{3}\\s?(\\d{3,4})(?!\\d)\\b(?=[<\\s\\.\\!\\?\\,]?)":
					outgoingRegex = outgoingRegex + preEx+"("+areaCode+"|"+areaCode2+")\\s("+exchange+"|"+exchange2+")\\s?("+remain+"|"+remain2+")"+postEx;
                    break;
                default: outgoingRegex="";
			}
		}
	}
	return(outgoingRegex+incomingRegex);
}

function mm_action_replace () {
	if (tnarray[0].length==10 || (tnarray[0].length==11 && tnarray[0].charAt(0)==0)){
		if (tnarray[0]==default_number && overwrite_default_number=='N'){
		}else{
			replaceAll(tnarray[0],customer_number_format,exclude_numbers);
		}
	}
}

function mm_action_single () {
	if (tnarray[0].length==10 || (tnarray[0].length==11 && tnarray[0].charAt(0)==0)){
		if (tnarray[0]==default_number && overwrite_default_number=='N'){
		}else{
			if (filter_numbers){
				filterSplit = filter_numbers.split(",");
		
				var eCount = filterSplit.length - 1;
	
				for (e=0;e<=eCount;e++){
					filterNumber = trim(filterSplit[e]);
					replaceSingleRegex(filterNumber,tnarray[0],customer_number_format);
				}
			}
		}
	}
}

// add indexOf if not present
 if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(searchElement /*, fromIndex */)
    {
        "use strict";

        if (this === void 0 || this === null)
          throw new TypeError();

        var t = Object(this);
        var len = t.length >>> 0;
        if (len === 0)
          return -1;

        var n = 0;
        if (arguments.length > 0)
        {
          n = Number(arguments[1]);
          if (n !== n)
            n = 0;
          else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0))
            n = (n > 0 || -1) * Math.floor(Math.abs(n));
        }

        if (n >= len)
          return -1;

        var k = n >= 0
              ? n
              : Math.max(len - Math.abs(n), 0);

        for (; k < len; k++)
        {
          if (k in t && t[k] === searchElement)
            return k;
        }
        return -1;
      };
}

