////////////////////////////////////////////////////////////////////
/////////CONVERSION FUNCTIONS///////////////////////////////////////
////////////////////////////////////////////////////////////////////
String.prototype.trim = function() {  return this.replace(/^\s*|\s*$/g, "") }

// formatDate : a PHP date like function for formatting date strings
// this code is in the public domain
// Svend Tofte http://www.svendtofte.com/code/date_format/
// input : format string
// time : epoch time (seconds, and optional)
// if time is not passed, formatting is based on the current "this" date object's set time.
//
// Supported switches: a, A, B, c, d, D, F, g, G, h, H, i, I (uppercase i), j, l (lowecase L), L, m, M, n, N, O, P, r, s, S, t, U, w, W, y, Y, z, Z
// Unsupported (as compared to date in PHP 5.1.3): T, e, o
Date.prototype.formatDate = function (input,time) {
    
    var daysLong =    ["Sunday", "Monday", "Tuesday", "Wednesday", 
                       "Thursday", "Friday", "Saturday"];
    var daysShort =   ["Sun", "Mon", "Tue", "Wed", 
                       "Thu", "Fri", "Sat"];
    var monthsShort = ["Jan", "Feb", "Mar", "Apr",
                       "May", "Jun", "Jul", "Aug", "Sep",
                       "Oct", "Nov", "Dec"];
    var monthsLong =  ["January", "February", "March", "April",
                       "May", "June", "July", "August", "September",
                       "October", "November", "December"];

    var switches = { // switches object
        
        a : function () {
            // Lowercase Ante meridiem and Post meridiem
            return date.getHours() > 11? "pm" : "am";
        },
        
        A : function () {
            // Uppercase Ante meridiem and Post meridiem
            return (this.a().toUpperCase ());
        },
    
        B : function (){
            // Swatch internet time. code simply grabbed from ppk,
            // since I was feeling lazy:
            // http://www.xs4all.nl/~ppk/js/beat.html
            var off = (date.getTimezoneOffset() + 60)*60;
            var theSeconds = (date.getHours() * 3600) + 
                             (date.getMinutes() * 60) + 
                              date.getSeconds() + off;
            var beat = Math.floor(theSeconds/86.4);
            if (beat > 1000) beat -= 1000;
            if (beat < 0) beat += 1000;
            if ((String(beat)).length == 1) beat = "00"+beat;
            if ((String(beat)).length == 2) beat = "0"+beat;
            return beat;
        },
        
        c : function () {
            // ISO 8601 date (e.g.: "2004-02-12T15:19:21+00:00"), as per
            // http://www.cl.cam.ac.uk/~mgk25/iso-time.html
            return (this.Y() + "-" + this.m() + "-" + this.d() + "T" + 
                    this.h() + ":" + this.i() + ":" + this.s() + this.P());
        },
        
        d : function () {
            // Day of the month, 2 digits with leading zeros
            var j = String(this.j());
            return (j.length == 1 ? "0"+j : j);
        },
        
        D : function () {
            // A textual representation of a day, three letters
            return daysShort[date.getDay()];
        },
        
        F : function () {
            // A full textual representation of a month
            return monthsLong[date.getMonth()];
        },
        
        g : function () {
            // 12-hour format of an hour without leading zeros
            return date.getHours() > 12? date.getHours()-12 : date.getHours();
        },
        
        G : function () {
            // 24-hour format of an hour without leading zeros
            return date.getHours();
        },
        
        h : function () {
            // 12-hour format of an hour with leading zeros
            var g = String(this.g());
            return (g.length == 1 ? "0"+g : g);
        },
        
        H : function () {
            // 24-hour format of an hour with leading zeros
            var G = String(this.G());
            return (G.length == 1 ? "0"+G : G);
        },
        
        i : function () {
            // Minutes with leading zeros
            var min = String (date.getMinutes ());
            return (min.length == 1 ? "0" + min : min);
        },
        
        I : function () {
            // Whether or not the date is in daylight saving time (DST)
            // note that this has no bearing in actual DST mechanics,
            // and is just a pure guess. buyer beware.
            var noDST = new Date ("January 1 " + this.Y() + " 00:00:00");
            return (noDST.getTimezoneOffset () == 
                    date.getTimezoneOffset () ? 0 : 1);
        },
        
        j : function () {
            // Day of the month without leading zeros
            return date.getDate();
        },
        
        l : function () {
            // A full textual representation of the day of the week
            return daysLong[date.getDay()];
        },
        
        L : function () {
            // leap year or not. 1 if leap year, 0 if not.
            // the logic should match iso's 8601 standard.
            // http://www.uic.edu/depts/accc/software/isodates/leapyear.html
            var Y = this.Y();
            if (         
                (Y % 4 == 0 && Y % 100 != 0) ||
                (Y % 4 == 0 && Y % 100 == 0 && Y % 400 == 0)
                ) {
                return 1;
            } else {
                return 0;
            }
        },
        
        m : function () {
            // Numeric representation of a month, with leading zeros
            var n = String(this.n());
            return (n.length == 1 ? "0"+n : n);
        },
        
        M : function () {
            // A short textual representation of a month, three letters
            return monthsShort[date.getMonth()];
        },
        
        n : function () {
            // Numeric representation of a month, without leading zeros
            return date.getMonth()+1;
        },
        
        N : function () {
            // ISO-8601 numeric representation of the day of the week
            var w = this.w();
            return (w == 0 ? 7 : w);
        },
        
        O : function () {
            // Difference to Greenwich time (GMT) in hours
            var os = Math.abs(date.getTimezoneOffset());
            var h = String(Math.floor(os/60));
            var m = String(os%60);
            h.length == 1? h = "0"+h:1;
            m.length == 1? m = "0"+m:1;
            return date.getTimezoneOffset() < 0 ? "+"+h+m : "-"+h+m;
        },
        
        P : function () {
            // Difference to GMT, with colon between hours and minutes
            var O = this.O();
            return (O.substr(0, 3) + ":" + O.substr(3, 2));
        },      
        
        r : function () {
            // RFC 822 formatted date
            var r; // result
            //  Thu         ,     21               Dec              2000
            r = this.D() + ", " + this.d() + " " + this.M() + " " + this.Y() +
            //    16          :    01          :    07               0200
            " " + this.H() + ":" + this.i() + ":" + this.s() + " " + this.O();
            return r;
        },

        s : function () {
            // Seconds, with leading zeros
            var sec = String (date.getSeconds ());
            return (sec.length == 1 ? "0" + sec : sec);
        },        
        
        S : function () {
            // English ordinal suffix for the day of the month, 2 characters
            switch (date.getDate ()) {
                case  1: return ("st"); 
                case  2: return ("nd"); 
                case  3: return ("rd");
                case 21: return ("st"); 
                case 22: return ("nd"); 
                case 23: return ("rd");
                case 31: return ("st");
                default: return ("th");
            }
        },
        
        t : function () {
            // thanks to Matt Bannon for some much needed code-fixes here!
            var daysinmonths = [null,31,28,31,30,31,30,31,31,30,31,30,31];
            if (this.L()==1 && this.n()==2) return 29; // ~leap day
            return daysinmonths[this.n()];
        },
        
        U : function () {
            // Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)
            return Math.round(date.getTime()/1000);
        },

        w : function () {
            // Numeric representation of the day of the week
            return date.getDay();
        },
        
        W : function () {
            // Weeknumber, as per ISO specification:
            // http://www.cl.cam.ac.uk/~mgk25/iso-time.html
        
            var DoW = this.N ();
            var DoY = this.z ();

            // If the day is 3 days before New Year's Eve and is Thursday or earlier,
            // it's week 1 of next year.
            var daysToNY = 364 + this.L () - DoY;
            if (daysToNY <= 2 && DoW <= (3 - daysToNY)) {
                return 1;
            }

            // If the day is within 3 days after New Year's Eve and is Friday or later,
            // it belongs to the old year.
            if (DoY <= 2 && DoW >= 5) {
                return new Date (this.Y () - 1, 11, 31).formatDate ("W");
            }
            
            var nyDoW = new Date (this.Y (), 0, 1).getDay ();
            nyDoW = nyDoW != 0 ? nyDoW - 1 : 6;

            if (nyDoW <= 3) { // First day of the year is a Thursday or earlier
                return (1 + Math.floor ((DoY + nyDoW) / 7));
            } else {  // First day of the year is a Friday or later
                return (1 + Math.floor ((DoY - (7 - nyDoW)) / 7));
            }
        },
        
        y : function () {
            // A two-digit representation of a year
            var y = String(this.Y());
            return y.substring(y.length-2,y.length);
        },        
        
        Y : function () {
            // A full numeric representation of a year, 4 digits
    
            // check if getFullYear is supported. if it
            // is, we just use that. ppks code is nice, but wont
            // work with dates outside 1900-2038, or something like that
            if (date.getFullYear) {
                var newDate = new Date("January 1 2001 00:00:00");
                var x = newDate.getFullYear();
                if (x == 2001) return date.getFullYear();
            }
			
            // else, do this:
            // codes thanks to ppk:
            // http://www.xs4all.nl/~ppk/js/introdate.html
            var x = date.getYear();
            var y = x % 100;
            y += (y < 38) ? 2000 : 1900;
            return y;
        },

        
        z : function () {
            // The day of the year, zero indexed! 0 through 366
            var t = new Date("January 1 " + this.Y() + " 00:00:00");
            var diff = date.getTime() - t.getTime();
            return Math.floor(diff/1000/60/60/24);
        },

        Z : function () {
            // Timezone offset in seconds
            return (date.getTimezoneOffset () * -60);
        }        
    
    }

    function getSwitch(str) {
        if (switches[str] != undefined) {
            return switches[str]();
        } else {
            return str;
        }
    }

    var date;
    if (time) {
        var date = new Date (time);
    } else {
        var date = this;
    }

    var formatString = input.split("");
    var i = 0;
    while (i < formatString.length) {
        if (formatString[i] == "\\") {
            // this is our way of allowing users to escape stuff
            formatString.splice(i,1);
        } else {
            formatString[i] = getSwitch(formatString[i]);
        }
        i++;
    }
    
    return formatString.join("");
}
Date.DATE_ATOM    = "Y-m-d\\TH:i:sP"; 		// Atom      "2005-08-15T15:52:01+00:00"
Date.DATE_ISO8601 = "Y-m-d\\TH:i:sO";		// ISO-8601  "2005-08-15T15:52:01+0000"
Date.DATE_RFC2822 = "D, d M Y H:i:s O";		// RFC 2822  "Mon, 15 Aug 2005 15:52:01 +0000"
Date.DATE_W3C     = "Y-m-d\\TH:i:sP";		// W3C       "2005-08-15T15:52:01+00:00"

function FormatDate(DateToFormat,FormatAs)	{
	if(DateToFormat==null || DateToFormat=="") return "";
	if(!FormatAs) FormatAs="Y-m-d";
	var origDate = DateToFormat;

	DateToFormat = DateToFormat.toString().toLowerCase();
	DateToFormat = DateToFormat.trim();
	var arrDate
	var arrMonths = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
	var strMONTH;
	var Separator;
	var theTime="";

	// Handle special cases
	var today = new Date();
	if(DateToFormat=="today") DateToFormat = today.getFullYear() + "-" + (today.getMonth()+1) + "-" + today.getDate();
	if(DateToFormat=="tomorrow") {
		today.setDate(today.getDate()+1);
		DateToFormat = today.getFullYear() + "-" + (today.getMonth()+1) + "-" + today.getDate();
	}
	if(DateToFormat=="yesterday") { 
		today.setDate(today.getDate()-1);
		DateToFormat = today.getFullYear() + "-" + (today.getMonth()+1) + "-" + today.getDate();
	}

	while(DateToFormat.indexOf(",")>-1) DateToFormat = DateToFormat.replace(","," ");
	while(DateToFormat.indexOf("- ")>-1) DateToFormat = DateToFormat.replace("- ","-");
	while(DateToFormat.indexOf(" -")>-1) DateToFormat = DateToFormat.replace(" -","-");
	while(DateToFormat.indexOf("st")>-1) DateToFormat = DateToFormat.replace("st","");
	while(DateToFormat.indexOf("nd")>-1) DateToFormat = DateToFormat.replace("nd","");
	while(DateToFormat.indexOf("rd")>-1) DateToFormat = DateToFormat.replace("rd","");
	while(DateToFormat.indexOf("th ")>-1) DateToFormat = DateToFormat.replace("th ","");
	while(DateToFormat.indexOf("of")>-1) DateToFormat = DateToFormat.replace("of","");
	while(DateToFormat.indexOf("st,")>-1) DateToFormat = DateToFormat.replace("st,","");
	while(DateToFormat.indexOf("nd,")>-1) DateToFormat = DateToFormat.replace("nd,","");
	while(DateToFormat.indexOf("rd,")>-1) DateToFormat = DateToFormat.replace("rd,","");
	while(DateToFormat.indexOf("th,")>-1) DateToFormat = DateToFormat.replace("th,","");
	while(DateToFormat.indexOf("the")>-1) DateToFormat = DateToFormat.replace("the","");
	while(DateToFormat.indexOf("ides")>-1) DateToFormat = DateToFormat.replace("ides","15");
	while(DateToFormat.indexOf("  ")>-1) DateToFormat = DateToFormat.replace("  "," ");
	while(DateToFormat.indexOf(".")>-1) DateToFormat = DateToFormat.replace(".","^");
	while(DateToFormat.indexOf("/")>-1) DateToFormat = DateToFormat.replace("/","^");
	while(DateToFormat.indexOf("-")>-1) DateToFormat = DateToFormat.replace("-","^");
	while(DateToFormat.indexOf(" ")>-1) DateToFormat = DateToFormat.replace(" ","^");
	if(DateToFormat.substr(0,1) == "^")  DateToFormat = DateToFormat.substr(1,DateToFormat.length-1);

	DateToFormat = DateToFormat.replace("^","-");
	DateToFormat = DateToFormat.replace("^","-");
	if(DateToFormat.indexOf("^")>3) {
		theTime=DateToFormat.substring(DateToFormat.indexOf("^"),DateToFormat.length);
		while(theTime.indexOf("^")>-1) theTime = theTime.replace("^"," ");
		DateToFormat=DateToFormat.substr(0,DateToFormat.indexOf("^"));
	}

	Separator="-";
	
	arrDate = DateToFormat.split(Separator);
	DateToFormat = "";
	for(var iSD = 0;iSD < arrDate.length;iSD++){
		if(arrDate[iSD]!=""){
		DateToFormat += arrDate[iSD] + Separator;
		}
	}
	DateToFormat = DateToFormat.substring(0,DateToFormat.length-1);
	arrDate = DateToFormat.split(Separator);
	if(arrDate.length < 3) return origDate;			

	var DAY = arrDate[0];
	var MONTH = arrDate[1];
	var YEAR = toNumber(arrDate[2]);


	// Asumes american date format unless the number in the first part is too big to be a month.
	if(parseInt(arrDate[1])>0 && parseInt(arrDate[0])>0 ){
		if(parseInt(arrDate[0]) > 12) {
			DAY = parseInt(arrDate[0]);
			MONTH = arrDate[1];
		} else {
			MONTH = arrDate[0];
			DAY = parseInt(arrDate[1]);
		}
	}
	

	if(parseInt(arrDate[0]) && arrDate[0].toString().length==4){
		YEAR = parseInt(arrDate[0]);
		MONTH = parseInt(arrDate[1]);
		DAY = parseInt(arrDate[2]);
	}


	for(var iSD = 0;iSD < arrMonths.length;iSD++){
		var ShortMonth = arrMonths[iSD].substring(0,3).toLowerCase();
		var MonthPosition = DateToFormat.indexOf(ShortMonth);
		if(MonthPosition > -1){
			MONTH = iSD + 1;
			if(MonthPosition == 0){
				DAY = arrDate[1];
				YEAR = parseInt(arrDate[2]);
			}
			break;
		}
	}
	var strTemp = YEAR.toString();
	if(strTemp.length==1) YEAR = "0" + YEAR;
	strTemp = YEAR.toString();
	if(strTemp.length==2) {	
		if(parseInt(YEAR)>30){
		YEAR = parseInt("19" + YEAR);
		} else {
		YEAR = parseInt("20" + YEAR);
		}
	} 

	if(MONTH==null || isNaN(MONTH) || MONTH>12 || MONTH<1) return origDate;

	if(parseInt(MONTH)< 10 && MONTH.toString().length < 2) 	MONTH = "0" + MONTH;
	if(parseInt(DAY)< 10 && DAY.toString().length < 2)		DAY = "0" + DAY;
//	if(console) console.info(YEAR + "-" + MONTH + "-" + DAY);
	newDate=new Date(parseInt(YEAR.toString()),parseInt(MONTH.toString())-1,parseInt(DAY.toString()));
	if(parseInt(newDate.getMonth())!=parseInt(MONTH)-1) return origDate;
	//if(console) console.info(newDate);
	
	newDate = newDate.formatDate(FormatAs);
	return newDate;
}
function toGPA(text) {
	number = parseFloat(text);
	if(isNaN(number)) return "";
	number = Math.abs(number) + .000000001;
	number = number.toFixed(2);
	if(number>5) return "";
	return number;
}
//function toNumber(text) {
//	return parseFloat(text);
//}
function toPhone(text) {
	var stripped = text.replace(/[\(\)\.\-\ A-Za-z]/g, '');
	var newPhone;
	if(stripped.length==7) {
		return newPhone=stripped.substr(0,3) + "-" + stripped.substr(3,4);
	}
	if(stripped.length==10) {
		return newPhone="(" + stripped.substr(0,3) + ") " + stripped.substr(3,3) + "-" + stripped.substr(6,4);
	}
	return text;
}
function toByuId(text) {
	var stripped = text.replace(/[\(\)\.\-\ A-Za-z]/g, '');
	if(stripped.length==9) return (stripped.substr(0,2) + "-" + stripped.substr(2,3) + "-" + stripped.substr(5,4));
	return text;
}
function toSSN(text) {
	var stripped = text.replace(/[\(\)\.\-\ A-Za-z]/g, '');
	if(stripped.length==9) return (stripped.substr(0,3) + "-" + stripped.substr(3,2) + "-" + stripped.substr(5,4));
	return text;
}
function toZip(text) {
	var stripped = text.replace(/[\(\)\.\-\ A-Za-z]/g, '');
	if(stripped.length==9) 	return(stripped.substr(0,5) + "-" + stripped.substr(5,4)); 
	return text;
}
function toDigits(text) {
	return text.replace(/[\(\)\.\-\ A-Za-z]/g, '');
}
function trim(str) {
	var	str = str.replace(/^\s\s*/, ''),
		ws = /\s/,
		i = str.length;
	while (ws.test(str.charAt(--i)));
	return str.slice(0, i + 1);
}

// Flexible Function Names
toBirthday=tobirthday=toDate=todate=FormatDate;
todigits=toDigits;
tofloat=toFloat=tonumeric=toNumeric=tonumber=toNumber=parseFloat;
togpa=toGpa=toGPA;
tophone=totelephone=toTelephone=toPhone;
tobyuid=toBYUID=toByuId;
tossn=toSsn=toSSN;
tozip=tozipcode=toZipCode=toZip;