// http://www.robvolk.com

jQuery.fn.inputHints=function() {
    // hides the input display text stored in the title on focus
    // and sets it on blur if the user hasn't changed it.

    // show the display text
    $(this).each(function(i) {
	if ($(this).val() == '')
            $(this).val($(this).attr('title'))
      	        .addClass('hint');
    });

    // hook up the blur & focus
    return $(this).focus(function() {
        if ($(this).val() == $(this).attr('title'))
            $(this).val('')
                .removeClass('hint');
    }).blur(function() {
        if ($(this).val() == '')
            $(this).val($(this).attr('title'))
                .addClass('hint');
    });
};

function gcf(a, b) {
	var remainer = 0;
	var factor = 1;
	var maxIter = 100;
	var i = 0;
	var tmp;
	while (1) {
		if (b > a) {
			tmp = a;
			a = b;
			b = tmp;
		}
		remainder = a % b;
		a = b;
		b = remainder;
		if (remainder == 0) {
			factor = a;
			break;
		} else if (remainder == 1) {
			break;
		} else if (i > maxIter) {
			return false;
		}
		i += 1;
	}
	return factor;
}

function floatAsFraction(fp) {
	var num = fp;
	var decimalPlaces = num.toString().split(".")[1].length;
	var denom = Math.pow(10, decimalPlaces);
	var gcfint = gcf(denom*num, denom);
	if ((gcfint != 0) && (denom < 1e5)) {
		num = num*denom/gcfint;
		denom = denom/gcfint;
	} else {
		// Dirtier method
		/*
		var remainder = fp - Math.floor(fp);
		alert("dirtier method");
		denom = Math.round(1/remainder);
		num = Math.round(fp*denom);
		if (Math.abs(fp - num/denom) > 1e-7)
			return false;
		*/	
	} 
	return "\\frac{" + num.toString() + "}{" + denom.toString() + "}";
}

// Thanks to http://stackoverflow.com/questions/95727/how-to-convert-floats-to-human-readable-fractions
function floatAsFraction2(fp) {
	var m = Array(2);
	m[0] = Array(2);
	m[1] = Array(2);
	
	var x = fp;
	var startx = fp;
	var maxden = 10000;
	var ai;
	var t;

	m[0][0] = 1;
	m[1][1] = 1;
	m[0][1] = 0;
	m[1][0] = 0;

	// Loop finding terms until denom gets too big
	while (Math.abs(m[1][0] * Math.round(x) + m[1][1]) <= maxden) {
		ai = Math.round(x);
		t = m[0][0] * ai + m[0][1];
		m[0][1] = m[0][0];
		m[0][0] = t;
		t = m[1][0] * ai + m[1][1];
		m[1][1] = m[1][0];
		m[1][0] = t;
		if (x == ai) break;
		x = 1/(x - ai);
	}

	// Now remaining x is between 0 and 1/ai
	// approx as either 0 or 1/m where m is max that will fit in maxden
	// First try zero
	num_0 = m[0][0];
	den_0 = m[1][0];
	e_0 = Math.abs(startx - num_0/den_0);

	// Then try alternative
	ai = (maxden - m[1][1]) / m[1][0];
	m[0][0] = m[0][0] * ai + m[0][1];
	m[1][0] = m[1][0] * ai + m[1][1];
	num_1 = m[0][0];
	den_1 = m[1][0];
	e_1 = Math.abs(startx - num_1/den_1);

	if (e_0 < e_1) {
		num = num_0;
		den = den_0;
		e = e_0;
	} else {
		num = num_1;
		den = den_1;
		e = e_1;
	}

	if (den < 0) {
		num *= -1;
		den *= -1;
	}

	if ((e > 1e-9) || (den == 1)) return false;
	
	return "\\frac{" + num.toString() + "}{" + den.toString() + "}";
}

function urlencode(str) {
    return escape(str).replace('+', '%2B').replace('%20', '+').replace('*', '%2A').replace('/', '%2F').replace('@', '%40');
}

function urldecode(str) {
    return unescape(str.replace('+', ' '));
}

function urlFromForm(formName) {
    var url = location.href;
    var separator = /.+#!(.+)$/
    url = url.replace(separator, "");
    url += "#!"
    $("#"+formName).find("input, select").each(function() {
        if ($(this).attr("name") != "") {
            url += $(this).attr("name") + "=" + urlencode($(this).val()) + "&";
	}
    });
   location.href = url;
}

// Read a page's GET URL variables and return them as an associative array.
function getUrlVars()
{
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');

    for(var i = 0; i < hashes.length; i++)
    {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }

    return vars;
}

function formValsFromUrl() {
	var getvars = getUrlVars();
	for (var i in getvars) {
		$("input#id_"+i).val(getvars[i]);
		$("select#id_"+i).find("option[value~="+getvars[i]+"]").attr("selected", "selected");
	}
}

// dot for comma in numbers
function dotForComma(str) {
	var commas = /([\d]+),([\d]+)/g;
	return str.replace(commas, "$1.$2");	
}

$(document).ready(function() {
	$("form").bind("submit", function() {
		$("#ad2").css("border", "1px solid #ccc");
		setTimeout(function () {
			$("#ad2").css("border", "1px solid #fff");
		}, 2);
	});
});

