if(window.location.href.match(/#([^\?]+)/) && !window.location.href.match(/#admin/) && !window.location.href.match(/#regs/)) {
	window.location.href = window.location.href.replace(/#([^\?]+)/,'');
}

_DB = 'modules';
_CONN = new CouchDB(_DB);
_DOC = null;
_MODULE = null;
_HISTORY = [];
_SUMMARY = {};
_SUMMARY_EMAIL = '';
_SAME_AS_REGEXP = /^Selection as (\S*) but with special formating/i;
_TEMPLATES  = {
	module_btns : '<div>{{#rows}}<a onmousedown="$.mobile.pageLoading();" data-role="button" data-inline="true" onclick="build_module(\'{{id}}\')" href="#node_{{id}}_0" data-transition="slide" {{#value}}data-icon="info" data-iconpos="right" data-description="{{value}}"{{/value}}>{{key}}</a>{{/rows}}</div>',
	group_btns : '{{#rows}}<a onmousedown="$.mobile.pageLoading();_MODULE=\'{{key}}\';" data-role="button" data-inline="true" href="#modules" data-transition="slide">{{key}}</a>{{/rows}}',
	regs_list : '{{#cats}}<h{{level}}>{{title}}</h{{level}}> {{#has_regs}}<ul>{{#regs}}<li style="margin-top:20px;"><strong>{{description}}</strong><br><i><a href="{{url}}">{{url}}</a><i>{{/regs}}</ul>{{/has_regs}}{{/cats}}'
}
/*
	  var title = $('<h'+level+'></h'+level+'>').append(key);
	  $('#regs_list').append(title);
	  if(cat.regs && cat.regs.length) {
		var list = $('<ul></ul>');
       		$(cat.regs).each(function(i,reg) {
			var item = $('<li style="margin-top:20px;"><strong></strong><br><i><a href="'+reg.url+'"">'+reg.url+'</a><i>');
			$('strong',item).append(reg.description);
			list.append(item);
		});
		$('#regs_list').append(list);
	  };
*/

    function before_create(e) {
	$('body').show();
	switch(e.currentTarget.id) {
		case 'advisor':
			$.mobile.pageLoading();
	    		//build the main list of modules
	    		$('#group_list').html($.mustache(_TEMPLATES.group_btns,_CONN.view('groups/list_all?group=true')));
			$.mobile.pageLoading(true);
			break;
	}
    }

    function before_show(e,obj) {
	build_mini_summary(e.currentTarget.id);
	switch(e.currentTarget.id) {
		case 'modules':
			$.mobile.pageLoading();
			$('#modules_group_title').text(_MODULE);
	    		var mods = _CONN.view('groups/list_modules?key="'+_MODULE+'"');
			mods.rows = mods.rows.sort(function(a,b) {
				if(a.id == b.id) return 0;
				return (a.id < b.id)? 1 : 0;
			});
			mod_btns = {rows:[]};
			for(var i in mods.rows) {
				mod_btns.rows.push({
					id : mods.rows[i].id,
					key : mods.rows[i].value[0],
					value : mods.rows[i].value[1]
				});	
			}
			$('#module_intro').load(_MODULE.toLowerCase().replace(/ /g,'_') + '.html?' + (new Date()).getTime());
	    		$('#module_list').html($.mustache(_TEMPLATES.module_btns,mod_btns));
			$('#module_list div').page();
			$.mobile.pageLoading(true);
			break;
	
		case 'advisor':
			var icons = $('#module_list span.ui-icon-info').click(function() {
				var desc = $(this).parents('a.ui-btn').attr('data-description');
				var title = $(this).parents('a.ui-btn').text();
				$('#dialog_module_description h1').text('What is a '+title+'?');
				$('#dialog_about_content').html(desc);
				$.mobile.changePage('dialog_module_description');
				$.mobile.pageLoading(true);
	return false;
});
			break;
		case 'summary':
			build_summary();
			break;
		case 'regs':
			if($('#regs_list li').length) return;
			$.mobile.pageLoading();
	    		//build the main list of modules
	    		var regs = _CONN.view('regulations/all_by_category');
			var cats = {};
            		$(regs.rows).each(function(i,row) {
				var val = row.value;
				organize_reg_cat(val,0,cats);
			});
/*
			cats = { cats : cats, has_regs : function() { console.log(arguments);  } };
			cats_to_array(cats);
		console.log(cats);	
	    		console.log($.mustache(_TEMPLATES.regs_list,cats));
	    		$('#regs_list').html($.mustache(_TEMPLATES.regs_list,cats));
*/
			build_cat_listing(cats);
			$.mobile.pageLoading(true);
			break;
	}
    }

    function build_cat_listing(cats,level) {
	if(!level) level = 2;
	for(var key in cats) {
	  var cat = cats[key];
	  var title = $('<h'+level+'></h'+level+'>').append(key);
	  $('#regs_list').append(title);
	  if(cat.regs && cat.regs.length) {
		var list = $('<ul></ul>');
       		$(cat.regs).each(function(i,reg) {
			var item = $('<li style="margin-top:20px;"><strong></strong><br><i><a href="'+reg.url+'"">'+reg.url+'</a><i>');
			$('strong',item).append(reg.description);
			list.append(item);
		});
		$('#regs_list').append(list);
	  };
	  if(cat.cats && typeof cat.cats == 'object') {
		build_cat_listing(cat.cats,level+1);
	  }
	}
    }

    function cats_to_array(cats,level) {
	if(!level) level = 2;
	var cats_ary = [];
	for(var i in cats.cats) {
		cats.cats[i].level = level;
		cats_ary.push(cats.cats[i]);
		if(cats.cats[i].cats) {
			cats_to_array(cats.cats[i],level+1);
		}
	}
	cats.cats = cats_ary;
    }

    function organize_reg_cat(reg,index,cats) {
	var ctg = reg.categories[index];
	if(!cats[ctg]) {
		cats[ctg] = {
			title : ctg,
			regs : [],
			cats : {}
		};
	}
	var cat = cats[ctg];
	if(reg.categories.length > index+1) {
		organize_reg_cat(reg,index+1,cat.cats);
	} else {
		cat.regs.push(reg);
	}
    }

    function get_question(id,doc) {
	if(!doc) doc = _DOC;
	var ids = id.split('.');
	if(ids.length > 1) {
		return get_question(ids.slice(2).join('.'),doc.questions[ids[0]].choices[ids[1]]);
	} else {
		return doc.questions[id];
	}
    }

    function choice_click(e) {
	var indexes = e.currentTarget.id.split('_');
	var question = get_question(indexes[2])
	var choice = question.choices[indexes[3]];
	//var choice = _DOC.questions[indexes[2]].choices[indexes[3]];
	_HISTORY.push({
		question : question,
		choice : choice
	});
	var key = indexes[1]+'_'+indexes[2];
	if(choice.requirements) {
		for(var i=0; i<choice.requirements.length; i++) {
			var req = choice.requirements[i];
			var match = req.text.match(_SAME_AS_REGEXP); 
			if(match && match[1]) {
				var alt_choices = _DOC.questions[indexes[2]].choices;
				for(var j=0; j<alt_choices.length; j++) {
					var c = alt_choices[j];
					if(c.text.toLowerCase() == match[1].toLowerCase()) {
						choice.requirements = $.extend([],c.requirements);
						for(var k=0; k<choice.requirements.length; k++) {
							choice.requirements[k].unsure = true;
						}
						break;
					}
				}
			}
		}
	}
	_SUMMARY[key] = choice.requirements;
    }

    function build_mini_summary(id) {
		var summary_block = $("#"+id).find('div.mini_summary');
		if(!summary_block.length) return;
		var summary = $('<div><h3 class="mini_summary">Your Answers</h3><ul class="mini_summary"></ul></div>');
		var list = summary.find('ul');
		for(var i=0; i<_HISTORY.length; i++) {
			var node = _HISTORY[i];
			var itm = $('<li></li>').append(node.question.text).append($('<span></span>').append(node.choice.text));
			list.append(itm);
		}
		summary_block.html(summary);
    }
    function build_summary() {
	var cont = $('#summary_items').empty();
	$('#summary_title').add('#summary_header').html(_DOC.title);
	_SUMMARY_EMAIL = 'Advisor Summary: '+_DOC.title+'\n\r\n\r';
	var cnt = 0;
	for(var key in _SUMMARY) {
		var reqs = _SUMMARY[key];
		$(reqs).each(function(i,req) {
			if(!req.text.replace(/\$/g,'').trim()) return;
			cnt++;
			var req_elm = $('<li><h3></h3></li>');
			if(req.unsure) {
				req_elm.find('h3').addClass('unsure');
			}
			$('h3',req_elm).append(req.text.replace(/[\n\r]/g,'<br/>'));
			_SUMMARY_EMAIL += "- "+req.text+"\n\r";
			cont.append(req_elm);	
		});
	}
	if(!cnt) {
		var text = 'No testing requirements for your product.';
		cont.append('<li><h3>'+text+'</h3></li>');
		_SUMMARY_EMAIL += "- "+text+"\n\r";
	}
	$(window.frames.printable_frame.document.body).empty().append($('#summary_printable').clone());	
    }
    function email_summary() {
 	window.location.href='mailto:?body='+escape(_SUMMARY_EMAIL);	
    }
 
    function load_module(id,refresh) {
	if(refresh || !load_module._loaded[id]) {
		var doc = load_module._loaded[id] =  _CONN.open(id);
		if($.mobile) $.mobile.pageLoading(true);
	}
	return _DOC = load_module._loaded[id];
    }
    load_module._loaded = {};

    function build_question(nd,key,i,questions,doc,next_link,par) {
	if(!par) par = '';
	var id = key + par + i;
        var page=$('<div data-role="page" id="'+id+'" data-theme="b"></div>');
        page.append('<div data-role="header" data-position="fixed"><h1><img src="images/ap_logo_circle.png" class="header-title"/> Compliance Advisor: '+doc.title+' </h1><a data-role="button" href="#modules" data-icon="back">Start Over</a></div>');


	if(i!=0) page.append('<fieldset class="ui-grid-a"><div class="ui-block-a"></div><div class="ui-block-b mini_summary"></div></fieldset>');
        
	var content = $('<div data-role="content"><h2></h2></div>');
        $('h2',content).append(nd.text);
        for(var j=0; j<nd.choices.length; j++)
        {
           var c = nd.choices[j];
           if(!c.text) continue;
           var link = '#node_'+doc._id+'_';

	   if(c.questions && c.questions.length) {
		link += par+i+'.'+j+'.'+0;
           } else if(null == next_link) {
		link = '#summary';
	   } else {
		link += next_link;
	   }
           //var choice = $('<a class="ca_choice" id="choice_'+doc._id+'_'+i+'_'+j+'" data-role="button" href="'+link+'" data-transition="slide" data-inline="true"></a>');
           var choice = $('<a class="ca_choice" id="choice_'+doc._id+'_'+par+i+'_'+j+'" data-role="button" href="'+link+'" data-transition="slide" data-inline="true"></a>');
           choice.html(c.text);
           content.append(choice);
	   if(c.questions && c.questions.length) {
      		for(var ii=0; ii<c.questions.length; ii++) {
			next_link = (c.questions.length == ii+1)? next_link : par+i+'.'+j+'.'+ii+1;
        		build_question(c.questions[ii],key,ii,c,doc,next_link,par+i+'.'+j+'.');
		}
	   }
        }
	if(i==0) {
        	page.append(content);
	} else {
		page.find('div.ui-block-a').append(content);
	}
	//page.append($('#footer').clone());
        $('body').append(page);

        page.page();        
 
    }
 
    function build_module(id) {
	_HISTORY = [];
	_SUMMARY = {};
	var doc = load_module(id);
	var key = 'node_'+doc._id+'_';
	if($('#'+key+'0').length) return key;
       var cnt = 0;
      for(var i=0; i<doc.questions.length; i++)
      {
	next_link = (doc.questions.length == i+1)? null : i+1;
        build_question(doc.questions[i],key,i,doc,doc,next_link);
      }

    }

	function Question(text,notes) {
            this.text = text.replace(/\r/g,'\n');
	    this.notes = (notes)? notes : '';
            this.choices = [];
        }
        Question.prototype = {
            choices : [],
	    notes : '',
            text : ''
        }
        function Choice(text) {
            this.text = text.replace(/\r/g,'\n');
            this.requirements = [];
        }
        Choice.prototype = {
            requirements : [],
            text : ''
        }
        function Requirement(text) {
            this.text = text.replace(/\r/g,'\n');
        }
        Requirement.prototype = {
            text : ''
        }
 
$('div[data-role=\'page\']').live('pagebeforecreate',before_create);
$('div[data-role=\'page\']').live('pagebeforeshow',before_show);
$('a.ca_choice').live('click',choice_click);


