<?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>Advanced Programming Stories &#187; jQuery</title>
	<atom:link href="http://developstories.gr/cat/jquery/feed/" rel="self" type="application/rss+xml" />
	<link>http://developstories.gr</link>
	<description>advanced web development techniques &#38; reverse engineering stories</description>
	<lastBuildDate>Tue, 27 Jul 2010 12:57:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Google Maps: Markers σε ομάδες με τον MarkerClusterer</title>
		<link>http://developstories.gr/jquery/google-maps-markers-%cf%83%ce%b5-%ce%bf%ce%bc%ce%ac%ce%b4%ce%b5%cf%82-%ce%bc%ce%b5-%cf%84%ce%bf%ce%bd-markerclusterer/</link>
		<comments>http://developstories.gr/jquery/google-maps-markers-%cf%83%ce%b5-%ce%bf%ce%bc%ce%ac%ce%b4%ce%b5%cf%82-%ce%bc%ce%b5-%cf%84%ce%bf%ce%bd-markerclusterer/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 10:48:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google maps]]></category>

		<guid isPermaLink="false">http://developstories.gr/?p=105</guid>
		<description><![CDATA[Το παρών άρθρο είναι ένα guest post απο τον Αλέξη Μπρέσσα. Στο άρθρο προϋποθέτουμε ότι ο αναγνώστης γνωρίζει javascript, και θα βοηθούσε να έχει ασχοληθεί με το Google Maps API στο παρελθόν.
Το Google Maps API έδωσε τη δυνατότητα στους web developers να προσθέτουν χάρτες σε ιστοσελίδες, και να &#8220;σημαδεύουν&#8221; σημεία με markers.
Έτσι, έχει γίνει standard [...]]]></description>
			<content:encoded><![CDATA[<p>Το παρών άρθρο είναι ένα guest post απο τον <a href="http://www.facebook.com/abresas">Αλέξη Μπρέσσα</a>. Στο άρθρο προϋποθέτουμε ότι ο αναγνώστης γνωρίζει javascript, και θα βοηθούσε να έχει ασχοληθεί με το Google Maps API στο παρελθόν.</p>
<p>Το <a href="http://code.google.com/apis/maps/">Google Maps API</a> έδωσε τη δυνατότητα στους web developers να προσθέτουν χάρτες σε ιστοσελίδες, και να &#8220;σημαδεύουν&#8221; σημεία με markers.<br />
Έτσι, έχει γίνει standard για πολλές κατηγορίες ιστοσελίδων, όπως μεσητικά, <a href="http://www.businesscatalogue.gr/">κατάλογοι επιχειρήσεων</a> κ.α. ή για τη σελίδα επικοινωνίας εταιρειών.<br />
Εάν όμως οι καταχωρήσεις μιας ιστοσελίδας αυξηθούν αρκετά, τότε τα πολλά markers μειώνουν τη χρηστικότητα ενός χάρτη, ενώ μπορεί κανείς να φτάσει και σε τραγική<br />
κατάληξη όπως αυτή:</p>
<p><a href="http://imagehoster.eu/"><img class="alignnone" title="tragic" src="http://imagehoster.eu/images/ku825hfsv1zctasahl36.jpg" alt="" width="500" height="400" /></a></p>
<p>Προς μεγάλη ευκολία όποιου αντιμετωπίσει αυτό το πρόβλημα, έχει αναπτυχθεί ένα εργαλείο το οποίο φαίνεται να μην είναι ευρέως γνωστό: το MarkerClusterer.<br />
To MarkerClusterer λύνει το πρόβλημα με το να φτιάχνει ομάδες από markers, όταν αυτά είναι το ένα πολύ κοντά στο άλλο. Το παραπάνω τραγικό παράδειγμα,<br />
τώρα γίνεται πιο συμμαζεμένο, όμορφο, μέχρι και εντυπωσιακό:</p>
<p><a href="http://imagehoster.eu/"><img class="alignnone" title="impressive" src="http://imagehoster.eu/images/kg27l80fqp80tcy70epy.jpg" alt="" width="501" height="400" /></a></p>
<p>Για να δούμε πώς μπορεί κανείς να χρησιμοποιήσει το MarkerClusterer:</p>
<pre class="brush: jscript;">
function map_init( mapElement ) {
var greece = new GLatLng( 39.1130, 24.0313 );
var thessaloniki = new GLatLng( 40.5408, 23.0480 );

var gmap = new GMap2( mapElement );
gmap.setUIToDefault();
gmap.setCenter( greece, 7 );

// σε αυτό τον πίνακα θα προσθέσεις τα markers που θέλεις
var markers = [];

// εδώ προσθέτουμε markers σε 20 τυχαία σημεία κοντά στη Θεσσαλονίκη
for ( var i = 0; i &lt; 20; ++i ) {
var latoffset = Math.random() - 0.5;
var lngoffset = Math.random() - 0.5;
var latlng = new GLatLng( thessaloniki.lat() + latoffset, thessaloniki.lng() + lngoffset );
var marker = new GMarker( latlng );

// προσθήκη του marker στον πίνακα
markers.push( marker );
}

// δημιουργία του clusterer και προσθήκη των markers στο χάρτη
var clusterer = new MarkerClusterer( gmap, markers );
}
</pre>
<p>Αρκεί λοιπόν τώρα κανείς να καλέσει τη συνάρτηση map_init με παράμετρο ένα &lt;div&gt; που θα χρησιμοποιηθεί<br />
για το χάρτη. Συνήθως θα καλείται όταν φορτώσει η ιστοσελίδα. Με <a href="http://developstories.gr/cat/jquery/">jquery</a>, αν το div έχει id=&#8221;map_canvas&#8221;:</p>
<pre class="brush: jscript;">
$( document ).ready( function() {
map_init( $( 'map_canvas' )[ 0 ] );
} );
</pre>
<p>Θα πρέπει επίσης να προσθέσετε το javascript αρχείο του Google Maps (με το απαραίτητο key) και του MarkerClusterer<br />
(και βέβαια το jquery αν χρησιμοποιηθεί αυτό) στον HTML κώδικά σας:</p>
<pre class="brush: jscript;">
&lt;script type=&quot;text/javascript&quot; src=&quot;http://maps.google.com/maps?file=api&amp;amp;v=2&amp;amp;key=GOOGLE_MAPS_KEY&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://gmaps-utility-library-dev.googlecode.com/svn/tags/markerclusterer/1.0/src/markerclusterer_packed.js&quot; /&gt;
</pre>
<p>Μπορείτε επίσης να δείτε τον MarkerClusterer εν δράσει στο <a href="http://www.businesscatalogue.gr">business catalogue</a>.</p>
<p>Ο MarkerClusterer είναι μέρος μιας βιβλιοθήκης πολλών εργαλείων για Google Maps που ονομάζεται &#8220;GMaps Utility Library&#8221; και μπορεί κανείς να τη <a href="http://code.google.com/p/gmaps-utility-library-dev">βρει εδώ</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://developstories.gr/jquery/google-maps-markers-%cf%83%ce%b5-%ce%bf%ce%bc%ce%ac%ce%b4%ce%b5%cf%82-%ce%bc%ce%b5-%cf%84%ce%bf%ce%bd-markerclusterer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Social Whale Groups jQuery plugin</title>
		<link>http://developstories.gr/jquery/socialwhale-widget-plugin/</link>
		<comments>http://developstories.gr/jquery/socialwhale-widget-plugin/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 13:32:14 +0000</pubDate>
		<dc:creator>thek</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[social whale]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://developstories.gr/?p=93</guid>
		<description><![CDATA[Όπως θα έχετε διαπιστώσει το SocialWhale είναι το project που αφιερώνω τον περισσότερο χρόνο μου στο development. Αυτό μου δίνει το πλεονέκτημα να ασχολούμαι με πολύ ενδιαφέροντα αντικείμενα (ff extensions, betavine, jquery plugins, api&#8217;s κτλ). Έτσι έχω εμπλουτίσει τις γνώσεις μου πάνω στην javascript και ποιο συγκεκριμένα στο jquery framework.
Η συνεισφορά της ομάδας του SocialWhale [...]]]></description>
			<content:encoded><![CDATA[<p>Όπως θα έχετε διαπιστώσει το <a title="Social Whale" href="http://socialwhale.com">SocialWhale</a> είναι το project που αφιερώνω τον περισσότερο χρόνο μου στο development. Αυτό μου δίνει το πλεονέκτημα να ασχολούμαι με πολύ ενδιαφέροντα αντικείμενα (<a href="https://addons.mozilla.org/en-US/firefox/addon/11718/">ff extensions</a>, <a href="http://widget.vodafone.com/dev/widgets/social_whale_mini_1457">betavine</a>, <a href="http://plugins.jquery.com">jquery plugins</a>, <a href="http://en.wikipedia.org/wiki/Application_programming_interface">api&#8217;s</a> κτλ). Έτσι έχω εμπλουτίσει τις γνώσεις μου πάνω στην <a href="http://en.wikipedia.org/wiki/JavaScript">javascript</a> και ποιο συγκεκριμένα στο <a href="http://jquery.com">jquery framework</a>.</p>
<p>Η συνεισφορά της <a href="http://twitter.com/socialwhale/team">ομάδας του SocialWhale</a> για το <a href="http://wordcamp.gr">wordcampGR</a> event ήταν και η αφορμή για την δημιουργία ενός <a href="http://plugins.jquery.com/project/jwhale">jquery plugin</a> (<a href="http://twitter.com/thek27">thek27</a>) σε συνδυασμό με ένα wordpress plugin (<a href="http://twitter.com/humanworks">humanworks</a>) το οποίο παρουσιάζει ένα <a href="http://groups.socialwhale.com/1">SocialWhale Group</a> σε ένα <a href="http://wordcamp.gr/socialwhale">widget</a>. Για τους registered χρήστες υπάρχει και η δυνατότητα για vote και post στο group.</p>
<p>Αν και έχω ασχοληθεί παρά πολύ με τα plugins του jquery (ui, autocomplete, bt, fancybox, jGrowl, κ.α.) δεν είχα κάνει ποτέ κάποιο δικό μου όποτε ξεκίνησα από την αρχή, με reverse σε υπάρχοντα plugins και search στο google για tutorials και παραδείγματα.</p>
<p>Αφού βρήκα το <a href="http://denis.tumblr.com/post/51601242/a-simple-jquery-plugin-skeleton">skeleton</a> για το plugin η συνέχεια ήταν εύκολη υπόθεση, copy/paste από κώδικα socialwhale, εκτός από 2 σημεία που έπρεπε να βρούμε μια έξυπνη λύση. Το πρώτο ήταν το <a href="http://oauth.net">oauth</a> login που έπρεπε να γίνει από το site του socialwhale και στην συνέχεια να γίνεται redirect πίσω, ώστε να εμφανιστεί η φόρμα για το post και το action για το vote. Το δεύτερο ήταν και το ποιο ενδιαφέρον, γιατί ήθελα να βρω μια λύση με iframe για να αποφύγω το <a href="http://en.wikipedia.org/wiki/Cross-site_scripting">cross site scripting</a> που δεν παίζει με <a href="http://groups.google.com/group/jquery-en/browse_thread/thread/8bd0e249e2041b3b">ajax post</a>.</p>
<p>Ας τα πάρουμε από την αρχή, το socialwhale είναι έτσι φτιαγμένο που έχει δικό του api (extended πάνω στο twitter), έτσι για να καταλάβουμε αν ένας χρήστης είναι logged on ελέγχουμε το attribute voted από το json result (πχ <a href="http://groups.socialwhale.com/groups_api/timeline/both/1.json">groups_api/timeline/both/1.json</a>), και αν αυτό είναι null, τότε δεν είναι, διαφορετικά σημαίνει αν έχει κάνει vote το συγκεκριμένο update. Τώρα για το login απλά φτιάξαμε ένα button στο http://socialwhale.com/oauth όπου το φορτώνουμε με iframe, έτσι όλος ο υπόλοιπος κώδικας βρίσκεται στον server, ώστε να μπορούμε να ελέγχουμε όλα τα <a href="http://widgetmotion.com/">widget</a> από ένα oauth login, αυτό του socialwhale. Έτσι αν ένας χρήστης είναι login στο socialwhale, τότε είναι ταυτόχρονα login σε όλα τα widgets  ανεξαρτήτου group.</p>
<p>Τώρα όσο αφορά το submit της φόρμας, σκέφτηκα την λογική του iframe, αλλά με δυναμικό τρόπο, ώστε να έχω και τον έλεγχο του <a href="http://old.nabble.com/Trigger-ajax-event-on-iframe-load-td20294154s27240.html">onload event</a>. Ποιο συγκεκριμένα να δημιουργείτε στο runtime ένα <a href="http://stackoverflow.com/questions/205087/jquery-ready-in-a-dynamically-inserted-iframe">iframe με src=&#8221;about:blank&#8221;</a> και να γεμίζει με την φόρμα που στην συνέχεια γίνεται submit στο socialwhale. Μόλις επιστρέψει το post εμφανίζει στο body ένα div που έχει μέσα το json object και γίνεται trigger το load event του iframe. Έτσι στην συνέχεια γίνεται refresh το timeline και εμφανίζονται τα νέα posts.</p>
<p>Όπως και μάθε plugin έτσι και αυτό έχει options για πόσα rows, αν θα έχει auto refresh κτλ.<br />
Παράδείγματα μπορείτε να δείτε στο <a href="http://wordcamp.gr/socialwhale/">wordcamp.gr</a> και στο <a href="http://blog.socialwhale.com/wpwhale-demo">blog.socialwhale.com</a>.</p>
<p>Το plugin είναι κάτω από <a href="http://www.gnu.org/licenses/gpl.html">GPL licence</a> το <a href="http://blog.socialwhale.com/2010/01/30/social-whale-group-plugins/">Copyright</a> ανήκει στο SocialWhale και βρίσκεται στο  <a href="http://code.google.com/p/jwhale">google code</a> με την ονομασία jwhale.</p>
]]></content:encoded>
			<wfw:commentRss>http://developstories.gr/jquery/socialwhale-widget-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery UI Tab conflict with xStandard</title>
		<link>http://developstories.gr/jquery/jquery-ui-tab-conflict-with-xstandard/</link>
		<comments>http://developstories.gr/jquery/jquery-ui-tab-conflict-with-xstandard/#comments</comments>
		<pubDate>Wed, 06 Aug 2008 09:58:08 +0000</pubDate>
		<dc:creator>thek</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://developstories/?p=22</guid>
		<description><![CDATA[
Χρησιμοποίησα την jQuery με το plugin της UI για tabs, και ταυτόχρονα το ActiveX του XStandard για WYSIWYG XHTML editor, με αποτέλεσμα να χάνει το περιεχόμενο από τον editor στην αλλαγή των tabs. Το πρόβλημα το έλυσα με ένα patch του ui στη function tabify. Ποιο συγκεκριμένα, το plugin στο init των tabs, έκανε όλα [...]]]></description>
			<content:encoded><![CDATA[<h3 class="post-title entry-title"></h3>
<p>Χρησιμοποίησα την <a href="http://jquery.com/">jQuery</a> με το plugin της <a href="http://ui.jquery.com/">UI</a> για tabs, και ταυτόχρονα το <a href="http://en.wikipedia.org/wiki/ActiveX">ActiveX</a> του <a href="http://xstandard.com/">XStandard</a> για <a href="http://en.wikipedia.org/wiki/WYSIWYG">WYSIWYG</a> XHTML editor, με αποτέλεσμα να χάνει το περιεχόμενο από τον editor στην αλλαγή των tabs. Το πρόβλημα το έλυσα με ένα patch του ui στη function tabify. Ποιο συγκεκριμένα, το plugin στο init των tabs, έκανε όλα τα panels hide και στην συνέχεια visible το selected. Αυτό που πείραξα εγώ, είναι να κάνει hide όλα εκτός από το selected.</p>
<pre class="brush: jscript;">
// highlight selected tab
this.$panels.addClass(o.hideClass);

/* PATCHED BY THEK (not select tab invisible) */
var cc=0;
this.$panels.each(function() {
 var $this = $(this);
 if (cc++!=o.selected) $this.addClass(o.hideClass);
});
//this.$panels.addClass(o.hideClass);
//
/* PATCH BY THEK */
</pre>
]]></content:encoded>
			<wfw:commentRss>http://developstories.gr/jquery/jquery-ui-tab-conflict-with-xstandard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
