String.prototype.byte_length = function(){
  var count = 0;
  for(var i = 0; i < this.length; i++) {
    var size = (escape(this.charAt(i)).length < 4) ? 1 : 2;
    count += size;
  }
  return count;
};

function set_popup(messages, type){
  var iframe = document.createElement('iframe');
  var attributes = {src         : '/iframe.html',
                    id          : 'iframe',
                    marginheight: "0",
                    marginwidth : "0",
                    scrolling   : "no"};
  for(var k in attributes){
    iframe[k] = attributes[k];
  }
  var styles = {position  : 'absolute',
                display   : 'none',
                background: '#FFFFFF'};
  for(var k in styles){
    iframe.style[k] = styles[k];
  }
  document.getElementsByTagName('body')[0].appendChild(iframe);

  for(var k in messages){
    var node = document.getElementById(k);
    if(!node){
      continue;
    }
    node.onmouseover = function(event){
      if (!event) event=window.event;
      if (!event.pageX) event.pageX = event.clientX + document.body.scrollLeft;
      if (!event.pageY) event.pageY = event.clientY + document.body.scrollTop;
      var content = iframe.contentWindow.document.getElementById('content');
      var message = (typeof(messages[this.id]) == 'string') ?
        messages[this.id] : messages[this.id][type] ;

      var font_size = '10';
      content.style.fontSize = font_size + 'pt';
      content.style.whiteSpace = 'nowrap';
      content.innerHTML = message;
      var matrix = message.split(/<br[/\s]*/);
      var max_char_length = 0;
      for(var n=0; n<matrix.length; n++){
        var char_length = matrix[n].replace(/<[^>]+>?/g, '').byte_length();
        if(max_char_length < char_length){
          max_char_length = char_length;
        }
      }
      var width = (max_char_length * 7.3 < 520) ? max_char_length * 7.3 : 540;
      var styles = {
        height: matrix.length * 20 + 34,
        width : width,
        top   : event.pageY + 5,
        left  : event.pageX + 5,
        display: 'block'};
      for(var k in styles){
        iframe.style[k] = styles[k];
      }
    };
    node.onmouseout = function(){
      iframe.style.display =  'none';
    };
  }
}

