$(document).ready(function(){
 function goToURL(url) {
  var scrollstart=url.indexOf("#");
  if(scrollstart>0) {
   scroll=url.substr(scrollstart);
   url=url.substr(0,scrollstart);
  } else {
   scroll="";
   $("html, body").animate({ scrollTop:0 }, "slow");
  }
  $("#middlec").html("loading... (or click <a href=\""+url+"\">here</a> to be redirected manually)");
  $("#middlec").load(url+"?ajax", function(response, status, xhr){
   if(status=="error") {
    $("#middlec").html("redirecting... (or click <a href=\""+url+"\">here</a> to be redirected manually)");
    document.location.href=url+scroll;
   } else if(scroll!="") {
    top=$(scroll).position().top - 10;
    $("html, body").animate({ scrollTop:top }, "slow");
   }
   $("#middlec").prepareHandlers();
  });
 }
 var prevent=false;
 $(window).hashchange(function(){
  if(!prevent && location.hash.substr(0,2)=="#!") { goToURL(location.hash.substr(2)); } else { prevent=false; }
 });
 if(document.location.hash.length>0) { $(window).hashchange(); }
 jQuery.fn.toggleR = function(){
  $(this).slideToggle($(this).height()*2,"linear",function(){
   $(this).nextAll(".contractedR, .expandedR").first().toggleR();
  });
  return $(this);
 }
 jQuery.fn.replaceWithAndReturnNew = function(htmls){
  var replacer = $(htmls);
  $(this).replaceWith(replacer);
  return replacer;
 };
 jQuery.fn.prepareHandlers = function() {
  $(this).find("input.hasplaceholder").bind('focus',function(){
   $(this).attr("value","").removeClass("hasplaceholder").unbind('focus');
  });
  $(this).find("textarea.hasplaceholder").bind('focus',function(){
   $(this).empty().removeClass("hasplaceholder").unbind('focus');
  });
  $(this).find("a.toggle, a.togglev").click(function(e){
   e.preventDefault();
   $(this).siblings("a.toggle, a.togglev").toggle();
   $(this).hide();
   $(this).siblings(".contracted, .expanded").slideToggle("slow");
   if($(this).siblings(".contractedR, .expandedR").length==1) {
    $(this).siblings(".contractedR, .expandedR").slideToggle("slow");
   } else {
    $(this).siblings(".contractedR, .expandedR").first().toggleR();
   }
   return false;
  });
  $(this).find("a.ajax").click(function(e){
   e.preventDefault();
   url=$(this).attr("href");
   prevent=true;
   document.location.hash="#!"+url;
   goToURL(url);
   return false;
  });
  $(this).find("a.ajaxqueue").click(function(e){
   e.preventDefault();
   url=$(this).attr("href");
   $("#playerloading").slideDown("slow");
   $("#playlist").slideUp("slow",function(){
    $(this).load(url+"?ajax", function(response, status, xhr){
     if(status=="error") { $(this).html("error"); }
     $("#playerloading").slideUp("slow");
     $(this).slideDown("slow");
     $(this).playlistInit();
    });
   });
   return false;
  });
  $(this).find("a.jsqueue").click(function(e){
   e.preventDefault();
   url=$(this).attr("href"); text=$(this).html();
   $("#playlist").slideUp("slow",function(){
    $(this).html("<a href=\""+url+"\">"+text+"</a>");
    $(this).slideDown("slow");
    $(this).playlistInit();
   });
   return false;
  });
  $(this).find(".jsqueue a").click(function(e){
   e.preventDefault();
   $(this).siblings("a").removeClass("current");
   $(this).addClass("current");
   newlist=$(this).parent().html();
   $("#playlist").slideUp("slow",function(){
    $(this).html(newlist);
    $(this).contents(":not(a)").remove();
    $(this).slideDown("slow");
    $(this).playlistInit();
   });
   return false;
  });
  $(this).find("a.ajaxaction").click(function(e){
   e.preventDefault();
   var f=$(this);
   $.get($(this).attr("href")+'?ajax', function(data,status,xhr){
    if(status!="success") {
     f.replaceWith("<span class=\"error\">error</span>");
    } else if(data.substr(0,20)=="<span class=\"error\">") {
     f.replaceWith(data);
    } else {
     f.closest("div.ajaxtarget").replaceWithAndReturnNew(data).prepareHandlers();
    }
   }); 
   return false;
  });
  $(this).find("form.ajax").submit(function(e){
   e.preventDefault();
   var f=$(this);
   $.post($(this).attr("action")+'?ajax', $(this).serialize(), function(data,status,xhr){
    if(status!="success") {
     f.find("span.error").html("error");
    } else if(data.substr(0,20)=="<span class=\"error\">") {
     f.find("span.error").replaceWith(data);
    } else {
     f.closest("div.ajaxtarget").replaceWithAndReturnNew(data).prepareHandlers();
    }
   }); 
   return false;
  });
  return $(this);
 }
 $(document).prepareHandlers();
});

