Component.MovieListTextField=Class.create(Component.TextField,{initialize:function($super,A){$super(A);
this.element.observe("keyup",this.onKeyup.bindAsEventListener(this));
},onKeyup:function(A){$(this.element.readAttribute("echo")).update($F(this.element));
return true;
}});
Component.MovieListTitleField=Class.create(Component.MovieListTextField,{onKeyup:function(A){if(!this.titleField){this.titleField=$("listTitleHeaderText").down("h1");
}this.titleField.update($F(this.element));
return true;
}});
Component.MovieListForm=Class.create(Component.Form,{counter:0,onSubmit:function(A){if($F("listType")=="USR"&&(!TextUtils.hasText($F("listTitle"))||$F("listTitle")==$("listTitle").readAttribute("default"))){A.stop();
new View.ErrorPopup(this.element,{title:"Whoops",content:"Don't forget to give your list a title :)"});
return false;
}if($F("listDescription")==$("listDescription").readAttribute("default")){$("listDescription").value="";
return true;
}if(listEditor.items.length==0){new View.ConfirmationPopup(this.element,{content:"Are you sure you want to submit an empty list?",onConfirm:this.onConfirm.bindAsEventListener(this)});
A.stop();
return false;
}if(this.counter>=1){alert("Please wait -- we're working on your request.");
Event.stop(A);
return false;
}else{this.counter+=1;
return true;
}},onConfirm:function(A){this.element.submit();
}});
Movie.Cache=new Cache();
var MovieSearch=Class.create();
MovieSearch.prototype={STATES:{READY:0,SEARCHING:1,TIMEOUT:2,FAILURE:3},initialize:function(A){this.setOptions(A);
this.setObservers();
},setOptions:function(A){this.options={SEARCHING:GENERIC_VIEWS.LOADING,TIMEOUT:GENERIC_VIEWS.TIMEOUT,EMPTY:"No movies found.",MOVIE:new Template('<li id="searchItem_#{id}"><a href="" class="clearfix"  onclick="listEditor.onAddItem(event, #{id});"><span class="title">#{title}</span> <span class="add">add</span></li>'),FAILURE:GENERIC_VIEWS.FAILURE,searchField:"searchField",searchButton:"searchButton",searchResults:"searchResults",timeout:15000};
Object.extend(this.options,A||{});
},setObservers:function(){Event.observe($(this.options.searchField),"keypress",this.onEnter.bindAsEventListener(this));
Event.observe($(this.options.searchButton),"click",this.onSearch.bindAsEventListener(this));
new DefaultTextWidget($(this.options.searchField),"Type movie title, click SEARCH");
},onEnter:function(A){if(A.keyCode==Event.KEY_RETURN){Event.stop(A);
this.onSearch(A);
return false;
}else{return true;
}},onSearch:function(B){if(this.state==this.STATES.SEARCHING){return ;
}if($F(this.options.searchField)=="Type movie title, click SEARCH"){return ;
}if($F(this.options.searchField).length<2){return ;
}$(this.options.searchResults).show();
var A="movieAction=searchMovies&format=json&search="+encodeURIComponent($F(this.options.searchField));
new Ajax.Request("/movie.sv",{parameters:A,onSuccess:this.onSuccess.bind(this),onFailure:this.onFailure.bind(this),onTimeout:this.onTimeout.bind(this),timeout:this.options.timeout});
this.state=this.STATES.SEARCHING;
this.paint();
},onSuccess:function(response){this.movies=eval("("+response.responseText+")");
Movie.Cache.putList(this.movies);
this.state=this.STATES.READY;
this.paint();
},onFailure:function(){this.state=this.STATES.FAILURE;
this.paint();
},onTimeout:function(){this.state=this.STATES.TIMEOUT;
this.paint();
},paint:function(){switch(this.state){case this.STATES.READY:this.html="";
if(this.movies.length==0){this.html=this.options.EMPTY;
}else{this.html="<ul class='clearFix'>";
this.movies.each(function(A,B){this.html+=this.options.MOVIE.evaluate(A);
}.bind(this));
this.html+="</ul>";
}$(this.options.searchResults).update(this.html);
break;
case this.STATES.SEARCHING:$(this.options.searchResults).update(this.options.SEARCHING);
break;
case this.STATES.TIMEOUT:$(this.options.searchResults).update(this.options.TIMEOUT);
break;
case this.STATES.FAILURE:$(this.options.searchResults).update(this.options.FAILURE);
break;
}}};
var MovieBrowse=Class.create();
MovieBrowse.prototype={STATES:{READY:0,SEARCHING:1,TIMEOUT:2,FAILURE:3},initialize:function(A){this.setOptions(A);
Event.observe($("selectCategory"),"change",this.onChange.bindAsEventListener(this));
},setOptions:function(A){this.options={SEARCHING:GENERIC_VIEWS.LOADING,TIMEOUT:GENERIC_VIEWS.TIMEOUT,EMPTY:"No movies found.",MOVIE:new Template('<li id="searchItem_#{id}"><a href="" class="clearfix"  onclick="listEditor.onAddItem(event, #{id});"><span class="title">#{title}</span> <span class="add">add</span></li>'),FAILURE:GENERIC_VIEWS.FAILURE,browseResults:"browseResults",timeout:30000};
Object.extend(this.options,A||{});
},onChange:function(B){var A=Event.element(B);
this.callForResource($F(A));
if(this.state==this.STATES.SEARCHING){return ;
}this.paint();
},onSuccess:function(response){this.movies=eval("("+response.responseText+")");
Movie.Cache.putList(this.movies);
this.state=this.STATES.READY;
this.paint();
},onFailure:function(){this.state=this.STATES.FAILURE;
this.paint();
},onTimeout:function(){this.state=this.STATES.TIMEOUT;
this.paint();
},callForResource:function(A){this.state=this.STATES.SEARCHING;
this.paint();
var B="service=movieSearch&format=json&type="+A;
new Ajax.Request("/list.sv",{parameters:B,onSuccess:this.onSuccess.bind(this),onFailure:this.onFailure.bind(this),onTimeout:this.onTimeout.bind(this),timeout:this.options.timeout});
},paint:function(){var A=$(this.options.browseResults);
switch(this.state){case this.STATES.READY:this.html="";
if(this.movies.length==0){this.html=this.options.EMPTY;
}else{this.html="<ul class='clearFix'>";
this.movies.each(function(B,C){this.html+=this.options.MOVIE.evaluate(B);
}.bind(this));
this.html+="</ul>";
}if(A){A.update(this.html);
}break;
case this.STATES.SEARCHING:if(A){A.update(this.options.SEARCHING);
}break;
case this.STATES.TIMEOUT:if(A){A.update(this.options.TIMEOUT);
}break;
case this.STATES.FAILURE:if(A){A.update(this.options.FAILURE);
}break;
}}};
var ListEditor=Class.create();
ListEditor.prototype={initialize:function(A){this.setOptions(A);
this.items=new Array();
this.dirty=false;
},setOptions:function(A){this.options={items:"listTableBody",searchItem:"searchItem",tag:"tr",handle:"handle",ghosting:true};
Object.extend(this.options,A||{});
},setupList:function(){var A=Sortable.create(this.options.items,{tag:this.options.tag,scroll:window,handle:this.options.handle,constraint:false,onChange:function(){var B=$("listTableBody").getElementsBySelector("tr");
B.each(function(D,C){D.down("index").update(C+1);
});
}});
},onAddItem:function(B,C){var A=$("listTableBody").immediateDescendants().length+1;
new Effect.Highlight(this.options.searchItem+"_"+C);
if(this.items.indexOf(C)>=0){alert("Whoops, this item is already on your list.");
new Effect.Highlight("_"+C);
Event.stop(B);
return false;
}this.dirty=true;
this.items.push(C);
new Ajax.Request("/movie-list/movie/row?movieId="+C+"&rowNumber="+A,{method:"GET",onSuccess:this.onSuccess.bind(this),onFailure:this.onFailure.bind(this),onTimeout:this.onTimeout.bind(this)});
Event.stop(B);
return false;
},onRemoveItem:function(A){this.dirty=true;
this.items=this.items.without(A);
Element.remove($("_"+A));
this.setupList();
this.paint();
},paint:function(){if($("listTableBody").immediateDescendants().length>0){$("emptyView").hide();
$("editView").show();
}else{$("emptyView").show();
$("editView").hide();
}},onSuccess:function(A){$(this.options.items).insert(A.responseText);
this.paint();
Sortable.addSortable($("listTableBody"),$(this.options.items+"_"+itemId),Sortable.sortables["listTableBody"]);
new Effect.Highlight($("_"+itemId));
},onFailure:function(){this.form.enable();
this.form.down("fieldSet").removeClassName("loading");
},onTimeout:function(){this.form.enable();
this.form.down("fieldSet").removeClassName("loading");
}};
var MovieListComments=Class.create();
MovieListComments.prototype={initialize:function(){this.form=$("addComment");
Event.observe(this.form,"submit",this.onSubmit.bindAsEventListener(this));
new TextCounter($("commentText"),1000,$("counter"),"Sorry, please keep your description under 1000 characters.  Thanks.");
},onSubmit:function(B){if(!TextUtils.hasText($F("commentText"))||$F("commentText").length<3){alert("hey, comments gotta have at least 3 lousy characters...");
Event.stop(B);
return false;
}this.form.disable();
this.form.getElementsBySelector("fieldSet")[0].addClassName("loading");
var A="commentText="+encodeURIComponent($F("commentText"));
new Ajax.Request(document.URL+"/comment/add",{parameters:A,onSuccess:this.onSuccess.bind(this),onFailure:this.onFailure.bind(this),onTimeout:this.onTimeout.bind(this)});
Event.stop(B);
return false;
},onSuccess:function(A){this.form.enable();
this.form.down("fieldset").removeClassName("loading");
$("commentsList").insert(A.responseText);
$("commentText").value="";
var B=$("commentsList").immediateDescendants();
B.last().scrollTo();
},onFailure:function(){this.form.enable();
this.form.down("fieldSet").removeClassName("loading");
},onTimeout:function(){this.form.enable();
this.form.down("fieldSet").removeClassName("loading");
}};
var MovieListRating=Class.create();
MovieListRating.prototype={initialize:function(){this.form=$("ratingForm");
this.ratingWidget=$("ratingWidget");
if(this.form!=null){this.form.getElements().each(function(A){Event.observe(A,"click",this.onClick.bindAsEventListener(this));
}.bind(this));
Event.observe(this.form,"submit",this.onClick.bindAsEventListener(this));
}},onClick:function(B){this.form.disable();
this.form.down("fieldSet").addClassName("loading");
var A="userRating="+Event.element(B).value;
new Ajax.Request(document.URL+"/rate/action",{parameters:A,onSuccess:this.onSuccess.bind(this),onFailure:this.onFailure.bind(this),onTimeout:this.onTimeout.bind(this)});
Event.stop(B);
return false;
},onSuccess:function(A){this.form.enable();
this.form.down("fieldset").removeClassName("loading");
this.form.hide();
$("ratingWidget").insert(A.responseText,{position:"bottom"});
},onFailure:function(){this.form.enable();
this.form.down("fieldSet").removeClassName("loading");
},onTimeout:function(){this.form.enable();
this.form.down("fieldSet").removeClassName("loading");
}};
var MovieListFavoriting=Class.create();
MovieListFavoriting.prototype={initialize:function(){this.favoriteLink=$("favoriteLink");
if(this.favoriteLink!=null){Event.observe(this.favoriteLink,"click",this.onClick.bindAsEventListener(this));
}},onClick:function(A){this.favoriteLink.addClassName("loading");
new Ajax.Request(this.favoriteLink.getAttribute("href"),{method:"GET",onSuccess:this.onSuccess.bind(this),onFailure:this.onFailure.bind(this),onTimeout:this.onTimeout.bind(this)});
Event.stop(A);
return false;
},onSuccess:function(A){this.favoriteLink.removeClassName("loading");
this.favoriteLink.hide();
this.favoriteLink.next("span").show();
this.favoriteLink.next("a").show();
},onFailure:function(){this.favoriteLink.removeClassName("loading");
alert("we borked adding this to your favorites! please try again later");
},onTimeout:function(){this.favoriteLink.removeClassName("loading");
alert("it's takin' to long to add this movie list to your favorites. give it another shot in a little bit. ");
}};
var MovieListUserHomepage=Class.create();
MovieListUserHomepage.prototype={initialize:function(){this.userCreated=$("userCreated").down("tbody").getElementsBySelector("tr");
this.favorites=$("favorites").down("tbody").getElementsBySelector("tr");
if(this.userCreated!=null){this.userCreated.each(function(B){var A=B.down("a.action");
if(A!=null){Event.observe(A,"click",this.onClick.bindAsEventListener(this));
}}.bind(this));
}if(this.favories!=null){this.favories.each(function(B){var A=B.down("a.action");
Event.observe(A,"click",this.onClick.bindAsEventListener(this));
}.bind(this));
}},onClick:function(B){var A=Event.element(B);
if(A.hasAttribute("delete")){if(!confirm("Really? We're gonna rip this movie list apart and tear it to shreds.")){Event.stop(B);
return false;
}}new Ajax.Request(A.href,{method:"POST",onSuccess:this.onSuccess.bind(this),onFailure:this.onFailure.bind(this),onTimeout:this.onTimeout.bind(this)});
A.up("tr").remove();
Event.stop(B);
return false;
},onSuccess:function(A,B){},onFailure:function(){},onTimeout:function(){}};




