/**
 * HistoryManager
 * 
 * Observes back/forward button usage and saves states
 * for registered modules into the hash. This allows to
 * bookmark specific states for an application.
 * 
 * @version		1.0rc2
 * 
 * @see			Events, Options
 * 
 * @license		MIT License
 * @author		Harald Kirschner <mail [at] digitarald.de>
 * @copyright	2007 Author
 */
var HistoryManager = {

	/**
	 * Default options - Can be overridden with setOptions
	 * 
	 * observeDelay: Duration for checking the state, default 100ms
	 * stateSeparator: Seperator for module-state join, default ';'
	 * iframeSrc: Scr for IE6/7 iframe, must exist on server!
	 * onStart: Fires on start
	 * onRegister: Fires on register
	 * onUnregister: Fires on unregister
	 * onUpdate: Fires when state changes from ...
	 * onStateChange: ... module changes
	 * onObserverChange: ... history change
	 */
	options: {
		observeDelay: 100,
		stateSeparator: ';',
		iframeSrc: 'blank.html',
		skipstart: false,
		onStart: Class.empty,
		onRegister: Class.empty,
		onUnregister: Class.empty,
		onStart: Class.empty,
		onUpdate: Class.empty,
		onStateChange: Class.empty,
		onObserverChange: Class.empty
	},

	/**
	 * Default options for register
	 * 
	 * defaults: Default values array, initially empty.
	 * regexpParams: When regexp is a String, this is the second argument for new RegExp.
	 * skipDefaultMatch: default true; When true onGenerate is not called when current values are similar to the default values.
	 */
	dataOptions: {
		skipDefaultMatch: true,
		defaults: [],
		regexpParams: ''
	},

	/**
	 * Constructur - Class.initialize
	 * 
	 * Options:
	 *  - observeDelay: duration in ms, default 100 - BackBuddy observe the hash for changes periodical
	 *  - stateSeparator: char, default ';' - Separator for multiple module-states in the hash
	 *  - iframeSrc: string, default 'blank.html' - File for the iframe (IE6/7), must exist on the server!
	 *  - Events: onStart, onRegister, onStart, onUpdate, onStateChange, onObserverChange
	 * 
	 * @return	this
	 * 
	 * @param	{Object} options
	 */
	initialize: function(options) {
		if (this.modules) return this;
		this.setOptions(options);
		this.modules = $H({});
		this.count = history.length;
		this.states = [];
		this.states[this.count] = this.getHash();
		this.state = null;
		return this;
	},

	/**
	 * Start - Check hash and start observer
	 * 
	 * Call start after registering ALL modules. This start the observer,
	 * reads the state from the hash and calls onMatch for effected modules.
	 * 
	 * @return	this
	 * 
	 */
	start: function() {
		this.skipstart = this.options.skipstart;
		this.observe.periodical(this.options.observeDelay, this);
		this.started = true;
		this.observe();
		this.update();
		this.fireEvent('onStart', [this.state]);
		return this;
	},

	/**
	 * Registers a module
	 * 
	 * @return	{Object} Object with shortcuts for setValues, setValue, generate and unregister
	 * 
	 * @param	{String} Module key
	 * @param	{RegExp}/{String} Regular expression that matches the string updated from onGenerate
	 * @param	{Function} Will be called when the regexp matches, with the new values as argument.
	 * @param	{Function} Should return the string for the state string, values are first argument
	 * @param	{Array} default values, the input values given to onMatch and onGenerate will be complemented with these
	 * @param	{Object} (optional) options
	 */
	register: function(key, defaults, onMatch, onGenerate, regexp, options) {
		if (!this.modules) this.initialize();
		var data = $merge(this.dataOptions, options || {}, {
			defaults: defaults,
			onMatch: onMatch,
			onGenerate: onGenerate,
			regexp: regexp
		});
		data.regexp = data.regexp || key + '-([\\w_-]*)';
		if (typeof data.regexp == 'string') data.regexp = new RegExp(data.regexp, data.regexpParams);
		data.onGenerate = data.onGenerate || function(values) { return key + '-' + values[0]; };

		data.values = data.defaults.copy();
		this.modules.set(key, data);
		this.fireEvent('onUnregister', [key, data]);
		return {
			setValues: function(values) {
				return this.setValues(key, values);
			}.bind(this),
			setValue: function(index, value) {
				return this.setValue(key, index, value);
			}.bind(this),
			generate: function(values) {
				return this.generate(key, values);
			}.bind(this),
			unregister: function() {
				return this.unregister(key);
			}.bind(this)
		};
	},

	/**
	 * unregister - Removes an module from the
	 * 
	 * @param	{String} Module key
	 */
	unregister: function(key) {
		this.fireEvent('onRegister', [key]);
		this.modules.remove(key);
	},

	/**
	 * setValues - Set all values new, updates new state
	 * 
	 * @param	{String} Module key
	 * @param	{Object} Complete values
	 */
	setValues: function(key, values) {
		var data = this.modules.get(key);
		if (!data || data.values.isSimilar(values)) return this;
		data.values = values;
		this.update();
		return this;
	},

	/**
	 * setValue - Set one value, updates new state
	 * 
	 * @param	{String} Module key
	 * @param	{Number} Value index
	 * @param	{Object} Value
	 */
	setValue: function(key, index, value) {
		var data = this.modules.get(key);
		if (!data || data.values[index] == value) return this;
		data.values[index] = value;
		this.update();
		return this;
	},

	/**
	 * generate - Generates a hash from the given
	 * 
	 * @param	{String} Module key
	 * @param	{Number} Value index
	 * @param	{Object} Value
	 */
	generate: function(key, values) {
		var data = this.modules.get(key);
		var current = data.values.copy();
		data.values = values;
		var state = this.generateState();
		data.values = current;
		return '#' + state;
	},

	observe: function() {
		if (this.timeout) return;
		var state = this.getState();
		if (this.state == state) return;
		if ((window.ie || window.webkit419) && (this.state !== null)) this.setState(state, true);
		else this.state = state;
		var skipstart = this.skipstart;
		this.modules.each(function(data, key) {
			var bits = state.match(data.regexp);
			if (bits) {
				bits.splice(0, 1);
				bits.complement(data.defaults);
				if (!bits.isSimilar(data.defaults)) data.values = bits;
			} else data.values = data.defaults.copy();			
			if(!skipstart) data.onMatch(data.values, data.defaults);
		});
		this.skipstart = false;
		this.fireEvent('onStateChange', [state]).fireEvent('onObserverChange', [state]);
	},

	generateState: function() {
		var state = [];
		this.modules.each(function(data, key) {
			if (data.skipDefaultMatch && data.values.isSimilar(data.defaults)) return;
			state.push(data.onGenerate(data.values));
		});
		return state.join(this.options.stateSeparator);
	},

	update: function() {
		if (!this.started) return this;
		var state = this.generateState();
		if ((!this.state && !state) || (this.state == state)) return this;
		this.setState(state);
		this.fireEvent('onStateChange', [state]).fireEvent('onUpdate', [state]);
		return this;
	},

	observeTimeout: function() {
		if (this.timeout) this.timeout = $clear(this.timeout);
		else this.timeout = this.observeTimeout.delay(200, this);
	},

	getHash: function() {
		var href = top.location.href;
		var pos = href.indexOf('#') + 1;
		return (pos) ? href.substr(pos) : '';
	},

	getState: function() {
		var state = this.getHash();
		if (this.iframe) {
			var doc = this.iframe.contentWindow.document;
			if (doc && doc.body.id == 'state') {
				var istate = doc.body.innerText;
				if (this.state == state) return istate;
				this.istateOld = true;
			} else return this.istate;
		}
		if (window.webkit419 && history.length != this.count) {
			this.count = history.length;
			return $pick(this.states[this.count - 1], state);
		}
		return state;
	},

	setState: function(state, fix) {
		state = $pick(state, '');
		if (window.webkit419) {
			if (!this.form) this.form = new Element('form', {method: 'get'}).injectInside(document.body);
			this.count = history.length;
			this.states[this.count] = state;
			this.observeTimeout();
			this.form.setProperty('action', '#' + state).submit();
		} else top.location.hash = state || '#';
		if (window.ie && (!fix || this.istateOld)) {
			if (!this.iframe) {
				this.iframe = new Element('iframe', {
					src: this.options.iframeSrc,
					styles: 'visibility: hidden; position: absolute; top: -200px; left: -200px;'
				}).injectInside(document.body);
				this.istate = this.state;
			}
			try {
				var doc = this.iframe.contentWindow.document;
				doc.open();
				doc.write('<html><body id="state">' + state + '</body></html>');
				doc.close();
				this.istateOld = false;
			} catch(e) {};
		}
		this.state = state;
	},

	extend: $extend
};

HistoryManager.extend(Events.prototype);
HistoryManager.extend(Options.prototype);


/**
 * Extends Array with 2 helpers: isSimilar(array) and complement(array)
 * 
 */
Array.extend({

	/**
	 * isSimilar - Returns true for similar arrays, type-insensitive
	 * 
	 * @example
	 *  [1].isSimilar(['1']) == true
	 *  [1, 2].isSimilar([1, false]) == false
	 *  
	 * @return	{Boolean}
	 * @param	{Object} Array
	 */
	isSimilar: function(array) {
		return (this.toString() == array.toString());
	},

	/**
	 * complement - Fills up empty array values from another array, length is the same
	 * 
	 * @example
	 *  [1, null].complement([3, 4]) == [1, 4]
	 *	[undefined, '1'].complement([2, 3, 4]) == [2, '1']

	 * @return	{Array} this
	 * @param	{Object} Array
	 */
	complement: function(array) {
		for (var i = 0, j = this.length; i < j; i++) this[i] = $pick(this[i], array[i] || null);
		return this;
	}
});
/*
Script: Tips.js
	Tooltips, BubbleTips, whatever they are, they will appear on mouseover

License:
	MIT-style license.

Credits:
	The idea behind Tips.js is based on Bubble Tooltips (<http://web-graphics.com/mtarchive/001717.php>) by Alessandro Fulcitiniti <http://web-graphics.com>
*/

/*
Class: Tips
	Display a tip on any element with a title and/or href.

Note:
	Tips requires an XHTML doctype.

Arguments:
	elements - a collection of elements to apply the tooltips to on mouseover.
	options - an object. See options Below.

Options:
	maxTitleChars - the maximum number of characters to display in the title of the tip. defaults to 30.

	onShow - optionally you can alter the default onShow behaviour with this option (like displaying a fade in effect);
	onHide - optionally you can alter the default onHide behaviour with this option (like displaying a fade out effect);

	showDelay - the delay the onShow method is called. (defaults to 100 ms)
	hideDelay - the delay the onHide method is called. (defaults to 100 ms)

	className - the prefix for your tooltip classNames. defaults to 'tool'.

		the whole tooltip will have as classname: tool-tip

		the title will have as classname: tool-title

		the text will have as classname: tool-text

	offsets - the distance of your tooltip from the mouse. an Object with x/y properties.
	fixed - if set to true, the toolTip will not follow the mouse.

Example:
	(start code)
	<img src="/images/i.png" title="The body of the tooltip is stored in the title" class="toolTipImg"/>
	<script>
		var myTips = new Tips($$('.toolTipImg'), {
			maxTitleChars: 50	//I like my captions a little long
		});
	</script>
	(end)

Note:
	The title of the element will always be used as the tooltip body. If you put :: on your title, the text before :: will become the tooltip title.
*/



var Tips = new Class({

	options: {
		onShow: function(tip){
			tip.setStyle('visibility', 'visible');
		},
		onHide: function(tip){
			tip.setStyle('visibility', 'hidden');
		},
		maxTitleChars: 0,
		showDelay: 100,
		hideDelay: 100,
		className: 'tool',
		offsets: {'x': 16, 'y': 16},
		fixed: false
	},

	initialize: function(elements, options){
		this.setOptions(options);
		this.toolTip = new Element('div', {
			'class': this.options.className + '-tip',
			'styles': {
				'position': 'absolute',
				'top': '0',
				'left': '0',
				'visibility': 'hidden'
			}
		}).inject(document.body);
		this.wrapper = new Element('div').inject(this.toolTip);
		if(elements) $$(elements).each(this.build, this);
		if (this.options.initialize) this.options.initialize.call(this);
	},
	rebuild: function(elements){
		$$(elements).each(this.build, this);
	},	
	checkTitle : function(el){
		
//		if(typeof(el.$tmp) != 'undefined') {
//			if(el.$tmp.myText || el.$tmp.myTitle) return false;
//		};

		if (el.title){
			var dual = el.title.split('::');
			if (dual.length > 1) {
				el.$tmp.myTitle = dual[0].trim();
				el.$tmp.myText = dual[1].trim();
			} else {
				el.$tmp.myTitle = el.title;
			}
		};

		if (el.$tmp.myTitle && el.$tmp.myTitle.length > this.options.maxTitleChars && this.options.maxTitleChars > 0) el.$tmp.myTitle = el.$tmp.myTitle.substr(0, this.options.maxTitleChars - 1) + "�";

		if (el.title){
			el.removeAttribute('title');
			return true;
		} else {
			return false;
		};
	},
	build: function(el){
//		el.$tmp.myTitle = (el.href && el.getTag() == 'a') ? el.href.replace('http://', '') : (el.rel || false);
		var isNew = this.checkTitle(el);

		if(!el.$tmp.myTitle) return;
		if(!isNew) return;
		
		el.addEvent('mouseenter', function(event){
			event = new Event(event);
			this.start(el);
			if (!this.options.fixed) this.locate(event);
			else this.position(event);
		}.bind(this));
		if (!this.options.fixed) el.addEvent('mousemove', this.locate.bindWithEvent(this));
		var end = this.end.bind(this);
		el.addEvent('mouseleave', end);
		$(document.body).addEvent('click', end);
//bla		
	},

	start: function(el){
		this.wrapper.empty();
		
		if(el.title) this.checkTitle(el);
		
		if (el.$tmp.myTitle){
//			this.title = new Element('span').inject(new Element('div', {'class': this.options.className + '-title'}).inject(this.wrapper)).setHTML(el.$tmp.myTitle);
			this.title =new Element('div', {'class': this.options.className + '-title'}).inject(this.wrapper).setHTML(el.$tmp.myTitle);
		}
		if (el.$tmp.myText){
//			this.text = new Element('span').inject(new Element('div', {'class': this.options.className + '-text'}).inject(this.wrapper)).setHTML(el.$tmp.myText);
			this.text =new Element('div', {'class': this.options.className + '-text'}).inject(this.wrapper).setHTML(el.$tmp.myText);
		}
		$clear(this.timer);
		this.timer = this.show.delay(this.options.showDelay, this);
	},

	end: function(event){
		$clear(this.timer);
		this.timer = this.hide.delay(this.options.hideDelay, this);
	},

	position: function(event){
//		var pos = element.getPosition();
		this.toolTip.setStyles({
			'left': event.page.x + this.options.offsets.x,
			'top': event.page.y + this.options.offsets.y
		});
	},

	locate: function(event){
		var win = {'x': window.getWidth(), 'y': window.getHeight()};
		var scroll = {'x': window.getScrollLeft(), 'y': window.getScrollTop()};
		var tip = {'x': this.toolTip.offsetWidth, 'y': this.toolTip.offsetHeight};
		var prop = {'x': 'left', 'y': 'top'};
		for (var z in prop){
			var pos = event.page[z] + this.options.offsets[z];
			if ((pos + tip[z] - scroll[z]) > win[z]) pos = event.page[z] - this.options.offsets[z] - tip[z];
			this.toolTip.setStyle(prop[z], pos);
		};
	},

	show: function(){
		if (this.options.timeout) this.timer = this.hide.delay(this.options.timeout, this);
		this.fireEvent('onShow', [this.toolTip]);
	},

	hide: function(){
		this.fireEvent('onHide', [this.toolTip]);
	}

});

Tips.implement(new Events, new Options);
var transparentMessage = new Class({

	options: {
		hideDelay: 50000,
		status: 'working',
		fixed: false,
		onShow: function(){}
	},

	initialize: function(options){
		this.setOptions(options);
		this.active = 0;
		this.ready = 0;
		if (this.options.initialize) this.options.initialize.call(this);		
	},
	
	createMessage : function() {
		this.styles = {
				'position':(window.ie6 ? 'absolute' : 'fixed'),
				'top': 10,
				'left': 10,
				'width':'95%',
				'z-index':'1500',
				'display':'block',				
				'overflow':'hidden'
			}
		this.positionWrapper = $('transparentMessageWrapper') || new Element('div', {
			'class': 'transparentMessageWrapper',
			'id': 'transparentMessageWrapper'
		}).inject(document.body).setStyles(this.styles);
		this.positionWrapper.empty();
		
		var hide = this.hide.bind(this);
		this.msgWrapper = new Element('div', {
			'class': 'transparentMessage',
			'styles' :{'position':'relative'}
		}).inject(this.positionWrapper).addEvents({
			'click' : hide
		});		

		this.messageBody = new Element('div', {'class': 'msg'}).inject(this.msgWrapper).setHTML('&nbsp;');

		this.fx = new Fx.Styles(this.msgWrapper, {
			duration: 300,
			wait: false,
			transition: Fx.Transitions.Expo.easeOut,
			onComplete : function(){
			}
		});
		this.fx.set({
			'margin-top' : -this.msgWrapper.getSize().scrollSize.y,
			'opacity':'0'
		});	
		this.ready = 1;
		this.eventPosition = this.position.bind(this);			
	},
	setMessage : function(msg) {
		
	},
	say : function(status, msg){
		if(!this.ready) this.createMessage();
		this.status = status;
		var offset = -this.msgWrapper.getSize().scrollSize.y;
		var currOffset = this.msgWrapper.getStyle('margin-top').toInt();
//		currOffset = currOffset.replace(/px/i, "") * 1;
		var show = this.show.bind(this);

		if(!this.active){
			show(status, msg);
		} else {
			this.fx.start({
				'margin-top' : -this.msgWrapper.getSize().scrollSize.y,
				'opacity': 0
			}).chain( function(){
				show(status, msg) 
			});

		};
		return this;
	},
	show : function(status, msg) {
		this.messageBody.setHTML(msg);
		this.fx.set({'margin-top' : -this.msgWrapper.getSize().scrollSize.y });			
		this.msgWrapper.className = 'transparentMessage';
		this.msgWrapper.addClass(status || this.options.status);
			this.fx.start({
				'margin-top' : 0,
				'opacity': 0.90
		});
		this.active = 1;			
		if(window.ie6) {
			this.positionWrapper.setStyle('top', window.getScrollTop()+10 );
			window.addEvent('scroll',  this.eventPosition);	
		};
		
		this.fireEvent('onShow');
		return this;
	},
	hide : function() {
		if(!this.active) return false;
		this.fx.start({
			'margin-top' : -this.msgWrapper.getSize().scrollSize.y,
			'opacity': 0
		});	
		if(this.timer) $clear(this.timer);
		this.active = 0;
		if(window.ie6) window.removeEvent('scroll',  this.eventPosition);
		return this;
	},
	cancel : function(delay){
		if(this.timer) $clear(this.timer);
		this.timer = this.hide.delay(delay, this);
		return this;
	},
	position : function() {
		this.positionWrapper.setStyle('top', window.getScrollTop()+10 );
	}
});
transparentMessage.implement(new Options, new Events);
var Lightbox = {
	bReady : false,
	bActive : false,
	items: [],
	init: function(options){
		this.options = Object.extend({
			resizeDuration: 500,
			resizeTransition: Fx.Transitions.Expo.easeOut,
			initialWidth: 10,
			initialHeight: 10,
			downloadLink: false,
			animateCaption: true,
			defaultIframeWidth : 500, 
			defaultIframeHeight: 300,
			minImageWidth : 600,
			minImageHeight : 300
		}, options || {});

		// IE 6 - XML prolog problem
		if(window.ie6 && document.compatMode=="BackCompat"){
			this.options.animateCaption = false;
		}

		this.anchors = {};
		$each(document.links, function(el, i){
			if (el.rel && el.rel.test(/^lightbox/i)){	
				var arrName = this.getArrayName(el.rel);
			 	if(!$chk(this.anchors[arrName])) this.anchors[arrName] = [];
				this.anchors[arrName].push({href: el.href, title: el.title});
				el.rel = 'lightbox:'+ arrName + ':' + (this.anchors[arrName].length-1);
				el.onclick = this.viewImage.pass(el, this);
			};
		}, this);

		if(this.bReady) return;
		
		this.eventKeyDown = this.keyboardListener.bindAsEventListener(this);
		this.eventPosition = this.position.bind(this);
		
		this.overlay = new Element('div').setProperty('id', 'lightboxOverlay').injectInside(document.body).setStyles('position:absolute; display:block; top:0; left:0; padding:0; margin:0; width:100%; height:0; z-index:999; background: #6E737F; visibility:hidden;');

		this.center = this.overlay.clone().setProperty('id', 'lightboxWrapper').setStyles('position:absolute; z-index:950; border:10px solid #FFF; background:#FFF; left:-1000px; top:-1000px;  width:10px; height:10px; overflow:hidden; z-index:1000;').injectInside(document.body);
//		new Element('div').setProperty('id', 'lbCenter').setStyles({width: this.options.initialWidth, height: this.options.initialHeight, marginLeft: -(this.options.initialWidth/2), display: 'none'}).injectInside(document.body);

		this.canvas = this.overlay.clone().setProperty('id', 'lightboxCanvas').setStyles('').injectInside(this.center);
		

//		new Element('div').setProperty('id', 'lbCanvas').injectInside(this.center);
		this.ajaxLoader = this.overlay.clone().setProperty('id', 'ajaxLoader').setStyles('position: absolute; height:40px; width:40px; top: 0; left: 0; background:#333 url(/resources/ajax_16px_333333.gif) no-repeat center; margin:5px; display: none;').setStyle('opacity',0.8).injectInside(this.canvas);
		
		this.controlBar = this.overlay.clone().setProperty('id', 'lightboxControl').setStyles('position: absolute; height:45px; width:100%; top: 0; left: 0; background:url(); margin:0; display: none; visibility: hidden;').setStyle('opacity',0.8).injectInside(this.canvas);
		this.controlBar.setHTML('<div style="float:right; margin: 5px; background:#000; height:14px; padding:13px 20px;">'+
			'<a href="#" style="padding:2px 20px 2px 20px; cursor: pointer;  background:url(/resources/images/lb_controls.gif) no-repeat 0px -234px;" target="_blank" id="lightboxSaveLink">download</a>'+
			'<a href="#" style="padding:2px 0px 2px 20px; cursor: pointer;  background:url(/resources/images/lb_controls.gif) no-repeat 0px -274px;" id="lightboxCloseLink">close</a>'+
			'</div>');
		
		var controlBar = this.controlBar;
		this.canvas.addEvents({
			'mouseenter' : function(){
				controlBar.setStyle('display', '');
			},
			'mouseleave' : function(){
				controlBar.setStyle('display', 'none');
			}			
		});
		
//		this.resetMainImage()
			
	
		this.topContainer = this.overlay.clone().setProperty('id', 'lightboxCaption').setStyles('position: absolute; width:100%; top: 0; left: 0; height: 75px; z-index:1000;').setStyles({'visibility':'hidden'}).injectInside(document.body);
		this.topContainer.setHTML('<table border=0 cellspacing=0 cellpadding=0 style="margin:auto;" id="lightboxCaptionTable"><tr>'+
			'<td><div style="width: 75px; height: 75px; background:url(/resources/images/lb_controls.gif) no-repeat" id="lightboxPrevBlock"></div></td>'+
			'<td id="lightboxTextCell"><div style="color:#CCC; font-size:12px; text-align:center;" id="lightboxCaptionNumbers"></div><div style="color:#FFF; font-size:18px;text-align:center" id="lightboxCaptionText"></div></td>'+
			'<td><div style="width: 75px; height: 75px; background:url(/resources/images/lb_controls.gif) no-repeat -75px 0px" id="lightboxNextBlock"></div></td>'+
			'</tr></table>');		
			
		this.number = $('lightboxCaptionNumbers');
		this.caption = $('lightboxCaptionText');
		this.captionWrapper = $('lightboxCaptionTable');
		this.saveLink = $('lightboxSaveLink').setStyle('display', this.options.downloadLink ? '':'none');
		this.closeLink = $('lightboxCloseLink');	
		
//		this.textWrapper = this.overlay.clone().setStyles('margin: auto;height: 75px;').injectInside(this.topContainer);		

		this.prevLink = new Element('a').setProperties({id: 'lbPrevLink', href: '#', title: 'Previous image'}).setStyle('display', 'none').injectInside('lightboxPrevBlock');
		this.nextLink = this.prevLink.clone().setProperties({'id': 'lbNextLink', title: 'Next image'}).injectInside('lightboxNextBlock');
		this.prevLink.onclick = this.previous.bind(this);
		this.nextLink.onclick = this.next.bind(this);

		this.closeLink.onclick = this.overlay.onclick = this.close.bind(this);


		var nextEffect = this.nextEffect.bind(this);
		this.fx = {
			overlay: this.overlay.effect('opacity', {duration: 500}).hide(),
			center: this.center.effects({duration: this.options.resizeDuration, transition: this.options.resizeTransition, onComplete: nextEffect}),
			top: this.captionWrapper.effect('margin-top', {duration: 300}),
			image: this.canvas.effect('opacity', {duration: 500, onComplete: nextEffect})
		};
		
		this.bReady = true;
		
//		this.preloadPrev = new Image();
//		this.preloadNext = new Image();
	},
	getArrayName : function(rel){
		var currRel = rel.replace(']', '');
		var arrName = currRel.split('[')[1];
		return arrName;
	},
	resetMainImage : function(){
		if(!this.currentImage) {
			this.currentImage = new Image();
			$(this.currentImage).setProperties({width: '100%'}).injectInside(this.canvas);
		};
		this.currentImage.src = '';
		this.currentImage.onload = function(){};
	},
	viewImage: function(link){
		var labels = link.rel.split(':');
		var arrName = labels[1];
		var itemNumber = labels[2];
		this.items.length = 0;
		this.items = this.anchors[arrName].copy();
		return this.open(itemNumber);
	},
	open: function(itemNumber){
		this.setup(true);
		this.position();		
		this.activeItem  = itemNumber.toInt();
		
//		alert(this.items[itemNumber].href)
		this.preload = new Image();
		this.preload.onload = this.nextEffect.bind(this);
		this.preload.setAttribute('src', this.items[itemNumber].href);
//		this.preload.src = this.items[itemNumber].href;
		
		this.title = this.items[itemNumber].title || this.extractFileName(this.items[itemNumber].href, 0);
		this.step = this.bActive ? 4 : 0;	
		
		this.controlBar.style.visibility = 'hidden';
		
		if(!this.bActive) {
			this.fx.image.hide();
			this.overlay.setStyles({'background':'#6E737F url(/resources/ajax_48px_6E737F.gif) no-repeat', 'background-position': 'center ' +  (window.getScrollTop() + window.getHeight() / 2 - 48 ) + 'px'});
			this.fx.overlay.start(0.8);			
		} else {
			this.ajaxLoader.setStyle('display', '');
		};
		
		return false;
		
	},
	position: function(){
		//IE6 - XML prolog problem.
//		var ww = (window.getWidth() == 0) ? window.getScrollWidth()-22 : window.getWidth();
//		var wh = (window.getHeight() == 0) ? window.getScrollHeight() : window.getHeight();
//		var st = document.body.scrollTop  || document.documentElement.scrollTop;
		var pageSize = window.getSize(); //getSiteDimensions();
//		var ww = (window.getWidth() == 0) ? window.getScrollWidth()-22 : window.getWidth();

		var wh = pageSize.scrollSize.y;
		var st = pageSize.scroll.y;// document.body.scrollTop  || document.documentElement.scrollTop;

		this.overlay.setStyles({top: 0, height: wh /*, width:ww+'px'*/});
	},
	resizeCanvas : function(){
	},
	setup: function(open){
		var elements = $A(document.getElementsByTagName('object'));
		if (window.ie) elements.extend(document.getElementsByTagName('select'));
		elements.each(function(el){ el.style.visibility = open ? 'hidden' : ''; });
		var fn = open ? 'addEvent' : 'removeEvent';
		this.fx.center.options.duration = this.options.resizeDuration;
		this.fx.center.options.transition = this.options.resizeTransition;
//		window[fn]('scroll', this.eventPosition)[fn]('resize', this.eventPosition);
//		window[fn]('resize', this.eventPosition);		
		document[fn]('keydown', this.eventKeyDown);				
	},
	getDimensionsScale : function(){
		var maxWidth=window.getWidth() - 100;
		var w_scale=1;
		if(maxWidth<this.preload.width){
		    w_scale=maxWidth/this.preload.width;
		};
		return w_scale;

	},
	nextEffect: function(){
		if(this.step == 0){
			var ww = window.getWidth();
			this.center.setStyles({opacity: 1, top: window.getScrollTop() + window.getHeight() / 2 - 40, width: this.options.initialWidth, height: this.options.initialHeight, left: (ww/2 - (this.options.initialWidth + 20)/2).toInt()});
			this.step = 1;
			this.nextEffect();
			return false;
//			console.log('w: %s  h: %s', this.preload.width, this.preload.height)
		};
		if(this.step == 1){
			this.overlay.setStyles({'background':'#6E737F'});
			var ww = window.getWidth();
			var wh = (window.getHeight() == 0) ? window.getScrollHeight() : window.getHeight();
			var st = window.getScrollTop();
			var wt, at;
			if(wh - this.preload.height > 170){ 
				 wt = (wh - this.preload.height - 20)/2 + st
				 at = wt;
			}
			else {
				wt = 75 + st;
				at = this.topContainer.style.top.toInt() + 75;
			};
				
			this.top = wt;//this.bActive ? at : wt;
			
			this.topContainer.setStyles({top: st});	
			this.center.style.display = '';
			
			if(this.image) this.image.remove();
			
			var k = this.getDimensionsScale();
			this.originalSizes = [this.preload.width, this.preload.height];
			this.fx.center.start({top: this.top, left: (ww/2 - ( this.preload.width*k + 20)/2).toInt(), height: this.preload.height*k, width: this.preload.width*k});
			this.step = 2;	
			return false;			
		};
		if(this.step == 2){
			this.position();			
			this.overlay.setStyles({height: this.overlay.style.height.toInt() + 25 });
			
			this.number.setHTML( (this.items.length == 1) ? '' : 'Image ' + (this.activeItem+1) + ' of ' + this.items.length );	
			this.caption.setHTML(this.title);			
			
			this.image = $(this.preload).injectInside(this.canvas).setStyles({'width': this.center.style.width, 'height': this.center.style.height});
			
			this.saveLink.href = this.preload.src;				
//			this.currentImage.src = this.preload.src;	
			
//			$(this.preload).remove();		
			this.preload.onload = Class.empty;
			this.preload = null;
			
			
			this.fx.image.start(1);
			this.step++;
			return false;
		};
		if(this.step == 3){
			this.bActive = true;

			this.topContainer.setStyles({visibility:''});
			this.controlBar.style.visibility = '';
			this.fx.top.start(0);
//			this.prevLink.style.height = this.nextLink.style.height = this.center.style.height;
			if(this.activeItem > 0 && this.items.length > 1)
				this.prevLink.setStyle('display', '');
			if(this.activeItem < this.items.length - 1  && this.items.length > 1)
				this.nextLink.setStyle('display', '');
			return false;
		};
		if(this.step == 4){
			this.prevLink.style.display = this.nextLink.style.display = 'none';
			this.ajaxLoader.setStyle('display', 'none');
			this.fx.image.start(0);
			this.step = 1;
			return false;
		};
		if(this.step == 5){
			this.fx.center.options.duration = 100;
			this.fx.center.options.transition = Fx.Transitions.linear;
			this.prevLink.style.display = this.nextLink.style.display = 'none';

			this.topContainer.style.visibility = 'hidden';
			this.captionWrapper.style.marginTop = '-75px';

			
			this.fx.center.start({opacity: 0});		
			this.step++;
			return false;
		};
		if(this.step == 6){
			var overlay = this.overlay;
			this.fx.overlay.start(0).chain(function(){
				overlay.setStyles({top:0, height: 0});
			},this);
			this.center.style.display = 'none';
			this.bActive = false;
			this.step++;
			return false;
		};			
	},
	close : function(){
		this.step = 5;
		this.nextEffect();
		return false;
	},
	keyboardListener: function(event){
		switch (event.keyCode){
			case 27: case 88: case 67: this.close(); break;
			case 37: case 80: this.previous(); break;	
			case 39: case 78: this.next();
		}
	},
	previous: function(){
		return this.items[this.activeItem-1] ? this.open(this.activeItem-1) : false;
	},

	next: function(){
		return this.items[this.activeItem+1] ? this.open(this.activeItem+1) : false;

	},
	extractFileName: function(fullpath, lnght) {
		var element_work = fullpath;
		var etab = fullpath.split("/");
	
		nbr_elements = etab.length;
		fullpath = etab[nbr_elements-1];
		return fullpath;
	}	
};

/*
	filemanager routines
	fileManager.actions		move
							remove
							edit
							getLinks
							emailLinks
							share
							unshare
							sendEmailLinks
*/

var fileManager = {
	blockGroupActions: true,
	itemsCopy: [],
	getWFObject : function(id){
//		var el;  var type = id.split("_", 2)[0];		
//		id = id.split("_", 2)[1];
//		return (type == 'd') ? webFolder.getFolder( id ) : webFolder.getFile( id );
		return directory[id] || null;
	},
	setupAction : function(action, id, req){

		webFolder.UI.mainForm.action = webFolder.folderAction;
		webFolder.UI.mainForm.actionRequest.value = req || action.toLowerCase(); 
		var el = false;
		if(id){
			var title = {};
			el = this.getWFObject(id);	
		
			title = {
				'name' : el.name,
				'ico' : action.toLowerCase(),
				'action' : action + (el.isFolder ? ' folder' : ' file')
			};		
		} else {
			title = {
				'ico' :action.toLowerCase(),
				'action' : action + ' selected items'
			};		
		}
		actionWindow.setTitle(title);
		return el;
	},	
	trash : function(id){
		this.action = 'remove';
		
		var el = this.setupAction('Remove', id);
	
		actionWindow.setContent ("<form method=\"post\" onsubmit=\"fileManager.confirmUpdate(); return false;\" name=trashForm id=trashForm action=\""+webFolder.folderAction+"\">"+
		(el ? "<input type=hidden name=actionRequest value=remove /><input type=hidden name='copy_files' value='0' /><input type=hidden name=\""+ (el.isFolder ? "chkdir_" : "chkfile_")+el.id+"\" value=\"" + el.pid + "\" />" : "")+
		"<div style='font-size:12px; margin-bottom:7px;'><b>Are you sure you want to delete selected item(s)?</b><br>This operation is not undoable</div>"+
		'<div class="winButtons fixed clearfloat">'+
		'<div class="button btn2" style="float:left; margin-right:5px;"><a href="#detele" onClick="confirmUpdate(); return false;"><span class="left"></span><span class=center>delete</span><span class="right"></span></a></div>'+
		'<div class="button btn2" style="float:left;"><a href="#" onClick="cancelUpdate(); return false;"><span class="left"></span><span class=center>cancel</span><span class="right"></span></a></div>'+	
		'</div></form>');
		
		this.bGroupAction = id ? false : true;
		
		actionWindow.show();
	},

	quickSubfolder: function(){
		var form = fileManager.bGroupAction ? webFolder.UI.mainForm : actionWindow.form;
		var id = form.todir.value;
		var bRefreshRequired = webFolder.index == id;
		var folderName = prompt("Enter new folder name:");
		var action = this.action;
		this.action = 'quickSubfolder';
		if(folderName){
			var url = '/webfolder/' + id;
			var data = 'actionRequest=add_dir&dirname=' + folderName;
			var request = new Ajax(url, {
				method: 'get',
				data: data,
				autoCancel: true,				 
				onRequest: function() {
					tree.getStateString();					
					webFolder.messenger.say('working', 'creating folder...');
				},
				onComplete: function() {				
					var jsonObj = (Json.evaluate(this.response.text, this.options.secure));
					tree.build(jsonObj.tree,$('tree_browser') , tree.label);
					tree.click(jsonObj.folders.id.toString())
					webFolder.messenger.cancel(500);
//		update file listing woth new folder					
					webFolder.folders.push(jsonObj.folders);
					webFolder.bUpdate = 1;
//					webFolder.setupPager();
					webFolder.setupDir();
					fileManager.action = action;					
				},
				onFailure : function(statusText) {
					webFolder.messenger.say('warn', 'Oops ;( File Qube was unable to perform requested operation. Please, try again later').cancel(5000);
				}					 
			}).request();
		};		
	},
	move : function(id, copy){	
		this.action = copy ? 'Copy' : 'Move';
		
		var el = this.setupAction(this.action, id);
		
		this.action = this.action.toLowerCase();
		

		actionWindow.setContent ("<form method=\"post\" onsubmit=\"fileManager.confirmUpdate(); return false;\" name=moveForm id=moveForm action=\""+webFolder.folderAction+"\">"+
		(el ? "<input type=hidden name=actionRequest value=move /><input type=hidden name='copy_files' value='0' /><input type=hidden name=fromdir value="+webFolder.index+" /><input type=hidden name=todir value="+ tree.stack[0].id+" /><input type=hidden name=\""+ (el.isFolder ? "chkdir_" : "chkfile_")+el.id+"\" value=value=\"" + el.pid + "\" />" : "")+
		"<div style='font-size:12px; margin-bottom:3px;'>Select the place where you want to "+ this.action + "&nbsp;selected item(s)</div>"+
	
		'<div style="height:auto; width: auto; margin: 0 0 10px 0;" class="modalInput"><ul id="tree_browser" class="tree">'+
		'</ul></div>'+
//		'<p><a href="#" onclick="fileManager.quickSubfolder();">new folder</a></p>'+
		'<div class="winButtons fixed clearfloat">'+
		'<div class="button btn2" style="float:left; margin-right:5px;"><a href="#move" onClick="confirmUpdate(); return false;"><span class="left"></span><span class=center>'+ this.action +'</span><span class="right"></span></a></div>'+
		'<div class="button btn2" style="float:left;"><a href="#" onClick="cancelUpdate(); return false;"><span class="left"></span><span class=center>cancel</span><span class="right"></span></a></div>'+	
		'<div style="padding: 4px 0pt 4px 25px; background: transparent url(/resources/add_plus.gif) no-repeat scroll 0pt center; font-family: Tahoma; font-size: 11px; margin-left: 15px; float: right; height: 14px;"><a onclick="fileManager.quickSubfolder(); return false;" href="#new folder">add subfolder</a></div>'+
		'</div></form>');
		$('tree_browser').setHTML(treeMenu.menu.innerHTML);
		this.bGroupAction = id ? false : true;
		
		if(this.bGroupAction){
			webFolder.UI.mainForm.todir.value = tree.stack[0].id; //dirTree[0].id;
			webFolder.UI.mainForm.fromdir.value = webFolder.index;
		}
		
		var form = this.bGroupAction ? webFolder.UI.mainForm : actionWindow.form;
		form.copy_files.value = copy ? 1 : 0;
		tree.click(tree.stack[0].id.toString())		
		actionWindow.show();
	},	
	copy: function(id){		
		this.move(id || 0, 1);
	},
	silentMove : function(dir, el){	
		this.action = 'move';
		this.bGroupAction = el ? false : true;
		
		if(this.bGroupAction){
			webFolder.UI.mainForm.action =  webFolder.folderAction;
			webFolder.UI.mainForm.actionRequest.value = this.action; 
			webFolder.UI.mainForm.todir.value = dir;
			webFolder.UI.mainForm.fromdir.value = webFolder.index;
		}
		
		var checkBoxes = '';		
		var check = '';
		/*
			массив передаётся функцией paste() - это массив скопированных объектов webFolder.files / webFolder.folders			
		*/
		if($type(el) == 'array'){
			for(var x = 0, y = el.length; x < y; x++){
				check = el[x].isFolder ? 'chkdir_' : 'chkfile_';
				check += el[x].id
				if(dir != el.id)
					checkBoxes +=  '<input type=hidden name=\"'+check+'\" value=\"'+ el[x].pid + '\" />'				
			};
			var fromdir = this.sourceDir;
		} 
		/*
			объект передаётся функцией rubberband.end() - это элемент типа rubberband.node
				obj : el,
				id: index,
				input : input,
				type : 'file' || 'folder',
				id : input.value,				
				w : w,
				h : h,
				x : [],
				y : []
		*/
		
		else if($type(el) == 'object'){			
			if(dir == el.id) return false;

			check = el.type == 'folder' ? 'chkdir_' : 'chkfile_';
			check += el.id
			checkBoxes = '<input type=hidden name=\"'+check+'\" value=\"'+ el.pid + '\" />'
			var fromdir = webFolder.index;
		}
		actionWindow.setContent ("<form method=\"get\" onsubmit=\"fileManager.confirmUpdate(); return false;\" name=moveForm id=moveForm action=\""+webFolder.folderAction+"\">"+
		(el ? "<input type=hidden name=actionRequest value=move /><input type=hidden name=fromdir value="+ fromdir +" /><input type=hidden name=todir value="+ dir+" />"+checkBoxes : "")+
		'</form>');	
	

		this.confirmUpdate();
	},
	edit : function(id){

		this.action = 'edit';
		var actionReq, input;
		var title = {};
		this.bGroupAction = false;
		var el = this.getWFObject(id);

		var row = [];
			
		if(el.isFolder){
			actionReq = 'updir';
			input = '<input type=hidden name=updir value="'+el.id+'">';
			row[0] = "<div class=\"inputBlock clearfloat\"><label for='dirname'>Folder Name:</label><input name=dirname id=dirname type=text value='"+el.name+"' class=modalInput /></div>";
			row[1] = '';
			title = {
				'ico' : 'folder_info',
				'action' : 'folder properties'			
			};	
		};
		if(el.isFile){
			actionReq = 'upfile';
			input = '<input type=hidden name=upfile value="'+el.id+'">';
			row[0] = "<div class=\"inputBlock clearfloat\"><label for='filename'>File Name:</label><input name=filename id=filename type=text value='"+el.name+"' class=modalInput /></div>";
			row[1] = "<div class=\"options clearfloat\"><h3>Details</h3>"+
			'<table width=100% border=0 cellpadding=0 cellspacing=0 class="table2 ">'+
			'<tr><td width=75>Filesize:</td>'+
			'<td><b>'+getHFileSize(el.size)+'</b></td></tr>'+ 
			'<tr><td>Uploaded:</td>'+
			'<td><b>'+webFolder.displayDate(el.createDate)+'</b></td></tr>'+
			'<tr><td>Downloads:</td>'+
			'<td><b>'+el.dls+'</b></td></tr>'+
			'</table></div>';
			title = {
				'ico' : 'file_info',
				'action' : 'file properties'			
			};			
	
		};
		title.name = el.name;
		actionWindow.setTitle(title);		
		
		actionWindow.setContent ('<form method=\"post\" onsubmit=\"fileManager.confirmUpdate(); return false;\" name=updateAction id=updateAction action="'+ webFolder.folderAction +'"  accept-charset=\"utf-8\" class="actionForm">'+
		'<input type=hidden name=actionRequest value="'+ actionReq +'">'+ input + row[0] +	
		'<div class="inputBlock clearfloat"><label>Tags:</label><input name=$tags type=text  value="'+ el.tags +'" class="modalInput"></div>'+		
		'<div class="inputBlock clearfloat"><label for="desc">Description:</label><textarea name=desc id=desc rows=2 class=modalInput>'+el.description +'</textarea></div>'+
		"<div class=\"options\"><input type=checkbox "+ (el.password ? 'checked' : '') +" name=protected value=true id='passOption' class='checkbox'><label for='passOption'>Protect with password</label>"+
		"<input name=password type=text value='"+(el.password || '')+"' class='modalInput nofloat' id=passWrapper style=\"margin-top: 7px;\" /></div>"+	
		row[1] + "</form>"+
		"<div class='winButtons clearfloat'>"+
		'<div class="button btn2" style="float:left; margin-right:5px;"><a href="#save" onClick="confirmUpdate(); return false;"><span class="left"></span><span class=center>save</span><span class="right"></span></a></div>'+
		'<div class="button btn2" style="float:left;"><a href="#" onClick="cancelUpdate(); return false;"><span class="left"></span><span class=center>cancel</span><span class="right"></span></a></div>'+	
		'</div>');
	
		buildDIRShareLinks();
//		tags.action = 'autocomplete tags';
//		tags.retreive();
		tags.setupAutocompleter();	
		actionWindow.show();
	
	},
	openMP3Popup: function(id){
		
		if(window.mp3popup) window.mp3popup.close();
		
		var checkQuery = '';
		var url = "/webfolder/" + webFolder.index + "?actionRequest=player&type=faudio&%f";
		if(id) {
			checkbox = $('chkfile_' + id);
			checkQuery = checkbox.name + '=' + checkbox.value;
		} else {
			var checkboxes = webFolder.UI.mainForm.getElements('input[type=checkbox]') || [];
			checkboxes.each(function(checkbox){
				if(checkbox.checked && checkbox.hasClass('mp3check')){
					checkQuery += checkbox.name + '='+ checkbox.value +'&';
				};
			}, this);			
		};
		url = url.replace('%f', checkQuery);
		var hgt = id ? 110 : 225;
		window.mp3popup = window.open(url,'Flash_MP3_Player','height='+ hgt +',width=510,resizable=yes,scrollbars=no,toolbar=no,status=yes');
		if (window.focus) {
			mp3popup.focus();
		};
	},
	play: function(id){		
		var obj = this.getWFObject(id);
		if(mp3Window.opened) {
			fileManager.loadMP3(obj.url);
		} else {			
			$('mp3Title').setHTML(shortFileName(obj.name, 44));
			mp3Window.addEvent('onShow', function(){										  
				fileManager.loadMP3(obj.url);
				this.removeEvents('onShow');
			});
			mp3Window.show();
		};

	},
	loadMP3: function(url){
		try{
			console.log('try to load')
			var playerObject = navigator.appName.indexOf("Microsoft") != -1 ? window['mp3play'] : document['mp3play'];			
			playerObject.loadFile({file: url});
			playerObject.sendEvent('playpause');
		} catch(e) {
			console.log(e);
			this.loadMP3.delay(5, this, url);
		};
	},
	createSubfolder : function() {
		this.action = 'newFolder';
		actionWindow.setContent("<form method=\"get\" name=formCreateSubfolder id=formCreateSubfolder action=\""+webFolder.folderAction+"\" accept-charset=\"utf-8\" class=\"actionForm\" >"+
		"<input type=hidden name=actionRequest value=add_dir>"+
//		'<div class="inputBlock clearfloat"><label>Tags:</label><input name=$tags type=text  value="'+ el.tags +'" class="modalInput"></div>'+			
		'<div class=\"inputBlock clearfloat\"><label for="aw_dirname">Folder name:</label><input name=dirname id=aw_dirname type=text class=modalInput value="Enter folder name to begin" onblur="" onfocus=\"autoFill.SetFocus(this, \'Enter folder name to begin\');\" /></div>'+
		'<div class=\"inputBlock clearfloat\"><label for="aw_tags">Tags:</label><input name=$tags type=text value="" class=modalInput></div>'+		
		'<div class=\"inputBlock clearfloat\"><label for="aw_desc">Description:</label><textarea name=aw_desc id=desc class=modalInput></textarea></div>'+		
		'<div class="winButtons">'+
		'<div class="button btn2" style="float:left; margin-right:5px;"><a href="#create" onClick="confirmUpdate(); return false;"><span class="left"></span><span class=center>create folder</span><span class="right"></span></a></div>'+
		'<div class="button btn2" style="float:left;"><a href="#" onClick="cancelUpdate(); return false;"><span class="left"></span><span class=center>cancel</span><span class="right"></span></a></div>'+	
		'</div></form>');
	
		buildDIRShareLinks();		
	
		actionWindow.setTitle({
			'ico' : 'add_folders',
			'action' : 'Create new subfolder'
		});
		
//		tags.action = 'autocomplete tags';
//		tags.retreive();
		tags.setupAutocompleter();
		actionWindow.show();	
//		$('dirname').focus();
	},
	tagIt : function(id) {
		this.action = 'addTags';
		var el = this.setupAction('Tag', id, 'addtags');
		
		actionWindow.setContent("<form method=\"get\" name=formCreateSubfolder id=formCreateSubfolder action=\""+webFolder.folderAction+"\" accept-charset=\"utf-8\" class=\"actionForm\" >"+
		(el ? "<input type=hidden name=actionRequest value=addtags /><input type=hidden name=\""+ (el.isFolder ? "chkdir_" : "chkfile_")+el.id+"\" value=value=\"" + el.pid + "\" />" : "")+
		"<div class=\"inputBlock clearfloat\"><input name=$tags type=text value='' class=\"modalInput fixedInput\" /></div>"+
		'<div class="winButtons fixed clearfloat">'+
		'<div class="button btn2" style="float:left; margin-right:5px;"><a href="#create" onClick="confirmUpdate(); return false;"><span class="left"></span><span class=center>OK</span><span class="right"></span></a></div>'+
		'<div class="button btn2" style="float:left;"><a href="#" onClick="cancelUpdate(); return false;"><span class="left"></span><span class=center>cancel</span><span class="right"></span></a></div>'+	
		'</div></form>');	
		this.bGroupAction = id ? false : true;
		tags.setupAutocompleter();
		actionWindow.show();	
	},	
	keyboardListener : function (event) {
		var node = event.target.nodeName.toLowerCase();
		if(node.test('input|textarea|button')) return;
//ctrlKey
//keyCode
		switch (event.code){
			// DEL
			case 46: fileManager.trash(); break;
			// CTRL + X
//			case 88: if(event.control) fileManager.clip(this.UI.rubberband.selectedItems); fileManager.action = 'cut'; break;	
			//CTRL + V
//			case 86: if(event.control) fileManager.paste(); break;	
		}
		
//		if(event.key=='a' && event.control) { event.stop(); checkItems('a'); return false;}
//		if(event.code=='c' && event.key) {}		
//		if(event.key=='enter' && event.control && this.options.onConfirm) { event.stop(); this.confirm(); }
	},
	clip: function(arr){
		if(this.itemsCopy && this.itemsCopy.length > 0)
			this.itemsCopy.each(function(obj){
				try {
					obj.object.removeClass('cut');
				} catch(e){
					var el = $(obj.type +'_'+ obj.id);
					var thumb = el.getElement('div.thumb') || el;													
					thumb.removeClass('cut')			
				}
			});
		this.itemsCopy = [];
		if(arr.length <= 0) return false;
		
		this.sourceDir = webFolder.index;
		this.itemsCopy.extend(arr);

		this.itemsCopy.each(function(el, i){
			el.obj.addClass('cut');
			if(el.type == 'folder') {
				this.itemsCopy[i] = directory['d_'+el.id];
//				this.itemsCopy[i].object = directory['d_'+el.id].object = null;
			}
			if(el.type == 'file'){
				this.itemsCopy[i] = directory['f_'+el.id];
//				this.itemsCopy[i].input = directory['f_'+el.id].input = null;
			}
		}, this)
	},
	paste: function(){	
		if(this.itemsCopy.length == 0) return false;
		switch (this.action){
			case 'cut': 
				this.targetDir = webFolder.index;
				if(this.sourceDir == this.targetDir){			
					webFolder.messenger.say('warn', '<strong>Opps...</strong> Operation canceled. The destination folder is the same as the source folder').cancel(10000);

					$$('.cut').each(function(obj){
						obj.removeClass('cut');
					});
					
					this.itemsCopy.length = 0;
					return false;
				} else {
					this.silentMove(this.targetDir, this.itemsCopy);
					this.itemsCopy.length = 0;
				};
				break;
		}
	},
	getLinks : function(id, itemType){
		this.action = 'getLinks';
		this.bGroupAction = false;
		
		if(id)
			this.el = this.getWFObject(id);
		else 
			this.el = {
				name : webFolder.wfName,
				isFolder : true,
				id : webFolder.index,
				bShared : webFolder.bShared
			};
			
		actionWindow.setContent ("<div class=\"loadActivity\" style=\"width:100%; height:60px;\"><!-- --></div>");
		
		var title = { 'name' : this.el.name };
		

		if(!itemType) {
			title.ico =  this.el.isFolder ? 'share' : 'share';
			title.action = this.el.isFolder ? 'web links' : 'web links';
			var reqURL = webFolder.folderAction + '?actionRequest=' + (this.el.isFolder ? 'sharefolder&sharedir=' : 'sharefile&sharefile=') + this.el.id;
		} else if(itemType == 'widget') {			
			title.ico =  'share';
			title.action = 'create sharing widget';	
			var reqURL = webFolder.folderAction + '?actionRequest=sharewidget&sharedir=' + this.el.id;
		};

		actionWindow.setTitle(title);
//		actionWindow.addEvent('onLoad', this.setupSharing.bind(this)).show({url:reqURL});
		this.requestCodes(reqURL);
			
	},
	postLinks: function (id){
		this.emailLinks(id || false, 'blogLinks');
	},
	emailLinks : function(id, action){
		var bQuick = (this.action == 'getLinks');
		var ico, title, reqAction;
		
		this.action = action || 'emailLinks';
	
		switch(this.action){
			case 'blogLinks':
				ico = 'blog_links';
				title = 'Post links to blog';
				reqAction = 'blogwin';
				break;
			case 'emailLinks':
				ico = 'email_links';
				title = 'Email the link' + (!id ? 's' : '');
				reqAction = 'sendgroupwin';
				break;
		};
		
		var n = $type(id) == 'string' ? id.split("_", 2)[1] : 0;
		if(n == webFolder.index) id = n;
		
		if(id && id != webFolder.index){
			this.bGroupAction = false;
			this.el = this.getWFObject(id);
		} else {
			this.bGroupAction = $chk(id);
			this.el = {
				name : webFolder.wfName,
				isFolder : true,
				id : webFolder.index
			};
		};
		
		if(bQuick) actionWindow.createPreloader();
		else actionWindow.setContent ("<div class=\"loadActivity\" style=\"width:100%; height:60px;\"><!-- --></div>");
					
		if(id && this.action == 'emailLinks'){
			var reqURL = webFolder.folderAction + '?actionRequest=sendlinkwin&send_' + (this.el.isFolder ? 'folder=' : 'file=') + this.el.id;
		}
		else {
			webFolder.UI.mainForm.action = webFolder.folderAction;
			webFolder.UI.mainForm.actionRequest.value = reqAction;		
			var reqURL = webFolder.folderAction + '?' + webFolder.UI.mainForm.toQueryString();
			this.el.name =  false;	//set to false to skip name tag in setTitle()
		};
		
		var title = { 'name' : this.el.name,
			ico :  ico,
			action : title
		};
		
		actionWindow.setTitle(title);
		this.requestCodes(reqURL);
		
	},
	sendEmailLinks : function() {
		var form = this.bGroupAction ? webFolder.UI.mainForm : actionWindow.form;

		var testString = /^([a-z0-9_-]+)(\.[a-z0-9_-]+)*@([a-z0-9_-]+)(\.[a-z0-9_-]+)*[\.]([a-z0-9_-]+)$/i;

		if(addressBook.input && addressBook.input.value.test(testString)) {
//			$('emails').value = addressBook.input.value;
		};	

		var sendExternal = function(url){
				var text = "<p>Send a link to this file in an email via "+ $('email_type').value +". You will be able to edit the email before sending it to contacts.</p>"
				var linkHTML = $('email_type').value == 'gmail' ? '<a href="#ok" onclick="fileManager.launchService(\''+ url +'\'); cancelUpdate(); return false;">' : $('email_type').value == 'outlook' ? '<a href="'+ url +'" onclick="cancelUpdate();">' : '';
				actionWindow.updateWindow(text + 
				'<div class="winButtons fixed clearfloat">'+
				'<div class="button btn2" style="float:left;">'+ linkHTML +'<span class="left"></span><span class=center>OK</span><span class="right"></span></a></div>'+
				'<div class="button btn2" style="float:left; margin-left:5px;"><a href="#" onClick="cancelUpdate(); return false;"><span class="left"></span><span class=center>cancel</span><span class="right"></span></a></div>'+	
				'</div>');
		};

		var successSend = function(text){
				actionWindow.updateWindow(text + '<div class="button btn1">'+
				'<a href="#ok" onClick="cancelUpdate(); return false;"><span class="left"></span><span class=center>OK</span><span class="right"></span></a>'+
				'</div>');							
		};

		actionWindow.form.send({
			evalScripts : true,
			onRequest: actionWindow.createPreloader.bind(actionWindow),
			onComplete: (function(struct) {
				var response = $type(struct) == 'object' ? struct : Json.evaluate(struct);
				if(response.status == 'error') {
					actionWindow.preloaderOverlay.remove();
					actionWindow.preloaderOverlay = null;
					alert(response.message);
					addressBook.setup(emailbook);
				} else {
					if(response.sendUrl)
						sendExternal(response.sendUrl);
					else
						successSend(response.message);
						
					if(response.update) 
						webFolder.shareItems(response.update);
						
					this.action = 'default';
				};

			}).bind(this),
			onFailure : webFolder.ajaxError.bind(webFolder)
		});

	},	
	requestCodes : function(reqURL){		
		var request = new Ajax(reqURL, {
			method: 'get',
			autoCancel: true,
			evalScripts : true,
			onComplete: this.setupSharing.bind(this),
			onFailure : webFolder.ajaxError.bind(webFolder)	
		});
		if(actionWindow.opened){
			request.request();
		} else {
			var fn = function(){
				request.request();
				actionWindow.removeEvent('onShow', fn);				
			};
			actionWindow.addEvent('onShow', fn);
			actionWindow.show();
		};
	},
	setupSharing : function(html){
		actionWindow.updateWindow(html);
		buildDIRShareLinks();
		if(this.action == 'emailLinks'){
//			if(emailbook.length > 0) 
				addressBook.setup(emailbook);
		};
		if(this.action == 'getLinks'){
			this.updateString = actionWindow.form.toQueryString();
			var newShare  = !this.el.bShared;
			if(newShare) {
				var updateObj = {
					files : [],
					folders : [],
					action: 'share'
				};
				if(this.el.isFile) {
					updateObj.files[0] = {
						password:this.el.password,
						id:this.el.id
					};
				};
				if(this.el.isFolder) {
					updateObj.folders[0] = {
						"password":this.el.password || '',
						"id":this.el.id
					};
				};			
				webFolder.shareItems(updateObj);
			};
		};
	},
	requestBackgroundUnshare : function(){
		this.action = 'unsharing';
		var form = actionWindow.form;
		if(form) {
			form.actionRequest.value = this.el.isFolder ? 'unsharefolder' : 'unsharefile';
			this.bGroupAction = false;
			this.requestUpdate();
		};
	},
	disableShare : function(){
		var ask = window.confirm('Are you sure you want to unshare selected item?\nThis operation make your files unaccessable.')
		if(ask) {
			this.action = 'unsharing';
			var form = actionWindow.form;
			form.actionRequest.value = this.el.isFolder ? 'unsharefolder' : 'unsharefile';
			this.bGroupAction = false;
			this.requestUpdate();
			confirmUpdate();
		};
	},	
	unshare : function(id){
		this.action = 'unshare';
		
		var el = this.setupAction('unshare', id);
	
		actionWindow.setContent ("<form method=\"post\" onsubmit=\"fileManager.confirmUpdate(); return false;\" name=unshareForm id=unshareForm>"+
		(el ? "<input type=hidden name=actionRequest value=unshare /><input type=hidden name=actionPage value=share /><input type=hidden name=\""+ (el.isFolder ? "chkdir_" : "chkfile_")+el.id+"\" value=value=\"" + el.pid + "\" />" : "")+
		"<div style='font-size:12px; margin-bottom:7px;'><b>Are you sure you want to unshare selected item(s)?</b> This operation make your files unaccessable.</div>"+
		'<div style="margin-top:10px; height: 22px;">'+
		'<div class="button btn2" style="float:left;"><a href="#detele" onClick="confirmUpdate(); return false;"><span class="left"></span><span class=center>detele</span><span class="right"></span></a></div>'+
		'<div class="button btn2" style="float:left; margin-left:5px;"><a href="#" onClick="cancelUpdate(); return false;"><span class="left"></span><span class=center>cancel</span><span class="right"></span></a></div>'+	
		'</div></form>');
		
		this.bGroupAction = id ? false : true;
		
		actionWindow.show();
	},
	search : function() {
		this.action = 'search';		
		actionWindow.setContent("<form method=\"post\" onsubmit=\"fileManager.confirmUpdate(); return false;\" name=quickSearch id=quickSearch accept-charset=\"utf-8\"  action=\""+webFolder.folderAction+"\" class=\"actionForm\">"+	
		"<input type=hidden name=actionRequest value='search'>"+		
		"<div class=\"inputBlock clearfloat\"><input name=keywords id=keywords type=text value='Enter keywords to begin search' class=\"modalInput fixedInput\" onfocus=\"autoFill.SetFocus(this, 'Enter keywords to begin search');\" /></div>"+
		'<div class="winButtons fixed clearfloat">'+
		'<div class="button btn2" style="float:left;"><a href="#search" onClick="confirmUpdate(); return false;"><span class="left"></span><span class=center>search</span><span class="right"></span></a></div>'+
		'<div class="button btn2" style="float:left; margin-left:5px;"><a href="#" onClick="cancelUpdate(); return false;"><span class="left"></span><span class=center>cancel</span><span class="right"></span></a></div>'+	
		'</div></form>');	
		
		actionWindow.setTitle({
			'ico' : 'search',
			'action' : 'seach'
		});
		
		actionWindow.show();	
	},
	upload: function(){		
	},
	cancelUpdate : function(){
		switch(this.action){
			case 'tagsFilter' : break;
			case 'search': break;	
			case 'edit' : tags.cleanup(); break;
			case 'remove' : break;
			case 'move': case 'copy':
				tree.getStateString();
				var tb = $('tree_browser');
				if(tb) treeMenu.menu.setHTML(tb.innerHTML);
				break;	
			case 'newFolder' : tags.cleanup(); break;
			case 'getLinks' :
//				this.bGroupAction = false;				
//				var newShare  = !this.el.bShared;
//				if(newShare) this.requestUpdate();
				//this.requestBackgroundUnshare();
				break;
			case 'emailLinks' : addressBook.cleanup(); break;
		};
		this.bGroupAction = false;
		this.action = 'default';
		
				
		if(!dhtmlWindowStage.currentWindow.opened) return false;
		dhtmlWindowStage.currentWindow.hide();
	},
	checkUpdate : function(){
		var form = this.bGroupAction ? webFolder.UI.mainForm : actionWindow.form; 
		var currentRequest = form.toQueryString();
		var result = currentRequest == this.updateString;
		return !result;		
	},
	confirmUpdate : function(){
		var bUpdated = this.checkUpdate();
		
		if(!bUpdated) {
			if(this.action != 'search' && this.action != 'addTags' && this.action != 'newFolder' && this.action != 'move' && this.action != 'copy' && this.action != 'remove')
			this.action = 'default';
		};
		switch(this.action){
			case 'default' : break;
			case 'search' :
				if(actionWindow.form.keywords.value != '' && actionWindow.form.keywords.value != 'Enter keywords to begin search'){			
					webFolder.requestDirectory({form: actionWindow.form, type: 'search'}); 
				} else {
					actionWindow.form.keywords.value = "Enter keywords to begin search"
					return false;
				};
				break;	
			case 'edit' : 
				this.requestUpdate();
				tags.cleanup();
				break;
			case 'remove' :
				this.requestUpdate();
				break;
			case 'blogLinks' : 
				this.sendEmailLinks();
//				actionWindow.form.setProperty('target', '_blank');
//				actionWindow.form.submit();
				return true;
				break;
			case 'move': case 'copy':
				this.requestUpdate();
				tree.getStateString();
				var tb = $('tree_browser');
				if(tb) treeMenu.menu.setHTML(tb.innerHTML);
				break;			
			case 'newFolder' : 
				if(actionWindow.form.dirname.value != '' && actionWindow.form.dirname.value != 'Enter folder name to begin'){
					this.requestUpdate(); tags.cleanup();
				} else {
					actionWindow.form.dirname.value = "Enter folder name to begin"
					return false;
				};
				break;
			case 'addTags' : 
				webFolder.UI.mainForm.action += ('?tags=' + actionWindow.form.tags.value);
				this.requestUpdate(); tags.cleanup();
				break;					
			case 'getLinks':
				this.bGroupAction = false;
				if(bUpdated) this.requestUpdate();
				break;
			case 'emailLinks' : 
				this.sendEmailLinks();
				addressBook.cleanup();
				return false;
				break;
		};
		this.action = 'default';
		if(dhtmlWindowStage.currentWindow.opened) dhtmlWindowStage.currentWindow.hide();
	},	
	uploadFiles: function(){
	},
	checkFolderAction: function(){		
	},
	requestUpdate : function(){
		var form = this.bGroupAction ? webFolder.UI.mainForm : actionWindow.form;
		webFolder.requestUpdate(form);
		this.bGroupAction = false;
//		this.action = 'default';
	},
	blogSelect: function(val){
		if(val == 'wordpress')
			$('wp_info').style.display = '';
		else
			$('wp_info').style.display = 'none';
	},
	launchService: function(url){
		var w=790, h=590;
		if($chk(window.screen)) {
			w = screen.width > 1000 ? 950 : 770;
			h = screen.height - 200;
		};
		window.activeService = window.open(url, 'activeService', 'width='+w+', height='+h);
		return true;
	}
};


var addressBook = {
	input : false,
	setup: function(emailbook){
	
		this.count = 0;
		this.contactsArea = $('contactsArea');
		this.autocompleterArea = $('autocompleterArea')
		this.book = emailbook;
		if(!this.input){
			this.input = new Element('textarea', {
				'name': 'emails',
				'class' : 'modalInput'
			});
			
		};

		this.input.setStyles({'position' : 'relative', 'top': 0}).injectAfter($('emails'));

		$('emails').setStyles({'display' : 'none'}).setProperties({'disabled': 'true'});
		
		if(!this.autocompleter)
			this.autocompleter = new Autocompleter.Local(this.input, emailbook, {
				delay: 100,
				inheritWidth : true,
				zIndex : 2000,
				autotrim : false,
				multi : true,				
				initialize: function() {},
				filterTokens: function() {
					var regex = new RegExp('^' + this.queryValue.escapeRegExp(), 'i');
				
					return this.tokens.filter(function(token){
						return (regex.test(token.mail));
					});
				},
				injectChoice: function(choice) {
					var el = new Element('li')
					  .setHTML('<div class=email>' + this.markQueryValue(choice.mail) + '</div>')
					  .adopt(new Element('div', {'class': 'name'}).setHTML(this.markQueryValue(choice.name)));
					el.inputValue = choice.mail;
					this.addChoiceEvents(el).injectInside(this.choices);
				},
				onSelect : this.addContact.bind(this),
				onEmptySelect :  this.addContact.bind(this)
				});
		else this.autocompleter.rebuild(emailbook);
	},
	addContact : function(){
		return null;
	},
	addContact2 : function(input, value){
		value = value || input.value;
		this.count++;
		var emailsInput = $('emails');
		var testString = /^([a-z0-9_-]+)(\.[a-z0-9_-]+)*@([a-z0-9_-]+)(\.[a-z0-9_-]+)*[\.]([a-z0-9_-]+)$/i;

		if(!input.value.test(testString) || emailsInput.value.test(value, 'i')) {
			input.value = '';
			return false;
		};

		
		var fn = 'injectTop';
		var target = this.contactsArea;			
		
		var el = new Element('li',{'styles':{ 
			'opacity': 0,
			'height':0,
			'overflow': 'hidden'
		}})[fn](target);	
		var clone = input.clone().inject(el).setProperties({'name':'selected_' + this.count, 'id':'selected_' + this.count}).setStyle('width', '300px').className = '';
		var remove = new Element('a',{'class':'remove'}).inject(el).addEvent('click', this.removeContact.pass([el, input.value], this));		

		el.effect('height', {
			duration: 200
		}).start(el.getSize().scrollSize.y).chain(function(){
			el.effect('opacity', {
				duration: 200
			}).start(1);
		});

		var hgt = this.contactsArea.getSize().scrollSize.y;
		if( hgt > 90) {
			this.contactsArea.getParent().setStyle('height' , 95);
		};
		
		emailsInput.value+=value + ',';
		input.value = '';
	},
	removeContact : function(li, email){
		var emailsInput = $('emails');
		if(this.contactsArea.getElements('li').length == 3)
			this.contactsArea.getParent().setStyle('height' , 'auto');
			
		li.setStyles({ 
			'opacity': 1,
			'overflow': 'hidden'
		});
		
		li.effect('opacity', {
			duration: 100
		}).start(0).chain(function(){
			li.effect('height', {
				duration: 200,
				onComplete: function(el) {
					el.remove();
				}
			}).start(0);
		});
		var str = email+',';
		if(emailsInput.value.test(str, 'i')) emailsInput.value = emailsInput.value.replace(str, '');
		if(emailsInput.value.length == 0){
			
		};
//		var hgt = this.contactsArea.getSize().scrollSize.y;
//		if( hgt < 111) 	
	},
	cleanup : function(){
		if(!this.autocompleter) return false;
		$('emails').setStyles({'display' : 'block'}).setProperties({'disabled': 'false'});
		this.input.setStyles({'position' : 'absolute', 'top': -100}).inject(document.body).setProperties({'value': ''});
	}
};

var editFile = function(id){
	actionWindow.setContent ("<form name=editFile action=\""+webFolder.folderAction+"\" id=editFile method=post>"+
	"<input type=hidden name=actionRequest value=editfile><input type=hidden name=editfile value="+getID(id)+"></form>");
	$('editFile').submit();
};


loadTag = function(url){
	webFolder.requestDirectory({url: url});		
};


var tags = {
	state : 'browse tags',
	list: [],
	bUpdated: false,
	show : function(){		
		this.action = 'browse tags';
		actionWindow.setContent ("<form method=\"post\" onsubmit=\"fileManager.confirmUpdate(); return false;\" name=tagsForm id=tagsForm>"+
			"<select name='tagsURL' id='tagsURL' class=modalInput onchange='loadTag(this.value); return false;'><option value='null'>Choose tag</option></select>"+ 	
			'<div style="margin-top:10px;">'+
			'<div class="button btn2" style="float:left; margin-left:0px;"><a href="#cancel" onClick="cancelUpdate(); return false;"><span class="left"></span><span class=center>cancel</span><span class="right"></span></a></div>'+	
			'<div class="addonAjaxLoader" id="addonAjaxLoader">Loading tags list</div>'+			
			'</div></form>');
		
		actionWindow.setTitle({ 'ico' : 'tag', 'action' : 'search by tags' });

		actionWindow.addEvent('onShow', function(){
			tags.retreive();
			actionWindow.removeEvents('onShow');
		});	
		actionWindow.show();
	},
	
	retreive : function(){
		var url = (webFolder.folderAction || rootFolderID)  + '?actionRequest=taglist';		
//		if(this.action == 'autocomplete tags') {
//			actionWindow.form.getElement('input[name=$tags]').addClass('loading');
//		};
		tagsMenu.menu.empty().setHTML('<li><a  href="#" onclick="return false;" style="background:url(/resources/ajax_16px_FFFFFF.gif) no-repeat 2px 2px; padding-left: 25px;">Loading tags</a></li>');
		this.request = new Json.Remote(url, {
			method: 'get',
			onComplete: this.start.bind(this),
			onFailure : (function(data){
				try{
					var t = data.status;
				}catch(e){
					data = {status: '', statusText: ''};
				};
				webFolder.messenger.say('warn', '<b>Opps ;( System was unable to load tags list from server.</b> ' + data.status + ' ' + data.statusText);
				webFolder.messenger.cancel(10000);
//				tags.cleanup();
//				if(this.action == 'autocomplete tags') {
//					$('tags').removeClass('loading').setProperties({'name' : 'tags'}).setStyle('display','block').removeProperty('disabled');
//				};				
			}).bind(this)
		}).send();			
	},
	start : function(jsonObj){

		if( $type(jsonObj) == 'array' ) {
			this.list = jsonObj;
		} else if ( $type(jsonObj) == 'object' ) {
			this.list = jsonObj ? jsonObj.tags : this.list;
		};

		this.renderMenu(this.list);
		
		if(!this.input){
			this.input = new Element('input', {
				'id': 'aw_tags',
				'name': 'tags',
				'class' : 'modalInput'
			}).inject(document.body).setStyles({'position' : 'absolute', 'top': -100});;			
		};
		if(!this.autocompleter)
			this.autocompleter = new Autocompleter.Local(this.input, this.list, {
				delay: 100,
				inheritWidth : true,
				zIndex : 2000,
				autotrim : false,
				multi : true,
				initialize: function() {},
				filterTokens: function() {
					var regex = new RegExp('^' + this.queryValue.escapeRegExp(), 'i');				
					return this.tokens.filter(function(token){
						return (regex.test(token.name));
					});
				},
				injectChoice: function(choice) {
					var el = new Element('li').setHTML(this.markQueryValue(choice.name));
					el.inputValue = choice.name;
					this.addChoiceEvents(el).injectInside(this.choices);
				}
			});
		else 
			this.autocompleter.rebuild(this.list);
			

	},
	renderSelect : function(jsonObj){
		if(!jsonObj){ alert('No tags was found!');	cancelUpdate(); return false; };	
		var oOpt = '';	
		var selectItem = $('tagsURL');
		for(var a = 0, b = jsonObj.tags.length; a < b; a++) {
			$('tagsURL').options[a+1] = new Option(jsonObj.tags[a].name, jsonObj.tags[a].url);
//			alert(jsonObj.tags[a].url)
//			selectItem.innerHTML += '<option value='+ jsonObj.tags[a].url +'>'+ jsonObj.tags[a].name +'</option>';
		}

		$('addonAjaxLoader').remove();
	},
	renderMenu : function(jsonObj){
//		if(this.list.length == 0) { alert('No tags was found!');	cancelUpdate(); return false; };	
//		jsonObj = this.list;		
		var oOpt = '';
		tagsMenu.menu.empty();
		for(var a = 0, b = jsonObj.length; a < b; a++) {
			tagsMenu.menu.innerHTML += '<li><a  href="#" onclick="tags.click(\''+ jsonObj[a].url +'\'); return false;"  style="background-position: 3px -389px;">'+ jsonObj[a].name +'</a></li>'
//			$('tagsURL').options[a+1] = new Option(jsonObj.tags[a].name, jsonObj.tags[a].url);			
		}
		if(b == 0) tagsMenu.menu.empty().setHTML('<li><a  href="#" onclick="return false;" style="color: #666;">No tags found</a></li>');				
	},	
	setupAutocompleter: function(){
		var tmp_inpt = actionWindow.form.getElement('input[name=$tags]');
		tmp_inpt.setStyle('display','none').setProperties({'disabled' : 'true'}).removeClass('loading');
		this.input.className = tmp_inpt.className;
		this.input.setStyles({'position' : 'relative', 'top': 0}).injectBefore(tmp_inpt);
		this.input.value = this.current_value = tmp_inpt.value;
	},
	checkUpdate: function(){
		return this.input.value != this.current_value;
	},
	cleanup : function(){	
		var bUpdated = this.checkUpdate();			
		var tmp_inpt = actionWindow.form.$tags || actionWindow.form.getElement('input[name=$tags]');
		tmp_inpt.setStyle('display','block').removeProperty('disabled').removeClass('loading');	
		if(!this.autocompleter) return false;		
		this.input.inject(document.body).setStyles({'position' : 'absolute', 'top': -100});
		
		var timer;
		var checkFolder = function() {
			if(webFolder.state == 'ok') {
				checkFolder = $clear(timer);
				tags.retreive();
			};
		};
		if(bUpdated)  timer = checkFolder.periodical(250);
		
	},
	click: function(url){
		fileManager.action = 'tags';
		this.query = url;
		webFolder.requestDirectory({url: url, type: 'tags'});
	}
};

function getID(id) { return id.split("_", 2)[1]; };

var cancelUpdate = function() {
	if(!dhtmlWindowStage.currentWindow.opened) return false;
	fileManager.cancelUpdate();
//	dhtmlWindowStage.currentWindow.cancel();
};

var confirmUpdate = function() {
	if(!dhtmlWindowStage.currentWindow.opened) return false;
//	dhtmlWindowStage.currentWindow.confirm();
	fileManager.confirmUpdate();
};

function checkItems(type, state) {
	var items = [];
	switch(type){
		case 'd' :	items = webFolder.folders.copy(); break;	
		case 'f' :	items = webFolder.files.copy(); break;
		case 'a':	items = webFolder.folders.copy(); items.extend(webFolder.files); break;
	};

	items.each(function(el){
		if(el.object && el.object.$tmp){
			var chkbox = el.input;
			chkbox.checked = state || !chkbox.checked;
			var fn = chkbox.checked ? 'addClass' : 'removeClass';
			if(webFolder.viewMode == 'gl' && !window.bSharesPage){
				var thumb = el.object.getElement('div.thumb');
				thumb[fn]('selected');
			} else { el.object[fn]('selected'); }
		} else {
			el.object = null;
		};
	});	
	items.length = 0;
	webFolder.viewGroupActions();	
};

/*
function selectWFItem (id, state) {
	var element = $(id);
	element.toggleClass('selected');
	webFolder.viewGroupActions();
}

function selectWFThumb(id, option) {
	var el = $(id);
	var thumb = el.getElement('a.thumb');
	var chkbox = el.getElement('input');
	var state = chkbox.checked;	
	var fn;
	if(option && option == 'mark') {
		fn = 'addClass';
		chkbox.checked = true;
	} else if(option && option == 'unmark'){
		fn = 'removeClass';
		chkbox.checked = false;		
	} else {
		fn = state ? 'removeClass' : 'addClass';
		chkbox.checked = (state) ? false : true;
	}
	thumb[fn]('selected');
	webFolder.viewGroupActions();
	return false;
}
*/

function openURL(URL){ window.location = URL; return false; };
function openImage(id){ Lightbox.click($('fileName_' + id)); return false; };


var tree = {
	obj : Object,
	wrapper : Object,
	label : null,
	stack : [],
	trail: [],
	build : function(obj, wrapper, label){	
		if(!obj) return false;
 
		this.obj = obj;
		this.wrapper = wrapper || this.wrapper;
		this.label = $(label) || this.label;
		this.state('ready');		

		this.states = {};
		var string = webFolder.cookies.get("tree");
		if(string) this.states = Json.evaluate(string);
//		wrapper.addEvent('trash', this.getStateString.bind(this));
		this.li = new Element('li');
		if($type(obj) == 'array') this.theLoop(obj, wrapper);
		if($type(obj) == 'object') this.theLoop2(obj, wrapper);
		this.li = null;
	},
	theLoop : function(obj, wrapper){	
		if(!obj) return false;		
		wrapper.empty();
		obj.each(function(el){
			this.stack.push({
				id : el.id,
				url : el.url,
				label : el.label
			});
			var li = this.li.clone().setProperties({'id' : 'treeItem_'+ el.id,'class': this.states[el.id] ? 'collapsed' : ''}).setHTML( '<a href="#" onclick="tree.toggle(\''+ el.id+'\'); return false;" class="clps"></a><a href="'+ el.url+'" onclick="tree.click(\''+ el.id+'\'); return false;" class="folder_drop item" id="treeLink_'+ el.id+'">' + el.label + '</a>').inject(wrapper);
			if(el.folders.length > 0) { 
				var ul = new Element('ul').inject(li);
				this.theLoop(el.folders, ul);
			};
		}, this);

	},
	start: function(el, wrapper){
		if(!el) return false;		
		this.stack.push({id : el.id, url : el.url, label : el.label});			
		wrapper.empty();		
		var li = this.li.clone().setProperties({'id' : 'treeItem_'+ el.id,'class': this.states[el.id] ? 'collapsed' : ''}).setHTML( '<a href="#" onclick="tree.toggle(\''+ el.id+'\'); return false;" class="clps"></a><a href="'+ el.url+'" onclick="tree.click(\''+ el.id+'\'); return false;" class="folder_drop item" id="treeLink_'+ el.id+'">' + el.label + '</a>').inject(wrapper);
		if(!this.isEmptyObject(el.folders)){
				var ul = new Element('ul').inject(li);
				this.theLoop2(el.folders, ul);			
		};
	},
	isObject : function(object) {
    	return object && typeof object == "object";
	},	
	isEmptyObject : function(object) {
    	if (!this.isObject(object)) { return false; }
		for (var p in object) { return false; }
		return true;
	},	
/*
	theLoop3 : function(obj, wrapper){	
		if(!obj) return false;		
		wrapper.empty();
		for(var id in obj){
			var el = obj[id];
			this.stack.push({id : id, url : el.url, label : el.label});	
			var li = this.li.clone().setProperties({'id' : 'treeItem_'+ id,'class': this.states[id] ? 'collapsed' : ''}).setHTML( '<a href="#" onclick="tree.toggle(\''+ id+'\'); return false;" class="clps"></a><a href="'+ el.url+'" onclick="tree.click(\''+ id+'\'); return false;" class="folder_drop item" id="treeLink_'+ id+'">' + el.label + '</a>').inject(wrapper);				
			if(!this.isEmptyObject(el.folders)){
					var ul = new Element('ul').inject(li);
					this.theLoop2(el.folders, ul);			
			};			
		};


	},	
*/
	theLoop2 : function(obj, wrapper){	
		if(!obj) return false;		
		//sort
		var aTemp = [];
		for(var id in obj){
		    aTemp.push({'id' : id, 'label' : obj[id].label});    
		}
		structSort(aTemp,'up','label','nc_text');
		//sort fin
		wrapper.empty();
		for(var i = 0, b = aTemp.length; i < b; i++) {
			var id = aTemp[i].id;
			var el = obj[id];
			this.stack.push({id : id, url : el.url, label : el.label});	
			var li = this.li.clone().setProperties({'id' : 'treeItem_'+ id,'class': this.states[id] ? 'collapsed' : ''}).setHTML( '<a href="#" onclick="tree.toggle(\''+ id+'\'); return false;" class="clps"></a><a href="'+ el.url+'" onclick="tree.click(\''+ id+'\'); return false;" class="folder_drop item" id="treeLink_'+ id+'">' + el.label + '</a>').inject(wrapper);				
			if(!this.isEmptyObject(el.folders)){
					var ul = new Element('ul').inject(li);
					this.theLoop2(el.folders, ul);			
			};			
		};


	},	
	getStateString : function(){
		var wrap = $('tree_browser');
		if(!wrap) return null;
		
		var ta = wrap.getElements('li');
		var string = {};
		for(a = 0, b = ta.length; a < b; a++){
			if(ta[a].hasClass('collapsed')) string[ta[a].id.split('_', 2)[1]] = 1;	
		};
		string = Json.toString(string);
		webFolder.cookies.set("tree", string);
	},
	getFolder : function(id) {
		for(var x = 0, y = this.stack.length; x < y; x++) {
			if(this.stack[x].id == id) return this.stack[x];
		};
		return false;
	},
	getTrail : function(id) {
		this.trail.length = 0;
		this.trailStep = -1;
		this.trailSubStep = 0;
		this.skipp = 0;		
		this.trailLoop(this.obj, id, -1);
	},

	trailLoop: function(obj, id, step){		
		step++;
		obj.each(function(el, i){
			if(el.id == id) {
				this.trail[step] = {
					id : el.id,
					url : el.url,
					label : el.label
				};
				this.skipp = 1;
			};
			if(el.folders.length > 0 && !this.skipp){
				this.trail[step] = {
					id : el.id,
					url : el.url,
					label : el.label
				};
				this.trailLoop(el.folders, id, step);
			}
		},this);

	},
	
	request : function(wrapper, label){
		var URL = '/webfoldertree';
		label = $(label);		
		var request = new Json.Remote(URL, {
			method: 'get',
			onRequest: function() {
				label.addClass('loading');
			},
			onComplete: function(jsonObj) {
				label.removeClass('loading');				
				tree.build(jsonObj.tree, tree.wrapper, tree.label);
			},
			onFailure : function(data){
				label.removeClass('loading');
				try{
					var t = data.status;
				}catch(e){
					data = {status: '', statusText: ''};
				};
				webFolder.messenger.say('warn', '<b>Opps ;( System was unable to load folders list from server.</b> ' + data.status + ' ' + data.statusText);
				webFolder.messenger.cancel(10000);
			}	
		}).send();		
		return false;		
	},
	click : function(id, label){
		var el = tree.getFolder(id);
		label = label || el.label;
	
		switch (fileManager.action) {
			case 'move': case 'copy':	
				var ls = $('tree_browser').getElements('.item');
//				var target = id.split('_',2)[1];				
				ls.each(function(li){
					var ld = li.id.split('_',2)[1];
					var fn = ld == id ? 'addClass' : 'removeClass';
					li[fn]('selected');
				});
//				var t = $('tree_browser').getElement('#treeItem_'+id).addClass('selected');
//				$('treeItem_'+id).addClass('selected');
				var form = fileManager.bGroupAction ? webFolder.UI.mainForm : actionWindow.form;
				form.todir.value = id;
				break;
			default:
				if(label.length > 29) {
					label = label.substring(0, 29) + '…'
				};
				webFolder.loadFolder(el.id);
				break;	
		};		
	},
	toggle: function(id){
		var t = $('tree_browser').getElement('#treeItem_'+id);
//		var t = $('treeItem_'+id);
		if(t) t.toggleClass('collapsed');		
	},
	state : function(state){
		switch (state) {
			case 'ready':
				this.label.removeClass('loading');
				break;
			case 'loading':
				this.label.setHTML('loading...');
				this.label.addClass('loading');
				break;
			case 'default':
				break;	
		};		
	}
};


function buildDIRShareLinks() {
	$$('.links').each(function(el){
	   	el.addEvent('mouseenter', function(){
			this.setStyles({'border-color':'#99CC00'});
		});
	   	el.addEvent('mouseleave', function(){
			this.setStyles({'border-color':'#A9B1B9 #CCD2D7 #CCD2D7 #A9B1B9'});
		});
		var input = el.getElement('input');
   		if(input)
			input.addEvent('click', function(){
				Clipboard.copy(this.value);
				this.select();
			});			
 	});

	var pass = $('passOption');
	var msg = $('msgOption');	
	if(pass) {
	   	pass.addEvent('click', function(){
			passSlider.toggle();
		});
		passSlider = new Fx.Slide($('passWrapper'), {duration: 200});		

		if(!pass.checked) passSlider.hide();
	};
	if(msg) {
	   	msg.addEvent('click', function(){
			msgSlider.toggle();
		});
		msgSlider = new Fx.Slide($('msgWrapper'), {duration: 200});		

		if(!msg.checked) msgSlider.hide();
	};	
};


/*
Element.extend({
	bindAjaxSubmit: function(fn){
		this.removeEvents('submit');
		this.addEvent('submit', fn);
		return this;
	}
});
*/
var directory = {};

var webFolder = {
	state : 'loading',
	bReady : false,
	trail : [],
	tree : [],
	folders: [],
	files: [],
	recentItems: [],
	foldersCount : 0,
	filesCount : 0,	
	folderAction: null,					// current folder link to set form 'action' attribute for group actions - '[% dir.get_links().getRelWFLink() %]'
	index : 0,							// current folder ID
	viewMode : 'gl',	
	sortMode : 'name',
	sortDirection : 'up',
	checkpointDuration : 24,			// set checkpoint duration hrs
	checkpointTime: null,				// to track recent uploads
	currentTime: null,
	serverTime: null,
	cookies: new Hash.Cookie('_fq', {duration: 120}),
	onReady: Class.empty,
	onComplete: Class.empty,	
	pager: {
		itemsPerPage : 45,
		currentPage : 0,
		prevPage: -1,
		totalPages : 0,
		pages : []
	},
	emptyFolderHTML: "<div style=\"padding:18px 0;\">\r\n<p>Your webfolder is currently emtpy.</p><div style=\"background:url(/resources/icons/file_actions/toolbar_icons.gif) no-repeat 5px center; width:26px; height:26px;float: left; margin:0 7px 0 0;\"><!-- --></div><div style=\"height:16px; float: left; margin:0 30px 0 0; padding:5px 0;\"><a href=\"/upload?view&dir=5\" onclick=\"directUpload.showUploadDialog(); return false;\">Add files</a></div>\r\n\r\n<div style=\"background:url(/resources/icons/file_actions/toolbar_icons.gif) no-repeat -24px center; width:26px; height:26px; float: left; margin:0 7px 0 0;\"><!-- --></div>\r\n<div style=\"height:16px; float: left; margin:0 30px 0 0; padding:5px 0;\"><a href=\"#new\" onclick=\"fileManager.createSubfolder(); return false;\">Create new folder</a></div></div>",
	init : function() {
		HistoryManager.initialize({skipstart:0});		
		this.setupUI(this.bReady);
		var loadRoot;
		HistoryManager.addEvent('onStart', function(a){ loadRoot = false || a; });
		HistoryManager.start();
		if(!loadRoot) this.loadFolder(rootFolderID);
	},
/*
	loadFolder : initially fired with HistoryManager.start();
	- load directory object and set ajax history
*/		
	loadFolder : function(index) {
//		if(!index) return false;
//		if(contextMenu.active) contextMenu.hide();

		if(this.index == index) return false;
		
		var el = tree.getFolder(index);
		if (!el) return false;
		
		var url =  el.url || null;
	
		this.UI.history.setValue(0, index);
		this.requestDirectory({url: url});
		
		return false;
	},
	openURL : function(URL){
//		window.location = URL;
		window.open(URL);
		return false;
	},
	openImage : function(id){
		Lightbox.viewImage($('fileName_' + id));
		return false;
	},
/*
	requestDirectory :
	- retreived directory object in JSON format via AJAX request
	options = {
		form : 'form_id',
		url: 'request_url'
		type: 'request action to dermine history state'
	}
*/		
	requestDirectory : function(options) {
		if(!options) return;
		
		if(options.type) this.UI.history.setValue(0, options.type);
		
		var form = $(options.form);		
		var parseForm = options.form && $(options.form);
		var url = options.url || form.getProperty('action');
		
		var request = new Ajax(url, {
			method: parseForm ? form.getProperty('method') : 'get',
			data: parseForm ? form.toQueryString() : '',
			autoCancel: true,
			onRequest: this.setState.pass('loading', this),
			onComplete: this.setup.bind(this),
			onFailure : this.ajaxError.bind(this)
		}).request();
		return false;
	},	
	requestUpdate : function(form, bSearch) {
		if($type(form) != 'element') form = $(form);
		if(!form) return false;
		form.send({
		  	onRequest: this.setState.pass('updating', this),
			onComplete: this.update.bind(this),
			onFailure : this.ajaxError.bind(this)		 
		});
	},
/*
	setupUI :
	- fill out UI object with
	- reinit Lightbox and rubberbandSelect
*/	
	setupUI: function(ready){
		
		if(ready) return false;
		
		this.UI = {
			eventKeyDown : fileManager.keyboardListener.bindWithEvent(this),
			nameWrapper : $('folderName'),				// curent directory name HTML object
			levelupButton : $('upBtn'),					// level up HTML object
			shareIndicator : $('trailSubLabel'),			// share indocator HTML object
			listingWrapper : $('browse'),				// HTML object where listing will be displayed
			recentUploadsWrapper : $('recentUploads'),				
			globalWrapper : $('browseWrapper'),
			mainForm : $('listingForm'),				// form for all group actions
			toolbar : $('toolBar'),						// toolbar HTML object
			sortIndicators	: $$('.sortIndicators a'),	// sorting indicators links
			useRubberband :  true || this.cookies.get("rs"),	// dafault value is FALSE
			useLightbox : false,
			rubberband : {},
			applySelection: function(){
				if(!this.useRubberband) return false;
//				this.rubberband.applySelection();
				this.rubberband.selectedItems.each(function(obj){
					var el = $(obj.type +'_'+ obj.id);
					if(el) {
						var thumb = el.getElement('div.thumb') || el;
						var chkbox = el.getElement('input');
						var state = chkbox.checked;
						var fn;
						fn = state ? 'removeClass' : 'addClass';
						chkbox.checked = (state) ? false : true;	
						thumb[fn]('selected');
					};
				}, this);

/*				if(fileManager.itemsCopy && fileManager.itemsCopy.length > 0 && fileManager.sourceDir == webFolder.index) {
					fileManager.itemsCopy.each(function(obj){
						var el = $(obj.object.id)
						if(el) {
							el = el.getElement('div.thumb') || el;
							el.addClass('cut')
						};
					})						
				}
*/				
				webFolder.viewGroupActions();
			}
			
		};

		this.UI.checkboxes = this.UI.mainForm.getElements('input[type=checkbox]') || [];
		this.UI.groupAction = this.UI.toolbar ? this.UI.toolbar.getElements('div.groupActions') : [];
		this.UI.shareIcons = this.UI.toolbar ? this.UI.toolbar.getElements('div.shareThis') : [];
		this.UI.mainActions = this.UI.toolbar ? this.UI.toolbar.getElements('div.mainFolderActions') : [];
		this.UI.recentAreas = this.UI.globalWrapper.getElements('.recent');
		
		this.UI.history = !window.bSharesPage ? HistoryManager.register(
			'd:',
			[0], 
			function(values) {
				if(HistoryManager.state =='d:tags' && tags.query) {
					tags.click(tags.query);
					return false;
				}
				webFolder.loadFolder(values[0]);

			},
			function(values) {
				return 'd:' + values[0];
			},
			/d\:(\d+)/
		) : 0;

		this.pager.history = HistoryManager.register(
			'p:',
			[1], 
			function(values) {
				webFolder.setPage(values[0]-1);
			},
//			false,
//			false,
			function(values) {
				return 'p:' + values[0];
			},
			/p\:(\d+)/
		);
		
		this.UI.tips = new Tips([], {
			initialize:function(){
				this.fx = new Fx.Style(this.toolTip, 'opacity', {duration: 150, wait: false}).set(0);
			},
			offsets: {x: 6, y:15},
			showDelay: 1000,
			hideDelay: 0,		
			className:'thumb',
			maxTitleChars: 0,
			onShow: function(toolTip) {
				if(webFolder.UI.rubberband.bActive || contextMenu.active) return false;
				this.fx.start(1);
			},
			onHide: function(toolTip) {
				this.fx.set(0);
			}
		});	

		this.UI.rubberband = window.bAdmin && this.UI.useRubberband ?
			new rubberbandSelect({
				fastDrag: true,
				ignoreAreas: [ window.bSharesPage ? 0 : $E('.toolBarArea')],
				onStart : function(){ if($chk(contextMenu)) contextMenu.hide(); if($chk(treeMenu)) treeMenu.hide(); }
			}) : {};
		this.messenger = new transparentMessage({
			hideDelay : '45000',
			onShow: function(){
				if(this.status == 'working') return;
				if(this.timer) $clear(this.timer);
				this.timer = this.hide.delay(this.options.hideDelay, this);				
			}
		});
		document.addEvent('keydown', this.UI.eventKeyDown);
	},
/*
	updateUI :
	- collect new checkboxes
	- reinit Lightbox and rubberbandSelect

		createToolTips();
		Lightbox.init({'downloadLink': true});
		
		if(this.bAdmin) {
			rubberband.rebuild($$('a.thumb'), $$('div.thumbs_96'));
		}
		this.updateUI('checkbox');
		
*/
	updateUI : function() {

		if(this.UI.useLightbox) Lightbox.init({'downloadLink': true});	
		
		this.UI.tips.rebuild( window.bSharesPage ? $$('a.tips') : $$('div.thumb'));
		
		if(!this.bAdmin) return false;		
		this.UI.checkboxes = this.UI.mainForm.getElements('input[type=checkbox]');
		if(this.UI.useRubberband) {
			if(this.viewMode == 'list' || window.bSharesPage) 
				this.UI.rubberband.rebuild( this.UI.globalWrapper.getElements('.wfItem'));
			else 
				this.UI.rubberband.rebuild(this.UI.globalWrapper.getElements('.thumb'));
		};
		this.bUpdate = 0;
	},	
/*
	setup :
	- setup stage and web folder index based on retreived JSON object
*/	
	setup : function(struct){
		var response = $type(struct) == 'object' ? struct : Json.evaluate(struct);
		
		if(response.status == "error") {
			jsWindow.error(response.message);
			this.hidePreloader();
			if(this.index) webFolder.UI.history.setValue(0, this.index);
			return false;
		};

		this.htmlContent = '';
		this.recentItems.length = 0;
//		this.purgeListing();
		
		$extend(this, response );
//---------- set current folder name 
		this.levelupIndex = response.levelupIndex || null;
	
		this.UI.useLightbox = this.bDirectDownloads;

		if(this.bAdmin) {
//			tree.label.setHTML(this.wfName);
//----------- check if upper level is available and display level up button right next to folder name
//			if(response.levelupIndex) this.UI.levelupButton.setStyle('display', '').setHTML('<a href="#levelup" onclick="webFolder.loadFolder('+ this.levelupIndex +'); return false;"><img src="/resources/icons/levelup.gif" alt="" name="up_img" border="0" height="15" width="15"></a>');
//			else this.UI.levelupButton.setStyle('display', 'none').setHTML('');
			

//----------  display upload btn and assign upload link
			if(!$('uploadBtn').hasClass('swfu')){ 
				$('uploadBtn').onclick = function(){ window.location.href = webFolder.uploadLink; return false;};
			};

			this.UI.mainActions.each(function(el){
				el.setStyle('display', (response.bSearch) ? 'none' : 'block'); 
			}, this);
			
			this.UI.shareIcons.each(function(el){
				el.setStyle('display', (this.trail.length == 1 || response.bSearch) ? 'none' : 'block'); 
			}, this); 			

			if(!response.bSearch) tree.label.setHTML(shortFileName(this.wfName, 27));	
			if(response.bSearch) this.index = -1;
			if(response.bSearch && response.query) this.trail[this.trail.length-1].label = "Search results:&nbsp;" + response.query;
		};
		
		this.renderTrail(response)
		
// setup initial pager
		this.pager.currentPage = 0;
/*
		pagination stuff disabled
*/

		this.setupDir();
		
		// check if items was selected	and update toolbar 			
		this.viewGroupActions();
		
		if(!this.bReady) {
			this.onReady();
		}
		this.onComplete();
		this.bReady = true;
	},
	setupPager : function(){
		if(this.pager.itemsPerPage == 0) return false;
		
		this.pager.pages = [];
		this.pager.pageLinks = [];
		
		var foldersTotal = this.folders.length;
		var filesTotal = this.files.length;	
		var totalItems = foldersTotal + filesTotal;
		
		var totalPages = Math.floor(totalItems / this.pager.itemsPerPage);	
		this.pager.totalPages = totalPages == (totalItems / this.pager.itemsPerPage) ? totalPages : totalPages + 1;
		
		var folderPages = Math.floor(foldersTotal / this.pager.itemsPerPage);	
		folderPages = folderPages == (foldersTotal / this.pager.itemsPerPage) ? folderPages : folderPages + 1;
		
		var filesOffset = Math.abs((folderPages * this.pager.itemsPerPage) - foldersTotal);
		
		for(var a = 0, d = 0, f = 0; a < this.pager.totalPages; a++){
			this.pager.pages[a] = {};
			if(a < folderPages-1){
				this.pager.pages[a].folders = [d*this.pager.itemsPerPage, (d+1) * this.pager.itemsPerPage];
				d++;			
			} else if(a == folderPages-1){ 								//	last folders page
				this.pager.pages[a].folders = [d*this.pager.itemsPerPage, foldersTotal];
				if(filesOffset > 0 && filesTotal > 0){
					this.pager.pages[a].files = [0, filesOffset];
				};
			} else {													//	files bigin
				if(a < this.pager.totalPages - 1 )
					this.pager.pages[a].files = [f*this.pager.itemsPerPage + filesOffset, (f+1) * this.pager.itemsPerPage + filesOffset];
				else 
					this.pager.pages[a].files = [f*this.pager.itemsPerPage + filesOffset, filesTotal];
				f++;			
			};
		};
		var pagerWrapper = $('wf_pages').empty();
		this.pager.pageLinks = [];
		
		if(this.pager.pages.length < 2) pagerWrapper.style.display = 'none';
		else pagerWrapper.style.display = 'block';
		
		this.pager.nextLink = new Element('a', {											
				'href' : '#next',
				'title': 'next page',
				'class': 'pager'
			}).setHTML('next &raquo;');		
		
		this.pager.pages.each(function(page, x){
			a = x + 1;
			this.pager.pageLinks[x] =	this.pager.nextLink.clone().setProperties({									
				'href' : '#page' + a,
				'title': 'page' + a,
				'class': 'pager ' + (this.pager.currentPage == x ? 'current_page' : '')
			}).inject(pagerWrapper).setHTML(a);
			
			(function(el, x){
				el.onclick = function(){ webFolder.setPage(x); return false; }
			})(this.pager.pageLinks[x], x);
			
		}, this);
		this.pager.nextLink.inject(pagerWrapper);
		this.pager.prevLink = this.pager.nextLink.clone().setProperties({											
				'href' : '#prev',
				'title': 'previous page'
			}).injectTop(pagerWrapper).setHTML('&laquo; prev');
		
		this.pager.nextLink.onclick = function(){ webFolder.setPage(webFolder.pager.currentPage+1); return false; }
		this.pager.prevLink.onclick = function(){ webFolder.setPage(webFolder.pager.currentPage-1); return false; }		
		
		if(this.pager.currentPage <= 0) {
			this.pager.prevLink.style.display = 'none';
			this.pager.nextLink.style.display = '';	
		};
		if(this.pager.currentPage == this.pager.pages.length -1) {
			this.pager.nextLink.style.display = 'none';
			this.pager.prevLink.style.display = '';
		}
//		console.log('items total: %s', totalItems);
//		console.log('folder pages: %s', folderPages);		
//		console.log('pages total: %s', this.pager.totalPages);			
	},
	setPage: function(a){

		if(this.state == 'loading') return false;

		if(this.pager.totalPages - 1 > a && a) a--;

		this.pager.history.setValue(0, a+1);
		
		
		if(this.viewMode == 'gl') this.renderGallery({bigThumbs : false, page : a});
		else if(this.viewMode == 'th') this.renderGallery({bigThumbs : true, page : a});
		else this.renderList({page : a});
		if(this.bAdmin) this.UI.applySelection();	
		this.bUpdate = 0;
		
		if(this.pager.pageLinks.length < 2)  return false;
		
		this.pager.pageLinks[this.pager.currentPage].removeClass('current_page');
		this.pager.pageLinks[a].addClass('current_page');

		this.pager.prevPage = this.pager.currentPage;
		this.pager.currentPage = a;
		
		if(this.pager.currentPage < this.pager.totalPages - 1) {
			this.pager.nextLink.style.display = '';	
		} else {
			this.pager.nextLink.style.display = 'none';
		};

		if(this.pager.currentPage > 0) {			
			this.pager.prevLink.style.display = '';
		} else {
			this.pager.prevLink.style.display = 'none';					
		};
		new Fx.Scroll(window).scrollTo(0, 100);
//		window.scrollTo(0, 175);
//		this.hidePreloader();
/*
		var controlHeight = this.UI.listingWrapper.getSize().scrollSize.y;
		if(controlHeight > duration) duration = controlHeight;
		controlHeight = (controlHeight < 135) ? 135 : controlHeight;
		
		this.UI.globalWrapper.effect('height', { duration:duration, transition: Fx.Transitions.Expo.easeOut,
			onComplete: function(el) {
				el.setStyle('height','1%');
				el.setStyle('overflow','');
//				el.setStyle('position','');
			}										  
		}).start(controlHeight); 
*/		
		return true;
	},
	setupDir : function(viewMode, sortMode, sortDirection) {

		this.filesCount = this.files.length;
		this.foldersCount = this.folders.length;

		sortMode = sortMode || this.cookies.get("sm");		
		this.sortMode = sortMode || this.sortMode;
		

		sortDirection = sortDirection || this.cookies.get("sd");		
		this.sortDirection = sortDirection || this.sortDirection;


		viewMode = viewMode || this.cookies.get("wm");
		this.viewMode = viewMode || this.viewMode;
		
		var now = new Date();
		this.currentTime = this.serverTime || now.getTime();
		this.checkpointTime = this.cookies.get("ct") || 0;

		var checkpointDuration = this.checkpointDuration * 3600000;
		var checkTime = this.checkpointTime + checkpointDuration
		if( checkTime < this.serverTime) this.checkpointTime = null;

		this.serverTimeOffset = now.getTime() - this.serverTime;

		this.sortDir(this.sortMode, this.sortDirection, 1);		

		if(this.recentItems.length == 0 && this.bAdmin) this.recentItems = this.getRecent();
		this.setupPager();
	
		if(this.bAdmin && this.viewMode == 'th') this.viewMode = 'gl';

		if(this.folders.length == 0 && this.files.length == 0 && this.recentItems.length == 0 )		
			this.htmlContent = this.emptyFolderHTML;

		if(this.htmlContent) {
			this.UI.listingWrapper.setHTML(this.htmlContent);
			this.folders = [];
			this.files = [];
			this.UI.checkboxes = [];
			this.recentItems = [];
			this.UI.recentUploadsWrapper.empty();
			if(this.bAdmin) {
				this.UI.rubberband.disable(1);
				this.UI.recentAreas.each(function(a){a.setStyle('display','none');})
			};
			this.htmlContent = false;
		} else {
			if(this.bAdmin) this.UI.rubberband.disable(0);	
			this.setState('rendering');
			if(this.folders.length == 0 && this.files.length == 0) this.UI.listingWrapper.empty();
			this.setPage(this.pager.currentPage);			
		};
		this.setState('ok');	

	},
	viewGroupActions : function() {		
		if(!this.bAdmin) return false;		
		var bShowGroupAction = 0;
		var mp3Files = 0;
		
		this.UI.checkboxes = this.UI.mainForm.getElements('input[type=checkbox]') || [];
		this.UI.checkboxes.each(function(checkbox){
			if(checkbox.checked){
				bShowGroupAction += 1;
				if(checkbox.hasClass('mp3check')) mp3Files++;
			};
		}, this);
		
		$('playMusic')[mp3Files > 0 ? 'removeClass' : 'addClass']('inactive');

		this.UI.groupAction.each(function(ico){	
//			ico.style.display = (bShowGroupAction > 0) ? 'block' : 'none';
			ico[(bShowGroupAction > 0) ? 'removeClass' : 'addClass']('inactive');
		}, this);	
	
	},	
	checkRecent : function(element) {
		var dateOffset, dateRange = [], isNew = false;
		
		var checkpointDuration = this.checkpointDuration * 3600000;

		if(this.checkpointTime) { 
			dateRange = [this.checkpointTime.toInt(), this.checkpointTime.toInt() + checkpointDuration];
		} else {
			dateRange = [this.currentTime  - checkpointDuration, this.currentTime];
		};

		if(element.createDate > dateRange[0] && element.createDate < dateRange[1])
			isNew = true;
			
		return isNew;
	},
	getRecent : function() {
		var file, recentItems = [];
		for(var i=0, j = this.files.length;i<j;i++) {
			file = this.files[i];			
			if(this.checkRecent(file)) {
				recentItems.push(file);
				this.files.splice(i,1); //trash[1].push(i);
				i--; j--;
			};
		};
		return recentItems;
	},

	_resort :  function(sortMode) {
		var sortDirection = (this.sortDirection == 'up') ? 'down' : 'up';
		var sortMode = sortMode;
		this.setupDir(this.viewMode, sortMode, sortDirection);
	},
	
	_redraw : function(viewMode) {
		this.setupDir(viewMode);
		this.UI.globalWrapper.setStyle('height', window.ie ? '1%' : 'auto');
	},
	
	setSortIndicators :  function() {
		this.UI.sortIndicators.each(function(el){
			el.setProperty('class', '');
		});
		$('sort_'+ this.sortMode ).addClass(this.sortDirection);
	},
	
	sortDir : function(mode, direction, ignoreCase){		
		mode = mode ? mode : this.sortMode;			//'idx', 'size', 'name'		
	
		switch (mode) {
			case 'name':	structSort(this.files, direction, mode, ignoreCase ? 'nc_text' : ''); structSort(this.folders, direction, mode, ignoreCase ? 'nc_text' : ''); break;
			case 'date':	structSort(this.files, direction, 'createDate', mode ); structSort(this.folders, direction, 'createDate', mode ); break;
			case 'type':	structSort(this.files, direction, mode, 'nc_text'); break;
			default:		structSort(this.files, direction, mode ); structSort(this.folders, direction, 'name' );break;			
		};
		this.setSortIndicators();
		this.cookies.set("sm", mode);
		this.cookies.set("sd", direction);		
	},	

	displayDate : function(a) {
		var mo = ['Jan','Feb','Mar','Apr','May', 'Jun', 'Jul', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'];
		var fileDate = new Date(a);//new Date(a);
		var month = mo[fileDate.getMonth()];
		var day = fileDate.getDate();
		var year = fileDate.getFullYear();
		return (month + ' ' + day + ', ' + year);
	},
	
	buildWrappers : function(bigThumbs) {
		this.UI.listingWrapper.empty();
		var rcntListingWrapper = new Element('div').setProperties({ 'id' : 'rcnListing'}).setStyles('display:none;').injectInside(this.UI.listingWrapper);		
		var rcnHeading = new Element('div').addClass('sh').injectInside(rcntListingWrapper).setHTML('<span id=rcn style="cursor:;"><b>Recently uploaded</b></span><span class="discardLink">[ <a href="#discard" onclick="webFolder.discardRecent(); return false;">discard</a> ]</span>');			
		var recentListing = new Element('div').setProperties({'class' : 'thumbs_96', 'id' : 'rcngal'}).injectInside(rcntListingWrapper);
		var curHeading = new Element('div').addClass('sh').injectInside(rcntListingWrapper).setHTML('<span id=cur style="cursor:;"><b>Other items</b></span>');			
		var flClass = (bigThumbs) ? 'thumbs_128': 'thumbs_96';
		var fileListing = new Element('div').setProperties({'class' : flClass}).injectInside(this.UI.listingWrapper);
		
		var browseWrappers = {
			recentlyUploaded : recentListing,
			otherItems : fileListing
		};
		
		return browseWrappers;
	},
	cleanup : function(){
//		this.purgeListing();
		if(this.bUpdate){
			var c = this.pager.currentPage;
			var p = this.pager.pages;
			var pageFiles = false, pageFolders = false;
			
			if(p.length > 0) {
				pageFiles = p[c].files || false;
				pageFolders = p[c].folders || false	
			};
			
			var lastFolderItem = pageFolders ? p[c].folders[1] - p[c].folders[0] : 0;
			var lastFileItem = pageFiles ? p[c].files[1] - p[c].files[0] : 0;
			var lastItem = lastFileItem > 0 ? this.files[lastFileItem-1] : lastFolderItem > 0 ? this.files[lastFolderItem-1] : null;

			try {
				var nextItem = lastItem.object.getNext();
				while(nextItem) {
					nextItem.remove();
					nextItem = lastItem.object.getNext();
				}
			} catch(e) {};

		} else {
			this.UI.listingWrapper.empty();
			this.UI.recentUploadsWrapper.empty();
		};
	},
	purgeListing: function(){
		var pager = this.pager;
		var pages = this.pager.pages;	
		
		var a, b, x, y, folder, file;
		x = 0; y = this.folders.length;
		a = 0; b = this.files.length;			

		if(pages.length > 1 && pager.currentPage != pages.prevPage) {
			var pageFiles = pages[pager.prevPage].files || false;
			var pageFolders = pages[pager.prevPage].folders || false			
			if(pageFolders) {
				x = pageFolders[0], y = pageFolders[1];
				a = pageFiles[0], b = pageFiles[1];
			};
		};
		
		for(x; x < y; x++) {
			folder = this.folders[x];
			if(folder.object) {  /*folder.object.remove();*/ folder.object = null; }
			if(folder.input) { /*folder.input.remove();*/  folder.input = null; }
			this.setFolderInfo(folder)
		};
		for(a; a < b; a++) {
			file = this.files[a];
			if(file.object) { /*file.object.remove();*/ file.object = null; }
			if(file.input) { /*file.input.remove();*/ file.input = null; }
			this.setFileInfo(file)			
		};			
	},
//rendering functions   
    renderGallery : function(options){

		var ie = window.ie ? true : false;
		var bigThumbs = options.bigThumbs || false;
		var x, y, folder, file;
		var pages = this.pager.pages;


		var wfItemRollOver = function(){
				this.addClass('onhover');
			};
		
		var wfItemRollOut = function(){
				this.removeClass('onhover').removeClass('new_item');
			};
			
				
		this.cleanup();
			

//		var wrappers = this.buildWrappers(options.bigThumbs);
		var fileListing = this.UI.listingWrapper; //wrappers.otherItems;
		var recentListing = this.UI.recentUploadsWrapper; //wrappers.recentlyUploaded;		
		
		var clas = (bigThumbs) ? 'thumbs_128': 'thumbs_96';
		if(bigThumbs){
			fileListing.removeClass('thumbs_96').addClass('thumbs_128');
		} else {
			fileListing.removeClass('thumbs_128').addClass('thumbs_96');
		};
		
		recentListing.className = fileListing.className;
		
		var totalItems = 0;
		var totalRecent = 0;		
		
		var clone = new Element('div', {'class':'wfItem'});
		
		if(pages.length > 1) {
			var pageFiles = pages[options.page].files || false;
			var pageFolders = pages[options.page].folders || false			
			if(pageFolders)
				x = pageFolders[0], y = pageFolders[1];
		} else {
			x = 0, y = this.folders.length;
		};		
		if(this.levelupIndex) {
/*			
			var lvlup = clone.clone().injectInside(fileListing).addClass('folder_drop');
			lvlup.setHTML('<div class="thumb folder" style="background-image: url(/resources/icons/files/b_folder.gif);" onclick="webFolder.loadFolder('+this.levelupIndex+'); return false;" title="level up"><input type="checkbox" name="chkdir_'+folder.id+'" id="" value="'+folder.id+'" style="visibility: hidden; position: absolute;"/></div>'+
			'<span class="label"><a onclick="webFolder.loadFolder('+this.levelupIndex+'); return false;" href="#up">..</a></span>');			
*/			
		};
		
		for(x; x < y; x++) {
			totalItems++;
			folder = this.folders[x];
			
			try{
				if(folder.object.getParent()) continue;
			} catch(e) {};
		
			folder.isFolder = true;

			folder.object = clone.clone().setProperties({'id':'folder_' + folder.id}).addClass('folder_drop');
			
			var fn = 'inject';
			var tmp = null;
		
			if(this.bUpdate) {
				if(x == 0) {
					fn = 'injectTop';
				} else if (x == 1) {
					tmp = this.folders[0].object;
					fn = 'injectAfter'
				} else if(x > 1) {
					tmp = this.folders[x-1].object;
					fn = tmp ? 'injectAfter' : fn;
				}
			};

			folder.object[fn](tmp ? tmp : fileListing);
			
			folder.object.addEvent('mouseenter', wfItemRollOver );
			folder.object.addEvent('mouseleave', wfItemRollOut );
				
			var attrShared = (folder.bShared && this.bAdmin) ?  'block' : 'none';
			var attrLocked = (folder.password) ?  'block' : 'none';
			var attrHTML = '<div class="shared" onclick="fileManager.getLinks(\'d_' + folder.id + '\')" id="folderShared_'+folder.id+'" style="display:'+attrShared+';"><!-- --></div><div class="locked" id="folderLocked_'+folder.id+'" style="display:'+attrLocked+';"><!-- --></div>';
			
			var openFolderFunction = this.bAdmin ? 'webFolder.selectItem(\'folder_'+folder.id+'\')' : 'webFolder.loadFolder('+folder.id+')';
			var menu = this.bAdmin ? '<a href="#manage" id="d_'+folder.id+'" class="trigger action_menu" onclick="contextMenu.show(this); return false;"><!-- --></a>' : '';
			folder.object.innerHTML = menu +
			'<div class="fileAttributes">'+attrHTML+'</div>'+
			'<div class="thumb folder" style="background-image: url(' + folder.bigIcon +');" onClick="'+openFolderFunction+'; return false;"  onDblClick="webFolder.loadFolder('+folder.id+'); return false;" title="'+ folder.name +'::'+ folder.files_count+' files">'+
			'<input type="checkbox" name="chkdir_'+folder.id+'" id="chkdir_'+folder.id+'" value="'+folder.pid+'" style="visibility: hidden; position: absolute;"/></div>'+
			'<span class="label"><a onclick="webFolder.loadFolder('+folder.id+'); return false;" id="folderName_'+folder.id+'" href="#folder">'+shortFileName(folder.name, 15)+'</a></span>';
			
			folder.input = folder.object.getElement('input');
			this.setFolderInfo(folder);
		};


//		this.imagesCount = 0;
		
		if(pages.length > 1) {
			if(pageFiles)
				x = pageFiles[0], y = pageFiles[1];
		} else {
			x = 0, y = this.files.length;
		};

		var buildFileCell = function(file){
			try{
				if(file.object.getParent()) return false;
			} catch(e) {};		
			
			file.isFile = true;
			
			file.dls = file.dls || 0;

			file.object = clone.clone()
				.setProperties({'id':'file_' + file.id})
				.addEvents({
					'mouseenter' : wfItemRollOver ,
					'mouseleave' : wfItemRollOut
				})				
				
			var attrShared = (file.bShared && this.bAdmin) ?  'block' : 'none';
			var attrLocked = (file.password) ?  'block' : 'none';
			var attrHTML = '<div class="shared" onclick="fileManager.getLinks(\'f_' + file.id + '\')" id="fileShared_'+file.id+'" style="display:'+attrShared+';"><!-- --></div><div class="locked" id="fileLocked_'+file.id+'" style="display:'+attrLocked+';"><!-- --></div>';
			var overlay, mp3check = '';
			
			file.type = file.type || '';
			
			if(file.type.test('mp3'))
				mp3check = 'mp3check';
			
			if(file.type === 'pdf')
				overlay = '<div class="fileTypeOverlay" style="background-image: url(/resources/icons/overlay/pdf.gif);"><!-- --></div>'
			
			if(this.bAdmin) {
				var clickFunction =  'webFolder.selectItem(\'file_'+file.id+'\');';
				var dblClickFunction = (file.isImage && this.bDirectDownloads) ? 'webFolder.openImage('+file.id+');' : 'webFolder.openURL(\'' + file.url + '\');';				
			} else {
				var clickFunction = (file.isImage && this.bDirectDownloads) ? 'webFolder.openImage('+file.id+');' : 'webFolder.openURL(\'' + file.url + '\');';
				var dblClickFunction = '';								
			};
			var menu = this.bAdmin ? '<a class="trigger action_menu" onclick="contextMenu.show(this); return false;"  id="f_'+file.id+'" href="#manage"><!-- --></a>' : '';
			
			var fileTitle = file.name +'::'+getHFileSize(file.size)+'&nbsp;&nbsp;'+file.dls + ' dls&nbsp;&nbsp;';			
			
			file.object.innerHTML =  menu + (overlay ? overlay : '') +
			'<div class="fileAttributes">'+attrHTML+'</div>'+
			'<div class="thumb" title="'+ fileTitle +'" style="background-image: url(' + (bigThumbs && file.isImage ? file.hugeIcon : file.bigIcon) +');" onClick="'+ clickFunction +'return false;"  onDblClick="'+dblClickFunction+'return false;">'+
			'<input type="checkbox" class=" '+ mp3check +'" name="chkfile_'+file.id+'" id="chkfile_'+file.id+'" value="'+file.pid+'" style="visibility: hidden; position: absolute;"/></div>'+
			'<span class="label"><a title="'+file.name+'" rel="'+(file.isImage && this.bDirectDownloads ? 'lightbox[filepark]' : '')+'" id="fileName_'+file.id+'" href="'+file.url+'">'+shortFileName(file.name, 15)+'</a></span>';
		
			file.input = file.object.getElement('input');
			this.setFileInfo(file);	
			return file;			
		};

		for(x; x < y; x++) {
			var file = buildFileCell.call(this, this.files[x]);
			if(file) file.object.injectInside(fileListing);
		};	
		
		if(this.recentItems.length > 0) {
			this.UI.recentAreas.each(function(a){a.setStyle('display','block');})
			for(x =0, y = this.recentItems.length; x < y; x++) {
				var file = buildFileCell.call(this, this.recentItems[x]);
				if(file) file.object.injectInside(recentListing);
			};
		} else {
			this.UI.recentAreas.each(function(a){a.setStyle('display','none');})
		};
		
		this.updateUI();
		
		var vMode = (bigThumbs) ? "th" : "gl";		
		this.cookies.set("wm", vMode); 
		
    },
    renderList : function(options){		
		
		var totalItems = 0;
		var totalRecent = 0;	

		this.UI.recentAreas.each(function(a){a.setStyle('display','none');})				
		var fileListing = this.UI.listingWrapper; //wrappers.otherItems;
		var recentListing = this.UI.recentUploadsWrapper;

		this.cleanup();
		
		var isManagerTable = $('managerTable')
		var isRecentTable = $('recentTable');		
		
		if(!isManagerTable) {

			
			var table = new Element('table').setProperties({'width' : '100%', 'border' : '0', 'cellpadding' : '0', 'cellspacing' : '0', 'class' : 'fileListing'});
				
			var mainTable = table.injectInside(fileListing).setProperties({'id' : 'managerTable'});
	
			var col_item = new Element('col');
			var col_group =  new Element('colgroup').inject(mainTable);
				
			var tmp;				
			tmp = this.bAdmin ? col_item.clone().setProperties({'class': 'checkbox'}).injectInside(col_group) : null;				
			tmp = col_item.clone().injectInside(col_group);				
			tmp = col_item.clone().setStyles({width: 75}).injectInside(col_group);
			tmp = col_item.clone().setStyles({width: 85}).injectInside(col_group);
			tmp = col_item.clone().setStyles({width: 105}).injectInside(col_group);
			tmp = col_item.clone().setStyles({width: this.bAdmin ? 55 : 25}).injectInside(col_group);			
			tmp = this.bAdmin ? col_item.clone().setProperties({'class': 'manageMenu'}).injectInside(col_group) : null;

			var listingBody = new Element('TBODY').injectInside(mainTable);
		} else {
			var mainTable = isManagerTable;
			var listingBody = mainTable.getElement('tbody');
		};
		
		if(!isRecentTable){
			var recentTable = mainTable.clone().injectInside(this.UI.recentUploadsWrapper).setProperties({'id' : 'recentTable'});
			var recentBody = new Element('TBODY').inject(recentTable);
		} else {
			var recentTable = isRecentTable;
			var recentBody = recentTable.getElement('tbody');
		};


		fileListing.removeClass('thumbs_96').removeClass('thumbs_128');
		recentListing.removeClass('thumbs_96').removeClass('thumbs_128');
		
		var wfItemRollOver = function(){
				this.addClass('onhover');
			};
		
		var wfItemRollOut = function(){
				this.removeClass('onhover').removeClass('new_item');
			};	

		var wfItemClick = function(e){
			e = new Event(e);

			var itm = directory[this.id.replace('folder', 'd')] || directory[this.id.replace('file', 'f')];

				if(contextMenu.active || e.target.getTag() == 'a') return false;

				if(webFolder.bAdmin) 
					webFolder.selectItem(itm.object.id);
				else {
					if(itm.isFolder) webFolder.loadFolder(obj.id);
					if(itm.isFile) {
						if(itm.isImage && webFolder.bDirectDownloads) webFolder.openImage(itm.id);
							else webFolder.openURL(itm.url);
						}
				}
			};
		var wfItemDblClick = function(obj){
				if(obj.isFolder) webFolder.loadFolder(obj.id);
				if(obj.isFile) {
					if(obj.isImage && webFolder.bDirectDownloads) webFolder.openImage(obj.id);
					else webFolder.openURL(obj.url);
				}
			};
			
		var TR = new Element('tr').addClass('wfItem').injectInside(recentBody);
		for(var t=0, m = this.bAdmin ? 7 : 5; t<m; t++){
			var TD = TR.insertCell(-1);
			if(this.bAdmin && t == 1) TD.className = 'nopadding';
			if(!this.bAdmin && t == 0) TD.className = 'nopadding';
			if(this.bAdmin && t == 0) TD.className = 'checkbox';
			if(this.bAdmin && t == 6) TD.className = 'manageMenu';
			TD.innerHTML = '&nbsp;';
		};
		
		var x, y;
		var pages = this.pager.pages;
		
		if(pages.length > 1) {
			var pageFiles = pages[options.page].files || false;
			var pageFolders = pages[options.page].folders || false			
			if(pageFolders)
				x = pageFolders[0], y = pageFolders[1];
		} else {
			x = 0, y = this.folders.length;
		};
		
//----------------- building folders list --------------------//
		var buildFolderCell = function (folder){
			
			try{ if(folder.object.getParent()) return false; }
			catch(e) {};	
			
			folder.isFolder = true;

			folder.object = TR.clone().setProperty('id', 'folder_' + folder.id).addEvents({
				'mouseenter' : wfItemRollOver,
				'mouseleave' : wfItemRollOut,
				'click': wfItemClick,
				'dblclick': this.bAdmin ? wfItemDblClick.pass(folder) : Class.empty
			});

			var attrShared = (folder.bShared && this.bAdmin) ?  'block' : 'none';
			var attrLocked = (folder.password) ?  'block' : 'none';
			var attrHTML = '<div class="shared" onclick="fileManager.getLinks(\'f_' + folder.id + '\')" id="folderShared_'+folder.id+'" style="display:'+attrShared+';"><!-- --></div><div class="locked" id="folderLocked_'+folder.id+'" style="display:'+attrLocked+';"><!-- --></div>';

			var openFolderFunction = 'webFolder.loadFolder('+folder.id+')';


			var TD = folder.object.childNodes;

			var check = '<input type="checkbox" name="chkdir_'+ folder.id+'" value="'+ folder.pid+'" onClick="webFolder.selectItem(\'folder_'+ folder.id+'\')" id="chkdir_'+ folder.id+'"/>';
			var item_name = '<div class="icon" style="background-image:url('+ folder.icon +');"><a href="" id="folderName_'+ folder.id +'" onclick="'+ openFolderFunction +'; return false;">'+ folder.name+'</a></div>'
			var fdate = this.displayDate(folder.createDate);
			var attr_div = '<div class="fileAttributes">'+ attrHTML +'</div>';
			TD[0].innerHTML = this.bAdmin ? check : item_name;			
			TD[1].innerHTML = this.bAdmin? item_name : '&nbsp;';
			TD[2].innerHTML = folder.files_count + ' file' + (folder.files_count == 1 ? '' : 's');
			TD[3].innerHTML =  this.bAdmin? '&nbsp;' : fdate;
			TD[4].innerHTML = this.bAdmin? fdate : attr_div;
			
			if(this.bAdmin) {
				TD[5].innerHTML = attr_div;
				TD[6].innerHTML = '<a onclick="contextMenu.show(this); return false;" class="action_menu" id="d_'+ folder.id+'" href="#"/>';
			}
			
			folder.input = folder.object.getElement('input');
			
			this.setFolderInfo(folder);			

			return folder;
		};	

		var buildFileCell = function(file){
			try{ if(file.object.getParent()) return false; }
			catch(e) {};	
			
			file.isFile = true;

			file.object = TR.clone().setProperty('id', 'file_' + file.id).addEvents({
				'mouseenter' : wfItemRollOver,
				'mouseleave' : wfItemRollOut,
				'click': wfItemClick,
				'dblclick': this.bAdmin ? wfItemDblClick.pass(file) : Class.empty
			});
			
			var attrShared = (file.bShared && this.bAdmin) ?  'block' : 'none';
			var attrLocked = (file.password) ?  'block' : 'none';
			var attrHTML = '<div class="shared" onclick="fileManager.getLinks(\'f_' + file.id + '\')" id="fileShared_'+file.id+'" style="display:'+attrShared+';"><!-- --></div><div class="locked" id="fileLocked_'+file.id+'" style="display:'+attrLocked+';"><!-- --></div>';

			var TD = file.object.childNodes;

			var mp3check = '';
			
			file.type = file.type || '';
			
			if(file.type.test('mp3'))
				mp3check = 'mp3check';
				
			var check = '<input type="checkbox" class="'+ mp3check +'" name="chkfile_'+ file.id+'" value="'+ file.pid+'" onclick="webFolder.selectItem(\'file_'+ file.id+'\')" id="chkfile_'+ file.id+'"/>';
			var item_name = '<div class="icon" style="background-image:url('+ file.icon +');"><a href="'+ file.url +'" title="'+file.name+'" rel="'+(file.isImage && this.bDirectDownloads ? 'lightbox[filepark]' : '')+'" id="fileName_'+ file.id +'">'+ file.name+'</a></div>'			
			var fdate = this.displayDate(file.createDate);
			var attr_div = '<div class="fileAttributes">'+ attrHTML +'</div>';
			TD[0].innerHTML = this.bAdmin ? 	check : item_name;
			TD[1].innerHTML = this.bAdmin ? 	item_name :getHFileSize(file.size);
			TD[2].innerHTML = this.bAdmin ? 	getHFileSize(file.size) : (file.dls ? file.dls : '0') + '&nbsp;Dls';
			TD[3].innerHTML =  this.bAdmin? 	(file.dls ? file.dls : '0') + '&nbsp;Dls' : fdate;
			TD[4].innerHTML = this.bAdmin? 		fdate : attr_div;
			if(this.bAdmin) {
				TD[5].innerHTML = attr_div;
				TD[6].innerHTML = '<a onclick="contextMenu.show(this); return false;" class="action_menu" id="f_'+ file.id+'" href="#"/>';
			};
			
			file.input = file.object.getElement('input');
			
			this.setFileInfo(file);
			return file;			
		};

		var fn = 'inject';
		var tmp = null;
		var folder, file;

		for(x = 0; x < y; x++) {
			folder = buildFolderCell.call(this, this.folders[x]);
			if(folder) {
				if(this.bUpdate) {
					if(x == 0) {
						fn = 'injectTop';
					} else if (x == 1) {
						tmp = this.folders[0].object;
						fn = 'injectAfter'
					} else if(x > 1) {
						tmp = this.folders[x-1].object;
						fn = tmp ? 'injectAfter' : fn;
					}
				};		
				folder.object[fn](tmp ? tmp : listingBody);
			}
		};


		if(pages.length > 1) {
			if(pageFiles)
				x = pageFiles[0], y = pageFiles[1];
		} else {
			x = 0, y = this.files.length;
		};


		for(x; x < y; x++) {
			var file = buildFileCell.call(this, this.files[x]);
			if(file) file.object.injectInside(listingBody);
		};	
		
		if(this.recentItems.length > 0) {
			this.UI.recentAreas.each(function(a){a.setStyle('display','block');})
			for(x =0, y = this.recentItems.length; x < y; x++) {
				var file = buildFileCell.call(this, this.recentItems[x]);
				if(file) file.object.injectInside(recentBody);
			};
		} else {
			this.UI.recentAreas.each(function(a){a.setStyle('display','none');})
		};
		
		TR.remove();
		this.updateUI();

		this.cookies.set("wm", "list");
    },
	renderTrail: function(response){
		var oTrail = [];
		var tTrail = [];
		var special = false;
		response.trail.each(function(t, i){
				if(t.bCurrent) {
					oTrail.push('<span class="current_name">'+ t.label +'</span><span class="sub_label" id="trailSubLabel">&nbsp;</span>');
					special = response.bSearch ? t.label.toLowerCase().split(':')[0] : false;
				}
				else  oTrail.push('<a href="#d:'+ t.id +'"  onclick="webFolder.loadFolder(' + t.id + '); return false;" class="trail_item">'+ t.label +'</a>');
				tTrail.push(t.label);
			});

		$('folderTrail').setHTML(oTrail.join('&nbsp;/&nbsp;'));
		document.title = tTrail.join(' / ') + ' - File Qube';
		var itemcount = response.folders.length + response.files.length;
		itemcount += itemcount == 1 ? ' item' : ' items';
		if(response.bAdmin)
			$('trailSubLabel').setHTML(response.bShared ? 'shared' : response.bSearch ? '(' + itemcount +')' : '')[response.bShared ? 'addClass' : 'removeClass']('shared');		
	},	
	discardRecent : function() {
		this.checkpointTime = new Date().getTime() - this.serverTimeOffset;
		this.cookies.set("ct", this.checkpointTime);
		this.UI.recentAreas.each(function(a){a.setStyle('display','none');})
		this.files.extend(this.recentItems);

		this.recentItems.length = 0;

		this.setupDir();
		return false;
	
	},
	getFile : function(id) {
		this.filesCount = this.files.length;
		id = id.test('f') ? id : 'f_' + id;	
		return directory[id] || null		
//		id = id.test('f') ? id.split("_", 2)[1] : id;
//		for(var x = 0; x < this.filesCount; x++) if(this.files[x].id == id) return this.files[x];
//		return null;
	},	
	getFolder : function(id) {
		this.foldersCount = this.folders.length;
		id = id.test('d') ? id : 'd_' + id;	
		return directory[id] || null
//		id = id.test('d') ? id.split("_", 2)[1] : id;	
//		for(var x = 0; x < this.foldersCount; x++) if(this.folders[x].id == id) return this.folders[x];
//		return null;
	},	
	setFileInfo : function(file) {
		directory['f_' + file.id] = file;		
	},	
	setFolderInfo : function(folder) {
		directory['d_' + folder.id] = folder;
	},
	showPreloader : function(){
		var fn = preferences.animatedFolders ? 'start' : 'set';
		if(preferences.animatedFolders){
			this.UI.globalWrapper.setStyle('height',this.UI.globalWrapper.getSize().scrollSize.y);
			this.UI.globalWrapper.setStyle('overflow','hidden');					
//		this.UI.globalWrapper.setStyle('position','relative');
		};
	
		if(!this.UI.browseOverlay) {
			this.UI.browseOverlay = new Element('div', {
				'class': 'folderLoading',
				'id': 'browsePreloader',
				'styles': {
					'top':0,
					'left':0,
					'width':this.UI.globalWrapper.getSize().scrollSize.x,
					'height':this.UI.globalWrapper.getSize().scrollSize.y
				}
			}).injectTop(this.UI.globalWrapper);
	
		
			this.UI.browseOverlayFX = new Fx.Style(this.UI.browseOverlay, 'opacity', {
				duration: 300,
				wait: false,
				transition: Fx.Transitions.Expo.easeIn,
				onComplete : function(el){
					if(webFolder.UI.browseOverlay.getStyle('visibility') == 'hidden') {
						el.setStyle('height','0');
//						webFolder.UI.browseOverlay = false;
					};
				}
			}).set(0);		
		}
		this.UI.browseOverlay.setStyles({'top':0, 'left':0, 'width':this.UI.globalWrapper.getSize().scrollSize.x, 'height':this.UI.globalWrapper.getSize().scrollSize.y});
		this.UI.browseOverlayFX[fn](0.8);

	},
	hidePreloader : function(){
		var fn = preferences.animatedFolders ? 'start' : 'set';
		var initialHeight = this.UI.globalWrapper.getSize().size.y;
		var controlHeight = this.UI.globalWrapper.getSize().scrollSize.y;
		var duration = Math.abs(controlHeight - initialHeight);

		controlHeight = (controlHeight < 135) ? 135 : controlHeight;
		
		if(preferences.animatedFolders) {
			this.UI.browseOverlay.setStyles({'height': controlHeight });
			this.UI.globalWrapper.effect('height', { duration:duration, transition: Fx.Transitions.Expo.easeOut,
				onComplete: function(el) {
					el.setStyle('height','1%');
					el.setStyle('overflow','');
//					el.setStyle('position','');
				}										  
			}).start(controlHeight); 
		};
		this.UI.browseOverlayFX[fn](0);
		
	},
	reloadFolder : function(){
		var el = tree.getFolder(this.index);
		if (!el) return false;		
		var url =  el.url || null;	
		this.requestDirectory({url: url});
	},
	shiftSelect : function(id, option){
		var selectedItems = this.UI.rubberband['selectedItems'];		
		var selectionLength = selectedItems.length;			
		if(this.UI.rubberband.shift && selectionLength > 0) {
			var beginShiftSelection = 0
			var items = [];
			var shiftSelectRange = [selectedItems[selectionLength-1].id, id];
			shiftSelectRange[1] = shiftSelectRange[1].split('_',2)[1];
			this.folders.each(function(f){				
				if(f.id == shiftSelectRange[0]) beginShiftSelection = 1;
				if(f.id == shiftSelectRange[1] && !beginShiftSelection) { 
					var s1 = shiftSelectRange[0];
					var s2 = shiftSelectRange[1];
					shiftSelectRange[0] = s2;
					shiftSelectRange[1] = s1;
					beginShiftSelection = 1;				}
				
				if(f.id == shiftSelectRange[1]) beginShiftSelection = 0;				

				if(beginShiftSelection || f.id == shiftSelectRange[1]){								
					items.push('folder_' + f.id);
				}			
			},this);
			this.files.each(function(f){				
				if(f.id == shiftSelectRange[0]) beginShiftSelection = 1;
				if(f.id == shiftSelectRange[1] && !beginShiftSelection) { 
					var s1 = shiftSelectRange[0];
					var s2 = shiftSelectRange[1];
					shiftSelectRange[0] = s2;
					shiftSelectRange[1] = s1;
					beginShiftSelection = 1;				}
				
				if(f.id == shiftSelectRange[1]) beginShiftSelection = 0;				

				if(beginShiftSelection || f.id == shiftSelectRange[1]){								
					items.push('file_' + f.id);
				}			
			},this);
			items.each(function(i){
				var el = $(i);
				var thumb = el.getElement('div.thumb') || el;
				var chkbox = el.getElement('input');
				var fn = 'addClass';
				chkbox.checked = true;
				thumb[fn]('selected');
				this.viewGroupActions();
				this.UI.rubberband.applySelection();				
			}, this)
			return false;	
		} ;
	},
	selectItem : function(id, option){

		if(this.UI.rubberband.shift) {
			this.shiftSelect(id, option);
			return false;
		};
		
//	console.log(selectionLength);

//		shiftSelectRange = [];
//		if(this.viewMode != 'list'){
//			if(!this.UI.rubberband.shift) this.UI.rubberband.checkNodes();
//			else this.UI.rubberband.preventSelection();
//		};

		var el = $(id);
		var thumb = el.getElement('div.thumb') || el;
		var chkbox = el.getElement('input');
		var state = this.viewMode == 'list' ? chkbox.checked : chkbox.checked;
	
		var fn;
		if(option && option == 'mark') {
			fn = 'addClass';
			chkbox.checked = true;
		} else if(option && option == 'unmark'){
			fn = 'removeClass';
			chkbox.checked = false;		
		} else if(!option){
			fn = state ? 'removeClass' : 'addClass';
			chkbox.checked = !state;	// = (state) ? false : true;
		}

		thumb[fn]('selected');
		this.viewGroupActions();
		this.UI.rubberband.applySelection();
		return false;		
	},
	setState : function(state){
		switch(state){
			case 'loading' :	this.showPreloader(); break;
			case 'updating' :	this.messenger.say('working', 'updating directory...'); break;
			case 'error' :		this.clearState(); this.state = 'error'; break;		
			case 'ok' :			if(fileManager.action != 'quickSubfolder') this.clearState(); break;	
		};
		this.state = state;
	},
	clearState : function(){
		cancelUpdate();
		if(this.state == 'loading' || this.state == 'rendering') this.hidePreloader();
		if(this.state == 'updating') this.messenger.cancel(100);
		this.state = 'ok';
	},
	ajaxError : function(response){
		this.setState('error');
		var err = {};
		try {
			err = response;
		} catch(e) {
			err = {status : 0, statusText: ''};			
		};
		jsWindow.error(jsWindow.buildRequestError(err), 1);
	}
};

function createSubNav(trail, admin) {
	var oOpt = '';	
	var oTrail = '';
	for(var a = 0, b = trail.length; a < b; a++) {
		if(trail[a].bCurrent && !admin) oTrail += '<span style="color:#CC6600">'+ trail[a].label +'</span>';
		else if(trail[a].bCurrent && admin) oTrail += '<b>'+ trail[a].label +'</b>';		
		else oTrail += '<a href="#'+ trail[a].label +'"  onclick="webFolder.loadFolder(' + trail[a].id + '); return false;">'+ trail[a].label +'</a> &nbsp;&laquo;&nbsp;';
	};
	
	if(trail.length>0) {
		$('trailNav').setHTML(oTrail);
	}
	else if(trail.length == 1 && !admin) {
		$('trailNav').setStyle('display', 'none').setHTML('<!-- -->');		
	}
	else {
		$('trailNav').setStyle('display', 'none').setHTML('<!-- -->');
	};	
};

var currentIndex, actionWindow, addonWindow;
var toolbarMenu, treeMenu, mp3Window, errorWindow, tagsMenu;
var contextMenu = { active: 0 };
	
var buildWindows = function(){
	if(window.bSharesPage || window.bAdmin){
		actionWindow = new dhtmlWindow({
			id: 'actionsWindow',
			width: Cookie.get("_fq_ww") || 440,
			showHeader : true,
			resizable: true,
			limits: {x: [440, 750]},
			animate : preferences.animatedWindows,
			initialize: function(){
				this.winWrapper.addEvent('trash', (function(el){
					Cookie.set("_fq_ww", this.options.width, {duration: 120});
					}).bind(this))				
			},
			onShow: function(){
				var form = fileManager.bGroupAction ? webFolder.UI.mainForm : actionWindow.form; 
				if($type(form) == 'element') fileManager.updateString = form.toQueryString();				
			},
			onHide : function(){
//				if(webFolder.messenger.active) webFolder.messenger.hide();
			},
			onConfirm : fileManager.confirmUpdate.bind(fileManager),
			onCancel : fileManager.cancelUpdate.bind(fileManager)
		});
		$extend(actionWindow, {
			setTitle : function(obj){
				if(obj.name) {
					var sn = '<div class="action">'+ obj.action +'</div><div class="name">'+shortFileName(obj.name, 26)+'</div>';
				} else {
					var sn = '<div class="name">'+ obj.action +'</div>';
				}		
				this.setHeader('<div class="icon"><img src="/resources/icons/windows/'+ obj.ico +'.gif" width="55" height="48"></div><div class="info" '+ (obj.name ? '' : 'style="padding:14px 0 0 0;"') +'>'+ sn +'</div>');
			}
		});

		addonWindow = new dhtmlWindow({ id: 'promtPopup',
			width: 400,
			showHeader : false,
			animate : preferences.animatedWindows, 
			draggable: true,
			resizable: true,			
			onCancel : function(){ this.hide();}
		});	  
/*
	group will track actionWindow onShow event to get initial form state

		var group = new Group(actionWindow);
		group.addEvent('onShow', function(){
			fileManager.updateString = actionWindow.form.toQueryString();
		})		
*/		
	};
/*	
	mp3Window = new dhtmlWindow({
		id: 'mp3Window',
		width: 312,
		showHeader : false,
		animate : preferences.animatedWindows,
		draggable : true,
		onCancel : function(){
			this.hide();
		},
		initialize : function(){
			this.content.setHTML('<div id=mp3Title style="font: 10px Tahoma; padding:0 5px 8px;"></div><div id=mplayerWrapper></div>').setStyle('padding', 0);
			var s1 = new SWFObject("/resources/flash/mp3player.swf","mp3play","250","20","7");
			s1.addParam("allowfullscreen","true");				
			s1.addVariable("width","250");
			s1.addVariable("frontcolor","0x565F66");
			s1.addVariable("lightcolor","0xCC6600");
			s1.addVariable("height","20");
			s1.addVariable('javascriptid','mp3play');
			s1.addVariable('enablejs','true');
			s1.addVariable("largecontrols","false");
			//	s1.addVariable("file","mp3.mp3");
			s1.write('mplayerWrapper');
		}
	});
*/	

	errorWindow = new dhtmlWindow({ id: 'errorPopup', width: 440, showHeader : false, animate : preferences.animatedWindows, contentHTML : '<h1 style="font-size:18px; font-weight:normal; margin-bottom:10px;" class=red>Oops ;(</h1>'+
		'<p>System has detected error:<br>'+
		'<strong>Error code: </strong>Error description</p>'+
		'<div class="button btn1">'+
		'<a href="" onClick="hideWindow(); return false;"><span class="left"></span><span class=center>OK</span><span class="right"></span></a>'+
		'</div>	',
		onCancel : function(){ this.hide();}
	});	  
};

var buildMenus = function(){
	contextMenu = new dhtmlMenu({
		clickHide: true,
		triggerClass: 'action_menu',
		className: 'context-div',
		menuElement: 'div',			
		initialize:function(){
			this.fx = new Fx.Style(this.menu, 'opacity', {duration: 150, wait: false}).set(0);
			this.createMenuItems = function(id){
				var type = id.split("_", 2)[0];
				var idx = id.split("_", 2)[1];
				if(type == 'd') {					
					var folder = webFolder.getFolder( id );			
					return '<div><a href="#view" style="background-position: 3px -283px;" onclick="contextMenu.hide(); webFolder.loadFolder('+folder.id+'); return false;"><b>Open</b></a></div>'+
					'<div><a href="#properties" style="background-position: 3px 5px;" onclick="fileManager.edit(\''+id+'\'); return false;">Properties</a></div>'+					
					'<div class="divider"><!-- --></div>'+							
					'<div class="sub_level1" onmouseover="cmHover(this)"><a href="#share" style="background-position: 3px -388px;" onclick="return false;">Share</a>'+
						'<div class="level1">'+
							'<div><a href="#share" style="background-position: 3px -100px;" onclick="fileManager.getLinks(\''+id+'\'); return false;">Get web links</a></div>'+
							'<div><a href="#send" style="background-position: 3px -126px;" onclick="fileManager.emailLinks(\''+id+'\'); return false;">Email a link</a></div>'+	
							'<div><a href="#widget" style="background-position: 3px -178px;" onclick="fileManager.getLinks(\''+id+'\', \'widget\'); return false;">Get widget</a></div>'+						
						'</div>'+					
					'</div>'+
					'<div class="divider"><!-- --></div>'+		
					'<div><a href="#move" style="background-position: 3px -413px;" onclick="fileManager.copy(\''+id+'\'); return false;">Copy</a></div>'+		
					'<div><a href="#copy" style="background-position: 3px -74px;" onclick="fileManager.move(\''+id+'\'); return false;">Move</a></div>'+							
					'<div><a href="#delete" style="background-position: 3px -153px;" onclick="fileManager.trash(\''+id+'\'); return false;">Delete</a></div>';
				} else if(type == 'f'){
					var file = webFolder.getFile( id );

//					var RegExExt =/.*\.(.*)/;
//					var ext = file.name.replace(RegExExt, "$1");
					var mp3 = file.type.test('mp3');

			

					/*
						file.services = [{name: 'zoho', menu: 'Htlinked', icon: '/rerources/icons/attr_hotlink.gif', url: '/service?svr=zoho&file=23'},{name: 'zoho', menu: 'Protected', icon: '/rerources/icons/attr_locked.gif', url: '/service?svr=zoho&file=23'},{name: 'zoho', menu: 'Shared', icon: '/rerources/icons/attr_shared.gif', url: '/service?svr=zoho&file=23'}]
					*/
					if(file.services && file.services.length > 0){

						file.bEditable = 1;
						var services = ['<div class="level1">'];
						file.services.each(function(s){
							services.push('<div><a href="#" style="background-image:url('+ (s.icon ? s.icon : '') +'); background-position: 4px 6px;" onclick="fileManager.launchService(\''+ s.url +'\'); return false;">'+ s.menu +'</a></div>');
						},this);
						services.push('<div class="divider"><!-- --></div><div><a href="/servicelist" style="background-image:url(/resources/add_plus.gif); background-position: 5px 6px;">Add more services</a></div>');						
						services.push('</div>');
						var servicesMenu = services.join('');
					} else {//
						file.services = false;
					};
					
					var openFunction;

					if(file.isImage && webFolder.bDirectDownloads)
						openFunction = '<div><a href="#view" style="background-position: 3px -334px;" onclick="webFolder.openImage('+file.id+'); return false;"><b>View image</b></a></div>';
					else
						openFunction = '<div><a href="#view" style="background-position: 3px -361px;" onclick="webFolder.openURL(\''+file.url+'\'); return false;"><b>Download</b></a></div>'

					return openFunction +
					'<div><a href="#properties" style="background-position: 3px 5px;" onclick="fileManager.edit(\''+id+'\'); return false;">Properties</a></div>'+					
					(mp3 ? '<div><a href="#play" style="background-position: 3px -467px;" onclick="fileManager.openMP3Popup(\''+idx+'\'); return false;">Play audio</a></div>' : '')+
//					( file.services ? servicesMenu : '' )+					
					'<div class="divider"><!-- --></div>'+					
					'<div class="sub_level1" onmouseover="cmHover(this)" ><a href="#share" style="background-position: 3px -388px;" onclick="return false;">Share</a>'+
						'<div class="level1">'+
							'<div><a href="#share" style="background-position: 3px -100px;" onclick="fileManager.getLinks(\''+id+'\'); return false;">Get web links</a></div>'+
							'<div><a href="#send" style="background-position: 3px -126px;" onclick="fileManager.emailLinks(\''+id+'\'); return false;">Email a link</a></div>'+							
						'</div>'+					
					'</div>'+
					(file.services?'<div class="sub_level1" onmouseover="cmHover(this)"><a href="#edit" class="block" onclick="return false;" style="background-position: 3px -439px;">Advanced</a>'+ servicesMenu +'</div>':'')+
					'<div class="divider"><!-- --></div>'+	
					'<div><a href="#move" style="background-position: 3px -413px;" onclick="fileManager.copy(\''+id+'\'); return false;">Copy</a></div>'+								
					'<div><a href="#move" style="background-position: 3px -74px;" onclick="fileManager.move(\''+id+'\'); return false;">Move</a></div>'+			
					'<div><a href="#delete" style="background-position: 3px -153px;" onclick="fileManager.trash(\''+id+'\'); return false;">Delete</a></div>';
				};	
			};
			this.menu.setHTML('<div><a style="background-position: 3px 5px;">&nbsp</a></div>');
	
		},
		onShow: function() {
			var parentNodes = [];		
			parentNodes[0] = this.trigger.getParent();
			parentNodes[1] = parentNodes[0].getParent();			
			parentNodes.each(function(node){			
				if(node.hasClass('wfItem')) {
					node.addClass(this.options.hightlightClass);
					this.activeNode = node;
				};
			}, this);
				
			var id = this.trigger.getProperty('id');

			this.menu.innerHTML = this.createMenuItems(id); 
			var fn = preferences.animatedMenus ? 'start' : 'set';
				
			this.fx[fn](1);
		},
		onHide: function() {
			this.activeNode.removeClass(this.options.hightlightClass);
			var fn = preferences.animatedMenus ? 'start' : 'set';				
			this.fx[fn](0);

		}
	});

	toolbarMenu = window.bSharesPage || new dhtmlMenu({
		hightlightClass: 'activeIcon',
		initialize:function(){
			this.fx = new Fx.Style(this.menu, 'opacity', {duration: 150, wait: false}).set(0);
			
			this.createMenuItems = function(id){
				if(id == 'viewmode') {
	    			return '<li><a  href="#" onclick="webFolder._redraw(\'gl\'); return false;" style="background-position: 3px -231px; cursor:pointer;">Thumbnails view</a></li>'+
					'<li><a href="#" onclick="webFolder._redraw(\'list\'); return false;" style="background-position: 3px -257px; cursor:pointer;">Details view</a></li>';
				};
				if(id == 'share'){
					return '<li><a href="#weblink" onclick="fileManager.getLinks(); return false;"  style="background-position: 3px -100px;">Get web link</a></li>'+
					'<li><a href="#email" onclick="fileManager.emailLinks(\'' + webFolder.index + '\'); return false;" style="background-position: 3px -126px;">Email a link</a></li>'+	
					'<li ><a href="#widget" onclick="fileManager.getLinks(false, \'widget\'); return false;" style="background-position: 3px -178px;">Create widget</a></li>';
				};	
			}		
	
		},
		onShow: function() {
			var id = this.trigger.hasClass('shareThis') ? 'share' : this.trigger.hasClass('viewmode') ? 'viewmode' : '';
			this.menu.innerHTML = this.createMenuItems(id); 
			
			var fn = preferences.animatedMenus ? 'start' : 'set';				
			this.fx[fn](1);

		},
		onHide: function() {
			var fn = preferences.animatedMenus ? 'start' : 'set';				
			this.fx[fn](0);
		}
	});
	
	treeMenu = window.bSharesPage || new dhtmlMenu({
		initialize:function(){
			this.menu.setStyles({'width': 100, 'display': 'none'});
			this.fx = new Fx.Styles(this.menu, {duration: 350, wait: false, transition: Fx.Transitions.Expo.easeOut,
				onComplete : function(el){
					el.setStyles({'overflow' : 'hidden', 'overflow-y' : 'auto'});
				}
			 });
			
			tree.build(dirTree, this.menu, 'quickJumpLabel' );		
		},
		onShow: function() {
			this.menu.setStyles({'display': 'block' });
			this.dimensions = {
				trigger : this.trigger.getCoordinates(),
				menu : {
					'width': this.menu.getSize().scrollSize.x,
					'height':this.menu.getSize().scrollSize.y
				}
			};				
			this.menu.style.width = this.dimensions.trigger.width - 2 + 'px';
			var winHeight = window.getHeight();
			var menuDimensions = this.menu.getCoordinates();

			var h = menuDimensions.top + this.menu.getSize().scrollSize.y > winHeight + window.getScrollTop() ? window.getScrollTop() + winHeight - menuDimensions.top - 5 : this.menu.getSize().scrollSize.y;
			var delta =  winHeight + window.getScrollTop() - menuDimensions.top ;
			if(delta < 130) h = 150;

			this.menu.setStyles({ 'width': this.dimensions.trigger.width - 2, 'height' : h, 'overflow' : 'hidden', 'overflow-y':'auto', 'visibility' : 'visible'});
			webFolder.UI.rubberband.disable(1);
			
		},
		onHide: function() {
			webFolder.UI.rubberband.disable(0);
			this.menu.setStyles({'visibility' : 'hidden','overflow' : 'hidden', 'display': 'none' });
			
		},
		menuElement: 'ul',
		clickHide: true,
		triggerClass: 'select',
		className: 'tree'
	});

	tagsMenu = new dhtmlMenu({
		initialize:function(){
			this.menu.setStyles({'width': 150});
			this.fx = new Fx.Style(this.menu, 'opacity', {duration: 150, wait: false}).set(0);
			
//			this.menu.innerHTML = '<li><a  href="#" onclick="return false;" style="background:url(/resources/ajax_16px_FFFFFF.gif) no-repeat 2px 2px; padding-left: 25px;">Loading tags</a></li>'; 			
			
			this.setHeight = function(){
				var winHeight = window.getHeight();
				var menuDimensions = this.menu.getCoordinates();
	
				var h = menuDimensions.top + this.menu.getSize().scrollSize.y > winHeight + window.getScrollTop() ? window.getScrollTop() + winHeight - menuDimensions.top - 5 : this.menu.getSize().scrollSize.y;
				var delta =  winHeight + window.getScrollTop() - menuDimensions.top ;
				if(delta < 130) h = 150;
	
				this.menu.setStyles({ 'height' : h});
				
			};
			if ($chk(window.tagsList)) tags.start.delay(10, tags, [tagsList]);
			else tags.retreive.delay(1, tags);
		},
		onShow: function() {
//			this.menu.setStyles({'overflow' : 'hidden', 'overflow-y':'auto'});			
			var fn = preferences.animatedMenus ? 'start' : 'set';				
			this.fx[fn](1);			
		},
		onHide: function() {
//			this.menu.setStyles({'visibility' : 'hidden','overflow' : 'hidden' });
			var fn = preferences.animatedMenus ? 'start' : 'set';				
			this.fx[fn](0);			
		},
		hightlightClass: 'activeIcon',
		menuElement: 'ul',
		className: 'tags'
	});
};

var buildAdminIndex = function() {
	var toolBarIcons = $$('.toolbarIcon');
	
		toolTips = new Tips(toolBarIcons, {
			initialize:function(){
				this.fxShow = new Fx.Style(this.toolTip, 'opacity', {duration: 150, wait: false}).set(0);
			},
			offsets: {x: 6, y:15},
			showDelay: 150,
			hideDelay: 0,
			fixed : true,
			onShow: function(toolTip) {
				this.fxShow.start(1);
			},
			onHide: function(toolTip) {
				this.fxShow.set(0);
			}
		});	
		
    if(window.ie)
		toolBarIcons.each(function(el){
			el.addEvents({
				'mouseover' : function(){this.addClass ('onhover');},
				'mouseout' : function(){ this.removeClass('onhover');}				
			});								   
		});
	
	var qj = $('quickJump');

	if(qj) {
		qj.addEvents({
			'mouseout' : function(){this.removeClass('onmover');},
			'mouseover' : function(){this.addClass('onmover');}				
		});
	};

	buildWindows();
	$('transparentMessageWrapper').empty();
//	document.body.removeEvent('click', block);

}

var buildSharesIndex = function() {
	buildWindows();
//	buildMenus();
}

var buildUserIndex = function() {
	$extend(webFolder, {
		loadFolder : function(index) {
			if('directory' in window){
				var check = $chk(directory['d_'+index]);
				var url = check ? directory['d_'+index].folderUrl : rootFolderURL;
				index = check ? index : rootFolderID;					
			};
			if( !url ) return false;					
			
			this.UI.history.setValue(0, index);		
			this.requestDirectory({url: url});
			
			return false;
		},			
		setupUI  : function(ready){
			if(ready) return false;		
			this.UI = {
				nameWrapper : $('folderName'),				// curent directory name HTML object
//				levelupButton : $('upBtn'),					// level up HTML object
//				shareIndicator : $('sharedLabel'),			// share indocator HTML object
				listingWrapper : $('browse'),				// HTML object where listing will be displayed
				globalWrapper : $('browseWrapper'),
				mainForm : $('listingForm'),				// form for all group actions
				recentUploadsWrapper : $('recentUploads'),	
				sortIndicators	: $$('.sortIndicators a'),	// sorting indicators links
//				useRubberband :  true || Cookie.get("useRubberband"),	// dafault value is FALSE
				useLightbox : false,
//				rubberband : {},
				applySelection: function(){}
			};
			
			this.UI.checkboxes = this.UI.mainForm.getElements('input[type=checkbox]') || [];
			this.UI.recentAreas = this.UI.globalWrapper.getElements('.recent');
		
			this.UI.history = !window.bSharesPage ? HistoryManager.register(
				'd:',
				[0], 
				function(values) {
					webFolder.loadFolder(values[0]);
				},
				function(values) {
					return 'd:' + values[0];
				},
				/d\:(\d+)/
			) : 0;
	
			this.UI.tips = new Tips([], {
				initialize:function(){
					this.fx = new Fx.Style(this.toolTip, 'opacity', {duration: 150, wait: false}).set(0);
				},
				offsets: {x: 6, y:15},
				showDelay: 1000,
				hideDelay: 0,		
				className:'thumb',
				maxTitleChars: 512,
				onShow: function(toolTip) {
					this.fx.start(1);
				},
				onHide: function(toolTip) {
					this.fx.set(0);
				}
			});	
	
			this.pager.history = HistoryManager.register(
				'p:',
				[1], 
				function(values) {
					webFolder.setPage(values[0]-1);
				},
				function(values) {
					return 'p:' + values[0];
				},
				/p\:(\d+)/
			);
			
			this.messenger = new transparentMessage({hideDelay : '10000'});
			this.bReady = true;
		}
	});

//	buildWindows();

	window.cancelUpdate = function() {
		if(!dhtmlWindowStage.currentWindow.opened) return false;
		dhtmlWindowStage.currentWindow.cancel();
	};

	window.confirmUpdate = function() {
		if(!dhtmlWindowStage.currentWindow.opened) return false;
		dhtmlWindowStage.currentWindow.confirm();
	};
}

var block = function(e){
	e = new Event(e).stop();
	console.log('block');
	return false;
};
/*
window.addEvent('domready', function(e){
	document.addEvent('click', block);
});
*/
window.addEvent('load', function(e){
	if(window.bAdmin){
		buildMenus();
		webFolder.onReady = buildAdminIndex;
	} else if(window.bSharesPage){
		// build shares page - windows only
		buildMenus();
		webFolder.onReady = buildSharesIndex;
	} else {
		buildUserIndex()
		webFolder.onReady = buildWindows;
	};
	
	webFolder.init() ;//.delay(10, webFolder);
});


