function checkLocation(newLocation, historyData)
{
	wizard.parseAnchor(newLocation);
}

var theMachineUrl = appBaseUrl;

function Wizard(){	
}

var TYPE_PICKER = 0;
var TYPE_SLIDER = 1;
var TYPE_HIDDEN = 2;

var MAX_STRIPE_COLORS = 10;

var wizard = 
{
	lastLocationHash: null,
	currentDirectionId: 'orientation_0',
	lastImageUrl: null,
	lastParamString: null,
	tiledPreview: true,
	nextBandId: 1,
	bandIds: [],

	selectOrientation: function(v)
	{
		var dirId = 'orientation_' + v;
		$(this.currentDirectionId).className = "";
		$(this.currentDirectionId = dirId).className = "icon_selected";
		$('orientation').value = v;
		this.notifyChanged();
	},
	
	setColor: function(pickerId, color)
	{
		$S(pickerId).background = '#' + color;
		$(pickerId + '_input').value = color;
		this.notifyChanged();
	},
	
	fields:
	{
		fore:
		{
			type:2,
			ajax_param: 'fore',
			defaultValue: '705551,2,F7E7BA,6,89B7D9,2'
		},
		yarn_size_input:
		{
			type: 1,
			ajax_param: 'l',
			defaultValue: 1
		},
		orientation:
		{
			type: 2,
			ajax_param: 't',
			defaultValue: 0
		}
	},
	
	validate: function()
	{
		this.updateBandsField();
		
		var errors = "";
		
		for(field in this.fields)
		{
			if(this.fields[field].validate && !this.fields[field].validate($(field).value))
			{
				errors += this.fields[field].err_msg + "<br/>";
			}
		}
		if(errors == "")
		{
			this.updateAnchor();
			
			this.submit();
		}
	},
	
	submit: function()
	{
		this.lastParamString = "";
		
		var isDefaultImage = true;
		
		for(field in this.fields)
		{
			isDefaultImage = isDefaultImage && ($(field).value == this.fields[field].defaultValue);
			this.lastParamString += this.fields[field].ajax_param + "=" + $(field).value + "&";
		}
		
		$S('preview_refresher').visibility = 'hidden';
		
		$S('tile_preview').backgroundRepeat = this.tiledPreview ? 'repeat' : 'no-repeat';
		
		this.setDraggerConstraints();

		this.lastImageUrl = appBaseUrl + "generators/generate_tartan.php?" + this.lastParamString;
		
//		alert(this.lastImageUrl);
		
//		location.href = this.lastImageUrl;
		
		if(1)
		{
			$S('tile_preview').backgroundImage = "url('" + this.lastImageUrl + "')";
		}
		else
		{
			$S('tile_preview').backgroundImage = "url('images/defaultstripe.png')";
		}
	},
	
	updateAnchor: function()
	{
		var anchorString = "";
		
		for(field in this.fields)
		{
			anchorString += this.fields[field].ajax_param + "=" + $(field).value + ";";
		}
		
		this.lastLocationHash = encode64(anchorString);
		
		dhtmlHistory.add(this.lastLocationHash, "");
		
		
	},
	
	parseAnchor: function()
	{
		var anchorString = location.hash.substring(1);
		
		if(this.lastLocationHash == null || this.lastLocationHash != anchorString)
		//if(1)
		{
			this.lastLocationHash = anchorString;
			
			if(anchorString != '')
			{
				anchorString = decode64(anchorString);
				
				var anchorParams = anchorString.split(';');
				var paramsHash = new Array();
				
				for(var i=0; i<anchorParams.length; i++)
				{
					var keyValueArray = anchorParams[i].split('=');
					paramsHash[keyValueArray[0]] = keyValueArray[1];
				}
				
				for(field in this.fields)
				{
					this.parseField(field, paramsHash[this.fields[field].ajax_param]);
				}
			}
			else
			{
				for(field in this.fields)
				{
					this.parseField(field, this.fields[field].defaultValue);
				}
			}
			this.submit();
		}
	},
	
	parseField: function(fieldId, fieldValue)
	{
		if(fieldId != '')
		{
			$(fieldId).value = fieldValue;
			
			switch(this.fields[fieldId].type)
			{
				case TYPE_PICKER:
					parseColorFromInput(fieldId.substring(0, fieldId.length - 6));
					break;
				case TYPE_SLIDER:
					Slider.updateFromInput(fieldId.substring(0, fieldId.length - 6));
					break;
				case TYPE_HIDDEN:
					if(fieldId == 'orientation')
					{
						this.selectOrientation(fieldValue);
					}
					else if(fieldId == 'fore')
					{
						this.parseBands(fieldValue);
					}
					break;
			}
		}
	},
	
	notifyChanged: function()
	{
		if($('preview_refresher'))
			$S('preview_refresher').visibility = 'visible';
	},
	
	download: function()
	{
		$('download_link').href = this.lastImageUrl + "&download=1";
		
		return true;
	},
	
	afterDownload: function()
	{
		$('download_link').href = '#';
	},
	
	switchTileStyle: function()
	{
		var imgSrc;
		if(this.tiledPreview)
		{
			$S('tile_preview').top = ($('tile_preview_container').offsetHeight - $('tile_preview').offsetHeight) / 2 + "px";
			$S('tile_preview').left = ($('tile_preview_container').offsetWidth - $('tile_preview').offsetWidth) / 2 + "px";
			
			$S('tile_preview').backgroundRepeat = "no-repeat";
			imgSrc = 'unchecked';
		}
		else
		{
			$S('tile_preview').backgroundRepeat = 'repeat';
			imgSrc = 'checked';
		}
		
		document.images['tile_show_style'].src = 'images/wizard/' + imgSrc + '.gif';
		this.tiledPreview = !this.tiledPreview;
		
		this.setDraggerConstraints();
	},
	
	setDraggerConstraints: function()
	{
		if(!this.tiledPreview)
		{
			previewDragger.dragConstraints = DRAG_NONE;
		}
		else
		{
			previewDragger.dragConstraints = DRAG_BOTH;
		}
	},
	
	updateBandsField: function()
	{
		var bandsArray = new Array();

		for(i = 0; i < this.bandIds.length; i++)
		{
			bandsArray.push($('band_' + this.bandIds[i] + '_color_input').value);
			
			bandsArray.push($('band_' + this.bandIds[i] + '_size_input').value);
		}
		$('fore').value = bandsArray.join(',');
	},
	
	parseBands: function(colors)
	{
		$('fore').value = colors;

		colors = colors.split(',');
//		alert(colors.length);
//		alert(wizard.bandIds.length);
		for(var i = this.bandIds.length - 1; i >= 2; i--)
		{
			this.removeBand(this.bandIds[i]);
		}
//		alert(wizard.bandIds.length);
		this.parseBandData(0, colors[0], colors[1]);
		this.parseBandData(1, colors[2], colors[3]);
		
		for(var i = 2; i < colors.length / 2; i++)
		{
			this.addBand(this.bandIds[i - 1], colors[i * 2]);
			this.parseBandData(i, colors[i * 2], colors[i * 2 + 1]);
		}
//		alert(wizard.bandIds.length);
	},
	
	parseBandData: function(bandIndex, color, size)
	{
		this.setColor('band_' + this.bandIds[bandIndex] + '_color', color);
		
		var baseId = 'band_' + this.bandIds[bandIndex] + '_size';
		$(baseId + '_input').value = size;
		Slider.updateFromInput(baseId);
	},
	
	addBand: function(prevBandId, color)
	{
		if(this.bandIds.length < MAX_STRIPE_COLORS)
		{
			var prevElId = 'band_' + prevBandId + '_size';
			
			var bandIndex = this.getBandIndex(prevBandId);
			
			if(!color)
			{
				color = 'ff0000';
			}
			
			createTartanElement($('bands_list'), 
				'band ' + (bandIndex + 2), 
				this.nextBandId,
				color,
				$(prevElId));
			
			this.bandIds.splice(bandIndex + 1, 0, this.nextBandId);
			
			if(bandIndex >= 0)
			{
				this.updateBandLabels(bandIndex + 1);
			}
			this.nextBandId++;
			
			this.notifyChanged();
		}
	},
	
	removeBand: function(bandId)
	{
		if(bandId > 0 && this.bandIds.length > 2)
		{
			var bandIndex = this.getBandIndex(bandId);
			
			var bandElement = $('band_' + bandId + '_size');
			
			bandElement.parentNode.removeChild(bandElement);

			this.bandIds.splice(bandIndex, 1);
			
			this.updateBandLabels(bandIndex);
			
			this.notifyChanged();
		}
		else
		{
			alert("You must use at least 2 bands to create a tartan");
		}
	},
	getBandIndex: function(bandId)
	{
		for(var i = 0; i < this.bandIds.length; i++)
		{
			if(this.bandIds[i] == bandId)
				return i;
		}
		return -1;
	},
	updateBandLabels: function(fromBandIndex)
	{
		for(i = fromBandIndex; i < this.bandIds.length; i++)
		{
			var labelTextId = 'band_' + this.bandIds[i] + '_size_text';
			
			$(labelTextId).innerHTML = 'band ' + (i + 1);
		}
	},
	
	share: function()
	{
		popup(500, 'sharestripe', wizard.showSharedStripe);
	},
	
	showSharedStripe: function()
	{
		if($('shared_stripe'))
		{
			$('shared_stripe').style.backgroundImage = "url('" + wizard.lastImageUrl + "')";
		}
	}
}

