var Survey = {
	
	changeInputType: function(oldObject, oType) {
    var newObject = document.createElement('input');
    newObject.type = oType;
    if(oldObject.size) newObject.size = oldObject.size;
    if(oldObject.value) newObject.value = oldObject.value;
    if(oldObject.name) newObject.name = oldObject.name;
    if(oldObject.id) newObject.id = oldObject.id;
    if(oldObject.className) newObject.className = oldObject.className;
    oldObject.parentNode.replaceChild(newObject,oldObject);
    return newObject;
  },
	
	setup: function() {
	  var emailEl = jQuery('input[name=email]').eq(0);
	  var pageNumEl = jQuery('.pageNum').eq(0);
	  var totalPagesEl = jQuery('.totalPages').eq(0);
	  var submitEl = jQuery('input[type=submit]').eq(0);
	  if (emailEl.length > 0 && pageNumEl.length > 0 &&
	    totalPagesEl.length > 0 && submitEl.length > 0) {
	    var pageNum = parseInt(pageNumEl.text());
	    this.pageNum = pageNum;
	    var totalPages = parseInt(totalPagesEl.text());
	    this.totalPages = totalPages;
	    if (pageNum > 1) {
	      var label = emailEl.parent().eq(0).parent().eq(0).parent().eq(0).find('td').eq(0);
				this.changeInputType(emailEl[0], 'hidden');
	      label.css('display', 'none');
	    }
	    if (pageNum == totalPages) {
	      submitEl.attr('value', 'Submit Survey');
	    } else {
	      submitEl.attr('value', 'Next Page >');
	    }
	  }
		this.container = jQuery('.surveyHideContainer, #firstPageContainer').eq(0);
		this.table = this.container.find('form > table').eq(0);
		this.tbody = this.table.children('tbody').eq(0); 
		if (this.tbody.length == 0) { this.tbody = this.table; }
		this.trs = this.tbody.children('tr');
		this.initLookupAndClasses();
	},
	
	show: function() {
		if (this.container) {
			this.container.css('visibility', 'visible');
		}
	},
	
	fold: function(start, end, trigger) {
	  this.trs = this.tbody.children('tr');
		var startRow = this.rowLookup[start];
		var startField = this.tbody.find('*[name=' + start + ']');
		var endRow = this.rowLookup[end];
		/*startRow.css('background', 'lightgreen');
		endRow.css('background', 'pink');
		startField.css('background', 'lightyellow');*/
		var el = document.createElement('tr');
		var containerRow = jQuery(el);
		containerRow.addClass('fold-container-row');
		// new Element('tr', {'class': 'fold-container-row'});
		el = document.createElement('td');
		var containerCell = jQuery(el);
		containerCell.addClass('fold-container-cell');
		//new Element('td', {'class': 'fold-container-cell'});
		el = document.createElement('div');
		var containerDiv = jQuery(el);
		containerDiv.addClass('fold-container-div');
		//new Element('div', {'class': 'fold-container-div'});
		el = document.createElement('table');
		var containerTable = jQuery(el);
		containerTable.addClass('fold-container-table');
		//new Element('table', {'class': 'fold-container-table'});
		el = document.createElement('tbody');
		var containerTbody = jQuery(el);
		containerTbody.addClass('fold-container-tbody');
		//new Element('tbody', {'class': 'fold-container-tbody'});
		var startIndex = this.trs.index(startRow);
		var endIndex = this.trs.index(endRow);
		console.log('folding "' + start + '" to "' + end + '", from index ' + startIndex + ' to ' + endIndex + ' inclusive');
		if (endIndex <= startIndex) { return; }
		containerTable.append(containerTbody);
		containerDiv.append(containerTable);
		containerCell.append(containerDiv);
		containerRow.append(containerCell);
		startRow.after(containerRow);
		for (var i = startIndex + 1; i <= endIndex; i += 1) {
			var row = this.trs.eq(i);
			containerTbody.append(row);
		}
		var self = this;
		if (startField.length > 1) {
		  startField.each(function() { 
		    var field = jQuery(this);
  		  field.bind('click', function(e) {
  			  self.doFold(field, trigger, containerRow);
  		  });
  	  });
		} else {
		  startField.each(function() { 
		    var field = jQuery(this);
  		  field.bind('change', function(e) {
  			  self.doFold(field, trigger, containerRow);
  		  });
  	  });
		}
		this.doFold(startField, trigger, containerRow);
	},
	
	doFold: function(startField, trigger, slide) {
		jQuery('.fold-container-div').each(function() {
		  var div = jQuery(this);
			div.parent().css('height', 'auto');
		});
		console.debug(startField.attr('value') + ' == ' + trigger + ' ?');
		console.debug('' + startField[0].checked != false);
		if (startField.attr('value') == trigger && (startField[0].checked != false)) {
		  slide.css('display', 'block');
			//slide.slideDown("normal");
		} else {
		  slide.css('display', 'none');
			//slide.slideUp("normal");
		}
	},
	
	initLookupAndClasses: function() {
		this.rowLookup = {};
		var rows = this.trs;
		var self = this;
		rows.each(function() {
		  var row = jQuery(this);
			var fields = row.find('input, select, textarea');
			fields.each(function() {
			  var field = jQuery(this);
				var name = field.attr('name');
				var type = field.attr('type');
				var tag = field[0].tagName.toLowerCase();
				var elClass = tag;
				if (type && type != '') { elClass += ('-' + type); }
				if (!name) { name = 'none'; }
				if (type == 'hidden') { return; }
				var cell = field.parent();
				var cellIndex = cell.parent().children().index(cell) + 1;
				var label = cell.find('label').eq(0);
				self.rowLookup[name] = row;
				if (type == 'radio') {
					var radioIndex = cell.children().find('input[type=radio]').index(field) + 1;
					var itemName = name + '_' + radioIndex.toString();
					field.addClass(itemName + '-field');
					var itemLabel = field.next();
					if (itemLabel) {
						itemLabel.addClass(itemName + '-label');
						itemLabel.addClass(elClass + '-item-label');
					}
				}
				/* checkbox and radio button array fields have brackets in their names */
				if (name.match(/^__custom-[0-9]+\[[0-9]+\]/)) {
					name = name.replace(/^__/, '');
					var origName = name.replace(/\[/, '_').replace(/\]/, '');
					var itemLabel = field.next();
					name = name.replace(/\[[0-9]+\]/, '');
					cell.addClass(name + '-column');
					cell.addClass('column-' + cellIndex.toString());
					if (itemLabel) {
						itemLabel.addClass(origName + '-label');
						itemLabel.addClass(elClass + '-item-label');
					}
					label = cell.parent().eq(0).parent().eq(0).parent().eq(0).parent().eq(0).find('label').eq(0);
					if (true) {
					  var afterLabel = label.next();
  					var afterAfter = afterLabel.next();
    				if (afterLabel.length > 0 && afterLabel[0].tagName == 'BR' && afterAfter.length > 0 &&
    				  afterAfter[0].tagName == 'TABLE') {
    				  afterLabel.remove();
    				}
					}
				} else {
					cell.addClass(name + '-cell');
					cell.addClass(elClass + '-cell');
				}
				field.addClass(name + '-field');
				field.addClass(elClass + '-field')
				row.addClass(name + '-row');
				row.addClass(elClass + '-row');
				row.addClass('survey-row');
				row.children('td').children('table').addClass('survey-row-table');
				if (label) {
					label.addClass(name + '-label');
					label.addClass(elClass + '-label');
				}
			});
		});
	}

};