
if (typeof UWA == 'undefined') UWA = {};

UWA.iFrameMessaging = function(){}

UWA.iFrameMessaging.prototype = {
    _options : {},
    
    init: function(options){
        var _this = this;
        
        if (typeof options!='object' || !options.eventHandler) {
            return;
        }
        
        this._options  = options;
        
        if (typeof document.postMessage === 'function' || typeof window.postMessage === 'function') {
            window.addEventListener('message',  function(msg){
                var origin = msg.origin;
                if (origin){ // Common case
                    origin = origin.split('//')[1];
                } else { // Opera case
                    origin = msg.domain;
                }

                _this.dispatch(msg.data, origin, 'postMessage');
            }, false);
        }
    },
    
    dispatch: function(msg, msgOrigin, msgCommType){
        var options = this._options;
        msgOrigin = unescape(msgOrigin);
        if (typeof options.trustedOrigin == 'undefined' || msgOrigin==options.trustedOrigin){
            var msg = this.decodeJson(msg);
            if (msg) {
                msg.commType = msgCommType;
                options.eventHandler(msg);
            };
        } else {
             throw new Error('Origin ' + msgOrigin + ' is not trusted.');
        }
    },
    
    decodeJson: function(json){
        var ret = false;
        if ((/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(unescape(json).replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) {
            ret = eval('(' + unescape(json) + ')');
        }
        return ret;
    }
}