/*
Copyright (c) 2007-2008 the OTHER media Limited
Licensed under the BSD license, http://ojay.othermedia.org/license.html
Version: 0.4.1
Build:   min
*/

(function(m,h,j){var i=m.KEY;var p=function(a){a=a.trim();return a?a.split(/\s+/):[]},n=function(a,b){return a-b},q=function(a){return a&&String(a).toUpperCase().charCodeAt(0)},k=function(c){if(typeof c=='string')c=p(c);return c.map(function(a){var b=null;if(b=i[String(a).toUpperCase()])a=b;if(typeof a=='string')a=q(a);return a}).sort(n)},r=function(c){return c.reduce(function(a,b){switch(b){case i.CONTROL:a.ctrl=true;break;case i.SHIFT:a.shift=true;break;case i.ALT:a.alt=true;break;default:a.keys.push(b)}return a},{keys:[]})},l=function(a){return a.sort(n).join(':')};var s=Ojay.Keyboard=new JS.Singleton('Ojay.Keyboard',{listen:function(a,b,c,e){var d=new o(a,b,c,e);d.enable();return d},isPressed:function(a){return k(a).every(g.method('_4'))}});var o=new JS.Class('Ojay.Keyboard.Rule',{initialize:function(a,b,c,e){var d=Array.from(arguments);a=Ojay(a).node;if(!a){a=document;b=d.shift();c=d.shift();e=d.shift()}if(e)c=c.bind(e);this._5=k(b);this._6=new m(a,r(this._5),c)},enable:function(){this._2=true;this._6.enable();this._3&&f._7(this);return this},disable:function(){this._2=false;this._6.disable();this._3&&f._8(this);return this},preventDefault:function(){this._3=true;this._2&&f._7(this);return this},allowDefault:function(){this._3=false;this._2&&f._8(this);return this},getSignature:function(){var a=l(this._5);this.getSignature=function(){return a};return a}});s.RuleSet=new JS.Class('Ojay.Keyboard.RuleSet',{initialize:function(a,b){var c=Array.from(arguments);a=Ojay(a).node;if(!a){a=document;b=c.shift()}this._d=a;this._0={};var e,d;for(e in b){d=new o(a,e,b[e]);this._0[d.getSignature()]=d}},forEach:function(a,b){a=Function.from(a);for(var c in this._0)a.call(b||null,this._0[c])},enable:function(){this.forEach('enable');return this},disable:function(){this.forEach('disable');return this},get:function(a){return this._0[l(k(a))]||null},merge:function(b){var c={},e=function(a){c[a.getSignature()]=a};[this,b].forEach({forEach:e});var d=new this.klass({});d._0=c;return d}});var g=new JS.Singleton('Ojay.Keyboard.Monitor',{_1:[],_a:function(a){if(!this._4(a))this._1.push(a)},_b:function(b){this._1=this._1.filter(function(a){return a!=b})},_4:function(a){return this._1.indexOf(a)!=-1},getSignature:function(){return l(this._1)}});var f=new JS.Singleton('Ojay.Keyboard.Disabler',{_0:[],_7:function(a){this._0.push(a)},_8:function(b){this._0=this._0.filter(function(a){return a!=b})},_9:function(a,b){if(this._c(b))h.preventDefault(a)},_c:function(a){for(var b=0,c=this._0.length;b<c;b++){if(this._0[b].getSignature()==a)return true}return false}});h.on(j,'keydown',function(a){g._a(a.keyCode);if(YAHOO.env.ua.ie)f._9(a,g.getSignature())});if(!YAHOO.env.ua.ie){h.on(j,'keypress',function(a){f._9(a,g.getSignature())})}h.on(j,'keyup',function(a){g._b(a.keyCode)})})(YAHOO.util.KeyListener,YAHOO.util.Event,document);