function shortcut(shortcut,callback,opt) {
        //Provide a set of default options      
        var default_options = {
                'type':'keydown',
                'propagate':false,
                'target':document
        }
        if(!opt) opt = default_options;
        else {
                for(var dfo in default_options) {
                        if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];
                }
        }

        var ele = opt.target
        if(typeof opt.target == 'string') ele = document.getElementById(opt.target);
        var ths = this;

        //The function to be called at keypress
        var func = function(e) {
                e = e || window.event;
                
                //Find Which key is pressed
                if (e.keyCode) code = e.keyCode;
                else if (e.which) code = e.which;
                var character = String.fromCharCode(code).toLowerCase();

                var keys = shortcut.toLowerCase().split("+");
                //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked
                var kp = 0;
                
                //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken
                var shift_nums = {
                        "`":"~",
                        "1":"!",
                        "2":"@",
                        "3":"#",
                        "4":"$",
                        "5":"%",
                        "6":"^",
                        "7":"&",
                        "8":"*",
                        "9":"(",
                        "0":")",
                        "-":"_",
                        "=":"+",
                        ";":":",
                        "'":"\"",
                        ",":"<",
                        ".":">",
                        "/":"?",
                        "\\":"|"
                }
                //Special Keys - and their codes
                var special_keys = {
                        'esc':27,
                        'escape':27,
                        'tab':9,
                        'space':32,
                        'return':13,
                        'enter':13,
                        'backspace':8,

                        'scrolllock':145,
                        'scroll_lock':145,
                        'scroll':145,
                        'capslock':20,
                        'caps_lock':20,
                        'caps':20,
                        'numlock':144,
                        'num_lock':144,
                        'num':144,
                        
                        'pause':19,
                        'break':19,
                        
                        'insert':45,
                        'home':36,
                        'delete':46,
                        'end':35,
                        
                        'pageup':33,
                        'page_up':33,
                        'pu':33,

                        'pagedown':34,
                        'page_down':34,
                        'pd':34,

                        'left':37,
                        'up':38,
                        'right':39,
                        'down':40,

                        'f1':112,
                        'f2':113,
                        'f3':114,
                        'f4':115,
                        'f5':116,
                        'f6':117,
                        'f7':118,
                        'f8':119,
                        'f9':120,
                        'f10':121,
                        'f11':122,
                        'f12':123
                }


                for(var i=0; k=keys[i],i<keys.length; i++) {
                        //Modifiers
                        if(k == 'ctrl' || k == 'control') {
                                if(e.ctrlKey) kp++;

                        } else if(k ==  'shift') {
                                if(e.shiftKey) kp++;

                        } else if(k == 'alt') {
                                        if(e.altKey) kp++;

                        } else if(k.length > 1) { //If it is a special key
                                if(special_keys[k] == code) kp++;

                        } else { //The special keys did not match
                                if(character == k) kp++;
                                else {
                                        if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase
                                                character = shift_nums[character]; 
                                                if(character == k) kp++;
                                        }
                                }
                        }
                }

                if(kp == keys.length) {
                        callback(e);

                        if(!opt['propagate']) { //Stop the event
                                //e.cancelBubble is supported by IE - this will kill the bubbling process.
                                e.cancelBubble = true;
                                e.returnValue = false;

                                //e.stopPropagation works only in Firefox.
                                if (e.stopPropagation) {
                                        e.stopPropagation();
                                        e.preventDefault();
                                }
                                return false;
                        }
                }
        }

        //Attach the function with the event    
        if(ele.addEventListener) ele.addEventListener(opt['type'], func, false);
        else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);
        else ele['on'+opt['type']] = func;
}