(function() {
  var interval_id,
    last_hash,
    cache_bust = 1,
    rm_callback,
    window = this,
    FALSE = !1,
    postMessage = 'postMessage',
    addEventListener = 'addEventListener',
    p_receiveMessage;
  
  var match = navigator.userAgent.toLowerCase().match(/opera(?:.*version)?[ \/]([\w.]+)/);
  window.has_postMessage = window[postMessage] && ( !match || parseInt(match[1]) > 9 );
  
  window.receiveMessage = p_receiveMessage = function( callback, source_origin, delay ) {
    if ( window.has_postMessage ) {
      if ( callback ) {
        rm_callback && p_receiveMessage();
        
        rm_callback = function(e) {
          if ( ( typeof source_origin === 'string' && e.origin !== source_origin )
            || ( typeof source_origin === 'function' && source_origin( e.origin ) === FALSE ) ) {
            return FALSE;
          }
          callback( e );
        };
      }
      
      if ( window[addEventListener] ) {
        window[ callback ? addEventListener : 'removeEventListener' ]( 'message', rm_callback, FALSE );
      } else {
        window[ callback ? 'attachEvent' : 'detachEvent' ]( 'onmessage', rm_callback );
      }
      
    } else {
      interval_id && clearInterval( interval_id );
      interval_id = null;
      
      if ( callback ) {
        delay = typeof source_origin === 'number'
          ? source_origin
          : typeof delay === 'number'
            ? delay
            : 100;
        
        interval_id = setInterval(function(){
          var hash = document.location.hash,
            re = /^#?\d+&/;
          if ( hash !== last_hash && re.test( hash ) ) {
            last_hash = hash;
            callback({ data: hash.replace( re, '' ) });
          }
        }, delay );
      }
    }
  };
  
})();
