

var LayersPalet=Palet.Layers=Palet.Search.extend({
	loadContent:function()
	{
	var me=this;
	
	if(me.options.layerManager)
		me.loadLayers(me.options.layerManager.layers, me.menu.content);
		me.loadVisibilityControl(me.options.layerManager.layers);

	},
	loadVisibilityControl:function(layers){
		var me=this;
		me.menu.content.appendChild(menuControl.space()); 
		var show=new Element('button',{'class':"paletButton"});
		show.innerHTML="show";
		var hide=new Element('button',{'class':"paletButton"});
		hide.innerHTML="hide";
		var control=new Element('div',{'class':"paletTitle"});
		control.setText("All Layers");
		me.menu.content.appendChild(control);
		control.appendChild(show);
		control.appendChild(hide);
		me.menu.content.appendChild(control);
		
		show.addEvent('click',function(){
			$each(layers,function(layer){
				layer.show();
			});
		});
		hide.addEvent('click',function(){
			$each(layers,function(layer){
				layer.hide();
			});
		});
	},
	reload:function(layer, cache)
	{
		var me=this;
		var handle=me.createAccordionHandle(layer, cache.handle);

		var options=cache.options||Palet.Layers.AddAdminControls((layer.sublayer||layer), new Element('span'),{options:true});
		var box=cache.box||Palet.Layers.VisibilityCheckBox(layer);
		var title=me.createLayerTitle(layer, handle, options, box, cache.title);
		var content=me.createLayerContent(layer, cache.content);

//		Palet.Layers.AddAdminControls((layer.sublayer||layer), title, {
//			save:true
//		});

		return {'handle':handle, 'box':box, 'options':options,'title':title, 'content':content};

	},
	loadLayers:function(layers, menu){
		var me=this;
		/*create an accordion element for each layer*/
		var handles=[];	//just handles (other things will be included in the title eg checkbox)
		var contents=[];//just contents
		var orderedContent=new Element('div', {'styles':{'overflow-y':'auto','overflow-x':'hidden'}});//both titles and contents in order
		//orderedContent.getChildren=function(){return orderedContent;};
		//create a title and section for each layer

		var accordion;

		$each(layers,function(layer){

			var section=me.reload(layer,{});			

			var handle=section.handle;
			handles.push(handle);
			var title=section.title;
			var container=new Element('div');
			var legendElement = new Element('div', {'class':'layerLegend','align':'left', styles:"padding-left:25px;"});
			
//			orderedContent.push(title);
			var content=section.content;
			//content.setStyle('margin-right','10px');
			legendElement.inject(content, 'top');
			if(layer.options.legend){
				if(layer.options.legend == "map")
					(new GLegend(layer, MapFactory.GetMM(layer).options.contentServer)).generateHTML(legendElement);
				else if(layer.options.legend == "layer");
					//TODO: similar to above, except ge tthe contentServer from the layer.
				else if(layer.options.legend!=""){
					//here it is assumed that the legend was passed into layers contructor...
					legendElement.innerHTML=layer.options.legend;
				}
					
			}
				
			contents.push(content);
			container.appendChild(title);
			container.appendChild(content);
			orderedContent.appendChild(container);
			
			/*rebuilds layer if a change is noticed*/
			(layer.sublayer||layer).addEvent('onUpdate',function(){
				me.reload(layer,{'handle':section.handle, 'box':section.box, 'options':section.options, 'title':section.title, 'content':section.content});
				var alwaysHide=accordion.options.alwaysHide;
				accordion.options.alwaysHide=true;
				accordion.display(-1).chain(function(){
					accordion.display(content); //accepts index, or content
					accordion.options.alwaysHide=alwaysHide; //restore settings.
				});
			});
		});

			menu.appendChild(orderedContent);

		/*call parent method to create accordion, also adds event listeners to update window on changes*/
		var config={};
		if(this.options.startClosed)config.show=-1;
		accordion=me.createMultiAccordion(handles,contents, config);
		accordion.options.height = false;
		var accordionSize;
		var checkSize = function() {
			accordionSize = 0;
			$each(orderedContent.childNodes,function(c) {
				accordionSize += c.getCoordinates().height;
			});
			accordionSize += 10; // a little extra so scroll bar doesn't appear
			
			if(accordionSize > 300)
				orderedContent.effect('height', {duration: 500, transition: Fx.Transitions.linear}).start(300);
			else
				orderedContent.effect('height', {duration: 500, transition: Fx.Transitions.linear}).start(accordionSize);
			me.menu.checkBounds();
		};
		accordion.addEvent('onComplete', checkSize);
		var firstCheck = function() {
			me.removeEvent('onOpen', firstCheck);
			checkSize();
		};
		me.addEvent('onOpen', firstCheck);

		var sortables = new Sortables(orderedContent);
		var originalOrder = sortables.serialize();
		var layerMap = [];
		sortables.addEvent('onComplete',function(active){
			var i;
			var changes = 0;
			var reloadOrder = sortables.serialize();
			for(i = 0; i < originalOrder.length; i++)
				if(originalOrder[i] != reloadOrder[i]) {
					changes = 1;
					break;
				}
			if(changes == 1) {
				for(i = 0; i < reloadOrder.length; i++) {
					layerMap[i] = me.options.layerManager.originallyOrderedLayers[reloadOrder[i]];
				}
				originalOrder = reloadOrder;
				me.options.layerManager.reorderLayers(layerMap);
			}
		});
	},
	createAccordionHandle:function(layer, handle){
		var me=this;
		var title=handle||Palet.accordionTitle();
		title.setText(layer.options.name||layer.name||"Untitled Layer");

		var tip=layer.options.description||layer.description;
		//Re-Sync is generated by default by php server and is obviously meaningless
		//alert("nick is adding tips to layers");
		if(tip&&tip!="Re-Sync"&&tip!=""){
			title.title=tip;
			new mediaTips(title);
		}
		return title;
	},
	createLayerTitle:function(layer, handle, options, box, title){
		/*
		 * box and handle are optional
		 */
		if(title!=null)
		{
			/*clean handle before using */
			var removeList=[];
			$each(title.childNodes,function(child){removeList.push(child);});
			$each(removeList,function(child){title.removeChild(child); });
		}
		var me=this;
		var label=title||new Element('div',{'class':'paletAccordionTitle_layer'});
		//label.appendChild(options);
		label.appendChild(box);
		label.appendChild(handle);
		return label;
		
	},
	createLayerContent:function(layer, content){
		if(content!=null)/*optional*/
		{
			/*clean arg before using as body*/
			var removeList=[];
			$each(content.childNodes,function(child){
				if(!child.hasClass("layerLegend")){
					removeList.push(child);}
				});
			$each(removeList,function(child){content.removeChild(child); });
		}
		var me=this;
		var body=content||Palet.accordionBody();
		body.addClass("addIndent"); 
		$each(layer.markers,function(marker){
			me.addMarker(marker, body, layer);
		});
		$each(layer.polygons,function(polygon){
			me.addPolygon(polygon, body, layer);
		});
		$each(layer.overlays,function(overlay){
			me.addOverlay(overlay, body, layer);
		});
		$each(layer.networkLinks, function(link){
			me.addLink(link, body, layer);
		});
		return body;	
	},

	addMarker:function(marker, body, layer){
		//var marker=markerContainer.marker;
		var markerSec=new Element("span",{ 'class':"mediaMenu_Marker"});

		/*Marker Click Function (opens default viewer)*/
		markerSec.addEvent('click',function(){
			var mediaMap=MapFactory.GetMM(layer);
			mediaMap.infoWindowViewer.open(new PageModule(mediaMap, marker, {}), marker);
		});

		var title=marker.getTitle();
		if(title.length>50){
			title=title.substring(0,40)+'...';
		}
		markerSec.setText(title);
		//markerSec.setAttribute('title','<img width="20" height="20" src="'+marker.getIcon().image+'" /><div>'+title+'</div>');
		//new mediaTips(markerSec);
		var line=new Element('div');
		//line.appendChild(Palet.Layers.AddAdminControls(marker, new Element('span'),{options:false, optionsFn:function(){}}));
		line.appendChild(Palet.Layers.VisibilityCheckBox(marker, layer));
		line.appendChild(new Element('img', {src:marker.getIcon().image, width:'auto', height:'20px'}));
		line.appendChild(markerSec);
		Palet.Layers.AddAdminControls(marker, line, {
			save:true,
			'delete':true
		});
		body.appendChild(line);
	},
	addPolygon:function(polygon, body, layer){
		//var polygon=polygonContainer.shape;

		var polySec=new Element("span",{'class':"mediaMenu_Polygon"});
		polySec.addEvent('click',function(){
			var mediaMap=MapFactory.GetMM(layer);
			//TODO: make sure layer is in full view!
			mediaMap.infoWindowViewer.open(new PageModule(mediaMap, polygon, {}), polygon);
		});

		var title=polygon.getName()||MapFactory.ItemDisplayType(polygon);

		polySec.setText(title);
		var line=new Element('div');
		//line.appendChild(Palet.Layers.AddAdminControls(polygon, new Element('span'),{options:true, optionsFn:function(){}}));
		line.appendChild(Palet.Layers.VisibilityCheckBox(polygon, layer));
		line.appendChild(polySec);
		Palet.Layers.AddAdminControls(polygon, line, {
			save:true,
			'delete':true
		});
		body.appendChild(line);

	},
	addOverlay:function(overlay, body, layer){

		var overSec=new Element("span",{'class':"mediaMenu_Overlay"});
		overSec.addEvent('click',function(){
			var map=MapFactory.GetGMap(layer);
			var oBounds=overlay.getDefaultBounds();
			var oCenter=oBounds.getCenter();
			var mBounds=map.getBounds();
			/*
			 * pan, then zoom to fit overlay
			 */
			MapFactory.PanTo(map,oCenter,function(){
				MapFactory.ZoomNumber(map, MapFactory.CalculateZoomFit(oBounds.toSpan(),mBounds.toSpan()),oCenter);
			});
		});

		overSec.setText("overlay");

		var line=new Element('div');
		//line.appendChild(Palet.Layers.VisibilityCheckBox(overlay));
		line.appendChild(overSec);
		Palet.Layers.AddAdminControls(layer, line, {
			save:true
		});
		body.appendChild(line);
	},
	addLink:function(link, body, layer){

		overlay=link.getOverlay();
		var overSec=new Element("span",{'class':"mediaMenu_Overlay"});
		overSec.addEvent('click',function(){
			var map=MapFactory.GetGMap(layer);
			var oBounds=overlay.getDefaultBounds();
			var oCenter=oBounds.getCenter();
			var mBounds=map.getBounds();
			/*
			 * pan, then zoom to fit overlay
			 */
			MapFactory.PanTo(map,oCenter,function(){
				MapFactory.ZoomNumber(map, MapFactory.CalculateZoomFit(oBounds.toSpan(),mBounds.toSpan()),oCenter);
			});
		});

		overSec.setText(link.getName()||"network link");

		var item=new Element('div');
		//line.appendChild(Palet.Layers.VisibilityCheckBox(overlay));
		item.appendChild(overSec);
		Palet.Layers.AddAdminControls(layer, item, {
			save:true
		});
		body.appendChild(item);
	}





});
Palet.Layers.VisibilityCheckBox=function(item, layer)
{
	var mapItem=item;
	var itemLayer=layer;
	var checkBox=new Element('input',{type:'checkbox', checked:true});
	if(mapItem instanceof Layer && mapItem.isLoaded==false)
	{	
		checkBox.checked=false;		
	}

	var forceCheck=function()
	{
		if(!checkBox.checked)
			checkBox.checked=true;
	};

	var forceUncheck=function()
	{
		if(checkBox.checked)
			checkBox.checked=false;
	};

	var showItem=function(){
		mapItem.show();
	};

	var hideItem=function(){
		mapItem.hide();
	};

	if(item instanceof Layer)
	{
		if(item.sublayer)
		{
			mapItem=item.sublayer;
		}
		itemLayer=mapItem;
	}

	if(itemLayer)
	{
		itemLayer.addEvent("onHide",forceUncheck);
		itemLayer.addEvent("onShow",forceCheck);
	}

	checkBox.addEvent('click',function(){
		if(this.checked)
			showItem();
		else
			hideItem();
	});
	return checkBox;
};
Palet.Layers.AddAdminControls=function(item, el, options)
{
	var me=this;
	var mapItem=item.wrapper||item;
	var mediaMap=MapFactory.GetMM(mapItem);
	MapFactory.ItemOwner(mediaMap, mapItem, function(isOwner){
		if(isOwner)
		{
			if(options.edit)
			{
				var e=new Element('img',{
					'class':'mediaMenu_controls mediaMenu_cEdit', 
					title:"Edit::"+"Click to edit this "+MapFactory.ItemDisplayType(mapItem), 
					src: mediaMap.options.dir+"images/Utilities/Edit.png"
				});
				new mediaTips(e);
				el.appendChild(e);
			}
			if(options.save && (options.forceSave||mapItem.change))
			{
				var s=new Element('img',{'class':'mediaMenu_controls mediaMenu_cSave', 
					title:"Save::"+"Click to save all changes to this "+MapFactory.ItemDisplayType(mapItem),
					src: mediaMap.options.dir+"images/Utilities/Save.png"});
				var sm=new mediaTips(s);
				el.appendChild(s);
				el.addClass('mediaMenu_CanSave');
				s.addEvent('click',function(){
					if(options.onSaveClick){options.onSaveClick();}
					sm.hide();
					var saveOptions={
							notify:true,
							onSuccess:function(){
						if(!options.forceSave)el.removeChild(s);
					}};
					if(mapItem instanceof Layer)
					{
						saveOptions.verify=true;
						saveOptions.verifyMsg="Are you sure you want to save this "+MapFactory.ItemDisplayType(mapItem)+" and all unsaved items it contains?";
					}
					MapFactory.SaveItem(mapItem, saveOptions);
				});
			}
			else
				el.removeClass('mediaMenu_CanSave');
			if(options['delete'])
			{
				var d=new Element('img',{
					'class':'mediaMenu_controls mediaMenu_cDelete', 
					title:"Delete::"+"Click to delete this "+MapFactory.ItemDisplayType(mapItem), 
					src: mediaMap.options.dir+"images/Utilities/Delete.png"
				});
				var dm=new mediaTips(d);
				el.appendChild(d);
				d.addEvent('click',function(){
					dm.hide();
					var deleteOptions={notify:true,
							verify:true
					};
					if(mapItem instanceof Layer)
						deleteOptions.verifySuccess="Are you sure you want to remove this "+MapFactory.ItemDisplayType(mapItem)+" and all the items it contains?";
					MapFactory.DeleteItem(mapItem, deleteOptions);
				});

			}
			if(options.activate && mapItem instanceof Layer && mapItem.options.writeable)
			{

				var a=new Element('img',
						{
					'class':'mediaMenu_controls mediaMenu_cActivate', 
					title:
						"Activate::"+"Click to activate this "+MapFactory.ItemDisplayType(mapItem)+
						". Items you create will then be added to this layer"
						});
				new mediaTips(a);
				el.appendChild(a);
			}
			if(options.options && !(mapItem instanceof ShapeWrapper))
			{

				var o=new Element('img',
						{
					'class':'mediaMenu_controls mediaMenu_cOptions', 
					title:
						"Options::"+"Click to list all the options for this "+MapFactory.ItemDisplayType(mapItem), 
						src: mediaMap.options.dir+"images/Utilities/Options.png"
						});
				var om=new mediaTips(o);
				el.appendChild(o);

				o.addEvent('click',function(){
					om.hide();
					if(options.optionsFn)
					{
						options.optionsFn();
					}else{
						mediaMap.squeezeViewer.open(new EditWizardModule(mediaMap, mapItem, {}), mapItem);
					}
				});

			}
		}
	});

	return el;
};
//convenience variable