/*


	Application for generating typecooker assignments.







*/



function randInt ( n )
{
  return 1 + ( Math.floor ( Math.random ( ) * n) );
}

function choice(aList){
	return aList[randInt(aList.length-1)];
}


var olddata = {
	
	'keys': [
		'width',
		'weight',
		'construction',
		'stroke endings',
		'ascender',
		'descender', 
		'contrast type',
		'contrast amount',
		'stems',
		'intended application',
		'intended size',
		'special'
		],
	
	'construction': [
		{
			'weight': 10,
			'name': "roman",
			'level': 1
		},
		{
			'weight': 10,
			'name': "italic",
			'level': 2
		},
		{
			'weight': 2,
			'name': "caps and smallcaps",
			'level': 4
		},
		{
			'weight': 5,
			'name': "roman + capitals",
			'level': 3
		},
		{
			'weight': 5,
			'name': "capitals + capitals",
			'level': 3
		},
		{
			'weight': 1,
			'name': "nothing special",
			'level': 1
		}
	],

	'ascender': [
		{
			'weight': 5,
			'name': "longer (than x-height)",
			'level': 2
		},
		{
			'weight': 5,
			'name': "shorter (than x-height)",
			'level': 2
		},
		{
			'weight': 2,
			'name': "much shorter than x-height",
			'level': 3
		},
		{
			'weight': 1,
			'name': "no ascenders",
			'level': 4
		},
		{
			'weight': 1,
			'name': "doesn't matter",
			'level': 4
		}
	],



	'descender': [
		{
			'weight': 5,
			'name': "longer (than x-height)",
			'level': 2
		},
		{
			'weight': 5,
			'name': "shorter (than x-height)",
			'level': 2
		},
		{
			'weight': 2,
			'name': "much shorter than x-height",
			'level': 3
		},
		{
			'weight': 1,
			'name': "no descenders",
			'level': 4
		},
		{
			'weight': 1,
			'name': "doesn't matter",
			'level': 4
		}
	],



	'width': [
		{
			'weight': 2,
			'name': "compressed",
			'level': 3
		},
		{
			'weight': 3,
			'name': "condensed",
			'level': 2
		},
		{
			'weight': 4,
			'name': "narrow",
			'level': 1
		},
		{
			'weight': 5,
			'name': "normal",
			'level': 1
		},
		{
			'weight': 4,
			'name': "extended",
			'level': 1
		},
		{
			'weight': 3,
			'name': "wide",
			'level': 2
		},
		{
			'weight': 2,
			'name': "very wide",
			'level': 2
		},
		{
			'weight': 2,
			'name': "monospaced",
			'level': 3
		},
		{
			'weight': 1,
			'name': "extremely wide",
			'level': 3
		}
	],




	'contrast type': [
		{
			'weight': 5,
			'name': "broad nib",
			'level': 2
		},
		{
			'weight': 5,
			'name': "broad nib / transitional",
			'level': 4
		},
		{
			'weight': 5,
			'name': "pointed nib",
			'level': 2
		},
		{
			'weight': 5,
			'name': "pointed nib / transitional",
			'level': 4
		},
		{
			'weight': 5,
			'name': "transitional",
			'level': 4
		},
		{
			'weight': 2,
			'name': "speedball",
			'level': 4
		},
		{
			'weight': 2,
			'name': "brush",
			'level': 4
		},
		{
			'weight': 2,
			'name': "can't be determined",
			'level': 5
		}
	],
	
	



	'contrast amount': [
		{
			'weight': 10,
			'name': "inverted contrast",
			'level': 5
		},
		{
			'weight': 10,
			'name': "slightly inverted contrast",
			'level': 5
		},
		{
			'weight': 10,
			'name': "no contrast at all (thick = thin)",
			'level': 4
		},
		{
			'weight': 10,
			'name': "no visible contrast",
			'level': 3
		},
		{
			'weight': 10,
			'name': "very low contrast",
			'level': 3
		},
		{
			'weight': 10,
			'name': "low contrast",
			'level': 1
		},
		{
			'weight': 10,
			'name': "some contrast",
			'level': 1
		},
		{
			'weight': 10,
			'name': "visible contrast",
			'level': 2
		},
		{
			'weight': 10,
			'name': "quite some contrast",
			'level': 2
		},
		{
			'weight': 10,
			'name': "a lot of contrast",
			'level': 1
		},
		{
			'weight': 10,
			'name': "high contrast",
			'level': 2
		},
		{
			'weight': 10,
			'name': "very high contrast",
			'level': 4
		},
		{
			'weight': 10,
			'name': "extreme contrast",
			'level': 5
		}
	],

	'stems': [
		{
			'weight': 10,
			'name': "straight",
			'level': 3
		},
		{
			'weight': 10,
			'name': "some ductus",
			'level': 3
		}
	],
	
	
	

	'stroke endings': [
		{
			'weight': 10,
			'name': "straight, no serif",
			'level': 1
		},
		{
			'weight': 10,
			'name': "a serif",
			'level': 1
		},
		{
			'weight': 5,
			'name': "rounded, no serif",
			'level': 3
		},
		{
			'weight': 5,
			'name': "bracketed serif",
			'level': 3
		},
		{
			'weight': 5,
			'name': "asymmetric serif",
			'level': 4
		},
		{
			'weight': 10,
			'name': "wedge shaped serifs",
			'level': 4
		},
		{
			'weight': 5,
			'name': "slab shaped serifs",
			'level': 3
		}
	],
	
	

	'weight': [
	{
		'weight': 2,
		'name': "hairline",
		'level': 4
	},
	{
		'weight': 3,
		'name': "very thin",
		'level': 4
	},
	{
		'weight': 4,
		'name': "thin",
		'level': 3
	},
	{
		'weight': 5,
		'name': "extra light",
		'level': 3
	},
	{
		'weight': 5,
		'name': "light",
		'level': 1
	},
	{
		'weight': 6,
		'name': "book",
		'level': 2
	},
	{
		'weight': 7,
		'name': "plain",
		'level': 1
	},
	{
		'weight': 6,
		'name': "medium",
		'level': 3
	},
	{
		'weight': 5,
		'name': "semi bold",
		'level': 3
	},
	{
		'weight': 4,
		'name': "bold",
		'level': 1
	},
	{
		'weight': 3,
		'name': "extra bold",
		'level': 3
	},
	{
		'weight': 2,
		'name': "black",
		'level': 4
	},
	{
		'weight': 1,
		'name': "heavy",
		'level': 4
	}
	],
	
	
	
	
	'intended application': [
	{
		'weight': 2,
		'name': "unknown",
		'level': 2
	},
	{
		'weight': 10,
		'name': "multi-purpose",
		'level': 2
	},
	{
		'weight': 10,
		'name': "newsprint",
		'level': 2
	},
	{
		'weight': 10,
		'name': "smooth offset printing",
		'level': 2
	},
	{
		'weight': 5,
		'name': "engraving",
		'level': 3
	},
	{
		'weight': 10,
		'name': "signage",
		'level': 2
	},
	{
		'weight': 5,
		'name': "packaging",
		'level': 3
	},
	{
		'weight': 2,
		'name': "subtitles on television",
		'level': 4
	},
	{
		'weight': 2,
		'name': "antialiased bitmaps",
		'level': 4
	},
	{
		'weight': 2,
		'name': "rubber stamps",
		'level': 4
	}
	],
	


	'intended size': [
	{
		'weight': 2,
		'name': "use very small",
		'level': 4
	},
	{
		'weight': 4,
		'name': "reading sizes",
		'level': 4
	},
	{
		'weight': 8,
		'name': "display sizes",
		'level': 4
	},
	{
		'weight': 4,
		'name': "very large sizes",
		'level': 4
	},
	{
		'weight': 4,
		'name': "most sizes",
		'level': 4
	}
	],
	


	'special': [
	{
		'weight': 5,
		'name': "use only straight lines",
		'level': 4
	},
	{
		'weight': 5,
		'name': "draw curves as octagonals",
		'level': 4
	},
	{
		'weight': 2,
		'name': "rough contours",
		'level': 4
	},
	{
		'weight': 2,
		'name': "casual",
		'level': 4
	},
	{
		'weight': 2,
		'name': "sketchy",
		'level': 4
	},
	{
		'weight': 5,
		'name': "cut as stencil without drop-out counters",
		'level': 4
	},
	{
		'weight': 8,
		'name': "must contains at least 1 ligature",
		'level': 4
	},
	{
		'weight': 8,
		'name': "must contains at least 2 ligatures",
		'level': 4
	},
	{
		'weight': 5,
		'name': "initial and terminal swashes",
		'level': 4
	},

	{
		'weight': 5,
		'name': "initial swash",
		'level': 4
	},

	{
		'weight': 5,
		'name': "terminal swashe",
		'level': 4
	}

	]
	



	
	
	

};




/* page switching, tab controller */

Controller = function(level){
	// app for lettersetter application
	bindMethods(this);
	log("initial level", level);
	this.level = level;		// the initial difficulty level
	this.count = 0;
	this.code = new Array();

	log("start");
	
	this.recipes = new Array();
	this.recipes.push("parameters.json");
	this.recipes.push("styles.json");
	this.currentRecipe = this.recipes[0]
	this.loadSelection();
}


// try to load data from a json file


Controller.prototype.changeRecipe = function(name){
	log("changeRecipe", name);
	this.currentRecipe = name+".json";
	this.loadSelection();
}


Controller.prototype.loadSelection = function(){	
	log("loadSelection attempt on", this.currentRecipe);
	var d  = loadJSONDoc(this.currentRecipe);
	d.addCallback(this.doneLoadSelection);
	d.addErrback(this.errorLoadSelection);
	log("loadSelection", d);
}


Controller.prototype.errorLoadSelection = function(results){
	// callback when the loading has failed
	log("can't load the parameter selection", results);
}

Controller.prototype.doneLoadSelection = function(results){
	// callback when the loading has succeeded
	log("Parameter selection loaded!", results);
	this.loadedData = results;
	this.generate(this.level);	
}




Controller.prototype.generate = function(level){
	log("generate");
	this.level = level;
	this.count = 0;
	this.code = new Array();
	selectedRecipeMarker = new Array();
	for(i=0; i<=this.recipes.length; i++){
		if(this.recipes[i]==this.currentRecipe){
			selectedRecipeMarker.push("levelNotSelected");
		}
		else{
			selectedRecipeMarker.push("levelSelected");
		}
	}
	
	selectedLevelMarker = new Array();
	for(i=0; i<=6; i++){
		if(i==this.level){
			selectedLevelMarker.push("levelNotSelected");
		}
		else{
			selectedLevelMarker.push("levelSelected");
		}
	}
	swapDOM('cookerrecipe', DIV({'id':'cookerrecipe'},
		H1(" "),
		
		P({"class":"containertop"}, "Pick a recipe: ",
			A({'class':selectedRecipeMarker[0], "href":"#", "onclick":"javascript:app.changeRecipe('parameters');"}, "by parameter"),
			A({'class':selectedRecipeMarker[1], "href":"#", "onclick":"javascript:app.changeRecipe('styles');"}, "by style ")
		),
		
		
		P({"class":"containertop"}, "Pick a level: ", 
			A({'class':selectedLevelMarker[1], "href":"#", "onclick":"javascript:app.generate(1);"}, "starter"),
			A({'class':selectedLevelMarker[2], "href":"#", "onclick":"javascript:app.generate(2);"}, "easy"),
			A({'class':selectedLevelMarker[3], "href":"#", "onclick":"javascript:app.generate(3);"}, "class"),
			A({'class':selectedLevelMarker[4], "href":"#", "onclick":"javascript:app.generate(4);"}, "experienced"),
			A({'class':selectedLevelMarker[5], "href":"#", "onclick":"javascript:app.generate(5);"}, "pro")
		),
		P({"class":"container"},
		TABLE({"class":"cookertable"}, THEAD(null), TFOOT(null), TBODY(null, 
			map(this.makeItem, this.loadedData.keys)))),

		//P({"class":"containerbottom"}, this.loadedData.description),

		P({"class":"containerbottom"}, "Generated on: ", toISOTimestamp(new Date())),
		P({"class":"containerbottom"}, "Selection: ", 	this.code)
		));
	
	
	
}

Controller.prototype.makeItem = function(itemName){
	log("makeItem");
	item = this.loadedData[itemName];
	this.count = this.count + 1;
	pool = new Array();
	source = new Array();
	for(i=0; i<item.length; i++){
		pick = item[i];
		if(pick.level>this.level){
			log("pick level skipping", pick.level);
			continue;
		}
		log("pick level adding", pick.level);
		for(j=0; j<pick.weight;j++){
			//pool.push(pick.name);
			pool.push(pick);
			source.push(i);
		}
	}
	log(pool);
	if(pool.length==0){
		return;
	}
	index = randInt(pool.length-1);
	this.code.push(this.count.toString()+":"+source[index].toString()+" ");
	//return TR(null, TD(null, this.count.toString()), TD(null, itemName), TD(null, pool[index]));
	if(pool[index].url != null){
		// there is a url for this item, make the text a link
		var itemEntry = A({"href":pool[index].url, "target":"_blanc"}, pool[index].name);
	}
	else{
		var itemEntry = pool[index].name;
	}
	return TR(null, TD(null, this.count.toString()), TD(null, itemName), TD(null, itemEntry));
}


