if(!jsPublicTVCollector)
	var jsPublicTVCollector = {
		tv: [],
		list: [],
		add: [],
		files: [],

		StatEvent: function(player, oldstate, newstate)
		{
			if(
				(oldstate == 'BUFFERING' && newstate == 'PLAYING') //flv
				|| (oldstate == 'Closed' && newstate == 'Playing') //wmv
				|| (oldstate == 'Opening' && newstate == 'Playing') //wmv
			)
			{
				var cur_file = player.getPlaylistItem ? player.getPlaylistItem().file/*flv*/ : player.getConfig().file/*wmv*/;
				for(var file in this.files)
				{
					if(file == cur_file)
					{
						var TID = CPHttpRequest.InitThread();
						CPHttpRequest.SetAction(TID, function(data){});
						CPHttpRequest.Send(TID, '/bitrix/components/bitrix/iblock.tv/stat.php', {id: this.files[file]});
						delete this.files[file];
					}
				}
			}
		}
	}

function jsPublicTV()
{	
	this.DescriptionBlockID = null;
	this.DescriptionValues =
	{
		title: true,
		description: true,
		duration: true,
		file: true
	};

	this.Sections = [];

	this.Prefix = '';

	this.LanguagePhrases = {};

	this.TreeBlockID = null;
	this.TreeNodes = null;

	this.TreeStyleCodes = {};
	this.TreeRoll =
	{
			id:'-roll',
			styles:['bitrix-tv-section-closed','bitrix-tv-section-title']
	};

	this.ShowPreviewImage = true;
	this.ShowPreviewImageSize = [64, 48];

	this.Player = {wmv_state_listener_added: false};
	this.PlayerConfig = {};
	this.PlayOrder = false;

	this.CurrentItem = false;
	this.GatherStatistics = false;
	this.SavedState = '';

	this.ArListeners = [];

	//effect variables
	this.EffectOverlay = null;
	this.EffectTvBlock = null;
	this.EffectTvBlockPadding = [15,15];

	//init sign
	this.Inited = null;

	//delay functions
	this.MaxWaitTime = 1000;
}

/* Work With Player */
jsPublicTV.prototype.Init = function(arValues, TBID, DBID, arStart)
{
	this.PlayerListeners('BEFORE_INIT'); //handler to set own element in Init

	this.TreeStyleCodes =
	{
		description_start:'<div class="player_description_text">',
		description_end:'</div>',
		tree_image_start:'<div class="bitrix-tv-small-image">',
		tree_image_end:'</div>',
		tree_description_start:'<div class="bitrix-tv-tree-item-description">',
		tree_description_end:'</div>',
		description_file_start:'<a target="_blank" href="',
		description_file_end:'">' + this.LanguagePhrases.download + '</a>'
	};

	this.Sections = arValues;
	this.TreeBlockID = BX(TBID);
	this.DescriptionBlockID = BX(DBID);

	//prepare player params
	if(this.CurrentItem===false)
	{
		var nextItem = this.GetNextItem();
		if(nextItem)
			this.CurrentItem = {Section:nextItem.Section, Item:nextItem.Item};
	}

	if(this.CurrentItem !== false)
	{
		this.PlayerConfig.file = this['Sections'][this.CurrentItem.Section]['Items'][this.CurrentItem.Item].File;
		this.PlayerConfig.image = this['Sections'][this.CurrentItem.Section]['Items'][this.CurrentItem.Item].BigImage;
		this.PlayerConfig.link = this['Sections'][this.CurrentItem.Section]['Items'][this.CurrentItem.Item].File;
		this.PlayerConfig.autostart = 'false';
		this.PlayerConfig.width = (arStart.width>0)?arStart.width:640;
		this.PlayerConfig.height = (arStart.height>0)?arStart.height:480;
		this.PlayerConfig.block_id = arStart.block_id;
		this.PlayerConfig.obj_id = arStart.obj_id;
		this.PlayerConfig.logo = arStart.logo;

		//create player
		this.GeneratePlayer();

		//set description
		this.SetDescription(this.CurrentItem.Section, this.CurrentItem.Item);

		//set inited
		this.Inited = true;
	}
}

jsPublicTV.prototype.GeneratePlayer = function()
{
	var _this = this;
	var curItem = this['Sections'][this.CurrentItem.Section]['Items'][this.CurrentItem.Item];

	if(this.PlayerConfig.width && this.PlayerConfig.height && this.PlayerConfig.obj_id[curItem.Type])
	{
		if(curItem.Type == 'wmv') //WMV
		{
			BX.ready(function(){
				var wmv = BX(_this.PlayerConfig.block_id.wmv);
				var flv = BX(_this.PlayerConfig.block_id.flv);
				wmv.style.display = "block";
				if (flv)
					flv.style.display = "none";
			});

			this.PlayerConfig.height -=4; //height fix
			this.Player.wmv = new jeroenwijering.Player(BX(this.PlayerConfig.obj_id.wmv), '/bitrix/components/bitrix/player/wmvplayer/wmvplayer.xaml',  this.PlayerConfig);
			this.PlayerConfig.height +=4; //height fix

			//state listener			
			this.RunDelayFunction(function(){_this.SetListener('STATE', function(oldstate, newstate){_this.StateListener(oldstate, newstate);}, 'wmv')}, 50, 0);
		}
		else if(curItem.Type == 'flv') //FLW
		{
			BX.ready(function(){
				var wmv = BX(_this.PlayerConfig.block_id.wmv);
				var flv = BX(_this.PlayerConfig.block_id.flv);
				if (wmv)
					wmv.style.display = "none";
				flv.style.display = "block";
			});

			if (window.jwplayer)
			{
				this.Player.oJw = jwplayer(this.PlayerConfig.obj_id.flv);

				// Add onplay event handler for statistic
				if (this.GatherStatistics)
				{
					this.RunDelayFunction(function(){
						_this.Player.oJw.onPlay(function(state){jsPublicTVCollector.StatEvent(_this.Player.oJw, state.oldstate, 'PLAYING');});
					}, 50, 0);
				}
			}
		}
	}
}

jsPublicTV.prototype.RunDelayFunction = function(func, repeatTime, CurrentTime, delay)
{
	if(CurrentTime >= this.MaxWaitTime)
		return;

	var _this = this;

	if(0 < delay) //delay func
		return setTimeout(function(){_this.RunDelayFunction(func, repeatTime, CurrentTime);}, delay);

	try
	{
		func();
	}
	catch(e)
	{
		setTimeout(function(){_this.RunDelayFunction(func, repeatTime, (CurrentTime + repeatTime));}, repeatTime);
	}
}

/* Work With Item List */
jsPublicTV.prototype.BuildTree = function(kill)
{
	if(kill)
		this.KillTree();
	//build
	for(i=0; i<this.Sections.length; i++)
		this.BuildBlock(i);
}

jsPublicTV.prototype.KillTree = function()
{
	this.TreeNodes = null;
	this.CurrentItem = false;
	for(i=0, n=this.TreeBlockID.childNodes.length; i<n; i++)
		this.TreeBlockID.removeChild(this.TreeBlockID.childNodes[0]);
}

jsPublicTV.prototype.BuildBlock = function(i)
{
	var CurLevel = this['Sections'][i]['Depth'] ?this['Sections'][i]['Depth'] :0;
	var _this = this;

	//get parent
	if(CurLevel==1 || CurLevel==0)
		var ParentBlock = this.TreeBlockID;
	else if(this['Sections'][i]['Depth'] == this['Sections'][i-1]['Depth'])
		var ParentBlock = BX(this.Prefix + 'bx-tv-section-' + (i-1)).parentNode;
	else
		var ParentBlock = BX(this.Prefix + 'bx-tv-section-' + (i-1));

	//build block
	if(CurLevel>0)
	{
		//title
		var block = ParentBlock.appendChild(document.createElement('DIV'));
		block.innerHTML = '<div style="clear:both"></div>' + this['Sections'][i]['Name'];
		block.onclick = function(){_this.TreeExpand(i)};
		block.className = 'bitrix-tv-section-title';
		//block
		var block = ParentBlock.appendChild(document.createElement('DIV'));
		block.id = this.Prefix + 'bx-tv-section-' + i;
		//set style
		block.className = 'bitrix-tv-section-closed';
	}

	//build items
	if(this['Sections'][i]['Items'].length >0)
	{
		for(j=0;j<this['Sections'][i]['Items'].length;j++)
				this.BuildItem(i,j);
	}
}

jsPublicTV.prototype.BuildItem = function(i,j)
{
	var _this = this;
	var ParentBlock = (this['Sections'][i]['Depth']==0) ? this.TreeBlockID : BX(this.Prefix + 'bx-tv-section-' + i);

	if(ParentBlock)
	{
		var item = ParentBlock.appendChild(document.createElement('DIV'));
		item.id = this.Prefix + 'bx-tv-s' + i + 'i' + j;
		item.className = 'bitrix-tv-tree-item';
		var txt =
			this.TreeStyleCodes.tree_description_start
			+ '<a>' + this['Sections'][i]['Items'][j]['Name'] + '</a><br>'
			+ (this.LanguagePhrases['duration'] ? this.LanguagePhrases['duration'] : '') + this['Sections'][i]['Items'][j]['Duration']
			+ this.TreeStyleCodes.tree_description_end;

		if(this['Sections'][i]['Items'][j]['SmallImage']!='' && this.ShowPreviewImage)
			txt = this.TreeStyleCodes.tree_image_start + '<img width="' + this.ShowPreviewImageSize[0] + 'px" height="' + this.ShowPreviewImageSize[1] + 'px" src="' + this['Sections'][i]['Items'][j]['SmallImage'] + '">' + this.TreeStyleCodes.tree_image_end + txt;

		var listen = this.PlayerListeners('BUILD_ITEM', [txt, i, j]);
		if(typeof listen != "undefined" && listen!='')
		{
			item.innerHTML = listen;
			return;
		}

		item.innerHTML = txt;
		item.onclick = function(){_this.SetDescription(i,j); _this.PlayFile(i,j,true);};
	}
}

jsPublicTV.prototype.TreeExpand = function(i)
{
	var block = BX(this.Prefix + 'bx-tv-section-' + (i));
	if(block)
	{
		if(block.style.display == 'block')
			block.style.display = 'none';
		else
			block.style.display = 'block';
	}
}

jsPublicTV.prototype.TreeExpandUp = function(i)
{
		var block = BX(this.Prefix + 'bx-tv-section-' + (i));
		if(block)
		{
			var i=0; //max_depth 25
			while(this.TreeBlockID.id != block.id)
			{
				block.style.display = 'block';
				block = block.parentNode;
				if(i++>25)
					break;
			}
		}
}

/* Play File From List */
jsPublicTV.prototype.PlayFile = function(i, j, autoplay, handle)
{
	this.SavedState = '';

	if("undefined" == typeof(this['Sections'][i]['Items'][j]))
		return;

	//prepare params
	var params =
	{
		file: this['Sections'][i]['Items'][j]['File'],
		image: this['Sections'][i]['Items'][j]['BigImage'],
		link: this['Sections'][i]['Items'][j]['File'],
		width: this['Sections'][i]['Items'][j]['Width'],
		height: this['Sections'][i]['Items'][j]['Height'],
		type: this['Sections'][i]['Items'][j]['Type']
	};

	//old values
	var old_i = this.CurrentItem.Section;
	var old_j = this.CurrentItem.Item;

	//set current item
	this.CurrentItem = {Section:i, Item:j};

	if(old_i==i && old_j==j && handle!==true) // dublicate call
		return;

	//event
	var listen = this.PlayerListeners('BEFORE_PLAY_FILE', [i, j, old_i, old_j]);
	if(typeof listen != "undefined" && listen!='')
		return;

	//expand menu
	this.TreeExpandUp(i);

	var
		_this = this,
		wmv = BX(this.PlayerConfig.block_id.wmv),
		flv = BX(this.PlayerConfig.block_id.flv);

	if(params.type == 'wmv')
	{
		if(this.Player.oJw && flv.style.display != 'none') //if current not wmv, stop flv
			this.Player.oJw.stop();

		this.PlayerConfig.image = params.image;
		this.PlayerConfig.link = params.link;
		this.PlayerConfig.file = params.file;
		this.PlayerConfig.autostart = autoplay ? "true" : "false";

		this.GeneratePlayer();

		if(flv)
			flv.style.display = 'none';
		
	}
	else if (params.type == 'flv')
	{
		if(this.Player.wmv && wmv.style.display != 'none') //if current not flv, stop wmv
			this.RunDelayFunction(function(){_this.Player.wmv.sendEvent("STOP");}, 50, 0);

		if(!this.Player.oJw) //generate FLV if not exists
			this.GeneratePlayer();

		if(this.Player.oJw)
		{
			if(flv.style.display != 'block') //flv hidden
			{
				if(wmv)
					wmv.style.display = 'none';
				if(flv)
					flv.style.display = 'block';
			}

			var flvparams = {
				file: params.file,
				link: params.file,
				image: params.image
			};
			
			this.Player.oJw.onPlaylist(function() { _this.Player.oJw.play(!!autoplay); });

			this.Player.oJw.load(flvparams);			
			
/*			setTimeout(function()
			{				
				_this.Player.oJw.play(!!autoplay);
			}, 500);
*/
		}
	}
}

/* Play Order */
jsPublicTV.prototype.SetPlayOrder = function(order)
{
	this.PlayOrder = order;
}

/* Set Description */
jsPublicTV.prototype.SetDescription = function(i,j)
{
	if(this.DescriptionBlockID)
	{
		var txt = this.TreeStyleCodes.description_start;

		if(this.DescriptionValues.title===true)
			txt += (this.LanguagePhrases['title'] ? this.LanguagePhrases['title'] : '') + this['Sections'][i]['Items'][j]['Name'] + "<br>\n";
		if(this.DescriptionValues.description===true)
			txt += (this.LanguagePhrases['description'] ? this.LanguagePhrases['description'] : '') + this['Sections'][i]['Items'][j]['Description'] + "<br>\n";
		if(this.DescriptionValues.duration===true)
			txt += (this.LanguagePhrases['duration'] ? this.LanguagePhrases['duration'] : '') + this['Sections'][i]['Items'][j]['Duration'] + "<br>\n";
		if(this.DescriptionValues.file===true)
			txt += (this.LanguagePhrases['file'] ? this.LanguagePhrases['file'] : '') + this.TreeStyleCodes.description_file_start + this['Sections'][i]['Items'][j]['File'] + this.TreeStyleCodes.description_file_end + "<br>\n";

		txt += this.TreeStyleCodes.description_end;

		var listen = this.PlayerListeners('SET_DESCRIPTION', [txt, i, j]);
		if(typeof listen != "undefined" && listen!='')
			txt = listen;

		this.DescriptionBlockID.innerHTML = txt;
	}
}

/* Roll List */
jsPublicTV.prototype.Roll = function()
{
	if(!this.TreeNodes)
		this.TreeNodes = this.TreeBlockID.getElementsByTagName('DIV');

	for(i=0; i<this.TreeNodes.length; i++)
	{
		for(j=0; j<this.TreeRoll.styles.length; j++)
		{
			if (this.TreeNodes[i].className.indexOf(this.TreeRoll.styles[j] + this.TreeRoll.id)!=-1)
			{
				this.TreeNodes[i].className = this.TreeNodes[i].className.replace(this.TreeRoll.styles[j] + this.TreeRoll.id, this.TreeRoll.styles[j]);
				break;
			}
			else if (this.TreeNodes[i].className.indexOf(this.TreeRoll.styles[j])!=-1)
			{
				this.TreeNodes[i].className = this.TreeNodes[i].className.replace(this.TreeRoll.styles[j], this.TreeRoll.styles[j] + this.TreeRoll.id);
				break;
			}
		}
	}
}

/* Walk By Items */
jsPublicTV.prototype.GetNextItem = function(in_section)
{
	if(!this.CurrentItem) //GetFirst
	{
		for(i=0; i<this.Sections.length; i++)
		{
			if(this['Sections'][i]['Items'].length > 0)
				return {Section:i, Item:0};
		}
	}
	else //GetNext
	{
		if(this['Sections'][this.CurrentItem.Section]['Items'].length > this.CurrentItem.Item + 1) //inside section
			return {Section:this.CurrentItem.Section, Item:this.CurrentItem.Item+1};
		else if(true!=in_section) //at all
		{
			for(i = this.CurrentItem.Section + 1; i < this.Sections.length; i++)
			{
				if(this['Sections'][i]['Items'].length>0)
					return {Section:i, Item:0};
			}
		}
	}

	this.PlayerListeners('END_PLAY_LIST');
	return false;
}

jsPublicTV.prototype.PlayNextItem = function()
{	
	var nextItem = this.GetNextItem();
	var _this = this;
	
	if(nextItem===false)
		return;

	if(this.CurrentItem!==false)
	{
		setTimeout(
			function()
			{
				_this.PlayFile(nextItem.Section, nextItem.Item, true);		
				_this.SetDescription(nextItem.Section, nextItem.Item);
			}
		,1000);
	}
}

jsPublicTV.prototype.SeekByRealParams = function(section_id, element_id)
{
	if(typeof(section_id) != 'undefined' && typeof(element_id) != 'undefined' && false != section_id) // look by section&element id
	{
		for(i=0, n=this.Sections.length; i<n; i++)
		{
			if(section_id == this.Sections[i].Id)
			{
				for (ii=0, nn=this.Sections[i]['Items'].length; ii<nn; ii++)
				{
					if(element_id == this.Sections[i]['Items'][ii].Id)
						return {section:i, element:ii};
				}
			}
		}
	}
	else if(typeof(section_id) != 'undefined' && false != section_id) //look by section -> return only section
	{
		for(i=0, n=this.Sections.length; i<n; i++)
		{
			if(section_id == this.Sections[i].Id)
				return {section:i, element:false};
		}
	}
	else if(typeof(element_id) != 'undefined') //look by elementID in blind
	{
		for(i=0, n=this.Sections.length; i<n; i++)
		{
			for (ii=0, nn=this.Sections[i]['Items'].length; ii<nn; ii++)
			{
				if(element_id == this.Sections[i]['Items'][ii].Id)
					return {section:i, element:ii};
			}
		}
	}

	return {section:false, element:false};
}

jsPublicTV.prototype.TreeMerge = function(arrToMerge)
{
	if(arrToMerge.length<=0)
		return false;
}

/* Listeners */
jsPublicTV.prototype.SetListener = function(type, func, playertype)
{
	if('wmv' == playertype)
	{
		if(this.Player.wmv)
		{
			if(this.Player.wmv.view)
			{
				this.Player.wmv.addListener(type, func);
				this.Player.wmv_state_listener_added = true;
			}
			else
			{
				throw 'NotReady';
			}
		}
	}
	else if('flv' == playertype)
	{
		if(this.Player[playertype])
			this.Player[playertype].addModelListener(type, func);
	}
}

jsPublicTV.prototype.StateListener = function(oldstate, newstate)
{	
	var complState = oldstate + '+' + newstate;	
	if('Completed' == newstate && this.SavedState != complState)
	{
		if(this.PlayOrder !== false)
		{
			if(this.PlayOrder == 'section' || this.PlayOrder=='all')
				this.PlayNextItem();
		}
	}

	if(this.GatherStatistics && this.Player.wmv && this.SavedState != complState)
		jsPublicTVCollector.StatEvent(this.Player.wmv, oldstate, newstate);

	this.SavedState = complState;
}

/* Own Listenerss */
//END_PLAY_LIST
//BEFORE_INIT
//SET_DESCRIPTION, in\out text of description
//BUILD_ITEM
//BEFORE_PLAY_FILE
jsPublicTV.prototype.PlayerListeners = function(type, args)
{
	for(var i=0; i<this.ArListeners.length; i++)
	{
		if(this.ArListeners[i]['type'].toUpperCase() == type)
			return this.ArListeners[i]['func'].apply(null, args);
	}
}

jsPublicTV.prototype.AddPlayerListener = function(type, func)
{
	if(typeof type != "undefined" && typeof func != "undefined")
		this.ArListeners.push({type:type,func:func});
}

/*Effects*/
jsPublicTV.prototype.EffectCreateOverlay = function()
{
	var windowSize = this.EffectGetWindowScrollSize();
	var posSize = this.EffectGetWindowScrollPos();

	if(this.EffectTvBlock)
	{
		this.EffectTvBlock.style.display = "block";
		this.EffectTvBlock.style.top = this.EffectTvBlockPadding[1] + posSize.scrollTop + 'px';
		this.EffectTvBlock.style.left = this.EffectTvBlockPadding[0] + 'px';
	}

	if (!this.EffectOverlay && this.EffectGetOpacityProperty())
	{
		var doc = this.EffectTvBlock ? this.EffectTvBlock.parentNode : document.body;
		this.EffectOverlay = doc.appendChild(document.createElement("DIV"));
		this.EffectOverlay.className = "bitrix-tv-overlay";
		this.EffectOverlay.id = 'bitrix-tv-overlay';

		this.EffectOverlay.style.width = windowSize.scrollWidth + "px";
		this.EffectOverlay.style.height = windowSize.scrollHeight + "px";
		this.EffectOverlay.style.display = "block";
	}

	if(this.Inited==true && !BX.browser.IsIE() && this['Sections'][this.CurrentItem.Section]['Items'][this.CurrentItem.Item].Type == 'flv') //for FF,Safari
	{
		var _this = this;
		this.RunDelayFunction(function(){_this.Player.oJw.load(_this['Sections'][_this.CurrentItem.Section]['Items'][_this.CurrentItem.Item].File);}, 50, 0, 50 + (BX.browser.IsSafari() ? 100 : 0)); //FF +50, Safari +150
	}

	//prepare close esc
	var _this = this;
	BX.bind(document, 'keydown', function(e){_this.escEffectRemoveOverlay(e);});
}

jsPublicTV.prototype.escEffectRemoveOverlay = function(e)
{
	if (!e) e = window.event
	if (!e) return;
	if (e.keyCode == 27)
	{
		this.EffectRemoveOverlay();
		var _this = this;
		BX.unbind(document, 'keydown', _this.escEffectRemoveOverlay);
	}
}

jsPublicTV.prototype.EffectRemoveOverlay = function()
{
	if(this.Player.wmv && BX(this.PlayerConfig.block_id.wmv).style.display!='none')
		this.Player.wmv.sendEvent('STOP');

	if(this.EffectTvBlock)
		this.EffectTvBlock.style.display = "none";

	if(this.EffectOverlay)
	{
		this.EffectOverlay.parentNode.removeChild(this.EffectOverlay);
		this.EffectOverlay = null;
	}
}

jsPublicTV.prototype.EffectGetWindowScrollSize = function(pDoc)
{
	var width, height;
	if (!pDoc)
		pDoc = document;

	if ( (pDoc.compatMode && pDoc.compatMode == "CSS1Compat"))
	{
		width = pDoc.documentElement.scrollWidth;
		height = pDoc.documentElement.scrollHeight;
	}
	else
	{
		if (pDoc.body.scrollHeight > pDoc.body.offsetHeight)
			height = pDoc.body.scrollHeight;
		else
			height = pDoc.body.offsetHeight;

		if (pDoc.body.scrollWidth > pDoc.body.offsetWidth ||
			(pDoc.compatMode && pDoc.compatMode == "BackCompat") ||
			(pDoc.documentElement && !pDoc.documentElement.clientWidth)
		)
			width = pDoc.body.scrollWidth;
		else
			width = pDoc.body.offsetWidth;
	}
	return {scrollWidth : width, scrollHeight : height};
}

jsPublicTV.prototype.EffectGetWindowScrollPos = function(pDoc)
{
	var left, top;
	if (!pDoc)
		pDoc = document;

	if (self.pageYOffset)
	{
		left = self.pageXOffset;
		top = self.pageYOffset;
	}
	else if (pDoc.documentElement && pDoc.documentElement.scrollTop)
	{
		left = document.documentElement.scrollLeft;
		top = document.documentElement.scrollTop;
	}
	else if (pDoc.body)
	{
		left = pDoc.body.scrollLeft;
		top = pDoc.body.scrollTop;
	}
	return {scrollLeft : left, scrollTop : top};
}

jsPublicTV.prototype.EffectGetOpacityProperty = function()
{
	if (typeof document.body.style.opacity == 'string')
		return 'opacity';
	else if (typeof document.body.style.MozOpacity == 'string')
		return 'MozOpacity';
	else if (typeof document.body.style.KhtmlOpacity == 'string')
		return 'KhtmlOpacity';
	else if (document.body.filters && navigator.appVersion.match(/MSIE ([\d.]+);/)[1]>=5.5)
		return 'filter';

	return false;
}

/*float class*/
//add if not exists
if(!window.JCFloatDiv)
{
	JCFloatDiv = function ()
	{
		var _this = this;
		this.floatDiv = null;
		this.x = this.y = 0;

		this.Show = function(div, left, top, dxShadow, restrictDrag)
		{
			var zIndex = parseInt(div.style.zIndex);
			if(zIndex <= 0 || isNaN(zIndex))
				zIndex = 100;

			div.style.zIndex = zIndex;

			if (left < 0)
				left = 0;

			if (top < 0)
				top = 0;

			div.style.left = left + "px";
			div.style.top = top + "px";

			if(BX.browser.IsIE())
			{
				var frame = BX(div.id+"_frame");
				if(!frame)
				{
					frame = document.createElement("IFRAME");
					frame.src = "javascript:''";
					frame.id = div.id+"_frame";
					frame.style.position = 'absolute';
					frame.style.zIndex = zIndex-1;
					document.body.appendChild(frame);
				}
				frame.style.width = div.offsetWidth + "px";
				frame.style.height = div.offsetHeight + "px";
				frame.style.left = div.style.left;
				frame.style.top = div.style.top;
				frame.style.visibility = 'visible';
			}

			/*Restrict drag*/
			div.restrictDrag = restrictDrag || false;

			/*shadow*/
			if(isNaN(dxShadow))
				dxShadow = 5;

			if(dxShadow > 0)
			{
				var img = BX(div.id+'_shadow');
				if(!img)
				{
					if(BX.browser.IsIE())
					{
			 			img = document.createElement("DIV");
			 			img.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/bitrix/themes/"+phpVars.ADMIN_THEME_ID+"/images/shadow.png',sizingMethod='scale')";
					}
					else
					{
			 			img = document.createElement("IMG");
						img.src = '/bitrix/themes/'+phpVars.ADMIN_THEME_ID+'/images/shadow.png';
					}
					img.id = div.id+'_shadow';
					img.style.position = 'absolute';
					img.style.zIndex = zIndex-2;
					img.style.left = '-1000px';
					img.style.top = '-1000px';
					img.style.lineHeight = 'normal';
					document.body.appendChild(img);
				}
				img.style.width = div.offsetWidth+'px';
				img.style.height = div.offsetHeight+'px';
				img.style.left = parseInt(div.style.left)+dxShadow+'px';
				img.style.top = parseInt(div.style.top)+dxShadow+'px';
				img.style.visibility = 'visible';
			}
			div.dxShadow = dxShadow;
		}

		this.Close = function(div)
		{
			if(!div)
				return;
			var sh = BX(div.id+"_shadow");
			if(sh)
				sh.style.visibility = 'hidden';

			var frame = BX(div.id+"_frame");
			if(frame)
				frame.style.visibility = 'hidden';
		}

		this.Move = function(div, x, y)
		{
			if(!div)
				return;

			var dxShadow = div.dxShadow;
			var left = parseInt(div.style.left)+x;
			var top = parseInt(div.style.top)+y;

			if (div.restrictDrag)
			{
				//Left side
				if (left < 0)
					left = 0;

				//Right side
				if ( (document.compatMode && document.compatMode == "CSS1Compat"))
					windowWidth = document.documentElement.scrollWidth;
				else
				{
					if (document.body.scrollWidth > document.body.offsetWidth ||
						(document.compatMode && document.compatMode == "BackCompat") ||
						(document.documentElement && !document.documentElement.clientWidth)
					)
						windowWidth = document.body.scrollWidth;
					else
						windowWidth = document.body.offsetWidth;
				}

				var floatWidth = div.offsetWidth;
				if (left > (windowWidth - floatWidth - dxShadow))
					left = windowWidth - floatWidth - dxShadow;

				//Top side
				if (top < 0)
					top = 0;
			}

			div.style.left = left+'px';
			div.style.top = top+'px';

			this.AdjustShadow(div);
		}

		this.HideShadow = function(div)
		{
			var sh = BX(div.id + "_shadow");
			sh.style.visibility = 'hidden';
		}

		this.UnhideShadow = function(div)
		{
			var sh = BX(div.id + "_shadow");
			sh.style.visibility = 'visible';
		}

		this.AdjustShadow = function(div)
		{
			var sh = BX(div.id + "_shadow");
			if(sh && sh.style.visibility != 'hidden')
			{
				var dxShadow = div.dxShadow;

				sh.style.width = div.offsetWidth+'px';
				sh.style.height = div.offsetHeight+'px';
				sh.style.left = parseInt(div.style.left)+dxShadow+'px';
				sh.style.top = parseInt(div.style.top)+dxShadow+'px';
			}

			var frame = BX(div.id+"_frame");
			if(frame)
			{
				frame.style.width = div.offsetWidth + "px";
				frame.style.height = div.offsetHeight + "px";
				frame.style.left = div.style.left;
				frame.style.top = div.style.top;
			}
		}

		this.StartDrag = function(e, div)
		{
			if(!e)
				e = window.event;
			this.x = e.clientX + document.body.scrollLeft;
			this.y = e.clientY + document.body.scrollTop;
			this.floatDiv = div;

			BX.bind(document, "mousemove", this.MoveDrag);
			document.onmouseup = this.StopDrag;
			if(document.body.setCapture)
				document.body.setCapture();

			var b = document.body;
		    b.ondrag = BX.False;
		    b.onselectstart = BX.False;
		    b.style.MozUserSelect = _this.floatDiv.style.MozUserSelect = 'none';
		    b.style.cursor = 'move';
	    }

		this.StopDrag = function(e)
		{
			if(document.body.releaseCapture)
				document.body.releaseCapture();

			BX.unbind(document, "mousemove", _this.MoveDrag);
			document.onmouseup = null;

			this.floatDiv = null;

			var b = document.body;
			b.ondrag = null;
			b.onselectstart = null;
			b.style.MozUserSelect = _this.floatDiv.style.MozUserSelect = '';
		    b.style.cursor = '';
		}

		this.MoveDrag = function(e)
		{
			var x = e.clientX + document.body.scrollLeft;
			var y = e.clientY + document.body.scrollTop;

			if(_this.x == x && _this.y == y)
				return;

			_this.Move(_this.floatDiv, (x - _this.x), (y - _this.y));
			_this.x = x;
			_this.y = y;
		}
	}
}
var jsPlayerFloatDiv = new JCFloatDiv();