Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

AJAX og æøå i Opera

16 views
Skip to first unread message

Jørn Andersen

unread,
Mar 2, 2012, 1:04:11 PM3/2/12
to
Hej,

Jeg har en søgeside til en medlemsdatabase, hvor søgeresultaterne
vises dynamisk v. hj. a. AJAX.

Det fungerer for så vidt udmærket (og har gjort det i et 3-4 år), men
da jeg ved et tilfælde kom til at bruge det i Opera (*), opdagede jeg,
at når søgningen indeholdt æøå, så kom der ingen resultater. Så jeg
går ud fra, at det er et charset-problem.

Det virker OK i IE, Firefox og Safari (alle Windows 7), og det er ikke
særligt sandsynligt, at nogle i brugergruppen kommer til at bruge
siden med Opera, så det er ikke et akut problem.

Men det generer mig alligevel, så hvis nogen har en idé om, hvad der
kan være galt, så ville jeg blive glad :-)

Søgesiden er iso-8859-1. Jeg kan desværre ikke give et link, da der
som sagt er tale om en medlemsdatabase.

*) Opera 11.60, Windows 7

Mvh. Jørn

--
Jørn Andersen
http://socialister.dk
http://marxisme.dk

Jørn Andersen

unread,
Mar 2, 2012, 2:04:59 PM3/2/12
to
On Fri, 02 Mar 2012 19:04:11 +0100, Jørn Andersen <jo...@jorna.dk>
wrote:

>da jeg ved et tilfælde kom til at bruge det i Opera (*), opdagede jeg,
>at når søgningen indeholdt æøå, så kom der ingen resultater.

Det ser ud til at hjælpe, hvis man i AJAX-scriptet bruger escape() på
søgestrengen, når den skal kalder den .asp-side, der leverer
søgeresultatet.

Er det den rigtige måde at gøre det på?

Birger Sørensen

unread,
Mar 2, 2012, 6:27:39 PM3/2/12
to
Jørn Andersen skrev den 3/2/2012:
> On Fri, 02 Mar 2012 19:04:11 +0100, Jørn Andersen <jo...@jorna.dk>
> wrote:
>
>> da jeg ved et tilfælde kom til at bruge det i Opera (*), opdagede jeg,
>> at når søgningen indeholdt æøå, så kom der ingen resultater.
>
> Det ser ud til at hjælpe, hvis man i AJAX-scriptet bruger escape() på
> søgestrengen, når den skal kalder den .asp-side, der leverer
> søgeresultatet.
>
> Er det den rigtige måde at gøre det på?
>
> Mvh. Jørn

AJAX bruger altid utf-8.
Så dit script der modtager AJAX-kaldet, bør utf8_decode() inkomne data
og utf8_encode() udgående, når du bruger ISO på siden.

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://skippersevent.dk


Jørn Andersen

unread,
Mar 6, 2012, 3:32:06 PM3/6/12
to
On Sat, 03 Mar 2012 00:27:39 +0100, Birger Sørensen
<s...@bbsorensen.com> wrote:

>AJAX bruger altid utf-8.
>Så dit script der modtager AJAX-kaldet, bør utf8_decode() inkomne data
>og utf8_encode() udgående, når du bruger ISO på siden.

Mange tak! Jeg får ikke lige tid toil at lege med det de næste dage,
men det er "skrevet bag øret" :-)

Stig Johansen

unread,
Mar 8, 2012, 2:07:52 AM3/8/12
to
Birger Sørensen wrote:

> AJAX bruger altid utf-8.

Ja - eller rettere XMLHTTPRqeuest.

> Så dit script der modtager AJAX-kaldet, bør utf8_decode() inkomne data
> og utf8_encode() udgående, når du bruger ISO på siden.

Jaaah Birger, nu bruger Jørn ASP og ikke PHP ;-)

Løsningen er at bruge en _ordentlig 'AJAX' funktion med clientside
conversion.

Kildekode her (AJAX):----------------------------------- incl debug ;-)

// --------------- Global call ------------------------ //
function
callXMLHTTPRequest(getpost,URI,URIdata,Bodydata,callBackfunction,callBackdata,async,toAnsi,headers)
{
var cXMLHTTPRequest ;
try { cXMLHTTPRequest = new XMLHttpRequest(); }
catch (e) {
try { cXMLHTTPRequest = new ActiveXObject("Msxml2.XMLHTTP"); }
catch (e) {
try { cXMLHTTPRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {
alert ('Error: unable to create XMLHTTPRequest!');
return false;
}
}
}

for (var i=0; i<URIdata.length; i++) URIdata[i] =
encodeURIComponent(URIdata[i]) ;
for (var i=0; i<Bodydata.length; i++) Bodydata[i] =
encodeURIComponent(Bodydata[i]) ;

// conver to Ansi ?
if ( toAnsi == true ) {
for (var i=0; i<URIdata.length; i++) URIdata[i] = uriutf8toansi
(URIdata[i],0) ;
for (var i=0; i<Bodydata.length; i++) Bodydata[i] = uriutf8toansi
(Bodydata[i],0) ;
}
// make an uri from array
var fullURI = URI ;

for (var i=0; i<URIdata.length; i++) {
if ( i % 2 == 0 ) fullURI = fullURI + ((i==0) ? '?':'&') +
URIdata[i] ; else fullURI = fullURI + '=' + URIdata[i] ;
}

// make body data from array
var urlencodedBodydata ='';

for (var i=0; i<Bodydata.length; i++) {
if ( i % 2 == 0 ) urlencodedBodydata += ((i==0) ? '':'&') +
Bodydata[i] ; else urlencodedBodydata += '=' + Bodydata[i] ;
}

var oldKonqueror = '' ; // "=true&"; // just dummy
urlencodedBodydata = oldKonqueror + urlencodedBodydata + '
'; // filler to extra header length
cXMLHTTPRequest.open( getpost, fullURI , async); //+ (debug ?
'?/&debug='+debug:'') , async); /////// <---- to here
// open skal kaldes før resdystate sættes, da IE sletter den tidligere ved
open.
if ( !async && window.navigator.appName.indexOf( 'Netscape') > -1 ) {
cXMLHTTPRequest.onload = function () {
if ( cXMLHTTPRequest.readyState == 4 ) {
callBackfunction(cXMLHTTPRequest.responseText,
callBackdata,callBackProlog (cXMLHTTPRequest),cXMLHTTPRequest);
callBackEpilog (cXMLHTTPRequest);
}
}
} else {
cXMLHTTPRequest.onreadystatechange = function () {
if ( cXMLHTTPRequest.readyState == 4 ) {
callBackfunction(cXMLHTTPRequest.responseText,
callBackdata,callBackProlog (cXMLHTTPRequest),cXMLHTTPRequest);
callBackEpilog (cXMLHTTPRequest);
}
}
}

// ------> moved up cXMLHTTPRequest.open( getpost, fullURI
+'&debug='+debug , async);
for (var i=0; i<headers.length / 2 ; i++) {
cXMLHTTPRequest.setRequestHeader( headers[i*2],headers[i*2+1]);
}

if (getpost == 'post') {
cXMLHTTPRequest.setRequestHeader("Content-type",
"application/x-www-form-urlencoded;");
// cXMLHTTPRequest.setRequestHeader("Content-length",
urlencodedBodydata.length ); // 'patch gammel konq
}
cXMLHTTPRequest.send(urlencodedBodydata);
return true;

}

function callBackProlog (lXMLHTTPRequest) {
if ( lXMLHTTPRequest.status != 200 && lXMLHTTPRequest.status != 100 &&
lXMLHTTPRequest.status != 304 ) {
if (confirm( 'Error XMLHTTPRequest ' + lXMLHTTPRequest.status +
'\r\nOpen debug window?')){
var debugWindow = window.open('','Debug_data');
debugWindow.document.open("text/html", "replace");
debugWindow.document.write(lXMLHTTPRequest.responseText);
debugWindow.document.close();
}
return false ;
}
return true ;
}

function callBackEpilog (lXMLHTTPRequest) {
lXMLHTTPRequest = null ;
}

---------------------------------------------------------
Og UTF8toAnsi er her:
------------------------------------------------------------
function uriutf8toansi (utf8string,table) {
var utf8table =
'80,81,82,83,84,85,86,87,88,89,8a,8b,8c,8d,8e,8f,90,91,92,93,94,95,96,97,98,99,9a,9b,9c,9d,9e,9f,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,aa,ab,ac,ad,ae,af,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,ba,bb,bc,bd,be,bf' ;
var ansistring ;
var p ;
var s;
var l;
var c;
var nc ='' ; // new char
var nv ; // new hex value

if ( table == 0 ) c = '%C2'; else c = '%C3' ;
p = utf8string.indexOf(c);

if ( p == -1 ) {
ansistring = utf8string ;
}
else {
l = utf8string.length ;
ansistring = '';
s = 0 ;
while ( p >= 0 )
{
if ( p-s > 0 ) {
ansistring = ansistring + utf8string.substring(s,p);
}
nv =
utf8table.indexOf(utf8string.substring(p+4,p+6).toLowerCase()) / 3 + 128 +
table * 64 ;
nc = '0' + nv.toString(16) ;
ansistring = ansistring + '%' + nc.substring(nc.length
-2,nc.length).toUpperCase();
s = p + 6 ;
p = utf8string.substring(s,l).indexOf(c) ;
if ( p>= 0 ) p += s ;
}
if ( s <= l ) ansistring = ansistring + utf8string.substring(s,l) ;
}
if ( table == 0 ) {
return uriutf8toansi (ansistring,1) ;
}
else {
return ansistring ;
}
}

Kildekode
slut--------------------------------------------------------------------------------

Seek and you shall find.....


--
Med venlig hilsen
Stig Johansen

Rune Jensen

unread,
Mar 12, 2012, 12:08:38 PM3/12/12
to
On 8 Mar., 08:07, Stig Johansen <wopr...@gmail.com> wrote:

> Løsningen er at bruge en _ordentlig 'AJAX' funktion med clientside
> conversion.

Kunne du give en kort beskrivelse af brug...

:)


MVH
Rune Jensen

Andreas Andersen

unread,
Mar 12, 2012, 12:58:33 PM3/12/12
to
Den 08-03-2012 08:07, Stig Johansen skrev:
> Birger Sørensen wrote:
>
>> AJAX bruger altid utf-8.
>
> Ja - eller rettere XMLHTTPRqeuest.
>
>> Så dit script der modtager AJAX-kaldet, bør utf8_decode() inkomne data
>> og utf8_encode() udgående, når du bruger ISO på siden.
>
> Jaaah Birger, nu bruger Jørn ASP og ikke PHP ;-)
>
> Løsningen er at bruge en _ordentlig 'AJAX' funktion med clientside
> conversion.
>
> Kildekode her (AJAX):----------------------------------- incl debug ;-)

Jeg troede ikke, der var nogen, der lavede den slags uden jQuery nu til
dags.

--
Andreas

Stig Johansen

unread,
Mar 19, 2012, 7:01:13 AM3/19/12
to
Andreas Andersen wrote:

> Jeg troede ikke, der var nogen, der lavede den slags uden jQuery nu til
> dags.

Jooh, men det er nok f� ;-)

Jeg har arbejdet med udvikling i 32 �r, s� det er 10 gange lettere (og
bedre) at lave det selv frem for at s�tte sig ind i den der 'ting'.

Min version bruger ikke 'clousures' og l�ber derfor ikke t�r fo rmemory ved
f.eks. chat's.

Men brug i bare jQuery ;-)

Stig Johansen

unread,
Mar 19, 2012, 7:06:37 AM3/19/12
to
Har du ikke selv en kopi af w-o-p-r.dk ?

Jeg har lagt det til fri download og givet link på et tidspunkt.

Men 'Gonzales' ASP:
-------------------------------------------------------------
<%@ LANGUAGE = VBScript%><%Option Explicit%><%
Dim pagetitle
pagetitle = "Shoutbox"
Response.Charset = "iso-8859-1"
%><!--#include virtual="/include_files/wopr.ipcheck.inc.asp"--><!--#include
virtual="/include_files/doctype.inc.asp"-->
<link href="shoutbox.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="/javascript/UTF8toAnsi.js"></script>
<script type="text/javascript"
src="/javascript/callXMLHTTPRequest.js"></script>
<script type="text/javascript" src="shoutbox.js"></script>
</head>

<body onload="initiate();">

<h2><img src="/images/gonzales.png" alt="Gonzales" />&nbsp;&nbsp;AJAX
ShoutBox &nbsp;&nbsp; <img src="/images/roadrunner.png" alt="roadrunner" />
<a href="messagerss.asp?limit=10"><img src="/images/rss.png" alt="rss" />
rss</a></h2>
<div id="statusline"><div id="status"> Status: </div><div
id="numbermessages">Ingen nye meddelslser</div></div>
<div id="chatbox"></div>
<div id="users"></div>

<!-- Ths fieldset is the user input area -->
<div id="namepass">
<input id="username" name="username" value="username" type="text" />
<input id="pasord" name="pasord" value="password" type="text" />
<textarea wrap="off" cols="115" rows="4" id="messagebody" name="messagebody"
onkeypress="process(event)" onkeydown="shift(event)">Tekst her</textarea>
<input id="ctrl1" name="ctrl1" value="" type="text" />
<input id="ctrl2" name="ctrl2" value="" type="text" />
</div>
<div id="left-panel">
<input onclick="dosendmessage(ismessage);" value="Send" id="send"
type="button" />
<input onclick="dosendmessage(islogoff);" value="Log af" id="logoff"
type="button" />
</div>
<!-- right panel: refresh rate, time on/off, users online -->
<div>
<input id="scroolnew" name="scroolnew" checked="checked"
type="checkbox" />
<select name="refresh" id="refresh" onchange="changerefreshrate();"
title="Opdaterinshastighed på chatbox og users online-oversigt">
<option>Refresh rate</option>
<option value="500">500 milisekunder</option>
<option value="5000" selected="selected">5 sekund
[defaut]</option>
<option value="2000">2 sekunder</option>
<option value="5000">5 sekunder</option>
<option value="10000">10 sekunder</option>
</select>
<input onchange="switchshowtime();" id="vistid" name="vistid"
type="checkbox" checked="checked" />
</div>
<!-- include
virtual="/include_files/comment.scripts/comments.2.v2.inc.asp"-->
</body>
</html>
------------------------------------------------------------------
Og shoutbox.js:
-------------------------------------------------------------------
// Change to debug
var debug = false; // true ; //

// startværdier
var initmessageids = '10150' ; // Here you can change the lowest message id,
when it becomes too big.
var messageids = initmessageids ;
var userchange = '0' ; // just an inital value
var nobody = "Gæst" ;
// defined here for overview and debug
var newmessageurl = 'NewMessage.asp'
// var newmessageurl = 'AspInfo.asp'

var userlisturl = 'users.asp' ;

// til shoutbox html
var ismessage = '1' ; // messagetype
var islogoff = '3' ; // messagetype

// XMLHTTPRequest objekter + vars
var messagetimer;
var messageinprogress = false ;

// Show time in message
var showtimeinchat = false ; // heck refresh as rate

//****************************************************************

var c1=0;
var c2=0;
var upDRate = 1000 ;
var params = "lorem=ipsum&amp;name=binny";

function initiate() {
changerefreshrate();
showtimeinchat = document.getElementById('vistid').checked;
dogetmessages();
}

//************************************************************
function changerefreshrate() {
upDRate = document.getElementById('refresh').value;
}
//************************************************************

function dogetmessages() {
getnewmessages('messages.asp');
}

function getnewmessages(url) {
callXMLHTTPRequest('get',url
['messageids',messageids,'showtimeinchat',showtimeinchat]
[],messagesready,null,true,true,['messageids', messageids]);
}
function messagesready(responsedata,returndata,isOK,X) {
if ( isOK ) {
if ( X.getResponseHeader('messageids') != messageids ) {
updatemessages (responsedata );
var numbermessages =
Math.round(X.getResponseHeader('messageids')*100/100) - messageids ;
document.getElementById('numbermessages').innerHTML =
numbermessages + " Nye Meddelelser";
messageids = X.getResponseHeader('messageids');
/* Scroll til sidste meddelelse i chatboksen */
scrollToBottom();
}
/* Timeren sættes først i gang igen, når hent er færdig og data
behandlet */
messagetimer=setTimeout("dogetmessages()",upDRate);
}
}

function updatemessages(newmessages) {
var boxnode = document.getElementById('chatbox');

var m = document.createElement('div');

newmessages = newmessages.substring(newmessages.indexOf('<ul>') +
4,newmessages.length - 5 );
m.innerHTML = newmessages ;
// m.text.value = newmessages ;
boxnode.appendChild(m);
getuserlist(userlisturl);
}

//************************************************************

function dogetuserlist() {
getuserlist('users.asp');
}

function getuserlist(url) {
callXMLHTTPRequest('get',url,['userchange',userchange]
[],userlistready,null,true,true,['userchange', userchange]);
}

function userlistready(responsedata,returndata,isOK,X) {
if ( isOK ) {
if ( X.getResponseHeader('userchange') != userchange ) {
document.getElementById('users').innerHTML = responsedata;
userchange = X.getResponseHeader('userchange');
}
}
}
//************************************************************

function dosendmessage(messagetype) {
var messagebody = document.getElementById( 'messagebody').value;
var username = document.getElementById('username').value;

if ( (messagebody != "" && username != "" && username !=nobody ) ||
messagetype == "3" ) {
callXMLHTTPRequest('post',newmessageurl
['messagetype',messagetype,'ctrl1',document.getElementById('ctrl1').value,'ctrl2',document.getElementById('ctrl2').value]
['Username',username,'MessageBody',messagebody,'pasord',document.getElementById('pasord').value],messageissent,null,true,true
['Content-type', 'application/x-www-form-urlencoded; charset =
iso-8859-1']) ;
}
else {
document.getElementById('status').innerHTML = "Status: Meddelelse ikke
sendt. Skriv et nick og en meddelelse";
}
}

function messageissent(responsedata,returndata,isOK,X) {
if ( isOK ) {
document.getElementById('messagebody').value = "";
// document.getElementById('username').disabled = "disabled";
document.getElementById('status').innerHTML = "Status: Meddelelse
sendt";
document.getElementById( 'ctrl1').value =
X.getResponseHeader('ctrl1') ;
document.getElementById( 'ctrl2').value =
X.getResponseHeader('ctrl2') ;
document.getElementById( 'pasord').style.display =
X.getResponseHeader('displaypasord') ;
document.getElementById( 'username').style.display =
X.getResponseHeader('displayusername') ;
document.getElementById( 'pasord').value = "" ;
dogetmessages() ;
}
}

//************************************************************

function clrText(cText,cId) {
if (document.getElementById(cId).value == (cText)) {
document.getElementById(cId).value = "";
document.getElementById('status').innerHTML = "Status: Skriv en
meddelelse";
}
return false;
}

function defText(dText,dId) {
if (document.getElementById(dId).value == "") {
document.getElementById(dId).value = dText;

}
}

function scrollToBottom() {
// var doscroll = document.getElementById('scroolnew').checked;
if ( doscroll = document.getElementById('scroolnew').checked == true ) {
var elem = document.getElementById('chatbox');
elem.scrollTop = elem.scrollHeight;
}
}

function switchshowtime() {
showtimeinchat = !showtimeinchat
messageids = initmessageids ;
document.getElementById('chatbox').innerHTML = ""
if (messagetimer) clearTimeout(messagetimer);
dogetmessages() ;
}

var isShift=null;
var isNN = (navigator.appName.indexOf("Netscape")!=-1);
var OP = (navigator.appName.indexOf("Opera")!=-1);
if(OP)isNN=true;
var key;

function shift(event){
key = (isNN) ? event.which : event.keyCode;
if (key==17)isShift=1;
}

function process(event){
key = (isNN) ? event.which : event.keyCode;
if(document.layers&&event.modifiers==Keys.ControlKey){ // modifiers if
((key != Keys.Menu) && (key != Keys.ControlKey) && (key != Keys.ShiftKey))
isShift=1;
}
if (key==13&&isShift==1){
dosendmessage(ismessage);
this.value = "";
}
if (key!=17)isShift=null;
}
--------------------------------------------------------

Det er en tidlig inkarnation, så der er sikkert redundans i de
forskellige .js filer.

Rune Jensen

unread,
Mar 19, 2012, 12:11:39 PM3/19/12
to
On 19 Mar., 12:06, Stig Johansen <wopr...@gmail.com> wrote:

> Har du ikke selv en kopi af w-o-p-r.dk ?

Joda... Og domænet er stadig aktivt, jeg mangler bare en ordentlig
hoster.

> Jeg har lagt det til fri download og givet link på et tidspunkt.
>
> Men 'Gonzales' ASP:

Det er fint nok, men jeg tænkte, om du ikke kunne kommentere koden,
lidt på samme måde, som du gjorde med tabelsorteringsscriptet, eller
som Biger gjorde med sit AJAX script på sin hjemmeside.

Så kan man se, hvor der sker hvad, og så er det nemmere at analysere,
begge jeres kommentarer var nemlig meget hjælpsomme.

Husk lige, jeg er ikke javascript-haj, det er der nok andre her, som
heller ikke er :)


MVH
Rune Jensen

Andreas Andersen

unread,
Mar 19, 2012, 1:41:54 PM3/19/12
to
Den 19-03-2012 12:01, Stig Johansen skrev:
> Andreas Andersen wrote:
>
>> Jeg troede ikke, der var nogen, der lavede den slags uden jQuery nu til
>> dags.
>
> Jooh, men det er nok få ;-)
>
> Jeg har arbejdet med udvikling i 32 år, så det er 10 gange lettere (og
> bedre) at lave det selv frem for at sætte sig ind i den der 'ting'.
>
> Min version bruger ikke 'clousures' og løber derfor ikke tør fo rmemory ved
> f.eks. chat's.
>
> Men brug i bare jQuery ;-)

jQuery burde da heller ikke løbe tør for hukommelse, medmindre der er en
eller anden memory leak. Men det kan da være, der er en bug, det ved jeg
ikke.

Smag og behag kan jo variere. jQuery var en åbenbaring for mig -
javascript som det burde have været hele tiden, uden bekymringer om alle
mulige browseruenigheder.

--
Andreas

Stig Johansen

unread,
Mar 23, 2012, 5:20:04 AM3/23/12
to
Andreas Andersen wrote:

> jQuery burde da heller ikke løbe tør for hukommelse, medmindre der er en
> eller anden memory leak. Men det kan da være, der er en bug, det ved jeg
> ikke.

Det var ikke jQuery jeg henviste til, men brugen af closures.

IE (altså browseren) f.eks. løber tør for memory hvis man har en 'shoutbox'
kørende, og fejler ved 'out of memory'.

Det er lidt for teknisk at skrive her, men det handler om dårlig
implementering af garbage collectoren.

I det hele taget er garbage collection noget fanden har skabt og giver ingen
performanceforbedring.

Stig Johansen

unread,
Mar 23, 2012, 5:24:34 AM3/23/12
to
Rune Jensen wrote:

> On 19 Mar., 12:06, Stig Johansen <wopr...@gmail.com> wrote:
>
>> Har du ikke selv en kopi af w-o-p-r.dk ?
>
> Joda... Og domænet er stadig aktivt, jeg mangler bare en ordentlig
> hoster.

Kommer ;-).

Jeg planlægger at hoste mine ting på egne servere, men der går nok et par
måneder.

Serverne kommer til at stå i mit soveværelse, så jeg skal på jagt efter
passende fanless servere.

Jeg vender tilbage når det bliver aktuelt, og så retablerer jeg w-o-p-r.dk
som det så ud.

Rune Jensen

unread,
Mar 25, 2012, 3:28:59 AM3/25/12
to
On 23 Mar., 11:24, Stig Johansen <wopr...@gmail.com> wrote:

> Jeg vender tilbage når det bliver aktuelt, og så retablerer jeg w-o-p-r.dk
> som det så ud.

OK, det lyder godt.


MVH
Rune Jensen

Rune Jensen

unread,
Mar 25, 2012, 3:33:35 AM3/25/12
to
On 19 Mar., 19:41, Andreas Andersen <andreas2...@gmail.com> wrote:

> Smag og behag kan jo variere. jQuery var en åbenbaring for mig -
> javascript som det burde have været hele tiden, uden bekymringer om alle
> mulige browseruenigheder.

Egentlig bør der ikke være uenigheder i nyere browsere, javascript er
SVJV en standard på linje med HTML og CSS, og alle browserproducenter
blærer sig efterhånden med 100% standard compliancy.

Firefox 3.6 og IE7+8 er vel problemerne, da de versioner stadig
eksisterer.


MVH
Rune Jensen
0 new messages