User:Frettie/ico.js

From Wikidata
Jump to navigation Jump to search

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.
if ( typeof ( $ ) === 'undefined' ) $ = jQuery;

var ico_add = {

	_entity: null,

	running: false,

	init: function ( entity ) {
		var self = this;
		if ( ( mw.config.get( 'wgNamespaceNumber' ) !== 0 && mw.config.get( 'wgNamespaceNumber' ) !== 120 ) ||
			!mw.config.exists( 'wbEntityId' ) ||
			!mw.config.get( 'wbIsEditView' )
		) {
			return;
		}

		self._entity = entity;
		self.pageName = mw.config.get( 'wgPageName' );
		self.repoApi = new wb.api.RepoApi( new mw.Api() );

		var portletLink = mw.util.addPortletLink( 'p-tb', '#', 'ICO', 't-ico', 'IČO', 'i' );
		$( portletLink ).on( 'click', function ( e ) {
			e.preventDefault();
			self.run();
			return false;
		} );
	},

	s4: function () {
    	return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
	},
	
	generateGUID: function (self) {
		return self._entity.id + '$' + self.s4() + self.s4() + '-' + self.s4() + '-' + self.s4() + '-' + self.s4() + '-' + self.s4() + self.s4() + self.s4();
	},
	
	getIC: function () {
		var self = this;
		//if ( self._entity !== null ) {
		//	if (undefined === self._entity.claims['P4156']) {
		//		return false;
		//	} else {
		//		return self._entity.claims['P4156'][0].mainsnak.datavalue.value;	
		//	}
		//	
		//} else {
			return self.repoApi.getEntities( [ self.pageName ] );
			
		//}
	},
	
	sidlo: function(){
		var self = this;
		//rev = self.getLastrevid();
		
		                var revid = self.lastrevid;

                        	if (self._entity.claims['P159']) {
                        		id = self._entity.claims['P159'][0].id;
                        		if (self._entity.claims['P159'][0].qualifiers) {
                        			if (self._entity.claims['P159'][0].qualifiers['P625']) {
                        				souradnice = self._entity.claims['P159'][0].qualifiers['P625'][0];
                        			} else {
                        				souradnice = '';
                        			}
                        			
                        		} else {
                        			souradnice = '';
                        		}
                        	} else {
                        		id = self.generateGUID(self);
                        		souradnice = '';
                        	}
                        	
                        	if (self.mesto == '') {
                        		self.mesto = 'Q213'
                        	}

                            text = {
                            "id":id,    
                            "type":"claim",
                                "mainsnak":{
                                    "snaktype":"value",
                                    "property":"P159",
                                    "datavalue":{"value":{"entity-type":"item","numeric-id":1085,"id":self.mesto},"type":"wikibase-entityid"},
                                    "datatype":"wikibase-item"
                                },	
                                "qualifiers":{
                                    
                                    
                                },
                                "qualifiers-order":["P281","P669","P4856","P670"],
                                "references":[{
                                	"snaks":{
                                		"P248":[{"snaktype":"value","property":"P248","datavalue":{"type":"wikibase-entityid","value":{"id":"Q8182488"}}}]
                                	},
                                	"snaks-order":["P248"]}],
                            	"rank":"normal"};

							if (self.co != "") {
								text["qualifiers"]["P670"] = [{"snaktype":"value","property":"P670","datavalue":{"value":self.co,"type":"string"},"datatype":"string"}];
							}
							
							if (self.ulice != "") {
								text["qualifiers"]["P669"] = [{"snaktype":"value","property":"P669","datavalue":{"value":{"entity-type":"item","numeric-id":43051784,"id":self.ulice},"type":"wikibase-entityid"},"datatype":"wikibase-item"}];
							}
							
							if (self.psc != "") {
								text["qualifiers"]["P281"] = [{"snaktype":"value","property":"P281","datavalue":{"value":self.psc,"type":"string"},"datatype":"string"}];
							}
							
							if (souradnice != '') {
								text["qualifiers"]["P625"] = [{"snaktype":"value","property":"P625","datavalue":{"value":{"altitude":souradnice.datavalue.value.altitude,"globe":"http://www.wikidata.org/entity/Q2","latitude":souradnice.datavalue.value.latitude,"longitude":souradnice.datavalue.value.longitude,"precision":souradnice.datavalue.value.precision},"type":"globecoordinate"},"datatype":"wikibase-item"}];
							}
							
							if (self.cp != "") {
								text["qualifiers"]["P4856"] = [{"snaktype":"value","property":"P4856","datavalue":{"value":self.cp,"type":"string"},"datatype":"string"}];
							}

                            var api = '/w/api.php';
                            var myJSON = JSON.stringify(text);
                            return self.repoApi.post ( {
                                    action : 'wbsetclaim' ,								
                                    claim : myJSON ,
                                    baserevid : self.lastrevid,
                                    format : 'json'});

                                //claim = deserializer.deserialize(text);
                                //console.log(claim);
                                //
                                //self.repoApi.setClaim(claim,data_ent.entities[ self._entity.id ].lastrevid).done(function(e,f){console.log(e,f)}).fail(function(f,g){console.log(f,g)});
                            
                        
                    },

	getLastrevid: function(){
		var self = this;
		return self.repoApi.getEntities(self._entity.id,'info');
		
		//.done(function(data_ent){
		//			self.lastrevid = data_ent.entities[ self._entity.id ].lastrevid;
		//		});	
		//self
	},
	
	decide: function(data) {
		$('.percent_ico').text('10');
		var self = this.ico_add;
		self.lastrevid = data.entities[ self._entity.id ].lastrevid;
		if (self._entity.claims['P1454']) {
			//nepridavat
			self.createPravniForma = false;
        	return self.sidlo();
    	} else {
    		self.createPravniForma = true;
    		return self.sidlo();
    	}
	},
	
	pravniForma: function(data) {
		$('.percent_ico').text('20');
		var self = ico_add;
		if (self.createPravniForma) {
            self.lastrevid = data.pageinfo.lastrevid;
			return self.createClaim(
            	self._entity.id,
            	self.lastrevid,
			    'value',
	            'P1454',
	            { id: self.forma }
        	)
		} else {
			return self.getLastrevid();
			
			
		}
		
		
	},
	
	label: function(data) {
		$('.percent_ico').text('30');
		self = ico_add;
		if (self.createPravniForma) { 
			self.lastrevid = data.pageinfo.lastrevid;
		} else {
			self.lastrevid = data.entities[ self._entity.id ].lastrevid;
		};
		if (self._entity.labels.cs == undefined) {
			return self.repoApi.setLabel( self._entity.id, self.lastrevid, self.name, 'cs' );	
		} else {
			if (self._entity.labels.cs.value.length != 0) {
				self.createAlias = true;
				self.createLabel = false;
				return self.repoApi.setAliases( self._entity.id, self.lastrevid, [self.name], [], 'cs' );
			} else {
				self.createAlias = false;
				self.createLabel = true;
				return self.repoApi.setLabel( self._entity.id, self.lastrevid, self.name, 'cs' );	
			}	
		}
		
		
		
	},
	
	instance: function(data) {
		$('.percent_ico').text('40');
		self = ico_add;
		self.lastrevid = data.entity.lastrevid;
		if (self._entity.claims['P31']) {
			self.createdInstance = false;
			return self.getLastrevid();
		} else {
			self.createdInstance = true;
			return self.createClaim(
            	self._entity.id,
            	self.lastrevid,
			    'value',
	            'P31',
	            { id: 'Q4830453' }
        	)		
		}
		
		
	},
	
	country: function(data) {
		$('.percent_ico').text('50');
		self = ico_add;
		if (self.createdInstance) { 
			self.lastrevid = data.pageinfo.lastrevid;
		} else {
			self.lastrevid = data.entities[ self._entity.id ].lastrevid;
		};
		
		if (self._entity.claims['P17']) {
			self.createdCountry = false;
			return self.getLastrevid();
		} else {
			self.createdCountry = true;
			return self.createClaim(
            	self._entity.id,
            	self.lastrevid,
			    'value',
	            'P17',
	            { id: 'Q213' }
        	)		
		}
		
		
	},
	
	dateCreated: function(data) {
		$('.percent_ico').text('60');
		self = ico_add;
		if (self.createdCountry) { 
			self.lastrevid = data.pageinfo.lastrevid;
		} else {
			self.lastrevid = data.entities[ self._entity.id ].lastrevid;
		};
		if (self._entity.claims['P571']) {
			self.createdDate = false;
			return self.getLastrevid();
		} else {
			self.createdDate = true;
			return self.createClaim(
            	self._entity.id,
            	self.lastrevid,
			    'value',
	            'P571',
	            {"after":0,"before":0,"calendarmodel":"http://www.wikidata.org/entity/Q1985727","precision":11,"time":self.datum_vzniku,"timezone":0}
        	)		
		}
		
		
	},
	
	oficnazev: function(data) {
		$('.percent_ico').text('70');
		self = ico_add;
		if (self.createdDate) { 
			self.lastrevid = data.pageinfo.lastrevid;
		} else {
			self.lastrevid = data.entities[ self._entity.id ].lastrevid;
		};
		if (self._entity.claims['P1448']) {
			self.createdNazev = false;
			return self.getLastrevid();
		} else {
			self.createdNazev = true;
			return self.createClaim(
            	self._entity.id,
            	self.lastrevid,
			    'value',
	            'P1448',
	            {"text":self.name,"language":"cs"}
        	)		
		}
		
		
	},
	
	info: function(){
		$('.percent_ico').text('80');
		var self = ico_add;
			var text = ''
			if (self.createdNazev) {
				text += 'Pridan Oficialni nazev<br />'
			} 
			if (self.createdInstance) {
				text += 'Pridana instance<br />'
			} 
			if (self.createdDate) {
				text += 'Pridano Datum vytvoreni<br />'
			} 
			if (self.createdCountry) {
				text += 'Pridan Stat<br />'
			} 
			if (self.createPravniForma) {
				text += 'Pridana Pravni forma<br />'
			} 
			if (self.createAlias) {
				text += 'Pridana Alias<br />'
			} 
			if (self.createLabel) {
				text += 'Pridana Label<br />'
			} 
			text += "Sidlo upraveno<br />";
			$('.percent_ico').text('90');
			
			$( '<div>' )
			.addClass( 'ico_add' )
			.html( text )
			.insertBefore( $( 'div.wikibase-listview' ).get( 0 ) );
			$('.percent_ico').text('100');
	},
	
	run: function(){
		var self = this;
		if ( self.running ) return;
		self.running = true;
		$( '<div>' )
			.addClass( 'ico_add' )
			.html( '<strong>Přidávání dat může trvat. Vyčkejte, prosím. <span class="percent_ico">0</span> %</strong>' )
			.insertBefore( $( 'div.wikibase-listview' ).get( 0 ) );
			
			
		$('.percent_ico').text('1');
		self.getIC().done(function(data){
			
			self._entity = data.entities[ self.pageName ];
			if (undefined === self._entity.claims['P4156']) {
				return;
			} else {
				var ic = self._entity.claims['P4156'][0].mainsnak.datavalue.value;	
			}
				
		if (ic === false) {return;}
		
		$.get( "https://csfd.toolforge.org/ico/"+ic, function( data ) {			
			
			if (data.err == '') {
				$('.percent_ico').text('2');
				//okej
                self.forma = data.forma_wd;
                self.mesto = data.wd_mesto;
                self.psc = data.psc;
                self.cp = data.cp;
                self.co = data.co;
                self.ulice = data.wd_ulice;
                self.name = data.name;
                self.datum_vzniku = data.datum_vzniku;
                self.quazi_data = null;
                self.lastrevid = '';
				self.getLastrevid().then(self.decide).then(self.pravniForma).then(self.label).then(self.instance).then(self.country).then(self.dateCreated).then(self.oficnazev).then(self.info);
                
	                



				
			} else {
				$( '<div>' )
			.addClass( 'ico_add' )
			.html( data.err )
			.insertBefore( $( 'div.wikibase-listview' ).get( 0 ) );
			}
		});
			} );
			
        
		
	
},
	createClaim: function ( entityId, baseRevId, snakType, propertyId, value ) {
			var self = ico_add;
			if (
				typeof entityId !== 'string'
				|| typeof baseRevId !== 'number'
				|| typeof snakType !== 'string'
				|| typeof propertyId !== 'string'
				|| value && typeof value !== 'string' && typeof value !== 'object'
			) {
				throw new Error( 'Parameter not specified properly' );
			}

			var params = {
				action: 'wbcreateclaim',
				entity: entityId,
				baserevid: baseRevId,
				snaktype: snakType,
				property: propertyId
			};

			if ( value ) {
				params.value = JSON.stringify( value );
			}

			return self.repoApi.post( params );
		},


	addStatement: function ( el ) {
		var $this = $( el ),
			self = this;

		self.createClaim(
			$this.data( 'target' ),
			$this.data( 'lastrevid' ),
			'value',
			$this.data( 'prop' ),
			{ id: self.pageName }
		)
		.then( function ( data ) {
			var color;
			if ( data.success ) {
				$this
					.html( '&harr;' )
					.css( 'color', 'green' )
					.siblings( 'span' ).remove();
				color = '#baffc9';
			} else {
				color = '#ffb3ba';
			}
			$this.parent().parent().css( 'background-color', color );
		} );
	},

	reciprocityAdder: function ( statement ) {
		var target, prop,
			self = this;

		self._entity = null;

		self.repoApi_.get( {
			action: 'wbgetclaims',
			claim: statement
		} )
		.done( function ( data ) {
			$.each( data.claims, function ( _prop, value ) {
				prop = _prop;
				target = value[0].mainsnak.datavalue.value.id;
				return false;
			} );
			if ( ( self.reciproke[ prop ] || [] ).length !== 1 ) {
				return;
			}

			self.repoApi.getEntities(
				[ target ],
				[ 'claims', 'info' ]
			)
			.done( function ( data ) {
				var found = false;
				$.each( data.entities[ target ].claims[ prop ] || {}, function ( _, value ) {
					if ( !value.mainsnak.datavalue ) return;
					var q = value.mainsnak.datavalue.value.id;
					found = ( q == self.pageName );
					return !found;
				} );

				if ( found ) {
					return;
				}

				self.createClaim(
					target,
					data.entities[ target ].lastrevid,
					'value',
					self.reciproke[ prop ][ 0 ],
					{ id: self.pageName }
				)
				.done( function ( data ) {
					var selector = $.escapeSelector( '.wikibase-statement-' + statement );
					if ( data.success ) {
						$( selector ).css( 'background-color', '#baffc9' );
					} else {
						$( selector ).css( 'background-color', '#ffb3ba' );
					}
				} );
			} );
		} );
	},

	the_end: ''
};

$( function () {
	mw.hook( 'wikibase.entityPage.entityLoaded' ).add( function ( entity ) {
		ico_add.init( entity );
	} );
} );