var relationselector = function(params) {
	/**
	if(!pickerprops[params.property]) {
		alert('no config found for: ' + params.property);
	}
	*/
	
	//trace('relationselector::' + JSON.stringify(params));
	
	this.config = {
		panelwidth : 250
		, panelheight : 200
		, imgs : {
			toggleplus : '/gfx/icons/bullet_toggle_plus.png',
			toggleminus : '/gfx/icons/bullet_toggle_minus.png',
			addbutton : '/gfx/icons/add.png',
			searchbutton : '/gfx/icons/find.png',
			closebutton : '/gfx/icons/cancel.png',
			deletebutton : '/gfx/icons/delete.png',
			linkbutton : '/gfx/icons/link.png',
			pickthisimage : '/gfx/elements/pick-this.png',
			linkbreakbutton : '/gfx/icons/link_break.png',
			editbutton : '/gfx/icons/pencil.png',
			activityindicator : '/gfx/icons/ajax-loader.gif',
			folder : '/gfx/icons/folder.png',
			vidfolder : '/gfx/icons/folder.png',
			photofolder : '/gfx/icons/folder.png',
			category : '/gfx/icons/folder.png',
			photocat : '/gfx/icons/folder.png',
			vidcat : '/gfx/icons/folder.png',
			videos : '/gfx/icons/folder.png',
			audiocat : '/gfx/icons/folder.png',
		 	zoombutton : '/gfx/icons/zoom.png',
			homebutton : '/gfx/icons/house.png'
		},
		
		showheader : 1,
		autoexpand : 0,
		
		messages : {
			nothingselected : 'No items currently linked'
			, maximumreached : 'You have reached the maximum number of items.  Please remove some to add new ones'
			, selectedtxt : "You've selected"
		}
		
		, type : params.type
		, guid : params.guid
		, minimum : params.minimum
		, maximum : params.maximum
		, node : params.node
	};
	
	this.inventory = {};
	
	this.related = {};
	
	var idata;
	
	for(type in params.related) {
			this.related[type] = {};
			this.inventory[type] = {};
		for(item in params.related[type]) {
			idata = {
				'type' : params.related[type][item].type, 
				'guid' : params.related[type][item].guid, 
				'title' : (params.related[type][item].type == 'module' ? params.related[type][item].modulename : params.related[type][item].title)
				, 'url' : params.related[type][item].url
				, 'created' : params.related[type][item].created
			};
			this.inventory[type][params.related[type][item].guid] = idata;
			this.related[type][params.related[type][item].guid] = idata
		}
	}
	
	this.searchtext = '';
	
	this.containertypes = {
		'photocat' : 1
		//, 'audiocat' : 1
		, 'vidcat' : 1
		, 'videos' : 1
		, 'subject' : 1
		//, 'folder' : 1
		, 'photofolder' : 1
		, 'vidfolder' : 1
		//, 'audiofolder' : 1
	};
	
	this.settings = [];
	
	this.currentlevel = 0;
	
	if(!this.config.type) {
		trace('MISSING REQUIRED PARAM "type"');
		return false;
	}
	
	if(!this.config.guid) {
		trace('MISSING REQUIRED PARAM "guid"');
		//return false;
	}
	
	if(!this.config.node) {
		trace('MISSING REQUIRED PARAM "node"');
		return false;
	}
	
	if(!this.config.node.generation) {
		trace('MISSING REQUIRED PARAM "node.generation"');
		return false;
	}
	
	if(!this.config.node.relation) {
		trace('MISSING REQUIRED PARAM "node.relation"');
		return false;
	}
	
	/**
	if(typeof this.config.node.allowedtype != 'array') {
		this.config.node.allowedtype = [ this.config.node.allowedtype ];
	}
	*/
	if(typeof this.config.node.allowedtype == 'array') {
		this.config.node.allowedtype = this.config.node.allowedtype[0];
	}
	
	
	this.targetelem = params.targetelem;
	this.idx = relpickers.length;
	
	//trace('constructor::related::' + JSON.stringify(this.related));
	
	this.sections = [];
	
	//this.allowedtypes = [];
	
	//trace(this.config.node.allowedtype);
	
	this.init = function() {
		trace('init');
		//trace('init::' + this.idx + '::' + this.targetelem);
		
		var targetdiv = $('#' + this.targetelem);
		var toggler = $('<a></a>').attr({ 
			className : 'pickertoggle'
			, href : 'javascript:void(relpickers[' + this.idx + '].maximize())'
		}).html('<!-- img src="' + this.config.imgs.toggleplus + '" -->[ &darr; ] PICK A ' + this.config.node.objtype.toUpperCase());
		
		//if(this.config.type && this.config.guid && this.config.node.generation == 'children') {
			var pars = {
				"type" : this.config.node.objtype
				, "f_service" : "updateasset"
				, "title" : "CREATE A " + this.config.node.objtype.toUpperCase()
				, "idx" : this.idx
				, "pickerlevel" : 1
			};
			
			pars["extras[cb]"] = "linkItemInPicker";
			pars["extras[picker]"] = this.idx;
			pars["extras[pickerlevel]"] = '';
			
			if(this.config.type && this.config.guid) {
				pars["extras[relation]"] = this.config.node.relation;
				pars["extras[parenttype]"] = this.config.type;
				pars["extras[parent]"] = this.config.guid;
				pars["f_service"] = "createchild";
			}
			
			var adder = $('<a></a>').attr({
				'style' : 'float:right'
			}).html('[+] CREATE A ' + this.config.node.objtype.toUpperCase());
			adder.bind('click', pars, function(e) {
				//trace('CLICK  ON ADDER::' + JSON.stringify(e.data));
				relpickers[e.data.idx].edititem(e.data);
			});
			targetdiv.append(adder);
		//}		
		
		//toggler.bind('click', this.maximize());
		targetdiv.append(toggler);
		
		if(this.config.showheader == 1) {
			var header = $('<div></div>').attr('className', 'picker_column_header');
			targetdiv.append(header);
		}
		
		var tbl = $('<table></table>').attr(
			{
				
				cellspacing : 0
				, cellpadding : 0
				, border : 0
			}
		//).html('<tr><td class="home"></td></tr>');
		).html('<tr></tr>');
		/**
		var maincell = $('<td></td>').attr({
			'class' : 'home'
			//, style : 'float:left;width:' + this.config.panelwidth + 'px;height:' + (this.config.panelheight + 20) + 'px;background-color:#888;padding:2px'
		});
		
		tbl.append(maincell);
		*/
		
		var relitems = $('<ul></ul>').attr('className', 'relateditems');
		
		var inlinepicker = $('<div></div>').attr('className', 'inlinepicker');
		inlinepicker.css('background-color', '#ddeff7');
		
		inlinepicker.append(tbl);
		
		targetdiv.append(inlinepicker);
		targetdiv.append(relitems);
		
		this.updaterelateditems();
		
		if(this.config.autoexpand == 1) {
			this.maximize();
		}
		
		return;
	};
	
	this.fillfirstsection = function() {
		//trace('fillfirstsection::' + JSON.stringify(this.config.node));
		var iargs = {
			idx : params.idx
			, pickerlevel : 0
			, generation : 'children'
			, service : 'getrelateditems'
			, nocache : 1
		};
	
		var div = this.initsection({pickerlevel : 0});
		
		var p = $('<p>').html('Find a ' + this.config.node.objtype + ':');
		
		//div.append(p);
		
		var ul = $('<ul></ul>');
		ul.css('width', (this.config.panelwidth) + 'px');
		ul.css('height', '100%');
		ul.css('background-color', '#fff');
		
		var targetOffset = div.offset().left;
		if($('#' + this.targetelem + ' .inlinepicker').offset().left != targetOffset) {
			$('#' + this.targetelem + ' .inlinepicker').animate({scrollLeft: targetOffset}, 500);
		}
		
		vars = [];
		this.settings[0] = {};
		this.arttypes = ['Behind The Blog', 'Games and Widgets', 'Media', 'Featured Article', 'Five In Focus', 'People In Film', 'Movie City', 'Film News', 'Film Week', 'Flashback', 'Great Directors', 'Faber Library', 'Faber Projections Exclusives', 'Faber Projections Archives'];
		
		switch(this.config.node.objtype) {
			
			case 'photo':				 
			case 'video':
			case 'blog':
			
				//trace('fillfirstsection::default case');
				if(jQuery.inArray(this.config.type, adminrights) != -1) {
					vars = [
						{ 'type' : 'account', 'label' : 'by user' },
						{ 'type' : 'film', 'label' : 'by film'},
						{ 'type' : 'article', 'label' : 'by article'},
						{ 'type' : 'blog', 'label' : 'by blog'}
					];
					
					if(this.config.node.objtype == 'video') {
						vars.push({ 'type' : 'vidfolder', 'label' : 'by folder' });
					} else if(this.config.node.objtype == 'photo') {
						vars.push({ 'type' : 'photofolder', 'label' : 'by folder' });
					}
					
					/**
					for(i=0;i < this.arttypes.length; i++) {
						vars.push({
							'type' : 'article', 
							'label' : 'BY ' + this.arttypes[i].toUpperCase(),
							'criteria' : this.arttypes[i].toUpperCase()
						});
					}
					*/
					
				}
				
				var li = $('<li></li>');
				var a = $('<a></a>').attr({
					//'href' : '#'
				}).html('MY ' + this.config.node.objtype.toUpperCase() + 'S');
				a.bind('click', {'picker' : this, 'type' : ''}, function(e) {
					var pars = {
						idx : e.data.picker.idx,
						pickerlevel : 1,
						service : 'search',
						type : e.data.picker.config.node.objtype,
						'parents[has][0][parenttype]' : 'account',
						'parents[has][0][parent]' : suser, //page level var
						'parents[has][0][relation]' : 'owner',
						sortkey : (e.data.picker.config.node.objtype == 'module' ? 'modulename' : 'title'),
						sortorder : 'asc',
						numrows : 20,
						nocache : 1
					};
					e.data.picker.fillsection(pars);
				});
				li.append(a);
				ul.append(li);
				
				break;
			
			default:
				trace('RelationSelector::Vars::Default Case');
				vars = [
					{ 
						'type' : this.config.node.objtype, 
						'label' : this.config.node.objtype,
						'criteria' : this.config.node.criteria,
						'parents' : this.config.node.parents,
						'children' : this.config.node.children
					}
				];
			
		}
		
		
		
		for(i=0; i < vars.length; i++) {
			//trace('RelationSelector::Vars::' + JSON.stringify(vars[i]));
			var li = $('<li></li>');
			var a = $('<a></a>').attr({
				//'href' : '#'
			}).html(vars[i].label.toUpperCase());
			a.bind('click', {'picker' : this, 'type' : vars[i].type, 'node' : vars[i] }, function(e) {
				
				//trace('RelationSelector::click::' + JSON.stringify(e.data.node));
				
				var pars = {
					idx : e.data.picker.idx
					, pickerlevel : 1
					, service : 'search'
					, type : e.data['type']
					, sortkey : (e.data.picker.config.node.objtype == 'module' ? 'modulename' : 'title')
					, sortorder : 'asc'
					, nocache : 1
					, numrows : 20
				};
				
				if(e.data.node.parents) {
					trace('relationselector::parents::' + e.data.node.parents);
					//pars.parents = {};
					if(e.data.node.parents.has) {
						i=0;
						for(r in e.data.node.parents.has) {
							//trace('relationselector::parents row::' + JSON.stringify(e.data.node.parents.has[r]));
							
							for(p in e.data.node.parents.has[r]) {
								if(e.data.node.parents.has[r][p] === undefined || e.data.node.parents.has[r][p] === '') {
									continue;
								}
								str = 'parents[has][' + i + '][' + p + ']';
								trace('relationselector::parents row::' + str);
								pars[str] = e.data.node.parents.has[r][p];
							}
							i++;
						}
					}
				}
				
				e.data.picker.fillsection(pars);
			});
			
			li.append(a);
			
			if(vars[i].type == 'article') {
				
				m = '<select name="arttypes' + this.idx + '" onchange="relpickers[' + this.idx + '].chooseArticleType(this)">';
					
				for(j=0;j < this.arttypes.length; j++) {
					m += '<option value="' + this.arttypes[j] + '">' + 'BY ' + this.arttypes[j].toUpperCase() + '</option>';
				}
				m += '</select>';
				li.append('&nbsp;' + m);
			}
			
			ul.append(li);
		}
		
		div.append(ul);
		//div.append(footer);
		
		//alert(relpickers[_args.idx].sections[_args.pickerlevel]);
		
		//_args.elem = this.sections[0];
		_pars = {
			'json' : {
				'type' : this.config.node.allowedtype
				, 'title' : 'Pick a ' + this.config.node.allowedtype
			}
			, 'pickerlevel' : 0
		}
		this.updateheader(_pars);
		return true;
	
		return;
			
	}
	
	this.fillfirstsections = function() {
		//trace('fillfirstsection::');
		var div = this.initsection({pickerlevel : 0});
		
		var _args = {};
		
		if(this.config.node.context.assetlist) {
		
			_args = {
				'nocache' : 1
				, 'service' : 'search'
				, 'output_format' : 'json'
				, 'type' : this.config.node.context.assetlist.type
		
				/**
				, 'criteria[0][fld]' :'status'
				, 'criteria[0][operator]' : '='
				, 'criteria[0][value]' : 'public'
				*/
			
				, 'sortkey' : (this.config.node.objtype == 'module' ? 'modulename' : 'title')
				, 'sortorder' : 'asc'
				, 'numrows' : 20
			
				, 'idx' : this.idx
				, 'pickerlevel' : 0
			};
			
			i=0;
			for(criteria in this.config.node.context.assetlist) {
				if(criteria != 'criteria') {
					continue;
				}
				
				if(this.config.node.context.assetlist[criteria].conjunction) {
					_args['criteria[' + i + '][conjunction]'] = this.config.node.context.assetlist[criteria].conjunction;
				}
				
				_args['criteria[' + i + '][fld]'] = this.config.node.context.assetlist[criteria].field;
				_args['criteria[' + i + '][operator]'] = this.config.node.context.assetlist[criteria].operator;
				_args['criteria[' + i + '][value]'] = this.config.node.context.assetlist[criteria].value;
				
				i++;
			}
		
		} else if(this.config.node.context.asset) {

			_args = {
				'nocache' : 1
				, 'service' : 'getasset'
				, 'output_format' : 'json'
				, 'type' : this.config.node.context.asset.type
				
				//LATER THIS BECOMES SMARTER, E.G. 'SELF', etc
				, 'guid' : this.config.node.context.asset.id

				/**
				, 'criteria[0][fld]' :'status'
				, 'criteria[0][operator]' : '='
				, 'criteria[0][value]' : 'public'
				*/

				, 'sortkey' : (this.config.context.assetlist.type == 'module' ? 'modulename' : 'title')
				, 'sortorder' : 'asc'
				, 'numrows' : 1000
				
				, 'idx' : this.idx
				, 'pickerlevel' : 0

			};

		} else if(this.config.node.context.relationship) {

			_args = {
				'nocache' : 1
				, 'service' : 'getrelateditems'
				, 'output_format' : 'json'
				, 'itemtype' : this.config.node.context.relationship.itemtype

				//LATER THIS BECOMES SMARTER, E.G. 'SELF', etc
				, 'itemid' : this.config.node.context.relationship.itemid

				, 'sortkey' : (this.config.context.assetlist.type == 'module' ? 'modulename' : 'title')
				, 'sortorder' : 'asc'
				, 'numrows' : 1000
				, 'type' : ''

				, 'idx' : this.idx
				, 'pickerlevel' : 0
				
			};
			
			for(type in this.config.node.allowedtypes) {
				_args.type += params.type.length > 0 ? ', ' + this.config.node.allowedtypes[type] : this.config.node.allowedtypes[type];
			}
			
			for(type in this.containertypes) {
				_args.type += params.type.length > 0 ? ', ' + this.containertypes[type] : this.containertypes[type];
			}
			
			//trace('getrelateditems::' + _args.type);
			
			
			if(this.config.node.context.relationship.generation) {
				_args.generation = this.config.node.context.relationship.generation;
			}
			
			if(this.config.node.context.relationship.relation) {
				_args.relation = this.config.node.context.relationship.relation;
			}
			
			if(this.config.node.context.relationship.status) {
				_args.status = this.config.node.context.relationship.status;
			}
			
			if(this.config.node.context.relationship.relstatus) {
				_args.relstatus = this.config.node.context.relationship.relstatus;
			}
			
		}
		
		
		/**
		var homelink = $('<a></a>').attr({
			onclick : 'void(relpickers[' + this.idx + '].fillsection(' + JSON.stringify(_args) + '))'
			, style : 'cursor:pointer'
		}).html('<img src="' + this.config.imgs.homebutton + '" />');
		
		$('#' + this.targetelem + ' td.home').append(homelink);
		*/
		
		this.settings[0] = _args;
		
		$.getJSON(baseurl, _args, function(json) {	relpickers[_args.idx].displayresults(_args, json); });
	}
	
	this.maximize = function() {
		trace('maximize');
		
		$('#' + this.targetelem + ' .pickertoggle').attr('href', 'javascript:void(relpickers[' + this.idx + '].minimize());');
		$('#' + this.targetelem + ' .pickertoggle').html('<!-- img src="' + this.config.imgs.toggleminus + '" -->[ &uarr; ] PICK A ' + this.config.node.objtype.toUpperCase());
		
		if(!this.sections[0]) {
			this.fillfirstsection();
		}
		
		//trace('maximize::' + $('#' + this.targetelem).html());
		
		$('#' + this.targetelem + ' div').slideDown(500);
		
	};
	
	this.minimize = function() {
		trace('minimize');

		$('#' + this.targetelem + ' div').slideUp(500);
		$('#' + this.targetelem + ' .pickertoggle').attr('href', 'javascript:void(relpickers[' + this.idx + '].maximize());');
		
		$('#' + this.targetelem + ' .pickertoggle').html('<!-- img src="' + this.config.imgs.toggleplus + '"-->[ &darr; ] PICK A ' + this.config.node.objtype.toUpperCase());
		
		kids = $('#' + this.targetelem + ' .inlinepicker table > tbody > tr').children('td');
		kids.each(function() {
			cls = $(this).attr('className');
			trace('minimize::cls' + cls);
			level = cls.split('_');
			level = level[1];
			if(level != '0') {
				$(this).remove();
			}
		});
		
	};
	
	this.updaterelateditems = function() {
		
		trace('updaterelateditems');
		
		$('#' + this.targetelem + ' .relateditems').empty();
		
		var relcount = 0;
		for(type in this.related) {
			//trace('updaterelateditems::' + type);
			for(item in this.related[type]) {
				relcount++;
			}
		}
		
		var i=0;
		for(type in this.related) {
			//trace('updaterelateditems::' + type);
			for(item in this.related[type]) {
				//trace('updaterelateditems::item::' + JSON.stringify(item));
				params = {
					type : type
					, item : item
					, sortkey : i
					, total : relcount
				};
				this.displayselectediteminlist(params);
				i++;
			}
		}
		
		if(relcount == 0) {
			$('#' + this.targetelem + ' .relateditems').html('<li>' + this.config.messages.nothingselected + '</li>');
		}
		
	}
	
	this.initsection = function(params) {
		trace('initsection');
		
		//If it exists don't make it
		if(!relpickers[this.idx].sections[params.pickerlevel]) {
			//trace('initsection::Making section');
			var div = $('<td></td>').attr('className', 'level_' + params.pickerlevel);
		} else {
			//trace('initsection::Have section');
			div = this.sections[params.pickerlevel];
		}
		
		//remove all filled sections after it
		//$('#' + this.targetelem + ' .level_' + params.pickerlevel + ' ~ td').remove();
		
		tds = $('#' + this.targetelem + ' .inlinepicker table td');
		for(i=0;i<tds.length;i++) {
			//trace('initsection::' + JSON.stringify(tds[i]));
			if(i > params.pickerlevel) {
				$(tds[i]).remove();
			}
		}
		
		if(params.pickerlevel > 0) {
			div.css('width', this.config.panelwidth + 'px');
			div.css('height', this.config.panelheight + 'px');
		}
		//Clear out contents of this div
		div.empty();
		
		$('#' + this.targetelem + ' table tr').append(div);
		
		this.sections[params.pickerlevel] = div;
		
		return div;
	};
	
	this.chooseArticleType = function(elem) {
		
		var ppars = {
			idx : this.idx
			, pickerlevel : 1
			, service : 'search'
			, type : 'article'
			, sortkey : 'title'
			, sortorder : 'asc'
			, nocache : 1
			, numrows : 20
			, 'criteria[0][fld]' :'displaytype'
			, 'criteria[0][operator]' : '='
			, 'criteria[0][value]' : elem.options[elem.selectedIndex].value
		};
		
		this.fillsection(ppars);
		
	}
	
	this.search = function(params) {
		
		trace('search');
		
		params.service = 'search';
		params.idx = this.idx;
		params.pickerlevel = 1;
		params.type = typeof this.config.node.allowedtype == 'array' ? this.config.node.allowedtype[0] : this.config.node.allowedtype;
		params.searchtext = $('#' + this.targetelem + ' input.pickersearch').attr('value');
		this.searchtext = params.searchtext;
		this.fillsection(params);
		
	}
	
	this.refreshsection = function(idx) {
		
		trace('refreshsection');
		
		params = this.settings[idx];
		
		if(this.settings[idx].service == 'getasset') {
			//trace('refreshsection::' + idx-1 + '::Getting previous pane');
			if(this.fillsection(this.settings[idx-1])) {
				return this.fillsection(params);
			}
		} else {
			return this.fillsection(params);
		}
	}
	
	this.fillsection = function(params) {
		//trace('fillsection::' + JSON.stringify(params));
		
		$('#' + this.targetelem + ' .picker_column_header').append('<p><img src="' + this.config.imgs.activityindicator + '" /></p>');
		
		if(params.service != 'getasset') {
		//Dont store settings for gettasset fallback
			this.settings[params.pickerlevel] = params;
		}
		//var prog = '<img src="' + this.config.imgs.activityindicator + '" />';
		//$('#' + div.attr('id') + ' p + p').html(prog);	
		
		if(params.service == 'getrelateditems') {
			params.type = '';
			for(i=0; i < this.config.node.allowedtype.length; i++) {
				params.type += params.type.length > 0 ? ', ' + this.config.node.allowedtype[i] : this.config.node.allowedtype[i];
			}
			
			//for(i=0; i < this.containertypes.length; i++) {
			for(i in this.containertypes) {
				params.type += params.type.length > 0 ? ', ' + i : i;
			}
			
			switch(this.config.node.objtype) {

				case 'photo':
					if(params.itemtype != 'photofolder') {
						params.type = 'photofolder';
					} else {
						params.type = 'photo';
					}
					break;

				case 'video':
					if(params.itemtype != 'vidfolder') {
						params.type = 'vidfolder';
					} else {
						params.type = 'video';
					}
					break;

				default:
					params.type = this.config.node.objtype;
					break;
			}
		}
		
	
		
		var _args = params;
		//_args.service = 'getrelateditems';
		_args.output_format = 'json';
		
		
		$.getJSON(baseurl, _args, function(json) {	relpickers[_args.idx].displayresults(_args, json); });
		
	};
	
	this.displayiteminpicker = function(params) {
			trace('displayiteminpicker');
			
			if(!this.inventory[params.json.type]) {
				this.inventory[params.json.type] = {};
			}
			
			//ADD ITEM TO INVENTORY
			this.inventory[params.json.type][params.json.guid] = {
				'type' : params.json.type
				, 'guid' : params.json.guid
				, 'url' : params.json.url
				, 'created' : params.json.created
				, 'title' : (params.json.type == 'module' ? params.json.modulename : params.json.title)
				//, 'description' : params.json.description
			};
			
			//trace('displayiteminpicker::' + JSON.stringify(this.inventory[params.json.type][params.json.guid]));
		
			
			iargs = {
				idx : params.idx
				, pickerlevel : params.pickerlevel + 1
				, itemtype : params.json.type
				, itemid : params.json.guid
				, title : (params.json.type == 'module' ? params.json.modulename : params.json.title)
				, url : params.json.url
				, generation : 'children'
				, service : 'getrelateditems'
				, nocache : 1
			};
			
			var cls = params.json.type + '_00_' + this.idx + '_00_' + params.json.guid;
			
			var li = '<li class="' + cls + '">';

			//TEST IF IT'S A TYPE I CAN LINK TO
			if(params.json.guid && params.json.type == this.config.node.objtype && jQuery.inArray(params.json.type, adminrights) != -1) {
				//trace('displayiteminpicker::' + this.idx + '::' + params.json.title + '::Is inArray');
				
				//If it's already related, unlink it 
				if(this.related[params.json.type] && this.related[params.json.type][params.json.guid]) {
					ipars = {
						//guid : params.json.guid
						type : params.json.type
						//, title : escape(params.json.title)
						, item : params.json.url
						//, idx : this.idx
						//, pickerlevel : params.pickerlevel
					};

					//var strpars = JSON.stringify(ipars, function(key, value) { return this[key] : escape(value); });

					//strpars = JSON.stringify(ipars);
					
					li += '<a class="'+ cls + '_00_link" href="javascript:;" onclick="relpickers[' + this.idx + '].unlinkitem({ type : \'' + params.json.type  + '\', item : \'' + params.json.url + '\'});">';

					li += '<img src="' + this.config.imgs.linkbreakbutton + '" />';
					
					li += '</a>';
					
				} else {
				//Draw linking button
					ipars = {
						guid : params.json.guid
						, type : params.json.type
						, title : escape(params.json.title)
						, url : escape(params.json.url)
						, idx : this.idx
						, pickerlevel : params.pickerlevel
					};
					
					//strpars = JSON.stringify(ipars);
					
					li += '<a class="'+ cls + '_00_link" href="javascript:;" onclick="relpickers[' + this.idx + '].linkitem({ type : \'' + params.json.type  + '\', item : \'' + params.json.guid + '\'});">';

					li += '<img src="' + this.config.imgs.linkbutton + '" />';
					
					li += '</a>';
				}
			}
			
			//trace('displayiteminpicker::' + this.idx + '::' + params.json.title + '::Finished inArray');
			params.dimension = '30';
			mrkup = '';
			
			if(jQuery.inArray(params.json.type, adminrights) != -1 && params.json.guid) {
				li += '<a href="javascript:void(relpickers[' + this.idx + '].edititem({ title : \'' + escape(params.json.title)  + '\', type : \'' + params.json.type  + '\', url : \'' + params.json.url + '\', \'extras[cb]\' : \'refresh\' }));" style=""><img src="' + this.config.imgs.editbutton + '" /></a>';
			}
			
			li += this.getitemimage(params);
			
			//trace('displayiteminpicker::' + this.idx + '::' + params.json.title + '::Finished Type Switch');
			
			var origtitle = params.json.type == 'module' ? params.json.modulename : params.json.title;
			var title = origtitle.substring(0,20).toUpperCase();
			if(origtitle.length > 20) {
				title += '...';
			}
			
			strargs = JSON.stringify(iargs);
			strargs = strargs.replace("'", "&apos");
			
			li += '<a class=\'' + cls + '\' href=\'javascript:;\' onclick=\'relpickers[' + params.idx  + '].fillsection(' + strargs + ');\'>' + title + '</a>';
			
			li += '</li>';
		
		return li;
		
	}
	
	this.getitemimage = function(params) {
	
		trace('getitemimage');
	
		var mrkup = '';
		switch(params.json.type) {

			case 'video':
				//mrkup += '<img src="/uploads/image/video/' + params.json.guid + '/' +  params.dimension + 'x' + params.dimension + '.jpg" />';
				mrkup += '<img src="/' + params.json.type + '/' + params.json.url + '/showimage?field=video&width=' +  params.dimension + '&height=' + params.dimension + '" />';
				break;

			case 'article':
			case 'castncrew':
				mrkup += '<img src="/' + params.json.type + '/' + params.json.url + '/showimage?field=leadphoto&width=' +  params.dimension + '&height=' + params.dimension + '" />';
				break;
			
			case 'film':
			case 'blog':	
			case 'photo':
			case 'promo':
				//mrkup += '<img src="/uploads/image/mediafile/' + params.json.guid + '/' + params.dimension + 'x' + params.dimension + '.jpg" />';
				mrkup += '<img src="/' + params.json.type + '/' + params.json.url + '/showimage?field=mediafile&width=' +  params.dimension + '&height=' + params.dimension + '" />';
				break;
			case 'account':
				//mrkup += '<img src="/uploads/image/photo/' + params.json.guid + '/' + params.dimension + 'x' + params.dimension + '.jpg" />';
				mrkup += '<img src="/' + params.json.type + '/' + params.json.url + '/showimage?field=photo&width=' +  params.dimension + '&height=' + params.dimension + '" />';
				break;
			case 'widget':
			
				mrkup += '<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,40,0" WIDTH="' + params.dimension + '" id="' + params.json.type + '_' + params.json.guid + '">';
				mrkup += '<PARAM NAME="movie" VALUE="/uploads/image/mediafile/' + params.json.guid + '/full.swf">';
				mrkup += '<PARAM NAME=quality VALUE=high><PARAM NAME=bgcolor VALUE=#FFFFFF>';
				mrkup += '<EMBED src="/uploads/image/mediafile/' + params.json.guid + '/full.swf" quality=high bgcolor=#FFFFFF WIDTH="' + params.dimension + '" HEIGHT="' + params.dimension + '" NAME="' + params.json.type + '_' + params.json.guid + '" ALIGN="" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"></EMBED>';
				mrkup += '</OBJECT>';
			
				//mrkup += '<img src="/uploads/image/mediafile/' + params.json.guid + '/' + params.dimension + '.jpg" />';
				break;
			
			default:
				
				if(this.config.imgs[params.json.type] !== undefined) {
					mrkup += '<img src="' + this.config.imgs[params.json.type] + '" />';
				}
				
				break;
		}
		
		return mrkup;
	}
	
	this.displayresults = function(_args, json) {
		trace('displayresults');
		if(typeof _args.type == 'array') {
			_args.type = _args.type[0];
		}
		
		//trace('displayresults::' + JSON.stringify(_args) + '::' + JSON.stringify(json));
						
		var ul = $('<ul></ul>');
		ul.css('width', this.config.panelwidth + 'px');
		ul.css('height', this.config.panelheight + 'px');
		ul.css('background-color', '#fff');

		var div = this.initsection({pickerlevel : _args.pickerlevel});
		
		var targetOffset = div.offset().left;
		if($('#' + this.targetelem + ' .inlinepicker').offset().left != targetOffset) {
			$('#' + this.targetelem + ' .inlinepicker').animate({scrollLeft: targetOffset}, 500);
		}
	
		var mrkup = '';
		var iargs = {};
		var strargs = {};
		var _pars = {};
	
		//this.currentlevel = _args.pickerlevel;
	
		if(json[_args.service] != 1) {
			// this.raiseError(unescape(json.err));
			trace(json.err);
		}
	
		switch(_args.service) {
			
			case 'search':
				length = json.results.length;
			
				if(json.results.length > 0) {

					for(i=0;i < json.results.length;i++) {
				
						_args.json = json.results[i];
						
						//mrkup += this.displayiteminpicker(_args);
						ul.append(this.displayiteminpicker(_args));
						
					}						
				} else {
					if(_args['parents[has][0][parenttype]'] && _args['parents[has][0][parent]']) {
						iargs = {
							type : _args['parents[has][0][parenttype]']
							, guid : _args['parents[has][0][parent]']
							, service : 'getasset'
							, nocache : 1
							, idx : _args.idx
							, pickerlevel : _args.pickerlevel
						};
						relpickers[_args.idx].fillsection(iargs);
					} else {
						mrkup += '<li>NO ' + _args.type.toUpperCase() + 'S FOUND' + '</li>';
					}
					//_args.type = iargs.type;
				}
				
				//$('#' + relpickers[_args.idx].targetelem + ' .picker_column_header').html( _args.type.toUpperCase());
				 
				_pars = {
					json : { 
						title : _args.type
						, type : _args.type
					}	
					, service : _args.service
					, idx : _args.idx
					, pickerlevel : _args.pickerlevel 
				};
				
				break;
			
			case 'getrelateditems':
			
				length = json.results.raw ? json.results.raw.length : 0;
			
				if(length > 0) {

					for(i=0;i < json.results.raw.length;i++) {
						
						_args.json = json.results.raw[i];
						
						//mrkup += this.displayiteminpicker(_args);
						ul.append(this.displayiteminpicker(_args));
					}						
				} else {
					iargs = {
						type : _args.itemtype
						, guid : _args.itemid
						, service : 'getasset'
						, nocache : 1
						, idx : _args.idx
						, pickerlevel : _args.pickerlevel
						
					}
					relpickers[_args.idx].fillsection(iargs);
				}
				
				_pars = {
					json : {
						type : _args.itemtype
						, guid : _args.itemid
						, title :_args.title
						, url : _args.url
					}
					, service : _args.service
					, idx : _args.idx
					, pickerlevel : _args.pickerlevel
				}
				
				break;
			
			case 'getasset':
			
				length  = 1;
			
				_pars = {
					json : json
					, service : _args.service
					, idx : _args.idx
					, pickerlevel : _args.pickerlevel
				};
				
			
				//alert(JSON.stringify(json));
				
				//trace(json.type + '::' + relpickers[_args.idx].allowedtypes);
				
				/**
				if(jQuery.inArray(json.type, relpickers[_args.idx].allowedtypes)) {
					//trace('ALLOWED::' + json.type);
				}
				*/
				
				mrkup += '<li class="previewtitle">' + (json.type == 'module' ? json.modulename.toUpperCase() : json.title.toUpperCase()) + '</li>';
				
				mrkup += '<li>';
				
				switch(json.type) {

					case 'video':
						params = {
							json : json
							, dimension : 100
						}
						flashvars = 'linkTextColor=FFFFFF&linkTextRolloverColor=CCCCCC&anurl=http://fif.s3.amazonaws.com/' + json.guid + '.mp4&showPlacard=true&sizzle=&videoUrl=' + params.json.url + '&baseurl=' + baseurl + '/gfx/flash/';
						
						width = this.config.panelwidth - 40;
						height = Math.round(width/1.77777); 
						
						mrkup += '<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,40,0" WIDTH="' + width + '" HEIGHT="' + height + '" id="' + json.type + '_' + json.guid + '">';
						mrkup += '<PARAM NAME="movie" VALUE="/swf/video_player_480x270.swf">';
						mrkup += '<PARAM NAME=quality VALUE=high><PARAM NAME=bgcolor VALUE=#000>';
						mrkup += '<param name="flashvars" value="' + flashvars + '"/>';
						mrkup += '<EMBED src="/swf/video_player_480x270.swf" flashvars="' + flashvars + '" quality=high bgcolor=#FFFFFF WIDTH="' + width + '" HEIGHT="' + height + '" NAME="' + json.type + '_' + json.guid + '" ALIGN="" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"></EMBED>';
						mrkup += '</OBJECT>';
						break;
					
					default:
						params = {
							json : json
							, dimension : 100
						}
						mrkup += this.getitemimage(params);
						break;
				}
				
				
				mrkup += '</li>';
				
				ul.html(mrkup);
				
				mrkup = '';
				
				if(jQuery.inArray(this.config.node.objtype, adminrights) != -1) {
					mrkup += '<strong>TYPE</strong>: ' + json.type.toUpperCase();
					mrkup += '<br /><strong>CREATED</strong>: ' + json.created;
					mrkup += '<br /><strong>UPDATED</strong>: ' + json.updated;
				}
				var li = $('<li></li>').html(mrkup);
				
				/**
				mrkup += '<li>';
				mrkup += '<strong>TYPE</strong>: ' + json.type.toUpperCase();
				mrkup += '<br /><strong>CREATED</strong>: ' + json.created;
				mrkup += '<br /><strong>UPDATED</strong>: ' + json.updated;
				*/
				
				//trace('PARAMS:::' + JSON.stringify(params));
				
				if(!this.related[params.json.type] || !this.related[params.json.type][params.json.guid]) {
					// trace('DRAWING LINK');
					ipars = {
						//guid : params.json.guid
						type : params.json.type
						//, title : escape(params.json.title)
						, item : params.json.url
						//, idx : this.idx
						//, pickerlevel : params.pickerlevel
					};

					//var strpars = JSON.stringify(ipars, function(key, value) { return this[key] : escape(value); });

					strpars = JSON.stringify(ipars);
					var a = $('<a></a>');
					a.html('<img src="' + this.config.imgs.pickthisimage + '" />');
					a.bind("click", { picker : this, item : params.json }, function(e) {
						cls = this.className.split('_00_');
						params = {
							'type' : e.data.item.type
							, 'item' : e.data.item.guid
						}
						e.data.picker.linkitem(params);
					});
					li.append('<br />');
					li.append(a);
				}
				
				ul.append(li);
				
				break;
		
		}

		//ul.html(mrkup);
			
		//var hdr = relpickers[_args.idx].updatecolumnheader(_pars);
		
		if(json.foundrows) {
			length = json.foundrows;
		}
	
		var footer = $('<div></div>').attr('className','pickersectionfooter');
	
		var startrow = Number(json.startrow);
		var numrows = Number(json.numrows);
		var foundrows = Number(json.foundrows);
	
		if(foundrows && startrow + numrows < foundrows) {
			// trace('fwd arrow::' + foundrows + '::' + (startrow + numrows) );
			var ra = $('<a></a>').attr({'style': 'float:right;font-size:14px'}).html('&rarr;&nbsp;');
			var rargs = _args;
			rargs.json = null;
			rargs.startrow = startrow + numrows;
			// trace('fwd arrow::' + rargs.startrow);
			/**
			ra.bind('click', { picker : this, rrargs : rargs}, function(e) {
				// trace('fwd click::' + JSON.stringify(e.data.rrargs));
				relpickers[e.data.picker.idx].fillsection(e.data.rrargs);
			});
			*/
			
			var ra = $('<a></a>').attr({
				'style': 'float:right;font-size:14px'
				, 'href' : 'javascript:void(relpickers[' + this.idx  + '].fillsection(' + JSON.stringify(rargs) + '))'
			}).html('&rarr;&nbsp;');
			
			footer.append(ra);
		}
		
		if(foundrows && startrow > 0) {
			// trace('back arrow::' + foundrows + '::' + (startrow - numrows));
			var la = $('<a></a>').attr({'style': 'float:left;font-size:14px'}).html('&nbsp;&larr;');
			var largs = _args;
			largs.json = null;
			largs.startrow = startrow - numrows;
			// trace('back arrow::' + largs.startrow);
			/**
			la.bind('click', { picker : this, llargs : largs }, function(e) {
				// trace('back click::' + JSON.stringify(e.data.llargs));
				relpickers[e.data.picker.idx].fillsection(e.data.llargs);
			});
			*/
			
			var la = $('<a></a>').attr({
				'style': 'float:left;font-size:14px'
				, 'href' : 'javascript:void(relpickers[' + this.idx  + '].fillsection(' + JSON.stringify(largs) + '))'
			}).html('&larr;&nbsp;');
			
			footer.append(la);
		}
		
		if(numrows > 0) {
			footer.append((startrow + 1) + ' - ' + (startrow + numrows) + ' OF ' + foundrows);
		} else {
			footer.append(length + ' ITEMS');
		}
		
		
		//div.append(hdr);
		
		div.append(ul);
		div.append(footer);
		
		//alert(relpickers[_args.idx].sections[_args.pickerlevel]);
		
		_args.elem = relpickers[_args.idx].sections[_args.pickerlevel];
	
		relpickers[_args.idx].updateheader(_pars);
	
		//trace('displayresults::finished::' + _args.idx + '::' + _args.service);

	};
	
	this.launchlb = function(params) {
		trace('launchlb');
		
		if(!params.args) {
			params.args = {}
		}
		
		if(!params['class']) {
			params['class'] = 'lbeditor';
		}
		
		if(!params.title) {
			params.title = '';
		}
		
		params.args.mode = 'async';
		
		//this.raiseMessage(JSON.stringify(params));
		
		//return;
		
		var div = $('<div></div>').attr({
			id : 'lbcontainer'
			, style : 'background-color:#000;width:100%;height:100%;overflow:auto;position:fixed;top:0px;left:0px;filter:alpha(opacity=40);-moz-opacity:.40;opacity:.40;'
		});
		
		$('body').append(div);
		
		var lbdiv = $('<div></div>').attr('className', params['class'] + ' ' + params.id);
		$('body').append(lbdiv);
		
		var subdiv = $('<div></div>').attr('className', 'lbcontent').html('<img class="ajaxloader" src="' + this.config.imgs.activityindicator  + '"');
		
		var hdr = $('<div></div>').attr('className', 'lbheader');
		var closelink = $('<a></a>').attr(
			{
				'className' : params.id
				, 'style' : 'cursor:pointer;float:right'
			}
		).html('<img src="' + this.config.imgs.closebutton + '" />');
		
		var linko = $('<a></a>').attr({
			'onclick' : params.args.callback
		}).html('REFRESH');
		
		closelink.bind("click", function(e) {
			//$('div.' + $(this).className).remove();
			$('.lbeditor').remove();
			$('#lbcontainer').remove();
		});
		
		hdr.append(linko);
		hdr.append(closelink);
		hdr.append('<h3>' + params.title + '</h3>');
		lbdiv.append(hdr);
		lbdiv.append(subdiv);
		
		subdiv.load(params.url, params.args, function(e) {
			if(params.args.callback) {
				//trace('launchlb::callback::' + params.args.callback);

				var inp = $('<input type="hidden"></input>').attr({
					'name' : 'cb_onsuccess'
					, 'value' : params.args.callback
				});

				$('.lbeditor form').append(inp);
				//alert($('.lbeditor form').html());
			}
		});

	}
	
	this.updateheader = function(params) {
		trace('updateheader');
		//trace('updateheader::' + params.pickerlevel + '::' + this.config.node.allowedtype);
		
		//return this.updatecolumnheader(params);
		
		if(params.service == 'search' && params.pickerlevel > 0) {
			params.json.title = 'SEARCH RESULTS';
		}
		
		params.json.title = '';
		
		mrkupz = '<p style="border:none">';
		
		mrkupz += '<span class="pickersearch"><a href=\'javascript:void(relpickers[' + this.idx + '].search({}));\'>SEARCH</a><input class="pickersearch" type="text" name="searchtext" value="' + this.searchtext + '" /></span>';
		
		title = params.json.title.substring(0,50).toUpperCase();
		if(params.json.title.length > 50) {
			title += '...';
		}
		
		/**
		params.dimension = 30;
		if(params.service != 'search') {
			mrkup += this.getitemimage(params);
		}
		mrkup += title.toUpperCase();
		*/
		
		mrkupz += '</p>';
		
		//trace('updateheader::markup::' + mrkupz);
		
		//mrkup += '<p style="text-align:justify">' + this.updatecolumnheader(params) + '</p>';
		
		if(jQuery.inArray(this.config.node.objtype, adminrights) != -1) {
			trace('updateheader::not admin')
			var d = $('<div></div>').attr({
				'style' : 'background-color:#999999;padding:5px;margin:0px'
			});
			var cont = this.updatecolumnheader(params);
			if(typeof cont == 'object') {
				//trace('updatecolumnheader::' + cont.html());
				d.append(cont);
			} else {
				d.append(cont);
			}
			//trace('updatecolumnheader::' + d.html());
			this.sections[params.pickerlevel].prepend(d);
		}
		
		//trace('updateheader::markup after::' + mrkupz);
		
		
		//this.updatecolumnheader(params);
		
		$('#' + this.targetelem + ' .picker_column_header').html('');
		//trace('updateheader::finished::' + params.json.type);

	}
	
	this.updatecolumnheader = function(params) {
		trace('updatecolumnheader');
		
		if(!params.searchtext) {
			params.searchtext = '';
		}
		
		//trace('updatecolumnheader::' + JSON.stringify(this.settings[params.pickerlevel]));
		
		mrkup = '';
		
		if(params.service == 'getrelateditems') {
			pars = {};
		} else {
			pars = {
				//type : params.json.type
			};
		}

		var cls = params.json.type + '_00_' + this.idx + '_00_' + params.json.guid;
		
		mrkup = '';
		
		var pars = {
			"type" : typeof this.config.node.allowedtype == 'array' ? this.config.node.allowedtype[0] : this.config.node.allowedtype
			, "service" : "updateasset"
			, "pickerlevel" : params.pickerlevel
		};
		
		//DO WE DRAW LINKS OR SEARCH BOX
		if(params.json.type && params.service != 'getasset' && !params.json.guid) {
			//no guid, so I know I haven't selected an item yet.  so I draw searchbox
			
			trace("updatecolumnheader::no guid.  just searchbox");
			
			var spn = $('<span></span>');
			
			var inp = $('<input type="text"></input>').attr({
				'name' : 'search_' +  params['pickerlevel']
				, 'class' : 'incolumnsearch' 
				, 'value' : this.settings[params.pickerlevel].searchtext ? this.settings[params.pickerlevel].searchtext : 'Find a ' + params.json.type
				});
			
			inp.bind('blur', {'params' : params, picker : this}, function(e) {
				if(this.value.length == 0) {
					this.value = 'Find a ' + e.data.params.json.type;
				}
			});
			
			inp.bind('click', {'params' : params, picker : this}, function(e) {
				if(this.value == 'Find a ' + e.data.params.json.type) {
					this.value = '';
				}
			});
			
			var btn = $('<a></a>').attr({'style' : 'color:white'}).html('&nbsp;SEARCH');
			
			btn.bind('click', {'params' : params, 'picker' : this, 'inp' : inp}, function(e) {
				pars = {
					'type' : e.data.params.json.type
					, 'searchtext' : e.data.inp.attr('value')
					, 'service' : 'search'
					, 'skipheader' : 1
					, 'idx' : e.data.picker.idx
					, 'pickerlevel' : e.data.params.pickerlevel == 0 ? 1 : e.data.params.pickerlevel
				};
				e.data.picker.fillsection(pars);
				
			});
			spn.append(inp);
			spn.append(btn);
			//trace('updateColumnHeader::finished with search input' + spn.html());
			return spn;
		} else {
			
			trace("updatecolumnheader::draw links");
			
			var pars = {
				"type" : this.config.node.objtype
				, "f_service" : "updateasset"
				, "pickerlevel" : params.pickerlevel
				, "title" : "CREATE A " + this.config.node.objtype.toUpperCase()
			};
			
			pars["extras[cb]"] = "linkItemInPicker";
			pars["extras[picker]"] = this.idx;
			pars["extras[pickerlevel]"] = params.pickerlevel;
			
			if(params.json.type && params.json.guid) {
				pars["extras[relation]"] = this.config.node.objtype;
				pars["extras[parenttype]"] = params.json.type;
				pars["extras[parent]"] = params.json.guid;
				pars["f_service"] = "createchild";	
			}
			
			pars.callback = 'relpickers[' + this.idx + '].refreshsection(' + params.pickerlevel + ');$("#lbcontainer").remove();$(".lbeditor").remove();';
			mrkup += '<a style="float:right;color:#83def1;;padding:3px 0px" href=\'javascript:void(relpickers[' + params.idx + '].edititem(' + JSON.stringify(pars) + '));\'>+ CREATE A ' + this.config.node.objtype.toUpperCase() + '</a>';
			
			switch(this.config.node.objtype) {
				
				case 'photo':
					if(params.json.type != 'photofolder') {
						var pars = {
							"type" : "photofolder"
							, "f_service" : "updateasset"
							, "pickerlevel" : params.pickerlevel
							, "title" : "CREATE A FOLDER"
						};

						if(params.json.type && params.json.guid) {
							pars["extras[relation]"] = this.config.node.objtype;
							pars["extras[parenttype]"] = params.json.type;
							pars["extras[parent]"] = params.json.guid;
							pars["f_service"] = "createchild";	
						}
						
						pars["extras[cb]"] = "refreshPickerSection";
						pars["extras[picker]"] = this.idx;
						pars["extras[pickerlevel]"] = params.pickerlevel;

						pars.callback = 'relpickers[' + this.idx + '].refreshsection(' + params.pickerlevel + ');$("#lbcontainer").remove();$(".lbeditor").remove();';
						mrkup += '<a style="color:#83def1;padding:3px 0px" href=\'javascript:void(relpickers[' + params.idx + '].edititem(' + JSON.stringify(pars) + '));\'>+ CREATE A FOLDER</a>';
						
					}
					break;
				
				case 'video':
					if(params.json.type != 'vidfolder') {
						var pars = {
							"type" : "vidfolder"
							, "f_service" : "updateasset"
							, "pickerlevel" : params.pickerlevel
							, "title" : "CREATE A FOLDER"
						};
						
						pars["extras[cb]"] = "linkItemInPicker";
						pars["extras[picker]"] = this.idx;
						pars["extras[pickerlevel]"] = params.pickerlevel;

						if(params.json.type && params.json.guid) {
							pars["extras[relation]"] = this.config.node.objtype;
							pars["extras[parenttype]"] = params.json.type;
							pars["extras[parent]"] = params.json.guid;
							pars["f_service"] = "createchild";	
						}
						
						pars["extras[cb]"] = "refreshPickerSection";
						pars["extras[picker]"] = this.idx;
						pars["extras[pickerlevel]"] = params.pickerlevel;

						pars.callback = 'relpickers[' + this.idx + '].refreshsection(' + params.pickerlevel + ');$("#lbcontainer").remove();$(".lbeditor").remove();';
						mrkup += '<a style="color:#83def1;padding:3px 0px" href=\'javascript:void(relpickers[' + params.idx + '].edititem(' + JSON.stringify(pars) + '));\'>+ CREATE A FOLDER</a>';
						
					}
					break;
				
				default:
					break;
				
			}
			
			return mrkup;
		}
	}
	
	this.edititem = function(params) {
		//trace('edititem::' + JSON.stringify(params) + '::' + arguments.caller);
		var qs = '?smallheader=1';
		
		for(nme in params) {
			if(nme == 'callback' || nme == 'type' || nme == 'idx' || nme == 'pickerlevel') {
				continue;
			}
			qs += '&' + nme + '=' + params[nme];
		}
		qs += '&callingType=' + this.config.type + '&callingGuid=' + this.config.guid;
				
		var url = baseurl + '' + params.type + (params.url ? '/' + params.url : '') + '/edit' + qs;
		
		title = params.url ? ('EDIT ' + (params.title ? params.title.toUpperCase() : params.type.toUpperCase())) : 'CREATE A ' + params.type.toUpperCase();
		
		var pars = {
			url : url
			, title : title
			//, args : params
		};
		
		trace('edititem::URL::'+url);
		
		window.open(url, 'editor', 'height=800,width=977,scrollbars=1,locationbar=1');
		
		//return this.launchlb(pars);
		//return myOpen("inline_editor", "lbeditor", url);
		//return myOpen('bronson_admin_content', 'bronson_admin_content', url);
		
	}
	
	this.unlinkitem = function(params) {
		trace('unlinkitem');
		
		var cls = params.type + '_00_' + this.idx + '_00_' + params.item  + '_00_link';
		
		sel = '#' + this.targetelem + ' .inlinepicker table a.' + cls;
		
		if(this.config.guid != '') {
			
			var _args = {
				relation : this.config.node.relation
				, output_format : 'json'
				, service : 'deleterelationship'
				, idx : this.idx
				//, url : params.item
				, generation : this.config.node.generation
			};

			switch(this.config.node.generation) {

				case 'children':

					_args.childtype = params.type;
					_args.child = this.inventory[params.type][params.item].guid;
					_args.parenttype = this.config.type;
					_args.parent = this.config.guid;

					break;

				case 'parents':

					_args.childtype = this.config.type
					_args.child = this.config.guid;
					_args.parenttype = params.type;
					_args.parent = this.inventory[params.type][params.item].guid;

					break;

			}
			
			$.getJSON(baseurl, _args, function(json){
				//trace(JSON.stringify(_args));

				params = {};
				
				if(_args.generation == 'parents') {
					params.type = _args.parenttype;
					params.guid = _args.parent;
				} else {
					params.type = _args.childtype;
					params.guid = _args.child;
				}
				
				var cls = params.type + '_00_' + _args.idx + '_00_' + params.guid + '_00_link';

				//trace('unlinkitem::params::' + JSON.stringify(params));

				if(!relpickers[_args.idx].related[params.type]) {
					relpickers[_args.idx].related[params.type] = {};
				}

				if(json.deleterelationship == 1) {
					//trace('unlinkitem::Succesful request');
					var newrels = {};
					for(item in relpickers[_args.idx].related[params.type]) {
						//trace('unlinkitem::checking item::' + params.guid + '::' + item);
						if(item != params.guid) {
							//trace('unlinkitem::leaving item in::' + params.guid + '::' + item);
							newrels[item] = relpickers[_args.idx].related[params.type][item];
						}
					}

					relpickers[_args.idx].related[params.type] = newrels;

					//trace('unlinkitem::new rels::' + JSON.stringify(relpickers[_args.idx].related[params.type]));

					var a = $('<a></a>').attr({
						'className' : cls
						, 'style' : 'cursor:pointer'
					}).html('<img src="' + relpickers[_args.idx].config.imgs.linkbutton + '" />');

					a.bind("click", function(e) {
						cls = this.className.split('_00_');
						params = {
							'type' : cls[0]
							, 'item' : cls[2] 
						}
						relpickers[cls[1]].linkitem(params);
					});
					
					sel = '#' + relpickers[_args.idx].targetelem + ' .inlinepicker table a.' + cls;
					//trace('unlinkitem::' + sel + '::' + $(sel).length);

					$(sel).replaceWith(a);
					
					sel = '#' + relpickers[_args.idx].targetelem + ' .inlinepicker .picker_column_header a.' + cls;
					//trace('unlinkitem::' + sel + '::' + $(sel).length);

					$(sel).replaceWith(a);
					
					relpickers[_args.idx].updaterelateditems();
					
				} else {
					// this.raiseError(json.err);
					trace(json.err);
					
				}

				//trace('newrels::' + JSON.stringify(newrels));

			}); // put the stuff in the div with the callback
		
		} else {

			var newrels = {};
			for(item in this.related[params.type]) {
				if(item != params.item) {
					newrels[item] = this.related[params.type][item];
				}
			}
		
			this.related[type] = newrels;
		
			//trace('unlinkitem::' + JSON.stringify(newrels));
		
			var a = $('<a></a>').attr({
				'className' : cls
				, 'style' : 'cursor:pointer'
			}).html('<img src="' + this.config.imgs.linkbutton + '" />');
		
			a.bind("click", function(e) {
				cls = this.className.split('_00_');
				params = {
					'type' : cls[0]
					, 'item' : cls[2] 
				}
				relpickers[cls[1]].linkitem(params);
			});
			
			//trace('unlinkitem::sel::' + sel);
		
			$(sel).replaceWith(a);
			
			sel = '#' + this.targetelem + ' .inlinepicker .picker_column_header a.' + cls;
			//trace('unlinkitem::' + sel + '::' + $(sel).length);

			$(sel).replaceWith(a);
			
			this.updaterelateditems();
		}
		
		return true;
		
	}
	
	this.linkitem = function(params) {
		//trace('linkitem::' + JSON.stringify(params));
		//trace('linkitem::' + JSON.stringify(this.config));
		
		var cls = params.type + '_00_' + this.idx + '_00_' + params.item + '_00_link';
		sel = '#' + this.targetelem + ' .inlinepicker table a.' + cls;
		
		var _args = {
			relation : this.config.node.relation
			, output_format : 'json'
			, service : 'addrelationship'
			, idx : this.idx
			//, pickerlevel : params.pickerlevel
		};
		
		if(!this.related[params.type]) {
			this.related[params.type] = [];
		}
		
		switch(this.config.node.generation) {
			
			case 'children':
				
				_args.childtype = params.type;
				_args.child =  this.inventory[params.type][params.item].guid;
				_args.parenttype = this.config.type;
				_args.parent = this.config.guid;
				_args.generation = this.config.node.generation;
				
				break;
			
			case 'parents':
				
				_args.childtype = this.config.type
				_args.child = this.config.guid;
				_args.parenttype = params.type;
				_args.parent = this.inventory[params.type][params.item].guid;
				_args.generation = this.config.node.generation;
				
				break;
				
		}
		
		var relcount = 0;
		for(type in this.related) {
			for (item in this.related[type]) {
				relcount++;
			}
		}
		
		if(this.config.node.maximum && relcount >= this.config.node.maximum) {
			//this.raiseAlert(this.config.messages.maximumreached);
			
			var el = $('li.alert', '#' + this.targetelem + ' .relateditems');
			
			if(el.length) {
				el.html(this.config.messages.maximumreached);
			} else {
				var li = $('<li></li>').attr('class', 'alert');
				li.html(this.config.messages.maximumreached);
				$('#' + this.targetelem + ' .relateditems').prepend(li);
			}
			return false;
		}
		
		if(this.config.guid != '') {
		
			$.getJSON(baseurl, _args, function(json){
				//trace('linkitem::resp::' + JSON.stringify(_args));
				
				params = {};
				if(_args.generation == 'parents') {
					params.type = _args.parenttype;
					params.guid = _args.parent;
				} else {
					params.type = _args.childtype;
					params.guid = _args.child;
				}
			
				//trace('linkitem::existing item::' + relpickers[_args.idx] + '::' + JSON.stringify(params) + '::' + JSON.stringify(relpickers[_args.idx].related));
			
				if(json.addrelationship == 1) {
					relpickers[_args.idx].related[params.type][params.guid] = params;
					//relpickers[_args.idx].displayselectediteminlist(params);
					//relpickers[_args.idx].updaterelateditems();
					
					relpickers[_args.idx].related[params.type][params.guid] = relpickers[_args.idx].inventory[params.type][params.guid];

					var cls = params.type + '_00_' + _args.idx + '_00_' + params.guid + '_00_link';

					var a = $('<a></a>').attr({
						'className' : cls
						, 'style' : 'cursor:pointer'
					}).html('<img src="' + relpickers[_args.idx].config.imgs.linkbreakbutton + '" />');
					
					relpickers[_args.idx].updaterelateditems();

					a.bind("click", function(e) {
						cls = this.className.split('_00_');
						params = {
							'type' : cls[0]
							, 'item' : cls[2] 
						}
						relpickers[cls[1]].unlinkitem(params);
					});
					
					var sel = '#' + relpickers[_args.idx].targetelem + ' .inlinepicker table a.' + cls;
					
					//trace('linkitem::' + sel);

					$(sel).replaceWith(a);
					
					var sel = '#' + relpickers[_args.idx].targetelem + ' .inlinepicker .picker_column_header a.' + cls;
					
					//trace('linkitem::' + sel);

					$(sel).replaceWith(a);
					
				} else {
					//this.raiseError(json.err);
					trace(json.err);
				}

			}); // put the stuff in the div with the callback
		
		} else {
		
			this.related[params.type][params.item] = this.inventory[params.type][params.item];
		
			//trace('linkitem::sel::' + params.type + '::' + params.item + '::' + JSON.stringify(this.related[params.type][params.item]));
			
			//trace('linkitem::new item::' + JSON.stringify(params));
			
		
			var a = $('<a></a>').attr({
				'className' : cls
				, 'style' : 'cursor:pointer'
			}).html('<img src="' + this.config.imgs.linkbreakbutton + '" />');
		
			a.bind("click", function(e) {
				cls = this.className.split('_00_');
				params = {
					'type' : cls[0]
					, 'item' : cls[2] 
				}
				relpickers[cls[1]].unlinkitem(params);
			});
		
			$(sel).replaceWith(a);
		
			sel = '#' + this.targetelem + ' .inlinepicker .picker_column_header a.' + cls;

			$(sel).replaceWith(a);
				
			this.updaterelateditems();
		
		}
		
		return true;
		
	}
	
	this.raiseAlert = function(msg) {
		
		trace('raiseAlert');
		
		if($('#' + this.targetelem + ' p.alert').length) {
			$('#' + this.targetelem + ' p.alert').html(msg);
		} else {
			var div = $('<p></p>').attr('className', 'picker alert').html(msg);
			$('#' + this.targetelem + ' a.pickertoggle').before(div);		
		}
	}
	
	this.raiseMessage = function(msg) {
		
		trace('raiseMessage');
		
		if($('#' + this.targetelem + ' p.message').length) {
			$('#' + this.targetelem + ' p.message').html(msg);
		} else {
			var div = $('<p></p>').attr('className', 'picker message').html(msg);
			$('#' + this.targetelem + ' a.pickertoggle').before(div);		
		}
	
	}
	
	this.raiseError = function(msg) {
		trace('raiseError');		
		
		if($('#' + this.targetelem + ' p.error').length) {
			$('#' + this.targetelem + ' p.error').html(msg);
		} else {
			var div = $('<p></p>').attr('className', 'picker alert').html(msg);
			$('#' + this.targetelem + ' a.pickertoggle').before(div);		
		}
	}
	
	this.removeselecteditemfromlist = function(params) {
		trace('removeselecteditemfromlist');
		$('#' + this.targetelem + ' .relateditems li.' + params.type + '_' + params.guid).remove();
		
	}
	
	this.resortrelations = function(params) {
		trace('resortrelations');
		if(this.config.guid != '') {
			var _args = {
				relation : this.config.node.relation
				, output_format : 'json'
				, service : 'updatesortkey'
				, idx : this.idx
				, sortkey : Number(params.sortkey)+1
				//, url : params.item
			};

			switch(this.config.node.generation) {

				case 'children':

					_args.childtype = params.type;
					_args.child = this.inventory[params.type][params.item].guid;
					_args.parenttype = this.config.type;
					_args.parent = this.config.guid;

					break;

				case 'parents':

					_args.childtype = this.config.type
					_args.child = this.config.guid;
					_args.parenttype = params.type;
					_args.parent = this.inventory[params.type][params.item].guid;

					break;

			}
			
			$.getJSON(baseurl, _args, function(json){
				//trace('REPSONSE::' + JSON.stringify(_args));
				
				var resp = json.updatesortkey;

				params = {};
				
				if(_args.generation == 'parents') {
					params.type = _args.parenttype;
					params.item = _args.parent;
				} else {
					params.type = _args.childtype;
					params.item = _args.child;
				}

				params.sortkey = _args.sortkey -1;

				if(resp == 1) {
					//trace('SUCCESS::' + _args.idx + '::' + JSON.stringify(params));
					relpickers[_args.idx].resortrelationsinlist(params);
					
				} else {
					//trace('FAILURE::' + _args.idx + '::' + JSON.stringify(params));
					// relpickers[_args.idx].raiseError('ERROR::' + json.err);
					trace("error: " + json.err);
				}

				//trace('newrels::' + JSON.stringify(newrels));

			}); // put the stuff in the div with the callback
		
		} else { 		
			this.resortrelationsinlist(params);
		}
	}
	
	this.resortrelationsinlist = function(params) {
		trace('resortrelationsinlist');		
		var rels = {};
		
		var i=0;
		var j=0;
		
		for(type in this.related) {
			rels[type] = {};
			for(item in this.related[type]) {
				//trace('resortrelationsinlist::searching for current index::' + item + '::' + params.item);
				if(item == params.item) {
					j = i;
					//trace('resortrelationsinlist::setting j to i::' + j + '::' + params.sortkey);
				}
				i++;
			}
		}
		
		i=0;
		
		for(type in this.related) {
			rels[type] = {};
			for(item in this.related[type]) {
				//trace('resortrelations::this.related[item]::' + JSON.stringify(this.related[type][item]));
				//trace('resortrelationsinlist::' + i + '::' + j + '::' + params.sortkey);
				
				if(i == params.sortkey && j > params.sortkey) {
					rels[params.type][params.item] = this.related[params.type][params.item];
					//trace('resortrelationsinlist::match::moving up::' + j + '::' + params.sortkey + '::' + JSON.stringify(rels[params.type][params.item]));
				}
				
				if(item != params.item) {
					//trace('resortrelationsinlist::including item::this.related[item]::' + JSON.stringify(this.related[type][item]));
					rels[type][item] = this.related[type][item];
				}
				
				if(i == params.sortkey && j < params.sortkey) {
					rels[params.type][params.item] = this.related[params.type][params.item];
					//trace('resortrelationsinlist::match::moving down::' + j + '::' + params.sortkey + '::' + JSON.stringify(rels[params.type][params.item]));
				}
				
				i++;
		
				//this.inventory[type][params.related[type][item].guid] = params.related[type][item];
				//this.related[type][params.related[type][item].guid] = {'type' : params.related[type][item].type, 'guid' : params.related[type][item].guid, 'title' : params.related[type][item].title };
				//i++;
			}
		}
		
		//trace('resortrelationsinlist::rels created::' + JSON.stringify(rels));
		
		this.related = rels;
		
		// trace('resortrelationsinlist::' + JSON.stringify(this.related));
		
		this.updaterelateditems();
	}
	
	this.displayselectediteminlist = function(params) {
		trace('displayselectediteminlist');		
		
		var cls = params.type + '_00_' + this.idx + '_00_' + params.item;
		
		var ht = '';
		
		if(this.config.maximum != 1) {
			ht += '<select class="' + cls + '" onchange="relpickers[' + this.idx + '].resortrelations({ type :\'' + params.type + '\', item : \'' + params.item +  '\', sortkey : this.options[this.selectedIndex].value });">';
		
			for(i=0;i < params.total;i++) {
				ht += '<option value="' + i + '"';
				if(params.sortkey == i) {
					ht += ' selected="selected"';
				}
			
				ht += '>' + (i+1) + '</option>';
			}
			ht += '</select>';
		}
		
		if(jQuery.inArray(this.config.type, adminrights) != -1) {
			
			var epars = {
				"type" : params.type
				, "guid" : params.item
				, "url" : this.inventory[params.type][params.item].url
				, "extras[cb]" : "refresh"
			};
			ht += '<a href=\'javascript:void(relpickers[' + this.idx + '].edititem(' + JSON.stringify(epars) + '));\'><img src="' + this.config.imgs.editbutton  + '" /></a>';
		
		}
		
		ht += '<a class="' + cls + '" href="javascript:;" onclick="relpickers[' + this.idx + '].unlinkitem({ type : \'' + params.type  + '\', item : \'' + params.item + '\'});">';
		
		ht += '<img src="' + this.config.imgs.linkbreakbutton + '" />';
		
		ht += '</a>';
	
		params.json = this.inventory[params.type][params.item];
		params.dimension = 50;
		ht += this.getitemimage(params);
		
		ht += unescape(this.related[params.type][params.item].title).toUpperCase();
		
		mrkup = '<li class="' + cls + '">' + ht + '</li>';
		
		$('#' + this.targetelem + ' .relateditems').append(mrkup);
	}

};
