Dynamic phone formatting JS class

A place to discuss development of the Xataface core.

Dynamic phone formatting JS class

Postby iCoder » Wed Jul 14, 2010 7:02 pm

Hi everybody!

Just finished testing my new helpful JavaScript class - phoneFormatter.

It forces user enter valid phone in specified input field.

Class itself [phoneformatter.js]:

Code: Select all
   function phoneFormatter(params) {

      this.currPhone = '';
      this.placeHolder = '_';
      this.phoneTemplate = '(_ _ _) _ _ _ - _ _ _ _';
      this.maxLength = 0;
      this.digitPositions = [];
      this.inputSourceID = '';
      this.inputDestID = '';
      this.minTemplate = '200000000000000000000';
      this.maxTemplate = '999999999999999999999';
      this.prefixAdded = false;

      this.init = function(params) {
         if (params !== undefined) {
            if (params.placeHolder !== undefined) {
               this.setPlaceHolder(params.placeHolder);
            }

            if (params.phoneTemplate !== undefined) {
               this.setPhoneTemplate(params.phoneTemplate);
            }

            if (params.source !== undefined && params.dest !== undefined) {
               this.setSourceDest(params.source, params.dest)
            }
         }
      }

      this.setPhoneTemplate = function(tpl) {
         this.phoneTemplate = tpl;
         this.scanDigitPositions();
      };

      this.setPlaceHolder = function(pHolder) {
         this.placeHolder = pHolder;
         this.scanDigitPositions();
      };

      this.setSourceDest = function(src, dst) {
         this.inputSourceID = src;
         this.inputDestID = dst;
         this.currPhone = '';
         this.setInputValues();
      };

      this.scanDigitPositions = function() {
         this.digitPositions=new Array();
         for(i=0; i<this.phoneTemplate.length; i++) {
            if (this.phoneTemplate.charAt(i)==this.placeHolder) {
               this.digitPositions.push(i);
            }
         }
         this.maxLength = this.digitPositions.length;
      };
      
      this.mixPhone2Tpl = function() {
         var ret = this.phoneTemplate;
         if (this.digitPositions.length<1) this.scanDigitPositions();
         for(i=0; i<this.currPhone.length && i<this.maxLength; i++) {
            ret = ret.slice(0,this.digitPositions[i])+this.currPhone.charAt(i)+ret.slice(this.digitPositions[i]+1,ret.length)
         }
         return ret;
      };
      
      this.setInputValues = function() {
         document.getElementById(this.inputDestID).value = this.currPhone;
         document.getElementById(this.inputSourceID).value = this.mixPhone2Tpl();
      };
      
      this.digitInsert = function(c) {
         var ret = false;
         var d = String.fromCharCode(c);
         if (this.currPhone.length<this.maxLength && this.isDigit(c) && this.isDigitOk(d)) {
            this.currPhone = this.currPhone.concat(d);
            this.setInputValues();
            ret = true;
         }
         return ret;
      };
      
      this.digitCutLast = function() {
         var ret = false;
         if (this.currPhone.length>0) {
            this.currPhone = this.currPhone.substr(0,this.currPhone.length-1);
            this.setInputValues();
            ret = true;
         }
         return ret;
      };
      
      this.isDigitOk = function(d) {
         var l = this.currPhone.length;
         var ret = false;
         if (l<this.maxLength) {
            min = this.minTemplate.charAt(l);
            max = this.maxTemplate.charAt(l);
            ret = (d>=min && d<=max);
   //         alert(l+'] '+min+' '+d+' '+max)
         }
         return ret;
      };
      
      this.isDigit = function(c) {
         return c>=48 && c<=57;
      };

      this.handler = function(e) {
         var agent = navigator.userAgent.toLowerCase();
         var i;
         if (agent.indexOf("msie") > -1 && agent.indexOf("opera") == -1) {
            var keyCode = event.keyCode;
         } else {
            var keyCode = e.which;
         }
         if (keyCode>=96 && keyCode<=105) keyCode -= 48;

         if (keyCode == 49 && this.currPhone.length == 0) { //need to add place for +1 in the template.
            this.prefixAdded = true;
            this.phoneTemplate = '_ '+this.phoneTemplate;
            this.minTemplate = '1'+this.minTemplate;
            this.scanDigitPositions();
            if (!this.digitInsert(keyCode)) this.setInputValues();
         } else {
            if (this.isDigit(keyCode)) {      //Digit
               if (!this.digitInsert(keyCode)) this.setInputValues();
            }
         }
         if (keyCode === 8) {   //BackSpace
            if (!this.digitCutLast()) this.setInputValues();
         }
//         alert(keyCode+' '+String.fromCharCode(keyCode));
         return false;
      };


/* ---------------------------------------------------------------------------------------- */

      if (params !== undefined) {
         this.init(params);
      }

   };


Class implementation is as easy as:

Code: Select all
      <script type="text/JavaScript" src="phoneformatter.js"> </script>

      <input type="hidden" id="c_phone" name="c_phone">
      <input type="text" value="" onkeyup="return pFormatter.handler(event);" maxlength="21" name="phoneVisible" id="phoneVisible">

      <script type="text/JavaScript">

         var pFormatter = new phoneFormatter(
         {
            source: 'phoneVisible',
            dest: 'c_phone'
         });

      </script>


DEMO: http://e-xxi.net/files/phone.html.

Enjoy! :)
iCoder
 
Posts: 4
Joined: Sun Jun 20, 2010 5:04 am

Return to Xataface Developers

Who is online

Users browsing this forum: No registered users and 15 guests

Powered by Dataface
© 2005-2007 Steve Hannah All rights reserved