// GreenFish base helper library

var TXT_ERROR_UNKNOWN = 'Ootamatu tehniline viga! Vea kordumisel anna sellest teada ' + 'kasutajatugi' + '@nagi.' + 'ee';
var TXT_ERROR_JSON = 'Ootamatu tehniline viga! Vigane vastus serverist. ';
var TXT_ERROR_YUI = 'Ootamatu tehniline viga! YUI liides on laadimata. ';
var TXT_XFORM_LOAD = 'Laeb...';
var TXT_XFORM_POST = 'Üks hetk...';
//var SERVICE_XFORM_URI = '/services/xhtml/';
var SERVICE_XFORM_URI = '/nagi/module_photo_upload.html';

function GF () {
	return {
		UI: {},
		DOM: {},
		RPC: {},
	        classmgr: {},
		session: {},
		screen: {},
		form: {},
		util: {}
	}
}

/* DOM namespace for DOM queries */
GF.DOM = function () {
	return {

		/*	Get single node by its id
			you can pass multiple arguments and get an collection in this case
			you can also pass collection or element itself,
			an single first element or element itself is returned in that case
			*/
		get: function (el) {
			if (arguments.length > 1) {
				collect = [];
				for (var i = 0; i < arguments.length; i++) {
					collect[i] = YAHOO.util.Dom.get(arguments[i].toString());
				}
				return collect;
			} else return (!el[0] || (typeof el == 'string')) ? YAHOO.util.Dom.get(el) : el[0];
		},

		/*	Get child node collection
			*/
		classChildren: function (el, classname) {
			//alert(el);
		},
		
		/*	Get single child element by class name
			*/
		classChild: function (el, classname) {
			if (GF.classmgr.isSet(el, classname))
					return el;
			else {
				for (var i=0; i < el.childNodes.length; i++) {
					if ((el.childNodes[i].nodeType == 1) && (GF.DOM.classChildren(el.childNodes[i], classname) != false)) return el.childNodes[i];
				}
			}
			return false;
		},
		
		/*	Get parent element by class name
			*/
		classParent: function (el, classname) {
			while (el.parentNode) {
				if (GF.classmgr.isSet(el, classname))
					return el;
				el = el.parentNode;
			}
			return null;
		},

		/*	Get parent element by tagname
			*/
		tagParent: function (el, tagname) {
			while (el.parentNode) {
				if (el.tagName.toLowerCase() == tagname)
					return el;
				el = el.parentNode;
			}
			return null;
		}
	};
}();


/**
 * GF util namespace
 * container various shorthand wrappers
 */
GF.util = function () {
	return {
		dump: function (obj) {
			var str = '';
			for (var k in obj) { str += k + ':' + obj[k] + '\n'; }
			return str;
		},
		isFunction: function (obj) {
			return (obj.toString().toLowerCase().indexOf('function') == 0 && obj.toString().lastIndexOf('}') == obj.toString().length-1) ? true : false;
		},
		QueryStrFromArgs: function (obj) {
			var start = (arguments[1]) ? arguments[1] : 0;
			var uri = '';
			for (var i=start; i<obj.length-1; i=i+2) {
				uri += ((uri == '') ? '' : '&') + obj[i] + '=' + obj[i+1];
			}
			/* var uri = '';
			for (key in obj) {
				uri += ((uri == '') ? '' : '&') + key + '=' + obj[key];
			}*/
			return uri;
		}
	}
}();

GF.form = function () {
	return {
		selectbox: {},
		/*	Submit a form while setting elements' values before
			form name or element as first argument
			arbitrary even number of additional arguments to set existing values
			or create new ones
			*/
		create: function() {
			frm = document.createElement('form');
			return frm;
		},
		submit: function (frm, args) {
			var f = GF.DOM.get(frm);
			for (var i=1; i < arguments.length; i=i+2) {
				var el = f.elements[arguments[i]];
				if (el == null) {
					el = document.createElement('input');
					el.type = 'hidden';
					el.name = arguments[i];
					f.appendChild(el);
				}
				el.value = arguments[i+1];
			}
			f.submit();
			return false;
		},
		populate: function (frm) {
			var f = GF.DOM.get(frm);			
			for (var i=1; i < arguments.length; i=i+2) {
				var el = f.elements[arguments[i]];
				if (el == null) {
					el = document.createElement('input');
					el.type = 'hidden';
					el.name = arguments[i];
					f.appendChild(el);
				}
				el.value = arguments[i+1];
			}
			return f;
		}
	}
}();

GF.form.selectbox = function () {
	return {
		createOptions: function (el, data) {
			var sel = GF.DOM.get(el);
			var opt = null;
			var cur = (arguments[2]) ? arguments[2] : null;
			for (var key in data) {
				opt = document.createElement("option");
				opt.appendChild(document.createTextNode(data[key]));
				opt.value = key;
				opt.selected = (key == cur);
				sel.appendChild(opt);
			}
		},
		removeOptions: function (el, empty) {
			var sel = GF.DOM.get(el);
			var idx = (empty) ? 0 : 1;
			while (sel.options.length > idx) {
				sel.removeChild(sel.options[idx]);
			}
		},
		replaceOptions: function (el, data, empty) {
			GF.form.selectbox.removeOptions(el, empty);
			GF.form.selectbox.createOptions(el, data);
		}
	}
}();

/**
 * GF session namespace for managing cookies
 */
GF.session = function () {
	return {
		set: function (name, value, days) {
			if (days)
			{
				var date = new Date();
				date.setTime(date.getTime()+(days*24*60*60*1000));
				var expires = "; expires="+date.toGMTString();
			}
			else var expires = "";
			document.cookie = name+"="+value+expires+"; path=/";
		},
		get: function (name) {
			var nameEQ = name + "=";
			var ca = document.cookie.split(';');
			for(var i=0;i < ca.length;i++)
			{
				var c = ca[i];
				while (c.charAt(0)==' ') c = c.substring(1,c.length);
				if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
			}
			return null;
		},
		remove: function (name) {
			createCookie(name,"",-1);
		}
	}
}();

GF.screen = function () {
	return {
		getViewportWidth: function () {
			return window.innerWidth != null? window.innerWidth: document.documentElement && document.documentElement.clientWidth ? document.documentElement.clientWidth:document.body != null? document.body.clientWidth:null;
			},
		getViewportHeight: function (name) {
			return window.innerHeight != null? window.innerHeight: document.documentElement && document.documentElement.clientHeight ? document.documentElement.clientHeight:document.body != null? document.body.clientHeight:null;
			}
		}
}();

/**
 * GF classMGR namespace
 * for managing multiple node classes runtime
 */
GF.classmgr = function () {
	return {
		//	set class name if it does not exist, remove otherwise
		toggle: function (elm, classItem) {
			var f = function (elm, classItem) {
				return (YAHOO.util.Dom.hasClass(elm, classItem)) ? YAHOO.util.Dom.removeClass(elm, classItem) : YAHOO.util.Dom.addClass(elm, classItem);
			}
			YAHOO.util.Dom.batch(elm, f, classItem, true);
			return false;
		},
		// swap class presence in two nodes
		swap: function (el1, el2, classItem) {
			YAHOO.util.Dom.removeClass(el2, classItem);
			YAHOO.util.Dom.addClass(el1, classItem);
			return true;
		},
		//	set single class item to the node
		attach: function(elm, classItem) {
			return YAHOO.util.Dom.addClass(elm, classItem);
		},
		setStyle: function(elm, styleItem, styleVal) {
			return YAHOO.util.Dom.setStyle(elm, styleItem, styleVal);
		},
		//	return true if class is specified on the node 
		isSet: function(elm, classItem) {
			return YAHOO.util.Dom.hasClass(elm, classItem);
		},
		//	remove single class from node class collection
		remove: function(elm, classItem) {
			return YAHOO.util.Dom.removeClass(elm, classItem);
		},
		// temp - save current class snapshot for later
		saveSnapshot: function(elm, key) {
			if (elm.gf_class_history == null || elm.gf_class_history == "undefined") {
				elm.gf_class_history = new Array();
			}
			elm.gf_class_history[key] = elm.className;
		},
		//	temp - restore saved class snapshot
		restoreSnapshot: function(elm, key) {
			if (elm.gf_class_history[key]) {
				return elm.className = elm.gf_class_history[key];
			}
		},
		//	get node classes as a array
		toArray: function(elm) {
			classStr = (elm.className != 'undefined') ? elm.className : '';
			classArr = (classStr) ? elm.className.split(" ") : new Array();
			return classArr;
		}
	}
}();

/**
 * NAGI UI namespace
 * for user interface library specific functions
 * should use this as a wrapper for common ui actions
 * such as menu switching, module handling, messaging
 */
GF.UI = function () {
	return {
		menu: {
			tabToggle: function (el) { // el - tab link reference or id
				//var c = (arguments[1]) ? arguments[1] : el.hash.substring(1);
				var li = GF.DOM.tagParent(el, 'li');
				if (GF.classmgr.isSet(li, 'selected')) {
					GF.UI.menu.reset( GF.DOM.tagParent(el, 'ul') );
				} else {
					return GF.UI.menu.tabOpenSingle(el);
				}
				el.blur();
				return false;
			},
			isSelected: function (el) { // el - tab link reference or id
				var li = GF.DOM.tagParent(el, 'li');
				return GF.classmgr.isSet(li, 'selected');
			},
			tabOpenSingle: function (el) { // el - tab link reference or id
				//var c = (arguments[1]) ? arguments[1] : el.hash.substring(1);
				var ul = GF.DOM.tagParent(el, 'ul');
				var li = GF.DOM.tagParent(el, 'li');
				GF.UI.menu.reset(ul, el.hash.substring(1));
				try {
					GF.classmgr.remove( GF.DOM.get(el.hash.substring(1)), 'hide' );
				} catch (e) {
					throw new Error('Link hash not found in current document!');
				}
				GF.classmgr.attach(li, 'selected');
				el.blur();
				return false;
			},
			tickToggle: function (el) {
				var container = el.parentNode;
				GF.classmgr.toggle(container, 'on');
				return false;
			},
			reset: function (el) { // el - menu container ul reference or id
				var ul = GF.DOM.get(el);
				var except = arguments[1] ? arguments[1] : '';
				for (var i=0; i<ul.childNodes.length; i++) {
					oli = ul.childNodes[i];
					if ((oli.nodeType==1) && GF.classmgr.isSet(oli, 'selected')) {
						GF.classmgr.remove(oli, 'selected');
						var a = oli.getElementsByTagName('a');
						if (a) {
							try {
								var id = a[0].hash.substring(1);
								if (id != except) {
									GF.classmgr.attach( GF.DOM.get(id), 'hide' );
								} 
							} catch (e) {
								throw new Error('Link hash not found in current document!');
							}
						}
					}
				}
				return true;
			}
		},
		message: {
			create: function (container, stat, message) {
				if (message.length > 0) {
					GF.UI.message.reset(container);
					div = GF.DOM.get(container);
					if (div != null) {
						msg = document.createElement('div');
						h2 = document.createElement('h2');
							GF.classmgr.attach(h2, 'pagemessage');
							GF.classmgr.attach(h2, stat);
						a = document.createElement('a');
							a.href = '#' + container;
							a.onclick = function () { return GF.UI.message.close(a) };
						em = document.createElement('em');
						em.appendChild(document.createTextNode('Sulge'));
						a.appendChild(em);
						h2.appendChild(document.createTextNode(message));
						h2.appendChild(a);
						msg.appendChild(h2);
						div.appendChild(msg);
					}
				}
			},
			close: function (el) {
				msg = GF.DOM.classParent(el, 'pagemessage');
				msg.parentNode.removeChild(msg);
				return false;
			},
			reset: function (container) {
				div = GF.DOM.get(container);
				if (div != null) {
					while (child = div.firstChild) {
						div.removeChild(child);
					}
				}
			}
		},
		module: {
			minimizeToggle: function (el) {
				var f = function(el) {
					moduleElm = GF.DOM.classParent(el, 'module');
					if (moduleElm) {
						var module = moduleElm.id;
						var uri = '/services/json/?act=toggle&module='+module+'&set=';

						if (GF.classmgr.isSet(moduleElm, 'closed'))
						{
							GF.classmgr.remove(moduleElm, 'closed');
							uri = uri + '1';
						}
						else
						{
							GF.classmgr.attach(moduleElm, 'closed');
							uri = uri + '0';
						}

						if ( YAHOO.util.Connect != null)
							var request = YAHOO.util.Connect.asyncRequest( 'GET', uri, {} );
					}
					return false;
				}
				YAHOO.util.Dom.batch(el, f, this, true);
				return false;
			},
			create: function (id) {
			},
			open: function (el) {
			},
			close: function (el) {
				var f = function(el) {
					moduleElm = GF.DOM.classParent(el, 'module');
					if (moduleElm) {
						moduleElm.parentNode.removeChild(moduleElm);
						//todo: check if containing zone is empty. hide in this case
						return false;
					}
				}
				YAHOO.util.Dom.batch(el, f, this, true);
				return false;
			},
			load: function (el) {
				},
			reload: function (el) {
				}
		},
		zone: {},
		general: {
			showHide: function (el) {
				if (arguments.length > 1) {
					if (!arguments[1]) GF.classmgr.attach(el, 'hide');
					else GF.classmgr.remove(el, 'hide');
				} else GF.classmgr.toggle(el, 'hide');
			}
		}
	}
}();

/* Nagi namespace for application specific UI procedures */
Nagi = function () {
	return {
		module: {},
		badges: {},
		actions: {},
		masterpage: {},
		json: {}
	};
};

Nagi.masterpage = {
	toggleSidebar: function (elm) {
		GF.classmgr.toggle(GF.DOM.get('container'), 'compact');
		return false;
	},
	toggleSubheader: function (trigger) {
		var shd = GF.DOM.get('subheader');
		var div = GF.DOM.get(trigger.hash.substring(1));
		var tab = GF.DOM.tagParent(trigger, 'li');
		if (GF.classmgr.isSet(div, 'hide')) {
			GF.classmgr.remove(div, 'hide');
			GF.classmgr.attach(tab, 'selected');
			GF.classmgr.remove(shd, 'hide');
		} else {
			GF.classmgr.attach(div, 'hide');
			GF.classmgr.remove(tab, 'selected');
			if (!Nagi.masterpage.isSubheaders()) GF.classmgr.attach(shd, 'hide');
		}
		return false;
	},
	showSubheader: function (trigger) {
		GF.classmgr.remove(GF.DOM.get(trigger.hash.substring(1)), 'hide');
		GF.classmgr.remove(GF.DOM.get('subheader'), 'hide');
		return false;
	},
	hideSubheader: function (trigger) {
		GF.classmgr.attach(GF.DOM.get(trigger.hash.substring(1)), 'hide');
		if (!Nagi.masterpage.isSubheaders()) GF.classmgr.attach(GF.DOM.get('subheader'), 'hide');
		return false;
	},
	isSubheaders: function () {
		var shd = GF.DOM.get('subheader');
		var cld = shd.getElementsByTagName('p');
		for (var i=0; i < cld.length; i++) {
			if (!GF.classmgr.isSet(cld[i], 'hide')) return true;
		}
		return false;
	}
};

Nagi.actions = {
	current: [],
	toggle: function (trigger) {
		try {
			var args = (arguments[1]) ? arguments[1] : new Object();
			GF.UI.menu.tabToggle(trigger);
			if (GF.UI.menu.isSelected(trigger)) return Nagi.actions.open(trigger, args);
			else return Nagi.actions.close(trigger);
		} catch (e) {
			GF.UI.message.create('messagebox', 'error', ((e.message)?e.message:e));
			return false;
		}
	},
	open: function (trigger) {
		var args = (arguments[1]) ? arguments[1] : new Object();
		var container = (args.container) ? args.container : trigger.hash.substring(1);
		var uri = (args.action) ? args.action : trigger.href;
		var callback = (args.callback) ? args.callback : null;
		if (uri.indexOf('#') > 0) uri = uri.substring(0, uri.indexOf('#'));
		var success = function (r) {
			var module = GF.DOM.get(r.argument.container);
			Nagi.actions.hideStatus(module);
			module.innerHTML = r.responseText;
			if (callback) callback();
		};
		var failure = function (r) {
			var module = GF.DOM.get(r.argument.container);
			Nagi.actions.displayStatus(module, TXT_ERROR_UNKNOWN, 'no');
		};
		var div = GF.DOM.get(container);
		//if (div.childNodes.length == 0) {
		div.innerHTML = '';
		Nagi.actions.displayStatus(div, TXT_XFORM_LOAD);
		if (YAHOO.util.Connect != null) {
			Nagi.actions.current[Nagi.actions.current.length] = YAHOO.util.Connect.asyncRequest(
				'GET', uri, { success:success, failure:failure, argument:{container:container, callback:callback} }
				);
		} else {
			Nagi.actions.displayStatus(div, TXT_ERROR_UNKNOWN, 'no');
		}
		//}
		return false;
	},
	close: function (trigger) {
		var div = GF.DOM.get(trigger.hash.substring(1));
		return false;
	},
	tickRequest: function (trigger, uri) {
		var success = function (r) { GF.UI.menu.tickToggle(r.argument.trigger); GF.UI.message.create('messagebox', 'confirm', r.responseText); /*trigger.blur();*/ };
		var callback = (arguments[2]) ? arguments[2] : {success:success, argument:{trigger:trigger}};
		if (!callback.success) callback.success = success;
		var args = (arguments[3]) ? arguments[3] : null;
		Nagi.actions.requestGET(uri, callback, args);
		return false;
	},
	requestGET: function (uri) {
		var success = function (r) { GF.UI.message.create('messagebox', 'confirm', r.responseText); };
		var failure = function (r) { GF.UI.message.create('messagebox', 'error', r.responseText); };
		try {
			var args = (arguments[2]) ? arguments[2] : new Array();
			var request = uri + '?' + GF.util.QueryStrFromArgs(args);
			var callback = (arguments[1]) ? arguments[1] : {success:success, failure:failure};
			if (!callback.success) callback.success = success;
			if (!callback.failure) callback.failure = failure;
			Nagi.actions.current[Nagi.actions.current.length] = YAHOO.util.Connect.asyncRequest( 'GET', request, callback); 
		} catch (e) {
			GF.UI.message.create('messagebox', 'error', ((e.message)?e.message:e));
		}
		return false;
	},
	requestPostSuccess: function (r) {
		if (Nagi.JSON.responseCode(r.responseText) >= 0) {
			//alert(r.responseText);
			if (r.argument.redirect) {
				//document.location.href = r.argument.redirect + '?' + Nagi.JSON.varCode + '=' + Nagi.JSON.responseCode(r.responseText);
				document.location.href = r.argument.redirect;
			} else {
				if (r.argument.container) {
					Nagi.actions.hideStatus(r.argument.container);
					if (r.argument.form.onreset) r.argument.form.onreset();
				}
				GF.UI.message.create(r.argument.messagebox, 'confirm', Nagi.JSON.responseMessage(r.responseText) );
			}
		} else {
			Nagi.actions.requestPostFailure(r);
		}
	},
	requestPostFailure: function (r) {
		//Nagi.actions.hideStatus(r.argument.container);
		Nagi.actions.displayStatus(r.argument.container, Nagi.JSON.responseMessage(r.responseText), 'error');
		//alert(r.responseText);
		// Todo: display error message inside form instead of general page message!!!
		//GF.UI.message.create(r.argument.messagebox, 'error', Nagi.JSON.responseMessage(r.responseText) );
	},
	requestPOST: function (frm) {
		try {
			//var f = GF.DOM.get(frm);
			var parameter = (arguments[1]) ? arguments[1] : {};
			var argument = {
				action: (parameter.action) ? parameter.action : frm.action,
				redirect: (parameter.redirect) ? ((frm.elements.redirect && frm.elements.redirect.value) ? frm.elements.redirect.value : parameter.redirect) : null,
				container: (parameter.container) ? parameter.container : GF.DOM.classParent(frm, 'actionform'),
				messagebox: (parameter.messagebox) ? parameter.messagebox : 'messagebox',
				form: frm
				};
			var callback = {
				success: (parameter.success) ? parameter.success : Nagi.actions.requestPostSuccess,
				failure: (parameter.failure) ? parameter.failure : Nagi.actions.requestPostFailure,
				argument: argument
				};
			if (argument.container) Nagi.actions.displayStatus(argument.container, TXT_XFORM_POST);
			/*if (arguments[2]) {
				frm.action = frm.action + '?' + GF.util.QueryStrFromArgs(arguments[2]);
			}
			if (parameter.action) {
				
			}*/
			frm.action = argument.action;
			YAHOO.util.Connect.setForm(frm);
			Nagi.actions.current[Nagi.actions.current.length] = YAHOO.util.Connect.asyncRequest( frm.method.toUpperCase(), frm.action, callback); 
		} catch (e) {
			GF.UI.message.create(argument.messagebox, 'error', e.message);
			return true;
		}
		return false;
	},
	displayStatus: function (module, message) {
		//var module = GF.DOM.get(module);
		var module = YAHOO.util.Dom.get(module);
		if (module != null) {
			//var e = module.childNodes;
			Nagi.actions.hideStatus(module);
			d = document.createElement('div');
			d.appendChild( document.createTextNode(message) );
			d.className = 'status';
			module.insertBefore(d, module.firstChild);
			if (arguments[2]) {
				GF.classmgr.attach(d, arguments[2]);
			} else d.className = 'status';
		}
	},
	hideStatus: function (module) {
		//var m = GF.DOM.get(module);
		var module = YAHOO.util.Dom.get(module);
		if (module != null) {
			var div = module.firstChild;
			if (div != null && div.nodeType == 1) {
				if (GF.classmgr.isSet(div, 'status')) module.removeChild(div);
			}
		}
	},
	loadPage: function (trigger) {
		document.location.href = trigger.href;
	}
};

Nagi.module = {
	toggle: function (el) {
		GF.UI.module.minimizeToggle(el);
		return false;
	}
};

Nagi.badges = {
	add: function (name, rows) {
		var extr = (arguments[2]) ? arguments[2] : 0;
		opts = { name: name, rows: rows, extr: extr };
		YAHOO.util.Event.addListener(window, 'load', Nagi.badges.displayUpdate, opts, false );
		YAHOO.util.Event.addListener(window, 'resize', Nagi.badges.displayUpdate, opts, false );
	},
	displayUpdate: function (e, o) {
		name = o.name;
		rows = o.rows;
		holder = GF.DOM.get(name);
		if (holder == null)
				return;
		badges = holder.getElementsByTagName('a');
		if (badges.length == 0)
				return;
		var count = parseInt(holder.offsetWidth / badges[0].offsetWidth);
		if (count == 0)
				return;
		if (rows > 1) count = count * rows;
		var topoffset = badges[0].offsetTop;
		var currow = 1;
		for (var i=1; i < badges.length; i++) {
			p = badges[i].parentNode;
			if (p == null)
				break;
			if (i < count) {
				GF.classmgr.remove(p, 'hide');
				if (badges[i].offsetTop > topoffset) {
					if (currow < rows) {
						topoffset = badges[i].offsetTop;
						currow++;
					} else {
						GF.classmgr.attach(p, 'hide');
					}
				}
			} else {
				GF.classmgr.attach(p, 'hide');
			}
		}
	}
};

Nagi.JSON = {
	varMessage: 'NagiStatusMsg',
	varCode: 'NagiStatusCode',
	responseData: function (text) {
		var r = "var d=" + text + ";";
		try {
			eval(r);
		} catch (e) {
			var d = { NagiStatusCode: -1, NagiStatusMsg: TXT_ERROR_UNKNOWN };
		}
		return d;
	},
	responseMessage: function (text) {
		var data = Nagi.JSON.responseData(text);
		return (data[Nagi.JSON.varMessage]) ? data[Nagi.JSON.varMessage] : "";
	},
	responseCode: function (text) {
		var data = Nagi.JSON.responseData(text);
		return (data[Nagi.JSON.varCode]) ? parseInt(data[Nagi.JSON.varCode]) : 0;
	}
};

function Container()
{
        this._parseIframeUrl = function(url) {
                // parse the iframe url to extract the key = value pairs from it
                var ret = new Object();
                var hashParams = url.split('&');
                var param = key = val = '';
                for (i = 0 ; i < hashParams.length - 1 ; i++) {
                        param = hashParams[i];
                        key = param.substr(0, param.indexOf('='));
                        val = param.substr(param.indexOf('=') + 1);
                        ret[key] = val;
                }
                return ret;
        }

        this._getUrlForView = function(view, params) {
                if (view === 'home') {
                        return '/?view=home';
                } else if (view === 'profile') {
                        return '/profile/'+params.username+'/?view=profile';
                } else if (view === 'canvas') {
                        return '/apps/'+params.aid+'/view/?view=canvas';
                } else {
                        return null;
                }
        }

        this.requestNavigateTo = function(view, opt_params) {
                if (GF.DOM.get(this.f) != undefined) {
                        var params = gadgets.container._parseIframeUrl(GF.DOM.get(this.f).src);
                        var url = gadgets.container._getUrlForView(view, params);
                        if (opt_params) {
//                                var paramStr = Object.toJSON(opt_params);
				var paramStr = gadgets.json.stringify(opt_params);
                                if (paramStr.length > 0) {
                                        url += '&appParams=' + encodeURIComponent(paramStr);
                                }
                        }
                        if (url && document.location.href.indexOf(url) == -1) {
                                document.location.href = url;
                        }
                }
        }

	this.setHeight = function(height)
	{
		if (height < 4096)
			GF.classmgr.setStyle(GF.DOM.get(this.f), 'height', height+'px');
	}

	this.setUserPref = function(editToken, name, value)
	{
		// do nothing
	}

	gadgets.rpc.register('resize_iframe', this.setHeight);
	gadgets.rpc.register('requestNavigateTo', this.requestNavigateTo);
	gadgets.rpc.register('set_pref', this.setUserPref);
}

if (window.gadgets)
	gadgets.container = new Container();

function rss_toggle(id)
{
	img = GF.DOM.get('img_'+id);

	if (YAHOO.util.Dom.hasClass('rss_'+id, 'hide'))
	{
		img.src='http://static1.keskus.ee/images/bullet_active.gif';
	}
	else
	{
		img.src='http://static1.keskus.ee/images/bullet_inactive.gif';
	}
	GF.classmgr.toggle(GF.DOM.get('rss_'+id), 'hide');
}

function news_tab(tab)
{
	YAHOO.util.Connect.asyncRequest( 'GET', '/services/xhtml/?module=newsfeed&newstab='+tab, {success:newstab_callback, argument:{container:tab}});
	return false;
}

function newstab_callback(data)
{
	if (data.argument.container == null || data.argument.container == 'undefined')
		data.argument.container = 1;

	var ul = GF.DOM.get('newsfeed_tabs');
	var el = ul.getElementsByTagName('li');
	for(var i = 0; i < el.length; i++)
	{
		oli = el[i];

		if (GF.classmgr.isSet(oli, 'selected'))
			GF.classmgr.remove(oli, 'selected');

		if (i == data.argument.container)
			GF.classmgr.attach(oli, 'selected');
	}

	GF.DOM.get('newsfeed').innerHTML = data.responseText;
}

function new_comment(id)
{
	var el = document.createElement('span');
	el.id = 'comment_'+id;
	el.innerHTML = '<form method="post" onsubmit="return post_comment(this);">Lisa kommentaar:<br/><textarea id="comment_text_'+id+'" name="comment" rows="3" cols="40"></textarea><br/><input type="submit" value="Lisa"><input type="button" value="T&uuml;hista" onclick="cancel_comment('+id+');"><input type="hidden" name="id" value="'+id+'"></form>';

	var row = GF.DOM.get('new_feed_'+id);
	row.appendChild(el);

	GF.DOM.get('comment_text_'+id).focus();
	GF.classmgr.attach('new_feed_comment_'+id, 'hide');
}

function cancel_comment(id)
{
	var el = GF.DOM.get('comment_'+id);
	el.parentNode.removeChild(el);
	GF.classmgr.remove('new_feed_comment_'+id, 'hide');
}

function comment_callback(e)
{
	var row = GF.DOM.get('new_feed_'+e.argument.id);
	var el = document.createElement('span');
	el.innerHTML = e.responseText;
//	el.className = 'feedcomment cb';
	row.appendChild(el);

	cancel_comment(e.argument.id);
}

function post_comment(obj)
{
	YAHOO.util.Connect.asyncRequest( 'POST', '/services/xhtml/?module=feedcomment&id='+obj.id.value, {success:comment_callback, argument:{id:obj.id.value}},'text='+encodeURIComponent(obj.comment.value));
	return false;
}

function preview_success(e)
{
	eval("var d="+e.responseText);
	GF.DOM.get('attach_body').innerHTML = '<div class="actionform" style="padding:5px;"><fieldset><input type="hidden" name="url" value="'+d.url+'"><input type="hidden" name="title" value="'+d.title+'"><input type="hidden" name="description" value="'+d.description+'"><div>'+d.title+'</div><br/><div>'+d.description+'</div><a href="http://'+d.url+'">http://'+d.url+'</a></fieldset></div><label>Lisa oma kommentaar:</label><br/><textarea name="comment" cols="40" rows="5" style="width:80%;"></textarea><input id="comment_submit" type="submit" value="Lisa" style="vertical-align:top;">';
}

function generate_preview(url)
{
	GF.classmgr.remove(GF.DOM.get('preview'), 'hide');
	GF.classmgr.attach(GF.DOM.get('link_input'), 'hide');
	var request = YAHOO.util.Connect.asyncRequest( 'GET', '/services/json/?act=download_url&url='+url, {success:preview_success} );
}

function remove_link()
{
	GF.classmgr.attach(GF.DOM.get('preview'), 'hide');
	GF.classmgr.remove(GF.DOM.get('link_input'), 'hide');
	GF.DOM.get('attach_body').innerHTML = '<img src="/images/spinner.gif">';
}
