//*****************************************************************************
// Copyright 2007 Starscale Inc.

if(!ibi.YupNope){ibi.YupNope={};}
var Extreme=ibi.Phix.YupNope.Things.Const.GetExtremeThings;var Search=ibi.Phix.YupNope.Things.Const.Search;ibi.YupNope.Const.ExtremeQueryType={CurrentMaxScore:0,CurrentMinScore:1,RecentlyAdded:2,RecentlyVoted:3,MaxAchievedScore:4,MinAchievedScore:5,Max:6};ibi.YupNope.Const.MaxThingLength=100;ibi.YupNope.Const.ListLoadMode={Extreme:0,Search:1};ibi.YupNope.ThingListLoader=Class.create({Const:{maxRecords:50,maxThingLength:ibi.YupNope.Const.MaxThingLength,refreshTime:120,Args:{Content:"content",TagId:"tagId",MemberId:"memberId",ExtremeIndex:"extremeIndex",VoteFilter:"voteFilter"},ListLoadMode:ibi.YupNope.Const.ListLoadMode,ExtremeArgLookup:[[Extreme.Property.CurrentScore,Extreme.Extreme.Max],[Extreme.Property.CurrentScore,Extreme.Extreme.Min],[Extreme.Property.CreationTime,Extreme.Extreme.Max],[Extreme.Property.LastVoteTime,Extreme.Extreme.Max],[Extreme.Property.AchievedScore,Extreme.Extreme.Max],[Extreme.Property.AchievedScore,Extreme.Extreme.Min]]},m_mode:null,m_element:null,m_callbacks:{},m_refreshState:{lastRefresh:0,allowUserRefresh:true},m_lastResults:null,m_dataTagLookup:null,m_searchContent:null,m_extremeQueryType:null,m_tagIdFilter:null,m_memberIdFilter:null,m_voteFilter:null,m_autoRefresher:null,m_allowSearch:true,m_thingJsonHandler:null,initialize:function(element,extremeCallbacks,searchCallbacks){this.m_element=element;this.m_callbacks.Extreme=extremeCallbacks||{};this.m_callbacks.Search=searchCallbacks||{};this.m_thingJsonHandler=new ibi.YupNope.ThingJsonHandler();},reloadList:function(){if(this.m_mode!=null){if(this.m_mode==this.Const.ListLoadMode.Search){this.doSearch(this.m_searchContent);}else{this.loadExtremeList(this.m_extremeQueryType);}}},setTagFilter:function(tagId){this.m_tagIdFilter=tagId;},setMemberFilter:function(memberId){this.m_memberIdFilter=memberId;},setVoteFilter:function(vote){this.m_voteFilter=vote;},reset:function(){this.m_mode=null;this.m_searchContent=null;this.m_extremeQueryType=null;this.m_tagIdFilter=null;this.m_memberIdFilter=null;this.m_voteFilter=null;},loadExtremeList:function(extremeQueryType){if(extremeQueryType==undefined||extremeQueryType==null||extremeQueryType<0||extremeQueryType>=ibi.YupNope.Const.ExtremeQueryType.Max)
{this.prv_callFunction(this.m_callbacks.Extreme.onListIndexUnknown);return false;}
this.m_mode=this.Const.ListLoadMode.Extreme;this.prv_callFunction(this.m_callbacks.Extreme.onInit);this.m_extremeQueryType=extremeQueryType;var property=this.Const.ExtremeArgLookup[extremeQueryType][0];var extreme=this.Const.ExtremeArgLookup[extremeQueryType][1];var args=Extreme.Arg.Max+"="+this.Const.maxRecords;args+="&"+Extreme.Arg.Extreme+"="+extreme;args+="&"+Extreme.Arg.Property+"="+property;args=this.prv_attachFilters(args);new ibi.Ajax.Request(Extreme.uriPath,{parameters:args,onFailure:function(){this.prv_callFunction(this.m_callbacks.Extreme.onFailure);this.stopAutoRefresh();this.m_refreshState.allowUserRefresh=true;this.prv_callFunction(this.m_callbacks.Extreme.onComplete);}.bind(this),onSuccess:function(transport){var json=transport.responseText.evalJSON();if((json.Status!=Extreme.Status.Success)||(!this.prv_handleResult(json,this.m_callbacks.Extreme.onNoResults)))
{this.prv_callFunction(this.m_callbacks.Extreme.onBadRequest);}
this.prv_callFunction(this.m_callbacks.Extreme.onComplete);this.m_refreshState.allowUserRefresh=true;}.bind(this)});return true;},doSearch:function(content){if(!this.m_allowSearch){return false;}
this.m_mode=this.Const.ListLoadMode.Search;if(content==null){this.prv_callFunction(this.m_callbacks.Search.onValueNull);return false;}
var strippedVal=content.strip();if(strippedVal.length>=3){if(strippedVal.length>this.Const.maxThingLength){this.prv_callFunction(this.m_callbacks.Search.onValueTooLong);return false;}
else{this.prv_callFunction(this.m_callbacks.Search.onInit);this.m_refreshState.allowUserRefresh=false;this.m_searchContent=encodeURIComponent(content);var args=Search.Arg.Content+'='+this.m_searchContent
+'&'+Search.Arg.Max+'='+this.Const.maxRecords;new ibi.Ajax.Request(Search.uriPath,{parameters:args,ignoreLoggedIn:true,onFailure:function(){this.prv_callFunction(this.m_callbacks.Search.onFailure);this.m_refreshState.allowUserRefresh=true;this.prv_callFucntion(this.m_callbacks.Search.onComplete);}.bind(this),onSuccess:function(transport){var json=transport.responseText.evalJSON();if(json.Status==Search.Status.ContentInvalid){this.prv_callFunction(this.m_callbacks.Search.onContentInvalid);}
else if((json.Status!=Search.Status.Success)||(!this.prv_handleResult(json,this.m_callbacks.Search.onNoResults)))
{this.prv_callFunction(this.m_callbacks.Search.onBadRequest);}
this.prv_callFunction(this.m_callbacks.Search.onComplete);this.m_refreshState.allowUserRefresh=true;}.bind(this)});}
return true;}
return false;},denySearch:function(){this.m_allowSearch=false;},allowSearch:function(){this.m_allowSearch=true;},getMode:function(){return this.m_mode;},getTagData:function(thingId){if(this.m_dataTagLookup!=null){return this.m_dataTagLookup[thingId];}},startAutoRefresh:function(refreshFunc){if(this.m_autoRefresher){this.m_autoRefresher.stop();}
this.m_autoRefresher=new PeriodicalExecuter(function(){var diff=(new Date()).getTime()-this.m_refreshState.lastRefresh+100;if(diff>this.Const.refreshTime*1000){refreshFunc();}}.bind(this),this.Const.refreshTime);var diff=(new Date()).getTime()-this.m_refreshState.lastRefresh;if(diff>this.Const.refreshTime){refreshFunc();}
$('thingListAutoOn').hide();$('thingListAutoOff').show();},stopAutoRefresh:function(){if($('thingListAutoOn')){if(this.m_autoRefresher){this.m_autoRefresher.stop();}
$('thingListAutoOn').show();$('thingListAutoOff').hide();}},prv_handleResult:function(json,noResultsFunc){this.m_lastResults=null;this.m_dataTagLookup=null;this.m_lastResults=json;try{if(json.Things.length==0){this.prv_callFunction(noResultsFunc);}else{this.prv_buildTagLookup(json.Things,json.LoggedInMemberId);var content=this.m_thingJsonHandler.handle(json.Things,json.LoggedInMemberId);if(Prototype.Browser.Opera){this.m_element.updateXHTML(content,true);}else{this.m_element.update(content,true);}
setTimeout(function(){this.prv_makeThingsDroppable();}.bind(this),1);}}catch(e){ibi.log(e);return false;}
return true;},prv_attachFilters:function(args){if(this.m_mode!=this.Const.ListLoadMode.Extreme){return}
if(this.m_tagIdFilter!=null){args+="&"+Extreme.Arg.TagIdFilter+"="+this.m_tagIdFilter;}
if(this.m_memberIdFilter!=null){args+="&"+Extreme.Arg.MemberIdFilter+"="+this.m_memberIdFilter;}
if(this.m_voteFilter!=null){args+="&"+Extreme.Arg.VoteFilter+"="+this.m_voteFilter;}
return args;},prv_makeThingsDroppable:function(){if(this.m_element.firstDescendant()){Droppables.clear();var elements=this.m_element.firstDescendant().childElements();for(var i=0,length=elements.length;i<length;++i){var el=$(elements[i]);Droppables.add(el,{accept:"thingTag",greedy:true,hoverclass:"tagDragHover",onDrop:function(drag,drop){tagThing(drop.id.gsub('ThingDiv\.',''),drag.id.gsub('system.Tag\.',''));}});var stats=el.select('div.thingStats')[0];if(stats){Droppables.add(stats,{accept:"thingTag",greedy:true,hoverclass:"tagDragHover",onDrop:function(drag,drop){tagThing(drop.id.gsub('thingStatBlock\.',''),drag.id.gsub('system.Tag\.',''));}});}}}},prv_buildTagLookup:function(things,memberId){var temp={};things.each(function(thing){var tags;if(thing.TagIds){tags=thing.TagIds;}else{tags=[];}
var canRemove=false;if(memberId&&memberId==thing.Creator.Id){var canRemove=true;}
temp[thing.Id]={'tags':tags,'canRemove':canRemove};}.bind(this));this.m_dataTagLookup=temp;},prv_callFunction:function(func){if(func){func();}else{ibi.log("Function is null");}}});