User:Big Bouffant/calc.js

/* */ $('.jcConfig').each(function {	var lines = $(this).text.split(($(this).text.indexOf('\r') != -1) ? '\r' : '\n');	var template = ;	var formId = ;	var resultId = '';	var hs = [];	var tplParams = [];	var acInputs = [];	var suggestNs = [];	// Generate a globally unique ID for an input	function getGuid(inputId) {		return formId + resultId + inputId;	}	// Give an error in the results area	// TODO For errors on parsing a config, put the error after the config section	function showError(str) {		$('#' + resultId).empty.append($(' ').addClass('jcError').text(str));	}	// Parse config	for (var i in lines) {		var temp = lines[i].split('=', 2);		if (temp.length != 2) {			continue;		}		var vals = temp[1].split('|');		for (var j in vals) {			vals[j] = $.trim(vals[j]);		}		switch ($.trim(temp[0])) {			case 'template':				template = vals[0];			break;			case 'form':				formId = vals[0];			break;			case 'result':				resultId = vals[0];			break;			case 'suggestns':				suggestNs = vals[0].split(','); break; case 'param': tplParams.push({name: vals[0], label: (vals[1] == '') ? vals[0] : vals[1], def: vals[2], type: vals[3], range: vals[4]}); break; }	}	$form = $(' ').attr({'action': '#', 'id': 'jcForm' + formId}).submit(function {		function dispResult(response) {			$('#' + formId + ' .jcSubmit input').val('Submit').removeAttr('disabled');			$('#bodyContent #' + resultId + ',#WikiaArticle #' + resultId).empty.removeClass('jcError').html(response.parse.text['*']);			$( 'table.sortable' ).tablesorter		}		function validRange(x, range) {			if (range == null) {				return true;			}			var parts = range.split('-');			if (parts[0] !=  && x < parseInt(parts[0])) {				return false;			}			if (parts[1] !=  && x > parseInt(parts[1])) {				return false;			}			return true;		}		function loadTemplate {			code += '}}';			$('#' + formId + ' .jcSubmit input').val('Loading...').attr('disabled', 'disabled');			$.ajax({ data: { action: 'parse', text: code, prop: 'text', title: template, format: 'json' },				dataType: 'json', type: 'POST', url: wgScriptPath + '/api.php', success: dispResult, error: function(xhr, error) { $('#' + formId + ' .jcSubmit input').val('Submit').removeAttr('disabled'); showError(error); },				timeout: window.calcTimeoutLength||10000 // msec });		}		var code = '{{' + template;		var formError = false;		for (var i in tplParams) {			var val = ;			if (tplParams[i].type == 'fixed' || tplParams[i].type == 'hidden') {				val = tplParams[i].def;			} else {				var $input = $('#' + getGuid(tplParams[i].name));				val = $input.val;				if (tplParams[i].type == 'int') val = val.split(',').join()				if (	(tplParams[i].type == 'hs' && tplParams[i].range == 'yes' && val == '') || (tplParams[i].type == 'int' && (val.search(/^-?[0-9]+$/) || !validRange(val, tplParams[i].range))) || (tplParams[i].type == 'number' && (val.search(/^-?[.0-9]+$/) || !validRange(val, tplParams[i].range))) ) {					$input.addClass('jcInvalid');					formError = true;				} else {					$input.removeClass('jcInvalid');				}				if (tplParams[i].type == 'hs') {					hs.push(tplParams[i]);				}			}			code += '|' + tplParams[i].name + '=' + val;		}		if (formError) {			showError('One or more fields contains an invalid value.');		} else {			if (hs.length > 0) {				i = 0;				var name = $('#' + getGuid(hs[i].name)).val;				if( name != '' ) {					$.ajax({url:"http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22http%3A%2F%2Fservices.runescape.com%2Fm%3Dhiscore%2Findex_lite.ws%3Fplayer%3D"+name+"%22&format=xml'&callback=?", dataType: "json", async: false, success: function(data) { if( data.results[0] ) { code += '|' + hs[i].name + '_data = ' + $.trim($(data.results[0]).text).replace(/\s+/g,'_'); loadTemplate; } else { if (tplParams[i].range != 'yes') { showError("The player '" + name + "' does not exist, is banned or unranked. Please enter the data manually."); } else { showError("The player '" + name + "' does not exist, is banned or unranked. Please enter a valid player name."); }					   	}					    },					    error: function(xhr, error) { $('#' + formId + ' .jcSubmit input').val('Submit').removeAttr('disabled'); showError(error); },						timeout: 10000 // msec });				} else {					loadTemplate;				}			} else {				loadTemplate;			}		}		return false;	}); for (var i in suggestNs) { var $input = $(' ').attr({'type': 'hidden', 'name': 'ns' + suggestNs[i]}).val('1'); $form.append($input); }	var $table = $(' ').addClass('wikitable jcTable'); for (var i in tplParams) { if (tplParams[i].type == 'hidden') { continue; }		var guid = getGuid(tplParams[i].name); var $tr = $(' '); $tr.append($(' ').append($(' ').attr('for', guid).text(tplParams[i].label))); var $td = $(' '); if (tplParams[i].type == 'fixed') { $td.text(tplParams[i].def); } else { if (tplParams[i].type == 'select') { var $select = $(' ').attr({name: guid, id: guid}); var opts = tplParams[i].range.split(','); for (var j in opts) { var $option = $(' ').val(opts[j]).text(opts[j]); if (opts[j] == tplParams[i].def) { $option.attr('selected', 'selected'); }					$select.append($option); }				$td.append($select); } else { $input = $(' ').attr({type: 'text', name: guid, id: guid, value: tplParams[i].def}); $td.append($input); if (tplParams[i].type == 'article') { acInputs.push(guid); }			}		}		$tr.append($td); $table.append($tr); }	var $tr = $(' '); var $td = $(' ').addClass('jcSubmit').attr({colSpan: '2'}); $td.append($(' ').attr({type: 'submit', value: 'Submit'})); $tr.append($td); $table.append($tr); $form.append($table); $('#bodyContent #' + formId + ',#WikiaArticle #' + formId).empty.append($form); // Enable suggest on article fields for (var i in acInputs) { // @todo replace with linksuggest? if ( mw.config.get( 'skin' ) === 'monobook' ) { os_enableSuggestionsOn(acInputs[i], 'jcForm' + formId); }	} }); /* */