var Filter = {
	// variables
	display:{
		button:"Filter-Go",
		all:"Filters ul",
		city:"Filter-City",
		tags:"Filter-Tags",
		sites:"Filter-Sites"		
	},
	
	steps:[
		"tags",
		"city",
		"sites"
	],
	
	step:0,
	
	query:{
		tags:[],		
		city:[],
		sites:[]
	},
	
	// list arrays
	filters:{
		// tags
		tags:[
			"JavaScript",
			"AJAX",
			"ActionScript",
			"Flash",			
			"Java",
			"PHP",			
			"Ruby",
			"Web",
			"IA",
			"UI"
		],
		
		// city
		city:[
			"toronto",
			"montreal",
			"new york",
			"calgary",
			"vancouver"
		],		
		
		sites:[
			"krop",
			"indeed",
			"37signals",
			"alldevjobs",
			"meshjobs"
		]
	},
	
	sites:{
		"monster":{
			search:"http://jobsearch.monster.ca/Search.aspx?",
			city:"&where=",
			tags:"&q=",
			seperator:" "
		},
		"findnetjob":{
			search:"http://www.findnetjob.com/search/index?q=",
			city:"+",
			tags:"+",
			seperator:"+"		
		},
		"krop":{
			search:"http://www.krop.com/services/rest/search/1/",
			city:"",
			tags:".",
			seperator:" "			
		},
		"indeed":{
			search:"http://www.indeed.ca/jobs?",
			city:"&l=",
			tags:"&q=",
			seperator:" "			
		},
		"37signals":{
			search:"http://jobs.37signals.com/jobs/search?term=",
			city:"",
			tags:" ",
			seperator:" "			
		},
		"alldevjobs":{
			search:"http://alldevjobs.com/search/home|",
			city:" ",
			tags:" ",
			seperator:" "			
		},
		"meshjobs":{
			search:"http://www.meshjobs.com/jt/jobs/search.php?country_code=ca&search=1&go=Find+Jobs",
			city:"&location_string=",
			tags:"&search_string=",
			seperator:"+"			
		}											
	},	
	
	// build list	
	List:function(step)
	{
		// current step
		this.step	= !step ? 0 : step;
		var type	= this.steps[this.step];

		// button
		var button		= $("#" + this.display.button);
		button.fadeOut('fast');
		
		// all
		var all		= $("#" + this.display.all);
		all.hide();
				
		// ul
		var ul		= $("#" + this.display[type]);
		ul.fadeIn('slow');
		
		// list title
		if($(ul).children().length == 0)
		{
			var p		= $(document.createElement("p"));
			p.html(type + ":");
			ul.append(p);
						
			for(var n in this.filters[type])
			{
				var li		= $(document.createElement("li"));
				var tag		= this.filters[type][n];
				li.html(tag);
				$(li).data("type", type);
				$(li).data("tag", tag);			
				this.Functionality(li);
				ul.append(li);
			}			
		}
		
		// buttons
		this.Steps();
	},
	
	// click functionality for tag
	Functionality:function(li)
	{
		$(li).bind(
			'click',
			function()
			{
				var li = $(this);
				var data = {type:li.data("type"), tag:li.data("tag")}
				!li.hasClass("on") ? Filter.Add(data) : Filter.Remove(data);
				!li.hasClass("on") ? li.addClass("on") : li.removeClass("on");
			}
		)
	},

	// remove tag to array	
	Add:function(data)
	{
		this.query[data.type].push(data.tag);
	},
	// remove tag from array
	Remove:function(data)
	{
		var i		= 0;
		var array	= this.query[data.type];
		var tag		= data.tag
		while (i < array.length)
		{
			if (array[i] == tag){array.splice(i, 1);}
			else{i++;}
		}
		this.query[data.type] = array;
	},
	
	Step:function(dir)
	{
		// check if something selected
		var progress = true;
		if(this.query[this.steps[this.step]].length < 1 && dir === 1)
		{
			$("#Filter-Step-Next").removeClass("green").addClass("red");
			progress = false;
		}
		
		if(progress)
		{
			this.step += dir;
			this.step = this.step > this.steps.length - 1 ? this.step - 1 : this.step < 0 ? 0 : this.step;

			this.List(this.step);			
		}
	},
	
	Steps:function()
	{
		$("#Filter-Step-Back, #Filter-Step-Next, #Filter-Step-Done").hide().removeClass("red").addClass("green");
		switch(this.step)
		{
			case 0:
				$("#Filter-Step-Next").show();				
			break;
			case (this.steps.length - 1):
				$("#Filter-Step-Back, #Filter-Step-Done").show();			
			break;
			default:
				$("#Filter-Step-Back, #Filter-Step-Next").show();
			break;		
		}
	},
	
	Search:function()
	{
		// check if something selected
		var progress = true;
		if(this.query["sites"].length < 1)
		{
			$("#Filter-Step-Done").removeClass("green").addClass("red");
			progress = false;
		}
		
		if(progress)
		{
			$("#Filter-Step-Done").fadeOut('fast');			
			this.Hash();

			$("#Results").empty();
			this.Result();
			
			// hide filters
			var all		= $("#" + this.display.all);
			all.hide();
			$("#Filter-Step-Back, #Filter-Step-Next, #Filter-Step-Done").hide()
			
			// show filter button
			var button		= $("#" + this.display.button);
			button.fadeIn('fast');		
			
		}		
	},
	
	Hash:function()
	{
		var vars	= "";
		for(prop in this.query)
		{
			vars += prop + "=" + this.query[prop] + "&";
		}
		vars = vars.slice(0, vars.length - 1)
		window.location.hash = vars;
	},
	
	Result:function()
	{
		query	= this.query;
		for(var s in query.sites)
		{
			var site, search, city, tags, seperator
			site		= this.sites[query.sites[s]];
			search		= site.search;
			city		= site.city;
			tags		= site.tags;
			seperator	= site.seperator;

			// run through tags
			for(c in query.tags)
			{
				tags	+= query.tags[c] + seperator;
			}
			tags	= tags.slice(0, (tags.length - 1));

			// some sites can't handle multiple geo
			// run through cities
			for(c in query.city)
			{
				var url;
				switch(s)
				{
					case "indeed":		
						url	= search + tags + " " + query.city[c];
					break;
					default:
						url = search + city + query.city[c] + tags;
					break;
				}
				
				Results.Display(
					{
						site:query.sites[s], 
						city:query.city[c], 
						tags:query.tags.toString(), 
						url:url
					}
				);
			}
		}
		
		$(".result .header").bind(
			'click',
			function()
			{
				$(this).next().css("display") == "none" ? $(this).next().slideDown('fast') : $(this).next().slideUp('fast') ;
			}
		)		
	}
}

var Results = {
	//variables
	results:"Results",
	
	// methods
	Display:function(details)
	{
		$("#Results").append(this.Template(details));
	},
	
	Template:function(details)
	{
		var site	= details.site;
		var url		= details.url;//details.url.replace(/\s/g, "%20");
		var	city	= details.city;
		var tags	= details.tags;
				
		return "<div class=\"result\"><div class=\"header\"><div class=\"highlight\"></div><div class=\"content\"><h1>" + site + "</h1><div class=\"details\"><span>Tags:</span> " + tags + " <span>City: </span>" + city + "</div></div></div><iframe src=\"" + url + "\"></iframe></div>";
	}
}