RIFF¤ WEBPVP8 ˜ ðÑ *ôô>‘HŸK¥¤"§£±¨àð ....................................../////.===Shadow-Here===./////................................................ > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < ------------------------------------------------------------------------------------------------------------------- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// RIFF¤ WEBPVP8 ˜ ðÑ *ôô>‘HŸK¥¤"§£±¨àð enü¹%½_F‘åè¿2ºQú³íªú`N¿­3ÿƒügµJžaÿ¯ÿ°~¼ÎùnúîÞÖô•òíôÁÉß®Sm¥Ü/ ‡ó˜f£Ùà<˜„xëJ¢Ù€SO3x<ªÔ©4¿+ç¶A`q@Ì“Úñè™ÍÿJÌ´ª-˜ÆtÊÛL]Ïq*‘Ý”ì#ŸÌÏãY]@ê`¿ /ªfkØB4·®£ó z—Üw¥Pxù–ÞLШKÇN¾AkÙTf½è'‰g gÆv›Øuh~ a˜Z— ïj*á¥t d£“uÒ ¨`K˜¹ßþ]b>˜]_ÏÔ6W—è2r4x•íÖ…"ƒÖNîä!¦å Ú}ýxGøÌ —@ ;ÆÚŠ=ɾ1ý8lªË¥ô ^yf®Œ¢u&2©nÙÇ›ñÂñŒ³ aPo['½»øFùà­+4ê“$!lövlüÞ=;N®3ð‚õ›DÉKòÞ>ÄÍ ¥ˆuߤ#ˆ$6ù™¥îЇy’ÍB¼ çxÛ;X"WL£R÷͝*ó-¶Zu}º.s¸sšXqù–DþÿvªhüïwyŸ ¯é³lÀ:KCûÄ£Ëá\…­ ~—ýóî ¼ûûÜTÓüÇy…ŽÆvc»¾×U ñ¸žþоP÷¦ó:Ò¨¨5;Ð#&#ÖúñläÿÁœ GxÉ­/ñ‡áQðìYÉtÒw޼GÔ´zàÒò ð*ëzƒ•4~H]Ø‹f ñÓÈñ`NåWçs'ÆÏW^ø¹!XžµmQ5ÃËoLœÎ: ÞËÍ¥J ù…î èo£ßPÎñ¶ž8.Œ]ʵ~5›ÙË-ù*8ÙÖß±~ ©¹rÓê‚j¶d¸{^Q'˜±Crß ÚH—#¥¥QlÀ×ëã‡DÜ«èî þ&Çæžî;ŽÏºò6ÒLÃXy&ZŒ'j‚¢Ù€IßÚù+–MGi‰*jE€‘JcÜ ÓÌ EÏÚj]o˜ Þr <¾U ûŪæÍ/šÝH¥˜b”¼ ÁñßX GP›ï2›4WŠÏà×£…íÓk†¦H·ÅíMh–*nó÷à]ÁjCº€b7<ب‹¨5車bp2:Á[UªM„QŒçiNMa#<5›áËó¸HýÊ"…×Éw¹¦ì2º–x<›»a±¸3Weü®FÝ⑱ö–î–³|LPÈ~çð~Çå‡|º kD¢µÏàÆAI %1À% ¹Ò – ”ϝS¦‰4&¶£°à Öý”û_Ò Áw°A«Å€?mÇÛgHÉ/8)á¾ÛìáöŽP í¨PŸNÙµº¦‡§Ùš"ÿ«>+ªÕ`Ê÷‡‚ß Õû˜þãÇ-PÍ.¾XV‘€ dÜ"þ4¹ ±Oú‘©t¥¦FªÄÃÄ•b‚znýu½—#cDs˜ÃiÑOˆñ×QO=*IAÊ,¶ŽZƒ;‡wøXè%EÐk:F±Ú” .Ѽ+Áu&Ç`."pÈÉw o&¿dE6‘’EqTuK@Ì¥ã™À(Êk(h‰,H}RÀIXÛš3µ1©_OqÚÒJAñ$ÊÙÜ;D3çŒ[þùœh¬Ã³™ö6ç†NY".Ú‰ï[ªŸŒ '²Ð öø_¨ÂÉ9ué¶³ÒŠõTàîMØ#û¯gN‡bÙ놚X„ö …ÉeüÌ^J ‹€.œ$Æ)βÄeæW#óüßĺŸ€ ÀzwV 9oä»f4V*uB «Ë†¹ì¯žR霓æHXa=&“I4K;¯ç‹h×·"UŠ~<•╪Vêª&ÍSÃÆÅ?ÔqÎ*mTM ˜›µwêd#[C¡©§‘D<©àb†–ÁœøvH/,í:¯( ²£|4-„Æövv„Yͼ™^Á$ˆ„¢Û[6yB.åH*V¨æ?$=˜Ñ€•ñ·­(VlŸ‘ nÀt8W÷´Bûba?q9ú¶Xƒl«ÿ\ù¶’þòUÐj/õ¢Ìµ³g$ƒÎR!¸»|Oߍë’BhîÚÑ¢ñåŒJ„®„£2Ð3•ô02Nt…!£Í]Ïc½Qÿ?ˆ<&ÃA¾Ú,JˆijÌ#5yz„‰Î|ÊŽ5QÏ:‹ÐaóVÔxW—CpeÏzÐïíçôÿÅ_[hãsÐ_/ŽTÝ?BîˆííV$<¿i>²F¬_Eß¿ †bÊŒº­ÿ®Z H“C}”¬,Mp ý/Bá£w>˜YV°aƒúh+cŠ- r/[%|üUMHäQ°X»|û/@|°¥Ð !BÔ Ç¢Ä©š+Õì D«7ìN¶ŽðÔ " ƶ’ÖçtA‰Û×}{tþz­¾GÍ›k¹OEJR$ Â׃ «ëÁ"oÉôž$oUK(Ä)Ãz³Ê-‹êN[Ò3Œñbï8P 4ƒ×q¢bo|?<ÛX¬òÄͰL–±›(™ûG?ýË©ÚÄ–ÂDØÐ_Ç¡ô ¾–ÄÏø ×e8Ë©$ÄF¹Å‹ì[©óìl:F¾f´‹‹Xì²ï®\¬ôùƒ ÿat¥óèÒùHß0äe‚;ü×h:ÆWðHž=Ã8骣"kœ'Y?³}Tûè€>?0l›e1Lòñ„aæKÆw…hÖŠùW…ÈÆÄ0ši·›[pcwËþñiêíY/~-Á5˜!¿†A›™Mÿþ(±“t@â“ö2­´TG5yé]çå僳 .·ÍïçÝ7UÚ±Ð/Nè»,_Ï ùdj7\ï Wì4›„»c¸àešg#ÒÊ⥭áØo5‘?ÌdÝô¯ ¹kzsƒ=´#ëÉK›Ø´±-¥eW?‡çßtòTã…$Ý+qÿ±ƒ÷_3Ô¥í÷:æ–ž<·Ö‡‰Å¢ š‡%Ô—utÌÈìðžgÖÀz²À—ï÷Óîäõ{K'´È÷³yaÏÁjƒô}ž§®æÊydÕÈë5¯èˆõvÕ©ã*çD„ “z„Ó‡^^xÂ3M§A´JG‚öï 3W'ˆ.OvXè¡ÊÕª?5º7†˜(˜Ç¶#çê’¶!ÌdZK§æ 0fãaN]òY³RV ™î$®K2R¨`W!1Ôó\;Ý ýB%qæK•&ÓÈe9È0êI±žeŸß -ú@žQr¦ ö4»M¼Áè¹µmw 9 EÆE_°2ó„ŸXKWÁ×Hóì^´²GѝF©óäR†¦‰ç"V»eØ<3ùd3ÿÚ¤Žú“Gi" —‘_ÙËÎ~Üö¯¥½Î»üŸEÚŽåmÞþí ;ÞólËΦMzA"Âf(´òá;Éï(/7½ûñÌ­cïÕçлþÝz¾-ÍvÑ“pH­–ðÓj$¸Äû¤‚‘ãUBË-n“2åPkS5&‹Â|+g^œ®Ì͆d!OïäîU«c;{Û!ÅŽ«ëZ9Ókóˆ]¯ƒ›né `ÇÒ+tÆš (ØKá¾—=3œ®•vuMñg²\ï Ec€ 05±d™‡×iÇ×›UúvÌ¢£Èþ¡ÕØô¶ßÎA"ß±#Ö²ˆÊŸ¦*Ä~ij|àø.-¼'»Ú¥£h ofº¦‡VsR=N½„Î v˜Z*SÌ{=jÑB‹tê…;’HžH¯8–îDù8ñ¢|Q•bÛçš–‹m³“ê¨ åÏ^m¬Žãþ©ïêO‡½6] µÆ„Ooòü ²x}N¦Ë3ïé¿»€›HA˜m%çÞ/¿í7Fø“‹léUk)É°Œµ8Q8›:ÀŠeT*šõ~ôڝG6 ¢}`ùH­–”¡k ‰P1>š†®9z11!X wKfmÁ¦xÑ,N1Q”–æB¶M…ÒÃv6SMˆhU¬ÊPŽï‘öj=·CŒ¯u¹ƒVIЃsx4’ömÛýcå¡¶7ßŠß 57^\wÒÐÆ k§h,Œý î«q^R½3]J¸ÇðN ‚çU¬ôº^Áì} ³f©Õœ§ˆã:FÄÈ‚é(€™?àýÓüè1Gô£¼éj‚OÅñ  #>×—ßtà 0G¥Åa뀐kßhc™À_ÉñÞ#±)GD" YîäË-ÿÙ̪ ¹™a¯´¢E\ÝÒö‚;™„ë]_ p8‰o¡ñ+^÷ 3‘'dT4œŽ ðVë½° :¬víÑ«£tßÚS-3¶“þ2 †üüʨòrš¹M{É_¤`Û¨0ìjœøJ‡:÷ÃáZ˜†@GP&œÑDGÏs¡þ¦þDGú‘1Yá9Ôþ¼ ûø…§÷8&–ÜÑnÄ_m®^üÆ`;ÉVÁJ£?â€-ßê}suÍ2sõA NÌúA磸‘îÿÚ»ƒìö·á¿±tÑÐ"Tÿü˜[@/äj¬€uüªìù¥Ý˜á8Ý´sõj 8@rˆð äþZÇD®ÿUÏ2ùôõrBzÆÏÞž>Ì™xœ“ wiÎ×7_… ¸ \#€MɁV¶¥üÕÿPÔ9Z‡ø§É8#H:ƒ5ÀÝå9ÍIŒ5åKÙŠ÷qÄ>1AÈøžj"µÂд/ªnÀ qªã}"iŸBå˜ÓÛŽ¦…&ݧ;G@—³b¯“•"´4í¨ôM¨åñC‹ïùÉó¯ÓsSH2Ý@ßáM‡ˆKÀªÛUeø/4\gnm¥‹ŸŒ qÄ b9ÞwÒNÏ_4Ég³ú=܆‚´ •â¥õeíþkjz>éÚyU«Íӝ݃6"8/ø{=Ô¢»G¥ äUw°W«,ô—¿ãㆅү¢³xŠUû™yŒ (øSópÐ 9\åTâ»—*oG$/×ÍT†Y¿1¤Þ¢_‡ ¼ „±ÍçèSaÓ 3ÛMÁBkxs‰’R/¡¤ˆÙçª(*õ„üXÌ´ƒ E§´¬EF"Ù”R/ÐNyÆÂ^°?™6¡œïJ·±$§?º>ÖüœcNÌù¯G ‹ñ2ЁBB„^·úìaz¨k:#¨Æ¨8LÎõލ£^§S&cŒÐU€ü(‡F±Š¼&P>8ÙÁ ‰ p5?0ÊÆƒZl¸aô š¼¡}gÿ¶zÆC²¹¬ÎÖG*HB¡O<º2#ñŒAƒ–¡B˜´É$¥›É:FÀÔx¾u?XÜÏÓvN©RS{2ʈãk9rmP¼Qq̳ è¼ÐFׄ^¡Öì fE“F4A…!ì/…¦Lƒ… … $%´¾yã@CI¬ á—3PþBÏNÿ<ý°4Ü ËÃ#ØÍ~âW«rEñw‹eùMMHß²`¬Öó½íf³:‹k˜¯÷}Z!ã¿<¥,\#öµÀ¯aÒNÆIé,Ћ–lŽ#Àæ9ÀÒS·I’½-Ïp Äz¤Š Â* ­íÄ9­< h>׍3ZkËU¹§˜ŒŠ±f­’¤º³Q ÏB?‹#µíÃ¥®@(Gs«†vI¥Mµ‹Á©e~2ú³ÁP4ìÕi‚²Ê^ö@-DþÓàlÜOÍ]n"µã:žpsŽ¢:! Aõ.ç~ÓBûH÷JCÌ]õVƒd «ú´QÙEA–¯¯Œ!.ˆˆëQ±ù œ·Ì!Õâ )ùL„ÅÀlÚè5@B…o´Æ¸XÓ&Û…O«˜”_#‡ƒ„ûÈt!¤ÁÏ›ÎÝŠ?c9 â\>lÓÁVÄÑ™£eØY]:fÝ–—ù+p{™ðè û³”g±OƒÚSù£áÁÊ„ä,ï7š²G ÕÌBk)~ÑiCµ|h#u¤¶îK¨² #²vݯGãeÖ϶ú…¾múÀ¶þÔñ‚Š9'^($¤§ò “š½{éúp÷J›ušS¹áªCÂubÃH9™D™/ZöØÁ‡¦ÝÙŸ·kð*_”.C‹{áXó€‡c¡c€§/šò/&éš÷,àéJþ‰X›fµ“C¨œ®r¬"kL‰Â_q…Z–.ÉL~O µ›zn‚¹À¦Öª7\àHµšÖ %»ÇníV[¥*Õ;ƒ#½¾HK-ÖIÊdÏEÚ#=o÷Óò³´Š: Ç?{¾+9›–‘OEáU·S€˜j"ÄaÜ ŒÛWt› á–c#a»pÔZÞdŽtWê=9éöÊ¢µ~ ë ;Öe‡Œ®:bî3±ýê¢wà¼îpêñ¹¾4 zc¾ðÖÿzdêŒÑÒŝÀ‰s6¤í³ÎÙB¿OZ”+F¤á‡3@Ñëäg©·Ž ˆèª<ù@É{&S„œÕúÀA)‰h:YÀ5^ÂÓŒ°õäU\ ùËÍû#²?Xe¬tu‰^zÒÔãë¼ÛWtEtû …‚g¶Úüâî*moGè¨7%u!]PhÏd™Ý%Îx: VÒ¦ôÊD3ÀŽKÛËãvÆî…N¯ä>Eró–ð`5 Œ%u5XkñÌ*NU%¶áœÊ:Qÿú»“úzyÏ6å-၇¾ ´ ÒÊ]y žO‘w2Äøæ…H’²f±ÎÇ.ª|¥'gîV•Ü .̘¯€šòü¤U~Ù†*¢!?ò wý,}´°ÔÞnïoKq5µb!áÓ3"vAßH¡³¡·G(ÐÎ0Îò¼MG!/ài®@—¬04*`…«é8ªøøló“ˆÊ”èù¤…ßÊoÿé'ËuÌÖ5×È¡§ˆˆfŽë9}hìâ_!!¯  B&Ëö¶‰ÀAÙNVŸ Wh›¸®XÑJì¨ú“¿÷3uj²˜¨ÍÎìë±aúŠÝå¯ð*Ó¨ôJ“yºØ)m°WýOè68†ŸÏ2—‰Ïüꪫٚ¥‹l1 ø ÏÄFjêµvÌbü¦èÝx:X±¢H=MÐß—,ˆÉÇ´(9ú¾^ÅÚ4¿m‡$âX‘å%(AlZo@½¨UOÌÕ”1ø¸jÎÀÃÃ_ µ‘Ü.œº¦Ut: Æï’!=¯uwû#,“pþÇúŒø(é@?³ü¥‘Mo §—s@Œ#)§ŒùkL}NOÆêA›¸~r½¼ÙA—HJ«eˆÖ´*¡ÓpÌŸö.m<-"³ûÈ$¬_6­åf£ïÚâj1y§ÕJ½@dÞÁr&Í\Z%D£Íñ·AZ Û³øüd/ªAi†/Й~  ‡âĮҮÏh§°b—›Û«mJžòG'[ÈYýŒ¦9psl ýÁ ®±f¦x,‰½tN ‚Xª9 ÙÖH.«Lo0×?͹m¡å†Ѽ+›2ƒF ±Ê8 7Hցϓ²Æ–m9…òŸï]Â1äN†VLâCˆU .ÿ‰Ts +ÅÎx(%¦u]6AF Š ØF鈄‘ |¢¶c±soŒ/t[a¾–û:s·`i햍ê›ËchÈ…8ßÀUÜewŒðNOƒõD%q#éû\9¤x¹&UE×G¥ Í—™$ð E6-‡¼!ýpãÔM˜ Âsìe¯ñµK¢Ç¡ùôléœ4Ö£”À Š®Ðc ^¨À}ÙËŸ§›ºê{ÊuÉC ×Sr€¤’fÉ*j!úÓ’Gsùìoîßîn%ò· àc Wp÷$¨˜)û»H ×8ŽÒ€Zj¤3ÀÙºY'Ql¦py{-6íÔCeiØp‘‡XÊîÆUߢ܂ž£Xé¼Y8þ©ëgñß}é.ÎógÒ„ÃØËø¯»™§Xýy M%@NŠ À(~áÐvu7&•,Ù˜ó€uP‡^^®=_E„jt’ 403WebShell
403Webshell
Server IP : 104.225.223.251  /  Your IP : 216.73.216.41
Web Server : Apache/2.4.41 (Ubuntu)
System : Linux agtdemo03 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
User : root ( 0)
PHP Version : 7.4.3-4ubuntu2.29
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : ON
Directory :  /home/web/dev.agtindia.co.in/welker/wp-content/plugins/types/public/page/relationships/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /home/web/dev.agtindia.co.in/welker/wp-content/plugins/types/public/page/relationships//main.js
var Types = Types || {};

// the head.js object
Types.head = Types.head || head;

Types.page = Types.page || {};

// Everything related to this page.
Types.page.relationships = {};
Types.page.relationships.viewmodels = {};
Types.page.relationships.strings = {};
Types.page.relationships.urls = {};
Types.page.relationships.defaultPageTitle = document.title;

/**
 * Page controller class.
 *
 * Handles page initialization.
 *
 * @constructor
 * @since 2.0
 */
Types.page.relationships.Class = function() {

	var self = this;

	// Extend the generic listing page controller.
	Toolset.Gui.ListingPage.call( self );

	// Methods required by the generic listing page controller
	//
	//

	self.beforeInit = function() {

		var modelData = self.getModelData();
		//noinspection JSUnresolvedVariable
		Types.page.relationships.jsPath = modelData.jsIncludePath;
		Types.page.relationships.typesVersion = modelData.typesVersion;

		self.initStaticData( modelData );

		Types.page.relationships.urls = modelData.urls;

		// Set observable array for potential intermediary post types.
		self.observablePotentialIntermediaryPostTypes = ko.observable( self.modelData['potentialIntermediaryPostTypes'] );
	};

	self.loadDependencies = function( nextStep ) {
		var typesVersion = Types.page.relationships.typesVersion;
		// Continue after loading the view of the listing table.
		Types.head.load(
			Types.page.relationships.jsPath + '/viewmodels/ListingViewModel.js?ver=' + typesVersion,
			Types.page.relationships.jsPath + '/viewmodels/RelationshipViewModel.js?ver=' + typesVersion,
			Types.page.relationships.jsPath + '/viewmodels/WizardViewModel.js?ver=' + typesVersion,
			Types.page.relationships.jsPath + '/viewmodels/dialogs/DeleteRelationship.js?ver=' + typesVersion,
			Types.page.relationships.jsPath + '/viewmodels/dialogs/DeleteIntermediaryPostType.js?ver=' + typesVersion,
			Types.page.relationships.jsPath + '/viewmodels/dialogs/ConfirmChangeCardinality.js?ver=' + typesVersion,
			Types.page.relationships.jsPath + '/viewmodels/dialogs/MergeRelationships.js?ver=' + typesVersion,
			nextStep,
		);
	};

	self.getMainViewModel = function() {
		return new Types.page.relationships.viewmodels.ListingViewModel( self.getModelData().relationships );
	};

	self.initStaticData = function( modelData ) {
		Types.page.relationships.strings = modelData.strings || Types.page.relationships.strings;
		Types.page.relationships.itemsPerPage = modelData.itemsPerPage || {};
		Types.page.relationships.delete_intermediary_post_type_action = modelData.delete_intermediary_post_type_action || null;
		Types.page.relationships.delete_intermediary_post_type_nonce = modelData.delete_intermediary_post_type_nonce || null;
	};

	/**
	 * Confirms that the user is still creating the relationship
	 *
	 * @since m2m
	 */
	self.isCreatingRelationship = function() {
		return ( jQuery( '#types-wizard-relationship-screen:hidden' ).length === 0 );
	};

	/**
	 * Warn user when leaving the page with unsaved changes.
	 *
	 * @since m2m
	 */
	self.afterInit = function() {
		WPV_Toolset.Utils.setConfirmUnload( function() {
			return self.viewModel.hasUnsavedItems()
				|| self.isCreatingRelationship();
		}, null, self.getString( ['confirmUnload'] ) );

		/**
		 * Handling page change by history
		 *
		 * @since m2m
		 */
		window.addEventListener( 'popstate', function() {
			self.isNavigatingThroughHistory = true;
			openScreenFromURL();
		} );

		// Loads the URLed-page
		openScreenFromURL();

	};

	// Page-specific methods and properties
	//
	//

	var defaultAnimationLength = 200;


	self.postSlugToDisplayName = function( postSlug, label ) {
		if (!_.has( self.modelData.postTypes, postSlug )) {
			return postSlug;
		}

		return self.modelData.postTypes[postSlug][label];
	};

	self.removeDeletedIntermediaryPostType = function(removed) {
		self.observablePotentialIntermediaryPostTypes( ( self.observablePotentialIntermediaryPostTypes() ).filter( function( item ){ return item.slug !== removed } ) );
	};

	self.getPotentialIntermediaryPostTypes = function() {
		return self.observablePotentialIntermediaryPostTypes();
	};

	self.fieldTypeToIcon = function( fieldType ) {
		if (!_.has( self.modelData['fieldTypeIcons'], fieldType )) {
			return '';
		}

		return self.modelData['fieldTypeIcons'][fieldType];
	};

	/**
	 * Change the main page title.
	 *
	 * @param titleKey Name of the new string in Types.page.relationships.strings.title.
	 * @since m2m
	 */
	self.setTitle = function( titleKey ) {
		// A <span> tag is needed because there could be some buttons inside the title
		var $title = jQuery( 'div#wpbody-content > div.wrap > h1' );

		$title.fadeOut( defaultAnimationLength, function() {
			// Because of this function is in main.js, I can't use ko:visible so I use styles depending of h1.class
			$title.attr( 'class', titleKey );
			$title.find( 'span' ).text( Types.page.relationships.strings.title[titleKey] );
			$title.fadeIn();
			self.setPageTitle();
		} );
	};

	/**
	 * Sets page title, it takes history state for getting the title
	 *
	 * @since m2m
	 */
	self.setPageTitle = function() {
		var historyState = history.state;
		if (historyState) {
			if (!_.isUndefined( historyState.screen )) {
				switch (historyState.screen) {
					case 'edit':
						document.title = self.getString( ['pageTitle', 'edit'] ).replace( '%s', historyState.displayName ) + self.getString( ['pageTitle', 'sep'] ) + Types.page.relationships.defaultPageTitle;
						break;
					case 'addNew':
						document.title = self.getString( ['pageTitle', 'add'] ) + self.getString( ['pageTitle', 'sep'] ) + Types.page.relationships.defaultPageTitle;
						break;
					default:
						document.title = Types.page.relationships.defaultPageTitle;
				}
			}
		}
	};

	/**
	 * Hides WP Pointers
	 */
	self.hideWPPointers = function() {
		jQuery( '.wp-toolset-pointer' ).hide();
	};

	/**
	 * Shows a WP pointer
	 *
	 * @param {HTMLElement} el The element bounded
	 *
	 * @since m2m
	 */
	self.showPointer = function( el ) {
		var $this = jQuery( el );

		// default options
		var defaults = {
			edge: 'left', // on which edge of the element tooltips should be shown: ( right, top, left, bottom )
			align: 'middle', // how the pointer should be aligned on this edge, relative to the target (top, bottom, left, right, middle).
			offset: '15 0 ', // pointer offset - relative to the edge
		};

		// custom options passed in HTML "data-" attributes
		var custom = {
			edge: $this.data( 'edge' ),
			align: $this.data( 'align' ),
			offset: $this.data( 'offset' ),
		};

		self.hideWPPointers();
		var content = '<p>' + $this.data( 'content' ) + '</p>';
		if ($this.data( 'header' )) {
			content = '<h3>' + $this.data( 'header' ) + '</h3>' + content;
		}

		var extraClass = $this.hasClass( 'types-pointer-tooltip' ) ? ' types-pointer-tooltip' : '';

		$this.pointer( {
			pointerClass: 'wp-toolset-pointer wp-toolset-types-pointer' + extraClass,
			content: content,
			position: jQuery.extend( defaults, custom ), // merge defaults and custom attributes
		} ).pointer( 'open' );
	};

	/**
	 * Switch to the Edit Relationship screen.
	 *
	 * @param {Types.page.relationships.viewmodels.RelationshipViewModel} relationshipDefinition
	 * @since m2m
	 */
	self.editRelationship = function( relationshipDefinition ) {
		var $editScreen = jQuery( '#types-current-relationship-screen' ),
			$activeScreen = jQuery( '#toolset-page-content' ).find( '> .toolset-actual-content-wrapper > div:visible' );

		// This will cause Knockut to re-render the whole Edit Relationship template
		self.viewModel.currentRelationshipDefinition( relationshipDefinition );

		// History handling
		if (!self.isNavigatingThroughHistory) {
			history.pushState( {
					screen: 'edit',
					slug: relationshipDefinition.slug(),
					displayName: relationshipDefinition.displayName(),
				},
				null,
				Types.page.relationships.urls.edit + relationshipDefinition.slug(),
			);
		}
		self.isNavigatingThroughHistory = false;

		self.setTitle( 'edit' );

		// Display screen options which have been previously hidden and are applicable only for the Edit Relationship screen.
		jQuery( '#screen-options-link-wrap' ).show();

		var $container = jQuery( '#types_relationship_settings' ).find( 'div.inside' ),
			$settingsOverlay = $container.find( 'div.overlay' ),
			$content = $container.find( 'div.main-box-content' ),
			originalSettingsHeight = 0; // right now the height is still 0

		var overlayHeight = function() {
			// In the Settings metabox, make the heights of overlay and the main box content the same.
			// We need to resort to JavaScript because neither of the values are known, and we don't even
			// know which one is going to be bigger: http://stackoverflow.com/a/11461499
			var currentSettingsHeight = $content.height(),
				maxHeight = Math.max( $settingsOverlay.height(), currentSettingsHeight );

			// Store the original height which will be needed if user goes to the advanced edit mode.
			if (0 === originalSettingsHeight) {
				originalSettingsHeight = currentSettingsHeight;
			}

			if (maxHeight > 0) {
				// only set height, when the box is visible
				$settingsOverlay.height( maxHeight );
				$content.height( maxHeight );
			}
		};
		// For use in another scripts
		self.overlayHeight = overlayHeight;

		jQuery( '#types_relationship_settings-hide, #types_relationship_settings .hndle' ).on( 'click', function() {
			// #types_relationship_settings-hide
			//   caculate overlay height when "Settings" is activate through "Screen Options"
			// #types_relationship_settings .hndle
			//   For the case closed Settings are hidden through "Screen Options" we also need to calculate
			//   the height when the collapse toggle is used

			// the short delay is important as it took a moment until the box is fully displayed
			// (multiple delays as some machines not work with the shorter delays)
			setTimeout( function() {
				overlayHeight();
			}, 50 );
			setTimeout( function() {
				overlayHeight();
			}, 200 );
			setTimeout( function() {
				overlayHeight();
			}, 500 );
			setTimeout( function() {
				overlayHeight();
			}, 1000 );
		} );

		var displayScreen = function() {
			// We need to re-register metabox toggles because the Edit screen content
			// has just been re-rendered by knockout.
			postboxes.add_postbox_toggles( pagenow );

			// overlay height
			overlayHeight();

			// Minor adjustments of the Settings metabox.
			Toolset.hooks.addAction( 'types-relationships-enable-advanced-settings', function() {

				// Return the metabox back to the content height once the overlay is hidden.
				$content.animate( { height: originalSettingsHeight }, defaultAnimationLength );

				// Fix the column width once the table is rendered (so it doesn't change when the content changes).
				var $table = $content.find( 'table.widefat' );
				$table.find( 'td' ).each( function() {
					var currentWidth = jQuery( this ).width();
					jQuery( this ).css( 'width', currentWidth + 'px' );
				} );
			} );
		};

		if ($editScreen[0] !== $activeScreen[0]) {
			$activeScreen.first().fadeOut( defaultAnimationLength, function() {
				$editScreen.addClass( 'current' ).siblings().removeClass( 'current' );
				$editScreen.fadeIn( defaultAnimationLength, function() {
					displayScreen();
				} );
			} );
		} else {
			displayScreen();
		}
	};

	/**
	 * Show the "Delete Relationship" confirmation dialog and handle the output.
	 *
	 * Either deactivates or deletes a given relationship (or does nothing).
	 *
	 * @param relationshipDefinition
	 */
	self.deleteRelationship = function( relationshipDefinition ) {
		var dialog = Types.page.relationships.viewmodels.dialogs.DeleteRelationship( relationshipDefinition, function( result ) {
			switch (result) {
				case 'delete':
					self.showRelationships();
					self.viewModel.deleteRelationship( relationshipDefinition );
					break;
				case 'deactivate':
					relationshipDefinition.onDeactivate();
					break;
			}
		} );

		dialog.display();
	};

	/**
	 * Switch to the Relationship listing screen.
	 *
	 * @since m2m
	 */
	self.showRelationships = function() {
		var $activeScreen = jQuery( '#toolset-page-content' ).find( '> .toolset-actual-content-wrapper > div:visible' ),
			$listingScreen = jQuery( '.toolset-listing-wrapper' );

		// Hide screen options which are relevant only for the Edit Relationship screen.
		// This needs to be reapplied even if we already are on the relationship listing (first page load)
		jQuery( '#screen-options-link-wrap' ).hide();

		// When navigating through the history, user can go to the same page 'jumping' a history state
		if ($activeScreen[0] === $listingScreen[0]) {
			return;
		}

		// History handling
		if (!self.isNavigatingThroughHistory) {
			history.pushState( { screen: 'listing' }, null, Types.page.relationships.urls.listing );
		}
		self.isNavigatingThroughHistory = false;

		self.setTitle( 'listing' );

		$activeScreen.fadeOut( defaultAnimationLength, function() {
			$listingScreen.addClass( 'current' ).siblings().removeClass( 'current' );

			$listingScreen.fadeIn( defaultAnimationLength );

			// Clear all actions on the Edit Relationship screen because they're going to be recreated if needed.
			Toolset.hooks.removeAction( 'types-relationships-enable-advanced-settings' );

			Toolset.hooks.doAction( 'types-relationships-switch-to-relationship-listing' );
		} );
	};

	/**
	 * Shows Add New Relationship Wizard
	 *
	 * @since m2m
	 */
	self.showAddNewRelationshipWizard = function() {
		var $wizardScreen = jQuery( '#types-wizard-relationship-screen' );
		var $activeScreen = jQuery( '#toolset-page-content' ).find( '> .toolset-actual-content-wrapper > div:visible' );

		// Hide screen options which are relevant only for the Edit Relationship screen.
		// This needs to be reapplied even if we already are on the relationship listing (first page load)
		jQuery( '#screen-options-link-wrap' ).hide();

		// When navigating through the history, user can go to the same page 'jumping' a history state
		if ($activeScreen[0] === $wizardScreen[0]) {
			return;
		}

		if (!self.isNavigatingThroughHistory) {
			history.pushState( { screen: 'addNew' }, null, Types.page.relationships.urls.addNew );
		}
		self.isNavigatingThroughHistory = false;

		self.setTitle( 'wizard' );

		$activeScreen.fadeOut( defaultAnimationLength, function() {
			$wizardScreen.addClass( 'current' ).siblings().removeClass( 'current' );

			$wizardScreen.fadeIn( defaultAnimationLength );
			Toolset.hooks.doAction( 'types-relationships-wizard-enter' );
			jQuery( '#post-body-content' ).show();
		} );
	};

	/**
	 * Is navigating through the browser history?
	 *
	 * @since m2m
	 */
	self.isNavigatingThroughHistory = false;

	/**
	 * Gets the current page from the URL
	 *
	 * @since m2m
	 */
	var openScreenFromURL = function() {
		// Gets parameters from document.location
		var action = WPV_Toolset.Utils.getParameterByName( 'action' );
		var slug = WPV_Toolset.Utils.getParameterByName( 'slug' );
		var callback;
		switch (action) {
			case 'edit':
				if (slug) {
					var model = _.find(
						Types.page.relationships.main.viewModel.items(),
						function( model ) {
							return model.slug() === slug;
						},
					);
					if (typeof ( model ) !== 'undefined') {
						callback = function() {
							self.editRelationship( model );
						};
					}
				}
				break;
			case 'add_new':
				callback = function() {
					self.showAddNewRelationshipWizard();
				};
				break;
			default:
				callback = function() {
					self.showRelationships();
				};
				break;
		}
		callback();
	};

	/**
	 * Handles all the interaction with the server.
	 *
	 * @type {{action: {update: string}, doAjax: Types.page.relationships.Class.ajax.doAjax}}
	 */
	self.ajax = {

		// Actions recognized by the server.
		action: {
			update: 'update',
			create: 'create',
			delete: 'delete',
			cardinality: 'cardinality',
		},

		/**
		 * Perform an AJAX call.
		 *
		 * @param {string} actionName One of the names defined in self.ajax.action.
		 * @param {RelationshipViewModel|[RelationshipViewModel]} relationships One or more relationships
		 *     to perform the action on.
		 * @param {function} successCallback Callback that gets the AJAX response if the call succeeds.
		 * @param {function} failCallback Optional callback for the case of failure. If not provided,
		 *     successCallback will be used.
		 *
		 * @since m2m
		 */
		doAjax: function( actionName, relationships, successCallback, failCallback ) {

			if (!_.isArray( relationships )) {
				relationships = [relationships];
			}

			var ajaxData = {
				action: 'types_relationships_action',
				relationship_action: actionName,
				wpnonce: self.modelData.nonce,
				relationship_definitions: relationships,
			};

			if (typeof ( failCallback ) === 'undefined') {
				failCallback = successCallback;
			}

			jQuery.post( {
				async: true,
				url: ajaxurl,
				data: ajaxData,

				success: function( originalResponse ) {
					var response = WPV_Toolset.Utils.Ajax.parseResponse( originalResponse );

					self.debug( 'AJAX response', ajaxData, originalResponse );

					if (response.success) {
						successCallback( response, response.data || {} );
					} else {
						failCallback( response, response.data || {} );
					}
				},

				error: function( ajaxContext ) {
					console.log( 'Error:', ajaxContext.responseText );
					failCallback( { success: false, data: {} }, {} );
				},
			} );
		},
	};

};

// noinspection JSUnusedLocalSymbols
/**
 * Role slugs format
 *
 * @link https://stackoverflow.com/a/15926931
 */
ko.bindingHandlers.formatSlug = {
	init: function( element, valueAccessor, allBindingsAccessor ) {
		ko.utils.registerEventHandler( element, 'focusout', function() {
			var observable = valueAccessor()[0];
			var role = valueAccessor()[1];
			var value = jQuery( element ).val();
			var newValue = observable( value );
			// Have tried using ko but I don't know why I couldn't.
			var $alert = jQuery( element ).parents( 'div, td' ).find( '[data-slug="' + role + '"]' );
			if (!!value && !newValue.length) {
				$alert.slideDown();
				setTimeout( function() {
					$alert.slideUp();
				}, 4000 );
			} else {
				$alert.slideUp();
			}

			jQuery( element ).val( newValue );
			jQuery( element ).trigger( 'keyup' );
		} );
	},
	update: function( element, valueAccessor ) {
		var value = ko.utils.unwrapObservable( valueAccessor()[0] );
		if (typeof value !== 'function') {
			jQuery( element ).val( value );
		}
	},
};

// Make everything happen.
Types.page.relationships.main = new Types.page.relationships.Class( jQuery );
Types.head.ready( Types.page.relationships.main.init );

Youez - 2016 - github.com/yon3zu
LinuXploit