/**
 * @version $Id: admin.js,v 1.9 2008/05/27 15:25:55 tsb Exp $
 * @author tim.beadle@iop.org
 */
 
/*jslint browser: true */
/*extern $, Validation, RemoteSubmit */
var Admin = {
	modifyLinks : '<a href="#" class="delete" title="Delete item">Delete</a> ' +
		' <a href="#" class="move up" title="Move up">Up</a> ' +
		' <a href="#" class="move down" title="Move down">Down</a>',
	applicationList : {},
	articleTypeList : {},
	channelList : {},
	directoryTypeList : {},
	conditionList : {
		'static' : {name: 'static'},
		'dynamic' : {name: 'dynamic'},
		'never' : {name: 'never'}
	},
	/**
	 * numberOfSponsors The number of sponsors
	 */
	numberOfSponsors : 0,
	
	/**
	 * numberOfFreeTexts The number of free text slots
	 */
	numberOfFreeTexts : 0,

	/**
	 * 
	 */
	toggleForm : function(formIdentifier) {
		$('#'+formIdentifier+'Form').toggle('fast');
		$('#'+formIdentifier+'Control').toggleClass('zoomOut');
		$('#'+formIdentifier+'Control').toggleClass('zoomIn');
	},
	
	/**
	 * 
	 */
	init : function () {
		$('h2#promoControl').click(function(){
			Admin.toggleForm('promo');
		});
		$('h2#featureControl').click(function(){
			Admin.toggleForm('feature');
		});
		$('input[@type=submit]').click(function(){
			RemoteSubmit.selectSubmitButton(this);
		});
		$('form.featuredListForm').submit(function(){
			return Validation.validate(this);
		});
		$('form.featuredListForm input.date').focus(function(){
			Validation.clearField(this,Validation.dateMask);
		});
		$('form.remoteSubmit').submit(function(){
			RemoteSubmit.makeRequest(this);
			return false;
		});
		
		$('#promoControl').addClass('zoomIn');
		$('#featureControl').addClass('zoomIn');
		
		$('#EditNewswireAdvanced .applicationId').change(function(){
			Admin.applicationEvent(this);
		});
		
		$("#EditNewswireAdvanced table").before('<p id="newContent">'+
			'<a href="#" class="add">Add new content element</a></p>');
		$("#newContent a").click(function(){
			Admin.addRow();
			return false;
		});
		
		
		$('#EditNewswireAdvanced .ordinal').hide().parent().addClass('modifyLinks').append(Admin.modifyLinks);
		Admin.attachLinkEvents();
		$('.ordinal').parent().width(56);
	},
	
	/**
	 * @author tim.beadle@iop.org
	 * @param ordinal the position in the list of sets of fields
	 * @param applicationName the application name
	 */
	modifyParamFields : function(ordinal,applicationName) {
		switch (applicationName) {
			case "sponsors":
				Admin.addSelectBox({ordinal: ordinal, name: "firstParam", label: "Sponsor", count: Admin.numberOfSponsors});
				Admin.checkBox(ordinal,"secondParam","Self-contained?","1");
				break;
			case "freeText":
				Admin.addSelectBox({ordinal: ordinal, name: "firstParam", label: "Free Text", count: Admin.numberOfFreeTexts});
				Admin.addHiddenField(ordinal, "secondParam", "");
				break;
			case "articles":
				Admin.populateArticleFilters(ordinal);
				break;
			case "directory":
				Admin.addSelectBox({ordinal: ordinal, name: "firstParam", data: Admin.directoryTypeList});
				Admin.addHiddenField(ordinal, "secondParam", "");
				break;
			case "buyersguide":
				Admin.addSelectBox({ordinal: ordinal, name: "firstParam", data: Admin.buyersGuideTypeList});
				Admin.addSelectBox({ordinal: ordinal, name: "secondParam", data: Admin.assetTypeList});
				break;
			default:
				Admin.addHiddenField(ordinal, "firstParam", "");
				Admin.addHiddenField(ordinal, "secondParam", "");
				break;
		}
	},
	
	/**
	 * 
	 */
	textBox : function(name,index){
		return '<input type="text" value="" class="'+name+'" name="'+name+'['+index+']" />';
	},
	
	/**
	 * 
	 */
	addSelectBox : function(o) {
		var elemId = "#"+o.name+o.ordinal;
		if($(elemId).is("select")) {
			$(elemId).empty();
		}
		else {
			var theParent = Admin.getAncestor(elemId, 'td');
			$(theParent).children().remove();
			$(theParent).append('<select name="'+Admin.fieldName(o.ordinal,o.name)+
				'" class="'+o.name+'" id="'+o.name+o.ordinal+'"></select>');
		}
		// Populated from an object
		if (o.data !== undefined) {
			var firstOption = null;
			for(var field in o.data) {
				if (o.data[field].name !== undefined) {
					if (firstOption === null) {
						firstOption = field;
					}				
					var label = o.data[field].description !== undefined ? 
						o.data[field].description : 
						o.data[field].name;
					$(elemId).addOption(field, label.replace('&amp;','x26'));
				}
			}
			$(elemId).selectOptions(firstOption);
		}
		// Populated as n instances of x
		else if (o.label !== undefined && o.count !== undefined) {
			for(var i = 1; i <= o.count; i++) {
				$(elemId).addOption(i, o.label + " #" + i);
			}
			$(elemId).selectOptions("1");
		}
	},
	
	/**
	 * 
	 */
	checkBox : function(ordinal,name,label,value) {
		var elemId = "#"+name+ordinal;
		var theParent = Admin.getAncestor(elemId, 'td');
		if (!$(elemId).is("input[@type='checkbox']")) {
			$(theParent).children().remove();
			$(theParent).append('<label for="'+name+ordinal+
				'"><input type="checkbox" name="'+Admin.fieldName(ordinal,name)+
				'" id="'+name+ordinal+'" value="'+value+'" /> '+label+'</label>');
		}
	},
	
	/**
	 * 
	 */
	hiddenField : function(ordinal,name,value) {
		return '<input type="hidden" name="'+Admin.fieldName(ordinal,name)+
			'" id="'+name+ordinal+'" value="'+value+'" />';
	},
	
	/**
	 * 
	 */
	addHiddenField : function(ordinal,name,value) {
		var elemId = "#"+name+ordinal;
		var theParent = Admin.getAncestor(elemId, 'td');
		$(theParent).children().remove();
		$(theParent).append(Admin.hiddenField(ordinal,name,value));
	},
	
	/**
	 * 
	 */
	getAncestor : function(elem, elemName) {
		var theParents = $(elem).parents();
		var theParent;
		for(var i=0; i<theParents.length; i++) {
			if($(theParents[i]).is(elemName)) {
				theParent = $(theParents[i]);
				break;
			}
		}
		return theParent;
	},
	
	/**
	 * 
	 */
	moveRow : function(elemId,direction) {
		var hasMoved = 0;
		if (elemId.substring(0,1)!='#') {
			elemId = '#'+elemId;
		}
		var delta = direction == 'down' ? 1 : -1;
		var currentElemChildren = Admin.childFields(elemId);
		Admin.changeNameIndex(currentElemChildren,delta);
		var swapId = direction == 'down' ?
			$(elemId).next().attr("id") :
			$(elemId).prev().attr("id");
		if (swapId !== undefined) {
			var swapElemChildren = Admin.childFields(swapId);
			Admin.changeNameIndex(swapElemChildren,delta * -1);
			if (direction == 'down') { 
				$(elemId).next().insertBefore(elemId);
			}
			else {
				$(elemId).prev().insertAfter(elemId);
			}
			hasMoved = 1;
		}
		
		$(elemId).css({"background-color" : "transparent"});
		return hasMoved;
	},
	
	/**
	 * 
	 */
	childFields : function(elemId) {
		if (elemId.substring(0,1)!='#') {
			elemId = '#'+elemId;
		}
		var childFields = $(elemId + " td").children().not("a");
		return childFields;
	},
	
	/**
	 * 
	 */
	fieldName : function(ordinal,name) {
		var idx = ordinal - 1;
		return name+"["+idx+"]";
	},
	
	/**
	 * 
	 */
	changeNameIndex : function(fieldArray,delta) {
		for(var i=0; i<fieldArray.size(); i++){
			if (fieldArray[i].name !== undefined) {
				var currentIndexPattern = /\w+\[([\d]+)\]/;
				var namePattern = /([\w]+\[)\d+(\])/;
				var currentIndex = parseInt(fieldArray[i].name.replace(currentIndexPattern, "$1"), 10);
				var newIndex = currentIndex + delta;
				var newName = fieldArray[i].name.replace(namePattern, "$1"+newIndex+"$2");
				fieldArray[i].name = newName;
			}
		}
	},
	
	/**
	 * 
	 */
	addRow : function() {
		var newFieldsIndex = $("#EditNewswireAdvanced table tbody tr").size();
		var newRowIndex = newFieldsIndex + 1;
		var newRowId = "contentItem"+newRowIndex;
		
		$("#EditNewswireAdvanced table tbody").append('<tr id="'+newRowId+'"></tr>');
		var newTr = "#"+newRowId;
		for(var i=0; i<6; i++) {
			switch(i) {
				case 0:
					$(newTr).append('<td><input type="hidden" name="ordinal" size="2" class="ordinal" value="'+newRowIndex+'" />'+
						Admin.modifyLinks +'</td>');
					Admin.attachLinkEvents();
					break;
				case 1:
					$(newTr).append('<td>' + Admin.textBox('description',newFieldsIndex) + '</td>');
					break;
				case 2:
					$(newTr).append('<td>' + Admin.hiddenField(newRowIndex,'applicationId','null') + '</td>');
					Admin.addSelectBox({ordinal: newRowIndex, name: "applicationId", data: Admin.applicationList});
					break;
				case 3:
					$(newTr).append('<td>' + Admin.hiddenField(newRowIndex,'firstParam','null') + '</td>');
					break;
				case 4:
					$(newTr).append('<td>' + Admin.hiddenField(newRowIndex,'secondParam','null') + '</td>');
					break;
				case 5:
					$(newTr).append('<td>' + Admin.hiddenField(newRowIndex,'condition','null') + '</td>');
					Admin.addSelectBox({ordinal: newRowIndex, name: "condition", data: Admin.conditionList});
					break;
			}
		}
		$('.applicationId').change(function(){
			Admin.applicationEvent(this);
		});
		Admin.populateArticleFilters(newRowIndex);
		$(newTr).highlightFade({start:'#ff9',speed:2000,end:'#fff'});
	},
	
	/**
	 * 
	 */
	applicationEvent : function(elem) {
		var idx = elem.selectedIndex;
		var ordinal = elem.id.replace("applicationId", "");
		Admin.modifyParamFields(ordinal,Admin.applicationList[elem.options[idx].value].name);
	},
	
	/**
	 * 
	 */
	moveEvent : function(elem){
		var theParent = Admin.getAncestor(elem, 'tr');
		var theTrId = '#'+$(theParent).attr("id");
		$(elem).removeClass("move");
		Admin.moveRow(theTrId, $(elem).attr("class"));
		$(theTrId).highlightFade({start:'#ff9',speed:2000,end:'#fff'});
		return false;
	},
	
	/**
	 * 
	 */
	deleteRow : function(elem){
		var theParent = Admin.getAncestor(elem, 'tr');
		var theTrId = '#'+$(theParent).attr("id");
		var keepMoving = 1;
		while (keepMoving == 1) {
			keepMoving = Admin.moveRow(theTrId, 'down');
		}
		$(theTrId).remove();
	},
	
	/**
	 * 
	 */
	populateArticleFilters : function(ordinal) {
		Admin.addSelectBox({ordinal: ordinal, name: "firstParam", data: Admin.channelList});
		Admin.addSelectBox({ordinal: ordinal, name: "secondParam", data: Admin.articleTypeList});
	},
	
	/**
	 * 
	 */
	attachLinkEvents : function() {
		$('#EditNewswireAdvanced .move').click(function(){
			Admin.moveEvent(this);
			return false;
		});
		$('#EditNewswireAdvanced .delete').click(function(){
			Admin.deleteRow(this);
			return false;
		});		
	}
};

$(document).ready(Admin.init);
