/*
jQuery UI Virtual Keyboard Widget
Version 1.5.5 minified

Author: Jeremy Satterfield
Modified: Rob G (Mottie on github)
-----------------------------------------
Creative Commons Attribution-Share Alike 3.0 Unported License
http://creativecommons.org/licenses/by-sa/3.0/
-----------------------------------------
*/

(function(d){d.widget("ui.keyboard",{layouts:{alpha:{"default":["` 1 2 3 4 5 6 7 8 9 0 - = {bksp}","{tab} a b c d e f g h i j [ ] \\","k l m n o p q r s ; ' {enter}","{shift} t u v w x y z , . / {shift}","{accept} {space} {cancel}"],shift:["~ ! @ # $ % ^ & * ( ) _ + {bksp}","{tab} A B C D E F G H I J { } |",'K L M N O P Q R S : " {enter}',"{shift} T U V W X Y Z < > ? {shift}","{accept} {space} {cancel}"]},qwerty:{"default":["` 1 2 3 4 5 6 7 8 9 0 - = {bksp}","{tab} q w e r t y u i o p [ ] \\","a s d f g h j k l ; ' {enter}", "{shift} z x c v b n m , . / {shift}","{accept} {space} {cancel}"],shift:["~ ! @ # $ % ^ & * ( ) _ + {bksp}","{tab} Q W E R T Y U I O P { } |",'A S D F G H J K L : " {enter}',"{shift} Z X C V B N M < > ? {shift}","{accept} {space} {cancel}"]},international:{"default":["` 1 2 3 4 5 6 7 8 9 0 - = {bksp}","{tab} q w e r t y u i o p [ ] \\","a s d f g h j k l ; ' {enter}","{shift} z x c v b n m , . / {shift}","{accept} {space} {alt} {cancel}"],shift:["~ ! @ # $ % ^ & * ( ) _ + {bksp}","{tab} Q W E R T Y U I O P { } |", 'A S D F G H J K L : " {enter}',"{shift} Z X C V B N M < > ? {shift}","{accept} {space} {alt} {cancel}"],alt:["~ \u00a1 \u00b2 \u00b3 \u00a4 \u20ac \u00bc \u00bd \u00be \u2018 \u2019 \u00a5 \u00d7 {bksp}","{tab} \u00e4 \u00e5 \u00e9 \u00ae \u00fe \u00fc \u00fa \u00ed \u00f3 \u00f6 \u00ab \u00bb \u00ac","\u00e1 \u00df \u00f0 f g h j k \u00f8 \u00b6 \u00b4 {enter}","{shift} \u00e6 x \u00a9 v b \u00f1 \u00b5 \u00e7 > \u00bf {shift}","{accept} {space} {alt} {cancel}"],"alt-shift":["~ \u00b9 \u00b2 \u00b3 \u00a3 \u20ac \u00bc \u00bd \u00be \u2018 \u2019 \u00a5 \u00f7 {bksp}", "{tab} \u00c4 \u00c5 \u00c9 \u00ae \u00de \u00dc \u00da \u00cd \u00d3 \u00d6 \u00ab \u00bb \u00a6","\u00c4 \u00a7 \u00d0 F G H J K \u00d8 \u00b0 \u00a8 {enter}","{shift} \u00c6 X \u00a2 V B \u00d1 \u00b5 \u00c7 . \u00bf {shift}","{accept} {space} {alt} {cancel}"]},dvorak:{"default":["` 1 2 3 4 5 6 7 8 9 0 [ ] {bksp}","{tab} ' , . p y f g c r l / = \\","a o e u i d h t n s - {enter}","{shift} ; q j k x b m w v z {shift}","{accept} {space} {cancel}"],shift:["~ ! @ # $ % ^ & * ( ) { } {bksp}",'{tab} " < > P Y F G C R L ? + |', "A O E U I D H T N S _ {enter}","{shift} : Q J K X B M W V Z {shift}","{accept} {space} {cancel}"]},num:{"default":["= ( ) {b}","{clear} / * -","7 8 9 +","4 5 6 {sign}","1 2 3 %","0 . {a} {c}"]}},options:{layout:"qwerty",customLayout:null,position:{of:null,my:"center top",at:"center top"},display:{a:"\u2714:Accept",accept:"Accept:Accept",alt:"AltGr:Alternate Graphemes",b:"\u2190:Backspace",bksp:"Bksp:Backspace",c:"\u2716:Cancel",cancel:"Cancel:Cancel",clear:"C:Clear",dec:".:Decimal",e:"\u21b5:Enter", enter:"Enter:Enter",s:"\u21e7:Shift",shift:"Shift:Shift",sign:"\u00b1:Change Sign",space:"Space:Space",t:"\u21e5:Tab",tab:"\u21e5 Tab:Tab"},wheelMessage:"Use mousewheel to see other keys",actionClass:"ui-state-active",lockInput:false,maxLength:false,keyBinding:"mousedown",useCombos:true,combos:{"`":{a:"\u00e0",A:"\u00c0",e:"\u00e8",E:"\u00c8",i:"\u00ec",I:"\u00cc",o:"\u00f2",O:"\u00d2",u:"\u00f9",U:"\u00d9"},"'":{a:"\u00e1",A:"\u00c1",e:"\u00e9",E:"\u00c9",i:"\u00ed",I:"\u00cd",o:"\u00f3",O:"\u00d3", u:"\u00fa",U:"\u00da",y:"\u00fd",Y:"\u00dd",c:"\u00e7",C:"\u00c7"},'"':{a:"\u00e4",A:"\u00c4",e:"\u00eb",E:"\u00cb",i:"\u00ef",I:"\u00cf",o:"\u00f6",O:"\u00d6",u:"\u00fc",U:"\u00dc"},"^":{a:"\u00e2",A:"\u00c2",e:"\u00ea",E:"\u00ca",i:"\u00ee",I:"\u00ce",o:"\u00f4",O:"\u00d4",u:"\u00fb",U:"\u00db"},"~":{a:"\u00e3",A:"\u00c3",e:"\u1ebd",E:"\u1ebc",i:"\u0129",I:"\u0128",o:"\u00f5",O:"\u00d5",u:"\u0169",U:"\u0168",n:"\u00f1",N:"\u00d1"},a:{e:"\u00e6"},A:{E:"\u00c6"},o:{e:"\u0153"},O:{E:"\u0152"}},accepted:null, canceled:null,hidden:null,visible:null},shiftActive:false,altActive:false,metaActive:false,sets:false,rows:["ui-keyboard-keyset-default","ui-keyboard-keyset-shift","ui-keyboard-keyset-alt","ui-keyboard-keyset-alt-shift"],_init:function(){var a=this,b=a.options,c=a.element;d.isFunction(b.visible)&&c.bind("visible",b.visible);d.isFunction(b.hidden)&&c.bind("hidden",b.hidden);d.isFunction(b.canceled)&&c.bind("canceled",b.canceled);d.isFunction(b.accepted)&&c.bind("accepted",b.accepted);d(document).bind("mousedown keyup", function(e){a._escClose(e,a)});c.addClass("ui-keyboard-input ui-widget-content ui-corner-all").attr({"aria-haspopup":"true",role:"textbox"}).bind("focus",function(){typeof a.keyboard==="undefined"&&a._startup();var e=d(this),j=a.keyboard.find(".ui-keyboard-preview").val(e.val());a.keyboard.css({position:"absolute",left:0,top:0}).show().position({of:b.position.of||e.data("keyboardPosition")||e,my:b.position.my,at:b.position.at,collision:"fit"});e.trigger("visible",e);j.trigger("gotoEnd");a._checkDecimal(a.keyboard.find(".ui-keyboard-decimal"))})}, _startup:function(){var a=this,b=a.options,c=a._buildKeyboard(),e=c.find(".ui-keyboard-button"),j=c.find(".ui-keyboard-preview"),k=c.find(".ui-keyboard-dec"),n=d.isFunction(d.fn.mousewheel);a.keyboard=c;j.bind("keyup gotoEnd",function(){d(this).scrollTop(j.attr("scrollHeight")).focus()});d("body").append(c);e.bind(b.keyBinding,function(){var i;i=d.data(this,"key");if(d.isFunction(i.action))i.action(this);else if(typeof i.action!=="undefined"){i=n&&!d(this).is(".ui-keyboard-actionkey")?i.curTxt:i.action; a._insertText(j[0],i)}j.trigger("gotoEnd")}).bind("mouseenter mouseleave mousewheel",function(i,s){var f=d(this),p,g=d.data(this,"key");if(i.type==="mouseenter")f.addClass("ui-state-hover").attr("title",function(r,l){return n&&l===""&&a.sets?b.wheelMessage:l});else if(i.type==="mouseleave"){g.curTxt=g.original;g.curNum=0;d.data(this,"key",g);f.removeClass("ui-state-hover").attr("title",function(r,l){return l===b.wheelMessage?"":l}).val(g.original)}else if(n){p=g.layers||a._getLayers(f);g.curNum+= s>0?-1:1;if(g.curNum>p.length-1)g.curNum=0;if(g.curNum<0)g.curNum=p.length-1;g.layers=p;g.curTxt=p[g.curNum];d.data(this,"key",g);f.val(p[g.curNum])}}).bind("mouseup",function(){j.focus()});k.length&&e.click(function(){a._checkDecimal(k)})},_getCaret:function(a){var b={};b.prevw=a;b.start=0;b.txt=a.value;b.st=a.scrollTop;b.dsel=document.selection;if(b.dsel){d(a).focus();b.r=b.dsel.createRange();if(a.tagName==="TEXTAREA"){b.r2=b.r.duplicate();b.r2.moveToElementText(a);b.r2.setEndPoint("EndToEnd",b.r); b.start=b.r2.text.length-b.r.text.length}else{b.r.moveStart("character",-a.value.length);b.start=b.r.text.length}}else b.start=a.selectionStart||0;return b},_setCaret:function(a){if(a.dsel){d(a.prevw).focus();a.r.moveStart("character",a.start);a.r.collapse(true);a.r.select()}else{a.prevw.selectionStart=a.start;a.prevw.selectionEnd=a.start}d(a.prevw).focus();a.prevw.scrollTop=a.st},_insertText:function(a,b){var c,e=this._getCaret(a);if(b==="bksp"){a.value=e.txt.substring(0,e.start-1)+e.txt.substring(e.start, e.txt.length);e.start-=1}else{e.txt=e.txt.substring(0,e.start)+b+e.txt.substring(e.start,e.txt.length);e.start+=b.length;c=this._checkCombos(e.txt);e.prevw.value=c[0];e.start+=c[1]}this._setCaret(e)},_showKeySet:function(a){this.keyboard.find(".ui-keyboard-actionkey[name*=key_meta]").removeClass("ui-state-active");if(this.metaActive){a=a.name.split("_")[1];this.keyboard.find(".ui-keyboard-alt, .ui-keyboard-shift, .ui-keyboard-actionkey[class*=meta]").removeClass("ui-state-active").end().find(".ui-keyboard-actionkey.ui-keyboard-"+ a).addClass("ui-state-active").end().find(".ui-keyboard-keyset").hide().end().find(".ui-keyboard-keyset-"+a).show()}else{a=this.shiftActive?1:0;a+=this.altActive?2:0;this.keyboard.find(".ui-keyboard-alt")[this.altActive?"addClass":"removeClass"]("ui-state-active").end().find(".ui-keyboard-shift")[this.shiftActive?"addClass":"removeClass"]("ui-state-active").end().find(".ui-keyboard-keyset").hide().end().find("."+this.rows[a]).show()}},_checkCombos:function(a){var b=a.length,c=this.options;if(c.useCombos)a= a.replace(/([`\'~\^\"ao])([a-z])/ig,function(e,j,k){return j in c.combos?c.combos[j][k]||e:e});if(c.maxLength!==false&&a.length>c.maxLength)a=a.substring(0,c.maxLength);return[a,a.length-b]},_checkDecimal:function(a){/\./.test(a.closest(".ui-keyboard").find(".ui-keyboard-preview").val())?a.attr({disabled:"disabled","aria-disabled":"true"}).removeClass("ui-state-default ui-state-hover").addClass("ui-state-disabled"):a.removeAttr("disabled").attr({"aria-disabled":"false"}).addClass("ui-state-default").removeClass("ui-state-disabled")}, _getLayers:function(a){var b;b=a.attr("name");return a.closest(".ui-keyboard").find("input[name="+b+"]").map(function(){return this.value}).get()},_hide:function(a){if(typeof this.keyboard!=="undefined"){var b=this.keyboard.filter(":visible").length;this.keyboard.hide();this.element.scrollTop(this.element.attr("scrollHeight"));if(b){this.element.trigger(typeof a!=="undefined"&&a?"accepted":"canceled",this.element);this.element.trigger("hidden",this.element)}}},_escClose:function(a,b){if(a.which=== 27||a.type==="mousedown"&&d(a.target).closest(".ui-keyboard").length<1)b._hide()},_buildKeyboard:function(){var a,b,c,e,j,k,n,i,s,f=this,p=0,g=f.options,r=d("<div />").addClass("ui-keyboard ui-widget-content ui-widget ui-corner-all ui-helper-clearfix").attr({role:"textbox"}).hide(),l=f.element.clone().removeAttr("id").show().attr(g.lockInput?{readonly:"readonly"}:{}).addClass("ui-widget-content ui-keyboard-preview ui-corner-all").bind("keyup",function(){var h=f._getCaret(l[0]), o=f._checkCombos(d(this).val());d(this).val(o[0]);h.start+=o[1];f._setCaret(h)}),v=d("<input />").attr({type:"button",role:"button","aria-disabled":"false"}).addClass("ui-keyboard-button ui-state-default ui-corner-all"),m=function(h,o,w,t){var q,u;o=t===true?h:g.display[o]||h;q=o.split(":");o=q[0]!==""&&q.length>1?d.trim(q[0]):o;q=q.length>1?d.trim(q[1]).replace(/_/g," ")||"":"";u=o.length>1?" ui-keyboard-widekey":"";u+=t!==true?" ui-keyboard-actionkey":"";return v.clone().attr({name:"key_"+h,title:q}).data("key", {action:w,original:o,curTxt:o,curNum:0}).val(o).addClass("ui-keyboard-"+(t===true?h.charCodeAt(0):h)+u)};d("<div />").append(l).appendTo(r);if(g.layout==="custom")f.layouts.custom=g.customLayout||{"default":["{cancel}"]};for(e in f.layouts[g.layout]){p++;i=f.layouts[g.layout][e];j=d("<div />").addClass("ui-keyboard-keyset ui-keyboard-keyset-"+e).appendTo(r)[e==="default"?"show":"hide"]();for(b in i){c=d("<div />").addClass("ui-keyboard-row ui-keyboard-row"+b).appendTo(j);a=d.trim(i[b]).replace(/\{(\.?)[\s+]?:[\s+]?(\.?)\}/g, "{$1:$2}");n=a.split(/\s+/);for(k in n)if(n[k].length!==0)if(/^\{\S+\}$/.test(n[k])){a=n[k].match(/^\{(\S+)\}$/)[1].toLowerCase();if(/^sp:(\.?\d+)$/.test(a)){s=a.match(/^sp:(\.?\d+)$/)[1]||0;d("<span>&nbsp;</span>").css("margin","0 "+s+"em").appendTo(c)}if(/^meta\d+\:?(\w+)?/.test(a))m(a,a,function(h){f.metaActive=d(h).is(".ui-state-active")?false:true;f._showKeySet(h)}).appendTo(c);else switch(a){case "a":case "accept":m("accept",a,function(){var h=l.val();f.element.val(h);f._hide(true)}).addClass(g.actionClass).appendTo(c); break;case "alt":case "altgr":m("alt","alt",function(h){f.altActive=!f.altActive;f.metaActive=false;f._showKeySet(h)}).appendTo(c);break;case "b":case "bksp":m("bksp",a,"bksp").appendTo(c);break;case "c":case "cancel":m("cancel",a,function(){f._hide()}).addClass(g.actionClass).appendTo(c);break;case "clear":m("clear","clear",function(){l.val("")}).appendTo(c);break;case "dec":m("dec","dec",".").appendTo(c);break;case "e":case "enter":m("enter",a,"\n").appendTo(c);break;case "s":case "shift":m("shift", a,function(h){f.shiftActive=!f.shiftActive;f.metaActive=false;f._showKeySet(h)}).appendTo(c);break;case "sign":m("sign","sign",function(){/^\-?\d*\.?\d*$/.test(l.val())&&l.val(l.val()*-1)}).appendTo(c);break;case "space":m("space","space"," ").appendTo(c);break;case "t":case "tab":m("tab",a,"\t").appendTo(c)}}else m(n[k],n[k],n[k],true).attr("name","key_"+b+"_"+k).appendTo(c)}}if(p>1)f.sets=true;return r},destroy:function(){this.element.removeClass("ui-keyboard-input ui-widget-content ui-corner-all").removeAttr("aria-haspopup").removeAttr("role").unbind("focus accept canceled hidden visible"); this.keyboard.remove();d(document).unbind("mousedown keyup",this._escClose);d.Widget.prototype.destroy.apply(this,arguments)}})})(jQuery);

