/* ГАДЖЕТ ОБРАТНОГО ОТСЧЁТА ВРЕМЕНИ */
function __Bookmarks(id)
{
	this.lang = Locale.Gadgets.Bookmarks;
	this.Core = new __StdModuleCore(this, id, 'inet', this.lang.title, this.lang.desc);
	this.finput = {};
	this.fpanel = {};
	this.bookmarks = {};
	this.currentFolderId = null;

	this.createPanelContent();
	this.createPanelSettings();
	Update.request('Bookmarks', 'module', 'startup', { id: this.id }, true);
}

__Bookmarks.prototype.Relay = function(data, part)
{
	switch(data.event.action)
	{
		case 'startup':
			this.bookmarks = {};
			if(!isEmpty(data.variables.bookmarks))
				for(var i in data.variables.bookmarks)
				{
					this.bookmarks[i] = {};	//исключаем появление пустых [] вместо {}
					if(!isEmpty(data.variables.bookmarks[i]))
						this.bookmarks[i] = data.variables.bookmarks[i];
				}
			this.init();
			mActionsInspector.execute(this.id);
			break;

		case 'addFolder':
			if(data.variables.status == 'ok')
			{
				this.bookmarks[data.variables.id] = {name: data.variables.name, links: {}};
				this.init();
				this.makeFolderCurrent(data.variables.id);
			}
			else
				window.alert(this.lang.msg['ErrorWhenFolderCreate']);
			break;

		case 'renameFolder':
			if(data.variables.status == 'ok')
			{
				if(this.bookmarks[data.variables.id])
					this.bookmarks[data.variables.id].name = data.variables.name;
				this.init();
				this.makeFolderCurrent(data.variables.id);
			}
			else
				window.alert(this.lang.msg['ErrorWhenFolderRename']);
			break;

		case 'deleteFolder':
			if(data.variables.status == 'ok')
			{
				if(this.bookmarks[data.variables.id])
					delete this.bookmarks[data.variables.id];
				this.init();
			}
			else
				window.alert(this.lang.msg['ErrorWhenFolderDelete']);
			break;

		case 'addLink':
			if(data.variables.status == 'ok')
			{
				this.bookmarks[data.variables.fid].links[data.variables.id] = {url: data.variables.url, title: data.variables.title, desc: data.variables.desc};
				if(!isEmpty(data.variables.tags))
					this.bookmarks[data.variables.fid].links[data.variables.id].tags = data.variables.tags;
				this.init();
				this.makeFolderCurrent(this.currentFolderId);
				//обновить вкладку с результатами?
			}
			else
				window.alert(this.lang.msg['ErrorWhenLinkAdd']);
			break;
			
		case 'deleteLink':
			if(data.variables.status == 'ok')
			{
			}
			else
			{
				window.alert(this.lang.msg['ErrorWhenLinkDelete']);
			}
			if(this.currentFolderId)
				this.makeFolderCurrent(this.currentFolderId);
			else if(this.workspace)
				this.workspace.innerHTML = '';
			break;

		case 'importFromGadgets':
			if(data.variables.status == 'ok')
			{
				this.bookmarks = {};
				if(!isEmpty(data.variables.bookmarks))
					for(var i in data.variables.bookmarks)
					{
						this.bookmarks[i] = {};
						if(!isEmpty(data.variables.bookmarks[i]))
							this.bookmarks[i] = data.variables.bookmarks[i];
					}
				this.init();
				this.makeFolderCurrent(data.variables.id);
				window.alert(this.lang.msg['BookmarksImportedOk']);
			}
			else
			{
				window.alert(this.lang.msg['ErrorWhenBookmarksImport']);
			}
			break;

		default:
			break;
	}
}

__Bookmarks.prototype.onDelete = function()
{
	if(this.workspaceId && Desktop.State.cMain.content[this.workspaceId])
		Desktop.DeleteTabByID('cMain', this.workspaceId);
}

__Bookmarks.prototype.createPanelContent = function()
{
	this.createFormSearchLinks();
	this.createPanelTools();
	this.fpanel.folders = ce('UL', this.Content);
}

__Bookmarks.prototype.createPanelSettings = function()
{
	this.tabIds = {lAdd: this.id +'_lAdd_tab', lImport: this.id +'_lImport_tab', lExport: this.id +'_lExport_tab'};
	this.Tabs = new __Tabs(this.Options, 'gadget');
	this.Tabs.create(this.tabIds.lAdd, Locale['Adding']);
	this.Tabs.create(this.tabIds.lImport, Locale['Import']);
	this.Tabs.create(this.tabIds.lExport, Locale['Export']);
	this.initFormAddLink();
	this.Tabs.show(this.tabIds.lAdd);
	this.initFormImport();
	this.initFormExport();
}

__Bookmarks.prototype.init = function()
{
	var self = this;

	this.fpanel.folders.innerHTML = '';
	for(var i in this.bookmarks)
	{
		var oLi = ce('LI', this.fpanel.folders, {fid: i, opened: false, onclick: rollFolder, className: 'href'}, {padding: '2px 3px'});
		ce('IMG', oLi, {src: '/img/filestore/fold.gif', title: this.lang['FolderOfBookmarks']}, {paddingRight: '10px'});
		ce('SPAN', oLi, {innerHTML: this.bookmarks[i].name});
	}

	function rollFolder()
	{
		if(self.currentFolderId && this.fid==self.currentFolderId)
		{
			this.style.backgroundColor = '';
			self.currentFolderId = null;
		}
		else
			self.makeFolderCurrent(this.fid);
		if(!this.opened)
		{
			this.opened = true;
			this.firstChild.src = '/img/filestore/fold_op.gif';
			self.showBookmarksByFolder(this.fid);
			Desktop.SetActiveByID('cMain', self.workspaceId);
		}
		else
		{
			this.opened = false;
			this.firstChild.src = '/img/filestore/fold.gif';
		}
	}
}

//Делает папку текущей (выделяет)
__Bookmarks.prototype.makeFolderCurrent = function(folderId)
{
	for(var i=0; i<this.fpanel.folders.childNodes.length; i++)
	{
		if(this.fpanel.folders.childNodes[i].fid != folderId)
			this.fpanel.folders.childNodes[i].style.backgroundColor = '';
		else
		{
			this.fpanel.folders.childNodes[i].style.backgroundColor = '#DFDFFE';
			this.currentFolderId = folderId;
			this.showBookmarksByFolder(folderId);
		}
	}
}

__Bookmarks.prototype.createFormSearchLinks = function()
{
	var self = this;

	this.fpanel.formSearchLink = ce('FORM', this.Content, null, {marginBottom: '10px', paddingBottom: '8px', borderBottom: '1px #CCCCCC dotted'});
	ce('H4', this.fpanel.formSearchLink, {innerHTML: this.lang['SearchInBookmarks']});
	this.finput.keyword = ce('INPUT', this.fpanel.formSearchLink, {type: 'text', maxLength: 32, onfocus: fShow});
	ce('INPUT', this.fpanel.formSearchLink, {type: 'submit', value: 'ОК', className: 'std_button'});
	var oDiv = ce('DIV', this.fpanel.formSearchLink, null, {display: 'none', marginTop: '10px'});
	oDiv.innerHTML += '<input type="radio" name="radioBy" checked=true id="'+this.id+'_radioBy1" style="marginRight: 10px"/>'+ this.lang['ByTags'] +'<br/>';
	oDiv.innerHTML += '<input type="radio" name="radioBy" id="'+this.id+'_radioBy2" style="marginRight: 10px"/>'+ this.lang['ByKeyword'] +'<br/>';
	this.finput.searchByTags = document.getElementById(this.id+'_radioBy1');
	this.finput.searchByKeyword = document.getElementById(this.id+'_radioBy2');
	this.finput.searchByTags.onchange = function() {
/*
		if(this.checked)
		{
			for(var i in self.finput.searchByKeywordIn)
			{
				self.finput.searchByKeywordIn[i].disabled = true;
			}
		}
*/
		return false;
	}
	this.finput.searchByKeyword.onchange = function() {
/*
		if(this.checked)
		{
			for(var i in self.finput.searchByKeywordIn)
			{
				self.finput.searchByKeywordIn[i].disabled = false;
			}
		}
*/
		return false;
	}

	this.finput.searchByKeywordIn = {};
	var t = ce('NOBR', oDiv, null, {paddingRight: '15px'});
	this.finput.searchByKeywordIn.titles = ce('INPUT', t, {type: 'checkbox', checked: true}, {marginRight: '5px'});
	ce('SPAN', t, {innerHTML: this.lang['InTitles']});
	t = ce('NOBR', oDiv, null, {paddingRight: '15px'});
	this.finput.searchByKeywordIn.urls = ce('INPUT', t, {type: 'checkbox'}, {marginRight: '5px'});
	ce('SPAN', t, {innerHTML: this.lang['InUrls']});
	ce('BR', oDiv);
	t = ce('NOBR', oDiv, null, {paddingRight: '15px'});
	this.finput.searchByKeywordIn.descs = ce('INPUT', t, {type: 'checkbox'}, {marginRight: '5px'});
	ce('SPAN', t, {innerHTML: this.lang['InDescs']});
	ce('IMG', ce('DIV', oDiv, null, {textAlign: 'right'}), {src: '/img/icons/svernut.gif', onclick: fHide, className: 'href', title: this.lang['ToRoll']});

	this.fpanel.formSearchLink.onsubmit = function()
	{
		if(self.finput.keyword.value.length < 2)
		{
			window.alert(self.lang.msg['WordMustBeNotLessThanLetters']);
			return false;
		}
		if(self.finput.searchByTags.checked)
		{
			self.showBookmarksByTags(self.finput.keyword.value);
			Desktop.SetActiveByID('cMain', self.workspaceId);
		}
		else if(self.finput.searchByKeyword.checked)
		{
			var flag1 = false;
			var flag2 = false;
			var flag3 = false;
			if(self.finput.searchByKeywordIn.titles.checked)
				flag1 = true;
			if(self.finput.searchByKeywordIn.urls.checked)
				flag2 = true;
			if(self.finput.searchByKeywordIn.descs.checked)
				flag3 = true;
			if(!flag1 && !flag2 && !flag3)
			{
				window.alert(self.lang.msg['NeedToSelectAtLeastOneFieldForSearch']);
				return false;
			}
			self.showBookmarksByKeyword(self.finput.keyword.value, flag1, flag2, flag3);
			Desktop.SetActiveByID('cMain', self.workspaceId);
		}
		return false;
	}

	function fShow()
	{
		oDiv.style.display = '';
		return false;
	}
	function fHide()
	{
		oDiv.style.display = 'none';
		return false;
	}
}

__Bookmarks.prototype.createPanelTools = function()
{
	var self = this;
	this.fpanel.tools = ce('DIV', this.Content, null, {marginBottom: '10px', paddingBottom: '8px', borderBottom: '1px #CCCCCC dotted'});
	ce('IMG', this.fpanel.tools, {src: '/img/bookmarks/bm_add.gif', className: 'href', onclick: addLink, title: this.lang['AddLink']}, {marginRight: '10px'});
	ce('IMG', this.fpanel.tools, {src: '/img/filestore/folder_add.gif', className: 'href', onclick: addFolder, title: this.lang['CreateFolder']}, {marginRight: '10px'});
	ce('IMG', this.fpanel.tools, {src: '/img/filestore/f_edit.gif', className: 'href', onclick: editFolder, title: this.lang['RenameFolder']}, {marginRight: '10px'});
	ce('IMG', this.fpanel.tools, {src: '/img/filestore/f_del.gif', className: 'href', onclick: delFolder, title: this.lang['DeleteFolder']}, {marginRight: '10px'});

	function addLink()
	{
		if(!self.currentFolderId)
		{
			window.alert(self.lang.msg['NeedToSelectFolder']);
			return;
		}
		self.initFormAddLink();
		self.Options.style.display = '';	
		self.finput.addLink.url.focus()
	}

	function addFolder()
	{
		var fname = window.prompt(self.lang.msg['EnterFolderName'], self.lang['NewFolder']);
		if(fname && fname.length < 64)
		{
			Update.request('Bookmarks', 'module', 'addFolder', {id: self.id}, {name: fname}, true);
		}
	}

	function editFolder()
	{
		if(!self.currentFolderId)
		{
			window.alert(self.lang.msg['NeedToSelectFolder']);
			return;
		}
		var fname = window.prompt(self.lang.msg['EnterNewFolderName'], self.bookmarks[self.currentFolderId].name);
		if(fname && fname.length < 64)
		{
			Update.request('Bookmarks', 'module', 'renameFolder', {id: self.id}, {id: self.currentFolderId, name: fname}, true);
		}
	}

	function delFolder()
	{
		if(!self.currentFolderId)
		{
			window.alert(self.lang.msg['NeedToSelectFolder']);
			return;
		}
		if(window.confirm(self.lang.msg['WithFolderWillBeDeleteContent'][0]+ self.bookmarks[self.currentFolderId].name +self.lang.msg['WithFolderWillBeDeleteContent'][1]))
		{
			Update.request('Bookmarks', 'module', 'deleteFolder', {id: self.id}, {id: self.currentFolderId}, true);
		}
	}
}

__Bookmarks.prototype.showBookmarks = function(obj, title)
{
	var self = this;
	Desktop.initTabFromModule(this.id);
	var oTable = ce('TABLE', ce('FORM', this.workspace, {onsubmit: function() {return false;}}), {className: 'wborder wborderw'}, {width: '95%', margin: '1%', backgroundColor: '#FFFFFF'})
	var oTbody = ce('THEAD', oTable);
	if(title)
		ce('TH', ce('TR', oTbody, {bgColor: '#F0F0F0'}), {colSpan: 5, innerHTML: '<h4>'+ title +'</h4>'});
	var oTr = ce('TR', oTbody);
	ce('TH', oTr, {innerHTML: Locale['Name']});
	ce('TH', oTr, {innerHTML: Locale['Address']});
	ce('TH', oTr, {innerHTML: Locale['Description']});
	ce('TH', oTr, {innerHTML: Locale['Tags']});
	ce('TH', oTr, {innerHTML: '&nbsp;'}, {width: '29px'});
	oTbody = ce('TBODY', oTable);
	for(var fid in obj)
	{
		for(var i=0; i<obj[fid].length; i++)
		{
			var oTr = null;
			if(!this.bookmarks[fid].links[obj[fid][i]].url)
				continue;
			for(var j=0; j<oTbody.childNodes.length; j++)	//сортируем
			{
				if(String(this.bookmarks[oTbody.childNodes[j].fid].links[oTbody.childNodes[j].bid].title) >= String(this.bookmarks[fid].links[obj[fid][i]].title))
				{
					oTr = ce('TR', null, {fid: fid, bid: obj[fid][i]});
					oTbody.insertBefore(oTr, oTbody.childNodes[j]);
					break;
				}
			}
			if(!oTr)
			{
				oTr = ce('TR', oTbody, {fid: fid, bid: obj[fid][i]});
			}
			ce('TD', oTr, {innerHTML: this.bookmarks[fid].links[obj[fid][i]].title});
			var tmp = this.bookmarks[fid].links[obj[fid][i]].url;
			if(tmp.length > 43) tmp = tmp.substr(0, 40)+'...'
			var oTd = ce('TD', oTr, null, {whiteSpace: 'nowrap'});
			ce('A', oTd, {href: this.bookmarks[fid].links[obj[fid][i]].url, onclick: openLink, className: 'std_link', innerHTML: tmp});
			ce('IMG', oTd, {src: '/img/dialog/open_newtab.gif', title: Locale['ToOpenInNewWindow'], className: 'href', url: this.bookmarks[fid].links[obj[fid][i]].url, onclick: openInNewWindow, align: 'absMiddle'}, {marginLeft: '10px'});
			var t = '';
			if(this.bookmarks[fid].links[obj[fid][i]].desc)
				t = this.bookmarks[fid].links[obj[fid][i]].desc;
			ce('TD', oTr, {innerHTML: t});
			t = '';
			if(!isEmpty(this.bookmarks[fid].links[obj[fid][i]].tags))
			{
				for(var j=0; j<this.bookmarks[fid].links[obj[fid][i]].tags.length; j++)
				{
					if(t) t += ', ';
					t += this.bookmarks[fid].links[obj[fid][i]].tags[j];
				}
			}
			ce('TD', oTr, {innerHTML: t});
			oTd = ce('TD', oTr)
			ce('IMG', oTd, {lid: obj[fid][i], src: '/img/icons/edit2.gif', onclick: editLink, className: 'href', title: Locale['ToEdit'], align: 'absMiddle'});
			ce('IMG', oTd, {lid: obj[fid][i], src: '/img/icons/x2.gif', onclick: delLink, className: 'href', title: this.lang['DeleteLink'], align: 'absMiddle'}, {marginLeft: '5px'});
		}
	}
	for(i=0; i<oTbody.childNodes.length; i++)
		if(i%2) oTbody.childNodes[i].bgColor = '#F0F0F0';

	function openLink()
	{
		NavBar.go(this.href);
		return false;
	}

	function delLink()
	{
		if(window.confirm(self.lang.msg['SureToDeleteLink']))
		{
			Update.request('Bookmarks', 'module', 'deleteLink', {id: self.id}, {fid: this.parentNode.parentNode.fid, id: this.lid}, true);
			if(self.bookmarks[this.parentNode.parentNode.fid].links[this.lid])
				delete self.bookmarks[this.parentNode.parentNode.fid].links[this.lid];
		}
	}

	function editLink()
	{
		var tmp = this.parentNode.parentNode.childNodes;
		var oTds = {title: tmp[0], url: tmp[1], desc: tmp[2], tags: tmp[3]};
		var oInputs = {title: null, url: null, desc: null, tags: null};
		var t = oTds.title.innerHTML;
		oTds.title.innerHTML = '';
		oInputs.title = ce('INPUT', oTds.title, {value: t}, {width: (oTds.title.getWidth()-10)+'px'});
		t = oTds.url.firstChild.href;
		oTds.url.innerHTML = '';
		oInputs.url = ce('INPUT', oTds.url, {value: t}, {width: (oTds.url.getWidth()-10)+'px'});
		t = oTds.desc.innerHTML;
		oTds.desc.innerHTML = '';
		oInputs.desc = ce('INPUT', oTds.desc, {value: t}, {width: (oTds.desc.getWidth()-10)+'px'});
		t = oTds.tags.innerHTML;
		oTds.tags.innerHTML = '';
		oInputs.tags = ce('INPUT', oTds.tags, {value: t}, {width: (oTds.tags.getWidth()-10)+'px'});
		oSubmit = ce('INPUT', null, {type: 'button', value: 'OK', className: 'std_button'});
		this.style.display = 'none';
		tmp[4].insertBefore(oSubmit, tmp[4].lastChild);
		var oThis = this;
		oSubmit.onclick = function()
		{
			var url = oInputs.url.value;
			if(!(/(\:\/\/)|(\|)/.test(url)))	//если не указан протокол
				url = 'http://'+ url;
			var data = {fid: oThis.parentNode.parentNode.fid, id: oThis.lid, url: escape(url), title: oInputs.title.value, desc: oInputs.desc.value};
			if(oInputs.tags.value.length > 1)
				data.tags = oInputs.tags.value.split(/[\s\t]*[\,\;\|][\s\t]*/, 5);
			Update.request('Bookmarks', 'module', 'editLink', {id: self.id}, data, true);
			self.bookmarks[data.fid].links[data.id] = {title: data.title, url: url, desc: data.desc, tags: []};
			if(data.tags)
				self.bookmarks[data.fid].links[data.id].tags = data.tags;
			self.showBookmarks(obj, title);
			Desktop.SetActiveByID('cMain', self.workspaceId);
		}
	}
}

//Выводит закладки, принадлежащие папке folderId
__Bookmarks.prototype.showBookmarksByFolder = function(folderId)
{
	var obj = {};
	for(var i in this.bookmarks[folderId])
	{
		obj[folderId] = [];
		for(var i in this.bookmarks[folderId].links)
			obj[folderId].push(i);
	}
	this.showBookmarks(obj, '<img src="/img/filestore/fold_op.gif" title="'+ this.lang['FolderOfLinks'] +'" style="padding-right: 10px;"/>'+this.bookmarks[folderId].name);
	mActionsInspector.addAction(this.id, this.workspaceId, 'showBookmarksByFolder', {folderId: folderId});
}

__Bookmarks.prototype.showBookmarksByTags = function(w)
{
	if(w.length<2) return;
	var tags = w.split(/[\s\t]*[\,\;\|][\s\t]*/, 5);	//допустимые разделители - ',', '|', ';'
	var obj = {};
	for(var fid in this.bookmarks)
	{
		for(var i in this.bookmarks[fid].links)
		{
			if(isEmpty(this.bookmarks[fid].links[i].tags))
				continue;
			var n = 0;			
			for(var j=0; j<this.bookmarks[fid].links[i].tags.length; j++)
			{
				for(var k=0; k<tags.length; k++)
				{
					if(this.bookmarks[fid].links[i].tags[j] == tags[k])
						n++;
				}
			}
			if(n == tags.length)
			{
				if(!obj[fid]) obj[fid] = [];
				obj[fid].push(i);
			}
		}
	}
	this.showBookmarks(obj, this.lang.msg['FoundedByTagLinks'][0] + w + this.lang.msg['FoundedByTagLinks'][1]);
	mActionsInspector.addAction(this.id, this.workspaceId, 'showBookmarksByTags', {tags: w});
}

__Bookmarks.prototype.showBookmarksByKeyword = function(w, flTitle, flUrl, flDesc)
{
	var self = this;
	if(w.length<2) return;
	var regx = new RegExp();
	regx.compile(''+w+'', 'i');
	var obj = {};
	var n = -1;
	for(var fid in this.bookmarks)
	{
		for(var i in this.bookmarks[fid].links)
		{
			if(flTitle && processLink('title', fid, i))
				continue;
			if(flUrl && processLink('url', fid, i))
				continue;
			if(flDesc && processLink('desc', fid, i))
				continue;
		}
	}
	this.showBookmarks(obj, this.lang.msg['FoundedByKeywordLinks'][0] + w + this.lang.msg['FoundedByKeywordLinks'][1]);
	mActionsInspector.addAction(this.id, this.workspaceId, 'showBookmarksByKeyword', {kw: w, flTitle: flTitle, flUrl: flUrl, flDesc: flDesc});

	//Ищет в поле field соотв. линка и добавляет его, в случае успеха, в obj
	function processLink(field, folderId, linkId)
	{
		if(self.bookmarks[folderId].links[linkId][field].search(regx) > -1)
		{
			if(!obj[folderId]) obj[folderId] = [];
			obj[folderId].push(linkId);
			return true;
		}
		return false;
	}
}

//Инициирует форму добавления ссылки
__Bookmarks.prototype.initFormAddLink = function()
{
	var self = this;

	if(this.fpanel.formAddLink)
	{
		this.Tabs.show(this.tabIds.lAdd);
		return;
	}
	else
	{
		this.finput.addLink = {};
		this.fpanel.formAddLink = ce('FORM', this.Tabs.data[this.tabIds.lAdd].content);
		var oTbody = ce('TBODY', ce('TABLE', this.fpanel.formAddLink, {className: 'wform'}));
		var oTr = ce('TR', oTbody);
		ce('TD', oTr, {innerHTML: Locale['URL'] +':'});
		this.finput.addLink.url = ce('INPUT', ce('TD', oTr), {type: 'text', maxLength: 255}, {width: '120px', marginLeft: '6px'});
		oTr = ce('TR', oTbody);
		ce('TD', oTr, {innerHTML: Locale['Title'] +':'});
		this.finput.addLink.title = ce('INPUT', ce('TD', oTr), {type: 'text', maxLength: 127}, {width: '120px', marginLeft: '6px'});
		oTr = ce('TR', oTbody);
		ce('TD', oTr, {innerHTML: Locale['Description'] +':'});
		this.finput.addLink.desc = ce('INPUT', ce('TD', oTr), {type: 'text', maxLength: 255}, {width: '120px', marginLeft: '6px'});
		oTr = ce('TR', oTbody);
		ce('SUP', ce('TD', oTr, {innerHTML: Locale['Tags'] +':'}), {innerHTML: '[?]', tipInfo: this.lang.msg['TagInputInfo'][0] +' 5&nbsp;'+ this.lang.msg['TagInputInfo'][1], onmouseover: showTip, onmouseout: hideTip});

		this.finput.addLink.tags = ce('INPUT', ce('TD', oTr), {type: 'text', maxLength: 80}, {width: '120px', marginLeft: '6px'});
		ce('INPUT', ce('TD', ce('TR', oTbody), {colSpan: 2}), {type: 'submit', value: 'ОК', className: 'std_button'});
		this.fpanel.formAddLink.onsubmit = function()
		{
			if(!self.currentFolderId)
			{
				window.alert(self.lang.msg['NeedToSelectFolder']);
				return false;
			}
			var url = self.finput.addLink.url.value;
			if(!(/(\:\/\/)|(\|)/.test(url)))	//если не указан протокол
				url = 'http://'+ url;
			url = escape(url);
			var obj = {fid: self.currentFolderId, url: url, title: self.finput.addLink.title.value, desc: self.finput.addLink.desc.value};
			if(self.finput.addLink.tags.value.length > 1)
				obj.tags = self.finput.addLink.tags.value.split(/[\s\t]*[\,\;\|][\s\t]*/, 5);
			Update.request('Bookmarks', 'module', 'addLink', {id: self.id}, obj, true);
			self.finput.addLink.url.value = '';
			self.finput.addLink.title.value = '';
			self.finput.addLink.desc.value = '';
			self.finput.addLink.tags.value = '';
			return false;
		}
	}

	function showTip(e)
	{
		if(!this.tipInfo) return;
		e = e || window.event;
		Tooltip.Show(this.tipInfo, Event.element(e), 200);
	}
	function hideTip()
	{
		if(!this.tipInfo) return;
		Tooltip.Hide();
	}
}

//Инициирует форму импортирования файла с закладками
__Bookmarks.prototype.initFormImport = function()
{
	var self = this;
	var oDiv = ce('DIV', this.Tabs.data[this.tabIds.lImport].content, null, {marginBottom: '10px'});
	ce('IMG', oDiv, {src: '/img/bookmarks/scheme.gif', className: 'href', align: 'absMiddle', onclick: function(){self.importFromOtherGadgets();}, title: this.lang['ToImportBookmarksFromOtherModules']}, {marginRight: '10px'})
	ce('SPAN', oDiv, {innerHTML: this.lang['ToImportFromOtherModules'], className: 'href', onclick: function(){self.importFromOtherGadgets();}});
	ce('IMG', ce('H4', this.Tabs.data[this.tabIds.lImport].content, {innerHTML: this.lang['ImportFromBrowser']}, {marginBottom: '6px'}), {src: '/img/icons/question.gif', className: 'href', align: 'absMiddle', flag: true, onclick: tip}, {marginLeft: '10px'});
	oDiv = ce('DIV', this.Tabs.data[this.tabIds.lImport].content);
	oDiv.innerHTML = '<form method="post" enctype="multipart/form-data" target="'+ this.id +'_fileUploadFrame" action="/gateway/bookmarks/import.php" id="'+ this.id +'_fileUploadForm" style=""><iframe name="'+ this.id +'_fileUploadFrame" id="'+ this.id +'_fileUploadFrame" style="display: none;"></iframe></form>';
	this.fpanel.formImportFile = document.getElementById(this.id +'_fileUploadForm');
	ce('INPUT', this.fpanel.formImportFile, {type: 'hidden', name: 'gadget_id', value: this.id});	
	this.finput.bmFile = ce('INPUT', this.fpanel.formImportFile, {type: 'file', name: 'bmfile'}, {width: '200px'});
	ce('BR', this.fpanel.formImportFile);
	ce('INPUT', this.fpanel.formImportFile, {type: 'submit', value: 'ОК', className: 'std_button'});

	function tip(e)
	{
		if(this.flag)
		{
			e = e || window.event;
			Tooltip.Show(self.lang.msg['HelpImportFromBrowsers'], Event.element(e), 350, 0);
			this.flag = false;
		}
		else
		{
			Tooltip.Hide();
			this.flag = true;
		}
	}
}

__Bookmarks.prototype.processAnswerImport = function(errs)
{
	if(!isEmpty(errs))
		window.alert(this.lang.msg['ErrorsWhenImporting'] +"\n"+ errs[0]);
	Update.request('Bookmarks', 'module', 'startup', {id: this.id}, true);
}

//Инициирует форму экспортирования файла с закладками
__Bookmarks.prototype.initFormExport = function()
{
	var self = this;
	ce('H4', this.Tabs.data[this.tabIds.lExport].content, {innerHTML: this.lang['ExportToBrowser'] +':'}, {marginBottom: '6px'});
	var oDiv = ce('UL', this.Tabs.data[this.tabIds.lExport].content, null, {marginBottom: '10px'});
	ce('A', ce('LI', oDiv, {innerHTML: '<img src="/img/bookmarks/ico_ie.gif" align="absmiddle" style="margin-right: 7px"/>',  title: 'MS Internet Explorer'}, {marginBottom: '5px'}), {innerHTML: 'MS Internet Explorer', href: '/gateway/bookmarks/export.php?gid='+this.id+'&type=msie', target: this.id +'_fileUploadFrame'});
	ce('A', ce('LI', oDiv, {innerHTML: '<img src="/img/bookmarks/ico_ff.gif" align="absmiddle" style="margin-right: 7px"/>',  title: 'Mozilla Firefox'}, {marginBottom: '5px'}), {innerHTML: 'Mozilla Firefox', href: '/gateway/bookmarks/export.php?gid='+this.id+'&type=ff', target: this.id +'_fileUploadFrame'});
	ce('A', ce('LI', oDiv, {innerHTML: '<img src="/img/bookmarks/ico_opera.gif" align="absmiddle" style="margin-right: 7px"/>',  title: 'Opera'}, {marginBottom: '5px'}), {innerHTML: 'Opera', href: '/gateway/bookmarks/export.php?gid='+this.id+'&type=opera', target: this.id +'_fileUploadFrame'});
}

//Импортирует в гаджет все закладки из других аналогичных гаджетов
__Bookmarks.prototype.importFromOtherGadgets = function()
{
	var t = [];
	for(var i in Modules)
	{
		if(Modules[i].Object.type != this.type)
			continue;
		if(Modules[i].Object.id == this.id)
			continue
		t.push(Modules[i].Object.id);
	}
	if(t.length == 0)
	{
		window.alert(this.lang.msg['NotFoundOtherGadgets']);
		return;
	}
	if(window.confirm(this.lang.msg['ImportFromOtherGadgets']))
	{
		Update.request('Bookmarks', 'module', 'importFromGadgets', {id: this.id}, {to: this.id, ids: t}, true);
	}
}

__Bookmarks.prototype.onTabDelete = function()
{
	if(this.workspace)
	{
		this.Content.style.display = 'block';
		this.workspace = null;
		this.workspaceId = null;
	}
}
