// recensiewidget Bedrijfsuitje
// (c) 2011 By Zaphyrion B.V.
//

function ZPH_$(id) {
   return document.getElementById(id);
}

function ZPH_setStyles(elm,obj) {
   for(var i in obj) {
//       if(elm.style.hasOwnProperty(i)) {
      elm.style[i] = obj[i];
//       }
   }   
}

function ZPH_objAppend(obj1,obj2) {
   for(var i in obj2) {
      if(typeof(obj1[i])=='object') {
         ZPH_objAppend(obj1[i],obj2[i]);
      }else {
         obj1[i] = obj2[i];
      }
   }
   return obj1;
}
function ZPH_objToString(obj) {
   var str = '';
   for(var i in obj) {
      if(typeof(obj[i])=='object') {
         str += ZPH_objToString(obj[i]);
      }else {
         if(str!='') {
            str+=',';
         }
         str += '"'+i+'":';
         
         if(typeof(obj[i])=="string") {
            str += '"'+obj[i]+'"';
         }else {
            str += obj[i]
         }
      }
   }
   return '{'+str+'}';
}

var TimeToFade = 1000.0;

function ZPH_fade(eid, resize) {
   var element = document.getElementById(eid);
   if(element == null)
      return;
  
   if(element.getAttribute('orgHeight')==null) {
      element.setAttribute('orgHeight',parseInt(element.offsetHeight));
   }
   if(element.style.display!="" && element.style.display!=null && (element.getAttribute('orgDisplay')=="" || element.getAttribute('orgDisplay')==null)) {
      element.setAttribute('orgDisplay',element.style.display);
   }else if(element.getAttribute('orgDisplay')=="" || element.getAttribute('orgDisplay')==null) {
      element.setAttribute('orgDisplay',"block");
   }
   if(element.FadeState == null) {
      if(element.style.opacity == null 
        || element.style.opacity == '' 
        || element.style.opacity == '1') {
         element.FadeState = 2;
      }else {
         element.FadeState = -2;
      }
   }
    
   if(element.FadeState == 1 || element.FadeState == -1) {
      element.FadeState = element.FadeState == 1 ? -1 : 1;
      element.FadeTimeLeft = TimeToFade - element.FadeTimeLeft;
   }else {
     element.style.display = element.getAttribute('orgDisplay');
     element.FadeState = element.FadeState == 2 ? -1 : 1;
     element.FadeTimeLeft = TimeToFade;
     setTimeout("ZPH_animateFade(" + new Date().getTime() + ",'" + eid + "', "+resize+")", 33);
   }  
}
function ZPH_animateFade(lastTick, eid, resize) {  
   var curTick = new Date().getTime();
   var elapsedTicks = curTick - lastTick;
   var element = document.getElementById(eid);
   if(element != null) {
      if(element.FadeTimeLeft <= elapsedTicks) {
        element.style.opacity = element.FadeState == 1 ? '1' : '0';
        element.style.filter = 'alpha(opacity = ' 
           + (element.FadeState == 1 ? '100' : '0') + ')';
        element.style.height = ((element.FadeState == 1)?element.getAttribute('orgHeight'):'0')+'px';
        element.style.display = (element.FadeState == 1)?element.getAttribute('orgDisplay'):'none';
        element.FadeState = element.FadeState == 1 ? 2 : -2;
        element.style.filter=null;
        return;
      }
    
      element.FadeTimeLeft -= elapsedTicks;
      var newOpVal = element.FadeTimeLeft/TimeToFade;
      var newHeight = element.FadeState == -1 ? element.getAttribute('orgHeight') * newOpVal:element.getAttribute('orgHeight')-element.getAttribute('orgHeight') * newOpVal;
      if(element.FadeState == 1)
         newOpVal = 1 - newOpVal;
   
      element.style.opacity = newOpVal;
      element.style.filter = 'alpha(opacity = ' + (newOpVal*100) + ')';
      element.style.height = newHeight+'px';
     
      setTimeout("ZPH_animateFade(" + curTick + ",'" + eid + "')", 33);
   }
}

// Function overloading
// 
// var Function = this.Function;
// 
// var enumerables = true;
// for (var i in {toString: 1}) enumerables = null;
// if (enumerables) enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor'];
// 
// Function.prototype.overloadSetter = function(usePlural){
// 	var self = this;
// 	return function(a, b){
// 		if (a == null) return this;
// 		if (usePlural || typeof a != 'string'){
// 			for (var k in a) self.call(this, k, a[k]);
// 			if (enumerables) for (var i = enumerables.length; i--;){
// 				k = enumerables[i];
// 				if (a.hasOwnProperty(k)) self.call(this, k, a[k]);
// 			}
// 		} else {
// 			self.call(this, a, b);
// 		}
// 		return this;
// 	};
// };
// 
// Function.prototype.overloadGetter = function(usePlural){
// 	var self = this;
// 	return function(a){
// 		var args, result;
// 		if (usePlural || typeof a != 'string') args = a;
// 		else if (arguments.length > 1) args = arguments;
// 		if (args){
// 			result = {};
// 			for (var i = 0; i < args.length; i++) result[args[i]] = self.call(this, args[i]);
// 		} else {
// 			result = self.call(this, a);
// 		}
// 		return result;
// 	};
// };
// 
// Function.prototype.extend = function(key, value){
// 	this[key] = value;
// }.overloadSetter();
// 
// Function.prototype.implement = function(key, value){
// 	this.prototype[key] = value;
// }.overloadSetter();
// 
// Function.implement({
// 	attempt: function(args, bind){
// 		try {
// 			return this.apply(bind, Array.from(args));
// 		} catch (e){}
// 		
// 		return null;
// 	},
// 
// 	bind: function(bind){
// 		var self = this,
// 			args = (arguments.length > 1) ? Array.slice(arguments, 1) : null;
// 		
// 		return function(){
// 			if (!args && !arguments.length) return self.call(bind);
// 			if (args && arguments.length) return self.apply(bind, args.concat(Array.from(arguments)));
// 			return self.apply(bind, args || arguments);
// 		};
// 	},
// 
// 	pass: function(args, bind){
// 		var self = this;
// 		if (args != null) args = Array.from(args);
// 		return function(){
// 			return self.apply(bind, args || arguments);
// 		};
// 	},
// 
// 	delay: function(delay, bind, args){
// 		return setTimeout(this.pass(args, bind), delay);
// 	},
// 
// 	periodical: function(periodical, bind, args){
// 		return setInterval(this.pass(args, bind), periodical);
// 	}
// 
// });

var defaultOptions = {
   /* main window */
   'parentNode':'conWidget',
   'width':'500px',
   'height':'300px',
   'fadeEffect':true,
   'fadeInterval':5,
      
   /* titlebar */
   'showTitlebar':true,
   'showBullets':true,
   'showSeparationline':true,
   'titlebar': {
      'title': 'Recensies op Bedrijfsuitje.nl',
      'backgroundColor':'#000066',
      'color':'#FFFF00',
      'height':'15px'
   },
   
   /* content */
   'content': {
      'backgroundColor':'#DEDEDE',
      'color':'#555555',
      'limit':100,
      'readmore': {
         'color':'#000000'
      },
      'displayoptions':{
         'bedrijfsnaam':true,
         'auteurnaam':true,
         'datumuitje':true,
         'uitjelocatie':true,
         'aantalpersonen':true,
         'scoreprogramma':true,
         'scorebegeleiding':true,
         'scoreprijskwaliteit':true,
         'aanbeveling':true
      },
      'separationline':{
         'color': '#000066'
      }
   }
   
}

function ZPH_clone(obj) {
   var c = {};
   
   for(var i in obj) {
      var prop = obj[i];
      
      if(typeof prop == 'object') {
         c[i] = ZPH_clone(prop);
      }else {
         c[i] = prop;
      }
   }
   
   return c;
}

BUwidgetReviewsClass.prototype.instancecounter = 0;
BUwidgetReviewsClass.prototype.instances = Array();
BUwidgetReviewsClass.prototype.Listener = function(instancenr, serverresponse) {
   for(var i=0;i<BUwidgetReviewsClass.prototype.instances.length&&BUwidgetReviewsClass.prototype.instances[i].instancenr!=instancenr;i++) {
      ;
   }
   BUwidgetReviewsClass.prototype.instances[i].buildContent(serverresponse);

}
function BUwidgetReviewsClass(bedrijfsId, opt) {
   this.loaderImage = 'loader-black.gif';
   this.currentActive = 0;
   this.fadeInterval = null;
   this.Create = function(bedrijfsId, opt) {
      this.instancenr = BUwidgetReviewsClass.prototype.instancecounter++;
      BUwidgetReviewsClass.prototype.instances.push(this);
      
      this.bedrijfsId = bedrijfsId;
      if(typeof(arguments[0])=="undefined") {
         opt = defaultOptions;
      }
      var defOpt = ZPH_clone(defaultOptions);
      this.opt = ZPH_objAppend(defOpt, opt); 
      this.createHTML();
   
      this.loadData();
   }

   this.createHTML = function() {
      // Main Window
      //
      this.html = document.createElement('DIV');
      ZPH_$(this.opt.parentNode).appendChild(this.html);
      ZPH_setStyles(this.html, {
         'position':'relative',
         'width':this.opt.width,
         'height':this.opt.height
        /* 'overflow':'hidden'*/
      });
      this.html.id = 'BUwidgetReviews_'+this.instancenr
      this.html.className = 'BUwidgetReviews';
      
      // Titlebar
      //
      this.titlebar = document.createElement('DIV');
      if(this.opt.showTitlebar) {
         this.html.appendChild(this.titlebar);
         ZPH_setStyles(this.titlebar, {
            'position':'relative',
            'backgroundColor':this.opt.titlebar.backgroundColor,
            'color':this.opt.titlebar.color,
            'width':this.opt.width,
            'lineHeight':this.opt.titlebar.height,
            'height':this.opt.titlebar.height,
            'overflow':'hidden',
            'fontSize':parseInt(this.opt.titlebar.height)-2+'px'
         });
         this.setTitle('<p style="padding:0px 10px;margin:0px;">'+this.opt.titlebar.title+'</p>');
      }
      this.titlebar.className = 'titlebar';
      
      // Content
      //
      this.content = document.createElement('DIV');
      this.html.appendChild(this.content);
      ZPH_setStyles(this.content, {
         'position':'relative',
         'backgroundColor':this.opt.content.backgroundColor,
         'color':this.opt.content.color,
         'width':this.opt.width,
         'height':parseInt(this.opt.height)-parseInt(this.titlebar.style.height)+'px',
         'overflow':'auto'
      });
      this.content.className = 'content';
      this.setContent('<p style="padding:10px;">Een ogenblik geduld a.u.b. de recensies worden geladen...<p>');
      var r = parseInt(this.opt.content.backgroundColor.substr(1,2),16);
      var g = parseInt(this.opt.content.backgroundColor.substr(3,2),16);
      var b = parseInt(this.opt.content.backgroundColor.substr(5,2),16);
      if((r+g+b)/3 > 170) {
         this.loaderImage = 'loader-black.gif';
      }else {
         this.loaderImage = 'loader-white.gif';
      }
      
      // Busyimage = image that is shown while loading data
      //
      this.busyimage = document.createElement('img');
      this.busyimage.src = 'http://www.bedrijfsuitje.nl/js/buwidgets/'+this.loaderImage;
      ZPH_setStyles(this.busyimage, {
         'position':'absolute',
         'left':'10px',
         'top':'10px',
         'display':'none'
      });
      this.content.appendChild(this.busyimage);
      
   }

   this.setTitle = function(title) {
      this.titlebar.innerHTML = title;
   }

   this.setContent = function(content) {
      this.content.innerHTML = content;
   }

   this.loadData = function() {
      if(!this.loading) {
         this.loading = true;
         this.busyimage.style['display']='block';
         this.script = document.createElement('script');
         this.html.appendChild(this.script);
         this.script.src='http://www.bedrijfsuitje.nl/rss/recensies/bedrijf/'+this.bedrijfsId+'/json?instancenr='+this.instancenr+'&callback=BUwidgetReviewsClass.prototype.Listener&limit='+this.opt.content.limit+'&displayitems='+ZPH_objToString(this.opt.content.displayoptions);
      }
   }

   this.Remove = function() {
      ZPH_$(this.opt.parentNode).removeChild(this.html);
      if(this.fadeInterval) {
         window.clearInterval(this.fadeInterval);
      }
   }

   this.buildContent = function(serverresponse) {
      this.busyimage.style['display']='none';
      this.loading = false;
      this.ul = document.createElement('ul');
      this.setContent('');
      this.content.appendChild(this.ul);
      this.items = Array();  
      
      ZPH_setStyles(this.ul, {
         'marginLeft':'10px',
         'marginRight':'10px'
      });
      if(!this.opt.showBullets){
         ZPH_setStyles(this.ul, {
            'padding':'10px',
            'paddingLeft':'10px',
            'paddingRight':'10px'
         });
      }else {
         ZPH_setStyles(this.ul, {
            'padding':'5px 20px'
         });      
      }

      for(var i=0;i<serverresponse.length;i++) {
         var li = document.createElement('li');
         
         ZPH_setStyles(li, {
            'marginBottom':'10px',
            'listStyleType':(this.opt.showBullets)?'disc':'none',
            'borderBottom':(this.opt.showSeparationline)?'1px solid '+this.opt.content.separationline.color:'0px',
            'paddingBottom':(this.opt.showSeparationline)?'15px':'0px',
            'display':'list-item'
         });
         if(this.opt.fadeEffect) {
            li.setAttribute('orgDisplay','list-item');
            li.setAttribute('orgHeight',parseInt(this.content.offsetHeight)-20);
            ZPH_setStyles(li, {
               'display':'none',
               'listStyleType':'none',
               'marginBottom':'0px',
               'paddingBottom':'0px',
               'position':'absolute',
               'left':'10px',
               'top':'10px',
               'width': (this.ul.offsetWidth - parseInt(this.ul.style.paddingLeft) - parseInt(this.ul.style.paddingRight)) + 'px'
            });
            li.FadeState = -2; // faded
         }
         this.ul.appendChild(li);
         li.innerHTML = '';
         li.id = 'reviewmarker_'+this.instancenr+'_'+i;
         var spReview = document.createElement('span');
         ZPH_setStyles(spReview,{'fontWeight':'bold'});
         spReview.innerHTML = "Recensie";
         li.appendChild(spReview);

         if(this.opt.content.displayoptions['auteurnaam']) {
            var spName = document.createElement('span');
            ZPH_setStyles(spName,{'fontWeight':'bold'});
            spName.innerHTML = '&nbsp;van '+serverresponse[i].name;
            li.appendChild(spName);
         }
         
         if(this.opt.content.displayoptions['bedrijfsnaam']) {
            var spBedrijfsnaam = document.createElement('span');
            spBedrijfsnaam.innerHTML = '&nbsp;van '+serverresponse[i].organisation;
            ZPH_setStyles(spBedrijfsnaam,{'fontWeight':'bold'});
            li.appendChild(spBedrijfsnaam);
         }
         
         if(this.opt.content.displayoptions['aantalpersonen']) {
            var spPersonen = document.createElement('span');
            spPersonen.innerHTML += '&nbsp;('+serverresponse[i].persons+' personen)';
            ZPH_setStyles(spPersonen,{'fontWeight':'bold'});
            li.appendChild(spPersonen);
         }
         
         if(this.opt.content.displayoptions['datumuitje']) {
            var spDatum = document.createElement('span');
            spDatum.innerHTML = '&nbsp;op '+serverresponse[i].dateevent;
            ZPH_setStyles(spDatum,{'fontWeight':'bold'});
            li.appendChild(spDatum);
         }
         
         if(this.opt.content.displayoptions['uitjelocatie']) {
            var spLocatie = document.createElement('span');
            spLocatie.innerHTML += '&nbsp;in '+serverresponse[i].location;
            ZPH_setStyles(spLocatie,{'fontWeight':'bold'});
            li.appendChild(spLocatie);
         }
         
         var spRecensieWaardering = document.createElement('span');
         spRecensieWaardering.innerHTML = ":";
         li.appendChild(spRecensieWaardering);

         var spCijfer = document.createElement('span');
         spCijfer.innerHTML = '&nbsp;Waardering: '+serverresponse[i].scoreoverall;
         ZPH_setStyles(spCijfer,{'fontWeight':'bold'});
         li.appendChild(spCijfer);

         if(this.opt.content.displayoptions['scoreprogramma']) {
            spCijfer.innerHTML += '&nbsp;- programma: '+serverresponse[i].scoreprogram;
         }
         if(this.opt.content.displayoptions['scorebegeleiding']) {
            spCijfer.innerHTML += '&nbsp;- begeleiding: '+serverresponse[i].scoreguide;
         }
         if(this.opt.content.displayoptions['scoreprijskwaliteit']) {
            spCijfer.innerHTML += '&nbsp;- prijs/kwaliteit: '+serverresponse[i].scoreprice;
         }
         li.innerHTML += '.';
         var br = document.createElement('br');
         li.appendChild(br);

         var spText = document.createElement('span');
         spText.innerHTML = serverresponse[i].text+' ';
         var aLeesMeer = document.createElement('a');
         aLeesMeer.href = 'http://www.bedrijfsuitje.nl/recensie/'+serverresponse[i].ID+'?ID_uitje='+serverresponse[i].ID_uitje;
         aLeesMeer.innerHTML = '[Lees meer...]';
         aLeesMeer.target = 'bedrijfsuitje';
         ZPH_setStyles(aLeesMeer, {'color':this.opt.content.readmore.color});
         spText.appendChild(aLeesMeer);
         li.appendChild(spText);
         
         if(this.opt.content.displayoptions['aanbeveling']) {
            imgAanbeveling = document.createElement('img');
            ZPH_setStyles(imgAanbeveling,{'position':'absolute','marginLeft':'5px'});
            if(serverresponse[i].recommend=="Ja") {
               if(this.opt.content.displayoptions['auteurnaam']) {
                  imgAanbeveling.title = serverresponse[i].name+' beveelt dit uitje aan.';;
               }else if(this.opt.content.displayoptions['bedrijfsnaam']) {
                  imgAanbeveling.title = serverresponse[i].organisiation+' beveelt dit uitje aan.';
               }else {
                  imgAanbeveling.title = 'De schrijver beveelt dit uitje aan.';
               }
            } else {
               if(this.opt.content.displayoptions['auteurnaam']) {
                  imgAanbeveling.title = serverresponse[i].name+' beveelt dit uitje niet aan.';;
               }else if(this.opt.content.displayoptions['bedrijfsnaam']) {
                  imgAanbeveling.title = serverresponse[i].organisiation+' beveelt dit uitje niet aan.';
               }else {
                  imgAanbeveling.title = 'De schrijver beveelt dit uitje niet aan.';
               }
            }
            imgAanbeveling.src = 'http://www.bedrijfsuitje.nl/images/thumbs'+((serverresponse[i].recommend=="Ja")?'up':'down')+'.png';
            li.appendChild(imgAanbeveling);
         }
         this.items.push(li);
      }
   
      if(this.opt.fadeEffect) {
         this.fadeInterval = window.setInterval('BUwidgetReviewsClass.prototype.instances['+this.instancenr+'].displayNext()', (this.opt.fadeInterval*1000));
         BUwidgetReviewsClass.prototype.instances[this.instancenr].displayNext(); // de eerste al direct tonen
      }
   }
   
   this.displayNext = function() {
//       console.log("reviewmarker_"+this.instancenr+"_"+this.currentActive)
      if(typeof(ZPH_$("reviewmarker_"+this.instancenr+"_"+this.currentActive))=="undefined") {
         window.clearInterval(this.fadeInterval);
      }else {
         if(ZPH_$("reviewmarker_"+this.instancenr+"_"+this.currentActive).FadeState==2) {
            ZPH_fade("reviewmarker_"+this.instancenr+"_"+this.currentActive,true); // fadeout the current
         }
         this.currentActive++;
         if(this.currentActive >= this.items.length) {
            this.currentActive = 0;
         } 
         ZPH_fade("reviewmarker_"+this.instancenr+"_"+this.currentActive,true); // fadein the new
      }
//       console.log("reviewmarker_"+this.instancenr+"_"+this.currentActive)
//       console.log("---")
   }
   
   // Call constructor
   //
   this.Create(bedrijfsId, opt);
};

var BUwidgetReviews = ''

