// days, used in setCookie
var defaultExpire = 7;
var myURL = 'www.the-ppole.com';
var myPath = '/';

// correspond to Tissue theme's default values for margin-left
var containerML = '-25%';
var contentML = '28%';

// symbols used in toggle controls
var expandSymbol = '⊞';
var shrinkSymbol = '⊠';
var serifSymbol = '⊕';
var sansSymbol = '⊗';

// constants used in font toggles
var serif = '"Luxi Serif", serif';
var s_serif = '"Luxi Sans", sans-serif';

var grpBody = ['div.entry-content'];
var grpHead = ['.page-title', '.entry-title'];

// applies function to each item in the array
function apply(func, A) {
	if (isArray(A)) {
		for (var i in A) {
			func(i);
		}
	}
	return;
}

// cookie management
function getCookie( name ) {
	var start = document.cookie.indexOf( name + "=" );
	var len = start + name.length + 1;
	if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) {
		return null;
	}
	if ( start == -1 ) return null;
	var end = document.cookie.indexOf( ';', len );
	if ( end == -1 ) end = document.cookie.length;
	return unescape( document.cookie.substring( len, end ) );
}

function setCookie( name, value, expires, path, domain, secure ) {
	var today = new Date();
	today.setTime( today.getTime() );
	if ( expires ) {
		expires = expires * 1000 * 60 * 60 * 24;
	}
	var expires_date = new Date( today.getTime() + (expires) );
	document.cookie = name+'='+escape( value ) +
		( ( expires ) ? ';expires='+expires_date.toGMTString() : '' ) + //expires.toGMTString()
		( ( path ) ? ';path=' + path : '' ) +
		( ( domain ) ? ';domain=' + domain : '' ) +
		( ( secure ) ? ';secure' : '' );
}

function deleteCookie( name, path, domain ) {
	if ( getCookie( name ) ) document.cookie = name + '=' +
			( ( path ) ? ';path=' + path : '') +
			( ( domain ) ? ';domain=' + domain : '' ) +
			';expires=Thu, 01-Jan-1970 00:00:01 GMT';
}

// unlimited arguments, returns DOM element/[elements] by ID
/*function $() {
	var elements = new Array();
	for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if (typeof element == 'string') {
			element = document.getElementById(element);
			if (arguments.length == 1) { return element; }
			else { elements.push(element); }
		}
	}
	return elements;
}*/

// replaces the expand/shrink symbols with whichever is appropriate for the setting
function controlBoxes() {
	var sidebar = getCookie('sidebar');

	// initialize the cookie
	if (!(sidebar == 'on' || sidebar == 'off')) {
		sidebar = 'on';
		setCookie('sidebar', 'on', defaultExpire, myPath, myURL);
	}

	// sets the symbol used in the controls
	if (sidebar == 'on') { j$('#sidebar-toggle').html(expandSymbol); }
	else { j$('#sidebar-toggle').html(shrinkSymbol); }

	var font = getCookie('font');

	if (!(font == 'serif' || font == 'sans-serif')) {
		font = 'serif';
		setCookie('font', 'serif', defaultExpire, myPath, myURL);
	}

	if (font == 'serif') { j$('#font-toggle').html(serifSymbol); }
	else { j$('#font-toggle').html(sansSymbol); }

	return;
}

function restoreSidebar(id, themeURL) {
	if (id == 'primary') {
		var sidebar = getCookie('sidebar');

		if (!(sidebar == 'on' || sidebar == 'off')) { setCookie('sidebar', 'on', defaultExpire, myPath, myURL); }
		if (sidebar == 'off') { document.write('<link rel="stylesheet" type="text/css" href="' + themeURL + '/noPrimary.css" />'); }
	}
	return;
}

function restoreFont() {
	var f = getCookie('font');
	if (f == 'sans-serif') {
		toggleFont(f);
	}
	return;
}

function toggleSidebar(id) {
	if (id == 'primary') {
		var value = getCookie('sidebar');

		// initialize the cookie
		if (!(value == 'on' || value == 'off')) { value = 'on'; }

		if (value != 'on') { // when user has hidden the sidebar
			value = 'on';
			j$('#container').css('margin-left', containerML);
			j$('#content').css('margin-left', contentML);
			j$('#primary').show();
		} else { // currently on, turn it off
			value = 'off';
			j$('#container').css('margin-left', '0%');
			j$('#content').css('margin-left', '0%');
			j$('#primary').hide();
		}

		// update cookie with new value + date
		setCookie('sidebar', value, defaultExpire, myPath, myURL);
		controlBoxes();
	}
	return;
}

function toggleFont(f) {
	var font = getCookie('font');

	if (!(font == 'serif' || font == 'sans-serif')) { font = 'serif'; }

	// set font to !f so we toggle from !f to f
	if (f == 'sans-serif') { font = 'serif'; }

	var fam1 = '';
	var fam2 = '';

	if (font != 'serif') { // body is serif, head is sans
		font = 'serif'; // switch
		fam1 = serif;
		fam2 = s_serif;
	} else { // body is sans, head is serif
		font = 'sans-serif';
		fam1 = s_serif;
		fam2 = serif;
	}

	for (var i = 0; i < grpBody.length; i++) {
		j$(grpBody[i]).css('font-family', fam1);
	}
	for (var i = 0; i < grpHead.length; i++) {
		j$(grpHead[i]).css('font-family', fam2);
	}

	setCookie('font', font, defaultExpire, myPath, myURL);
	controlBoxes();
	return;
}

function toggle(id) {
	var item = document.getElementById(id);
	if (item.style.display != 'block') { item.style.display = 'block'; }
	else { item.style.display = 'none'; }
	return;
}

// object type validation
function isBtwn (n, min, max, strict) { // strict is true/false
	if (strict) { return (n > min && n < max); }
	else { return (n >= min && n <= max); }
}

function isString(obj) {
	return typeof(obj) == 'string';
}

function isInt (obj) {
	return parseInt(obj) == obj;
}

function isArray(obj) {
   if (obj.constructor.toString().indexOf('Array') == -1) { return false; }
   else { return true; }
}


// color management
var cArray = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];

function colorConvert(c) { // c is hex string to rgb array, or vice versa
	if (isString(c)) { // when we give greyConvert a color code

		// strip leading # if it exists
		if (c.substring(0, 1) == '#') { c = c.substring(1); }

		// when c is in the form 'xyz' instead of 'xxyyzz'
		if (c.length == 3) {
			var lc = ''; // lc for long color
			for (i = 0; i < c.length; i++) {
				var d = c.substring(i, i+1);
				lc += d + d; // duplicate the char
			}

			c = lc;
		}

		// convert c to lower case so we can compare
		c = c.toLowerCase();

		if (c.length == 6) {
			var o = [0, 0, 0];

			for (var i = 0; i < c.length; i++) {
				var j = Math.floor(i / 2); // rgb[j], j = 0, 1, 2
				var d = c.substring(i, i+1); // d is char i of c

				for (var k = 0; k < cArray.length; k++) {
					if (cArray[k] == d) {
						if (i % 2 == 0)  { o[j] += k * 16; }
						else { o[j] += k; }
					}
				}
			}
			return o;
		} else {
			return null;
		}
	} else if (isArray(c)) {
		var o = '#';
		if (isBtwn(c[0], 0, 255, false) && isBtwn(c[1], 0, 255, false) && isBtwn(c[2], 0, 255, false)) {
			for (var i = 0; i < c.length; i++) {
				o += cArray[Math.floor(c[i] / 16)] + cArray[c[i] % 16];
			}
			return o;
		} else {
			return null;
		}
	} else {
		return null;
	}
}

// greyConvert: validColor -> colorString
function greyConvert(c) {
	if (isString(c)) {
		return greyConvert(colorConvert(c));
	} else if (isArray(c)) {
		if (isBtwn(c[0], 0, 255, false)
			&& isBtwn(c[1], 0, 255, false)
			&& isBtwn(c[2], 0, 255, false))
		{
			var avg = Math.round((c[0] + c[1] + c[2]) / 3, 0);
			return colorConvert([avg, avg, avg]);
		} else {
			return null;
		}
	} else {
		return null;
	}
}

// scaleColor: validColor, validColor, validColor -> colorString
// scales any color wrt rgb(0, 255) to
function scaleColor(c, lo, hi) {
	// convert all colors to arrays
	if (isString(c)) { c = colorConvert(c); }
	if (isString(lo)) { lo = colorConvert(lo); }
	if (isString(hi)) { hi = colorConvert(hi); }

	var o = []; // output
	var trans = []; // this will store the base and scalar arrays for R, G, B

	// base [0] is the lo index, scalar is the max range of values to convert c[i] to
	for (var i = 0; i < 3; i++) {
		trans[i] = [Math.min(lo[i], hi[i]), Math.abs(hi[i]-lo[i])];
	}

	// function: rgb(0, 255) to rgb(lo, hi)
	for (var i = 0; i < c.length; i++) {
		o[i] = trans[i][0] + Math.round((c[i] / 255) * trans[i][1]);
	}

	return colorConvert(o);
}

function daynightTimer(id, lo, hi) {
	setInterval(daynight(id, lo, hi), (1000*60*5));
	return;
}

function daynight(id, lo, hi) {
	var item = document.getElementById(id);
	var now = new Date();
	now = now.getHours()*60 + now.getMinutes();
	/*
		since scaleColor defensively arranges lo/hi to always stay within 0 to 255,
		so to get scale == lo when now == noon, we invert scale wrt 255
	*/
	var s = 255 - Math.round((Math.abs(now - 12*60) / (12*60)) * 255, 0);

	if (lo == null) { lo = [0, 0, 0]; }
	if (hi == null) { hi = [255, 255, 255]; }

	item.style.backgroundColor = scaleColor([s, s, s], lo, hi);
	return;
}

