/**
 * @author michal.blaha@syntacticsugar.com
 */
function FrameCollection(o){
	var cid = o.cid;
	var bookmark_view = o.bookmark_view;
	var rebuildFrameList = o.rebuildFrameList;
	var tabs_bar = o.tabs_bar;
	var book_bar = o.book_bar;
	var maximized = false;
	var isActive = false;
	var activeFrame = null;
	var activeFrameID = null;
	var is_loaded = false;
	
	this.frames = new Array;
	var me = this;
	
	/**
	 * vodorovny rastr pro umistovani novych oken
	 */
	var posX_step = 23;
	
	/**
	 * svisly rastr pro umistovani novych oken
	 */
	var posY_step = 23;
	
	/**
	 * kolik oken bylo umisteno do rastru
	 */
	var pos_count = 0;
	
	var winManager = new Ext.WindowGroup();
	winManager.zseed = 5000;
	
	/**
	 * Aktivovat kolekci oken
	 * (zobrazit okna a zalozky)
	 *
	 * @param {int} frame_id - co maximalizovat
	 */
	this.activate = function(frame_id){
	
		isActive = true;
		load(frame_id);
	}
	
	/**
	 * Deaktivovat kolekci oken
	 *
	 * skryt okna a zalozky
	 */
	this.deactivate = function(){
		for (var i = me.frames.length - 1; i >= 0; i--) {
			me.frames[i].destroy();
		}
		me.frames = [];
		isActive = false;
		maximized = false;
		is_loaded = false;
	}
	
	/**
	 * Načíst informace o oknech
	 *
	 * @param {int} frame_id - co maximalizovat
	 */
	function load(frame_id){
		activeFrame = null;
		activeFrameID = null;
		Ext.MessageBox.show({
			msg: 'Loading data, please wait...',
			progressText: 'Loading...',
			width: 300,
			windowGroup: 'dialog',
			wait: true,
			waitConfig: {
				interval: 200
			},
			// icon: 'ext-mb-download', //custom class in msg-box.html
			animEl: 'mb5'
		});
		
		Ext.Ajax.request({
			url: HOME_URL + CONT_LOAD,
			params: {
				cid: cid,
				uid: USER_ID
			},
			method: 'GET',
			success: function(result, request){
			
				var maximized_frame = false;
				
				$(result.responseXML).find('frame').each(function(){
					var left = $(this).find('left').text();
					var top = $(this).find('top').text();
					
					if (Math.round(left / posX_step) == (top / posY_step)) {
						pos_count = Math.max(left / posX_step, pos_count);
					}
					
					if ($(this).find('maximized').text() == 1 && !activeFrameID) {
						activeFrameID = $(this).find('id:first').text();
						maximized_frame = true;
					}
					
					if (frame_id == $(this).find('id:first').text()) {
						activeFrameID = frame_id;
						maximized_frame = true;
					}
					
					var frame = addFrame({
						id: $(this).find('id:first').text(),
						width: $(this).find('width').text(),
						height: $(this).find('height').text(),
						left: left,
						top: top,
						position: $(this).find('position').text(),
						collapsed: $(this).find('collapsed').text(),
						url: $(this).find('url').text(),
						title: $(this).find('title').text(),
						icon: $(this).find('icon').text(),
						title_status: $(this).find('title_status').text()
					});
					frame.activate();
				});
				
				if (me.frames.length > 0) {
					switchFrame(me.frames[0].id);
				}
				
				if (maximized_frame && (!bookmark_view || frame_id)) {
					var i = getFrameIndex(activeFrameID);
					me.frames[i].maximize();
				}
				
				setTimeout(function(){
					Ext.MessageBox.hide();
					is_loaded = true;
				}, 500);
			},
			failure: function(result, request){
				// chyba pri nacitani dat
				setTimeout(function(){
					Ext.MessageBox.hide();
				}, 500);
			}
			
		});
	}
	
	function addFrame(o){
		var frame = new Frame({
			frame: o,
			cid: cid,
			bookmark_view: bookmark_view,
			win_manager: winManager,
			tabs_bar: tabs_bar,
			book_bar: book_bar,
			onMaximize: onFrameMaximize,
			onRestore: onFrameRestore,
			onDelete: deleteFrame,
			onSelect: switchFrame,
			send: send,
			rebuildFrameList: rebuildFrameList,
			setMaximized: setMaximized
		});
		me.frames.push(frame);
		
		if (bookmark_view && maximized) {
			Ext.infoDilalog.msg(msg.newWindow, msg.newWindowBackround);
		}

		
		return frame;
	}
	
	/**
	 * Odeslat na server informace o oknech
	 *
	 * @TODO
	 */
	function send(save){
		if (!is_loaded) {
			return;
		}
		
		save = (save === true) ? 1 : 0;
		
		Ext.Ajax.request({
			url: HOME_URL + CONT_SEND,
			params: {
				cid: cid,
				uid: USER_ID,
				save: save,
				frames: getFramesInfo()
			},
			method: 'POST',
			disableCaching: true,
			success: function(result, request){
				// uspesne odeslano
			},
			failure: function(result, request){
				// chyba pri prejmenovani
			}
		});
	}
	
	this.send = send;
	
	function getFramesInfo(){
	
		var info = '';
		
		for (var i = 0; i < me.frames.length; i++) {
			var frame_info = '';
			
			frame_info += '<position>' + me.frames[i].getPos() + '</position>';
			frame_info += '<frame_id>' + me.frames[i].id + '</frame_id>';
			frame_info += '<top>' + me.frames[i].top + '</top>';
			frame_info += '<left>' + me.frames[i].left + '</left>';
			frame_info += '<width>' + me.frames[i].width + '</width>';
			frame_info += '<height>' + me.frames[i].height + '</height>';
			frame_info += '<maximized>' + (me.frames[i].maximized ? 1 : 0) + '</maximized>';
			frame_info += '<collapsed>' + (me.frames[i].collapsed ? 1 : 0) + '</collapsed>';
			frame_info += '<url><![CDATA[' + me.frames[i].url + ']]></url>';
			frame_info += '<title><![CDATA[' + me.frames[i].title + ']]></title>';
			frame_info += '<icon><![CDATA[' + me.frames[i].icon + ']]></icon>';
			frame_info += '<title_status>' + me.frames[i].title_status + '</title_status>';
			info += '<frame>' + frame_info + '</frame>';
		}
		
		info = '<frames>' + info + '</frames>';
		
		return info;
	}
	
	function switchFrame(frameID){
		var i = getFrameIndex(frameID);
		if (activeFrame != me.frames[i]) {
			if (activeFrame != null) {
				activeFrame.unselect();
			}
			
			if (maximized) {
				me.frames[i].maximize();
			}
			else {
				me.frames[i].select();
			}
			activeFrame = me.frames[i];
		}
	}
	
	function onFrameMaximize(frameID){
		for (var i = me.frames.length - 1; i >= 0; i--) {
			if (me.frames[i].id != frameID) {
				me.frames[i].hide();
			}
		}
		maximized = true;
	}
	
	function onFrameRestore(frameID){
		maximized = false;
		for (var i = me.frames.length - 1; i >= 0; i--) {
			if (me.frames[i].id != frameID) {
				me.frames[i].show();
			}
		}
		switchFrame(frameID);
		layout.desktopResize();
	}
	
	function deleteFrame(frameID){
		var i = getFrameIndex(frameID);
		if (maximized) {
			onFrameRestore(frameID);
			var switchToIndex = (i == 0 ? i + 1 : i - 1);
			switchFrame(me.frames[switchToIndex].id);
		}
		me.frames[i].destroy();
		me.frames.splice(i, 1);
		
		rebuildFrameList();
	}
	
	function setMaximized(value){
		maximized = value;
	}
	
	/**
	 * Nastavit zobrazeni bookmarku
	 * @param {bool} value
	 */
	this.setBookmarkView = function(value){
		maximized = false;
		bookmark_view = value;
		if (isActive) {
			for (var i = 0; i < me.frames.length; i++) {
				me.frames[i].changeBokmarkView(value);
			}
		}
	}
	
	/**
	 * Pridat nove okno do kontejneru
	 *
	 * @param {string} url
	 * @param {bool} maximize
	 */
	this.addFrame = function(url, maximize){
		
		pos_count++;
		if (url.search(/:\/{2}/) == -1) {
			url = "http://" + url.toLowerCase();
		}
		
		Ext.Ajax.request({
			url: HOME_URL + FRAME_NEW,
			params: {
				cid: cid,
				uid: USER_ID,
				position: me.frames.length,
				url: url,
				collapsed: 1,
				width: NEW_WIN_W,
				height: NEW_WIN_H,
				left: posX_step * pos_count,
				top: posY_step * pos_count
			},
			method: 'GET',
			success: function(result, request){
				var data = result.responseXML;
				
				var frame = addFrame({
					id: Ext.DomQuery.selectValue('id', data),
					position: me.frames.length,
					url: Ext.DomQuery.selectValue('url', data),
					title: Ext.DomQuery.selectValue('title', data),
					icon: Ext.DomQuery.selectValue('icon', data),
					collapsed: '1',
					title_status: '0',
					width: NEW_WIN_W,
					height: NEW_WIN_H,
					left: posX_step * pos_count,
					top: posY_step * pos_count
				});
				frame.activate();
				
				if (maximize) {
					frame.maximize();
				}
				
				rebuildFrameList();
				
			},
			failure: function(result, request){
				// chyba pri pridavani
			}
		});
	}
	
	/**
	 * Vrati index do pole frames pro frame s pozadovanym ID
	 * @param {int} id
	 */
	function getFrameIndex(id){
		for (var i = 0; i < me.frames.length; i++) {
			if (me.frames[i].id == id) {
				return i;
			}
		}
		return null;
	}
}

