features and widgets added

Conflicts:
	app/assets/javascripts/orbitdesktop.js
This commit is contained in:
Harry Bomrah 2013-03-25 18:44:06 +08:00 committed by Matt K. Fu
parent c8aa50ee87
commit 793d739726
9 changed files with 193 additions and 62 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

@ -37,6 +37,71 @@ var sortAscending = function(a, b) {
var sortDescending = function(a, b) { var sortDescending = function(a, b) {
return $(a).find("h1").text() < $(b).find("h1").text() ? 1 : -1; return $(a).find("h1").text() < $(b).find("h1").text() ? 1 : -1;
}; };
jQuery.ajax = (function(_ajax){
var protocol = location.protocol,
hostname = location.hostname,
exRegex = RegExp(protocol + '//' + hostname),
YQL = 'http' + (/^https/.test(protocol)?'s':'') + '://query.yahooapis.com/v1/public/yql?callback=?',
query = 'select * from html where url="{URL}" and xpath="*"';
function isExternal(url) {
return !exRegex.test(url) && /:\/\//.test(url);
}
return function(o) {
var url = o.url;
if ( /get/i.test(o.type) && !/json/i.test(o.dataType) && isExternal(url) ) {
// Manipulate options so that JSONP-x request is made to YQL
o.url = YQL;
o.dataType = 'json';
o.data = {
q: query.replace(
'{URL}',
url + (o.data ?
(/\?/.test(url) ? '&' : '?') + jQuery.param(o.data)
: '')
),
format: 'xml'
};
// Since it's a JSONP request
// complete === success
if (!o.success && o.complete) {
o.success = o.complete;
delete o.complete;
}
o.success = (function(_success){
return function(data) {
if (_success) {
// Fake XHR callback.
_success.call(this, {
responseText: (data.results[0] || '')
// YQL screws with <script>s
// Get rid of them
.replace(/<script[^>]+?\/>|<script(.|\s)*?\/script>/gi, '')
}, 'success');
}
};
})(o.success);
}
return _ajax.apply(this, arguments);
};
})(jQuery.ajax);
var orbitDesktop = function(dom){ var orbitDesktop = function(dom){
orbitDesktopAPI.apply(this); orbitDesktopAPI.apply(this);
// o = this; // o = this;
@ -53,11 +118,12 @@ var orbitDesktop = function(dom){
this.gridvar = null; this.gridvar = null;
this.lastlink= null; this.lastlink= null;
this.tinyscrollbar = null; this.tinyscrollbar = null;
this.locationdata = {};
this.initialize = function(){ this.initialize = function(){
var theme = o.theme; var theme = o.theme;
var custom = false; var custom = false;
o.getlocation();
$.getJSON("/desktop/get_desktop_settings",{"get":"desktop","desktopid":o.desktopId},function(desktopSettings){ $.getJSON("/desktop/get_desktop_settings",{"get":"desktop","desktopid":o.desktopId},function(desktopSettings){
if(desktopSettings){ if(desktopSettings){
if(desktopSettings.theme!="custom"){ if(desktopSettings.theme!="custom"){
@ -82,6 +148,7 @@ var orbitDesktop = function(dom){
o.loadWallpaper(customwallpaper); o.loadWallpaper(customwallpaper);
o.bindDesktopEvents(); o.bindDesktopEvents();
o.loadIconCache(); o.loadIconCache();
o.getlocation();
var custom_load = window.location.hash; var custom_load = window.location.hash;
if(!custom_load){ if(!custom_load){
$(o.contentHolder).empty().load("/desktop/desktop",function(){ $(o.contentHolder).empty().load("/desktop/desktop",function(){
@ -115,6 +182,31 @@ var orbitDesktop = function(dom){
}) })
}; };
this.getlocation = function(){
var locationSuccess = function(pos){
o.locationdata.lat = pos.coords.latitude;
o.locationdata.lng = pos.coords.longitude;
$.getJSON("http://maps.googleapis.com/maps/api/geocode/json?latlng="+o.locationdata.lat+","+o.locationdata.lng+"&sensor=true",function(data){
$.each(data.results[0].address_components,function(i,val){
o.locationdata[val.types[0]] = val.long_name;
})
o.locationdata.formatted_address = data.results[0].formatted_address;
})
}
var locationError = function(){
o.notify("Unable to find your location!","alert");
}
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(locationSuccess,locationError);
}
else{
o.notify("Your browser does not support Geolocation!","alert");
}
}
this.bindDesktopEvents = function(){ //this function will bind the global handlers to thd desktop, for example doc this.bindDesktopEvents = function(){ //this function will bind the global handlers to thd desktop, for example doc
$(".docklist a").click(function(){ $(".docklist a").click(function(){
o.menu_item($(this)); o.menu_item($(this));
@ -296,17 +388,16 @@ var orbitDesktop = function(dom){
column_container = $e.find("div.overview"); column_container = $e.find("div.overview");
layout = column_container.attr("content-layout"), base_width = parseInt(column_container.attr("base-width")), no_of_entries,total_columns=0, pagination_link = column_container.attr("pagination-link"), pagination_variable = column_container.attr("pagination-var"); layout = column_container.attr("content-layout"), base_width = parseInt(column_container.attr("base-width")), no_of_entries,total_columns=0, pagination_link = column_container.attr("pagination-link"), pagination_variable = column_container.attr("pagination-var");
var temp_div = $("<div></div>"); var temp_div = $("<div></div>");
var entries = [];
switch (layout){ switch (layout){
case "simple": case "simple":
total_columns++; total_columns++;
temp_div.append(column_container.html()); temp_div.append(column_container.html());
var entries = [];
total_width = "auto";
break; break;
case "datalist": case "datalist":
no_of_entries = (typeof column_container.attr("per-column") != "undefined"? parseInt(column_container.attr("per-column")) : 4); no_of_entries = (typeof column_container.attr("per-column") != "undefined"? parseInt(column_container.attr("per-column")) : 4);
var height_percentage = 100/no_of_entries; var height_percentage = 100/no_of_entries;
var entries = column_container.find("li[item=true]"),x = 0; entries = column_container.find("li[item=true]"),x = 0;
if(entries.length != 0){ if(entries.length != 0){
entries.each(function(i,li){ entries.each(function(i,li){
if(x == 0){ if(x == 0){
@ -324,7 +415,7 @@ var orbitDesktop = function(dom){
total_width = (!isNaN(base_width)) ? (base_width + gutter*2 +1) * total_columns : null; total_width = (!isNaN(base_width)) ? (base_width + gutter*2 +1) * total_columns : null;
break; break;
case "column": case "column":
var entries = column_container.find("div[column=true]"),x = 0,column; entries = column_container.find("div[column=true]"),x = 0,column;
if(entries.length!=0){ if(entries.length!=0){
entries.each(function(i,ul){ entries.each(function(i,ul){
column = $("<div class='column type_column' style='width:"+base_width+"px;margin-right:"+gutter+"px;padding-right:"+gutter+"px;'></div"); column = $("<div class='column type_column' style='width:"+base_width+"px;margin-right:"+gutter+"px;padding-right:"+gutter+"px;'></div");
@ -336,6 +427,9 @@ var orbitDesktop = function(dom){
} }
total_width = (!isNaN(base_width)) ? (base_width + gutter*2 +1) * total_columns : null; total_width = (!isNaN(base_width)) ? (base_width + gutter*2 +1) * total_columns : null;
break; break;
default:
break;
} }
// total_width = (!isNaN(base_width) ? ( base_width + 12 ) * total_columns : null); // total_width = (!isNaN(base_width) ? ( base_width + 12 ) * total_columns : null);
return {"markup":temp_div.html(),"width":total_width,"total":entries.length}; return {"markup":temp_div.html(),"width":total_width,"total":entries.length};
@ -440,6 +534,7 @@ var orbitDesktop = function(dom){
if(!customload)customload=false; if(!customload)customload=false;
var target = dom.attr("id"); var target = dom.attr("id");
var url = dom.attr("href"); var url = dom.attr("href");
if(!url)return false;
o.lastlink = url; o.lastlink = url;
o.data_method = dom.attr("callback-method"); o.data_method = dom.attr("callback-method");
if(o.currenthtml!=target){ if(o.currenthtml!=target){
@ -452,7 +547,6 @@ var orbitDesktop = function(dom){
$("#content").hide("drop",o.transitionTime,function(){ $("#content").hide("drop",o.transitionTime,function(){
o.currenthtml = target; o.currenthtml = target;
o.currentface = target; o.currentface = target;
var cache = false; var cache = false;
if(!o.desktopData[o.currentface]){ if(!o.desktopData[o.currentface]){
$(o.contentHolder).empty().load(url,function(data){ $(o.contentHolder).empty().load(url,function(data){
@ -609,51 +703,6 @@ var orbitDesktop = function(dom){
// } // }
// } // }
// }); // });
o.simple_drop_down();
o.tinyscrollbar_ext({
main: '.tinycanvas'
})
// $("div#group_wrapper ul li[data-category=app]").click(function(){
// o.appWindow({
// title : $(this).find("a").attr("href"),
// appid : $(this).find("a").attr("href")
// });
// });
}
var loadTiles = function(id){ //This will load tiles for a specific desktop .. id of section has to be passed here to load tiles
$("div#desktop div#group_wrapper").empty();
$.getJSON("/desktop/getgroups",{sectionid:id},function(tiles){
tiles.sort(o.sortJSON("position",true,parseInt));
var tilecolors = o.themesettings.tilecolor;
var totaltiles_in_a_row = 4;
var opacity = ["op05","op06","op07","op08","op09"];
var row = 1,col = 1,x = 1,y = 1;
var $group = $('<div class="grid gridster"></div>');
var $ul = $('<ul style="margin: -6px 0 0 -6px;"></ul>');
$.each(tiles,function(i,tile){
if(row >= 4){
row = 1;
col++;
}
var shape = tile.shape.split(" ");
x = parseInt(shape[0].substr(1,1));
y = parseInt(shape[1].substr(1,1));
var tilecolor = tilecolors[Math.floor(Math.random()*tilecolors.length)];
var op = opacity[Math.floor(Math.random()*opacity.length)];
if(tile.data_category == "app")
$li = $('<li data-id="'+tile.id+'" class="widget" data-row="'+row+'" data-col="'+col+'" data-sizex="'+x+'" data-sizey="'+y+'" data-category="'+tile.data_category+'" data-content="'+tile.data_content+'"><span class="tile '+tilecolor+' '+op+'"></span><a href="'+tile.data_content+'" class="appicon" onclick="return false;"><img src="'+o.iconPath+tile.data_content+'.png" alt="" ></a><h1 class="appname thmtxt">'+tile.title+'</h1></li>');
else
$li = $('<li data-id="'+tile.id+'" class="widget" data-row="'+row+'" data-col="'+col+'" data-sizex="'+x+'" data-sizey="'+y+'" data-category="'+tile.data_category+'" data-content="'+tile.data_content+'" js-link="'+tile.js[0].url+'" css-link="'+tile.css.url+'"><span class="tile '+tilecolor+' '+op+'"></span><div class="appholder"><div class="thmtxt o-loading"><i class="icon-spinner icon-spin"></i> Loading</div></div><h1 class="appname thmtxt">'+tile.title+'</h1></li>');
row = row + y;
$ul.append($li);
})
$group.append($ul);
$("div#desktop div#group_wrapper").append($group);
var dragged = null,draggable,lastpos = []; var dragged = null,draggable,lastpos = [];
o.gridvar = $(".grid ul").find("> li ").mousedown(function(e){ o.gridvar = $(".grid ul").find("> li ").mousedown(function(e){
!draggable; !draggable;
@ -668,7 +717,11 @@ var orbitDesktop = function(dom){
widget_base_dimensions: [120, 120], widget_base_dimensions: [120, 120],
// avoid_overlapped_widgets: true, // avoid_overlapped_widgets: true,
draggable : { draggable : {
start : function(event, ui){
dragged.addClass("noClick");
},
stop: function(event, ui){ stop: function(event, ui){
// var widgetchanged_col = dragged.attr("data-col"); // var widgetchanged_col = dragged.attr("data-col");
// var total = 0; // var total = 0;
// // console.log(widgetchanged.col); // // console.log(widgetchanged.col);
@ -706,7 +759,7 @@ var orbitDesktop = function(dom){
$(".grid ul .widget[data-col="+i+"]").each(function(){ $(".grid ul .widget[data-col="+i+"]").each(function(){
var pos = $(this).position(); var pos = $(this).position();
if(pos){ if(pos){
console.log(pos.top + $(this).height() + 6);
if((pos.top + $(this).height() + 6) > 550){ if((pos.top + $(this).height() + 6) > 550){
revertbacktiles(); revertbacktiles();
@ -733,6 +786,66 @@ var orbitDesktop = function(dom){
break; break;
} }
} }
o.simple_drop_down();
o.tinyscrollbar_ext({
main: '.tinycanvas'
})
$("li.app[data-category=app]").click(function(){
if(!$(this).hasClass("noClick")){
var url = $(this).find("a").data("url");
var app = $(this);
o.appWindow({
"appid" : app.data("id"),
"title" : app.data("title"),
"url" : url
})
}
dragged.removeClass("noClick");
})
// $("div#group_wrapper ul li[data-category=app]").click(function(){
// o.appWindow({
// title : $(this).find("a").attr("href"),
// appid : $(this).find("a").attr("href")
// });
// });
}
var loadTiles = function(id){ //This will load tiles for a specific desktop .. id of section has to be passed here to load tiles
$("div#desktop div#group_wrapper").empty();
$.getJSON("/desktop/getgroups",{sectionid:id},function(tiles){
tiles.sort(o.sortJSON("position",true,parseInt));
var tilecolors = o.themesettings.tilecolor;
var totaltiles_in_a_row = 4;
var opacity = ["op07","op08","op09",""];
var row = 1,col = 1,x = 1,y = 1;
var $group = $('<div class="grid gridster"></div>');
var $ul = $('<ul style="margin: -6px 0 0 -6px;"></ul>');
$.each(tiles,function(i,tile){
if(row >= 4){
row = 1;
col++;
}
var shape = tile.shape.split(" ");
x = parseInt(shape[0].substr(1,1));
y = parseInt(shape[1].substr(1,1));
var tilecolor = tilecolors[Math.floor(Math.random()*tilecolors.length)];
var op = opacity[Math.floor(Math.random()*opacity.length)];
var f = (tile.fullsize?"fullsize":null);
if(tile.data_category == "app")
$li = $('<li data-id="'+tile.id+'" class="app" data-row="'+row+'" data-col="'+col+'" data-sizex="'+x+'" data-sizey="'+y+'" data-title="'+tile.title+'" data-category="'+tile.data_category+'" data-content="'+tile.data_content+'"><span class="tile '+tilecolor+' '+op+'"></span><a href="'+tile.data_content+'" class="appicon" onclick="return false;" data-url="'+tile.link+'"><img src="'+o.iconPath+tile.data_content+'.png" alt="" ></a><h1 class="appname thmtxt">'+tile.title+'</h1></li>');
else
$li = $('<li data-id="'+tile.id+'" class="widget '+f+'" data-row="'+row+'" data-col="'+col+'" data-sizex="'+x+'" data-sizey="'+y+'" data-category="'+tile.data_category+'" data-content="'+tile.data_content+'" js-link="'+tile.js[0].url+'" css-link="'+tile.css.url+'"><span class="tile '+tilecolor+' '+op+'"></span><div class="appholder"><div class="thmtxt all-loading"><i class="icon-spinner icon-spin"></i> Loading </div></div><h1 class="appname thmtxt">'+tile.title+'</h1></li>');
row = row + y;
$ul.append($li);
})
$group.append($ul);
$("div#desktop div#group_wrapper").append($group);
bindHandlers(); bindHandlers();
o.initializeWidgets(); o.initializeWidgets();
}) })

View File

@ -115,6 +115,7 @@ var orbitDesktopAPI = function(){
//takes set of arguments as array and gives callback //takes set of arguments as array and gives callback
//settings.method (string) : like open and close //settings.method (string) : like open and close
//settings.title (string) : the window title //settings.title (string) : the window title
//settings.extUrl (boolean) : true for opening external url else false
//settings.appid (string) : appid.. user can use this appid to open or close or refresh the window //settings.appid (string) : appid.. user can use this appid to open or close or refresh the window
//settings.url (string) : it is the url if you want to force external url to open in appwindow... you have to pass extURL in appid if you want to open externalurl //settings.url (string) : it is the url if you want to force external url to open in appwindow... you have to pass extURL in appid if you want to open externalurl
if(typeof settings == "undefined")settings = {}; if(typeof settings == "undefined")settings = {};
@ -123,13 +124,16 @@ var orbitDesktopAPI = function(){
return; return;
} }
if(!settings.method)settings.method = "open"; if(!settings.method)settings.method = "open";
if(!settings.extUrl)settings.extUrl = true;
if(settings.method == 'open'){ if(settings.method == 'open'){
var appurl = "http://www.rulingcom.com"; var appurl = "http://www.rulingcom.com";
o.windowcounter++; o.windowcounter++;
if(!settings.title)settings.title = "New Window "+o.windowcounter; if(!settings.title)settings.title = "New Window "+o.windowcounter;
if(settings.appid=="extURL"){ if(settings.extUrl){
if(settings.url){ if(settings.url){
if(settings.url.substr(0,3)!="http")settings.url = "http://"+settings.url;
if(settings.url.substr(0,4)!="http")settings.url = "http://"+settings.url;
console.log(settings.url)
var urlregex = new RegExp("^(http:\/\/www.|https:\/\/www.|ftp:\/\/www.|www.){1}([0-9A-Za-z]+\.)"); var urlregex = new RegExp("^(http:\/\/www.|https:\/\/www.|ftp:\/\/www.|www.){1}([0-9A-Za-z]+\.)");
if(urlregex.test(settings.url)) if(urlregex.test(settings.url))
appurl = settings.url; appurl = settings.url;
@ -143,7 +147,7 @@ var orbitDesktopAPI = function(){
return; return;
} }
} }
var whtml =$('<div id="app_frame_'+o.windowcounter+'" class="thmc2 app_frame" data-content="'+settings.appid+'"><div id="content"><div id="header" class="hh3"><div class="dtitle w2 hh3 hp" style="text-transform:capitalize;"><span class="thmtxth">'+settings.title+'</span></div><span class="icon-remove hh3 hp thmtxt"></span></div><div id="holder_'+o.windowcounter+'" class="app_holder"><iframe src="'+appurl+'" frameborder="0" scrolling="auto"></iframe><div class="clear"></div></div></div></div>'); var whtml =$('<div id="app_frame_'+o.windowcounter+'" class="thmc2 app_frame" data-app="'+settings.appid+'"><div id="content"><div id="header" class="hh3"><div class="dtitle w2 hh3 hp" style="text-transform:capitalize;"><span class="thmtxth">'+settings.title+'</span></div><span class="icon-remove hh3 hp thmtxt"></span></div><div id="holder_'+o.windowcounter+'" class="app_holder"><iframe src="'+appurl+'" frameborder="0" scrolling="auto"></iframe><div class="clear"></div></div></div></div>');
$(o.contentHolder).append(whtml); $(o.contentHolder).append(whtml);
var parentwindow = $(o.contentHolder).find("div#app_frame_"+o.windowcounter); var parentwindow = $(o.contentHolder).find("div#app_frame_"+o.windowcounter);
var app_holder_height = parentwindow.height() - 72; var app_holder_height = parentwindow.height() - 72;

View File

@ -117,6 +117,8 @@ class DesktopController< ApplicationController
jsfile = [] jsfile = []
cssfile = "" cssfile = ""
shape = "w1 h1" shape = "w1 h1"
fullsize = false
link = ""
if tile.data_category == "widget" if tile.data_category == "widget"
widge = DesktopWidget.find(tile.desktop_widget_id.to_s) widge = DesktopWidget.find(tile.desktop_widget_id.to_s)
# data_content = widge.widget_layout.file # data_content = widge.widget_layout.file
@ -125,11 +127,21 @@ class DesktopController< ApplicationController
cssfile = widge.css_default.file.as_json[:file] cssfile = widge.css_default.file.as_json[:file]
shape = widge.shape shape = widge.shape
title = widge.name title = widge.name
# binding.pry
if not widge.fullsize.nil?
fullsize = widge.fullsize
end
else else
data_content = tile.data_content data_content = tile.data_content
title = tile.title title = tile.title
case data_content
when "envocab"
link = "http://www.english-vocabulary.eu/"
when "wikibooks"
link = "http://www.wikibooks.org"
end end
gr << {"id"=>tile.id,"data_category"=>tile.data_category,"data_content"=>data_content,"js"=>jsfile,"css"=>cssfile,"shape"=>shape,"position"=>tile.position,"title"=>title} end
gr << {"id"=>tile.id,"data_category"=>tile.data_category,"data_content"=>data_content,"js"=>jsfile,"css"=>cssfile,"shape"=>shape,"position"=>tile.position,"title"=>title,"fullsize"=>fullsize,"link"=>link}
end end
# gr << a # gr << a
end end

View File

@ -6,6 +6,7 @@ class DesktopWidget
field :name field :name
field :author field :author
field :shape field :shape
field :fullsize, :type => Boolean
field :version, :type => String field :version, :type => String
has_one :css_default, as: :css, :autosave => true, :dependent => :destroy has_one :css_default, as: :css, :autosave => true, :dependent => :destroy
@ -13,7 +14,7 @@ class DesktopWidget
has_many :images, as: :imgs, :autosave => true, :dependent => :destroy has_many :images, as: :imgs, :autosave => true, :dependent => :destroy
has_many :javascripts, as: :js, :autosave => true, :dependent => :destroy has_many :javascripts, as: :js, :autosave => true, :dependent => :destroy
has_and_belongs_to_many :desktops, :autosave => true has_and_belongs_to_many :desktops, :autosave => true
belongs_to :tiles, :autosave => true has_many :tiles, :autosave => true
accepts_nested_attributes_for :images, :allow_destroy => true accepts_nested_attributes_for :images, :allow_destroy => true
accepts_nested_attributes_for :javascripts, :allow_destroy => true accepts_nested_attributes_for :javascripts, :allow_destroy => true

View File

@ -6,9 +6,10 @@ class Tile
field :data_content field :data_content
field :position, type: Integer field :position, type: Integer
field :shape field :shape
field :fullsize, type: Boolean
field :title field :title
belongs_to :group belongs_to :group
has_one :desktop_widget belongs_to :desktop_widget
end end

View File

@ -69,9 +69,9 @@ def cache_dir
def manipulate! def manipulate!
cache_stored_file! if !cached? # cache_stored_file! if !cached?
#raise File.extname(current_path.to_s).to_s #raise File.extname(current_path.to_s).to_s
image = ::MiniMagick::Image.open(current_path) # image = ::MiniMagick::Image.open(current_path)
# image = yield(image) # image = yield(image)
# image.write(current_path) # image.write(current_path)
# ::MiniMagick::Image.open(current_path) # ::MiniMagick::Image.open(current_path)

View File

@ -1,7 +1,7 @@
<div id="side"> <div id="side">
<div id="rwidget" class="wh2 thmc4"> <div id="rwidget" class="wh2 thmc4">
<ul class="docklist"> <ul class="docklist">
<li class="d_cate"><a callback-method='initializeDesktop' href="desktop/" class="widget_fn wh2 hh2" id='d_desktop' onclick="return false;"><span class="widget_icon"><img src="" alt="Home" id="home_icon" width="30" height="30"/></span></a> <li class="d_cate"><a callback-method='initializeDesktop' href="desktop/" class="widget_fn wh2 hh2" id='home' onclick="return false;"><span class="widget_icon"><img src="" alt="Home" id="home_icon" width="30" height="30"/></span></a>
<ul class="dock_child hh2 thmc4" style="width: 180px;"> <ul class="dock_child hh2 thmc4" style="width: 180px;">
<li class="dock_item"><a callback-method='initializeAppSearch' href="<%= desktop_app_manager_path %>" class="widget_fn wh2 hh2" id="d_app_manager" onclick="return false;"><span class="widget_icon"><img src="" alt="App Manager" id="app_manager_icon" width="30" height="30"/></span></a></li> <li class="dock_item"><a callback-method='initializeAppSearch' href="<%= desktop_app_manager_path %>" class="widget_fn wh2 hh2" id="d_app_manager" onclick="return false;"><span class="widget_icon"><img src="" alt="App Manager" id="app_manager_icon" width="30" height="30"/></span></a></li>
<li class="dock_item"><a callback-method='initializeSectionsManager' href="<%= desktop_allsections_path %>" class="widget_fn wh2 hh2" id="d_sections" custom-load="sections" onclick="return false;"><span class="widget_icon"><img src="" alt="All Sections" id="sections_icon" width="30" height="30"/></span></a></li> <li class="dock_item"><a callback-method='initializeSectionsManager' href="<%= desktop_allsections_path %>" class="widget_fn wh2 hh2" id="d_sections" custom-load="sections" onclick="return false;"><span class="widget_icon"><img src="" alt="All Sections" id="sections_icon" width="30" height="30"/></span></a></li>