dojo.provide("bl.voodoo");
dojo.require("dojo.html.*");
dojo.require("dojo.event.*");
dojo.require("dojo.io.*");
dojo.require("dojo.io.BrowserIO");
dojo.require("dojo.debug");
dojo.require("dojo.lfx.*");
dojo.require("dojo.lang.*");
dojo.require("dojo.string.*");



dojo.addOnLoad(function(){
	var divSet = dojo.html.getElementsByClass("bl_voodoopanel");
   dojo.lang.forEach(divSet, function(element){
	bl.voodoo.addDiv(element);
	});
 
   if(bl.voodoo.panelArray.length > 0)
      setTimeout(dojo.lang.hitch(bl.voodoo, "doIdle"), 1000);
});



function voodoo_enc(s)
{
    return (typeof encodeURIComponent != "undefined") ? encodeURIComponent(s) : escape(s);
}

dojo.declare("bl.VoodooPanel", null, 
	function(el) {
    this.cols = parseInt(el.getAttribute("bl:voodoocols"));
    this.rows = parseInt(el.getAttribute("bl:voodoorows"));
    this.cellData = [];
    this.infoQueue = [];
    this.cellIndex = 0;
    this.hotIndex = -1;
    this.el = el;
    this.in_hover = false;
    this.in_disclaimer = true;
    this.in_preview = false;
    this.is_downloadingInfo = true;
    this.is_downloadingImg = false;
    this.in_errorstate = false;
    
     var date = new Date();
     this.cachebuster = date.getTime();
     
	 dojo.io.bind(   { url: (bl_voodoo_cgiprefix + "/streamdata"),
	 	load: dojo.lang.hitch(this, "handleInitialLoad"),
	 	error: dojo.lang.hitch(this, "handleImageDataError"),
	   mimetype: "text/json"
	 });
},
 {
  handleInitialReload: function(){
	  dojo.io.bind(   { url: (bl_voodoo_cgiprefix + "/streamdata"),
	 		load: dojo.lang.hitch(this, "handleInitialLoad"),
	 		error: dojo.lang.hitch(this, "handleImageDataError"),
		   mimetype: "text/json"
 		});
  },
  getWhatsupURL: function(id){
     var img = dojo.byId("ImpressionTracker");
     var url = img.src;
     var oldstring = "&aid=" + bl_voodoo_wzid;
     var date = new Date();
     url = url.replace(oldstring, "&aid=" + id);
     bl_voodoo_wzid = id;
     var i = url.indexOf("&ord=");
     var j = url.indexOf("&", i + 1);
     var oldord = url.substring(i,j);
     var neword = "&ord="+date.getTime();
     url = url.replace(oldord, neword);
     return url;
  },
  doWhatsup: function(id){
    dojo.byId("ImpressionTracker").src = this.getWhatsupURL(id);
     
  },
  handleDisclaimer: function(){
    var box = dojo.byId('bl_disclaimerdiv');
    box.style.zindex = -1;
    box.innerHTML = "";
    this.in_disclaimer = false;
    dojo.lfx.html.fadeOut(box, 200, dojo.lfx.easeOut, dojo.lang.hitch(this, "doInitialWall") ).play();
	 this.doWhatsup(43753);
  },
  doInitialWall: function(){
    var table = dojo.byId(this.el.id + ".table");
    var hoover = dojo.byId("bl_voodoohover");
    dojo.html.toggleVisibility(dojo.byId('bl_disclaimerdiv'));
    dojo.html.setOpacity(table, 0);
    dojo.html.setOpacity(hoover, 0);
    dojo.html.toggleVisibility(table);
    dojo.html.setVisibility(hoover, "visible");
   
    var idArray = [];
    var elid = this.el.id;
    var elsize = this.rows * this.cols;
    for(var i = 0; i < elsize; i++){
		idArray.push(elid + "." + i);
    }
    dojo.event.connect(dojo.html.body(), "onmouseover", this, "windowmousemove");
    dojo.lfx.html.fadeIn(dojo.byId(this.el.id + ".table"), 200 ).play();
  },
  windowmousemove: function(evt){
   if(this.in_disclaimer)
     return;
  	var overHover = dojo.html.overElement("bl_voodoohover", evt);
   if(overHover)
    return;  	  
  	var overTable = (evt.target.id.split('.')[0] == ("img" + this.el.id));
  	if(overTable){
  	  if(this.in_hover && this.currHover == evt.target){
  	    return;
  	  }
  	  if(this.in_hover)
  	  	this.hideBox();
  	  if(evt.target.id.split('.')[0] == ("img" + this.el.id))
  		 this.showBox(evt.target);
  	}  
  	if(!overHover && !overTable){
  	 this.hideBox();
  	}
  },
  handleInitialLoad: function(type, data, evt) {

    if(data == null || data.images == null){
 		setTimeout(dojo.lang.hitch(this,"handleInitialReload"), 5000);
      return;
    }
    this.infoQueue = data.images;
    var el = this.el;
    var elid = el.id;
    var sb = new dojo.string.Builder();
    sb.append('<div id="bl_voodoohover"></div>');
    sb.append('<div id="bl_disclaimerdiv"><table id="');
    sb.append(elid);
    sb.append('.disclaimer" class="bl_voodoodisclaimer"><tr><td><p>');
    sb.append(bl_voodoo_disclaimer);
    sb.append('</p><button id="bl_disclaimer_button">');
    sb.append(bl_voodoo_disbutton);
    sb.append('</button></td></tr></table></div>');
    sb.append('<table id="');
    sb.append(elid);
    sb.append('.table" class="bl_voodootable">');
    var i = 0;
    for(var x = 0; x < this.rows; x++){
     sb.append('<tr>');
     for(var y = 0; y < this.cols; y++){
       var idstring = "img"+elid + "." + (i);
   	 var data = this.infoQueue.shift();
	  	 sb.append('<td><div class="bl_voodoocell"><img id="');
       sb.append(idstring);

 	    this.cellData[(i++)] = data;
	    sb.append('"src="');
	    sb.append(bl_voodoo_cgiprefix);
	    sb.append("/streamimage?id=");
	    sb.append(data.imageId);
	    sb.append('&buster=');
	    sb.append(this.cachebuster++);
	    sb.append('&zoom=1" border="0" width="120" height="120"><div class="bl_voodootitlebox" /><p class="bl_voodootitle" id="');
	    sb.append(idstring);
	    sb.append('.title">'); 
	    sb.append('<img class="bl_voodooicon" src="');
    	 sb.append('/icon/');
   	 sb.append(data.siteId);
       sb.append('">');
       sb.append(dojo.string.summary(unescape(data.siteName), 10));
       sb.append('</p></div></td>');
	  }
	  sb.append("</tr>");
	 }
	 sb.append("</table>");
	 sb.append('<p class="bl_learnmore" style="width: ');
	 sb.append(this.cols * 120);
	 sb.append('px;" ><a  href="/about/news#132">');
	 sb.append(bl_voodoo_learnmore);
	 sb.append('</a></p>');
	 
	 el.innerHTML = sb.toString();
	 this.is_downloadingInfo = false;
	 dojo.event.connect(dojo.byId("bl_disclaimer_button"), "onclick", this, "handleDisclaimer");
},
handleErrorReport: function(evt){
    dojo.byId("bl_voodooreport").innerHTML = bl_voodoo_reportack;
    dojo.io.bind(   { url: (this.errorReportURL),
	 	load: function(){},
	 	error: function(){}
	 });
    evt.preventDefault();
    evt.stopPropagation();
},
handlePreviewHover: function(evt){
   if(this.in_disclaimer)
     return;
   this.in_preview = true;
},
hideBox: function(){
    var box = dojo.byId('bl_voodoohover');
    box.style.zindex = -1;
    box.style.width = "0px";
    box.style.height = "0px";
    box.innerHTML = "";
    this.currHover = null;
    this.hotIndex = -1;
    this.inhover = false;
    dojo.lfx.html.fadeOut(box, 200).play();  
 
},
moveBox:  function(){
    if(this.hotIndex < 0)
             return;

    var box = dojo.byId('bl_voodoohover');
    var data = this.cellData[this.hotIndex];
    var tablePos = dojo.html.getAbsolutePosition(this.el);
    var sb = new dojo.string.Builder();
    var newleft = this.boxPos.x - tablePos.x;
    var newtop = this.boxPos.y - tablePos.y + 180 - ((data.height + 60) / 2);
    box.style.left = newleft + "px";
    box.style.top = newtop + "px";
    box.style.position = "absolute";
    sb.append('<p class="bl_voodoopreviewreport" id="bl_voodooreport">');
    sb.append('<a id="bl_reporterror" href="#reporterror">');
    sb.append(bl_voodoo_reporterrorlabel);
 //   sb.append('</p>');
    sb.append('</a></p>');
    sb.append('<a href="');
    sb.append(bl_voodoo_previewlink);
    sb.append(unescape(data.siteURL));
    sb.append('" class="bl_voodoopreviewlink">');
    sb.append('<img src="');
    sb.append(bl_voodoo_cgiprefix);
    sb.append('/streamimage?id=');
    sb.append(data.imageId);
    sb.append('&buster=');
    sb.append(this.cachebuster++);
    sb.append('" height="');
    sb.append(data.height);
    sb.append('" width="');
    sb.append(data.width);
    sb.append('" class="bl_voodoopreviewimage">');
	 sb.append('<br />');
    sb.append('<p class="bl_voodoopreviewtitle">');
    sb.append('<img class="bl_voodoopreviewicon" src="');
    sb.append('/icon/');
    sb.append(data.siteId);
    sb.append('">');
    sb.append(dojo.string.summary(unescape(data.siteName), 32));
    
    sb.append('</p><img src="');
    sb.append(this.getWhatsupURL(43755));
    sb.append('" border="0"></a>');
    this.errorReportURL = "/imagestreamreporterrror?siteid=" + data.siteId;
    box.innerHTML = sb.toString();
    box.style.height = (data.height + 60) + "px";
    box.style.width = "248px";
    dojo.event.connect(dojo.byId("bl_reporterror"), "onclick", this, "handleErrorReport");
    setTimeout(dojo.lang.hitch(this, "doShowBox"), 200);
},
doShowBox: function(){
    dojo.lfx.html.fadeIn(dojo.byId('bl_voodoohover'), 100 ).play();
    this.in_hover = false;
  
},
doDeferShowBox: function(){
     if(this.in_hover){
       setTimeout(dojo.lang.hitch(this, "doDeferShowBox"), 100);
	    return;
     }
    this.showBox(this.deferEl);
},
showBox:  function(el){
   if(this.currHover != el){
		var box = dojo.byId('bl_voodoohover');
      this.hotIndex = parseInt(el.id.split('.')[1]);
      this.in_hover = true;
	   var data = this.cellData[this.hotIndex];
	   if(data != null){
	     box.style.zindex = 100;
	     this.boxPos = dojo.html.getAbsolutePosition(el);
        this.currHover = el;
 		  dojo.lfx.html.fadeOut(box, 100, dojo.lfx.easeOut, dojo.lang.hitch(this, "moveBox")).play();     
      }
   }
},
handleImageDataError: function(type, error){
    this.in_errorstate = true;
    this.is_downloadingInfo = false;
    this.el.innerHTML="<p>There has been a communication error with the server.  Please try later.</p>";
    this.infoQueue = new Array();
},
handleImageData: function(type, data, evt){
    if(data != null && data.images != null){
   	 this.infoQueue = data.images;
     	 this.handleImageDL();
     	 this.is_downloadingInfo = false;
    }
},
handleImageDL: function(){
    var array = [];
    this.is_downloadingImg = true;
    array.push(dojo.byId("img" + this.el.id + "." + this.cellIndex + ".title"));
    array.push(dojo.byId("img" + this.el.id + "." + this.cellIndex));
    dojo.lfx.html.fadeOut(array, 200, dojo.lfx.easeOut, dojo.lang.hitch(this, "handleImageLoad")).play();
},
handleImageOut : function() {
    var array = [];
    array.push(dojo.byId("img" + this.el.id + "." + this.cellIndex + ".title"));
    array.push(dojo.byId("img" + this.el.id + "." + this.cellIndex));
    dojo.lfx.html.fadeIn(array, 200).play();
    this.cellIndex++;
    if(this.cellIndex >= this.rows * this.cols)
      this.cellIndex = 0;
    this.is_downloadingImg = false;
},
handleImageLoad : function() {
    var data = this.infoQueue.shift();
    this.cellData[this.cellIndex] = data;
    var node = dojo.byId("img" + this.el.id + "." + this.cellIndex);
    node.src = bl_voodoo_cgiprefix + "/streamimage?id=" + data.imageId + "&zoom=1" + "&buster=" + (this.cachebuster++);
     var sb = new dojo.string.Builder();
    sb.append('<img class="bl_voodooicon" src="');
    sb.append('http://www.bloglines.com');
    sb.append('/icon/');
    sb.append(data.siteId);
    sb.append('">');
    sb.append(dojo.string.summary(unescape(data.siteName), 10));
    dojo.byId("img"+this.el.id + "." + this.cellIndex + ".title").innerHTML = sb.toString();
    setTimeout(dojo.lang.hitch(this, "handleImageOut"), 500);
},
doIdle : function(){
    if(this.in_errorstate || this.is_downloadingInfo || this.is_downloadingImg || this.in_disclaimer)
       return;

    if(this.infoQueue.length == 0){
        this.is_downloadingInfo = true;
        dojo.io.bind(   { url: (bl_voodoo_cgiprefix + "/streamdata"),
    		 load: dojo.lang.hitch(this, "handleImageData"),
    		 error: dojo.lang.hitch(this, "handleImageDataError"),
   		 mimetype: "text/json"
    	  });
    }
    else {
        this.handleImageDL();
    }
}
})

bl.voodoo.addDiv = function(el) {
    if(this.panelArray == null)
       this.panelArray = new Array();
     
    this.panelIndex = 0;
      this.panelArray.push(new bl.VoodooPanel(el));
}

bl.voodoo.doIdle = function(){
   if(this.panelArray != null){
	   this.panelIndex++;
	   if(this.panelIndex == this.panelArray.length)
	     this.panelIndex = 0;
  	   this.panelArray[this.panelIndex].doIdle();
   }
   setTimeout(dojo.lang.hitch(this, "doIdle"), 1000);
}
