// general purpose utils

function getCookie(name)
{ // cookie grabber
        var C = document.cookie.split("; ");
        for (i=0; i < C.length; i++)
        {
                kv = C[i].split("=");
                if(kv[0] == name){ return unescape(kv[1].replace(/\+/g, "%20")); }
        }
        return false;
}


var tok = getCookie("wikiaSearchToken");
var un = decodeURIComponent( getCookie("wikicitiesUserName") );
var isAdmin = getCookie("wikiaSearchAdminToken");

function getBlockLink(user_name) {
	return "http://search.wikia.com/wiki/Special:Blockip?wpBlockAddress=" + encodeURIComponent(user_name);
}

function comma(number) {
  
  number = '' + number;
  
  if (number.length > 3) {  
    var mod = number.length % 3;
    var output = (mod > 0 ? (number.substring(0,mod)) : '');
      
    for (i=0 ; i < Math.floor(number.length / 3); i++) {
      if ((mod == 0) && (i == 0)) {
        output += number.substring(mod+ 3 * i, mod + 3 * i + 3);
      } else {
        output+= ',' + number.substring(mod + 3 * i, mod + 3 * i + 3);
      }
    }
  
  return (output);
  
  }
  
  else return number;
}


function jsload(url)
{
	var head = document.getElementsByTagName('head')[0];
	var s = document.createElement('script');
	s.src = url;
	head.appendChild(s);
}


function boost(amount)
{
    amount -= 0;
    amount = (Math.round(amount*100))/100;
    return (amount == Math.floor(amount)) ? amount + '.00' : (  (amount*10 == Math.floor(amount*10)) ? amount + '0' : amount);
}


// take a simple form object and create the actual html for it
function reForm(f,base)
{
	var submit=false;
	var htm = '';
	var rebase = /(.+\/)[^\/]+$/;
	var method = (f.method && f.method.length > 0) ? f.method : "get";
	var abase = base.match(rebase) ? base.match(rebase)[1] : base; 
	if(f.action.substr(0,4) == "http") abase="";
	if(abase.substr(-1,1) == "/" && f.action.substr(0,1) == "/") f.action = f.action.substr(1); 
	htm += '<form method="'+method+'" action="'+abase+f.action+'">';
	for(var i=0; i < f.elements.length; i++)
	{
		var e = f.elements[i];
		if(e.type == "text"){
			htm += '<input name="'+e.name+'" value="'+e.value+'">';
		}else if(e.type == "button"){
			htm += '<input type="button" name="'+e.name+'" value="'+e.value+'">';
		}else if(e.type == "hidden"){
			htm += '<input type="hidden" name="'+e.name+'" value="'+e.value+'">';
		}else if(e.type == "checkbox"){
			var chk = (e.checked) ? "checked" : "";
			htm += '<input type="checkbox" name="'+e.name+'" value="'+e.value+'" '+chk+'>';
		}else if(e.type == "password"){
			htm += '<input type="password" name="'+e.name+'">';
		}else if(e.type == "reset"){
			htm += '<input type="reset" name="'+e.name+'" value="'+e.value+'">';
		}else if(e.type == "select-one"){
			htm += '<select name="'+e.name+'">';
			for(var k=0; k < e.options.length; k++)
			{
				var sel = (e.options[k].selected) ? "selected" : "";
				htm += '<option value="'+e.options[k].value+'" '+sel+'>'+e.options[k].text+'</option>';
			}
			htm += '</select>';

		}else if(e.type == "submit"){
			submit=true;
			htm += '<input type="submit" name="'+e.name+'" value="'+e.value+'">';
		}else if(e.type == "textarea"){
			htm += '<textarea name="'+e.name+'">"'+e.value+'</textarea>';
		}
	}
	if(!submit) htm += '<input type="submit" value="go">';
	htm += '</form>';
	return htm;
}

function getWindowWidth(){
  if (self.innerWidth) {
    frameWidth = self.innerWidth;
  } else if (document.documentElement && document.documentElement.clientWidth) {
    frameWidth = document.documentElement.clientWidth; 
  } else if (document.body) {
    frameWidth = document.body.clientWidth;
  }
  return parseInt(frameWidth);
}

function getWindowHeight(){
  if (self.innerHeight) {
    frameHeight = self.innerHeight;
  } else if (document.documentElement && document.documentElement.clientHeight) {
    frameHeight = document.documentElement.clientHeight; 
  } else if (document.body) {
    frameHeight = document.body.clientHeight;
  }
  return parseInt(frameHeight);
}

function getScrollHeight(){
  var y;
  // all except Explorer
  if (self.pageYOffset) {
      y = self.pageYOffset;
  } else if (document.documentElement && document.documentElement.scrollTop) {
      y = document.documentElement.scrollTop;
  } else if (document.body)     {
      y = document.body.scrollTop;
  }
  return parseInt(y)+getWindowHeight();
}

function plural(num,word){
	if(num == 1) return word;
	return word+"s";
}

// return friendly time difference
function whenAgo(t1,t2){
	if(!t1 || !t2) return gettext("just now");
	var diff = t1 - t2;
	diff /= 1000;
	if(diff == 0) return gettext("just now");
	if(diff < 120) return gettext("moments ago");
	var days = Math.floor(diff / 86400);
	if(days > 0) return days + " "+gettext(plural(days,"day"))+" "+gettext("ago");
	var hours = Math.floor(diff / 3600);
	if(hours > 0) return hours + " "+gettext(plural(hours,"hour"))+" "+gettext("ago");
	var minutes = Math.floor(diff / 60);
	if(minutes > 0) return minutes + " "+gettext(plural(minutes, "minute"))+" "+gettext("ago");
}

// return years
function formDate(id, name, tabindex, month, day, year, selected) {

	var output = "";
	
	var selected_month = false;
	var selected_day = false;
	var selected_year = false;
	
	if(selected) {
		if (selected.month) selected_month = parseInt(selected.month);
		if (selected.day) selected_day = parseInt(selected.day);
		if (selected.year) selected_year = parseInt(selected.year);
	}
	
	//alert(selected.month + " " + selected.day + " " + selected.year);
		
	
	if (month==1) {
		//Month
		var month = new Array ("Jan", "Feb", "March", "April", "May", "June", "July", "August", "Sept", "Oct","Nov", "Dec")

		output += "<select id=\""+id+"month\" name=\""+name+"month\" tabindex=\""+tabindex+"\">";
		output += "<option value=\"\">Month</option>";

		for (m=0; m<=11;m++) {
			output += "<option value=\""+(m+1)+"\"" + ((selected_month && selected_month == (m+1)) ? " selected" : "")  + ">" +month[m]+ "</option>";
		}
		output += "</select> ";
		tabindex++;
	}

	if (day==1) {
		//Day
		output += "<select id=\""+id+"date\" name=\""+name+"date\" tabindex=\""+tabindex+"\">";
		output += "<option value=\"\">Day</option>";

		for (d=1; d<=31;d++) {
			output += "<option value=\""+d+"\"" + ((selected_day && selected_day == (d)) ? " selected" : "")  + ">" +d+ "</option>";
		}
		output += "</select> ";	
		tabindex++;
	}
	
	if (year==1) {
	
		//Year
		var time = new Date();
	  	var year = time.getYear();

	  	if (year < 1900) {
	    	year = year + 1900;
	  	}
	  	var min_year = 1900;

	  	output += "<select id=\""+id+"year\" name=\""+name+"year\" tabindex=\""+tabindex+"\">";
		output += "<option value=\"\">Year</option>";

		while (year >= min_year) {
			output += "<option value=\""+year+"\"" + ((selected_year && selected_year == (year)) ? " selected" : "")  + ">" +year+ "</option>";
			year--;
		}
		output += "</select>";
		tabindex++;
	}

	return output;

}

function is_IP(ipaddr) {
	var re = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
	if (re.test(ipaddr)) {
	var parts = ipaddr.split(".");
	if (parseInt(parseFloat(parts[0])) == 0) { return false; }
	for (var i=0; i<parts.length; i++) {
		if (parseInt(parseFloat(parts[i])) > 255) { return false; }
	}
		return true;
	} else {
		return false;
	}
}

// anyone please help make this lang stuff better, it's really crude :(
//var langs = {'Afar':'aa','Abkhazian':'ab','Afrikaans':'af','Amharic':'am','Arabic':'ar','Assamese':'as','Aymara':'ay','Azerbaijani':'az','Bashkir':'ba','Byelorussian':'be','Bulgarian':'bg','Bihari':'bh','Bislama':'bi','Bengali':'bn','Tibetan':'bo','Breton':'br','Catalan':'ca','Corsican':'co','Czech':'cs','Welsh':'cy','Danish':'da','German':'de','Bhutani':'dz','Greek':'el','English':'en','Esperanto':'eo','Spanish':'es','Estonian':'et','Basque':'eu','Persian':'fa','Finnish':'fi','Fiji':'fj','Faroese':'fo','French':'fr','Frisian':'fy','Irish':'ga','Scots':'gd','Galician':'gl','Guarani':'gn','Gujarati':'gu','Hausa':'ha','Hebrew':'he','Hindi':'hi','Croatian':'hr','Hungarian':'hu','Armenian':'hy','Interlingua':'ia','Interlingue':'ie','Inupiak':'ik','Indonesian':'id','Icelandic':'is','Italian':'it','Inuktitut':'iu','Japanese':'ja','Javanese':'jv','Georgian':'ka','Kazakh':'kk','Greenlandic':'kl','Cambodian':'km','Kannada':'kn','Korean':'ko','Kashmiri':'ks','Kurdish':'ku','Kirghiz':'ky','Latin':'la','Lingala':'ln','Laothian':'lo','Lithuanian':'lt','Latvian':'lv','Malagasy':'mg','Maori':'mi','Macedonian':'mk','Malayalam':'ml','Mongolian':'mn','Moldavian':'mo','Marathi':'mr','Malay':'ms','Maltese':'mt','Burmese':'my','Nauru':'na','Nepali':'ne','Dutch':'nl','Norwegian':'no','Occitan':'oc','Afan':'om','Oriya':'or','Punjabi':'pa','Polish':'pl','Pashto;pushto':'ps','Portuguese':'pt','Quechua':'qu','Rhaeto':'rm','Kurundi':'rn','Romanian':'ro','Russian':'ru','Kinyarwanda':'rw','Sanskrit':'sa','Sindhi':'sd','Sangho':'sg','Serbo':'sh','Singhalese':'si','Slovak':'sk','Slovenian':'sl','Samoan':'sm','Shona':'sn','Somali':'so','Albanian':'sq','Serbian':'sr','Siswati':'ss','Sesotho':'st','Sundanese':'su','Swedish':'sv','Swahili':'sw','Tamil':'ta','Telugu':'te','Tajik':'tg','Thai':'th','Tigrinya':'ti','Turkmen':'tk','Tagalog':'tl','Setswana':'tn','Tonga':'to','Turkish':'tr','Tsonga':'ts','Tatar':'tt','Twi':'tw','Uigur':'ug','Ukrainian':'uk','Urdu':'ur','Uzbek':'uz','Vietnamese':'vi','Volapuk':'vo','Wolof':'wo','Xhosa':'xh','Yiddish':'yi','Yoruba':'yo','Zhuang':'za','Chinese':'zh','Zulu':'zu'};

// FIXME: For each human language there should be a mapping from its
// language code to its native laguage name. For example, for Greek,
// the language code "el" would be mapped to "Ελληνικά".

// In addition, for the currently selected language, there should be a
// mapping from the language code to the name of the language under
// consideration in the currently selected language.  If for example
// the current language is French, that mapping would map "el" to
// "grec", which is french for Greek.  Keeping these mappings
// conceptually separate avoids having to load all names of all
// languages in every other language.  This mapping can be implemented
// using the translation table.

// To ease debugging, and to save space in the common case, the
// english names are maintained in the same mapping as the native
// names.

// FIXME: This list should really be generated from someone who
// already has this data in structured form, for example Wikipedia.

// FIXME: For the languages with special scripts, there are probably
// errors that happended during copy and paste that were not noticed
// by the developer.

var langs =
{
//'LANGUAGE_CODE':['NATIVE_NAME', 'en'],
'aa':['Afar','Afar'],
'ab':['Аҧсуа','Abkhazian'],
'af':['Afrikaans','Afrikaans'],
'am':'Amharic',
// FIXME: Arabic is probably running in the wrong direction
'ar':['العربي','Arabic'],
'as':'Assamese',
'ay':'Aymara',
'az':['Azrbaycan','Azerbaijani'],
'ba':'Bashkir',
'be':'Byelorussian',
'bg':['Български','Bulgarian'],
'bh':'Bihari',
'bpy':['ইমার ঠার/বিষ্ণুপ্রিয়া মণিপুরী','Bishnupriya Manipuri'],
'bi':'Bislama',
'bn':['বাংলা', 'Bengali'],
'bo':['Bosanski','Tibetan'],
'br':'Breton',
'ca':['Català','Catalan'],
'co':'Corsican',
'cs':['Česky','Czech'],
'cy':'Welsh',
'da':['Dansk','Danish'],
'de':['Deutsch','German'],
'dz':'Bhutani',
'el':['Ελληνικά','Greek'],
'en':['English','English'],
'eo':['Esperanto','Esperanto'],
'es':['Español','Spanish'],
'et':['Eesti','Estonian'],
'eu':['Euskara','Basque'],
'fa':['فارسی','Persian'],
'fi':['Suomi','Finnish'],
'fj':'Fiji',
'fo':'Faroese',
'fr':['Français','French'],
'fy':'Frisian',
'ga':'Irish',
'gd':'Scots',
'gl':['Galego','Galician'],
'gn':'Guarani',
'gu':'Gujarati',
'ha':'Hausa',
// FIXME: Hebrew is possibly running in the wrong direction.
'he':['עברית','Hebrew'],
'hi':['हिन्दी','Hindi'],
'hr':['Hrvatski','Croatian'],
'hsb':'Hornjoserbsce',
'hu':['Magyar','Hungarian'],
'hy':'Armenian',
'hz':['Otsiherero','Herero'],
'ia':['Interlingua','Interlingua'],
'ie':'Interlingue',
// FIXME: id and ik were in reverse alphabetic order.
// Is there any partiular reason why that was so?
'id':['Bahasa Indonesia','Indonesian'],
'ik':'Inupiak',
'is':['Íslenska','Icelandic'],
'it':['Italiano','Italian'],
'iu':'Inuktitut',
'ja':['日本語','Japanese'],
'jv':'Javanese',
// FIXME: Cannot copy and paste Georgian script
'ka':'Georgian',
'kk':'Kazakh',
'kl':'Greenlandic',
'km':'Cambodian',
'kn':'Kannada',
'ko':['한국어','Korean'],
'ks':'Kashmiri',
'ku':'Kurdish',
'ky':'Kirghiz',
'la':'Latin',
'ln':'Lingala',
'lo':'Laothian',
'lt':['Lietuvių','Lithuanian'],
'lv':'Latvian',
'mg':'Malagasy',
'mi':'Maori',
'mk':['Македонски','Macedonian'],
'ml':['മലയാളം','Malayalam'],
'mn':'Mongolian',
'mo':'Moldavian',
'mr':'Marathi',
'ms':['Bahasa Melayu','Malay'],
'mt':'Maltese',
'my':'Burmese',
'na':'Nauru',
'ne':'Nepali',
'new':['नेपाल भाषा','Newar / Nepal Bhasa'],
'nl':['Nederlands','Dutch'],
'nn':['Norsk (nynorsk)','Norwegian (Nynorsk)'],
'no':['Norsk (bokmål)','Norwegian'],
'oc':'Occitan',
'om':'Afan',
'or':'Oriya',
'pa':['ਪੰਜਾਬੀ','Punjabi'],
'pl':['Polski','Polish'],
'ps':'Pashto',
'pt':['Português','Portuguese'],
'qu':'Quechua',
'rm':'Rhaeto',
'rn':'Kurundi',
'ro':['Română','Romanian'],
'ru':['Русский','Russian'],
'rw':'Kinyarwanda',
'sa':'Sanskrit',
'sd':'Sindhi',
'sg':'Sangho',
'sh':'Serbo',
'si':'Singhalese',
'sk':['Slovenčina','Slovak'],
'sl':['Slovenščina','Slovenian'],
'sm':'Samoan',
'sn':'Shona',
'so':'Somali',
'sq':['Shqip','Albanian'],
'sr':['Српски / Srpski','Serbian'],
'ss':'Siswati',
'st':'Sesotho',
'su':'Sundanese',
'sv':['Svenska','Swedish'],
'sw':'Swahili',
'ta':['தமிழ்','Tamil'],
'te':['తెలుగు','Telugu'],
'tg':'Tajik',
'th':['ไทย','Thai'],
'ti':'Tigrinya',
'tk':'Turkmen',
'tl':'Tagalog',
'tn':'Setswana',
'to':'Tonga',
'tr':['Türkçe','Turkish'],
'ts':'Tsonga',
'tt':['Tatarça/Татарча','Tatar'],
'tw':'Twi',
'ug':'Uigur',
'uk':['Українська','Ukrainian'],
'ur':'Urdu',
'uz':'Uzbek',
// FIXME: Either Emacs refuses to paste the doubly accented vietnamese
// characters ("ê" with accent grave and "ê" with a dot underneath),
// or Seamonkey refuses to properly copy them to the clipboard.
'vi':['Tiêng Viêt','Vietnamese'],
'vo':'Volapuk',
'wo':'Wolof',
'xh':'Xhosa',
'yi':['יידיש','Yiddish'],
'yo':['Yorùbá','Yoruba'],
'za':'Zhuang',
'zh':['中文','Chinese'],
'zu':'Zulu'};

// reverse it
//for (var l in langs) { if(langs[l]) langs[langs[l]] = l; }

var lang = getCookie("ws_lang");
if(!lang || lang.length < 2) lang = window.navigator.language ? window.navigator.language : window.navigator.userLanguage;
lang = (!lang || lang.length < 2) ? "en" : lang.substr(0,2).toLowerCase();

function langdesc(lang_code) {
	var langdesc= langs[lang_code];
	var default_index= 1;
	if (Array.prototype.isPrototypeOf(langdesc)) {
		var default_name= gettext(lang_code);
		if (default_name == lang_code) {
			default_name= langdesc[default_index];
		}
		return langdesc[0]+" ("+default_name+")";
	}
	return langdesc;
}
		    
function show_lang_header() {
	if ($("site-language") && langselectincluded) {
		$("site-language").innerHTML=
			"<a onclick=\"show_langselect();\">"
			+gettext("Language")+": "+langdesc(lang)+"</a>";
	}
}

function addCommas(nStr) {
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}

/*
// prelim keyboarding stuff (credits to matrixview.org)
var kblast = false;
function keyBored(event){
    if (event.keyCode == Event.KEY_RETURN) // Enter (Open Item)
    {
    }
    if (event.keyCode == Event.KEY_BACKSPACE || event.keyCode == Event.KEY_DELETE || event.keyCode == 63272) // Delete/Backspace
    {
    	event.stop()
    }
	var arrow = false;
    if (event.keyCode == Event.KEY_LEFT || event.keyCode == 63234) // Left Arrow
		arrow = "left";
    if (event.keyCode == Event.KEY_UP || event.keyCode == 63232) // Up Arrow
		arrow = "up";
    if (event.keyCode == Event.KEY_RIGHT || event.keyCode == 63235) // Right Arrow
		arrow = "right";
    if (event.keyCode == Event.KEY_DOWN || event.keyCode == 63233) // Down Arrow
		arrow = "down";
    if (event.keyCode == 32) // Space
    	event.stop()
    if (event.keyCode == Event.KEY_TAB) // Tab
		arrow = "down";

	if(!arrow) return;

	// if first time, always just select first result
	if(!kblast && Q){
		kblast = Q.firstChild;
	}else if(arrow == "up" || arrow == "down"){
		kblast.style.borderLeft = "";
		kblast = (arrow == "down") ? kblast.next() : kblast.previous();
		kblast.style.borderLeft = "1px solid black";
	}
}
window.setTimeout("document.body.observe('keydown', keyBored)",1000);
*/
