User:Nurni/wikidata useful.js

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
var wd_import_commons = {

	Q_ANONYOUS_AUTH : "4233718",
    Q_MAGAZYN : "18123400",
    Q_OBRAZ : "3305213",
    Q_OKOLO : "5727902",
	Q_SANDBOX : "4115189",
	Q_WIKICOMMONS : "565",

	P_IMPORTED_FROM : "143",
	P_INSPIRED_BY : "1877",
	P_CIRCLE : "1776",
	P_AUTHOR : "170",
	P_ATTRIBUTED_TO : "1773",
	P_FOLLOWER : "1775",
	P_GLEBOKOSC : "2610",
	P_CREATE_DATE : "571",
	P_ILUSTRACJA : "18",
	P_JEST_TO : "31",
	P_KOLEKCJA : "195",
	P_MIEJSCE : "276",
	P_NAJWCZESNIEJ : "1319",
	P_NAJPOZNIEJ : "1326",
	P_NR_EWID : "217",
	P_STATUS_W_ZRODLE : "1480",
	P_SZEROKOSC : "2049",
	P_URL : "973",
	P_WYSOKOSC : "2048",
	
	materialTab : [
		// jest to
		{name: 'alabaster', p: 31, q: 860861},
		{name: 'alabastrze', p: 31, q: 860861},
		{name: 'akwarela', p: 31, q: 18761202},
		{name: 'akwaforta', p: 31, q: 18218093},
		{name: 'atrament', p: 31, q: 93184},
		{name: 'brąz', p: 31, q: 860861},
		{name: 'copperplate', p: 31, q: 18887969},
		{name: 'drewno', p: 31, q: 860861},
		{name: 'drzeworyt', p: 31, q: 18219090},		
		{name: 'grafit', p: 31, q: 93184},
		{name: 'granit', p: 31, q: 860861},
		{name: 'litografia', p: 31, q: 15123870},
		{name: 'marmur', p: 31, q: 860861},
		{name: 'mosiądz', p: 31, q: 860861},
		{name: 'odbitka albuminowa', p: 31, q: 125191},
		{name: 'pastel', p: 31, q: 12043905},
		{name: 'pergaminie', p: 31, q: 8362},
		{name: 'piaskowiec', p: 31, q: 860861},
		{name: 'polichromia', p: 31, q: 26997384},	
		{name: 'polyptychs', p: 31, q: 1278452},
		{name: 'srebro', p: 31, q: 860861},
		{name: 'steatyt', p: 31, q: 860861},
		{name: 'terakota', p: 31, q: 860861},
		{name: 'tusz', p: 31, q: 93184},
		{name: 'tynk', p: 31, q: 860861},

		
		// materiał
		{name: 'akwarela', p: 186, q: 22915256},
		{name: 'atrament', p: 186, q: 127418},
		{name: 'bistre', p: 186, q: 774061},
		{name: 'gwasz', p: 186, q: 204330},
		{name: 'kreda', p: 186, q: 147690},
		{name: 'olej', p: 186, q: 296955},
		{name: 'oil', p: 186, q: 296955},
		{name: 'pastel', p: 186, q: 189085},
		{name: 'quill', p: 186, q: 4063215},
		{name: 'rysunek ołówkiem', p: 186, q: 14674},
		{name: 'rysunek piórem', p: 186, q: 4063215},
		{name: 'sangwina', p: 186, q: 901944},
		{name: 'sepia', p: 186, q: 927860},
		{name: 'tempera', p: 186, q: 175166},
		{name: 'tusz', p: 186, q: 12981547},
		{name: 'węgiel drzewny', p: 186, q: 1424515},

		{name: 'grafit', p: 186, q: 5309},
		{name: 'złoto', p: 186, q: 897},
		{name: 'gilt', p: 186, q: 929186},
		{name: 'złoto płatkowe', p: 186, q: 929186},
		{name: 'płatki złota', p: 186, q: 929186},
		{name: 'marmur', p: 186, q: 40861},
		{name: 'steatyt', p: 186, q: 707896},
		{name: 'piaskowcu', p: 186, q: 13085},
		{name: 'piaskowiec', p: 186, q: 13085},
		{name: 'wapieniu', p: 186, q: 23757},
		{name: 'srebro', p: 186, q: 1090},
		{name: 'mosiądz', p: 186, q: 39782},
		{name: 'alabaster', p: 186, q: 143447},
		{name: 'alabastrze', p: 186, q: 143447},
		{name: 'kość słoniowa', p: 186, q: 82001},
		{name: 'clay', p: 186, q: 42302},
		{name: 'engobe', p: 186, q: 1971493},
		{name: 'brąz', p: 186, q: 34095},
		{name: 'stiuku', p: 186, q: 33526},
		{name: 'spruce', p: 186, q: 2046308},
		{name: 'jodle', p: 186, q: 746026},
		{name: 'drewno', p: 186, q: 287},
		{name: 'varnish', p: 186, q: 81683},
		{name: 'tynk', p: 186, q: 572879},
		{name: 'terakota', p: 186, q: 60424},
		{name: 'granit', p: 186, q: 41177},
		
		// podłoże
		{name: 'blasze', p: 186, q: 211367, qual: [{p: 518, q: 861259}]},
		{name: 'canvas', p: 186, q: 4259259, qual: [{p: 518, q: 861259}]},
		{name: 'cynie', p: 186, q: 1096, qual: [{p: 518, q: 861259}]},
		{name: 'desce', p: 186, q: 1348059, qual: [{p: 518, q: 861259}]},
		{name: 'drewnie', p: 186, q: 1348059, qual: [{p: 518, q: 861259}]},
		{name: 'dykcie', p: 186, q: 219803, qual: [{p: 518, q: 861259}]},
		{name: 'dębie', p: 186, q: 2075708, qual: [{p: 518, q: 861259}]},
		{name: 'jedwabiu', p: 186, q: 37681, qual: [{p: 518, q: 861259}]},
		{name: 'kartonie', p: 186, q: 389782, qual: [{p: 518, q: 861259}]},
		{name: 'kości', p: 186, q: 265868, qual: [{p: 518, q: 861259}]},
		{name: 'kości słoniowej', p: 186, q: 82001, qual: [{p: 518, q: 861259}]},
		{name: 'lipie', p: 186, q: 575018, qual: [{p: 518, q: 861259}]},
		{name: 'miedzi', p: 186, q: 753, qual: [{p: 518, q: 861259}]},
		{name: 'papierze', p: 186, q: 11472, qual: [{p: 518, q: 861259}]},
		{name: 'pergaminie', p: 186, q: 226697, qual: [{p: 518, q: 861259}]},
		{name: 'plaster', p: 186, q: 274988, qual: [{p: 518, q: 861259}]},
		{name: 'płótnie', p: 186, q: 4259259, qual: [{p: 518, q: 861259}]},
		{name: 'płycie', p: 186, q: 1348059, qual: [{p: 518, q: 861259}]},
		{name: 'srebrze', p: 186, q: 1090, qual: [{p: 518, q: 861259}]},
		{name: 'szkle', p: 186, q: 11469, qual: [{p: 518, q: 861259}]},
		{name: 'tynku', p: 186, q: 572879, qual: [{p: 518, q: 861259}]},
		{name: 'welinie', p: 186, q: 378274, qual: [{p: 518, q: 861259}]},


		// technika
		{name: 'akwaforta', p: 2079, q: 186986},
		{name: 'dagerotypia', p: 2079, q: 179744},
		{name: 'lawowaniu', p: 2079, q: 1469362},
		{name: 'lawowanie', p: 2079, q: 1469362},
		{name: 'polichromia', p: 2079, q: 183127},
		{name: 'litografia', p: 2079, q: 133036},
		{name: 'odbitka albuminowa', p: 2079, q: 580807},
		],
	
	categoryTab : [
		// materiał
		{name: 'pastel paintings', p: 186, q: 189085},
		
		//gatunek
		{name: "allegories of", p: 136, q: 2839016},
		{name: "allegory paintings", p: 136, q: 11766730},
		{name: "animalist painting", p: 136, q: 2302151},
		{name: "architectural paintings", p: 136, q: 18353841},
		{name: "at full length", p: 136, q: 18809626},
		{name: "at half length", p: 136, q: 18809572},
		{name: "bust length", p: 136, q: 241045},
		{name: "caricatures", p: 136, q: 482919},
		{name: "coffin portraits", p: 136, q: 1542239},
		{name: "erotic drawings", p: 136, q: 1168168},
		{name: "erotic paintings", p: 136, q: 1168168},
		{name: "figurative paintings", p: 136, q: 5448026},
		{name: "genre paintings", p: 136, q: 214127},
		{name: "interiors", p: 136, q: 18811686},
		{name: "landscape paintings", p: 136, q: 191163},
		{name: "miniatures", p: 136, q: 282129},
		{name: "mythological paintings", p: 136, q: 3374376},
		{name: "nude drawings", p: 136, q: 40446},
		{name: "nude females", p: 136, q: 40446},
		{name: "nude paintings", p: 136, q: 40446},
		{name: "portrait paintings", p: 136, q: 134307},
		{name: "profile portrait", p: 136, q: 4382010},
		{name: "religious paintings", p: 136, q: 2414609},
		{name: "seascape paintings", p: 136, q: 11766734},
		{name: "self-portrait", p: 136, q: 192110},
		{name: "still life", p: 136, q: 170571},
		{name: "still-life", p: 136, q: 170571},
		{name: "three-quarter length", p: 136, q: 18809567},
		{name: "trompe l'oeil", p: 136, q: 468930},
		
		// prąd
		{name: "avant-garde", p: 135, q: 102932},
		{name: "baroque sculptures", p: 135, q: 2763408},
		{name: "baroque paintings", p: 135, q: 808561},
		{name: "contemporary art", p: 135, q: 186030},
		{name: "contemporary painting", p: 135, q: 21157755},
		{name: "coptic paintings", p: 135, q: 577622},
		{name: "gothic sculptures", p: 135, q: 1277524},
		{name: "mannerist paintings", p: 135, q: 131808},
		{name: "modernist paintings", p: 135, q: 878985},
		{name: "neoclassical paintings", p: 135, q: 14378},
		{name: "neoclassical sculptures", p: 135, q: 5839901},
		{name: "realist paintings", p: 135, q: 2642826},
		{name: "renaissance paintings", p: 135, q: 15885248},
		{name: "renaissance sculptures", p: 135, q: 936588},
		{name: "rococo painters", p: 135, q: 122960},
		{name: "romantic paintings", p: 135, q: 3088366},

		// główny temat dzieła
		{name: "madonna and child", p: 921, q: 9309699},
		{name: "rest on the flight into egypt", p: 921, q: 3427290},
		{name: "resurrection of christ", p: 921, q: 51624},
		{name: "lamentation of christ", p: 921, q: 3155356},
		
		// przedstawia
		{name: "balustrades", p: 180, q: 1286070},
		{name: "bracelet", p: 180, q: 201664},
		{name: "brooches", p: 180, q: 499916},
		{name: "choker", p: 180, q: 1424519},
		{name: "columns", p: 180, q: 4817},
		{name: "décolleté", p: 180, q: 116887},
		{name: "drapery", p: 180, q: 3039121},
		{name: "ermine (clothing)", p: 180, q: 1555903},
		{name: " funs", p: 180, q: 193220},
		{name: "gloves", p: 180, q: 169031},
		{name: "lace sleeves", p: 180, q: 231250},
		{name: "madonna and child", p: 180, q: 345},
		{name: "madonna and child", p: 180, q: 942467},
		{name: "mantle", p: 180, q: 6752131},
		{name: "nude females", p: 180, q: 467},
		{name: "order of the white eagle", p: 180, q: 84020},
		{name: "panniers (clothing)", p: 180, q: 2621117},
		{name: "pearl", p: 180, q: 43436},
		{name: "powdered wigs", p: 180, q: 105507},
		{name: "female", p: 180, q: 467},
		{name: "feathered hats", p: 180, q: 81025},

		// jest to
		{name: "drawings", p: 31, q: 93184},
		{name: "gothic sculptures", p: 31, q: 860861},
		{name: "sculptures", p: 31, q: 860861},
		{name: 'pastel paintings', p: 31, q: 12043905},
		{name: 'photographs', p: 31, q: 125191},
		
		// sposób wykonania
		{name: "reliefs", p: 2079, q: 245117},
	],
	
	q_prefix : 'Q' ,
	p_prefix : 'P' ,
	api : '//www.wikidata.org/w/api.php' ,
	queue : [],
	lastrevid : null,
	mainElement : null,
	id_cnt : 0,


	init : function () {
		var self = this ;

		var portletLink = mw.util.addPortletLink( 'p-tb', '#', 'Import commons','t-wd_ic');
		$(portletLink).click ( function () {
			self.run() ;
			return false ;
		} ) ;
	} ,

	
	run : function () {
		var self = this ;
		var q = mw.config.get('wgPageName').toUpperCase() ;
		//console.log("Element główny = " + q);
		self.mainElement = q.substring(1, q.length);
		//self.mainElement = self.Q_SANDBOX;

		var imagePage = prompt("Insert image filename (eg. image.jpg) or RDF URL: ", "");
		
		// RDF file
		if(imagePage.includes("rdf:RDF")){
			self.processRdf(imagePage);
			//self.processQueue();
		} 
		// wikicommons image
		else {
			imagePage = decodeURIComponent(imagePage).replace(/^.*File:(.*)$/, "$1");
			//filename = "//commons.wikimedia.org/wiki/File:Jan_Matejko,_Bitwa_pod_Grunwaldem.jpg"
			$.post("/wiki/File:" + imagePage, function(res) {
		   		$.getJSON ( '//commons.wikimedia.org/w/api.php?callback=?' , {
					action:'query' ,
					titles: "File:" + imagePage,
					prop:'categories' ,
					cllimit: '100',
					format:'json'
				} , function ( data ) {
					//console.log(res);
					//console.log(data.query.pages[Object.keys(data.query.pages)[0]]);
					//console.log(data.query.pages[Object.keys(data.query.pages)[0]].categories);
					
					self.processImage(jQuery.parseXML(res), 
						data.query.pages[Object.keys(data.query.pages)[0]].categories);
					self.processQueue();
				});
			});
		}
	},
	
	
	processRdf : function(xmlDoc) {
		console.log("PROCESS RDF -->");
		console.log(xmlDoc);
		
		var a = $("rdf\\:RDF > rdf\\:Description", xmlDoc);
		console.log(a);
		
		var a = $("rdf\\:Description", xmlDoc);
		$(a).children().each ( function ( k , v ) {
			console.log(v);
		})

	},
	

	processImage : function(xmlDoc, categories) {
		console.log(xmlDoc);
		
		var a = $(xmlDoc).find(".fileinfotpl-type-artwork")[0];
		var p195 = null, p217 = null, p973 = true, p31 = true ;
		var self = this;
		
		//console.log(".fileinfo============>");
		//console.log($(a).children("tbody").children("tr"));
		$(a).children("tbody").children("tr").each ( function ( k , v ) {
			console.log("===>Processing row:");
			console.log(v);
			
			switch($(v).children("td")[0].id) {
				case "fileinfotpl_aut":
					var value, qual;
					
					// anonim
					if ($("tr > td > span > span", v).filter(":contains(anonimowy)").length > 0 ||
						$("tr > td > span > span", v).filter(":contains(nieznany)").length > 0
					) {
						value = self.Q_ANONYOUS_AUTH;
						self.createClaim(self.mainElement, self.P_AUTHOR, self.getItemType(value));
					}

					// wikidata
					$.each($("th > a[title*=wikidata]", v), function (k, val) {
						console.log(val);
						
						val = $(val).attr("href").replace(/.*\/Q(.*)$/, "$1");
						if ($("bdi", v).text().search(new RegExp("według", "i")) !== -1) {
							qual = [{property: self.P_INSPIRED_BY, value: self.getItemType(val)}];
							val = self.Q_ANONYOUS_AUTH;
						} else if ($("bdi", v).text().search(new RegExp("lub jego krąg", "i")) !== -1) {
							qual = [{property: self.P_CIRCLE, value: self.getItemType(val)}];
							self.createClaim(self.mainElement, self.P_AUTHOR, self.getItemType(self.Q_ANONYOUS_AUTH), qual);
							qual = undefined;
						} else if ($("bdi", v).text().search(new RegExp("przypisywany", "i")) !== -1) {
							qual = [{property: self.P_ATTRIBUTED_TO, value: self.getItemType(val)}];
							val = self.Q_ANONYOUS_AUTH;
						} else if ($("bdi", v).text().search(new RegExp("być może", "i")) !== -1) {
							qual = [{property: self.P_ATTRIBUTED_TO, value: self.getItemType(val)}];
							val = self.Q_ANONYOUS_AUTH;
						} else if ($("bdi", v).text().search(new RegExp("naśladowca", "i")) !== -1) {
							qual = [{property: self.P_FOLLOWER, value: self.getItemType(val)}];
							val = self.Q_ANONYOUS_AUTH;
						}
						
						self.createClaim(self.mainElement, self.P_AUTHOR, self.getItemType(val), qual);
					});

					break;
				
				case "fileinfotpl_art_title":
					var lang, val, langObj;
					
					val = $("i", v).text().replace(/"/g, '\\"');
					if(val.slice(-1).includes("."))
						val = val.substring(0, val.length-1);
					langObj = [{lang: "pl", val: val}];
					
					if(val === "") {
						langObj = [];
						$.each($("div", v), function(k, v) {
							console.log(v);
							lang = $(v).attr("lang");
							console.log(lang);
							val = $("div > span", v)
									.clone()
    								.children()
    								.remove()
    								.end()
    								.text()
    								.replace(/^[ ]*/g, '');
							console.log(val);
							if (val.length === 0) {
								val = $(v)
    								.text();
    							console.log($("div", v));
								console.log(val);
							}
							console.log(val);
							if (typeof lang !== 'undefined')
								if (lang.length > 0)
									langObj.push({lang: lang, val: val.replace(/^Polski: /, '')});
							console.log(langObj);
						});
					}
					self.addLabel(self.mainElement, langObj, null);
					break;
					
				case "fileinfotpl_date":
					var el = $("time", v).attr("datetime");
					if (typeof el !== 'undefined')
						if (el.length === 7)
							self.createClaim(self.mainElement, self.P_CREATE_DATE, self.getTimeType("+" + el + "-00T00:00:00Z", 10));
						else if (el.length === 10)
							self.createClaim(self.mainElement, self.P_CREATE_DATE, self.getTimeType("+" + el + "T00:00:00Z", 11));
						else
							self.createClaim(self.mainElement, self.P_CREATE_DATE, self.getTimeType("+" + el + "-00-00T00:00:00Z", 9));
					else if ($("tr > td:eq(1)", v).text().includes("date QS:")) {
						el = $("tr > td:eq(1)", v).text().replace(/.*date QS:P571,/, "").replace(/\n/, "").split("/");
						console.log("el ======>");
						console.log(el);
						if(el[1].includes(self.P_STATUS_W_ZRODLE))
							self.createClaim(self.mainElement, self.P_CREATE_DATE, self.getTimeType(el[0], el[1].replace(/,P.*/, "")), 
								[{property: self.P_STATUS_W_ZRODLE, value: self.getItemType(self.Q_OKOLO)}]);
						else
							self.createClaim(self.mainElement, self.P_CREATE_DATE, self.getTimeType(el[0], el[1]));
							
					}
					else {
						var d1, d2, d3, p1, p2, prec1, prec2, quals;
						el = $("tr > td:eq(1)", v).text().replace(/,.*/g, "").replace(/\n/g, "").split(" ");
						console.log(el);
						
						if (el[0].includes("-")||el[0].includes("między")||el[0].includes("—")||
							el[0].includes("/")||(el[0] === "od")) {
							if(el[0].includes("-")||el[0].includes("—")||el[0].includes("/")) {
								d1 = el[0].substring(0, 4);
								d3 = el[0].substring(5);
								prec1 = 8;
							} else {
								if (el[2] === "wiek") {
									d1 = (self.fromRoman(el[1])-1) * 100 + 1;
									d3 = (self.fromRoman(el[4])-1) * 100 + 1;
									prec1 = 7;
									prec2 = 7;
								} else {
									d1 = el[1];
									d3 = el[3];
									prec1 = 8;
								}
							}
							d2 = d1;
							p1 = self.P_NAJWCZESNIEJ;
							p2 = self.P_NAJPOZNIEJ;
						} else if (el[0].length === 4) {
							self.createClaim(self.mainElement, self.P_CREATE_DATE, self.getTimeType("+" + el + "-00-00T00:00:00Z", 9));
						} else if (el[1].toLowerCase().includes("dekada")) {
							var dekada = 0;
							switch(el[0].toLowerCase()) {
								case "pierwsza":
									dekada = 0;
									break;
							}
							d1 = (self.fromRoman(el[2])-1) * 100 + dekada;
							prec1 = 8;
						} else if (el[1].toLowerCase().includes("połowa")) {
							var start = 0;
							if(el[1].toLowerCase().includes("druga"))
								start = 50;
							d2 = (self.fromRoman(el[2])-1) * 100 + start;
							d3 = d2 + 50 + start;
							d1 = d2 + 1;
							p1 = self.P_NAJWCZESNIEJ;
							p2 = self.P_NAJPOZNIEJ;
							prec1 = 7;
						} else if (el[1].toLowerCase().includes("ćwiartka")) {
							var start = 0;
							switch(el[0].toLowerCase()) {
								case "druga":
									start = 25;
									break;
								case "trzecia":
									start = 50;
									break;
								case "czwarta":
									start = 75;
									break;
							}
							d2 = (self.fromRoman(el[2])-1) * 100 + start;
							d3 = d2 + 25;
							d1 = d2 + 1;
							p1 = self.P_NAJWCZESNIEJ;
							p2 = self.P_NAJPOZNIEJ;
							prec1 = 7;
						} else if (el[0].toLowerCase().includes("około")||el[0].toLowerCase().includes("ok.")) {
							if (el[1].includes("-")||el[1].includes("–")||el[1].includes("/")) {
								d1 = el[1].substring(0, 4);
								d2 = d1;
								d3 = el[1].substring(5);
								p1 = self.P_NAJWCZESNIEJ;
								p2 = self.P_NAJPOZNIEJ;
								prec1 = 8;
							} else {
								d1 = el[1];
								prec1 = 9;
								quals = [{property: self.P_STATUS_W_ZRODLE, value: self.getItemType(self.Q_OKOLO)}];
							}
						} else if (el[0].toLowerCase().includes("lipiec")) {
							d1 = el[1] + "-07-01";
							prec1 = 10;
						} else if (el[0].toLowerCase().includes("lata")) {
							el[1] = el[1] === "dziewięćdziesiąte" ? 90 : el[1].slice(0, -1);  
							d1 = (+(self.fromRoman(el[2])-1) * 100) + (+el[1]);
							prec1 = 8;
						} else if (el[0].toLowerCase() === "po") {
							d1 = el[1];
							d2 = d1;
							prec1 = 8;
							p1 = self.P_NAJWCZESNIEJ;
						} else if (el[0].toLowerCase().includes("przed")||el[0].toLowerCase().includes("before")) {
							d1 = el[1];
							d2 = d1;
							prec1 = 8;
							p1 = self.P_NAJPOZNIEJ;
						} else if (el[0].toLowerCase().includes("przełom")) {
							d1 = (self.fromRoman(el[1])-1) * 100 + 1;
							d2 = (self.fromRoman(el[3])-1) * 100 + 1;
							p1 = self.P_NAJPOZNIEJ;
							prec1 = 7;
							prec2 = 7;
						} else if (el[0].toLowerCase().includes("początek")||el[0].toLowerCase().includes("środek")||el[0].toLowerCase().includes("koniec")||
								el[1].toLowerCase().includes("wiek")) {
							var idx = el[1].toLowerCase().includes("wiek") ? 0 : 1;
							d1 = (self.fromRoman(el[idx])-1) * 100 + 1;
							prec1 = 7;
						}

						if (d1 !== undefined) {		
							var qArr = [];
							prec2 = prec2 ? prec2 : 9;
							if(p1)
								qArr.push({property: p1, value: self.getTimeType("+" + d2 + "-00-00T00:00:00Z", prec2)});
							if(p2)
								qArr.push({property: p2, value: self.getTimeType("+" + d3 + "-00-00T00:00:00Z", prec2)});
							qArr = qArr.length > 0 ? qArr : undefined;
							qArr = quals ? quals : qArr;
						
							if(prec1 === 10)
								d1 = d1 + "T00:00:00Z";
							else
								d1 = d1 + "-00-00T00:00:00Z";
							self.createClaim(self.mainElement, self.P_CREATE_DATE, self.getTimeType("+" + d1, prec1), qArr);
						}
					}
					break;
				
				case "fileinfotpl_art_medium":
					var kom = "", brakMat;
					
					$.each($("tr > td:eq(1)", v).text().replace(" i ", "#").
						replace(" na ", "#").replace(" on ", "#").
						replace(" oprawiony w karton", "").
						replace(/, /g, "#").split("#"), function(k, v){
						
						brakMat = true;
						console.log(v);
						$.each(self.getConfig(v, self.materialTab), function(k, v) {
							var qArr = [];
							brakMat = false;
							console.log("MATRIAŁY-PROCESSIG====>");
							console.log(v);
							if (v.p === 31)
								p31 = false;
							if(v.qual !== undefined)
								$.each(v.qual, function(k, v) {
									qArr.push({property: v.p.toString(), value: self.getItemType(v.q.toString())});
								});
							else
								qArr = undefined;

							self.createClaim(self.mainElement, v.p.toString(), self.getItemType(v.q.toString()), qArr);
						});
						
						if (brakMat)
							kom = kom + "====> Nieznany materiał: " + v + "\n";
					});
					
					if (kom)
						alert(kom);

					break;
					
				case 'fileinfotpl_art_dimensions':
					var i = 1;
					$.each($("tr > td:eq(1)", v).text()
						.replace(/^\n/, "")
						.replace(/.*dimensions QS:P2048,/, "")
						.replace(/U174728;/g, "#")
						.replace(/U174728/g, "")
						.replace(/P2049,/, "")
						.replace(/ × /, "#")
						.replace(/ cm/, "")
						.split("#"), function(k, v){

						switch(i) {
							case 1:
								self.createClaim(self.mainElement, self.P_WYSOKOSC, self.getQuantityType(v));
								break;
							case 2:
								self.createClaim(self.mainElement, self.P_SZEROKOSC, self.getQuantityType(v));
								break;
							case 3:
								self.createClaim(self.mainElement, self.P_GLEBOKOSC, self.getQuantityType(v));
								break;
						}
						i++;	
					});
					break;
				
				case 'fileinfotpl_art_gallery':
					if($("a[title*=wikidata]", v).length > 0)
						p195 = $("a[title*=wikidata]", v).attr("href").replace(/^.*\/Q/, "");
					break;
					
				case 'fileinfotpl_art_location':
					if($("span:contains('eksponat przechowywany w magazynach')", v).length > 0)
						self.createClaim(self.mainElement, self.P_MIEJSCE, self.getItemType(self.Q_MAGAZYN));
					break;
					
				case 'fileinfotpl_art_id':
					p217 = $("div", v).text().replace(/\n/, "");
					break;
					
				case 'fileinfotpl_art_references':
					var val = $("tr > td > a.external", v).attr("href");
					if(val) {
						p973 = false;
						self.createClaim(self.mainElement, self.P_URL, self.getStringType(val));
					}
					break;
				
				case 'fileinfotpl_src':
					if(p973)
							self.createClaim(self.mainElement, self.P_URL, self.getStringType($("tr > td > a.external", v).attr("href")));
					break;
			}
			
			//console.log(v);
		});
		
		if (p195&&p217) {
			self.createClaim(self.mainElement, self.P_KOLEKCJA, self.getItemType(p195), [{property: self.P_NR_EWID, value: self.getStringType(p217)}]);
			self.createClaim(self.mainElement, self.P_NR_EWID, self.getStringType(p217), [{property: self.P_KOLEKCJA, value: self.getItemType(p195)}]);
		} else if (p195&&!p217) {
			self.createClaim(self.mainElement, self.P_KOLEKCJA, self.getItemType(p195));
		} else if (!p195&&p217) {
			self.createClaim(self.mainElement, self.P_NR_EWID, self.getStringType(p217));
		}

		self.createClaim(self.mainElement, self.P_ILUSTRACJA, self.getStringType($("h1", xmlDoc).text().replace("File:", "")));
		
		console.log("kategorie=====>");
		console.log(categories);
		var kom = "", brakKat, cats = [];

		$.each(categories, function(k, v){
			brakKat = true;
			v = v.title.toLowerCase().replace("category:", "");
			console.log(v);
			$.each(self.getConfig(v, self.categoryTab), function(k, v) {
				brakKat = false;
				console.log("KATEGORIE-PROCESSIG====>");
				console.log(v);
				var el = $.grep(cats, function(e) {
					//console.log("Porównanie v.p = (" + v.p + ") z e.p = (" + e.p + "), v.q = (" + v.q + ") z e.q = (" + e.q + ")");
					if(v.p === e.p && v.q === e.q)
						return true;
					else
						return false;
				});
				if(el.length === 0) {
					cats.push({p: v.p, q: v.q});
					if (v.p === 31) {
						if(p31)
							self.createClaim(self.mainElement, v.p.toString(), self.getItemType(v.q.toString()));
						p31 = false;
					} else
						self.createClaim(self.mainElement, v.p.toString(), self.getItemType(v.q.toString()));
				}
			});
			
			if (brakKat)
				if (v.includes('pd-art (pd-old-100)')||
						v.includes('pd-art (pd-old-100-1923)')||
						v.includes('pd-old-100-1923')||
						v.includes('artworks without wikidata item')||
						v.includes('artworks with known accession number')||
						v.includes('objects with inscriptions (language unspecified)')||
						v.includes('cc-zero')||
						v.includes('self-published work')||
						v.includes('cc-pd-mark')
						) {}
				else
					kom = kom + "====> Nieznana kategoria: " + v + "\n";
		});
		
		if(p31)
			self.createClaim(self.mainElement, self.P_JEST_TO, self.getItemType(self.Q_OBRAZ));
		
		if(kom)
			alert(kom);
	},
	
	
	getItemType : function (value) {
		return '{"entity-type":"item","numeric-id":' + value.replace(/\D/g,'') + '}' ;
	},
	
	
	getTimeType : function (value, precision) {
		return '{"time":"' + value + '","timezone":0,"before":0,"after":0,"precision":' + precision + 
		',"calendarmodel":"http://www.wikidata.org/entity/Q1985727"}';
	},
	
	
	getStringType : function (value) {
		if(value === undefined)
			return value;
		else
			return '"' + value + '"' ;
	},
	
	
	getQuantityType : function (value) {
		return '{"amount":"+' + value + '","unit": "http://www.wikidata.org/entity/Q174728"}' ;
	},
	
	
	getSnak : function(property, value) {
		var self = this;
		
		return '{"' + self.p_prefix+property + '":[{"snaktype":"value","property":"' + self.p_prefix+property + '",' +
			'"datavalue":{"type":"wikibase-entityid","value":' + self.getItemType(value) + '}}]}';
	},

	
	createClaim : function ( entity , property , value, qualifiers ) {
		var self = this;
		console.log ( "Creating: " + entity + " / " + property + " / " + value + " / qualifiers: ");
		console.log (qualifiers);
		if(value !== undefined)
			self.queue.push({entity: entity, property: property, value: value, qualifiers: qualifiers})
	},


	processQueue : function () {
		var self = this ;
		
		if (self.queue.length === 0)
			return;
			
		var entity , property , value, qualifiers;
		entity = self.queue[0].entity;
		property = self.queue[0].property;
		value = self.queue[0].value;
		qualifiers = self.queue[0].qualifiers;
		
		$.post ( self.api , {
			action : 'query' ,
			prop : 'revisions|pageterms' ,
			//rvlimit: '1',
			rvprop: 'ids',
			titles : "Q" + entity ,
			format : 'json',
			meta : 'tokens'
		} , function ( data ) {
			var token, lastrevid ;
			console.log("QUEUE======>");
			console.log(self.queue);
			token = data.query.tokens.csrftoken;
			var key = Object.keys(data.query.pages)[0];
			lastrevid = data.query.pages[key].revisions[0].revid;

			if ( undefined === token ) {
				console.log ( "Cannot get edit token for " + entity ) ;
				//self.processNextQueueItem() ;
				return ;
			}
			
			if (self.queue[0].label) {
				$.post ( self.api, {
					action : 'wbeditentity' ,
					id: self.q_prefix + entity,
					data: self.queue[0].label,
					format : 'json',
					token: token
				} , function ( data ) {
					console.log(data);
					self.queue.shift();
					self.processQueue();
				} ) ;
			}		
			else {
				property = property.replace(/\D/g,'') ;
				entity = entity.replace(/\D/g,'') ;
				
				console.log(property);
				console.log(entity);
				
				// sprawdzamy, czy element istnieje
				$.post (self.api, {
					action : 'wbgetclaims',
					entity : self.q_prefix+entity ,
					property : self.p_prefix+property,
					format : 'json' //,
					//token: token
					//props : ''
				}, function (data) {
					//console.log("====> WBGetClaims");
					//console.log(data);
					//console.log(data.claims);
					//console.log(data.claims[self.p_prefix+property]);

					var vo = JSON.parse ( value ) ;
					//console.log ( vo ) ;
					var is_item_target = vo['numeric-id'] !== undefined ;
					var value_id; 
					if (is_item_target)
						value_id = vo['numeric-id']+'';
					else if (vo['time'])
						value_id = vo['time'] + ", precision = " + vo['precision'];
					else if (vo['amount'])
						value_id = vo['amount'];
					else
						value_id = vo;

					console.log(data.claims[self.p_prefix+property]);
					console.log("value_id = " + value_id);
					
					if(data.claims[self.p_prefix+property] === undefined|| 
						!self.isValueInArray(data.claims[self.p_prefix+property], value_id)) 
					{
						var other_entity = ( entity.replace(/\D/g,'') != self.mainElement.replace(/\D/g,'') ) ;
						
						$.post ( self.api , {
							action : 'wbcreateclaim' ,
							entity : self.q_prefix+entity ,
							snaktype : 'value' ,
							property : self.p_prefix+property ,
							value : value ,
							token : token ,
							baserevid : lastrevid ,
							format : 'json'
						} , function ( data ) {
							console.log("wbcreateclaim===>");
							console.log ( "Tworzenie: " + entity + " / " + property + " / " + value);
							console.log(data);
							var claimId = data.claim.id;
							
							$.post ( self.api , {
								action : 'wbsetreference' ,
								format : 'json',
								statement: claimId,
								snaks: self.getSnak(self.P_IMPORTED_FROM, self.Q_WIKICOMMONS),
								baserevid: data.pageinfo.lastrevid,
								token: token
							} , function ( data ) {
								console.log(data);
								
								self.lastrevid = data.pageinfo.lastrevid;
								if (typeof qualifiers !== 'undefined') {
										self.addQualifier(token, claimId);
								} else {
									self.queue.shift();
									self.processQueue();
								}
							});
			
							var id = 'added_' + self.id_cnt ;
							var h = "<div id='" + id + "'>" ;
							h += "Added " ;
							h += "<span class='added_entity_P'>" + property + "</span>" ;
							h += " &Rarr; " ;
							h += "<span class='added_entity_Q'>" + value_id + "</span>" ;
							if ( other_entity ) h += " to entity <span class='added_entity_x'>" + entity + "</span>" ;
							h += ".</div>" ;
							$($('div.wikibase-listview').get(0)).append ( h ) ;
							self.updateEntity ( id , property , self.p_prefix ) ;
							if ( is_item_target ) self.updateEntity ( id , value_id , self.q_prefix ) ;
							if ( is_item_target && other_entity ) self.updateEntity ( id , entity.replace(/\D/g,'') , 'x' ) ;
							self.id_cnt++ ;
						} , 'json' ) ;
					} else { // if(data.claims)
						self.queue.shift();
						self.processQueue();
					}
				}, 'json'); // sprawdzenie istnienia elementu
			} // else (if(label))
		} , 'json' ) ;
	} ,
	
	
	addQualifier : function(token, claimId) {
		var self=this;

		$.post ( self.api , {
			action : 'wbsetqualifier' ,
			claim: claimId,
			property: self.p_prefix+self.queue[0].qualifiers[0].property,
			value: self.queue[0].qualifiers[0].value,
			snaktype: 'value',
			format : 'json',
			baserevid: self.lastrevid,
			token: token
		} , function ( data ) {
			console.log("KWALIFIKATOR======>");
			console.log(data);
			self.lastrevid = data.pageinfo.lastrevid;
			self.queue[0].qualifiers.shift();
            console.log(self.queue[0].qualifiers);
            if (self.queue[0].qualifiers.length === 0) {
            	console.log("kwalifikator = 0");
            	self.queue.shift();
				self.processQueue();
            } else {
            	self.addQualifier(token, claimId);
            }
		} ) ;
	},

	
	addLabel : function(entity, label, description) {
		//console.log("addLabel: entity=" + entity + " label=");
		//console.log(label);
		//return;
		
		var self=this;
		
		var dat = '{"labels":[';
		$.each(label, function(k, v) {
			dat = dat + '{"language":"' + v.lang + '","value":"' + v.val + '"}';
		});
		dat = dat + ']';
		
		if (description !== null) {
			dat = dat + ',"descriptions":[';
			$.each(description, function(k, v) {
				dat = dat + '{"language":"' + v.lang + '","value":"' + v.val + '},';
			});
			dat = dat + ']';
		}
		
		dat = dat + '}';
		self.queue.push({entity: entity, label: dat})

		console.log("Label = " + dat);
	},
	
	
	updateEntity : function ( id , value , prefix ) {
		var self = this ;
		var q = prefix+value ;
		if ( prefix == 'x' ) q = self.q_prefix + value ;
		console.log ( q ) ;
		$.getJSON ( self.api , {
			action : 'wbgetentities' ,
			ids : q ,
			format : 'json'
		} , function ( data ) {
			var labels = data.entities[q].labels ;
			var title = q ;
			if ( undefined !== labels ) {
				$.each ( ['pl','en','de','fr'] , function ( k , v ) {
					if ( undefined === labels[v] ) return ;
					title = labels[v].value ;
					return false ;
				} ) ;
			}
			var h = "<a href='/wiki/" + q + "'>" + title + "</a>" ;
			$('#'+id+' span.added_entity_'+prefix).html ( h ) ;
		} ) ;
	} ,
	
	
	fromRoman : function(str) {  
	  var result = 0;
	  // the result is now a number, not a string
	  var decimal = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
	  var roman = ["M", "CM","D","CD","C", "XC", "L", "XL", "X","IX","V","IV","I"];
	  for (var i = 0;i<=decimal.length;i++) {
	    while (str.indexOf(roman[i]) === 0){
	    //checking for the first characters in the string
	      result += decimal[i];
	      //adding the decimal value to our result counter
	      str = str.replace(roman[i],'');
	      //remove the matched Roman letter from the beginning
	    }
	  }
	  return result;
	},
	
	
	getConfig : function(QStr, elemArray) {
		var self = this;
		//console.log("KATEGORIA===>" + QStr);
		return $.grep(elemArray, function(e){ 
			//console.log("Porównanie: (" + e.name + ") i (" + QStr + "), wynik = " + QStr.includes(e.name));
			return QStr.includes(e.name); });
	},
	
	
	isValueInArray : function(arr, val) {
		var self = this;
		var ret = false;
		console.log("=====> val: ");
		console.log(val);
		console.log("=====> arr: ");
		console.log(arr);
		
		$.each(arr, function(k, v){
			console.log("===> v.mainsnak.datavalue.value.id: ");
			console.log(v.mainsnak.datavalue.value.id);
			console.log("=====> self.q_prefix + val: ");
			console.log(self.q_prefix + val);
			console.log(v.mainsnak.datavalue.value.id !== self.q_prefix + val);
			if(ret === false)
				if (v.mainsnak.datavalue.value.id !== undefined && v.mainsnak.datavalue.value.id !== self.q_prefix + val)
					ret = false;
				else
					ret = true;
		});

		console.log("=====> isValueInArray ret: " + ret);
		return ret;
	},
	
};



jQuery(document).ready ( function() {
	if ( mw.config.get('wgNamespaceNumber') != 0 ) return ;
	if ( mw.config.get('wgAction') != 'view' ) return ;

	wd_import_commons.init () ;
});