(function() {
var BX = window.BX;
if(BX.Access)
	return;

BX.Access = 
{
	bInit: false,
	waitDiv: null, 
	waitPopup: null,
	bDialogLoaded: false,
	selectedProvider: '',
	obSelected: {},
	obCnt: {__providers_cnt: 0},
	obAlreadySelected: {},
	obSelectedBind: {},
	popup: null,
	callback: null,
	obProviderNames: {},
	arParams: {}
}

BX.Access.Init = function(arParams)
{
	if(arParams)
		BX.Access.arParams = arParams;
	
	if(BX.Access.bInit)
		return;

	BX.Access.bInit = true;
		
	BX.ready(BX.delegate(function()
	{
		BX.Access.popup = BX.PopupWindowManager.create("BXUserRights", null, {
			autoHide: false,
			zIndex: 0,
			offsetLeft: 0,
			offsetTop: 0,
			draggable: {restrict:true},
			closeByEsc: true,
			titleBar: {content: BX.create("span", {html: BX.message('js_access_title'), 'props': {'className': 'access-title-bar'}})}, 
			closeIcon: { right : "12px", top : "10px"}, 
			buttons: [
				new BX.PopupWindowButton({
					text : BX.message('js_access_select'),
					className : "popup-window-button-accept",
					events : { click : function() 
					{ 
						this.popupWindow.close();
						
						BX.Access.SaveLRU();
						
						BX.Access.SaveSelected();

						if(BX.Access.callback)
							BX.Access.callback(BX.Access.obSelected);
					}}
				}),
	
				new BX.PopupWindowButtonLink({
					text: BX.message('js_access_close'),
					className: "popup-window-button-link-cancel",
					events: { click : function()
					{
						this.popupWindow.close(); 
					}}
				})
			],
			content: '<div class="access-container"></div>',
			events: {
				onAfterPopupShow: function()
				{
					if(!BX.Access.bDialogLoaded)
					{
						BX.Access.showWait(this.contentContainer);
						BX.ajax.post(
							'/bitrix/tools/access_dialog.php', 
							{
								lang: BX.message('LANGUAGE_ID'),
								site_id: BX.message('SITE_ID') || '',
								arParams: BX.Access.arParams
							}, 
							BX.delegate(function(result)
							{
								this.setContent(result);
								BX.Access.closeWait();
								BX.Access.bDialogLoaded = true;
							}, 
							this)
						);
					}
					else
					{
						BX.Access.ClearSelection();
					}
					BX.onCustomEvent(BX.Access, "onAfterPopupShow", []);
				}
			}
		});
	}, this));
}

BX.Access.ShowForm = function(arParams)
{
	if(!arParams.bind)
		arParams.bind = 'bind';
	BX.Access.bind = arParams.bind;

	if(BX.Access.obSelectedBind[arParams.bind])
		BX.Access.obAlreadySelected = BX.Access.obSelectedBind[arParams.bind];
	else
		BX.Access.obAlreadySelected = {};

	BX.Access.callback = arParams.callback;
	BX.Access.popup.params.zIndex = (BX.WindowManager? BX.WindowManager.GetZIndex() : 0);
	BX.Access.popup.show();
}

BX.Access.showWait = function(div)
{
	BX.Access.waitDiv = BX.Access.waitDiv || div;
	div = BX(div || BX.Access.waitDiv);

	if (!BX.Access.waitPopup)
	{
		BX.Access.waitPopup = new BX.PopupWindow('ur_wait', div, {
			autoHide: true,
			lightShadow: true,
			zIndex: (BX.WindowManager? BX.WindowManager.GetZIndex() : 2),
			content: BX.create('DIV', {props: {className: 'ur-wait'}})
		});
	}
	else
	{
		BX.Access.waitPopup.setBindElement(div);
	}

	var height = div.offsetHeight, width = div.offsetWidth;
	if (height > 0 && width > 0)
	{
		BX.Access.waitPopup.setOffset({
			offsetTop: -parseInt(height/2+15),
			offsetLeft: parseInt(width/2-15)
		});

		BX.Access.waitPopup.show();
	}

	return BX.Access.waitPopup;
}

BX.Access.closeWait = function()
{
	if(BX.Access.waitPopup)
		BX.Access.waitPopup.close();
}

BX.Access.SelectProvider = function(id)
{
	if(BX.Access.selectedProvider != '')
	{
		BX('access_btn_'+BX.Access.selectedProvider).className = 'access-provider-button';
		BX('access_provider_'+BX.Access.selectedProvider).style.display = 'none';
	}
	BX('access_btn_'+id).className = 'access-provider-button access-provider-button-selected';
	BX('access_provider_'+id).style.display = '';
	BX.Access.selectedProvider = id;
	
	BX.onCustomEvent(BX.Access, "onSelectProvider", [{'provider': id}]);
}

BX.Access.AddSelection = function(ob)
{
	if(!BX.Access.obSelected[ob.provider])
	{
		BX.Access.obSelected[ob.provider] = {};
		BX.Access.obCnt[ob.provider] = 0;
		BX.Access.obCnt.__providers_cnt++;
	}

	if(!BX.Access.obSelected[ob.provider][ob.id])
	{
		BX.Access.obSelected[ob.provider][ob.id] = BX.clone(ob);
		BX.Access.obCnt[ob.provider]++;

		BX('access_selected_title').style.display = 'none';
		BX('access_selected_provider_'+ob.provider).style.display = '';
		BX('access_selected_items_'+ob.provider).appendChild(BX.create('div', {
			props: {
				'className':'bx-finder-box-selected-item',
				'id': 'access_selected_item_'+ob.id
			}, 
			html: '<a href="javascript:void(0);" onclick="BX.Access.RemoveSelection(\''+ob.provider+'\', \''+ob.id+'\')" class="bx-finder-box-selected-item-icon"></a><span class="bx-finder-box-selected-item-text">'+ob.name+'</span>'
		}));

		BX('access_sel_count_'+ob.provider).innerHTML = '('+BX.Access.obCnt[ob.provider]+')';
	}
}

BX.Access.RemoveSelection = function(provider, id, bClearSelected)
{
	delete BX.Access.obSelected[provider][id];
	BX.Access.obCnt[provider]--;
	
	var item = BX('access_selected_item_'+id);
	item.parentNode.removeChild(item);

	if(BX.Access.obCnt[provider] == 0)
	{
		delete BX.Access.obSelected[provider];
		BX.Access.obCnt.__providers_cnt--;

		BX('access_selected_provider_'+provider).style.display = 'none';
		
		if(BX.Access.obCnt.__providers_cnt == 0)
			BX('access_selected_title').style.display = '';
	}
	else
	{
		BX('access_sel_count_'+provider).innerHTML = '('+BX.Access.obCnt[provider]+')';
	}

	BX.onCustomEvent(BX.Access, "onDeleteItem", [{'provider': provider, 'id': id}]);
}

BX.Access.ClearSelection = function()
{
	for(var provider in BX.Access.obSelected)
		for(var id in BX.Access.obSelected[provider])
			BX.Access.RemoveSelection(provider, id);
	BX.Access.obSelected = {};
}

BX.Access.SaveLRU = function()
{
	BX.ajax.post('/bitrix/tools/access_dialog.php', {
		LRU: BX.Access.obSelected,
		mode: 'save_lru',
		sessid: BX.bitrix_sessid()
	});
}

BX.Access.SaveSelected = function()
{
	if(!BX.Access.obSelectedBind[BX.Access.bind])
		BX.Access.obSelectedBind[BX.Access.bind] = {};
	
	for(var pr in BX.Access.obSelected)
		for(var id in BX.Access.obSelected[pr])
			 BX.Access.obSelectedBind[BX.Access.bind][id] = true;
}

BX.Access.SetSelected = function(obSel, bind)
{
	if(!bind)
		bind = 'bind';

	BX.Access.obSelectedBind[bind] = obSel;
}

BX.Access.DeleteSelected = function(id, bind)
{
	if(!bind)
		bind = 'bind';
	if(BX.Access.obSelectedBind[bind] && BX.Access.obSelectedBind[bind][id])
		delete BX.Access.obSelectedBind[bind][id];
}

BX.Access.GetProviderName = function(provider)
{
	if(BX.Access.obProviderNames[provider])
		return BX.Access.obProviderNames[provider];
	return '';
}

})();