вторник, 17 марта 2009 г.

Ajax Custom Form Submission Mechanism

Consider the following basic html code snippet:

<form name="detailform" method="post"
action="../someURL?Action=ProcessSubmit">
<input type="submit" value="Start">
</form>
Clicking on the "Start" button will cause the browser to collect all the form controls <name,value> pairs between the form opening and closing tags surrounding the <input...> submit button tag and post them to the server at the URL indicated in the action property of the opening form tag. So far, so good. The only thing to notice here is that the data to submit collection mechanism is completely transparent for us and that this approach of submitting data inevitably reloads the window's content in the browser, replacing whatever it currently holds with the new html response from the server.

This, of course, and especially the reloading part, can be pretty much annoying for those of us wishing to ajaxify form submissions. The reason is that we generally don't want our pages to reload in the first place, which means that the submit kind of button is certainly not an option. We have got to use a simple kind of button instead, an <input type="button"...> thus :

<form name="detailform" method="post"
action="../someURL?Action=ProcessSubmit">
<input type="submit" value="Start"
onclick="ajaxSubmit(this, 'DefaultAction')">
</form>
This in turn means that we wont be able to benefit from the automatic data to submit collection mechanism mentionned above. We will have to come up with our own parser code to build the final URL to post. In the example above clicking the "Start" button wont basically do anything else other than jumping into the ajaxSubmit() function, the rest of the work being left up to you:

function ajaxSubmit(obj, urlAction) {
if(formSubmitValidation()) {
//some working variables -- cosmetics
var baseURL;
var formNode = getFormObj(obj);
var idx1Trim = formNode.action.indexOf("..");
var idx2Trim = formNode.action.indexOf("ProcessSubmit");

if (idx1Trim!=-1) { //IE7
baseURL = formNode.action.substring(2, idx2Trim) + urlAction;
} else { //FF
baseURL = formNode.action.substring(0, idx2Trim) + urlAction;
}
//adding custom calculated parameters: timestamp, ajax tag
params = (new Date()).getTime() + "&KindRequest=Ajax";
//the actual form parsing
baseURL = baseURL + "&" + parseDOMSubTree(formNode) + params
//posting the form
ajaxRequest(baseURL);
} else {
alert("Validation Problem");
}
}

It is always a good idea to first validate the fields submited before actually submitting them. Nevertheless, this validation problem falls out of this post's scope and will therefore be left aside. The second interesting point, beside the browser related cosmetics, is the form parsing itself. This is done by the recursive parseDOMSubTree(formNode) method which takes the form-to-submit element as argument:

function parseDOMSubTree(obj) {
var url = "";
for ( var i = 0; i < obj.childNodes.length; i++) {
// we know the root has a child. does it have a tagName?
if (obj.childNodes[i].tagName != null) {
// if no - never mind, just loop further. otherwise check it
switch (obj.childNodes[i].tagName.toUpperCase()) {
/*for form elements other than the ones below, you will have to
write the url append instruction youself :) */
case "TEXTAREA":
url = url + obj.childNodes[i].name + "="
+ escape(obj.childNodes[i].value) + "&";
break;
case "INPUT":
switch (obj.childNodes[i].type.toUpperCase()) {
case "HIDDEN":
case "TEXT":
url = url + obj.childNodes[i].name + "="
+ escape(obj.childNodes[i].value) + "&";
break;
default:
}
break;
default:
// we are checking some other kind of tag. just dive into it
url = url + parseDOMSubTree(obj.childNodes[i]);
}
}
}
return url;
}

And of course, last but not least, the ajax request call responsible for managing the client-server connection. Let's take a look at the code:

function ajaxRequest(url) {

var html = "";
/*
* important flag. we are loosing the asyn aspect but still are keeping the
* neat refresh part of the ajax tehcnology
*/
var asyn = false;
// Ignore cross-browser issues for the moment being
xmlhttp = false;
if ((window.XMLHttpRequest) && !(window.ActiveXObject)) {
// asyn = true;
xmlhttp = new XMLHttpRequest();
if (xmlhttp.overrideMimeType) {
xmlhttp.overrideMimeType('text/xml');
}
} else if (window.ActiveXObject) { // IE
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
}
}
}

if (!xmlhttp) {
alert('Cannot create XMLHTTP instance');
return false;
}

xmlhttp.open("GET", url, asyn);
// Set the callback function -- needed in case of asynchronic work :-)
// xmlhttp.onreadystatechange = function() {callbackAjaxRequest(xmlhttp); };
xmlhttp.send(null);
/*
* we are operating in synchrounous mode if this ever changes - just comment
* this line and uncomment the one above
*/
callbackAjaxRequest(xmlhttp);
}


The callback method looks like this:

function callbackAjaxRequest(xmlhttp) {
if (xmlhttp.readyState == 4) {
if (xmlhttp.status == 200) {
var xmldoc = xmlhttp.responseXML;
//from here on you can manage the resulting XML as you wish

var rootNode = xmldoc.getElementsByTagName('ajax.updates')
.item(0);
var responseStatus = rootNode.getAttribute("status");
var id;

if (responseStatus == "OK") {
for (i = 0; i <>
if (rootNode.childNodes.item(i).nodeName == "item") {
id = rootNode.childNodes.item(i).getAttribute("id");
document.getElementById(id).innerHTML = rootNode.childNodes
.item(i).firstChild.nodeValue;
}
}
} else {
// for FF/IE compatibility reasons -- the objects re
for (i = 0; i <>
if (rootNode.childNodes.item(i).nodeName == "item") {
html = rootNode.childNodes.item(i).firstChild.nodeValue;
}
}
/*this document.write doesn't work in IE if asyn mode above*/
document.write(html);

}

} else {
alert("Ajax Request Problem");
}

}
}


Подробнее...

четверг, 28 февраля 2008 г.

Picasa connector for PHPNuke


When one sees the machine power and the amount of space Google is willing to give away for free to anyone who asks for it, one just can't help but thinking about the ways there are to make use of their APIs by connecting them to our older systems.

One of these old systems is PHPNuke which is a php based CMS. One of the modules responsible for embedding media resources into PHPNuke is called IndyNews and works basically by first uploading media files on the server into a _tmp directory and then, once the article is successfully submited into the DB, move all the temporary files into a definitive folder. I'll skip here the part where I explain how the system keeps track of the submitter's identity and how the media files are later retrieved based on the article SID (session-based hashing of their composite name) and go right to the part where you store the files to Picasa instead of keeping them on your server :-) This way you consume no image traffic whatsoever and your site runs on a professional level with a simple basic hosting account.

Here is how it looks in practice: http://autobelgium.ru



Isn't it beautifull?


In case interested I am ready to give my IndyNews/index.php away as well as the picasa.php driver that comes along to make all the Picasa Gdata API related connections. So... Stay tuned, folks :-)


Подробнее...

вторник, 22 января 2008 г.

New Concept For itBlogium

Well, hi to every one of you surfers who happen to visit my blog :-)

I proudly announce that starting from this moment on, my blog won't be dedicated to IT-related translations anymore. Instead, just like so many others out there, I'll share my own experience with the rest of the web. One tiny detail though... I will do it in as much languages as possible.


Подробнее...

вторник, 24 июля 2007 г.

Карта интернетовского метро

Автор: Fransisco Pisani


Представляю вашему вниманию забавную карту интернета, созданную японским агенством Intelligence Architects (iA) на основе токийского метро.

200 самых посещаемых сайтов миров сгруппированы на ней по различным категориям вроде "раздел ресурсов" (sharing), "утилиты", "технология", "социальные новости", "сообщества" и тд.



Каждый сайт обозначен номером от 0,5 à 2,5, который условно обозначает версию интернета к которой его можно отнести. Jakob Nielsen (
знатный проповедник удобных интерфейсов) уже с 1987 года находится, согласно iA, в категории 0,5 из которой никак не выберится. New York Times в категории 1, а Wall Street Journal в 0,5. Amazon и Google получили оценку всего лишь в 1,5. А вот Gmail во второй категории, также как и SecondLife и Digg. Среди самых продвинутых (версия 2,5) находятся del.icio.us, WordPress, Wikipedia и Facebook.

На карте еще присутствует прогноз погоды ;-) Прогноз этот показывает насколько безоблачно или, наоборот, туманно выглядит будущее каждой «станции».

Я тоже поиграл немного с интерактивной версией картой. Достаточно провести курсор по станции и тут же выскакивает окошко Snap. Карта также доступна в варианте «заставка экрана» (мне правда больше по душе фотки). PDF разумеется можно увеличить до читабельного размера.

Что мне понравилось во всей этой затее, так это то, что идея оригинальная и исполнена стильно. Очень удобная визуализация взаимоотношений различных сайтов. Можете попробовать например проследить за какой-нибудь линией (социальные сети, например, ведут от Meebo до Twitter через StumbleUpon и Xing) и определить в каких аспектах она пересекается с другими линиями (пример выше: в LinkedIn).

Уверен, что из этой картины получилась бы неплохая игра вроде Монополи…


Подробнее...

понедельник, 23 июля 2007 г.

Facebook - социальная ОС (III)

Автор: Fransisco Pisani

Facebook может, согласно Скотту Карпу из Publishing 2.0 стать «следующим Google». Стоит, думаю, признать, что цифры действительно подтверждают эту на первый взгляд сумасшедшую тенденцию.



Это ни все. Динамика рождает просто феноменальный рост приложения: 33% процента прироста менее чем за 3 недели; 10 приложений под платформу уже имеют более миллиона пользователей.

Старт всей затеи сильно напоминает безотказную формулу дилеров. Первая – бесплатно, но как только народ начинает подвисать... Дальше сами понимаете. Новая платформа пока предлагает всем желающим бесплатно размещать у себя свои приложения и, самое главное, не претендует на зарабатываемые таким образом - благодаря рекламе и транзакциям - деньги. А дальше?

Но это ни самое главное. Самое главное – это заразительность принципа действия. Каждый раз как Вы просматриваете профили Ваших друзей, Вы «рискуете» быть зацепленым присутствующими на их странице приложениями.

«Когда число пользователей Facebook достигнет 100 миллионов (скоро), разработка приложений под платформу станет чем-то вроде нынешнего линка на страницах Google», считает Paul Allen, предприниматель из Юта (ничего общего с другим Алленом из Microsoft).

Он уверен, что Facebook станет первой системой достигшей миллиард пользователей...

Так что? Следующий Google?

Замечу, что если Facebook этого все-таки достигнет, то это будет так сказать стартуя с противоположного конца. Его движок не основывается на какой-либо поисковой системе или иной форме искусственного интеллекта. На Facebook информация фильтруется людьми и сетью.

В этом плане платформа представляет собой олицетворением мечты тех, кто считает динамику социальных сетей второй молодостью интернета. Пункт, к которому стоит еще вернуться...

Чувствую критики хотят что-то сказать... Что? Мыльный пузырь?


Подробнее...

Facebook - социальная ОС (II)

Автор: Fransisco Pisani

Социальная сеть Facebook, являющаяся прямым конкурентом таких сайтов как MySpace, LinkedIn, Xing, Orkut, Google, Yahoo и ряда других аналогичных систем, без сомнения можно считать на сегодняшний день одной из самых горячих тем обсуждения в Сан Франциско.

Многие внимательно следили за Facebook в последнее время в связи с её головокружительным успехом в студенческой среде (85% её контингента), но после его превращения в платформу в конце мая, интерес публики превратился в настоящую страсть. Платформа Facebook позволяет всем желающим разрабатывать под нее свои сервисы и технологии, получая при этом бесплатно в обмен всю ее пользовательскую базу.

Сказать, что идея была хорошо принята сообществом – это ничего не сказать. Спустя лишь неделю после объявления, на Facebook было зарегистрировано более чем миллион дополнительных пользователей. Их уже было 24 миллиона. Прирост
до объявления равнялся 100.000 новых пользователей ежедневно и по прогнозам общее количество народа должно достигнеть 50 миллион человек еще до конца года.

Стоит также отметить, что больше половины из них, подключаются к сети каждый день (это в три раза больше, чем в большинстве других социальных сетях).

Со своими 40 миллиардами ежедневных просмотров, Facebook является на сегодняшний день шестым самым посещаемым сайтом в мире, опережая eBay и лишь немного отставая от Google. По тому же что касается обмену фоток – Facebook бесспорно мировой лидер (на этих вот страницах – 1 и 2 – подробные цифры).

За 10 дней количество предлагаемых приложений достигло 300 по сравнению с начальными 85. iLike, самое популярное из них, стартовало с 1000 пользователей в первый день и выросло до 300.000 всего за двое суток. Прирост у iLike на сегодняшний день составляет 200.000 пользователей в день, абсолютное большинство из которых приходят именно с платформы.

Секрет этой динамики заключается в ее заразительной сущности. Каждый раз как кто-то добавляет себе приложение, оно отображается в его профиле. Нажав на него Вы попадаете на его страницу и система предлагает либо прописать это приложение в Ваш профиль, либо просто приступить к работе с ним. Таким образом, выбор Ваших друзей влияет на Ваше решение в пользу приложения и «заставляет» следовать их примеру.

Как вам такой подход?

В следующей статьей затрону тему $$ на Facebook...


Подробнее...

воскресенье, 22 июля 2007 г.

Предложение itBlogium: link4ad

Не перевод.

Каждый кто когда-либо пытался раскрутить свой ресурс в интернете, знает насколько неприятно тяжело завлечь народ на свои страницы, особенно если все это делается без серьезных вложений капитала или, и того хуже, без уверенности в реальном интерессе сайта в глазах посетителей.

Ну с первым пунктом вроде все ясно (не во что пока вкладывать), а вот второй я думаю более сомнительный в случае itBlogium. Из посетителей еще никто не выдавал банальные в таких случаях фразы вроде "да это уже существует" или "ты уверен, что это кого-то интерессует?", наоборот всячески поддерживают, но давая при этом понять, что шансы на успешную раскрутку малы, возвращаясь собственно к тому с чего я начал это сообщение.

Но так вот... Немного подумав, я решил поступить следующим образом: предлагаю всем желающим разместить на моих страницах (см. пример расположения на рис. ниже) свои блоки AdSense (или иную другую рекламу подходящего формата), которые в отличии от остальной рекламы вроде простых баннеров имеют свойство приносить "копеечки" практически сразу после размещения. В обмен на этот жест доброй воли, я прошу разместить у себя на сайте ссылки на мой блог (в идеале мои RSS feedки, но любые другие варианты тоже подойдут).



Сделка будет заключаться в следующем... Мне - трафик, Вам - бонус. Чем больше от Вас народу, тем выгоднее нам всем. При этом я гарантирую, что все клики с Вашей страницы будут отображать именно Вашу рекламу. Все легально, все честно.


Подробнее...