
var SK__PageRating={};SK__PageRating.Base=new Class({options:{},control:null,view:'',columns_map:{},ST_RATED:1,ST_NOT_RATED:2,initialize:function(options,view){this.options=options;this.view=view;for(var i=0;i<this.options.configuration.columns.length;i++){var column=this.options.configuration.columns[i];this.columns_map[column.name]=column;}},displayControl:function(){this.setPageID(SK.Singletons.env.get('page_node_id'));this.setState(this.ST_NOT_RATED);this.initializeRatingControl();if(this.hasAlreadyRatedThePage()){this.setState(this.ST_RATED);this.displayMyRating();}else{this.displayPublicRating();}},setPageID:function(page_id){this.page_id=page_id;},isAdminView:function(){return this.view=='admin';},isUserView:function(){return this.view=='user';},setState:function(state){this.initial_state=state;},getState:function(){return this.initial_state;},initializeRatingControl:function(){var control=new Element('div',{"class":"page-rating-control",events:{'mouseenter':function(){this.addClass('control-over');},'mouseleave':function(){this.removeClass('control-over');}}});control.inject($(document.body));this.control=control;},getMyStoredRating:function(){var stored_rating=Cookie.read(this.generateCookieName(this.page_id));if(stored_rating=="")return 0;return parseInt(stored_rating);},setMyStoredRating:function(rating){Cookie.write(this.generateCookieName(this.page_id),rating,{duration:365,path:'/'});},resetMyStoredRating:function(page_ids){for(var i=0;i<page_ids.length;i++){Cookie.write(this.generateCookieName(page_ids[i]),'',{duration:365,path:'/'});}},generateCookieName:function(page_id){return'SK__MyPageRating_'+page_id;},hasAlreadyRatedThePage:function(){var rating=this.getMyStoredRating();return rating>0;},setControlView:function(view){this.control.addClass(view);},setControlMode:function(mode){var last_mode=this.control.retrieve('last_mode');if(last_mode!='')this.control.removeClass(last_mode);this.control.store('last_mode',mode);this.control.addClass(mode);},displayMyRating:function(){this.setControlMode('my-rating');this.setControlView(this.view);this.displayRating(this.getMyStoredRating());},displayPublicRating:function(){this.setControlMode('public-rating');this.setControlView(this.view);this.getRatingFromDB(this.page_id,function(rating_record){rating_record=rating_record==null?null:rating_record.cells;var avg_rating=this.calculateAverageRating(rating_record);this.displayRating(this.ratingToStars(avg_rating));}.bind(this));},calculateAverageRating:function(rating_record){if(rating_record==null){return 0;}
var total_rating=parseInt(rating_record.TotalRating);var num_votes=parseInt(rating_record.NumVotes);if(isNaN(num_votes)||num_votes==0)return 0;return 100.0*total_rating/(5*num_votes);},ratingToStars:function(avg_rating){return Math.round(avg_rating/20.0);},displayRating:function(stars_rating){var template=$$('.page-rating-template')[0].get('text');this.control.set('html',template.substitute({rating:stars_rating}));var stars_placeholder=this.control.getElements('.page-rating-stars');if(this.isAdminView()){var caption=this.control.getElements('.page-rating-caption');caption.addEvent('click',this.openStatistics.bind(this));}
var stars=this.control.getElements('.page-rating-star');for(var i=0;i<stars.length;i++){var star=stars[i];var classes=star.className.split(' ');var star_num=0;for(var j=0;j<classes.length;j++){if(classes[j].indexOf("page-rating-star-")==0){star_num=parseInt(classes[j].substring(classes[j].lastIndexOf("-")+1));}}
star.addEvent('click',function(){this.mgr.storeDBRating(this.rating);this.mgr.setMyStoredRating(this.rating);this.mgr.displayMyRating();}.bind({mgr:this,rating:star_num}));}},storeDBRating:function(rating){this.getRatingFromDB(this.page_id,function(rating_record){if(rating_record==null){var cells={};cells[this.getColumnID('PageID')]=this.page_id;cells[this.getColumnID('TotalRating')]=rating;cells[this.getColumnID('NumVotes')]=1;new SK.DB(this.options.configuration.token).addRecordByIDs(this.options.configuration.db_id,this.options.configuration.columns,cells,$empty,function(message){if(this.isAdminView()){this.error("Failed storing your vote in the database");}}.bind(this));}else{var my_rating=this.getMyStoredRating();var re_rating=this.getState()==this.ST_RATED;var old_total_rating=parseInt(rating_record.cells.TotalRating);var old_num_votes=parseInt(rating_record.cells.NumVotes);if(isNaN(old_total_rating))old_total_rating=0;if(isNaN(old_num_votes))old_num_votes=0;var new_total_rating=re_rating?old_total_rating-my_rating+rating:old_total_rating+rating;var new_num_votes=re_rating&&old_num_votes>0?old_num_votes:old_num_votes+1;var cells={};cells[this.getColumnID('TotalRating')]=new_total_rating;cells[this.getColumnID('NumVotes')]=new_num_votes;new SK.DB(this.options.configuration.token).updateRecordByIDs(rating_record.row_id,this.options.configuration.columns,cells,$empty,function(message){this.error("Failed storing your vote in the database");}.bind(this));}
this.setState(this.ST_RATED);}.bind(this));},resetDBRating:function(page_ids,callback){var config=this.options.configuration;new SK.DB(config.token,{encoding:SK.Util.getEncoding()}).getRecordsByIDs(config.db_id,config.columns,{where:[[this.getColumnID('PageID'),'=',page_ids]]},function(columns_meta,records,num_records){if(num_records==0){this.callback();}else{this.mgr.resetRatingRecords(columns_meta,records,this.callback);}}.bind({mgr:this,callback:callback}),function(message){this.error("Application was probably not configured correctly. Reinstall it or contact the author. Error: "+message);}.bind(this));},resetRatingRecords:function(columns,records,callback){var cells=[];var columns_map={};for(var i=0;i<columns.length;i++){columns_map[columns[i].name]=columns[i];}
for(var i=0;i<records.length;i++){for(var col_name in records[i].cells){if(col_name=='PageID')continue;cells.push({col_id:columns_map[col_name].id,row_id:records[i].row_id,value:''});}}
new SK.DB(this.options.configuration.token,{encoding:SK.Util.getEncoding()}).updateCellsByIDs(this.options.configuration.db_id,this.options.configuration.columns,cells,function(columns_meta,cells){this.callback(cells);}.bind({callback:callback}),function(message){this.error("Application not configured correctly. Reinstall it or contact the author. Error: "+message);}.bind(this));},getRatingFromDB:function(page_id,callback){var config=this.options.configuration;new SK.DB(config.token,{encoding:SK.Util.getEncoding()}).getRecordsByIDs(config.db_id,config.columns,{where:[[this.getColumnID('PageID'),'=',[this.page_id]]]},function(columns_meta,records,num_records){this.callback(records.length==0?null:records[0]);}.bind({mgr:this,callback:callback}),function(message){if(this.isAdminView()){this.error("Application not configured correctly. Reinstall it or contact the author. Error: "+message);}}.bind(this));},openStatistics:function(){new SK.Window({content_url:'/Apps/PageRating/statistics.htm?options='+escape(JSON.encode(this.options)),title:'Statistics',width:700,height:500,show_progress:true,auto_hide_progress:true,closable:true,toolbar:true}).display();},displayStatistics:function(){this.appPopupInstance=new SK.App.Popup();this.appPopupInstance.initToolbarManager();this.appPopupInstance.createToolbarButton({caption:'Close',callback:function(){new SK.App.Popup().close();}});this.loadPagesStatistics();},loadPagesStatistics:function(){this.getPages(this.getPagesStatistics.bind(this));},getPages:function(callback){new SK.API(this.options.session_id,{encoding:new SK.App.Popup().getEncoding()}).execute('object.page.get_all',{user_id:this.options.user_id},function(success,message,data){if(!success){alert(message);}else{this.callback(data.pages);}}.bind({callback:callback}));},getPagesStatistics:function(pages){var pages=pages.links.map(function(link){return{node_id:link.node_id,name:link.name};});new SK.DB(this.options.configuration.token).getRecordsByIDs(this.options.configuration.db_id,this.options.configuration.columns,{where:[[this.getColumnID('PageID'),'=',pages.map(function(e){return e.node_id;})]]},function(columns_meta,records,num_records){var page_statistics={};for(var i=0;i<num_records;i++){page_statistics[records[i].cells.PageID]=records[i].cells;}
for(var i=0;i<this.pages.length;i++){this.pages[i].statistics=typeof page_statistics[this.pages[i].node_id]=='undefined'?null:page_statistics[this.pages[i].node_id];}
this.pages=this.pages.filter(function(page){return!(page.statistics==null||page.statistics.NumVotes==0);});this.mgr.displayPagesStatistics(this.pages);}.bind({mgr:this,pages:pages}),function(message){alert(message);}.bind(this));},displayPagesStatistics:function(pages){pages.each(function(page){page.rating=page.statistics==null?0:this.ratingToStars(this.calculateAverageRating(page.statistics));page.num_votes=page.statistics==null?0:page.statistics.NumVotes;},this);var criteria=$pick(this.last_sort_criteria,'rating');var order=$pick(this.last_sort_order,'desc');pages=this.sortBy(pages,criteria,order);this.displaySortedPagesStatistics(pages);},sortBy:function(pages,criteria,order){var comparison_indicator=order=='desc'?1:-1;pages=$A(pages);pages=pages.sort(function(a,b){return a[criteria]<b[criteria]?comparison_indicator:a[criteria]>b[criteria]?-1*comparison_indicator:0;}.bind({criteria:criteria,comparison_indicator:comparison_indicator}));return pages;},displaySortedPagesStatistics:function(pages){$('statistics').getElements('.stats-tr').dispose();$('statistics').store('pages',pages);if(pages.length==0){$$('#statistics tbody')[0].grab(new Element('tr').grab(new Element('td',{colspan:4,height:100,align:'center',valign:'center',html:'No pages have been rated.'})));}
pages.each(function(page,index){var reset_button=new Element('a',{text:'Reset',href:'javascript:void(null)',events:{click:function(){new SK.UI.ConfirmBox('Are you sure you want to reset the votes for this page?',function(){this.mgr.resetPageStatistics(this.page_id,this.mgr.refreshPagesStatistics.bind(this.mgr));}.bind({mgr:this.mgr,page_id:this.page_id}),$empty,{width:350,height:200,modal_color:'#ffffff'});}.bind({mgr:this,page_id:page.node_id})}});$$('#statistics tr.header th[order]').each(function(th){th.removeEvents('click');th.addEvent('click',function(){var pages=$('statistics').retrieve('pages');var criteria=this.th.get('criteria');var order=this.th.get('order');this.mgr.displaySortedPagesStatistics(this.mgr.sortBy(pages,criteria,order));$$('#statistics tr.header th[order]').each(function(e){e.removeClass('asc');e.removeClass('desc');});this.th.addClass(order);this.mgr.last_sort_criteria=criteria;this.mgr.last_sort_order=order;this.th.set('order',order=='asc'?'desc':'asc');}.bind({mgr:this,th:th}));th.setStyle('cursor','pointer');}.bind(this));$$('#statistics tbody')[0].grab(new Element('tr',{"class":"stats-tr "+(index%2==0?"even":"odd")}).grab(new Element('td',{html:page.name})).grab(new Element('td',{align:'center',valign:'middle',html:'<div class="page-rating-stars rating-'+page.rating+'"></div>'})).grab(new Element('td',{align:'center',html:page.num_votes})).grab(new Element('td',{align:'center'}).grab(reset_button)));},this);this.appPopupInstance.removeToolbarButton('ResetAllButton');if(pages.length>0){var reset_all_button=this.appPopupInstance.createToolbarButton({"caption":'Reset All',"id":'ResetAllButton',"callback":function(){new SK.UI.ConfirmBox('Are you sure you want to reset the votes for ALL pages?',function(){this.mgr.resetAllPageStatistics(this.page_ids,this.mgr.refreshPagesStatistics.bind(this.mgr));}.bind({mgr:this.mgr,page_ids:this.page_ids}),$empty,{width:350,height:200,modal_color:'#ffffff'});}.bind({mgr:this,page_ids:pages.map(function(p){return p.node_id;})})});}},refreshPagesStatistics:function(){this.loadPagesStatistics();},resetPageStatistics:function(page_id,callback){this.resetMyStoredRating([page_id]);this.resetDBRating([page_id],callback);},resetAllPageStatistics:function(page_ids,callback){this.resetMyStoredRating(page_ids);this.resetDBRating(page_ids,callback);},error:function(message){if(this.isAdminView()){new SK.UI.NoticeBox(message,{width:300,height:200});}},getColumnID:function(name){return this.columns_map[name]?this.columns_map[name].id:'';}});SK__PageRating.Admin=new Class({Extends:SK__PageRating.Base,initialize:function(options){this.parent(options,'admin');this.displayControl();}});SK__PageRating.User=new Class({Extends:SK__PageRating.Base,initialize:function(options){this.parent(options,'user');this.displayControl();}});SK__PageRating.Statistics=new Class({Extends:SK__PageRating.Base,initialize:function(options){this.parent(options,'admin');this.displayStatistics();}});
