var charts_showing = 0;
var symbolre = /[A-Z]{1,5}/;

function showChart(obj,symbol,mode,open_chart,close_chart) {
	var element = obj.parentNode;
	var image_container = element.getElementsByTagName("div")[1];
	if (mode == 'close' || image_container.innerHTML.match(/getchart/)) {
		image_container.innerHTML = "";
		obj.innerHTML = "<img src=\"/i/chart_curve_add.png\"/>";
	} else {
		var image_html = "";
		image_html = "<table><tr><td><div class=\"chart_title\">Current Chart</div><div class=\"current_chart\"><img src=\"/getchart.cgi?symbol=" + symbol + "\" alt=\"Chart for " + symbol + "\"/><span class=\"chart_control\" onclick=\"changeChart(this,'" + symbol + "','3m')\">3 month</span> <span class=\"chart_control\" onclick=\"changeChart(this,'" + symbol + "','6m')\">6 month</span> <span class=\"chart_control\" onclick=\"changeChart(this,'" + symbol + "','1y')\">1 Year</span></div></td>";
		if (open_chart) {
			image_html = image_html + "<td valign=\"top\"><div class=\"historical_chart\"><div class=\"chart_title\">Chart When Added (Historical)</div><img src=\"/charts/" + open_chart + ".gif\" alt=\"Chart for " + symbol + " when this stock was first tracked\"/></div></td>";
		}
		image_html = image_html + "</tr></table>";
		image_container.innerHTML = image_html;
		obj.innerHTML = "<img src=\"/i/chart_curve_delete.png\"/>";
	}
	return false;
}

function showAllCharts() {
	var stocklist = document.getElementById("stocklist");
	var entries = stocklist.getElementsByTagName("li");
	for (var i = 0; i < entries.length; i++) {
		var stock_object = entries[i].getElementsByTagName("h3");
		var symbol = symbolre.exec(stock_object[0].innerHTML);
		var span_element = entries[i].getElementsByTagName("span");
		if (charts_showing == 1) {
			showChart(span_element[0],symbol,'close');
		} else {
			showChart(span_element[0],symbol,'open');
		}
	}
	var allchartlink = document.getElementById("showcharts");
	if (charts_showing == 1) {
		allchartlink.innerHTML = "Show all charts on this page";
		charts_showing = 0;
	} else {
		allchartlink.innerHTML = "Hide all charts on this page";
		charts_showing = 1;
	}


}

function changeChart(obj,symbol,time_frame) {
	var element = obj.parentNode.parentNode;
	var image_container = element.getElementsByTagName("div")[1];
	//image_container.innerHTML = "<img src=\"http://app.quotemedia.com/quotetools/getChart?symbol=" + symbol + "&chtype=FinancialCandleStick&chmrg=3&chscale=" + time_frame + "&chwid=250&chhig=250&chbg=ffffff&chln=800000&chgrd=006699&chxyc=000000&chmrg=2&chbgch=B9CEF8&chbdr=000000&chton=on&chtcol=000000&chfill=FFFFFF&chfill2=000000\" alt=\"Chart for " + symbol + "\"/><span class=\"chart_control\" onclick=\"changeChart(this,'" + symbol + "','3m')\">3 month</span> <span class=\"chart_control\" onclick=\"changeChart(this,'" + symbol + "','6m')\">6 month</span> <span class=\"chart_control\" onclick=\"changeChart(this,'" + symbol + "','1y')\">1 Year</span>";
	image_container.innerHTML = "<img src=\"/getchart.cgi?symbol=" + symbol + "\" alt=\"Chart for " + symbol + "\"/><span class=\"chart_control\" onclick=\"changeChart(this,'" + symbol + "','3m')\">3 month</span> <span class=\"chart_control\" onclick=\"changeChart(this,'" + symbol + "','6m')\">6 month</span> <span class=\"chart_control\" onclick=\"changeChart(this,'" + symbol + "','1y')\">1 Year</span>";
}


function makeTagsCanonical(tags) {
  tags = tags.replace(/\s*,\s*/g,",");
  tags = tags.replace(/,+/g,",");
  tags = tags.replace(/^,/,"");
  tags = tags.replace(/,$/,"");
  tags = tags.replace(/^\s+/,"");
  tags = tags.replace(/\s+$/,"");
  return tags;
}

function swapTag(name) {
	var delimiter = ",";
	var tag_input = document.getElementById('taginput');
	var current_value = makeTagsCanonical(tag_input.value);

        name = makeTagsCanonical(name);
        
	var existing_tags = existing_tags = current_value.split(/,/);
	var final_tags = new Array();
	var found = false;
	for (var i = 0; i < existing_tags.length; i++) {
		if (existing_tags[i]) {
			if (existing_tags[i] != name) {
				final_tags.push(existing_tags[i]);
			}
       		        else { 
                                 found = true;
                        }
		}
	}
	if(!found) {
		final_tags.push(name);
	}
	tag_input.value = final_tags.join(delimiter);
}

function toggleVisibility(base_name, class_name) {
	var journal_div = document.getElementById(base_name + "div");
	var journalclass = journal_div.getAttribute("className");
	var journalclass_attribute = journal_div.getAttribute("class");
	if (class_name) {
		if (journalclass == class_name || journalclass_attribute == class_name) {
			journal_div.setAttribute("class",class_name + "_shown");
			journal_div.setAttribute("className",class_name + "_shown");
		} else if (journalclass == base_name + "_shown" || journalclass_attribute == class_name + "_shown") {
			journal_div.setAttribute("class",class_name);
			journal_div.setAttribute("className",class_name);
		}
		return;
	} else {
		if (journalclass == base_name + "div" || journalclass_attribute == base_name + "div") {
			journal_div.setAttribute("class",base_name + "div_shown");
			journal_div.setAttribute("className",base_name + "div_shown");
		} else if (journalclass == base_name + "div_shown" || journalclass_attribute == base_name + "div_shown") {
			journal_div.setAttribute("class",base_name + "div");
			journal_div.setAttribute("className",base_name + "div");
		}
	}

	var journal_elements = document.getElementsByTagName("tr");
	var classes = "";
	for (var i = 0; i < journal_elements.length; i++) {
		var className = journal_elements[i].getAttribute("className");
		var classAttribute = journal_elements[i].getAttribute("class");
		//if (journal_elements[i].className == base_name + "") {
		if (className == base_name + "" || classAttribute == base_name + "") {
			journal_elements[i].setAttribute("class",base_name + "_shown");
			journal_elements[i].setAttribute("className",base_name + "_shown");
			//journal_elements[i].className = base_name + "_shown";
			/*if (journal_elements[i].style.className == base_name + "_hidden") {
				//journal_elements[i].style.display = "inline";
			} else {
				//journal_elements[i].style.display = "none";
			}*/
		} else if (className == base_name + "_shown" || classAttribute == base_name + "_shown") {
			//journal_elements[i].className = base_name + "";
			journal_elements[i].setAttribute("class",base_name + "");
			journal_elements[i].setAttribute("className",base_name + "");
		}
	}
}

function recalculateStats(changed, type, rate, minimum) {
	var trade_type_element = document.getElementById("trade_type");
	var buy_price_element = document.getElementById("buy_price");
	var shares_element = document.getElementById("shares");
	var stop_price_element = document.getElementById("stop_price");
	var equity_element = document.getElementById("equity");
	var amount_risked_element = document.getElementById("amount_risked");
	var percent_risked_element = document.getElementById("percent_risked");
	var tot_percent_risked_element = document.getElementById("tot_percent_risked");
	var multiplier = document.getElementById("multiplier");

	var type_index = trade_type_element.selectedIndex;
	var trade_type = trade_type_element.options[type_index].value;
	var buy_price = buy_price_element.value;
	var shares_value = shares_element.value || shares_element.innerHTML;
	var shares = shares_value;
	var stop_price = stop_price_element.value;
	var equity = equity_element.value;
	var amount_risked = amount_risked_element.value || amount_risked_element.innerHTML;
	var percent_risked = percent_risked_element.value || percent_risked_element.innerHTML;
	var tot_percent_risked = tot_percent_risked_element.value || tot_percent_risked_element.innerHTML;
	var multiplier_value = 1;
	if (multiplier) {
		multiplier_value = multiplier.value || multiplier.innerHTML;
	}

	if (multiplier_value > 1) {
		shares = shares_value * multiplier_value; 
	}

	buy_price = parseFloat(buy_price);
	stop_price = parseFloat(stop_price);
	if (buy_price < stop_price) {
		trade_type_element.selectedIndex = 1;
		trade_type = -1;
	} else if (buy_price > stop_price) {
		trade_type_element.selectedIndex = 0;
		trade_type = 1;
	}
	if (changed == 'equity' || changed == 'stop_price' || changed == 'shares' || changed == 'price') {
		if (buy_price > 0 && stop_price > 0 && equity > 0 && shares > 0) {
			var trade_equity = buy_price * shares;
			var equity_at_stop = stop_price * shares;
			var equity_at_risk = (trade_equity - equity_at_stop) * trade_type;
			var amount_risked = Math.round((trade_equity - equity_at_stop) * trade_type * 100) / 100;
			try {
				amount_risked_element.innerHTML = amount_risked;
			} catch (err) {
			}
			try {
				amount_risked_element.value = amount_risked;
			} catch (err) {
			}
			var percent_risked = Math.round((equity_at_risk / trade_equity) * 100 * 100) / 100;
			try {
				percent_risked_element.innerHTML = percent_risked;
			} catch (err) {
			}
			try {
				percent_risked_element.value = percent_risked;
			} catch (err) {
			}
			var tot_percent_risked = Math.round((equity_at_risk / equity) * 100 * 100) / 100;
			try {
				tot_percent_risked_element.innerHTML = tot_percent_risked;
			} catch (err) {
			}
			try {
				tot_percent_risked_element.value = tot_percent_risked;
			} catch (err) {
			}
		}
	} else if (changed == 'tot_percent_risked') {
		if (buy_price > 0 && equity > 0 && shares > 0) {
			var equity_at_risk = tot_percent_risked / 100 * equity;
			var trade_equity = buy_price * shares;
			amount_risked_element.value = Math.round(equity_at_risk * 100) / 100;
			var stop_price = (equity_at_risk / shares * trade_type - buy_price) / -1;
			stop_price_element.value = Math.round(stop_price * 100) / 100;
			percent_risked_element.value = Math.round((equity_at_risk / trade_equity) * 100 * 100) / 100;
		}
	} else if (changed == 'percent_risked') {
		if (buy_price > 0 && equity > 0 && shares > 0) {
			var stop_price = (percent_risked / 100 * buy_price - buy_price) / -1 * trade_type;;
			var trade_equity = buy_price * shares;
			var amount_risked = (buy_price - stop_price) * shares * trade_type;
			amount_risked_element.value = Math.round(amount_risked * 100) / 100;
			stop_price_element.value = Math.round(stop_price * 100) / 100;
			tot_percent_risked_element.value = Math.round((amount_risked / equity) * 100 * 100) / 100;
		}
	} else if (changed == 'amount_risked') {
		if (buy_price > 0 && equity > 0 && shares > 0) {
			var stop_price = Math.round(((buy_price - (trade_type * amount_risked / shares)) * 100)) / 100;
			stop_price_element.value = stop_price;
			var trade_equity = buy_price * shares;
			percent_risked_element.value = Math.round((amount_risked / trade_equity) * 100 * 100) / 100;
			tot_percent_risked_element.value = Math.round((amount_risked / equity) * 100 * 100) / 100;
		}
	}
	var lockcommission = document.getElementById("comm_user_set");
	if (lockcommission && lockcommission.checked == true) {
	} else {
		if (type == 'share') {
			$("#commission").val( calculate_commission(rate, minimum, $("#shares").val()) );
		}
	}
}

function calculate_commission(rate, minimum, shares) {
	var cost = rate * shares;
	if (cost < minimum) {
		return sprintf("%.2f", minimum);
	} else {
		cost = Math.round(cost * 100) / 100;
		return sprintf("%.2f", cost);
	}
}

function recalculateProfit(closed_trade) {
	var trade_type_element = document.getElementById("trade_type");
	var buy_price_element = document.getElementById("buy_price");
	var shares_element = document.getElementById("shares");
        var open_shares_element = document.getElementById("open_shares");
        var avg_close_price_element = document.getElementById("avg_close_price");
	var stop_price_element = document.getElementById("stop_price");
	var equity_element = document.getElementById("equity");
	var amount_risked_element = document.getElementById("amount_risked");
	var percent_risked_element = document.getElementById("percent_risked");
	var tot_percent_risked_element = document.getElementById("tot_percent_risked");
	var close_price_element = document.getElementById("close_price");
	var profit_element = document.getElementById("profit");
	var r_multiple_element = document.getElementById("r_multiple");
	var multiplier_element = document.getElementById("multiplier");

	var trade_type = 0;
	if (trade_type_element.innerHTML == 'Long') {
		trade_type = 1;
	} else if (trade_type_element.innerHTML == 'Short') {
		trade_type = -1;
	} else {
		var type_index = trade_type_element.selectedIndex;
		var trade_type_value = trade_type_element.options[type_index].value;
		trade_type = trade_type_value;
	}
	var buy_price = buy_price_element.innerHTML || buy_price_element.value;
	var shares = shares_element.innerHTML || shares_element.value;;
        var open_shares = 0;
	if (closed_trade) {
		open_shares = shares;
	} else {
		open_shares = open_shares_element.innerHTML;
	}

        var avg_close_price = 0;
	if (closed_trade) {
		avg_close_price = close_price;
	} else {
		avg_close_price = avg_close_price_element.innerHTML;
	}
	var stop_price = stop_price_element.innerHTML || stop_price_element.value;
	var equity = equity_element.innerHTML || equity_element.value;
	var amount_risked = $("#amount_risked").val();
	var percent_risked = percent_risked_element.innerHTML || percent_risked_element.value;
	var tot_percent_risked = tot_percent_risked_element.innerHTML || tot_percent_risked_element.value;
	var close_price = close_price_element.value || close_price_element.value;
	var multiplier = 1;
	if (multiplier_element) {
		multiplier = multiplier_element.innerHTML;
	}

	if (multiplier > 1) {
		shares = shares * multiplier;
		open_shares = open_shares * multiplier;
	}

        //if(avg_close_price == 'N/A') { avg_close_price = 0.0; }
        if(avg_close_price == 'N/A') { avg_close_price = close_price; }

	if (buy_price > 0 && stop_price > 0 && equity > 0 && shares > 0) {
		var profit = open_shares * (close_price - buy_price) * trade_type;
                if (closed_trade != 1) {
			profit += (shares - open_shares) * (avg_close_price - buy_price) * trade_type;
		}
             
		var profit_percent = (profit / (buy_price * shares)) * 100;
		var r_multiple = profit / amount_risked;
		profit_percent = Math.round(profit_percent * 100) / 100;
		r_multiple = Math.round(r_multiple * 100) / 100;
		profit = Math.round(profit * 100) / 100;

		profit_element.innerHTML = profit + " (" + profit_percent + "%)";
		r_multiple_element.innerHTML = r_multiple;
	}
}

function validateSubmit() {
	var tags_element = document.getElementById("taginput");
	var tags = tags_element.value;
	if (tags == '' || tags == ' ') {
		var answer = confirm("You didn't enter any tags for this pick.  Tagging your picks is one of the features that makes stocktickr so useful.  If you're unsure, try a simple \"long\" or \"short\" tag.  Click OK to add this stock without any tags or cancel to add some tags first.");
		if (answer) {
			return true;
		} else {
			return false;
		}
	}
	var journalbox = document.getElementById("journalbox");
	var stop_price_element = document.getElementById("stop_price");
	var stop_price = stop_price_element.value;
	var equity_element = document.getElementById("equity");
	var equity = equity_element.value;
	var shares_element = document.getElementById("shares");
	var shares = shares_element.value || shares_element.innerHTML;
	if (stop_price > 0) {
	} else {
		alert("Stop price cannot be zero.  Choose an initial stop to define your risk for this trade.  Stop price was " + stop_price);
		return false;
	}
	if (shares > 0) {
	} else {
		alert("Shares cannot be zero.  Choose a positive integer for the shares field.");
		return false;
	}
	if (equity > 0) {
	} else {
		alert("Equity cannot be zero.  Choose a positive number for the equity field.");
		return false;
	}
}

function stoplosschange() {
	var slt = $("#stoplosstype").val();
	var label_text = "";
	if (slt == 'portpercent') {
		label_text = "Risk Percent To Use:";
	} else if (slt == 'pricepercent') {
		label_text = "Percent of Price:";
	} else if (slt == 'pricedollars') {
		label_text = "Distance in Dollars:";
	}
	if (label_text) {
		$("#stoplossmodlabel").innerHTML = label_text;
	}
}

function show_based_on_check(cb_id, classname, hiddenclass, shownclass) {
	var checkbox_object = document.getElementById(cb_id);
	//var toggleables = document.getElementsByClassName(classname);
	if (checkbox_object.checked) {
		/*for (var index = 0, len = toggleables.length; index < len; ++index) {
			var item = toggleables[index];
			item.addClassName(shownclass);
			item.removeClassName(hiddenclass);
		}
		*/
		$("." + classname).addClass(shownclass);
		$("." + classname).removeClass(hiddenclass);
	} else {
		/*var toggleables = document.getElementsByClassName(shownclass);
		for (var index = 0, len = toggleables.length; index < len; ++index) {
			var item = toggleables[index];
			item.addClassName(hiddenclass);
			item.removeClassName(shownclass);
		}
		*/
		$("." + shownclass).addClass(hiddenclass);
		$("." + shownclass).removeClass(shownclass);
	}
}

function showfilter(obj) {
	/*var filter_rows = document.getElementsByClassName("filter");
	for (var index = 0, len = filter_rows.length; index < len; ++index) {
		var item = filter_rows[index];
		item.addClass("filtershown");
		item.removeClass("filter");
	}
	obj.hide();
	*/
	$(".filter").addClass("filtershown");
	$(".filter").removeClass("filter");
	$("#showfilterlink").hide();
}

function hidefilter(obj) {
	/*var filter_rows = document.getElementsByClassName("filtershown");
	for (var index = 0, len = filter_rows.length; index < len; ++index) {
		var item = filter_rows[index];
		item.addClass("filter");
		item.removeClass("filtershown");
	}
	$("#showfilterlink").show();
	*/
	$(".filtershown").addClass("filter");
	$(".filtershown").removeClass("filtershown");
	$("#showfilterlink").show();
}

function toggle_checkbox_status(truefalse) {
	/*var checkboxes = document.getElementsByClassName("bulkcheckbox");
	for (var index = 0, len = checkboxes.length; index < len; ++index) {
		var trade_checkbox = checkboxes[index];
		trade_checkbox.checked = truefalse;
	}
	*/
	$(".bulkcheckbox").attr("checked", truefalse);
}

function change_bulk_fields() {
	var modifytype = $("#modifytype").val();
	if (modifytype == 'deltag' || modifytype == 'addtag') {
		$("#hours").addClass("hidden");
		$("#hours").removeClass("shown");
		$("#tagname").addClass("shown");
		$("#tagname").removeClass("hidden");
		$("#tagnameto").addClass("hidden");
		$("#tagnameto").removeClass("shown");
		$("#commission").addClass("hidden");
		$("#commission").removeClass("shown");
	}
	if (modifytype == 'chgtag') {
		$("#hours").addClass("hidden");
		$("#hours").removeClass("shown");
		$("#tagname").addClass("shown");
		$("#tagname").removeClass("hidden");
		$("#tagnameto").addClass("shown");
		$("#tagnameto").removeClass("hidden");
		$("#commission").addClass("hidden");
		$("#commission").removeClass("shown");
	} else if (modifytype == 'delete') {
		$("#hours").addClass("hidden");
		$("#hours").removeClass("shown");
		$("#tagname").addClass("hidden");
		$("#tagname").removeClass("shown");
		$("#tagnameto").addClass("hidden");
		$("#tagnameto").removeClass("shown");
		$("#commission").addClass("hidden");
		$("#commission").removeClass("shown");
	} else if (modifytype == 'chgcom') {
		$("#hours").addClass("hidden");
		$("#hours").removeClass("shown");
		$("#tagname").addClass("hidden");
		$("#tagname").removeClass("shown");
		$("#tagnameto").addClass("hidden");
		$("#tagnameto").removeClass("shown");
		$("#commission").addClass("shown");
		$("#commission").removeClass("hidden");
	} else if (modifytype == 'addhours') {
		$("#hours").addClass("shown");
		$("#hours").removeClass("hidden");
		$("#tagname").addClass("hidden");
		$("#tagname").removeClass("shown");
		$("#tagnameto").addClass("hidden");
		$("#tagnameto").removeClass("shown");
		$("#commission").addClass("hidden");
		$("#commission").removeClass("shown");
	}

}

function bulkformatchange() {
	var trade_format = $("#tradeformat").val();

	if (trade_format == 'ninjatrader' || trade_format == 'generic' || trade_format == 'assent' || trade_format == 'thinkorswim2' || trade_format == 'thinkorswim' || trade_format == 'optionhouse' || trade_format == 'laser' || trade_format == 'infinity' || trade_format == 'rockwell' || trade_format == 'redi' || trade_format == 'sterling') {
		$("#tradefile").addClass("shown");
		$("#tradefile").removeClass("hidden");
		$("#brokerpassword").addClass("hidden");
		$("#brokerpassword").removeClass("shown");
		$("#brokerusername").addClass("hidden");
		$("#brokerusername").removeClass("shown");
		$("#lookbackdays").addClass("hidden");
		$("#lookbackdays").removeClass("shown");
		$("#timezone").addClass("shown");
		$("#timezone").removeClass("hidden");
		if (trade_format == 'assent' || trade_format == 'laser' || trade_format == 'generic' || trade_format == 'rockwell' || trade_format == 'redi' || trade_format == 'sterling') {
			$("#tradedate").addClass("shown");
			$("#tradedate").removeClass("hidden");
		}
	} else if (trade_format == 'tdameritrade' || trade_format == 'optionsxpress') {
		$("#brokerpassword").addClass("shown");
		$("#brokerpassword").removeClass("hidden");
		$("#brokerusername").addClass("shown");
		$("#brokerusername").removeClass("hidden");
		$("#tradefile").addClass("hidden");
		$("#tradefile").removeClass("shown");
		$("#lookbackdays").addClass("shown");
		$("#lookbackdays").removeClass("hidden");
	} else {
		$("#tradefile").addClass("shown");
		$("#tradefile").removeClass("hidden");
		$("#lookbackdays").addClass("hidden");
		$("#lookbackdays").removeClass("shown");
		$("#brokerpassword").addClass("hidden");
		$("#brokerpassword").removeClass("shown");
		$("#brokerusername").addClass("hidden");
		$("#brokerusername").removeClass("shown");
		$("#timezone").addClass("hidden");
		$("#timezone").removeClass("shown");
		$("#tradedate").addClass("hidden");
		$("#tradedate").removeClass("shown");
	}
}

function change_chart_image(img_id, chart_url) {
	var chart_image = document.getElementById(img_id);
	chart_image.src = chart_url;
}

function sprintf() {
	function pad(str, len, chr, leftJustify) {
		var padding = (str.length >= len) ? '' : Array(1 + len - str.length >>> 0).join(chr);
		return leftJustify ? str + padding : padding + str;

	}

	function justify(value, prefix, leftJustify, minWidth, zeroPad) {
		var diff = minWidth - value.length;
		if (diff > 0) {
			if (leftJustify || !zeroPad) {
				value = pad(value, minWidth, ' ', leftJustify);
			} else {
				value = value.slice(0, prefix.length) + pad('', diff, '0', true) + value.slice(prefix.length);
			}
		}
		return value;
	}

	function formatBaseX(value, base, prefix, leftJustify, minWidth, precision, zeroPad) {
		// Note: casts negative numbers to positive ones
		var number = value >>> 0;
		prefix = prefix && number && {'2': '0b', '8': '0', '16': '0x'}[base] || '';
		value = prefix + pad(number.toString(base), precision || 0, '0', false);
		return justify(value, prefix, leftJustify, minWidth, zeroPad);
	}

	function formatString(value, leftJustify, minWidth, precision, zeroPad) {
		if (precision != null) {
			value = value.slice(0, precision);
		}
		return justify(value, '', leftJustify, minWidth, zeroPad);
	}

	var a = arguments, i = 0, format = a[i++];
	return format.replace(sprintf.regex, function(substring, valueIndex, flags, minWidth, _, precision, type) {
			if (substring == '%%') return '%';

			// parse flags
			var leftJustify = false, positivePrefix = '', zeroPad = false, prefixBaseX = false;
			for (var j = 0; flags && j < flags.length; j++) switch (flags.charAt(j)) {
			case ' ': positivePrefix = ' '; break;
			case '+': positivePrefix = '+'; break;
			case '-': leftJustify = true; break;
			case '0': zeroPad = true; break;
			case '#': prefixBaseX = true; break;
			}

			// parameters may be null, undefined, empty-string or real valued
			// we want to ignore null, undefined and empty-string values

			if (!minWidth) {
			minWidth = 0;
			} else if (minWidth == '*') {
			minWidth = +a[i++];
			} else if (minWidth.charAt(0) == '*') {
			minWidth = +a[minWidth.slice(1, -1)];
			} else {
				minWidth = +minWidth;
			}

			// Note: undocumented perl feature:
			if (minWidth < 0) {
				minWidth = -minWidth;
				leftJustify = true;
			}

			if (!isFinite(minWidth)) {
				throw new Error('sprintf: (minimum-)width must be finite');
			}

			if (!precision) {
				precision = 'fFeE'.indexOf(type) > -1 ? 6 : (type == 'd') ? 0 : void(0);
			} else if (precision == '*') {
				precision = +a[i++];
			} else if (precision.charAt(0) == '*') {
				precision = +a[precision.slice(1, -1)];
			} else {
				precision = +precision;
			}

			// grab value using valueIndex if required?
			var value = valueIndex ? a[valueIndex.slice(0, -1)] : a[i++];

			switch (type) {
				case 's': return formatString(String(value), leftJustify, minWidth, precision, zeroPad);
				case 'c': return formatString(String.fromCharCode(+value), leftJustify, minWidth, precision, zeroPad);
				case 'b': return formatBaseX(value, 2, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
				case 'o': return formatBaseX(value, 8, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
				case 'x': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
				case 'X': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad).toUpperCase();
				case 'u': return formatBaseX(value, 10, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
				case 'i':
				case 'd': {
						  var number = parseInt(+value);
						  var prefix = number < 0 ? '-' : positivePrefix;
						  value = prefix + pad(String(Math.abs(number)), precision, '0', false);
						  return justify(value, prefix, leftJustify, minWidth, zeroPad);
					  }
				case 'e':
				case 'E':
				case 'f':
				case 'F':
				case 'g':
				case 'G':
					  {
						  var number = +value;
						  var prefix = number < 0 ? '-' : positivePrefix;
						  var method = ['toExponential', 'toFixed', 'toPrecision']['efg'.indexOf(type.toLowerCase())];
						  var textTransform = ['toString', 'toUpperCase']['eEfFgG'.indexOf(type) % 2];
						  value = prefix + Math.abs(number)[method](precision);
						  return justify(value, prefix, leftJustify, minWidth, zeroPad)[textTransform]();
					  }
				default: return substring;
			}
	});
}
sprintf.regex = /%%|%(\d+\$)?([-+#0 ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([scboxXuidfegEG])/g;

function change_value_by(e, parameter, smallamount, medamount, largeamount, onComplete) {
	var parameter_selector = '#' + parameter;
	var amount = smallamount;
	if (e.ctrlKey) {
		amount = medamount;
	} else if (e.shiftKey) {
		amount = largeamount;
	}
	$(parameter_selector).val(sprintf("%.2f", ($(parameter_selector).val() * 1 + amount * 1)));
	if (onComplete) {
		onComplete();
	}
}

function validate_bulkimport() {
	if (!$("#risk_percent").val() || $("#risk_percent").val() <= 0) {
		alert("You need to set a stop amount to import your trades.");
		return false;
	//} else if (!$("#userfile").val()) {
	//	alert("You need to specify a file to upload.");
	//	return false;
	} else {
		return true;
	}
}
