function Flipper() {
  Flipper.prototype.ids++;
  this.flipperId = 'flipper-'+this.ids;
  this.queue = [];
  this.url = null;
  this.topCount = 10;
  this.addInterval = 5000;
  this.numb = 0;
  this.addId = 0;
};
Flipper.prototype.ids = 0;
Flipper.prototype.init = function(url,holderId){
  if(url && holderId) {
    this.url = url;
    var holder = get_by_id(holderId);
    var h2 = make_el('H2',holder);
    make_el('span',{className: 'flipper-post-title'},'Post Title',h2);
    make_el('span',{className: 'flipper-board'},'Community',h2);
    make_el('span',{className: 'flipper-author'},'Author',h2);

    var flipper =  make_el('UL',{id:this.flipperId,
	  style:{margin:0,padding:0}},holder);
    this.addEvents(flipper);
    this.load(true);
  }
};

Flipper.prototype.addEvents = function(flipper){
  var me = this;
  addEvent(flipper,'mousemove',function(e){me.feed_show_desc(e);},false);
  addEvent(flipper,'mouseout',function(e){me.feed_kill_desc(e);},false);
  addEvent(window,'unload',function(){me.clean();},false);
  flipper = null;
};

Flipper.prototype.clean = function() {
  for(var i=0,l=this.queue.length;i<l;i++)
  this.queue[i] = null;
};

Flipper.prototype.feed_show_desc = function (e){
  var srcEl = get_srcEl(e);
  if(srcEl && srcEl.description) {
    if(!srcEl.descId){
      Flipper.prototype.ids++;
      srcEl.descId = "flipper-description-"+Flipper.prototype.ids;
      var div =  make_el("DIV",document.body,{className: "box tooltip",
				       id: srcEl.descId,
				       style:{position:"absolute", width:'200px',display:'none',fontSize:'12px',zIndex:1111}});
      make_el("DIV",{className: "boxbody", innerHTML:srcEl.description},div);
    };
    if(!srcEl.isShown) {
      srcEl.isShown = true;
      clearInterval(this.addId);
    };
    var mousePoss = FindMouseXY(e);
    var d = get_by_id(srcEl.descId);
    d.style.top = (mousePoss.y+15)+"px";
    d.style.left = (mousePoss.x+15)+"px";
    d.style.display = '';
  }
};

Flipper.prototype.feed_kill_desc = function (e){
  var srcEl = get_srcEl(e);
  if(srcEl && srcEl.descId) {
    var d =  get_by_id(srcEl.descId);
    d.style.display = 'none';
    srcEl.isShown = false;
    var me = this;
    this.addId = setInterval(function(){me.addItem();},me.addInterval);
    d = null;
  }
  srcEl = null;
};

Flipper.prototype.load = function(arg) {
  var suffix = (new Date()).getTime();
  var uri = this.url + '?'+suffix;
  var me = this;
  var xConn = getXmlHttpObject();
  xConn.open('GET', uri, true);
  xConn.onreadystatechange = function() {
    if(xConn.readyState == 4) {
      me.addToQueue(xConn,arg);
      if(arg) me.fillUp();
    }
  };
  xConn.send(null);
};

Flipper.prototype.addToQueue = function(xConn,arg){
  if(xConn.responseXML && xConn.responseXML.documentElement){
    var root = get_by_tag('items',xConn.responseXML.documentElement)[0];
    if(root) {
      var items = root.childNodes;
      for(var i=0,l=items.length;i<l;i++)
	if(items[i].tagName)this.queue[this.queue.length] = this.buildItem(items[i]);
    }
  }
};

Flipper.prototype.buildIt = function(el){
  var title = el.getElementsByTagName('title')[0];
  title = title && title.firstChild?title.firstChild.nodeValue:'';
  var link = get_by_tag('link',el)[0];
  link = link && link.firstChild?link.firstChild.nodeValue:'';
  var desc = get_by_tag('description',el)[0];
  desc = desc && desc.firstChild?desc.firstChild.nodeValue:'';
  return make_el('A', {href:link, description: desc, innerHTML:title+' '});
};

Flipper.prototype.buildItem = function(el){
  var li = make_el('LI',{style:{clear:'both',overflow:'hidden'}});
  var arr = [];
  for(var i=0,l=el.childNodes.length; i<l;i++)
  if(el.childNodes[i].tagName) {
    var item = this.buildIt(el.childNodes[i]);

    if(el.childNodes[i].tagName == 'post')
      arr[0] = (make_el('SPAN',{appendChild:item,
	      className: 'flipper-post-title'}));

    else if(el.childNodes[i].tagName == 'domain')
      arr[1] = (make_el('SPAN',{appendChild:item,
	      className: 'flipper-board'}));

    else if(el.childNodes[i].tagName == 'user'){
      arr[2] = (make_el('SPAN',{appendChild:item,
	      className: 'flipper-author'}));
    }
  };
  for(var i=0,l=arr.length;i<l;i++)
  li.appendChild(arr[i]);
  return li;
};

Flipper.prototype.addItem = function(arg) {
  var item = this.queue.shift();
  if(!arg && this.queue.length <= 1) this.load(false);
  if(item) {
    var flipper = get_by_id(this.flipperId);
    this.numb++;
    item.className = (this.numb%2)?'row_even':'row_odd';
    if(flipper.childNodes.length > this.topCount-1)
      this.kill(flipper.lastChild,15);
    this.add(item,flipper);
  }

};
Flipper.prototype.fillUp = function() {
  clearInterval(this.addId);
  if(!get_by_id(this.flipperId).hasChildNodes()
     && this.queue.length<this.topCount)
    this.load(true);
  else {
  var l = (this.topCount>this.queue.length)?this.queue.length:this.topCount;
    for(var i=0;i<l;i++)
      this.addItem(true);
    var me = this;
    this.addId = setInterval(function(){me.addItem();},this.addInterval);
  }
};
Flipper.prototype.kill = function(item){
  if(!item) return;
  progress = 100;
  var fadeOut = function(){
    if(progress <= 0){
      clearInterval(interId);
      item.style.display = 'none';
      progress = 0;
      if ( item )
	remove_el(item);
      item = null;
    }
    else {
      progress -= 15;
      set_opacity(item,progress);
    }
  }
  var interId = setInterval(fadeOut,5);
};
Flipper.prototype.add = function(item,flipper){
  progress = 0;
  if(document.all && !window.opera)
  style_el(item,{position:'relative',width:'100%'});
  set_opacity(item,progress);
  if(flipper.firstChild)insert_before(item,flipper.firstChild);
  else flipper.appendChild(item);
  var interId = 0;
  var fadeIn = function() {
    if(progress >= 100){
      clearInterval(interId);
      set_opacity(item,100);
      item = null;
    }
    else {
      progress += 5;
      set_opacity(item,progress);
    }
  };
  interId = setInterval(fadeIn,5);
  flipper = null;
};
