﻿/* http://keith-wood.name/keypad.html
   Keypad field entry extension for jQuery v1.4.1.
   Written by Keith Wood (kbwood{at}iinet.com.au) August 2008.
   Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and 
   MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses. 
   Please attribute the author if you use it. */
(function($){var t='keypad';function Keypad(){this._curInst=null;this._disabledFields=[];this._keypadShowing=false;this._keyCode=0;this._specialKeys=[];this.addKeyDef('CLOSE','close',function(a){$.keypad._curInst=(a._inline?a:$.keypad._curInst);$.keypad._hideKeypad()});this.addKeyDef('CLEAR','clear',function(a){$.keypad._clearValue(a)});this.addKeyDef('BACK','back',function(a){$.keypad._backValue(a)});this.addKeyDef('SHIFT','shift',function(a){$.keypad._shiftKeypad(a)});this.addKeyDef('SPACE_BAR','spacebar',function(a){$.keypad._selectValue(a,' ')},true);this.addKeyDef('SPACE','space');this.addKeyDef('HALF_SPACE','half-space');this.addKeyDef('ENTER','enter',function(a){$.keypad._selectValue(a,'\x0D')},true);this.addKeyDef('TAB','tab',function(a){$.keypad._selectValue(a,'\x09')},true);this.qwertyAlphabetic=['qwertyuiop','asdfghjkl','zxcvbnm'];this.qwertyLayout=['!@#$%^&*()_='+this.HALF_SPACE+this.SPACE+this.CLOSE,this.HALF_SPACE+'`~[]{}<>\\|/'+this.SPACE+'789','qwertyuiop\'"'+this.HALF_SPACE+'456',this.HALF_SPACE+'asdfghjkl;:'+this.SPACE+'123',this.SPACE+'zxcvbnm,.?'+this.SPACE+this.HALF_SPACE+'-0+',''+this.TAB+this.ENTER+this.SPACE_BAR+this.SHIFT+this.HALF_SPACE+this.BACK+this.CLEAR];this.regional=[];this.regional['']={buttonText:'...',buttonStatus:'Open the keypad',closeText:'Close',closeStatus:'Close the keypad',clearText:'Clear',clearStatus:'Erase all the text',backText:'Back',backStatus:'Erase the previous character',spacebarText:'&nbsp;',spacebarStatus:'Space',enterText:'Enter',enterStatus:'Carriage return',tabText:'→',tabStatus:'Horizontal tab',shiftText:'Shift',shiftStatus:'Toggle upper/lower case characters',alphabeticLayout:this.qwertyAlphabetic,fullLayout:this.qwertyLayout,isAlphabetic:this.isAlphabetic,isNumeric:this.isNumeric,isRTL:false};this._defaults={showOn:'focus',buttonImage:'',buttonImageOnly:false,showAnim:'show',showOptions:{},duration:'normal',appendText:'',useThemeRoller:false,keypadClass:'',prompt:'',layout:['123'+this.CLOSE,'456'+this.CLEAR,'789'+this.BACK,this.SPACE+'0'],separator:'',target:null,keypadOnly:true,randomiseAlphabetic:false,randomiseNumeric:false,randomiseOther:false,randomiseAll:false,beforeShow:null,onKeypress:null,onClose:null};$.extend(this._defaults,this.regional['']);this.mainDiv=$('<div class="'+this._mainDivClass+'" style="display: none;"></div>')}$.extend(Keypad.prototype,{markerClassName:'hasKeypad',_mainDivClass:'keypad-popup',_inlineClass:'keypad-inline',_appendClass:'keypad-append',_triggerClass:'keypad-trigger',_disableClass:'keypad-disabled',_inlineEntryClass:'keypad-keyentry',_coverClass:'keypad-cover',setDefaults:function(a){extendRemove(this._defaults,a||{});return this},addKeyDef:function(a,b,c,d){if(this._keyCode==32){throw'Only 32 special keys allowed';}this[a]=String.fromCharCode(this._keyCode++);this._specialKeys.push({code:this[a],id:a,name:b,action:c,noHighlight:d});return this},_attachKeypad:function(a,b){var c=(a.nodeName.toLowerCase()!='input'&&a.nodeName.toLowerCase()!='textarea');var d={_inline:c,_mainDiv:(c?$('<div class="'+this._inlineClass+'"></div>'):$.keypad.mainDiv),ucase:false};d.settings=$.extend({},b||{});this._setInput(a,d);this._connectKeypad(a,d);if(c){$(a).append(d._mainDiv).bind('click.keypad',function(){d._input.focus()});this._updateKeypad(d)}else if($(a).is(':disabled')){this._disableKeypad(a)}},_setInput:function(a,b){b._input=$(!b._inline?a:this._get(b,'target')||'<input type="text" class="'+this._inlineEntryClass+'" disabled="disabled"/>');if(b._inline){a=$(a);a.find('input').remove();if(!this._get(b,'target')){a.append(b._input)}}},_connectKeypad:function(d,e){var f=$(d);if(f.hasClass(this.markerClassName)){return}var g=this._get(e,'appendText');var h=this._get(e,'isRTL');if(g){f[h?'before':'after']('<span class="'+this._appendClass+'">'+g+'</span>')}if(!e._inline){var i=this._get(e,'showOn');if(i=='focus'||i=='both'){f.focus(this._showKeypad).keydown(this._doKeyDown)}if(i=='button'||i=='both'){var j=this._get(e,'buttonText');var k=this._get(e,'buttonStatus');var l=this._get(e,'buttonImage');var m=$(this._get(e,'buttonImageOnly')?$('<img src="'+l+'" alt="'+k+'" title="'+k+'"/>'):$('<button type="button" title="'+k+'"></button>').html(l==''?j:$('<img src="'+l+'" alt="'+k+'" title="'+k+'"/>')));f[h?'before':'after'](m);m.addClass(this._triggerClass).click(function(){if($.keypad._keypadShowing&&$.keypad._lastField==d){$.keypad._hideKeypad()}else{$.keypad._showKeypad(d)}return false})}}e.saveReadonly=f.attr('readonly');f.addClass(this.markerClassName).attr('readonly',(this._get(e,'keypadOnly')?'readonly':'')).bind('setData.keypad',function(a,b,c){e.settings[b]=c}).bind('getData.keypad',function(a,b){return this._get(e,b)});$.data(d,t,e)},_destroyKeypad:function(a){var b=$(a);if(!b.hasClass(this.markerClassName)){return}var c=$.data(a,t);if(this._curInst==c){this._hideKeypad()}b.siblings('.'+this._appendClass).remove().end().siblings('.'+this._triggerClass).remove().end().prev('.'+this._inlineEntryClass).remove();b.empty().unbind('focus',this._showKeypad).removeClass(this.markerClassName).attr('readonly',c.saveReadonly);$.removeData(c._input[0],t);$.removeData(a,t)},_enableKeypad:function(b){var c=$(b);if(!c.hasClass(this.markerClassName)){return}var d=b.nodeName.toLowerCase();if(d=='input'||d=='textarea'){b.disabled=false;c.siblings('button.'+this._triggerClass).each(function(){this.disabled=false}).end().siblings('img.'+this._triggerClass).css({opacity:'1.0',cursor:''})}else if(d=='div'||d=='span'){c.children('.'+this._disableClass).remove();var e=$.data(b,t);e._mainDiv.find('button').attr('disabled','')}this._disabledFields=$.map(this._disabledFields,function(a){return(a==b?null:a)})},_disableKeypad:function(b){var c=$(b);if(!c.hasClass(this.markerClassName)){return}var d=b.nodeName.toLowerCase();if(d=='input'||d=='textarea'){b.disabled=true;c.siblings('button.'+this._triggerClass).each(function(){this.disabled=true}).end().siblings('img.'+this._triggerClass).css({opacity:'0.5',cursor:'default'})}else if(d=='div'||d=='span'){var e=c.children('.'+this._inlineClass);var f=e.offset();var g={left:0,top:0};e.parents().each(function(){if($(this).css('position')=='relative'){g=$(this).offset();return false}});c.prepend('<div class="'+this._disableClass+'" style="width: '+e.outerWidth()+'px; height: '+e.outerHeight()+'px; left: '+(f.left-g.left)+'px; top: '+(f.top-g.top)+'px;"></div>');var h=$.data(b,t);h._mainDiv.find('button').attr('disabled','disabled')}this._disabledFields=$.map(this._disabledFields,function(a){return(a==b?null:a)});this._disabledFields[this._disabledFields.length]=b},_isDisabledKeypad:function(a){return(a&&$.inArray(a,this._disabledFields)>-1)},_changeKeypad:function(a,b,c){var d=b||{};if(typeof b=='string'){d={};d[b]=c}var e=$.data(a,t);if(e){if(this._curInst==e){this._hideKeypad()}extendRemove(e.settings,d);this._setInput($(a),e);this._updateKeypad(e)}},_showKeypad:function(b){b=b.target||b;if($.keypad._isDisabledKeypad(b)||$.keypad._lastField==b){return}var c=$.data(b,t);$.keypad._hideKeypad(null,'');$.keypad._lastField=b;$.keypad._pos=$.keypad._findPos(b);$.keypad._pos[1]+=b.offsetHeight;var d=false;$(b).parents().each(function(){d|=$(this).css('position')=='fixed';return!d});if(d&&$.browser.opera){$.keypad._pos[0]-=document.documentElement.scrollLeft;$.keypad._pos[1]-=document.documentElement.scrollTop}var e={left:$.keypad._pos[0],top:$.keypad._pos[1]};$.keypad._pos=null;c._mainDiv.css({position:'absolute',display:'block',top:'-1000px',width:($.browser.opera?'1000px':'auto')});$.keypad._updateKeypad(c);e=$.keypad._checkOffset(c,e,d);c._mainDiv.css({position:(d?'fixed':'absolute'),display:'none',left:e.left+'px',top:e.top+'px'});var f=$.keypad._get(c,'showAnim');var g=$.keypad._get(c,'duration');g=(g=='normal'&&$.ui&&$.ui.version>='1.8'?'_default':g);var h=function(){$.keypad._keypadShowing=true;var a=$.keypad._getBorders(c._mainDiv);c._mainDiv.find('iframe.'+$.keypad._coverClass).css({left:-a[0],top:-a[1],width:c._mainDiv.outerWidth(),height:c._mainDiv.outerHeight()})};if($.effects&&$.effects[f]){var i=c._mainDiv.data();for(var j in i){if(j.match(/^ec\.storage\./)){i[j]=c._mainDiv.css(j.replace(/ec\.storage\./,''))}}c._mainDiv.data(i).show(f,$.keypad._get(c,'showOptions'),g,h)}else{c._mainDiv[f||'show']((f?g:''),h)}if(!f){h()}if(c._input[0].type!='hidden'){c._input[0].focus()}$.keypad._curInst=c},_updateKeypad:function(a){var b=this._getBorders(a._mainDiv);a._mainDiv.empty().append(this._generateHTML(a)).find('iframe.'+this._coverClass).css({left:-b[0],top:-b[1],width:a._mainDiv.outerWidth(),height:a._mainDiv.outerHeight()});a._mainDiv.removeClass().addClass(this._get(a,'keypadClass')+(this._get(a,'useThemeRoller')?' ui-widget ui-widget-content':'')+(this._get(a,'isRTL')?' keypad-rtl':'')+' '+(a._inline?this._inlineClass:this._mainDivClass));var c=this._get(a,'beforeShow');if(c){c.apply((a._input?a._input[0]:null),[a._mainDiv,a])}},_getBorders:function(c){var d=function(a){var b=($.browser.msie?1:0);return{thin:1+b,medium:3+b,thick:5+b}[a]||a};return[parseFloat(d(c.css('border-left-width'))),parseFloat(d(c.css('border-top-width')))]},_checkOffset:function(a,b,c){var d=a._input?this._findPos(a._input[0]):null;var e=window.innerWidth||document.documentElement.clientWidth;var f=window.innerHeight||document.documentElement.clientHeight;var g=document.documentElement.scrollLeft||document.body.scrollLeft;var h=document.documentElement.scrollTop||document.body.scrollTop;if(($.browser.msie&&parseInt($.browser.version,10)<7)||$.browser.opera){var i=0;a._mainDiv.find(':not(div,iframe)').each(function(){i=Math.max(i,this.offsetLeft+$(this).outerWidth()+parseInt($(this).css('margin-right'),10))});a._mainDiv.css('width',i)}if(this._get(a,'isRTL')||(b.left+a._mainDiv.outerWidth()-g)>e){b.left=Math.max((c?0:g),d[0]+(a._input?a._input.outerWidth():0)-(c?g:0)-a._mainDiv.outerWidth()-(c&&$.browser.opera?document.documentElement.scrollLeft:0))}else{b.left-=(c?g:0)}if((b.top+a._mainDiv.outerHeight()-h)>f){b.top=Math.max((c?0:h),d[1]-(c?h:0)-a._mainDiv.outerHeight()-(c&&$.browser.opera?document.documentElement.scrollTop:0))}else{b.top-=(c?h:0)}return b},_findPos:function(a){while(a&&(a.type=='hidden'||a.nodeType!=1)){a=a.nextSibling}var b=$(a).offset();return[b.left,b.top]},_hideKeypad:function(a,b){var c=this._curInst;if(!c||(a&&c!=$.data(a,t))){return}if(this._keypadShowing){b=(b!=null?b:this._get(c,'duration'));b=(b=='normal'&&$.ui&&$.ui.version>='1.8'?'_default':b);var d=this._get(c,'showAnim');if($.effects&&$.effects[d]){c._mainDiv.hide(d,this._get(c,'showOptions'),b)}else{c._mainDiv[(d=='slideDown'?'slideUp':(d=='fadeIn'?'fadeOut':'hide'))](d?b:'')}}var e=this._get(c,'onClose');if(e){e.apply((c._input?c._input[0]:null),[c._input.val(),c])}if(this._keypadShowing){this._keypadShowing=false;this._lastField=null}if(c._inline){c._input.val('')}this._curInst=null},_doKeyDown:function(e){if(e.keyCode==9){$.keypad.mainDiv.stop(true,true);$.keypad._hideKeypad()}},_checkExternalClick:function(a){if(!$.keypad._curInst){return}var b=$(a.target);if(!b.parents().andSelf().is('.'+$.keypad._mainDivClass)&&!b.hasClass($.keypad.markerClassName)&&!b.parents().andSelf().hasClass($.keypad._triggerClass)&&$.keypad._keypadShowing){$.keypad._hideKeypad()}},_shiftKeypad:function(a){a.ucase=!a.ucase;this._updateKeypad(a);a._input.focus()},_clearValue:function(a){this._setValue(a,'',0);this._notifyKeypress(a,$.keypad.DEL)},_backValue:function(a){var b=a._input[0];var c=a._input.val();var d=[c.length,c.length];if(b.setSelectionRange){d=(a._input.attr('readonly')||a._input.attr('disabled')?d:[b.selectionStart,b.selectionEnd])}else if(b.createTextRange){d=(a._input.attr('readonly')||a._input.attr('disabled')?d:this._getIERange(b))}this._setValue(a,(c.length==0?'':c.substr(0,d[0]-1)+c.substr(d[1])),d[0]-1);this._notifyKeypress(a,$.keypad.BS)},_selectValue:function(a,b){this.insertValue(a._input[0],b);this._setValue(a,a._input.val());this._notifyKeypress(a,b)},insertValue:function(a,b){a=(a.jquery?a:$(a));var c=a[0];var d=a.val();var e=[d.length,d.length];if(c.setSelectionRange){e=(a.attr('readonly')||a.attr('disabled')?e:[c.selectionStart,c.selectionEnd])}else if(c.createTextRange){e=(a.attr('readonly')||a.attr('disabled')?e:this._getIERange(c))}a.val(d.substr(0,e[0])+b+d.substr(e[1]));pos=e[0]+b.length;if(a.is(':visible')){a.focus()}if(c.setSelectionRange){if(a.is(':visible')){c.setSelectionRange(pos,pos)}}else if(c.createTextRange){e=c.createTextRange();e.move('character',pos);e.select()}},_getIERange:function(e){e.focus();var f=document.selection.createRange().duplicate();var g=this._getIETextRange(e);g.setEndPoint('EndToStart',f);var h=function(a){var b=a.text;var c=b;var d=false;while(true){if(a.compareEndPoints('StartToEnd',a)==0){break}else{a.moveEnd('character',-1);if(a.text==b){c+='\r\n'}else{break}}}return c};var i=h(g);var j=h(f);return[i.length,i.length+j.length]},_getIETextRange:function(a){var b=(a.nodeName.toLowerCase()=='input');var c=(b?a.createTextRange():document.body.createTextRange());if(!b){c.moveToElementText(a)}return c},_setValue:function(a,b){var c=a._input.attr('maxlength');if(c>-1){b=b.substr(0,c)}a._input.val(b);if(!this._get(a,'onKeypress')){a._input.trigger('change')}},_notifyKeypress:function(a,b){var c=this._get(a,'onKeypress');if(c){c.apply((a._input?a._input[0]:null),[b,a._input.val(),a])}},_get:function(a,b){return a.settings[b]!==undefined?a.settings[b]:this._defaults[b]},_generateHTML:function(b){var c=this._get(b,'useThemeRoller');var d=this._get(b,'isRTL');var e=this._get(b,'prompt');var f=this._get(b,'separator');var g=(!e?'':'<div class="keypad-prompt'+(c?' ui-widget-header ui-corner-all':'')+'">'+e+'</div>');var h=this._randomiseLayout(b);for(var i=0;i<h.length;i++){g+='<div class="keypad-row">';var k=h[i].split(f);for(var j=0;j<k.length;j++){if(b.ucase){k[j]=k[j].toUpperCase()}var l=this._specialKeys[k[j].charCodeAt(0)];if(l){g+=(l.action?'<button type="button" class="keypad-special keypad-'+l.name+(c?' ui-corner-all ui-state-default'+(l.noHighlight?'':' ui-state-highlight'):'')+'" title="'+this._get(b,l.name+'Status')+'">'+(this._get(b,l.name+'Text')||'&nbsp;')+'</button>':'<div class="keypad-'+l.name+'"></div>')}else{g+='<button type="button" '+'class="keypad-key'+(c?' ui-corner-all ui-state-default':'')+'">'+(k[j]==' '?'&nbsp;':k[j])+'</button>'}}g+='</div>'}g+='<div style="clear: both;"></div>'+(!b._inline&&$.browser.msie&&parseInt($.browser.version,10)<7?'<iframe src="javascript:false;" class="'+$.keypad._coverClass+'"></iframe>':'');g=$(g);var m=b;var n='keypad-key-down'+(c?' ui-state-active':'');g.find('button').mousedown(function(){$(this).addClass(n)}).mouseup(function(){$(this).removeClass(n)}).mouseout(function(){$(this).removeClass(n)}).filter('.keypad-key').click(function(){$.keypad._selectValue(m,$(this).text())});$.each(this._specialKeys,function(i,a){g.find('.keypad-'+a.name).click(function(){a.action.apply(m._input,[m])})});return g},_randomiseLayout:function(b){var c=this._get(b,'randomiseNumeric');var d=this._get(b,'randomiseAlphabetic');var e=this._get(b,'randomiseOther');var f=this._get(b,'randomiseAll');var g=this._get(b,'layout');if(!c&&!d&&!e&&!f){return g}var h=this._get(b,'isNumeric');var k=this._get(b,'isAlphabetic');var l=this._get(b,'separator');var m=[];var p=[];var q=[];var r=[];for(var i=0;i<g.length;i++){r[i]='';var s=g[i].split(l);for(var j=0;j<s.length;j++){if(this._isControl(s[j])){continue}if(f){q.push(s[j])}else if(h(s[j])){m.push(s[j])}else if(k(s[j])){p.push(s[j])}else{q.push(s[j])}}}if(c){this._shuffle(m)}if(d){this._shuffle(p)}if(e||f){this._shuffle(q)}var n=0;var a=0;var o=0;for(var i=0;i<g.length;i++){var s=g[i].split(l);for(var j=0;j<s.length;j++){r[i]+=(this._isControl(s[j])?s[j]:(f?q[o++]:(h(s[j])?m[n++]:(k(s[j])?p[a++]:q[o++]))))+l}}return r},_isControl:function(a){return a<' '},isAlphabetic:function(a){return(a>='A'&&a<='Z')||(a>='a'&&a<='z')},isNumeric:function(a){return(a>='0'&&a<='9')},_shuffle:function(a){for(var i=a.length-1;i>0;i--){var j=Math.floor(Math.random()*a.length);var b=a[i];a[i]=a[j];a[j]=b}}});function extendRemove(a,b){$.extend(a,b);for(var c in b){if(b[c]==null||b[c]==undefined){a[c]=b[c]}}return a};$.fn.keypad=function(a){var b=Array.prototype.slice.call(arguments,1);if(a=='isDisabled'){return $.keypad['_'+a+'Keypad'].apply($.keypad,[this[0]].concat(b))}return this.each(function(){typeof a=='string'?$.keypad['_'+a+'Keypad'].apply($.keypad,[this].concat(b)):$.keypad._attachKeypad(this,a)})};$.keypad=new Keypad();$(function(){$(document.body).append($.keypad.mainDiv).mousedown($.keypad._checkExternalClick)})})(jQuery);
