Cartlanna Catagóire: jQuery agus SharePoint

Shárú Fadhb Annoying le URLanna coibhneasta i SharePoint Thapa Seoladh

I wanted to add a link to the quick launch navigation the other day and SharePoint told me:

image

Pure text version of that is:

Ensure that the URL is valid and begins with either a valid character (a number sign (#) or forward slash (/)) or a valid supported protocol (mar shampla, ‘http://', ‘https://', ‘file://', ‘ftp://', ‘mailto:', ‘news:').

“Blech and pox!” I said.

A workaround to this is to use JavaScript to find a known link in the quick launch and override its behavior.

To test this, add a new link to your test site thusly:

image

I used jQuery. Chun a réiteach é, get some JavaScript and jQuery onto the page using your favorite technique and with a line of code like this:

 

$(doiciméad).réidh( fheidhm () {

    $("a:contains('Test URL replacement')").cliceáil(fheidhm () { chur ar an eolas("changed click behavior!"); ar ais bréagach;});

});

And Bob’s your uncle.

The jQuery selector finds every <a> tag that has “Test URL replacement” in its name. You may want to find-tune that depending on your link and such.

The .click(fheidhm() overrides whatever SharePoint would have done when the user clicked. Make sure you “return false” or else it will do your stuff and then try to the href thing too, which is almost certainly not your goal.

This was done and test in a SharePoint online environment but should work well in 2010 and earlier too.

</deireadh>

undefinedLiostáil le mo bhlag.

Lean mé ar Twitter ag http://www.twitter.com/pagalvin

Quick agus Simplí: Réitigh "Paraiméadar URL neamhbhailí” fadhb le UpdateListItems i lists.asmx

When working with UpdateListItems via lists.asmx, it’s easy to generate the error:

Invalid URL Parameter.

The URL provided contains an invalid Command or Value. Please check the URL again.

You can get this error when you forget to include ID in the the list of fields to update.  Seo, like a lot of these SP web services, is a bit counterintuitive since you need to include the ID in the ID attribute of the <Method> element.  And you’re not updated ID and probably never want to in the first place.

This SOAP envelope works:

<soapenv:Xmlns Clúdach:soapenv ='http://schemas.xmlsoap.org/soap/envelope/'>
  <soapenv:Comhlacht>                      
    <UpdateListItems xmlns='http://schemas.microsoft.com/sharepoint/soap/'>                     
      <listname>{C712E2EA-54E1-47AD-9D99-1848C7773E2F}</listname>                     
        <updates>                     
         <Batch OnError="Continue">
          <Method ID="1" Cmd="Update">
            <Field Name="CooperativeLock">locked!</Réimse>
            <Field Name="ID">1</Réimse>
          </Method>
        </Batch>                     
        </updates>                
      </UpdateListItems>             
  </soapenv:Comhlacht>         
</soapenv:Clúdach>

If you strip out the ID field reference then you’ll get the annoying “Invalid URL parameter” message.

</deireadh>

undefinedLiostáil le mo bhlag.

Lean mé ar Twitter ag http://www.twitter.com/pagalvin

 

Caching Poor Man ar i JavaScript

[TL;DR version: use cookies to store the results of async calls; render the results of past async calls immediately and then validate them after page-load.]

I’ve been working on SharePoint intranet site for a client that features, i measc nithe eile, a stylized secondary navigation whose menu options are managed via a regular old custom list.  The idea is that the client gets to control “their” site’s menu without affecting or being affected by the global navigation put out by IT.

(there is something incredibly subversive about adding a CEWP that points to an HTML file that loads some CSS and JS to fundamentally alter almost everything about a site’s behavior… but that’s for another post)

The code for this pretty simple:

The sore spot here is that every time anyone hits one of the site’s pages, that user’s web browser is reaching out to get items from the list.  Once dev is complete and testing has proven things to be stable and complete, this call is unnecessary more than 99% of the time since the menu rarely changes.  It also has a weird UI affect which is common in this brave new world of hyper-ajaxy web sites – the page renders and only then does the menu render.  It’s jittery and distracting in my view.  And jittery. Mar sin,, caching. 

I modified the logic thusly:

  • Look for a cookie in the browser that contains the menu as I last read it
    • If found, render it immediately.  Don’t wait for the page to finish loading.  (You need to make sure your HTML is strategically placed here, but it’s not hard to do).
  • Wait for the page to finish loading and make an async call to load up menu items from a list using REST or lists.asmx or whatever
  • Compare what I got against the cookie
    • If it matches, STOP
    • Seachas sin, using jQuery, dynamically populate a bunch if <li>’s in a <st>
  • Use CSS to do all the formatting
  • Profit!

Some of you are going to say, “hey! there’s no real caching going on here since you’re reading the menu anyway every single time."  And you’re right – I’m not giving the server any kind of break.  But because the call is async and happens after the page’s initial HTML payload fully renders, it “feels” more responsive to the user.  The menu renders pretty much as the page draws.  If the menu happens to the change, the user is subjected to a jittery re-draw of the menu, but only that one time.

There are some ways to make this caching more effective and help out the server at the same time:

  • Put in a rule that the “cookie cache” is valid for a minimum of 24 hours or some other timeframe. As long as there is no expired cookie, use the cookie’s menu snapshot and never hit the server.

Well … that’s all that come to mind right now :). 

If anyone has any clever ideas here I’d love to know them.

And lastly – this technique can be used for other stuff.  This client’s page has a number of data-driven things on various pages, many of them changing relatively rarely (like once a week or once a month).  If you target specific areas of functionality, you can give a more responsive UI by pulling content from the local cookie store and rendering immediately.  It feels faster to the user even if you’re not saving the server any cycles.  You Is féidir save the server cycles by deciding on some conditions and triggers to invalidate this local cookie cache.  That’s all situational and artsy stuff and really the most fun :). 

</deireadh>

undefinedLiostáil le mo bhlag.

Lean mé ar Twitter ag http://www.twitter.com/pagalvin

XSLT agus Samplaí jQuery

Bhí mé ag déanamh a lán de XSLT agus jQuery agus shíl mé gur mhaith liom a roinnt snippets cúpla gur féidir le daoine eile a bheith úsáideach sa todhchaí.

Sampla 1: Scaoileann JavaScript simplí / jQuery i XSLT:

<XSL:chluiche teimpléad = "rud éigin" xml:spás = "chaomhnú">

  <!– Go spás amach an cheist cairdiúil scagairí réimse i bhfolach –>
  <Cineál script = "text / javascript">
    $(doiciméad).réidh(fheidhm(){
      $("# QueryFriendlyFilters").Val("Folamh");
    });
  </script>

</XSL:teimpléad>

Sin beagán astaíonn cuid JavaScript go fanann an leathanach luchtú a chríochnú (mar gheall ar an $(doiciméad).réidh(...)) agus leagann sé ansin ar an luach a bhaineann le réimse i bhfolach ainmnithe QueryFriendlyFilters le luach litriúil "folamh".

Sampla 2: Úsáid <XSL:más rud é> a sheiceáil "níos mó ná",  "Níos lú ná", etc.

<XSL:chluiche teimpléad = "rud éigin" xml:spás = "chaomhnú">

  <id div = "fdcAllFilters">
 
    <XSL:má tástála = "@ Líon>0">
      <réimse aicme = "fdcFilterLabel">Scagairí Reatha:</réise>
    </XSL:más rud é>

    <!– a tharlaíonn rudaí níos anseo. –>

</XSL:teimpléad>

Seiceálann an Blúire thuas a fháil amach an bhfuil an tréith darb ainm "Count" an eilimint "rud" níos mó ná nialas.  Ba mhaith leis an XML taobh thiar de seo a bheith rud éigin cosúil le:"

<rud Líon = "5" />

Sampla 3: Seasann an trí gach gné, interspersing glaonna jQuery.

<!– Seasann tríd na scagairí agus an ceart ar taispeáint  naisc. –>
<XSL:do-gach = roghnaigh "UserFilter">

  <aicme = "FilterHref" href = "javascript:mySubmitPage(‘RemoveUserFilter’,'{@ ID}')">[X]</a>

  <réimse aicme = "fdcFilterLabel"><XSL:luach-ar roghnaigh = "@ FilterValue" /></réise>

  <Cineál script = "text / javascript">

    $(doiciméad).réidh(fheidhm(){
        <XSL:téacs><![CDATA[$("# QueryFriendlyFilters").Val( ($("# QueryFriendlyFilters").Val() + " ]]></XSL:téacs>\"<XSL:luach-ar roghnaigh = "@ FilterValue" />\"<XSL:téacs><![CDATA["));]]></XSL:téacs>
    });

  </script>

</XSL:do-gach>

Is é an Blúire thuas an chuid is mó casta agus d'fhéadfadh go mbeadh slite níos éasca é a dhéanamh.

An XML taobh thiar de seo tá thart ar mar seo:

<UserFilter ID = "123" FilterValue = "xyzzy" />

Tá an Blúire iterating trí <UserFilter> nóid. 

Astaíonn sé chéad chlib ancaire a agraíonn nuair a chliceáil feidhm JavaScript atá cheana féin ar an leathanach, "MySubmitPage" agus Gabhann an luach an tréith ar an <UserFilter> nód darb ainm "ID". 

Astaíonn sé ansin roinnt jQuery go Waits le haghaidh an leathanach a luchtú.  Go jQuery nuashonruithe réimse bhfolach darb ainm "QueryFriendlyFilters" trí luach an tréith FilterValue.  Tabhair faoi deara go léir an mire <XSL:téacs> agus <![CDATA[ ... ]]> stuif.

Sin é, Tá súil go gcuidíonn sé!

</deireadh>

Liostáil le mo bhlag.

Lean mé ar Twitter ag http://www.twitter.com/pagalvin

Lists.asmx, GetListItems agus Fillteáin

Bhí mé ag déanamh roinnt taighde a dhéanamh do dhuine lá atá inniu ann ar fud na seirbhíse gréasáin list.asmx ar fáil mar chuid de SharePoint 2010 (agus níos luaithe).  Bhí sí in ann a fháil ar na míreanna liosta ag an fillteán fhréamh (lena n-áirítear ainmneacha na fo-fhillteáin), Ní fhéadfaí ach a fháil míreanna i bhfo-folders.  I raibh roinnt féachaint timpeall ar an Internets agus tá sé ina ceist ionadh coiteann.  Ach, Ní raibh mé in ann freagra maith a fháil chun an cheist shimplí, "Má tá a fhios agam an fillteán, conas is féidir liom a fháil ar na míreanna san fhillteán?"  Chun a bheith macánta, Ní raibh mé iarracht a dhéanamh go léir go crua ó bhí mé ag iarraidh chun an figiúr seo ar cheann amach ar mo chuid féin ar feadh tamaill Smile.

A shocrú suas seo, Chruthaigh mé suíomh ainmnithe "Cásanna Blagadóireacht" agus liosta saincheaptha darb ainm "Liosta Chustaim le Fillteáin Fo".  Chruthaigh mé ansin fillteáin ainmnithe:

  • Bliain 2005
  • Bliain 2006
  • Bliain 2007

Dúirt mé freisin ar roinnt rudaí ar an bhfillteán "Bliain 2006".  Is é seo a tá sé cosúil:

image

Níl mo chara ag scríobh C # cód ach úsáid a bhaint as Java, mar sin bhí an clúdach gallúnach cad a theastaíonn sí i ndáiríre.  Chun a fháil go, Scríobh mé beagán de jQuery agus ansin a úsáidtear fidléir a fháil ar an iarbhír HTTP chomhrá.

Seo an jQuery ábhartha (Chóipeáil mé an cód síos thíos más mian leat a chóipeáil / greamaigh):

image

Tá siad an chéad eochair a chur san áireamh araon <queryOptions> agus <QueryOptions> nód.  Is í an eochair dara go bhfuil an <Fillteán> Is nód URL chun a bhfuil an cliant le rochtain.

D'fhéadfadh go mbeadh slite eile a fháil ar an, ach d'oibrigh sé sin go maith dom nuair a úsáid jQuery.

Seo é an clúdach gallúnach le haghaidh na nithe thuas:

<soapenv:Xmlns Clúdach:soapenv =’http://schemas.xmlsoap.org / gallúnach / clúdach /’>                
  <soapenv:Comhlacht>
    <Xmlns = GetListItems’
http://schemas.microsoft.com / SharePoint / gallúnach /’>
      <listname>Liosta Chustaim le Fillteáin Fo</listname>
      <viewFields>  
        <ViewFields>
          <FieldRef Ainm = 'Teideal’ />
          <FieldRef Ainm = 'EncodedAbsUrl’ />
        </ViewFields>
      </viewFields>
      <queryOptions>
        <QueryOptions>
          <Fillteán>
http://demoserver1/Blogging Cásanna / liostaí / Liosta Chustaim le Fillteáin Fo / Bliain 2006</Fillteán>
        </QueryOptions>
      </queryOptions>
   
</GetListItems>
  </soapenv:Comhlacht>
</soapenv:Clúdach>

A lán de na samplaí agus plé ar fud seo faoi stiúir dom chun a chreidiúint go raibh go léir is gá dom a <QueryOptions> agus a shonrú ainm fillteán.  Maidir liom féin, Is gá dom a araon wrap sé taobh istigh <queryOptions> chomh maith a shonrú mar URL lán-cháilithe don <Fillteán> nód.

Seo an jQuery AJAX thus:

$(doiciméad).réidh(fheidhm() {
       Bhí soapEnv =
           "<soapenv:Xmlns Clúdach:soapenv =’http://schemas.xmlsoap.org / gallúnach / clúdach /’> \
               <soapenv:Comhlacht> \
                    <Xmlns = GetListItems’http://schemas.microsoft.com / SharePoint / gallúnach /’> \
                       <listname>Liosta Chustaim le Fillteáin Fo</listname> \
                       <viewFields> \
                           <ViewFields> \
                              <FieldRef Ainm = 'Teideal’ /> \
                              <FieldRef Ainm = 'EncodedAbsUrl’ /> \
                          </ViewFields> \
                       </viewFields> \
                       <queryOptions> \
                         <QueryOptions> \
                           <Fillteán>http://demoserver1/Blogging Cásanna / liostaí / Liosta Chustaim le Fillteáin Fo / Bliain 2006</Fillteán> \
                         </QueryOptions> \
                       </queryOptions> \
                   </GetListItems> \
               </soapenv:Comhlacht> \
           </soapenv:Clúdach>";

</deireadh>

Liostáil le mo bhlag.

Lean mé ar Twitter ag http://www.twitter.com/pagalvin

Lists.asmx, Ní féidir GetList agus "Luach a bheith null”

Fuair ​​mé amach inniu go bhfuil an GetList() modh i lists.asmx Tá seirbhís gréasáin a bheith ar a dtugtar go han-chúramach nó tá sé seans maith le caith mistéireach "Luach ní féidir a bheith null" eisceacht (agus go bhfuil glacadh leis gur féidir leat a fháil anuas ar an teachtaireacht earráide níos measa fós cineálach, “Exception of type ‘Microsoft.SharePoint.SoapServer.SoapServerException’ Bhí thrown. ")  Go sonrach, Chinn mé nach féidir leat a chur ar fáil de chineál ar bith réimír ar an modh GetList.  Léiríonn an Blúire jQuery seo a leanas an pointe:

image

Má dhéanann tú sin, bhfreagraíonn an tseirbhís gréasáin le "Ní féidir luach a bheith null" de réir an fidléir-ar choinníoll HTTP athscríbhinn:

<?xml version = "1.0" encoding="utf-8"?>
  <gallúnach:Clúdach
     xmlns:gallúnach ="
http://schemas.xmlsoap.org / gallúnach / clúdach /"    
     xmlns:xsi = "
http://www.w3.org/2001/XMLSchema-instance"
     xmlns:XSD ="
http://www.w3.org/2001/XMLSchema">

  <gallúnach:Comhlacht>
    <gallúnach:Locht>
      <faultcode>gallúnach:Freastalaí</faultcode>
      <faultstring>
        Exception of type ‘Microsoft.SharePoint.SoapServer.SoapServerException’ bhí thrown.
      </faultstring>
      <mion>
        <xmlns teaghrán earráid ="
http://schemas.microsoft.com / SharePoint / gallúnach /">
Ní féidir luach a bheith ar neamhní.
        </errorstring>
      </mion>
    </gallúnach:Locht>
  </gallúnach:Comhlacht>
</gallúnach:Clúdach>

Ar ndóigh,, nach mbeadh tú a chur ar dócha go bhfuil "S0" réimír ar do chuid féin, ach tá roinnt uirlisí seans maith é a dhéanamh (cosúil Eclipse).

Is é seo go léir an níos mearbhall / frustrating toisc modhanna eile fhulaingt réimíreanna.  Mar shampla, an GetListCollection Ní modh aigne má tá sé curtha réimír, fiú le réimíreanna nonsense cosúil le "xyzzy":

image

Seo "Ní féidir luach a bheith null" Is cosúil go coitianta go leor le lists.asmx sin tá súil againn go mbeidh sé seo cabhrú le duine éigin amach sa todhchaí.

</deireadh>

Liostáil le mo bhlag.

Lean mé ar Twitter ag http://www.twitter.com/pagalvin

Endlessly Neadú <div> Clibeanna agus jQuery

Dealraíonn sé seo cosúil den sórt sin ábhar oddball, Níl mé cinnte go bhfuil sé i ndáiríre fiú blogging faoi, ach ní ar sin stop mé roimh, mar sin anseo táimid ag dul Smile

Tá mé ag obair amach ar thionscadal áit a bhfuil mé ag tarraingt cuid de na sonraí ó chuardach, pacáistiú sé suas i teachtaireacht XML agus ansin go bhfuil XML a chlaochlú ar deireadh thiar i HTML via XSLT.  Níl a lán de jQuery i gceist, giotán amháin a chuireann roinnt feidhmiúlacht tabbing.  Nuair a bheidh tú cliceáil ar cluaisín (i ndáiríre, a <div>), agraíonn jQuery. hide() agus. seó() ar divs éagsúla (íosluchtú an t-ualach leathanach tosaigh go léir an t-ábhar sin nach bhfuil aon postbacks sa chás seo).

A bunch de uair an chloig ó shin, an loighic athrú cluaisín thosaigh féin a iompar erratically agus ní bheadh ​​sé a thaispeáint ar cheann de mo tabs.  Rianú mé ar deireadh thiar sé síos go dtí an bhfíric go idirlíon taiscéalaí (ar a laghad) shíl sé gur an <div> clibeanna neadaithe i bhfad, Bheadh ​​i bhfad níos doimhne ná toolbar forbróir intended.The thaispeáint:

-<id div = "Tab1Content">
  -<div>
    -<div>
      -<id div = "Tab2Content">
        -<div>
           ..............................
                   </div>  <-Deireadh léiríonn go raibh sé dúnta go léir ar an mbealach síos anseo!

Mar sin,, má rinne mé $("# Tab1Content").hide(), Ba mhaith liom a cheilt freisin Tab2 agus ní raibh mé in ann a thaispeáint Tab2 más rud é nach raibh mé a thaispeáint freisin Tab1.  Chóipeáil mé agus a ghreamú an cód suas i stiúideo amhairc agus thaispeáin sé gach ceann de na líneáil na div ar bun nicely, díreach mar a bhí siad ceaptha a bheith ag déanamh, ag breathnú mar seo:

-<id div = "Tab1Content">
  +<div>
  +<div>
-<id div = "Tab2Content">
  +<div>
  +<div>

Buille mé mo cheann i gcoinne an bhalla ar feadh tamaill agus faoi deara go sa chód HTML iarbhír a bhí ghiniúint a lán de na folamh <div> clibeanna, cosúil le:

<comhlacht>

  <id div = "Tab1Content">

    <div id = "row1" />
    <div id = "row2" />

  </div>

  <id div = "Tab2Content">

    <div id = "row1" />
    <div id = "row2" />

  </div>

</comhlacht>

(Is é an thuas waaaaaaaaaaaay oversimplified.  Is iad na clibeanna div folamh go hiomlán bailí. Tá cuid de mo <div> clibeanna bhí lán de ábhar, ach ní raibh go leor níos mó.  Tháinig mé go dtí an réadú go bhfuil mo <XSL:do-gach> Tugadh treoracha astú na clibeanna div gearr-foirm nuair XSL:do-gach ní raibh a 'teacht ar aon sonraí.  Éigean mé trácht HTML isteach an t-aschur, mar a thaispeántar:

image

 

Tar éis a rinne mé go, ar fad ar an div lined suas nicely agus mo athrú cluaisín thosaigh ag obair.

Mar i gcónaí, Tá súil agam Cuidíonn seo duine éigin i pinch.

</deireadh>

Liostáil le mo bhlag.

Lean mé ar Twitter ag http://www.twitter.com/pagalvin

JQuery Ach More–Athraigh an Sampla Íomhá

Bhfuair mé cuid gréasáin ó díoltóir an chliaint d'aois agus tá sé ina fhadhb méid íomhá.  Ba chóir go mbeadh na híomhánna 60×50 ach ar chúis éigin corr, an díoltóir bunaidh iachall orthu i 42×42, ionas lorg siad squashed:

 

Dea-Image

Íomhá Bad

Seo an marcáil (simplithe):

<tábla aicme = 'leathnaithe-ionchas'>
  <thead>
    <tr>
      <ú  width = '100′>3 Dé Máirt</ú>
    </tr>
  </thead>

  <tbody>
    <tr aicme = 'réamhaisnéis'>
      <td width = '100′>
        <st>
          <li aicme = 'ard'>Ard-: 72&tú;F</li>
          <li aicme = 'íseal'>Íseal: 44&tú;F</li>
          <'bhail' li aicme =>Grianmhar
            <img src =’
http://deskwx.weatherbug.com/images/Forecast/icons/localized/60×50/en/trans/cond007.png’ width = '42’ airde = '42’ Alt =” />
          </li>
        </st>
      </td>
    </tr>

  </tbody>

</tábla>

Feicfidh tú faoi deara, áfach, cé na cosán ar an íomhá féin Léiríonn an ghné cuí (60×50) an díoltóir bunaidh iachall air i 42×42.  Cén fáth ar?  Crazy.

Ar aon nós, Bhí mé ar réiteach tapaidh agus éasca ar an gceist seo agus chas mé go dtí jQuery.  An cleas a bhí le lonnú gach ceann de na is iomchuí <img> clibeanna.  Ní raibh mé ag iarraidh a muck faoi aon clibeanna img eile (ar a bhfuil go leor).  An beagán de jQuery rinne an cleas:

<script type="text/javascript" src ="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>

<Cineál script = "text / javascript">
     $(doiciméad).réidh(fheidhm () {

         $(‘li.condition > img ').gach(fheidhm (Innéacs, mír)
           
{
             $(mír).css("width", "60"); 
             $(mír).css("height", "50");
            });
     }); // ar ualach doiciméad
</script>

Sin beagán de chód fhaigheann an mbailiúchán <li> Tá clibeanna a bhfuil aicme "coinníoll" agus <img> leanaí.  Béim arís ansin trí gach ceann de sin.  D'oibrigh sé mar a charm.

Raibh mé in ann a shruthlíniú dócha é, ach ní raibh mé ar an chineál Guy a réiteach UNIX π go 18 cruinneas digití baint úsáide as sed agus awk agus níl mé a leithéad má Guy jQuery ceachtar Smile.

</deireadh>

Liostáil le mo bhlag.

Lean mé ar Twitter ag http://www.twitter.com/pagalvin

A chur i bhfeidhm Córas Fógra Domhanda Pop-up

Scríobh mé suas earra www.sharepoint.briefing.com dar teideal "A chur i bhfeidhm Córas Fógra Domhanda Pop-up."  Cuireadh an fheidhm bhfeidhm le haghaidh coláiste pobail do closings scoil de bharr sneachta agus mar sin de cumarsáid a dhéanamh. 

Úsáideann sé liosta saincheaptha, amach as an bhosca seirbhísí gréasáin SharePoint agus roinnt jQuery a dhéanamh ar an obair.

Seo a teaser:

image

Léigh an rud ar fad anseo: http://www.sharepointbriefing.com/features/article.php/3918471/Implement-a-Global-Pop-up-Notification-System.htm

</deireadh>

Liostáil le mo bhlag.

Lean mé ar Twitter ag http://www.twitter.com/pagalvin

Tóg Rialú do OK agus Cealaigh Buttons

Scríobh mé airteagal seo ar ais agus, ach tá sé cosúil nach raibh mé nasc a chur air ó mo bhlag ag an am, mar sin téann anseo:

image

Cur síos ar an tAirteagal seo conas chun bhfeidhm newform.aspx a atreorú chuig leathanach amháin nuair a cad a tharlaíonn nuair an t-úsáideoir OK agus ar leathanach eile nuair a cad a tharlaíonn nuair sí ar ceal.

</deireadh>

Liostáil le mo bhlag.

Lean mé ar Twitter ag http://www.twitter.com/pagalvin