var INBOX = INBOX || {};

INBOX.namespace('apps.Inbox', function(){
    "use strict";

    function init(){
        var Inbox = function(){
            this.bindActions();
        }
		
        Inbox.prototype = {
            bindActions: function(){
                $('input:password', '#tblogin, #implogin').keypress( function(e) {
                    INBOX.observer.notify('checkCapsLock', e);
                });
            },
            requestBanner: function(event, opt){
                var kwRequest = {}; //keyword request
                var reqSize = 0;
				
                for (var keyW in INBOX.apps.Ads.shownBxKeyWords) {  //found all supported keywords, that were shown
                    if (INBOX.apps.Ads.shownBxKeyWords.hasOwnProperty(keyW) &&
                        INBOX.apps.Ads.kwPlaces.hasOwnProperty(keyW)) {
                        kwRequest[keyW] = 1;
                        reqSize++;
                    }
                }

                if (reqSize) 
                    $.get(opt.url, {action:   'GET_AD',keywords:  kwRequest }, $.proxy(this.updateBanner, this), 'json');
            },
            updateBanner: function(data){
                for (var keyW in data)
                    $('#' + INBOX.apps.Ads.kwPlaces[keyW]).html(data[keyW]);

                if (data.hasOwnProperty('IDs') && data.hasOwnProperty('host') && data.IDs != '') {
                    if ($.browser.msie || $.browser.opera) {
                        //workaround for IE [bardzs]
                        $.get(data.host, { action: 'REG_AD', ids: data.IDs, ts: new Date().getTime() });
                    }
                    else {
                        $.get(data.host, { ids: data.IDs, ts: new Date().getTime() });
                    }
                }
            },
            checkCapsLock: function (event, ev) {
                var targ = $(ev.target),
                    shift_status = false,
                    which = -1;

                // get key pressed
                if (ev.which) {
                    which = ev.which;
                }
                else if (ev.keyCode) {
                    which = ev.keyCode;
                }
                // get shift status

                if (ev.shiftKey) {
                    shift_status = ev.shiftKey;
                }
                else if (ev.modifiers) {
                    shift_status = !!(ev.modifiers & 4);
                }

                if (((which >= 65 && which <=  90) && !shift_status) || ((which >= 97 && which <= 122) && shift_status)) {
                    // uppercase, no shift key
                    if (targ.parent().find('.ui-icon-error').size() < 1) {
                        targ.after('<span class="ui-icon-shared ui-icon-error" title="' + targ.attr('data-error') + '">' + targ.attr('data-error') + '</span>');
                    }
                }
                else {
                    var icon = targ.parent().find('.ui-icon-error');
                    if (icon.size() > 0) {
                        icon.remove();
                    }
                }
            }
        }

        var inbox = new Inbox();

        INBOX.observer.observe('requestAds', $.proxy(inbox.requestBanner, inbox));
        INBOX.observer.observe('updateAds', $.proxy(inbox.updateBanner, inbox));
        INBOX.observer.observe('checkCapsLock', $.proxy(inbox.checkCapsLock, inbox));

        return inbox;
    }

    return {
        object: null,
        run: function(){
            if(this.object !== null) throw new Error('App Inbox has already been run.');
            this.object = init();
        }
    }
});

$(document).ready(function(){
    INBOX.apps.Inbox.run();
});
