<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Goran Obradovic&#039;s blog</title>
	<atom:link href="http://blog.goranobradovic.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.goranobradovic.com</link>
	<description>...and so you code...</description>
	<lastBuildDate>Sun, 05 Feb 2012 00:15:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Why uptime on WP7 cannot be longer than 24.9 days?</title>
		<link>http://blog.goranobradovic.com/2012/01/why-uptime-on-wp7-cannot-be-longer-than-24-9-days/</link>
		<comments>http://blog.goranobradovic.com/2012/01/why-uptime-on-wp7-cannot-be-longer-than-24-9-days/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 09:12:37 +0000</pubDate>
		<dc:creator>obrad</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Computers]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Smartphones]]></category>
		<category><![CDATA[Zanimljivosti]]></category>
		<category><![CDATA[Uptime]]></category>
		<category><![CDATA[Windows Phone 7]]></category>
		<category><![CDATA[WP7]]></category>

		<guid isPermaLink="false">http://blog.goranobradovic.com/?p=505</guid>
		<description><![CDATA[This morning I saw in System View on my Samsung Omnia 7 that uptime is “more than 24.9 days”, and boot time is “earlier than 30-Dec-11 13:07:24”. At first I was amazed, how can it be “earlier than”, and how that reference in time is not fixed (it was 29-Dec yesterday). Then I realized that [...]]]></description>
			<content:encoded><![CDATA[<p>This morning I saw in <a href="http://www.windowsphone.com/en-US/apps/7abbac8f-068c-e011-986b-78e7d1fa76f8" target="_blank">System View</a> on my Samsung Omnia 7 that uptime is “more than 24.9 days”, and boot time is “earlier than 30-Dec-11 13:07:24”. At first I was amazed, how can it be “earlier than”, and how that reference in time is not fixed (it was 29-Dec yesterday). Then I realized that phone does not “remember” its time of boot, but has some sort of incrementing register for counting uptime, and it hits its limit on 24.9 days. It would be interesting for how long this phone can work without reboot, as it seems very stable, but it seems that cannot be known without manual recording of boot time <img class="wlEmoticon wlEmoticon-disappointedsmile" src="http://blog.goranobradovic.com/wp-content/uploads/wlEmoticon-disappointedsmile.png" alt="Disappointed smile" />.</p>
<p>I did some calculations, and it seems that phone is using SIGNED int as register value which counts number of MILISECONDS since boot. As 25 days has about 2’160’000’000 milliseconds, and 2^31 is 2’147’483’648, it starts to seem logical where did number 24.9 days came from <img class="wlEmoticon wlEmoticon-nerdsmile" src="http://blog.goranobradovic.com/wp-content/uploads/wlEmoticon-nerdsmile.png" alt="Nerd smile" />. It is logical that boot time itself is not recorded, as there it would be a possibility of reporting “fake” uptimes by setting the clock on the phone. However, in my opinion, method used is also not optimal.</p>
<p>So, what could be better here? <img class="wlEmoticon wlEmoticon-lightbulb" src="http://blog.goranobradovic.com/wp-content/uploads/wlEmoticon-lightbulb.png" alt="Light bulb" /></p>
<blockquote><p>- For start, it could be unsigned int, so the OS would be able to keep track for more than 49 days of uptime.<br />
- It could also count seconds instead of milliseconds, that would make possible to count more than 1300 years of uptime <img class="wlEmoticon wlEmoticon-smile" src="http://blog.goranobradovic.com/wp-content/uploads/wlEmoticon-smile3.png" alt="Smile" />, or if for some reason needs to keep milliseconds (i.e. does not want to break all existing functionalities?), unsigned long (int64) could be used (although I don’t remember if it is available in WP7), to give overkilling amount of almost 585 millions of years <img class="wlEmoticon wlEmoticon-hotsmile" src="http://blog.goranobradovic.com/wp-content/uploads/wlEmoticon-hotsmile.png" alt="Hot smile" />.</p></blockquote>
<p>All this considered, it seems that 49 days would be enough, change would not break anything, and it requires changing only one variable declaration.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.goranobradovic.com/2012/01/why-uptime-on-wp7-cannot-be-longer-than-24-9-days/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vikend akcija (Nova perspektiva)</title>
		<link>http://blog.goranobradovic.com/2011/11/vikend-akcija/</link>
		<comments>http://blog.goranobradovic.com/2011/11/vikend-akcija/#comments</comments>
		<pubDate>Sun, 06 Nov 2011 14:16:51 +0000</pubDate>
		<dc:creator>obrad</dc:creator>
				<category><![CDATA[Borba protiv vjetrenjača]]></category>
		<category><![CDATA[Moje brljotine]]></category>
		<category><![CDATA[Zanimljivosti]]></category>
		<category><![CDATA[Ajvar]]></category>
		<category><![CDATA[Laž]]></category>
		<category><![CDATA[Marketing]]></category>
		<category><![CDATA[Maxi]]></category>
		<category><![CDATA[Tempo]]></category>

		<guid isPermaLink="false">http://blog.goranobradovic.com/?p=484</guid>
		<description><![CDATA[Nova perspektiva vikend akcije - odgovor Tempo PR službe.]]></description>
			<content:encoded><![CDATA[<p>Mnogi su, vjerujem, dobili protekle sedmice sms poruku identičnog sadržaja kao i ja:</p>
<blockquote><p>Vikend akcija: U Tempu u petak 4.11. Duel 3kg-6.00KM. U Maxiju, u petak 4.11. batak sa karabatakom 4.55KM/kg, a u subotu 5.11. Premia ajvar 720ml-2.45KM.</p>
<p style="text-align: right;">TempoMaxi</p>
</blockquote>
<p style="text-align: left;">Meni je ova poruka stigla u četvrtak, 3.11. u 12:47. Da ne bude zabune, svi oni koji nisu primili ovu poruku, mogu vidjeti o čemu govorim na stranici <a href="http://www.maxi.ba/akcija/vikend-akcija/">http://www.maxi.ba/akcija/vikend-akcija/</a>, ali pošto očekujem da će i ona uskoro biti zamijenjena akcijom za idući vikend, evo trenutni izgled:</p>
<div id="attachment_485" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.goranobradovic.com/wp-content/uploads/maxivikendakcija20111106.png"><img class="size-medium wp-image-485" title="Maxi vikend akcija 05.11.2011." src="http://blog.goranobradovic.com/wp-content/uploads/maxivikendakcija20111106-300x240.png" alt="" width="300" height="240" /></a><p class="wp-caption-text">Slika maxi web sajta na dan 06.11.2011., u 12:50</p></div>
<p style="text-align: left;"> Nije prvi put da primam ovu obavijest <span style="color: #c0c0c0;">(iako nisam dobio potrošačku karticu, kada sam došao po nju nisu je mogli pronaći, pa su mi ljubazno ponudili da ponovo popunim pristupnicu, što je za mene uvreda i znak nepoštovanja jer već imaju podatke u sistemu (kako mi inače šalju sms i e-mail?), tako da sam ostao bez iste, a i nije da sam nešto i propustio)</span>, ali pošto se ne sjećam da sam prije viđao artikle najavljene na akciji u Tempu, a volim ajvar (naročito ljuti), odlučio sam da, prilikom subotnjeg odlaska u kupovinu, usput iskoristim i ovu ponudu za ajvar.</p>
<p style="text-align: left;">Došla subota, došao i ja u Tempo sa porodicom, i dok je žena kupovala ono što treba, ja sam vozao bebu, obilazio promocije i razgledao. Interesantan za pomenuti je bio štand čokolade &#8220;Najljepše želje&#8221;, gdje je vršena promotivna degustacija proizvoda od crne čokolade. Nakon što sam odbio da probam istu (jer sam je već jeo mnogo puta) i otišao da kupim nekoliko primjeraka modela sa narančom, bio sam iznenađen činjenicom da ne mogu da nađem baš te čokolade. Vratim se do štanda i pitam ih gdje se nalaze te čokolade pošto hoću da kupim, i dobijem odgovor od hostese da ih nema u prodaji!?</p>
<blockquote>
<p style="text-align: left;">- Kako nema, ja sam ih kupovao već mnogo puta?</p>
<p style="text-align: left;"> - Nema, nestalo, ostale su još ove gratis.</p>
</blockquote>
<p style="text-align: left;">Ne znam koja logika stoji iza toga, a voljeo bih znati, da neko zaposli hostesu (zapravo dvije hostese) da vrši (vrše) promociju proizvoda koji se ne može kupiti u supermarketu koji je mjesto promocije?</p>
<p style="text-align: left;">Da se ja vratim ajvaru, vidim stoji Premia ajvar među ostalim stvarima koje su na vikend akciji, cijena 3,40KM. Odem na informacije i pokažem im poruku koju su mi poslali uz pitanje gdje je ovaj ajvar, i dobijem tumačenje poruke &#8211; u Tempu je akcija bila u petak, i u akciju je uključen Duel. Ajvar je na akciji u Maxiju, jer se taj dio poruke za subotu nadovezuje na onaj od petka koji se odnosi na Maxi. Jeste, stvarno, čitao sam poruku kao običan čovjek a ne kao inženjer, jer sam odmah trebao da vidim da je to za Maxi. Dobro, izvininem se ja i zahvalim na tumačenju. Kaže mi djevojka niste jedini, mnogi su pitali od jutros, već sam ja zvala marketing da ne šalju dvosmislene poruke.</p>
<p style="text-align: left;">Nakon završene kupovine povedem svoje ukućane u šetnju, i kad smo bili pored Maxi-ja u Boriku, oko 16h, uđem da vidim gdje je taj ajvar. Tamo ajvar izložen, na njemu ona crvena cijena za posebne ponude &#8211; 3.40KM. Na informacijama nema nikoga. Pitam radnicu na kasi: &#8220;Gdje vam je ajvar iz ove poruke?&#8221;</p>
<blockquote>
<p style="text-align: left;">- &#8220;Imamo problem sa programom, znate, nismo uspjeli postaviti cijenu, ali možda će biti do kraja dana&#8230;&#8221;</p>
</blockquote>
<p style="text-align: left;">Što se mene tiče može i biti. Ko je planirao u kupovinu do 16h je obavio. A mnogo ljudi je došlo u Maxi (a i u Tempo sudeći po tome što su pitali), i sigurno je da mnogi od njih ne bi ni došli u kupovinu da su znali da je poruka laž. Dakle, sa stanovišta uspješnosti &#8211; uspješna kampanja, mora se priznati. Samo, ono što mi nikako nije jasno, a nadam se da će neko od vas znati da mi to kaže, dragi čitaoci, je kako taj Tempo/Maxi planira poslati sledeći vikend neku ponudu? Zašto misli da će iko da im vjeruje i da dođe? Meni lično ne smeta što je ajvar bio 3.40, ali mi jako smeta što to nije pisalo i u poruci.  Zar se isplati zbog 50 kupaca više koji su došli jedan vikend trajno izgubiti tih 50 kupaca? Ili oni misle da su ljudi ovce, pa kad trpe ovakvu državu i tolike laži pred izbore, mogu i ovakve marketinške kampanje? Možda su i u pravu, možda dobiju nove stalne klijente. Šta vi mislite o tome? I da li je neko uspio ne ispasti ovca i kupiti ajvar po reklamiranoj cijeni?</p>
<h2 style="text-align: left;"><strong>14.11.2011 &#8211; Nova perspektiva</strong></h2>
<p>Nakon što sam napisao ovaj članak, bio sam ubijeđen da je razlog svemu to što Delta (odnosno Delez) kompaniju-grupu nije toliko briga za pojedinačne kupce već da se sve odvija kao i kod drugih &#8220;biznisa&#8221; na Balkanu &#8211; profit je na prvom mjestu, ako se negdje omakne nezadovoljan kupac, nema veze &#8211; ima kupaca. Ono što izgleda u Delezu znaju, a što većina odlučujućih fakotra koji vode &#8220;biznise&#8221; ne zna je da dugoročno profit najviše zavisi od stava prema kupcima i od toga koliko se kupac osjeća bitnim i posebnim (jedna od bitnih stavki u Apple-ovim marketinškim kampanjama, a Apple nije bez razloga trenutno najvrijednija kompanija na tržištu). Dakle, nakon što sam napisao članak prošli vikend, kliknuo sam na link u mailu da se odjavim sa mailing liste (kakva mi je korist da čitam ako informacije nisu tačne?) i dobijem poruku o grešci (samo error bez objašnjenja). Zbog toga sam ostavio komentar na stranici, i poučen dosadašnjim iskustvom sa sličnim formularima nisam mislio da će ga iko ikada pročitati. Zbog toga je moje iznenađenje bilo još veće kada sam u srijedu, 9. novembra dobio sledeći e-mail (izvorni tekst s tim da sam ja konvertovao naše znakove š i ž i uklonio svoj broj telefona):</p>
<blockquote><p>Poštovani,</p>
<p>Prije svega veliko izvinjenje zbog svih neugodnosti koje ste doživjeli u našim marketima!</p>
<p>Vašu e mail adresu ste uspješno izbrisali iz naše baze podataka i ubuduće nećete primate naša e mail obavještenja (ne znam zbog čega dobijate obavještenje “error”)</p>
<p>U bazi &#8220;Klub osmijeha&#8221;, na Vaše ime registrovan je broj 387 65 /<em>moj broj telefona</em>/. Ovaj broj smo takođe izbrisali iz baze za slanje poruka. Unaprijed se izvinjavamo jer smo nalog za slanje porukama za ovosedmičnu akciju u kome se nalazi i Vaš broj već poslali, ali nakon sutrašnje poruke, nećete više biti na našim listama. Ukoliko imamo pogrešan broj, zamolila bih Vas da mi dostavite broj na koji ne želite primati naše poruke.</p>
<p>Pročitala sa Vaš post na blogu koji se odnosi na našu vikend akciju tj na neugodnosti koje ste doživjeli u našim marketima. Za jedan dan bilo ih je isuviše! Mogu da Vam ponudim samo izvinjenje i objašnjenje ukoliko Vam nešto znači.</p>
<p>U subotu u Maxi marketu u Boriku zaista jestu imali problem sa programom koji koriste što naravno nije opravdanje za postavljanje stare umjesto akcijske cijene na proizvodu koji ste željeli da kupite (Premia ajvar). Dakle, naša greška je što ponuda (ajvar) nije bila uklonjena jer zbog tehničkih problema u sistemu nismo bili u mogućnosti da kupcima ajvar prodajemo po cijeni od 2.45KM što je bila predviđena akcijska cijena kao što ste bili i obaviješteni.</p>
<p>Kada je riječ o sms obavještenjima do sada nismo imali pritužbe na nejasnoću tj. konfuznost samih obavještenja ali ćemo u buduće svakako obratiti pažnju na ovo.</p>
<p>Kada je riječ o kartici Kluba osmijeha, još jednom Vam se izvinjavam! Ukoliko želite možemo Vam poslati novu karticu, ovog puta na kućnu adresu .</p>
<p>Organizaciju promocija ne radimo direkno mi, ali je pravilo da se ne rade promocije proizvoda koji se ne mogu kupiti u marketu, upravo iz razloga koji se Vama desio. Potrudićemo se da se ovakve situacije ne ponove.</p>
<p>Još jednom Vam se zahvaljujem na informacijama koje ste nam poslali tj objavili u Vašem postu. Sve te informacije sam proslijedila kolegama iz prodaje kako bi mogli da otklone nedostatke koje ste naveli.</p>
<p>Još jednom Vam se izvinjavam zbog svih neugodnosti koje ste Vi i Vaša porodica doživjeli u našim marketima.</p>
<p>S poštovanjem,</p>
<p>Dijana Milanković Kusturić<br />
PR menadžer<br />
Delez Grupa Srbija, Bosna i Hercegovina i Crna Gora</p></blockquote>
<p>Prvo, moram da priznam da nisam očekivao da ću ovo doživjeti u Bosni i Hercegovini. Tačno poželim da i u državnim službama zaposle više ovako pismenih ljudi da odgovaraju građanima na primjedbe i pitanja, pa kad već &#8220;nisu u mogućnosti&#8221; ispraviti nešto (nemoguća misija je promijeniti radni tok u nekoj državnoj instituciji, od upisa u knjigu rođenih do upisa u knjigu umrlih, službenici koji tamo ništa ne rade uvijek imaju jake razloge zašto rade upravo tako) pa da se čovjek ne osjeća kao stoka kada dobije odgovor na primjedbu, ako već mora kao stoka da stoji u redovima za dokumente i uvjerenja.</p>
<p>Da se vratim na temu, Tempo ima osobu koja čita vaše primjedbe, i čini se da ne ostaje sve samo na odgovoru, (npr. ovaj vikend nije bilo promocije najljepših želja od tamne čokolade, ali nažalost nije još ni stigla čokolada <img src='http://blog.goranobradovic.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ). I vi svoje primjedbe na Tempo/Maksi možete ostaviti <a title="Tempo.ba knjiga utisaka" href="http://tempo.ba/potrosacki-servis/knjiga-utisaka/" target="_blank">ovdje</a>.</p>
<p>Kako sam kasnije saznao, moj tata je u Novom Gradu iskoristio ovu akciju, a već sledeći vikend je ista akcija napravljena u Tempo marketima (i stvarno je bio ljuti ajvar po reklamiranoj cijeni), tako da je potpuno isključena mogućnost da se radilo o bilo kakvoj namjernoj prevari. Takođe, odgovora koji sam dobio na svoju primjedbu ne bi se postidjela čak ni njemačka ili švicarska kompanija (a greška može ipak da se dogodi svakome). Na ovom polju, ima konkurencije koja bi mogla učiti od Tempa (nekima je jedini način da kupci stupe u kontakt s njima upisivanje u knjigu primjedbi na licu mjesta, što većina onih koji pišu po njoj ne koristi za tu svrhu), ali ima i svijetlih primjera koji pokušavaju otići čak i korak dalje u pružanju mogućnosti za kontaktiranje (npr. besplatni 0800 info telefon, ali ne znam da li ih iko zove, a ja nisam zvao pa ne znam da li se javlja živa osoba).</p>
<p>Čisto radi poređenja odnosa ka kupcima opisaću svoj nedavni doživljaj u jednoj od poznatijih banjalučkih prodavnica laptopa i druge IT opreme, gdje sam često kupovao i već sam bio poznat i radnicima i šefu. Ušao sam tamo da tražim brz usb flash disk. Ponudili su mi svoj standardni, Transcend, ili Kingston (oba najjeftiniji i najsporiji mogući modeli). Rekao sam da mi ne treba takav disk, jer takav već imam, potreban mi je brz, ako je to sve što imaju, onda bih da naručim neki brži model pa da dođem po njega kada ga nabave. Na to sam od šefa dobio odgovor tipa &#8220;ne možemo mi naručivati nešto što nema u asortimanu našeg dobavljača, a sa drugim dobavljačima ne radimo jer mi sad tebi naručimo stik, nakon 6 mjeseci taj dobavljač propadne i kome ćemo mi reklamirati tvoj stik ako se pokvari?&#8221; Nije mi baš bilo jasno šta će biti ako za 6 mjeseci propadne njihov trenutni dobavljač i kome će onda reklamirati robu, ali mi je bilo jasno da njima nije mnogo stalo da prošire svoj posao, već samo da održe trenutno stanje (interesantan cilj u doba današnje tržišne ekonomije), ili su možda ubijeđeni da će kupac ako nema ono što on hoće kupiti ono što oni imaju. Uglavnom, sada mislim da zbog stvari koje se mogu kupiti preko ebay-a, ne treba ni ulaziti u lokalne prodavnice.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.goranobradovic.com/2011/11/vikend-akcija/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Check which rule is not fullfiled in jQuery validate plugin</title>
		<link>http://blog.goranobradovic.com/2011/10/check-which-rule-is-not-fullfiled-in-jquery-validate-plugin/</link>
		<comments>http://blog.goranobradovic.com/2011/10/check-which-rule-is-not-fullfiled-in-jquery-validate-plugin/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 14:11:40 +0000</pubDate>
		<dc:creator>obrad</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Validation]]></category>

		<guid isPermaLink="false">http://blog.goranobradovic.com/?p=480</guid>
		<description><![CDATA[Recently, I have encountered a situation where I used jQuery validation plugin and needed to know which of validation rules are failing. After asking this question on http://stackoverflow.com/questions/7648727/jquery-validate-check-which-rule-is-not-fullfiled and receiving no answers for 15 days, I have spent some time to solve it by myself. It turned out quite easy, after inspecting source code of plugin on https://github.com/jzaefferer/jquery-validation/blob/master/jquery.validate.js, [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, I have encountered a situation where I used jQuery validation plugin and needed to know which of validation rules are failing. After asking this question on <a title="StackOverflow" href="http://stackoverflow.com/questions/7648727/jquery-validate-check-which-rule-is-not-fullfiled" target="_blank">http://stackoverflow.com/questions/7648727/jquery-validate-check-which-rule-is-not-fullfiled</a> and receiving no answers for 15 days, I have spent some time to solve it by myself.</p>
<p>It turned out quite easy, after inspecting source code of plugin on <a title="github" href="https://github.com/jzaefferer/jquery-validation/blob/master/jquery.validate.js" target="_blank">https://github.com/jzaefferer/jquery-validation/blob/master/jquery.validate.js</a>, I have found out that this can be done by adding my own function to it:</p>
<p>&nbsp;</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$.<span style="color: #660066;">validator</span>.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">ruleValidationStatus</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> element <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    element <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span>element<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> rules <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span>element<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">rules</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> errors <span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> method <span style="color: #000066; font-weight: bold;">in</span> rules <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> rule <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> method<span style="color: #339933;">:</span> method<span style="color: #339933;">,</span> parameters<span style="color: #339933;">:</span> rules<span style="color: #009900;">&#91;</span>method<span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #003366; font-weight: bold;">var</span> result <span style="color: #339933;">=</span> $.<span style="color: #660066;">validator</span>.<span style="color: #660066;">methods</span><span style="color: #009900;">&#91;</span>method<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">,</span> element.<span style="color: #660066;">value</span>.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/\r/g</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> element<span style="color: #339933;">,</span> rule.<span style="color: #660066;">parameters</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            errors<span style="color: #009900;">&#91;</span>rule.<span style="color: #660066;">method</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> result <span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">catch</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066; font-weight: bold;">return</span> errors<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>This function returns list of validation rules with their results, and usage is simple:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#myform&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">validate</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ruleValidationStatus</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#myField&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.goranobradovic.com/2011/10/check-which-rule-is-not-fullfiled-in-jquery-validate-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simplify common data access functions by using Entity Framework extension points</title>
		<link>http://blog.goranobradovic.com/2011/09/simplify-data-access-by-using-entity-framework-extension-points/</link>
		<comments>http://blog.goranobradovic.com/2011/09/simplify-data-access-by-using-entity-framework-extension-points/#comments</comments>
		<pubDate>Sat, 17 Sep 2011 23:58:20 +0000</pubDate>
		<dc:creator>obrad</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[Code First]]></category>

		<guid isPermaLink="false">http://blog.goranobradovic.com/?p=441</guid>
		<description><![CDATA[&#160; Whenever there is a new project with database, there is substantial amount of time spent on design of that database, as changes to database later cause much more overhead and problems than in beginning. In today’s conditions, however, it is very rare that database schema is not changed even during implementation (or immediately after [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>Whenever there is a new project with database, there is substantial amount of time spent on design of that database, as changes to database later cause much more overhead and problems than in beginning. In today’s conditions, however, it is very rare that database schema is not changed even during implementation (or immediately after deployment <img class="wlEmoticon wlEmoticon-smile" style="border-style: none;" src="http://blog.goranobradovic.com/wp-content/uploads/wlEmoticon-smile2.png" alt="Smile" />). That is one of reasons why we now have CodeFirst workflow in EntityFramework.  It is great to have one common set of properties in one place (base object) inherited into all tables (i.e. UserCreated, DateCreated etc), and not having to think about it in individual objects.</p>
<p>It is even better to have all logic that uses those common properties in one place, but that tends to be hard to implement if repository pattern is used with all “common” logic implemented in common repository containing basic CRUD operations and data context as a dependency object. The problem is that each repository will inherit from common repository, and all will have “same” behavior, but EF allows you to save complex objects at once, and this can make your life bitter when you have common repository. The thing is, your custom behavior is executed for object you are saving, but not for referenced objects which are also saved when you add or update your main object. Workaround is to have instance of repository for each type which is referenced in your main object, save each first through “its” repository, and then save your main object which references all of them. As thing always can be made better (and better is more simple for me), I tried to find an answer for this problem. My answer is on <a title="go.DB.JournalingBase" href="https://github.com/goranobradovic/go.DB.JournalingBase" target="_blank">github</a> and if you are interested check it out (it has sample which works out of the box), and read description here.</p>
<p>There is a simple solution for this problem – common repository is code first context! It has couple of extension points (virtual methods left which can be overriden) where you can implement your own logic to handle journaling, validation, business rules… Almost everyone who worked with CF has used (overriden) OnModelCreating method, as it is very common in tutorials, but there are couple more:</p>
<p><span style="font-family: Arial;">bool ShouldValidateEntity(DbEntityEntry entityEntry) </span></p>
<p>System.Data.Entity.Validation.DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary&lt;object, object&gt; items)</p>
<p>int SaveChanges()</p>
<p>ShouldValidateEntity and ValidateEntity are usefull places to call from your business rules and all possible validators, as there is no way that something will go to database by not passing through these (often ignored methods). These extension points are fairly simple to use and domain-specific, and I will not write about them in this post. My target of interest is SaveChanges.</p>
<p>go.DB.JournalingBase is simple project featuring usage of EntityFramework CodeFirst and overriding SaveChanges method of DBContext in order to keep record of changes on entities in database. There is a simple usage sample project and a test project with couple of test cases to confirm that everything is working. Database is SQLCompact, so no SQL Server is necessary and everything works on “F5”.</p>
<p>This is the idea: I have one “base” object &#8211; JEntity from my database objects inherit, and have corresponding DBContext, from which my repository(ies) inherit. Common object has Id property and other common properties I want all my journaling objects to have:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> abstract <span style="color: #6666cc; font-weight: bold;">class</span> JEntity
    <span style="color: #008000;">&#123;</span>
        <span style="color: #008080; font-style: italic;">/// &amp;lt;summary&amp;gt;</span>
        <span style="color: #008080; font-style: italic;">/// Gets or sets the id.</span>
        <span style="color: #008080; font-style: italic;">/// &amp;lt;/summary&amp;gt;</span>
        <span style="color: #008080; font-style: italic;">/// &amp;lt;value&amp;gt;The id.&amp;lt;/value&amp;gt;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">int</span> Id <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">/// &amp;lt;summary&amp;gt;</span>
        <span style="color: #008080; font-style: italic;">/// Gets or sets the original id.</span>
        <span style="color: #008080; font-style: italic;">/// &amp;lt;/summary&amp;gt;</span>
        <span style="color: #008080; font-style: italic;">/// &amp;lt;value&amp;gt;The original id.&amp;lt;/value&amp;gt;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">int</span> OriginalId <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">/// &amp;lt;summary&amp;gt;</span>
        <span style="color: #008080; font-style: italic;">/// Gets or sets the date created.</span>
        <span style="color: #008080; font-style: italic;">/// &amp;lt;/summary&amp;gt;</span>
        <span style="color: #008080; font-style: italic;">/// &amp;lt;value&amp;gt;The date created.&amp;lt;/value&amp;gt;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> DateTime DateCreated <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">/// &amp;lt;summary&amp;gt;</span>
        <span style="color: #008080; font-style: italic;">/// Gets or sets the date deleted.</span>
        <span style="color: #008080; font-style: italic;">/// &amp;lt;/summary&amp;gt;</span>
        <span style="color: #008080; font-style: italic;">/// &amp;lt;value&amp;gt;The date deleted.&amp;lt;/value&amp;gt;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> DateTime<span style="color: #008000;">?</span> DateDeleted <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">/// &amp;lt;summary&amp;gt;</span>
        <span style="color: #008080; font-style: italic;">/// Gets or sets the user created.</span>
        <span style="color: #008080; font-style: italic;">/// &amp;lt;/summary&amp;gt;</span>
        <span style="color: #008080; font-style: italic;">/// &amp;lt;value&amp;gt;The user created.&amp;lt;/value&amp;gt;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> UserCreated <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">/// &amp;lt;summary&amp;gt;</span>
        <span style="color: #008080; font-style: italic;">/// Gets or sets the user deleted.</span>
        <span style="color: #008080; font-style: italic;">/// &amp;lt;/summary&amp;gt;</span>
        <span style="color: #008080; font-style: italic;">/// &amp;lt;value&amp;gt;The user deleted.&amp;lt;/value&amp;gt;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> UserDeleted <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span></pre></div></div>

<p></code></p>
<p>This object has OriginalId property, as a reference to “original” object – the first one that was added to database. When objects are updated, new version is created each time, “old” object is marked as deleted (DateDeleted is set in this case). All versions of same object share same OriginalId value, which is the same as Id value of oldest version.</p>
<p>Mapping to database is done using IEntityMap class, so this one is clean and simple, and does not have database metadata. The reason is that in real life you often have to refactor your code and change something. If model is created from metadata, then any change will cause your existing database to be “broken” and you will have to recreate it. This is good strategy in the beginning when you initialize your database with test data every time and test through unit tests, but if you have some staging environment where application is deployed and tested by users/testers they may have problems with that (whereee areee all thoose records I entered in friday?? <img class="wlEmoticon wlEmoticon-smile" style="border-style: none;" src="http://blog.goranobradovic.com/wp-content/uploads/wlEmoticon-smile2.png" alt="Smile" />). This is especially important if you are making some serious enterprise application that will have longer lifecycle, and you want to make support easier (we do not want to have a “bomb” which will delete production database).<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> IEntityMap<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #008080; font-style: italic;">//// Primary key</span>
		<span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">HasKey</span><span style="color: #008000;">&#40;</span>t <span style="color: #008000;">=&gt;</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">Id</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
		<span style="color: #008080; font-style: italic;">//// Properties</span>
&nbsp;
		<span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Property</span><span style="color: #008000;">&#40;</span>t <span style="color: #008000;">=&gt;</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">OriginalId</span><span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">.</span><span style="color: #0000FF;">IsRequired</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
		<span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Property</span><span style="color: #008000;">&#40;</span>t <span style="color: #008000;">=&gt;</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">DateCreated</span><span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">.</span><span style="color: #0000FF;">IsRequired</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
		<span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Property</span><span style="color: #008000;">&#40;</span>t <span style="color: #008000;">=&gt;</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">DateDeleted</span><span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">.</span><span style="color: #0000FF;">IsRequired</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
		<span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Property</span><span style="color: #008000;">&#40;</span>t <span style="color: #008000;">=&gt;</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">UserCreated</span><span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">.</span><span style="color: #0000FF;">IsRequired</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">.</span><span style="color: #0000FF;">HasMaxLength</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">50</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
		<span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Property</span><span style="color: #008000;">&#40;</span>t <span style="color: #008000;">=&gt;</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">UserDeleted</span><span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">.</span><span style="color: #0000FF;">IsOptional</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">.</span><span style="color: #0000FF;">HasMaxLength</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">50</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
		<span style="color: #008080; font-style: italic;">//// Column mappings</span>
		<span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Property</span><span style="color: #008000;">&#40;</span>t <span style="color: #008000;">=&gt;</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">Id</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">HasColumnName</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Id&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
		<span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Property</span><span style="color: #008000;">&#40;</span>t <span style="color: #008000;">=&gt;</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">DateCreated</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">HasColumnName</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;DateCreated&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
		<span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Property</span><span style="color: #008000;">&#40;</span>t <span style="color: #008000;">=&gt;</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">OriginalId</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">HasColumnName</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;OriginalId&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
		<span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Property</span><span style="color: #008000;">&#40;</span>t <span style="color: #008000;">=&gt;</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">DateDeleted</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">HasColumnName</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;DateDeleted&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
		<span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Property</span><span style="color: #008000;">&#40;</span>t <span style="color: #008000;">=&gt;</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">UserCreated</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">HasColumnName</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;UserCreated&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
		<span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Property</span><span style="color: #008000;">&#40;</span>t <span style="color: #008000;">=&gt;</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">UserDeleted</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">HasColumnName</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;UserDeleted&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
	<span style="color: #008000;">&#125;</span></pre></div></div>

<p></code><br />
So,  separate mapping class allows you to refactor properties without having to change their names in database, or to manually sync your database with your model, as everything is clean and readable.</p>
<p>The context &#8211; JContext overrides SaveChanges method, which takes care of actions necessary for journaling:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">override</span> <span style="color: #6666cc; font-weight: bold;">int</span> SaveChanges<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #008080; font-style: italic;">// We need same time for all entities updated in same transaction.</span>
	DateTime now <span style="color: #008000;">=</span> DateTime<span style="color: #008000;">.</span><span style="color: #0000FF;">Now</span><span style="color: #008000;">;</span>
	<span style="color: #008080; font-style: italic;">// Get reference to user to avoid multiple getter calls.</span>
	<span style="color: #6666cc; font-weight: bold;">string</span> user <span style="color: #008000;">=</span> <span style="color: #000000;">System.<span style="color: #0000FF;">Threading</span></span><span style="color: #008000;">.</span><span style="color: #0000FF;">Thread</span><span style="color: #008000;">.</span><span style="color: #0000FF;">CurrentPrincipal</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Identity</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Name</span><span style="color: #008000;">;</span>
&nbsp;
	<span style="color: #008080; font-style: italic;">//// Detect changes in case that change tracking is turned off</span>
	<span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">!</span><span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Configuration</span><span style="color: #008000;">.</span><span style="color: #0000FF;">AutoDetectChangesEnabled</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ChangeTracker</span><span style="color: #008000;">.</span><span style="color: #0000FF;">DetectChanges</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
	<span style="color: #008000;">&#125;</span>
	List<span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;</span>JEntity<span style="color: #008000;">&amp;</span>gt<span style="color: #008000;">;</span> insertedList <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;</span>JEntity<span style="color: #008000;">&amp;</span>gt<span style="color: #008000;">;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
	List<span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;</span>JEntity<span style="color: #008000;">&amp;</span>gt<span style="color: #008000;">;</span> invalidList <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;</span>JEntity<span style="color: #008000;">&amp;</span>gt<span style="color: #008000;">;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
	<span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>var entry <span style="color: #0600FF; font-weight: bold;">in</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ChangeTracker</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Entries</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #008080; font-style: italic;">// Make sure that this customized save changes executes only for entities that</span>
		<span style="color: #008080; font-style: italic;">// inherit from our base entity (IEntity)</span>
		var entity <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span>entry<span style="color: #008000;">.</span><span style="color: #0000FF;">Entity</span> <span style="color: #0600FF; font-weight: bold;">as</span> JEntity<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
		<span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>entity <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">&#41;</span> <span style="color: #0600FF; font-weight: bold;">continue</span><span style="color: #008000;">;</span>
&nbsp;
		<span style="color: #0600FF; font-weight: bold;">switch</span> <span style="color: #008000;">&#40;</span>entry<span style="color: #008000;">.</span><span style="color: #0000FF;">State</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #008080; font-style: italic;">// In case entity is added, we need to set OriginalId AFTER it was saved to</span>
			<span style="color: #008080; font-style: italic;">// database, as Id is generated by database and cannot be known in advance.</span>
			<span style="color: #008080; font-style: italic;">// That is why we save reference to this object into insertedList and update</span>
			<span style="color: #008080; font-style: italic;">// original id after object was saved.</span>
			<span style="color: #0600FF; font-weight: bold;">case</span> <span style="color: #000000;">System.<span style="color: #0000FF;">Data</span></span><span style="color: #008000;">.</span><span style="color: #0000FF;">EntityState</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Added</span><span style="color: #008000;">:</span>
				entity<span style="color: #008000;">.</span><span style="color: #0000FF;">UserCreated</span> <span style="color: #008000;">=</span> user<span style="color: #008000;">;</span>
				entity<span style="color: #008000;">.</span><span style="color: #0000FF;">DateCreated</span> <span style="color: #008000;">=</span> now<span style="color: #008000;">;</span>
				insertedList<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>entity<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
				<span style="color: #0600FF; font-weight: bold;">break</span><span style="color: #008000;">;</span>
&nbsp;
			<span style="color: #008080; font-style: italic;">// Deleted entity should only be marked as deleted.</span>
			<span style="color: #0600FF; font-weight: bold;">case</span> <span style="color: #000000;">System.<span style="color: #0000FF;">Data</span></span><span style="color: #008000;">.</span><span style="color: #0000FF;">EntityState</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Deleted</span><span style="color: #008000;">:</span>
				<span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">!</span>entity<span style="color: #008000;">.</span><span style="color: #0000FF;">IsActive</span><span style="color: #008000;">&#40;</span>now<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
				<span style="color: #008000;">&#123;</span>
					invalidList<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>entity<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
					<span style="color: #0600FF; font-weight: bold;">continue</span><span style="color: #008000;">;</span>
				<span style="color: #008000;">&#125;</span>
				entry<span style="color: #008000;">.</span><span style="color: #0000FF;">Reload</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
				entity<span style="color: #008000;">.</span><span style="color: #0000FF;">DateDeleted</span> <span style="color: #008000;">=</span> now<span style="color: #008000;">;</span>
				entity<span style="color: #008000;">.</span><span style="color: #0000FF;">UserDeleted</span> <span style="color: #008000;">=</span> user<span style="color: #008000;">;</span>
				<span style="color: #0600FF; font-weight: bold;">break</span><span style="color: #008000;">;</span>
&nbsp;
			<span style="color: #0600FF; font-weight: bold;">case</span> <span style="color: #000000;">System.<span style="color: #0000FF;">Data</span></span><span style="color: #008000;">.</span><span style="color: #0000FF;">EntityState</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Detached</span><span style="color: #008000;">:</span>
				<span style="color: #0600FF; font-weight: bold;">break</span><span style="color: #008000;">;</span>
&nbsp;
			<span style="color: #0600FF; font-weight: bold;">case</span> <span style="color: #000000;">System.<span style="color: #0000FF;">Data</span></span><span style="color: #008000;">.</span><span style="color: #0000FF;">EntityState</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Modified</span><span style="color: #008000;">:</span>
				<span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">!</span>entity<span style="color: #008000;">.</span><span style="color: #0000FF;">IsActive</span><span style="color: #008000;">&#40;</span>now<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
				<span style="color: #008000;">&#123;</span>
					invalidList<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>entity<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
					<span style="color: #0600FF; font-weight: bold;">continue</span><span style="color: #008000;">;</span>
				<span style="color: #008000;">&#125;</span>
				entity<span style="color: #008000;">.</span><span style="color: #0000FF;">UserCreated</span> <span style="color: #008000;">=</span> user<span style="color: #008000;">;</span>
				entity<span style="color: #008000;">.</span><span style="color: #0000FF;">DateCreated</span> <span style="color: #008000;">=</span> now<span style="color: #008000;">;</span>
&nbsp;
				JEntity newVersion <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Set</span><span style="color: #008000;">&#40;</span>entity<span style="color: #008000;">.</span><span style="color: #0000FF;">GetType</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Create</span><span style="color: #008000;">&#40;</span>entity<span style="color: #008000;">.</span><span style="color: #0000FF;">GetType</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #0600FF; font-weight: bold;">as</span> JEntity<span style="color: #008000;">;</span>
				newVersion <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Set</span><span style="color: #008000;">&#40;</span>entity<span style="color: #008000;">.</span><span style="color: #0000FF;">GetType</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>newVersion<span style="color: #008000;">&#41;</span> <span style="color: #0600FF; font-weight: bold;">as</span> JEntity<span style="color: #008000;">;</span>
				<span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Entry</span><span style="color: #008000;">&#40;</span>newVersion<span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">CurrentValues</span><span style="color: #008000;">.</span><span style="color: #0000FF;">SetValues</span><span style="color: #008000;">&#40;</span>entity<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
				<span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Entry</span><span style="color: #008000;">&#40;</span>entity<span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Reload</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
				entity<span style="color: #008000;">.</span><span style="color: #0000FF;">DateDeleted</span> <span style="color: #008000;">=</span> newVersion<span style="color: #008000;">.</span><span style="color: #0000FF;">DateCreated</span><span style="color: #008000;">;</span>
				entity<span style="color: #008000;">.</span><span style="color: #0000FF;">UserDeleted</span> <span style="color: #008000;">=</span> user<span style="color: #008000;">;</span>
				<span style="color: #0600FF; font-weight: bold;">break</span><span style="color: #008000;">;</span>
			<span style="color: #0600FF; font-weight: bold;">case</span> <span style="color: #000000;">System.<span style="color: #0000FF;">Data</span></span><span style="color: #008000;">.</span><span style="color: #0000FF;">EntityState</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Unchanged</span><span style="color: #008000;">:</span>
				<span style="color: #0600FF; font-weight: bold;">break</span><span style="color: #008000;">;</span>
			<span style="color: #0600FF; font-weight: bold;">default</span><span style="color: #008000;">:</span>
				<span style="color: #0600FF; font-weight: bold;">break</span><span style="color: #008000;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>invalidList<span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0600FF; font-weight: bold;">throw</span> <span style="color: #008000;">new</span> InvalidJournalingEntityException<span style="color: #008000;">&#40;</span>invalidList<span style="color: #008000;">&#91;</span><span style="color: #FF0000;">0</span><span style="color: #008000;">&#93;</span>, invalidList<span style="color: #008000;">&#91;</span><span style="color: #FF0000;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">GetType</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Name</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0600FF; font-weight: bold;">else</span> <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>invalidList<span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span> <span style="color: #008000;">&amp;</span>gt<span style="color: #008000;">;</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0600FF; font-weight: bold;">throw</span> <span style="color: #008000;">new</span> MultipleInvalidJournalingEntityException<span style="color: #008000;">&#40;</span>invalidList<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #6666cc; font-weight: bold;">int</span> result <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">base</span><span style="color: #008000;">.</span><span style="color: #0000FF;">SaveChanges</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
	<span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>insertedList<span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span> <span style="color: #008000;">&amp;</span>gt<span style="color: #008000;">;</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		insertedList<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">ForEach</span><span style="color: #008000;">&#40;</span>t <span style="color: #008000;">=&amp;</span>gt<span style="color: #008000;">;</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">OriginalId</span> <span style="color: #008000;">=</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">Id</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
		<span style="color: #0600FF; font-weight: bold;">base</span><span style="color: #008000;">.</span><span style="color: #0000FF;">SaveChanges</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0600FF; font-weight: bold;">return</span> result<span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p></code><br />
The method handles cases when object is added, modified or deleted. When added, it must save reference to it and set OriginalId after it was assigned Id. As object does not have Id until sql server generates one for it, this has to be done after SaveChanges. Theese few lines should in serious system be inside one transaction, just in case.</p>
<p>When object is changed, change is canceled and  only DateDeleted and UserDeleted is set (same as when object is deleted). Instead, new object is added as new version of changed object.</p>
<p>All this is used from sample project, where new entities and context are created, with no code for usage of theese features except inheritance from JEntity and JContext.</p>
<p>If something is not clear, the best option is to start test project and set breakpoints at places of interest, or ask your question in comments!</p>
<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblog.goranobradovic.com%2f2011%2f09%2fsimplify-data-access-by-using-entity-framework-extension-points%2f"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%253a%252f%252fblog.goranobradovic.com%252f2011%252f09%252fsimplify-data-access-by-using-entity-framework-extension-points%252f" border="0" alt="kick it on DotNetKicks.com" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.goranobradovic.com/2011/09/simplify-data-access-by-using-entity-framework-extension-points/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solution for VHD_BOOT_HOST_VOLUME_NOT_ENOUGH_SPACE error in windows 8</title>
		<link>http://blog.goranobradovic.com/2011/09/solution-for-vhd_boot_host_volume_not_enough_space-error-in-windows-8/</link>
		<comments>http://blog.goranobradovic.com/2011/09/solution-for-vhd_boot_host_volume_not_enough_space-error-in-windows-8/#comments</comments>
		<pubDate>Fri, 16 Sep 2011 09:53:49 +0000</pubDate>
		<dc:creator>obrad</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[VHD_BOOT_HOST_VOLUME_NOT_ENOUGH_SPACE]]></category>
		<category><![CDATA[Windows 8]]></category>

		<guid isPermaLink="false">http://blog.goranobradovic.com/?p=437</guid>
		<description><![CDATA[If you are using VHD method of installing windows 8 to virtual disk on physical machine (Scot Hansellman has great tutorial: http://www.hanselman.com/blog/GuideToInstallingAndBootingWindows8DeveloperPreviewOffAVHDVirtualHardDisk.aspx) and you get VHD_BOOT_HOST_VOLUME_NOT_ENOUGH_SPACE error after installation, then your problem is probably dynamic VHD and not enough free space on disk containing that drive. I had the same problem, and googling for it [...]]]></description>
			<content:encoded><![CDATA[<p>If you are using VHD method of installing windows 8 to virtual disk on physical machine (Scot Hansellman has great tutorial: <a href="http://www.hanselman.com/blog/GuideToInstallingAndBootingWindows8DeveloperPreviewOffAVHDVirtualHardDisk.aspx">http://www.hanselman.com/blog/GuideToInstallingAndBootingWindows8DeveloperPreviewOffAVHDVirtualHardDisk.aspx</a>) and you get VHD_BOOT_HOST_VOLUME_NOT_ENOUGH_SPACE error after installation, then your problem is probably dynamic VHD and not enough free space on disk containing that drive. I had the same problem, and googling for it did not solve it, as there is one little catch that is not very known:</p>
<p>You need to have enough free space on physical disk containing VHD that it can contain whole VHD <strong>IF IT WOULD GROW TO MAXIMUM DECLARED SIZE</strong>! So 100GB VHD on a 90GB free space is a no-go, it does not matter that Windows 8 will use only about 11GB after clean installation.</p>
<p>Windows 8 setup does not check for this, so you may be able to install it, and not able to boot it <img src='http://blog.goranobradovic.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.goranobradovic.com/2011/09/solution-for-vhd_boot_host_volume_not_enough_space-error-in-windows-8/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Example of great user management policy</title>
		<link>http://blog.goranobradovic.com/2011/08/example-of-great-user-management-policy/</link>
		<comments>http://blog.goranobradovic.com/2011/08/example-of-great-user-management-policy/#comments</comments>
		<pubDate>Tue, 30 Aug 2011 21:03:47 +0000</pubDate>
		<dc:creator>obrad</dc:creator>
				<category><![CDATA[Moje brljotine]]></category>

		<guid isPermaLink="false">http://blog.goranobradovic.com/2011/08/example-of-great-user-management-policy/</guid>
		<description><![CDATA[&#160;]]></description>
			<content:encoded><![CDATA[<p>&#160;</p>
<p><a href="http://blog.goranobradovic.com/wp-content/uploads/image31.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.goranobradovic.com/wp-content/uploads/image_thumb31.png" width="967" height="722" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.goranobradovic.com/2011/08/example-of-great-user-management-policy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Log on to windows as a local user without computer name</title>
		<link>http://blog.goranobradovic.com/2011/08/log-on-to-windows-as-a-local-user-without-computer-name/</link>
		<comments>http://blog.goranobradovic.com/2011/08/log-on-to-windows-as-a-local-user-without-computer-name/#comments</comments>
		<pubDate>Thu, 25 Aug 2011 09:07:24 +0000</pubDate>
		<dc:creator>obrad</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Logon]]></category>
		<category><![CDATA[Security flaw]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.goranobradovic.com/?p=430</guid>
		<description><![CDATA[Yes, you all know that you can use computername\user or 192.168.x.y\user, or even domain\user when logging on to machine. But, when you want to login as local user and don&#8217;t know computer name, and do not want to type IP address, you can use any\user where any can be anything. Nice little security flaw?]]></description>
			<content:encoded><![CDATA[<p>Yes, you all know that you can use <strong>computername\user</strong> or <strong>192.168.x.y\user</strong>, or even <strong>domain\user</strong> when logging on to machine.</p>
<p>But, when you want to login as local user and don&#8217;t know computer name, and do not want to type IP address, you can use <strong>any\user</strong> where <strong>any</strong> can be anything.</p>
<p>Nice little security flaw?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.goranobradovic.com/2011/08/log-on-to-windows-as-a-local-user-without-computer-name/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Gdje to mi živimo?</title>
		<link>http://blog.goranobradovic.com/2011/08/gdje-to-mi-zivimo/</link>
		<comments>http://blog.goranobradovic.com/2011/08/gdje-to-mi-zivimo/#comments</comments>
		<pubDate>Wed, 03 Aug 2011 00:29:36 +0000</pubDate>
		<dc:creator>obrad</dc:creator>
				<category><![CDATA[Borba protiv vjetrenjača]]></category>
		<category><![CDATA[Moje brljotine]]></category>
		<category><![CDATA[Banja Luka]]></category>
		<category><![CDATA[BiH]]></category>
		<category><![CDATA[Porodilište]]></category>
		<category><![CDATA[propast]]></category>
		<category><![CDATA[Republika Srpska]]></category>

		<guid isPermaLink="false">http://blog.goranobradovic.com/?p=418</guid>
		<description><![CDATA[&#160; Vrlo naivno pitanje, na prvi pogled, koje na ovome mjestu, gdje živimo, očigledno niko ne shvaća ozbiljno. Čuje se ponegdje da smo zemlja apsurda, ali oni čiji su glasovi najglasniji kažu da smo mi u Evropi, pa čak i da smo bolji od nekih drugih mjesta. Možda i jesmo? Teško je, a i vrlo [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>Vrlo naivno pitanje, na prvi pogled, koje na ovome mjestu, gdje živimo, očigledno niko ne shvaća ozbiljno. Čuje se ponegdje da smo zemlja apsurda, ali oni čiji su glasovi najglasniji <strong>kažu da smo mi u Evropi</strong>, pa čak i da smo bolji od nekih drugih mjesta. Možda i jesmo? Teško je, a i vrlo neodgovorno donijeti takav sud naprečac, ali u tekstu koji slijedi ću pokušati bar malo da odredim našu poziciju u odnosu na ostatak svijeta.</p>
<h2>Zašto?</h2>
<p>Mnogi koji su počeli ovo čitati će se vjerovatno zapitati koji je moj motiv za pisanje ovoga teksta, i vjerovatno niko neće ispravno pretpostaviti isti. Razlog je što sam postao otac, povodom čega sam primio mnogo čestitki i želja da novi član moje porodice ima puno sreće u životu. Razmišljajući o tome, zapitao sam se i <strong>kakav to život može da očekuje jedna beba</strong>, i počeo da zapisujem stavke koje slijede. Takođe sam htio da oni koji eventualno čekaju bebu imaju poneku informaciju koja im može pomoći.</p>
<h2>Poređenje ovoga mjesta sa “normalnim” mjestima za život</h2>
<p>Prva stvar koju ću da uporedim je ono u šta sam najbolje upućen, a to su uslovi za život koje može imati prosječna mlada osoba (dobro, ne baš prosječna, pošto posmatram sa gledišta visokoobrazovane osobe sa poprilično dobrim zaposlenjem, a to je ovdje statistički šiljak koji popravlja prosjek). Pod normalnim ću smatrati sve ono što se manje-više podrazumijeva u zemljama u bližem okruženju.</p>
<h3>Obrazovanje i posao</h3>
<p><strong>Izbor fakulteta je dobar</strong>. Ništa bolji nego u ostatku svijeta, ali ne zaostajemo previše. Moguće je, uz malo truda i mnogo novca, upisati i završiti bilo koji faks. To je otprilike sva sličnost sa ostatkom svijeta. Prosječna porodica ne može bez značajne žrtve “izškolovati” jednog studenta, a o dva ne smije ni razmišljati. Tako je i u “boljim” društvima, reći će mnogi. Jeste, ali u našem ne postoje krediti za školovanje, stipendije su neadekvatne, a studenti nemaju mogućnost da rade i poprave svoju situaciju.</p>
<p><strong>Sam kvalitet obrazovanja je</strong>, pa, kakav god da je, i dalje <strong>potpuno nebitan</strong>. Odnosno jeste, svuda osim ovdje. Zašto? Završen fakultet znači početak samostalnosti – posao u roku od par mjeseci, finansijska nezavisnost, mogućnost da se živi sam, postavljaju ciljevi i odlučuje zašto se radi. To imaju mladi u svijetu. Ovdje? Pošto ne postoji nikakva strategija, niti razvojna niti neka druga, nema niti plana koliko gdje studenata se može upisati i šta će biti s njima kada završe. Stoga prosječan student uz diplomu može očekivati i par godina na birou. Za razliku od društava kojima težimo, ne postoji nikakva nadoknada od države koja vam ne može obezbijediti posao, iako će uredno naplatiti porez ukoliko ga sami pronađete. Volio bih znati postoji li neko u ministarstvu obrazovanja ko zna koliko ovo društvo košta jedan obrazovan čovjek? Siguran sam da nema, kao što sam siguran i da u prosjeku ne košta manje od 50000KM, iako je vjerovatno u pitanju i veća cifra. Šta onda znači stotinu obrazovanih ljudi na birou? 5 miliona maraka propale investicije. Nije strašno? Ne bi bilo da ne postoje hiljade a ne stotine takvih. Da li je bolje imati 150 hiljada nezaposlenih, ili 150 hiljada nezaposlenih i 150 miliona maraka koje nisu potrošene na školovanje nezaposlenih? Zašto država dopušta da stotine miliona maraka ovoga društva propadaju? Zašto ne smanji broj, ili ukine potpuno fakultete i smjerove za koje nema posla? Bar na državnom univerzitetu? Vjerovatno zato što nikoga nije ni briga za to. Onda nije ni bitno da li je diploma samo papir, ionako će vas i vaše obrazovanje dok dobijete posao pregaziti vrijeme. Uz jedan od najvećih (vjerovatno i najveći) procenat nezaposlenosti visokoobrazovanih na svijetu, ovdje je svrha fakulteta da odvlači mladima pažnju i energiju sa bitnih stvari, izmori ih i spriječi da usmjere energiju protiv društvene truleži.</p>
<h3>Porodica i brak</h3>
<p>Ukoliko upoznate osobu sa kojom možete da se složite oko bitnih stvari u životu, i da organizujete zajednički život tako da poželite stupiti u brak, država će vas obradovati – čak 3 dana plaćenog odmora, a ako ste obrazovani, obradovaće vas i beneficirana stopa IRB stambenog kredita. Super. Jest da ova 3 dana nisu potrebna, meni je recimo bio dovoljan i jedan, a da sam se ženio subotom, onda mi ne bi trebao ni jedan. Ali dobro su došli za selidbu. No, kad razmislim, nema razloga zašto država ne bi dala 3 danaza ženidbu kada više od pola osoba koje stupaju u brak nisu zaposlene, pa i nije neki trošak, zar ne? Ta tri dana služe samo da bi postojao još jedan apsurd – 1 dan odsustva za rođenje djeteta. Logično zar ne? A tek druga pogodnost – beneficirana kamatna stopa za stan – to je tek sjajno. Beneficirana kamatna stopa je duplo veća od stopa komercijalnih stambenih kredita u Evropi, ali šta očekivati kada su sve banke prodane inostranim vlasnicima? Neće na svojim građanima zarađivati, jer oni imaju <strong>državu</strong> koja se brine za svoje građane. No, ni ta kamatna stopa nije bitna, jer ni uz platu koja je deset puta veća od prosječne, (ako je nemate vidite da vam ni ne treba, a ako ste zaposleni onda vam bračni drug ne radi pa vam se i to malo kreditne sposobnosti umanji) ne možete dobiti ovaj kredit, ukoliko nemate drugu nekretninu da stavite pod hipoteku. A da bi uopšte mogli dobiti kredit ne smijete je imati. Apsurd? Ma kakvi, može i žirant umjesto hipoteke. Bračni drug? Da ali u prosječnoj porodici radi manje od jednog člana domaćinstva. Recimo da imate 14 baš dobrih prijatelja (puno više nego što imate, ali optimista sam), koji bi bili voljni da vam budu žiranti. 7 ne može jer su nezaposleni. Od ovih ostalih 7 što rade, 1 ne može jer je već bio žirant i sada plaća tuđi kredit, dvojica ne mogu jer su bili žiranti previše puta i neki od kredita se neredovno otplaćjuju. Od preostale četvorice dvojica imaju dovoljno visoku platu da zadovolje kriterije banke, ali jedan već ima stambeni kredit pa ne može a drugi ne radi u državnoj firmi. Da, banke traže žiranta iz državne firme. Zna se da je ovdje država parazit a ne faktor koji obezbjeđuje dobru poslovnu atmosferu, i da će privreda propasti nauštrb države, a banke ne žele da budu na gubitku zbog toga. Tako se dođe do situacije da ja živim u stanu koji iznajmljujem. A najam plaćam manje-više koliko bi bila rata za takav stan u normalnom društvu.</p>
<h3></h3>
<h3>Zdravstveno osiguranje i djeca</h3>
<p>Zdravstveno osiguranje? Naravno, imam ga, i molim boga da mi ne zatreba, jer ako mi zatreba neće mi biti od prevelike pomoći, o čemu sam <a href="http://blog.goranobradovic.com/2011/02/jebem-ti-drzavu/" target="_blank">već pisao</a>. Mnogo bolje bih mogao da iskoristim novac koji mi država otima od zarade nego da se “liječim” u državnoj “bolnici”, koja ima najsavremeniju opremu u Evropi na odjelu radiologije, koja košta kao flota autobusa koji ne čade, ali se ne koristi nešto mnogo, nema dovoljno obučenog kadra, <a href="http://blog.goranobradovic.com/2011/02/jebem-ti-drzavu/" target="_blank">uputnice se kradu a pregledi ne obavljaju</a>, a ni mnogi građani ne znaju za postojanje ovako opremljenog centra. Ista ta bolnica nema pelena za umotavanje novorođenčadi, porodilje po nekoliko dana leže na krvavoj posteljini, a vikendom nema dežurnog doktora, pa dijete rođeno u petak naveče do ponedeljka ujutro ima dovoljno vremena da razvije razne infekcije. Ukoliko neka žena ima tu nesreću da zatrudni u ovome društvu (naglašavam ovo, jer je samo taj drugi dio nesreća), vrlo vjerovatno će imati prednost u svim redovima gdje se nešto čeka. To je sličnost sa ostatkom svijeta. Osim toga će dobiti otkaz ako je imala posao, država joj neće platiti nadoknade za trudničko bolovanje, sama će platiti školu za trudnice i imat će jedinstveno iskustvo porođaja. Naime, kod nas imaju u bolnici jedinstvene spavaćice – takve možete vidjeti samo u kaubojskim filmovima, kada se neki glumac skine u “pidžamu”, oni poparani dronjci tako izgledaju. Takođe, naši su doktori čuli za neki tamo drip. Izolovali farmaceuti aktivnu supstancu, koja izaziva i pojačava porođajne bolove. Čuli oni da se to daje tamo u Evropi, trudnicama na porođaju. Cijene oni mnogo prirodu i prirodni porođaj, ali cijene mnogo više tu Evropu i evropske vrijednosti, ipak su oni društvena elita koja treba da nam donese te novosti. Jedino što ne mogu da obezbijede i druge stvari iz Evrope, koje nisu u njihovoj moći, kao npr. bolničke papuče koje treba donijeti od kuće, ili “pamperse” za bebe, ali zato mogu da dadnu dripa desetine puta više nego što ga imaju u Evropi, nema isključivanja nakon prvog sata kao tamo, tako da time nadoknade sve što oni imaju a mi nemamo. To se dešava svim trudnicama, a ne samo mojoj. To je jedini kriterij po kome nema nikakve diskriminacije, ni po kakvom osnovu. Zahvaljujući tome prirodan porođaj postaje neprirodan kada od te supstance nateknu mišići koji treba da donesu dijete na svijet i tako mu onemoguće izlaz. Iako je u tom momentu i sestrama bilo jasno da je porođaj nemoguć, doktor je htio moju trudnicu ostaviti još par sati, ne bili se nekim čudom ipak porodila. Srećom, ona nije prosječna trudnica koja poštuje princip “ćuti i trpi” koji vrijedi za prosječnog člana našeg društva, nego je “izgubila strpljenje” kako kaže babica Mira, pa su je morali poroditi na carski rez, “samo” 5 sati nakon što su joj izazvali bolove i probili vodenjak. A babica Mira je osoba koja se samo zove babica, njeno radno mjesto se zove “uzimač mita”, jer ona ne porađa, bar je se moja žena ne sjeća. To joj nije smetalo da nakon porođaja izađe i pružajući ruku kaže “ja sam babica Mira, ja sam porodila vaše dijete, sve je u redu”. Ukoliko joj pružite ruku neće se nasmijati i čestitati nego se smrknuti i poći nazad. A kad vam doveze dijete da ga vidite, što joj je posao, još jednom će ponoviti isto. Reći će vam i da ne prima nikakvo milošte, ukoliko na njemu nije naslikan Jovan Dučić (ne tim riječima ali bit će vam jasno), a ako ga dobije umjesto zatvaranja vrata pred nosom ljubazno će vam odgovoriti na pitanja koja imate i objasniti vam gdje ćete, i kada, moći vidjeti novopečenu mamicu. Zbog pet sati porođajnih muka koje su prethodile njihovom <em>genijalnom</em> zaključku da je potreban carski rez, bio sam toliko bijesan da je i Mira vidjela da se tresem i pokušala da objasni da nisu oni krivi, ali doktor se, vjerovatno za svaki slučaj, ipak nije pojavio. Vjerovatno zato što on i nije planirao još da radi porođaj, ali je moja ženica “izgubila strpljenje” i počela ustajati sa kreveta, galamiti, grebati doktore koji priđu i uopšte biti nemoguća čime ih je prisilila da urade ono što su, prema njihovim riječima, “već znali da mora da se učini”. Ne znam mu ni ime, tom doktoru, čini mi se Đukić, ali ne bih htio da stanem iza toga i oklevetam pogrešnu osobu, jer vjerujem/čuo sam da ima među njima i neki dobar doktor/doktorica, koji bi mnogo bolje obavljali posao da nemaju iznad sebe takvog, koji dođe porodilji koji dan kasnije i pokuša objasniti otoke i infekcije namučenog novorođenčeta uzrocima kao što su plodova voda, infekcija majke i sl. Nakon što ona spomene činjenicu da je kontrolisala te parametre i da je sve bilo u redu 3 dana prije poroda, on kaže <em>pa dobro,<strong> ja sam taj i taj, ako sve bude u redu recite svima da sam vas ja porodio, a ako ne bude nemojte me spominjati</strong></em>. Pa sjajno, to je baš sjajno. <em>Ja volim preuzeti zasluge a nemati odgovornost za eventualne posljedice. </em>Iako mi žena kaže da nije tako zvučao i izgledao, nadam se da se šalio, jer smo i bez toga propali. Prema tome, i prema strašnoj, žalosnoj i nedopustivoj činjenici da je dan nakon poroda moje žene umrlo dijete nakon što su ženu porađali 12 sati, su ostale gluposti, poput one da trudnice ne smiju preći vrata iz “svog” u hodnik posjetilaca i obrnuto, nego svi moraju da se nabiju u što manji prostor na vratima ne bili lakše razmijenili bakterije i viruse, naprosto zanemarive i suvišne za spominjati, ali ja ću ipak to da učinim. Da pojasnim, posjeta porodiljama izgleda otprilike ovako: ulaz u odjel su dvokrilna vrata, na kojima se otvara veće krilo, širine oko 1m. Sa jedne strane vrata tu dođe desetak nesretnica – porodilja, a sa druge dvadesetak posjetilaca, i svako pokušava da malo bude sa svojom porodiljom. Samo radi poređenja, u Sloveniji muž može biti prisutan na porođaju, doći kod porodilje u sobu i biti s njom 2 sata dnevno, i dobiti 15 dana plaćenog odsustva, a kod nas ništa od toga. Tamo porodilja ne mora nositi od kuće spavaćice, papuče, čiste peškire kojima će prekriti jastuk i na koje će staviti dijete, jednokratne gaćice, hranu (doručak je jedna viršla i četvrtina čaše mlijeka), pelene za dijete… ne mora nositi ništa. Kod nas porodilište najviše liči na zatvor. Jedine svijetle tačke su sestre, bar većina, koje i pored svih teških uslova čine sve što je u njihovoj moći da to iskustvo bude manje traumatično. Ipak se nadam da moja žena nikada više neće posjetiti ovo porodilište. Neko drugo da, ali ne ovo. Svakoj trudnici je bolje da se porodi kod kuće nego gore. Mislim da će ove slike iz porodilišta da pomognu ilustrovati kako izgleda boravak gore:</p>
<div id="scid:66721397-FF69-4ca6-AEC4-17E6B3208830:2e1ba9c5-1cb8-4a6f-b206-e7891e56630a" class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: none; padding: 0px;">
<table style="outline: none; border-style: none; margin: 0px; padding: 0px; width: 441px; border-collapse: collapse;" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="margin: 0px; padding: 0px; outline: none; border-style: none; width: auto;"><a style="outline: none; border-style: none; margin: 0px; padding: 0px;" href="https://skydrive.live.com/redir.aspx?cid=1b57ebae475492cf&amp;page=play&amp;resid=1B57EBAE475492CF!564&amp;type=5&amp;authkey=ur8lD9ShtAk%24&amp;Bsrc=Photomail&amp;Bpub=SDX.Photos" target="_blank"><img style="outline: none; border-style: none; padding: 0px; margin: 0px; border: 0px; background: none; background-image: none; vertical-align: bottom;" title="View album" src="http://blog.goranobradovic.com/wp-content/uploads/Porodilite-klinikog-centra-paprikovac2.jpg" alt="View album" /></a></p>
<div style="width: 441px; text-align: center; overflow: visible; padding: 0px; margin: 0px;">
<div style="width: 441px; overflow: visible;"><a style="text-decoration: none;" href="https://skydrive.live.com/redir.aspx?cid=1b57ebae475492cf&amp;page=browse&amp;resid=1B57EBAE475492CF!564&amp;type=5&amp;authkey=ur8lD9ShtAk%24&amp;Bsrc=Photomail&amp;Bpub=SDX.Photos" target="_blank"><span style="line-height: 1.26em; padding: 0px; width: 441px; font-size: 26pt; font-family: 'Segoe UI', helvetica, arial, sans-serif;">Porodilište kliničkog centra Paprikovac</span></a></div>
<div style="text-align: center; padding: 9px 0px 0px 0px; margin: 0px 0px 0px 0px; font-family: 'Segoe UI', helvetica, arial, sans-serif; font-size: 8pt;">
<table style="text-align: center; width: auto; margin-left: auto; margin-right: auto; padding: 0px; outline: none; border-style: none; border-collapse: collapse;" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="vertical-align: top; outline: none; border-style: none; margin: 0px; padding: 6px 12px 6px 0px;"><a style="font-family: 'Segoe UI', helvetica, arial, sans-serif; font-size: 8pt; outline: none; border-style: none; text-decoration: none; padding: 0px; margin: 0px;" href="https://skydrive.live.com/redir.aspx?cid=1b57ebae475492cf&amp;page=play&amp;resid=1B57EBAE475492CF!564&amp;type=5&amp;authkey=ur8lD9ShtAk%24&amp;Bsrc=Photomail&amp;Bpub=SDX.Photos" target="_blank">VIEW SLIDE SHOW</a></td>
<td style="vertical-align: top; outline: none; border-style: none; margin: 0px; padding: 6px 0px 6px 0px;"><a style="font-family: 'Segoe UI', helvetica, arial, sans-serif; font-size: 8pt; outline: none; border-style: none; text-decoration: none; padding: 0px; margin: 0px;" href="https://skydrive.live.com/redir.aspx?cid=1b57ebae475492cf&amp;page=downloadphotos&amp;resid=1B57EBAE475492CF!564&amp;type=5&amp;Bsrc=Photomail&amp;Bpub=SDX.Photos&amp;authkey=ur8lD9ShtAk%24" target="_blank">DOWNLOAD ALL</a></td>
</tr>
</tbody>
</table>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<p>Razumijem da stanje može da bude lošije nego što bi trebalo biti, jer se planira preseljenje u novu zgradu, nekada jednom kada ona bude gotova. Ali da li je to razlog da čistačice ne očiste kupatilo, ne izvade skakavce iz svjetla iznad kreveta i ne ubace vrećicu u kantu za smeće? I da se ne može popraviti česma iz koje non-stop curi voda, i to topla! Pa čemu onda zabrana ulaza na odjel za posjetioce, svakome je čistije kod kuće, ili odakle je već došao, i sigurno je da je manje vjerovatno da će se neko zaraziti ako svako bude kod svoje porodilje nego svi na jednom mjestu, gdje ako dođe jedan zaražen ima da zarazi i sve trudnice (i djecu) i sve posjetioce…</p>
<p>U društvu u kome su ljudi zadnji u sistemu društvenih vrijednosti ne može da postoji stabilna država, jer bez ljudi nema ni države. Ostajanjem ovdje i plaćanjem poreza i doprinosa samo podržavamo ovakvo stanje. Ne želim nikoga da uvrijedim, ali od sada ću mislim da je glup svako kome se pruži ikakva prilika da napusti ovo mjesto, a on odluči da ostane, jer je nemoguće očekivati da se nešto može promijeniti u društvu u kome prosječan posjetilac bolnice ne zna čak ni lift pozvati u smjeru u kom želi ići. I ne samo što ne zna pozvati lift, nego ubijeđen da sve zna ne želi dok čeka pročitati uputstvo za upotrebu… Od dva zvona na ulazu na odjel, na kojima na jednom piše “Zvono za žene” a na drugom “Zvono za bebe – otpust”, dođe lik sa nosiljkom za bebu, u 12h kad je otpust, i zvoni 4 puta na zvono za žene, a onda počne da komentariše kako “nema nigdje nikoga”… Pa uzalud je ovdje pisati uputstva, kućni red, upozorenja, uzalud i ja pišem ovo, to može pomoći u društvu u kom ljudi čitaju, znaju da ne znaju i žele da nauče nešto.</p>
<p>Srećom, sada više nemam članova porodice u bolnici, i imam par godina do polaska prinove u školu, period u kome mogu čak i ovdje da  omogućim svome djetetu djetinjstvo približno onakvo kakvo imaju i normalna djeca, iako u ovoj &#8220;državi&#8221; nema dječijeg dodatka. A nakon toga – ponovo jedna državna ustanova. A kakva “država” takva i “škola”. Čitav svijet je u 2011. godini a naše su škole još u 1980. Ne uči se kod nas ništa što se desilo posle toga, a ne uči se ni voziti bicikl, skijati, plivati, pjevati niti išta što se uči van škole. Ovdje je to bukvalno, kada djeca idu u školu, ona idu u onu zgradu na kojoj piše škola, i to se misli pod pojmom “ide u školu”. Da stanje neće biti bolje može se vidjeti i na vijestima, kažu smanjuje se budžet za prosvjetu, ukida se x područnih škola, zbrinjavaju se radnici, ide se u propast… Samo se u skupštini, vladi i javnoj upravi ne smanjuju plate i ne zbrinjavaju radnici.</p>
<p>Nakon što sam sagledao ove činjenice, shvatio sam da ni jedno dijete ovdje ne može imati djetinjstvo dostojno djeteta, kao što ni građani nemaju život dostojan čovjeka, i zaključio da to zavisi od društva u kome odrasta u tolikoj mjeri da za to nije moguće napraviti kompenzaciju nikakvim drugim sredstvima. Zato se nadam svojoj prilici da mi vidite leđa…</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.goranobradovic.com/2011/08/gdje-to-mi-zivimo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unobtrusive attachment of functions to events in jQuery</title>
		<link>http://blog.goranobradovic.com/2011/07/unobtrusive-attachment-of-functions-to-events-in-jquery/</link>
		<comments>http://blog.goranobradovic.com/2011/07/unobtrusive-attachment-of-functions-to-events-in-jquery/#comments</comments>
		<pubDate>Thu, 14 Jul 2011 13:32:13 +0000</pubDate>
		<dc:creator>obrad</dc:creator>
				<category><![CDATA[Moje brljotine]]></category>

		<guid isPermaLink="false">http://blog.goranobradovic.com/2011/07/unobtrusive-attachment-of-functions-to-events-in-jquery/</guid>
		<description><![CDATA[&#160; Lets say I have text input field that is part of search form, and when user clicks on find, it gets results in another part of screen. What I want is, when user changes value in some of the inputs of search form, that search results be invalidated/removed as they are not actual anymore. [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>Lets say I have text input field that is part of search form, and when user clicks on find, it gets results in another part of screen. What I want is, when user changes value in some of the inputs of search form, that search results be invalidated/removed as they are not actual anymore.</p>
<p>As search form can have many fields, I decided to make one function for resetting search, and to make unobtrusive attachment for “change” event. I did that by adding “change” attribute to input field:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>input <span style="color: #000066;">name</span><span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;Search.SomeValue&quot;</span> <span style="color: #003366; font-weight: bold;">class</span><span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;valid&quot;</span> id<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;Search_SomeValue&quot;</span> change<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;resetSearch&quot;</span> type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text&quot;</span> <span style="color: #339933;">/&gt;</span></pre></div></div>

<p>This attribute is consumed by this function:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;[change]&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> functionName <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">attr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;change&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003366; font-weight: bold;">var</span> change <span style="color: #339933;">=</span> window<span style="color: #009900;">&#91;</span>functionName<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">change</span><span style="color: #009900;">&#40;</span>change<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>What this code does is:</p>
<blockquote>
<p>- For each element with change=”something”, read something (in this case “resetSearch”) into functionName variable</p>
<p>- Read function from window object. Window object contains all globally defined functions</p>
<p>- Set this function to execute on every change of input field</p>
</blockquote>
<pre>&nbsp;</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.goranobradovic.com/2011/07/unobtrusive-attachment-of-functions-to-events-in-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Deserialize form from JSON data using jQuery</title>
		<link>http://blog.goranobradovic.com/2011/07/deserialize-form-from-json-data-using-jquery/</link>
		<comments>http://blog.goranobradovic.com/2011/07/deserialize-form-from-json-data-using-jquery/#comments</comments>
		<pubDate>Sun, 10 Jul 2011 23:12:34 +0000</pubDate>
		<dc:creator>obrad</dc:creator>
				<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[deserialization]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://blog.goranobradovic.com/?p=412</guid>
		<description><![CDATA[Recently, I got task to make feature which will make possible for user to update form data based on some unique &#8220;search&#8221; field (like VIN or SSN). I wanted to make this short and simple, and above all reusable. So, I made some investigation this weekend and came up with simple solution to use same [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, I got task to make feature which will make possible for user to update form data based on some unique &#8220;search&#8221; field (like VIN or SSN). I wanted to make this short and simple, and above all reusable. So, I made some investigation this weekend and came up with simple solution to use same model object that is used as type of view in asp.net mvc. It is simple javascript function:</p>
<p>&nbsp;</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> formPrefix <span style="color: #339933;">=</span> <span style="color: #3366CC;">'myFormPrefix'</span><span style="color: #339933;">;</span>
$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'sometextbox'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">change</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #003366; font-weight: bold;">var</span> myValue <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
 $.<span style="color: #660066;">ajax</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span> type<span style="color: #339933;">:</span> <span style="color: #3366CC;">'POST'</span><span style="color: #339933;">,</span>
  url<span style="color: #339933;">:</span> <span style="color: #3366CC;">'ajaxcontroller/getcarbysomething'</span><span style="color: #339933;">,</span>
  data<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span> something<span style="color: #339933;">:</span> myValue <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
  success<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;input[name*='&quot;</span> <span style="color: #339933;">+</span> formPrefix <span style="color: #339933;">+</span><span style="color: #3366CC;">&quot;'],select[name*='&quot;</span> <span style="color: #339933;">+</span> formPrefix <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;']&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> itemName <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">attr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;name&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> prop <span style="color: #339933;">=</span> itemName.<span style="color: #660066;">substring</span><span style="color: #009900;">&#40;</span>itemName.<span style="color: #660066;">indexOf</span><span style="color: #009900;">&#40;</span>formPrefix<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> formPrefix.<span style="color: #660066;">length</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> itemValue <span style="color: #339933;">=</span> data.<span style="color: #660066;">person</span><span style="color: #009900;">&#91;</span>prop<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>itemValue <span style="color: #339933;">&amp;&amp;</span> itemValue.<span style="color: #660066;">substring</span> <span style="color: #339933;">&amp;&amp;</span>
      itemValue.<span style="color: #660066;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;/&quot;</span> <span style="color: #339933;">&amp;&amp;</span>
      itemValue.<span style="color: #660066;">substring</span><span style="color: #009900;">&#40;</span>itemValue.<span style="color: #660066;">length</span> <span style="color: #339933;">-</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;/&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
         itemValue <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;new&quot;</span> <span style="color: #339933;">+</span> itemValue.<span style="color: #660066;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> itemValue.<span style="color: #660066;">length</span> <span style="color: #339933;">-</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
         itemValue <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">eval</span><span style="color: #009900;">&#40;</span>itemValue<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
         $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">datepicker</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;setDate&quot;</span><span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">eval</span><span style="color: #009900;">&#40;</span>itemValue<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>itemValue<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span>itemValue<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
   <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
 <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>So, to use this you need to make controller action that returns JsonResult and Json(model) instead of View(model). If form is partial view (preffered) or has explicit prefix, formPrefix is place to set it. Each form input element&#8217;s name is used to index json object returned from controller and value (if any) is set back into input element.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.goranobradovic.com/2011/07/deserialize-form-from-json-data-using-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

