var zChar = new Array(' ', '(', ')', '-', '.'),
	maxphonelength = 14,
	phonevalue1,
	phonevalue2,
	cursorposition;

function ParseForNumber1(object){
  phonevalue1 = ParseChar(object.value, zChar);
};

function ParseForNumber2(object){
  phonevalue2 = ParseChar(object.value, zChar);
};

function backspacerUP(object,e) { 
  if(e){ 
    e = e;
  } else {
    e = window.event;
  } 
  if(e.which){ 
    var keycode = e.which;
  } else {
    var keycode = e.keyCode;
  }

  ParseForNumber1(object);

  if(keycode >= 48){
    ValidatePhone(object);
  }
};

function backspacerDOWN(object,e) { 
  if(e){ 
    e = e;
  } else {
    e = window.event;
  } 
  if(e.which){ 
    var keycode = e.which; 
  } else {
    var keycode = e.keyCode; 
  }
  ParseForNumber2(object);
};

function GetCursorPosition(){

  var t1 = phonevalue1;
  var t2 = phonevalue2;
  var bool = false;
  for (i=0; i<t1.length; i++)
  {
    if (t1.substring(i,1) != t2.substring(i,1)) {
      if(!bool) {
        cursorposition=i;
        window.status=cursorposition;
        bool=true;
      }
    }
  }
};

function ValidatePhone(object){

  var p = phonevalue1;

  p = p.replace(/[^\d]*/gi,"");

  if (p.length < 3) {
    object.value=p;
  } else if(p.length==3){
    pp=p;
    d4=p.indexOf('(');
    d5=p.indexOf(')');
    if(d4==-1){
      pp="("+pp;
    }
    if(d5==-1){
      pp=pp+")";
    }
    object.value = pp;
  } else if(p.length>3 && p.length < 7){
    p ="(" + p; 
    l30=p.length;
    p30=p.substring(0,4);
    p30=p30+") ";

    p31=p.substring(4,l30);
    pp=p30+p31;

    object.value = pp; 

  } else if(p.length >= 7){
	ppp = p.formatPhoneNumber();
    object.value = ppp.substring(0, maxphonelength);
  }

  GetCursorPosition();

  if(cursorposition >= 0){
    if (cursorposition == 0) {
      cursorposition = 2;
    } else if (cursorposition <= 2) {
      cursorposition = cursorposition + 1;
    } else if (cursorposition <= 4) {
      cursorposition = cursorposition + 3;
    } else if (cursorposition == 5) {
      cursorposition = cursorposition + 3;
    } else if (cursorposition == 6) { 
      cursorposition = cursorposition + 3 ;
    } else if (cursorposition == 7) { 
      cursorposition = cursorposition + 4;
    } else if (cursorposition == 8) { 
      cursorposition = cursorposition + 4;
      e1=object.value.indexOf(')');
      e2=object.value.indexOf('-');
      if (e1>-1 && e2>-1){
        if (e2-e1 == 4) {
          cursorposition = cursorposition - 1;
        }
      }
    } else if (cursorposition == 9) {
      cursorposition = cursorposition + 4;
    } else if (cursorposition < 11) {
      cursorposition = cursorposition + 3;
    } else if (cursorposition == 11) {
      cursorposition = cursorposition + 1;
    } else if (cursorposition == 12) {
      cursorposition = cursorposition + 1;
    } else if (cursorposition >= 13) {
      cursorposition = cursorposition;
    }

/*  var txtRange = object.createTextRange();
    txtRange.moveStart( "character", cursorposition);
    txtRange.moveEnd( "character", cursorposition - object.value.length);
    txtRange.select(); */
  }

};

function ParseChar(sStr, sChar)
{

  if (sChar.length == null) 
  {
    zChar = new Array(sChar);
  }
    else zChar = sChar;

  for (i=0; i<zChar.length; i++)
  {
    sNewStr = "";

    var iStart = 0;
    var iEnd = sStr.indexOf(sChar[i]);

    while (iEnd != -1)
    {
      sNewStr += sStr.substring(iStart, iEnd);
      iStart = iEnd + 1;
      iEnd = sStr.indexOf(sChar[i], iStart);
    }
    sNewStr += sStr.substring(sStr.lastIndexOf(sChar[i]) + 1, sStr.length);

    sStr = sNewStr;
  }

  return sNewStr;
};


String.prototype.formatPhoneNumber = function () {
	var p = this;
	if(p.length < 7){
		return "";
	}
		
	p ="(" + p; 
    l30=p.length;
    p30=p.substring(0,4);
    p30=p30+") ";

    p31=p.substring(4,l30);
    pp=p30+p31;

    l40 = pp.length;
    p40 = pp.substring(0,9);
    p40 = p40 + "-";

    p41 = pp.substring(9,l40);
    ppp = p40 + p41;
	return ppp;
};

String.prototype.formatInternationalPhoneNumber = function () {
	var formattedPhone = "";
	if(this == "0" || this.length === 0)
		formattedPhone = "n/a";
	else if(this.length >= 10)
		formattedPhone = "1 "+this.formatPhoneNumber();
	else if(this.length >= 7)
		formattedPhone = this.formatPhoneNumber();

	return formattedPhone;
};


String.prototype.capitalize = function () {
	return this.toLowerCase().replace(/\b[a-z]/g, function (str, n) { return str.toUpperCase(); });
};

// format currency
// Number.prototype.formatCurrency = String.prototype.formatCurrency
Number.prototype.formatCurrency = function(forceDecimal){
	return this.toString().formatCurrency(forceDecimal);
};
//function formatCurrency(amount,forceDecimal)
String.prototype.formatCurrency = function(forceDecimal){
                var forceDecimal = forceDecimal || false,
                     delimiter = ",";
                
                // Sanitize it
	amount = this.replace(/[^\d.\-]/g,"");

	if(!amount)
		return "0.00";
		
	if(amount.indexOf(".")==-1)
		amount += ".00";

	
	var a = amount.split('.',2);
	var d = a[1];
	var i = parseInt(a[0]);
	if(isNaN(i)) { return ''; }
	var minus = '';
	if(i < 0) { minus = '-'; }
	i = Math.abs(i);
	var n = new String(i);
	var a = [];
	while(n.length > 3)
	{
		var nn = n.substr(n.length-3);
		a.unshift(nn);
		n = n.substr(0,n.length-3);
	}
	if(n.length > 0) { a.unshift(n); }
	n = a.join(delimiter);
	
	if(d.length < 1)
		amount = n;
	else {
	// there is a decimal here
		
		// d == decimal
		if(d == "0" || d == "00" || d.length === 0) // $ XXXX.0 or $ XXXX.00 or $ XXXX
			amount = n; 
		else if(d.length === 1) // $ XXX.X0
			amount = n + '.' + d + "0"; 
		else if(d.length === 2) // $ XXX.XX
			amount = n + '.' + d; 
		else{ // $ XXX.XXXX
			d = parseFloat("0."+d);
			d = Math.round(d*100); // only allow 2 decimal places
			
			amount = n + '.' + d;
		}
	}
	
	amount = minus + amount;

	if(forceDecimal === true && d == "00")
	    amount = amount + ".00";
		
	return amount;
};


Number.prototype.toMonthName = function(abbrev){
	var months,
		value = this;
	
	if(abbrev)
		months = ['Jan','Feb','Mar','Apri','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
	else
		months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
	
	value--; // jan = 0, not jan = 1 in this array

	return months[value];
};


String.prototype.toNumber = function(){
	// convert ($350) -> -350
	_this = this.replace("($","-").replace(")", "");
	//strip out everything except numbers and . and -
	return Number(_this.replace(/[^\d.\-]/g,""));
};

String.prototype.withDaySuffix = function(){
	// strip out leading 0 from the day (ex 09 -> 9)
	var _this = (this.length = 2 && this.substring(0,1) =="0")? this.substring(1): this, 
			
		l=_this.length, 
		r=parseInt(_this.substring(l-2,l)), 
		i = _this % 10;
	return r + (((r < 11 || r > 19) && (i < 4)) ? ['th','st','nd','rd'][i] : 'th');
};

String.prototype.replaceAll = function(stringToFind,stringToReplace){
	// return this.explode(stringToFind).join(stringToReplace); << cooler :P
    var temp = this;
    var index = temp.indexOf(stringToFind);
        while(index != -1){
            temp = temp.replace(stringToFind,stringToReplace);
            index = temp.indexOf(stringToFind);
        }
        return temp;
};

String.prototype.toDate = function (mask, utc) {
	var splitBy = "-",
		mask = mask || "-",
		utc = utc || true;
	
	if(this == "")
		return null;
	
	if(this.indexOf("/")){
		splitBy = "/";
	}
	var date = this.split(splitBy);

	if(date.length != 3){
		return null;
	}
	
	if(utc == true){
		return date[2]+mask+date[0]+mask+date[1];
	} else {
		return date[0]+mask+date[1]+mask+date[2];
	}
	
};

String.prototype.formatDateToUSfromISO = function(){
	var	date = this.split("-"),
		mask = "/";

	return  month = date[1].toNumber() + mask + date[2].toNumber()  + mask + date[0]; 
};
String.prototype.formatDateToISOfromUS = function(){
	var	date = this.split("/"),
		mask = "-";

	return  month = date[2].toNumber() + mask + date[0].toNumber()  + mask + date[1]; 
};

