jQuery.cookie=function(name,value,options){if(typeof value!='undefined'){options=options||{};if(value===null){value='';options.expires=-1;}
var expires='';if(options.expires&&(typeof options.expires=='number'||options.expires.toUTCString)){var date;if(typeof options.expires=='number'){date=new Date();date.setTime(date.getTime()+(options.expires*24*60*60*1000));}else{date=options.expires;}
expires='; expires='+date.toUTCString();}
var path=options.path?'; path='+(options.path):'';var domain=options.domain?'; domain='+(options.domain):'';var secure=options.secure?'; secure':'';document.cookie=[name,'=',encodeURIComponent(value),expires,path,domain,secure].join('');}else{var cookieValue=null;if(document.cookie&&document.cookie!=''){var cookies=document.cookie.split(';');for(var i=0;i<cookies.length;i++){var cookie=jQuery.trim(cookies[i]);if(cookie.substring(0,name.length+1)==(name+'=')){cookieValue=decodeURIComponent(cookie.substring(name.length+1));break;}}}
return cookieValue;}};

//TODO: Remove this before going live and any console stuff
// Fake Firebug in IE
if (!('console' in window) || !('firebug' in console)) {
	var names = ['log', 'debug', 'info', 'warn', 'error', 'assert', 'dir', 'dirxml', 'group', 'groupEnd', 'time', 'timeEnd', 'count', 'trace', 'profile', 'profileEnd'];
	window.console = {};
	for (var i = 0; i < names.length; ++i) {
		window.console[names[i]] = function() {};
	}
}

var cookie =
{
	name: 'youversion',
	expires: 365,

	get: function()
	{
		return $.cookie(this.name);
	},

	set: function(object, data)
	{
		var new_cookie = this.get();

		if (new_cookie === null)
		{
			new_cookie = {
				interfaces: {
					www: {},
					iphone: {},
					blackberry: {},
					mobile: {}
				}
			};
		}
		else
		{
			new_cookie = $.evalJSON(new_cookie);
		}

		new_cookie.interfaces.www[object] = data;

		$.cookie(this.name, $.toJSON(new_cookie), {expires: this.expires});
	}
}

function setUndefinedValue(variable, default_value) {
	
	return (typeof(variable) === 'undefined') ? default_value : variable;
}

Array.prototype.compare = function(testArr) {
    if (this.length != testArr.length) return false;
    for (var i = 0; i < testArr.length; i++) {
        if (this[i].compare) { 
            if (!this[i].compare(testArr[i])) return false;
        }
        if (this[i] !== testArr[i]) return false;
    }
    return true;
}

String.prototype.limit_words = function(limit, endChar) {

	var longDescription = this;

	//limit = (typeof(limit) === 'undefined') ? 100 : limit;
	limit = setUndefinedValue(limit, 100);

	if (longDescription.length > limit) {
		//endChar = (typeof(endChar) === 'undefined') ? '&#8230;' : endChar;
		endChar = setUndefinedValue(endChar, '&#8230;');
		
		description = longDescription.substring(0, limit);
		description = description.replace(/\w+$/, '');
		description += endChar;
		
		return description;
	}
	
	return longDescription;
}

var search_boxes = false;

$(function() {

	// External links
	$('a[rel*="external"]').live('click', function() {
        window.open($(this).attr('href'));
        return false;
    });

	// Report links
	$('li.report > a, a.report').live('click', function(event) {
		var confirmation = confirm('Are you sure you want to report this?');

		if (confirmation === false) {
			event.preventDefault();
		}
	});

	var search_box_focus = function() {
		var el = $(this);
		if (el.hasClass('placeholder')) {
			if (this.value === this.title) {
				this.value = '';
				el.removeClass('placeholder');
			}
		}
	};

	var search_box_blur = function() {
		if (this.value === '') {
			this.value = this.title;
			$(this).addClass('placeholder');
		}
	};

	// Search placeholder
	search_boxes = $('div.search-box input.search');
	search_boxes.focus(search_box_focus);
	search_boxes.blur(search_box_blur);

	// Add placeholder on load if empty
	$.each(search_boxes, function() {
		if (this.value === '' || this.value === this.title) {
			this.value = this.title;
			$(this).addClass('placeholder');
		}
	});

	// Prevent submit of empty value
	$('div.search-box form').submit(function(e) {
		var search_field = $(this).find('input.search');

		if (search_field.val() === search_field.attr('title') || search_field.val() === '') {
			e.preventDefault();
		}
	});

	// Load in Google Analytics dynamically, only in production
	if (IN_PRODUCTION === true) {
		$(window).load(loadGA);
	}
});

String.prototype.osis_to_human = function() {
	// TODO: Make this function accept which pane they are in so we use correct book list
	var osis = this.split(/[._]/);
	
	if (typeof(reader.main.books.osis_to_human[osis[0]]) !== 'undefined') {
		if (osis.length === 3) {
			return reader.main.books.osis_to_human[osis[0]][0] + ' ' + osis[1] + ':' + osis[2];
		} else if (osis.length === 2) {
			return reader.main.books.osis_to_human[osis[0]][0] + ' ' + osis[1];
		}
	}

	return false;
}

String.prototype.human_to_osis = function(book_human_to_osis, separator, allow_range) {
	var reference = this;
	var reference_original = reference;

	separator = (typeof(separator) === 'undefined') ? '.' : separator;
	allow_range = (typeof(allow_range) === 'undefined') ? false : allow_range;

	// Adjust Song of Solomon
	reference = reference.replace(/(Song of Solomon|Song of Soloman|Song of Songs)/i, 'Song');

	var regexp = /((?:[1-3] )?(?:.*?)) (?:(\d{1,3})(?::(\d{1,3})(?:-(\d{1,3}))?)?)?/;
	
	reference = reference.match(regexp);

	if (reference !== null && typeof(reference[1]) !== 'undefined' && typeof(reference[2]) !== 'undefined') {

		if (reference[1] === 'Song') {
			reference[1] = 'Song of Solomon';
		}

		var book = reference[1].uc_first();

		var chapter = Number(reference[2]);
		chapter = (chapter > 0) ? chapter : 1;

		var verse = Number(reference[3]);
		verse = (verse > 0) ? verse : false;
		
		var range = Number(reference[4]);
		range = (range > 0) ? range : false;

	} else if (reference_original.length > 0) {
		var book = reference_original.replace(/^\s+|\s+$/g, '');
		var chapter = 1;
		var verse   = false;
	} else {
		return false;
	}

	// See if book is valid
	if (typeof(book_human_to_osis[book]) !== 'undefined') {
		book = book_human_to_osis[book][0];
	} else {
		return false;
	}

	if (verse === false) {
		return book + separator + chapter;
	} else if (range === false || allow_range === false) {
		return book + separator + chapter + separator + verse;
	} else {
		return book + separator + chapter + separator + verse + '-' + range;
	}
}

String.prototype.uc_first = function (i) {

	// Determine if first is numeric
	var fchar = this.substr(0,1);

	if (fchar == parseInt(fchar)) {
		return this.substr(0,1) + this.substr(1,1).toUpperCase() + this.substr(2);
	}
	
	return this.substr(0,1).toUpperCase() + this.substr(1);
}

String.prototype.join = function(obj) {
	var out = "";
	
	for (val in obj)
	{
		out += "," + val;
	}
	
	return out.substring(1);
}

// Reference Suggest

var ref_suggest = {
	input: undefined,
	hidden: undefined,
	selectedItem: false,
	references: {},
	
	init: function(input, hidden, initial_values, results_name, callbacks) {

		results_name = (results_name || 'main');

		ref_suggest.input = $(input);
		ref_suggest.hidden = $(hidden);

		ref_suggest.input.unbind();
		ref_suggest.hidden.unbind();

		ref_suggest.input.bind('blur.ref_suggest', function(e) {
			ref_suggest.deselect();
		});

		ref_suggest.references = {};
		ref_suggest.input.parents('ul.reference_suggest').find('li:not(.input)').remove();

		ref_suggest.addValues(initial_values || "");

		ref_suggest.input.reference_suggest(
			results_name,
			{onSelect: function() {}}
		);

		// I really hate browser detection, but I don't see any other way
		if ($.browser.mozilla)
		{
			ref_suggest.input.keypress(ref_suggest.processKey);	// onkeypress repeats arrow keys in Mozilla/Opera
		}
		else
		{
			ref_suggest.input.keydown(ref_suggest.processKey);	// onkeydown repeats arrow keys in IE/Safari
		}

		// LIVE events
		$('form ul.reference_suggest li a').live('click', function(e) {
			ref_suggest.removeItem($(this).parent());
		});

		$('form ul.reference_suggest li').live('click', function(e) {
			ref_suggest.select($(this));
		});

		ref_suggest.input.closest('form')
			.unbind('submit.ref_suggest')
			.bind('submit.ref_suggest', function(event) {
				event.preventDefault();
	
				if (ref_suggest.input.val() != '')
				{
					ref_suggest.addValues(ref_suggest.input.val());
				}
				else
				{
					// join prototype similar to python
					ref_suggest.hidden.val('+'.join(ref_suggest.references).replace(/_/g,'.'));
	
					if (typeof(callbacks) === 'object') {
						$.each(callbacks, function(i, callback) {
							callback();
						});
					} else {
						this.submit();
					}
				}
			});

		ref_suggest.input.closest('ul').click(function() {
			ref_suggest.input.focus();
		});
	},

	updateInput: function() {
		var width = ((ref_suggest.input.val().length * 1) + 1);
		if (width > 15) { width = 15; }
		
		ref_suggest.input.css('width',  width+'em');
	},
	
	processKey: function(e) {

		ref_suggest.input.closest('ul').removeClass('error');
		
		ref_suggest.updateInput();

		if (ref_suggest.input.val() != "") {
			return;
		}

		var KEY = {
			LEFT: 37,
			UP: 38,
			RIGHT: 39,
			DOWN: 40,
			BACKSPACE: 8,
			DEL: 46,
			TAB: 9,
			RET: 13,
			ESC: 27,
			COMMA: 188,
			PAGEUP: 33,
			PAGEDOWN: 34
		};
			
		switch(e.keyCode) {
			case KEY.LEFT:
				ref_suggest.selectPrev();
				break;
			case KEY.RIGHT:
				ref_suggest.selectNext();
				break;
			case KEY.BACKSPACE:
				if (ref_suggest.selectedItem === false) {
					ref_suggest.selectPrev();
				} else {
					ref_suggest.removeSelected();
				}
				break;
			case KEY.DEL:
				ref_suggest.removeSelected();
				break;
			default:
//				ref_suggest.input.css('visibility', 'visible');
				if (ref_suggest.selectedItem !== false) {
					ref_suggest.selectedItem.removeClass('selected');
					ref_suggest.selectedItem = false;
				}
				return;
		}
		
		if (e.preventDefault) {
			e.preventDefault();
		}

		if (e.stopPropagation) {
			e.stopPropagation();
		}

		e.cancelBubble = true;
		e.returnValue = false;
	},

	deselect: function() {
		if (ref_suggest.selectedItem !== false)
		{
			ref_suggest.selectedItem.removeClass('selected');
			ref_suggest.selectedItem = false;
		}
	},

	select: function(li) {
		ref_suggest.deselect();
		
		ref_suggest.selectedItem = li;
		
		if (ref_suggest.selectedItem.length == 0 || ref_suggest.selectedItem.hasClass('input'))
		{
			ref_suggest.selectedItem = false;
		}
		else
		{
			ref_suggest.selectedItem.addClass('selected');
		}
	},
	
	selectPrev: function() {
		var e = ref_suggest.selectedItem || ref_suggest.input.parent();
		ref_suggest.select(e.prev('li'));
	},
	
	selectNext: function() {
		var e = ref_suggest.selectedItem || ref_suggest.input.parent();
		var li = e.next('li');
		if (li.length == 0)	//wrap around
		{
			li = e.siblings('li:first-child');
		}

		ref_suggest.select(li);
	},
	
	removeSelected: function() {
		if (ref_suggest.selectedItem === false) { return; }
		
		ref_suggest.removeItem(ref_suggest.selectedItem);
	},
	
	removeItem: function(li) {
		if (ref_suggest.selectedItem == li)
		{
			ref_suggest.selectedItem = false;
		}
		
		var ref = li.attr('rel');
		
		delete ref_suggest.references[ref];

		li.remove();
	},
	
	addValues: function(values) {
		var parts = values.split('+');

		for (var i = 0; i < parts.length; i++)
		{
			var str = $.trim(parts[i]);

			if (str == '') { continue; }
			str = str.uc_first();

			var ref = str.human_to_osis(reader.main.books.human_to_osis, '_', true);

			if (ref === false) {
				parts[i] = str.osis_to_human();

				if (parts[i] !== false)
				{
					ref = parts[i].human_to_osis(reader.main.books.human_to_osis, '_', true);
				}
			}

			if (ref !== false) {
				var osis = ref.split('_');
	
				if (osis.length < 3) {
					ref += '_1';
				}
			}

			if (ref === false || ref_suggest.references[ref]) { // Show error and then leave function
				ref_suggest.input.closest('ul').addClass('error');
				continue;
			}

			ref_suggest.input.closest('ul').removeClass('error');

			ref_suggest.references[ref] = ref;

			//get human
			var human = ref.osis_to_human();
			ref_suggest.input.parent().before('<li rel=\"'+ref+'\">'+human+'<a class=\"x\">x</a></li>');
		}
		ref_suggest.input.val('');
		ref_suggest.updateInput();
		ref_suggest.input.focus();
	},
	
	clear: function() {
		ref_suggest.input.closest('ul').find('li:not(li.input)').remove();
		ref_suggest.hidden.val('');
		ref_suggest.references = {};
	},
	
	removeValues: function(values) {
		var parts = values.split(',');

		for (var i = 0; i < parts.length; i++)
		{
			var str = $.trim(parts[i]);

			if (str == '') { continue; }
			str = str.uc_first();

			var ref = str.human_to_osis(reader.main.books.human_to_osis, '_', true);

			if (ref === false) {
				parts[i] = str.osis_to_human();

				if (parts[i] !== false)
				{
					ref = parts[i].human_to_osis(reader.main.books.human_to_osis, '_', true);
				}
			}

			if (ref !== false) {
				var osis = ref.split('_');
	
				if (osis.length < 3) {
					ref += '_1';
				}
			}

//			if (ref === false || ref_suggest.references[ref]) { // Show error and then leave function
//				ref_suggest.input.closest('ul').addClass('error');
//				continue;
//			}

			var item = ref_suggest.input.closest('ul').find('li[rel='+ref+']');
			if (item.length === 1)
			{
				ref_suggest.removeItem(item);
			}
		}
		ref_suggest.input.val('');
		ref_suggest.updateInput();
		ref_suggest.input.focus();
	}
};

// Google Analytics
// Load in dynamically

function loadGA() {
    var s1 = document.createElement('script');
    s1.setAttribute('id', 'googleanalytics');
    s1.setAttribute('src', 'http://www.google-analytics.com/urchin.js');
    s1.setAttribute('type', 'text/javascript');

    $(s1).bind('readystatechange', function () {
	    if ((s1.readyState == 'complete') || (s1.readyState == 'loaded')) {
			callGA();
	    }
	});

    $(s1).load(callGA);
    document.getElementsByTagName('head').item(0).appendChild(s1);
}

function callGA() {
    var s2 = document.createElement('script');
    s2.setAttribute('type', 'text/javascript');
    s2.text = '_uacct="UA-351257-4"; urchinTracker();';
    document.getElementsByTagName('body').item(0).appendChild(s2);

}

// Avatar Expand

var avatars = {
	init: function() {
		$('body').append('<div id="img_slide" style="padding: 5px; position: absolute; display: none;"><div id="img_bground" style="width: 100%; height: 100%"></div></div>');
		
		$('a.user-avatar.expand').bind('click', avatars.expand);
		
		$('#img_slide').click();
	},
	
	expand: function(event) {
		event.preventDefault();
		$(this).unbind('click', avatars.expand);
			
		var img_url = $(this).find('img').attr('src');
		img_url = img_url.replace(/\d+x\d+/, '512x512');
		
		var e = $('#img_slide');
		var i = $('#img_bground');
		
		i.css('background', '#EEE url('+img_url+')');
		i.hide();
		
		e.css('opacity', 0);
		e.show();
		
		var img = $(this).find('img');
		var offset = img.offset();
		
		e.css('height', '48px');
		e.css('width', '48px');
		
		e.css('top', offset.top - 6);
		e.css('left', offset.left - 6);
		
		//url(/img/loader_lg_black_on_lt_gray.gif) no-repeat center center
		e.css('background', '#EEE');
		e.css('border', '1px solid #CDCDCD');
		
		e.fadeTo(300, 1, function() {			
			e.animate({ width: "512px", height: "512px" }, 
				{ 
					duration: 150, 
					queue: false, 
					complete: function() {
						i.show();
						e.bind('click', avatars.contract);
					}
				}
			);
		});
	},
	
	contract: function(event) {
		var e = $(this);
		var i = $(this).find('#img_bground');
		
		e.unbind('click', avatars.contract);
		
		e.animate({ width: "48px", height: "48px" },
			{
				queue: false, 
				duration: 150, 
				complete: 
					function() { 
						i.hide(); 
						
						e.fadeTo(300, 0, function() {
							e.css('display', 'none');
						});
						
						$('a.user-avatar.expand').bind('click', avatars.expand);
					} 
			}
		);
	}
};

$(function() {
	avatars.init();

	// Focus username or password fields on sign-in page
	if ($('#password').val() === '') {
		$('#username').select();
	} else {
		$('#password').select();
	}

	// Country filtering
	$("select[name='country']").change(function() {  
		if ($(this).val() == 'US') { 
			$('div.state').css({display:'block'}); 
			$('div.province').css({display:'none'}); 
		} else { 
			$('div.state').css({display:'none'}); 
			$('div.province').css({display:'block'}); 
		} 
		
		var tz = $('#timezone').val();
		$.getJSON('/my/edit-profile/timezones/'+$(this).val(), function(data){ 
		
			var html_f = '<option value=""></option>'; 
			
			$.each(data, function(key, val) 
			{ 
				var selected = (tz == key) ? ' selected="selected"' : '';
				html_f += '<option value="'+key+'"'+selected+'>'+val[1]+'</option>'; 
			}); 
			
			$('#timezone').html(html_f); 
		}); 
	}); 
});