
smashion.xui.Bookmark=Class.create();smashion.xui.Bookmark.prototype={initialize:function(element,url,id,type,options){this.element=$(element);this.url=url;this.id=id;this.type=type;this.options=Object.extend({addBookmarkText:"Add to Favorites",removeBookmarkText:"Remove from Favorites",summaryText:"Favorited by %1 users",showSummary:true,showZeroSummary:true,errorClass:null,onRemoveCallback:function(){},debugging:false,addBookmarkClass:"addtofavorite",removeBookmarkClass:"removefavorite",summaryClass:"favoritesCount",summaryOnlyClass:"favoritesCountStatic"},options||{});if(smashion&&smashion.common&&smashion.common.logging){this.logger=smashion.common.logging.getLog({logging:this.options.debugging});}else{this.logger=null;}
this.initElement();},initElement:function(){var req=new Ajax.Request(this.url,{method:"get",parameters:{"type":this.type,"id":this.id},onSuccess:this.initElementCallback.bind(this),onFailure:this.handleAjaxFailure.bind(this),onException:this.handleAjaxException.bind(this)});},initElementCallback:function(transport,json){if(!json||typeof json.status=="undefined"){this.debug("failed to get summary from server. "+Object.toJSON(json));}else{this.updateElement(json.body);}},updateElement:function(summary){var summaryText=this.formatSummaryText(summary);var txt;if(!globalLoginStatus()||!summary.canBookmark){if(this.options.showSummary&&(summary.total>0||this.options.showZeroSummary)){var favCount1=new Element("div",{"class":this.options.summaryOnlyClass});favCount1.innerHTML=summaryText;this.element.appendChild(favCount1);}
return;}
var a,action;if(summary.myBookmark){a=new Element("a",{href:"javascript:void(0)","class":this.options.removeBookmarkClass});a.innerHTML=this.options.removeBookmarkText;action="remove";}else{a=new Element("a",{href:"javascript:void(0)","class":this.options.addBookmarkClass});a.innerHTML=this.options.addBookmarkText;action="add";}
this.element.update(a);if(this.options.showSummary&&(summary.total>0||this.options.showZeroSummary)){var favCount2=new Element("div",{"class":this.options.summaryClass});favCount2.innerHTML="("+summaryText+")";this.element.appendChild(favCount2);}
Event.observe(a,"click",this.doBookmark.bindAsEventListener(this,action));},formatSummaryText:function(summary){var s=this.options.summaryText.replace("%1",summary.total);if(summary.total==1){s=s.replace(/times/g,"time");s=s.replace(/users/g,"user");}
return s;},doBookmark:function(event,action){this.action=action;var req=new Ajax.Request(this.url,{method:"post",parameters:{"type":this.type,"id":this.id,"action":action},onSuccess:this.doBookmarkCallback.bind(this),onFailure:this.handleAjaxFailure.bind(this),onException:this.handleAjaxException.bind(this)});if(event){Event.stop(event);}
return false;},doBookmarkCallback:function(transport,json){this.debug(json);if(!json||typeof json.status=="undefined"){this.handleError("Unable to process.  Please try later.");}else if(json.status=="SUCCESS"){this.updateElement(json.body);new Effect.Highlight(this.element.id);if(this.action=="remove"){this.options.onRemoveCallback();}}else{if(json.status=="NOT_LOGGED_IN"){this.handleError(json.message,false);}else{this.handleError("Unable to process.  Please try later.");}}},handleError:function(error,retry){this.element.update();var txt=document.createElement("span");if(this.options.errorClass){txt.addClassName(this.options.errorClass);}else{txt.style.color="red";}
txt.innerHTML=error;this.element.appendChild(txt);if(typeof retry=="undefined"||retry){setTimeout(this.initElement.bind(this),5000);}},handleAjaxFailure:function(transport,json){this.debug("AjaxFailure: service URL is "+this.url);this.debug("HTTP status code "+transport.status+" - "+transport.statusText);this.handleError("Server error.")},handleAjaxException:function(req,ex){this.debug("AjaxException with request "+req.url+"\n");if(ex)this.debug(ex);alert("Exception with request "+req.url+"\n"+ex);},debug:function(o){if(this.logger){this.logger.debug(o);}},dispose:function(){}}