﻿//JSON Stringifier & trimmer
if(!this.JSON){JSON=function(){function f(n){return n<10?'0'+n:n;}
Date.prototype.toJSON=function(){return this.getUTCFullYear()+'-'+
f(this.getUTCMonth()+1)+'-'+
f(this.getUTCDate())+'T'+
f(this.getUTCHours())+':'+
f(this.getUTCMinutes())+':'+
f(this.getUTCSeconds())+'Z';};var meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},escapeable=/["\\\x00-\x1f\x7f-\x9f]/g;function quote(string){return escapeable.test(string)?'"'+string.replace(escapeable,function(a){var c=meta[a];if(typeof c==='string'){return c;}
c=a.charCodeAt();return'\\u00'+Math.floor(c/16).toString(16)+
(c%16).toString(16);})+'"':'"'+string+'"';}
function stringify(key,holder,replacer){var i,k,v,length,partial,value=holder[key];if(value&&typeof value==='object'&&typeof value.toJSON==='function'){value=value.toJSON(key);}
if(typeof replacer==='function'){value=replacer.call(holder,key,value);}
switch(typeof value){case'string':return quote(value);case'number':return isFinite(value)?String(value):'null';case'boolean':case'null':return String(value);case'object':if(!value){return'null';}
partial=[];if(typeof value.length==='number'&&!(value.propertyIsEnumerable('length'))){length=value.length;for(i=0;i<length;i+=1){partial[i]=stringify(i,value,replacer)||'null';}
return'['+partial.join(',')+']';}
if(typeof replacer==='object'){length=replacer.length;for(i=0;i<length;i+=1){k=replacer[i];if(typeof k==='string'){v=stringify(k,value,replacer);if(v){partial.push(quote(k)+':'+v);}}}}else{for(k in value){v=stringify(k,value,replacer);if(v){partial.push(quote(k)+':'+v);}}}
return'{'+partial.join(',')+'}';}}
return{stringify:function(value,replacer){if(typeof replacer!=='function'){if(!replacer){replacer=function(key,value){if(!Object.hasOwnProperty.call(this,key)){return undefined;}
return value;};}else if(typeof replacer!=='object'||typeof replacer.length!=='number'){throw new Error('JSON.stringify');}}
return stringify('',{'':value},replacer);},parse:function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==='object'){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v;}else{delete value[k];}}}}
return reviver.call(holder,key,value);}
if(/^[\],:{}\s]*$/.test(text.replace(/\\["\\\/bfnrtu]/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){j=eval('('+text+')');return typeof reviver==='function'?walk({'':j},''):j;}
throw new SyntaxError('JSON.parse');},quote:quote};}();}
String.prototype.trim = function() {return this.replace(/^\s+|\s+$/g,"");}
Math.roundFloat = function(x, n){
    if(!isNaN(parseFloat(x)) && !isNaN(parseInt(n, 10))){
        var retVal = parseFloat(x) + '';
        //if there is a decimal, then round
        if(retVal.indexOf('.') > -1){
            n = parseInt(n, 10);
            var postDeci = retVal.substr(retVal.indexOf('.') + 1, n + 1);
            //we only need to round if there was n + 1 digits after the decimal 
            if(postDeci.length > n){
                //put a decimal in the right place so we can round
                var postDeciPreDeci = postDeci.substring(0, postDeci.length - 1);
                var postDeciPostDeci = postDeci.charAt(postDeci.length - 1);
                //we need to preserve any leading zeros
                var wasZero = true;
                var leadingZeros = '';
                for(var i = 0; wasZero == true && i < postDeciPreDeci.length; i++){
                    if(postDeciPreDeci.charAt(i) == '0'){
                        leadingZeros += '0';
                    }else{
                        wasZero = false;
                    }
                }
                postDeci = leadingZeros + Math.round(parseFloat(postDeciPreDeci + '.' + postDeciPostDeci)) + '';
            }
            var preDeci = retVal.substring(0, retVal.indexOf('.'));
            retVal = parseFloat(preDeci + '.' + postDeci);
        }
        return retVal;
    }else{
        throw new Error("x must be a float and n must be an int in Math.floatRound");
    }
};  
function addEvent( obj, type, fn )
{
	if (obj.addEventListener)
		obj.addEventListener( type, fn, false );
	else if (obj.attachEvent)
	{
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
	}
}
function removeEvent( obj, type, fn )
{
	if (obj.removeEventListener)
		obj.removeEventListener( type, fn, false );
	else if (obj.detachEvent)
	{
		obj.detachEvent( "on"+type, obj[type+fn] );
		obj[type+fn] = null;
		obj["e"+type+fn] = null;
	}
}
window.$ = function(elementID){return document.getElementById(elementID);};

	
if(!this.IPS){
    IPS = {};
}
if(!this.IPS.Shared){
IPS.Shared = {
    //selects the passed ddls option by value returns true if the value was found and selected
    selectOptionByVal:function(ddl, val){
        //if ddl is an element node and a select box
        if(ddl.nodeType == 1 && ddl.tagName.toLowerCase() == 'select'){
            if(val != null){
                for(var i = 0; i < ddl.options.length; i++){
                    if(ddl.options[i].value == val){
                        ddl.options[i].selected = true;
                        return true; //return true if the value was found
                    }
                }
                if(ddl.options[0]){
                    ddl.options[0].selected = true;
                }
                return false; //false if no value was selected
            }else{
                if(ddl.options[0]){
                    ddl.options[0].selected = true;
                }
                return false;
            }
        }else{
            throw 'Passed object is not a select element';
        }
    },
    
    disableElement:function(element){
        var regEx = / Disabled$/;
        //add the Disabled class if it isnt already there
        if(!regEx.test(element.className)){
            element.className += ' Disabled';
        }
        //disable anchors by adding a cancelling onclick handler
        if(element.tagName && element.tagName == 'A'){
            addEvent(element, 'click', IPS.Shared.anchorDisabler);
        }else if(element.disabled != null){
            element.disabled = true;
        }
    },
    
    enableElement:function(element){
        element.className = element.className.replace(/ Disabled$/, '');
        //if the classname is simply "Disabled", get rid of it.  this is needed because of a FF quirk
        if(element.className == 'Disabled'){
            element.className = '';
        } 
        if (element.tagName && element.tagName == 'A') {
            removeEvent(element, 'click', IPS.Shared.anchorDisabler);
        }else if(element.disabled != null){
            element.disabled = false;
        }
    },
    
    anchorDisabler:function(e){
        if (e) {
            if (e.preventDefault) {
                e.preventDefault();
            } else if ('returnValue' in e) {
                e.returnValue = false;
            }
        }
    },

    markSelected: function(element) {
        var regEx = / Selected$/;
        //add the Invalid class if it isnt already there
        if (!regEx.test(element.className)) {
            element.className += ' Selected';
        }
    },

    unmarkSelected: function(element) {
        element.className = element.className.replace(/ Selected$/, '');
        //if the classname is simply "Invalid", get rid of it.  this is needed because of a FF quirk
        if (element.className == 'Selected') {
            element.className = '';
        }
    },
    
    //This leaves the first option and removes the others before populating by default.
    //If you set deleteFirstOpt true, the first option will also be removed.
    populateDDLWithList:function(ddl, list, deleteFirstOpt){
        var isSuccess = false;
        if(ddl && ddl.nodeType == 1 && ddl.tagName.toLowerCase() == 'select'){
            if(deleteFirstOpt != null && deleteFirstOpt == true){
                ddl.options.length = 0;
            }else{
                ddl.options.length = 1;
            }
            if(list && list.length){
                for(var i = 0; i < list.length; i++){
                    if(list[i].Name && list[i].Value){
                        ddl.options[ddl.options.length] = new Option(list[i].Name, list[i].Value);
                    }
                }
                isSuccess = true;
            }
        }
        return isSuccess;
    },

    insertQueryInURL: function(url, key, val) {
        var args = IPS.Shared.getQueryParams(url);
        args[key] = val;
        var qindex = url.indexOf('?');
        var hindex = url.indexOf('#');
        var newUrl = url;
        if (qindex > -1) {
            newUrl = url.substring(0, qindex);
        }else if(hindex > -1){
            newUrl = url.substring(0, hindex);
        }
        newUrl += '?';
        for (var prop in args) {
            newUrl += prop + '=' + args[prop] + '&';
        }
        newUrl = newUrl.substring(0, newUrl.length - 1);
        if(hindex > -1){
            newUrl += url.substring(hindex);
        }
        return newUrl;
    },

    getQueryParams: function(url) {
        var args = {};
        var qindex = url.indexOf('?');
        var end = url.indexOf('#');
        var query;
        if(qindex > -1){
            if(end > -1){
                query = url.substring(qindex + 1, end);
            }else{
                query = url.substring(qindex + 1);
            }
            var pairs = query.split('&');
            for (var i = 0; i < pairs.length; i++) {
                var pos = pairs[i].indexOf("=");
                if (pos > -1) {
                    var argname = pairs[i].substring(0, pos);
                    var value = pairs[i].substring(pos + 1);
                    args[argname] = value;
                }
            }
        }
        return args;
    },    
    
    addCover:function(){
        if(!document.getElementById('CoverDiv')){
            var cover = document.createElement('div');
            cover.className = 'CoverDiv';
            cover.id = 'CoverDiv';
            document.body.appendChild(cover);
            return cover;
        }
        return document.getElementById('CoverDiv');
    },
    
    removeCover:function(){
        if(document.getElementById('CoverDiv')){
            var cover = document.getElementById('CoverDiv');  
            cover.parentNode.removeChild(cover); 
        }
    },
    
    centerElement:function(target){
        target.style.position = 'absolute';
        var scrollPos = IPS.Shared.findScrollPos();
        var winWidth = document.body.clientWidth;
        var winHeight = document.body.clientHeight;
        if(self.innerHeight){
            winHeight = self.innerHeight;
            winWidth = self.innerWidth;
        }else if(document.documentElement && document.documentElement.clientHeight){
            winHeight = document.documentElement.clientHeight;
            winWidth = document.documentElement.clientWidth;
        }
        var elWidth = target.offsetWidth;
        var elHeight = target.offsetHeight;
        var vOffset = parseInt((winHeight - elHeight) / 2, 10) + scrollPos[1];
        var hOffset = parseInt((winWidth - elWidth) / 2, 10) + scrollPos[0];
        //if the element is wider than the available space, offset it by 50px.  else center it.
        if(hOffset < 20){
            target.style.left = '50px';
        }else{
            target.style.left = hOffset + 'px';
        }
        //similar to width
        if(vOffset < 20){
            target.style.top = '100px';
        }else{
            target.style.top = vOffset + 'px';
        }
    },

    findPos: function(obj) {
        var curleft = curtop = 0;
        if (obj.offsetParent) {
            curleft = obj.offsetLeft
            curtop = obj.offsetTop
            while (obj = obj.offsetParent) {
                curleft += obj.offsetLeft
                curtop += obj.offsetTop
            }
        }
        return [curleft, curtop];
    },
    
    findScrollPos:function() {
        var scrOfX = 0, scrOfY = 0;
        if( typeof( window.pageYOffset ) == 'number' ) {
            //Netscape compliant
            scrOfY = window.pageYOffset;
            scrOfX = window.pageXOffset;
        } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {   8.
            //DOM compliant
            scrOfY = document.body.scrollTop;
            scrOfX = document.body.scrollLeft;
        } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
            //IE6 standards compliant mode
            scrOfY = document.documentElement.scrollTop;
            scrOfX = document.documentElement.scrollLeft;
        }
        return [ scrOfX, scrOfY ];
    },
    
    cookieValue:function(key){
        var returnVal = null;
        var pos = document.cookie.indexOf(key + '=');
        if(pos > -1){
            var start = pos + key.length + 1;
            var end = document.cookie.indexOf(';', start);
            if(end == -1){
                end = document.cookie.length;
            }
            returnVal = decodeURIComponent(document.cookie.substring(start, end));
        }
        return returnVal;
    },
    
    removeClass:function(element, className){
        if(element && element.className){
            var regEx = new RegExp('(^' + className + ' )|(^' + className + '$)|( ' + className + ' )|( ' + className + '$)', 'g');
            element.className = element.className.replace(regEx, '');
        }
    },
    
    addClass:function(element, className){
        IPS.Shared.removeClass(element, className);
        if(element && element.className){
            if(element.className.length > 0){
                element.className += ' ' + className;
            }else{
                element.className = className;
            }
        }
    },
    
    cleanWCFProperties:function(obj){
        var returnVal = obj;
        for(var prop in obj){
//            if(prop.substring(prop.length - 5) == 'Field'){
//                obj[prop.substring(0, prop.length - 5)] = IPS.Shared.cleanWCFProperties(obj[prop]);
//                delete obj[prop];
//            } else 
            if (prop == 'ExtensionData') {
                delete obj[prop];
            }else if(typeof obj[prop] == 'object'){
                obj[prop] = IPS.Shared.cleanWCFProperties(obj[prop]);
            }
        }
        return returnVal;
    },

    JSONDateParser: function(key, value) {
        var dateRegex = new RegExp("^/Date\\(\\d+\\)/$");
        if(dateRegex.test(value)){
            var utcRegex = new RegExp("\\d+");
            //return utcRegex.exec(value)[0];
            return new Date(parseInt(utcRegex.exec(value)[0], 10));
        }else{
            return value;
        }
    },

    JSONDateReplacer: function(key, value) {
        if(value instanceof Date){
            return (value.getMonth() + 1) + '-' + value.getDate() + '-' + value.getFullYear();
        }else{
            return value;
        }
    },
    
    viewVideoClick: function(videoPlayerURL, videoURL) {
        var newWin = window.open('', 'Media', 'height=480,width=640,resizeable');
        newWin.document.write('<html><head><script type="text/javascript">function getBorderSizes(){var wh=[null,null];if(getViewportWH()[0] && window.resizeTo){window.resizeTo(300,300);wh[0]=300-getViewportWH()[0];wh[1]=300-getViewportWH()[1];}return wh;}function getViewportWH(){var wh=[null,null];if(window.innerWidth){wh[0]=window.innerWidth;wh[1]=window.innerHeight;}else if(document.documentElement && document.documentElement.clientWidth){wh[0]=document.documentElement.clientWidth;wh[1]=document.documentElement.clientHeight;}else if(document.body && document.body.clientWidth){wh[0]=document.body.clientWidth;wh[1]=document.body.clientHeight;}return wh;} function resizeViewport(){var wh=getBorderSizes();if(wh[0] && window.resizeTo && document.images){window.resizeTo(640+wh[0], 480+wh[1]);}};<\/script></head><body style="margin:0; padding:0;" onload="resizeViewport();"><form id="form1" runat="server"><div align="center"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="640" height="480" align="middle"><param name="allowScriptAccess" value="sameDomain" /><param name="movie" value="' + videoPlayerURL + '" /><param name="FlashVars" value="flvURL=' + videoURL + '&ControlPanelColor=0xa6caf0&buttonColor=0x000000&ControlPanelPosition=0&showControlPanel=1&ShowtimeColor=0xffffff&bAutoPlay=1&bAutoRepeat=0&BufferTime=5000&tmeColor=0xffffff&loaColor=0x666666&GroundColor=0x000000&conNum=0&bShowtime=1&startvolume=100" /><param name="quality" value="high" /><param name="bgcolor" value="#000000" /><param name="scale" value="noscale" /><param name="salign" value="lt" />  <embed src="' + videoPlayerURL + '" width="640" height="480" align="middle" quality="high" bgcolor="#000000" scale="noscale" salign="lt" flashvars="flvURL=' + videoURL + '&ControlPanelColor=0xa6caf0&buttonColor=0x000000&ControlPanelPosition=0&showControlPanel=1&ShowtimeColor=0xffffff&bAutoPlay=1&bAutoRepeat=0&BufferTime=5000&tmeColor=0xffffff&loaColor=0x666666&GroundColor=0x000000&conNum=0&bShowtime=1&startvolume=100" allowscriptsccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" /></object></div></form></body></html>');
        newWin.document.close();
        newWin.focus();
    },
    
    Validate:{
        markInvalid:function(element){
            var regEx = / Invalid$/;
            //add the Invalid class if it isnt already there
            if(!regEx.test(element.className)){
                element.className += ' Invalid';
            }
        },
        
        markValid:function(element){
            element.className = element.className.replace(/ Invalid$/, '');
            //if the classname is simply "Invalid", get rid of it.  this is needed because of a FF quirk
            if(element.className == 'Invalid'){
                element.className = '';
            }
        },
        
        phoneNumber:function(phoneNumber){
            var isValid = false;
            var regEx = /^\d{10}$/;
            isValid = regEx.test(phoneNumber);
            return isValid;
        },
        
        postalCode:function(postalCode){
            var isValid = false;
            var regEx = /^(\d{5}$)|(\d{9}$)|(([a-zA-Z]\d){3}$)/;
            isValid = regEx.test(postalCode);
            return isValid;
        },
        
        postalCode5:function(postalCode){
            var isValid = false;
            var regEx = /^\d{5}$/;
            isValid = regEx.test(postalCode);
            return isValid;
        },
        
        postalCodeCA:function(postalCode){
            var isValid = false;
            var regEx = /^([a-zA-Z]\d){3}$/;
            isValid = regEx.test(postalCode);
            return isValid;
        },
        
        percentage:function(percentage){
            var isValid = false;
            var regEx = /^\d*\.?\d*$/;
            if(regEx.test(percentage) && percentage != '.'){
                isValid = true;
            }
            return isValid;
        },

        date: function(dateString) {
            var isValid = false;
            var parts = dateString.split('/');
            if (parts.length == 3) {
                var month = parseInt(parts[0], 10);
                var day = parseInt(parts[1], 10);
                var year = parseInt(parts[2], 10);
                if(!isNaN(month) && !isNaN(day) && !isNaN(year)){
                    month--;
                    var tmpDate = new Date(year, month, day);
                    if(month == tmpDate.getMonth() && day == tmpDate.getDate() && 
                        year == tmpDate.getFullYear()){
                        isValid = true;
                    }
                }
            }
            return isValid;
        },
        
        time:function(timeString){
            var isValid = false;
            var parts = timeString.split(':');
            if(parts.length == 2){
                var hour = parseInt(parts[0], 10);
                var minute = parseInt(parts[1], 10);
                if(!isNaN(hour) && !isNaN(minute)){
                    if(hour > 0 && hour < 13 && minute > -1 && minute < 60){
                        var nextParts = parts[1].split(' ');
                        if(nextParts.length == 2 && (nextParts[1].toLowerCase() == 'am' || nextParts[1].toLowerCase() == 'pm')){
                            isValid = true;                            
                        }
                    }
                }
            }
            return isValid;
        },
        
        year:function(yearString){
            var isValid = false;
            var regEx = /^\d\d\d\d$/;
            if(regEx.test(yearString) && yearString > 1900 && yearString < 2050){
                isValid = true;
            }
            return isValid;
        },
        
        money:function(money){
            var isValid = false;
            var regEx = /^\$?-?\d*\.?\d*$/;
            if (regEx.test(money) && money != '.' && money != '-' && money != '$') {
                isValid = true;
            }
            return isValid;
        },
        
        wholeNum:function(number){
            var isValid = false;
            var regEx = /^\d+$/;
            if(regEx.test(number)){
                isValid = true;
            }
            return isValid;
        },
        
        email:function(email){
            var isValid = false;
            var regEx = /^[a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)*@[a-zA-Z_]+(\.[a-zA-Z]+)+$/;
            if(regEx.test(email)){
                isValid = true;
            }
            return isValid;
        }
    },
    
    Format:{
        number:function(number, decimalPlaces){
            if((number + '').length > 0){
                if(!isNaN(parseFloat(number)) && !isNaN(parseInt(decimalPlaces, 10))){
                    var dp = parseInt(decimalPlaces, 10);
                    var retVal = Math.roundFloat(parseFloat(number), dp) + '';
                    if(dp < 1){
                        retVal = Math.round(retVal) + '';
                    }else{
                        if(retVal.indexOf('.') > -1){
                            zerosNeeded = dp - retVal.substring(retVal.indexOf('.') + 1).length;
                            var zeros = '';
                            for(var i = 0; i < zerosNeeded; i++){
                                zeros += '0';
                            }
                            retVal = retVal + zeros + '';
                        }else{
                            var zeros = '';
                            for(var i = 0; i < dp; i++){
                                zeros += '0';
                            }
                            retVal = retVal + '.' + zeros;
                        }
                    }
                    return retVal;
                }
            }
            return '';
        },
        
        //will format the passed string to a phone number like (XXX) XXX-XXXX
        //ignores all non digit characters
        phoneNumber:function(phoneNumber){
            var formattedNumber = phoneNumber;
            if(phoneNumber != null){
                var regEx = /\d/g;
                //returns an array of all digits in phoneNumber
                var digits = phoneNumber.match(regEx);
                //if the phone number had 10 digits or has 11 digits and the first is a 1 (as in long distance dialing)
                //format the string
                if(digits != null && (digits.length == 10 || (digits.length == 11 && digits[0] == 1))){
                    if(digits.length == 11){
                        //strip the 1 by reversing the array and poping off the new end (the old 0 index) and reversing again
                        digits = digits.reverse();
                        digits.pop()
                        digits = digits.reverse();                    
                    }
                    var d = digits; //shorthand
                    formattedNumber = '(' + d[0] + d[1] + d[2] + ') ' + d[3] + d[4] + d[5] + '-' + d[6] + d[7] + d[8] + d[9];
                }
            }
            return formattedNumber;
        },
        
        postalCode:function(postalCode){
            var formattedCode = postalCode;
            if(postalCode != null){
                var regEx = /\d/g;
                //returns an array of all digits in postalCode
                var digits = postalCode.match(regEx);
                //codes in the US are only valid (and thus can be formatted) if they contain 5 or 9 digits
                if(digits != null && (digits.length == 5 || digits.length == 9)){
                    var d = digits; //shorthand
                    switch(digits.length){
                        case 5:
                            //use a blank space to force a concat string instead of int addition
                            formattedCode = d[0] + d[1] + d[2] + d[3] + d[4] + '';
                            break;
                        case 9:
                            formattedCode = d[0] + d[1] + d[2] + d[3] + d[4] + '-' + d[5] + d[6] + d[7] + d[8];
                            break;                    
                    }
                }
            }
            return formattedCode;
        },
        
        shortDate:function(date){
            var formattedDate = date;
            if(date != null){
                if(date.getMonth && date.getDate){
                    if(date.getFullYear){
                        formattedDate = (date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear();
                    }else if(date.getYear){
                        formattedDate = (date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getYear();
                    }
                }
            }
            return formattedDate;
        },
        
        timeString:function(timeString){
            var formattedTime = timeString;
            var parts = timeString.split(':');
            if(parts.length == 2){
                var hour = parseInt(parts[0], 10);
                var minute = parseInt(parts[1], 10);
                var ampm = 'AM';
                if(!isNaN(hour) && !isNaN(minute)){
                    if(hour > -1 && hour < 24 && minute > -1 && minute < 60){
                        //we have a valid time.  see if wee need to look for AM/PM.  if hour is 1-12, then yes
                        if(hour > 0 && hour < 13){
                            if(parts[1].toLowerCase().indexOf('am') > -1){
                                ampm = 'AM';
                            }else if(parts[1].toLowerCase().indexOf('pm') > -1){
                                ampm = 'PM';
                            }else if(parts[1].toLowerCase().indexOf('a') > -1){
                                ampm = 'AM';
                            }else if(parts[1].toLowerCase().indexOf('p') > -1){
                                ampm = 'PM';
                            }else if(hour == 12){
                                ampm = 'PM';
                            }
                        }else{
                            //military time
                            if(hour == 0){
                                ampm = 'AM';
                                hour = 12;
                            }else{
                                ampm = 'PM';
                                hour = hour - 12;
                            }
                        }
                        var minFormatted = minute + '';
                        if(minute < 10){
                            minFormatted = '0' + minute + '';
                        }
                        formattedTime = hour + ':' + minFormatted + ' ' + ampm;
                    }
                }
            }
            return formattedTime;
        }
    },
    
    StripFormat:{
        phoneNumber:function(phoneNumber){
            var strippedFormat = phoneNumber;
            var regEx = /\d/g;
            //returns an array of all digits in phoneNumber
            var digits = phoneNumber.match(regEx);
            if(digits != null && (digits.length == 10 || (digits.length == 11 && digits[0] == 1))){
                if(digits.length == 11){
                    //strip the 1 by reversing the array and poping off the new end (the old 0 index) and reversing again
                    digits = digits.reverse();
                    digits.pop()
                    digits = digits.reverse();                     
                }
                //the tostring method returns a comma delimited string, so we need to strip the commas
                strippedFormat = digits.toString().replace(/,/g, '');
            }
            return strippedFormat;
        },
        
        postalCode:function(postalCode){
            var strippedFormat = postalCode;
            //remove all non word characters
            var regEx = /\W/g;
            postalCode = postalCode.replace(regEx, '');
            strippedFormat = postalCode;
            return strippedFormat;
        },
                        
        date:function(dateString){
            var newDate;
            var parts = dateString.split('/');
            if (parts.length == 3) {
                var month = parseInt(parts[0], 10);
                var day = parseInt(parts[1], 10);
                var year = parseInt(parts[2], 10);
                if(!isNaN(month) && !isNaN(day) && !isNaN(year)){
                    month--;
                    newDate = new Date(year, month, day);
                }
            }
            return newDate;
        },
        
        time:function(timeString){
            var newDate = new Date();
            var parts = timeString.split(':');
            if(parts.length == 2){
                var hour = parseInt(parts[0], 10);
                var minute = parseInt(parts[1], 10);
                if(!isNaN(hour) && !isNaN(minute)){
                    if(hour > 0 && hour < 13 && minute > -1 && minute < 60){
                        var nextParts = parts[1].split(' ');
                        if(nextParts.length == 2){
                            if(nextParts[1].toLowerCase() == 'pm'){
                                if(hour != 12){
                                    hour += 12;
                                }
                            }else if(hour == 12){
                                hour = 0;
                            }
                            newDate.setHours(hour);
                            newDate.setMinutes(minute);
                        }
                    }
                }
            }
            return newDate;
        },
        
        money:function(money){
            var strippedFormat = money;
            //remove all non word characters
            var regEx = /\$/g;
            strippedFormat = strippedFormat.replace(regEx, '');
            return strippedFormat;
        }
    }
};
}else{
    throw 'IPS.Shared already exists.';
}