/**
 * @author michal.blaha@syntacticsugar.com
 */
function Frame(o){
	var book_bar = o.book_bar;
	var selected = false;
	var hiden = false;
	var collapsed_before_save =  (o.frame.collapsed == 1 ? true : false);
	
	/**
	 * aktivni cekani zda nedojde k presmerovani
	 * behem te doby nesmi byt odeslane info na server
	 */
	var redirect_check = false;
	
	var me = this;
	
	this.id = o.frame.id;
	this.position = o.frame.position;
	this.url = o.frame.url;
	if (o.frame.title) {
		this.title = o.frame.title
	}
	else {
		this.title = trimUrl(this.url);
		// nastavit title podle url
		getPageInfo(me.url);
	}
	this.icon = o.frame.icon
	this.icon_proxy = getIconProxy(o.frame.icon);
	this.title_status = o.frame.title_status;
	this.maximized = false;
	this.collapsed = (o.frame.collapsed == 1 ? true : false);
	this.width = parseInt(o.frame.width);
	this.height = parseInt(o.frame.height);
	this.left = parseInt(o.frame.left);
	this.top = parseInt(o.frame.top);
	this.bookmark_view = o.bookmark_view;
	
	var tab = new FrameTab({
		url: me.url,
		title: me.title,
		icon: me.icon_proxy,
		renderTo: o.tabs_bar,
		onClick: onTabClick
	});
	
	var bookmark = new Bookmark({
		id: me.id,
		url: me.url,
		icon: me.icon_proxy,
		title: me.title,
		title_status: me.title_status,
		renderTo: book_bar,
		onActivate: setActive,
		onExpand: windowExpand,
		onGear: changeUrl,
		onMaximize: setMaximize,
		onClose: close,
		onTitleChange: changeTitle,
		onTitleStatusChange: titleStatusChange
	});
	
	var window = new Window({
		url: me.url,
		icon: me.icon_proxy,
		title: me.title,
		width: me.width,
		height: me.height,
		manager: o.win_manager,
		onActivate: setActive,
		onCollapse: windowCollapse,
		onGear: changeUrl,
		onMaximize: onWindowMaximize,
		onRestore: onWindowRestore,
		onClose: close,
		beforeClose: beforeClose,
		onMove: onWindowMove,
		onResize: onWindowResize,
		onTitleChange: changeTitle,
		onTitleStatusChange: titleStatusChange
	});
	
	var collapsed_window = new CollapsedWindow({
		url: me.url,
		icon: me.icon_proxy,
		title: me.title,
		title_status: me.title_status,
		manager: o.win_manager,
		onActivate: setActive,
		onExpand: windowExpand,
		onGear: changeUrl,
		onMaximize: setMaximize,
		onClose: close,
		onMove: onWindowMove,
		onTitleChange: changeTitle,
		onTitleStatusChange: titleStatusChange
	});
	
	/**
	 * pri aktivaci kontejneru
	 *
	 * vytvorit tlacitko
	 * zobrazit okno, nebo bookmark
	 */
	this.activate = function(){
		// mod zalozek
		if (me.bookmark_view) {
			bookmark.show();
		}
		// mod oken
		else if (me.collapsed) {
			tab.show();
			collapsed_window.show(me.left, me.top);
		}
		else {
			tab.show();
			window.show(me.left, me.top);
		}
	}
	
	/**
	 * pri deaktivaci kontejneru
	 *
	 * zlikvidovat tlacitko
	 * skryt okno a bookmark
	 */
	this.deactivate = function(){
		// mod zalozek
		if (me.bookmark_view) {
			bookmark.hide();
		}
		// mod oken
		else {
			tab.hide();
			hide();
		}
	}
	
	this.destroy = function(){
		tab.destroy();
		bookmark.destroy();
		window.destroy();
		collapsed_window.destroy();
	}
	
	/**
	 * nastavit frame jako vybrany
	 *
	 * oznacit tlacitko jako stisknute
	 * okno prenest do popredi
	 */
	this.select = function(){
		tab.press();
		if (hiden) {
			window.show();
		}
		window.toFront();
		selected = true;
	}
	
	/**
	 * zrusit vyber frame
	 *
	 * oznacit tlacitko jako nestisknute
	 */
	this.unselect = function(){
		tab.unpress();
		selected = false;
	}

	/**
	 * maximalizovat okno
	 */
	function setMaximize() {
		window.maximize();		
	}
	this.maximize = setMaximize;
	
	/**
	 * obnovit okno
	 */
	this.restore = function(){
		window.restore();
	}
	
	function setActive(){
		o.onSelect(me.id);
	}
	
	function onTabClick(){
	
		if (me.maximized) {
		// pri maximalizovanem okne nic nedelat
		}
		else if (selected) {
			// kontejner je aktivni
			hide();
			tab.unpress();
			selected = false;
		}
		else {
			// kontejner neni aktivni
			show();
			selected = true;
			if (me.maximized) {
				tab.press();
			}
		}
	}
	
	/**
	 * skryt okno
	 */
	function hide(){
		hiden = true;
		if (me.collapsed) {
			collapsed_window.hide();
		}
		else {
			window.hide();
			window.restore();
		}
		
		if (me.maximized) {
			window.hide();
			window.restore();
		}
	}
	this.hide = hide;
	
	/**
	 * zobrazit okno
	 */
	function show(){
		hiden = false;
		if (me.collapsed) {
			collapsed_window.show(me.left, me.top);
		}
		else {
			window.show(me.left, me.top);
		}
	}
	this.show = show;
	
	/**
	 * okno z iframu do nahledu
	 */
	function windowCollapse(){
		me.collapsed = true;
		collapsed_window.show(me.left, me.top);
		window.hide();

		if (collapsed_before_save != me.collapsed) {
			sendFrameInfo()
		}
	}
	
	/**
	 * okno z nahledu do iframu
	 */
	function windowExpand(){
		me.collapsed = false;
		collapsed_window.hide();
		window.show(me.left, me.top);

		redirect_check = true;
		setTimeout(function(){
			redirect_check = false;
			sendFrameInfo()
		}, 10000);
	}
	
	function onWindowMaximize(){
		me.maximized = true;

		if (!me.bookmark_view) {
			o.onMaximize(me.id);
		}
		else {
			o.setMaximized(true);
		}
	}
	
	function onWindowRestore(){
		me.maximized = false;
		
		if (me.bookmark_view) {
			window.hide();
			o.setMaximized(false);
		}
		else if (hiden == false) {
			o.onRestore(me.id);
			if (me.collapsed) {
				window.hide();
			}
		}
	}
	
	function onWindowMove(win, x, y){
		if (!win.maximized && (me.left != x || me.top != y)) {
			// layout.save_btn.enable();
			layout.signPulse();

			if (x < 0) {
				x = 0;
			}
			if (y < 0) {
				y = 0;
			}

			me.left = x;
			me.top = y;

			sendFrameInfo()
		}
	}
	
	function onWindowResize(width, height){
		if (me.width != width || me.height != height) {
			// layout.save_btn.enable();
			layout.signPulse();

			me.width = width;
			me.height = height;

			sendFrameInfo()
		}
	}
	
	/**
	 * zavrit okno
	 */
	function close(){
		o.onDelete(me.id);
		layout.signPulse();

		Ext.Ajax.request({
			url: HOME_URL + FRAME_DEL,
			params: {
				uid: USER_ID,
				cid: o.cid,
				fid: me.id
			},
			method: 'GET'
		});
	}
	
	function beforeClose() {
		if (me.bookmark_view || me.collapsed) {
			window.restore();
			return false;
		}
		return null;
	}
	
	/**
	 * zmenit url
	 */
	function changeUrl(){
		var url = prompt(msg.urlChange, me.url);
		if (url != null && url != me.url) {
			if (url.search(/^.*\/{2}/) == -1) {
				url = "http://" + url;
			}
			
			me.url = url;
			me.title = trimUrl(url);

			// prepsat url
			bookmark.setUrl(url);
			window.setUrl(url);
			collapsed_window.setUrl(url);

			// prepsat titlky
			tab.setText(me.title);
			window.setTitle(me.title);
			collapsed_window.setTitle(me.title);
			bookmark.setTitle(me.title);
			
			// zrusit ikonu
			changeIcon('');

			// aktualizovat seznam oken v kontejneru
			o.rebuildFrameList();

			// zvyraznit tlacitka
			// layout.save_btn.enable();
			layout.signPulse();

			// ziskat informace o strance (title & favicon)
			getPageInfo(url);

			if (me.collapsed) {
				sendFrameInfo();
			} else {
				redirect_check = true;
				setTimeout(function(){
					redirect_check = false;
					sendFrameInfo()
				}, 10000);
			}
		}
	}
	
	/**
	 * Ziskat a nastavit titulek a faviconu pro stranku
	 *
	 * @param {string} url
	 */
	function getPageInfo(url){
		url = url.replace(/^\s+|\s+$/g, "");
		url = encodeURI(url);
		
		Ext.Ajax.request({
			url: HOME_URL + PAGE_INFO,
			params: {
				url: url
			},
			method: 'GET',
			success: function(response){
				var data = response.responseXML;
				
				// nastavit ikonu
				changeIcon($(data).find('icon').text());
				
				// nastavit titlulek pokud se povedl ziskat
				var title = $(data).find('title').text();
				if (title) {
					changeTitle(title);
				}
			}
		});
	}
	
	/**
	 * zmenit popisek
	 */
	function changeTitle(title){
		me.title = title;
		
		tab.setText(title);
		window.setTitle(title);
		collapsed_window.setTitle(title);
		bookmark.setTitle(title);
		
		layout.signPulse();
		layout.desktopResize();

		o.rebuildFrameList();

		sendFrameInfo();
	}
	
	function titleStatusChange(title_status){
		me.title_status = title_status;
		bookmark.setTitleStatus(title_status);
		collapsed_window.setTitleStatus(title_status);
		
		sendFrameInfo();
	}
	
	function changeIcon(icon){
		me.icon = icon;
		me.icon_proxy = getIconProxy(icon);
		
		tab.setIcon(me.icon_proxy);
		window.setIcon(me.icon_proxy);
		collapsed_window.setIcon(me.icon_proxy);
	}
	
	function getIconProxy(icon){
		return icon ? HOME_URL + PAGE_PROXY + '?url=' + escape(icon) : '';
	}
	
	function trimUrl(url, len){
		// odstranit http:// a pod
		url = url.replace(/^.*\/{2}/, '');
		// odstranit www.
		url = url.replace(/^www\./, '');
		// odstranit parametry za otaznikem
		url = url.replace(/\?.*$/, '');
		// odstranit koncove lomitko
		url = url.replace(/\/*$/, '');
		
		// "w" je prilis siroke, proto je potreba zkratit retezec
		var pos = url.search(/www/);
		if (pos > -1) {
			len -= 2;
		}
		
		if (len > 0 && url.length > len) {
			// zkratit
			url = url.substring(len - 1, 0);
			// odstranit pripadnou tecku na konci
			url = url.replace(/\.$/, '');
			url += '\u2026';
		}
		
		return url;
	}

	function sendFrameInfo() {
		if (redirect_check) {
			return;
		}

		Ext.Ajax.request({
			url: HOME_URL + FRAME_UPDATE,
			params: {
				uid: USER_ID,
				cid: o.cid,
				fid: me.id,
				left: me.left,
				top: me.top,
				width: me.width,
				height: me.height,
				collapsed: me.collapsed ? 1 : 0,
				maximized: me.maximized ? 1 : 0,
				url: me.url,
				title: me.title,
				icon: me.icon,
				title_status: me.title_status
			},
			method: 'GET',
			success: function(){
				collapsed_before_save = me.collapsed;
			}
		});
	}
	
	/**
	 * zmenit bookmark view
	 * @param {bool} value
	 */
	this.changeBokmarkView = function(value){
		if (me.bookmark_view != value) {
			this.getTitleStatus = function(){
				return me.title_status;
			}
			
			me.bookmark_view = value;
			// prepnout na mod zalozek
			if (me.bookmark_view) {
				tab.hide();
				hide();
				bookmark.show();
			}
			// prepnout na mod oken
			else {
				bookmark.hide();
				tab.show();
				show();
			}
			layout.desktopResize();
		}
	}
	
	/**
	 * pozice frame v collection
	 */
	this.getPos = function(){
		var items = book_bar.dd.portal.items.items;
		if (me.bookmark_view) {
			var pos = 0
			for (var len = items.length; len > pos; pos++) {
				if (items[pos].frameId == me.id) {
					me.position = pos;
					return pos;
				}
			}
			return false;
		}
		else {
			return me.position;
		}
	}
}

