Лично я не могу помочь вам с перетаскиваемой частью, но в отношении рекурсивной функции вы можете найти что-то вроде следующего полезного.
Я также должен был предположить, как выглядит ваш HTML, основываясь наописание, которое вы дали (некоторый HTML был бы очень полезен для вопросов такого типа).
Вы можете увидеть его в действии на следующем jsFiddle .(При использовании Firefox выберите все на панели результатов, щелкните правой кнопкой мыши и просмотрите источник выбора, чтобы увидеть обновленные атрибуты)
HTML:
<ul>
<li>
<a class="ptf-directory">Folder1</a>
<ul>
<li>
<a class="ptf-directory">Folder3</a>
<ul>
<li>
<a class="ptf-file">File4.txt</a>
</li>
</ul>
</li>
<li>
<a class="ptf-file">File1.txt</a>
</li>
</ul>
</li>
<li>
<a class="ptf-directory">Folder2</a>
</li>
<li>
<a class="ptf-file">File2.txt</a>
</li>
<li>
<a class="ptf-file">File3.txt</a>
</li>
</ul>
JQuery:
$(function(){
UpdateFolderItems($('ul:first'), '');
});
function UpdateFolderItems(folder, basePath)
{
// go through folder contents
folder.children('li').each(function(){
// get item
var item = $(this).children('a');
// generate new path for item
var newPath = basePath + '/' + item.text();
// if item is a folder
if (item.hasClass('ptf-directory'))
{
// update id on folder
item.attr('id', newPath);
// if folder content exists
var folderContent = $(this).children('ul:first');
if (folderContent.length > 0)
{
// update folder content
UpdateFolderItems(folderContent, newPath);
}
}
// if item is a file
else if (item.hasClass('ptf-file'))
{
// update href on file
item.attr('href', newPath);
}
});
}