//$Rev: 17578 $
//$Date: 2009-07-02 14:09:49 -0400 (Thu, 02 Jul 2009) $
var NavigationModule;

if ($type(window['Module']) == 'class'){
		NavigationModule=new Class({
		Extends: Module,
		options:{
		},
		initialize : function(module,options){
			this.parent(module,options);
			this.type = ($(module).getProperty('id').match(/top/)) ? 'top' : 'left';
			this.form = $(this.type+'nav_form');
			this.formContainer = $(this.type+'nav_form_container');
			this.form.addEvent('submit',this.formSubmit.bindWithEvent(this));
			this.form.getElement('.cancel').addEvent('click',this.formCancel.bind(this));
			this.form.getElement('.delete').addEvent('click',this.formDelete.bind(this));
			this.activate();
		},
		defaultPanel : function(){
			return 'view';
		},
		activate : function(){
			this.container = this.module.getElement('.navigation_preview');
			this.list = this.container.getElement('ul');
			this.listContainer = this.module.getElement('.navigation_'+this.type+'nav');
			var selected = this.list.getElement('.selected');
			this.active = (selected) ? selected.getParent() : false;
			//attach collapsable
			this.module.getElements('.collapseablef').each(function(collapseable){
				NavigationModule.attachCollapseToggle(collapseable);
				if(!collapseable.hasClass('expand_by_default'))
					collapseable.fireEvent('click');
			});
			this.module.getElements('ul.leftnav .heading').each(function(heading){
				NavigationModule.attachHeadingCollapseToggle(heading,true);
			});
		},
		loadEdit : function(panel){
			this.listContainer.removeClass('navigation_preview');
			this.listContainer.addClass('navigation_edit');
			this.attach(this.getPanel(panel));
		},
		unloadEdit : function(panel){
			this.listContainer.removeClass('navigation_edit');
			this.listContainer.addClass('navigation_preview');
			$('leftnav_form_container').addClass('hidden'); // Added by peter

			this.detach();
		},

		attach : function(panel){
			if (this.sortable)
				return this.sortable.idle = true;

			if (this.type == 'top'){
				this.sortable = new HorizontalSortables(this.list,{
					direction:'horizontal',
					onStart:function(element,event){
						this.first = this.list.getFirst();
						this.ghost.setStyle('visibility','hidden');
						this.ghost.getElement('img').setStyle('display','none');
            // this.ghost.setStyle('margin-top',175);  // UGLY FIX ME!
            this.startingPosition = element.getParent().getChildren().indexOf(element);
						this.mousePosition = event.page;
					},
					onMousemove : function(element,event){
						if (!element.hasClass('dragClass') && (Math.abs(this.mousePosition.x-event.page.x) > 3 || Math.abs(this.mousePosition.y-event.page.y) > 3)){
							element.addClass('dragClass');
							this.ghost.setStyle('visibility','visible');
						}
					},
					onChange:function(element,sibling){
						var first = this.list.getFirst();
						if (this.first != first){
							this.first.removeClass('first');
							this.first = first;
							this.first.addClass('first');
						}
					},
					onComplete:function(element,event){
						if (element.hasClass('dragClass'))
							element.removeClass('dragClass');
						else if (element.getElement('a').getProperty('href'))
							return window.location = element.getElement('a').getProperty('href');
						var position = element.getParent().getChildren().indexOf(element);
						if (this.startingPosition == position) return;
						var id = element.getProperty('id').replace(/\w+_/,'');
						new Request({url:'/'+Session.portfolio.url+'/'+Navigation.section_url+'/navigation/reorder?type=topnav&newoffset='+position+'&sectionid='+id}).send();
					}
				});
			}else{
				this.sortable = new Nested(this.list,{
					serializeCallback:function(element){
						return element.getProperty('id').replace(/\w+_/,'');
					},
					onStart:function(element,event){
						this.ghost.getElements('img').each(function(img){img.destroy()});
						this.ghost.setStyle('visibility','hidden');
            // this.ghost.setStyle('margin-top',390);  // UGLY FIX ME!
						this.startingOrder = JSON.encode(this.serialize());
						this.mousePosition = event.page;
					},
					onMousemove : function(element,event){
						if (!element.hasClass('dragClass') && (Math.abs(this.mousePosition.x-event.page.x) > 3 || Math.abs(this.mousePosition.y-event.page.y) > 3)){
							element.addClass('dragClass');
							this.ghost.setStyle('visibility','visible');
						}
					},
					onComplete:function(element,event){
						if (element.hasClass('dragClass'))
							element.removeClass('dragClass');
						var order = JSON.encode(this.serialize());
						if (this.startingOrder == order) return;
						new Request({url:'/'+Session.portfolio.url+'/'+Navigation.section_url+'/navigation/reorder?type=leftnav&data='+order}).send();
					}
				});
			}
	
			// var edit = this.list.getElements('img');
			var edit = this.list.getElements('img.edit');
			edit.each(function(button){
				button.addEvent('mousedown',this.edit.bindWithEvent(this,button));
			},this);
			this.getPanel('edit').getElement('.add_btn').addEvent('click',this.edit.bindWithEvent(this,false));
			$(this.type+'nav_form_container').addClass('hidden');
			
			var editFormParent = this.type == 'left' ? $('leftnav_form') : this.getPanel('edit'); // Added by eric
			// var advanced = this.getPanel('edit').getElement('.showadvanced'); // Commented out by eric
			var advanced = editFormParent.getElement('.showadvanced'); // Added by eric
			if (advanced){
				advanced.addEvent('click',function(){
	
					// var fields = this.getPanel('edit').getElement('.formadvanced'); // Commented out by eric
					var fields = editFormParent.getElement('.formadvanced'); 
					var isVisible = fields.hasClass('hidden');
					if (isVisible)
						advanced.set('text','Hide Advanced');
					else
						advanced.set('text','Show Advanced');
					fields.setClass('hidden',!isVisible)
				}.bind(this));
			}
		},

		detach:function(panel){
			this.sortable.idle = false;
		},

		edit : function(event,button){
			event.stopPropagation();
			var page,text,url,method,handler,post;
			if (button){
				$('left_nav_parentid').set('value',0);
				method = 'edit';
				if (this.type == 'top'){
					page = button.getPrevious();
				}else{
					// Inject the edit form div under the currently active <li>
					button.getParent().getFirst('a').grab($('leftnav_form_container'),'after');
					
					// Get the offset of the <li> and adjust the form's position accordingly
					if (Browser.Engine.trident){
						if (navigator.appVersion.indexOf('MSIE 8')){
							$('leftnav_form_container').setStyle('left', -button.getParent().getPosition(this.module.getElement('.leftnav').getElement('li')).x-21);
						}
					}else{
						$('leftnav_form_container').setStyle('left', -button.getParent().getPosition(this.module).x);
					}
					page = button.getParent().getElement('a.li-link');
				};
				var href = page.getProperty('href') || page.getProperty('rel');
				url      = href.match(/([^\/]+)\/?$/)[1];
				post     = href+'/navigation/'+method+'?ajax=1';
				text     = page.getFirst().get('text');
				hiddenf  = page.hasClass('navigation_hidden') || page.getParent().hasClass('navigation_hidden');
				headingf = page.hasClass('heading') || page.getParent().hasClass('heading');
				var collapseablef_img = page.getParent().getElement('img.collapseablef');
				collapseablef_img = (collapseablef_img != null && collapseablef_img.getParent() == page.getParent()) ? collapseablef_img : null;
				collapseablef = collapseablef_img ? true : false;
				
				handler  = this.editHandler.bind(this);
				this.form.getElement('.delete').removeClass('hidden');
				
				if(this.type == 'left') this.sortable.idle = false;  // Added by eric
			}else{
				this.getPanel('edit').getElement('.add_btn').addClass('hidden');
				if (this.type == 'left'){
					var id,sibling = $(this.type+'nav_'+Navigation.page_navigationid).getParent().getParent();
					if(this.type == 'left'){ $('module_leftnav').getElement('.edit_content').getFirst('div.feedback').grab($('leftnav_form_container'),'before'); // Added by eric
						$('leftnav_form_container').setStyle('left','-6px');
					}
					if (Navigation.page_navigationid == Navigation.section_navigationid)
						id = Navigation.page_navigationid;
					else
						id = sibling.getProperty('id').replace(/[^\d]/g,'');
					$('left_nav_parentid').set('value',id);
				}
				method = 'create';
				url = '';
				post = '/'+Session.portfolio.url+'/'+Navigation.page_url+'/navigation/'+method+'?ajax=1';
				handler = this.addHandler.bind(this);
				hiddenf = false;
				headingf = false;
				collapseablef = false;
				this.form.getElement('.delete').addClass('hidden');
			}
			
			this.form.set('send',{
				url:post,
				onSuccess:handler
			});
			this.active = page;
			$(this.type+'nav_url').set('value',url);
			$(this.type+'nav_pagename').set('value',text);
			
			if (this.listContainer.getPrevious().hasClass('success'))
				this.listContainer.getPrevious().destroy();
			this.formContainer.removeClass('hidden');
			this.formContainer.getElement('input[name=hiddenf]').set('checked',hiddenf);
			if(this.type=='left'){
				this.formContainer.getElement('input[name=headingf]').set('checked',headingf);
				this.formContainer.getElement('input[name=collapseablef]').set('checked',collapseablef);
			}
			(function(){
				this.formContainer.getElement('input[type=text]').focus();
			}).delay(10, this); //thank you ie
		},

		editHandler : function(response){
			if ($type(response) == 'string'){
				this.setFeedback('save:done',this.module.getElement('.feedback'));
				response               = response.toQueryObject();
			}
			response.headingf      = parseInt(response.headingf);
			response.hiddenf       = parseInt(response.hiddenf);
			response.collapseablef = parseInt(response.collapseablef);
			
			if (!parseInt(response.success))
				return alert(response.errormessage);

			this.formContainer.addClass('hidden');
			if(this.type == 'left') this.sortable.idle = true;  // Added by eric
			
			this.active.getFirst().set('text',response.navigationname);
			this.active.removeProperty('href');
			this.active.removeProperty('rel');
			this.active.setProperty(response.headingf ? 'rel' : 'href', '/'+Session.portfolio.url+'/'+response.url);
			
			//hidden class applies to all child pages
			this.active.getParent().setClass('navigation_hidden', response.hiddenf);

			if(this.type=='left'){
				//heading class should not apply to all child pages, so it goes on the a
				this.active.setClass('heading', response.headingf);
				//heading class should not apply to all child pages, so it goes on the a
				this.active.setClass('collapseable', response.collapseablef);
				
				NavigationModule.attachHeadingCollapseToggle(this.active,response.headingf && response.collapseablef);
				
				var page = this.active;
				var collapseablef_img = page.getParent().getElement('img.collapseablef');
				collapseablef_img = (collapseablef_img != null && collapseablef_img.getParent() == page.getParent()) ? collapseablef_img : null;
			
				if (response.collapseablef){
					if (!collapseablef_img) { 
						var img = new Element('img', {'class' : 'collapseablef'});
						img.inject(this.active.getParent().getElement('.edit'), 'after');
						NavigationModule.attachCollapseToggle(img);
						if(img.getNext('ul'))
							img.getNext('ul').addClass('hidden');
						img.fireEvent('click'); // pop it open so the right src shows
						
					}
				} else {
					if (collapseablef_img){
						if(collapseablef_img.getNext('ul'))
							collapseablef_img.getNext('ul').removeClass('hidden');
						collapseablef_img.destroy();
					}
				}
			}
		},

		addHandler : function(response){
			this.setFeedback('save:done',this.module.getElement('.feedback'));
			this.getPanel('edit').getElement('.add_btn').removeClass('hidden');
			response = response.toQueryObject();
			if (!parseInt(response.success))
				return alert(response.errormessage);

			this.formContainer.addClass('hidden');
			if(this.type == 'left') this.sortable.idle = true;  // Added by eric
			
			var li = new Element('li',{id:this.type+'nav_'+response.navigationid});
			var a = new Element('a',{href:'/'+Session.portfolio.url+'/'+response.url, 'class':'li-link'}).adopt(new Element('span',{text:response.navigationname}));
			var img = new Element('img',{src:'/images/icons/edit_small.gif', 'class': 'edit'});
			img.addEvent('mousedown',this.edit.bindWithEvent(this,img));


			if (this.type == 'top'){
				li.adopt(a);
				li.appendText(' ');
				li.adopt(img);
				li.appendText(' ');
				this.list.adopt(li);
			}else{
				li.addClass('clearfix');
				li.setStyle('position','relative');
				img.setStyles({float:'none',position:'absolute',right:0});
				var parent = $(this.type+'nav_'+Navigation.page_navigationid).getParent();
				li.adopt(img,a);
				if (parent.get('tag') == 'ul')
					parent.adopt(li);
				else
					parent.getElement('ul').adopt(li);
			}
	
			if (this.type == 'top'){
				this.sortable.reinitialize();
			}else{
				this.sortable.append(li);
			}
			
			this.active = a;
			
			this.editHandler(response);
		},

		formSubmit : function(event){
			event.stop();
			this.setFeedback('save:start',this.module.getElement('.feedback'));
			this.form.send();			
		},


		formCancel : function(event){
			event.stop();
			this.formContainer.addClass('hidden');
			this.getPanel('edit').getElement('.add_btn').removeClass('hidden');
			if(this.type == 'left') this.sortable.idle = true;  // Added by eric
			
		},

		formDelete : function(event){
			event.stop();
			var active = this.active;
			if (this.type == 'top' && this.list.getChildren().length==1)
				return alert('You can not delete the last '+((this.type=='top')?'section':'page')+' from '+((this.type=='top')?'your portfolio':'this section')+'.')
			var message = '';
			var parent = active.getParent().getElement('ul');
			if (parent){
				var crawler = function(list, level){
					list.getChildren().each(function(item){
						message += '- '.repeat(level) + item.getElement('span').get('text') + '\n';
						var parent = item.getElement('ul');
						if (parent)
							crawler(parent, level + 1);
					});
				};
				message = '\n\nAll of these subpages will be deleted too:\n';
				crawler(parent, 1);
			}else if (this.type == 'top'){
				new Request.JSON({url : active.get('href') + '/navigation/jsonlist', async : false, onComplete : function(list){
					if (list && list.length > 0){
							message = '\n\nThese are some of the subpages that will be deleted:\n';
						list.each(function(item){
							message += '- '.repeat((item.orderid.replace(/\./g,'').length/3) - 1) + item.navigationname + '\n';
						});
					}
				}}).send();
			}
			if (confirm('This action can not be undone.'+message+' \n\nAre you sure you want to delete this?')){
				this.formContainer.addClass('hidden');
				if(this.type == 'left') this.sortable.idle = true;  // Added by eric
				this.module.getElement('.feedback').adopt(new Element('img',{src:this.options.saveImg})).appendText(' deleting...');
				new Request({url:this.active.getProperty('href')+'/navigation/delete?ajax=1&confirm=1',onSuccess:function(list){
					this.setFeedback('save:done',this.module.getElement('.feedback'));
					if(this.type == 'left') $('module_leftnav').getElement('.edit_content').getFirst('div.feedback').grab($('leftnav_form_container'),'before'); // Added by peter

					var li = active.getParent();
					var id = li.getProperty('id').match(/\w+_(\d+)/)[1];
					if ((id == Navigation.section_navigationid && this.type == 'top') || (id == Navigation.page_navigationid && this.type == 'left'))
						window.location = '/'+Session.portfolio.url;
					li.destroy();
				}.bind(this)}).send();
			}
		},

		execCommand : function(command){
			switch(command){
				case 'NavigationHasDraft':
					$('publish_all_btn').removeClass('hidden');
					var element = $('leftnav_'+Navigation.page_navigationid).getElement('a');
					if (element.getElement('span.drafts'))
						return;
					element.adopt(new Element('span',{text:' (drafts)','class':'drafts'}));
					break;
				case 'NavigationWasPublished':
					var unpublished = Module.getUnpublished();
					if (unpublished.length == 0){
						var drafts = $('leftnav_'+Navigation.page_navigationid).getElement('.drafts');
						if (drafts){
							$('publish_all_btn').addClass('hidden');
							drafts.destroy();
						}
					}
					break;
				default:
					this.parent.apply(this,arguments);
			}
		}
	});

	$extend(NavigationModule,{ //static methods
	});


	//////////////////////////////////////////////////////////////////////

	Element.implement({
		isOnlyChild : function(){
			return (this.getParent().getChildren().length==1)
		}
	});
}else{
	NavigationModule = new Class({
		initialize : function(module) {
			this.module = $(module);
			this.module.getElements('.collapseablef').each(function(collapseable){
				NavigationModule.attachCollapseToggle(collapseable);
				if(!collapseable.hasClass('expand_by_default'))
					collapseable.fireEvent('click');
			});
			this.module.getElements('ul.leftnav .heading').each(function(heading){
				NavigationModule.attachHeadingCollapseToggle(heading,true);
			});
		}
	});
}

$extend(NavigationModule,{ //static methods
	attachHeadingCollapseToggle : function(heading,bool) {
		heading.removeEvent('click',heading.toggleHandler);
		if(bool){
			heading.addEvent('click',heading.toggleHandler = function(){
				var page = heading;
				var collapseablef_img = page.getParent().getElement('img.collapseablef');
				collapseablef_img = (collapseablef_img != null && collapseablef_img.getParent() == page.getParent()) ? collapseablef_img : null;
				if(collapseablef_img){
					collapseablef_img.fireEvent('click');
				}
			});
		}
	},
	attachCollapseToggle : function(collapseable) {
		collapseable.addEvent('click',function(event){
			if(collapseable.getNext('ul')){
				if(collapseable.getNext('ul').hasClass('hidden')){
					collapseable.getNext('ul').removeClass('hidden');
					collapseable.set('src','/images/navigation_arrow_open.png');
				}else{
					collapseable.getNext('ul').addClass('hidden');
					collapseable.set('src','/images/navigation_arrow_collapsed.png');
				}
			} else {
				collapseable.set('src','/images/navigation_arrow_open.png');
			}
		});
	}
});