function add_tag(tag) {
  if (document.edit_form.categories.value == ''){
  document.edit_form.categories.value += tag;  
  }else{
  document.edit_form.categories.value += "\n" + tag;
  }
}

var Dlc = {
  show_progress : function() {
    new Effect.Appear('loader', {from: 0.0, to: 0.25, duration: 0.1});
  },
  hide_progress : function() {
    new Effect.Fade('loader', {from: 0.25, to: 0.0, duration: 0.1});
  },
  respond_error : function(t) {
    alert(t.responseText);
    Dlc.hide_progress();
  },
	window_size : function() {
	  var browserWinWidth = 0, browserWinHeight = 0;
		if( typeof( window.innerWidth ) == 'number' ) {
			//Non-IE
			browserWinWidth = window.innerWidth;
			browserWinHeight = window.innerHeight;
			} 
		else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
			//IE 6+ in 'standards compliant mode'
			browserWinWidth = document.documentElement.clientWidth;
			browserWinHeight = document.documentElement.clientHeight;
		} 
		else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
			//IE 4 compatible
			browserWinWidth = document.body.clientWidth;
			browserWinHeight = document.body.clientHeight;
		}
		return [browserWinWidth,browserWinHeight];
  },
  size_progress_screen : function() {
    var dimensions = Dlc.window_size();
    $('loader').style.width = dimensions[0] + "px";
    $('loader').style.height = dimensions[1] + "px";
    return true;
  }
}

var Pages = {
  page_id : null,
  url_root : null,
  route_to : function(action) {
    return Pages.url_root+'/pages/'+action;;
  },
  route_to_page : function(action) {
    var route = Pages.url_root+'/pages/'+Pages.page_id+'/';
    if(action){
      route += action;
      route += '/';
    }
    return route;
  },
  make_sortable : function() {
    Sortable.create('bookmark_page',{handle:'move',onUpdate:Pages.sort});  
  },
  sort : function() {
    new Ajax.Request(Pages.route_to_page('sort'),{parameters:Sortable.serialize('bookmark_page')})
  },
  lookup : function() {
    var params = Form.serialize('lookup');
    Dlc.show_progress();
    new Ajax.Request(Pages.route_to('lookup'),{parameters:params,onSuccess:Pages.lookup_success});
    return false;
  },
  lookup_success : function(t) {
    $('add_widget_lookup_results').innerHTML = t.responseText;
    Dlc.hide_progress();
  },
  preview_show : function(t) {
    if($('item_new')) {
      Element.replace('item_new',t.responseText);
    }
    else {
      Element.insert('bookmark_page',{before:t.responseText});
    }
    Dlc.hide_progress();
  },
  preview_cancel : function() {
    Element.remove('item_new')
  },
  add_complete : function(t) {
    if($('item_new')) {
      Element.remove('item_new');
    }
    Element.insert('bookmark_page',{top:t.responseText}); 
    Pages.make_sortable(Pages.page_id); 
    Dlc.hide_progress(); 
  },
  delete_item : function(item_path, item_id, item_alt_name) {
    if(!item_alt_name)
      item_alt_name = item_path;
      
    if(!confirm("Are you sure you want to delete the "+item_alt_name+"?"))
      return false;
    Dlc.show_progress();
    
    // Note this will fail silently if the controller action fails - most likely a double click on a delete
    // box
    new Ajax.Request(Pages.route_to_page(item_path+'s')+item_id+'/delete',{onComplete:Pages.delete_complete});
    return false;
  },
  delete_complete : function(t) {
    if($('item_'+t.responseText)) {
      Element.remove("item_"+t.responseText);
      Pages.make_sortable(Pages.page_id);
    }
    Dlc.hide_progress();
  }
}

var NoteItem = {
  add : function() {
    Dlc.show_progress();
    new Ajax.Request(Pages.route_to_page('notes'),{parameters:Form.serialize('item_new_form'),onSuccess:Pages.add_complete,onFailure:Pages.preview_show})
    return false;
  },
  edit : function(note_id) {
    Dlc.show_progress();
    new Ajax.Request(Pages.route_to_page('notes')+note_id+'/edit',{onComplete:NoteItem.edit_complete,method:'get'})
  },
  edit_complete : function(t) {
    var result = eval(t.responseText);
    Element.replace('item_'+result[0], result[1]);
    Pages.make_sortable(Pages.page_id);
    Dlc.hide_progress();
  },
  update : function(note_id) {
    Dlc.show_progress();
    new Ajax.Request(Pages.route_to_page('notes')+note_id,{onComplete:NoteItem.edit_complete,parameters:Form.serialize('note_'+note_id+'_form')});
    return false;
  },
  edit_cancel : function(note_id) {
    Dlc.show_progress();
    new Ajax.Request(Pages.route_to_page('notes')+note_id+'/cancel',{onComplete:NoteItem.edit_complete,method:'get'});
    return false;
  },
  destroy : function(note_id) {
    return Pages.delete_item('note',note_id);
  }
}

var BookmarkItem = {
  add : function(bookmark_id) {
    Dlc.show_progress();
    new Ajax.Request(Pages.route_to_page('bookmarks')+bookmark_id,{method:'get',onSuccess:Pages.preview_show});
    return false;
  },
  create : function(bookmark_id) {
    Dlc.show_progress();
    new Ajax.Request(Pages.route_to_page('bookmarks')+bookmark_id,{onSuccess:Pages.add_complete,onFailure:Dlc.respond_error});
    return false;
  },
  destroy : function(item_id) {
    return Pages.delete_item('bookmark',item_id,'link to the bookmark');
  }
}


var TagItem = {
  add : function(tag_id) {
    Dlc.show_progress();
    new Ajax.Request(Pages.route_to_page('tags')+tag_id,{method:'get',onSuccess:Pages.preview_show});
    return false;
  },
  create : function(tag_id) {
    Dlc.show_progress();
    new Ajax.Request(Pages.route_to_page('tags')+tag_id,{onSuccess:Pages.add_complete,onFailure:Dlc.respond_error});
    return false;
  },
  destroy : function(item_id) {
    return Pages.delete_item('tag',item_id,'link to the category');
  }
}

var PageLinkItem = {
  add : function(page_id) {
    Dlc.show_progress();
    new Ajax.Request(Pages.route_to_page('page_links')+page_id,{method:'get',onSuccess:Pages.preview_show});
    return false;
  },
  create : function(page_id) {
    Dlc.show_progress();
    new Ajax.Request(Pages.route_to_page('page_links')+page_id,{onSuccess:Pages.add_complete,onFailure:Dlc.respond_error});
    return false;
  },
  destroy : function(item_id) {
    return Pages.delete_item('page_link',item_id,'link to the page');
  }
}

var Bookmark = {
  src : function(source) {
    if(source)
      return source;
    else
      return '';
  },
  route_to : function(action) {
    return Pages.url_root+'/bookmarks_editor/'+action+'/';
  },
  edit : function(bookmark_id, source) {
    Dlc.show_progress();
    new Ajax.Request(Bookmark.route_to('edit')+bookmark_id,{method:'get',parameters:"src="+Bookmark.src(source),onSuccess:Bookmark.edit_complete,onFailure:Dlc.respond_error});
    return false;
  },
  cancel : function(bookmark_id, source) {
    Dlc.show_progress();
    new Ajax.Request(Bookmark.route_to('cancel')+bookmark_id,{method:'get',parameters:"src="+Bookmark.src(source),onSuccess:Bookmark.edit_complete,onFailure:Dlc.respond_error});
    return false;
  },
  edit_complete : function(t) {
    var result = eval(t.responseText);
    $('bookmark_'+result[0]).innerHTML = result[1];
    Dlc.hide_progress();
  },
  update : function(bookmark_id, source) {
    Dlc.show_progress();
    new Ajax.Request(Bookmark.route_to('edit')+bookmark_id,{onComplete:Bookmark.edit_complete,parameters:Form.serialize("edit_form_"+bookmark_id)+"&src="+Bookmark.src(source)});
    return false;
  },
  destroy : function(bookmark_id) {
    if(!confirm('Are you sure you want to delete your bookmark?'))
      return false;
    Dlc.show_progress();
    new Ajax.Request(Bookmark.route_to('destroy')+bookmark_id,{onSuccess:Bookmark.destroy_complete,onFailure:Dlc.respond_error});
    return false;
  },
  destroy_complete : function(t) {
    var el = $("bookmark_"+t.responseText);
    var parent = el.up();
    
    if(parent.className == 'page_bookmarks')
      el = parent;
      
    new Effect.Highlight(el);
    setTimeout("Element.remove('"+el.id+"')",1000);
    Dlc.hide_progress();
  }
}