/* JavaScript Data Validation Utilities
 *	Author: Sam Tsvilik
 *	Company: RBCCM
 *	Project: DS Prime
 *
 */
	function hasSpace(str) {
		str = String(str);
		var pattern = /\w\s\w/;
		return pattern.test(str);
	}
	function isEmpty(str) {
		str = String(str);
		var pattern = /\w+/;
		return !pattern.test(str);
	}
	
	function isEmail(str) {
		str = String(str);
		var pattern = /\w@\w+\.\w{2,}/;
		return pattern.test(str);
	}

	function isInteger(str) {
		str = String(str);
		var pattern = /^(([0-9]+)$)/;
		return pattern.test(str);
	}
	//Checks if number is numeric
	function isNumeric(str) {
		str = String(str);
		var pattern = /^((-)?([0-9]*)((\.{0,1})([0-9]+))?$)/;
		return pattern.test(str);
	}
	//Checks if number is a float
	function isFloat(str) {
		str = String(str);
		var pattern = /^((-)?([0-9]*)((\.{0,1})([0-9]+))?$)/;
		return pattern.test(str);
	}
	//Checks if number is an integer
	function isCurrency(str) {
		str = String(str);
		var pattern = /^((-)?([0-9]{1,3})(\,[0-9]{3})*?((\.{0,1})([0-9]+))?$)/;
		return pattern.test(str);
	}
	//Checks if number is Alphanumeric
	function isAlphanumeric(str) {
		str = String(str);
		var pattern = /^\w+$/;
		return pattern.test(str);
	}
	function isSymbol(str) {
		str = String(str);
		var pattern = /^([0-9]?[a-z]?[A-Z]?[\.]?)*$/;
		return pattern.test(str);
	}	
/**
*	Currency object returns value converted to currency format
*/

function Currency(d) {
	//Public variables
		this.toString = toStr;
		this.toDouble = toDbl;
	
	//Private variables
		var initValue = new String(d);
			initValue = parseFloat(initValue.replace(/,/g,""));
		var sign = (initValue < 0)?-1:1;
		if(sign < 0) {
			initValue *= sign;
		}

		initValue = String(initValue);
		var wholeNumbers = "";
		var decimalNumbers = "";
		var combined;
		
		main();
	//---------------------------------
	function main() {
		if(!isEmpty(initValue)) {
			if(initValue.indexOf(".") > 0) {
				var nArray = initValue.split(".");
				wholeNumbers = nArray[0];
				decimalNumbers = nArray[1];
			} else {
				wholeNumbers = initValue;
			}
			adjustDecimal();
			adjustWhole();
			combined = wholeNumbers + "." + decimalNumbers;
		} else {
			combined = "NaN";
		}
	}
	
	//Places commas for every three digits in whole number
	function adjustWhole() {
		if(wholeNumbers.length > 3) {
			var tNum = new String("");
			var k=0;
			var p = parseInt(wholeNumbers.length-1);
			while(p>=0) {
				k++;
				tNum += wholeNumbers.charAt(p);
				if(k==3){tNum += ",";k=0}
				p--;
			}
			wholeNumbers = flipNumber(tNum);
		}
	}
	
	//Repositions numbers (horizontal flip) first becomes last
	function flipNumber(f) {
		var thisNum = "";
		var i=f.length-1;
		do {
			thisNum += f.charAt(i);
		} while(i--);
		if(thisNum.charAt(0) == ",") {
			thisNum = thisNum.substring(1);
		}
		return thisNum;
	}
	
	function adjustDecimal() {
		if(decimalNumbers.length > 0) {
			switch(decimalNumbers.length) {
				case 1: decimalNumbers += "0";
					break;
				case 2: break;
				default:
					decimalNumbers = roundDecimals();	
				break;
			}	
		} else {
			decimalNumbers = "00";
		}	
	}
		
	//Rounds decimals to hundreds
	function roundDecimals() {
		var oldC;
		var newC;
		var mDec = new String(decimalNumbers);
		var result;
		while(mDec.length != 2) {
				newC = mDec.charAt(mDec.length-2);
				oldC = mDec.charAt(mDec.length-1);
				mDec = mDec.substring(0,mDec.length - 2);
				mDec = mDec + Math.round(newC + "." + oldC);
			}
			result = mDec;
		return result;
	}
		
	function toStr() {
		var s = (sign < 0)?"-":"";
		return s + combined;
	}
		
	function toDbl() {
		return parseFloat(combined) * sign;
	}		
}

//Adds a prototype method to numeric values
Number.prototype.toCurrency = function() {
	return CCur(this);
}

function CCur(d) {
	var result = new Currency(d).toString();
		
	return result;	
}

function Cur2Dbl(cur) {
	var res = parseFloat(cur.replace(/,/g,""));
	return res;
}


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;

      default:
        prefixRegExp = /^$/;
        alert("Card type not found");
    }

    prefixIsValid = prefixRegExp.test(cardNumbersOnly);
    isValid = prefixIsValid && lengthIsValid;
  }

  if (isValid)
  {
    var numberProduct;
    var numberProductDigitIndex;
    var checkSumTotal = 0;
	var digitCounter = cardNumberLength - 1;
    do {
      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));
      }
    } while(digitCounter--);

    isValid = (checkSumTotal % 10 == 0);
  }

  return isValid;
}
