
function Widget (v) {
	// create a new object and deep copy the data 
	this.config = {
		'day': '',
		'year':'',
		'listsize':5, 
		'pgsize':5, 
		'pg':1, 
		'type': '',
		'filter':'',
		'source':'day', // day | collection  
		'template':'list',
		'format':'',
		'date_header': true,
		'attribution' : 'widget',
		'favorites' : false,
		'id':'', 
		'title': 'History of a Today',
		'css': {}, // 'border' :'3pt double blue',
		'callback': null,
		'response': {},
		'dataset' : null  // use when storing multiple pages of data
	};
	this.config = $.extend(true, this.config,v); 	

    if (this.config['day'] != '') {
		this.config['day'] = $.trim(decodeURIComponent(this.config['day']).replace(/\//g, "-")); //normalize the string
		if (this.config['day'].split("-").length > 2) { // the year is specified
			this.config['year'] = make_day_str(this.config['day'], 'yyyy')
		}
	}
	this.set('template',this.config.template)
}

Widget.prototype.get = function (k){
	var response = '';
	if ( k && (k in this.config)) {
		response = this.config[k];
	}
	else {
		response = this.config;
	}
	return response;
};

Widget.prototype.set = function (k,v){
	var response = '';
	if ( k && (k in this.config) && v) {
		this.config[k] = v;
		response = this.config[k];
		switch (k) {
			case 'template':
				switch (this.config.template) {
					case 'blurb':
					case 'card':
						this.config.pgsize = 1;
						this.config.callback = this.show_card_generic;
						break;
					default:
						this.config.pgsize = this.config.listsize;
						this.config.callback = this.show_list_generic;
						break;
				};	
				break;	
			default:
				break;
		};		
	}
	else if (v && (typeof v == 'object')) {
		this.config = $.extend(true, {},v); // TODO: v should be an object
		response = this.config;
	}
	return response;
};

Widget.prototype.show_nav_bar = function (response, widget_id){
	var assets = Wiggleback.location.widget;
    var previous_button = '<img class="paging_arrow" src="'+assets+'/left_pg_arrow.gif"></img>';
    var next_button = '<img class="paging_arrow" src="'+assets+'/right_pg_arrow.gif"></img>';
    var next = '';
    var prev = '';
	var list_button = '<img class="nav_cube" src="'+assets+'/cube_list.jpg"></img>';
	var detail_button = '<img class="nav_cube" src="'+assets+'/cube_detail.jpg"></img>';
    var content = '';
	var widget = Collection.get(widget_id).get();
	// var widget = Collection.get(widget_id);
	
    content += '<table><tr>';
	content += '<td class="nav_cell"></td>'; // spacer
	content += '<td class="nav_cell"></td>'; // spacer
	content += '<td class="nav_cell"></td>'; // spacer
	content += '<td class="nav_cell"></td>'; // spacer
	content += '<td class="nav_cell"></td>'; // spacer
	content += '<td class="nav_cell"></td>'; // spacer
	
	content += '<td id="'+widget_id+'first"  class="nav_pg_num"></td>'; 	
    content += '<td id="'+widget_id+'previous" class="nav_cell"></td>';
    content += '<td id="'+widget_id+'pg_count" class="nav_pg_count"></td>';
    content += '<td id="'+widget_id+'next" class="nav_cell"></td>';
    content += '<td id="'+widget_id+'total_results" class="widget_result_count"></td>';
    content += '<td id="'+widget_id+'view" class="nav_cell"></td>';

    content += '</tr></table>';	
    $('#'+widget_id+'wiggle_block_nav').html(content);
    $('#'+widget_id+'total_results').html(response.count);
    var last_on_pg = response.pg*widget.pgsize;
    var first_on_pg = last_on_pg - (widget.pgsize-1);
    if (last_on_pg > response.count) {
    	last_on_pg = response.count;
    	next_button = '<img class="paging_arrow" src="'+assets+'/right_pg_arrow_inactive.gif"></img>';
    	
    }
    if (first_on_pg == 1) {
    	previous_button = '<img class="paging_arrow" src="'+assets+'/left_pg_arrow_inactive.gif"></img>';	
    }
   
    if (response.pg) {
        if (response.pg > 1) {

		    // $('#'+widget_id+'first').html('1');
            prev = '' + (Number(response.pg) - 1);
			content = '';
			content += Collection.get(widget_id).link('update',
							{
							'id': widget_id, 
							'pg': prev, 
							// 'template': 'list', 
							'class': 'layout_link', 
							'text': previous_button, 
							'rollover': 'previous'
							}
						);
		    $('#'+widget_id+'previous').html(content);
		    
		    content = '';
		    content = first_on_pg + ' to '+ last_on_pg;
		    $('#'+widget_id+'pg_count').html(content);
		}        
    
    	if (last_on_pg == response.count) {
		    $('#'+widget_id+'next').html(next_button);    		
    	}
        else if (response.count > response.pg) {
            next = '' + (Number(response.pg)+1);
			content = '';
			content += Collection.get(widget_id).link('update',
							{
							'id': widget_id, 
							'pg': next, 
							// 'template': 'list', 
							'class': 'layout_link', 
							'text': next_button, 
							'rollover': 'next'
							}
						);
            
		    $('#'+widget_id+'next').html(content);
            
        }        
    }    
	
	
	content = '';
	var p = '' + (Math.ceil(Number(widget.pg) / Number(widget.listsize)));
	switch (widget.template) {
		case 'blurb':
//			content += '<td>';
			content += Collection.get(widget_id).link('update',
							{
							'id': widget_id, 
							'pg': p, 
							'template': 'list', 
							'class': 'layout_link', 
							'text': list_button, 
							'rollover': 'Show list view'
							}
						);
			break;
		default:
			// content += Collection.get(widget_id).link('update',
							// {
							// 'id': widget_id, 
							// 'pg': p, 
							// 'template': 'blurb', 
							// 'class': 'layout_link', 
							// 'text': detail_button, 
							// 'rollover': 'Show detail view'
							// }
						// );
			break;
	};
	$('#'+widget_id+'view').html(content);
};


Widget.prototype.show_header = function (widget_id) {
	var content = '';
	var widget = Collection.get(widget_id).get();
    content =  '<div id="'+widget_id+'widget_header" class="widget_header">';
	content += '</div>';
	$('#'+widget_id).html(content);
	
	// widget = Collection.get(widget_id);
	if (widget.title) {
		content = "";
		content += '<div class="widget_title">';
		content +=  widget.title;
		content += "</div>";
		$('#'+widget_id+'widget_header').append(content);		
	}

	if (widget.date_header) {
		var day_digits = make_day_str(widget.day, "d");
	    var date_header = make_day_str(widget.day, "MMM")+ ' ' + day_digits + day_suffix(day_digits);
		content = "";
		content += '<div class="header_date">'; // list_date
		content +=  date_header;
		content += "</div>";
		$('#'+widget_id+'widget_header').append(content);
	}	
};



Widget.prototype.show_footer = function (response, widget_id){
    var content = '';
	var widget = Collection.get(widget_id).get();
    // content += '<table><tr>';
	if (Collection.get(widget_id, 'attribution') == 'widget') {
	    // content += '<td class="wb_attribution">';
	    content += '<div class="wb_attribution">';
		    content += '<div>';		
		    content += '<a class="wb_link_back" href="http://www.wiggleback.com"';
		    content += '>Wiggleback</a>';
		    content += '</div>';		
		    content += '<div class="widget_freebase_attribution"> '; 
		    content += '<a href="http://www.freebase.com/"';
		    content += '>with a little help from Freebase</a>';
		    content += '</div>';		
	    content += '</div>';		
		// content += '</td>';
	}    
    // content += '</tr></table>';
    $('#'+widget_id+'wiggle_block_footer').html(content);
};

Widget.prototype.blurb_scroll = function (widget_id, direction) {

	var blurb_slider_id = widget_id+'widget_slide_card';
	var height = '0.0in';
	var unit = 'in';
	var top = 0.0;
	var delta = 0.0; 
	var error = false;
	height = $('#'+widget_id+'widget_blurb_wrapper').css('height');
	if (!height) {
		error = true;
	}

	if (!error) {
		unit = height.substr(height.length-2, 2);
		top = parseFloat($('#'+blurb_slider_id).css('top'));
		if (!top) {
			top = 0.0;
		}
		delta = parseFloat(height);// * 0.5; //2.25; // 		

	
		if (direction) {
			if (direction == 'up') {
				top += delta;
			}
			else if (direction == 'down'){
				top -= delta;
			}
			$('#'+blurb_slider_id).css('top',''+top+unit);
		}
		
		var content = '';
		if (top < 0) {
			content = Collection.get(widget_id).link('scroll',
							{
								'id': widget_id,
								'class': 'blurb_scroll_link',
								'rollover': 'back',
								'direction': 'up',
								'text': 'up'
							}
				
			);
		}
		$('#'+widget_id+'blurb_up').html(content);			
			
		var slider_height = parseFloat($('#'+blurb_slider_id).css('height'));
		content = '';
		if ((top + slider_height) >= 0) {
			content = Collection.get(widget_id).link('scroll',
							{
								'id': widget_id,
								'class': 'blurb_scroll_link',
								'rollover': 'continue',
								'direction': 'down',
								'text': 'down'
							}
							);
		}	
//		deb('top '+top+'  '+slider_height);
		$('#'+widget_id+'blurb_down').html(content);			
	}
};


Widget.prototype.update = function (widget_id, pg, template) {

// TODO - remove references to Collection
	var widget = Collection.get(widget_id);
	widget.set('pg',pg);	
	widget.set('template', template);

	// Collection.set(widget_id, 'pg',pg);	
	// Collection.set(widget_id, 'template', template);

    var daypage_location = '';
    var daypage_params = ''; 
	var data_type = 'jsonp';
// TODO support use of cards.php
// use card params in filter
    daypage_params += '&pgsize=' 	+ Collection.get(widget_id, 'pgsize');
    daypage_params += '&pg=' 		+ Collection.get(widget_id, 'pg');
    daypage_params += '&day=' 		+ make_day_str(Collection.get(widget_id, 'day'),'MM-dd');
    daypage_params += Collection.get(widget_id, 'filter');

	
	if (Collection.get(widget_id, 'source') == 'collection') {  //(filter.search('&user=') != -1) {
	    daypage_location = Wiggleback.get('location').root+'/cards.php?';
		data_type = 'json';
	}
	else {
	    daypage_location = Wiggleback.get('location').root+'/daypage.php\?jsonp=?';
		daypage_params += '&stats=no';  
		daypage_params += '&year=' + Collection.get(widget_id, 'year');
		
	}
    $.ajax({
        url: daypage_location,
        data: daypage_params,
        type: 'GET',
        cache: false,
        dataType: data_type,
        error: function(xobj, status, error){
            deb('<br>status: ' + status);
            deb('<br>error: ' + error);
        },
        context: this, // give callback same scope as 'this' 
        success: function(response, status){
			// pass additional data to the callback function
			// so that different widgets can share the same callback function
			widget.get('callback')(response, widget_id);	
		}
    });



};

Widget.prototype.link = function (link_type, link_info) {
	var content = '';
	switch (link_type) {
		case 'update':
		    content += '<a title="'+link_info.rollover+'" class="'+link_info['class']+'" href=\"' ;
		    content += encodeURI('javascript:{Collection.get("'+link_info.id+'").update(');
			content += encodeURI('\"'+link_info.id+'\"');		
		    content += encodeURI(','+link_info.pg);
		    if ('template' in link_info) {
			    content += encodeURI(',"' + link_info.template+'"'); 		    	
		    }
		    content += encodeURI(');}') ;
		    content += '\">'+ link_info.text+'</a>'; 
			break
		case 'scroll':
			content =  '<a class="blurb_scroll_link" href=\"';
			content += encodeURI('javascript:{Collection.get("'+link_info.id+'").blurb_scroll(');
			content += encodeURI('"'+link_info.id+'","'+link_info.direction+'"');
			content += encodeURI(');}');
			content += '\">'+ link_info.text+'</a>';
		
			break;
		default:
			break;
	}
    return content;
}

Widget.prototype.show_list_generic = function (response, widget_id) {
    if (!response || !('result' in response)) {
        $('#'+widget_id).append('&nbsp;&nbsp;No topics to display.');
        return;
    }   
    var result = response.result;    
    if (result.length == 0) {
        return;
    }
	Collection.set(widget_id, 'response', response);
    Collection.set(widget_id, 'pg', response.pg);
    var topic = {};
    var content = "";
    var i = 0;
	var p = '';
	var widget = Collection.get(widget_id).get();
	var thisWidget = Collection.get(widget_id);
	thisWidget.show_header(widget_id);

    // content =  '<div id="'+widget_id+'widget_header" class="widget_header">';
	// content += widget.title+'</div>';
	// $('#'+widget_id).html(content);
// 
	// if (widget.date_header) {
		// var day_digits = make_day_str(widget.day, "d");
	    // var date_header = make_day_str(widget.day, "MMM")+ ' ' + day_digits + day_suffix(day_digits);
		// content = "";
		// content += '<div class="">'; // list_date
		// content +=  date_header;
		// content += "</div>";
		// $('#'+widget_id+'widget_header').append(content);
	// }
	
	
    $('#'+widget_id).append('<div id=\"'+widget_id+'wiggle_block_nav\" class=\"block_nav\"></div>');      	
    $('#'+widget_id).append('<div id="'+widget_id+'card" class="widget_card"></div>');

    content = '<table id="'+widget_id+'list_body" class="list_body"></table>';
	$('#'+widget_id+'card').append(content);
        
    while (i < result.length) {    
        topic = result[i];
        if (topic.name == null) {
            topic.name = "";
        }
                         
        var property_name = topic.property.name;
        if (property_name == null) {
            property_name = topic.property.id;
        }

		list_date = new Date.parseString("" + topic.property.day);
        content = '<tr>';
        content += '<td class="list_image">   ' + showTopicImage(topic,40,40, 'fillcrop') + '</td>';
        content += '<td class="list_name">   '; //class="list_name"   // + make_freebase_link(topic);
		p = ''+(((Number(widget.pg)*Number(widget.pgsize))-Number(widget.pgsize))+(i+1));
		content += Collection.get(widget_id).link('update',
						{
						'id': widget_id, 
						'pg': p, 
						'template': 'blurb', 
						'class': 'list_link', 
						'text': topic.name, 
						'rollover': 'view details'
						}
					);

        content += '<div class="list_year">' + list_date.getFullYear()   + '</div>';
        content += '</td>';
        content += '</tr>';
        $('#'+widget_id+'list_body').append(content);
        i++;
    } // while

    $('#'+widget_id).append('<div id=\"'+widget_id+'wiggle_block_footer\" class=\"block_footer\"></div>');            
	Collection.get(widget_id).show_nav_bar(response, widget_id);    
	Collection.get(widget_id).show_footer(response, widget_id);    

} //show_list_generic


Widget.prototype.show_card_generic = function (response, widget_id) {
    if (!response) {
        return;
    }   
	var content = '';
    if (!response || !('result' in response)) {
        $('#'+widget_id).append(' No topics to display.');
        return;
    }   
    var result = response.result;    
    if (result.length == 0) {
        return;
    }

	Collection.set(widget_id, 'response', response);       
	var widget = Collection.get(widget_id).get();
	
    content =  '<div id="'+widget_id+'widget_header" class="widget_header">';
	// content += widget.title+'</div>';
	// $('#'+widget_id).html(content);
	var thisWidget = Collection.get(widget_id);
	thisWidget.show_header(widget_id);
    $('#'+widget_id).append('<div id=\"'+widget_id+'wiggle_block_nav\" class=\"block_nav\"></div>');          	
    $('#'+widget_id).append('<div id="'+widget_id+'card" class="widget_card"></div>');


    var topic = {};
    var content = "";
    var i = 0;
	var p = '';
	
	// only one to show
    // while (i < result.length) {    
        topic = result[i];
        if (topic.name == null) {
            topic.name = "";
        }
		
		if (widget.favorites) {
			DayTopics.add('append',topic);
		}
                         
        var card_date = new Date.parseString("" + topic.property.day);
        var property_name = topic.property.name;
        if (property_name == null) {
            property_name = topic.property.id;
        }

		content = '';
		content += '<div class="widget_detail_header">';
	    content += '<table><tr>';
		    content += '<td class="widget_detail_image">' + showTopicImage(topic,70,90,'fit') + '</td>';    //fillcropmid        
			content += '<td>';
			    content += '<table>';
			    content += '<tr><td class="widget_detail_name">' + make_freebase_link(topic) +'</td></tr>';
				content += '<tr><td>';
					content += '<span class="widget_detail_year">' + card_date.getFullYear() + '</span>';
					content += '<span class="widget_detail_attribute">' + property_name + '</span>';
					if (widget.favorites) {
						content += make_fav_link("add",topic);					
					}


				content += '</td></tr>';
			    content += '</table>';
			content += '</td>'	
	    content += '</tr></table>';
		content += '</div>';
		$('#'+widget_id+'card').append(content);
        
		switch (widget.template) {
			case 'blurb':

				content = ''
				content += '<div>';
				content += '<table>';
				content += '<tr>';
				content += '<td>';
					content += '<div id="'+widget_id+'widget_blurb_wrapper"  class="widget_blurb_wrapper">';
	    			content += '<div id="'+widget_id+'widget_slide_card" class="widget_slide_card"></div>';
					content += '</div>';
				content += '</td>';
				content += '</tr>';
				content += '</table>';
				content += '</div>';

				$('#'+widget_id+'card').append(content);
					content = '<div class="blurb_scroll_wrapper">';
					content += '<table>';
					content += '<tr>';
					content += '<td id="'+widget_id+'blurb_up" class="blurb_scroll_cell">';
					content += '</td>';
					content += '<td id="'+widget_id+'blurb_down" class="blurb_scroll_cell">';
					content += '</td>';
					content += '</tr>';
					content += '</table>';
					content += '</div>';
				$('#'+widget_id+'card').append(content);



				Collection.get(widget_id).blurb_scroll(widget_id);		
				var blurb_id = '' + widget_id +'blurb'
				content = '<div id="'+blurb_id+'" class="widget_detail_blurb"></div>'
				$('#'+widget_id+'widget_slide_card').append(content);
				get_mw_blurb(topic, blurb_id, 1200); // send freebase request, put result in the blurb div
				break;
			default:
				break;
		};

        i++;
    // } // while
    
    $('#'+widget_id).append('<div id=\"'+widget_id+'wiggle_block_footer\" class=\"block_footer\"></div>');            
	Collection.get(widget_id).show_nav_bar(response,widget_id);    
	Collection.get(widget_id).show_footer(response, widget_id);    
    

} // show_card


// collection of widgets
function Collection () {
	Collection.c = {};

	Collection.create = function (v){
		var test = Collection.c;
		var response = null;
		if ('id' in v) {
			Collection.c[v.id] = new Widget(v);
			response = Collection.c[v.id];
		}
		return response;
	};
	
	Collection.set = function (id, request, v) {
		var test = Collection.c;
		var response = null;
		
		if (id in Collection.c) { // && (request in Collection.c[id].get())
			Collection.c[id].set(request, v); //[request] = v;
			response = Collection.c[id].get();
		}
		return response;
	};

	Collection.get = function (id, request, v) {
		var response = null;
		if (id in Collection.c) {
			if (request) {
				response = Collection.c[id].get(request)				
			}
			else {
				response = Collection.c[id];
			}
		} 
		else if (request == 'id') { // requesting id given a widget config key
		// TODO removce this clause, nothing uses it, legacy
			for (w in Collection.c) {
				response = Collection.c[w].get(v);
				if (typeof response != 'object') { //(('type' in Collection.c[w]) && (Collection.c[w]['type'] == v))
					response = Collection.c[w]['id'];
					break;
				}
				else {
					response = null;
				}
			}
		}
		else {
			response = Collection.c;
		}
		return response;	
	};	
}
Collection();


function Wiggleback () {
	Wiggleback.location = {
		'root': '',
		'widget': ''
		};
	
	if ((window.location.host == 'localhost') || (window.location.protocol == 'file:')) {
		Wiggleback.location.root = 'http://localhost/wb';	
	}
	else {
		Wiggleback.location.root = 'http://www.wiggleback.com';
	}
	Wiggleback.location.root = window.location.protocol+'//';
	Wiggleback.location.root += window.location.host;
	Wiggleback.location.root += window.location.pathname.substring(0,window.location.pathname.lastIndexOf('/'));
	Wiggleback.location.widget = Wiggleback.location.root + '/widget';

		
	Wiggleback.get = function (request) {
		var response = null;
		switch (request) {
			case 'location':
				response = Wiggleback.location;
				break;
			default:
				break;
		};	
		return response;
	};
	
}
Wiggleback();

function WidgetPage () {
	$('head').append('<link>');
	css = $('head').children(':last');
	css.attr({
	  rel:  'stylesheet',
	  type: 'text/css',
	  href: Wiggleback.location.widget + '/dayblock.css'
	});	
}
WidgetPage();




function wiggleback_create_widget (w) {
	

	var widget = {};	
	widget = $.extend(true, widget,w); // deep copy / overwrite default values 
	// 'type' is used to get widget id in show_list_generic
	// TODO change dependence on 'type', use 'filter' instead but handle filter == ''
	(widget['type'] == '') 	? widget['type'] = widget['filter'] : null; 

	if (widget['css']) {
		$('#'+widget['id']).css(widget['css']);
	}

	// create content section 
	if (!('id' in widget) || !something(widget['id'])) {
		status('Cound not display wiggleback widget. No HTML id specified.')
	}
	// else if (widget['type'] == 'birthdays') {
		// widget['callback'] = show_list_birthdays;
		// widget['filter'] = '&props=/people/person/date_of_birth';
		// $('#'+widget['id']).css('background', 'url("http://wiggleback.com/widget/blue_box.png") no-repeat top left')
// //    background: url('http://wiggleback.com/widget/blue_box.png') no-repeat top left;    
	// }
	// else if (widget['type'] == 'war') {
		// widget['type'] = 'generic'
		// widget['callback'] = show_list_generic;
		// widget['filter'] = '&types=/military/military_conflict';
		// $('#'+widget['id']).css('border', '10pt ridge black'); //ridge, groove, double solid
	// }
	else if (widget['filter']) {
		if (widget['css']) {
			$('#'+widget['id']).css(widget['css']);//'border', '3pt double blue'); //ridge, groove, double solid		
		}
	}
	else {
		widget['filter'] = '';
	}
	

	Collection.create(widget).update(widget.id, 1);
	
} // end wiggleback_create_widget


