﻿(function ($) {

    var langArray = new Array();
    var codes = new Array();
    var currEdit = null;
    var IsUrdu = 1;
    var EditorId = 0;
    var gOpts;
    var elName;
    var elIndex;
    var SrcElement;
    var Settings = {
        EditorFont: "Tahoma",
        EnglishColor: "",
        UrduColor: ""
    };

    codes['a'] = 0x0627;
    codes['b'] = 0x0628;
    codes['c'] = 0x0686;
    codes['d'] = 0x062F;
    codes['e'] = 0x0639;
    codes['f'] = 0x0641;
    codes['g'] = 0x06AF;
    codes['h'] = 0x06BE;
    codes['i'] = 0x06CC;
    codes['j'] = 0x062C;
    codes['k'] = 0x06A9;
    codes['l'] = 0x0644;
    codes['m'] = 0x0645;
    codes['n'] = 0x0646;
    codes['o'] = 0x06C1;
    codes['p'] = 0x067E;
    codes['q'] = 0x0642;
    codes['r'] = 0x0631;
    codes['s'] = 0x0633;
    codes['t'] = 0x062A;
    codes['u'] = 0x0626;
    codes['v'] = 0x0637;
    codes['w'] = 0x0648;
    codes['x'] = 0x0634;
    codes['y'] = 0x06D2;
    codes['z'] = 0x0632;

    codes['A'] = 0x0622;
    codes['C'] = 0x062B;
    codes['D'] = 0x0688;
    codes['E'] = 0x0651;
    codes['F'] = 0x064D;
    codes['G'] = 0x063A;
    codes['H'] = 0x062D;
    codes['I'] = 0x0670;
    codes['J'] = 0x0636;
    codes['K'] = 0x062E;
    codes['L'] = 0x0628;
    codes['M'] = 0x064B;
    codes['N'] = 0x06BA;
    codes['O'] = 0x06C3;
    codes['P'] = 0x064F;
    codes['Q'] = 0x0656;
    codes['R'] = 0x0691;
    codes['S'] = 0x0635;
    codes['T'] = 0x0679;
    codes['U'] = 0x0621;
    codes['V'] = 0x0638;
    codes['W'] = 0x0624;
    codes['X'] = 0x0698;
    codes['Y'] = 0x0601;
    codes['Z'] = 0x0630;

    codes['>'] = 0x0650;
    codes['<'] = 0x064E;
    codes[String.fromCharCode(32)] = 32;
    codes[String.fromCharCode(13)] = 13;
    codes[':'] = 0x061B;
    codes[';'] = 0x061B;
    codes[String.fromCharCode(39)] = 0x2018;
    codes[String.fromCharCode(34)] = 0x201C;
    codes[String.fromCharCode(46)] = 0x06D4;
    codes[String.fromCharCode(44)] = 0x060C;
    codes['!'] = 0x0021;
    codes['?'] = 0x061F;
    codes[':'] = 58;

    //codes['[']=0x0654; 
    //codes[']']=0x0655; 
    codes['['] = 0x201C;
    codes[']'] = 0x201D;
    codes['{'] = 0x2018;
    codes['}'] = 0x2019;
    codes['~'] = 0x0653;
    codes['^'] = 0x0652;
    codes['/'] = 0x002F;
    codes['\\'] = 0x060E;
    codes['L'] = 0x064C;
    codes['+'] = 0x002B;
    codes['-'] = 0x002D;
    codes['_'] = 0x0640;
    codes['*'] = 0x00D7;
    codes[String.fromCharCode(47)] = 0x00F7;
    codes[String.fromCharCode(37)] = 0x066A;
    codes['('] = 0x0028;
    codes[')'] = 0x0029;
    codes['='] = 0x003D;
    codes['´'] = 0x0657;

    codes['0'] = 0x30;
    codes['1'] = 0x31;
    codes['2'] = 0x32;
    codes['3'] = 0x33;
    codes['4'] = 0x34;
    codes['5'] = 0x35;
    codes['6'] = 0x36;
    codes['7'] = 0x37;
    codes['8'] = 0x38;
    codes['9'] = 0x39;

    var Diacritics = '[]{}~';
    var keyboardSRK = '<span dir="ltr"><table width="100%" style="border: 1px solid #C0C0C0;"><tr> <td class="btnFlat" width=6% onclick="AddText(\'ر\');">ر</td> <td class="btnFlat" width=6% onclick="AddText(\'ذ\');">ذ</td> <td class="btnFlat" width=6% onclick="AddText(\'ڈ\');">ڈ</td> <td class="btnFlat" width=6% onclick="AddText(\'د\');">د</td> <td class="btnFlat" width=6% onclick="AddText(\'خ\');">خ</td> <td class="btnFlat" width=6% onclick="AddText(\'ح\');">ح</td> <td class="btnFlat" width=6% onclick="AddText(\'چ\');">چ</td> <td class="btnFlat" width=6% onclick="AddText(\'ج\');">ج</td> <td class="btnFlat" width=6% onclick="AddText(\'ث\');">ث</td> <td class="btnFlat" width=6% onclick="AddText(\'ٹ\');">ٹ</td> <td class="btnFlat" width=6% onclick="AddText(\'ت\');">ت</td> <td class="btnFlat" width=6% onclick="AddText(\'پ\');">پ</td> <td class="btnFlat" width=6% onclick="AddText(\'ب\');">ب</td> <td class="btnFlat" width=6% onclick="AddText(\'آ\');">آ</td> <td class="btnFlat" width=6% onclick="AddText(\'ا\');">ا</td></tr><tr> <td class="btnFlat" width=6% onclick="AddText(\'گ\');">گ</td> <td class="btnFlat" width=6% onclick="AddText(\'ک\');">ک</td> <td class="btnFlat" width=6% onclick="AddText(\'ق\');">ق</td> <td class="btnFlat" width=6% onclick="AddText(\'ف\');">ف</td> <td class="btnFlat" width=6% onclick="AddText(\'غ\');">غ</td> <td class="btnFlat" width=6% onclick="AddText(\'ع\');">ع</td> <td class="btnFlat" width=6% onclick="AddText(\'ظ\');">ظ</td> <td class="btnFlat" width=6% onclick="AddText(\'ط\');">ط</td> <td class="btnFlat" width=6% onclick="AddText(\'ض\');">ض</td> <td class="btnFlat" width=6% onclick="AddText(\'ص\');">ص</td> <td class="btnFlat" width=6% onclick="AddText(\'ش\');">ش</td> <td class="btnFlat" width=6% onclick="AddText(\'س\');">س</td> <td class="btnFlat" width=6% onclick="AddText(\'ژ\');">ژ</td> <td class="btnFlat" width=6% onclick="AddText(\'ز\');">ز</td> <td class="btnFlat" width=6% onclick="AddText(\'ڑ\');">ڑ</td> </tr> <tr> <td >&nbsp;</td> <td class="btnFlat" width=6% onclick="AddText(\'؟\');">؟</td> <td class="btnFlat" width=6% onclick="AddText(\'۔\');">۔</td> <td class="btnFlat" width=6% onclick="AddText(\'ے\');">ے</td> <td class="btnFlat" width=6% onclick="AddText(\'ی\');">ی</td> <td class="btnFlat" width=6% onclick="AddText(\'ئ\');">ئ</td> <td class="btnFlat" width=6% onclick="AddText(\'ء\');">ء</td> <td class="btnFlat" width=6% onclick="AddText(\'ھ\');">ھ</td> <td class="btnFlat" width=6% onclick="AddText(\'ہ\');">ہ</td> <td class="btnFlat" width=6% onclick="AddText(\'ؤ\');">ؤ</td> <td class="btnFlat" width=6% onclick="AddText(\'و\');">و</td> <td class="btnFlat" width=6% onclick="AddText(\'ں\');">ں</td> <td class="btnFlat" width=6% onclick="AddText(\'ن\');">ن</td> <td class="btnFlat" width=6% onclick="AddText(\'م\');">م</td> <td class="btnFlat" width=6% onclick="AddText(\'ل\');">ل</td></tr><tr><td width="100%" colspan="15"><table align=right style="border: 1px solid #D3D3D3;" colspan="15"><tr> <td class="btnFlat" onclick="AddText(String.fromCharCode(0x060C));">کوما</td> <td class="btnFlat" onclick="AddText(String.fromCharCode(0x0651));">تشدید</td> <td class="btnFlat" onclick="AddText(String.fromCharCode(0x0670));">کھڑی زبر</td> <td class="btnFlat" onclick="AddText(String.fromCharCode(0x0626));">درمیانی حمزہ</td> <td class="btnFlat" onclick="AddText(String.fromCharCode(0x064D));">دو زیر</td> <td class="btnFlat" onclick="AddText(String.fromCharCode(0x064B));">دو زبر</td> <td class="btnFlat" onclick="AddText(String.fromCharCode(0x064F));"> پیش </td> <td class="btnFlat" onclick="AddText(String.fromCharCode(0x064E));">زبر</td> <td class="btnFlat" onclick="AddText(String.fromCharCode(0x0650));">زیر</td></tr></table></td></tr></table></span>';

    $.fn.UrduEditor = function (size, options) {

        var kbNormal = 1;
        var kbShift = 2;
        var kbAlt = 3;
        var kbCtrl = 4;
        var kbAltGr = 5;
        var bToggleFlag = 0;
        var CurrentKeyboardState = 1;
        var scriptPath;
        SrcElement = $(this).get(0);

        var scriptElement = document.getElementsByTagName('script');
        for (var i = 0; i < scriptElement.length; i++) {
            if (scriptElement[i].src && (scriptElement[i].src.indexOf("jquery.UrduEditor.js") != -1)) {
                _x = scriptElement[i].src.indexOf("jquery.UrduEditor.js");
                scriptPath = scriptElement[i].src.substring(0, _x);
            }
        }

        $.extend($.fn.UrduEditor.defaults, options);

        return this.each(function () {
            
            
            var el = this;
            if ($(el).attr("UrduEditorId")) return;
            editorId = getId();
            $(el).attr("UrduEditorId", editorId);
            setAttributes(el, size)

            // keypress handler
            $(el).keypress(function (e) {
                var editorId = $(el).attr("UrduEditorId");
                if (!langArray[editorId]) return;
                e = (e) ? e : (window.event) ? event : null;

                var charCode = (e.charCode) ? e.charCode :
                    ((e.keyCode) ? e.keyCode :
                   ((e.which) ? e.which : 0));
                var whichASC = charCode; // key's ASCII code
                var whichChar = String.fromCharCode(whichASC); // key's character



                if ($.browser.msie) {
                    var charCode = e.keyCode;
                    var whichChar = String.fromCharCode(charCode);
                    if (codes[whichChar] != null) {
                        event.keyCode = codes[whichChar];
                    }
                }
                else if ($.browser.mozilla) {
                    var charCode = e.charCode;
                    var whichChar = String.fromCharCode(charCode);
                    //console.debug(charCode);
                    if ((charCode == 13) || (charCode == 8) || (charCode == 37) || (charCode == 39) || (charCode == 38) || (charCode == 40) || (charCode == 33) || (charCode == 34) || (charCode == 50)) return;


                    // Avoid processing if control or higher than ASCII
                    // Or ctrl or alt is pressed.
                    if (charCode < 0x0020 || charCode >= 0x007F || e.ctrlKey || e.altKey || e.metaKey)
                        return true;
                    var newkey;
                    newkey = codes[whichChar];
                    if (newkey == charCode)
                        return true;

                    //console.debug(whichASC);
                    txt = String.fromCharCode(codes[whichChar]);
                    try {
                        var newEvent = document.createEvent("KeyEvents");
                        newEvent.initKeyEvent("keypress", true, true, window,
                                                  false, false, false, false, 0, codes[whichChar]);
                        e.preventDefault();
                        e.target.dispatchEvent(newEvent);
                    }
                    catch (ex) {
                        /*
                        *  Safari implements
                        */
                        //alert('safari');
                        var evt = document.createEvent("KeyboardEvents");
                        evt.initKeyboardEvent('keypress', false, true, window, false, false, false, false, codes[whichChar], 0);
                        e.preventDefault();
                        e.target.dispatchEvent(evt);
                    }
                }
                else {
                    if ((charCode == 13) || (charCode == 8) || (charCode == 37) || (charCode == 39) || (charCode == 38) || (charCode == 40) || (charCode == 33) || (charCode == 34) || (charCode == 50)) return;
                    // to be done: replace the following line to get rid of the dependency of Virtual Keyboard
                    //DocumentSelection.insertAtCursor(e.currentTarget, String.fromCharCode(codes[whichChar]));
                    e.stopPropagation();
                    e.preventDefault();
                }
            });

            $(el).keydown(function (e) {
                e = (e) ? e : (window.event) ? event : null;
                var charCode = (e.charCode) ? e.charCode :
                        ((e.keyCode) ? e.keyCode :
                       ((e.which) ? e.which : 0));
                if (e.ctrlKey && (charCode == 32)) {
                    $.fn.UrduEditor.ToggleLanguage();
                    e.preventDefault();
                    return false;
                }

            });


            $(el).focus(function (e) {
                if ($.browser.msie) {
                    currEdit = window.event.srcElement;
                }
                else {
                    currEdit = e.target;
                }
            })
        });


        function getId() {
            EditorId++;
            return "UrduEditor_" + EditorId;
        }

        function setEditor(e) {
            if ($.browser.mozilla || $.browser.opera || $.browser.safari || $.browser.chrome) {
                currEdit = e.target;
            }
            else if ($.browser.msie)
                currEdit = window.event.srcElement;
        }

        function setAttributes(el, pt) {
            
            el.lang = "ur";
            el.dir = "rtl";
            el.wrap = "soft";
            var editorId = $(el).attr("UrduEditorId");
            langArray[editorId] = 1;
            IsUrdu = 1;

            var langIcon = $('<img />').attr('src','http://downloads.bookspk.com/kb/lang_icon_urdu.gif');

            $(el).after(langIcon);

            langIcon.click(
                function () {
                    if (langArray[editorId] == 1) {
                        setEnglish(el);
                        langIcon.attr('src', 'http://downloads.bookspk.com/kb/lang_icon_english.gif');
                    }
                    else {
                        setUrdu(el);
                        langIcon.attr('src', 'http://downloads.bookspk.com/kb/lang_icon_urdu.gif');
                    }
                }
            )

            with (el.style) {
                fontFamily = $.fn.UrduEditor.defaults.EditorFont;
                fontSize = pt;
                backgroundColor = $.fn.UrduEditor.defaults.UrduColor;
            }
        }

    };


    $.fn.UrduEditor.SetDefaults = function (options) {
        if (null != options) {
            if (options.EditorFont) {
                Settings.EditorFont = options.EditorFont;
            }

            if (options.UrduColor) {
                Settings.UrduColor = options.UrduColor;
            }

            if (options.EnglishColor) {
                Settings.EnglishColor = options.EnglishColor;
            }
        }
    };

    $.fn.UrduEditor.defaults = {
        EditorFont: "Tahoma",
        EnglishColor: "",
        UrduColor: ""
    };

    $.fn.UrduEditor.ToggleLanguage = function () {
        var editorId = $(currEdit).attr("UrduEditorId");
        if (langArray[editorId] == 1) {
            setEnglish(currEdit);
        }
        else {
            setUrdu(currEdit);
        }
    };

    AddText = function (text) {
        if (!currEdit) return;

        if (currEdit.createTextRange && currEdit.caretPos) {
            var caretPos = currEdit.caretPos;
            caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ?
			text + ' ' : text;
            currEdit.focus(caretPos);
        }
        else if (currEdit.selectionStart || currEdit.selectionStart == '0') {
            var vTop = currEdit.scrollTop;
            var startPos = currEdit.selectionStart;
            var endPos = currEdit.selectionEnd;
            currEdit.value = currEdit.value.substring(0, startPos)
						  + text
						  + currEdit.value.substring(endPos, currEdit.value.length);
            currEdit.focus();
            currEdit.selectionStart = startPos + 1;
            currEdit.selectionEnd = startPos + 1;
            currEdit.scrollTop = vTop;
        }
        else {
            currEdit.value += text;
            currEdit.focus(caretPos);
        }
    }

    isFunction = function (prop /* :Object */) /* :Boolean */{
        return (typeof prop == 'function');
    }

    setUrdu = function (el) {
        IsUrdu = 1;
        var editorId = $(el).attr("UrduEditorId");
        langArray[editorId] = 1;
        el.focus(1);

        el.style.backgroundColor = $.fn.UrduEditor.defaults.UrduColor;
        if (el.createTextRange) {
            var caretPos = el.caretPos;
            el.focus(caretPos);
            this.currEdit = el;
        }
        else if (el.selectionStart || el.selectionStart == '0') {
            var startPos = el.selectionStart;
            el.focus();
            this.currEdit = el;
            el.selectionStart = startPos + 1;
            el.selectionEnd = startPos + 1;
        }
    };

    setEnglish = function (el) {

        IsUrdu = 0;
        var editorId = $(el).attr("UrduEditorId");
        langArray[editorId] = 0;
        el.style.backgroundColor = $.fn.UrduEditor.defaults.EnglishColor;
        if (el.createTextRange) {
            var caretPos = el.caretPos;
            el.focus(caretPos);
            this.currEdit = el;
        }
        else if (el.selectionStart || el.selectionStart == '0') {
            var startPos = el.selectionStart;
            el.focus();
            this.currEdit = el;
            el.selectionStart = startPos + 1;
            el.selectionEnd = startPos + 1;
        }
    };

    $.fn.UrduEditor.writeKeyboard = function (el) {
        el.after(keyboardSRK);
    }



})(jQuery);
