/*
jQuery UI Virtual Keyboard
Version 1.7 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/

Caret code from jquery.caret.1.02.js
Licensed under the MIT License:
http://www.opensource.org/licenses/mit-license.php
-----------------------------------------
*/

(function(f){
    f.keyboard=function(k,l){
        var a=this;
        a.$el=f(k);
        a.el=k;
        a.$el.data("keyboard",a);
        a.init=function(){
            a.options=f.extend(true,{},f.keyboard.defaultOptions,l);
            a.shiftActive=false;
            a.altActive=false;
            a.metaActive=false;
            a.sets=false;
            a.rows=["ui-keyboard-keyset-default","ui-keyboard-keyset-shift","ui-keyboard-keyset-alt","ui-keyboard-keyset-alt-shift"];
            a.acceptedKeys=[];
            a.msie=f.browser.msie;
            a.inPlaceholder=a.$el.attr("placeholder")||"";
            a.watermark="placeholder"in document.createElement("input")&& a.inPlaceholder!=="";
            f.each("visible change hidden canceled accepted".split(" "),function(b,d){
                f.isFunction(a.options[d])&&a.$el.bind(d,a.options[d])
                });
            f(document).bind("mousedown keyup",function(b){
                if(a.isVisible&&(b.type==="mousedown"||b.type==="keyup"&&b.which===27))a.escClose(b)
                    });
            a.$el.addClass("ui-keyboard-input ui-widget-content ui-corner-all").attr({
                "aria-haspopup":"true",
                role:"textbox"
            }).bind("focus",function(){
                if(!a.isVisible){
                    a.reveal();
                    setTimeout(function(){
                        a.$preview.focus()
                        },100)
                    }
                });
        !a.watermark&&a.$el.attr("placeholder")!==""&&a.$el.addClass("placeholder").val(a.inPlaceholder)
        };
        
    a.reveal=function(){
        f(".ui-keyboard").hide();
        typeof a.$keyboard==="undefined"&&a.startup();
        !a.watermark&&a.el.value===a.inPlaceholder&&a.$el.removeClass("placeholder").val("");
        a.originalContent=a.$el.val();
        a.$preview.val(a.originalContent);
        a.$keyboard.css({
            position:"absolute",
            left:0,
            top:0
        }).show().position({
            of:a.options.position.of||a.$el.data("keyboardPosition")||a.$el,
            my:a.options.position.my,
            at:a.options.position.at, 
            collision:"fit"
        });
        a.$preview.css("width",a.msie?a.$keyboard.width():"100%").focus();
        a.isVisible=true;
        a.checkDecimal();
        if(a.msie){
            var b=a.$preview.val().length;
            a.$preview.caret(b,b);
            f('<div class="ui-keyboard-overlay"></div>').click(function(){
                f(this).remove();
                a.close()
                }).appendTo("body")
            }
            a.$el.trigger("visible",a.$el);
        return a
        };
        
    a.startup=function(){
        a.$keyboard=a.buildKeyboard();
        a.$allKeys=a.$keyboard.find(".ui-keyboard-button");
        a.$preview=a.$keyboard.find(".ui-keyboard-preview");
        a.preview=a.$preview[0];
        a.$decBtn=a.$keyboard.find(".ui-keyboard-dec");
        a.wheel=f.isFunction(f.fn.mousewheel);
        a.$preview.keypress(function(b){
            if(a.options.restrictInput){
                var d=!b.charCode?String.fromCharCode(b.which):String.fromCharCode(b.charCode);
                a.acceptedKeysStr.indexOf(d)===-1&&b.preventDefault()
                }
            }).bind("keyup",function(b){
        switch(b.which){
            case 9:
                a.keyaction.tab();
                break;
            case 27:
                a.close()
                }
                a.$el.trigger("change",a.$el)
        }).bind("keydown",function(b){
        switch(b.which){
            case 9:
                b.preventDefault();
                break;
            case 13:
                if(b.shiftKey){
                a.close(true);
                b.preventDefault()
                }
                break;
            case 86:
                if(b.ctrlKey){
                if(a.options.preventPaste){
                    b.preventDefault();
                    break
                }
                a.$preview.val(a.checkCombos(a.$preview.val())[0])
                }
            }
        });
if(a.options.preventPaste){
    a.$preview.bind("contextmenu",function(b){
        b.preventDefault()
        });
    a.$el.bind("contextmenu",function(b){
        b.preventDefault()
        })
    }
    a.$keyboard.appendTo("body");
    a.$allKeys.bind(a.options.keyBinding,function(b){
    var d;
    d=f.data(this,"key");
    var e=d.action.split(":")[0];
    if(e.match("meta"))e="meta";
    if(a.keyaction.hasOwnProperty(e))a.keyaction[e](this);
    else if(typeof d.action!=="undefined"){
        d=a.wheel&&!f(this).is(".ui-keyboard-actionkey")?d.curTxt:d.action;
        a.insertText(d)
        }
        a.$el.trigger("change",a.$el);
    a.$preview.focus();
    b.preventDefault()
    }).bind("mouseenter mouseleave mousewheel",function(b,d){
    var e=f(this),c,g=f.data(this,"key");
    if(b.type==="mouseenter")e.addClass("ui-state-hover").attr("title",function(i,h){
        return a.wheel&&h===""&&a.sets?a.options.wheelMessage:h
        });
    else if(b.type==="mouseleave"){
        g.curTxt=g.original;
        g.curNum=0;
        f.data(this,"key", g);
        e.removeClass("ui-state-hover").attr("title",function(i,h){
            return h===a.options.wheelMessage?"":h
            }).val(g.original)
        }else if(a.wheel){
        c=g.layers||a.getLayers(e);
        g.curNum+=d>0?-1:1;
        if(g.curNum>c.length-1)g.curNum=0;
        if(g.curNum<0)g.curNum=c.length-1;
        g.layers=c;
        g.curTxt=c[g.curNum];
        f.data(this,"key",g);
        e.val(c[g.curNum])
        }
    }).bind("mouseup",function(){
    a.$preview.focus()
    });
a.$decBtn.length&&a.$allKeys.click(function(){
    a.checkDecimal()
    })
};

a.insertText=function(b){
    var d,e,c=a.$preview.caret().start,g=a.$preview.val(), i=g.length;
    if(a.msie){
        e=c;
        d=e-1;
        if(c<i)for(;d--;)if(g.substring(d-1,d)==="\n")c-=1;if(g.slice(-1)==="\n"&&e===i-1)c+=1
            }
            if(b==="bksp"){
        e=[g.substring(0,c-1)+g.substring(c,i)];
        c-=1
        }else{
        g=g.substring(0,c)+b+g.substring(c,i);
        e=a.checkCombos(g);
        c+=e[1]+b.length
        }
        a.$preview.val(e[0]).caret(c,c);
    a.preview.scrollTop=c>i/2?a.preview.scrollHeight:0;
    return a
    };
    
a.showKeySet=function(b){
    a.$keyboard.find(".ui-keyboard-actionkey[name*=key_meta]").removeClass("ui-state-active");
    if(a.metaActive){
        b=b.name.split("_")[1];
        a.$keyboard.find(".ui-keyboard-alt, .ui-keyboard-shift, .ui-keyboard-actionkey[class*=meta]").removeClass("ui-state-active").end().find(".ui-keyboard-actionkey.ui-keyboard-"+b).addClass("ui-state-active").end().find(".ui-keyboard-keyset").hide().end().find(".ui-keyboard-keyset-"+b).show()
        }else{
        b=a.shiftActive?1:0;
        b+=a.altActive?2:0;
        a.$keyboard.find(".ui-keyboard-alt")[a.altActive?"addClass":"removeClass"]("ui-state-active").end().find(".ui-keyboard-shift")[a.shiftActive?"addClass":"removeClass"]("ui-state-active").end().find(".ui-keyboard-keyset").hide().end().find("."+ a.rows[b]).show()
        }
    };

a.checkCombos=function(b){
    var d,e=b.length,c;
    if(a.options.useCombos)b=b.replace(/([`\'~\^\"ao])([a-z])/ig,function(g,i,h){
        return i in a.options.combos?a.options.combos[i][h]||g:g
        });
    if(a.options.restrictInput){
        c=b.split("");
        for(d=0;d<e;d++)if(f.inArray(c[d],a.acceptedKeys)<0)b=b.replace(c[d],"")
            }
            if(a.options.maxLength!==false&&b.length>a.options.maxLength)b=b.substring(0,a.options.maxLength);
    return[b,b.length-e]
    };
    
a.checkDecimal=function(){
    /\./.test(a.$decBtn.closest(".ui-keyboard").find(".ui-keyboard-preview").val())? a.$decBtn.attr({
        disabled:"disabled",
        "aria-disabled":"true"
    }).removeClass("ui-state-default ui-state-hover").addClass("ui-state-disabled"):a.$decBtn.removeAttr("disabled").attr({
        "aria-disabled":"false"
    }).addClass("ui-state-default").removeClass("ui-state-disabled")
    };
    
a.getLayers=function(b){
    var d;
    d=b.attr("name");
    return b.closest(".ui-keyboard").find("input[name="+d+"]").map(function(){
        return this.value
        }).get()
    };
    
a.close=function(b){
    if(a.$keyboard.is(":visible")){
        a.$keyboard.hide();
        a.isVisible=false;
        a.el.value=b?a.checkCombos(a.preview.value)[0]:a.originalContent;
        a.$el.scrollTop(a.el.scrollHeight).trigger(b?"accepted":"canceled",a.$el).trigger("hidden",a.$el).blur();
        !a.watermark&&a.el.value===""&&a.$el.addClass("placeholder").val(a.inPlaceholder)
        }
    };

a.accept=function(){
    a.close(true)
    };
    
a.escClose=function(b){
    f(b.target).closest(".ui-keyboard").length||a.close(a.options.autoAccept?true:false)
    };
    
a.keyBtn=f("<input />").attr({
    type:"button",
    role:"button",
    "aria-disabled":"false"
}).addClass("ui-keyboard-button ui-state-default ui-corner-all");
a.addKey=function(b,d,e){
    var c,g;
    d=e===true?b:a.options.display[d]||b;
    c=d.split(":");
    d=c[0]!==""&&c.length>1?f.trim(c[0]):d;
    c=c.length>1?f.trim(c[1]).replace(/_/g," ")||"":"";
    g=d.length>1?" ui-keyboard-widekey":"";
    g+=e!==true?" ui-keyboard-actionkey":"";
    return a.keyBtn.clone().attr({
        name:"key_"+b,
        title:c
    }).data("key",{
        action:b,
        original:d,
        curTxt:d,
        curNum:0
    }).val(d).addClass("ui-keyboard-"+(e===true?b.charCodeAt(0):b)+g)
    };
    
a.buildKeyboard=function(){
    var b,d,e,c,g,i,h,j,o,m=0,n=f("<div />").addClass("ui-keyboard ui-widget-content ui-widget ui-corner-all ui-helper-clearfix").attr({
        role:"textbox"
    }).hide();
    a.$preview=a.$el.clone(false).removeAttr("id").show().attr(a.options.lockInput?{
        readonly:"readonly"
    }:{}).removeClass("placeholder").addClass("ui-widget-content ui-keyboard-preview ui-corner-all").bind("keyup",function(){
        var p=a.$preview.caret().start,q=a.checkCombos(a.$preview.val());
        if(q[1]!==0){
            p+=q[1];
            a.$preview.val(q[0]).caret(p,p)
            }
        });
f("<div />").append(a.$preview).appendTo(n);
if(a.options.layout==="custom")f.keyboard.layouts.custom=a.options.customLayout||{
    "default":["{cancel}"]
    };
    
for(c in f.keyboard.layouts[a.options.layout])if(c!== ""){
    j=f.keyboard.layouts[a.options.layout][c];
    m++;
    g=f("<div />").attr("name",c).addClass("ui-keyboard-keyset ui-keyboard-keyset-"+c).appendTo(n)[c==="default"?"show":"hide"]();
    for(d=0;d<j.length;d++){
        e=f("<div />").addClass("ui-keyboard-row ui-keyboard-row"+d).appendTo(g);
        b=f.trim(j[d]).replace(/\{(\.?)[\s+]?:[\s+]?(\.?)\}/g,"{$1:$2}");
        h=b.split(/\s+/);
        for(i=0;i<h.length;i++)if(h[i].length!==0)if(/^\{\S+\}$/.test(h[i])){
            b=h[i].match(/^\{(\S+)\}$/)[1].toLowerCase();
            if(/^sp:(\.?\d+)$/.test(b)){
                o=b.match(/^sp:(\.?\d+)$/)[1]|| 0;
                f("<span>&nbsp;</span>").css("margin","0 "+o+"em").appendTo(e)
                }
                if(/^meta\d+\:?(\w+)?/.test(b))a.addKey(b,b).appendTo(e);else switch(b){
                case "a":case "accept":
                    a.addKey("accept",b).addClass(a.options.actionClass).appendTo(e);
                    break;
                case "alt":case "altgr":
                    a.addKey("alt","alt").appendTo(e);
                    break;
                case "b":case "bksp":
                    a.addKey("bksp",b).appendTo(e);
                    break;
                case "c":case "cancel":
                    a.addKey("cancel",b).addClass(a.options.actionClass).appendTo(e);
                    break;
                case "clear":
                    a.addKey("clear","clear").appendTo(e);
                    break;
                case "dec":
                    a.acceptedKeys.push(".");
                    a.addKey("dec","dec").appendTo(e);
                    break;
                case "e":case "enter":
                    a.addKey("enter",b).appendTo(e);
                    break;
                case "s":case "shift":
                    a.addKey("shift",b).appendTo(e);
                    break;
                case "sign":
                    a.acceptedKeys.push("-");
                    a.addKey("sign","sign").appendTo(e);
                    break;
                case "space":
                    a.acceptedKeys.push(" ");
                    a.addKey("space","space").appendTo(e);
                    break;
                case "t":case "tab":
                    a.addKey("tab",b).appendTo(e)
                    }
                }else{
            a.acceptedKeys.push(h[i].split(":")[0]);
            a.addKey(h[i],h[i],true).attr("name","key_"+d+"_"+ i).appendTo(e)
            }
        }
    }
if(m>1)a.sets=true;
a.acceptedKeysStr=a.acceptedKeys.join("");
return n
};

a.destroy=function(){
    f(document).unbind("mousedown keyup",a.escClose);
    a.$keyboard.remove();
    a.$el.removeClass("ui-keyboard-input ui-widget-content ui-corner-all").removeAttr("aria-haspopup").removeAttr("role").unbind("focus accepted canceled hidden visible").removeData("keyboard")
    };
    
a.keyaction={
    accept:function(){
        a.close(true)
        },
    alt:function(b){
        a.altActive=!a.altActive;
        a.metaActive=false;
        a.showKeySet(b)
        },
    bksp:function(){
        a.insertText("bksp")
        }, 
    cancel:function(){
        a.close()
        },
    clear:function(){
        a.$preview.val("")
        },
    dec:function(){
        a.insertText(".")
        },
    enter:function(){
        a.insertText("\r\n")
        },
    meta:function(b){
        a.metaActive=f(b).is(".ui-state-active")?false:true;
        a.showKeySet(b)
        },
    shift:function(b){
        a.shiftActive=!a.shiftActive;
        a.metaActive=false;
        a.showKeySet(b)
        },
    sign:function(){
        /^\-?\d*\.?\d*$/.test(a.$preview.val())&&a.$preview.val(a.$preview.val()*-1)
        },
    space:function(){
        a.insertText(" ")
        },
    tab:function(){
        a.insertText("\t")
        }
    };

a.init()
};

f.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}"]
        }
    };

f.keyboard.defaultOptions={
    layout:"qwerty",
    customLayout:null,
    position:{
        of:null,
        my:"center top",
        at:"center top"
    },
    display:{
        a:"\u2714:Accept (Shift-Enter)",
        accept:"Accept:Accept (Shift-Enter)",
        alt:"AltGr:Alternate Graphemes",
        b:"\u2190:Backspace",
        bksp:"Bksp:Backspace",
        c:"\u2716:Cancel (Esc)",
        cancel:"Cancel:Cancel (Esc)", 
        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",
    autoAccept:false,
    lockInput:false,
    restrictInput:false,
    preventPaste: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
};

f.fn.keyboard=function(k){
    return this.each(function(){
        new f.keyboard(this,k)
        })
    };
    
f.fn.getkeyboard=function(){
    return this.data("keyboard")
    }
})(jQuery);
(function(f,k,l,a){
    f.fn.caret=function(b,d){
        var e,c,g,i,h;
        h=document.selection;
        var j=this[0],o=j.scrollTop,m=f.browser.msie;
        if(typeof j!=="undefined"){
            if(typeof b==="number"&&typeof d==="number"){
                c=b;
                i=d
                }
                if(typeof c!=="undefined"){
                if(m){
                    h=j.createTextRange();
                    h.collapse(true);
                    h.moveStart("character",c);
                    h.moveEnd("character",i-c);
                    h.select()
                    }else{
                    j.selectionStart=c;
                    j.selectionEnd=i
                    }
                    j.focus();
                j.scrollTop=o;
                return this
                }else{
                if(m)if(j.tagName.toLowerCase()!=="textarea"){
                    i=this.val();
                    c=h[l]()[a]();
                    c.moveEnd("character", i[k]);
                    e=c.text===""?i[k]:i.lastIndexOf(c.text);
                    c=h[l]()[a]();
                    c.moveStart("character",-i[k]);
                    g=c.text[k]
                    }else{
                    c=h[l]();
                    h=c[a]();
                    h.moveToElementText(j);
                    h.setEndPoint("EndToEnd",c);
                    e=h.text[k]-c.text[k];
                    g=e+c.text[k]
                    }else{
                    e=j.selectionStart;
                    g=j.selectionEnd
                    }
                    h=j.value.substring(e,g);
                return{
                    start:e,
                    end:g,
                    text:h,
                    replace:function(n){
                        return j.value.substring(0,e)+n+j.value.substring(g,j.value[k])
                        }
                    }
            }
    }
}
})(jQuery,"length","createRange","duplicate");
