diff --git a/components/com_morfeoshow/gallery.swf b/components/com_morfeoshow/gallery.swf new file mode 100644 index 0000000000000000000000000000000000000000..060c2098e9d7f875bfeac29b988a47d57d9b2e46 GIT binary patch literal 55255 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%0AUQH#izBH)A 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 E!sE9-*8l(j diff --git a/components/com_morfeoshow/gallery.xml b/components/com_morfeoshow/gallery.xml new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/gallery.xml @@ -0,0 +1,4 @@ + + + +`%}uh2%~OF-T0SeG56=~~ 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 M07*qoM6N<$g1-DPXaE2J diff --git a/components/com_morfeoshow/images/index.html b/components/com_morfeoshow/images/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/images/index.html @@ -0,0 +1,1 @@ + \ No newline at end of file diff --git a/components/com_morfeoshow/images/loading.gif b/components/com_morfeoshow/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..4f1429c06cb2ffd2910b038d06b01a4b3ee00a21 GIT binary patch literal 3990 zc$~$TdsI``p2yEQoRCdCfs>PjXACC~AUx!C2?hvo5&|UhXw*cl_G(aS(QA9LWvm^w zE02>9LV)lPX$4n!SmW!0j#g>Cl((_gDcU+xYg<6uOP6g2+qwpw+uKQJ&AQXxwdU{H zfA0O?@AG~9cB!sJkyAxNB=i*o{rvOKKmGL6)2C0DmzN(ue*D7^KP)XRefQmW4iZd|{9-S78LPft%wOpJ|< zjf{+3xpHNAc=*z#OBXI&IDh{9;Naldvu978I_2~EjvqgM?AWo+&d!dGj@H)JmX;Q` z+wF3>>g((6cDvPTHJic|~QhVSSNGU!0km9t8h#^#oU^Yl@#ALl!`j) z!Ho}{Fri#~Tgkh&7&cqa6cnCUp-;Lvgui9Y~fA~U)w!boVK=PU-;pD&ituKOQ zp35Fy50)_Xx~cYE7;r^*aQUq0_$-HW4e&_?c@C^@7Lq{Zx&F*1XCCzaKctKSQZxt+1@=a_8x2p(%S+{> zO-C9daw-glik$GSJ|jpi>**;=bM@N^fZ#dneLXq&SvpUd5yi{7XwY98#^{Q?*t8SA z^3yf|4;#ypjCqwk&*VnZX&BTbY0L!NRZ3+F(K(QvjnBJG&WB=8vO>RC`{Hv)1K^a z*YZQ)kS@~(h6`)`DEfh7T|kdW!v3e|n-48)Y38W$+RVSK;fY9O=t`Xht$Z!E)@vAk zOh9Lm)!RL_qgB%-P%Db!dhZuoN|@Q+%eyYMj*Qp~mhtKx$c+-9_2ZV4(_U#D#QmN^ zSsrZ5i`ZssAJl8MAx`bO=e5jEMkOz2aYxW1kd$a3ws*`eOdZHn*Dick|2Ew&J2y`W zA$0KlVA-hY`NNRF3B=>`wMCb9euj+V8aC}up5L>JN(=@^42 zO%UNtj97WDTmZ--d$v)OTdY&d`9b!J1$wAqYph;e|lN?Sk*DoR|+kBq=C*H{O;aoi5*P4O~+J!DJ|73&v-BeKFQ9%44x!^HWO z{_S;DSGfmurmRREqzc9(@tWtdQkbn0^-leMCT_lw1@BPV&}^q^~#W_Ptn`XJV0GP|rIBa#LQLmQr zGjvvc{z|kF;uhGbm=jU*0;M!eK+zRxy$*=~gHnA`G~pk<~ZGMYH>3|-6DJWA$wtH0cE_^3A#z~^QmE&4Uh`l ze9p^EJcx6)-w)dO(FgQCkKW8Fp6!H4r`P*q9E2SF%kH`HQg*{I={4<29IY1_-Jaz? zk6m@$aU(U0H>)|;yY#-bxF-e%Q4$4fS!?Y-Id{DBTS1+vxJ?*A-`}S}w3?CsWcOVU z=9?qPf-%^yCI7L({?~E;-C#Cez-uiIL3X}e!0>c&aw?6L*<84*zSjsxt8Ik>#E7!F zUARQbYlivxdZS($fiPp_N)J0jqsvF~`%sJ$T^gcT7vQ}kmK8YaqLhZ%Tg zAykauhNV#zVnfj4m2WaD@sN<_;2TGMZIE;26W7Nc$^|h9q5tF_Ptg&tGzkY*{e*wK zt1AT;p>d_Qb>Tx9&-NO441>)(TT3pEtss@Tlznp4Ay<|7^jW+as>mJ`YkX-mOD;w!@)Kz7-vmN49mfJp|UyLxT_l zS17NQQIjIgevglU#z1&f&G*}v7Cs|apy}UGNYKYRh}d`UwA!u(KKZE*Eg&E?X8j3t zekeoDKk>|=ztt=Z0C%u@C}gF0$xO3j65~JMu_!2rEvBCHi7kJ)2jPZglBh13Fc0d* z0YWpa5w)?RIkIZd0^W*(^PkFDYePCPL zj!7(zmgc^>ams3#A8++R7KyI?vcOD5d?zj8V~M-3EK!n8^2;CNK%uuOt6&h%{7hZ*aK~zy@$*TO%h)E(K8gQJYj< zkr&?D-Ce9Ni0C&mFbr*j7_31$Ehp{`E0AW(V?8cr>?#3+#y9}6!V${K@*LiEJ4EE@ zl7(I%c}z27)6IhWeE#B%1x@{iln$Ig77o)Z2*;YF-JOACI$-Rj z*@Tv7d``MZqPW~tYcOcmE{z4VmA>DmD)QTEgo9vv;9p=xiD-61Q-=$})AHiL;T{{r z%PURC>`WBusc#QpObhTMlSy#031LTLXN&+lZ`Ubfd`(PgE;-&5TNH5MRW}-y$U_fv zJ=_vaeBAiuF&hG3wlnZ(VZ`xoJJ86C{KC9M;R7x&u)n`*mCfqac2bbW`Pc_{F5{5-mFdiZdry)db7$6WAQODp`Xm8Lcy_CcbCE(XpjzrwYnxzRLYg9 z-r_9J1ifF9AV=RWBFCpg`8Xk`;OYjhRGFLg5QSj-3ihlVoD)y8h-fj1FJ(Yi)Tm!! zH}_6VhlK2j3ZZ69FG>*p9;s!aTH6?WTQ=b96~{=>gqK2}-c-eyub)IHXNE%81m;iG z9lA;DIYeN?_sl_uA$B_B$=ql&j_}(UAso1hULP67`X+fZ!xhH9$mGn9_Sf-0jM6OE zet)lofv`6Kop^G}Hq*y358brYyV(SbE!vxeghWVh$ysJ<+=1bS4{NvDwGBZhq5B)- o5MGzIWIgXr(2GH5xt0}$hOwX!Z1N+MhzhdhDU5KT>XGoZ9kO!dc?(gOyZuHdE%j2PktNZi7eh&=* z-~cR4tRS8li%ceS%HF!GtE;A_W`F;{#M5_mb?xD+A3HlcJUH6A+{1gZTvt<&ZEvjnB`^L+?JzMqw~B$qg9KkAEgRT4SRFdeGyg z!v|KcF(eWxysRHyu>y(foOlKM(7JVa$UMW(S8bpb_qDHRX#XL6a@^X?CF~8_(Ryx; zl8D+ELl1uYwKhi}{W8#4U&l{Jgnue7jwzomU)ZG64l73X>>X{@ynnf6U}co02Es$p zRwjMR1S4a8CiD2;+&_u+~ zv5uG_>G|f7qssD13r2=Xa|oTr z#Neq6#*v$`v%Q(){QSJKv`k5D!(#bY1e*95)|OJU?qq97CK7LmUwc>Ey|uM9yg;%| zm~u#%)swrM-L(P+YoSmLtrLXQ*D!4LH`A0}=l9*t@3EPEbLG8+H?7-bG6n2Ew6b;h zsU7GivnLBgSvo|#qK93xH9@y>e?WK@NG#Z0WXR=rEsod89 zfXBy3PunVdb})<2%90BD)pYewknX1G)lXnIJ%o^iGF!g)^PeXLV+<`yG7sa=zI?~a z%WhLqSvnC>Zv)oz)ov}#RO(%R`qdUX>gyZn>y$k{q4wqb!rHuSI$<=!vx&lLkCB{Q zg063G|GF1&W<5#^i^WB!W3jty(IQbSJ^=n(#ea;SuOskvN3vUTi5NS~Lbd-wrQ5Yt z*PgRSE`VrO+HHkI-T=KWF8#kd*6E?h<^%DuMhfjk%X=^u9c@TOlP=Pnc9ZFk0Y%EuHO${Y(-( zmzcYuwiVacH?LgQ3@vRj5t_e0e;WMf!zoDRg_OKM6;GCbs7REtq*+#vjw$oA_oAV9 zze|8L)qv@H6^Qpb0X0p}i)w^&85mM5w7G>yyrXzPY><1wO5isUD(!>3N0Avg7ho6W)U4)xEilIudAW2iei(Qc%Rq707*F`+84UVP+vzPq-Ogs&~^ibH4%{)6~bE2fiNSuo` z8LawsY2;|H+NHOFzWVI?l#F;JySI}fmiHloX(Vzgnl=BHM_h6yMSbouSo=yrH20RA zUCuT4iZlB&9AkK!nSTn<3H9~$;PxEkqGa}7{|3_F^}7zuef6V*`vK=Jj8QMh9=-hF z!M!O~$a((|zj_OSZM?GV*wh|m={@$7L7O?0z+S$sw#r-*awsnz$-<=CGNPa?}4bT?B^_Q00X zqHoS#`|eV6EYvd7Jo+D=YduR;uUv;(KP*hZN$kyVm0zvnTdZq;Kz=a(x1q&q; z(|Zu0Gb#C0w?R9Be2{W+iUCD#!|7sM!PYCs_$C2`KNrD88f7jBx@{1wRZ>b;Nok^* zgr5Sn`~I#D2E%`&8-IGDxnaGsHc0Lh2+ixVWwJYt_NLz6&h%BuE6#oks>Pk5ojmH& zHD(z_iu5ypj-ADMKJvE+Z|C6K6V(=#ZEbQTq@d@NWmwo#E`6}q1Ek0uTmwe{C_KM- ze%Km2nwDuZj+wS~0!>-lAAffnQCCN{sefa@IW#&GQ!>*E`2@h}YSsThPf$Sl_dxg7 zbuK#8SGu}dHdkeNO6_P|dK`^!A#?M7yVIdN7=P=~5cqV~rD8fNaIgtgmsgjQlQV@U z9Sm$tjy_KuvNk0r@lT$gG=R)Zxh^Si_UN|?0$|k-j&%4*92ghuBMQ}F)J=az7Sh&p z69)&Ys-CcofHWPkzpW+!&rZSQ{_G%5*p;HZg~r2l)FpXpZ*XyBY^4u5b4=yMfXez) zGoy0*_7;4T?gR3J(-D#K9F~yMQ_uKdfn0eCHms@Y$?9+XgH`6p$v7v%KM_hL8h8B7 zDgG#7kY9PjMv{z-Ob(pux2cS1RGBy!Ew~4oj7&+1N|!o+&Zpkzncd@!gb_)!F52AD zh!epsS6`~{TG8f9?XwXSl0gE6VHqssQf{7BVr$~N( zpBiCdkh86edenCaH&02tcH9}EC#kWV0uw^duIzE2)HBHX>E+4JN*7JJzEA!T_MSa4 zbk29H3e?`{YVs{!UFC-6%Ma4E@lswlQU$)OF^yfoFJiCb8G7AIwC#8xvb)}ylSOvh zyRiG68i1wh?!tkUj__cfS9E-pkX@9(p1Fzgg%jLfLlLq|;PB3atSIY_H$CvPiHwYf zMg4cLa{c#(P$nORoVqrIMNKVy%GsE(!|9X;hhC#v&0Yz&$65-@M3_)~c=zin zSqsgmFZ!Ro&5su4p#pu}*yayPl205CFE@GFF?dj%;&oI92`#EeY2b~wmVk3U|b znlQhZI)D5@Q7gzhpCp|&XLCuFPqn?|%k(ad{@SyIkYzn&+x?d1e8y8xn z!dX9ZIZRsKZ?^6UoAX-tM%c0dEYC?;u(fBt;};g>s4WP^29X7R(O23|UsIO|9y+O8#QeEewO2Zf5scv5PI4m%&5 zY0R2sFNGTBuNMHq1<2pe ri^3q~8r#yYLReakZM&jcJo13{0@DUMpC|VBvH(U9GrcMu7x;ex89!&_ diff --git a/components/com_morfeoshow/images/overlay-85.png b/components/com_morfeoshow/images/overlay-85.png new file mode 100644 index 0000000000000000000000000000000000000000..0fbc8c9ca6eecf4f4174e6bf6bd9ce6d14178057 GIT binary patch literal 121 zc%17D@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4NtU=qlmzFem6RtIr7}3C&iLXv_|kJgetrv?UQhRn+hZ&$R= Rm=09N;OXk;vd$@?2>>BiBGdo? diff --git a/components/com_morfeoshow/index.html b/components/com_morfeoshow/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/index.html @@ -0,0 +1,1 @@ + \ No newline at end of file diff --git a/components/com_morfeoshow/morfeoshow.html.php b/components/com_morfeoshow/morfeoshow.html.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/morfeoshow.html.php @@ -0,0 +1,564 @@ +getParams(); + + if ($params->get('show_page_title', 1)) : +?> +
get('page_title'); ?>
+ + + + + + +
+ + +
+ +
+ + +
+ + + + +
+ +      #  + + getLimitBox($link); +?> +
+ + + + + + + + + get( 'pageclass_sfx' )."", "sectiontableentry2".$params->get( 'pageclass_sfx' ).""); + $k =0; + $j =1; + + if (sizeof($rows)==0) { + } else { + foreach ($rows as $row) { + echo ""; + if ($row->shortcut_filename) { + ?> + + + + + '; + echo ''; + $k = 1 - $k; }} + + + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + + + +}if ($params_morfeo['frontend'] == 0) { +?> + + + + + + 0) { +$x=0; +?> + + + +shortcut_filename) { + ?> + + + + +shortcut_filename) { + ?> + + + + +
'; +} + }//end else +echo '
+ + + + + + + + name; ?> + '; + + echo ''; + $row->description = stripslashes($row->description); + echo substr($row->description,0,120); + if (strlen($row->description)>120) + echo '...'; + + echo '
 
'; + $link= JRoute::_('index.php?option=com_morfeoshow&Itemid='.JRequest::getVar('Itemid', NULL)); + echo $pageNav->getPagesLinks($link); + + echo '
'; + + echo $pageNav->getPagesCounter(); + echo '
+
+ + + +
+ + +
+ + +
+ + +
+ + + + + +
'; +}//end frontend function + + +function elencafiles($dirname,$row){ + $arrayfiles=Array(); + if(file_exists($dirname)){ + $handle = opendir($dirname); + while (false !== ($file = readdir($handle))) { + if(is_file($dirname.$file)){ + array_push($arrayfiles,$file); + } + } + $handle = closedir($handle); + } + sort($arrayfiles); + return $arrayfiles; +} + + +function mostraGalleria($option, $row) { + jimport('joomla.environment.uri' ); + global $params_morfeo, $mainframe; + $db =& JFactory::getDBO(); + $param = &$mainframe->getParams(); + + $query = 'SELECT COUNT(id)' + . ' FROM #__morfeoshow_img' + . ' WHERE gallery_id ='. (int) @$row->id + ; + $db->setQuery( $query ); + $count = $db->loadResult(); + $query = 'SELECT *' + . ' FROM #__morfeoshow_img' + . ' WHERE gallery_id ='. (int) @$row->id + . ' ORDER BY '. @$row->orderfront + ; + $db->setQuery($query); + $items = $db->loadObjectList(); + + + //flash gallery params + $params["flashgallery"] = @$row->flashgallery; + $params["height"] = @$row->height; + $params["width"] = @$row->width; + $params["height"] = @$row->height; + $params["widthsw"] = @$row->widthsw; + $params["heightsw"] = @$row->heightsw; + $params["widthpc"] = @$row->widthpc; + $params["heightpc"] = @$row->heightpc; + $params["widthpl"] = @$row->widthpl; + $params["heightpl"] = @$row->heightpl; + $params["width"] = @$row->width; + $params["trans"] = @$row->trans; + $params["navigation"] = @$row->navigation; + $params["movimento"] = @$row->movimento; + $params["tempo"] = @$row->tempo; + $params["bkgnd"] = @$row->bkgnd; + $params["bkgnd1"] = @$row->bkgnd1; + $params["bkgnd2"] = @$row->bkgnd2; + $params["bkgnd3"] = @$row->bkgnd3; + $params["user_id"] = @$row->user_id; + $params["group_id"] = @$row->group_id; + $params["text"] = @$row->text; + $params["tags"] = @$row->tags; + $params["set_id"] = @$row->set_id; + $params["sort"] = @$row->sort; + $params["user"] = @$row->pusername; + $params["psingle"] = @$row->psingle; + $params["pback"] = @$row->pback; + $params["ph"] = @$row->paltezza; + $params["pw"] = @$row->plarghezza; + $params["overstretch"] = @$row->overstretch; + $params["shuffle"] = @$row->shuffle; + $params["template"] = @$row->tclassic; + $params["colonne"] = @$row->tcol; + + +echo '
'; + + if ($params_morfeo['description'] == 1) { + if (@$row->description1) { + ?> +
+ + + + +
+ description1; ?> +
+
+folder .DS.'big'; + $path1 = JURI::root().'images/morfeoshow/'. $row->folder .'/big/'; + $path2 = JURI::root().'images/morfeoshow/'. $row->folder.'/thumbs/'; + + switch ($params["template"]) { + case '0': + require_once( JPATH_COMPONENT.DS.'tpl'.DS.'classic/shadowbox1.php' ); + break; + + case '1': + require_once( JPATH_COMPONENT.DS.'tpl'.DS.'classic/shadowbox2.php' ); + break; + + case '2': + require_once( JPATH_COMPONENT.DS.'tpl'.DS.'classic/shadowbox3.php' ); + break; + + case '3': + require_once( JPATH_COMPONENT.DS.'tpl'.DS.'classic/shadowbox4.php' ); + break; + + case '4': + //fancybox first style + require_once( JPATH_COMPONENT.DS.'tpl'.DS.'classic/fancybox1.php' ); + break; + + case '5': + //fancybox second style + require_once( JPATH_COMPONENT.DS.'tpl'.DS.'classic/fancybox2.php' ); + break; + + case '6': + //fancybox first style + require_once( JPATH_COMPONENT.DS.'tpl'.DS.'classic/fancybox3.php' ); + break; + + case '7': + //fancybox second style + require_once( JPATH_COMPONENT.DS.'tpl'.DS.'classic/fancybox4.php' ); + break; + + } + +break; +//case 1 Imagerotatorgallery +case '1': + + if ( $params["trans"] == 0 ) { $trans = "random"; + } elseif ( $params["trans"] == 1 ) { $trans = "fade"; + } elseif ( $params["trans"] == 2 ) { $trans = "blocks"; + } elseif ( $params["trans"] == 3 ) { $trans = "circles"; + } elseif ( $params["trans"] == 4 ) { $trans = "bubbles"; + } elseif ( $params["trans"] == 5 ) { $trans = "lines"; + } elseif ( $params["trans"] == 6 ) { $trans = "slowfade"; + } elseif ( $params["trans"] == 7 ) { $trans = "fluids"; + } elseif ( $params["trans"] == 8 ) { $trans = "flash"; + } elseif ( $params["trans"] == 9 ) { $trans = "bgfade"; + } + + if ( $params['navigation'] == 1 ) { $nav = "true"; + } else if ( $params['navigation'] == 0 ) { $nav = "false"; + } + + if ( $params['overstretch'] == 1 ) { $overstretch = "true"; + } else if ( $params['overstretch'] == 0 ) { $overstretch = "false"; + } + + if ( $params['shuffle'] == 1 ) { $shuffle = "true"; + } else if ( $params['shuffle'] == 0 ) { $shuffle = "false"; + } + + if ( $params['movimento'] == 1 ) { $mov = "true"; + } else if ( $params['movimento'] == 0 ) { $mov = "false"; + } + require_once( JPATH_COMPONENT.DS.'tpl'.DS.'imagerotator/imagerotator.php' ); +break; +//case 2 Imageviwergallery +case '2': + require_once( JPATH_COMPONENT.DS.'tpl'.DS.'imageviewer/imageviewer.php' ); +break; +//case3 Postcardgallery +case '3': + require_once( JPATH_COMPONENT.DS.'tpl'.DS.'postcard/postcard.php' ); + +break; +//case4 Polaroidgallery +case '4': + require_once( JPATH_COMPONENT.DS.'tpl'.DS.'polaroid/polaroid.php' ); +break; +//case5 Flickr +case '5': + + if ( $params['sort'] == 1 ) { $sort = "sort=relevance"; + } else if ( $params["sort"] == 0 ) { $sort = "sort="; + } + + +echo ' + + + + +
+ + +
+'; + +break; +//case6 Flickr 2 +case '6': + + if ( $params['user_id'] == '' ) { $user = ""; + } else { $user = $params["user_id"]."/"; + } + if ( $params['tags'] ) { $tags = "tags/".$params["tags"]; + } else { $tags = ""; + } + if ( $params['set_id'] == '') { $set = ""; + } else { $set = "/sets/".$params["set_id"]; + } + if ( $params['sort'] == 1 ) { $int = "/interesting"; + } else { $int = ""; + } + +echo ' + + + + +
+ +
+'; + +break; +//case7 Flickr Map +case '7': + echo ' + + + + +
+ + +
+ '; +break; +//case8 Google Map +case '8': +?> + + + + +
+glat; + $longitudine = $row->glng; + $zoom = $row->gzoom; + $name = $row->name; + $name = $row->luogo; + $descrizione = $row->description; + $gmapkey = $row->gmapkey; +?> + + +
+
+ '; + echo 'EXTENT'; + echo 'A OPEN'; + echo ''; + echo '
'; + echo ''; + echo ''; + echo ''; + echo '
'; + echo ''; + echo $name; + echo '
'; + echo $descrizione; + echo '
'; + echo '
'; + +?> +
+
+
+photosets_getPhotos($photoset_id); + + require_once( JPATH_COMPONENT.DS.'tpl'.DS.'flickrsingle/flickrsingle.php' ); +break; + +//case10 picasa single gallery +case '11': + global $mainframe, $params_morfeo; + + $userid = $params['user']; + $gallery = $params['psingle']; + $background = $params['pback']; + $ph = $params['ph']; + $pw = $params['pw']; +?> + + + + +
+ +
+description1) { + ?> +
+ + + + +
+ description1; ?> +
+
+ + +
+ + +
+
'; + } else { + echo ''; + } + } +} +?> \ No newline at end of file diff --git a/components/com_morfeoshow/morfeoshow.php b/components/com_morfeoshow/morfeoshow.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/morfeoshow.php @@ -0,0 +1,290 @@ +getUserStateFromRequest('com_morfeoshow', 'limit', $default_limit, 'int'); + $limitstart = JRequest::getVar('limitstart', 0, '', 'int'); + JRequest::setVar('limit', (int) $limit); + static $HeaderAdded; + if(!$HeaderAdded) { + $HeaderAdded=1; + $header .= ' + + + '; + + $mainframe->addCustomHeadTag($header); +} + + // get the total number of records + $query = 'SELECT COUNT(id)' + . ' FROM #__morfeoshow' + . ' WHERE published = 1' + ; + $db->setQuery( $query ); + $total = $db->loadResult(); + jimport('joomla.html.pagination'); + $pageNav = new JPagination( $total, $limitstart, $limit ); + + $query = "SELECT * FROM #__morfeoshow WHERE published = 1 ORDER by ordering" + ; + $db->setQuery( $query, $pageNav->limitstart, $pageNav->limit ); + $rows = $db->loadObjectList(); + + if ($db->getErrorNum()) { + echo $db->stderr(); + return false; + } + + HTML_morfeoshow::mostraFrontend($option, $rows, $pageNav, $limitstart, $limit, $total); +} + +function mostraGalleria($option, $gallery){ + + global $mainframe, $params_morfeo; + $db =& JFactory::getDBO(); + $task = JRequest::getString('task', ''); + include_once(JPATH_SITE.DS.'administrator'.DS.'components'.DS.'com_morfeoshow'.DS.'settings.php' ); + + $query = "SELECT * FROM #__morfeoshow WHERE id =" .(int)$gallery; + $db->setQuery($query); + $row = $db->loadObject(); + $skin ="classic"; + $lang =$params_morfeo['shulang']; + $pla ="img"; + $params['template'] = @$row->tclassic; + + static $HeaderAdded; + if(!$HeaderAdded) { + $HeaderAdded=1; + $header=''; + if (@$row->flashgallery == 0) { + + if ($params['template'] == 4 || $params['template'] == 5 || $params['template'] == 6|| $params['template'] == 7) + { + + if ($params_morfeo['gapi'] == 0) + { + $header .= ' + + '; + } else { + $header .= ' + + + '; + } + + $header .= ' + + + + + +'; + } + else + { + + switch ($params_morfeo['shuadat']) { + case 'shadowbox-jquery.js': + if ($params_morfeo['gapi'] == 0) + { + $header .= ' + + '; + } else { + $header .= ' + + + '; + } +break; + case 'shadowbox-mootools.js': + if ($params_morfeo['gapi'] == 0) + { + $header .= ' + + '; + } else { + $header .= ' + + + '; + } +break; + case 'shadowbox-prototype.js': + if ($params_morfeo['gapi'] == 0) + { + $header .= ' + + '; + } else { + $header .= ' + + + '; + } +break; + case 'shadowbox-yui.js': + $header .= ' + + '; + +break; + case 'shadowbox-dojo.js': + if ($params_morfeo['gapi'] == 0) + { + $header .= ' + + '; + } else { + $header .= ' + + + '; + } +break; + +} + + $header .= ' + + + + + '; + } + } else if ($row->flashgallery == 9) { + + if ($params_morfeo['gapi'] == 0) + { + $header .= ' + + '; + } else { + $header .= ' + + + '; + } + $header .= ' + + + + + + + + +'; + + } else if ($row->flashgallery == 10) { + + if ($params_morfeo['gapi'] == 0) + { + $header .= ' + + '; + } else { + $header .= ' + + + '; + } + $header .= ' + + + + + +'; + + } + else + { + + $header .= ' + + + '; + }//end else + + $mainframe->addCustomHeadTag($header); + + }//end of header + + $mainframe->setPageTitle( stripslashes(@$row->name) ); + if (@$row->metadesc == ''){}else{ + $mainframe->prependMetaTag('description',$row->metadesc); + } + if (@$row->metakey == ''){}else{ + $mainframe->prependMetaTag('keywords',$row->metakey.", "); + } + jimport('joomla.environment.uri' ); + $host = JURI::root(); + + HTML_morfeoshow::mostraGalleria($option, $row, $task); +} +?> \ No newline at end of file diff --git a/components/com_morfeoshow/myphoto/index.html b/components/com_morfeoshow/myphoto/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/myphoto/index.html @@ -0,0 +1,1 @@ + \ No newline at end of file diff --git a/components/com_morfeoshow/router.php b/components/com_morfeoshow/router.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/router.php @@ -0,0 +1,38 @@ + \ No newline at end of file diff --git a/components/com_morfeoshow/src/adapter/index.html b/components/com_morfeoshow/src/adapter/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/adapter/index.html @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/components/com_morfeoshow/src/adapter/shadowbox-base.js b/components/com_morfeoshow/src/adapter/shadowbox-base.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/adapter/shadowbox-base.js @@ -0,0 +1,298 @@ +/** + * A base library for Shadowbox used as a standalone (without another base + * library/adapter combination). + * + * This file is part of Shadowbox. + * + * Shadowbox is an online media viewer application that supports all of the + * web's most popular media publishing formats. Shadowbox is written entirely + * in JavaScript and CSS and is highly customizable. Using Shadowbox, website + * authors can showcase a wide assortment of media in all major browsers without + * navigating users away from the linking page. + * + * Shadowbox is released under version 3.0 of the Creative Commons Attribution- + * Noncommercial-Share Alike license. This means that it is absolutely free + * for personal, noncommercial use provided that you 1) make attribution to the + * author and 2) release any derivative work under the same or a similar + * license. + * + * If you wish to use Shadowbox for commercial purposes, licensing information + * can be found at http://mjijackson.com/shadowbox/. + * + * @author Michael J. I. Jackson + * @copyright 2007-2008 Michael J. I. Jackson + * @license http://creativecommons.org/licenses/by-nc-sa/3.0/ + * @version SVN: $Id: shadowbox-base.js 103 2008-06-27 06:19:21Z mjijackson $ + */ + +// create the Shadowbox object first +var Shadowbox = {}; + +Shadowbox.lib = function(){ + + // local style camelizing for speed + var styleCache = {}; + var camelRe = /(-[a-z])/gi; + var camelFn = function(m, a){ + return a.charAt(1).toUpperCase(); + }; + var toCamel = function(style){ + var camel; + if(!(camel = styleCache[style])){ + camel = styleCache[style] = style.replace(camelRe, camelFn); + } + return camel; + }; + + var view = document.defaultView; + var alphaRe = /alpha\([^\)]*\)/gi; + + /** + * Sets the opacity of the given element to the specified level. + * + * @param {HTMLElement} el The element + * @param {Number} opacity The opacity to use + * @return void + * @private + * @static + */ + var setOpacity = function(el, opacity){ + var s = el.style; + if(window.ActiveXObject){ // IE + s.zoom = 1; // give "layout" + s.filter = (s.filter || '').replace(alphaRe, '') + + (opacity == 1 ? '' : ' alpha(opacity=' + (opacity * 100) + ')'); + }else{ + s.opacity = opacity; + } + }; + + return { + + adapter: 'standalone', + + /** + * Gets the value of the style on the given element. This function + * adapted from Ext.Element.getStyle(). + * + * @param {HTMLElement} el The DOM element + * @param {String} style The name of the style (e.g. margin-top) + * @return {mixed} The value of the given style + * @public + * @static + */ + getStyle: function(){ + return view && view.getComputedStyle + ? function(el, style){ + var v, cs, camel; + if(style == 'float') style = 'cssFloat'; + if(v = el.style[style]) return v; + if(cs = view.getComputedStyle(el, '')){ + return cs[toCamel(style)]; + } + return null; + } + : function(el, style){ + var v, cs, camel; + if(style == 'opacity'){ + if(typeof el.style.filter == 'string'){ + var m = el.style.filter.match(/alpha\(opacity=(.+)\)/i); + if(m){ + var fv = parseFloat(m[1]); + if(!isNaN(fv)) return (fv ? fv / 100 : 0); + } + } + return 1; + }else if(style == 'float'){ + style = 'styleFloat'; + } + var camel = toCamel(style); + if(v = el.style[camel]) return v; + if(cs = el.currentStyle) return cs[camel]; + return null; + }; + }(), + + /** + * Sets the style on the given element to the given value. May be an + * object to specify multiple values. This function adapted from + * Ext.Element.setStyle(). + * + * @param {HTMLElement} el The DOM element + * @param {String/Object} style The name of the style to set if a + * string, or an object of name => + * value pairs + * @param {String} value The value to set the given style to + * @return void + * @public + * @static + */ + setStyle: function(el, style, value){ + if(typeof style == 'string'){ + var camel = toCamel(style); + if(camel == 'opacity'){ + setOpacity(el, value); + }else{ + el.style[camel] = value; + } + }else{ + for(var s in style){ + this.setStyle(el, s, style[s]); + } + } + }, + + /** + * Gets a reference to the given element. + * + * @param {String/HTMLElement} el The element to fetch + * @return {HTMLElement} A reference to the element + * @public + * @static + */ + get: function(el){ + return typeof el == 'string' ? document.getElementById(el) : el; + }, + + /** + * Removes an element from the DOM. + * + * @param {HTMLElement} el The element to remove + * @return void + * @public + * @static + */ + remove: function(el){ + el.parentNode.removeChild(el); + }, + + /** + * Gets the target of the given event. The event object passed will be + * the same object that is passed to listeners registered with + * addEvent(). + * + * @param {mixed} e The event object + * @return {HTMLElement} The event's target element + * @public + * @static + */ + getTarget: function(e){ + var t = e.target ? e.target : e.srcElement; + return t.nodeType == 3 ? t.parentNode : t; + }, + + /** + * Gets the page X/Y coordinates of the mouse event in an [x, y] array. + * The page coordinates should be relative to the document, and not the + * viewport. The event object provided here will be the same object that + * is passed to listeners registered with addEvent(). + * + * @param {mixed} e The event object + * @return {Array} The page X/Y coordinates + * @public + * @static + */ + getPageXY: function(e){ + var x = e.pageX || (e.clientX + + (document.documentElement.scrollLeft || document.body.scrollLeft)); + var y = e.pageY || (e.clientY + + (document.documentElement.scrollTop || document.body.scrollTop)); + return [x, y]; + }, + + /** + * Prevents the event's default behavior. The event object here will + * be the same object that is passed to listeners registered with + * addEvent(). + * + * @param {mixed} e The event object + * @return void + * @public + * @static + */ + preventDefault: function(e){ + if(e.preventDefault){ + e.preventDefault(); + }else{ + e.returnValue = false; + } + }, + + /** + * Gets the key code of the given event object (keydown). The event + * object here will be the same object that is passed to listeners + * registered with addEvent(). + * + * @param {mixed} e The event object + * @return {Number} The key code of the event + * @public + * @static + */ + keyCode: function(e){ + return e.which ? e.which : e.keyCode; + }, + + /** + * Adds an event listener to the given element. It is expected that this + * function will be passed the event as its first argument. + * + * @param {HTMLElement} el The DOM element to listen to + * @param {String} name The name of the event to register + * (i.e. 'click', 'scroll', etc.) + * @param {Function} handler The event handler function + * @return void + * @public + * @static + */ + addEvent: function(el, name, handler){ + if(el.addEventListener){ + el.addEventListener(name, handler, false); + }else if(el.attachEvent){ + el.attachEvent('on' + name, handler); + } + }, + + /** + * Removes an event listener from the given element. + * + * @param {HTMLElement} el The DOM element to stop listening to + * @param {String} name The name of the event to stop + * listening for (i.e. 'click') + * @param {Function} handler The event handler function + * @return void + * @public + * @static + */ + removeEvent: function(el, name, handler){ + if(el.removeEventListener){ + el.removeEventListener(name, handler, false); + }else if(el.detachEvent){ + el.detachEvent('on' + name, handler); + } + }, + + /** + * Appends an HTML fragment to the given element. + * + * @param {HTMLElement} el The element to append to + * @param {String} html The HTML fragment to use + * @return void + * @public + * @static + */ + append: function(el, html){ + if(el.insertAdjacentHTML){ + el.insertAdjacentHTML('BeforeEnd', html); + }else if(el.lastChild){ + var range = el.ownerDocument.createRange(); + range.setStartAfter(el.lastChild); + var frag = range.createContextualFragment(html); + el.appendChild(frag); + }else{ + el.innerHTML = html; + } + } + + }; + +}(); diff --git a/components/com_morfeoshow/src/adapter/shadowbox-dojo.js b/components/com_morfeoshow/src/adapter/shadowbox-dojo.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/adapter/shadowbox-dojo.js @@ -0,0 +1,246 @@ +/** + * An adapter for Shadowbox and the Dojo Toolkit. + * + * This file is part of Shadowbox. + * + * Shadowbox is an online media viewer application that supports all of the + * web's most popular media publishing formats. Shadowbox is written entirely + * in JavaScript and CSS and is highly customizable. Using Shadowbox, website + * authors can showcase a wide assortment of media in all major browsers without + * navigating users away from the linking page. + * + * Shadowbox is released under version 3.0 of the Creative Commons Attribution- + * Noncommercial-Share Alike license. This means that it is absolutely free + * for personal, noncommercial use provided that you 1) make attribution to the + * author and 2) release any derivative work under the same or a similar + * license. + * + * If you wish to use Shadowbox for commercial purposes, licensing information + * can be found at http://mjijackson.com/shadowbox/. + * + * @author Peter Higgins + * @copyright 2008 Peter Higgins + * @license AFL/BSD + * @version SVN: $Id: shadowbox-dojo.js 103 2008-06-27 06:19:21Z mjijackson $ + */ + +if(typeof dojo == 'undefined'){ + throw 'Unable to load Shadowbox, Dojo Toolkit not found'; +} + +// create the Shadowbox object first +var Shadowbox = {}; + +Shadowbox.lib = function(){ + + /** + * Holds all registered event handlers. + * + * @property {Array} events + * @private + */ + var events = []; + + // local style camelizing for speed + var styleCache = {}; + var camelRe = /(-[a-z])/gi; + var camelFn = function(m, a){ + return a.charAt(1).toUpperCase(); + }; + var toCamel = function(style){ + var camel; + if(!(camel = styleCache[style])){ + camel = styleCache[style] = style.replace(camelRe, camelFn); + } + return camel; + }; + + return { + + adapter: 'dojo', + + /** + * Gets the value of the style on the given element. + * + * @param {HTMLElement} el The DOM element + * @param {String} style The name of the style (e.g. margin-top) + * @return {mixed} The value of the given style + * @public + * @static + */ + getStyle: function(el, style){ + return dojo.style(el, toCamel(style)); + }, + + /** + * Sets the style on the given element to the given value. May be an + * object to specify multiple values. + * + * @param {HTMLElement} el The DOM element + * @param {String/Object} style The name of the style to set if a + * string, or an object of name => + * value pairs + * @param {String} value The value to set the given style to + * @return void + * @public + * @static + */ + setStyle: function(el, style, value){ + if(typeof style == 'string'){ + dojo.style(el, toCamel(style), value); + }else{ + for(var i in style){ + dojo.style(el, i, style[i]); + } + } + }, + + /** + * Gets a reference to the given element. + * + * @param {String/HTMLElement} el The element to fetch + * @return {HTMLElement} A reference to the element + * @public + * @static + */ + get: function(el){ + return dojo.byId(el); + }, + + /** + * Removes an element from the DOM. + * + * @param {HTMLElement} el The element to remove + * @return void + * @public + * @static + */ + remove: function(el){ + dojo._destroyElement(el); + }, + + /** + * Gets the target of the given event. The event object passed will be + * the same object that is passed to listeners registered with + * addEvent(). + * + * @param {mixed} e The event object + * @return {HTMLElement} The event's target element + * @public + * @static + */ + getTarget: function(e){ + return e.target; + }, + + /** + * Gets the client X/Y coordinates of the mouse event. The event object + * provided here will be the same object that is passed to listeners + * registered with addEvent(). The return array will contain the [x, y] + * coordinates. + * + * @param {mixed} e The event object + * @return {Array} The client X/Y coordinates + * @public + * @static + */ + getPageXY: function(e){ + return [e.pageX, e.pageY]; + }, + + /** + * Prevents the event's default behavior. The event object passed will + * be the same object that is passed to listeners registered with + * addEvent(). + * + * @param {mixed} e The event object + * @return void + * @public + * @static + */ + preventDefault: function(e){ + e.preventDefault(); + }, + + /** + * Gets the key code of the given event object (keydown). The event + * object here will be the same object that is passed to listeners + * registered with addEvent(). + * + * @param {mixed} e The event object + * @return {Number} The key code of the event + * @public + * @static + */ + keyCode: function(e){ + return e.keyCode; + }, + + /** + * Adds an event listener to the given element. It is expected that this + * function will be passed the event as its first argument. + * + * @param {HTMLElement} el The DOM element to listen to + * @param {String} name The name of the event to register + * (i.e. 'click', 'scroll', etc.) + * @param {Function} handler The event handler function + * @return void + * @public + * @static + */ + addEvent: function(el, name, handler){ + var t = dojo.connect(el, name, handler); + // we need to store a handle to later disconnect + events.push({ + el: el, + name: name, + handle: t + }); + }, + + /** + * Removes an event listener from the given element. + * + * @param {HTMLElement} el The DOM element to stop listening to + * @param {String} name The name of the event to stop + * listening for (i.e. 'click') + * @param {Function} handler The event handler function + * @return void + * @public + * @static + */ + removeEvent: function(el, name, handler){ + // probably a quicker way to match this + dojo.forEach(events, function(ev, idx){ + if(ev && ev.el == el && ev.name == name){ + dojo.disconnect(ev.handle); + events[idx] = null; + } + }); + }, + + /** + * Appends an HTML fragment to the given element. + * + * @param {HTMLElement} el The element to append to + * @param {String} html The HTML fragment to use + * @return void + * @public + * @static + */ + append: function(el, html){ + if(el.insertAdjacentHTML){ + el.insertAdjacentHTML('BeforeEnd', html); + }else if(el.lastChild){ + var range = el.ownerDocument.createRange(); + range.setStartAfter(el.lastChild); + var frag = range.createContextualFragment(html); + el.appendChild(frag); + }else{ + el.innerHTML = html; + } + } + + }; + +}(); diff --git a/components/com_morfeoshow/src/adapter/shadowbox-jquery.js b/components/com_morfeoshow/src/adapter/shadowbox-jquery.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/adapter/shadowbox-jquery.js @@ -0,0 +1,214 @@ +/** + * An adapter for Shadowbox and the jQuery JavaScript library. + * + * This file is part of Shadowbox. + * + * Shadowbox is an online media viewer application that supports all of the + * web's most popular media publishing formats. Shadowbox is written entirely + * in JavaScript and CSS and is highly customizable. Using Shadowbox, website + * authors can showcase a wide assortment of media in all major browsers without + * navigating users away from the linking page. + * + * Shadowbox is released under version 3.0 of the Creative Commons Attribution- + * Noncommercial-Share Alike license. This means that it is absolutely free + * for personal, noncommercial use provided that you 1) make attribution to the + * author and 2) release any derivative work under the same or a similar + * license. + * + * If you wish to use Shadowbox for commercial purposes, licensing information + * can be found at http://mjijackson.com/shadowbox/. + * + * @author Michael J. I. Jackson + * @copyright 2007-2008 Michael J. I. Jackson + * @license http://creativecommons.org/licenses/by-nc-sa/3.0/ + * @version SVN: $Id: shadowbox-jquery.js 103 2008-06-27 06:19:21Z mjijackson $ + */ + +if(typeof jQuery == 'undefined'){ + throw 'Unable to load Shadowbox, jQuery library not found'; +} + +// create the Shadowbox object first +var Shadowbox = {}; + +Shadowbox.lib = { + + adapter: 'jquery', + + /** + * Gets the value of the style on the given element. + * + * @param {HTMLElement} el The DOM element + * @param {String} style The name of the style (e.g. margin-top) + * @return {mixed} The value of the given style + * @public + */ + getStyle: function(el, style){ + return jQuery(el).css(style); + }, + + /** + * Sets the style on the given element to the given value. May be an + * object to specify multiple values. + * + * @param {HTMLElement} el The DOM element + * @param {String/Object} style The name of the style to set if a + * string, or an object of name => + * value pairs + * @param {String} value The value to set the given style to + * @return void + * @public + */ + setStyle: function(el, style, value){ + if(typeof style != 'object'){ + var temp = {}; + temp[style] = value; + style = temp; + } + jQuery(el).css(style); + }, + + /** + * Gets a reference to the given element. + * + * @param {String/HTMLElement} el The element to fetch + * @return {HTMLElement} A reference to the element + * @public + */ + get: function(el){ + return (typeof el == 'string') ? document.getElementById(el) : el; + }, + + /** + * Removes an element from the DOM. + * + * @param {HTMLElement} el The element to remove + * @return void + * @public + */ + remove: function(el){ + jQuery(el).remove(); + }, + + /** + * Gets the target of the given event. The event object passed will be + * the same object that is passed to listeners registered with + * addEvent(). + * + * @param {mixed} e The event object + * @return {HTMLElement} The event's target element + * @public + */ + getTarget: function(e){ + return e.target; + }, + + /** + * Gets the page X/Y coordinates of the mouse event in an [x, y] array. + * The page coordinates should be relative to the document, and not the + * viewport. The event object provided here will be the same object that + * is passed to listeners registered with addEvent(). + * + * @param {mixed} e The event object + * @return {Array} The page X/Y coordinates + * @public + * @static + */ + getPageXY: function(e){ + return [e.pageX, e.pageY]; + }, + + /** + * Prevents the event's default behavior. The event object passed will + * be the same object that is passed to listeners registered with + * addEvent(). + * + * @param {mixed} e The event object + * @return void + * @public + */ + preventDefault: function(e){ + e.preventDefault(); + }, + + /** + * Gets the key code of the given event object (keydown). The event + * object here will be the same object that is passed to listeners + * registered with addEvent(). + * + * @param {mixed} e The event object + * @return {Number} The key code of the event + * @public + * @static + */ + keyCode: function(e){ + return e.keyCode; + }, + + /** + * Adds an event listener to the given element. It is expected that this + * function will be passed the event as its first argument. + * + * @param {HTMLElement} el The DOM element to listen to + * @param {String} name The name of the event to register + * (i.e. 'click', 'scroll', etc.) + * @param {Function} handler The event handler function + * @return void + * @public + */ + addEvent: function(el, name, handler){ + jQuery(el).bind(name, handler); + }, + + /** + * Removes an event listener from the given element. + * + * @param {HTMLElement} el The DOM element to stop listening to + * @param {String} name The name of the event to stop + * listening for (i.e. 'click') + * @param {Function} handler The event handler function + * @return void + * @public + */ + removeEvent: function(el, name, handler){ + jQuery(el).unbind(name, handler); + }, + + /** + * Appends an HTML fragment to the given element. + * + * @param {HTMLElement} el The element to append to + * @param {String} html The HTML fragment to use + * @return void + * @public + */ + append: function(el, html){ + jQuery(el).append(html); + } + +}; + +/** + * Passes the selected elements to the Shadowbox.setup() function. Supports + * embedded height and width attributes within the class attribute. + * + * @param {Object} options The options to pass to setup() for all + * selected elements + * @public + * @author Mike Alsup + * @author Roger Barrett + */ +(function($){ +$.fn.shadowbox = function(options){ + return this.each(function(){ + var $this = $(this); + // support jQuery metadata plugin + var opts = $.extend({}, options || {}, $.metadata ? $this.metadata() : $.meta ? $this.data() : {}); + // support embedded opts (for w/h) within the class attr + var cls = this.className || ''; + opts.width = parseInt((cls.match(/w:(\d+)/)||[])[1]) || opts.width; + opts.height = parseInt((cls.match(/h:(\d+)/)||[])[1]) || opts.height; + Shadowbox.setup($this, opts); + }); +}; +})(jQuery); diff --git a/components/com_morfeoshow/src/adapter/shadowbox-mootools.js b/components/com_morfeoshow/src/adapter/shadowbox-mootools.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/adapter/shadowbox-mootools.js @@ -0,0 +1,243 @@ +/** + * An adapter for Shadowbox and the MooTools JavaScript framework. + * + * This file is part of Shadowbox. + * + * Shadowbox is an online media viewer application that supports all of the + * web's most popular media publishing formats. Shadowbox is written entirely + * in JavaScript and CSS and is highly customizable. Using Shadowbox, website + * authors can showcase a wide assortment of media in all major browsers without + * navigating users away from the linking page. + * + * Shadowbox is released under version 3.0 of the Creative Commons Attribution- + * Noncommercial-Share Alike license. This means that it is absolutely free + * for personal, noncommercial use provided that you 1) make attribution to the + * author and 2) release any derivative work under the same or a similar + * license. + * + * If you wish to use Shadowbox for commercial purposes, licensing information + * can be found at http://mjijackson.com/shadowbox/. + * + * @author Michael J. I. Jackson + * @copyright 2007-2008 Michael J. I. Jackson + * @license http://creativecommons.org/licenses/by-nc-sa/3.0/ + * @version SVN: $Id: shadowbox-mootools.js 110 2008-07-11 04:42:10Z mjijackson $ + */ + +if(typeof MooTools == 'undefined'){ + // Note: requires MooTools 1.2 Core + throw 'Unable to load Shadowbox, MooTools library not found'; +} + +// create the Shadowbox object first +var Shadowbox = {}; + +Shadowbox.lib = function(){ + + var alphaRe = /alpha\([^\)]*\)/gi; + + /** + * Sets the opacity of the given element to the specified level. Necessary + * in the MooTools adapter to prevent MooTools from messing with the + * element's visibility. + * + * @param {HTMLElement} el The element + * @param {Number} opacity The opacity to use + * @return void + * @private + * @static + */ + var setOpacity = function(el, opacity){ + var s = el.style; + if(window.ActiveXObject){ // IE + s.zoom = 1; + s.filter = (s.filter || '').replace(alphaRe, '') + + (opacity == 1 ? '' : ' alpha(opacity=' + opacity * 100 + ')'); + }else{ + s.opacity = opacity; + } + }; + + return { + + adapter: 'mootools', + + /** + * Gets the value of the style on the given element. + * + * @param {HTMLElement} el The DOM element + * @param {String} style The name of the style (e.g. margin-top) + * @return {mixed} The value of the given style + * @public + * @static + */ + getStyle: function(el, style){ + return $(el).getStyle(style); + }, + + /** + * Sets the style on the given element to the given value. May be an + * object to specify multiple values. + * + * @param {HTMLElement} el The DOM element + * @param {String/Object} style The name of the style to set if a + * string, or an object of name => + * value pairs + * @param {String} value The value to set the given style to + * @return void + * @public + * @static + */ + setStyle: function(el, style, value){ + el = $(el); + if(typeof style != 'object'){ + var o = {}; + o[style] = value; + style = o; + } + for(var s in style){ + if(s == 'opacity'){ + setOpacity(el, style[s]); + }else{ + el.setStyle(s, style[s]); + } + } + }, + + /** + * Gets a reference to the given element. + * + * @param {String/HTMLElement} el The element to fetch + * @return {HTMLElement} A reference to the element + * @public + * @static + */ + get: function(el){ + return $(el); + }, + + /** + * Removes an element from the DOM. + * + * @param {HTMLElement} el The element to remove + * @return void + * @public + * @static + */ + remove: function(el){ + el.parentNode.removeChild(el); + }, + + /** + * Gets the target of the given event. The event object passed will be + * the same object that is passed to listeners registered with + * addEvent(). + * + * @param {mixed} e The event object + * @return {HTMLElement} The event's target element + * @public + * @static + */ + getTarget: function(e){ + return e.target; + }, + + /** + * Gets the page X/Y coordinates of the mouse event in an [x, y] array. + * The page coordinates should be relative to the document, and not the + * viewport. The event object provided here will be the same object that + * is passed to listeners registered with addEvent(). + * + * @param {mixed} e The event object + * @return {Array} The page X/Y coordinates + * @public + * @static + */ + getPageXY: function(e){ + return [e.page.x, e.page.y]; + }, + + /** + * Prevents the event's default behavior. The event object passed will + * be the same object that is passed to listeners registered with + * addEvent(). + * + * @param {mixed} e The event object + * @return void + * @public + * @static + */ + preventDefault: function(e){ + e.preventDefault(); + }, + + /** + * Gets the key code of the given event object (keydown). The event + * object here will be the same object that is passed to listeners + * registered with addEvent(). + * + * @param {mixed} e The event object + * @return {Number} The key code of the event + * @public + * @static + */ + keyCode: function(e){ + return e.code; + }, + + /** + * Adds an event listener to the given element. It is expected that this + * function will be passed the event as its first argument. + * + * @param {HTMLElement} el The DOM element to listen to + * @param {String} name The name of the event to register + * (i.e. 'click', 'scroll', etc.) + * @param {Function} handler The event handler function + * @return void + * @public + * @static + */ + addEvent: function(el, name, handler){ + $(el).addEvent(name, handler); + }, + + /** + * Removes an event listener from the given element. + * + * @param {HTMLElement} el The DOM element to stop listening to + * @param {String} name The name of the event to stop + * listening for (i.e. 'click') + * @param {Function} handler The event handler function + * @return void + * @public + * @static + */ + removeEvent: function(el, name, handler){ + $(el).removeEvent(name, handler); + }, + + /** + * Appends an HTML fragment to the given element. + * + * @param {HTMLElement} el The element to append to + * @param {String} html The HTML fragment to use + * @return void + * @public + * @static + */ + append: function(el, html){ + if(el.insertAdjacentHTML){ + el.insertAdjacentHTML('BeforeEnd', html); + }else if(el.lastChild){ + var range = el.ownerDocument.createRange(); + range.setStartAfter(el.lastChild); + var frag = range.createContextualFragment(html); + el.appendChild(frag); + }else{ + el.innerHTML = html; + } + } + + }; + +}(); diff --git a/components/com_morfeoshow/src/adapter/shadowbox-prototype.js b/components/com_morfeoshow/src/adapter/shadowbox-prototype.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/adapter/shadowbox-prototype.js @@ -0,0 +1,208 @@ +/** + * An adapter for Shadowbox and the Prototpe JavaScript library. + * + * This file is part of Shadowbox. + * + * Shadowbox is an online media viewer application that supports all of the + * web's most popular media publishing formats. Shadowbox is written entirely + * in JavaScript and CSS and is highly customizable. Using Shadowbox, website + * authors can showcase a wide assortment of media in all major browsers without + * navigating users away from the linking page. + * + * Shadowbox is released under version 3.0 of the Creative Commons Attribution- + * Noncommercial-Share Alike license. This means that it is absolutely free + * for personal, noncommercial use provided that you 1) make attribution to the + * author and 2) release any derivative work under the same or a similar + * license. + * + * If you wish to use Shadowbox for commercial purposes, licensing information + * can be found at http://mjijackson.com/shadowbox/. + * + * @author Michael J. I. Jackson + * @copyright 2007-2008 Michael J. I. Jackson + * @license http://creativecommons.org/licenses/by-nc-sa/3.0/ + * @version SVN: $Id: shadowbox-prototype.js 103 2008-06-27 06:19:21Z mjijackson $ + */ + +if(typeof Prototype == 'undefined'){ + throw 'Unable to load Shadowbox, Prototype framework not found'; +} + +// create the Shadowbox object first +var Shadowbox = {}; + +Shadowbox.lib = function(){ + + // local style camelizing for speed + var styleCache = {}; + var camelRe = /(-[a-z])/gi; + var camelFn = function(m, a){ + return a.charAt(1).toUpperCase(); + }; + var toCamel = function(style){ + var camel; + if(!(camel = styleCache[style])){ + camel = styleCache[style] = style.replace(camelRe, camelFn); + } + return camel; + }; + + return { + + adapter: 'prototype', + + /** + * Gets the value of the style on the given element. + * + * @param {HTMLElement} el The DOM element + * @param {String} style The name of the style (e.g. margin-top) + * @return {mixed} The value of the given style + * @public + */ + getStyle: function(el, style){ + return Element.getStyle(el, style); + }, + + /** + * Sets the style on the given element to the given value. May be an + * object to specify multiple values. + * + * @param {HTMLElement} el The DOM element + * @param {String/Object} style The name of the style to set if a + * string, or an object of name => + * value pairs + * @param {String} value The value to set the given style to + * @return void + * @public + */ + setStyle: function(el, style, value){ + if(typeof style == 'string'){ + var temp = {}; + temp[toCamel(style)] = value; + style = temp; + } + Element.setStyle(el, style); + }, + + /** + * Gets a reference to the given element. + * + * @param {String/HTMLElement} el The element to fetch + * @return {HTMLElement} A reference to the element + * @public + */ + get: function(el){ + return $(el); + }, + + /** + * Removes an element from the DOM. + * + * @param {HTMLElement} el The element to remove + * @return void + * @public + */ + remove: function(el){ + Element.remove(el); + }, + + /** + * Gets the target of the given event. The event object passed will be + * the same object that is passed to listeners registered with + * addEvent(). + * + * @param {mixed} e The event object + * @return {HTMLElement} The event's target element + * @public + */ + getTarget: function(e){ + return Event.element(e); + }, + + /** + * Prevents the event's default behavior. The event object passed will + * be the same object that is passed to listeners registered with + * addEvent(). + * + * @param {mixed} e The event object + * @return void + * @public + */ + preventDefault: function(e){ + Event.stop(e); + }, + + /** + * Gets the page X/Y coordinates of the mouse event in an [x, y] array. + * The page coordinates should be relative to the document, and not the + * viewport. The event object provided here will be the same object that + * is passed to listeners registered with addEvent(). + * + * @param {mixed} e The event object + * @return {Array} The page X/Y coordinates + * @public + * @static + */ + getPageXY: function(e){ + var p = Event.pointer(e); + return [p.x, p.y]; + }, + + /** + * Gets the key code of the given event object (keydown). The event + * object here will be the same object that is passed to listeners + * registered with addEvent(). + * + * @param {mixed} e The event object + * @return {Number} The key code of the event + * @public + * @static + */ + keyCode: function(e){ + return e.keyCode; + }, + + /** + * Adds an event listener to the given element. It is expected that this + * function will be passed the event as its first argument. + * + * @param {HTMLElement} el The DOM element to listen to + * @param {String} name The name of the event to register + * (i.e. 'click', 'scroll', etc.) + * @param {Function} handler The event handler function + * @return void + * @public + */ + addEvent: function(el, name, handler){ + Event.observe(el, name, handler); + }, + + /** + * Removes an event listener from the given element. + * + * @param {HTMLElement} el The DOM element to stop listening to + * @param {String} name The name of the event to stop + * listening for (i.e. 'click') + * @param {Function} handler The event handler function + * @return void + * @public + */ + removeEvent: function(el, name, handler){ + Event.stopObserving(el, name, handler); + }, + + /** + * Appends an HTML fragment to the given element. + * + * @param {HTMLElement} el The element to append to + * @param {String} html The HTML fragment to use + * @return void + * @public + */ + append: function(el, html){ + Element.insert(el, html); + } + + }; + +}(); diff --git a/components/com_morfeoshow/src/adapter/shadowbox-yui.js b/components/com_morfeoshow/src/adapter/shadowbox-yui.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/adapter/shadowbox-yui.js @@ -0,0 +1,218 @@ +/** + * An adapter for Shadowbox and the Yahoo! User Interface (YUI) library. + * + * This file is part of Shadowbox. + * + * Shadowbox is an online media viewer application that supports all of the + * web's most popular media publishing formats. Shadowbox is written entirely + * in JavaScript and CSS and is highly customizable. Using Shadowbox, website + * authors can showcase a wide assortment of media in all major browsers without + * navigating users away from the linking page. + * + * Shadowbox is released under version 3.0 of the Creative Commons Attribution- + * Noncommercial-Share Alike license. This means that it is absolutely free + * for personal, noncommercial use provided that you 1) make attribution to the + * author and 2) release any derivative work under the same or a similar + * license. + * + * If you wish to use Shadowbox for commercial purposes, licensing information + * can be found at http://mjijackson.com/shadowbox/. + * + * @author Michael J. I. Jackson + * @copyright 2007-2008 Michael J. I. Jackson + * @license http://creativecommons.org/licenses/by-nc-sa/3.0/ + * @version SVN: $Id: shadowbox-yui.js 103 2008-06-27 06:19:21Z mjijackson $ + */ + +if(typeof YAHOO == 'undefined'){ + // Note: requires yahoo-dom-event.js + throw 'Unable to load Shadowbox, core YUI utilities (yahoo, dom, event) not found'; +} + +// create the Shadowbox object first +var Shadowbox = {}; + +Shadowbox.lib = function(){ + + // shorthand + var E = YAHOO.util.Event; + var D = YAHOO.util.Dom; + + return { + + adapter: 'yui', + + /** + * Gets the value of the style on the given element. + * + * @param {HTMLElement} el The DOM element + * @param {String} style The name of the style (e.g. margin-top) + * @return {mixed} The value of the given style + * @public + * @static + */ + getStyle: function(el, style){ + return D.getStyle(el, style); + }, + + /** + * Sets the style on the given element to the given value. May be an + * object to specify multiple values. + * + * @param {HTMLElement} el The DOM element + * @param {String/Object} style The name of the style to set if a + * string, or an object of name => + * value pairs + * @param {String} value The value to set the given style to + * @return void + * @public + * @static + */ + setStyle: function(el, style, value){ + if(typeof style != 'object'){ + var temp = {}; + temp[style] = value; + style = temp; + } + for(var s in style){ + D.setStyle(el, s, style[s]); + } + }, + + /** + * Gets a reference to the given element. + * + * @param {String/HTMLElement} el The element to fetch + * @return {HTMLElement} A reference to the element + * @public + * @static + */ + get: function(el){ + return D.get(el); + }, + + /** + * Removes an element from the DOM. + * + * @param {HTMLElement} el The element to remove + * @return void + * @public + * @static + */ + remove: function(el){ + el.parentNode.removeChild(el); + }, + + /** + * Gets the target of the given event. The event object passed will be + * the same object that is passed to listeners registered with + * addEvent(). + * + * @param {mixed} e The event object + * @return {HTMLElement} The event's target element + * @public + * @static + */ + getTarget: function(e){ + return E.getTarget(e); + }, + + /** + * Gets the page X/Y coordinates of the mouse event in an [x, y] array. + * The page coordinates should be relative to the document, and not the + * viewport. The event object provided here will be the same object that + * is passed to listeners registered with addEvent(). + * + * @param {mixed} e The event object + * @return {Array} The page X/Y coordinates + * @public + * @static + */ + getPageXY: function(e){ + return [E.getPageX(e), E.getPageY(e)]; + }, + + /** + * Prevents the event's default behavior. The event object passed will + * be the same object that is passed to listeners registered with + * addEvent(). + * + * @param {mixed} e The event object + * @return void + * @public + * @static + */ + preventDefault: function(e){ + E.preventDefault(e); + }, + + /** + * Gets the key code of the given event object (keydown). The event + * object here will be the same object that is passed to listeners + * registered with addEvent(). + * + * @param {mixed} e The event object + * @return {Number} The key code of the event + * @public + * @static + */ + keyCode: function(e){ + return e.keyCode; + }, + + /** + * Adds an event listener to the given element. It is expected that this + * function will be passed the event as its first argument. + * + * @param {HTMLElement} el The DOM element to listen to + * @param {String} name The name of the event to register + * (i.e. 'click', 'scroll', etc.) + * @param {Function} handler The event handler function + * @return void + * @public + * @static + */ + addEvent: function(el, name, handler){ + E.addListener(el, name, handler); + }, + + /** + * Removes an event listener from the given element. + * + * @param {HTMLElement} el The DOM element to stop listening to + * @param {String} name The name of the event to stop + * listening for (i.e. 'click') + * @param {Function} handler The event handler function + * @return void + * @public + * @static + */ + removeEvent: function(el, name, handler){ + E.removeListener(el, name, handler); + }, + + /** + * Appends an HTML fragment to the given element. + * + * @param {HTMLElement} el The element to append to + * @param {String} html The HTML fragment to use + * @return void + * @public + * @static + */ + append: function(el, html){ + if(el.insertAdjacentHTML){ + el.insertAdjacentHTML('BeforeEnd', html); + }else if(el.lastChild){ + var range = el.ownerDocument.createRange(); + range.setStartAfter(el.lastChild); + var frag = range.createContextualFragment(html); + el.appendChild(frag); + }else{ + el.innerHTML = html; + } + } + + }; + +}(); diff --git a/components/com_morfeoshow/src/imagerotator.swf b/components/com_morfeoshow/src/imagerotator.swf new file mode 100644 index 0000000000000000000000000000000000000000..0156f0eda45a504ca180d7edc741eb748eb44760 GIT binary patch literal 42010 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

|YlO{NNVZmW;^ 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%0A+^6W~awmp<}AN-mDBtIeIRE0-r$& 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 + + + \ No newline at end of file diff --git a/components/com_morfeoshow/src/js/css/index.html b/components/com_morfeoshow/src/js/css/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/js/css/index.html @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/components/com_morfeoshow/src/js/css/pic.css b/components/com_morfeoshow/src/js/css/pic.css new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/js/css/pic.css @@ -0,0 +1,71 @@ +#maintable{ + border: 1px solid #CCCCCC; +} + + +#headerpic{} + +#maincontent +{ + margin: 0; + padding: 20px; +} + +#piccontainer +{ +} + +h1, h2, h3, h4, h5, h6{ + +} + +h1{ font-size: 20px; +font-weight: bold; +} +h2{ font-size: 18px;} +h3{ font-size: 16px;} +h4{ font-size: 14px;} +h5{ font-size: 12px;} +h6{ font-size: 10px;} + +blockquote { + font-style: italic; + font-size: 100%; + line-height: 150%; + width: auto; + padding: 0px 0px 5px 30px; + margin: 15px 0; +} + + +img{} + +img.pwimages{ + border: solid 2px #ccc; + margin: 3px; +} + +.standard { +} + +.pwalbums{ + border: 1px solid #ccc; +} + +#img_float_left +{ + /* Used in the [img] tag when float=left */ + float: left; + margin: 2px 8px 4px 2px; +} + +#img_float_right +{ + /* Used in the [img] tag when float=right */ + float: right; + margin: 2px 2px 4px 8px; +} + +#footerpic{clear: both;} + +.divider { margin: 20px 0px 15px 0px; } \ No newline at end of file diff --git a/components/com_morfeoshow/src/js/dojo.js b/components/com_morfeoshow/src/js/dojo.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/js/dojo.js @@ -0,0 +1,20 @@ +/* + Copyright (c) 2004-2008, The Dojo Foundation + All Rights Reserved. + + Licensed under the Academic Free License version 2.1 or above OR the + modified BSD license. For more information on Dojo licensing, see: + + http://dojotoolkit.org/book/dojo-book-0-9/introduction/licensing +*/ + +/* + This is a compiled version of Dojo, built for deployment and not for + development. To get an editable version, please visit: + + http://dojotoolkit.org + + for documentation and information on getting the source. +*/ + +(function(){var _1=null;if((_1||(typeof djConfig!="undefined"&&djConfig.scopeMap))&&(typeof window!="undefined")){var _2="",_3="",_4="",_5={},_6={};_1=_1||djConfig.scopeMap;for(var i=0;i<_1.length;i++){var _8=_1[i];_2+="var "+_8[0]+" = {}; "+_8[1]+" = "+_8[0]+";"+_8[1]+"._scopeName = '"+_8[1]+"';";_3+=(i==0?"":",")+_8[0];_4+=(i==0?"":",")+_8[1];_5[_8[0]]=_8[1];_6[_8[1]]=_8[0];}eval(_2+"dojo._scopeArgs = ["+_4+"];");dojo._scopePrefixArgs=_3;dojo._scopePrefix="(function("+_3+"){";dojo._scopeSuffix="})("+_4+")";dojo._scopeMap=_5;dojo._scopeMapRev=_6;}(function(){if(!this["console"]){this.console={log:function(){}};}var cn=["assert","count","debug","dir","dirxml","error","group","groupEnd","info","profile","profileEnd","time","timeEnd","trace","warn","log"];var i=0,tn;while((tn=cn[i++])){if(!console[tn]){(function(){var _c=tn+"";console[_c]=function(){var a=Array.apply({},arguments);a.unshift(_c+":");console.log(a.join(" "));};})();}}if(typeof dojo=="undefined"){this.dojo={_scopeName:"dojo",_scopePrefix:"",_scopePrefixArgs:"",_scopeSuffix:"",_scopeMap:{},_scopeMapRev:{}};}var d=dojo;if(typeof dijit=="undefined"){this.dijit={_scopeName:"dijit"};}if(typeof dojox=="undefined"){this.dojox={_scopeName:"dojox"};}if(!d._scopeArgs){d._scopeArgs=[dojo,dijit,dojox];}d.global=this;d.config={isDebug:false,debugAtAllCosts:false};if(typeof djConfig!="undefined"){for(var _f in djConfig){d.config[_f]=djConfig[_f];}}var _10=["Browser","Rhino","Spidermonkey","Mobile"];var t;while((t=_10.shift())){d["is"+t]=false;}dojo.locale=d.config.locale;var rev="$Rev: 13707 $".match(/\d+/);dojo.version={major:1,minor:1,patch:1,flag:"",revision:rev?+rev[0]:999999,toString:function(){with(d.version){return major+"."+minor+"."+patch+flag+" ("+revision+")";}}};if(typeof OpenAjax!="undefined"){OpenAjax.hub.registerLibrary(dojo._scopeName,"http://dojotoolkit.org",d.version.toString());}dojo._mixin=function(obj,_14){var _15={};for(var x in _14){if(_15[x]===undefined||_15[x]!=_14[x]){obj[x]=_14[x];}}if(d["isIE"]&&_14){var p=_14.toString;if(typeof p=="function"&&p!=obj.toString&&p!=_15.toString&&p!="\nfunction toString() {\n [native code]\n}\n"){obj.toString=_14.toString;}}return obj;};dojo.mixin=function(obj,_19){for(var i=1,l=arguments.length;i0){console.warn("files still in flight!");return;}d._callLoaded();};dojo._callLoaded=function(){if(typeof setTimeout=="object"||(dojo.config.useXDomain&&d.isOpera)){if(dojo.isAIR){setTimeout(function(){dojo.loaded();},0);}else{setTimeout(dojo._scopeName+".loaded();",0);}}else{d.loaded();}};dojo._getModuleSymbols=function(_4b){var _4c=_4b.split(".");for(var i=_4c.length;i>0;i--){var _4e=_4c.slice(0,i).join(".");if((i==1)&&!this._moduleHasPrefix(_4e)){_4c[0]="../"+_4c[0];}else{var _4f=this._getModulePrefix(_4e);if(_4f!=_4e){_4c.splice(0,i,_4f);break;}}}return _4c;};dojo._global_omit_module_check=false;dojo._loadModule=dojo.require=function(_50,_51){_51=this._global_omit_module_check||_51;var _52=this._loadedModules[_50];if(_52){return _52;}var _53=this._getModuleSymbols(_50).join("/")+".js";var _54=(!_51)?_50:null;var ok=this._loadPath(_53,_54);if(!ok&&!_51){throw new Error("Could not load '"+_50+"'; last tried '"+_53+"'");}if(!_51&&!this._isXDomain){_52=this._loadedModules[_50];if(!_52){throw new Error("symbol '"+_50+"' is not defined after loading '"+_53+"'");}}return _52;};dojo.provide=function(_56){_56=_56+"";return (d._loadedModules[_56]=d.getObject(_56,true));};dojo.platformRequire=function(_57){var _58=_57.common||[];var _59=_58.concat(_57[d._name]||_57["default"]||[]);for(var x=0;x<_59.length;x++){var _5b=_59[x];if(_5b.constructor==Array){d._loadModule.apply(d,_5b);}else{d._loadModule(_5b);}}};dojo.requireIf=function(_5c,_5d){if(_5c===true){var _5e=[];for(var i=1;i0&&!(j==1&&_6f[0]=="")&&_6f[j]==".."&&_6f[j-1]!=".."){if(j==(_6f.length-1)){_6f.splice(j,1);_6f[j-1]="";}else{_6f.splice(j-1,2);j-=2;}}}}_6c.path=_6f.join("/");}}}}uri=[];if(_6c.scheme){uri.push(_6c.scheme,":");}if(_6c.authority){uri.push("//",_6c.authority);}uri.push(_6c.path);if(_6c.query){uri.push("?",_6c.query);}if(_6c.fragment){uri.push("#",_6c.fragment);}}this.uri=uri.join("");var r=this.uri.match(ore);this.scheme=r[2]||(r[1]?"":n);this.authority=r[4]||(r[3]?"":n);this.path=r[5];this.query=r[7]||(r[6]?"":n);this.fragment=r[9]||(r[8]?"":n);if(this.authority!=n){r=this.authority.match(ire);this.user=r[3]||n;this.password=r[4]||n;this.host=r[5];this.port=r[7]||n;}};dojo._Url.prototype.toString=function(){return this.uri;};dojo.moduleUrl=function(_72,url){var loc=d._getModuleSymbols(_72).join("/");if(!loc){return null;}if(loc.lastIndexOf("/")!=loc.length-1){loc+="/";}var _75=loc.indexOf(":");if(loc.charAt(0)!="/"&&(_75==-1||_75>loc.indexOf("/"))){loc=d.baseUrl+loc;}return new d._Url(loc,url);};})();if(typeof window!="undefined"){dojo.isBrowser=true;dojo._name="browser";(function(){var d=dojo;if(document&&document.getElementsByTagName){var _77=document.getElementsByTagName("script");var _78=/dojo(\.xd)?\.js(\W|$)/i;for(var i=0;i<_77.length;i++){var src=_77[i].getAttribute("src");if(!src){continue;}var m=src.match(_78);if(m){if(!d.config.baseUrl){d.config.baseUrl=src.substring(0,m.index);}var cfg=_77[i].getAttribute("djConfig");if(cfg){var _7d=eval("({ "+cfg+" })");for(var x in _7d){dojo.config[x]=_7d[x];}}break;}}}d.baseUrl=d.config.baseUrl;var n=navigator;var dua=n.userAgent;var dav=n.appVersion;var tv=parseFloat(dav);d.isOpera=(dua.indexOf("Opera")>=0)?tv:0;var idx=Math.max(dav.indexOf("WebKit"),dav.indexOf("Safari"),0);if(idx){d.isSafari=parseFloat(dav.split("Version/")[1])||((parseFloat(dav.substr(idx+7))>=419.3)?3:2)||2;}d.isAIR=(dua.indexOf("AdobeAIR")>=0)?1:0;d.isKhtml=(dav.indexOf("Konqueror")>=0||d.isSafari)?tv:0;d.isMozilla=d.isMoz=(dua.indexOf("Gecko")>=0&&!d.isKhtml)?tv:0;d.isFF=d.isIE=0;if(d.isMoz){d.isFF=parseFloat(dua.split("Firefox/")[1])||0;}if(document.all&&!d.isOpera){d.isIE=parseFloat(dav.split("MSIE ")[1])||0;}if(dojo.isIE&&window.location.protocol==="file:"){dojo.config.ieForceActiveXXhr=true;}var cm=document.compatMode;d.isQuirks=cm=="BackCompat"||cm=="QuirksMode"||d.isIE<6;d.locale=dojo.config.locale||(d.isIE?n.userLanguage:n.language).toLowerCase();d._XMLHTTP_PROGIDS=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"];d._xhrObj=function(){var _85=null;var _86=null;if(!dojo.isIE||!dojo.config.ieForceActiveXXhr){try{_85=new XMLHttpRequest();}catch(e){}}if(!_85){for(var i=0;i<3;++i){var _88=d._XMLHTTP_PROGIDS[i];try{_85=new ActiveXObject(_88);}catch(e){_86=e;}if(_85){d._XMLHTTP_PROGIDS=[_88];break;}}}if(!_85){throw new Error("XMLHTTP not available: "+_86);}return _85;};d._isDocumentOk=function(_89){var _8a=_89.status||0;return (_8a>=200&&_8a<300)||_8a==304||_8a==1223||(!_8a&&(location.protocol=="file:"||location.protocol=="chrome:"));};var _8b=window.location+"";var _8c=document.getElementsByTagName("base");var _8d=(_8c&&_8c.length>0);d._getText=function(uri,_8f){var _90=this._xhrObj();if(!_8d&&dojo._Url){uri=(new dojo._Url(_8b,uri)).toString();}if(d.config.cacheBust){uri+=(uri.indexOf("?")==-1?"?":"&")+String(d.config.cacheBust).replace(/\W+/g,"");}_90.open("GET",uri,false);try{_90.send(null);if(!d._isDocumentOk(_90)){var err=Error("Unable to load "+uri+" status:"+_90.status);err.status=_90.status;err.responseText=_90.responseText;throw err;}}catch(e){if(_8f){return null;}throw e;}return _90.responseText;};})();dojo._initFired=false;dojo._loadInit=function(e){dojo._initFired=true;var _93=(e&&e.type)?e.type.toLowerCase():"load";if(arguments.callee.initialized||(_93!="domcontentloaded"&&_93!="load")){return;}arguments.callee.initialized=true;if("_khtmlTimer" in dojo){clearInterval(dojo._khtmlTimer);delete dojo._khtmlTimer;}if(dojo._inFlightCount==0){dojo._modulesLoaded();}};dojo._fakeLoadInit=function(){dojo._loadInit({type:"load"});};if(!dojo.config.afterOnLoad){if(document.addEventListener){if(dojo.isOpera||dojo.isFF>=3||(dojo.isMoz&&dojo.config.enableMozDomContentLoaded===true)){document.addEventListener("DOMContentLoaded",dojo._loadInit,null);}window.addEventListener("load",dojo._loadInit,null);}if(dojo.isAIR){window.addEventListener("load",dojo._loadInit,null);}else{if(/(WebKit|khtml)/i.test(navigator.userAgent)){dojo._khtmlTimer=setInterval(function(){if(/loaded|complete/.test(document.readyState)){dojo._loadInit();}},10);}}}(function(){var _w=window;var _95=function(_96,fp){var _98=_w[_96]||function(){};_w[_96]=function(){fp.apply(_w,arguments);_98.apply(_w,arguments);};};if(dojo.isIE){if(!dojo.config.afterOnLoad){document.write(""+"");}var _99=true;_95("onbeforeunload",function(){_w.setTimeout(function(){_99=false;},0);});_95("onunload",function(){if(_99){dojo.unloaded();}});try{document.namespaces.add("v","urn:schemas-microsoft-com:vml");document.createStyleSheet().addRule("v\\:*","behavior:url(#default#VML)");}catch(e){}}else{_95("onbeforeunload",function(){dojo.unloaded();});}})();}(function(){var mp=dojo.config["modulePaths"];if(mp){for(var _9b in mp){dojo.registerModulePath(_9b,mp[_9b]);}}})();if(dojo.config.isDebug){dojo.require("dojo._firebug.firebug");}if(dojo.config.debugAtAllCosts){dojo.config.useXDomain=true;dojo.require("dojo._base._loader.loader_xd");dojo.require("dojo._base._loader.loader_debug");dojo.require("dojo.i18n");}if(!dojo._hasResource["dojo._base.lang"]){dojo._hasResource["dojo._base.lang"]=true;dojo.provide("dojo._base.lang");dojo.isString=function(it){return !!arguments.length&&it!=null&&(typeof it=="string"||it instanceof String);};dojo.isArray=function(it){return it&&(it instanceof Array||typeof it=="array");};dojo.isFunction=(function(){var _9e=function(it){return it&&(typeof it=="function"||it instanceof Function);};return dojo.isSafari?function(it){if(typeof it=="function"&&it=="[object NodeList]"){return false;}return _9e(it);}:_9e;})();dojo.isObject=function(it){return it!==undefined&&(it===null||typeof it=="object"||dojo.isArray(it)||dojo.isFunction(it));};dojo.isArrayLike=function(it){var d=dojo;return it&&it!==undefined&&!d.isString(it)&&!d.isFunction(it)&&!(it.tagName&&it.tagName.toLowerCase()=="form")&&(d.isArray(it)||isFinite(it.length));};dojo.isAlien=function(it){return it&&!dojo.isFunction(it)&&/\{\s*\[native code\]\s*\}/.test(String(it));};dojo.extend=function(_a5,_a6){for(var i=1,l=arguments.length;i2){return dojo._hitchArgs.apply(dojo,arguments);}if(!_b0){_b0=_af;_af=null;}if(dojo.isString(_b0)){_af=_af||dojo.global;if(!_af[_b0]){throw (["dojo.hitch: scope[\"",_b0,"\"] is null (scope=\"",_af,"\")"].join(""));}return function(){return _af[_b0].apply(_af,arguments||[]);};}return !_af?_b0:function(){return _b0.apply(_af,arguments||[]);};};dojo.delegate=dojo._delegate=function(obj,_b2){function TMP(){};TMP.prototype=obj;var tmp=new TMP();if(_b2){dojo.mixin(tmp,_b2);}return tmp;};dojo.partial=function(_b4){var arr=[null];return dojo.hitch.apply(dojo,arr.concat(dojo._toArray(arguments)));};dojo._toArray=function(obj,_b7,_b8){var arr=_b8||[];for(var x=_b7||0;x=0){this._fire();}return this;},_fire:function(){var _12b=this.chain;var _12c=this.fired;var res=this.results[_12c];var self=this;var cb=null;while((_12b.length>0)&&(this.paused==0)){var f=_12b.shift()[_12c];if(!f){continue;}try{res=f(res);_12c=((res instanceof Error)?1:0);if(res instanceof dojo.Deferred){cb=function(res){self._resback(res);self.paused--;if((self.paused==0)&&(self.fired>=0)){self._fire();}};this.paused++;}}catch(err){console.debug(err);_12c=1;res=err;}}this.fired=_12c;this.results[_12c]=res;if((cb)&&(this.paused)){res.addBoth(cb);}}});}if(!dojo._hasResource["dojo._base.json"]){dojo._hasResource["dojo._base.json"]=true;dojo.provide("dojo._base.json");dojo.fromJson=function(json){return eval("("+json+")");};dojo._escapeString=function(str){return ("\""+str.replace(/(["\\])/g,"\\$1")+"\"").replace(/[\f]/g,"\\f").replace(/[\b]/g,"\\b").replace(/[\n]/g,"\\n").replace(/[\t]/g,"\\t").replace(/[\r]/g,"\\r");};dojo.toJsonIndentStr="\t";dojo.toJson=function(it,_135,_136){if(it===undefined){return "undefined";}var _137=typeof it;if(_137=="number"||_137=="boolean"){return it+"";}if(it===null){return "null";}if(dojo.isString(it)){return dojo._escapeString(it);}if(it.nodeType&&it.cloneNode){return "";}var _138=arguments.callee;var _139;_136=_136||"";var _13a=_135?_136+dojo.toJsonIndentStr:"";if(typeof it.__json__=="function"){_139=it.__json__();if(it!==_139){return _138(_139,_135,_13a);}}if(typeof it.json=="function"){_139=it.json();if(it!==_139){return _138(_139,_135,_13a);}}var sep=_135?" ":"";var _13c=_135?"\n":"";if(dojo.isArray(it)){var res=dojo.map(it,function(obj){var val=_138(obj,_135,_13a);if(typeof val!="string"){val="undefined";}return _13c+_13a+val;});return "["+res.join(","+sep)+_13c+_136+"]";}if(_137=="function"){return null;}var _140=[];for(var key in it){var _142;if(typeof key=="number"){_142="\""+key+"\"";}else{if(typeof key=="string"){_142=dojo._escapeString(key);}else{continue;}}val=_138(it[key],_135,_13a);if(typeof val!="string"){continue;}_140.push(_13c+_13a+_142+":"+sep+val);}return "{"+_140.join(","+sep)+_13c+_136+"}";};}if(!dojo._hasResource["dojo._base.array"]){dojo._hasResource["dojo._base.array"]=true;dojo.provide("dojo._base.array");(function(){var _143=function(arr,obj,cb){return [dojo.isString(arr)?arr.split(""):arr,obj||dojo.global,dojo.isString(cb)?new Function("item","index","array",cb):cb];};dojo.mixin(dojo,{indexOf:function(_147,_148,_149,_14a){var step=1,end=_147.length||0,i=0;if(_14a){i=end-1;step=end=-1;}if(_149!=undefined){i=_149;}if((_14a&&i>end)||i>=bits;t[x]=bits==4?17*c:c;});t.a=1;return t;};dojo.colorFromArray=function(a,obj){var t=obj||new dojo.Color();t._set(Number(a[0]),Number(a[1]),Number(a[2]),Number(a[3]));if(isNaN(t.a)){t.a=1;}return t.sanitize();};dojo.colorFromString=function(str,obj){var a=dojo.Color.named[str];return a&&dojo.colorFromArray(a,obj)||dojo.colorFromRgb(str,obj)||dojo.colorFromHex(str,obj);};}if(!dojo._hasResource["dojo._base"]){dojo._hasResource["dojo._base"]=true;dojo.provide("dojo._base");}if(!dojo._hasResource["dojo._base.window"]){dojo._hasResource["dojo._base.window"]=true;dojo.provide("dojo._base.window");dojo._gearsObject=function(){var _198;var _199;var _19a=dojo.getObject("google.gears");if(_19a){return _19a;}if(typeof GearsFactory!="undefined"){_198=new GearsFactory();}else{if(dojo.isIE){try{_198=new ActiveXObject("Gears.Factory");}catch(e){}}else{if(navigator.mimeTypes["application/x-googlegears"]){_198=document.createElement("object");_198.setAttribute("type","application/x-googlegears");_198.setAttribute("width",0);_198.setAttribute("height",0);_198.style.display="none";document.documentElement.appendChild(_198);}}}if(!_198){return null;}dojo.setObject("google.gears.factory",_198);return dojo.getObject("google.gears");};dojo.isGears=(!!dojo._gearsObject())||0;dojo.doc=window["document"]||null;dojo.body=function(){return dojo.doc.body||dojo.doc.getElementsByTagName("body")[0];};dojo.setContext=function(_19b,_19c){dojo.global=_19b;dojo.doc=_19c;};dojo._fireCallback=function(_19d,_19e,_19f){if(_19e&&dojo.isString(_19d)){_19d=_19e[_19d];}return _19d.apply(_19e,_19f||[]);};dojo.withGlobal=function(_1a0,_1a1,_1a2,_1a3){var rval;var _1a5=dojo.global;var _1a6=dojo.doc;try{dojo.setContext(_1a0,_1a0.document);rval=dojo._fireCallback(_1a1,_1a2,_1a3);}finally{dojo.setContext(_1a5,_1a6);}return rval;};dojo.withDoc=function(_1a7,_1a8,_1a9,_1aa){var rval;var _1ac=dojo.doc;try{dojo.doc=_1a7;rval=dojo._fireCallback(_1a8,_1a9,_1aa);}finally{dojo.doc=_1ac;}return rval;};}if(!dojo._hasResource["dojo._base.event"]){dojo._hasResource["dojo._base.event"]=true;dojo.provide("dojo._base.event");(function(){var del=(dojo._event_listener={add:function(node,name,fp){if(!node){return;}name=del._normalizeEventName(name);fp=del._fixCallback(name,fp);var _1b1=name;if(!dojo.isIE&&(name=="mouseenter"||name=="mouseleave")){var ofp=fp;name=(name=="mouseenter")?"mouseover":"mouseout";fp=function(e){if(!dojo.isDescendant(e.relatedTarget,node)){return ofp.call(this,e);}};}node.addEventListener(name,fp,false);return fp;},remove:function(node,_1b5,_1b6){if(node){node.removeEventListener(del._normalizeEventName(_1b5),_1b6,false);}},_normalizeEventName:function(name){return name.slice(0,2)=="on"?name.slice(2):name;},_fixCallback:function(name,fp){return name!="keypress"?fp:function(e){return fp.call(this,del._fixEvent(e,this));};},_fixEvent:function(evt,_1bc){switch(evt.type){case "keypress":del._setKeyChar(evt);break;}return evt;},_setKeyChar:function(evt){evt.keyChar=evt.charCode?String.fromCharCode(evt.charCode):"";}});dojo.fixEvent=function(evt,_1bf){return del._fixEvent(evt,_1bf);};dojo.stopEvent=function(evt){evt.preventDefault();evt.stopPropagation();};var _1c1=dojo._listener;dojo._connect=function(obj,_1c3,_1c4,_1c5,_1c6){var _1c7=obj&&(obj.nodeType||obj.attachEvent||obj.addEventListener);var lid=!_1c7?0:(!_1c6?1:2),l=[dojo._listener,del,_1c1][lid];var h=l.add(obj,_1c3,dojo.hitch(_1c4,_1c5));return [obj,_1c3,h,lid];};dojo._disconnect=function(obj,_1cc,_1cd,_1ce){([dojo._listener,del,_1c1][_1ce]).remove(obj,_1cc,_1cd);};dojo.keys={BACKSPACE:8,TAB:9,CLEAR:12,ENTER:13,SHIFT:16,CTRL:17,ALT:18,PAUSE:19,CAPS_LOCK:20,ESCAPE:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT_ARROW:37,UP_ARROW:38,RIGHT_ARROW:39,DOWN_ARROW:40,INSERT:45,DELETE:46,HELP:47,LEFT_WINDOW:91,RIGHT_WINDOW:92,SELECT:93,NUMPAD_0:96,NUMPAD_1:97,NUMPAD_2:98,NUMPAD_3:99,NUMPAD_4:100,NUMPAD_5:101,NUMPAD_6:102,NUMPAD_7:103,NUMPAD_8:104,NUMPAD_9:105,NUMPAD_MULTIPLY:106,NUMPAD_PLUS:107,NUMPAD_ENTER:108,NUMPAD_MINUS:109,NUMPAD_PERIOD:110,NUMPAD_DIVIDE:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,F13:124,F14:125,F15:126,NUM_LOCK:144,SCROLL_LOCK:145};if(dojo.isIE){var _1cf=function(e,code){try{return (e.keyCode=code);}catch(e){return 0;}};var iel=dojo._listener;if(!dojo.config._allow_leaks){_1c1=iel=dojo._ie_listener={handlers:[],add:function(_1d3,_1d4,_1d5){_1d3=_1d3||dojo.global;var f=_1d3[_1d4];if(!f||!f._listeners){var d=dojo._getIeDispatcher();d.target=f&&(ieh.push(f)-1);d._listeners=[];f=_1d3[_1d4]=d;}return f._listeners.push(ieh.push(_1d5)-1);},remove:function(_1d9,_1da,_1db){var f=(_1d9||dojo.global)[_1da],l=f&&f._listeners;if(f&&l&&_1db--){delete ieh[l[_1db]];delete l[_1db];}}};var ieh=iel.handlers;}dojo.mixin(del,{add:function(node,_1df,fp){if(!node){return;}_1df=del._normalizeEventName(_1df);if(_1df=="onkeypress"){var kd=node.onkeydown;if(!kd||!kd._listeners||!kd._stealthKeydownHandle){var h=del.add(node,"onkeydown",del._stealthKeyDown);kd=node.onkeydown;kd._stealthKeydownHandle=h;kd._stealthKeydownRefs=1;}else{kd._stealthKeydownRefs++;}}return iel.add(node,_1df,del._fixCallback(fp));},remove:function(node,_1e4,_1e5){_1e4=del._normalizeEventName(_1e4);iel.remove(node,_1e4,_1e5);if(_1e4=="onkeypress"){var kd=node.onkeydown;if(--kd._stealthKeydownRefs<=0){iel.remove(node,"onkeydown",kd._stealthKeydownHandle);delete kd._stealthKeydownHandle;}}},_normalizeEventName:function(_1e7){return _1e7.slice(0,2)!="on"?"on"+_1e7:_1e7;},_nop:function(){},_fixEvent:function(evt,_1e9){if(!evt){var w=_1e9&&(_1e9.ownerDocument||_1e9.document||_1e9).parentWindow||window;evt=w.event;}if(!evt){return (evt);}evt.target=evt.srcElement;evt.currentTarget=(_1e9||evt.srcElement);evt.layerX=evt.offsetX;evt.layerY=evt.offsetY;var se=evt.srcElement,doc=(se&&se.ownerDocument)||document;var _1ed=((dojo.isIE<6)||(doc["compatMode"]=="BackCompat"))?doc.body:doc.documentElement;var _1ee=dojo._getIeDocumentElementOffset();evt.pageX=evt.clientX+dojo._fixIeBiDiScrollLeft(_1ed.scrollLeft||0)-_1ee.x;evt.pageY=evt.clientY+(_1ed.scrollTop||0)-_1ee.y;if(evt.type=="mouseover"){evt.relatedTarget=evt.fromElement;}if(evt.type=="mouseout"){evt.relatedTarget=evt.toElement;}evt.stopPropagation=del._stopPropagation;evt.preventDefault=del._preventDefault;return del._fixKeys(evt);},_fixKeys:function(evt){switch(evt.type){case "keypress":var c=("charCode" in evt?evt.charCode:evt.keyCode);if(c==10){c=0;evt.keyCode=13;}else{if(c==13||c==27){c=0;}else{if(c==3){c=99;}}}evt.charCode=c;del._setKeyChar(evt);break;}return evt;},_punctMap:{106:42,111:47,186:59,187:43,188:44,189:45,190:46,191:47,192:96,219:91,220:92,221:93,222:39},_stealthKeyDown:function(evt){var kp=evt.currentTarget.onkeypress;if(!kp||!kp._listeners){return;}var k=evt.keyCode;var _1f4=(k!=13)&&(k!=32)&&(k!=27)&&(k<48||k>90)&&(k<96||k>111)&&(k<186||k>192)&&(k<219||k>222);if(_1f4||evt.ctrlKey){var c=_1f4?0:k;if(evt.ctrlKey){if(k==3||k==13){return;}else{if(c>95&&c<106){c-=48;}else{if((!evt.shiftKey)&&(c>=65&&c<=90)){c+=32;}else{c=del._punctMap[c]||c;}}}}var faux=del._synthesizeEvent(evt,{type:"keypress",faux:true,charCode:c});kp.call(evt.currentTarget,faux);evt.cancelBubble=faux.cancelBubble;evt.returnValue=faux.returnValue;_1cf(evt,faux.keyCode);}},_stopPropagation:function(){this.cancelBubble=true;},_preventDefault:function(){this.bubbledKeyCode=this.keyCode;if(this.ctrlKey){_1cf(this,0);}this.returnValue=false;}});dojo.stopEvent=function(evt){evt=evt||window.event;del._stopPropagation.call(evt);del._preventDefault.call(evt);};}del._synthesizeEvent=function(evt,_1f9){var faux=dojo.mixin({},evt,_1f9);del._setKeyChar(faux);faux.preventDefault=function(){evt.preventDefault();};faux.stopPropagation=function(){evt.stopPropagation();};return faux;};if(dojo.isOpera){dojo.mixin(del,{_fixEvent:function(evt,_1fc){switch(evt.type){case "keypress":var c=evt.which;if(c==3){c=99;}c=((c<41)&&(!evt.shiftKey)?0:c);if((evt.ctrlKey)&&(!evt.shiftKey)&&(c>=65)&&(c<=90)){c+=32;}return del._synthesizeEvent(evt,{charCode:c});}return evt;}});}if(dojo.isSafari){dojo.mixin(del,{_fixEvent:function(evt,_1ff){switch(evt.type){case "keypress":var c=evt.charCode,s=evt.shiftKey,k=evt.keyCode;k=k||_203[evt.keyIdentifier]||0;if(evt.keyIdentifier=="Enter"){c=0;}else{if((evt.ctrlKey)&&(c>0)&&(c<27)){c+=96;}else{if(c==dojo.keys.SHIFT_TAB){c=dojo.keys.TAB;s=true;}else{c=(c>=32&&c<63232?c:0);}}}return del._synthesizeEvent(evt,{charCode:c,shiftKey:s,keyCode:k});}return evt;}});dojo.mixin(dojo.keys,{SHIFT_TAB:25,UP_ARROW:63232,DOWN_ARROW:63233,LEFT_ARROW:63234,RIGHT_ARROW:63235,F1:63236,F2:63237,F3:63238,F4:63239,F5:63240,F6:63241,F7:63242,F8:63243,F9:63244,F10:63245,F11:63246,F12:63247,PAUSE:63250,DELETE:63272,HOME:63273,END:63275,PAGE_UP:63276,PAGE_DOWN:63277,INSERT:63302,PRINT_SCREEN:63248,SCROLL_LOCK:63249,NUM_LOCK:63289});var dk=dojo.keys,_203={"Up":dk.UP_ARROW,"Down":dk.DOWN_ARROW,"Left":dk.LEFT_ARROW,"Right":dk.RIGHT_ARROW,"PageUp":dk.PAGE_UP,"PageDown":dk.PAGE_DOWN};}})();if(dojo.isIE){dojo._ieDispatcher=function(args,_206){var ap=Array.prototype,h=dojo._ie_listener.handlers,c=args.callee,ls=c._listeners,t=h[c.target];var r=t&&t.apply(_206,args);for(var i in ls){if(!(i in ap)){h[ls[i]].apply(_206,args);}}return r;};dojo._getIeDispatcher=function(){return new Function(dojo._scopeName+"._ieDispatcher(arguments, this)");};dojo._event_listener._fixCallback=function(fp){var f=dojo._event_listener._fixEvent;return function(e){return fp.call(this,f(e,this));};};}}if(!dojo._hasResource["dojo._base.html"]){dojo._hasResource["dojo._base.html"]=true;dojo.provide("dojo._base.html");try{document.execCommand("BackgroundImageCache",false,true);}catch(e){}if(dojo.isIE||dojo.isOpera){dojo.byId=function(id,doc){if(dojo.isString(id)){var _d=doc||dojo.doc;var te=_d.getElementById(id);if(te&&te.attributes.id.value==id){return te;}else{var eles=_d.all[id];if(!eles||!eles.length){return eles;}var i=0;while((te=eles[i++])){if(te.attributes.id.value==id){return te;}}}}else{return id;}};}else{dojo.byId=function(id,doc){return dojo.isString(id)?(doc||dojo.doc).getElementById(id):id;};}(function(){var d=dojo;var _21a=null;dojo.addOnUnload(function(){_21a=null;});dojo._destroyElement=function(node){node=d.byId(node);try{if(!_21a){_21a=document.createElement("div");}_21a.appendChild(node.parentNode?node.parentNode.removeChild(node):node);_21a.innerHTML="";}catch(e){}};dojo.isDescendant=function(node,_21d){try{node=d.byId(node);_21d=d.byId(_21d);while(node){if(node===_21d){return true;}node=node.parentNode;}}catch(e){}return false;};dojo.setSelectable=function(node,_21f){node=d.byId(node);if(d.isMozilla){node.style.MozUserSelect=_21f?"":"none";}else{if(d.isKhtml){node.style.KhtmlUserSelect=_21f?"auto":"none";}else{if(d.isIE){node.unselectable=_21f?"":"on";d.query("*",node).forEach(function(_220){_220.unselectable=_21f?"":"on";});}}}};var _221=function(node,ref){ref.parentNode.insertBefore(node,ref);return true;};var _224=function(node,ref){var pn=ref.parentNode;if(ref==pn.lastChild){pn.appendChild(node);}else{return _221(node,ref.nextSibling);}return true;};dojo.place=function(node,_229,_22a){if(!node||!_229||_22a===undefined){return false;}node=d.byId(node);_229=d.byId(_229);if(typeof _22a=="number"){var cn=_229.childNodes;if((_22a==0&&cn.length==0)||cn.length==_22a){_229.appendChild(node);return true;}if(_22a==0){return _221(node,_229.firstChild);}return _224(node,cn[_22a-1]);}switch(_22a.toLowerCase()){case "before":return _221(node,_229);case "after":return _224(node,_229);case "first":if(_229.firstChild){return _221(node,_229.firstChild);}default:_229.appendChild(node);return true;}};dojo.boxModel="content-box";if(d.isIE){var _dcm=document.compatMode;d.boxModel=_dcm=="BackCompat"||_dcm=="QuirksMode"||d.isIE<6?"border-box":"content-box";}var gcs,dv=document.defaultView;if(d.isSafari){gcs=function(node){var s=dv.getComputedStyle(node,null);if(!s&&node.style){node.style.display="";s=dv.getComputedStyle(node,null);}return s||{};};}else{if(d.isIE){gcs=function(node){return node.currentStyle;};}else{gcs=function(node){return dv.getComputedStyle(node,null);};}}dojo.getComputedStyle=gcs;if(!d.isIE){dojo._toPixelValue=function(_233,_234){return parseFloat(_234)||0;};}else{dojo._toPixelValue=function(_235,_236){if(!_236){return 0;}if(_236=="medium"){return 4;}if(_236.slice&&(_236.slice(-2)=="px")){return parseFloat(_236);}with(_235){var _237=style.left;var _238=runtimeStyle.left;runtimeStyle.left=currentStyle.left;try{style.left=_236;_236=style.pixelLeft;}catch(e){_236=0;}style.left=_237;runtimeStyle.left=_238;}return _236;};}var px=d._toPixelValue;dojo._getOpacity=d.isIE?function(node){try{return node.filters.alpha.opacity/100;}catch(e){return 1;}}:function(node){return gcs(node).opacity;};dojo._setOpacity=d.isIE?function(node,_23d){if(_23d==1){var _23e=/FILTER:[^;]*;?/i;node.style.cssText=node.style.cssText.replace(_23e,"");if(node.nodeName.toLowerCase()=="tr"){d.query("> td",node).forEach(function(i){i.style.cssText=i.style.cssText.replace(_23e,"");});}}else{var o="Alpha(Opacity="+_23d*100+")";node.style.filter=o;}if(node.nodeName.toLowerCase()=="tr"){d.query("> td",node).forEach(function(i){i.style.filter=o;});}return _23d;}:function(node,_243){return node.style.opacity=_243;};var _244={left:true,top:true};var _245=/margin|padding|width|height|max|min|offset/;var _246=function(node,type,_249){type=type.toLowerCase();if(d.isIE&&_249=="auto"){if(type=="height"){return node.offsetHeight;}if(type=="width"){return node.offsetWidth;}}if(!(type in _244)){_244[type]=_245.test(type);}return _244[type]?px(node,_249):_249;};var _24a=d.isIE?"styleFloat":"cssFloat";var _24b={"cssFloat":_24a,"styleFloat":_24a,"float":_24a};dojo.style=function(node,_24d,_24e){var n=d.byId(node),args=arguments.length,op=(_24d=="opacity");_24d=_24b[_24d]||_24d;if(args==3){return op?d._setOpacity(n,_24e):n.style[_24d]=_24e;}if(args==2&&op){return d._getOpacity(n);}var s=gcs(n);if(args==2&&!d.isString(_24d)){for(var x in _24d){d.style(node,x,_24d[x]);}return s;}return (args==1)?s:_246(n,_24d,s[_24d]);};dojo._getPadExtents=function(n,_255){var s=_255||gcs(n),l=px(n,s.paddingLeft),t=px(n,s.paddingTop);return {l:l,t:t,w:l+px(n,s.paddingRight),h:t+px(n,s.paddingBottom)};};dojo._getBorderExtents=function(n,_25a){var ne="none",s=_25a||gcs(n),bl=(s.borderLeftStyle!=ne?px(n,s.borderLeftWidth):0),bt=(s.borderTopStyle!=ne?px(n,s.borderTopWidth):0);return {l:bl,t:bt,w:bl+(s.borderRightStyle!=ne?px(n,s.borderRightWidth):0),h:bt+(s.borderBottomStyle!=ne?px(n,s.borderBottomWidth):0)};};dojo._getPadBorderExtents=function(n,_260){var s=_260||gcs(n),p=d._getPadExtents(n,s),b=d._getBorderExtents(n,s);return {l:p.l+b.l,t:p.t+b.t,w:p.w+b.w,h:p.h+b.h};};dojo._getMarginExtents=function(n,_265){var s=_265||gcs(n),l=px(n,s.marginLeft),t=px(n,s.marginTop),r=px(n,s.marginRight),b=px(n,s.marginBottom);if(d.isSafari&&(s.position!="absolute")){r=l;}return {l:l,t:t,w:l+r,h:t+b};};dojo._getMarginBox=function(node,_26c){var s=_26c||gcs(node),me=d._getMarginExtents(node,s);var l=node.offsetLeft-me.l,t=node.offsetTop-me.t;if(d.isMoz){var sl=parseFloat(s.left),st=parseFloat(s.top);if(!isNaN(sl)&&!isNaN(st)){l=sl,t=st;}else{var p=node.parentNode;if(p&&p.style){var pcs=gcs(p);if(pcs.overflow!="visible"){var be=d._getBorderExtents(p,pcs);l+=be.l,t+=be.t;}}}}else{if(d.isOpera){var p=node.parentNode;if(p){var be=d._getBorderExtents(p);l-=be.l,t-=be.t;}}}return {l:l,t:t,w:node.offsetWidth+me.w,h:node.offsetHeight+me.h};};dojo._getContentBox=function(node,_277){var s=_277||gcs(node),pe=d._getPadExtents(node,s),be=d._getBorderExtents(node,s),w=node.clientWidth,h;if(!w){w=node.offsetWidth,h=node.offsetHeight;}else{h=node.clientHeight,be.w=be.h=0;}if(d.isOpera){pe.l+=be.l;pe.t+=be.t;}return {l:pe.l,t:pe.t,w:w-pe.w-be.w,h:h-pe.h-be.h};};dojo._getBorderBox=function(node,_27e){var s=_27e||gcs(node),pe=d._getPadExtents(node,s),cb=d._getContentBox(node,s);return {l:cb.l-pe.l,t:cb.t-pe.t,w:cb.w+pe.w,h:cb.h+pe.h};};dojo._setBox=function(node,l,t,w,h,u){u=u||"px";var s=node.style;if(!isNaN(l)){s.left=l+u;}if(!isNaN(t)){s.top=t+u;}if(w>=0){s.width=w+u;}if(h>=0){s.height=h+u;}};dojo._usesBorderBox=function(node){var n=node.tagName;return d.boxModel=="border-box"||n=="TABLE"||n=="BUTTON";};dojo._setContentSize=function(node,_28c,_28d,_28e){if(d._usesBorderBox(node)){var pb=d._getPadBorderExtents(node,_28e);if(_28c>=0){_28c+=pb.w;}if(_28d>=0){_28d+=pb.h;}}d._setBox(node,NaN,NaN,_28c,_28d);};dojo._setMarginBox=function(node,_291,_292,_293,_294,_295){var s=_295||gcs(node);var bb=d._usesBorderBox(node),pb=bb?_299:d._getPadBorderExtents(node,s),mb=d._getMarginExtents(node,s);if(_293>=0){_293=Math.max(_293-pb.w-mb.w,0);}if(_294>=0){_294=Math.max(_294-pb.h-mb.h,0);}d._setBox(node,_291,_292,_293,_294);};var _299={l:0,t:0,w:0,h:0};dojo.marginBox=function(node,box){var n=d.byId(node),s=gcs(n),b=box;return !b?d._getMarginBox(n,s):d._setMarginBox(n,b.l,b.t,b.w,b.h,s);};dojo.contentBox=function(node,box){var n=dojo.byId(node),s=gcs(n),b=box;return !b?d._getContentBox(n,s):d._setContentSize(n,b.w,b.h,s);};var _2a5=function(node,prop){if(!(node=(node||0).parentNode)){return 0;}var val,_2a9=0,_b=d.body();while(node&&node.style){if(gcs(node).position=="fixed"){return 0;}val=node[prop];if(val){_2a9+=val-0;if(node==_b){break;}}node=node.parentNode;}return _2a9;};dojo._docScroll=function(){var _b=d.body(),_w=d.global,de=d.doc.documentElement;return {y:(_w.pageYOffset||de.scrollTop||_b.scrollTop||0),x:(_w.pageXOffset||d._fixIeBiDiScrollLeft(de.scrollLeft)||_b.scrollLeft||0)};};dojo._isBodyLtr=function(){return !("_bodyLtr" in d)?d._bodyLtr=gcs(d.body()).direction=="ltr":d._bodyLtr;};dojo._getIeDocumentElementOffset=function(){var de=d.doc.documentElement;return (d.isIE>=7)?{x:de.getBoundingClientRect().left,y:de.getBoundingClientRect().top}:{x:d._isBodyLtr()||window.parent==window?de.clientLeft:de.offsetWidth-de.clientWidth-de.clientLeft,y:de.clientTop};};dojo._fixIeBiDiScrollLeft=function(_2af){var dd=d.doc;if(d.isIE&&!dojo._isBodyLtr()){var de=dd.compatMode=="BackCompat"?dd.body:dd.documentElement;return _2af+de.clientWidth-de.scrollWidth;}return _2af;};dojo._abs=function(node,_2b3){var _2b4=node.ownerDocument;var ret={x:0,y:0};var db=d.body();if(d.isIE||(d.isFF>=3)){var _2b7=node.getBoundingClientRect();var _2b8=(d.isIE)?d._getIeDocumentElementOffset():{x:0,y:0};ret.x=_2b7.left-_2b8.x;ret.y=_2b7.top-_2b8.y;}else{if(_2b4["getBoxObjectFor"]){var bo=_2b4.getBoxObjectFor(node),b=d._getBorderExtents(node);ret.x=bo.x-b.l-_2a5(node,"scrollLeft");ret.y=bo.y-b.t-_2a5(node,"scrollTop");}else{if(node["offsetParent"]){var _2bb;if(d.isSafari&&(gcs(node).position=="absolute")&&(node.parentNode==db)){_2bb=db;}else{_2bb=db.parentNode;}if(node.parentNode!=db){var nd=node;if(d.isOpera){nd=db;}ret.x-=_2a5(nd,"scrollLeft");ret.y-=_2a5(nd,"scrollTop");}var _2bd=node;do{var n=_2bd.offsetLeft;if(!d.isOpera||n>0){ret.x+=isNaN(n)?0:n;}var t=_2bd.offsetTop;ret.y+=isNaN(t)?0:t;if(d.isSafari&&_2bd!=node){var cs=gcs(_2bd);ret.x+=px(_2bd,cs.borderLeftWidth);ret.y+=px(_2bd,cs.borderTopWidth);}_2bd=_2bd.offsetParent;}while((_2bd!=_2bb)&&_2bd);}else{if(node.x&&node.y){ret.x+=isNaN(node.x)?0:node.x;ret.y+=isNaN(node.y)?0:node.y;}}}}if(_2b3){var _2c1=d._docScroll();ret.y+=_2c1.y;ret.x+=_2c1.x;}return ret;};dojo.coords=function(node,_2c3){var n=d.byId(node),s=gcs(n),mb=d._getMarginBox(n,s);var abs=d._abs(n,_2c3);mb.x=abs.x;mb.y=abs.y;return mb;};var _2c8=function(name){switch(name.toLowerCase()){case "tabindex":return (d.isIE&&d.isIE<8)?"tabIndex":"tabindex";default:return name;}};var _2ca={colspan:"colSpan",enctype:"enctype",frameborder:"frameborder",method:"method",rowspan:"rowSpan",scrolling:"scrolling",shape:"shape",span:"span",type:"type",valuetype:"valueType"};dojo.hasAttr=function(node,name){var attr=d.byId(node).getAttributeNode(_2c8(name));return attr?attr.specified:false;};var _2ce={};var _ctr=0;var _2d0=dojo._scopeName+"attrid";dojo.attr=function(node,name,_2d3){var args=arguments.length;if(args==2&&!d.isString(name)){for(var x in name){d.attr(node,x,name[x]);}return;}node=d.byId(node);name=_2c8(name);if(args==3){if(d.isFunction(_2d3)){var _2d6=d.attr(node,_2d0);if(!_2d6){_2d6=_ctr++;d.attr(node,_2d0,_2d6);}if(!_2ce[_2d6]){_2ce[_2d6]={};}var h=_2ce[_2d6][name];if(h){d.disconnect(h);}else{try{delete node[name];}catch(e){}}_2ce[_2d6][name]=d.connect(node,name,_2d3);}else{if(typeof _2d3=="boolean"){node[name]=_2d3;}else{node.setAttribute(name,_2d3);}}return;}else{var prop=_2ca[name.toLowerCase()];if(prop){return node[prop];}else{var _2d3=node[name];return (typeof _2d3=="boolean"||typeof _2d3=="function")?_2d3:(d.hasAttr(node,name)?node.getAttribute(name):null);}}};dojo.removeAttr=function(node,name){d.byId(node).removeAttribute(_2c8(name));};})();dojo.hasClass=function(node,_2dc){return ((" "+dojo.byId(node).className+" ").indexOf(" "+_2dc+" ")>=0);};dojo.addClass=function(node,_2de){node=dojo.byId(node);var cls=node.className;if((" "+cls+" ").indexOf(" "+_2de+" ")<0){node.className=cls+(cls?" ":"")+_2de;}};dojo.removeClass=function(node,_2e1){node=dojo.byId(node);var t=dojo.trim((" "+node.className+" ").replace(" "+_2e1+" "," "));if(node.className!=t){node.className=t;}};dojo.toggleClass=function(node,_2e4,_2e5){if(_2e5===undefined){_2e5=!dojo.hasClass(node,_2e4);}dojo[_2e5?"addClass":"removeClass"](node,_2e4);};}if(!dojo._hasResource["dojo._base.NodeList"]){dojo._hasResource["dojo._base.NodeList"]=true;dojo.provide("dojo._base.NodeList");(function(){var d=dojo;var tnl=function(arr){arr.constructor=dojo.NodeList;dojo._mixin(arr,dojo.NodeList.prototype);return arr;};var _2e9=function(func,_2eb){return function(){var _a=arguments;var aa=d._toArray(_a,0,[null]);var s=this.map(function(i){aa[0]=i;return d[func].apply(d,aa);});return (_2eb||((_a.length>1)||!d.isString(_a[0])))?this:s;};};dojo.NodeList=function(){return tnl(Array.apply(null,arguments));};dojo.NodeList._wrap=tnl;dojo.extend(dojo.NodeList,{slice:function(){var a=dojo._toArray(arguments);return tnl(a.slice.apply(this,a));},splice:function(){var a=dojo._toArray(arguments);return tnl(a.splice.apply(this,a));},concat:function(){var a=dojo._toArray(arguments,0,[this]);return tnl(a.concat.apply([],a));},indexOf:function(_2f3,_2f4){return d.indexOf(this,_2f3,_2f4);},lastIndexOf:function(){return d.lastIndexOf.apply(d,d._toArray(arguments,0,[this]));},every:function(_2f5,_2f6){return d.every(this,_2f5,_2f6);},some:function(_2f7,_2f8){return d.some(this,_2f7,_2f8);},map:function(func,obj){return d.map(this,func,obj,d.NodeList);},forEach:function(_2fb,_2fc){d.forEach(this,_2fb,_2fc);return this;},coords:function(){return d.map(this,d.coords);},attr:_2e9("attr"),style:_2e9("style"),addClass:_2e9("addClass",true),removeClass:_2e9("removeClass",true),toggleClass:_2e9("toggleClass",true),connect:_2e9("connect",true),place:function(_2fd,_2fe){var item=d.query(_2fd)[0];return this.forEach(function(i){d.place(i,item,(_2fe||"last"));});},orphan:function(_301){var _302=_301?d._filterQueryResult(this,_301):this;_302.forEach(function(item){if(item.parentNode){item.parentNode.removeChild(item);}});return _302;},adopt:function(_304,_305){var item=this[0];return d.query(_304).forEach(function(ai){d.place(ai,item,_305||"last");});},query:function(_308){if(!_308){return this;}var ret=d.NodeList();this.forEach(function(item){d.query(_308,item).forEach(function(_30b){if(_30b!==undefined){ret.push(_30b);}});});return ret;},filter:function(_30c){var _30d=this;var _a=arguments;var r=d.NodeList();var rp=function(t){if(t!==undefined){r.push(t);}};if(d.isString(_30c)){_30d=d._filterQueryResult(this,_a[0]);if(_a.length==1){return _30d;}_a.shift();}d.forEach(d.filter(_30d,_a[0],_a[1]),rp);return r;},addContent:function(_312,_313){var ta=d.doc.createElement("span");if(d.isString(_312)){ta.innerHTML=_312;}else{ta.appendChild(_312);}if(_313===undefined){_313="last";}var ct=(_313=="first"||_313=="after")?"lastChild":"firstChild";this.forEach(function(item){var tn=ta.cloneNode(true);while(tn[ct]){d.place(tn[ct],item,_313);}});return this;},empty:function(){return this.forEach("item.innerHTML='';");},instantiate:function(_318,_319){var c=d.isFunction(_318)?_318:d.getObject(_318);return this.forEach(function(i){new c(_319||{},i);});}});d.forEach(["blur","focus","click","keydown","keypress","keyup","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup"],function(evt){var _oe="on"+evt;dojo.NodeList.prototype[_oe]=function(a,b){return this.connect(_oe,a,b);};});})();}if(!dojo._hasResource["dojo._base.query"]){dojo._hasResource["dojo._base.query"]=true;dojo.provide("dojo._base.query");(function(){var d=dojo;var _321=dojo.isIE?"children":"childNodes";var _322=false;var _323=function(_324){if(">~+".indexOf(_324.charAt(_324.length-1))>=0){_324+=" *";}_324+=" ";var ts=function(s,e){return d.trim(_324.slice(s,e));};var _328=[];var _329=-1;var _32a=-1;var _32b=-1;var _32c=-1;var _32d=-1;var inId=-1;var _32f=-1;var lc="";var cc="";var _332;var x=0;var ql=_324.length;var _335=null;var _cp=null;var _337=function(){if(_32f>=0){var tv=(_32f==x)?null:ts(_32f,x).toLowerCase();_335[(">~+".indexOf(tv)<0)?"tag":"oper"]=tv;_32f=-1;}};var _339=function(){if(inId>=0){_335.id=ts(inId,x).replace(/\\/g,"");inId=-1;}};var _33a=function(){if(_32d>=0){_335.classes.push(ts(_32d+1,x).replace(/\\/g,""));_32d=-1;}};var _33b=function(){_339();_337();_33a();};for(;lc=cc,cc=_324.charAt(x),x=0){if(cc=="]"){if(!_cp.attr){_cp.attr=ts(_329+1,x);}else{_cp.matchFor=ts((_32b||_329+1),x);}var cmf=_cp.matchFor;if(cmf){if((cmf.charAt(0)=="\"")||(cmf.charAt(0)=="'")){_cp.matchFor=cmf.substring(1,cmf.length-1);}}_335.attrs.push(_cp);_cp=null;_329=_32b=-1;}else{if(cc=="="){var _33d=("|~^$*".indexOf(lc)>=0)?lc:"";_cp.type=_33d+cc;_cp.attr=ts(_329+1,x-_33d.length);_32b=x+1;}}}else{if(_32a>=0){if(cc==")"){if(_32c>=0){_cp.value=ts(_32a+1,x);}_32c=_32a=-1;}}else{if(cc=="#"){_33b();inId=x+1;}else{if(cc=="."){_33b();_32d=x;}else{if(cc==":"){_33b();_32c=x;}else{if(cc=="["){_33b();_329=x;_cp={};}else{if(cc=="("){if(_32c>=0){_cp={name:ts(_32c+1,x),value:null};_335.pseudos.push(_cp);}_32a=x;}else{if(cc==" "&&lc!=cc){_33b();if(_32c>=0){_335.pseudos.push({name:ts(_32c+1,x)});}_335.hasLoops=(_335.pseudos.length||_335.attrs.length||_335.classes.length);_335.query=ts(_332,x);_335.tag=(_335["oper"])?null:(_335.tag||"*");_328.push(_335);_335=null;}}}}}}}}}return _328;};var _33e={"*=":function(attr,_340){return "[contains(@"+attr+", '"+_340+"')]";},"^=":function(attr,_342){return "[starts-with(@"+attr+", '"+_342+"')]";},"$=":function(attr,_344){return "[substring(@"+attr+", string-length(@"+attr+")-"+(_344.length-1)+")='"+_344+"']";},"~=":function(attr,_346){return "[contains(concat(' ',@"+attr+",' '), ' "+_346+" ')]";},"|=":function(attr,_348){return "[contains(concat(' ',@"+attr+",' '), ' "+_348+"-')]";},"=":function(attr,_34a){return "[@"+attr+"='"+_34a+"']";}};var _34b=function(_34c,_34d,_34e,_34f){d.forEach(_34d.attrs,function(attr){var _351;if(attr.type&&_34c[attr.type]){_351=_34c[attr.type](attr.attr,attr.matchFor);}else{if(attr.attr.length){_351=_34e(attr.attr);}}if(_351){_34f(_351);}});};var _352=function(_353){var _354=".";var _355=_323(d.trim(_353));while(_355.length){var tqp=_355.shift();var _357;var _358="";if(tqp.oper==">"){_357="/";tqp=_355.shift();}else{if(tqp.oper=="~"){_357="/following-sibling::";tqp=_355.shift();}else{if(tqp.oper=="+"){_357="/following-sibling::";_358="[position()=1]";tqp=_355.shift();}else{_357="//";}}}_354+=_357+tqp.tag+_358;if(tqp.id){_354+="[@id='"+tqp.id+"'][1]";}d.forEach(tqp.classes,function(cn){var cnl=cn.length;var _35b=" ";if(cn.charAt(cnl-1)=="*"){_35b="";cn=cn.substr(0,cnl-1);}_354+="[contains(concat(' ',@class,' '), ' "+cn+_35b+"')]";});_34b(_33e,tqp,function(_35c){return "[@"+_35c+"]";},function(_35d){_354+=_35d;});}return _354;};var _35e={};var _35f=function(path){if(_35e[path]){return _35e[path];}var doc=d.doc;var _362=_352(path);var tf=function(_364){var ret=[];var _366;try{_366=doc.evaluate(_362,_364,null,XPathResult.ANY_TYPE,null);}catch(e){console.debug("failure in exprssion:",_362,"under:",_364);console.debug(e);}var _367=_366.iterateNext();while(_367){ret.push(_367);_367=_366.iterateNext();}return ret;};return _35e[path]=tf;};var _368={};var _369={};var _36a=function(_36b,_36c){if(!_36b){return _36c;}if(!_36c){return _36b;}return function(){return _36b.apply(window,arguments)&&_36c.apply(window,arguments);};};var _36d=function(root){var ret=[];var te,x=0,tret=root[_321];while(te=tret[x++]){if(te.nodeType==1){ret.push(te);}}return ret;};var _373=function(root,_375){var ret=[];var te=root;while(te=te.nextSibling){if(te.nodeType==1){ret.push(te);if(_375){break;}}}return ret;};var _378=function(_379,_37a,_37b,idx){var nidx=idx+1;var _37e=(_37a.length==nidx);var tqp=_37a[idx];if(tqp.oper){var ecn=(tqp.oper==">")?_36d(_379):_373(_379,(tqp.oper=="+"));if(!ecn||!ecn.length){return;}nidx++;_37e=(_37a.length==nidx);var tf=_382(_37a[idx+1]);for(var x=0,ecnl=ecn.length,te;x=0);};},"^=":function(attr,_3a7){return function(elem){return (_39f(elem,attr).indexOf(_3a7)==0);};},"$=":function(attr,_3aa){var tval=" "+_3aa;return function(elem){var ea=" "+_39f(elem,attr);return (ea.lastIndexOf(_3aa)==(ea.length-_3aa.length));};},"~=":function(attr,_3af){var tval=" "+_3af+" ";return function(elem){var ea=" "+_39f(elem,attr)+" ";return (ea.indexOf(tval)>=0);};},"|=":function(attr,_3b4){var _3b5=" "+_3b4+"-";return function(elem){var ea=" "+(elem.getAttribute(attr,2)||"");return ((ea==_3b4)||(ea.indexOf(_3b5)==0));};},"=":function(attr,_3b9){return function(elem){return (_39f(elem,attr)==_3b9);};}};var _3bb={"first-child":function(name,_3bd){return function(elem){if(elem.nodeType!=1){return false;}var fc=elem.previousSibling;while(fc&&(fc.nodeType!=1)){fc=fc.previousSibling;}return (!fc);};},"last-child":function(name,_3c1){return function(elem){if(elem.nodeType!=1){return false;}var nc=elem.nextSibling;while(nc&&(nc.nodeType!=1)){nc=nc.nextSibling;}return (!nc);};},"empty":function(name,_3c5){return function(elem){var cn=elem.childNodes;var cnl=elem.childNodes.length;for(var x=cnl-1;x>=0;x--){var nt=cn[x].nodeType;if((nt==1)||(nt==3)){return false;}}return true;};},"contains":function(name,_3cc){return function(elem){return (elem.innerHTML.indexOf(_3cc)>=0);};},"not":function(name,_3cf){var ntf=_382(_323(_3cf)[0]);return function(elem){return (!ntf(elem));};},"nth-child":function(name,_3d3){var pi=parseInt;if(_3d3=="odd"){return function(elem){return (((_394(elem))%2)==1);};}else{if((_3d3=="2n")||(_3d3=="even")){return function(elem){return ((_394(elem)%2)==0);};}else{if(_3d3.indexOf("0n+")==0){var _3d7=pi(_3d3.substr(3));return function(elem){return (elem.parentNode[_321][_3d7-1]===elem);};}else{if((_3d3.indexOf("n+")>0)&&(_3d3.length>3)){var _3d9=_3d3.split("n+",2);var pred=pi(_3d9[0]);var idx=pi(_3d9[1]);return function(elem){return ((_394(elem)%pred)==idx);};}else{if(_3d3.indexOf("n")==-1){var _3d7=pi(_3d3);return function(elem){return (_394(elem)==_3d7);};}}}}}}};var _3de=(d.isIE)?function(cond){var clc=cond.toLowerCase();return function(elem){return elem[cond]||elem[clc];};}:function(cond){return function(elem){return (elem&&elem.getAttribute&&elem.hasAttribute(cond));};};var _393=function(_3e4){var _3e5=(_369[_3e4.query]||_368[_3e4.query]);if(_3e5){return _3e5;}var ff=null;if(_3e4.id){if(_3e4.tag!="*"){ff=_36a(ff,function(elem){return (elem.tagName.toLowerCase()==_3e4.tag);});}}d.forEach(_3e4.classes,function(_3e8,idx,arr){var _3eb=_3e8.charAt(_3e8.length-1)=="*";if(_3eb){_3e8=_3e8.substr(0,_3e8.length-1);}var re=new RegExp("(?:^|\\s)"+_3e8+(_3eb?".*":"")+"(?:\\s|$)");ff=_36a(ff,function(elem){return re.test(elem.className);});ff.count=idx;});d.forEach(_3e4.pseudos,function(_3ee){if(_3bb[_3ee.name]){ff=_36a(ff,_3bb[_3ee.name](_3ee.name,_3ee.value));}});_34b(_3a2,_3e4,_3de,function(_3ef){ff=_36a(ff,_3ef);});if(!ff){ff=function(){return true;};}return _369[_3e4.query]=ff;};var _3f0={};var _387=function(_3f1,root){var fHit=_3f0[_3f1.query];if(fHit){return fHit;}if(_3f1.id&&!_3f1.hasLoops&&!_3f1.tag){return _3f0[_3f1.query]=function(root){return [d.byId(_3f1.id)];};}var _3f5=_393(_3f1);var _3f6;if(_3f1.tag&&_3f1.id&&!_3f1.hasLoops){_3f6=function(root){var te=d.byId(_3f1.id);if(_3f5(te)){return [te];}};}else{var tret;if(!_3f1.hasLoops){_3f6=function(root){var ret=[];var te,x=0,tret=root.getElementsByTagName(_3f1.tag);while(te=tret[x++]){ret.push(te);}return ret;};}else{_3f6=function(root){var ret=[];var te,x=0,tret=root.getElementsByTagName(_3f1.tag);while(te=tret[x++]){if(_3f5(te)){ret.push(te);}}return ret;};}}return _3f0[_3f1.query]=_3f6;};var _402={};var _403={"*":d.isIE?function(root){return root.all;}:function(root){return root.getElementsByTagName("*");},"~":_373,"+":function(root){return _373(root,true);},">":_36d};var _407=function(_408){var _409=_323(d.trim(_408));if(_409.length==1){var tt=_387(_409[0]);tt.nozip=true;return tt;}var sqf=function(root){var _40d=_409.slice(0);var _40e;if(_40d[0].oper==">"){_40e=[root];}else{_40e=_387(_40d.shift())(root);}return _388(_40e,_40d);};return sqf;};var _40f=((document["evaluate"]&&!d.isSafari)?function(_410){var _411=_410.split(" ");if((document["evaluate"])&&(_410.indexOf(":")==-1)&&(_410.indexOf("+")==-1)){if(((_411.length>2)&&(_410.indexOf(">")==-1))||(_411.length>3)||(_410.indexOf("[")>=0)||((1==_411.length)&&(0<=_410.indexOf(".")))){return _35f(_410);}}return _407(_410);}:_407);var _412=function(_413){var qcz=_413.charAt(0);if(d.doc["querySelectorAll"]&&((!d.isSafari)||(d.isSafari>3.1))&&(">+~".indexOf(qcz)==-1)){return function(root){var r=root.querySelectorAll(_413);r.nozip=true;return r;};}if(_403[_413]){return _403[_413];}if(0>_413.indexOf(",")){return _403[_413]=_40f(_413);}else{var _417=_413.split(/\s*,\s*/);var tf=function(root){var _41a=0;var ret=[];var tp;while(tp=_417[_41a++]){ret=ret.concat(_40f(tp,tp.indexOf(" "))(root));}return ret;};return _403[_413]=tf;}};var _41d=0;var _zip=function(arr){if(arr&&arr.nozip){return d.NodeList._wrap(arr);}var ret=new d.NodeList();if(!arr){return ret;}if(arr[0]){ret.push(arr[0]);}if(arr.length<2){return ret;}_41d++;arr[0]["_zipIdx"]=_41d;for(var x=1,te;te=arr[x];x++){if(arr[x]["_zipIdx"]!=_41d){ret.push(te);}te["_zipIdx"]=_41d;}return ret;};d.query=function(_423,root){if(_423.constructor==d.NodeList){return _423;}if(!d.isString(_423)){return new d.NodeList(_423);}if(d.isString(root)){root=d.byId(root);}return _zip(_412(_423)(root||d.doc));};d.query.pseudos=_3bb;d._filterQueryResult=function(_425,_426){var tnl=new d.NodeList();var ff=(_426)?_382(_323(_426)[0]):function(){return true;};for(var x=0,te;te=_425[x];x++){if(ff(te)){tnl.push(te);}}return tnl;};})();}if(!dojo._hasResource["dojo._base.xhr"]){dojo._hasResource["dojo._base.xhr"]=true;dojo.provide("dojo._base.xhr");(function(){var _d=dojo;function setValue(obj,name,_42e){var val=obj[name];if(_d.isString(val)){obj[name]=[val,_42e];}else{if(_d.isArray(val)){val.push(_42e);}else{obj[name]=_42e;}}};dojo.formToObject=function(_430){var ret={};var iq="input:not([type=file]):not([type=submit]):not([type=image]):not([type=reset]):not([type=button]), select, textarea";_d.query(iq,_430).filter(function(node){return !node.disabled&&node.name;}).forEach(function(item){var _in=item.name;var type=(item.type||"").toLowerCase();if(type=="radio"||type=="checkbox"){if(item.checked){setValue(ret,_in,item.value);}}else{if(item.multiple){ret[_in]=[];_d.query("option",item).forEach(function(opt){if(opt.selected){setValue(ret,_in,opt.value);}});}else{setValue(ret,_in,item.value);if(type=="image"){ret[_in+".x"]=ret[_in+".y"]=ret[_in].x=ret[_in].y=0;}}}});return ret;};dojo.objectToQuery=function(map){var enc=encodeURIComponent;var _43a=[];var _43b={};for(var name in map){var _43d=map[name];if(_43d!=_43b[name]){var _43e=enc(name)+"=";if(_d.isArray(_43d)){for(var i=0;i<_43d.length;i++){_43a.push(_43e+enc(_43d[i]));}}else{_43a.push(_43e+enc(_43d));}}}return _43a.join("&");};dojo.formToQuery=function(_440){return _d.objectToQuery(_d.formToObject(_440));};dojo.formToJson=function(_441,_442){return _d.toJson(_d.formToObject(_441),_442);};dojo.queryToObject=function(str){var ret={};var qp=str.split("&");var dec=decodeURIComponent;_d.forEach(qp,function(item){if(item.length){var _448=item.split("=");var name=dec(_448.shift());var val=dec(_448.join("="));if(_d.isString(ret[name])){ret[name]=[ret[name]];}if(_d.isArray(ret[name])){ret[name].push(val);}else{ret[name]=val;}}});return ret;};dojo._blockAsync=false;dojo._contentHandlers={"text":function(xhr){return xhr.responseText;},"json":function(xhr){if(!dojo.config.usePlainJson){console.warn("Consider using mimetype:text/json-comment-filtered"+" to avoid potential security issues with JSON endpoints"+" (use djConfig.usePlainJson=true to turn off this message)");}return (xhr.status==204)?undefined:_d.fromJson(xhr.responseText);},"json-comment-filtered":function(xhr){var _44e=xhr.responseText;var _44f=_44e.indexOf("/*");var _450=_44e.lastIndexOf("*/");if(_44f==-1||_450==-1){throw new Error("JSON was not comment filtered");}return (xhr.status==204)?undefined:_d.fromJson(_44e.substring(_44f+2,_450));},"javascript":function(xhr){return _d.eval(xhr.responseText);},"xml":function(xhr){var _453=xhr.responseXML;if(_d.isIE&&(!_453||window.location.protocol=="file:")){_d.forEach(["MSXML2","Microsoft","MSXML","MSXML3"],function(_454){try{var dom=new ActiveXObject(_454+".XMLDOM");dom.async=false;dom.loadXML(xhr.responseText);_453=dom;}catch(e){}});}return _453;}};dojo._contentHandlers["json-comment-optional"]=function(xhr){var _457=_d._contentHandlers;try{return _457["json-comment-filtered"](xhr);}catch(e){return _457["json"](xhr);}};dojo._ioSetArgs=function(args,_459,_45a,_45b){var _45c={args:args,url:args.url};var _45d=null;if(args.form){var form=_d.byId(args.form);var _45f=form.getAttributeNode("action");_45c.url=_45c.url||(_45f?_45f.value:null);_45d=_d.formToObject(form);}var _460=[{}];if(_45d){_460.push(_45d);}if(args.content){_460.push(args.content);}if(args.preventCache){_460.push({"dojo.preventCache":new Date().valueOf()});}_45c.query=_d.objectToQuery(_d.mixin.apply(null,_460));_45c.handleAs=args.handleAs||"text";var d=new _d.Deferred(_459);d.addCallbacks(_45a,function(_462){return _45b(_462,d);});var ld=args.load;if(ld&&_d.isFunction(ld)){d.addCallback(function(_464){return ld.call(args,_464,_45c);});}var err=args.error;if(err&&_d.isFunction(err)){d.addErrback(function(_466){return err.call(args,_466,_45c);});}var _467=args.handle;if(_467&&_d.isFunction(_467)){d.addBoth(function(_468){return _467.call(args,_468,_45c);});}d.ioArgs=_45c;return d;};var _469=function(dfd){dfd.canceled=true;var xhr=dfd.ioArgs.xhr;var _at=typeof xhr.abort;if(_at=="function"||_at=="unknown"){xhr.abort();}var err=new Error("xhr cancelled");err.dojoType="cancel";return err;};var _46e=function(dfd){return _d._contentHandlers[dfd.ioArgs.handleAs](dfd.ioArgs.xhr);};var _470=function(_471,dfd){console.debug(_471);return _471;};var _473=function(args){var dfd=_d._ioSetArgs(args,_469,_46e,_470);dfd.ioArgs.xhr=_d._xhrObj(dfd.ioArgs.args);return dfd;};var _476=null;var _477=[];var _478=function(){var now=(new Date()).getTime();if(!_d._blockAsync){for(var i=0,tif;i<_477.length&&(tif=_477[i]);i++){var dfd=tif.dfd;try{if(!dfd||dfd.canceled||!tif.validCheck(dfd)){_477.splice(i--,1);}else{if(tif.ioCheck(dfd)){_477.splice(i--,1);tif.resHandle(dfd);}else{if(dfd.startTime){if(dfd.startTime+(dfd.ioArgs.args.timeout||0)0){setTimeout(_p,de);return _t;}_p();return _t;},_play:function(_4ad){var _t=this;_t._startTime=new Date().valueOf();if(_t._paused){_t._startTime-=_t.duration*_t._percent;}_t._endTime=_t._startTime+_t.duration;_t._active=true;_t._paused=false;var _4af=_t.curve.getValue(_t._percent);if(!_t._percent){if(!_t._startRepeatCount){_t._startRepeatCount=_t.repeat;}_t._fire("onBegin",[_4af]);}_t._fire("onPlay",[_4af]);_t._cycle();return _t;},pause:function(){this._stopTimer();if(!this._active){return this;}this._paused=true;this._fire("onPause",[this.curve.getValue(this._percent)]);return this;},gotoPercent:function(_4b0,_4b1){this._stopTimer();this._active=this._paused=true;this._percent=_4b0;if(_4b1){this.play();}return this;},stop:function(_4b2){if(!this._timer){return this;}this._stopTimer();if(_4b2){this._percent=1;}this._fire("onStop",[this.curve.getValue(this._percent)]);this._active=this._paused=false;return this;},status:function(){if(this._active){return this._paused?"paused":"playing";}return "stopped";},_cycle:function(){var _t=this;if(_t._active){var curr=new Date().valueOf();var step=(curr-_t._startTime)/(_t._endTime-_t._startTime);if(step>=1){step=1;}_t._percent=step;if(_t.easing){step=_t.easing(step);}_t._fire("onAnimate",[_t.curve.getValue(step)]);if(_t._percent<1){_t._startTimer();}else{_t._active=false;if(_t.repeat>0){_t.repeat--;_t.play(null,true);}else{if(_t.repeat==-1){_t.play(null,true);}else{if(_t._startRepeatCount){_t.repeat=_t._startRepeatCount;_t._startRepeatCount=0;}}}_t._percent=0;_t._fire("onEnd");_t._stopTimer();}}return _t;}});var ctr=0;var _4b7=[];var _4b8={run:function(){}};var _4b9=null;dojo._Animation.prototype._startTimer=function(){if(!this._timer){this._timer=d.connect(_4b8,"run",this,"_cycle");ctr++;}if(!_4b9){_4b9=setInterval(d.hitch(_4b8,"run"),this.rate);}};dojo._Animation.prototype._stopTimer=function(){if(this._timer){d.disconnect(this._timer);this._timer=null;ctr--;}if(ctr<=0){clearInterval(_4b9);_4b9=null;ctr=0;}};var _4ba=(d.isIE)?function(node){var ns=node.style;if(!ns.zoom.length&&d.style(node,"zoom")=="normal"){ns.zoom="1";}if(!ns.width.length&&d.style(node,"width")=="auto"){ns.width="auto";}}:function(){};dojo._fade=function(args){args.node=d.byId(args.node);var _4be=d.mixin({properties:{}},args);var _4bf=(_4be.properties.opacity={});_4bf.start=!("start" in _4be)?function(){return Number(d.style(_4be.node,"opacity"));}:_4be.start;_4bf.end=_4be.end;var anim=d.animateProperty(_4be);d.connect(anim,"beforeBegin",d.partial(_4ba,_4be.node));return anim;};dojo.fadeIn=function(args){return d._fade(d.mixin({end:1},args));};dojo.fadeOut=function(args){return d._fade(d.mixin({end:0},args));};dojo._defaultEasing=function(n){return 0.5+((Math.sin((n+1.5)*Math.PI))/2);};var _4c4=function(_4c5){this._properties=_4c5;for(var p in _4c5){var prop=_4c5[p];if(prop.start instanceof d.Color){prop.tempColor=new d.Color();}}this.getValue=function(r){var ret={};for(var p in this._properties){var prop=this._properties[p];var _4cc=prop.start;if(_4cc instanceof d.Color){ret[p]=d.blendColors(_4cc,prop.end,r,prop.tempColor).toCss();}else{if(!d.isArray(_4cc)){ret[p]=((prop.end-_4cc)*r)+_4cc+(p!="opacity"?prop.units||"px":"");}}}return ret;};};dojo.animateProperty=function(args){args.node=d.byId(args.node);if(!args.easing){args.easing=d._defaultEasing;}var anim=new d._Animation(args);d.connect(anim,"beforeBegin",anim,function(){var pm={};for(var p in this.properties){if(p=="width"||p=="height"){this.node.display="block";}var prop=this.properties[p];prop=pm[p]=d.mixin({},(d.isObject(prop)?prop:{end:prop}));if(d.isFunction(prop.start)){prop.start=prop.start();}if(d.isFunction(prop.end)){prop.end=prop.end();}var _4d2=(p.toLowerCase().indexOf("color")>=0);function getStyle(node,p){var v=({height:node.offsetHeight,width:node.offsetWidth})[p];if(v!==undefined){return v;}v=d.style(node,p);return (p=="opacity")?Number(v):(_4d2?v:parseFloat(v));};if(!("end" in prop)){prop.end=getStyle(this.node,p);}else{if(!("start" in prop)){prop.start=getStyle(this.node,p);}}if(_4d2){prop.start=new d.Color(prop.start);prop.end=new d.Color(prop.end);}else{prop.start=(p=="opacity")?Number(prop.start):parseFloat(prop.start);}}this.curve=new _4c4(pm);});d.connect(anim,"onAnimate",anim,function(_4d6){for(var s in _4d6){d.style(this.node,s,_4d6[s]);}});return anim;};dojo.anim=function(node,_4d9,_4da,_4db,_4dc,_4dd){return d.animateProperty({node:node,duration:_4da||d._Animation.prototype.duration,properties:_4d9,easing:_4db,onEnd:_4dc}).play(_4dd||0);};})();}if(!dojo._hasResource["dojo._base.browser"]){dojo._hasResource["dojo._base.browser"]=true;dojo.provide("dojo._base.browser");if(dojo.config.require){dojo.forEach(dojo.config.require,"dojo['require'](item);");}}if(dojo.config.afterOnLoad&&dojo.isBrowser){window.setTimeout(dojo._fakeLoadInit,1000);}})(); diff --git a/components/com_morfeoshow/src/js/gmapez-2.js b/components/com_morfeoshow/src/js/gmapez-2.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/js/gmapez-2.js @@ -0,0 +1,1025 @@ +/* + * GMapEZ -- Turn specially-marked HTML into Google Maps + * Copyright (C) July 2005 - Oct 2006 by Chris Houser + * + * This code is licensed under the GNU General Public License (GPL) + * + * If you use this code on a web page, please include on that page a + * link to http://n01se.net/chouser/gmapez/ -- this is a request, not + * a requirement. Thanks. + */ + +(function(){ + var startdate = new Date(); + + // configuration -- if you're using your own copy of gmapez.js, you + // may want to modify these: + var overlaysPerStep = 25; + var imgBase = 'http://n01se.net/chouser/gmapez/'; + var shadowServer = 'http://n01se.net/shadow.cgi?src='; + + if( window.ez_preload ) { + // we're already loaded + return; + } + + var _lastId = 0; + function newId() { + return 'ez_' + (++_lastId); + } + + function loadfunc() { + if( ! GBrowserIsCompatible() ) { + if( document.getElementsByTagName ) { + // Find all divs marked as GMapEZ + var divs = document.getElementsByTagName( 'div' ); + for( var i = 0; i < divs.length; ++i ) { + var div = divs[ i ]; + if( div.className.indexOf( 'GMapEZ' ) > -1 ) { + div.innerHTML = [ + "

', + '
' + ].join('\n'); + div.style.visibility = 'visible'; + div.style.padding = '0.3em'; + div.style.background = '#eee'; + div.style.overflow = 'auto'; + } + } + } + else { + alert( [ + 'Your browser is not capable of displaying', + 'Google Maps on this page. Try using Firefox:', + 'http://getfirefox.com/' ].join('\n') ); + } + return; + } + + addOnUnload( GUnload ); + + function getTotalOffset( elem ) { + point = new GPoint( 0, 0 ); + while( elem ) { + point.x += elem.offsetLeft; + point.y += elem.offsetTop; + //alert( elem.offsetTop + ' = ' + point.y ); + elem = elem.offsetParent; + } + return point; + } + + function GSmallMapTypeControl() { + GMapTypeControl.call( this, true ); + } + GSmallMapTypeControl.prototype = new GMapTypeControl(); + GSmallMapTypeControl.prototype.constructor = GSmallMapTypeControl; + window.GSmallMapTypeControl = GSmallMapTypeControl; + + var CtrlTable = { + 'GOverviewMapControl': true, + 'GLargeMapControl': true, + 'GSmallMapControl': true, + 'GSmallZoomControl': true, + 'GSmallMapTypeControl': true, + 'GMapTypeControl': true, + 'GScaleControl': true + }; + + var MapTypeTable = { + 'G_MAP_TYPE' : true, + 'G_SATELLITE_TYPE' : true, + 'G_HYBRID_TYPE' : true + }; + + var idmarkers = {}; + function markerForUrl( url ) { + var matcha = /#(.*)/.exec( url ); + if( matcha ) + return idmarkers[ matcha[ 1 ] ]; + else + return null; + } + + // For this event handler, "this" is the clicked anchor + function anchorClick() { + var marker = markerForUrl( this.href ); + if( marker ) { + if( /\bZOOM\b/.exec( this.className ) ) { + var mapType = marker.mapType || marker.ezmap.map.getCurrentMapType(); + var zoomLevel; + if( marker.span ) { + zoomLevel = mapType.getSpanZoomLevel( + marker.point, marker.span, marker.ezmap.viewsize ); + } + else { + zoomLevel = marker.ezmap.map.getZoom(); + } + marker.ezmap.map.setCenter( marker.point, zoomLevel, mapType ); + } + marker.doOpen(); + return false; + } + else { + return true; + } + } + + function wordMap( str ) { + var wmap = {}; + var list = str.split(' '); + for( var j = 0; j < list.length; ++j ) { + wmap[ list[ j ] ] = true; + } + return wmap; + } + + function parseParams( str, params ) { + var matchparam; + for( var word in wordMap( str ) ) { + matchparam = /^(\w+):(.*)$/.exec( word ); + if( matchparam && matchparam[1] in params ) { + params[ matchparam[1] ] = matchparam[2]; + } + } + return params; + } + + var markerOpener = { + markers: [], + addMarker: function( marker ) { + this.markers.push( marker ); + }, + chainOpen: function( i ) { + /* + * This is a work-around for a Google Maps bug. If I try to open + * all the info windows at once, only the last one succeeds. + * + * Otherwise, it is equivalent to: + * for( i = 0; i < this.markers.length; ++i ) + * this.markers[ i ].doOpen(); + */ + i = i || 0; + if( i < this.markers.length ) { + var onOpen = GEvent.bind( + this.markers[ i ].ezmap.map, + "infowindowopen", + this, + function(){ + GEvent.removeListener( onOpen ); + this.chainOpen( i + 1 ); + }); + this.markers[ i ].doOpen( true ); + } + else { + //alert('GMapEZ loadtime: ' + ( new Date() - startdate ) ); + } + } + }; + + var laterFuncs = []; + var lastFunc = null; + function doNow() { + if( laterFuncs.length > 0 ) { + laterFuncs.shift().call(); + setTimeout( doNow, 1 ); + } + else { + if( lastFunc ) { + lastFunc.call(); + } + } + } + function doLater( obj, func ) { + laterFuncs.push( function() { func.call( obj ); } ); + } + + var MiniIcon = new GIcon(); + MiniIcon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png"; + MiniIcon.iconSize = new GSize(12, 20); + MiniIcon.shadowSize = new GSize(22, 20); + MiniIcon.iconAnchor = new GPoint(6, 20); + MiniIcon.infoWindowAnchor = new GPoint(5, 1); + + function EZInfoMarker( ezmap ) { + this.ezmap = ezmap; + this.icon = G_DEFAULT_ICON; + + this.point = null; + this.title = null; + + this.blowup = false; + this.tabs = []; + + this.infoZoomOffset = undefined; + this.infoZoomLevel = undefined; + this.infoMapType = null; + } + EZInfoMarker.prototype = new GMarker( new GLatLng( 0, 0 ) ); + EZInfoMarker.prototype.constructor = EZInfoMarker; + + EZInfoMarker.prototype.initialize = function( map ) { + GMarker.call( + this, + this.point, + { + icon: this.icon, + clickable: ( this.tabs.length > 0 || this.blowup ), + title: this.title + }); + GMarker.prototype.initialize.call( this, map ); + }; + + EZInfoMarker.prototype.doOpen = function( autoopen ) { + if( ! autoopen ) { + var body = document.body || document.getElementsByTagName('body')[0]; + if( 'scrollLeft' in body ) { + // http://www.howtocreate.co.uk/tutorials/javascript/browserwindow + var myWidth = 0, myHeight = 0; + if( typeof( window.innerWidth ) == 'number' ) { + //Non-IE + myWidth = window.innerWidth; + myHeight = window.innerHeight; + } else if( document.documentElement && + ( document.documentElement.clientWidth || + document.documentElement.clientHeight ) ) + { + //IE 6+ in 'standards compliant mode' + myWidth = document.documentElement.clientWidth; + myHeight = document.documentElement.clientHeight; + } else if( document.body && + ( document.body.clientWidth || document.body.clientHeight ) ) + { + //IE 4 compatible + myWidth = document.body.clientWidth; + myHeight = document.body.clientHeight; + } + + var mapdiv = this.ezmap.div; + var totalOffset = getTotalOffset( mapdiv ); + if( totalOffset.x < body.scrollLeft || + totalOffset.x + mapdiv.offsetWidth > body.scrollLeft+myWidth || + totalOffset.y < body.scrollTop || + totalOffset.y + mapdiv.offsetHeight > body.scrollTop+myHeight) + { + //alert( totalOffset.x + ', ' + totalOffset.y ); + scrollTo( totalOffset.x, totalOffset.y ); + } + } + } + + var zoom = null; + if( this.tabs.length > 0 ) { + var opts = { maxWidth: this.ezmap.div.offsetWidth - 100 }; + if( this.icon ) { + this.openInfoWindowTabs( this.tabs, opts ); + } + else { + // "INVISIBLE" markers are never added as overlays -- GMap2 + // knows nothing about them. + this.ezmap.map.openInfoWindowTabs( this.point, this.tabs, opts ); + } + for( var i = 0; i < this.tabs.length; ++i ) { + this.setupInfoForm( this.tabs[ i ] ); + } + } + else if( this.blowup ) { + if( this.infoZoomOffset != undefined ) + zoom = this.ezmap.map.getZoom() + this.infoZoomOffset; + else if( this.infoZoomLevel != undefined ) + zoom = this.infoZoomLevel; + + if( zoom >= this.ezmap.map.getCurrentMapType().numZoomLevels ) + zoom = this.ezmap.map.getCurrentMapType().numZoomLevels - 1; + else if( zoom < 0 ) + zoom = 0; + + this.showMapBlowup( { zoomLevel: zoom, mapType: this.infoMapType } ); + } + else { + this.ezmap.map.closeInfoWindow(); + } + }; + + EZInfoMarker.prototype.setupInfoForm = function( tab ) { + var div, a; + var tabElem = tab.contentElem; + var classes = tabElem.className ? wordMap( tabElem.className ) : {}; + if( classes.DirectionsToHere || + classes.DirectionsFromHere || + classes.SearchNearby ) + { + if( tab.infoFormId ) { + div = document.getElementById( tab.infoFormId ); + div.innerHTML = ''; + } + else { + div = document.createElement('div'); + div.className = 'ez_infoForm'; + tab.infoFormId = div.id = newId(); + tabElem.appendChild( div ); + } + var _this = this; + if( classes.DirectionsToHere || classes.DirectionsFromHere ) { + div.appendChild( document.createTextNode( 'Get directions: ' ) ); + if( classes.DirectionsToHere ) { + a = document.createElement('a'); + a.innerHTML = 'To here'; + a.onclick = function() { _this.showForm( tab ); }; + a.href = 'javascript:void(null)'; + div.appendChild( a ); + } + if( classes.DirectionsToHere && classes.DirectionsFromHere ) { + div.appendChild( document.createTextNode( ' - ' ) ); + } + if( classes.DirectionsFromHere ) { + a = document.createElement('a'); + a.innerHTML = 'From here'; + a.onclick = function() {}; + a.href = 'javascript:void(null)'; + div.appendChild( a ); + } + div.appendChild( document.createElement('br') ); + } + if( classes.SearchNearby ) { + a = document.createElement('a'); + a.innerHTML = 'Search nearby'; + a.onclick = function() {}; + a.href = 'javascript:void(null)'; + div.appendChild( a ); + } + } + }; + + EZInfoMarker.prototype.showForm = function( tab ) { + var div = document.getElementById( tab.infoFormId ); + div.innerHTML = 'Get directions: To here - '; + var a = document.createElement('a'); + a.innerHTML = 'From here'; + a.onclick = function() {}; + a.href = 'javascript:void(null)'; + div.appendChild( a ); + var x = document.createElement('div'); + x.innerHTML = 'Start address'; + div.appendChild( x ); + this.ezmap.map.getInfoWindow().reset(); + }; + + function EZPolyline( color, weight, opacity ) { + this.points = []; + this.initialize = function( map ) { + GPolyline.call( this, this.points, color, weight, opacity ); + GPolyline.prototype.initialize.call( this, map ); + }; + }; + EZPolyline.prototype = new GPolyline(); + EZPolyline.prototype.constructor = EZPolyline; + + + function EZMap( div, classes ) { + this.div = div; + this.classes = classes; + this.divData = null; + + this.map = undefined; + this.viewsize = null; + this.extentMarker = null; + + this.overlayList = []; + + this.loading = null; + this.bar = null; + this.maxstep = 0; + this.step = 0; + this.oi = 0; + this.initFrame(); + } + + EZMap.prototype.logWarning = function( str ) { + if( ! this.warningNode ) { + this.warningVis = false; + this.warningNode = document.createElement('ul'); + this.warningNode.className = 'warnings'; + this.div.appendChild( this.warningNode ); + + var warnBtn = document.createElement('button'); + warnBtn.className = 'warnings'; + warnBtn.innerHTML = 'Warnings...'; + this.div.appendChild( warnBtn ); + var ezmap = this; + warnBtn.onclick = function() { ezmap.toggleWarnings(); }; + } + var li = document.createElement('li'); + li.innerHTML = str; + this.warningNode.appendChild( li ); + }; + + EZMap.prototype.toggleWarnings = function() { + this.warningVis = ! this.warningVis; + this.warningNode.style.display = this.warningVis ? 'block' : 'none'; + }; + + EZMap.prototype.processMarkers = function( parentNode, polyline ) { + var lastOverlay, marker, textContent, imgs; + var matchll, matchspn, matchtype; + for( var node = parentNode.firstChild; node; node = node.nextSibling){ + lastOverlay = this.overlayList[ this.overlayList.length - 1 ]; + switch( node.nodeName ) { + case 'A': + matchll = /\Wll=([-.\d]*),([-.\d]*)/.exec( node.href ); + if( matchll ) { + + marker = new EZInfoMarker( this ); + marker.title = node.getAttribute('title'); + this.overlayList.push( marker ); + + if( node.id || node.name ) + idmarkers[ node.id || node.name ] = marker; + + textContent = node.innerHTML.replace( /<[^>]*>/g, '' ); + + if( /\bOPEN\b/.exec( textContent ) ) + markerOpener.addMarker( marker ); + + if( /\bEXTENT\b/.exec( textContent ) ) { + marker.icon = null; + this.extentMarker = marker; + } + + if( /\bINVISIBLE\b/.exec( textContent ) ) { + marker.icon = null; + } + + marker.point = new GLatLng( + parseFloat( matchll[1] ), + parseFloat( matchll[2] ) ); + + if( polyline ) { + marker.icon = null; + polyline.points.push( marker.point ); + } + + matchspn = /\Wspn=([-.\d]*),([-.\d]*)/.exec( node.href ); + if( matchspn ) { + marker.span = new GLatLng( + parseFloat( matchspn[1] ), + parseFloat( matchspn[2] ) ); + } + + matchtype = /\Wt=(.)/.exec( node.href ); + if( matchtype ) { + switch( matchtype[1] ) { + case 'k': marker.mapType = G_SATELLITE_TYPE; break; + case 'h': marker.mapType = G_HYBRID_TYPE; break; + // XXX need a G_MAP_TYPE letter for use by ZOOM links + } + } + + // build icon + imgs = node.getElementsByTagName('img') + if( imgs.length < 1 ) { + var matchcolor = + /\b(ORANGE|PURPLE|YELLOW|GREEN|BLUE|RED|AQUA|WHITE|GRAY)\b/ + .exec( textContent ); + var matchsym = + /\b([0-9A-Za-z]|BLANK|HASH|DOLLAR|DOT|START|END)\b/ + .exec( textContent ); + var matchmini = /\bMINI\b/.exec( textContent ); + + if( matchcolor || matchsym || matchmini ) { + marker.icon = new GIcon( matchmini ? MiniIcon : G_DEFAULT_ICON ); + marker.icon.image = [ + imgBase, + 'iconEZ2/', + matchmini ? 'mini' : 'marker', + '-', + matchcolor ? matchcolor[0] : 'ORANGE', + '-', + matchmini ? 'BLANK' : ( matchsym ? matchsym[0] : 'DOT' ), + '.png' ].join(''); + + marker.icon.printImage = marker.icon.image; + marker.icon.mozPrintImage = marker.icon.image; + } + } + else { + marker.icon = new GIcon( G_DEFAULT_ICON, imgs[ 0 ].src ); + marker.icon.printImage = imgs[ 0 ].src; + marker.icon.mozPrintImage = imgs[ 0 ].src; + marker.icon.transparent = null; + marker.icon.iconAnchor = null; + marker.icon.infoWindowAnchor = null; + + var params = parseParams( imgs[ 0 ].className, { + width: null, height: null, + iconAnchor: null, infoWindowAnchor: null, imageMap: null } ); + + var match; + var width = parseInt( params.width ); + var height = parseInt( params.height ); + marker.icon.iconSize = new GSize( width, height ); + + if( params.iconAnchor ) { + match = /(\d+),(\d+)/.exec( params.iconAnchor ); + if( match ) { + marker.icon.iconAnchor = new GPoint( + parseInt( match[1] ), + parseInt( match[2] ) ); + } + } + if( marker.icon.iconAnchor === null ) { + marker.icon.iconAnchor = new GPoint( + Math.round( width / 2 ), + Math.max( 1, height - 2 ) ); + } + + if( params.infoWindowAnchor ) { + match = /(\d+),(\d+)/.exec( params.infoWindowAnchor ); + if( match ) { + marker.icon.infoWindowAnchor = new GPoint( + parseInt( match[1] ), + parseInt( match[2] ) ); + } + } + if( marker.icon.infoWindowAnchor === null ) { + marker.icon.infoWindowAnchor = new GPoint( + Math.round( width / 2 ), + 0 ); + } + + if( params.imageMap ) { + marker.icon.imageMap = []; + var parts = params.imageMap.split(/\s*,\s*/); + for( var i = 0; i < parts.length; ++i ) { + marker.icon.imageMap.push( parseInt( parts[ i ] ) ); + } + //alert( marker.icon.imageMap ); + } + + if( imgs.length > 1 ) { + marker.icon.shadow = imgs[ 1 ].src; + params = parseParams( imgs[ 1 ].className, { width:0, height:0 }); + marker.icon.shadowSize = new GSize( params.width, params.height); + } + else { + marker.icon.shadow = shadowServer + imgs[ 0 ].src; + marker.icon.shadowSize = new GSize( + Math.floor( width + height * 0.55 ), height ); + } + + if( imgs.length > 2 ) { + marker.icon.transparent = imgs[ 2 ].src; + } + if( imgs.length > 3 ) { + marker.icon.printImage = imgs[ 3 ].src; + } + if( imgs.length > 4 ) { + marker.icon.printShadow = imgs[ 4 ].src; + } + if( imgs.length > 5 ) { + marker.icon.mozPrintShadow = imgs[ 5 ].src; + } + } + } + else { + this.logWarning( "No ll param for marker [" + node.innerHTML + + ":" + (node.id || node.name) + "]" ); + } + break; + + case 'DIV': + if( ! lastOverlay ) { + this.logWarning( "div block given before any markers" ); + continue; + } + else { + var infoClasses = wordMap( node.className ); + if( 'GMapEZ' in infoClasses ) { + // infoWindow blowup + // XXX replace this with a nested map to allow for use + // in tabs? + lastOverlay.blowup = true; + var matchzoom = /ZOOMLEVEL([-+=]?)(\d+)/.exec( node.innerHTML ); + if( matchzoom ) { + var num = parseInt( matchzoom[ 2 ] ); + if( matchzoom[ 1 ] == '-' ) + lastOverlay.infoZoomOffset = num; + else if( matchzoom[ 1 ] == '+' ) + lastOverlay.infoZoomOffset = - num; + else + lastOverlay.infoZoomLevel = num; + } + + for( typeName in MapTypeTable ) { + if( typeName in infoClasses ) { + lastOverlay.infoMapType = window[ typeName ]; + break; + } + } + } + else { + // XXX remove title attribute from div node? + lastOverlay.tabs.push( + new GInfoWindowTab( node.getAttribute('title'), node )); + } + } + break; + + case 'LI': + this.processMarkers( node, polyline ); + break; + + case 'OL': + var params = parseParams( node.className, + { color: null, weight: null, opacity: null } ); + if( params.color && ! /^#[0-9a-zA-Z]{6}$/.exec( params.color ) ) + this.logWarning( 'Polyline color should be a 6-digit' + + ' hex color like "#123abc", not "' + params.color + '"' ); + if( params.weight != null ) { + var w = parseInt( params.weight ); + if( w < 1 || isNaN( w ) ) + this.logWarning( 'Polyline weight should be an' + + ' interger above 0, not "' + params.weight + '"' ); + params.weight = w; + } + if( params.opacity ) { + var o = parseFloat( params.opacity ); + if( o < 0 || o > 1 || isNaN( o ) ) + this.logWarning( 'Polyline opacity should be ' + + ' between 0 and 1, not "' + params.opacity + '"' ); + params.opacity = o; + } + var newline = new EZPolyline( + params.color, + params.weight, + params.opacity ); + this.overlayList.push( newline ); + this.processMarkers( node, newline ); + break; + + case '#text': + case '#comment': + // ignore text and comments + break; + + default: + this.logWarning( "Unknown or misplaced node " + node.nodeName ); + break; + } + } + }; + + EZMap.prototype.onClick = function( overlay, point ) { + if( overlay && overlay.doOpen ) { + overlay.doOpen(); + } + else if( point ) { + this.map.closeInfoWindow(); + } + }; + + EZMap.prototype.nextStep = function( func ) { + if( this.maxstep > 0 ) { + this.bar.style.width = Math.round( this.step / this.maxstep * 100 ) + '%'; + } + this.step += 1; + doLater( this, func ); + }; + + EZMap.prototype.initFrame = function() { + this.divData = this.div; + this.div = this.div.cloneNode( false ); + this.divData.parentNode.insertBefore( this.div, this.divData ); + this.divData.parentNode.removeChild( this.divData ); + this.div.style.visibility = 'visible'; + + this.loading = document.createElement('div'); + this.loading.className = 'loadprogress'; + this.loading.style.marginTop = ( this.div.offsetHeight / 3 ) + 'px'; + this.loading.innerHTML = '
'; + this.bar = this.loading.getElementsByTagName('div')[3]; + this.div.appendChild( this.loading ); + + this.nextStep( this.initParse ); + }; + + var mouselat, mouselng; + function onmousemove( point ) { + mouselat = point.y.toFixed(6); + mouselng = point.x.toFixed(6); + } + + EZMap.prototype.onScroll = function( scrollEvent ) { + var zoom = 0; + if( scrollEvent.cancelable ) { + scrollEvent.preventDefault(); + } + if( scrollEvent.detail ) { + zoom = scrollEvent.detail; + } + else if( scrollEvent.wheelDelta ) { + zoom = -scrollEvent.wheelDelta; + } + if( zoom ) { + var m = this.map.fromLatLngToDivPixel( new GLatLng(mouselat,mouselng) ); + var c = this.map.fromLatLngToDivPixel( this.map.getCenter() ); + if( zoom < 0 ) { + var x = c.x - ((m.x - c.x) * -.5); + var y = c.y - ((m.y - c.y) * -.5); + var n = this.map.fromDivPixelToLatLng(new GPoint(x,y)); + this.map.setCenter(n); + this.map.zoomIn(); + } + if( zoom > 0 ) { + var x = c.x - (m.x - c.x); + var y = c.y - (m.y - c.y); + var n = this.map.fromDivPixelToLatLng(new GPoint(x,y)); + this.map.setCenter(n); + this.map.zoomOut(); + } + } + }; + + EZMap.prototype.initParse = function() { + this.processMarkers( this.divData ); + this.divData = null; + + this.map = new GMap2( this.div ); + this.map.getContainer().appendChild( this.loading ); + + GEvent.addListener( this.map, 'mousemove', onmousemove ); + GEvent.bindDom(this.div, 'DOMMouseScroll', this, this.onScroll); //Firefox + GEvent.bindDom(this.div, 'mousewheel', this, this.onScroll); // IE + Opera + + GEvent.bind( this.map, 'click', this, this.onClick ); + + if( ! this.extentMarker && this.overlayList.length == 1 ) + this.extentMarker = this.overlayList[ 0 ]; + + // map type + var mapType = G_MAP_TYPE; + if( this.extentMarker && this.extentMarker.mapType ) { + mapType = this.extentMarker.mapType; + } + for( typeName in MapTypeTable ) { + if( typeName in this.classes ) { + mapType = window[ typeName ]; + break; + } + } + + // center and zoom + this.viewsize = new GSize( this.div.offsetWidth, this.div.offsetHeight ); + var center, zoomLevel; + if( this.extentMarker ) { + center = this.extentMarker.point; + if( this.extentMarker.span ) { + zoomLevel = mapType.getSpanZoomLevel( + center, this.extentMarker.span, this.viewsize ); + } + else { + zoomLevel = 10; + } + } + else if( this.overlayList.length > 1 ) { + var autoBounds; + for( var i = 0; i < this.overlayList.length; ++i ) { + if( this.overlayList[ i ].point ) { + if( ! autoBounds ) { + autoBounds = new GLatLngBounds( + this.overlayList[ i ].point, + this.overlayList[ i ].point ); + } + else { + autoBounds.extend( this.overlayList[ i ].point ); + } + } + } + var sw = autoBounds.getSouthWest(); + var ne = autoBounds.getNorthEast(); + center = new GLatLng( + ( sw.lat() + ne.lat() ) / 2, + ( sw.lng() + ne.lng() ) / 2 ); + zoomLevel = mapType.getBoundsZoomLevel( autoBounds, this.viewsize); + } + else { + center = new GLatLng( 41.075210, -85.130310 ); + zoomLevel = 10; + } + + // apply center, zoom, and map type + this.map.setCenter( center, zoomLevel, mapType ); + + this.maxstep = Math.floor( this.overlayList.length / overlaysPerStep ) + 2; + this.initOverlays(); + }; + + EZMap.prototype.initOverlays = function() { + var overlay; + var steplimit = Math.min(this.overlayList.length, this.oi+overlaysPerStep); + for( ; this.oi < steplimit; ++this.oi ) { + overlay = this.overlayList[ this.oi ]; + if( overlay.points || overlay.icon ) + this.map.addOverlay( overlay ); + this.overlayList[ this.oi ] = null; + } + if( this.oi < this.overlayList.length ) + this.nextStep( this.initOverlays ); + else + this.nextStep( this.initControls ); + }; + + EZMap.prototype.initControls = function() { + for( var ctrl in CtrlTable ) { + if( ctrl in this.classes ) { + this.map.addControl( new window[ ctrl ]() ); + } + } + + this.nextStep( this.initLoading ); + }; + + EZMap.prototype.initLoading = function() { + this.loading.parentNode.removeChild( this.loading ); + this.loading = null; + }; + + // Find all anchor tags linking to GMapEZ markers + var anchors = document.getElementsByTagName( 'a' ); + for( var mi = 0; mi < anchors.length; ++mi ) { + if( ! anchors[ mi ].onclick ) { + anchors[ mi ].onclick = anchorClick; + } + } + + // Find all divs marked as GMapEZ + var divs = document.getElementsByTagName( 'div' ); + for( var i = 0; i < divs.length; ++i ) { + var div = divs[ i ]; + var classes = wordMap( div.className ); + if( 'GMapEZ' in classes ) { + new EZMap( div, classes ); + } + } + + lastFunc = function() { + // Examine current page location for a reference to a GMapEZ marker + var marker = markerForUrl( document.location ); + if( marker ) + markerOpener.addMarker( marker ); + + // Open all the markers we need to + markerOpener.chainOpen(); + }; + + doNow(); + } + + function chainWindowFunc( funcname, newfunc ) { + var oldfunc = window[ funcname ]; + if( oldfunc ) { + window[ funcname ] = function() { oldfunc(); newfunc(); }; + } + else { + window[ funcname ] = newfunc; + } + } + + window.addOnLoad = function( func ) { chainWindowFunc( "onload", func );}; + window.addOnUnload = function( func ) { chainWindowFunc( "onunload", func );}; + + window.ez_preload = function() { + if( window.G_INCOMPAT ) { + // If the key failed to validate, cause all keys to appear valid + // and try again. + window.G_INCOMPAT = false; + window.GValidateKey = function(){ return true; } + GLoad(); + } + addOnLoad( loadfunc ); + } + + var key = ''; + var gmapversion = '2'; + (function(){ + var metas = document.getElementsByTagName( 'meta' ); + var match; + for( var i = 0; i < metas.length; ++i ) { + match = /gmapkey:?(.*)/.exec( metas[ i ].name ); + if( match ) { + if( ! match[ 1 ] ) { + key = metas[ i ].content; + } + else if( (new RegExp( match[ 1 ] )).exec( window.location.href ) ) { + key = metas[ i ].content; + break; + } + } + else if( metas[ i ].name == 'gmapversion' ) { + gmapversion = metas[ i ].content; + } + } + })(); + + if( ! window.GMap2 ) { + document.write( [ + '' ].join('\n') ); + } + + document.write( [ + '', + + '' + ].join('\n')); +})(); + diff --git a/components/com_morfeoshow/src/js/index.html b/components/com_morfeoshow/src/js/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/js/index.html @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/components/com_morfeoshow/src/js/jquery-1.2.3.pack.js b/components/com_morfeoshow/src/js/jquery-1.2.3.pack.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/js/jquery-1.2.3.pack.js @@ -0,0 +1,11 @@ +/* + * jQuery 1.2.3 - New Wave Javascript + * + * Copyright (c) 2008 John Resig (jquery.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * $Date: 2008-02-06 00:21:25 -0500 (Wed, 06 Feb 2008) $ + * $Rev: 4663 $ + */ +eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(J(){7(1e.3N)L w=1e.3N;L E=1e.3N=J(a,b){K 1B E.2l.4T(a,b)};7(1e.$)L D=1e.$;1e.$=E;L u=/^[^<]*(<(.|\\s)+>)[^>]*$|^#(\\w+)$/;L G=/^.[^:#\\[\\.]*$/;E.1n=E.2l={4T:J(d,b){d=d||T;7(d.15){6[0]=d;6.M=1;K 6}N 7(1o d=="25"){L c=u.2O(d);7(c&&(c[1]||!b)){7(c[1])d=E.4a([c[1]],b);N{L a=T.5J(c[3]);7(a)7(a.2w!=c[3])K E().2s(d);N{6[0]=a;6.M=1;K 6}N d=[]}}N K 1B E(b).2s(d)}N 7(E.1q(d))K 1B E(T)[E.1n.21?"21":"3U"](d);K 6.6E(d.1k==1M&&d||(d.5h||d.M&&d!=1e&&!d.15&&d[0]!=10&&d[0].15)&&E.2I(d)||[d])},5h:"1.2.3",87:J(){K 6.M},M:0,22:J(a){K a==10?E.2I(6):6[a]},2F:J(b){L a=E(b);a.54=6;K a},6E:J(a){6.M=0;1M.2l.1g.1i(6,a);K 6},R:J(a,b){K E.R(6,a,b)},4X:J(b){L a=-1;6.R(J(i){7(6==b)a=i});K a},1J:J(c,a,b){L d=c;7(c.1k==4e)7(a==10)K 6.M&&E[b||"1J"](6[0],c)||10;N{d={};d[c]=a}K 6.R(J(i){Q(c 1p d)E.1J(b?6.W:6,c,E.1l(6,d[c],b,i,c))})},1j:J(b,a){7((b==\'27\'||b==\'1R\')&&2M(a)<0)a=10;K 6.1J(b,a,"2o")},1u:J(b){7(1o b!="3V"&&b!=V)K 6.4x().3t((6[0]&&6[0].2i||T).5r(b));L a="";E.R(b||6,J(){E.R(6.3p,J(){7(6.15!=8)a+=6.15!=1?6.6K:E.1n.1u([6])})});K a},5m:J(b){7(6[0])E(b,6[0].2i).5k().3o(6[0]).2c(J(){L a=6;2b(a.1C)a=a.1C;K a}).3t(6);K 6},8w:J(a){K 6.R(J(){E(6).6z().5m(a)})},8p:J(a){K 6.R(J(){E(6).5m(a)})},3t:J(){K 6.3O(18,P,S,J(a){7(6.15==1)6.38(a)})},6q:J(){K 6.3O(18,P,P,J(a){7(6.15==1)6.3o(a,6.1C)})},6o:J(){K 6.3O(18,S,S,J(a){6.1a.3o(a,6)})},5a:J(){K 6.3O(18,S,P,J(a){6.1a.3o(a,6.2B)})},3h:J(){K 6.54||E([])},2s:J(b){L c=E.2c(6,J(a){K E.2s(b,a)});K 6.2F(/[^+>] [^+>]/.17(b)||b.1f("..")>-1?E.57(c):c)},5k:J(e){L f=6.2c(J(){7(E.14.1d&&!E.3E(6)){L a=6.69(P),4Y=T.3s("1x");4Y.38(a);K E.4a([4Y.3d])[0]}N K 6.69(P)});L d=f.2s("*").4R().R(J(){7(6[F]!=10)6[F]=V});7(e===P)6.2s("*").4R().R(J(i){7(6.15==3)K;L c=E.O(6,"2R");Q(L a 1p c)Q(L b 1p c[a])E.16.1b(d[i],a,c[a][b],c[a][b].O)});K f},1E:J(b){K 6.2F(E.1q(b)&&E.3y(6,J(a,i){K b.1P(a,i)})||E.3e(b,6))},56:J(b){7(b.1k==4e)7(G.17(b))K 6.2F(E.3e(b,6,P));N b=E.3e(b,6);L a=b.M&&b[b.M-1]!==10&&!b.15;K 6.1E(J(){K a?E.33(6,b)<0:6!=b})},1b:J(a){K!a?6:6.2F(E.37(6.22(),a.1k==4e?E(a).22():a.M!=10&&(!a.12||E.12(a,"3u"))?a:[a]))},3H:J(a){K a?E.3e(a,6).M>0:S},7j:J(a){K 6.3H("."+a)},5O:J(b){7(b==10){7(6.M){L c=6[0];7(E.12(c,"2k")){L e=c.3T,5I=[],11=c.11,2X=c.U=="2k-2X";7(e<0)K V;Q(L i=2X?e:0,2f=2X?e+1:11.M;i<2f;i++){L d=11[i];7(d.2p){b=E.14.1d&&!d.9J.1A.9y?d.1u:d.1A;7(2X)K b;5I.1g(b)}}K 5I}N K(6[0].1A||"").1r(/\\r/g,"")}K 10}K 6.R(J(){7(6.15!=1)K;7(b.1k==1M&&/5u|5t/.17(6.U))6.3k=(E.33(6.1A,b)>=0||E.33(6.31,b)>=0);N 7(E.12(6,"2k")){L a=b.1k==1M?b:[b];E("98",6).R(J(){6.2p=(E.33(6.1A,a)>=0||E.33(6.1u,a)>=0)});7(!a.M)6.3T=-1}N 6.1A=b})},3q:J(a){K a==10?(6.M?6[0].3d:V):6.4x().3t(a)},6S:J(a){K 6.5a(a).1V()},6Z:J(i){K 6.2K(i,i+1)},2K:J(){K 6.2F(1M.2l.2K.1i(6,18))},2c:J(b){K 6.2F(E.2c(6,J(a,i){K b.1P(a,i,a)}))},4R:J(){K 6.1b(6.54)},O:J(d,b){L a=d.23(".");a[1]=a[1]?"."+a[1]:"";7(b==V){L c=6.5n("8P"+a[1]+"!",[a[0]]);7(c==10&&6.M)c=E.O(6[0],d);K c==V&&a[1]?6.O(a[0]):c}N K 6.1N("8K"+a[1]+"!",[a[0],b]).R(J(){E.O(6,d,b)})},35:J(a){K 6.R(J(){E.35(6,a)})},3O:J(g,f,h,d){L e=6.M>1,3n;K 6.R(J(){7(!3n){3n=E.4a(g,6.2i);7(h)3n.8D()}L b=6;7(f&&E.12(6,"1O")&&E.12(3n[0],"4v"))b=6.3S("1U")[0]||6.38(6.2i.3s("1U"));L c=E([]);E.R(3n,J(){L a=e?E(6).5k(P)[0]:6;7(E.12(a,"1m")){c=c.1b(a)}N{7(a.15==1)c=c.1b(E("1m",a).1V());d.1P(b,a)}});c.R(6A)})}};E.2l.4T.2l=E.2l;J 6A(i,a){7(a.3Q)E.3P({1c:a.3Q,3l:S,1H:"1m"});N E.5g(a.1u||a.6x||a.3d||"");7(a.1a)a.1a.34(a)}E.1s=E.1n.1s=J(){L b=18[0]||{},i=1,M=18.M,5c=S,11;7(b.1k==8d){5c=b;b=18[1]||{};i=2}7(1o b!="3V"&&1o b!="J")b={};7(M==1){b=6;i=0}Q(;i-1}},68:J(b,c,a){L e={};Q(L d 1p c){e[d]=b.W[d];b.W[d]=c[d]}a.1P(b);Q(L d 1p c)b.W[d]=e[d]},1j:J(d,e,c){7(e=="27"||e=="1R"){L b,46={43:"4W",4U:"1Z",19:"3D"},3c=e=="27"?["7O","7M"]:["7J","7I"];J 5E(){b=e=="27"?d.7H:d.7F;L a=0,2N=0;E.R(3c,J(){a+=2M(E.2o(d,"7E"+6,P))||0;2N+=2M(E.2o(d,"2N"+6+"5X",P))||0});b-=24.7C(a+2N)}7(E(d).3H(":4d"))5E();N E.68(d,46,5E);K 24.2f(0,b)}K E.2o(d,e,c)},2o:J(e,k,j){L d;J 3x(b){7(!E.14.2d)K S;L a=T.4c.4K(b,V);K!a||a.4M("3x")==""}7(k=="1w"&&E.14.1d){d=E.1J(e.W,"1w");K d==""?"1":d}7(E.14.2z&&k=="19"){L c=e.W.50;e.W.50="0 7r 7o";e.W.50=c}7(k.1D(/4g/i))k=y;7(!j&&e.W&&e.W[k])d=e.W[k];N 7(T.4c&&T.4c.4K){7(k.1D(/4g/i))k="4g";k=k.1r(/([A-Z])/g,"-$1").2h();L h=T.4c.4K(e,V);7(h&&!3x(e))d=h.4M(k);N{L f=[],2C=[];Q(L a=e;a&&3x(a);a=a.1a)2C.4J(a);Q(L i=0;i<2C.M;i++)7(3x(2C[i])){f[i]=2C[i].W.19;2C[i].W.19="3D"}d=k=="19"&&f[2C.M-1]!=V?"2H":(h&&h.4M(k))||"";Q(L i=0;i]*?)\\/>/g,J(b,a,c){K c.1D(/^(aa|a6|7e|a5|4D|7a|a0|3m|9W|9U|9S)$/i)?b:a+">"});L f=E.3g(d).2h(),1x=h.3s("1x");L e=!f.1f("<9P")&&[1,"<2k 74=\'74\'>",""]||!f.1f("<9M")&&[1,"<73>",""]||f.1D(/^<(9G|1U|9E|9B|9x)/)&&[1,"<1O>",""]||!f.1f("<4v")&&[2,"<1O><1U>",""]||(!f.1f("<9w")||!f.1f("<9v"))&&[3,"<1O><1U><4v>",""]||!f.1f("<7e")&&[2,"<1O><1U><6V>",""]||E.14.1d&&[1,"1x<1x>",""]||[0,"",""];1x.3d=e[1]+d+e[2];2b(e[0]--)1x=1x.5o;7(E.14.1d){L g=!f.1f("<1O")&&f.1f("<1U")<0?1x.1C&&1x.1C.3p:e[1]=="<1O>"&&f.1f("<1U")<0?1x.3p:[];Q(L j=g.M-1;j>=0;--j)7(E.12(g[j],"1U")&&!g[j].3p.M)g[j].1a.34(g[j]);7(/^\\s/.17(d))1x.3o(h.5r(d.1D(/^\\s*/)[0]),1x.1C)}d=E.2I(1x.3p)}7(d.M===0&&(!E.12(d,"3u")&&!E.12(d,"2k")))K;7(d[0]==10||E.12(d,"3u")||d.11)k.1g(d);N k=E.37(k,d)});K k},1J:J(d,e,c){7(!d||d.15==3||d.15==8)K 10;L f=E.3E(d)?{}:E.46;7(e=="2p"&&E.14.2d)d.1a.3T;7(f[e]){7(c!=10)d[f[e]]=c;K d[f[e]]}N 7(E.14.1d&&e=="W")K E.1J(d.W,"9u",c);N 7(c==10&&E.14.1d&&E.12(d,"3u")&&(e=="9r"||e=="9o"))K d.9m(e).6K;N 7(d.28){7(c!=10){7(e=="U"&&E.12(d,"4D")&&d.1a)6Q"U 9i 9h\'t 9g 9e";d.9b(e,""+c)}7(E.14.1d&&/6O|3Q/.17(e)&&!E.3E(d))K d.4z(e,2);K d.4z(e)}N{7(e=="1w"&&E.14.1d){7(c!=10){d.6k=1;d.1E=(d.1E||"").1r(/6M\\([^)]*\\)/,"")+(2M(c).3X()=="96"?"":"6M(1w="+c*6L+")")}K d.1E&&d.1E.1f("1w=")>=0?(2M(d.1E.1D(/1w=([^)]*)/)[1])/6L).3X():""}e=e.1r(/-([a-z])/95,J(a,b){K b.2E()});7(c!=10)d[e]=c;K d[e]}},3g:J(a){K(a||"").1r(/^\\s+|\\s+$/g,"")},2I:J(b){L a=[];7(1o b!="93")Q(L i=0,M=b.M;i*",6).1V();2b(6.1C)6.34(6.1C)}},J(a,b){E.1n[a]=J(){K 6.R(b,18)}});E.R(["8f","5X"],J(i,c){L b=c.2h();E.1n[b]=J(a){K 6[0]==1e?E.14.2z&&T.1h["5e"+c]||E.14.2d&&1e["8e"+c]||T.6F=="79"&&T.1F["5e"+c]||T.1h["5e"+c]:6[0]==T?24.2f(24.2f(T.1h["5d"+c],T.1F["5d"+c]),24.2f(T.1h["5L"+c],T.1F["5L"+c])):a==10?(6.M?E.1j(6[0],b):V):6.1j(b,a.1k==4e?a:a+"2S")}});L C=E.14.2d&&4s(E.14.5K)<8c?"(?:[\\\\w*4r-]|\\\\\\\\.)":"(?:[\\\\w\\8b-\\8a*4r-]|\\\\\\\\.)",6v=1B 4q("^>\\\\s*("+C+"+)"),6u=1B 4q("^("+C+"+)(#)("+C+"+)"),6s=1B 4q("^([#.]?)("+C+"*)");E.1s({6r:{"":J(a,i,m){K m[2]=="*"||E.12(a,m[2])},"#":J(a,i,m){K a.4z("2w")==m[2]},":":{89:J(a,i,m){K im[3]-0},2Z:J(a,i,m){K m[3]-0==i},6Z:J(a,i,m){K m[3]-0==i},3j:J(a,i){K i==0},3J:J(a,i,m,r){K i==r.M-1},6n:J(a,i){K i%2==0},6l:J(a,i){K i%2},"3j-4p":J(a){K a.1a.3S("*")[0]==a},"3J-4p":J(a){K E.2Z(a.1a.5o,1,"4t")==a},"83-4p":J(a){K!E.2Z(a.1a.5o,2,"4t")},6B:J(a){K a.1C},4x:J(a){K!a.1C},82:J(a,i,m){K(a.6x||a.81||E(a).1u()||"").1f(m[3])>=0},4d:J(a){K"1Z"!=a.U&&E.1j(a,"19")!="2H"&&E.1j(a,"4U")!="1Z"},1Z:J(a){K"1Z"==a.U||E.1j(a,"19")=="2H"||E.1j(a,"4U")=="1Z"},80:J(a){K!a.2Y},2Y:J(a){K a.2Y},3k:J(a){K a.3k},2p:J(a){K a.2p||E.1J(a,"2p")},1u:J(a){K"1u"==a.U},5u:J(a){K"5u"==a.U},5t:J(a){K"5t"==a.U},59:J(a){K"59"==a.U},3I:J(a){K"3I"==a.U},58:J(a){K"58"==a.U},6j:J(a){K"6j"==a.U},6i:J(a){K"6i"==a.U},2G:J(a){K"2G"==a.U||E.12(a,"2G")},4D:J(a){K/4D|2k|6h|2G/i.17(a.12)},3Y:J(a,i,m){K E.2s(m[3],a).M},7X:J(a){K/h\\d/i.17(a.12)},7W:J(a){K E.3y(E.3G,J(b){K a==b.Y}).M}}},6g:[/^(\\[) *@?([\\w-]+) *([!*$^~=]*) *(\'?"?)(.*?)\\4 *\\]/,/^(:)([\\w-]+)\\("?\'?(.*?(\\(.*?\\))?[^(]*?)"?\'?\\)/,1B 4q("^([:.#]*)("+C+"+)")],3e:J(a,c,b){L d,2m=[];2b(a&&a!=d){d=a;L f=E.1E(a,c,b);a=f.t.1r(/^\\s*,\\s*/,"");2m=b?c=f.r:E.37(2m,f.r)}K 2m},2s:J(t,p){7(1o t!="25")K[t];7(p&&p.15!=1&&p.15!=9)K[];p=p||T;L d=[p],2r=[],3J,12;2b(t&&3J!=t){L r=[];3J=t;t=E.3g(t);L o=S;L g=6v;L m=g.2O(t);7(m){12=m[1].2E();Q(L i=0;d[i];i++)Q(L c=d[i].1C;c;c=c.2B)7(c.15==1&&(12=="*"||c.12.2E()==12))r.1g(c);d=r;t=t.1r(g,"");7(t.1f(" ")==0)6w;o=P}N{g=/^([>+~])\\s*(\\w*)/i;7((m=g.2O(t))!=V){r=[];L l={};12=m[2].2E();m=m[1];Q(L j=0,3f=d.M;j<3f;j++){L n=m=="~"||m=="+"?d[j].2B:d[j].1C;Q(;n;n=n.2B)7(n.15==1){L h=E.O(n);7(m=="~"&&l[h])1Q;7(!12||n.12.2E()==12){7(m=="~")l[h]=P;r.1g(n)}7(m=="+")1Q}}d=r;t=E.3g(t.1r(g,""));o=P}}7(t&&!o){7(!t.1f(",")){7(p==d[0])d.4l();2r=E.37(2r,d);r=d=[p];t=" "+t.6e(1,t.M)}N{L k=6u;L m=k.2O(t);7(m){m=[0,m[2],m[3],m[1]]}N{k=6s;m=k.2O(t)}m[2]=m[2].1r(/\\\\/g,"");L f=d[d.M-1];7(m[1]=="#"&&f&&f.5J&&!E.3E(f)){L q=f.5J(m[2]);7((E.14.1d||E.14.2z)&&q&&1o q.2w=="25"&&q.2w!=m[2])q=E(\'[@2w="\'+m[2]+\'"]\',f)[0];d=r=q&&(!m[3]||E.12(q,m[3]))?[q]:[]}N{Q(L i=0;d[i];i++){L a=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];7(a=="*"&&d[i].12.2h()=="3V")a="3m";r=E.37(r,d[i].3S(a))}7(m[1]==".")r=E.55(r,m[2]);7(m[1]=="#"){L e=[];Q(L i=0;r[i];i++)7(r[i].4z("2w")==m[2]){e=[r[i]];1Q}r=e}d=r}t=t.1r(k,"")}}7(t){L b=E.1E(t,r);d=r=b.r;t=E.3g(b.t)}}7(t)d=[];7(d&&p==d[0])d.4l();2r=E.37(2r,d);K 2r},55:J(r,m,a){m=" "+m+" ";L c=[];Q(L i=0;r[i];i++){L b=(" "+r[i].1t+" ").1f(m)>=0;7(!a&&b||a&&!b)c.1g(r[i])}K c},1E:J(t,r,h){L d;2b(t&&t!=d){d=t;L p=E.6g,m;Q(L i=0;p[i];i++){m=p[i].2O(t);7(m){t=t.7V(m[0].M);m[2]=m[2].1r(/\\\\/g,"");1Q}}7(!m)1Q;7(m[1]==":"&&m[2]=="56")r=G.17(m[3])?E.1E(m[3],r,P).r:E(r).56(m[3]);N 7(m[1]==".")r=E.55(r,m[2],h);N 7(m[1]=="["){L g=[],U=m[3];Q(L i=0,3f=r.M;i<3f;i++){L a=r[i],z=a[E.46[m[2]]||m[2]];7(z==V||/6O|3Q|2p/.17(m[2]))z=E.1J(a,m[2])||\'\';7((U==""&&!!z||U=="="&&z==m[5]||U=="!="&&z!=m[5]||U=="^="&&z&&!z.1f(m[5])||U=="$="&&z.6e(z.M-m[5].M)==m[5]||(U=="*="||U=="~=")&&z.1f(m[5])>=0)^h)g.1g(a)}r=g}N 7(m[1]==":"&&m[2]=="2Z-4p"){L e={},g=[],17=/(-?)(\\d*)n((?:\\+|-)?\\d*)/.2O(m[3]=="6n"&&"2n"||m[3]=="6l"&&"2n+1"||!/\\D/.17(m[3])&&"7U+"+m[3]||m[3]),3j=(17[1]+(17[2]||1))-0,d=17[3]-0;Q(L i=0,3f=r.M;i<3f;i++){L j=r[i],1a=j.1a,2w=E.O(1a);7(!e[2w]){L c=1;Q(L n=1a.1C;n;n=n.2B)7(n.15==1)n.4k=c++;e[2w]=P}L b=S;7(3j==0){7(j.4k==d)b=P}N 7((j.4k-d)%3j==0&&(j.4k-d)/3j>=0)b=P;7(b^h)g.1g(j)}r=g}N{L f=E.6r[m[1]];7(1o f=="3V")f=f[m[2]];7(1o f=="25")f=6c("S||J(a,i){K "+f+";}");r=E.3y(r,J(a,i){K f(a,i,m,r)},h)}}K{r:r,t:t}},4u:J(b,c){L d=[];L a=b[c];2b(a&&a!=T){7(a.15==1)d.1g(a);a=a[c]}K d},2Z:J(a,e,c,b){e=e||1;L d=0;Q(;a;a=a[c])7(a.15==1&&++d==e)1Q;K a},5i:J(n,a){L r=[];Q(;n;n=n.2B){7(n.15==1&&(!a||n!=a))r.1g(n)}K r}});E.16={1b:J(f,i,g,e){7(f.15==3||f.15==8)K;7(E.14.1d&&f.53!=10)f=1e;7(!g.2D)g.2D=6.2D++;7(e!=10){L h=g;g=J(){K h.1i(6,18)};g.O=e;g.2D=h.2D}L j=E.O(f,"2R")||E.O(f,"2R",{}),1v=E.O(f,"1v")||E.O(f,"1v",J(){L a;7(1o E=="10"||E.16.5f)K a;a=E.16.1v.1i(18.3R.Y,18);K a});1v.Y=f;E.R(i.23(/\\s+/),J(c,b){L a=b.23(".");b=a[0];g.U=a[1];L d=j[b];7(!d){d=j[b]={};7(!E.16.2y[b]||E.16.2y[b].4j.1P(f)===S){7(f.3F)f.3F(b,1v,S);N 7(f.6b)f.6b("4i"+b,1v)}}d[g.2D]=g;E.16.2a[b]=P});f=V},2D:1,2a:{},1V:J(e,h,f){7(e.15==3||e.15==8)K;L i=E.O(e,"2R"),29,4X;7(i){7(h==10||(1o h=="25"&&h.7T(0)=="."))Q(L g 1p i)6.1V(e,g+(h||""));N{7(h.U){f=h.2q;h=h.U}E.R(h.23(/\\s+/),J(b,a){L c=a.23(".");a=c[0];7(i[a]){7(f)2V i[a][f.2D];N Q(f 1p i[a])7(!c[1]||i[a][f].U==c[1])2V i[a][f];Q(29 1p i[a])1Q;7(!29){7(!E.16.2y[a]||E.16.2y[a].4h.1P(e)===S){7(e.67)e.67(a,E.O(e,"1v"),S);N 7(e.66)e.66("4i"+a,E.O(e,"1v"))}29=V;2V i[a]}}})}Q(29 1p i)1Q;7(!29){L d=E.O(e,"1v");7(d)d.Y=V;E.35(e,"2R");E.35(e,"1v")}}},1N:J(g,c,d,f,h){c=E.2I(c||[]);7(g.1f("!")>=0){g=g.2K(0,-1);L a=P}7(!d){7(6.2a[g])E("*").1b([1e,T]).1N(g,c)}N{7(d.15==3||d.15==8)K 10;L b,29,1n=E.1q(d[g]||V),16=!c[0]||!c[0].36;7(16)c.4J(6.4Z({U:g,2L:d}));c[0].U=g;7(a)c[0].65=P;7(E.1q(E.O(d,"1v")))b=E.O(d,"1v").1i(d,c);7(!1n&&d["4i"+g]&&d["4i"+g].1i(d,c)===S)b=S;7(16)c.4l();7(h&&E.1q(h)){29=h.1i(d,b==V?c:c.71(b));7(29!==10)b=29}7(1n&&f!==S&&b!==S&&!(E.12(d,\'a\')&&g=="4V")){6.5f=P;1S{d[g]()}1X(e){}}6.5f=S}K b},1v:J(c){L a;c=E.16.4Z(c||1e.16||{});L b=c.U.23(".");c.U=b[0];L f=E.O(6,"2R")&&E.O(6,"2R")[c.U],42=1M.2l.2K.1P(18,1);42.4J(c);Q(L j 1p f){L d=f[j];42[0].2q=d;42[0].O=d.O;7(!b[1]&&!c.65||d.U==b[1]){L e=d.1i(6,42);7(a!==S)a=e;7(e===S){c.36();c.44()}}}7(E.14.1d)c.2L=c.36=c.44=c.2q=c.O=V;K a},4Z:J(c){L a=c;c=E.1s({},a);c.36=J(){7(a.36)a.36();a.7S=S};c.44=J(){7(a.44)a.44();a.7R=P};7(!c.2L)c.2L=c.7Q||T;7(c.2L.15==3)c.2L=a.2L.1a;7(!c.4S&&c.5w)c.4S=c.5w==c.2L?c.7P:c.5w;7(c.64==V&&c.63!=V){L b=T.1F,1h=T.1h;c.64=c.63+(b&&b.2v||1h&&1h.2v||0)-(b.62||0);c.7N=c.7L+(b&&b.2x||1h&&1h.2x||0)-(b.60||0)}7(!c.3c&&((c.4f||c.4f===0)?c.4f:c.5Z))c.3c=c.4f||c.5Z;7(!c.7b&&c.5Y)c.7b=c.5Y;7(!c.3c&&c.2G)c.3c=(c.2G&1?1:(c.2G&2?3:(c.2G&4?2:0)));K c},2y:{21:{4j:J(){5M();K},4h:J(){K}},3C:{4j:J(){7(E.14.1d)K S;E(6).2j("4P",E.16.2y.3C.2q);K P},4h:J(){7(E.14.1d)K S;E(6).3w("4P",E.16.2y.3C.2q);K P},2q:J(a){7(I(a,6))K P;18[0].U="3C";K E.16.1v.1i(6,18)}},3B:{4j:J(){7(E.14.1d)K S;E(6).2j("4O",E.16.2y.3B.2q);K P},4h:J(){7(E.14.1d)K S;E(6).3w("4O",E.16.2y.3B.2q);K P},2q:J(a){7(I(a,6))K P;18[0].U="3B";K E.16.1v.1i(6,18)}}}};E.1n.1s({2j:J(c,a,b){K c=="4H"?6.2X(c,a,b):6.R(J(){E.16.1b(6,c,b||a,b&&a)})},2X:J(d,b,c){K 6.R(J(){E.16.1b(6,d,J(a){E(6).3w(a);K(c||b).1i(6,18)},c&&b)})},3w:J(a,b){K 6.R(J(){E.16.1V(6,a,b)})},1N:J(c,a,b){K 6.R(J(){E.16.1N(c,a,6,P,b)})},5n:J(c,a,b){7(6[0])K E.16.1N(c,a,6[0],S,b);K 10},2g:J(){L b=18;K 6.4V(J(a){6.4N=0==6.4N?1:0;a.36();K b[6.4N].1i(6,18)||S})},7D:J(a,b){K 6.2j(\'3C\',a).2j(\'3B\',b)},21:J(a){5M();7(E.2Q)a.1P(T,E);N E.3A.1g(J(){K a.1P(6,E)});K 6}});E.1s({2Q:S,3A:[],21:J(){7(!E.2Q){E.2Q=P;7(E.3A){E.R(E.3A,J(){6.1i(T)});E.3A=V}E(T).5n("21")}}});L x=S;J 5M(){7(x)K;x=P;7(T.3F&&!E.14.2z)T.3F("5W",E.21,S);7(E.14.1d&&1e==3b)(J(){7(E.2Q)K;1S{T.1F.7B("26")}1X(3a){3z(18.3R,0);K}E.21()})();7(E.14.2z)T.3F("5W",J(){7(E.2Q)K;Q(L i=0;i=0){L i=g.2K(e,g.M);g=g.2K(0,e)}c=c||J(){};L f="4Q";7(d)7(E.1q(d)){c=d;d=V}N{d=E.3m(d);f="61"}L h=6;E.3P({1c:g,U:f,1H:"3q",O:d,1y:J(a,b){7(b=="1W"||b=="5U")h.3q(i?E("<1x/>").3t(a.4b.1r(/<1m(.|\\s)*?\\/1m>/g,"")).2s(i):a.4b);h.R(c,[a.4b,b,a])}});K 6},7n:J(){K E.3m(6.5T())},5T:J(){K 6.2c(J(){K E.12(6,"3u")?E.2I(6.7m):6}).1E(J(){K 6.31&&!6.2Y&&(6.3k||/2k|6h/i.17(6.12)||/1u|1Z|3I/i.17(6.U))}).2c(J(i,c){L b=E(6).5O();K b==V?V:b.1k==1M?E.2c(b,J(a,i){K{31:c.31,1A:a}}):{31:c.31,1A:b}}).22()}});E.R("5S,6d,5R,6D,5Q,6m".23(","),J(i,o){E.1n[o]=J(f){K 6.2j(o,f)}});L B=(1B 3v).3L();E.1s({22:J(d,b,a,c){7(E.1q(b)){a=b;b=V}K E.3P({U:"4Q",1c:d,O:b,1W:a,1H:c})},7l:J(b,a){K E.22(b,V,a,"1m")},7k:J(c,b,a){K E.22(c,b,a,"3i")},7i:J(d,b,a,c){7(E.1q(b)){a=b;b={}}K E.3P({U:"61",1c:d,O:b,1W:a,1H:c})},85:J(a){E.1s(E.4I,a)},4I:{2a:P,U:"4Q",2U:0,5P:"4o/x-7h-3u-7g",5N:P,3l:P,O:V,6p:V,3I:V,49:{3M:"4o/3M, 1u/3M",3q:"1u/3q",1m:"1u/4m, 4o/4m",3i:"4o/3i, 1u/4m",1u:"1u/a7",4G:"*/*"}},4F:{},3P:J(s){L f,2W=/=\\?(&|$)/g,1z,O;s=E.1s(P,s,E.1s(P,{},E.4I,s));7(s.O&&s.5N&&1o s.O!="25")s.O=E.3m(s.O);7(s.1H=="4E"){7(s.U.2h()=="22"){7(!s.1c.1D(2W))s.1c+=(s.1c.1D(/\\?/)?"&":"?")+(s.4E||"7d")+"=?"}N 7(!s.O||!s.O.1D(2W))s.O=(s.O?s.O+"&":"")+(s.4E||"7d")+"=?";s.1H="3i"}7(s.1H=="3i"&&(s.O&&s.O.1D(2W)||s.1c.1D(2W))){f="4E"+B++;7(s.O)s.O=(s.O+"").1r(2W,"="+f+"$1");s.1c=s.1c.1r(2W,"="+f+"$1");s.1H="1m";1e[f]=J(a){O=a;1W();1y();1e[f]=10;1S{2V 1e[f]}1X(e){}7(h)h.34(g)}}7(s.1H=="1m"&&s.1T==V)s.1T=S;7(s.1T===S&&s.U.2h()=="22"){L i=(1B 3v()).3L();L j=s.1c.1r(/(\\?|&)4r=.*?(&|$)/,"$a4="+i+"$2");s.1c=j+((j==s.1c)?(s.1c.1D(/\\?/)?"&":"?")+"4r="+i:"")}7(s.O&&s.U.2h()=="22"){s.1c+=(s.1c.1D(/\\?/)?"&":"?")+s.O;s.O=V}7(s.2a&&!E.5H++)E.16.1N("5S");7((!s.1c.1f("a3")||!s.1c.1f("//"))&&s.1H=="1m"&&s.U.2h()=="22"){L h=T.3S("6f")[0];L g=T.3s("1m");g.3Q=s.1c;7(s.7c)g.a2=s.7c;7(!f){L l=S;g.9Z=g.9Y=J(){7(!l&&(!6.39||6.39=="5V"||6.39=="1y")){l=P;1W();1y();h.34(g)}}}h.38(g);K 10}L m=S;L k=1e.78?1B 78("9X.9V"):1B 76();k.9T(s.U,s.1c,s.3l,s.6p,s.3I);1S{7(s.O)k.4C("9R-9Q",s.5P);7(s.5C)k.4C("9O-5A-9N",E.4F[s.1c]||"9L, 9K 9I 9H 5z:5z:5z 9F");k.4C("X-9C-9A","76");k.4C("9z",s.1H&&s.49[s.1H]?s.49[s.1H]+", */*":s.49.4G)}1X(e){}7(s.6Y)s.6Y(k);7(s.2a)E.16.1N("6m",[k,s]);L c=J(a){7(!m&&k&&(k.39==4||a=="2U")){m=P;7(d){6I(d);d=V}1z=a=="2U"&&"2U"||!E.6X(k)&&"3a"||s.5C&&E.6J(k,s.1c)&&"5U"||"1W";7(1z=="1W"){1S{O=E.6W(k,s.1H)}1X(e){1z="5x"}}7(1z=="1W"){L b;1S{b=k.5q("6U-5A")}1X(e){}7(s.5C&&b)E.4F[s.1c]=b;7(!f)1W()}N E.5v(s,k,1z);1y();7(s.3l)k=V}};7(s.3l){L d=53(c,13);7(s.2U>0)3z(J(){7(k){k.9t();7(!m)c("2U")}},s.2U)}1S{k.9s(s.O)}1X(e){E.5v(s,k,V,e)}7(!s.3l)c();J 1W(){7(s.1W)s.1W(O,1z);7(s.2a)E.16.1N("5Q",[k,s])}J 1y(){7(s.1y)s.1y(k,1z);7(s.2a)E.16.1N("5R",[k,s]);7(s.2a&&!--E.5H)E.16.1N("6d")}K k},5v:J(s,a,b,e){7(s.3a)s.3a(a,b,e);7(s.2a)E.16.1N("6D",[a,s,e])},5H:0,6X:J(r){1S{K!r.1z&&9q.9p=="59:"||(r.1z>=6T&&r.1z<9n)||r.1z==6R||r.1z==9l||E.14.2d&&r.1z==10}1X(e){}K S},6J:J(a,c){1S{L b=a.5q("6U-5A");K a.1z==6R||b==E.4F[c]||E.14.2d&&a.1z==10}1X(e){}K S},6W:J(r,b){L c=r.5q("9k-U");L d=b=="3M"||!b&&c&&c.1f("3M")>=0;L a=d?r.9j:r.4b;7(d&&a.1F.28=="5x")6Q"5x";7(b=="1m")E.5g(a);7(b=="3i")a=6c("("+a+")");K a},3m:J(a){L s=[];7(a.1k==1M||a.5h)E.R(a,J(){s.1g(3r(6.31)+"="+3r(6.1A))});N Q(L j 1p a)7(a[j]&&a[j].1k==1M)E.R(a[j],J(){s.1g(3r(j)+"="+3r(6))});N s.1g(3r(j)+"="+3r(a[j]));K s.6a("&").1r(/%20/g,"+")}});E.1n.1s({1G:J(c,b){K c?6.2e({1R:"1G",27:"1G",1w:"1G"},c,b):6.1E(":1Z").R(J(){6.W.19=6.5s||"";7(E.1j(6,"19")=="2H"){L a=E("<"+6.28+" />").6y("1h");6.W.19=a.1j("19");7(6.W.19=="2H")6.W.19="3D";a.1V()}}).3h()},1I:J(b,a){K b?6.2e({1R:"1I",27:"1I",1w:"1I"},b,a):6.1E(":4d").R(J(){6.5s=6.5s||E.1j(6,"19");6.W.19="2H"}).3h()},6N:E.1n.2g,2g:J(a,b){K E.1q(a)&&E.1q(b)?6.6N(a,b):a?6.2e({1R:"2g",27:"2g",1w:"2g"},a,b):6.R(J(){E(6)[E(6).3H(":1Z")?"1G":"1I"]()})},9f:J(b,a){K 6.2e({1R:"1G"},b,a)},9d:J(b,a){K 6.2e({1R:"1I"},b,a)},9c:J(b,a){K 6.2e({1R:"2g"},b,a)},9a:J(b,a){K 6.2e({1w:"1G"},b,a)},99:J(b,a){K 6.2e({1w:"1I"},b,a)},97:J(c,a,b){K 6.2e({1w:a},c,b)},2e:J(l,k,j,h){L i=E.6P(k,j,h);K 6[i.2P===S?"R":"2P"](J(){7(6.15!=1)K S;L g=E.1s({},i);L f=E(6).3H(":1Z"),4A=6;Q(L p 1p l){7(l[p]=="1I"&&f||l[p]=="1G"&&!f)K E.1q(g.1y)&&g.1y.1i(6);7(p=="1R"||p=="27"){g.19=E.1j(6,"19");g.32=6.W.32}}7(g.32!=V)6.W.32="1Z";g.40=E.1s({},l);E.R(l,J(c,a){L e=1B E.2t(4A,g,c);7(/2g|1G|1I/.17(a))e[a=="2g"?f?"1G":"1I":a](l);N{L b=a.3X().1D(/^([+-]=)?([\\d+-.]+)(.*)$/),1Y=e.2m(P)||0;7(b){L d=2M(b[2]),2A=b[3]||"2S";7(2A!="2S"){4A.W[c]=(d||1)+2A;1Y=((d||1)/e.2m(P))*1Y;4A.W[c]=1Y+2A}7(b[1])d=((b[1]=="-="?-1:1)*d)+1Y;e.45(1Y,d,2A)}N e.45(1Y,a,"")}});K P})},2P:J(a,b){7(E.1q(a)||(a&&a.1k==1M)){b=a;a="2t"}7(!a||(1o a=="25"&&!b))K A(6[0],a);K 6.R(J(){7(b.1k==1M)A(6,a,b);N{A(6,a).1g(b);7(A(6,a).M==1)b.1i(6)}})},94:J(b,c){L a=E.3G;7(b)6.2P([]);6.R(J(){Q(L i=a.M-1;i>=0;i--)7(a[i].Y==6){7(c)a[i](P);a.72(i,1)}});7(!c)6.5p();K 6}});L A=J(b,c,a){7(!b)K 10;c=c||"2t";L q=E.O(b,c+"2P");7(!q||a)q=E.O(b,c+"2P",a?E.2I(a):[]);K q};E.1n.5p=J(a){a=a||"2t";K 6.R(J(){L q=A(6,a);q.4l();7(q.M)q[0].1i(6)})};E.1s({6P:J(b,a,c){L d=b&&b.1k==92?b:{1y:c||!c&&a||E.1q(b)&&b,2u:b,3Z:c&&a||a&&a.1k!=91&&a};d.2u=(d.2u&&d.2u.1k==51?d.2u:{90:8Z,9D:6T}[d.2u])||8X;d.5y=d.1y;d.1y=J(){7(d.2P!==S)E(6).5p();7(E.1q(d.5y))d.5y.1i(6)};K d},3Z:{70:J(p,n,b,a){K b+a*p},5j:J(p,n,b,a){K((-24.8V(p*24.8U)/2)+0.5)*a+b}},3G:[],3W:V,2t:J(b,c,a){6.11=c;6.Y=b;6.1l=a;7(!c.47)c.47={}}});E.2t.2l={4y:J(){7(6.11.30)6.11.30.1i(6.Y,[6.2J,6]);(E.2t.30[6.1l]||E.2t.30.4G)(6);7(6.1l=="1R"||6.1l=="27")6.Y.W.19="3D"},2m:J(a){7(6.Y[6.1l]!=V&&6.Y.W[6.1l]==V)K 6.Y[6.1l];L r=2M(E.1j(6.Y,6.1l,a));K r&&r>-8Q?r:2M(E.2o(6.Y,6.1l))||0},45:J(c,b,d){6.5B=(1B 3v()).3L();6.1Y=c;6.3h=b;6.2A=d||6.2A||"2S";6.2J=6.1Y;6.4B=6.4w=0;6.4y();L e=6;J t(a){K e.30(a)}t.Y=6.Y;E.3G.1g(t);7(E.3W==V){E.3W=53(J(){L a=E.3G;Q(L i=0;i6.11.2u+6.5B){6.2J=6.3h;6.4B=6.4w=1;6.4y();6.11.40[6.1l]=P;L b=P;Q(L i 1p 6.11.40)7(6.11.40[i]!==P)b=S;7(b){7(6.11.19!=V){6.Y.W.32=6.11.32;6.Y.W.19=6.11.19;7(E.1j(6.Y,"19")=="2H")6.Y.W.19="3D"}7(6.11.1I)6.Y.W.19="2H";7(6.11.1I||6.11.1G)Q(L p 1p 6.11.40)E.1J(6.Y.W,p,6.11.47[p])}7(b&&E.1q(6.11.1y))6.11.1y.1i(6.Y);K S}N{L n=t-6.5B;6.4w=n/6.11.2u;6.4B=E.3Z[6.11.3Z||(E.3Z.5j?"5j":"70")](6.4w,n,0,1,6.11.2u);6.2J=6.1Y+((6.3h-6.1Y)*6.4B);6.4y()}K P}};E.2t.30={2v:J(a){a.Y.2v=a.2J},2x:J(a){a.Y.2x=a.2J},1w:J(a){E.1J(a.Y.W,"1w",a.2J)},4G:J(a){a.Y.W[a.1l]=a.2J+a.2A}};E.1n.5L=J(){L b=0,3b=0,Y=6[0],5l;7(Y)8M(E.14){L d=Y.1a,41=Y,1K=Y.1K,1L=Y.2i,5D=2d&&4s(5K)<8J&&!/a1/i.17(v),2T=E.1j(Y,"43")=="2T";7(Y.6G){L c=Y.6G();1b(c.26+24.2f(1L.1F.2v,1L.1h.2v),c.3b+24.2f(1L.1F.2x,1L.1h.2x));1b(-1L.1F.62,-1L.1F.60)}N{1b(Y.5G,Y.5F);2b(1K){1b(1K.5G,1K.5F);7(48&&!/^t(8H|d|h)$/i.17(1K.28)||2d&&!5D)2N(1K);7(!2T&&E.1j(1K,"43")=="2T")2T=P;41=/^1h$/i.17(1K.28)?41:1K;1K=1K.1K}2b(d&&d.28&&!/^1h|3q$/i.17(d.28)){7(!/^8G|1O.*$/i.17(E.1j(d,"19")))1b(-d.2v,-d.2x);7(48&&E.1j(d,"32")!="4d")2N(d);d=d.1a}7((5D&&(2T||E.1j(41,"43")=="4W"))||(48&&E.1j(41,"43")!="4W"))1b(-1L.1h.5G,-1L.1h.5F);7(2T)1b(24.2f(1L.1F.2v,1L.1h.2v),24.2f(1L.1F.2x,1L.1h.2x))}5l={3b:3b,26:b}}J 2N(a){1b(E.2o(a,"a8",P),E.2o(a,"a9",P))}J 1b(l,t){b+=4s(l)||0;3b+=4s(t)||0}K 5l}})();',62,631,'||||||this|if||||||||||||||||||||||||||||||||||||||function|return|var|length|else|data|true|for|each|false|document|type|null|style||elem||undefined|options|nodeName||browser|nodeType|event|test|arguments|display|parentNode|add|url|msie|window|indexOf|push|body|apply|css|constructor|prop|script|fn|typeof|in|isFunction|replace|extend|className|text|handle|opacity|div|complete|status|value|new|firstChild|match|filter|documentElement|show|dataType|hide|attr|offsetParent|doc|Array|trigger|table|call|break|height|try|cache|tbody|remove|success|catch|start|hidden||ready|get|split|Math|string|left|width|tagName|ret|global|while|map|safari|animate|max|toggle|toLowerCase|ownerDocument|bind|select|prototype|cur||curCSS|selected|handler|done|find|fx|duration|scrollLeft|id|scrollTop|special|opera|unit|nextSibling|stack|guid|toUpperCase|pushStack|button|none|makeArray|now|slice|target|parseFloat|border|exec|queue|isReady|events|px|fixed|timeout|delete|jsre|one|disabled|nth|step|name|overflow|inArray|removeChild|removeData|preventDefault|merge|appendChild|readyState|error|top|which|innerHTML|multiFilter|rl|trim|end|json|first|checked|async|param|elems|insertBefore|childNodes|html|encodeURIComponent|createElement|append|form|Date|unbind|color|grep|setTimeout|readyList|mouseleave|mouseenter|block|isXMLDoc|addEventListener|timers|is|password|last|runtimeStyle|getTime|xml|jQuery|domManip|ajax|src|callee|getElementsByTagName|selectedIndex|load|object|timerId|toString|has|easing|curAnim|offsetChild|args|position|stopPropagation|custom|props|orig|mozilla|accepts|clean|responseText|defaultView|visible|String|charCode|float|teardown|on|setup|nodeIndex|shift|javascript|currentStyle|application|child|RegExp|_|parseInt|previousSibling|dir|tr|state|empty|update|getAttribute|self|pos|setRequestHeader|input|jsonp|lastModified|_default|unload|ajaxSettings|unshift|getComputedStyle|styleSheets|getPropertyValue|lastToggle|mouseout|mouseover|GET|andSelf|relatedTarget|init|visibility|click|absolute|index|container|fix|outline|Number|removeAttribute|setInterval|prevObject|classFilter|not|unique|submit|file|after|windowData|deep|scroll|client|triggered|globalEval|jquery|sibling|swing|clone|results|wrapAll|triggerHandler|lastChild|dequeue|getResponseHeader|createTextNode|oldblock|checkbox|radio|handleError|fromElement|parsererror|old|00|Modified|startTime|ifModified|safari2|getWH|offsetTop|offsetLeft|active|values|getElementById|version|offset|bindReady|processData|val|contentType|ajaxSuccess|ajaxComplete|ajaxStart|serializeArray|notmodified|loaded|DOMContentLoaded|Width|ctrlKey|keyCode|clientTop|POST|clientLeft|clientX|pageX|exclusive|detachEvent|removeEventListener|swap|cloneNode|join|attachEvent|eval|ajaxStop|substr|head|parse|textarea|reset|image|zoom|odd|ajaxSend|even|before|username|prepend|expr|quickClass|uuid|quickID|quickChild|continue|textContent|appendTo|contents|evalScript|parent|defaultValue|ajaxError|setArray|compatMode|getBoundingClientRect|styleFloat|clearInterval|httpNotModified|nodeValue|100|alpha|_toggle|href|speed|throw|304|replaceWith|200|Last|colgroup|httpData|httpSuccess|beforeSend|eq|linear|concat|splice|fieldset|multiple|cssFloat|XMLHttpRequest|webkit|ActiveXObject|CSS1Compat|link|metaKey|scriptCharset|callback|col|pixelLeft|urlencoded|www|post|hasClass|getJSON|getScript|elements|serialize|black|keyup|keypress|solid|change|mousemove|mouseup|dblclick|resize|focus|blur|stylesheet|rel|doScroll|round|hover|padding|offsetHeight|mousedown|offsetWidth|Bottom|Top|keydown|clientY|Right|pageY|Left|toElement|srcElement|cancelBubble|returnValue|charAt|0n|substring|animated|header|noConflict|line|enabled|innerText|contains|only|weight|ajaxSetup|font|size|gt|lt|uFFFF|u0128|417|Boolean|inner|Height|toggleClass|removeClass|addClass|removeAttr|replaceAll|insertAfter|prependTo|contentWindow|contentDocument|wrap|iframe|children|siblings|prevAll|nextAll|prev|wrapInner|next|parents|maxLength|maxlength|readOnly|readonly|reverse|class|htmlFor|inline|able|boxModel|522|setData|compatible|with|1px|ie|getData|10000|ra|it|rv|PI|cos|userAgent|400|navigator|600|slow|Function|Object|array|stop|ig|NaN|fadeTo|option|fadeOut|fadeIn|setAttribute|slideToggle|slideUp|changed|slideDown|be|can|property|responseXML|content|1223|getAttributeNode|300|method|protocol|location|action|send|abort|cssText|th|td|cap|specified|Accept|With|colg|Requested|fast|tfoot|GMT|thead|1970|Jan|attributes|01|Thu|leg|Since|If|opt|Type|Content|embed|open|area|XMLHTTP|hr|Microsoft|onreadystatechange|onload|meta|adobeair|charset|http|1_|img|br|plain|borderLeftWidth|borderTopWidth|abbr'.split('|'),0,{})) \ No newline at end of file diff --git a/components/com_morfeoshow/src/js/jquery.blockUI-1.33.pack.js b/components/com_morfeoshow/src/js/jquery.blockUI-1.33.pack.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/js/jquery.blockUI-1.33.pack.js @@ -0,0 +1,1 @@ +eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(q($){$.3=q(a,b,c){$.3.r.1p(F,a,b,c)};$.3.22=1.33;$.2D=q(a){$.3.r.T(F,a)};$.1s.3f=q(a,b,c){B 4.1j(q(){7(!4.$1Y){7($.D(4,"M")==\'2M\')4.E.M=\'2C\';7($.Q.W)4.E.2z=1;4.$1Y=1}$.3.r.1p(4,a,b,c)})};$.1s.2x=q(a){B 4.1j(q(){$.3.r.T(4,a)})};$.1s.1r=q(a,b,c){8 d=4[0];7(!d)B;8 e=$(d);a=a||{};8 w=e.x()||e.1H(\'x\')||a.x||$.3.v.1i.x;8 h=e.A()||e.1H(\'A\')||a.A||$.3.v.1i.A;7(w[w.I-1]==\'%\'){8 f=u.S.15||u.y.15;w=16(w)||G;w=(w*f)/G}7(h[h.I-1]==\'%\'){8 g=u.S.X||u.y.X;h=16(h)||G;h=(h*g)/G}8 i=\'-\'+16(w)/2+\'H\';8 j=\'-\'+16(h)/2+\'H\';8 k=1A.1N.2w();8 l={O:b||1,2r:c&&/3e/.1o(k)&&/3d/.1o(k)};$.3.r.1p(F,d,{x:w,A:h,2p:j,3b:i},l)};$.3.v={2m:\'<2k>38 1k...\',2g:\'\',2d:{1I:\'#1G\',2c:\'0.5\'},29:{x:\'25\',1F:\'-32 0 0 -30\',N:\'1d%\',U:\'1d%\',1X:\'1g\',2V:\'#2S\',1I:\'#1G\',1B:\'2R 2P #2O\'},1R:{x:\'25\',1e:\'2L\',1X:\'1g\',1I:\'#1G\'},1i:{x:\'2h\',A:\'2h\',N:\'1d%\',U:\'1d%\'},2l:1,1Q:0,2n:\'2F 2E 2B\',1b:1,1P:2A};$.3.r={1w:J,1a:J,L:J,K:[],1v:F.1O&&F.1O.22()<9,1u:$.Q.W&&/2y 6.0/.1o(1A.1N),1p:q(a,b,c,d){d=d||{};4.1a=1t d.O==\'q\'?d.O:J;4.1w=d.O?b:J;8 e=(a==F);8 g=4.1v||$.Q.2v&&/2u/.1o(1A.2t);7(1t d.1M!=\'2s\')g=d.1M==0?1:0;7(e&&4.L)4.T(F,{1b:0});7(b&&1t b==\'1L\'&&!b.1K&&!b.24){c=b;b=J}b=b?(b.24?$(b):b):e?$.3.v.2m:$.3.v.2g;7(d.O)8 h=18.1q({},$.3.v.1i);17 8 h=18.1q({},e?$.3.v.29:$.3.v.1R);c=18.1q(h,c||{});8 f=($.Q.W)?$(\'<2q 12="3" E="z-1n:3c;1B:1m;1F:0;1e:0;M:1l;x:G%;A:G%;N:0;U:0" 3a="39:2j;">\'):$(\'\');8 w=$(\'\');8 m=e?$(\'\'):$(\'\');w.D(\'M\',e?\'2e\':\'1l\');7(b)m.D(c);7(!g)w.D($.3.v.2d);7(4.1v)w.D({x:\'\'+a.15,A:\'\'+a.X});7($.Q.W)f.D(\'2c\',\'0.0\');$([f[0],w[0],m[0]]).36(e?\'y\':a);8 j=$.Q.W&&(!$.19||$(\'1L,35\',e?J:a).I>0);7(4.1u||j){7(e&&$.3.v.2l&&$.19)$(\'34,y\').D(\'A\',\'G%\');7((4.1u||!$.19)&&!e){8 t=4.V(a,\'2b\'),l=4.V(a,\'2a\');8 k=t?\'(0 - \'+t+\')\':0;8 n=l?\'(0 - \'+l+\')\':0}$.1j([f,w,m],q(i,o){8 s=o[0].E;s.M=\'1l\';7(i<2){e?s.P(\'A\',\'u.y.23 > u.y.R ? u.y.23 : u.y.R + "H"\'):s.P(\'A\',\'4.11.R + "H"\');e?s.P(\'x\',\'18.19 && u.S.15 || u.y.15 + "H"\'):s.P(\'x\',\'4.11.1E + "H"\');7(n)s.P(\'U\',n);7(k)s.P(\'N\',k)}17{7(e)s.P(\'N\',\'(u.S.X || u.y.X) / 2 - (4.R / 2) + (31 = u.S.1x ? u.S.1x : u.y.1x) + "H"\');s.2p=0}})}7(d.O){w.D(\'14\',\'21\').1H(\'2Z\',$.3.v.2n);m.D(\'14\',\'21\');$([f[0],w[0],m[0]]).2Y(\'3\').2X(\'1r\');$().1c($.3.r.Z).Y(\'1C\',$.3.r.Z)}17 4.Y(1,a);m.2W(b).1W();7(b.1K)b.1W();7(d.O)B;7(e){4.L=m[0];4.K=$(\':1V:2U:2T\',4.L);1U(4.1f,20)}17 4.1g(m[0])},T:q(a,b){8 o=$.1q({},$.3.v,b);4.Y(0,a);8 c=a==F;8 d=c?$(\'y\').1T().1S(\'.3\'):$(\'.3\',a);7(c)4.L=4.K=J;7(o.1b){d.1b(o.1P,q(){7(4.11)4.11.2Q(4)})}17 d.T()},28:q(a){$().1D(\'1c\',$.3.r.Z).1D(\'1C\',$.3.r.Z);7(4.1a)4.1a(4.1w);$(\'y .1r\').2N().T()},1Z:q(e){7(e.1h&&e.1h==9){7($.3.r.L&&!$.3.v.1Q){8 a=$.3.r.K;8 b=!e.26&&e.13==a[a.I-1];8 c=e.26&&e.13==a[0];7(b||c){1U(q(){$.3.r.1f(c)},10);B 2j}}}7($(e.13).1z(\'C.1J\').I>0)B 1y;B $(e.13).1z().1T().1S(\'C.3\').I==0},Z:q(e){7((e.1h&&e.1h==27)||(e.2K==\'1c\'&&$(e.13).1z(\'C.1J\').I==0))$.3.r.28();B 1y},Y:q(b,a){8 c=a==F;7(!b&&(c&&!4.L||!c&&!a.$2o))B;7(!c)a.$2o=b;8 d=$(a).2J(\'a,:1V\');$.1j([\'2I\',\'2H\',\'2G\',\'1C\',\'1c\'],q(i,o){d[b?\'Y\':\'1D\'](o,$.3.r.1Z)})},1f:q(a){7(!$.3.r.K)B;8 e=$.3.r.K[a===1y?$.3.r.K.I-1:0];7(e)e.1f()},1g:q(a){8 p=a.11,s=a.E;8 l=((p.1E-a.1E)/2)-4.V(p,\'2a\');8 t=((p.R-a.R)/2)-4.V(p,\'2b\');s.U=l>0?(l+\'H\'):\'0\';s.N=t>0?(t+\'H\'):\'0\'},V:q(a,p){B 16($.D(a,p))||0}}})(18);',62,202,'|||blockUI|this|||if|var||||||||||||||||||function|impl|||document|defaults||width|body||height|return|div|css|style|window|100|px|length|null|pageBlockEls|pageBlock|position|top|displayMode|setExpression|browser|offsetHeight|documentElement|remove|left|sz|msie|clientHeight|bind|boxHandler||parentNode|class|target|cursor|clientWidth|parseInt|else|jQuery|boxModel|boxCallback|fadeOut|click|50|padding|focus|center|keyCode|displayBoxCSS|each|wait|absolute|none|index|test|install|extend|displayBox|fn|typeof|ie6|op8|box|scrollTop|true|parents|navigator|border|keypress|unbind|offsetWidth|margin|fff|attr|backgroundColor|blockMsg|jquery|object|alphaOverride|userAgent|opera|fadeTime|allowTabToLeave|elementMessageCSS|filter|children|setTimeout|input|show|textAlign|pos_checked|handler||default|version|scrollHeight|nodeType|250px|shiftKey||boxRemove|pageMessageCSS|borderLeftWidth|borderTopWidth|opacity|overlayCSS|fixed|1002|elementMessage|400px|display|false|h1|ie6Stretch|pageMessage|closeMessage|blocked|marginTop|iframe|noalpha|undefined|platform|Linux|mozilla|toLowerCase|unblock|MSIE|zoom|400|close|relative|unblockUI|to|Click|keydown|mouseup|mousedown|find|type|10px|static|hide|aaa|solid|removeChild|3px|000|visible|enabled|color|append|addClass|removeClass|title|125px|blah|50px||html|embed|appendTo|1001|Please|javascript|src|marginLeft|1000|firefox|mac|block'.split('|'),0,{})) \ No newline at end of file diff --git a/components/com_morfeoshow/src/js/jquery.history.pack.js b/components/com_morfeoshow/src/js/jquery.history.pack.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/js/jquery.history.pack.js @@ -0,0 +1,1 @@ +eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('2.P({8:n,5:n,K:l(a){2.5=a;3 b=9.7;2.8=b;4(2.h.u){4(2.8==\'\'){2.8=\'#\'}$("Z").X(\'\');3 c=$("#m")[0];3 d=c.r.k;d.C();d.F();d.9.7=b}f 4($.h.q){2.6=[];2.6.g=E.g;2.p=[];2.j=o}2.5(b.t(/^#/,\'\'));V(2.B,U)},A:l(a){2.6.z(a);2.p.g=0;y.j=o},B:l(){4(2.h.u){3 a=$("#m")[0];3 b=a.R||a.r.k;3 c=b.9.7;4(c!=2.8){9.7=c;2.8=c;2.5(c.t(/^#/,\'\'))}}f 4($.h.q){4(!2.s){3 d=E.g-2.6.g;4(d){2.j=x;4(d<0){w(3 i=0;i=0){2.5(k.v.H(\'#\')[1])}f{3 c=9.7;2.5(\'\')}2.j=o}}}f{3 c=9.7;4(c!=2.8){2.8=c;2.5(c.t(/^#/,\'\'))}}},G:l(a){3 b;4(2.h.q){b=a}f{b=\'#\'+a;9.7=b}2.8=b;4(2.h.u){3 c=$("#m")[0];3 d=c.r.k;d.C();d.F();d.9.7=b;2.5(a)}f 4(2.h.q){2.s=o;y.A(a);3 e=l(){2.s=x};Y.10(e,11);2.5(a);9.7=b}f{2.5(a)}}});',62,64,'||jQuery|var|if|historyCallback|historyBackStack|hash|historyCurrentHash|location||||||else|length|browser||isFirst|document|function|jQuery_history|undefined|true|historyForwardStack|safari|contentWindow|dontCheck|replace|msie|URL|for|false|this|push|historyAddHistory|historyCheck|open|iframe|history|close|historyLoad|split|indexOf|shift|historyInit|unshift|abs|Math|none|extend|pop|contentDocument|display|style|100|setInterval|id|prepend|window|body|setTimeout|200'.split('|'),0,{})) \ No newline at end of file diff --git a/components/com_morfeoshow/src/js/mootools.js b/components/com_morfeoshow/src/js/mootools.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/js/mootools.js @@ -0,0 +1,100 @@ +//MooTools, My Object Oriented Javascript Tools. Copyright (c) 2006 Valerio Proietti, , MIT Style License. + +var MooTools={version:'1.11'};function $defined(obj){return(obj!=undefined);};function $type(obj){if(!$defined(obj))return false;if(obj.htmlElement)return'element';var type=typeof obj;if(type=='object'&&obj.nodeName){switch(obj.nodeType){case 1:return'element';case 3:return(/\S/).test(obj.nodeValue)?'textnode':'whitespace';}} +if(type=='object'||type=='function'){switch(obj.constructor){case Array:return'array';case RegExp:return'regexp';case Class:return'class';} +if(typeof obj.length=='number'){if(obj.item)return'collection';if(obj.callee)return'arguments';}} +return type;};function $merge(){var mix={};for(var i=0;i-1:this.indexOf(string)>-1;},escapeRegExp:function(){return this.replace(/([.*+?^${}()|[\]\/\\])/g,'\\$1');}});Array.extend({rgbToHex:function(array){if(this.length<3)return false;if(this.length==4&&this[3]==0&&!array)return'transparent';var hex=[];for(var i=0;i<3;i++){var bit=(this[i]-0).toString(16);hex.push((bit.length==1)?'0'+bit:bit);} +return array?hex:'#'+hex.join('');},hexToRgb:function(array){if(this.length!=3)return false;var rgb=[];for(var i=0;i<3;i++){rgb.push(parseInt((this[i].length==1)?this[i]+this[i]:this[i],16));} +return array?rgb:'rgb('+rgb.join(',')+')';}});Function.extend({create:function(options){var fn=this;options=$merge({'bind':fn,'event':false,'arguments':null,'delay':false,'periodical':false,'attempt':false},options);if($chk(options.arguments)&&$type(options.arguments)!='array')options.arguments=[options.arguments];return function(event){var args;if(options.event){event=event||window.event;args=[(options.event===true)?event:new options.event(event)];if(options.arguments)args.extend(options.arguments);} +else args=options.arguments||arguments;var returns=function(){return fn.apply($pick(options.bind,fn),args);};if(options.delay)return setTimeout(returns,options.delay);if(options.periodical)return setInterval(returns,options.periodical);if(options.attempt)try{return returns();}catch(err){return false;};return returns();};},pass:function(args,bind){return this.create({'arguments':args,'bind':bind});},attempt:function(args,bind){return this.create({'arguments':args,'bind':bind,'attempt':true})();},bind:function(bind,args){return this.create({'bind':bind,'arguments':args});},bindAsEventListener:function(bind,args){return this.create({'bind':bind,'event':true,'arguments':args});},delay:function(delay,bind,args){return this.create({'delay':delay,'bind':bind,'arguments':args})();},periodical:function(interval,bind,args){return this.create({'periodical':interval,'bind':bind,'arguments':args})();}});Number.extend({toInt:function(){return parseInt(this);},toFloat:function(){return parseFloat(this);},limit:function(min,max){return Math.min(max,Math.max(min,this));},round:function(precision){precision=Math.pow(10,precision||0);return Math.round(this*precision)/precision;},times:function(fn){for(var i=0;i';} +el=document.createElement(el);} +el=$(el);return(!props||!el)?el:el.set(props);}});var Elements=new Class({initialize:function(elements){return(elements)?$extend(elements,this):this;}});Elements.extend=function(props){for(var prop in props){this.prototype[prop]=props[prop];this[prop]=$native.generic(prop);}};function $(el){if(!el)return null;if(el.htmlElement)return Garbage.collect(el);if([window,document].contains(el))return el;var type=$type(el);if(type=='string'){el=document.getElementById(el);type=(el)?'element':false;} +if(type!='element')return null;if(el.htmlElement)return Garbage.collect(el);if(['object','embed'].contains(el.tagName.toLowerCase()))return el;$extend(el,Element.prototype);el.htmlElement=function(){};return Garbage.collect(el);};document.getElementsBySelector=document.getElementsByTagName;function $$(){var elements=[];for(var i=0,j=arguments.length;i0&&fKey<13)this.key='f'+fKey;} +this.key=this.key||String.fromCharCode(this.code).toLowerCase();}else if(this.type.test(/(click|mouse|menu)/)){this.page={'x':event.pageX||event.clientX+document.documentElement.scrollLeft,'y':event.pageY||event.clientY+document.documentElement.scrollTop};this.client={'x':event.pageX?event.pageX-window.pageXOffset:event.clientX,'y':event.pageY?event.pageY-window.pageYOffset:event.clientY};this.rightClick=(event.which==3)||(event.button==2);switch(this.type){case'mouseover':this.relatedTarget=event.relatedTarget||event.fromElement;break;case'mouseout':this.relatedTarget=event.relatedTarget||event.toElement;} +this.fixRelatedTarget();} +return this;},stop:function(){return this.stopPropagation().preventDefault();},stopPropagation:function(){if(this.event.stopPropagation)this.event.stopPropagation();else this.event.cancelBubble=true;return this;},preventDefault:function(){if(this.event.preventDefault)this.event.preventDefault();else this.event.returnValue=false;return this;}});Event.fix={relatedTarget:function(){if(this.relatedTarget&&this.relatedTarget.nodeType==3)this.relatedTarget=this.relatedTarget.parentNode;},relatedTargetGecko:function(){try{Event.fix.relatedTarget.call(this);}catch(e){this.relatedTarget=this.target;}}};Event.prototype.fixRelatedTarget=(window.gecko)?Event.fix.relatedTargetGecko:Event.fix.relatedTarget;Event.keys=new Abstract({'enter':13,'up':38,'down':40,'left':37,'right':39,'esc':27,'space':32,'backspace':8,'tab':9,'delete':46});Element.Methods.Events={addEvent:function(type,fn){this.$events=this.$events||{};this.$events[type]=this.$events[type]||{'keys':[],'values':[]};if(this.$events[type].keys.contains(fn))return this;this.$events[type].keys.push(fn);var realType=type;var custom=Element.Events[type];if(custom){if(custom.add)custom.add.call(this,fn);if(custom.map)fn=custom.map;if(custom.type)realType=custom.type;} +if(!this.addEventListener)fn=fn.create({'bind':this,'event':true});this.$events[type].values.push(fn);return(Element.NativeEvents.contains(realType))?this.addListener(realType,fn):this;},removeEvent:function(type,fn){if(!this.$events||!this.$events[type])return this;var pos=this.$events[type].keys.indexOf(fn);if(pos==-1)return this;var key=this.$events[type].keys.splice(pos,1)[0];var value=this.$events[type].values.splice(pos,1)[0];var custom=Element.Events[type];if(custom){if(custom.remove)custom.remove.call(this,fn);if(custom.type)type=custom.type;} +return(Element.NativeEvents.contains(type))?this.removeListener(type,value):this;},addEvents:function(source){return Element.setMany(this,'addEvent',source);},removeEvents:function(type){if(!this.$events)return this;if(!type){for(var evType in this.$events)this.removeEvents(evType);this.$events=null;}else if(this.$events[type]){this.$events[type].keys.each(function(fn){this.removeEvent(type,fn);},this);this.$events[type]=null;} +return this;},fireEvent:function(type,args,delay){if(this.$events&&this.$events[type]){this.$events[type].keys.each(function(fn){fn.create({'bind':this,'delay':delay,'arguments':args})();},this);} +return this;},cloneEvents:function(from,type){if(!from.$events)return this;if(!type){for(var evType in from.$events)this.cloneEvents(from,evType);}else if(from.$events[type]){from.$events[type].keys.each(function(fn){this.addEvent(type,fn);},this);} +return this;}};window.extend(Element.Methods.Events);document.extend(Element.Methods.Events);Element.extend(Element.Methods.Events);Element.Events=new Abstract({'mouseenter':{type:'mouseover',map:function(event){event=new Event(event);if(event.relatedTarget!=this&&!this.hasChild(event.relatedTarget))this.fireEvent('mouseenter',event);}},'mouseleave':{type:'mouseout',map:function(event){event=new Event(event);if(event.relatedTarget!=this&&!this.hasChild(event.relatedTarget))this.fireEvent('mouseleave',event);}},'mousewheel':{type:(window.gecko)?'DOMMouseScroll':'mousewheel'}});Element.NativeEvents=['click','dblclick','mouseup','mousedown','mousewheel','DOMMouseScroll','mouseover','mouseout','mousemove','keydown','keypress','keyup','load','unload','beforeunload','resize','move','focus','blur','change','submit','reset','select','error','abort','contextmenu','scroll'];Function.extend({bindWithEvent:function(bind,args){return this.create({'bind':bind,'arguments':args,'event':Event});}});Elements.extend({filterByTag:function(tag){return new Elements(this.filter(function(el){return(Element.getTag(el)==tag);}));},filterByClass:function(className,nocash){var elements=this.filter(function(el){return(el.className&&el.className.contains(className,' '));});return(nocash)?elements:new Elements(elements);},filterById:function(id,nocash){var elements=this.filter(function(el){return(el.id==id);});return(nocash)?elements:new Elements(elements);},filterByAttribute:function(name,operator,value,nocash){var elements=this.filter(function(el){var current=Element.getProperty(el,name);if(!current)return false;if(!operator)return true;switch(operator){case'=':return(current==value);case'*=':return(current.contains(value));case'^=':return(current.substr(0,value.length)==value);case'$=':return(current.substr(current.length-value.length)==value);case'!=':return(current!=value);case'~=':return current.contains(value,' ');} +return false;});return(nocash)?elements:new Elements(elements);}});function $E(selector,filter){return($(filter)||document).getElement(selector);};function $ES(selector,filter){return($(filter)||document).getElementsBySelector(selector);};$$.shared={'regexp':/^(\w*|\*)(?:#([\w-]+)|\.([\w-]+))?(?:\[(\w+)(?:([!*^$]?=)["']?([^"'\]]*)["']?)?])?$/,'xpath':{getParam:function(items,context,param,i){var temp=[context.namespaceURI?'xhtml:':'',param[1]];if(param[2])temp.push('[@id="',param[2],'"]');if(param[3])temp.push('[contains(concat(" ", @class, " "), " ',param[3],' ")]');if(param[4]){if(param[5]&¶m[6]){switch(param[5]){case'*=':temp.push('[contains(@',param[4],', "',param[6],'")]');break;case'^=':temp.push('[starts-with(@',param[4],', "',param[6],'")]');break;case'$=':temp.push('[substring(@',param[4],', string-length(@',param[4],') - ',param[6].length,' + 1) = "',param[6],'"]');break;case'=':temp.push('[@',param[4],'="',param[6],'"]');break;case'!=':temp.push('[@',param[4],'!="',param[6],'"]');}}else{temp.push('[@',param[4],']');}} +items.push(temp.join(''));return items;},getItems:function(items,context,nocash){var elements=[];var xpath=document.evaluate('.//'+items.join('//'),context,$$.shared.resolver,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);for(var i=0,j=xpath.snapshotLength;i<\/script>');$('ie_ready').onreadystatechange=function(){if(this.readyState=='complete')domReady();};}}else{window.addListener("load",domReady);document.addListener("DOMContentLoaded",domReady);}}};window.onDomReady=function(fn){return this.addEvent('domready',fn);};window.extend({getWidth:function(){if(this.webkit419)return this.innerWidth;if(this.opera)return document.body.clientWidth;return document.documentElement.clientWidth;},getHeight:function(){if(this.webkit419)return this.innerHeight;if(this.opera)return document.body.clientHeight;return document.documentElement.clientHeight;},getScrollWidth:function(){if(this.ie)return Math.max(document.documentElement.offsetWidth,document.documentElement.scrollWidth);if(this.webkit)return document.body.scrollWidth;return document.documentElement.scrollWidth;},getScrollHeight:function(){if(this.ie)return Math.max(document.documentElement.offsetHeight,document.documentElement.scrollHeight);if(this.webkit)return document.body.scrollHeight;return document.documentElement.scrollHeight;},getScrollLeft:function(){return this.pageXOffset||document.documentElement.scrollLeft;},getScrollTop:function(){return this.pageYOffset||document.documentElement.scrollTop;},getSize:function(){return{'size':{'x':this.getWidth(),'y':this.getHeight()},'scrollSize':{'x':this.getScrollWidth(),'y':this.getScrollHeight()},'scroll':{'x':this.getScrollLeft(),'y':this.getScrollTop()}};},getPosition:function(){return{'x':0,'y':0};}});var Fx={};Fx.Base=new Class({options:{onStart:Class.empty,onComplete:Class.empty,onCancel:Class.empty,transition:function(p){return-(Math.cos(Math.PI*p)-1)/2;},duration:500,unit:'px',wait:true,fps:50},initialize:function(options){this.element=this.element||null;this.setOptions(options);if(this.options.initialize)this.options.initialize.call(this);},step:function(){var time=$time();if(time=(7-4*a)/11){value=-Math.pow((11-6*a-11*p)/4,2)+b*b;break;}} +return value;},Elastic:function(p,x){return Math.pow(2,10*--p)*Math.cos(20*p*Math.PI*(x[0]||1)/3);}});['Quad','Cubic','Quart','Quint'].each(function(transition,i){Fx.Transitions[transition]=new Fx.Transition(function(p){return Math.pow(p,[i+2]);});Fx.Transitions.compat(transition);});var Drag={};Drag.Base=new Class({options:{handle:false,unit:'px',onStart:Class.empty,onBeforeStart:Class.empty,onComplete:Class.empty,onSnap:Class.empty,onDrag:Class.empty,limit:false,modifiers:{x:'left',y:'top'},grid:false,snap:6},initialize:function(el,options){this.setOptions(options);this.element=$(el);this.handle=$(this.options.handle)||this.element;this.mouse={'now':{},'pos':{}};this.value={'start':{},'now':{}};this.bound={'start':this.start.bindWithEvent(this),'check':this.check.bindWithEvent(this),'drag':this.drag.bindWithEvent(this),'stop':this.stop.bind(this)};this.attach();if(this.options.initialize)this.options.initialize.call(this);},attach:function(){this.handle.addEvent('mousedown',this.bound.start);return this;},detach:function(){this.handle.removeEvent('mousedown',this.bound.start);return this;},start:function(event){this.fireEvent('onBeforeStart',this.element);this.mouse.start=event.page;var limit=this.options.limit;this.limit={'x':[],'y':[]};for(var z in this.options.modifiers){if(!this.options.modifiers[z])continue;this.value.now[z]=this.element.getStyle(this.options.modifiers[z]).toInt();this.mouse.pos[z]=event.page[z]-this.value.now[z];if(limit&&limit[z]){for(var i=0;i<2;i++){if($chk(limit[z][i]))this.limit[z][i]=($type(limit[z][i])=='function')?limit[z][i]():limit[z][i];}}} +if($type(this.options.grid)=='number')this.options.grid={'x':this.options.grid,'y':this.options.grid};document.addListener('mousemove',this.bound.check);document.addListener('mouseup',this.bound.stop);this.fireEvent('onStart',this.element);event.stop();},check:function(event){var distance=Math.round(Math.sqrt(Math.pow(event.page.x-this.mouse.start.x,2)+Math.pow(event.page.y-this.mouse.start.y,2)));if(distance>this.options.snap){document.removeListener('mousemove',this.bound.check);document.addListener('mousemove',this.bound.drag);this.drag(event);this.fireEvent('onSnap',this.element);} +event.stop();},drag:function(event){this.out=false;this.mouse.now=event.page;for(var z in this.options.modifiers){if(!this.options.modifiers[z])continue;this.value.now[z]=this.mouse.now[z]-this.mouse.pos[z];if(this.limit[z]){if($chk(this.limit[z][1])&&(this.value.now[z]>this.limit[z][1])){this.value.now[z]=this.limit[z][1];this.out=true;}else if($chk(this.limit[z][0])&&(this.value.now[z]el.left&&now.xel.top);},stop:function(){if(this.overed&&!this.out)this.overed.fireEvent('drop',[this.element,this]);else this.element.fireEvent('emptydrop',this);this.parent();return this;}});Element.extend({makeDraggable:function(options){return new Drag.Move(this,options);}});var XHR=new Class({options:{method:'post',async:true,onRequest:Class.empty,onSuccess:Class.empty,onFailure:Class.empty,urlEncoded:true,encoding:'utf-8',autoCancel:false,headers:{}},setTransport:function(){this.transport=(window.XMLHttpRequest)?new XMLHttpRequest():(window.ie?new ActiveXObject('Microsoft.XMLHTTP'):false);return this;},initialize:function(options){this.setTransport().setOptions(options);this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.headers={};if(this.options.urlEncoded&&this.options.method=='post'){var encoding=(this.options.encoding)?'; charset='+this.options.encoding:'';this.setHeader('Content-type','application/x-www-form-urlencoded'+encoding);} +if(this.options.initialize)this.options.initialize.call(this);},onStateChange:function(){if(this.transport.readyState!=4||!this.running)return;this.running=false;var status=0;try{status=this.transport.status;}catch(e){};if(this.options.isSuccess.call(this,status))this.onSuccess();else this.onFailure();this.transport.onreadystatechange=Class.empty;},isSuccess:function(status){return((status>=200)&&(status<300));},onSuccess:function(){this.response={'text':this.transport.responseText,'xml':this.transport.responseXML};this.fireEvent('onSuccess',[this.response.text,this.response.xml]);this.callChain();},onFailure:function(){this.fireEvent('onFailure',this.transport);},setHeader:function(name,value){this.headers[name]=value;return this;},send:function(url,data){if(this.options.autoCancel)this.cancel();else if(this.running)return this;this.running=true;if(data&&this.options.method=='get'){url=url+(url.contains('?')?'&':'?')+data;data=null;} +this.transport.open(this.options.method.toUpperCase(),url,this.options.async);this.transport.onreadystatechange=this.onStateChange.bind(this);if((this.options.method=='post')&&this.transport.overrideMimeType)this.setHeader('Connection','close');$extend(this.headers,this.options.headers);for(var type in this.headers)try{this.transport.setRequestHeader(type,this.headers[type]);}catch(e){};this.fireEvent('onRequest');this.transport.send($pick(data,null));return this;},cancel:function(){if(!this.running)return this;this.running=false;this.transport.abort();this.transport.onreadystatechange=Class.empty;this.setTransport();this.fireEvent('onCancel');return this;}});XHR.implement(new Chain,new Events,new Options);var Ajax=XHR.extend({options:{data:null,update:null,onComplete:Class.empty,evalScripts:false,evalResponse:false},initialize:function(url,options){this.addEvent('onSuccess',this.onComplete);this.setOptions(options);this.options.data=this.options.data||this.options.postBody;if(!['post','get'].contains(this.options.method)){this._method='_method='+this.options.method;this.options.method='post';} +this.parent();this.setHeader('X-Requested-With','XMLHttpRequest');this.setHeader('Accept','text/javascript, text/html, application/xml, text/xml, */*');this.url=url;},onComplete:function(){if(this.options.update)$(this.options.update).empty().setHTML(this.response.text);if(this.options.evalScripts||this.options.evalResponse)this.evalScripts();this.fireEvent('onComplete',[this.response.text,this.response.xml],20);},request:function(data){data=data||this.options.data;switch($type(data)){case'element':data=$(data).toQueryString();break;case'object':data=Object.toQueryString(data);} +if(this._method)data=(data)?[this._method,data].join('&'):this._method;return this.send(this.url,data);},evalScripts:function(){var script,scripts;if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader('Content-type')))scripts=this.response.text;else{scripts=[];var regexp=/]*>([\s\S]*?)<\/script>/gi;while((script=regexp.exec(this.response.text)))scripts.push(script[1]);scripts=scripts.join('\n');} +if(scripts)(window.execScript)?window.execScript(scripts):window.setTimeout(scripts,0);},getHeader:function(name){try{return this.transport.getResponseHeader(name);}catch(e){};return null;}});Object.toQueryString=function(source){var queryString=[];for(var property in source)queryString.push(encodeURIComponent(property)+'='+encodeURIComponent(source[property]));return queryString.join('&');};Element.extend({send:function(options){return new Ajax(this.getProperty('action'),$merge({data:this.toQueryString()},options,{method:'post'})).request();}});var Cookie=new Abstract({options:{domain:false,path:false,duration:false,secure:false},set:function(key,value,options){options=$merge(this.options,options);value=encodeURIComponent(value);if(options.domain)value+='; domain='+options.domain;if(options.path)value+='; path='+options.path;if(options.duration){var date=new Date();date.setTime(date.getTime()+options.duration*24*60*60*1000);value+='; expires='+date.toGMTString();} +if(options.secure)value+='; secure';document.cookie=key+'='+value;return $extend(options,{'key':key,'value':value});},get:function(key){var value=document.cookie.match('(?:^|;)\\s*'+key.escapeRegExp()+'=([^;]*)');return value?decodeURIComponent(value[1]):false;},remove:function(cookie,options){if($type(cookie)=='object')this.set(cookie.key,'',$merge(cookie,{duration:-1}));else this.set(cookie,'',$merge(options,{duration:-1}));}});var Json={toString:function(obj){switch($type(obj)){case'string':return'"'+obj.replace(/(["\\])/g,'\\$1')+'"';case'array':return'['+obj.map(Json.toString).join(',')+']';case'object':var string=[];for(var property in obj)string.push(Json.toString(property)+':'+Json.toString(obj[property]));return'{'+string.join(',')+'}';case'number':if(isFinite(obj))break;case false:return'null';} +return String(obj);},evaluate:function(str,secure){return(($type(str)!='string')||(secure&&!str.test(/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/)))?null:eval('('+str+')');}};Json.Remote=XHR.extend({initialize:function(url,options){this.url=url;this.addEvent('onSuccess',this.onComplete);this.parent(options);this.setHeader('X-Request','JSON');},send:function(obj){return this.parent(this.url,'json='+Json.toString(obj));},onComplete:function(){this.fireEvent('onComplete',[Json.evaluate(this.response.text,this.options.secure)]);}});var Asset=new Abstract({javascript:function(source,properties){properties=$merge({'onload':Class.empty},properties);var script=new Element('script',{'src':source}).addEvents({'load':properties.onload,'readystatechange':function(){if(this.readyState=='complete')this.fireEvent('load');}});delete properties.onload;return script.setProperties(properties).inject(document.head);},css:function(source,properties){return new Element('link',$merge({'rel':'stylesheet','media':'screen','type':'text/css','href':source},properties)).inject(document.head);},image:function(source,properties){properties=$merge({'onload':Class.empty,'onabort':Class.empty,'onerror':Class.empty},properties);var image=new Image();image.src=source;var element=new Element('img',{'src':source});['load','abort','error'].each(function(type){var event=properties['on'+type];delete properties['on'+type];element.addEvent(type,function(){this.removeEvent(type,arguments.callee);event.call(this);});});if(image.width&&image.height)element.fireEvent('load',element,1);return element.setProperties(properties);},images:function(sources,options){options=$merge({onComplete:Class.empty,onProgress:Class.empty},options);if(!sources.push)sources=[sources];var images=[];var counter=0;sources.each(function(source){var img=new Asset.image(source,{'onload':function(){options.onProgress.call(this,counter);counter++;if(counter==sources.length)options.onComplete();}});images.push(img);});return new Elements(images);}});var Hash=new Class({length:0,initialize:function(object){this.obj=object||{};this.setLength();},get:function(key){return(this.hasKey(key))?this.obj[key]:null;},hasKey:function(key){return(key in this.obj);},set:function(key,value){if(!this.hasKey(key))this.length++;this.obj[key]=value;return this;},setLength:function(){this.length=0;for(var p in this.obj)this.length++;return this;},remove:function(key){if(this.hasKey(key)){delete this.obj[key];this.length--;} +return this;},each:function(fn,bind){$each(this.obj,fn,bind);},extend:function(obj){$extend(this.obj,obj);return this.setLength();},merge:function(){this.obj=$merge.apply(null,[this.obj].extend(arguments));return this.setLength();},empty:function(){this.obj={};this.length=0;return this;},keys:function(){var keys=[];for(var property in this.obj)keys.push(property);return keys;},values:function(){var values=[];for(var property in this.obj)values.push(this.obj[property]);return values;}});function $H(obj){return new Hash(obj);};Hash.Cookie=Hash.extend({initialize:function(name,options){this.name=name;this.options=$extend({'autoSave':true},options||{});this.load();},save:function(){if(this.length==0){Cookie.remove(this.name,this.options);return true;} +var str=Json.toString(this.obj);if(str.length>4096)return false;Cookie.set(this.name,str,this.options);return true;},load:function(){this.obj=Json.evaluate(Cookie.get(this.name),true)||{};this.setLength();}});Hash.Cookie.Methods={};['extend','set','merge','empty','remove'].each(function(method){Hash.Cookie.Methods[method]=function(){Hash.prototype[method].apply(this,arguments);if(this.options.autoSave)this.save();return this;};});Hash.Cookie.implement(Hash.Cookie.Methods);var Color=new Class({initialize:function(color,type){type=type||(color.push?'rgb':'hex');var rgb,hsb;switch(type){case'rgb':rgb=color;hsb=rgb.rgbToHsb();break;case'hsb':rgb=color.hsbToRgb();hsb=color;break;default:rgb=color.hexToRgb(true);hsb=rgb.rgbToHsb();} +rgb.hsb=hsb;rgb.hex=rgb.rgbToHex();return $extend(rgb,Color.prototype);},mix:function(){var colors=$A(arguments);var alpha=($type(colors[colors.length-1])=='number')?colors.pop():50;var rgb=this.copy();colors.each(function(color){color=new Color(color);for(var i=0;i<3;i++)rgb[i]=Math.round((rgb[i]/100*(100-alpha))+(color[i]/100*alpha));});return new Color(rgb,'rgb');},invert:function(){return new Color(this.map(function(value){return 255-value;}));},setHue:function(value){return new Color([value,this.hsb[1],this.hsb[2]],'hsb');},setSaturation:function(percent){return new Color([this.hsb[0],percent,this.hsb[2]],'hsb');},setBrightness:function(percent){return new Color([this.hsb[0],this.hsb[1],percent],'hsb');}});function $RGB(r,g,b){return new Color([r,g,b],'rgb');};function $HSB(h,s,b){return new Color([h,s,b],'hsb');};Array.extend({rgbToHsb:function(){var red=this[0],green=this[1],blue=this[2];var hue,saturation,brightness;var max=Math.max(red,green,blue),min=Math.min(red,green,blue);var delta=max-min;brightness=max/255;saturation=(max!=0)?delta/max:0;if(saturation==0){hue=0;}else{var rr=(max-red)/delta;var gr=(max-green)/delta;var br=(max-blue)/delta;if(red==max)hue=br-gr;else if(green==max)hue=2+rr-br;else hue=4+gr-rr;hue/=6;if(hue<0)hue++;} +return[Math.round(hue*360),Math.round(saturation*100),Math.round(brightness*100)];},hsbToRgb:function(){var br=Math.round(this[2]/100*255);if(this[1]==0){return[br,br,br];}else{var hue=this[0]%360;var f=hue%60;var p=Math.round((this[2]*(100-this[1]))/10000*255);var q=Math.round((this[2]*(6000-this[1]*f))/600000*255);var t=Math.round((this[2]*(6000-this[1]*(60-f)))/600000*255);switch(Math.floor(hue/60)){case 0:return[br,t,p];case 1:return[q,br,p];case 2:return[p,br,t];case 3:return[p,q,br];case 4:return[t,p,br];case 5:return[br,p,q];}} +return false;}});var Scroller=new Class({options:{area:20,velocity:1,onChange:function(x,y){this.element.scrollTo(x,y);}},initialize:function(element,options){this.setOptions(options);this.element=$(element);this.mousemover=([window,document].contains(element))?$(document.body):this.element;},start:function(){this.coord=this.getCoords.bindWithEvent(this);this.mousemover.addListener('mousemove',this.coord);},stop:function(){this.mousemover.removeListener('mousemove',this.coord);this.timer=$clear(this.timer);},getCoords:function(event){this.page=(this.element==window)?event.client:event.page;if(!this.timer)this.timer=this.scroll.periodical(50,this);},scroll:function(){var el=this.element.getSize();var pos=this.element.getPosition();var change={'x':0,'y':0};for(var z in this.page){if(this.page[z]<(this.options.area+pos[z])&&el.scroll[z]!=0) +change[z]=(this.page[z]-this.options.area-pos[z])*this.options.velocity;else if(this.page[z]+this.options.area>(el.size[z]+pos[z])&&el.scroll[z]+el.size[z]!=el.scrollSize[z]) +change[z]=(this.page[z]-el.size[z]+this.options.area-pos[z])*this.options.velocity;} +if(change.y||change.x)this.fireEvent('onChange',[el.scroll.x+change.x,el.scroll.y+change.y]);}});Scroller.implement(new Events,new Options);var Slider=new Class({options:{onChange:Class.empty,onComplete:Class.empty,onTick:function(pos){this.knob.setStyle(this.p,pos);},mode:'horizontal',steps:100,offset:0},initialize:function(el,knob,options){this.element=$(el);this.knob=$(knob);this.setOptions(options);this.previousChange=-1;this.previousEnd=-1;this.step=-1;this.element.addEvent('mousedown',this.clickedElement.bindWithEvent(this));var mod,offset;switch(this.options.mode){case'horizontal':this.z='x';this.p='left';mod={'x':'left','y':false};offset='offsetWidth';break;case'vertical':this.z='y';this.p='top';mod={'x':false,'y':'top'};offset='offsetHeight';} +this.max=this.element[offset]-this.knob[offset]+(this.options.offset*2);this.half=this.knob[offset]/2;this.getPos=this.element['get'+this.p.capitalize()].bind(this.element);this.knob.setStyle('position','relative').setStyle(this.p,-this.options.offset);var lim={};lim[this.z]=[-this.options.offset,this.max-this.options.offset];this.drag=new Drag.Base(this.knob,{limit:lim,modifiers:mod,snap:0,onStart:function(){this.draggedKnob();}.bind(this),onDrag:function(){this.draggedKnob();}.bind(this),onComplete:function(){this.draggedKnob();this.end();}.bind(this)});if(this.options.initialize)this.options.initialize.call(this);},set:function(step){this.step=step.limit(0,this.options.steps);this.checkStep();this.end();this.fireEvent('onTick',this.toPosition(this.step));return this;},clickedElement:function(event){var position=event.page[this.z]-this.getPos()-this.half;position=position.limit(-this.options.offset,this.max-this.options.offset);this.step=this.toStep(position);this.checkStep();this.end();this.fireEvent('onTick',position);},draggedKnob:function(){this.step=this.toStep(this.drag.value.now[this.z]);this.checkStep();},checkStep:function(){if(this.previousChange!=this.step){this.previousChange=this.step;this.fireEvent('onChange',this.step);}},end:function(){if(this.previousEnd!==this.step){this.previousEnd=this.step;this.fireEvent('onComplete',this.step+'');}},toStep:function(position){return Math.round((position+this.options.offset)/this.max*this.options.steps);},toPosition:function(step){return this.max*step/this.options.steps;}});Slider.implement(new Events);Slider.implement(new Options);var SmoothScroll=Fx.Scroll.extend({initialize:function(options){this.parent(window,options);this.links=(this.options.links)?$$(this.options.links):$$(document.links);var location=window.location.href.match(/^[^#]*/)[0]+'#';this.links.each(function(link){if(link.href.indexOf(location)!=0)return;var anchor=link.href.substr(location.length);if(anchor&&$(anchor))this.useLink(link,anchor);},this);if(!window.webkit419)this.addEvent('onComplete',function(){window.location.hash=this.anchor;});},useLink:function(link,anchor){link.addEvent('click',function(event){this.anchor=anchor;this.toElement(anchor);event.stop();}.bindWithEvent(this));}});var Sortables=new Class({options:{handles:false,onStart:Class.empty,onComplete:Class.empty,ghost:true,snap:3,onDragStart:function(element,ghost){ghost.setStyle('opacity',0.7);element.setStyle('opacity',0.7);},onDragComplete:function(element,ghost){element.setStyle('opacity',1);ghost.remove();this.trash.remove();}},initialize:function(list,options){this.setOptions(options);this.list=$(list);this.elements=this.list.getChildren();this.handles=(this.options.handles)?$$(this.options.handles):this.elements;this.bound={'start':[],'moveGhost':this.moveGhost.bindWithEvent(this)};for(var i=0,l=this.handles.length;i0);var prev=this.active.getPrevious();var next=this.active.getNext();if(prev&&up&&nownext.getCoordinates().top)this.active.injectAfter(next);this.previous=now;},serialize:function(converter){return this.list.getChildren().map(converter||function(el){return this.elements.indexOf(el);},this);},end:function(){this.previous=null;document.removeListener('mousemove',this.bound.move);document.removeListener('mouseup',this.bound.end);if(this.options.ghost){document.removeListener('mousemove',this.bound.moveGhost);this.fireEvent('onDragComplete',[this.active,this.ghost]);} +this.fireEvent('onComplete',this.active);}});Sortables.implement(new Events,new Options);var Tips=new Class({options:{onShow:function(tip){tip.setStyle('visibility','visible');},onHide:function(tip){tip.setStyle('visibility','hidden');},maxTitleChars:30,showDelay:100,hideDelay:100,className:'tool',offsets:{'x':16,'y':16},fixed:false},initialize:function(elements,options){this.setOptions(options);this.toolTip=new Element('div',{'class':this.options.className+'-tip','styles':{'position':'absolute','top':'0','left':'0','visibility':'hidden'}}).inject(document.body);this.wrapper=new Element('div').inject(this.toolTip);$$(elements).each(this.build,this);if(this.options.initialize)this.options.initialize.call(this);},build:function(el){el.$tmp.myTitle=(el.href&&el.getTag()=='a')?el.href.replace('http://',''):(el.rel||false);if(el.title){var dual=el.title.split('::');if(dual.length>1){el.$tmp.myTitle=dual[0].trim();el.$tmp.myText=dual[1].trim();}else{el.$tmp.myText=el.title;} +el.removeAttribute('title');}else{el.$tmp.myText=false;} +if(el.$tmp.myTitle&&el.$tmp.myTitle.length>this.options.maxTitleChars)el.$tmp.myTitle=el.$tmp.myTitle.substr(0,this.options.maxTitleChars-1)+"…";el.addEvent('mouseenter',function(event){this.start(el);if(!this.options.fixed)this.locate(event);else this.position(el);}.bind(this));if(!this.options.fixed)el.addEvent('mousemove',this.locate.bindWithEvent(this));var end=this.end.bind(this);el.addEvent('mouseleave',end);el.addEvent('trash',end);},start:function(el){this.wrapper.empty();if(el.$tmp.myTitle){this.title=new Element('span').inject(new Element('div',{'class':this.options.className+'-title'}).inject(this.wrapper)).setHTML(el.$tmp.myTitle);} +if(el.$tmp.myText){this.text=new Element('span').inject(new Element('div',{'class':this.options.className+'-text'}).inject(this.wrapper)).setHTML(el.$tmp.myText);} +$clear(this.timer);this.timer=this.show.delay(this.options.showDelay,this);},end:function(event){$clear(this.timer);this.timer=this.hide.delay(this.options.hideDelay,this);},position:function(element){var pos=element.getPosition();this.toolTip.setStyles({'left':pos.x+this.options.offsets.x,'top':pos.y+this.options.offsets.y});},locate:function(event){var win={'x':window.getWidth(),'y':window.getHeight()};var scroll={'x':window.getScrollLeft(),'y':window.getScrollTop()};var tip={'x':this.toolTip.offsetWidth,'y':this.toolTip.offsetHeight};var prop={'x':'left','y':'top'};for(var z in prop){var pos=event.page[z]+this.options.offsets[z];if((pos+tip[z]-scroll[z])>win[z])pos=event.page[z]-this.options.offsets[z]-tip[z];this.toolTip.setStyle(prop[z],pos);};},show:function(){if(this.options.timeout)this.timer=this.hide.delay(this.options.timeout,this);this.fireEvent('onShow',[this.toolTip]);},hide:function(){this.fireEvent('onHide',[this.toolTip]);}});Tips.implement(new Events,new Options);var Group=new Class({initialize:function(){this.instances=$A(arguments);this.events={};this.checker={};},addEvent:function(type,fn){this.checker[type]=this.checker[type]||{};this.events[type]=this.events[type]||[];if(this.events[type].contains(fn))return false;else this.events[type].push(fn);this.instances.each(function(instance,i){instance.addEvent(type,this.check.bind(this,[type,instance,i]));},this);return this;},check:function(type,instance,i){this.checker[type][i]=true;var every=this.instances.every(function(current,j){return this.checker[type][j]||false;},this);if(!every)return;this.checker[type]={};this.events[type].each(function(event){event.call(this,this.instances,instance);},this);}});var Accordion=Fx.Elements.extend({options:{onActive:Class.empty,onBackground:Class.empty,display:0,show:false,height:true,width:false,opacity:true,fixedHeight:false,fixedWidth:false,wait:false,alwaysHide:false},initialize:function(){var options,togglers,elements,container;$each(arguments,function(argument,i){switch($type(argument)){case'object':options=argument;break;case'element':container=$(argument);break;default:var temp=$$(argument);if(!togglers)togglers=temp;else elements=temp;}});this.togglers=togglers||[];this.elements=elements||[];this.container=$(container);this.setOptions(options);this.previous=-1;if(this.options.alwaysHide)this.options.wait=true;if($chk(this.options.show)){this.options.display=false;this.previous=this.options.show;} +if(this.options.start){this.options.display=false;this.options.show=false;} +this.effects={};if(this.options.opacity)this.effects.opacity='fullOpacity';if(this.options.width)this.effects.width=this.options.fixedWidth?'fullWidth':'offsetWidth';if(this.options.height)this.effects.height=this.options.fixedHeight?'fullHeight':'scrollHeight';for(var i=0,l=this.togglers.length;i0));this.fireEvent(hide?'onBackground':'onActive',[this.togglers[i],el]);for(var fx in this.effects)obj[i][fx]=hide?0:el[this.effects[fx]];},this);return this.start(obj);},showThisHideOpen:function(index){return this.display(index);}});Fx.Accordion=Accordion; \ No newline at end of file diff --git a/components/com_morfeoshow/src/js/picas.js b/components/com_morfeoshow/src/js/picas.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/js/picas.js @@ -0,0 +1,140 @@ +/** + * Picasa Webalbum Integration Library + * This library was inspired and based on pwa by Dieter Raber (http://www.gnu.org/copyleft/lesser.html) + * @name pwi-0.3.js + * @author Jeroen Diderik - http://www.multiprof.nl + * @version 0.2 + * @date March 27, 2008 + * @copyright (c) 2008 Jeroen Diderik(www.multiprof.nl) + * @license Creative Commons Attribution-Share Alike 3.0 Netherlands License - http://creativecommons.org/licenses/by-sa/3.0/nl/ + * @example Visit http://www.multiprof.nl/ for more informations about this library + */ + + +// **** DONT CHANGE BELOW UNLESS YOU KNOW WHAT YOU ARE DOING **** +//preset globals +var pwi_currAlbum = ""; +var pwi_currAlbumTitle = ""; +var pwi_currPhoto = ""; +var pwi_page = ""; +var pwi_si = 1; +var pwi_storage_albums; +var pwi_storage_photos; +var pwi_storage_photo; +var pwi_history = ""; + +// various functions +//get querytring (for later use to make deeplinks) +function readGet() { + var _GET = new Array(); + var uriStr = window.location.href.replace(/&/g, '&'); + var paraArr, + paraSplit; + if (uriStr.indexOf('?') > -1) { + var uriArr = uriStr.split('?'); + var paraStr = uriArr[1]; + } else { + return _GET; + } + if (paraStr.indexOf('&') > -1) { + paraArr = paraStr.split('&'); + } else { + paraArr = new Array(paraStr); + } + for (var i = 0; i < paraArr.length; i++) { + paraArr[i] = paraArr[i].indexOf('=') > -1 ? paraArr[i] : paraArr[i] + '='; + paraSplit = paraArr[i].split('='); + _GET[paraSplit[0]] = decodeURI(paraSplit[1].replace(/\+/g, ' ')); + } + return _GET; +}; +var _GET = readGet(); + +//fast string concat function ( var.push(x), var.toString() ) +function StringCat() { + var sp; + var ep; + var l = 0; + this.push = function(what) { + if (typeof(sp) == 'undefined') { + ep = new Array(); + sp = ep; + } else { + var oep = ep; + ep = new Array(); + oep[1] = ep; + } + ep[0] = what; ++l; + }; + this.toString = function() { + if (l == 0) return; + while (l > 1) { + var ptr = sp; + var nsp = new Array(); + var nep = nsp; + var nl = 0; + while (typeof(ptr) != 'undefined') { + if (typeof(nep[0]) == 'undefined') { + nep[0] = ptr[0]; ++nl; + } else { + if (typeof(ptr[0]) != 'undefined') nep[0] += ptr[0]; + nep[1] = new Array(); + nep = nep[1]; + }; + ptr = ptr[1]; + }; + sp = nsp; + ep = nep; + l = nl; + }; + return sp[0]; + }; +} + +function formatDateTime(dt) { + var today = new Date(Number(dt)); + var year = today.getYear(); + if (year < 1000) { + year += 1900 + }; + return (today.getDate() + "-" + (today.getMonth() + 1) + "-" + year + " " + today.getHours() + ":" + (today.getMinutes() < 10 ? "0" + today.getMinutes() : today.getMinutes())); +} + +var photoids = new Array(); + + +function getAlbums() { + if (pwi_storage_albums) { + show(false, pwi_storage_albums); + } else { + show(true, ''); + var url = 'http://picasaweb.google.com/data/feed/api/user/' + pwi_username + '?category=album&max-results=' + pwi_maxalbums + '&access=public&alt=json'; + $.getJSON(url, 'callback=?', albums); + } +} + +function getAlbum(albumid, newPage) { + if (albumid != pwi_currAlbum || pwi_page != newPage) { + pwi_page = newPage; + pwi_currAlbum = albumid; + pwi_si = ((pwi_page - 1) * pwi_maxresults) + 1; + var url = 'http://picasaweb.google.com/data/feed/api/user/' + pwi_username + '/albumid/' + albumid + '?category=photo&max-results=' + pwi_maxresults + '&start-index=' + pwi_si + '&alt=json'; + show(true, ''); + $.getJSON(url, 'callback=?', album); + } else { + show(false, pwi_storage_photos); + } +} + +function fromHistory(hash) { + if (hash) { + var a,p; + if (hash.indexOf("/") > 0) { + a = hash.split("/")[0]; + p = hash.split("/")[1]; + getAlbum(a, p); + } + } else { + getAlbums(); + } +} \ No newline at end of file diff --git a/components/com_morfeoshow/src/js/prototype.js b/components/com_morfeoshow/src/js/prototype.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/js/prototype.js @@ -0,0 +1,3351 @@ +var Prototype={Version:"1.6.0.2",Browser:{IE:!!(window.attachEvent&&!window.opera),Opera:!!window.opera,WebKit:navigator.userAgent.indexOf("AppleWebKit/")>-1,Gecko:navigator.userAgent.indexOf("Gecko")>-1&&navigator.userAgent.indexOf("KHTML")==-1,MobileSafari:!!navigator.userAgent.match(/Apple.*Mobile.*Safari/)},BrowserFeatures:{XPath:!!document.evaluate,ElementExtensions:!!window.HTMLElement,SpecificElementExtensions:document.createElement("div").__proto__&&document.createElement("div").__proto__!==document.createElement("form").__proto__},ScriptFragment:"]*>([\\S\\s]*?)",JSONFilter:/^\/\*-secure-([\s\S]*)\*\/\s*$/,emptyFunction:function(){ +},K:function(x){ +return x; +}}; +if(Prototype.Browser.MobileSafari){ +Prototype.BrowserFeatures.SpecificElementExtensions=false; +} +var Class={create:function(){ +var _2=null,properties=$A(arguments); +if(Object.isFunction(properties[0])){ +_2=properties.shift(); +} +function klass(){ +this.initialize.apply(this,arguments); +} +Object.extend(klass,Class.Methods); +klass.superclass=_2; +klass.subclasses=[]; +if(_2){ +var _3=function(){ +}; +_3.prototype=_2.prototype; +klass.prototype=new _3; +_2.subclasses.push(klass); +} +for(var i=0;i0){ +if(match=source.match(_35)){ +_37+=source.slice(0,match.index); +_37+=String.interpret(_36(match)); +source=source.slice(match.index+match[0].length); +}else{ +_37+=source,source=""; +} +} +return _37; +},sub:function(_38,_39,_3a){ +_39=this.gsub.prepareReplacement(_39); +_3a=Object.isUndefined(_3a)?1:_3a; +return this.gsub(_38,function(_3b){ +if(--_3a<0){ +return _3b[0]; +} +return _39(_3b); +}); +},scan:function(_3c,_3d){ +this.gsub(_3c,_3d); +return String(this); +},truncate:function(_3e,_3f){ +_3e=_3e||30; +_3f=Object.isUndefined(_3f)?"...":_3f; +return this.length>_3e?this.slice(0,_3e-_3f.length)+_3f:String(this); +},strip:function(){ +return this.replace(/^\s+/,"").replace(/\s+$/,""); +},stripTags:function(){ +return this.replace(/<\/?[^>]+>/gi,""); +},stripScripts:function(){ +return this.replace(new RegExp(Prototype.ScriptFragment,"img"),""); +},extractScripts:function(){ +var _40=new RegExp(Prototype.ScriptFragment,"img"); +var _41=new RegExp(Prototype.ScriptFragment,"im"); +return (this.match(_40)||[]).map(function(_42){ +return (_42.match(_41)||["",""])[1]; +}); +},evalScripts:function(){ +return this.extractScripts().map(function(_43){ +return eval(_43); +}); +},escapeHTML:function(){ +var _44=arguments.callee; +_44.text.data=this; +return _44.div.innerHTML; +},unescapeHTML:function(){ +var div=new Element("div"); +div.innerHTML=this.stripTags(); +return div.childNodes[0]?(div.childNodes.length>1?$A(div.childNodes).inject("",function(_46,_47){ +return _46+_47.nodeValue; +}):div.childNodes[0].nodeValue):""; +},toQueryParams:function(_48){ +var _49=this.strip().match(/([^?#]*)(#.*)?$/); +if(!_49){ +return {}; +} +return _49[1].split(_48||"&").inject({},function(_4a,_4b){ +if((_4b=_4b.split("="))[0]){ +var key=decodeURIComponent(_4b.shift()); +var _4d=_4b.length>1?_4b.join("="):_4b[0]; +if(_4d!=undefined){ +_4d=decodeURIComponent(_4d); +} +if(key in _4a){ +if(!Object.isArray(_4a[key])){ +_4a[key]=[_4a[key]]; +} +_4a[key].push(_4d); +}else{ +_4a[key]=_4d; +} +} +return _4a; +}); +},toArray:function(){ +return this.split(""); +},succ:function(){ +return this.slice(0,this.length-1)+String.fromCharCode(this.charCodeAt(this.length-1)+1); +},times:function(_4e){ +return _4e<1?"":new Array(_4e+1).join(this); +},camelize:function(){ +var _4f=this.split("-"),len=_4f.length; +if(len==1){ +return _4f[0]; +} +var _50=this.charAt(0)=="-"?_4f[0].charAt(0).toUpperCase()+_4f[0].substring(1):_4f[0]; +for(var i=1;i-1; +},startsWith:function(_5b){ +return this.indexOf(_5b)===0; +},endsWith:function(_5c){ +var d=this.length-_5c.length; +return d>=0&&this.lastIndexOf(_5c)===d; +},empty:function(){ +return this==""; +},blank:function(){ +return /^\s*$/.test(this); +},interpolate:function(_5e,_5f){ +return new Template(this,_5f).evaluate(_5e); +}}); +if(Prototype.Browser.WebKit||Prototype.Browser.IE){ +Object.extend(String.prototype,{escapeHTML:function(){ +return this.replace(/&/g,"&").replace(//g,">"); +},unescapeHTML:function(){ +return this.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"); +}}); +} +String.prototype.gsub.prepareReplacement=function(_60){ +if(Object.isFunction(_60)){ +return _60; +} +var _61=new Template(_60); +return function(_62){ +return _61.evaluate(_62); +}; +}; +String.prototype.parseQuery=String.prototype.toQueryParams; +Object.extend(String.prototype.escapeHTML,{div:document.createElement("div"),text:document.createTextNode("")}); +with(String.prototype.escapeHTML){ +div.appendChild(text); +} +var Template=Class.create({initialize:function(_63,_64){ +this.template=_63.toString(); +this.pattern=_64||Template.Pattern; +},evaluate:function(_65){ +if(Object.isFunction(_65.toTemplateReplacements)){ +_65=_65.toTemplateReplacements(); +} +return this.template.gsub(this.pattern,function(_66){ +if(_65==null){ +return ""; +} +var _67=_66[1]||""; +if(_67=="\\"){ +return _66[2]; +} +var ctx=_65,expr=_66[3]; +var _69=/^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; +_66=_69.exec(expr); +if(_66==null){ +return _67; +} +while(_66!=null){ +var _6a=_66[1].startsWith("[")?_66[2].gsub("\\\\]","]"):_66[1]; +ctx=ctx[_6a]; +if(null==ctx||""==_66[3]){ +break; +} +expr=expr.substring("["==_66[3]?_66[1].length:_66[0].length); +_66=_69.exec(expr); +} +return _67+String.interpret(ctx); +}); +}}); +Template.Pattern=/(^|.|\r|\n)(#\{(.*?)\})/; +var $break={}; +var Enumerable={each:function(_6b,_6c){ +var _6d=0; +_6b=_6b.bind(_6c); +try{ +this._each(function(_6e){ +_6b(_6e,_6d++); +}); +} +catch(e){ +if(e!=$break){ +throw e; +} +} +return this; +},eachSlice:function(_6f,_70,_71){ +_70=_70?_70.bind(_71):Prototype.K; +var _72=-_6f,slices=[],array=this.toArray(); +while((_72+=_6f)=_a2){ +_a2=_a3; +} +}); +return _a2; +},min:function(_a5,_a6){ +_a5=_a5?_a5.bind(_a6):Prototype.K; +var _a7; +this.each(function(_a8,_a9){ +_a8=_a5(_a8,_a9); +if(_a7==null||_a8<_a7){ +_a7=_a8; +} +}); +return _a7; +},partition:function(_aa,_ab){ +_aa=_aa?_aa.bind(_ab):Prototype.K; +var _ac=[],falses=[]; +this.each(function(_ad,_ae){ +(_aa(_ad,_ae)?_ac:falses).push(_ad); +}); +return [_ac,falses]; +},pluck:function(_af){ +var _b0=[]; +this.each(function(_b1){ +_b0.push(_b1[_af]); +}); +return _b0; +},reject:function(_b2,_b3){ +_b2=_b2.bind(_b3); +var _b4=[]; +this.each(function(_b5,_b6){ +if(!_b2(_b5,_b6)){ +_b4.push(_b5); +} +}); +return _b4; +},sortBy:function(_b7,_b8){ +_b7=_b7.bind(_b8); +return this.map(function(_b9,_ba){ +return {value:_b9,criteria:_b7(_b9,_ba)}; +}).sort(function(_bb,_bc){ +var a=_bb.criteria,b=_bc.criteria; +return ab?1:0; +}).pluck("value"); +},toArray:function(){ +return this.map(); +},zip:function(){ +var _be=Prototype.K,args=$A(arguments); +if(Object.isFunction(args.last())){ +_be=args.pop(); +} +var _bf=[this].concat(args).map($A); +return this.map(function(_c0,_c1){ +return _be(_bf.pluck(_c1)); +}); +},size:function(){ +return this.toArray().length; +},inspect:function(){ +return "#"; +}}; +Object.extend(Enumerable,{map:Enumerable.collect,find:Enumerable.detect,select:Enumerable.findAll,filter:Enumerable.findAll,member:Enumerable.include,entries:Enumerable.toArray,every:Enumerable.all,some:Enumerable.any}); +function $A(_c2){ +if(!_c2){ +return []; +} +if(_c2.toArray){ +return _c2.toArray(); +} +var _c3=_c2.length||0,results=new Array(_c3); +while(_c3--){ +results[_c3]=_c2[_c3]; +} +return results; +} +if(Prototype.Browser.WebKit){ +$A=function(_c4){ +if(!_c4){ +return []; +} +if(!(Object.isFunction(_c4)&&_c4=="[object NodeList]")&&_c4.toArray){ +return _c4.toArray(); +} +var _c5=_c4.length||0,results=new Array(_c5); +while(_c5--){ +results[_c5]=_c4[_c5]; +} +return results; +}; +} +Array.from=$A; +Object.extend(Array.prototype,Enumerable); +if(!Array.prototype._reverse){ +Array.prototype._reverse=Array.prototype.reverse; +} +Object.extend(Array.prototype,{_each:function(_c6){ +for(var i=0,length=this.length;i1?this:this[0]; +},uniq:function(_ce){ +return this.inject([],function(_cf,_d0,_d1){ +if(0==_d1||(_ce?_cf.last()!=_d0:!_cf.include(_d0))){ +_cf.push(_d0); +} +return _cf; +}); +},intersect:function(_d2){ +return this.uniq().findAll(function(_d3){ +return _d2.detect(function(_d4){ +return _d3===_d4; +}); +}); +},clone:function(){ +return [].concat(this); +},size:function(){ +return this.length; +},inspect:function(){ +return "["+this.map(Object.inspect).join(", ")+"]"; +},toJSON:function(){ +var _d5=[]; +this.each(function(_d6){ +var _d7=Object.toJSON(_d6); +if(!Object.isUndefined(_d7)){ +_d5.push(_d7); +} +}); +return "["+_d5.join(", ")+"]"; +}}); +if(Object.isFunction(Array.prototype.forEach)){ +Array.prototype._each=Array.prototype.forEach; +} +if(!Array.prototype.indexOf){ +Array.prototype.indexOf=function(_d8,i){ +i||(i=0); +var _da=this.length; +if(i<0){ +i=_da+i; +} +for(;i<_da;i++){ +if(this[i]===_d8){ +return i; +} +} +return -1; +}; +} +if(!Array.prototype.lastIndexOf){ +Array.prototype.lastIndexOf=function(_db,i){ +i=isNaN(i)?this.length:(i<0?this.length+i:i)+1; +var n=this.slice(0,i).reverse().indexOf(_db); +return (n<0)?n:i-n-1; +}; +} +Array.prototype.toArray=Array.prototype.clone; +function $w(_de){ +if(!Object.isString(_de)){ +return []; +} +_de=_de.strip(); +return _de?_de.split(/\s+/):[]; +} +if(Prototype.Browser.Opera){ +Array.prototype.concat=function(){ +var _df=[]; +for(var i=0,length=this.length;i"; +},toJSON:function(){ +return Object.toJSON(this.toObject()); +},clone:function(){ +return new Hash(this); +}}; +})()); +Hash.prototype.toTemplateReplacements=Hash.prototype.toObject; +Hash.from=$H; +var ObjectRange=Class.create(Enumerable,{initialize:function(_fe,end,_100){ +this.start=_fe; +this.end=end; +this.exclusive=_100; +},_each:function(_101){ +var _102=this.start; +while(this.include(_102)){ +_101(_102); +_102=_102.succ(); +} +},include:function(_103){ +if(_1031&&!((_116==4)&&this._complete)){ +this.respondToReadyState(this.transport.readyState); +} +},setRequestHeaders:function(){ +var _117={"X-Requested-With":"XMLHttpRequest","X-Prototype-Version":Prototype.Version,"Accept":"text/javascript, text/html, application/xml, text/xml, */*"}; +if(this.method=="post"){ +_117["Content-type"]=this.options.contentType+(this.options.encoding?"; charset="+this.options.encoding:""); +if(this.transport.overrideMimeType&&(navigator.userAgent.match(/Gecko\/(\d{4})/)||[0,2005])[1]<2005){ +_117["Connection"]="close"; +} +} +if(typeof this.options.requestHeaders=="object"){ +var _118=this.options.requestHeaders; +if(Object.isFunction(_118.push)){ +for(var i=0,length=_118.length;i=200&&_11c<300); +},getStatus:function(){ +try{ +return this.transport.status||0; +} +catch(e){ +return 0; +} +},respondToReadyState:function(_11d){ +var _11e=Ajax.Request.Events[_11d],response=new Ajax.Response(this); +if(_11e=="Complete"){ +try{ +this._complete=true; +(this.options["on"+response.status]||this.options["on"+(this.success()?"Success":"Failure")]||Prototype.emptyFunction)(response,response.headerJSON); +} +catch(e){ +this.dispatchException(e); +} +var _11f=response.getHeader("Content-type"); +if(this.options.evalJS=="force"||(this.options.evalJS&&this.isSameOrigin()&&_11f&&_11f.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))){ +this.evalResponse(); +} +} +try{ +(this.options["on"+_11e]||Prototype.emptyFunction)(response,response.headerJSON); +Ajax.Responders.dispatch("on"+_11e,this,response,response.headerJSON); +} +catch(e){ +this.dispatchException(e); +} +if(_11e=="Complete"){ +this.transport.onreadystatechange=Prototype.emptyFunction; +} +},isSameOrigin:function(){ +var m=this.url.match(/^\s*https?:\/\/[^\/]*/); +return !m||(m[0]=="#{protocol}//#{domain}#{port}".interpolate({protocol:location.protocol,domain:document.domain,port:location.port?":"+location.port:""})); +},getHeader:function(name){ +try{ +return this.transport.getResponseHeader(name)||null; +} +catch(e){ +return null; +} +},evalResponse:function(){ +try{ +return eval((this.transport.responseText||"").unfilterJSON()); +} +catch(e){ +this.dispatchException(e); +} +},dispatchException:function(_122){ +(this.options.onException||Prototype.emptyFunction)(this,_122); +Ajax.Responders.dispatch("onException",this,_122); +}}); +Ajax.Request.Events=["Uninitialized","Loading","Loaded","Interactive","Complete"]; +Ajax.Response=Class.create({initialize:function(_123){ +this.request=_123; +var _124=this.transport=_123.transport,readyState=this.readyState=_124.readyState; +if((readyState>2&&!Prototype.Browser.IE)||readyState==4){ +this.status=this.getStatus(); +this.statusText=this.getStatusText(); +this.responseText=String.interpret(_124.responseText); +this.headerJSON=this._getHeaderJSON(); +} +if(readyState==4){ +var xml=_124.responseXML; +this.responseXML=Object.isUndefined(xml)?null:xml; +this.responseJSON=this._getResponseJSON(); +} +},status:0,statusText:"",getStatus:Ajax.Request.prototype.getStatus,getStatusText:function(){ +try{ +return this.transport.statusText||""; +} +catch(e){ +return ""; +} +},getHeader:Ajax.Request.prototype.getHeader,getAllHeaders:function(){ +try{ +return this.getAllResponseHeaders(); +} +catch(e){ +return null; +} +},getResponseHeader:function(name){ +return this.transport.getResponseHeader(name); +},getAllResponseHeaders:function(){ +return this.transport.getAllResponseHeaders(); +},_getHeaderJSON:function(){ +var json=this.getHeader("X-JSON"); +if(!json){ +return null; +} +json=decodeURIComponent(escape(json)); +try{ +return json.evalJSON(this.request.options.sanitizeJSON||!this.request.isSameOrigin()); +} +catch(e){ +this.request.dispatchException(e); +} +},_getResponseJSON:function(){ +var _128=this.request.options; +if(!_128.evalJSON||(_128.evalJSON!="force"&&!(this.getHeader("Content-type")||"").include("application/json"))||this.responseText.blank()){ +return null; +} +try{ +return this.responseText.evalJSON(_128.sanitizeJSON||!this.request.isSameOrigin()); +} +catch(e){ +this.request.dispatchException(e); +} +}}); +Ajax.Updater=Class.create(Ajax.Request,{initialize:function(_129,_12a,url,_12c){ +this.container={success:(_12a.success||_12a),failure:(_12a.failure||(_12a.success?null:_12a))}; +_12c=Object.clone(_12c); +var _12d=_12c.onComplete; +_12c.onComplete=(function(_12e,json){ +this.updateContent(_12e.responseText); +if(Object.isFunction(_12d)){ +_12d(_12e,json); +} +}).bind(this); +_129(url,_12c); +},updateContent:function(_130){ +var _131=this.container[this.success()?"success":"failure"],options=this.options; +if(!options.evalScripts){ +_130=_130.stripScripts(); +} +if(_131=$(_131)){ +if(options.insertion){ +if(Object.isString(options.insertion)){ +var _132={}; +_132[options.insertion]=_130; +_131.insert(_132); +}else{ +options.insertion(_131,_130); +} +}else{ +_131.update(_130); +} +} +}}); +Ajax.PeriodicalUpdater=Class.create(Ajax.Base,{initialize:function(_133,_134,url,_136){ +_133(_136); +this.onComplete=this.options.onComplete; +this.frequency=(this.options.frequency||2); +this.decay=(this.options.decay||1); +this.updater={}; +this.container=_134; +this.url=url; +this.start(); +},start:function(){ +this.options.onComplete=this.updateComplete.bind(this); +this.onTimerEvent(); +},stop:function(){ +this.updater.options.onComplete=undefined; +clearTimeout(this.timer); +(this.onComplete||Prototype.emptyFunction).apply(this,arguments); +},updateComplete:function(_137){ +if(this.options.decay){ +this.decay=(_137.responseText==this.lastText?this.decay*this.options.decay:1); +this.lastText=_137.responseText; +} +this.timer=this.onTimerEvent.bind(this).delay(this.decay*this.frequency); +},onTimerEvent:function(){ +this.updater=new Ajax.Updater(this.container,this.url,this.options); +}}); +function $(_138){ +if(arguments.length>1){ +for(var i=0,elements=[],length=arguments.length;i"; +delete _141.name; +return Element.writeAttribute(document.createElement(_140),_141); +} +if(!_142[_140]){ +_142[_140]=Element.extend(document.createElement(_140)); +} +return Element.writeAttribute(_142[_140].cloneNode(false),_141); +}; +Object.extend(this.Element,_13f||{}); +}).call(window); +Element.cache={}; +Element.Methods={visible:function(_143){ +return $(_143).style.display!="none"; +},toggle:function(_144){ +_144=$(_144); +Element[Element.visible(_144)?"hide":"show"](_144); +return _144; +},hide:function(_145){ +$(_145).style.display="none"; +return _145; +},show:function(_146){ +$(_146).style.display=""; +return _146; +},remove:function(_147){ +_147=$(_147); +_147.parentNode.removeChild(_147); +return _147; +},update:function(_148,_149){ +_148=$(_148); +if(_149&&_149.toElement){ +_149=_149.toElement(); +} +if(Object.isElement(_149)){ +return _148.update().insert(_149); +} +_149=Object.toHTML(_149); +_148.innerHTML=_149.stripScripts(); +_149.evalScripts.bind(_149).defer(); +return _148; +},replace:function(_14a,_14b){ +_14a=$(_14a); +if(_14b&&_14b.toElement){ +_14b=_14b.toElement(); +}else{ +if(!Object.isElement(_14b)){ +_14b=Object.toHTML(_14b); +var _14c=_14a.ownerDocument.createRange(); +_14c.selectNode(_14a); +_14b.evalScripts.bind(_14b).defer(); +_14b=_14c.createContextualFragment(_14b.stripScripts()); +} +} +_14a.parentNode.replaceChild(_14b,_14a); +return _14a; +},insert:function(_14d,_14e){ +_14d=$(_14d); +if(Object.isString(_14e)||Object.isNumber(_14e)||Object.isElement(_14e)||(_14e&&(_14e.toElement||_14e.toHTML))){ +_14e={bottom:_14e}; +} +var _14f,insert,tagName,childNodes; +for(var _150 in _14e){ +_14f=_14e[_150]; +_150=_150.toLowerCase(); +insert=Element._insertionTranslations[_150]; +if(_14f&&_14f.toElement){ +_14f=_14f.toElement(); +} +if(Object.isElement(_14f)){ +insert(_14d,_14f); +continue; +} +_14f=Object.toHTML(_14f); +tagName=((_150=="before"||_150=="after")?_14d.parentNode:_14d).tagName.toUpperCase(); +childNodes=Element._getContentFromAnonymousElement(tagName,_14f.stripScripts()); +if(_150=="top"||_150=="after"){ +childNodes.reverse(); +} +childNodes.each(insert.curry(_14d)); +_14f.evalScripts.bind(_14f).defer(); +} +return _14d; +},wrap:function(_151,_152,_153){ +_151=$(_151); +if(Object.isElement(_152)){ +$(_152).writeAttribute(_153||{}); +}else{ +if(Object.isString(_152)){ +_152=new Element(_152,_153); +}else{ +_152=new Element("div",_152); +} +} +if(_151.parentNode){ +_151.parentNode.replaceChild(_152,_151); +} +_152.appendChild(_151); +return _152; +},inspect:function(_154){ +_154=$(_154); +var _155="<"+_154.tagName.toLowerCase(); +$H({"id":"id","className":"class"}).each(function(pair){ +var _157=pair.first(),attribute=pair.last(); +var _158=(_154[_157]||"").toString(); +if(_158){ +_155+=" "+attribute+"="+_158.inspect(true); +} +}); +return _155+">"; +},recursivelyCollect:function(_159,_15a){ +_159=$(_159); +var _15b=[]; +while(_159=_159[_15a]){ +if(_159.nodeType==1){ +_15b.push(Element.extend(_159)); +} +} +return _15b; +},ancestors:function(_15c){ +return $(_15c).recursivelyCollect("parentNode"); +},descendants:function(_15d){ +return $(_15d).select("*"); +},firstDescendant:function(_15e){ +_15e=$(_15e).firstChild; +while(_15e&&_15e.nodeType!=1){ +_15e=_15e.nextSibling; +} +return $(_15e); +},immediateDescendants:function(_15f){ +if(!(_15f=$(_15f).firstChild)){ +return []; +} +while(_15f&&_15f.nodeType!=1){ +_15f=_15f.nextSibling; +} +if(_15f){ +return [_15f].concat($(_15f).nextSiblings()); +} +return []; +},previousSiblings:function(_160){ +return $(_160).recursivelyCollect("previousSibling"); +},nextSiblings:function(_161){ +return $(_161).recursivelyCollect("nextSibling"); +},siblings:function(_162){ +_162=$(_162); +return _162.previousSiblings().reverse().concat(_162.nextSiblings()); +},match:function(_163,_164){ +if(Object.isString(_164)){ +_164=new Selector(_164); +} +return _164.match($(_163)); +},up:function(_165,_166,_167){ +_165=$(_165); +if(arguments.length==1){ +return $(_165.parentNode); +} +var _168=_165.ancestors(); +return Object.isNumber(_166)?_168[_166]:Selector.findElement(_168,_166,_167); +},down:function(_169,_16a,_16b){ +_169=$(_169); +if(arguments.length==1){ +return _169.firstDescendant(); +} +return Object.isNumber(_16a)?_169.descendants()[_16a]:_169.select(_16a)[_16b||0]; +},previous:function(_16c,_16d,_16e){ +_16c=$(_16c); +if(arguments.length==1){ +return $(Selector.handlers.previousElementSibling(_16c)); +} +var _16f=_16c.previousSiblings(); +return Object.isNumber(_16d)?_16f[_16d]:Selector.findElement(_16f,_16d,_16e); +},next:function(_170,_171,_172){ +_170=$(_170); +if(arguments.length==1){ +return $(Selector.handlers.nextElementSibling(_170)); +} +var _173=_170.nextSiblings(); +return Object.isNumber(_171)?_173[_171]:Selector.findElement(_173,_171,_172); +},select:function(){ +var args=$A(arguments),element=$(args.shift()); +return Selector.findChildElements(element,args); +},adjacent:function(){ +var args=$A(arguments),element=$(args.shift()); +return Selector.findChildElements(element.parentNode,args).without(element); +},identify:function(_176){ +_176=$(_176); +var id=_176.readAttribute("id"),self=arguments.callee; +if(id){ +return id; +} +do{ +id="anonymous_element_"+self.counter++; +}while($(id)); +_176.writeAttribute("id",id); +return id; +},readAttribute:function(_178,name){ +_178=$(_178); +if(Prototype.Browser.IE){ +var t=Element._attributeTranslations.read; +if(t.values[name]){ +return t.values[name](_178,name); +} +if(t.names[name]){ +name=t.names[name]; +} +if(name.include(":")){ +return (!_178.attributes||!_178.attributes[name])?null:_178.attributes[name].value; +} +} +return _178.getAttribute(name); +},writeAttribute:function(_17b,name,_17d){ +_17b=$(_17b); +var _17e={},t=Element._attributeTranslations.write; +if(typeof name=="object"){ +_17e=name; +}else{ +_17e[name]=Object.isUndefined(_17d)?true:_17d; +} +for(var attr in _17e){ +name=t.names[attr]||attr; +_17d=_17e[attr]; +if(t.values[attr]){ +name=t.values[attr](_17b,_17d); +} +if(_17d===false||_17d===null){ +_17b.removeAttribute(name); +}else{ +if(_17d===true){ +_17b.setAttribute(name,name); +}else{ +_17b.setAttribute(name,_17d); +} +} +} +return _17b; +},getHeight:function(_180){ +return $(_180).getDimensions().height; +},getWidth:function(_181){ +return $(_181).getDimensions().width; +},classNames:function(_182){ +return new Element.ClassNames(_182); +},hasClassName:function(_183,_184){ +if(!(_183=$(_183))){ +return; +} +var _185=_183.className; +return (_185.length>0&&(_185==_184||new RegExp("(^|\\s)"+_184+"(\\s|$)").test(_185))); +},addClassName:function(_186,_187){ +if(!(_186=$(_186))){ +return; +} +if(!_186.hasClassName(_187)){ +_186.className+=(_186.className?" ":"")+_187; +} +return _186; +},removeClassName:function(_188,_189){ +if(!(_188=$(_188))){ +return; +} +_188.className=_188.className.replace(new RegExp("(^|\\s+)"+_189+"(\\s+|$)")," ").strip(); +return _188; +},toggleClassName:function(_18a,_18b){ +if(!(_18a=$(_18a))){ +return; +} +return _18a[_18a.hasClassName(_18b)?"removeClassName":"addClassName"](_18b); +},cleanWhitespace:function(_18c){ +_18c=$(_18c); +var node=_18c.firstChild; +while(node){ +var _18e=node.nextSibling; +if(node.nodeType==3&&!/\S/.test(node.nodeValue)){ +_18c.removeChild(node); +} +node=_18e; +} +return _18c; +},empty:function(_18f){ +return $(_18f).innerHTML.blank(); +},descendantOf:function(_190,_191){ +_190=$(_190),_191=$(_191); +var _192=_191; +if(_190.compareDocumentPosition){ +return (_190.compareDocumentPosition(_191)&8)===8; +} +if(_190.sourceIndex&&!Prototype.Browser.Opera){ +var e=_190.sourceIndex,a=_191.sourceIndex,nextAncestor=_191.nextSibling; +if(!nextAncestor){ +do{ +_191=_191.parentNode; +}while(!(nextAncestor=_191.nextSibling)&&_191.parentNode); +} +if(nextAncestor&&nextAncestor.sourceIndex){ +return (e>a&&e","",1],TBODY:["","
",2],TR:["","
",3],TD:["
","
",4],SELECT:["",1]}}; +(function(){ +Object.extend(this.tags,{THEAD:this.tags.TBODY,TFOOT:this.tags.TBODY,TH:this.tags.TD}); +}).call(Element._insertionTranslations); +Element.Methods.Simulated={hasAttribute:function(_217,_218){ +_218=Element._attributeTranslations.has[_218]||_218; +var node=$(_217).getAttributeNode(_218); +return node&&node.specified; +}}; +Element.Methods.ByTag={}; +Object.extend(Element,Element.Methods); +if(!Prototype.BrowserFeatures.ElementExtensions&&document.createElement("div").__proto__){ +window.HTMLElement={}; +window.HTMLElement.prototype=document.createElement("div").__proto__; +Prototype.BrowserFeatures.ElementExtensions=true; +} +Element.extend=(function(){ +if(Prototype.BrowserFeatures.SpecificElementExtensions){ +return Prototype.K; +} +var _21a={},ByTag=Element.Methods.ByTag; +var _21b=Object.extend(function(_21c){ +if(!_21c||_21c._extendedByPrototype||_21c.nodeType!=1||_21c==window){ +return _21c; +} +var _21d=Object.clone(_21a),tagName=_21c.tagName,property,value; +if(ByTag[tagName]){ +Object.extend(_21d,ByTag[tagName]); +} +for(property in _21d){ +value=_21d[property]; +if(Object.isFunction(value)&&!(property in _21c)){ +_21c[property]=value.methodize(); +} +} +_21c._extendedByPrototype=Prototype.emptyFunction; +return _21c; +},{refresh:function(){ +if(!Prototype.BrowserFeatures.ElementExtensions){ +Object.extend(_21a,Element.Methods); +Object.extend(_21a,Element.Methods.Simulated); +} +}}); +_21b.refresh(); +return _21b; +})(); +Element.hasAttribute=function(_21e,_21f){ +if(_21e.hasAttribute){ +return _21e.hasAttribute(_21f); +} +return Element.Methods.Simulated.hasAttribute(_21e,_21f); +}; +Element.addMethods=function(_220){ +var F=Prototype.BrowserFeatures,T=Element.Methods.ByTag; +if(!_220){ +Object.extend(Form,Form.Methods); +Object.extend(Form.Element,Form.Element.Methods); +Object.extend(Element.Methods.ByTag,{"FORM":Object.clone(Form.Methods),"INPUT":Object.clone(Form.Element.Methods),"SELECT":Object.clone(Form.Element.Methods),"TEXTAREA":Object.clone(Form.Element.Methods)}); +} +if(arguments.length==2){ +var _222=_220; +_220=arguments[1]; +} +if(!_222){ +Object.extend(Element.Methods,_220||{}); +}else{ +if(Object.isArray(_222)){ +_222.each(extend); +}else{ +extend(_222); +} +} +function extend(_223){ +_223=_223.toUpperCase(); +if(!Element.Methods.ByTag[_223]){ +Element.Methods.ByTag[_223]={}; +} +Object.extend(Element.Methods.ByTag[_223],_220); +} +function copy(_224,_225,_226){ +_226=_226||false; +for(var _227 in _224){ +var _228=_224[_227]; +if(!Object.isFunction(_228)){ +continue; +} +if(!_226||!(_227 in _225)){ +_225[_227]=_228.methodize(); +} +} +} +function findDOMClass(_229){ +var _22a; +var _22b={"OPTGROUP":"OptGroup","TEXTAREA":"TextArea","P":"Paragraph","FIELDSET":"FieldSet","UL":"UList","OL":"OList","DL":"DList","DIR":"Directory","H1":"Heading","H2":"Heading","H3":"Heading","H4":"Heading","H5":"Heading","H6":"Heading","Q":"Quote","INS":"Mod","DEL":"Mod","A":"Anchor","IMG":"Image","CAPTION":"TableCaption","COL":"TableCol","COLGROUP":"TableCol","THEAD":"TableSection","TFOOT":"TableSection","TBODY":"TableSection","TR":"TableRow","TH":"TableCell","TD":"TableCell","FRAMESET":"FrameSet","IFRAME":"IFrame"}; +if(_22b[_229]){ +_22a="HTML"+_22b[_229]+"Element"; +} +if(window[_22a]){ +return window[_22a]; +} +_22a="HTML"+_229+"Element"; +if(window[_22a]){ +return window[_22a]; +} +_22a="HTML"+_229.capitalize()+"Element"; +if(window[_22a]){ +return window[_22a]; +} +window[_22a]={}; +window[_22a].prototype=document.createElement(_229).__proto__; +return window[_22a]; +} +if(F.ElementExtensions){ +copy(Element.Methods,HTMLElement.prototype); +copy(Element.Methods.Simulated,HTMLElement.prototype,true); +} +if(F.SpecificElementExtensions){ +for(var tag in Element.Methods.ByTag){ +var _22d=findDOMClass(tag); +if(Object.isUndefined(_22d)){ +continue; +} +copy(T[tag],_22d.prototype); +} +} +Object.extend(Element,Element.Methods); +delete Element.ByTag; +if(Element.extend.refresh){ +Element.extend.refresh(); +} +Element.cache={}; +}; +document.viewport={getDimensions:function(){ +var _22e={}; +var B=Prototype.Browser; +$w("width height").each(function(d){ +var D=d.capitalize(); +_22e[d]=(B.WebKit&&!document.evaluate)?self["inner"+D]:(B.Opera)?document.body["client"+D]:document.documentElement["client"+D]; +}); +return _22e; +},getWidth:function(){ +return this.getDimensions().width; +},getHeight:function(){ +return this.getDimensions().height; +},getScrollOffsets:function(){ +return Element._returnOffset(window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft,window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop); +}}; +var Selector=Class.create({initialize:function(_232){ +this.expression=_232.strip(); +this.compileMatcher(); +},shouldUseXPath:function(){ +if(!Prototype.BrowserFeatures.XPath){ +return false; +} +var e=this.expression; +if(Prototype.Browser.WebKit&&(e.include("-of-type")||e.include(":empty"))){ +return false; +} +if((/(\[[\w-]*?:|:checked)/).test(this.expression)){ +return false; +} +return true; +},compileMatcher:function(){ +if(this.shouldUseXPath()){ +return this.compileXPathMatcher(); +} +var e=this.expression,ps=Selector.patterns,h=Selector.handlers,c=Selector.criteria,le,p,m; +if(Selector._cache[e]){ +this.matcher=Selector._cache[e]; +return; +} +this.matcher=["this.matcher = function(root) {","var r = root, h = Selector.handlers, c = false, n;"]; +while(e&&le!=e&&(/\S/).test(e)){ +le=e; +for(var i in ps){ +p=ps[i]; +if(m=e.match(p)){ +this.matcher.push(Object.isFunction(c[i])?c[i](m):new Template(c[i]).evaluate(m)); +e=e.replace(m[0],""); +break; +} +} +} +this.matcher.push("return h.unique(n);\n}"); +eval(this.matcher.join("\n")); +Selector._cache[this.expression]=this.matcher; +},compileXPathMatcher:function(){ +var e=this.expression,ps=Selector.patterns,x=Selector.xpath,le,m; +if(Selector._cache[e]){ +this.xpath=Selector._cache[e]; +return; +} +this.matcher=[".//*"]; +while(e&&le!=e&&(/\S/).test(e)){ +le=e; +for(var i in ps){ +if(m=e.match(ps[i])){ +this.matcher.push(Object.isFunction(x[i])?x[i](m):new Template(x[i]).evaluate(m)); +e=e.replace(m[0],""); +break; +} +} +} +this.xpath=this.matcher.join(""); +Selector._cache[this.expression]=this.xpath; +},findElements:function(root){ +root=root||document; +if(this.xpath){ +return document._getElementsByXPath(this.xpath,root); +} +return this.matcher(root); +},match:function(_239){ +this.tokens=[]; +var e=this.expression,ps=Selector.patterns,as=Selector.assertions; +var le,p,m; +while(e&&le!==e&&(/\S/).test(e)){ +le=e; +for(var i in ps){ +p=ps[i]; +if(m=e.match(p)){ +if(as[i]){ +this.tokens.push([i,Object.clone(m)]); +e=e.replace(m[0],""); +}else{ +return this.findElements(document).include(_239); +} +} +} +} +var _23d=true,name,matches; +for(var i=0,token;token=this.tokens[i];i++){ +name=token[0],matches=token[1]; +if(!Selector.assertions[name](_239,matches)){ +_23d=false; +break; +} +} +return _23d; +},toString:function(){ +return this.expression; +},inspect:function(){ +return "#"; +}}); +Object.extend(Selector,{_cache:{},xpath:{descendant:"//*",child:"/*",adjacent:"/following-sibling::*[1]",laterSibling:"/following-sibling::*",tagName:function(m){ +if(m[1]=="*"){ +return ""; +} +return "[local-name()='"+m[1].toLowerCase()+"' or local-name()='"+m[1].toUpperCase()+"']"; +},className:"[contains(concat(' ', @class, ' '), ' #{1} ')]",id:"[@id='#{1}']",attrPresence:function(m){ +m[1]=m[1].toLowerCase(); +return new Template("[@#{1}]").evaluate(m); +},attr:function(m){ +m[1]=m[1].toLowerCase(); +m[3]=m[5]||m[6]; +return new Template(Selector.xpath.operators[m[2]]).evaluate(m); +},pseudo:function(m){ +var h=Selector.xpath.pseudos[m[1]]; +if(!h){ +return ""; +} +if(Object.isFunction(h)){ +return h(m); +} +return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m); +},operators:{"=":"[@#{1}='#{3}']","!=":"[@#{1}!='#{3}']","^=":"[starts-with(@#{1}, '#{3}')]","$=":"[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']","*=":"[contains(@#{1}, '#{3}')]","~=":"[contains(concat(' ', @#{1}, ' '), ' #{3} ')]","|=":"[contains(concat('-', @#{1}, '-'), '-#{3}-')]"},pseudos:{"first-child":"[not(preceding-sibling::*)]","last-child":"[not(following-sibling::*)]","only-child":"[not(preceding-sibling::* or following-sibling::*)]","empty":"[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]","checked":"[@checked]","disabled":"[@disabled]","enabled":"[not(@disabled)]","not":function(m){ +var e=m[6],p=Selector.patterns,x=Selector.xpath,le,v; +var _246=[]; +while(e&&le!=e&&(/\S/).test(e)){ +le=e; +for(var i in p){ +if(m=e.match(p[i])){ +v=Object.isFunction(x[i])?x[i](m):new Template(x[i]).evaluate(m); +_246.push("("+v.substring(1,v.length-1)+")"); +e=e.replace(m[0],""); +break; +} +} +} +return "[not("+_246.join(" and ")+")]"; +},"nth-child":function(m){ +return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ",m); +},"nth-last-child":function(m){ +return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ",m); +},"nth-of-type":function(m){ +return Selector.xpath.pseudos.nth("position() ",m); +},"nth-last-of-type":function(m){ +return Selector.xpath.pseudos.nth("(last() + 1 - position()) ",m); +},"first-of-type":function(m){ +m[6]="1"; +return Selector.xpath.pseudos["nth-of-type"](m); +},"last-of-type":function(m){ +m[6]="1"; +return Selector.xpath.pseudos["nth-last-of-type"](m); +},"only-of-type":function(m){ +var p=Selector.xpath.pseudos; +return p["first-of-type"](m)+p["last-of-type"](m); +},nth:function(_250,m){ +var mm,formula=m[6],predicate; +if(formula=="even"){ +formula="2n+0"; +} +if(formula=="odd"){ +formula="2n+1"; +} +if(mm=formula.match(/^(\d+)$/)){ +return "["+_250+"= "+mm[1]+"]"; +} +if(mm=formula.match(/^(-?\d*)?n(([+-])(\d+))?/)){ +if(mm[1]=="-"){ +mm[1]=-1; +} +var a=mm[1]?Number(mm[1]):1; +var b=mm[2]?Number(mm[2]):0; +predicate="[((#{fragment} - #{b}) mod #{a} = 0) and "+"((#{fragment} - #{b}) div #{a} >= 0)]"; +return new Template(predicate).evaluate({fragment:_250,a:a,b:b}); +} +}}},criteria:{tagName:"n = h.tagName(n, r, \"#{1}\", c); c = false;",className:"n = h.className(n, r, \"#{1}\", c); c = false;",id:"n = h.id(n, r, \"#{1}\", c); c = false;",attrPresence:"n = h.attrPresence(n, r, \"#{1}\", c); c = false;",attr:function(m){ +m[3]=(m[5]||m[6]); +return new Template("n = h.attr(n, r, \"#{1}\", \"#{3}\", \"#{2}\", c); c = false;").evaluate(m); +},pseudo:function(m){ +if(m[6]){ +m[6]=m[6].replace(/"/g,"\\\""); +} +return new Template("n = h.pseudo(n, \"#{1}\", \"#{6}\", r, c); c = false;").evaluate(m); +},descendant:"c = \"descendant\";",child:"c = \"child\";",adjacent:"c = \"adjacent\";",laterSibling:"c = \"laterSibling\";"},patterns:{laterSibling:/^\s*~\s*/,child:/^\s*>\s*/,adjacent:/^\s*\+\s*/,descendant:/^\s/,tagName:/^\s*(\*|[\w\-]+)(\b|$)?/,id:/^#([\w\-\*]+)(\b|$)/,className:/^\.([\w\-\*]+)(\b|$)/,pseudo:/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/,attrPresence:/^\[([\w]+)\]/,attr:/\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/},assertions:{tagName:function(_257,_258){ +return _258[1].toUpperCase()==_257.tagName.toUpperCase(); +},className:function(_259,_25a){ +return Element.hasClassName(_259,_25a[1]); +},id:function(_25b,_25c){ +return _25b.id===_25c[1]; +},attrPresence:function(_25d,_25e){ +return Element.hasAttribute(_25d,_25e[1]); +},attr:function(_25f,_260){ +var _261=Element.readAttribute(_25f,_260[1]); +return _261&&Selector.operators[_260[2]](_261,_260[5]||_260[6]); +}},handlers:{concat:function(a,b){ +for(var i=0,node;node=b[i];i++){ +a.push(node); +} +return a; +},mark:function(_265){ +var _266=Prototype.emptyFunction; +for(var i=0,node;node=_265[i];i++){ +node._countedByPrototype=_266; +} +return _265; +},unmark:function(_268){ +for(var i=0,node;node=_268[i];i++){ +node._countedByPrototype=undefined; +} +return _268; +},index:function(_26a,_26b,_26c){ +_26a._countedByPrototype=Prototype.emptyFunction; +if(_26b){ +for(var _26d=_26a.childNodes,i=_26d.length-1,j=1;i>=0;i--){ +var node=_26d[i]; +if(node.nodeType==1&&(!_26c||node._countedByPrototype)){ +node.nodeIndex=j++; +} +} +}else{ +for(var i=0,j=1,_26d=_26a.childNodes;node=_26d[i];i++){ +if(node.nodeType==1&&(!_26c||node._countedByPrototype)){ +node.nodeIndex=j++; +} +} +} +},unique:function(_270){ +if(_270.length==0){ +return _270; +} +var _271=[],n; +for(var i=0,l=_270.length;i0?[b]:[]; +} +return $R(1,_2d5).inject([],function(memo,i){ +if(0==(i-b)%a&&(i-b)/a>=0){ +memo.push(i); +} +return memo; +}); +},nth:function(_2d8,_2d9,root,_2db,_2dc){ +if(_2d8.length==0){ +return []; +} +if(_2d9=="even"){ +_2d9="2n+0"; +} +if(_2d9=="odd"){ +_2d9="2n+1"; +} +var h=Selector.handlers,results=[],indexed=[],m; +h.mark(_2d8); +for(var i=0,node;node=_2d8[i];i++){ +if(!node.parentNode._countedByPrototype){ +h.index(node.parentNode,_2db,_2dc); +indexed.push(node.parentNode); +} +} +if(_2d9.match(/^\d+$/)){ +_2d9=Number(_2d9); +for(var i=0,node;node=_2d8[i];i++){ +if(node.nodeIndex==_2d9){ +results.push(node); +} +} +}else{ +if(m=_2d9.match(/^(-?\d*)?n(([+-])(\d+))?/)){ +if(m[1]=="-"){ +m[1]=-1; +} +var a=m[1]?Number(m[1]):1; +var b=m[2]?Number(m[2]):0; +var _2e2=Selector.pseudos.getIndices(a,b,_2d8.length); +for(var i=0,node,l=_2e2.length;node=_2d8[i];i++){ +for(var j=0;j+()\s-]+|\*|\[.*?\])+)\s*(,|$)/,function(m){ +_30a.push(m[1].strip()); +}); +return _30a; +},matchElements:function(_30c,_30d){ +var _30e=$$(_30d),h=Selector.handlers; +h.mark(_30e); +for(var i=0,results=[],element;element=_30c[i];i++){ +if(element._countedByPrototype){ +results.push(element); +} +} +h.unmark(_30e); +return results; +},findElement:function(_310,_311,_312){ +if(Object.isNumber(_311)){ +_312=_311; +_311=false; +} +return Selector.matchElements(_310,_311||"*")[_312||0]; +},findChildElements:function(_313,_314){ +_314=Selector.split(_314.join(",")); +var _315=[],h=Selector.handlers; +for(var i=0,l=_314.length,selector;i1)?h.unique(_315):_315; +}}); +if(Prototype.Browser.IE){ +Object.extend(Selector.handlers,{concat:function(a,b){ +for(var i=0,node;node=b[i];i++){ +if(node.tagName!=="!"){ +a.push(node); +} +} +return a; +},unmark:function(_31a){ +for(var i=0,node;node=_31a[i];i++){ +node.removeAttribute("_countedByPrototype"); +} +return _31a; +}}); +} +function $$(){ +return Selector.findChildElements(document,$A(arguments)); +} +var Form={reset:function(form){ +$(form).reset(); +return form; +},serializeElements:function(_31d,_31e){ +if(typeof _31e!="object"){ +_31e={hash:!!_31e}; +}else{ +if(Object.isUndefined(_31e.hash)){ +_31e.hash=true; +} +} +var key,value,submitted=false,submit=_31e.submit; +var data=_31d.inject({},function(_321,_322){ +if(!_322.disabled&&_322.name){ +key=_322.name; +value=$(_322).getValue(); +if(value!=null&&(_322.type!="submit"||(!submitted&&submit!==false&&(!submit||key==submit)&&(submitted=true)))){ +if(key in _321){ +if(!Object.isArray(_321[key])){ +_321[key]=[_321[key]]; +} +_321[key].push(value); +}else{ +_321[key]=value; +} +} +} +return _321; +}); +return _31e.hash?data:Object.toQueryString(data); +}}; +Form.Methods={serialize:function(form,_324){ +return Form.serializeElements(Form.getElements(form),_324); +},getElements:function(form){ +return $A($(form).getElementsByTagName("*")).inject([],function(_326,_327){ +if(Form.Element.Serializers[_327.tagName.toLowerCase()]){ +_326.push(Element.extend(_327)); +} +return _326; +}); +},getInputs:function(form,_329,name){ +form=$(form); +var _32b=form.getElementsByTagName("input"); +if(!_329&&!name){ +return $A(_32b).map(Element.extend); +} +for(var i=0,matchingInputs=[],length=_32b.length;i=0; +}).sortBy(function(_335){ +return _335.tabIndex; +}).first(); +return _333?_333:_331.find(function(_336){ +return ["input","select","textarea"].include(_336.tagName.toLowerCase()); +}); +},focusFirstElement:function(form){ +form=$(form); +form.findFirstElement().activate(); +return form; +},request:function(form,_339){ +form=$(form),_339=Object.clone(_339||{}); +var _33a=_339.parameters,action=form.readAttribute("action")||""; +if(action.blank()){ +action=window.location.href; +} +_339.parameters=form.serialize(true); +if(_33a){ +if(Object.isString(_33a)){ +_33a=_33a.toQueryParams(); +} +Object.extend(_339.parameters,_33a); +} +if(form.hasAttribute("method")&&!_339.method){ +_339.method=form.method; +} +return new Ajax.Request(action,_339); +}}; +Form.Element={focus:function(_33b){ +$(_33b).focus(); +return _33b; +},select:function(_33c){ +$(_33c).select(); +return _33c; +}}; +Form.Element.Methods={serialize:function(_33d){ +_33d=$(_33d); +if(!_33d.disabled&&_33d.name){ +var _33e=_33d.getValue(); +if(_33e!=undefined){ +var pair={}; +pair[_33d.name]=_33e; +return Object.toQueryString(pair); +} +} +return ""; +},getValue:function(_340){ +_340=$(_340); +var _341=_340.tagName.toLowerCase(); +return Form.Element.Serializers[_341](_340); +},setValue:function(_342,_343){ +_342=$(_342); +var _344=_342.tagName.toLowerCase(); +Form.Element.Serializers[_344](_342,_343); +return _342; +},clear:function(_345){ +$(_345).value=""; +return _345; +},present:function(_346){ +return $(_346).value!=""; +},activate:function(_347){ +_347=$(_347); +try{ +_347.focus(); +if(_347.select&&(_347.tagName.toLowerCase()!="input"||!["button","reset","submit"].include(_347.type))){ +_347.select(); +} +} +catch(e){ +} +return _347; +},disable:function(_348){ +_348=$(_348); +_348.blur(); +_348.disabled=true; +return _348; +},enable:function(_349){ +_349=$(_349); +_349.disabled=false; +return _349; +}}; +var Field=Form.Element; +var $F=Form.Element.Methods.getValue; +Form.Element.Serializers={input:function(_34a,_34b){ +switch(_34a.type.toLowerCase()){ +case "checkbox": +case "radio": +return Form.Element.Serializers.inputSelector(_34a,_34b); +default: +return Form.Element.Serializers.textarea(_34a,_34b); +} +},inputSelector:function(_34c,_34d){ +if(Object.isUndefined(_34d)){ +return _34c.checked?_34c.value:null; +}else{ +_34c.checked=!!_34d; +} +},textarea:function(_34e,_34f){ +if(Object.isUndefined(_34f)){ +return _34e.value; +}else{ +_34e.value=_34f; +} +},select:function(_350,_351){ +if(Object.isUndefined(_351)){ +return this[_350.type=="select-one"?"selectOne":"selectMany"](_350); +}else{ +var opt,value,single=!Object.isArray(_351); +for(var i=0,length=_350.length;i=0?this.optionValue(_354.options[_355]):null; +},selectMany:function(_356){ +var _357,length=_356.length; +if(!length){ +return null; +} +for(var i=0,_357=[];i"); +$("__onDOMContentLoaded").onreadystatechange=function(){ +if(this.readyState=="complete"){ +this.onreadystatechange=null; +fireContentLoadedEvent(); +} +}; +} +})(); +Hash.toQueryString=Object.toQueryString; +var Toggle={display:Element.toggle}; +Element.Methods.childOf=Element.Methods.descendantOf; +var Insertion={Before:function(_3aa,_3ab){ +return Element.insert(_3aa,{before:_3ab}); +},Top:function(_3ac,_3ad){ +return Element.insert(_3ac,{top:_3ad}); +},Bottom:function(_3ae,_3af){ +return Element.insert(_3ae,{bottom:_3af}); +},After:function(_3b0,_3b1){ +return Element.insert(_3b0,{after:_3b1}); +}}; +var $continue=new Error("\"throw $continue\" is deprecated, use \"return\" instead"); +var Position={includeScrollOffsets:false,prepare:function(){ +this.deltaX=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0; +this.deltaY=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0; +},within:function(_3b2,x,y){ +if(this.includeScrollOffsets){ +return this.withinIncludingScrolloffsets(_3b2,x,y); +} +this.xcomp=x; +this.ycomp=y; +this.offset=Element.cumulativeOffset(_3b2); +return (y>=this.offset[1]&&y=this.offset[0]&&x=this.offset[1]&&this.ycomp=this.offset[0]&&this.xcomp0; +})._each(_3ce); +},set:function(_3d0){ +this.element.className=_3d0; +},add:function(_3d1){ +if(this.include(_3d1)){ +return; +} +this.set($A(this).concat(_3d1).join(" ")); +},remove:function(_3d2){ +if(!this.include(_3d2)){ +return; +} +this.set($A(this).without(_3d2).join(" ")); +},toString:function(){ +return $A(this).join(" "); +}}; +Object.extend(Element.ClassNames.prototype,Enumerable); +Element.addMethods(); + diff --git a/components/com_morfeoshow/src/js/swfobject.js b/components/com_morfeoshow/src/js/swfobject.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/js/swfobject.js @@ -0,0 +1,8 @@ +/** + * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/ + * + * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License: + * http://www.opensource.org/licenses/mit-license.php + * + */ +if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="";_19+="";var _1d=this.getParams();for(var key in _1d){_19+="";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="";}_19+="";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.majorfv.major){return true;}if(this.minorfv.minor){return true;}if(this.rev=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject; \ No newline at end of file diff --git a/components/com_morfeoshow/src/js/yui-utilities.js b/components/com_morfeoshow/src/js/yui-utilities.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/js/yui-utilities.js @@ -0,0 +1,15 @@ +/* +Copyright (c) 2007, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: http://developer.yahoo.net/yui/license.txt +version: 2.4.1 + +Note: This file includes yahoo, dom, event, and anim + +*/ +if(typeof YAHOO=="undefined"||!YAHOO){var YAHOO={};}YAHOO.namespace=function(){var A=arguments,E=null,C,B,D;for(C=0;C0)?C.dump(A[D],G-1):J);}else{I.push(A[D]);}I.push(H);}if(I.length>1){I.pop();}I.push("]");}else{I.push("{");for(D in A){if(C.hasOwnProperty(A,D)){I.push(D+E);if(C.isObject(A[D])){I.push((G>0)?C.dump(A[D],G-1):J);}else{I.push(A[D]);}I.push(H);}}if(I.length>1){I.pop();}I.push("}");}return I.join("");},substitute:function(Q,B,J){var G,F,E,M,N,P,D=YAHOO.lang,L=[],C,H="dump",K=" ",A="{",O="}";for(;;){G=Q.lastIndexOf(A);if(G<0){break;}F=Q.indexOf(O,G);if(G+1>=F){break;}C=Q.substring(G+1,F);M=C;P=null;E=M.indexOf(K);if(E>-1){P=M.substring(E+1);M=M.substring(0,E);}N=B[M];if(J){N=J(M,N,P);}if(D.isObject(N)){if(D.isArray(N)){N=D.dump(N,parseInt(P,10));}else{P=P||"";var I=P.indexOf(H);if(I>-1){P=P.substring(4);}if(N.toString===Object.prototype.toString||I>-1){N=D.dump(N,parseInt(P,10));}else{N=N.toString();}}}else{if(!D.isString(N)&&!D.isNumber(N)){N="~-"+L.length+"-~";L[L.length]=C;}}Q=Q.substring(0,G)+N+Q.substring(F+1);}for(G=L.length-1;G>=0;G=G-1){Q=Q.replace(new RegExp("~-"+G+"-~"),"{"+L[G]+"}","g");}return Q;},trim:function(A){try{return A.replace(/^\s+|\s+$/g,"");}catch(B){return A;}},merge:function(){var D={},B=arguments;for(var C=0,A=B.length;C=this.left&&A.right<=this.right&&A.top>=this.top&&A.bottom<=this.bottom);};YAHOO.util.Region.prototype.getArea=function(){return((this.bottom-this.top)*(this.right-this.left));};YAHOO.util.Region.prototype.intersect=function(E){var C=Math.max(this.top,E.top);var D=Math.min(this.right,E.right);var A=Math.min(this.bottom,E.bottom);var B=Math.max(this.left,E.left);if(A>=C&&D>=B){return new YAHOO.util.Region(C,D,A,B);}else{return null;}};YAHOO.util.Region.prototype.union=function(E){var C=Math.min(this.top,E.top);var D=Math.max(this.right,E.right);var A=Math.max(this.bottom,E.bottom);var B=Math.min(this.left,E.left);return new YAHOO.util.Region(C,D,A,B);};YAHOO.util.Region.prototype.toString=function(){return("Region {top: "+this.top+", right: "+this.right+", bottom: "+this.bottom+", left: "+this.left+"}");};YAHOO.util.Region.getRegion=function(D){var F=YAHOO.util.Dom.getXY(D);var C=F[1];var E=F[0]+D.offsetWidth;var A=F[1]+D.offsetHeight;var B=F[0];return new YAHOO.util.Region(C,E,A,B);};YAHOO.util.Point=function(A,B){if(YAHOO.lang.isArray(A)){B=A[1];A=A[0];}this.x=this.right=this.left=this[0]=A;this.y=this.top=this.bottom=this[1]=B;};YAHOO.util.Point.prototype=new YAHOO.util.Region();YAHOO.register("dom",YAHOO.util.Dom,{version:"2.4.1",build:"742"});YAHOO.util.CustomEvent=function(D,B,C,A){this.type=D;this.scope=B||window;this.silent=C;this.signature=A||YAHOO.util.CustomEvent.LIST;this.subscribers=[];if(!this.silent){}var E="_YUICEOnSubscribe";if(D!==E){this.subscribeEvent=new YAHOO.util.CustomEvent(E,this,true);}this.lastError=null;};YAHOO.util.CustomEvent.LIST=0;YAHOO.util.CustomEvent.FLAT=1;YAHOO.util.CustomEvent.prototype={subscribe:function(B,C,A){if(!B){throw new Error("Invalid callback for subscriber to '"+this.type+"'");}if(this.subscribeEvent){this.subscribeEvent.fire(B,C,A);}this.subscribers.push(new YAHOO.util.Subscriber(B,C,A));},unsubscribe:function(D,F){if(!D){return this.unsubscribeAll();}var E=false;for(var B=0,A=this.subscribers.length;B0){A=H[0];}try{F=L.fn.call(K,A,L.obj);}catch(E){this.lastError=E;}}else{try{F=L.fn.call(K,this.type,H,L.obj);}catch(G){this.lastError=G;}}if(false===F){if(!this.silent){}return false;}}}if(I){var J=[],B=this.subscribers;for(C=0,D=B.length;C=0){P=I[Q];}if(!L||!P){return false;}if(this.useLegacyEvent(L,K)){var N=this.getLegacyIndex(L,K);var M=E[N];if(M){for(O=0,R=M.length;O0);}var O=[];var Q=function(S,T){var R=S;if(T.override){if(T.override===true){R=T.obj;}else{R=T.override;}}T.fn.call(R,T.obj);};var L,K,N,M;for(L=0,K=F.length;L0){for(var Q=0,S=T.length;Q0){N=I.length;while(N){M=N-1;L=I[M];if(L){Q.removeListener(L[Q.EL],L[Q.TYPE],L[Q.FN],M);}N--;}L=null;}G=null;Q._simpleRemove(window,"unload",Q._unload);},_getScrollLeft:function(){return this._getScroll()[1];},_getScrollTop:function(){return this._getScroll()[0];},_getScroll:function(){var K=document.documentElement,L=document.body;if(K&&(K.scrollTop||K.scrollLeft)){return[K.scrollTop,K.scrollLeft];}else{if(L){return[L.scrollTop,L.scrollLeft];}else{return[0,0];}}},regCE:function(){},_simpleAdd:function(){if(window.addEventListener){return function(M,N,L,K){M.addEventListener(N,L,(K));};}else{if(window.attachEvent){return function(M,N,L,K){M.attachEvent("on"+N,L);};}else{return function(){};}}}(),_simpleRemove:function(){if(window.removeEventListener){return function(M,N,L,K){M.removeEventListener(N,L,(K));};}else{if(window.detachEvent){return function(L,M,K){L.detachEvent("on"+M,K);};}else{return function(){};}}}()};}();(function(){var A=YAHOO.util.Event;A.on=A.addListener;if(A.isIE){YAHOO.util.Event.onDOMReady(YAHOO.util.Event._tryPreloadAttach,YAHOO.util.Event,true);A._dri=setInterval(function(){var C=document.createElement("p");try{C.doScroll("left");clearInterval(A._dri);A._dri=null;A._ready();C=null;}catch(B){C=null;}},A.POLL_INTERVAL);}else{if(A.webkit){A._dri=setInterval(function(){var B=document.readyState;if("loaded"==B||"complete"==B){clearInterval(A._dri);A._dri=null;A._ready();}},A.POLL_INTERVAL);}else{A._simpleAdd(document,"DOMContentLoaded",A._ready);}}A._simpleAdd(window,"load",A._load);A._simpleAdd(window,"unload",A._unload);A._tryPreloadAttach();})();}YAHOO.util.EventProvider=function(){};YAHOO.util.EventProvider.prototype={__yui_events:null,__yui_subscribers:null,subscribe:function(A,C,F,E){this.__yui_events=this.__yui_events||{};var D=this.__yui_events[A];if(D){D.subscribe(C,F,E);}else{this.__yui_subscribers=this.__yui_subscribers||{};var B=this.__yui_subscribers;if(!B[A]){B[A]=[];}B[A].push({fn:C,obj:F,override:E});}},unsubscribe:function(C,E,G){this.__yui_events=this.__yui_events||{};var A=this.__yui_events;if(C){var F=A[C];if(F){return F.unsubscribe(E,G);}}else{var B=true;for(var D in A){if(YAHOO.lang.hasOwnProperty(A,D)){B=B&&A[D].unsubscribe(E,G);}}return B;}return false;},unsubscribeAll:function(A){return this.unsubscribe(A);},createEvent:function(G,D){this.__yui_events=this.__yui_events||{};var A=D||{};var I=this.__yui_events;if(I[G]){}else{var H=A.scope||this;var E=(A.silent);var B=new YAHOO.util.CustomEvent(G,H,E,YAHOO.util.CustomEvent.FLAT);I[G]=B;if(A.onSubscribeCallback){B.subscribeEvent.subscribe(A.onSubscribeCallback);}this.__yui_subscribers=this.__yui_subscribers||{}; +var F=this.__yui_subscribers[G];if(F){for(var C=0;C0)?C:0;}YAHOO.util.Dom.setStyle(this.getEl(),A,C+B);},getAttribute:function(A){var C=this.getEl();var E=YAHOO.util.Dom.getStyle(C,A);if(E!=="auto"&&!this.patterns.offsetUnit.test(E)){return parseFloat(E);}var B=this.patterns.offsetAttribute.exec(A)||[];var F=!!(B[3]);var D=!!(B[2]);if(D||(YAHOO.util.Dom.getStyle(C,"position")=="absolute"&&F)){E=C["offset"+B[0].charAt(0).toUpperCase()+B[0].substr(1)];}else{E=0;}return E;},getDefaultUnit:function(A){if(this.patterns.defaultUnit.test(A)){return"px";}return"";},setRuntimeAttribute:function(B){var G;var C;var D=this.attributes;this.runtimeAttributes[B]={};var F=function(H){return(typeof H!=="undefined");};if(!F(D[B]["to"])&&!F(D[B]["by"])){return false;}G=(F(D[B]["from"]))?D[B]["from"]:this.getAttribute(B);if(F(D[B]["to"])){C=D[B]["to"];}else{if(F(D[B]["by"])){if(G.constructor==Array){C=[];for(var E=0,A=G.length;E0&&isFinite(K)){if(G.currentFrame+K>=J){K=J-(I+1);}G.currentFrame+=K;}};};YAHOO.util.Bezier=new function(){this.getPosition=function(E,D){var F=E.length;var C=[];for(var B=0;B0&&!(K[0] instanceof Array)){K=[K];}else{var J=[];for(L=0,N=K.length;L0){this.runtimeAttributes[O]=this.runtimeAttributes[O].concat(K);}this.runtimeAttributes[O][this.runtimeAttributes[O].length]=H;}else{E.setRuntimeAttribute.call(this,O);}};var A=function(F,H){var G=D.Dom.getXY(this.getEl());F=[F[0]-G[0]+H[0],F[1]-G[1]+H[1]];return F;};var C=function(F){return(typeof F!=="undefined");};})();(function(){YAHOO.util.Scroll=function(E,D,F,G){if(E){YAHOO.util.Scroll.superclass.constructor.call(this,E,D,F,G);}};YAHOO.extend(YAHOO.util.Scroll,YAHOO.util.ColorAnim);var B=YAHOO.util;var C=B.Scroll.superclass;var A=B.Scroll.prototype;A.toString=function(){var D=this.getEl();var E=D.id||D.tagName;return("Scroll "+E);};A.doMethod=function(D,G,E){var F=null;if(D=="scroll"){F=[this.method(this.currentFrame,G[0],E[0]-G[0],this.totalFrames),this.method(this.currentFrame,G[1],E[1]-G[1],this.totalFrames)]; +}else{F=C.doMethod.call(this,D,G,E);}return F;};A.getAttribute=function(D){var F=null;var E=this.getEl();if(D=="scroll"){F=[E.scrollLeft,E.scrollTop];}else{F=C.getAttribute.call(this,D);}return F;};A.setAttribute=function(D,G,F){var E=this.getEl();if(D=="scroll"){E.scrollLeft=G[0];E.scrollTop=G[1];}else{C.setAttribute.call(this,D,G,F);}};})();YAHOO.register("animation",YAHOO.util.Anim,{version:"2.4.1",build:"742"}); diff --git a/components/com_morfeoshow/src/lang/index.html b/components/com_morfeoshow/src/lang/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/lang/index.html @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/components/com_morfeoshow/src/lang/shadowbox-de.js b/components/com_morfeoshow/src/lang/shadowbox-de.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/lang/shadowbox-de.js @@ -0,0 +1,68 @@ +/** + * The German (Deutsch) language file for Shadowbox. + * + * This file is part of Shadowbox. + * + * Shadowbox is an online media viewer application that supports all of the + * web's most popular media publishing formats. Shadowbox is written entirely + * in JavaScript and CSS and is highly customizable. Using Shadowbox, website + * authors can showcase a wide assortment of media in all major browsers without + * navigating users away from the linking page. + * + * Shadowbox is released under version 3.0 of the Creative Commons Attribution- + * Noncommercial-Share Alike license. This means that it is absolutely free + * for personal, noncommercial use provided that you 1) make attribution to the + * author and 2) release any derivative work under the same or a similar + * license. + * + * If you wish to use Shadowbox for commercial purposes, licensing information + * can be found at http://mjijackson.com/shadowbox/. + * + * @author Michael J. I. Jackson + * @copyright 2007-2008 Michael J. I. Jackson + * @license http://creativecommons.org/licenses/by-nc-sa/3.0/ + * @version SVN: $Id: shadowbox-de-DE.js 100 2008-06-23 02:31:30Z mjijackson $ + */ + +if(typeof Shadowbox == 'undefined'){ + throw 'Unable to load Shadowbox language file, base library not found.'; +} + +/** + * An object containing all textual messages to be used in Shadowbox. These are + * provided so they may be translated into different languages. Alternative + * translations may be found in js/lang/shadowbox-*.js where * is an abbreviation + * of the language name (see + * http://www.gnu.org/software/gettext/manual/gettext.html#Language-Codes). + * + * @var {Object} LANG + * @public + * @static + */ +Shadowbox.LANG = { + + code: 'de', + + of: 'von', + + loading: 'ladend', + + cancel: 'Abbrechen', + + next: 'Nächste', + + previous: 'Vorige', + + play: 'Abspielen', + + pause: 'Pause', + + close: 'Schließen', + + errors: { + single: 'Um den Inhalt anzeigen zu können muss die Browser-Erweiterung {1} installiert werden.', + shared: 'Um den Inhalt anzeigen zu können müssen die beiden Browser-Erweiterungen {1} und {3} installiert werden.', + either: 'Um den Inhalt anzeigen zu können muss eine der beiden Browser-Erweiterungen {1} oder {3} installiert werden.' + } + +}; diff --git a/components/com_morfeoshow/src/lang/shadowbox-en.js b/components/com_morfeoshow/src/lang/shadowbox-en.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/lang/shadowbox-en.js @@ -0,0 +1,68 @@ +/** + * The English language file for Shadowbox. + * + * This file is part of Shadowbox. + * + * Shadowbox is an online media viewer application that supports all of the + * web's most popular media publishing formats. Shadowbox is written entirely + * in JavaScript and CSS and is highly customizable. Using Shadowbox, website + * authors can showcase a wide assortment of media in all major browsers without + * navigating users away from the linking page. + * + * Shadowbox is released under version 3.0 of the Creative Commons Attribution- + * Noncommercial-Share Alike license. This means that it is absolutely free + * for personal, noncommercial use provided that you 1) make attribution to the + * author and 2) release any derivative work under the same or a similar + * license. + * + * If you wish to use Shadowbox for commercial purposes, licensing information + * can be found at http://mjijackson.com/shadowbox/. + * + * @author Michael J. I. Jackson + * @copyright 2007-2008 Michael J. I. Jackson + * @license http://creativecommons.org/licenses/by-nc-sa/3.0/ + * @version SVN: $Id: shadowbox-en.js 99 2008-05-11 16:22:43Z mjijackson $ + */ + +if(typeof Shadowbox == 'undefined'){ + throw 'Unable to load Shadowbox language file, base library not found.'; +} + +/** + * An object containing all textual messages to be used in Shadowbox. These are + * provided so they may be translated into different languages. Alternative + * translations may be found in js/lang/shadowbox-*.js where * is an abbreviation + * of the language name (see + * http://www.gnu.org/software/gettext/manual/gettext.html#Language-Codes). + * + * @var {Object} LANG + * @public + * @static + */ +Shadowbox.LANG = { + + code: 'en', + + of: 'of', + + loading: 'loading', + + cancel: 'Cancel', + + next: 'Next', + + previous: 'Previous', + + play: 'Play', + + pause: 'Pause', + + close: 'Close', + + errors: { + single: 'You must install the {1} browser plugin to view this content.', + shared: 'You must install both the {1} and {3} browser plugins to view this content.', + either: 'You must install either the {1} or the {3} browser plugin to view this content.' + } + +}; diff --git a/components/com_morfeoshow/src/lang/shadowbox-es.js b/components/com_morfeoshow/src/lang/shadowbox-es.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/lang/shadowbox-es.js @@ -0,0 +1,68 @@ +/** + * The Spanish (Español) language file for Shadowbox. + * + * This file is part of Shadowbox. + * + * Shadowbox is an online media viewer application that supports all of the + * web's most popular media publishing formats. Shadowbox is written entirely + * in JavaScript and CSS and is highly customizable. Using Shadowbox, website + * authors can showcase a wide assortment of media in all major browsers without + * navigating users away from the linking page. + * + * Shadowbox is released under version 3.0 of the Creative Commons Attribution- + * Noncommercial-Share Alike license. This means that it is absolutely free + * for personal, noncommercial use provided that you 1) make attribution to the + * author and 2) release any derivative work under the same or a similar + * license. + * + * If you wish to use Shadowbox for commercial purposes, licensing information + * can be found at http://mjijackson.com/shadowbox/. + * + * @author Michael J. I. Jackson + * @copyright 2007-2008 Michael J. I. Jackson + * @license http://creativecommons.org/licenses/by-nc-sa/3.0/ + * @version SVN: $Id: shadowbox-es.js 99 2008-05-11 16:22:43Z mjijackson $ + */ + +if(typeof Shadowbox == 'undefined'){ + throw 'Unable to load Shadowbox language file, base library not found.'; +} + +/** + * An object containing all textual messages to be used in Shadowbox. These are + * provided so they may be translated into different languages. Alternative + * translations may be found in js/lang/shadowbox-*.js where * is an abbreviation + * of the language name (see + * http://www.gnu.org/software/gettext/manual/gettext.html#Language-Codes). + * + * @var {Object} LANG + * @public + * @static + */ +Shadowbox.LANG = { + + code: 'es', + + of: 'de', + + loading: 'cargando', + + cancel: 'Cancelar', + + next: 'Siguiente', + + previous: 'Anterior', + + play: 'Reproducir', + + pause: 'Pausa', + + close: 'Cerrar', + + errors: { + single: 'Debes instalar el plugin {1} en el navegador para ver este contenido.', + shared: 'Debes instalar el {1} y el {3} en el navegador para ver este contenido.', + either: 'Debes instalar o bien el {1} o el {3} en el navegador para ver este contenido.' + } + +}; diff --git a/components/com_morfeoshow/src/lang/shadowbox-fr.js b/components/com_morfeoshow/src/lang/shadowbox-fr.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/lang/shadowbox-fr.js @@ -0,0 +1,68 @@ +/** + * The French (Français) language file for Shadowbox. + * + * This file is part of Shadowbox. + * + * Shadowbox is an online media viewer application that supports all of the + * web's most popular media publishing formats. Shadowbox is written entirely + * in JavaScript and CSS and is highly customizable. Using Shadowbox, website + * authors can showcase a wide assortment of media in all major browsers without + * navigating users away from the linking page. + * + * Shadowbox is released under version 3.0 of the Creative Commons Attribution- + * Noncommercial-Share Alike license. This means that it is absolutely free + * for personal, noncommercial use provided that you 1) make attribution to the + * author and 2) release any derivative work under the same or a similar + * license. + * + * If you wish to use Shadowbox for commercial purposes, licensing information + * can be found at http://mjijackson.com/shadowbox/. + * + * @author Michael J. I. Jackson + * @copyright 2007-2008 Michael J. I. Jackson + * @license http://creativecommons.org/licenses/by-nc-sa/3.0/ + * @version SVN: $Id: shadowbox-fr.js 99 2008-05-11 16:22:43Z mjijackson $ + */ + +if(typeof Shadowbox == 'undefined'){ + throw 'Unable to load Shadowbox language file, base library not found.'; +} + +/** + * An object containing all textual messages to be used in Shadowbox. These are + * provided so they may be translated into different languages. Alternative + * translations may be found in js/lang/shadowbox-*.js where * is an abbreviation + * of the language name (see + * http://www.gnu.org/software/gettext/manual/gettext.html#Language-Codes). + * + * @var {Object} LANG + * @public + * @static + */ +Shadowbox.LANG = { + + code: 'fr', + + of: 'de', + + loading: 'chargement', + + cancel: 'Annuler', + + next: 'Suivant', + + previous: 'Précédent', + + play: 'Lire', + + pause: 'Pause', + + close: 'Fermer', + + errors: { + single: 'Vous devez installer le plugin {1} pour afficher ce contenu.', + shared: 'Vous devez installer les plugins {1} et {3} pour afficher ce contenu.', + either: 'Vous devez installer le plugin {1} ou {3} pour afficher ce contenu.' + } + +}; diff --git a/components/com_morfeoshow/src/lang/shadowbox-it.js b/components/com_morfeoshow/src/lang/shadowbox-it.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/lang/shadowbox-it.js @@ -0,0 +1,68 @@ +/** + * The Italian (Italiano) language file for Shadowbox. + * + * This file is part of Shadowbox. + * + * Shadowbox is an online media viewer application that supports all of the + * web's most popular media publishing formats. Shadowbox is written entirely + * in JavaScript and CSS and is highly customizable. Using Shadowbox, website + * authors can showcase a wide assortment of media in all major browsers without + * navigating users away from the linking page. + * + * Shadowbox is released under version 3.0 of the Creative Commons Attribution- + * Noncommercial-Share Alike license. This means that it is absolutely free + * for personal, noncommercial use provided that you 1) make attribution to the + * author and 2) release any derivative work under the same or a similar + * license. + * + * If you wish to use Shadowbox for commercial purposes, licensing information + * can be found at http://mjijackson.com/shadowbox/. + * + * @author Michael J. I. Jackson + * @copyright 2007-2008 Michael J. I. Jackson + * @license http://creativecommons.org/licenses/by-nc-sa/3.0/ + * @version SVN: $Id: shadowbox-it.js 99 2008-05-11 16:22:43Z mjijackson $ + */ + +if(typeof Shadowbox == 'undefined'){ + throw 'Unable to load Shadowbox language file, base library not found.'; +} + +/** + * An object containing all textual messages to be used in Shadowbox. These are + * provided so they may be translated into different languages. Alternative + * translations may be found in js/lang/shadowbox-*.js where * is an abbreviation + * of the language name (see + * http://www.gnu.org/software/gettext/manual/gettext.html#Language-Codes). + * + * @var {Object} LANG + * @public + * @static + */ +Shadowbox.LANG = { + + code: 'it', + + of: 'di', + + loading: 'caricando', + + cancel: 'Cancellare', + + next: 'Prossimo', + + previous: 'Antecedente', + + play: 'Play', + + pause: 'Pausa', + + close: 'Chiudere', + + errors: { + single: 'È necessario installare il plugin {1} per poter vedere questo contenuto.', + shared: 'È necessario installare i plugin {1} e {3} per poter vedere questo contenuto.', + either: 'È necessario installare o il plugin {1} o {3} per poter vedere questo contenuto.' + } + +}; diff --git a/components/com_morfeoshow/src/lang/shadowbox-nl.js b/components/com_morfeoshow/src/lang/shadowbox-nl.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/lang/shadowbox-nl.js @@ -0,0 +1,68 @@ +/** + * The Dutch (Nederlands) language file for Shadowbox. + * + * This file is part of Shadowbox. + * + * Shadowbox is an online media viewer application that supports all of the + * web's most popular media publishing formats. Shadowbox is written entirely + * in JavaScript and CSS and is highly customizable. Using Shadowbox, website + * authors can showcase a wide assortment of media in all major browsers without + * navigating users away from the linking page. + * + * Shadowbox is released under version 3.0 of the Creative Commons Attribution- + * Noncommercial-Share Alike license. This means that it is absolutely free + * for personal, noncommercial use provided that you 1) make attribution to the + * author and 2) release any derivative work under the same or a similar + * license. + * + * If you wish to use Shadowbox for commercial purposes, licensing information + * can be found at http://mjijackson.com/shadowbox/. + * + * @author Michael J. I. Jackson + * @copyright 2007-2008 Michael J. I. Jackson + * @license http://creativecommons.org/licenses/by-nc-sa/3.0/ + * @version SVN: $Id: shadowbox-nl.js 99 2008-05-11 16:22:43Z mjijackson $ + */ + +if(typeof Shadowbox == 'undefined'){ + throw 'Unable to load Shadowbox language file, base library not found.'; +} + +/** + * An object containing all textual messages to be used in Shadowbox. These are + * provided so they may be translated into different languages. Alternative + * translations may be found in js/lang/shadowbox-*.js where * is an abbreviation + * of the language name (see + * http://www.gnu.org/software/gettext/manual/gettext.html#Language-Codes). + * + * @var {Object} LANG + * @public + * @static + */ +Shadowbox.LANG = { + + code: 'nl', + + of: 'van', + + loading: 'laden', + + cancel: 'Annuleren', + + next: 'Volgende', + + previous: 'Vorige', + + play: 'Play', + + pause: 'Pause', + + close: 'Sluiten', + + errors: { + single: 'U moet de {1} browser plugin installeren om dit media type te kunnen bekijken.', + shared: 'U moet de {1} en de {3} browser plugins installeren om dit media type te kunnen bekijken.', + either: 'U moet de {1} of de {3} browser plugin installeren om dit media type te kunnen bekijken.' + } + +}; diff --git a/components/com_morfeoshow/src/lang/shadowbox-pl.js b/components/com_morfeoshow/src/lang/shadowbox-pl.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/lang/shadowbox-pl.js @@ -0,0 +1,68 @@ +/** + * The Polish (Polski) language file for Shadowbox. + * + * This file is part of Shadowbox. + * + * Shadowbox is an online media viewer application that supports all of the + * web's most popular media publishing formats. Shadowbox is written entirely + * in JavaScript and CSS and is highly customizable. Using Shadowbox, website + * authors can showcase a wide assortment of media in all major browsers without + * navigating users away from the linking page. + * + * Shadowbox is released under version 3.0 of the Creative Commons Attribution- + * Noncommercial-Share Alike license. This means that it is absolutely free + * for personal, noncommercial use provided that you 1) make attribution to the + * author and 2) release any derivative work under the same or a similar + * license. + * + * If you wish to use Shadowbox for commercial purposes, licensing information + * can be found at http://mjijackson.com/shadowbox/. + * + * @author Michael J. I. Jackson + * @copyright 2007-2008 Michael J. I. Jackson + * @license http://creativecommons.org/licenses/by-nc-sa/3.0/ + * @version SVN: $Id: shadowbox-pl.js 99 2008-05-11 16:22:43Z mjijackson $ + */ + +if(typeof Shadowbox == 'undefined'){ + throw 'Unable to load Shadowbox language file, base library not found.'; +} + +/** + * An object containing all textual messages to be used in Shadowbox. These are + * provided so they may be translated into different languages. Alternative + * translations may be found in js/lang/shadowbox-*.js where * is an abbreviation + * of the language name (see + * http://www.gnu.org/software/gettext/manual/gettext.html#Language-Codes). + * + * @var {Object} LANG + * @public + * @static + */ +Shadowbox.LANG = { + + code: 'pl', + + of: 'z', + + loading: 'wczytywanie', + + cancel: 'Anuluj', + + next: 'Dalej', + + previous: 'Wróć', + + play: 'Odtwarzaj', + + pause: 'Pauza', + + close: 'Zamknij', + + errors: { + single: 'Musisz zainstalować plugin {1} aby zobaczyć zawartość', + shared: 'Musisz zainstalować pluginy {1} i {3} aby zobaczyć zawartość ', + either: 'Musisz zainstalować plugin {1} lub {3} aby zobaczyć zawartość' + } + +}; diff --git a/components/com_morfeoshow/src/lang/shadowbox-pt.js b/components/com_morfeoshow/src/lang/shadowbox-pt.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/lang/shadowbox-pt.js @@ -0,0 +1,68 @@ +/** + * The Portuguese (Português) language file for Shadowbox. + * + * This file is part of Shadowbox. + * + * Shadowbox is an online media viewer application that supports all of the + * web's most popular media publishing formats. Shadowbox is written entirely + * in JavaScript and CSS and is highly customizable. Using Shadowbox, website + * authors can showcase a wide assortment of media in all major browsers without + * navigating users away from the linking page. + * + * Shadowbox is released under version 3.0 of the Creative Commons Attribution- + * Noncommercial-Share Alike license. This means that it is absolutely free + * for personal, noncommercial use provided that you 1) make attribution to the + * author and 2) release any derivative work under the same or a similar + * license. + * + * If you wish to use Shadowbox for commercial purposes, licensing information + * can be found at http://mjijackson.com/shadowbox/. + * + * @author Michael J. I. Jackson + * @copyright 2007-2008 Michael J. I. Jackson + * @license http://creativecommons.org/licenses/by-nc-sa/3.0/ + * @version SVN: $Id: shadowbox-pt-PT.js 99 2008-05-11 16:22:43Z mjijackson $ + */ + +if(typeof Shadowbox == 'undefined'){ + throw 'Unable to load Shadowbox language file, base library not found.'; +} + +/** + * An object containing all textual messages to be used in Shadowbox. These are + * provided so they may be translated into different languages. Alternative + * translations may be found in js/lang/shadowbox-*.js where * is an abbreviation + * of the language name (see + * http://www.gnu.org/software/gettext/manual/gettext.html#Language-Codes). + * + * @var {Object} LANG + * @public + * @static + */ +Shadowbox.LANG = { + + code: 'pt-PT', + + of: 'de', + + loading: 'A Carregar...', + + cancel: 'Cancelar', + + next: 'Seguinte', + + previous: 'Anterior', + + play: 'Reproduzir', + + pause: 'Pausa', + + close: 'Fechar', + + errors: { + single: 'É necessário instalar o plugin {1} para visualizar este conteúdo.', + shared: 'É necessário instalar os plugins {1} e {3} para visualizar este conteúdo.', + either: 'É necessário instalar o plugin {1} ou o plugin {3} para visualizar este conteúdo.' + } + +}; diff --git a/components/com_morfeoshow/src/lang/shadowbox-ru.js b/components/com_morfeoshow/src/lang/shadowbox-ru.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/lang/shadowbox-ru.js @@ -0,0 +1,68 @@ +/** + * The Russian (русский язык) language file for Shadowbox. + * + * This file is part of Shadowbox. + * + * Shadowbox is an online media viewer application that supports all of the + * web's most popular media publishing formats. Shadowbox is written entirely + * in JavaScript and CSS and is highly customizable. Using Shadowbox, website + * authors can showcase a wide assortment of media in all major browsers without + * navigating users away from the linking page. + * + * Shadowbox is released under version 3.0 of the Creative Commons Attribution- + * Noncommercial-Share Alike license. This means that it is absolutely free + * for personal, noncommercial use provided that you 1) make attribution to the + * author and 2) release any derivative work under the same or a similar + * license. + * + * If you wish to use Shadowbox for commercial purposes, licensing information + * can be found at http://mjijackson.com/shadowbox/. + * + * @author Michael J. I. Jackson + * @copyright 2007-2008 Michael J. I. Jackson + * @license http://creativecommons.org/licenses/by-nc-sa/3.0/ + * @version SVN: $Id: shadowbox-ru.js 99 2008-05-11 16:22:43Z mjijackson $ + */ + +if(typeof Shadowbox == 'undefined'){ + throw 'Unable to load Shadowbox language file, base library not found.'; +} + +/** + * An object containing all textual messages to be used in Shadowbox. These are + * provided so they may be translated into different languages. Alternative + * translations may be found in js/lang/shadowbox-*.js where * is an abbreviation + * of the language name (see + * http://www.gnu.org/software/gettext/manual/gettext.html#Language-Codes). + * + * @var {Object} LANG + * @public + * @static + */ +Shadowbox.LANG = { + + code: 'ru', + + of: 'из', + + loading: 'загрузка', + + cancel: 'Отмена', + + next: 'Следующая', + + previous: 'Предыдущая', + + play: 'Пуск', + + pause: 'Пауза', + + close: 'Закрыть', + + errors: { + single: 'Вы должны установить для браузера плагин {1}, чтобы просмотривать этот контент.', + shared: 'Чтобы просмотреть этот контент, вы должны установить и {1}, и {3}.', + either: 'Вы должны установить или {1} плагин, или {3}, чтобы просмотреть этот контент.' + } + +}; diff --git a/components/com_morfeoshow/src/player/index.html b/components/com_morfeoshow/src/player/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/player/index.html @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/components/com_morfeoshow/src/player/shadowbox-img.js b/components/com_morfeoshow/src/player/shadowbox-img.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/player/shadowbox-img.js @@ -0,0 +1,269 @@ +/** + * The Shadowbox image player class. + * + * This file is part of Shadowbox. + * + * Shadowbox is an online media viewer application that supports all of the + * web's most popular media publishing formats. Shadowbox is written entirely + * in JavaScript and CSS and is highly customizable. Using Shadowbox, website + * authors can showcase a wide assortment of media in all major browsers without + * navigating users away from the linking page. + * + * Shadowbox is released under version 3.0 of the Creative Commons Attribution- + * Noncommercial-Share Alike license. This means that it is absolutely free + * for personal, noncommercial use provided that you 1) make attribution to the + * author and 2) release any derivative work under the same or a similar + * license. + * + * If you wish to use Shadowbox for commercial purposes, licensing information + * can be found at http://mjijackson.com/shadowbox/. + * + * @author Michael J. I. Jackson + * @copyright 2007-2008 Michael J. I. Jackson + * @license http://creativecommons.org/licenses/by-nc-sa/3.0/ + * @version SVN: $Id: shadowbox-img.js 103 2008-06-27 06:19:21Z mjijackson $ + */ + +(function(){ + + // shorthand + var SB = Shadowbox; + var SL = SB.lib; + var C = SB.getClient(); + + /** + * Keeps track of 4 floating values (x, y, start_x, & start_y) that are used + * in the drag calculations. + * + * @property {Object} drag + * @private + */ + var drag; + + /** + * Holds the draggable element so we don't have to fetch it every time + * the mouse moves. + * + * @property {HTMLElement} draggable + * @private + */ + var draggable; + + /** + * The id to use for the drag layer. + * + * @property {String} drag_id + * @private + */ + var drag_id = 'shadowbox_drag_layer'; + + /** + * Resource used to preload images. It's class-level so that when a new + * image is requested, the same resource can be reassigned, cancelling + * the original's callback. + * + * @property {HTMLElement} preloader + * @private + */ + var preloader; + + /** + * Resets the class drag variable. + * + * @return void + * @private + */ + var resetDrag = function(){ + drag = { + x: 0, + y: 0, + start_x: null, + start_y: null + }; + }; + + /** + * Toggles the drag function on and off. + * + * @param {Boolean} on True to toggle on, false to toggle off + * @param {Number} h The height of the drag layer + * @param {Number} w The width of the drag layer + * @return void + * @private + */ + var toggleDrag = function(on, h, w){ + if(on){ + resetDrag(); + // add transparent drag layer to prevent browser dragging of actual image + var styles = [ + 'position:absolute', + 'height:' + h + 'px', + 'width:' + w + 'px', + 'cursor:' + (C.isGecko ? '-moz-grab' : 'move'), + 'background-color:' + (C.isIE ? '#fff;filter:alpha(opacity=0)' : 'transparent') + ]; + SL.append(SL.get('shadowbox_body_inner'), '
'); + SL.addEvent(SL.get(drag_id), 'mousedown', listenDrag); + }else{ + var d = SL.get(drag_id); + if(d){ + SL.removeEvent(d, 'mousedown', listenDrag); + SL.remove(d); + } + } + }; + + /** + * Sets up a drag listener on the document. Called when the mouse button is + * pressed (mousedown). + * + * @param {mixed} e The mousedown event + * @return void + * @private + */ + var listenDrag = function(e){ + // prevent browser dragging + SL.preventDefault(e); + + var coords = SL.getPageXY(e); + drag.start_x = coords[0]; + drag.start_y = coords[1]; + + draggable = SL.get('shadowbox_content'); + SL.addEvent(document, 'mousemove', positionDrag); + SL.addEvent(document, 'mouseup', unlistenDrag); + if(C.isGecko) SL.setStyle(SL.get(drag_id), 'cursor', '-moz-grabbing'); + }; + + /** + * Removes the drag listener. Called when the mouse button is released + * (mouseup). + * + * @return void + * @private + */ + var unlistenDrag = function(){ + SL.removeEvent(document, 'mousemove', positionDrag); + SL.removeEvent(document, 'mouseup', unlistenDrag); // clean up + if(C.isGecko) SL.setStyle(SL.get(drag_id), 'cursor', '-moz-grab'); + }; + + /** + * Positions an oversized image on drag. + * + * @param {mixed} e The drag event + * @return void + * @private + */ + var positionDrag = function(e){ + var content = SB.getContent(); + var dims = SB.getDimensions(); + var coords = SL.getPageXY(e); + + var move_x = coords[0] - drag.start_x; + drag.start_x += move_x; + drag.x = Math.max(Math.min(0, drag.x + move_x), dims.inner_w - content.width); // x boundaries + SL.setStyle(draggable, 'left', drag.x + 'px'); + + var move_y = coords[1] - drag.start_y; + drag.start_y += move_y; + drag.y = Math.max(Math.min(0, drag.y + move_y), dims.inner_h - content.height); // y boundaries + SL.setStyle(draggable, 'top', drag.y + 'px'); + }; + + /** + * Constructor. This class is used to display images. + * + * @param {String} id The id to use for this content + * @param {Object} obj The content object + * @public + */ + Shadowbox.img = function(id, obj){ + this.id = id; + this.obj = obj; + + // images are resizable + this.resizable = true; + + // preload the image + this.ready = false; + var self = this; // needed inside preloader callback + preloader = new Image(); + preloader.onload = function(){ + // height defaults to image height + self.height = self.obj.height ? parseInt(self.obj.height, 10) : preloader.height; + + // width defaults to image width + self.width = self.obj.width ? parseInt(self.obj.width, 10) : preloader.width; + + // ready to go + self.ready = true; + + // clean up to prevent memory leak in IE + preloader.onload = ''; + preloader = null; + }; + preloader.src = obj.content; + }; + + Shadowbox.img.prototype = { + + /** + * Returns an object containing the markup for this content, suitable + * to pass to Shadowbox.lib.createHTML(). + * + * @param {Object} dims The current Shadowbox dimensions + * @return {Object} The markup for this content item + * @public + */ + markup: function(dims){ + return { + tag: 'img', + id: this.id, + height: dims.resize_h, // use resized dimensions + width: dims.resize_w, + src: this.obj.content, + style: 'position:absolute' + }; + }, + + /** + * An optional callback function to process after this content has been + * loaded. + * + * @return void + * @public + */ + onLoad: function(){ + var dims = SB.getDimensions(); + if(dims.drag && SB.getOptions().handleOversize == 'drag'){ + // listen for drag + // in the case of oversized images, the "resized" height and + // width will actually be the original image height and width + toggleDrag(true, dims.resize_h, dims.resize_w); + } + }, + + /** + * Removes this image from the document. + * + * @return void + * @public + */ + remove: function(){ + var el = SL.get(this.id); + if(el) SL.remove(el); + + // disable drag layer + toggleDrag(false); + + // prevent old image requests from loading + if(preloader){ + preloader.onload = ''; + preloader = null; + } + } + + }; + +})(); diff --git a/components/com_morfeoshow/src/polaroid.swf b/components/com_morfeoshow/src/polaroid.swf new file mode 100644 index 0000000000000000000000000000000000000000..ba27568646116446123ee2cb76e93a93879f0298 GIT binary patch literal 253196 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

D3C4B%z>>z0 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 L5JZUl5XJuhj2Zf~ diff --git a/components/com_morfeoshow/src/postcard.swf b/components/com_morfeoshow/src/postcard.swf new file mode 100644 index 0000000000000000000000000000000000000000..cac67cbdcc3fb2ea521a3bf7a9f441650aaf025d GIT binary patch literal 11186 zc$@*UD^1ixS5pWjm;eBHob7!Ha9qcAV9%dFGk;EiI0zmf30~kK3A`kl5-)%k2nifO z14yJULxY(CFw`8-%zy+W+M*6hln+L-9e9<d&Vso1ey(QY|eZ@f14z1PR@KL;?NWS7b%s`T-HcfZ%&uV24@{od=IY3BPTV-3$R zwt5XavV_6E!^X=mzx)DQ2d^$RN%{Wg?#OCJM=9+#403K$#0#mtk$M)++uDh1`SqtlDCH5%$GSsxnb=38s>jhV1_@9hV zu=`tF|MZOevzJ%zX46MpKYGTOI=?@|&TMvn;qvMRcIG+O_FUlkmtJf1ogUw}n*IE9 z9jr0@vxh#x-gPx(y1(+n$afI#d(Si+Wvf2Ue(|*Hr+eJrdct@5Je2#P@iD^xBI5rX zridDU^g2|tci07Jv*-6-?fUyh-{|?h8P^YA2SC?-=l?SF(Iss9Ki&)9@4F318UD#n zKEv+MxL#}Cbo%_hRZn}c1yDVp-HL7ftL{~^?B~xTQYdt{?>*o^A9`|ou79=^Q#3v90-5A@CM5Hx=joB!%F zk?&*SuXjYg#-{()_1(LH8fQ*9oAcef8X3^nW@X49KpKfRl=9(I)Vu>lri!|WDzD?7;^Xu6BxICmQ#y@U+%;32p1 zu8+#MkNuH+GjCw**9V-rzuv1uxDMf)jYYj3TzY`2u=(h#f3b7>_MIK)I?kRw+m%h{ z(%DQ`BAbR-J#^mxZTg?wr}RbX?*7Qo?UceAUX4|uzo>A&P*b8~Z_ zXV0*JnONVtY~mZo8ehNpiO;u;uE!a2H5B&&Pru-8hPO@^F!+mK{}bTsY~s*8Fq=u9%Gq&zQ9IiWTE4!^!P-HjZE;ryrlTZ=Z@w|slu^BJPXJt=1mev-|a%z}a0H)}A<)sA0=IkQaSTO&>AXyO>=rVCVBRcm|`vSr7985m|WF$9yP_tPo{|V*@s9 zM8Gy^u#NM=K4q|JN98WcS#m{{bJ(W3E4RxvUqXIi?k(&NHX8=c68}t>)k5f6V^x!v z#=?(*&~5|Vra{>Ike*A~Y>-)Pl%UEki?s~^Z)dOxz^PAqBgn8Xfy5r`PP6Vt6y1+| z{VqlypU^&B!`g?T7c=x?ZYXxpZP46#1QSi18+;D!c0r}>-+u5HFiQk)cUSy}J(vpw zp*T*Pj&v!NEwUHben{}MQ!L3`PXIVfTv&%DhF_e1cH*7C`d-`ne|rDDUmE=6|M{E0 zYw7xzzrXJX-~Z-ce`@pXZC?w1>Fl$E|2;pvSu9ckxk&lNBIWOaXAr0Pl3getTrMcn zx+lu83%GcCNb)qi#OUuBTWjd){cJ6t`w^P^L3XrI$QSw&`5b$ncPS>U{^P+OKsndc z03|{&65f$wJXfUU_kkuiC3ZjH??Uci`F~xL{`G|>_Veu__JnH=d&&Q8h6O%8SxV<~ z9i`NCsjI6Cntl^xM5yWeNkX{*L*&`+(sW6bWrm}%(D*8ya$`F0M2I>OkyWwxdY8K4 zb7^+uRDiwU8HMZyHr)MUG<04LLH~tk|DnH`Z69QX+x^c$L$A-8ms>)t{qcv!P~65| z`^U+X_uu*NuY2+RU%vI#AABcs&%G-%cMcd&e(s&W?3PGwHDCLOVcH@Pe1EAFA37bhJX0FO_1=mxo@2N z%x6BeFZ-!)?Q8w|D-Rg&{le~DcU=7b_da=k_}@j_XCH!ocq7AK+3t2T-@3b>I?s%U zXTRC+>gi@SK?W)b(kuzmq!XmYL6BxakmrAk1Zfcji2@rUK?0D{{@n+OATS*mYh`ym zchmCAFUnaO-s=Cxg>$by{o1p;m%E0h_7skP@n?54qj=%RPqU|^=dWM+iJ$zC887{( zP?UZ4)Oq%?$M?K8vU}5>i4%`@14gWRX*tFd-+t|XK3RPAGBf`%_^myzJs)9(cii@0 zE;G*uA6@peEBP7bi}s!SUxT|Y?e^aL)fa(O$oFl~IVqV)1hgU{FL>Q9sDM*64bNpn z(Y=DAZJeUri>Buaq^BDozOw7uv5CLA`Ds>*pvwe72Q%>*BxnPqtbXWq6dLf=46R-L z>A{1S165?@oF7+%MZUHMv0wa__rpr}0E}#4^mHmwVpR|`M9c(Y zW+P?}#FGWkAWAcnDbz0da>Y_Smq@X+{Q?xqo;uMl%WJRM!^Nq#1UyQqquI&Q%!xcS4Kc7dffvQ!Q-k>;h-8lQaDEEZ zpzPtP0_sDQ)R#-9rdcMQ8}Av-PnGCxU^11XOsU5ull|#pDV2j(-jteQ*}?dDIyXLi zHpd1?nig3xlTN03Kv#|9cYi834$aI?vr+*TgfuUciWdP2a2E3L2fm>40jLtxyy3H{ zRF0)`anJ>OV3|3~`3BmJeMkP(W@ap($>h(Z3OtD=^F0X?>BWisSt>A9N@t4fNGg*W z2l5Ciu`J3t8x=`C1Q{%(&WNg!PX*R2y{pp1!KM88I4=Z@SWJ~hMn)-vc(IaQos9X)EMbev(g9*qt44MbTM z>*EY67G%kdUbYaqc%9`wX!^8AA>@X>U~uFwv5@Rgs&Mgcz9P zgD{z}l_MkL$Uqz%+5xPFGgTG5RThN2A?!mYHCF1u4V4%<>@fnQ@lzH?=yYx>HJoQ- zWBJ0_cp(X_ke|dsKyuL-6NTjFttXQa2=PnO4QBa~JWTI&k^W>QZRv%`m`oQDA(1he zA1b9LSz;oUxTi0PySeEsvLz6J|IPNtizVXJQ!GA;(g;c&NeiK9=iUagNg|`$tQ z`Z`ib6{j*KKHc-Y@h4KnBDOr5@1Qcpj^bo0kseE@K+Vo|z)a{!<`V=$TC6NjA060p z=$$Gi#wJlACPhZtmZdwou4NOY(&P=>w&8ZY+JXej$~IUQa9t^Gv*+P9#sw};st&3H zTN+KB?KqjvC1HRntA{}zEWrFLlxCRLhMu7z;04GymWhuSX}8B{*X4@R?sJ(;3PY0G zV_8P`K$~6`pKcDZ+JOY&+zY|s)8x<_Se0zRVb+HOpB|2BYc))~5a9DH1|RK3Io9p9 zvGSsT+q-z&`1J7_CfbCVV7{V%?BNx_2G=zJ8*JFfT2a2+r4K(Z@Of4TE_w#g;$YAQ zdAL3x=xD(1=mN!u2I_Cf0qT%p1ur$C;%26q8^knB9`;3ZwgGz=s<+-SJ^itPSuesx zO!vU-5`1gW%>@xE)fhv&z!I`YsKh1!4dZ9C0yrd6S}IanRf=j!Nei)}lx>AHqsJE+WB zdak4A`Y4dn+JGdCqS3}zUU*|YL(S{%jAA#xExNgh6W!0O%`^rJpx81b_^5CZWv`)U7mOvCm6_#8?3!Px1PK&COUC_ z6fK4OJ!2dT0RN!FZh!s`C)M9a^x?rwrDJwnUFh674Wl z>ugAf3LlBJiTQny%jI2l%jKi=JoZN}B}00-In><3K4U=b_LM!|4GVzV*#fuK7ZXbY zZ_15PA>t|RriD7mi!GzC{$8B$RP;nQ!0}$YttjOVESgm=h(;_py1ZB$eGT^3Tg%PS z-uhZC2OgL&h6{vg^X3gUOVa#oRdj46fvgD4mtI(83@jBrj{W$z7;#!t|*6(!Z_xe9ZKeIecVhy}WihTE$`afpB;B@<-0Gs9i#oZq1Ubb! zlB<6i&yxsh71E@Igo4{Nagjb~Ck7~yW|m&hXf;oy9IYU29z10riTOZa&X{Jk4o$|W z|7Jz~x{SX!+S|)%hXn?SYS4|Z{if2(Nl;6p(I6D^waqq))y*gCZYP9=3Q5e(qt_VR_78+qmE%33i!A_*xGuB$^CU`HGH&6TmuMjJkYr%ta3GVHo4jE zEn=9e=u;Uv+%`Gfb(4cHJWEZZT%oK)UT05Xe-*5w1!cWEBWK#uvYDn77+pixSKVDI zb#X(njj0Od6c?L;prh7Ji^YGI<6m3ux-aYTwBp69ly0z%IkqIXX+#mJy;{p`?PA9w zFa)b&m{Ax)uGtXtZDeAeSa5#0K!a2r^~NILrp@LdGoQ5C+ays6hI@?59Lb3{~fe^h4@Md$mYwq~^OxZQRs zf(9QqNFlN}e@rNX_v3sd4CkEcnW%%?N`y3qURg}mqg7*XbG4Qo75naUO8CA@u;sh2 zK%IQIBFkg*%%*;<_-eM;3EEo0%1_l#*~2zv$$o!`kyLk1>N6xt?9^>lQ+LT!f%*a7 zX-}FxBoyHDQNDW7$AeL|>f@^SP=z}5u-M)`510YpxG-N~d&i;rdssEf|Kif=A*1$Ha&|u$b}Z;15yX#m5EeyX1_U6lZj>vhAEM1TSja{KvVa zz)NfDdpbqxd-c@!$<+5N^nS$<(u#ViBCi$mXkzWbjV-<1Z2bW@Fj{x{b}}ZDk6KTV zDbsM+HoauZw4M}i%d8I&tYJOod)~wX^zjJo9|ZUXr)ku%9R-uT`A0PQR^k>W-xg#nR!4bSB9X_>AV0=xXHg z0r66)kRF{XK?*rg59c%a0!tTfjc3xy=u~zT2%>pb9iC3z|5(*ejnSR?d?ppoRrM6+ zpdnDtREoQ)9ZvBIH(|OMjYnB2-=Bw(Jd8g2QUM^}cD%jS9B%>d!b`GGNz+S=`=YFR zH|;!THxL`(a6ua`)GgGTAX(nR9+&;?WmbgS`RwJWQ47Q60kzGs0nHQGqI&`Zi}eJy zUWq5LwO%SL!V}o4*080*i}(%5rC4dxbx6RYl6`ij*~a3hcoB*u-;&8h-=*YFwWpy<(+l zDu3LK)JhY5a`3$&dLy?g2GN2eIe5QwKbNT=y>fNUZVAA$I) zgKRQ=4v@{!8&Ny`F|4{FfVBwLst&u^w1fh+MZs^0YC7#!X|-IbR9;dASC#KpEQ00R zt4*$&W~h~1ll(d3EnX|EGHL=Dn4|%V5fS>J-7dbdzb0k_iPqHuSW^waC(^&QmWxfYUIHP2FkkNOH&QA(_N%9bt#=`E^^pFkc;<#kdYc6s8&MZE7P#X zrg8~QzY+>pBA&^lKtGvB3Vv{ZUKnI}Jb8t@|(N10e4I@um3qha`(tASc#;H8(;biuBc z>~d~cmJir2Jj;(lkKVA2IC%^^C?za+(pdjyQJsg@XQP(W-WNMCFE@H^-U}(-YZtuN zOT5?qMz$qVSD%Z#ZX)7~zi_R4qk9sG(`I2krqU5O$aQQ|kTE0>PjR6dt|i|xDHF>> z6)Qpwr*cJ@35ilFd8mMG&EcwyvC-*xMoXD0riQZld}+e2NsG{}5-nUkNVX#OvNFaJ zLucidMa7Tu9Y~SyJNU;jfTU3M#4LAK<0umfGhML5svawyKrF}N zl^Jg}QStUBW3p0MRu-Knx{oBMU)gN}xL2UJpn40b+^~9!U@qBr8hjUFH5DI?J{NsZ znI#HClX`1bZ!P#%5#~l%mI_M`m1|QF%T%4q#WGFFE3B0wxm{0QWvv#;YwShcWp(&g z)5n!sdDbd%x=M)CD2dZmZ$zAy9U_>EtnnlMi~qy5zB=bXP#0Cj}Jf2G)o+=bUhLT-d#*E7t@`-e57|7)~Ny3kd z=#9`rqaEjg-xi;5HSzfcPaWd(QoC?wyNff~(R>E&j?54$_5T(Dik7C5Vkkuz_k(U} zR}RFK+(i>ikZ;Cq6O1^fO!e_lu?8nZBTCmrK`cQLyf8$CfMzz9Ak(6fMS)f*psgcI z^{s7CS+hok9^1sptU34*gUiv-Hl<6q*={FCiDjz9GOdKrpc^YUbi5thAhD_<(qMJ$fF!{hMS@nxuBlxZ6y%;~?Y!mIsdDSNwG11T5~BKgVb^Iw z7cTCjnyUEiHpJR=T5hDVkUj0>u1h=xKq9{OXc_3oq`#Y^TI>>U>y{XK7yXQ?a(kRn zOS%nkgJO{lWnR-~n2dO7jyk}pWAMG7&9-B|aFBf?OpB*CtQOuB88Xi&_f~GC8bZU% z9u3%b_m9*8EF^)(9Z}^p1CemG6l&L$`O?;s#OSJ(y@s;4+1ZOz!j{@f*mk9atrkky z4pPEam)TRaWx8uXyM*IVDxM%c>zIKkF22H+RI#takhJjUl5FRC<6wohzcgw4-ZB*Y>XKcE08Gihr)Os#n>9cywcm zSGfI8yWTC>#b>+yky#1xD47RMZXVR}OJ@iLX?>^@axFPugE3{ecUvJLdbYawwH+Zj zOF55)VXn#@j@7WxE`0NW`TH@h#7Se`Q<&3zDAa z-pX8gW+d~u(qWpLoGuTGb;75)eq;oM?*<_=t(ua|iVD8+*DT_XYD-#+a0hBf;)2~$ z9$WTmoo9DCS8Kmq{A5D`*?O^R`fAqggSvGr0ZI+UsJ)C5e?B~HL4gV53Rv;a9yPoQfJe-B%7K{a^u8_Jee(_9B7Rd0}1!!X>qYY-w~&xq2EAIwoEuLB#_M{(|jtaedi~U z-gqb;@QtOXX$)m{jFOY~Z2-B{bV(44s5dN!o+p;_L!|;yJ43n#3HW~@mw(9I{VS9Hjydg#~Y z>VIQ3PvZ#vTMA`gm3_R0zIDE)3I7%dSlnVdA|PT;*M3NP>%yj=mOE2-*GEiqz!7iI zz)!NctVTVqAt+tMXyT~Ykv7HJv?ab-U!+>>g|ozNaM_3OmPRRz#?bM!#m2F1e=b(L zWfb9iNbT8{NA>vU6&1}`DVyFdHPKb%5WiXA3(Ht$YQ$2)SZ-ceS!KH|u&!}py`5D# zS5e^_uiDC|C?>qtNrlQLbl5xoj(Gw_L&9mh#pO=26ATXmK^IN8(T86BC5%VPD8%D} z4{#CXG1p>GS>B*FyZW|@>X)nP*Kx-xnnF-I-zEyIk5)SjvO#j?M(Lle8nND4L5odx zV>VSZW}|lXfa1GJ)W&pGYjXwCEjH54I^Z3GSNPd<-IRlKFv@#ym1#UiQNPd&Y0A4Q z%6aB$c~W{6%}RUbU$b9UxJC7%qW4`&8|>1j5zGiTy5almU?_)K5C?_--4>O4BPW2# z@kSKh2Hgq;WC{=z&9*=^Sk4IBZ8B}wTP^Dlb@oc^J1(t|#xWrk4J8#%2+{`N|D92% z2tyepdZ>&|_V9(O$sbYUF4e3}<;3iWsdn0?r5y^gQ{GYOx?M4oQs-APO#&L$wNe4) zr$T9@ucPoN0t@3lcQ+I#74seYg`{5ZaSbTDl&q}3&dT;sWi6ugb$0Cg_50f-dS#?+ zQdHQzusrIN^6dsqz6nID6`~F0h&D*Dy_I15YS+KNcKrt`5v|bK{w5*OmLg*)(PaQx zLXNX%1?*MF$3L^R|RtZ@0m& zx+|uA1hF0Bw8AkFT-!Upk|aV5k9%BI_IJ%ub+kjz?4#$6G10=vr5322dA1^NnWM~| zV6LRFkGoAHgv{j%lft9~+PbJRQ^OR$Ng7uBV`2do*=>}4qCC4nWN)YJXnA%}WN)GD zo#ojrBD;gK2ej;Ywz|#sR(DWsb?L5DWiwkl&sLY;+1DlR?3;^3+z5T~-m1}YwJ-a# zcbxp%KPG(F+AV-@dGpqr=ed2URscyAb6HvBoa9)SMx;11NTu{DL+{toyGNOkU}lnihzFaBqt#(*uOkR}JL7jf^HbULbc8?M zy$AI2xIED7f=xD5lij`YELFe?))%Ex8R)l8%&4O@qt?BV$P|7D-(2LxN<@3{m!1#2 z(SQ_=vCdORwQeWnSI}i|9PB+=e&r!1ipvqR@_ywhC=M!LD#@zGy{MoV3Z$#V`Ifssr=?t4p?rff`Wv0 zfWy>^87i~50laF=cBW)pn$WkEe^NxPDJqLj_hV;FB?-8Yucl{)aQ z&HbCI#!znR;8BmxY#vUz=>Y54)=}lc#eLfl?Ez=V=GlB9d9n}(mYK=`6@cxC{ps${ zvVcsM*R{rzqwxYeIyQzkH{JqxS+Wp6J2Vl;+Zpk-Hv=zX zp^G9ZaW$hCd%Y{9l45*DGgB$?I$nUv#e2fZKAJI+AM%40aGb)zCR2q3+9S0KM#)5| zpPeHM)Uk91R%JOM`4l|@&804!O(n34o&WqoLmhIS;hz*|QYZkdfzUQSx` z#!Pa$)1{-l0x^T>57IeB-}cS&HN#--*f(d)Sk+Ks`wG|^VawTcu6pQlHm-hiLPo8{ z06USc0534}GQjh|-zVkGts;0%4}x<rhp@b4&A?WN`#nwle4 z?Rwle`L{4r#HV@q1uSm0et7x#`ozdvQqVrCyTwkJ+9lASTa+Ek)6X-I4H67N+dbD{h3_*Oew-(>*tK^$HNwJ@};s2Feb@oc+AiWM)2c`X(C#xI& z_~!w7_E2cyAr<3UmIpmOY#phqNk{pGi^u5MTgN?(9PBs;>+9t=ve9;sQf}<6dJ^%b zn7G%mZd#onT77vwTJ2qcR(t26m7W)!CvRY$yun&|NPm)sb~Y5>SXaMq7B+P`!FwGz zICFznzy$D+MUbDSx^= zVYvELuAD*dp=YMTp}?!ps`1FF5#D9H!S&m~+Qod{pm#!P4+2ZxzCg{TfmxGviHv)r z`T?*?ou~5lJA3dkMZx!% z7qUAm)KQlZiPKd@A}mfb)_rnuY88uz+yVKaok=N;#epN^~T}{UO z;m*~m9?I@1ckMaVy>{gY)BIPQ(;iT)Q{-nttS!uUmU$;wiLNI0nclEw%#VmE(ijc% z=tok`Pg9Q2)6WpwpLbA?(o%jNyjDhj0%-=6AgL^tYTGJA=gHI!KELT z#1{-^2|s4vx}C0`ZPwfdJR)w!sg`#Eb(_tX>}#xwknJH`{?=pXxUAH?P3<{^pcj>;_YnZ&a+Icj=(@o4H0rVDBZ~nH~Rm}98LDLJXR{(Sc%M6(w(=a1G{J~(yk46WElvE4z z`*B=t{JwH60@zELrchyAR_M}3Bt~c}^Aj-wqnW7!3zie&Ps?xdHuX+e)We|ap;yl| zRBt@$&4*eV^agw4g?Tji~zhU99 z7xLxJMIJQ}_Tn^))ED$p<^oh+!M9^y42%H3(#gEoXe~X&rG6Oy6~F`*2g5IWu|kXE zhB8U4b;dG4LY-*`-<(ulIi zU`pW6kYZ+Hsz8Ovd!0(gltWb(c81luG zFJbx8Bwv=umymo3$d{me@zZbJHSjHtpU4oPpDmeiiL(g&3V8g4;tjQm<0@_cU|K-2zq_dcTye^AWj)XVU!~r$9z#PBSSgzVt zh%{T^)yyqtPbYp-vlnCJXjVp!PEwSmk)yMIBZrFDo{RjQfp{*?u+ZX+914XV$1iOa z!q6d18WVWg>si~9@%wAO_`sE0?$$EcAbGbkm)v2wr*|-8W(V`Y9?OJ1*6oaMYE&?+ z6%*SWk4*9N6thZ-yDY_Uq$nF5?elzFVMC|(c{`wX-U>Ig!lj*QD$yOIZeV7UHoX;& zOUG4CF|pTn1^L8q3DNHo)5q1z@0MQ(%i<pY%_`jLW1+cbk zJe^|)-G2$M7f-POD`sg5Eav!F&7)$ai8Q~q9Y@cqxYfj{!bzeB)Z2ad$7)xijPoCi Qm=AhY?LWr;KiVG1xZCdq(*OVf diff --git a/components/com_morfeoshow/src/shadowbox.js b/components/com_morfeoshow/src/shadowbox.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/src/shadowbox.js @@ -0,0 +1,2146 @@ +/** + * The Shadowbox class. + * + * This file is part of Shadowbox. + * + * Shadowbox is an online media viewer application that supports all of the + * web's most popular media publishing formats. Shadowbox is written entirely + * in JavaScript and CSS and is highly customizable. Using Shadowbox, website + * authors can showcase a wide assortment of media in all major browsers without + * navigating users away from the linking page. + * + * Shadowbox is released under version 3.0 of the Creative Commons Attribution- + * Noncommercial-Share Alike license. This means that it is absolutely free + * for personal, noncommercial use provided that you 1) make attribution to the + * author and 2) release any derivative work under the same or a similar + * license. + * + * If you wish to use Shadowbox for commercial purposes, licensing information + * can be found at http://mjijackson.com/shadowbox/. + * + * @author Michael J. I. Jackson + * @copyright 2007-2008 Michael J. I. Jackson + * @license http://creativecommons.org/licenses/by-nc-sa/3.0/ + * @version SVN: $Id: shadowbox.js 108 2008-07-11 04:19:01Z mjijackson $ + */ + +if(typeof Shadowbox == 'undefined'){ + throw 'Unable to load Shadowbox, no base library adapter found'; +} + +/** + * The Shadowbox class. Used to display different media on a web page using a + * Lightbox-like effect. + * + * Useful resources: + * + * - http://www.alistapart.com/articles/byebyeembed + * - http://www.w3.org/TR/html401/struct/objects.html + * - http://www.dyn-web.com/dhtml/iframes/ + * - http://www.apple.com/quicktime/player/specs.html + * - http://www.apple.com/quicktime/tutorials/embed2.html + * - http://www.howtocreate.co.uk/wrongWithIE/?chapter=navigator.plugins + * - http://msdn.microsoft.com/en-us/library/ms532969.aspx + * - http://support.microsoft.com/kb/316992 + * + * @class Shadowbox + * @author Michael J. I. Jackson + * @singleton + */ +(function(){ + + /** + * The current version of Shadowbox. + * + * @var String + * @private + */ + var version = '2.0'; + + /** + * Contains the default options for Shadowbox. + * + * @var Object + * @private + */ + var options = { + + /** + * Enable all animations besides fades. + * + * @var Boolean + */ + animate: true, + + /** + * Enable fade animations. + * + * @var Boolean + */ + animateFade: true, + + /** + * Specifies the sequence of the height and width animations. May be + * 'wh' (width then height), 'hw' (height then width), or 'sync' (both + * at the same time). Of course this will only work if animate is true. + * + * @var String + */ + animSequence: 'wh', + + /** + * The path to flvplayer.swf. + * + * @var String + */ + flvPlayer: 'flvplayer.swf', + + /** + * Listen to the overlay for clicks. If the user clicks the overlay, + * it will trigger Shadowbox.close(). + * + * @var Boolean + */ + modal: false, + + /** + * The color to use for the modal overlay (in hex). + * + * @var String + */ + overlayColor: '#000', + + /** + * The opacity to use for the modal overlay. + * + * @var Number + */ + overlayOpacity: 0.8, + + /** + * The default background color to use for Flash movies (in hex). + * + * @var String + */ + flashBgColor: '#000000', + + /** + * Automatically play movies. + * + * @var Boolean + */ + autoplayMovies: true, + + /** + * Enable movie controllers on movie players. + * + * @var Boolean + */ + showMovieControls: true, + + /** + * A delay (in seconds) to use for slideshows. If set to anything other + * than 0, this value determines an interval at which Shadowbox will + * automatically proceed to the next piece in the gallery. + * + * @var Number + */ + slideshowDelay: 0, + + /** + * The duration of the resizing animations (in seconds). + * + * @var Number + */ + resizeDuration: 0.55, + + /** + * The duration of the fading animations (in seconds). + * + * @var Number + */ + fadeDuration: 0.35, + + /** + * Show the navigation controls. + * + * @var Boolean + */ + displayNav: true, + + /** + * Enable continuous galleries. When this is true, users will be able + * to skip to the first gallery image from the last using next and vice + * versa. + * + * @var Boolean + */ + continuous: false, + + /** + * Display the gallery counter. + * + * @var Boolean + */ + displayCounter: true, + + /** + * This option may be either 'default' or 'skip'. The default counter is + * a simple '1 of 5' message. The skip counter displays a link for each + * piece in the gallery that enables a user to skip directly to any + * piece. + * + * @var String + */ + counterType: 'default', + + /** + * Limits the number of counter links that will be displayed in a "skip" + * style counter. If the actual number of gallery elements is greater + * than this value, the counter will be restrained to the elements + * immediately preceeding and following the current element. + * + * @var Number + */ + counterLimit: 10, + + /** + * The amount of padding to maintain around the viewport edge (in + * pixels). This only applies when the image is very large and takes up + * the entire viewport. + * + * @var Number + */ + viewportPadding: 20, + + /** + * How to handle content that is too large to display in its entirety + * (and is resizable). A value of 'resize' will resize the content while + * preserving aspect ratio and display it at the smaller resolution. If + * the content is an image, a value of 'drag' will display the image at + * its original resolution but it will be draggable within Shadowbox. A + * value of 'none' will display the content at its original resolution + * but it may be cropped. + * + * @var String + */ + handleOversize: 'resize', + + /** + * An exception handling function that will be called whenever + * Shadowbox should throw an exception. Will be passed the error + * message as its first argument. + * + * @var Function + */ + handleException: null, + + /** + * The mode to use when handling unsupported media. May be either + * 'remove' or 'link'. If it is 'remove', the unsupported gallery item + * will merely be removed from the gallery. If it is the only item in + * the gallery, the link will simply be followed. If it is 'link', a + * link will be provided to the appropriate plugin page in place of the + * gallery element. + * + * @var String + */ + handleUnsupported: 'link', + + /** + * The initial height of Shadowbox (in pixels). + * + * @var Number + */ + initialHeight: 160, + + /** + * The initial width of Shadowbox (in pixels). + * + * @var Number + */ + initialWidth: 320, + + /** + * Enable keyboard control. + * + * @var Boolean + */ + enableKeys: true, + + /** + * A hook function to be fired when Shadowbox opens. The single argument + * will be the current gallery element. + * + * @var Function + */ + onOpen: null, + + /** + * A hook function to be fired when Shadowbox finishes loading its + * content. The single argument will be the current gallery element on + * display. + * + * @var Function + */ + onFinish: null, + + /** + * A hook function to be fired when Shadowbox changes from one gallery + * element to the next. The single argument will be the current gallery + * element that is about to be displayed. + * + * @var Function + */ + onChange: null, + + /** + * A hook function that will be fired when Shadowbox closes. The single + * argument will be the gallery element most recently displayed. + * + * @var Function + */ + onClose: null, + + /** + * Skips calling Shadowbox.setup() in init(). This means that it must + * be called later manually. + * + * @var Boolean + */ + skipSetup: false, + + /** + * An object containing names of plugins and links to their respective + * download pages. + * + * @var Object + */ + errors: { + + fla: { + name: 'Flash', + url: 'http://www.adobe.com/products/flashplayer/' + }, + + qt: { + name: 'QuickTime', + url: 'http://www.apple.com/quicktime/download/' + }, + + wmp: { + name: 'Windows Media Player', + url: 'http://www.microsoft.com/windows/windowsmedia/' + }, + + f4m: { + name: 'Flip4Mac', + url: 'http://www.flip4mac.com/wmv_download.htm' + } + + }, + + /** + * A map of players to the file extensions they support. Each member of + * this object is the name of a player (with one exception), whose value + * is an array of file extensions that player will "play". The one + * exception to this rule is the "qtwmp" member, which contains extensions + * that may be played using either QuickTime or Windows Media Player. + * + * - img: Image file extensions + * - swf: Flash SWF file extensions + * - flv: Flash video file extensions (will be played by JW FLV player) + * - qt: Movie file extensions supported by QuickTime + * - wmp: Movie file extensions supported by Windows Media Player + * - qtwmp: Movie file extensions supported by both QuickTime and Windows Media Player + * - iframe: File extensions that will be display in an iframe + * + * IMPORTANT: If this object is to be modified, it must be copied in its + * entirety and tweaked because it is not merged recursively with the + * default. Also, any modifications must be passed into Shadowbox.init + * for speed reasons. + * + * @var Object ext + */ + ext: { + img: ['png', 'jpg', 'jpeg', 'gif', 'bmp'], + swf: ['swf'], + flv: ['flv'], + qt: ['dv', 'mov', 'moov', 'movie', 'mp4'], + wmp: ['asf', 'wm', 'wmv'], + qtwmp: ['avi', 'mpg', 'mpeg'], + iframe: ['asp', 'aspx', 'cgi', 'cfm', 'htm', 'html', 'pl', 'php', + 'php3', 'php4', 'php5', 'phtml', 'rb', 'rhtml', 'shtml', + 'txt', 'vbs'] + } + + }; + + // shorthand + var SB = Shadowbox; + var SL = SB.lib; + + /** + * Stores the default set of options in case a custom set of options is used + * on a link-by-link basis so we can restore them later. + * + * @var Object + * @private + */ + var default_options; + + /** + * An object containing some regular expressions we'll need later. Compiled + * up front for speed. + * + * @var Object + * @private + */ + var RE = { + domain: /:\/\/(.*?)[:\/]/, // domain prefix + inline: /#(.+)$/, // inline element id + rel: /^(light|shadow)box/i, // rel attribute format + gallery: /^(light|shadow)box\[(.*?)\]/i, // rel attribute format for gallery link + unsupported: /^unsupported-(\w+)/, // unsupported media type + param: /\s*([a-z_]*?)\s*=\s*(.+)\s*/, // rel string parameter + empty: /^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i // elements that don't have children + }; + + /** + * A cache of options for links that have been set up for use with + * Shadowbox. + * + * @var Array + * @private + */ + var cache = []; + + /** + * An array containing the gallery objects currently being viewed. In the + * case of non-gallery items, this will only hold one object. + * + * @var Array + * @private + */ + var gallery; + + /** + * The array index of the current gallery that is currently being viewed. + * + * @var Number + * @private + */ + var current; + + /** + * The current content object. + * + * @var Object + * @private + */ + var content; + + /** + * The id to use for content objects. + * + * @var String + * @private + */ + var content_id = 'shadowbox_content'; + + /** + * Holds the current dimensions of Shadowbox as calculated by + * setDimensions(). Contains the following properties: + * + * - height: The total height of #shadowbox + * - width: The total width of #shadowbox + * - inner_h: The height of #shadowbox_body + * - inner_w: The width of #shadowbox_body + * - top: The top to use for #shadowbox + * - resize_h: The height to use for resizable content + * - resize_w: The width to use for resizable content + * - drag: True if dragging should be enabled (oversized image) + * + * @var Object + * @private + */ + var dims; + + /** + * Keeps track of whether or not Shadowbox has been initialized. We never + * want to initialize twice. + * + * @var Boolean + * @private + */ + var initialized = false; + + /** + * Keeps track of whether or not Shadowbox is activated. + * + * @var Boolean + * @private + */ + var activated = false; + + /** + * The timeout id for the slideshow transition function. + * + * @var Number + * @private + */ + var slide_timer; + + /** + * Keeps track of the time at which the current slideshow frame was + * displayed. + * + * @var Number + * @private + */ + var slide_start; + + /** + * The delay on which the next slide will display. + * + * @var Number + * @private + */ + var slide_delay = 0; + + /** + * These parameters for simple browser detection. Adapted from Ext.js. + * + * @var Object + * @private + */ + var ua = navigator.userAgent.toLowerCase(); + var client = { + isStrict: document.compatMode == 'CSS1Compat', + isOpera: ua.indexOf('opera') > -1, + isIE: ua.indexOf('msie') > -1, + isIE7: ua.indexOf('msie 7') > -1, + isSafari: /webkit|khtml/.test(ua), + isWindows: ua.indexOf('windows') != -1 || ua.indexOf('win32') != -1, + isMac: ua.indexOf('macintosh') != -1 || ua.indexOf('mac os x') != -1, + isLinux: ua.indexOf('linux') != -1 + }; + client.isBorderBox = client.isIE && !client.isStrict; + client.isSafari3 = client.isSafari && !!(document.evaluate); + client.isGecko = ua.indexOf('gecko') != -1 && !client.isSafari; + + /** + * You're not sill using IE6 are you? + * + * @var Boolean + * @private + */ + var ltIE7 = client.isIE && !client.isIE7; + + /** + * Contains plugin support information. Each property of this object is a + * boolean indicating whether that plugin is supported. + * + * - fla: Flash player + * - qt: QuickTime player + * - wmp: Windows Media player + * - f4m: Flip4Mac plugin + * + * @var Object + * @private + */ + var plugins; + + // detect plugin support + if(navigator.plugins && navigator.plugins.length){ + var detectPlugin = function(plugin_name){ + var detected = false; + for (var i = 0, len = navigator.plugins.length; i < len; ++i){ + if(navigator.plugins[i].name.indexOf(plugin_name) > -1){ + detected = true; + break; + } + } + return detected; + }; + var f4m = detectPlugin('Flip4Mac'); + plugins = { + fla: detectPlugin('Shockwave Flash'), + qt: detectPlugin('QuickTime'), + wmp: !f4m && detectPlugin('Windows Media'), // if it's Flip4Mac, it's not really WMP + f4m: f4m + }; + }else{ + var detectPlugin = function(plugin_name){ + var detected = false; + try{ + var axo = new ActiveXObject(plugin_name); + if(axo) detected = true; + }catch(e){} + return detected; + }; + plugins = { + fla: detectPlugin('ShockwaveFlash.ShockwaveFlash'), + qt: detectPlugin('QuickTime.QuickTime'), + wmp: detectPlugin('wmplayer.ocx'), + f4m: false + }; + } + + /** + * Applies all properties of e to o. + * + * @param Object o The original object + * @param Object e The extension object + * @return Object The original object with all properties + * of the extension object applied + * @private + */ + var apply = function(o, e){ + for(var p in e) o[p] = e[p]; + return o; + }; + + /** + * Determines if the given object is an anchor/area element. + * + * @param mixed el The object to check + * @return Boolean True if the object is a link element + * @private + */ + var isLink = function(el){ + return el && typeof el.tagName == 'string' && (el.tagName.toUpperCase() == 'A' || el.tagName.toUpperCase() == 'AREA'); + }; + + /** + * Gets the height of the viewport in pixels. Note: This function includes + * scrollbars in Safari 3. + * + * @return Number The height of the viewport + * @public + * @static + */ + SL.getViewportHeight = function(){ + var h = window.innerHeight; // Safari + var mode = document.compatMode; + if((mode || client.isIE) && !client.isOpera){ + h = client.isStrict ? document.documentElement.clientHeight : document.body.clientHeight; + } + return h; + }; + + /** + * Gets the width of the viewport in pixels. Note: This function includes + * scrollbars in Safari 3. + * + * @return Number The width of the viewport + * @public + * @static + */ + SL.getViewportWidth = function(){ + var w = window.innerWidth; // Safari + var mode = document.compatMode; + if(mode || client.isIE){ + w = client.isStrict ? document.documentElement.clientWidth : document.body.clientWidth; + } + return w; + }; + + /** + * Creates an HTML string from an object representing HTML elements. Based + * on Ext.DomHelper's createHtml. + * + * @param Object obj The HTML definition object + * @return String An HTML string + * @public + * @static + */ + SL.createHTML = function(obj){ + var html = '<' + obj.tag; + for(var attr in obj){ + if(attr == 'tag' || attr == 'html' || attr == 'children') continue; + if(attr == 'cls'){ + html += ' class="' + obj['cls'] + '"'; + }else{ + html += ' ' + attr + '="' + obj[attr] + '"'; + } + } + if(RE.empty.test(obj.tag)){ + html += '/>'; + }else{ + html += '>'; + var cn = obj.children; + if(cn){ + for(var i = 0, len = cn.length; i < len; ++i){ + html += this.createHTML(cn[i]); + } + } + if(obj.html) html += obj.html; + html += ''; + } + return html; + }; + + /** + * Easing function used for animations. Based on a cubic polynomial. + * + * @param Number x The state of the animation (% complete) + * @return Number The adjusted easing value + * @private + * @static + */ + var ease = function(x){ + return 1 + Math.pow(x - 1, 3); + }; + + /** + * Animates any numeric (not color) style of the given element from its + * current state to the given value. Defaults to using pixel-based + * measurements. + * + * @param HTMLElement el The DOM element to animate + * @param String p The property to animate (in camelCase) + * @param mixed to The value to animate to + * @param Number d The duration of the animation (in + * seconds) + * @param Function cb A callback function to call when the + * animation completes + * @return void + * @private + * @static + */ + var animate = function(el, p, to, d, cb){ + var from = parseFloat(SL.getStyle(el, p)); + if(isNaN(from)) from = 0; + + if(from == to){ + if(typeof cb == 'function') cb(); + return; // nothing to animate + } + + var delta = to - from; + var op = p == 'opacity'; + var unit = op ? '' : 'px'; // default unit is px + var fn = function(ease){ + SL.setStyle(el, p, from + ease * delta + unit); + }; + + // cancel the animation here if set in the options + if(!options.animate && !op || op && !options.animateFade){ + fn(1); + if(typeof cb == 'function') cb(); + return; + } + + d *= 1000; // convert to milliseconds + var begin = new Date().getTime(); + var end = begin + d; + + var timer = setInterval(function(){ + var time = new Date().getTime(); + if(time >= end){ // end of animation + clearInterval(timer); + fn(1); + if(typeof cb == 'function') cb(); + }else{ + fn(ease((time - begin) / d)); + } + }, 10); // 10 ms interval is minimum on WebKit + }; + + /** + * A utility function used by the fade functions to clear the opacity + * style setting of the given element. Required in some cases for IE. + * + * @param HTMLElement el The DOM element + * @return void + * @private + */ + var clearOpacity = function(el){ + var s = el.style; + if(client.isIE){ + if(typeof s.filter == 'string' && (/alpha/i).test(s.filter)){ + // careful not to overwrite other filters! + s.filter = s.filter.replace(/[\w\.]*alpha\(.*?\);?/i, ''); + } + }else{ + s.opacity = ''; + s['-moz-opacity'] = ''; + s['-khtml-opacity'] = ''; + } + }; + + /** + * Gets the computed height of the given element, including padding and + * borders. + * + * @param HTMLElement el The element + * @return Number The computed height of the element + * @private + */ + var getComputedHeight = function(el){ + var h = Math.max(el.offsetHeight, el.clientHeight); + if(!h){ + h = parseInt(SL.getStyle(el, 'height'), 10) || 0; + if(!client.isBorderBox){ + h += parseInt(SL.getStyle(el, 'padding-top'), 10) + + parseInt(SL.getStyle(el, 'padding-bottom'), 10) + + parseInt(SL.getStyle(el, 'border-top-width'), 10) + + parseInt(SL.getStyle(el, 'border-bottom-width'), 10); + } + } + return h; + }; + + /** + * Determines the player needed to display the file at the given URL. If + * the file type is not supported, the return value will be 'unsupported'. + * If the file type is not supported but the correct player can be + * determined, the return value will be 'unsupported-*' where * will be the + * player abbreviation (e.g. 'qt' = QuickTime). + * + * @param String url The url of the file + * @return String The name of the player to use + * @private + */ + var getPlayer = function(url){ + var m = url.match(RE.domain); + var d = m && document.domain == m[1]; // same domain + if(url.indexOf('#') > -1 && d) return 'inline'; + var q = url.indexOf('?'); + if(q > -1) url = url.substring(0, q); // strip query string for player detection purposes + if(RE.img.test(url)) return 'img'; + if(RE.swf.test(url)) return plugins.fla ? 'swf' : 'unsupported-swf'; + if(RE.flv.test(url)) return plugins.fla ? 'flv' : 'unsupported-flv'; + if(RE.qt.test(url)) return plugins.qt ? 'qt' : 'unsupported-qt'; + if(RE.wmp.test(url)){ + if(plugins.wmp) return 'wmp'; + if(plugins.f4m) return 'qt'; + if(client.isMac) return plugins.qt ? 'unsupported-f4m' : 'unsupported-qtf4m'; + return 'unsupported-wmp'; + }else if(RE.qtwmp.test(url)){ + if(plugins.qt) return 'qt'; + if(plugins.wmp) return 'wmp'; + return client.isMac ? 'unsupported-qt' : 'unsupported-qtwmp'; + }else if(!d || RE.iframe.test(url)){ + return 'iframe'; + } + return 'unsupported'; // same domain, not supported + }; + + /** + * Handles all clicks on links that have been set up to work with Shadowbox + * and cancels the default event behavior when appropriate. + * + * @param {Event} ev The click event object + * @return void + * @private + */ + var handleClick = function(ev){ + // get anchor/area element + var link; + if(isLink(this)){ + link = this; // jQuery, Prototype, YUI + }else{ + link = SL.getTarget(ev); // Ext, standalone + while(!isLink(link) && link.parentNode){ + link = link.parentNode; + } + } + + //SL.preventDefault(ev); // good for debugging + + if(link){ + SB.open(link); + if(gallery.length) SL.preventDefault(ev); // stop event + } + }; + + /** + * Toggles the display of the nav control with the given id on and off. + * + * @param String id The id of the navigation control + * @param Boolean on True to toggle on, false to toggle off + * @return void + * @private + */ + var toggleNav = function(id, on){ + var el = SL.get('shadowbox_nav_' + id); + if(el) el.style.display = on ? '' : 'none'; + }; + + /** + * Builds the content for the title and information bars. + * + * @param Function cb A callback function to execute after the + * bars are built + * @return void + * @private + */ + var buildBars = function(cb){ + var obj = gallery[current]; + var title_i = SL.get('shadowbox_title_inner'); + + // build the title + title_i.innerHTML = obj.title || ''; + + // build the nav + var nav = SL.get('shadowbox_nav'); + if(nav){ + var c, n, pl, pa, p; + + // need to build the nav? + if(options.displayNav){ + c = true; + // next & previous links + var len = gallery.length; + if(len > 1){ + if(options.continuous){ + n = p = true; // show both + }else{ + n = (len - 1) > current; // not last in gallery, show next + p = current > 0; // not first in gallery, show previous + } + } + // in a slideshow? + if(options.slideshowDelay > 0 && hasNext()){ + pa = slide_timer != 'paused'; + pl = !pa; + } + }else{ + c = n = pl = pa = p = false; + } + + toggleNav('close', c); + toggleNav('next', n); + toggleNav('play', pl); + toggleNav('pause', pa); + toggleNav('previous', p); + } + + // build the counter + var counter = SL.get('shadowbox_counter'); + if(counter){ + var co = ''; + + // need to build the counter? + if(options.displayCounter && gallery.length > 1){ + if(options.counterType == 'skip'){ + // limit the counter? + var i = 0, len = gallery.length, end = len; + var limit = parseInt(options.counterLimit); + if(limit < len){ // support large galleries + var h = Math.round(limit / 2); + i = current - h; + if(i < 0) i += len; + end = current + (limit - h); + if(end > len) end -= len; + } + while(i != end){ + if(i == len) i = 0; + co += ''; + } + }else{ // default + co = (current + 1) + ' ' + SB.LANG.of + ' ' + len; + } + } + + counter.innerHTML = co; + } + + cb(); + }; + + /** + * Hides the title and info bars. + * + * @param Boolean anim True to animate the transition + * @param Function cb A callback function to execute after the + * animation completes + * @return void + * @private + */ + var hideBars = function(anim, cb){ + var obj = gallery[current]; + var title = SL.get('shadowbox_title'); + var info = SL.get('shadowbox_info'); + var title_i = SL.get('shadowbox_title_inner'); + var info_i = SL.get('shadowbox_info_inner'); + + // build bars after they are hidden + var fn = function(){ + buildBars(cb); + }; + + var title_h = getComputedHeight(title); + var info_h = getComputedHeight(info) * -1; + if(anim){ + // animate the transition + animate(title_i, 'margin-top', title_h, 0.35); + animate(info_i, 'margin-top', info_h, 0.35, fn); + }else{ + SL.setStyle(title_i, 'margin-top', title_h + 'px'); + SL.setStyle(info_i, 'margin-top', info_h + 'px'); + fn(); + } + }; + + /** + * Shows the title and info bars. + * + * @param Function cb A callback function to execute after the + * animation completes + * @return void + * @private + */ + var showBars = function(cb){ + var title_i = SL.get('shadowbox_title_inner'); + var info_i = SL.get('shadowbox_info_inner'); + var t = title_i.innerHTML != ''; // is there a title to display? + + if(t) animate(title_i, 'margin-top', 0, 0.35); + animate(info_i, 'margin-top', 0, 0.35, cb); + }; + + /** + * Loads the Shadowbox with the current piece. + * + * @return void + * @private + */ + var loadContent = function(){ + var obj = gallery[current]; + if(!obj) return; // invalid + + var changing = false; + if(content){ + content.remove(); // remove old content first + changing = true; // changing from some previous content + } + + // determine player, inline is really just HTML + var p = obj.player == 'inline' ? 'html' : obj.player; + + // make sure player is loaded + if(typeof SB[p] != 'function'){ + SB.raise('Unknown player ' + obj.player); + } + content = new SB[p](content_id, obj); // instantiate new content object + + listenKeys(false); // disable the keyboard temporarily + toggleLoading(true); + + hideBars(changing, function(){ // if changing, animate the bars transition + if(!content) return; + + // if opening, clear #shadowbox display + if(!changing){ + SL.get('shadowbox').style.display = ''; + } + + var fn = function(){ + resizeContent(function(){ + if(!content) return; + + + showBars(function(){ + if(!content) return; + + // append content just before hiding the loading layer + SL.get('shadowbox_body_inner').innerHTML = SL.createHTML(content.markup(dims)); + + toggleLoading(false, function(){ + if(!content) return; + + if(typeof content.onLoad == 'function'){ + content.onLoad(); // call onLoad callback if present + } + if(options.onFinish && typeof options.onFinish == 'function'){ + options.onFinish(gallery[current]); // fire onFinish handler + } + if(slide_timer != 'paused'){ + SB.play(); // kick off next slide + } + listenKeys(true); // re-enable the keyboard + }); + }); + }); + }; + + if(typeof content.ready != 'undefined'){ // does the object have a ready property? + var id = setInterval(function(){ // if so, wait for the object to be ready + if(content){ + if(content.ready){ + clearInterval(id); // clean up + id = null; + fn(); + } + }else{ // content has been removed + clearInterval(id); + id = null; + } + }, 100); + }else{ + fn(); + } + }); + + // preload neighboring gallery images + if(gallery.length > 1){ + var next = gallery[current + 1] || gallery[0]; + if(next.player == 'img'){ + var a = new Image(); + a.src = next.content; + } + var prev = gallery[current - 1] || gallery[gallery.length - 1]; + if(prev.player == 'img'){ + var b = new Image(); + b.src = prev.content; + } + } + }; + + /** + * Calculates the dimensions for Shadowbox, taking into account the borders + * and surrounding elements of the shadowbox_body. If the height/width + * combination is too large for Shadowbox and handleOversize option is set + * to 'resize', the resized dimensions will be returned (preserving the + * original aspect ratio). Otherwise, the originally calculated dimensions + * will be used. Stores all dimensions in the private dims variable. + * + * @param Number height The content player height + * @param Number width The content player width + * @param Boolean resizable True if the content is able to be + * resized. Defaults to false. + * @return void + * @private + */ + var setDimensions = function(height, width, resizable){ + resizable = resizable || false; + + var sb = SL.get('shadowbox_body'); + var h = height = parseInt(height); + var w = width = parseInt(width); + var view_h = SL.getViewportHeight(); + var view_w = SL.getViewportWidth(); + + // calculate the max width + var border_w = parseInt(SL.getStyle(sb, 'border-left-width'), 10) + + parseInt(SL.getStyle(sb, 'border-right-width'), 10); + var extra_w = border_w + 2 * options.viewportPadding; + if(w + extra_w >= view_w){ + w = view_w - extra_w; + } + + // calculate the max height + var border_h = parseInt(SL.getStyle(sb, 'border-top-width'), 10) + + parseInt(SL.getStyle(sb, 'border-bottom-width'), 10); + var bar_h = getComputedHeight(SL.get('shadowbox_title')) + + getComputedHeight(SL.get('shadowbox_info')); + var extra_h = border_h + 2 * options.viewportPadding + bar_h; + if(h + extra_h >= view_h){ + h = view_h - extra_h; + } + + // handle oversized content + var drag = false; + var resize_h = height; + var resize_w = width; + var handle = options.handleOversize; + if(resizable && (handle == 'resize' || handle == 'drag')){ + var change_h = (height - h) / height; + var change_w = (width - w) / width; + if(handle == 'resize'){ + if(change_h > change_w){ + w = Math.round((width / height) * h); + }else if(change_w > change_h){ + h = Math.round((height / width) * w); + } + // adjust resized height or width accordingly + resize_w = w; + resize_h = h; + }else{ + // drag on oversized images only + var link = gallery[current]; + if(link) drag = link.player == 'img' && (change_h > 0 || change_w > 0); + } + } + + // update dims + dims = { + height: h + border_h + bar_h, + width: w + border_w, + inner_h: h, + inner_w: w, + top: (view_h - (h + extra_h)) / 2 + options.viewportPadding, + resize_h: resize_h, + resize_w: resize_w, + drag: drag + }; + }; + + /** + * Resizes Shadowbox to the given height and width. If the callback + * parameter is given, the transition will be animated and the callback + * function will be called when the animation completes. Note: The private + * content variable must be updated before calling this function. + * + * @param Function cb A callback function to execute after the + * content has been resized + * @return void + * @private + */ + var resizeContent = function(cb){ + if(!content) return; // no content + + // set new dimensions + setDimensions(content.height, content.width, content.resizable); + + if(cb){ + switch(options.animSequence){ + case 'hw': + adjustHeight(dims.inner_h, dims.top, true, function(){ + adjustWidth(dims.width, true, cb); + }); + break; + case 'wh': + adjustWidth(dims.width, true, function(){ + adjustHeight(dims.inner_h, dims.top, true, cb); + }); + break; + case 'sync': + default: + adjustWidth(dims.width, true); + adjustHeight(dims.inner_h, dims.top, true, cb); + } + }else{ // window resize + adjustWidth(dims.width, false); + adjustHeight(dims.inner_h, dims.top, false); + var c = SL.get(content_id); + if(c){ + // resize resizable content when in resize mode + if(content.resizable && options.handleOversize == 'resize'){ + c.height = dims.resize_h; + c.width = dims.resize_w; + } + // fix draggable positioning if enlarging viewport + if(gallery[current].player == 'img' && options.handleOversize == 'drag'){ + var top = parseInt(SL.getStyle(c, 'top')); + if(top + content.height < dims.inner_h){ + SL.setStyle(c, 'top', dims.inner_h - content.height + 'px'); + } + var left = parseInt(SL.getStyle(c, 'left')); + if(left + content.width < dims.inner_w){ + SL.setStyle(c, 'left', dims.inner_w - content.width + 'px'); + } + } + } + } + }; + + /** + * Adjusts the height of #shadowbox_body and centers #shadowbox vertically + * in the viewport. + * + * @param Number height The height to use for #shadowbox_body + * @param Number top The top to use for #shadowbox + * @param Boolean anim True to animate the transition + * @param Function cb A callback to use when the animation + * completes + * @return void + * @private + */ + var adjustHeight = function(height, top, anim, cb){ + height = parseInt(height); + + // adjust the height + var sb = SL.get('shadowbox_body'); + if(anim){ + animate(sb, 'height', height, options.resizeDuration); + }else{ + SL.setStyle(sb, 'height', height + 'px'); + } + + // adjust the top + var s = SL.get('shadowbox'); + if(anim){ + animate(s, 'top', top, options.resizeDuration, cb); + }else{ + SL.setStyle(s, 'top', top + 'px'); + if(typeof cb == 'function') cb(); + } + }; + + /** + * Adjusts the width of #shadowbox. + * + * @param Number width The width to use for #shadowbox + * @param Boolean anim True to animate the transition + * @param Function cb A callback to use when the animation + * completes + * @return void + * @private + */ + var adjustWidth = function(width, anim, cb){ + width = parseInt(width); + + // adjust the width + var s = SL.get('shadowbox'); + if(anim){ + animate(s, 'width', width, options.resizeDuration, cb); + }else{ + SL.setStyle(s, 'width', width + 'px'); + if(typeof cb == 'function') cb(); + } + }; + + /** + * Sets up a listener on the document for keystrokes. + * + * @param Boolean on True to enable the listener, false to turn + * it off + * @return void + * @private + */ + var listenKeys = function(on){ + if(!options.enableKeys) return; + SL[(on ? 'add' : 'remove') + 'Event'](document, 'keydown', handleKey); + }; + + /** + * A listener function that is fired when a key is pressed. + * + * @param mixed e The event object + * @return void + * @private + */ + var handleKey = function(e){ + var code = SL.keyCode(e); + + // attempt to prevent default key action + SL.preventDefault(e); + + if(code == 81 || code == 88 || code == 27){ // q, x, or esc + SB.close(); + }else if(code == 37){ // left arrow + SB.previous(); + }else if(code == 39){ // right arrow + SB.next(); + }else if(code == 32){ // space bar + SB[(typeof slide_timer == 'number' ? 'pause' : 'play')](); + } + }; + + /** + * Toggles the visibility of the "loading" layer. + * + * @param Boolean on True to toggle on, false to toggle off + * @param Function cb The callback function to call when toggling + * completes + * @return void + * @private + */ + var toggleLoading = function(on, cb){ + var loading = SL.get('shadowbox_loading'); + if(on){ + loading.style.display = ''; + if(typeof cb == 'function') cb(); + }else{ + var p = gallery[current].player; + var anim = (p == 'img' || p == 'html'); // fade on images & html + var fn = function(){ + loading.style.display = 'none'; + clearOpacity(loading); + if(typeof cb == 'function') cb(); + }; + if(anim){ + animate(loading, 'opacity', 0, options.fadeDuration, fn); + }else{ + fn(); + } + } + }; + + /** + * Sets the top of the container element. This is only necessary in IE6 + * where the container uses absolute positioning instead of fixed. + * + * @return void + * @private + */ + var fixTop = function(){ + SL.get('shadowbox_container').style.top = document.documentElement.scrollTop + 'px'; + }; + + /** + * Sets the height of the overlay element to the full viewport height. This + * is only necessary in IE6 where the container uses absolute positioning + * instead of fixed, thus restricting the size of the overlay element. + * + * @return void + * @private + */ + var fixHeight = function(){ + SL.get('shadowbox_overlay').style.height = SL.getViewportHeight() + 'px'; + }; + + /** + * Determines if there is a next piece to display in the current gallery. + * + * @return bool True if there is another piece, false otherwise + * @private + */ + var hasNext = function(){ + return gallery.length > 1 && (current != gallery.length - 1 || options.continuous); + }; + + /** + * Toggles the visibility of #shadowbox_container and sets its size (if on + * IE6). Also toggles the visibility of elements ( elements, while Firefox has trouble with + * s. + * + * @param Function cb A callback to call after toggling on, absent + * when toggling off + * @return void + * @private + */ + var toggleVisible = function(cb){ + var els, v = (cb) ? 'hidden' : 'visible'; + var hide = ['select', 'object', 'embed']; // tags to hide + for(var i = 0; i < hide.length; ++i){ + els = document.getElementsByTagName(hide[i]); + for(var j = 0, len = els.length; j < len; ++j){ + els[j].style.visibility = v; + } + } + + // resize & show container + var so = SL.get('shadowbox_overlay'); + var sc = SL.get('shadowbox_container'); + var sb = SL.get('shadowbox'); + if(cb){ + // set overlay color/opacity + SL.setStyle(so, { + backgroundColor: options.overlayColor, + opacity: 0 + }); + if(!options.modal) SL.addEvent(so, 'click', SB.close); + if(ltIE7){ + // fix container top & overlay height before showing + fixTop(); + fixHeight(); + SL.addEvent(window, 'scroll', fixTop); + } + + // fade in animation + sb.style.display = 'none'; // will be cleared in loadContent() + sc.style.visibility = 'visible'; + animate(so, 'opacity', parseFloat(options.overlayOpacity), options.fadeDuration, cb); + }else{ + SL.removeEvent(so, 'click', SB.close); + if(ltIE7) SL.removeEvent(window, 'scroll', fixTop); + + // fade out effect + sb.style.display = 'none'; + animate(so, 'opacity', 0, options.fadeDuration, function(){ + sc.style.visibility = 'hidden'; + sb.style.display = ''; + clearOpacity(so); + }); + } + }; + + /** + * Initializes the Shadowbox environment. Loads the skin (if necessary), + * compiles the player matching regular expressions, and sets up the + * window resize listener. + * + * @param Object opts (optional) The default options to use + * @return void + * @public + * @static + */ + Shadowbox.init = function(opts){ + // don't initialize twice + if(initialized) return; + + // make sure language is loaded + if(typeof SB.LANG == 'undefined'){ + SB.raise('No Shadowbox language loaded'); + return; + } + // make sure skin is loaded + if(typeof SB.SKIN == 'undefined'){ + SB.raise('No Shadowbox skin loaded'); + return; + } + + // apply custom options + apply(options, opts || {}); + + // add markup + var markup = SB.SKIN.markup.replace(/\{(\w+)\}/g, function(m, p){ + return SB.LANG[p]; + }); + var bd = document.body || document.documentElement; + SL.append(bd, markup); + + // several fixes for IE6 + if(ltIE7){ + // give the container absolute positioning + SL.setStyle(SL.get('shadowbox_container'), 'position', 'absolute'); + // give shadowbox_body "layout"...whatever that is + SL.get('shadowbox_body').style.zoom = 1; + // use AlphaImageLoader for transparent PNG support + var png = SB.SKIN.png_fix; + if(png && png.constructor == Array){ + for(var i = 0; i < png.length; ++i){ + var el = SL.get(png[i]); + if(el){ + var match = SL.getStyle(el, 'background-image').match(/url\("(.*\.png)"\)/); + if(match){ + SL.setStyle(el, { + backgroundImage: 'none', + filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true,src=' + match[1] + ',sizingMethod=scale);' + }); + } + } + } + } + } + + // compile file type regular expressions here for speed + for(var e in options.ext){ + RE[e] = new RegExp('\.(' + options.ext[e].join('|') + ')\s*$', 'i'); + } + + // set up window resize event handler + var id; + SL.addEvent(window, 'resize', function(){ + // use 50 ms event buffering to prevent jerky window resizing + if(id){ + clearTimeout(id); + id = null; + } + id = setTimeout(function(){ + if(ltIE7) fixHeight(); + resizeContent(); + }, 50); + }); + + if(!options.skipSetup) SB.setup(); + initialized = true; + }; + + /** + * Dynamically loads the specified skin for use with Shadowbox. If the skin + * is included already in the page via the appropriate + '; + foreach ($items as $file) + { + + $x=$x+1; + if ($x % $params['colonne'] == 0) { + + if ($params_morfeo['titolo'] == 0) { + $file->titolo = ''; + } + else + { + if ($file->title == null) + { + $ext = array('.png','.jpg','.bmp','.gif','(',')','[',']','-','_'); + $file->titolo = $file->filename; + $file->titolo = str_replace($ext, '', $file->titolo); + } else { + $file->titolo = $file->title; + } + }//end elsefilename +echo ' +'; + +}else{ + + if ($params_morfeo['titolo'] == 0) { + $file->titolo = ''; + } + else + { + if ($file->title == null) + { + $ext = array('.png','.jpg','.bmp','.gif','(',')','[',']','-','_'); + $file->titolo = $file->filename; + $file->titolo = str_replace($ext, '', $file->titolo); + } else { + $file->titolo = $file->title; + } + }//end elsefilename +echo ' +'; + + } + +} +} + echo '
+ + + ' +; + echo'
+ + + ' +; + echo'
'; \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/classic/fancybox2.php b/components/com_morfeoshow/tpl/classic/fancybox2.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/classic/fancybox2.php @@ -0,0 +1,94 @@ + 0) { +$x=0; + +if ($params_morfeo['style0'] == 1) { +echo ''; + } + else + { +?> + + + '; + echo ''; + echo '
'; + foreach ($items as $file) + { + + $x=$x+1; + if ($x % $params['colonne'] == 0) { + + if ($params_morfeo['titolo'] == 0) { + $file->titolo = ''; + } + else + { + if ($file->title == null) + { + $ext = array('.png','.jpg','.bmp','.gif','(',')','[',']','-','_'); + $file->titolo = $file->filename; + $file->titolo = str_replace($ext, '', $file->titolo); + } else { + $file->titolo = $file->title; + } + }//end elsefilename +echo '
'; + +}else{ + + if ($params_morfeo['titolo'] == 0) { + $file->titolo = ''; + } + else + { + if ($file->title == null) + { + $ext = array('.png','.jpg','.bmp','.gif','(',')','[',']','-','_'); + $file->titolo = $file->filename; + $file->titolo = str_replace($ext, '', $file->titolo); + } else { + $file->titolo = $file->title; + } + }//end elsefilename +echo ''; + + } + +} +} + echo '
+ ' +; +echo ''; +echo'
+ ' +; +echo ''; +echo'

'; \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/classic/fancybox3.php b/components/com_morfeoshow/tpl/classic/fancybox3.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/classic/fancybox3.php @@ -0,0 +1,122 @@ + 0) { +$x=0; + +if ($params_morfeo['style'] == 1) { +echo ''; + } + else + { + +echo ''; + } + echo ''; + foreach ($items as $file) + { + + $x=$x+1; + if ($x % $params['colonne'] == 0) { + + if ($file->html =='') + { +echo ''; + +}else{ + + if ($file->html =='') + { +echo ''; + } + } +} + echo '
+ + + +
+'; + } + else + { + +echo ' +
+ + '.$file->html.' + +
' +; + }//fine else immagine +if ($params_morfeo['titolo'] == 0) { + } + else + { + if ($file->title == null) + { + $ext = array('.png','.jpg','.bmp','.gif','(',')','[',']','-','_'); + $file->filename = str_replace($ext, '', $file->filename); + echo $file->filename; + } + else + { + echo $file->title; + }//end elsefilename + }//end else titolo + echo'
+ + + +
+'; + } + else + { + +echo ' +
+ + '.$file->html.' + +
' +; + }//fine else immagine +if ($params_morfeo['titolo'] == 0) { + } + else + { + if ($file->title == null) + { + $ext = array('.png','.jpg','.bmp','.gif','(',')','[',']','-','_'); + $file->filename = str_replace($ext, '', $file->filename); + echo $file->filename; + } + else + { + echo $file->title; + }//end elsefilename + }//end else titolo + echo'

'; \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/classic/fancybox4.php b/components/com_morfeoshow/tpl/classic/fancybox4.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/classic/fancybox4.php @@ -0,0 +1,142 @@ + 0) { +$x=0; + +if ($params_morfeo['style0'] == 1) { +echo ''; + } + else + { +?> + +'; + echo ''; + + echo '
'; + foreach ($items as $file) + { + + $x=$x+1; + if ($x % $params['colonne'] == 0) { + + if ($file->html =='') + { + echo ' + '; +if ($params_morfeo['titolo'] == 0) { + } + else + { + if ($file->title == null) + { + $ext = array('.png','.jpg','.bmp','.gif','(',')','[',']','-','_'); + $file->filename = str_replace($ext, '', $file->filename); + echo $file->filename; + } + else + { + echo $file->title; + }//end elsefilename + }//end else titolo +echo ''; + } + else + { +echo ' + '.$file->html.'' +; +if ($params_morfeo['titolo'] == 0) { + } + else + { + if ($file->title == null) + { + $ext = array('.png','.jpg','.bmp','.gif','(',')','[',']','-','_'); + $file->filename = str_replace($ext, '', $file->filename); + echo $file->filename; + } + else + { + echo $file->title; + }//end elsefilename + }//end else titolo +echo ''; + }//fine else immagine + echo''; +}else{ + + if ($file->html =='') + { + echo ' + '; +if ($params_morfeo['titolo'] == 0) { + } + else + { + if ($file->title == null) + { + $ext = array('.png','.jpg','.bmp','.gif','(',')','[',']','-','_'); + $file->filename = str_replace($ext, '', $file->filename); + echo $file->filename; + } + else + { + echo $file->title; + }//end elsefilename + }//end else titolo +echo ''; + } + else + { +echo ' + '.$file->html.'' +; +if ($params_morfeo['titolo'] == 0) { + } + else + { + if ($file->title == null) + { + $ext = array('.png','.jpg','.bmp','.gif','(',')','[',']','-','_'); + $file->filename = str_replace($ext, '', $file->filename); + echo $file->filename; + } + else + { + echo $file->title; + }//end elsefilename + }//end else titolo +echo ''; + }//fine else immagine + echo''; + } + } +} + echo '
'; + echo '
'; \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/classic/index.html b/components/com_morfeoshow/tpl/classic/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/classic/index.html @@ -0,0 +1,1 @@ + \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/classic/shadowbox1.php b/components/com_morfeoshow/tpl/classic/shadowbox1.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/classic/shadowbox1.php @@ -0,0 +1,94 @@ + 0) { +$x=0; + +if ($params_morfeo['style'] == 1) { +echo ''; + } + else + { + +echo ''; + + } + + echo ' + '; + foreach ($items as $file) + { +$x=$x+1; +if ($x % $params['colonne'] == 0) { + + if ($params_morfeo['titolo'] == 0) { + $file->titolo = ''; + } + else + { + if ($file->title == null) + { + $ext = array('.png','.jpg','.bmp','.gif','(',')','[',']','-','_'); + $file->titolo = $file->filename; + $file->titolo = str_replace($ext, '', $file->titolo); + } else { + $file->titolo = $file->title; + } + + }//end elsefilename + echo ''; + +}else{ + + if ($params_morfeo['titolo'] == 0) { + $file->titolo = ''; + } + else + { + if ($file->title == null) + { + $ext = array('.png','.jpg','.bmp','.gif','(',')','[',']','-','_'); + $file->titolo = $file->filename; + $file->titolo = str_replace($ext, '', $file->titolo); + } else { + $file->titolo = $file->title; + } + + }//end elsefilename + echo ''; + + } + +} +} + echo '
+ + + +
+ + + +
'; \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/classic/shadowbox2.php b/components/com_morfeoshow/tpl/classic/shadowbox2.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/classic/shadowbox2.php @@ -0,0 +1,94 @@ + 0) { +$x=0; + +if ($params_morfeo['style0'] == 1) { +echo ''; + } + else + { +?> + + + '; + echo '
'; + foreach ($items as $file) + { + + $x=$x+1; + if ($x % $params['colonne'] == 0) { + + if ($params_morfeo['titolo'] == 0) { + $file->titolo = ''; + } + else + { + if ($file->title == null) + { + $ext = array('.png','.jpg','.bmp','.gif','(',')','[',']','-','_'); + $file->titolo = $file->filename; + $file->titolo = str_replace($ext, '', $file->titolo); + } else { + $file->titolo = $file->title; + } + +echo '
'; +} +}else{ + + if ($params_morfeo['titolo'] == 0) { + $file->titolo = ''; + } + else + { + if ($file->title == null) + { + $ext = array('.png','.jpg','.bmp','.gif','(',')','[',']','-','_'); + $file->titolo = $file->filename; + $file->titolo = str_replace($ext, '', $file->titolo); + } else { + $file->titolo = $file->title; + } + +echo ''; +} + + } + +} +} + echo '
+ ' +; +echo ''; +echo'
+ ' +; +echo ''; +echo'

'; \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/classic/shadowbox3.php b/components/com_morfeoshow/tpl/classic/shadowbox3.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/classic/shadowbox3.php @@ -0,0 +1,125 @@ + 0) { +$x=0; + + +if ($params_morfeo['style'] == 1) { +echo ''; + } + else + { + +echo ''; + } + + echo ''; + foreach ($items as $file) + { + + $x=$x+1; + if ($x % $params['colonne'] == 0) { + + if ($file->html =='') + { +echo ''; + +}else{ + + if ($file->html =='') + { +echo ''; + + } + } +} + echo '
+ + + +
+'; + } + else + { + +echo ' +
+ + '.$file->html.' + +
' +; + }//fine else immagine +if ($params_morfeo['titolo'] == 0) { + } + else + { + if ($file->title == null) + { + $ext = array('.png','.jpg','.bmp','.gif','(',')','[',']','-','_'); + $file->filename = str_replace($ext, '', $file->filename); + echo $file->filename; + } + else + { + echo $file->title; + }//end elsefilename + }//end else titolo + echo'
+ + + +
+'; + } + else + { + +echo ' +
+ + '.$file->html.' + +
' +; + }//fine else immagine +if ($params_morfeo['titolo'] == 0) { + } + else + { + if ($file->title == null) + { + $ext = array('.png','.jpg','.bmp','.gif','(',')','[',']','-','_'); + $file->filename = str_replace($ext, '', $file->filename); + echo $file->filename; + } + else + { + echo $file->title; + }//end elsefilename + }//end else titolo + echo '

'; \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/classic/shadowbox4.php b/components/com_morfeoshow/tpl/classic/shadowbox4.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/classic/shadowbox4.php @@ -0,0 +1,140 @@ + 0) { +$x=0; + +if ($params_morfeo['style0'] == 1) { +echo ''; + } + else + { +?> + +'; + echo '
'; + foreach ($items as $file) + { + + $x=$x+1; + if ($x % $params['colonne'] == 0) { + + if ($file->html =='') + { + echo ' + '; +if ($params_morfeo['titolo'] == 0) { + } + else + { + if ($file->title == null) + { + $ext = array('.png','.jpg','.bmp','.gif','(',')','[',']','-','_'); + $file->filename = str_replace($ext, '', $file->filename); + echo $file->filename; + } + else + { + echo $file->title; + }//end elsefilename + }//end else titolo +echo ''; + } + else + { +echo ' + '.$file->html.'' +; +if ($params_morfeo['titolo'] == 0) { + } + else + { + if ($file->title == null) + { + $ext = array('.png','.jpg','.bmp','.gif','(',')','[',']','-','_'); + $file->filename = str_replace($ext, '', $file->filename); + echo $file->filename; + } + else + { + echo $file->title; + }//end elsefilename + }//end else titolo +echo ''; + }//fine else immagine + echo''; +}else{ + + if ($file->html =='') + { + echo ' + '; +if ($params_morfeo['titolo'] == 0) { + } + else + { + if ($file->title == null) + { + $ext = array('.png','.jpg','.bmp','.gif','(',')','[',']','-','_'); + $file->filename = str_replace($ext, '', $file->filename); + echo $file->filename; + } + else + { + echo $file->title; + }//end elsefilename + }//end else titolo +echo ''; + } + else + { +echo ' + '.$file->html.'' +; +if ($params_morfeo['titolo'] == 0) { + } + else + { + if ($file->title == null) + { + $ext = array('.png','.jpg','.bmp','.gif','(',')','[',']','-','_'); + $file->filename = str_replace($ext, '', $file->filename); + echo $file->filename; + } + else + { + echo $file->title; + }//end elsefilename + }//end else titolo +echo ''; + }//fine else immagine + echo''; + } + } +} + echo '
'; + echo '
'; \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/flickrsingle/flickrsingle.php b/components/com_morfeoshow/tpl/flickrsingle/flickrsingle.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/flickrsingle/flickrsingle.php @@ -0,0 +1,57 @@ + + + + + + + +
+
+
    + +
  • <?php echo $photo['title'] ?>
  • + +
+
+
+ \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/imagerotator/imagerotator.php b/components/com_morfeoshow/tpl/imagerotator/imagerotator.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/imagerotator/imagerotator.php @@ -0,0 +1,47 @@ + + + +
+ + "'. JText::_( 'Get the Flash Player' ).'" + "'. JText::_( 'to see this gallery.' ).'" +
+ + + + + +'; \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/imagerotator/index.html b/components/com_morfeoshow/tpl/imagerotator/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/imagerotator/index.html @@ -0,0 +1,1 @@ + \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/imageviewer/imageviewer.php b/components/com_morfeoshow/tpl/imageviewer/imageviewer.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/imageviewer/imageviewer.php @@ -0,0 +1,50 @@ + + + + + + +
+ + "'. JText::_( 'Get the Flash Player' ).'" + "'. JText::_( 'to see this gallery.' ).'" +
+ + + + + '; \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/imageviewer/index.html b/components/com_morfeoshow/tpl/imageviewer/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/imageviewer/index.html @@ -0,0 +1,1 @@ + \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/index.html b/components/com_morfeoshow/tpl/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/index.html @@ -0,0 +1,1 @@ + \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/picasa/index.html b/components/com_morfeoshow/tpl/picasa/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/picasa/index.html @@ -0,0 +1,1 @@ + \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/picasa/picasa.php b/components/com_morfeoshow/tpl/picasa/picasa.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/picasa/picasa.php @@ -0,0 +1,176 @@ + + +
+
+
+
+
+
+
+
Picasa Gallery System is Property of Picasa All right reserverd
+ \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/polaroid/polaroid.php b/components/com_morfeoshow/tpl/polaroid/polaroid.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/polaroid/polaroid.php @@ -0,0 +1,40 @@ + + + +
+ + "'.JText::_( 'Get the Flash Player' ).'" + "'. JText::_( 'to see this gallery.' ).'" +
+ + + + + '; \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/postcard/index.html b/components/com_morfeoshow/tpl/postcard/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/postcard/index.html @@ -0,0 +1,1 @@ + \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/postcard/postcard.php b/components/com_morfeoshow/tpl/postcard/postcard.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/postcard/postcard.php @@ -0,0 +1,41 @@ + + + +
+ + "'.JText::_( 'Get the Flash Player' ).'" + "'. JText::_( 'to see this gallery.' ).'" +
+ + + + + + '; \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/resources/boxover/boxover.js b/components/com_morfeoshow/tpl/resources/boxover/boxover.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/boxover/boxover.js @@ -0,0 +1,375 @@ +/* --- BoxOver --- +/* --- v 2.1 17th June 2006 +By Oliver Bryant with help of Matthew Tagg +http://boxover.swazz.org */ + +if (typeof document.attachEvent!='undefined') { + window.attachEvent('onload',init); + document.attachEvent('onmousemove',moveMouse); + document.attachEvent('onclick',checkMove); } +else { + window.addEventListener('load',init,false); + document.addEventListener('mousemove',moveMouse,false); + document.addEventListener('click',checkMove,false); +} + +var oDv=document.createElement("div"); +var dvHdr=document.createElement("div"); +var dvBdy=document.createElement("div"); +var windowlock,boxMove,fixposx,fixposy,lockX,lockY,fixx,fixy,ox,oy,boxLeft,boxRight,boxTop,boxBottom,evt,mouseX,mouseY,boxOpen,totalScrollTop,totalScrollLeft; +boxOpen=false; +ox=10; +oy=10; +lockX=0; +lockY=0; + +function init() { + oDv.appendChild(dvHdr); + oDv.appendChild(dvBdy); + oDv.style.position="absolute"; + oDv.style.visibility='hidden'; + document.body.appendChild(oDv); +} + +function defHdrStyle() { + dvHdr.innerHTML='  '+dvHdr.innerHTML; + dvHdr.style.fontWeight='bold'; + dvHdr.style.width='150px'; + dvHdr.style.fontFamily='arial'; + dvHdr.style.borderBottom='1px solid #cccccc'; + dvHdr.style.borderTop='1px solid #000000'; + dvHdr.style.borderLeft='1px solid #000000'; + dvHdr.style.borderRight='1px solid #000000'; + dvHdr.style.padding='6px'; + dvHdr.style.fontSize='11px'; + dvHdr.style.color='#ffff00'; + dvHdr.style.background='#1a1a1a'; + dvHdr.style.filter='alpha(opacity=85)'; // IE + dvHdr.style.opacity='0.85'; // FF +} + +function defBdyStyle() { + dvBdy.style.borderBottom='1px solid #000000'; + dvBdy.style.borderLeft='1px solid #000000'; + dvBdy.style.borderRight='1px solid #000000'; + dvBdy.style.width='150px'; + dvBdy.style.fontFamily='arial'; + dvBdy.style.fontSize='9px'; + dvBdy.style.padding='6px'; + dvBdy.style.color='#ffffff'; + dvBdy.style.background='#1a1a1a'; + dvBdy.style.filter='alpha(opacity=85)'; // IE + dvBdy.style.opacity='0.85'; // FF +} + +function checkElemBO(txt) { +if (!txt || typeof(txt) != 'string') return false; +if ((txt.indexOf('header')>-1)&&(txt.indexOf('body')>-1)&&(txt.indexOf('[')>-1)&&(txt.indexOf('[')>-1)) + return true; +else + return false; +} + +function scanBO(curNode) { + if (checkElemBO(curNode.title)) { + curNode.boHDR=getParam('header',curNode.title); + curNode.boBDY=getParam('body',curNode.title); + curNode.boCSSBDY=getParam('cssbody',curNode.title); + curNode.boCSSHDR=getParam('cssheader',curNode.title); + curNode.IEbugfix=(getParam('hideselects',curNode.title)=='on')?true:false; + curNode.fixX=parseInt(getParam('fixedrelx',curNode.title)); + curNode.fixY=parseInt(getParam('fixedrely',curNode.title)); + curNode.absX=parseInt(getParam('fixedabsx',curNode.title)); + curNode.absY=parseInt(getParam('fixedabsy',curNode.title)); + curNode.offY=(getParam('offsety',curNode.title)!='')?parseInt(getParam('offsety',curNode.title)):10; + curNode.offX=(getParam('offsetx',curNode.title)!='')?parseInt(getParam('offsetx',curNode.title)):10; + curNode.fade=(getParam('fade',curNode.title)=='on')?true:false; + curNode.fadespeed=(getParam('fadespeed',curNode.title)!='')?getParam('fadespeed',curNode.title):0.04; + curNode.delay=(getParam('delay',curNode.title)!='')?parseInt(getParam('delay',curNode.title)):0; + if (getParam('requireclick',curNode.title)=='on') { + curNode.requireclick=true; + document.all?curNode.attachEvent('onclick',showHideBox):curNode.addEventListener('click',showHideBox,false); + document.all?curNode.attachEvent('onmouseover',hideBox):curNode.addEventListener('mouseover',hideBox,false); + } + else {// Note : if requireclick is on the stop clicks are ignored + if (getParam('doubleclickstop',curNode.title)!='off') { + document.all?curNode.attachEvent('ondblclick',pauseBox):curNode.addEventListener('dblclick',pauseBox,false); + } + if (getParam('singleclickstop',curNode.title)=='on') { + document.all?curNode.attachEvent('onclick',pauseBox):curNode.addEventListener('click',pauseBox,false); + } + } + curNode.windowLock=getParam('windowlock',curNode.title).toLowerCase()=='off'?false:true; + curNode.title=''; + curNode.hasbox=1; + } + else + curNode.hasbox=2; +} + + +function getParam(param,list) { + var reg = new RegExp('([^a-zA-Z]' + param + '|^' + param + ')\\s*=\\s*\\[\\s*(((\\[\\[)|(\\]\\])|([^\\]\\[]))*)\\s*\\]'); + var res = reg.exec(list); + var returnvar; + if(res) + return res[2].replace('[[','[').replace(']]',']'); + else + return ''; +} + +function Left(elem){ + var x=0; + if (elem.calcLeft) + return elem.calcLeft; + var oElem=elem; + while(elem){ + if ((elem.currentStyle)&& (!isNaN(parseInt(elem.currentStyle.borderLeftWidth)))&&(x!=0)) + x+=parseInt(elem.currentStyle.borderLeftWidth); + x+=elem.offsetLeft; + elem=elem.offsetParent; + } + oElem.calcLeft=x; + return x; + } + +function Top(elem){ + var x=0; + if (elem.calcTop) + return elem.calcTop; + var oElem=elem; + while(elem){ + if ((elem.currentStyle)&& (!isNaN(parseInt(elem.currentStyle.borderTopWidth)))&&(x!=0)) + x+=parseInt(elem.currentStyle.borderTopWidth); + x+=elem.offsetTop; + elem=elem.offsetParent; + } + oElem.calcTop=x; + return x; + +} + +var ah,ab; +function applyStyles() { + if(ab) + oDv.removeChild(dvBdy); + if (ah) + oDv.removeChild(dvHdr); + dvHdr=document.createElement("div"); + dvBdy=document.createElement("div"); + CBE.boCSSBDY?dvBdy.className=CBE.boCSSBDY:defBdyStyle(); + CBE.boCSSHDR?dvHdr.className=CBE.boCSSHDR:defHdrStyle(); + dvHdr.innerHTML=CBE.boHDR; + dvBdy.innerHTML=CBE.boBDY; + ah=false; + ab=false; + if (CBE.boHDR!='') { + oDv.appendChild(dvHdr); + ah=true; + } + if (CBE.boBDY!=''){ + oDv.appendChild(dvBdy); + ab=true; + } +} + +var CSE,iterElem,LSE,CBE,LBE, totalScrollLeft, totalScrollTop, width, height ; +var ini=false; + +// Customised function for inner window dimension +function SHW() { + if (document.body && (document.body.clientWidth !=0)) { + width=document.body.clientWidth; + height=document.body.clientHeight; + } + if (document.documentElement && (document.documentElement.clientWidth!=0) && (document.body.clientWidth + 20 >= document.documentElement.clientWidth)) { + width=document.documentElement.clientWidth; + height=document.documentElement.clientHeight; + } + return [width,height]; +} + + +var ID=null; +function moveMouse(e) { + //boxMove=true; + e?evt=e:evt=event; + + CSE=evt.target?evt.target:evt.srcElement; + + if (!CSE.hasbox) { + // Note we need to scan up DOM here, some elements like TR don't get triggered as srcElement + iElem=CSE; + while ((iElem.parentNode) && (!iElem.hasbox)) { + scanBO(iElem); + iElem=iElem.parentNode; + } + } + + if ((CSE!=LSE)&&(!isChild(CSE,dvHdr))&&(!isChild(CSE,dvBdy))){ + if (!CSE.boxItem) { + iterElem=CSE; + while ((iterElem.hasbox==2)&&(iterElem.parentNode)) + iterElem=iterElem.parentNode; + CSE.boxItem=iterElem; + } + iterElem=CSE.boxItem; + if (CSE.boxItem&&(CSE.boxItem.hasbox==1)) { + LBE=CBE; + CBE=iterElem; + if (CBE!=LBE) { + applyStyles(); + if (!CBE.requireclick) + if (CBE.fade) { + if (ID!=null) + clearTimeout(ID); + ID=setTimeout("fadeIn("+CBE.fadespeed+")",CBE.delay); + } + else { + if (ID!=null) + clearTimeout(ID); + COL=1; + ID=setTimeout("oDv.style.visibility='visible';ID=null;",CBE.delay); + } + if (CBE.IEbugfix) {hideSelects();} + fixposx=!isNaN(CBE.fixX)?Left(CBE)+CBE.fixX:CBE.absX; + fixposy=!isNaN(CBE.fixY)?Top(CBE)+CBE.fixY:CBE.absY; + lockX=0; + lockY=0; + boxMove=true; + ox=CBE.offX?CBE.offX:10; + oy=CBE.offY?CBE.offY:10; + } + } + else if (!isChild(CSE,dvHdr) && !isChild(CSE,dvBdy) && (boxMove)) { + // The conditional here fixes flickering between tables cells. + if ((!isChild(CBE,CSE)) || (CSE.tagName!='TABLE')) { + CBE=null; + if (ID!=null) + clearTimeout(ID); + fadeOut(); + showSelects(); + } + } + LSE=CSE; + } + else if (((isChild(CSE,dvHdr) || isChild(CSE,dvBdy))&&(boxMove))) { + totalScrollLeft=0; + totalScrollTop=0; + + iterElem=CSE; + while(iterElem) { + if(!isNaN(parseInt(iterElem.scrollTop))) + totalScrollTop+=parseInt(iterElem.scrollTop); + if(!isNaN(parseInt(iterElem.scrollLeft))) + totalScrollLeft+=parseInt(iterElem.scrollLeft); + iterElem=iterElem.parentNode; + } + if (CBE!=null) { + boxLeft=Left(CBE)-totalScrollLeft; + boxRight=parseInt(Left(CBE)+CBE.offsetWidth)-totalScrollLeft; + boxTop=Top(CBE)-totalScrollTop; + boxBottom=parseInt(Top(CBE)+CBE.offsetHeight)-totalScrollTop; + doCheck(); + } + } + + if (boxMove&&CBE) { + // This added to alleviate bug in IE6 w.r.t DOCTYPE + bodyScrollTop=document.documentElement&&document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop; + bodyScrollLet=document.documentElement&&document.documentElement.scrollLeft?document.documentElement.scrollLeft:document.body.scrollLeft; + mouseX=evt.pageX?evt.pageX-bodyScrollLet:evt.clientX-document.body.clientLeft; + mouseY=evt.pageY?evt.pageY-bodyScrollTop:evt.clientY-document.body.clientTop; + if ((CBE)&&(CBE.windowLock)) { + mouseY < -oy?lockY=-mouseY-oy:lockY=0; + mouseX < -ox?lockX=-mouseX-ox:lockX=0; + mouseY > (SHW()[1]-oDv.offsetHeight-oy)?lockY=-mouseY+SHW()[1]-oDv.offsetHeight-oy:lockY=lockY; + mouseX > (SHW()[0]-dvBdy.offsetWidth-ox)?lockX=-mouseX-ox+SHW()[0]-dvBdy.offsetWidth:lockX=lockX; + } + oDv.style.left=((fixposx)||(fixposx==0))?fixposx:bodyScrollLet+mouseX+ox+lockX+"px"; + oDv.style.top=((fixposy)||(fixposy==0))?fixposy:bodyScrollTop+mouseY+oy+lockY+"px"; + + } +} + +function doCheck() { + if ( (mouseX < boxLeft) || (mouseX >boxRight) || (mouseY < boxTop) || (mouseY > boxBottom)) { + if (!CBE.requireclick) + fadeOut(); + if (CBE.IEbugfix) {showSelects();} + CBE=null; + } +} + +function pauseBox(e) { + e?evt=e:evt=event; + boxMove=false; + evt.cancelBubble=true; +} + +function showHideBox(e) { + oDv.style.visibility=(oDv.style.visibility!='visible')?'visible':'hidden'; +} + +function hideBox(e) { + oDv.style.visibility='hidden'; +} + +var COL=0; +var stopfade=false; +function fadeIn(fs) { + ID=null; + COL=0; + oDv.style.visibility='visible'; + fadeIn2(fs); +} + +function fadeIn2(fs) { + COL=COL+fs; + COL=(COL>1)?1:COL; + oDv.style.filter='alpha(opacity='+parseInt(100*COL)+')'; + oDv.style.opacity=COL; + if (COL<1) + setTimeout("fadeIn2("+fs+")",20); +} + + +function fadeOut() { + oDv.style.visibility='hidden'; + +} + +function isChild(s,d) { + while(s) { + if (s==d) + return true; + s=s.parentNode; + } + return false; +} + +var cSrc; +function checkMove(e) { + e?evt=e:evt=event; + cSrc=evt.target?evt.target:evt.srcElement; + if ((!boxMove)&&(!isChild(cSrc,oDv))) { + fadeOut(); + if (CBE&&CBE.IEbugfix) {showSelects();} + boxMove=true; + CBE=null; + } +} + +function showSelects(){ + var elements = document.getElementsByTagName("select"); + for (i=0;i< elements.length;i++){ + elements[i].style.visibility='visible'; + } +} + +function hideSelects(){ + var elements = document.getElementsByTagName("select"); + for (i=0;i< elements.length;i++){ + elements[i].style.visibility='hidden'; + } +} \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/resources/boxover/index.html b/components/com_morfeoshow/tpl/resources/boxover/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/boxover/index.html @@ -0,0 +1,1 @@ + \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/resources/fancy/bg.png b/components/com_morfeoshow/tpl/resources/fancy/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..5754d729c19734e67fb79206708a74bea8e8d651 GIT binary patch literal 395 zc%17D@N?(olHy`uVBq!ia0vp^A`A>H8#tJNtP;(?8-bK$iEBhjaDG}zd16s2gJVj5 zQmTSyZen_BP-EDwNfask0i4tvzH;xzRAjc&gfIBYH8RW6U zVM1*n&SO3hXM;T_*kc>kPsu(E@uS^3An_r)g4=+haB8=}rf*-ffuYOb>FVdQ&MBb@ E0JK|``Tzg` diff --git a/components/com_morfeoshow/tpl/resources/fancy/fancy.css b/components/com_morfeoshow/tpl/resources/fancy/fancy.css new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/fancy/fancy.css @@ -0,0 +1,231 @@ +div#fancy_overlay { + position:absolute; + top: 0; + left: 0; + z-index: 90; + width: 100%; + background-color: #333; +} + +div#fancy_loading { + position: absolute; + height: 40px; + width: 40px; + cursor: pointer; + display: none; + overflow: hidden; + background: transparent; + z-index: 100; +} + +div#fancy_loading div { + position: absolute; + top: 0; + left: 0; + width: 40px; + height: 480px; + background: transparent url(fancy_progress.png) no-repeat; +} + +div#fancy_close { + position: absolute; + top: -12px; + right: -12px; + height: 30px; + width: 30px; + background: transparent url(fancy_closebox.png) ; + cursor: pointer; + z-index: 100; + display: none; +} + +div#fancy_content { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + padding: 0; + margin: 0; + z-index: 96; +} + +#fancy_frame { + position: relative; + width: 100%; + height: 100%; + display: none; +} + +img#fancy_img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border:0; + padding: 0; + margin: 0; + z-index: 92; +} + +div#fancy_title { + position: absolute; + bottom: -35px; + left: 0; + width: 100%; + z-index: 100; + display: none; +} + +div#fancy_title table { + margin: 0 auto; +} + +div#fancy_title div { + color: #FFF; + font: bold 12px Arial; + padding-bottom: 2px; +} + +td#fancy_title_left { + height: 32px; + width: 15px; + background: transparent url(fancy_title_left.png) repeat-x; +} + +td#fancy_title_main { + height: 32px; + background: transparent url(fancy_title_main.png) repeat-x; +} + +td#fancy_title_right { + height: 32px; + width: 15px; + background: transparent url(fancy_title_right.png) repeat-x; +} + +div#fancy_outer { + position: absolute; + top: 0; + left: 0; + z-index: 90; + padding: 18px 18px 58px 18px; + margin: 0; + overflow: hidden; + background: transparent; + display: none; +} + +div#fancy_inner { + position: relative; + width:100%; + height:100%; + border: 1px solid #444; + background: #FFF; +} + +a#fancy_left, a#fancy_right { + position: absolute; + bottom: 10px; + height: 100%; + width: 35%; + cursor: pointer; + background-image: url(data:image/gif;base64,AAAA); + z-index: 100; +} + +a#fancy_left { + left: 0px; +} + +a#fancy_right { + right: 0px; +} + +a#fancy_left:hover { + background: transparent url(fancy_left.gif) no-repeat 0% 100%; +} + +a#fancy_right:hover { + background: transparent url(fancy_right.gif) no-repeat 100% 100%; +} + +#fancy_bigIframe, #fancy_freeIframe { + position:absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 10; +} + +div#fancy_bg { + display: none; +} + +div.fancy_bg { + position: absolute; + display: block; + z-index: 70; +} + +div.fancy_bg_n { + top: -18px; + width: 100%; + height: 18px; + background: transparent url(fancy_shadow_n.png) repeat-x; +} + +div.fancy_bg_ne { + top: -18px; + right: -13px; + width: 13px; + height: 18px; + background: transparent url(fancy_shadow_ne.png) no-repeat; +} + +div.fancy_bg_e { + right: -13px; + height: 100%; + width: 13px; + background: transparent url(fancy_shadow_e.png) repeat-y; +} + +div.fancy_bg_se { + bottom: -18px; + right: -13px; + width: 13px; + height: 18px; + background: transparent url(fancy_shadow_se.png) no-repeat; +} + +div.fancy_bg_s { + bottom: -18px; + width: 100%; + height: 18px; + background: transparent url(fancy_shadow_s.png) repeat-x; +} + +div.fancy_bg_sw { + bottom: -18px; + left: -13px; + width: 13px; + height: 18px; + background: transparent url(fancy_shadow_sw.png) no-repeat; +} + +div.fancy_bg_w { + left: -13px; + height: 100%; + width: 13px; + background: transparent url(fancy_shadow_w.png) repeat-y; +} + +div.fancy_bg_nw { + top: -18px; + left: -13px; + width: 13px; + height: 18px; + background: transparent url(fancy_shadow_nw.png) no-repeat; +} \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/resources/fancy/fancy_closebox.png b/components/com_morfeoshow/tpl/resources/fancy/fancy_closebox.png new file mode 100644 index 0000000000000000000000000000000000000000..4de4396d4a09677774f79289de2a09511baeea22 GIT binary patch literal 1910 zc$@)t2Z{KJP)z^Q>-8KIssI20AY({UO#lFGm;eBCjsO7iaR2~=Yybd* zy8r;x$N&H_>;M26yq<`~KL7v*>`6pHRCwBAWWWy?p_swJ!GY=X=g*8ke*9qk`ST}Z zdU`qw7Z(@fv}x0Rf#f+jIR5kU^8P2LK7aoF=BZPs zUOIK^)MsF*`~o`QH`D=t(JcoEAauk84FygG1qFf7&``O#bLZLs4PE;m4ZL{q;_rh8 z5B{QyfBg7y1u$e3few}u6cpqKnFTeI3E3im07CaENCB6OjEqoBOpMCLjT`;`{{8y^ zWZ_n$O7C)YSBAZ*T9f@87@wgQ~r-ckkXvV`F1EUVpg2H5Y-eYuxnRM9M39EBU%&nZ#x+Xt8W|aVwYIj#h+{D^u`kKV z$v=Qu3ogdS#`gK?)2F{dW*t0uupVfZDo|VqWEaTS009KEm>Z}`3Ydy*?%%(^5TtnW z(;G*fzk0D zSSo?}K!do)4&2r=HI`6@Kg;DK;Y5@D8S6f$jA!R2#R=y z-@kw3EZXkgz5D;mmoF#|yK?2qKWvtQ08AWYDKNn@LoH?k2q3V5?BoZ76wef+J_SucZ|q}*4Eat0ppwvn;u{u2G>@=;`K8pCnvlB0SF)lXugsH z7X0Rlii*j=;_ekFPSCRwF!6l>MgdBk`uh5!#Cc9m&JXm$1Xy;1vlOsk$^_bB1{9YD zI&JkwlS1w(;^Z^)!@LCEWfM7lr1G>gQO-(Jludi=U<2%PtU4%`gn2LZ7@5Q~G#ZGZrRXD5)S*xA{=fSSvIdGkEBd`SvUNJ#h& zEi#`0(?mH?%mZWxEIR=N5WD~ZWo}@L!d6H~C^;o1WhN}%Kn9R%DX3Tl1uIBDuwk$s zD3%Dsw#WqtKmai#w>W@Fo)wt5IG#Lt!pzOh{RtR^ngIa;EI|DX!1DGl0}&uLHkM`0 znlZR5`~$4;!Ko9NO&EZQ5}bNLd|;LO3|NQX zDk&*B3FO`b6<$F66o}sdF(~nY(#>Ch0AfUH2(Un1!w0oo5@@*$Fu}2#z zG+4x;SOQq;hynAf5U?N-FflO^1=e1m<_rU{W%&_U5xfEBgts6ML*w!V5Wj@tchKm7 z#Vt550|XEwmS!y*Qm}(kyC5{X2|-gN4>0wE+fTqMj{(U315A|Pffy8wAD|Y29Pu8S zm|(&C3%QvK5I~Grnzu|)pR++TIyW=~c%hErLTWoPKn(*K{0(XeEWv#R;_pxkeqBrOP0*Db$8yndX$XyynEc#&m wB;+m&vSk?cJ3s(2G7t}lRr{Y9MF0T?00rpcocj25u>b%707*qoM6N<$g7}L>N=iy>Y;1r2{CV->g{rD5Gc&V} zj?U}XuUT1HWn^Uj|NqZGB2fIv0;Y991jtSXR&NEBzLd;)8LQUiyxv!!bG{^&zdymb zBG0_B-N2#7p~r2SqDBr^f55eao~>%(+-zGjOH~DY8zdMMC&#ijs diff --git a/components/com_morfeoshow/tpl/resources/fancy/fancy_progress.png b/components/com_morfeoshow/tpl/resources/fancy/fancy_progress.png new file mode 100644 index 0000000000000000000000000000000000000000..06b7c89a6c0130b0a07ce6c562cb0a99a2e5e2ad GIT binary patch literal 12412 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 Z0Fq^TI8jib{eS-_fGcSzmdl$5{~rZVY9{~y diff --git a/components/com_morfeoshow/tpl/resources/fancy/fancy_right.gif b/components/com_morfeoshow/tpl/resources/fancy/fancy_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..f838731dc6f5a0044440d3e0b5ee84c1d1656a1f GIT binary patch literal 207 zc${}L>N=iy>Y;1r2{CV->g{rD5Gc&V} zj?U}XuUT1HWn^Uj|NqZGB2fIv0;Y991jtSXRv!hGzLd;)8LQUiyxv!!bG}5^#@Y7X zkKYda-4lLjut}{`*l@x`D(cj-FAS`DOZks2Vr?j4Okfb6c;PMwtL&3!0o@|+cGUQ- Mzx}?#gM+~u01f~@>;M1& diff --git a/components/com_morfeoshow/tpl/resources/fancy/fancy_shadow_e.png b/components/com_morfeoshow/tpl/resources/fancy/fancy_shadow_e.png new file mode 100644 index 0000000000000000000000000000000000000000..5db7b2b820697808e363a2d1c78e77b069f6ba4f GIT binary patch literal 146 zc%17D@N?(olHy`uVBq!ia0vp@K+M9y1|&nDY~2E+BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%nRvQ5hE&{2N=Zog!0_n1!yo33dZ(B10e_@B{yTh(SNO+% rTsdq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6)AhVIEGZ*N=g8N6eb}a9|JMrIY)b16B>or?BM7SYG7by Y;9bfPd*j~vWkBT&p00i_>zopr03qZglmGw# diff --git a/components/com_morfeoshow/tpl/resources/fancy/fancy_shadow_ne.png b/components/com_morfeoshow/tpl/resources/fancy/fancy_shadow_ne.png new file mode 100644 index 0000000000000000000000000000000000000000..64ef7225f40c8f4cec9a343eb041974b669e0107 GIT binary patch literal 245 zc%17D@N?(olHy`uVBq!ia0vp@KrF<;1|%D@LyUlwWQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8>7Fi*Ar-f#OycG{pupiQc=KKT!;{-uX0Cf=r*b5IzU!h6 zkIp|b`3>h4YK1@Un{@lk&u!uTTb?L1|GstT?Bq)}EzT#GU!Ha6kHvNd={qOZHD6|( z%E0QT&Ys?}I56^@pIB2a6Th!v#?A}7xi~iN`NU#ap`EX&n0||+d0O=u=^Yt+wl{Mv t2>LYt&0?q9uUVw*HvD5fcY{@efl)-K>4Wq6JfIU9JYD@<);T3K0RT@GVOszI diff --git a/components/com_morfeoshow/tpl/resources/fancy/fancy_shadow_nw.png b/components/com_morfeoshow/tpl/resources/fancy/fancy_shadow_nw.png new file mode 100644 index 0000000000000000000000000000000000000000..9ef0337709facce19c493d40a1a77a38377da4a4 GIT binary patch literal 207 zc%17D@N?(olHy`uVBq!ia0vp@KrF<;1|%D@LyUlwWQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8LQfaRkcwMVCUA2dFyL^We&+7~Q_{?*)7GwR70IftYg$}x zuud!SJF}MfStSo<*G>BqlSEivh=wU2dDZ`77DRE_W(o4Tt?ObP0l+XkK Du7^ga diff --git a/components/com_morfeoshow/tpl/resources/fancy/fancy_shadow_s.png b/components/com_morfeoshow/tpl/resources/fancy/fancy_shadow_s.png new file mode 100644 index 0000000000000000000000000000000000000000..bf52bd61ae29ca8bb9b4aaaa687d48c56fcecd61 GIT binary patch literal 136 zc%17D@N?(olHy`uVBq!ia0vp^j6f{J!3HE}g>Tsdq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6=`|8IEGZ*N=isb*pS2|RR7>eehiD#$#|B7JSq~7YyK;U hG0$Kqlw@GyVOZ$Nt0yMbqX^W+;OXk;vd$@?2>>#hB)gq5V(Cd)z%`9 zmBC`R-le-!X3ksYq;7U~orm~ip`YHDf+m*!;^kYx!N6)Tx8~BLxh+h87QBgI$((q5 z@`T-!*$XzPZ9F~SKtao4>l@XH5?b$7A`2g^6k-t mTb1H1p;-d=rYwzPWMepyQ=gjB5>yX#9D}E;pUXO@geCxxL|iEV diff --git a/components/com_morfeoshow/tpl/resources/fancy/fancy_shadow_sw.png b/components/com_morfeoshow/tpl/resources/fancy/fancy_shadow_sw.png new file mode 100644 index 0000000000000000000000000000000000000000..923a8b50ad15f7b7d9e82998a59e3a2ac35341aa GIT binary patch literal 221 zc%17D@N?(olHy`uVBq!ia0vp@KrF<;1|%D@LyUlwWQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8dQTU}kcwMVCUOfkC~&wq{<`!3K9W`yCAw4AxY7dBbN(5|_`~)#qH)8lT?%u4OpmzH?oNwXo2} z?^}dYnd1#jd_$F{( zJaZG%Q-e|yQz{EjrrH1%>3O<1hE&{2N=ZmaXh~92NMlP9(@0}YGShg*kW{9j%Ms*Z kq~LzpzR2V+JBI;7_HicPDN_<(0d+EXy85}Sb4q9e0KWMrNdN!< diff --git a/components/com_morfeoshow/tpl/resources/fancy/fancy_title_left.png b/components/com_morfeoshow/tpl/resources/fancy/fancy_title_left.png new file mode 100644 index 0000000000000000000000000000000000000000..1e82b6da6fb1fed223157659816433a1016c1892 GIT binary patch literal 556 zc$@(&0@MA8P)+)00004XF*Lt007q5 z)K6G40000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzzDYzuR4C7l zlT9eYaTv$H_GV0G8&kr(97Yo5t-NGTUJo4HD6$=##A!8BN^!x>aVO;@N}*hK(Bf!0 zj94pH#I&i&OCHbP|Lp8xZFpYH?6PX=EV)X+dHM=JiTgB}LtA}|5_=KcP-pXi&Mm79*O!`#};`ArnRv-|iFb#FJo9j5WaOb`ZUO*e>N* z$Fa7fC8Dj=*r1SFj{?}kheXbZ9IH8X5$fXCM71F~*04^cXnsu)nJ$!Y9xBk54r^gT zB|07>%E={s=2tFFO1|k;ZcHkzcT$k0`YKIh7&tjr5>=7~UF|aou737TQB*WxXu&HO zVdWw7Jar_6sDcBdz7x3}#DSKe9zB?Fc~5VI9J}!`$xNahEGS1K`Y-{{K_J?^ u744j*8SP5@#Y=>IR?^0!`u_?lEbu2<;S$J$zpc3d0000J-`tuAq*&4&eH|GXuHCreA7KRKOP07s zlmzFem6RtIr7}3C+)00004XF*Lt007q5 z)K6G40000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz!AV3xR4C7V zQ%fj>Q5ZdD#$$}UhZ4qPfh5YSJTg|E3l?@184D}1Qb;Mq20P1HDJxM5Wity+EXiVs zX^JWG$f%J=u5-;l`e*)s+;4f#_uYHWJs%Jc6O1q*j-_+bkqQfvkU*M2LwP%U+4fE^ zmmv+wq!^lXh>L>Z*$D`7w~u`4NDTEyz_zQ8Zy~1bRACAA zdm?L#{YOi%u|GivcKC(x9ij|YI%&|rRbD!9gKFe)yio&ZTnh0KL<0)xp(z&Jj1qp9 zNq6|OAFU`w2F=lX+POO>EQM`4V+^mjmbP?_$9S4F_2d}6y257pCBb0J6xubmBwnmM z%1|sg(U1BlQ^Rp^onQ!dlp|O9k|y7WiePH)GY7)2*)Q1JJm;V2%QVTNEg>QKx; zh2wDffS@DFQ563EKT)tvwU002ovPDHLkV1lp%?Nk5& diff --git a/components/com_morfeoshow/tpl/resources/fancy/index.html b/components/com_morfeoshow/tpl/resources/fancy/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/fancy/index.html @@ -0,0 +1,1 @@ + \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/resources/fancy/jquery.fancybox-1.0.0.js b/components/com_morfeoshow/tpl/resources/fancy/jquery.fancybox-1.0.0.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/fancy/jquery.fancybox-1.0.0.js @@ -0,0 +1,384 @@ +/* + * FancyBox - simple jQuery plugin for fancy image zooming + * Examples and documentation at: http://fancy.klade.lv/ + * Version: 1.0.0 (29/04/2008) + * Copyright (c) 2008 Janis Skarnelis + * Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php + * Requires: jQuery v1.2.1 or later +*/ +(function($) { + var opts = {}, + imgPreloader = new Image, imgTypes = ['png', 'jpg', 'jpeg', 'gif'], + loadingTimer, loadingFrame = 1; + + $.fn.fancybox = function(settings) { + opts.settings = $.extend({}, $.fn.fancybox.defaults, settings); + + $.fn.fancybox.init(); + + return this.each(function() { + var $this = $(this); + var o = $.metadata ? $.extend({}, opts.settings, $this.metadata()) : opts.settings; + + $this.unbind('click').click(function() { + $.fn.fancybox.start(this, o); return false; + }); + }); + }; + + $.fn.fancybox.start = function(el, o) { + if (opts.animating) return false; + + if (o.overlayShow) { + $("#fancy_wrap").prepend('
'); + $("#fancy_overlay").css({'width': $(window).width(), 'height': $(document).height(), 'opacity': o.overlayOpacity}); + + if ($.browser.msie) { + $("#fancy_wrap").prepend(''); + $("#fancy_bigIframe").css({'width': $(window).width(), 'height': $(document).height(), 'opacity': 0}); + } + + $("#fancy_overlay").click($.fn.fancybox.close); + } + + opts.itemArray = []; + opts.itemNum = 0; + + if (jQuery.isFunction(o.itemLoadCallback)) { + o.itemLoadCallback.apply(this, [opts]); + + var c = $(el).children("img:first").length ? $(el).children("img:first") : $(el); + var tmp = {'width': c.width(), 'height': c.height(), 'pos': $.fn.fancybox.getPosition(c)} + + for (var i = 0; i < opts.itemArray.length; i++) { + opts.itemArray[i].o = $.extend({}, o, opts.itemArray[i].o); + + if (o.zoomSpeedIn > 0 || o.zoomSpeedOut > 0) { + opts.itemArray[i].orig = tmp; + } + } + + } else { + if (!el.rel || el.rel == '') { + var item = {url: el.href, title: el.title, o: o}; + + if (o.zoomSpeedIn > 0 || o.zoomSpeedOut > 0) { + var c = $(el).children("img:first").length ? $(el).children("img:first") : $(el); + item.orig = {'width': c.width(), 'height': c.height(), 'pos': $.fn.fancybox.getPosition(c)} + } + + opts.itemArray.push(item); + + } else { + var arr = $("a[@rel=" + el.rel + "]").get(); + + for (var i = 0; i < arr.length; i++) { + var tmp = $.metadata ? $.extend({}, o, $(arr[i]).metadata()) : o; + var item = {url: arr[i].href, title: arr[i].title, o: tmp}; + + if (o.zoomSpeedIn > 0 || o.zoomSpeedOut > 0) { + var c = $(arr[i]).children("img:first").length ? $(arr[i]).children("img:first") : $(el); + + item.orig = {'width': c.width(), 'height': c.height(), 'pos': $.fn.fancybox.getPosition(c)} + } + + if (arr[i].href == el.href) opts.itemNum = i; + + opts.itemArray.push(item); + } + } + } + + $.fn.fancybox.changeItem(opts.itemNum); + }; + + $.fn.fancybox.changeItem = function(n) { + $.fn.fancybox.showLoading(); + + opts.itemNum = n; + + $("#fancy_nav").empty(); + $("#fancy_outer").stop(); + $("#fancy_title").hide(); + $(document).unbind("keydown"); + + imgRegExp = imgTypes.join('|'); + imgRegExp = new RegExp('\.' + imgRegExp + '$', 'i'); + + var url = opts.itemArray[n].url; + + if (url.match(/#/)) { + var target = window.location.href.split('#')[0]; target = url.replace(target,''); + + $.fn.fancybox.showItem('
' + $(target).html() + '
'); + + $("#fancy_loading").hide(); + + } else if (url.match(imgRegExp)) { + $(imgPreloader).unbind('load').bind('load', function() { + $("#fancy_loading").hide(); + + opts.itemArray[n].o.frameWidth = imgPreloader.width; + opts.itemArray[n].o.frameHeight = imgPreloader.height; + + $.fn.fancybox.showItem(''); + + }).attr('src', url + '?rand=' + Math.floor(Math.random() * 999999999) ); + + } else { + $.fn.fancybox.showItem(''); + } + }; + + $.fn.fancybox.showIframe = function() { + $("#fancy_loading").hide(); + $("#fancy_frame").show(); + }; + + $.fn.fancybox.showItem = function(val) { + $.fn.fancybox.preloadNeighborImages(); + + var viewportPos = $.fn.fancybox.getViewport(); + var itemSize = $.fn.fancybox.getMaxSize(viewportPos[0] - 50, viewportPos[1] - 100, opts.itemArray[opts.itemNum].o.frameWidth, opts.itemArray[opts.itemNum].o.frameHeight); + + var itemLeft = viewportPos[2] + Math.round((viewportPos[0] - itemSize[0]) / 2) - 20; + var itemTop = viewportPos[3] + Math.round((viewportPos[1] - itemSize[1]) / 2) - 40; + + var itemOpts = { + 'left': itemLeft, + 'top': itemTop, + 'width': itemSize[0] + 'px', + 'height': itemSize[1] + 'px' + } + + if (opts.active) { + $('#fancy_content').fadeOut("normal", function() { + $("#fancy_content").empty(); + + $("#fancy_outer").animate(itemOpts, "normal", function() { + $("#fancy_content").append($(val)).fadeIn("normal"); + $.fn.fancybox.updateDetails(); + }); + }); + + } else { + opts.active = true; + + $("#fancy_content").empty(); + + if ($("#fancy_content").is(":animated")) { + console.info('animated!'); + } + + if (opts.itemArray[opts.itemNum].o.zoomSpeedIn > 0) { + opts.animating = true; + itemOpts.opacity = "show"; + + $("#fancy_outer").css({ + 'top': opts.itemArray[opts.itemNum].orig.pos.top - 18, + 'left': opts.itemArray[opts.itemNum].orig.pos.left - 18, + 'height': opts.itemArray[opts.itemNum].orig.height, + 'width': opts.itemArray[opts.itemNum].orig.width + }); + + $("#fancy_content").append($(val)).show(); + + $("#fancy_outer").animate(itemOpts, opts.itemArray[opts.itemNum].o.zoomSpeedIn, function() { + opts.animating = false; + $.fn.fancybox.updateDetails(); + }); + + } else { + $("#fancy_content").append($(val)).show(); + $("#fancy_outer").css(itemOpts).show(); + $.fn.fancybox.updateDetails(); + } + } + }; + + $.fn.fancybox.updateDetails = function() { + $("#fancy_bg,#fancy_close").show(); + + if (opts.itemArray[opts.itemNum].title !== undefined && opts.itemArray[opts.itemNum].title !== '') { + $('#fancy_title div').html(opts.itemArray[opts.itemNum].title); + $('#fancy_title').show(); + } + + if (opts.itemArray[opts.itemNum].o.hideOnContentClick) { + $("#fancy_content").click($.fn.fancybox.close); + } else { + $("#fancy_content").unbind('click'); + } + + if (opts.itemNum != 0) { + $("#fancy_nav").append(''); + + $('#fancy_left').click(function() { + $.fn.fancybox.changeItem(opts.itemNum - 1); return false; + }); + } + + if (opts.itemNum != (opts.itemArray.length - 1)) { + $("#fancy_nav").append(''); + + $('#fancy_right').click(function(){ + $.fn.fancybox.changeItem(opts.itemNum + 1); return false; + }); + } + + $(document).keydown(function(event) { + if (event.keyCode == 27) { + $.fn.fancybox.close(); + + } else if(event.keyCode == 37 && opts.itemNum != 0) { + $.fn.fancybox.changeItem(opts.itemNum - 1); + + } else if(event.keyCode == 39 && opts.itemNum != (opts.itemArray.length - 1)) { + $.fn.fancybox.changeItem(opts.itemNum + 1); + } + }); + }; + + $.fn.fancybox.preloadNeighborImages = function() { + if ((opts.itemArray.length - 1) > opts.itemNum) { + preloadNextImage = new Image(); + preloadNextImage.src = opts.itemArray[opts.itemNum + 1].url; + } + + if (opts.itemNum > 0) { + preloadPrevImage = new Image(); + preloadPrevImage.src = opts.itemArray[opts.itemNum - 1].url; + } + }; + + $.fn.fancybox.close = function() { + if (opts.animating) return false; + + $(imgPreloader).unbind('load'); + $(document).unbind("keydown"); + + $("#fancy_loading,#fancy_title,#fancy_close,#fancy_bg").hide(); + + $("#fancy_nav").empty(); + + opts.active = false; + + if (opts.itemArray[opts.itemNum].o.zoomSpeedOut > 0) { + var itemOpts = { + 'top': opts.itemArray[opts.itemNum].orig.pos.top - 18, + 'left': opts.itemArray[opts.itemNum].orig.pos.left - 18, + 'height': opts.itemArray[opts.itemNum].orig.height, + 'width': opts.itemArray[opts.itemNum].orig.width, + 'opacity': 'hide' + }; + + opts.animating = true; + + $("#fancy_outer").animate(itemOpts, opts.itemArray[opts.itemNum].o.zoomSpeedOut, function() { + $("#fancy_content").hide().empty(); + $("#fancy_overlay,#fancy_bigIframe").remove(); + opts.animating = false; + }); + + } else { + $("#fancy_outer").hide(); + $("#fancy_content").hide().empty(); + $("#fancy_overlay,#fancy_bigIframe").fadeOut("fast").remove(); + } + }; + + $.fn.fancybox.showLoading = function() { + clearInterval(loadingTimer); + + var pos = $.fn.fancybox.getViewport(); + + $("#fancy_loading").css({'left': ((pos[0] - 40) / 2 + pos[2]), 'top': ((pos[1] - 40) / 2 + pos[3])}).show(); + $("#fancy_loading").bind('click', $.fn.fancybox.close); + + loadingTimer = setInterval($.fn.fancybox.animateLoading, 66); + }; + + $.fn.fancybox.animateLoading = function(el, o) { + if (!$("#fancy_loading").is(':visible')){ + clearInterval(loadingTimer); + return; + } + + $("#fancy_loading > div").css('top', (loadingFrame * -40) + 'px'); + + loadingFrame = (loadingFrame + 1) % 12; + }; + + $.fn.fancybox.init = function() { + if (!$('#fancy_wrap').length) { + $('
').appendTo("body"); + $('
').prependTo("#fancy_inner"); + + $('
').appendTo('#fancy_title'); + } + + if ($.browser.msie) { + $("#fancy_inner").prepend(''); + } + + if (jQuery.fn.pngFix) $(document).pngFix(); + + $("#fancy_close").click($.fn.fancybox.close); + }; + + $.fn.fancybox.getPosition = function(el) { + var pos = el.offset(); + + pos.top += $.fn.fancybox.num(el, 'paddingTop'); + pos.top += $.fn.fancybox.num(el, 'borderTopWidth'); + + pos.left += $.fn.fancybox.num(el, 'paddingLeft'); + pos.left += $.fn.fancybox.num(el, 'borderLeftWidth'); + + return pos; + }; + + $.fn.fancybox.num = function (el, prop) { + return parseInt($.curCSS(el.jquery?el[0]:el,prop,true))||0; + }; + + $.fn.fancybox.getPageScroll = function() { + var xScroll, yScroll; + + if (self.pageYOffset) { + yScroll = self.pageYOffset; + xScroll = self.pageXOffset; + } else if (document.documentElement && document.documentElement.scrollTop) { + yScroll = document.documentElement.scrollTop; + xScroll = document.documentElement.scrollLeft; + } else if (document.body) { + yScroll = document.body.scrollTop; + xScroll = document.body.scrollLeft; + } + + return [xScroll, yScroll]; + }; + + $.fn.fancybox.getViewport = function() { + var scroll = $.fn.fancybox.getPageScroll(); + + return [$(window).width(), $(window).height(), scroll[0], scroll[1]]; + }; + + $.fn.fancybox.getMaxSize = function(maxWidth, maxHeight, imageWidth, imageHeight) { + var r = Math.min(Math.min(maxWidth, imageWidth) / imageWidth, Math.min(maxHeight, imageHeight) / imageHeight); + + return [Math.round(r * imageWidth), Math.round(r * imageHeight)]; + }; + + $.fn.fancybox.defaults = { + hideOnContentClick: false, + zoomSpeedIn: 500, + zoomSpeedOut: 500, + frameWidth: 600, + frameHeight: 400, + overlayShow: false, + overlayOpacity: 0.4, + itemLoadCallback: null + }; +})(jQuery); \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/resources/fancy/jquery.pngFix.pack.js b/components/com_morfeoshow/tpl/resources/fancy/jquery.pngFix.pack.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/fancy/jquery.pngFix.pack.js @@ -0,0 +1,11 @@ +/** + * -------------------------------------------------------------------- + * jQuery-Plugin "pngFix" + * Version: 1.1, 11.09.2007 + * by Andreas Eberhard, andreas.eberhard@gmail.com + * http://jquery.andreaseberhard.de/ + * + * Copyright (c) 2007 Andreas Eberhard + * Licensed under GPL (http://www.opensource.org/licenses/gpl-license.php) + */ +eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(s($){3.1s.1k=s(j){j=3.1a({12:\'1m.1j\'},j);8 k=(n.P=="r 10 Z"&&U(n.v)==4&&n.v.E("14 5.5")!=-1);8 l=(n.P=="r 10 Z"&&U(n.v)==4&&n.v.E("14 6.0")!=-1);o(3.17.16&&(k||l)){3(2).L("1r[@m$=.M]").z(s(){3(2).7(\'q\',3(2).q());3(2).7(\'p\',3(2).p());8 a=\'\';8 b=\'\';8 c=(3(2).7(\'K\'))?\'K="\'+3(2).7(\'K\')+\'" \':\'\';8 d=(3(2).7(\'A\'))?\'A="\'+3(2).7(\'A\')+\'" \':\'\';8 e=(3(2).7(\'C\'))?\'C="\'+3(2).7(\'C\')+\'" \':\'\';8 f=(3(2).7(\'B\'))?\'B="\'+3(2).7(\'B\')+\'" \':\'\';8 g=(3(2).7(\'R\'))?\'1d:\'+3(2).7(\'R\')+\';\':\'\';8 h=(3(2).1c().7(\'1b\'))?\'19:18;\':\'\';o(2.9.y){a+=\'y:\'+2.9.y+\';\';2.9.y=\'\'}o(2.9.t){a+=\'t:\'+2.9.t+\';\';2.9.t=\'\'}o(2.9.w){a+=\'w:\'+2.9.w+\';\';2.9.w=\'\'}8 i=(2.9.15);b+=\'\';o(a!=\'\'){b=\'\'+b+\'\'}3(2).1i();3(2).1h(b)});3(2).L("*").z(s(){8 a=3(2).T(\'N-S\');o(a.E(".M")!=-1){8 b=a.X(\'1g("\')[1].X(\'")\')[0];3(2).T(\'N-S\',\'1f\');3(2).Q(0).Y.J="I:H.r.G(m=\'"+b+"\',D=\'F\')"}});3(2).L("1e[@m$=.M]").z(s(){8 a=3(2).7(\'m\');3(2).Q(0).Y.J=\'I:H.r.G\'+\'(m=\\\'\'+a+\'\\\', D=\\\'F\\\');\';3(2).7(\'m\',j.12)})}1t 3}})(3);',62,92,'||this|jQuery||||attr|var|style|||||||||||||src|navigator|if|height|width|Microsoft|function|padding|px|appVersion|margin|span|border|each|class|alt|title|sizingMethod|indexOf|scale|AlphaImageLoader|DXImageTransform|progid|filter|id|find|png|background|display|appName|get|align|image|css|parseInt|block|inline|split|runtimeStyle|Explorer|Internet|relative|blankgif|position|MSIE|cssText|msie|browser|hand|cursor|extend|href|parent|float|input|none|url|after|hide|gif|pngFix|transparent|blank|line|pre|space|white|img|fn|return'.split('|'),0,{})) \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/resources/index.html b/components/com_morfeoshow/tpl/resources/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/index.html @@ -0,0 +1,1 @@ + \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/resources/lightbox/blank.gif b/components/com_morfeoshow/tpl/resources/lightbox/blank.gif new file mode 100644 index 0000000000000000000000000000000000000000..1d11fa9ada9e93505b3d736acb204083f45d5fbf GIT binary patch literal 43 sc${|YaoJCQ*aL>&>=X~ef^Ko*H z#(TFcb*^<%6ty(k&2J}XoxQ6ni9B?L3X`MK=!go{)zz=w^}Qum6z>r_$vHMQ7L7*h z>+4-Em#*uXOvdZ=avYaTCTnVHMn*;&8XAhlBG2=JAY9%(b(>&nwC(|eqH0&#yW;tq zgI_4BYK7U^Z}!J}I7!WW#I!nyJyu?$f^C*2N?B}zK|CZYAsPTc134X{clcr`rbY0u z++EahqSz})#jF%a(`{jA(BcR;%@>8(F9vX1+XoEMTiKNV;HWP0kew^JBbYH=?u4>@0!g? zZXtTuG&K&wLZRR(cs;5<1erh}01*pW)=fOz#y-UqEw^H9m0Xw`PkIwYfx!F-sny5fTGrJP6K3wu2KT7tyh3s=A=6x$sQ+U9ye~s-87K zB;gIhg-+%0m?t|-_-J(_pBwoFgg77Kkbmbq{EX8AcuY;pnSFnN&vW|D3tT|VzY>Nm zIa8i7+wv=Aww8;_7S8qaavm#&o!b}i2Vq%DS>(VEdjK)>kpsUV|68GHX|7CdkDiXT&r)Pwl=JMaumtSXjDYeqM3+_kKu=}ZNC06g9Rwv0P&exBI0-a*}XjV?^>cyye+ Nl!|ut^4B|3rEfpSsQLf^ diff --git a/components/com_morfeoshow/tpl/resources/lightbox/index.html b/components/com_morfeoshow/tpl/resources/lightbox/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/lightbox/index.html @@ -0,0 +1,1 @@ + \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/resources/lightbox/lb.css b/components/com_morfeoshow/tpl/resources/lightbox/lb.css new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/lightbox/lb.css @@ -0,0 +1,100 @@ +/** + * jQuery lightBox plugin + * This jQuery plugin was inspired and based on Lightbox 2 by Lokesh Dhakar (http://www.huddletogether.com/projects/lightbox2/) + * and adapted to me for use like a plugin from jQuery. + * @name jquery-lightbox-0.5.css + * @author Leandro Vieira Pinho - http://leandrovieira.com + * @version 0.5 + * @date April 11, 2008 + * @category jQuery plugin + * @copyright (c) 2008 Leandro Vieira Pinho (leandrovieira.com) + * @license CC Attribution-No Derivative Works 2.5 Brazil - http://creativecommons.org/licenses/by-nd/2.5/br/deed.en_US + * @example Visit http://leandrovieira.com/projects/jquery/lightbox/ for more informations about this jQuery plugin + */ +#jquery-overlay { + position: absolute; + top: 0; + left: 0; + z-index: 90; + width: 100%; + height: 500px; +} +#jquery-lightbox { + position: absolute; + top: 0; + left: 0; + width: 100%; + z-index: 100; + text-align: center; + line-height: 0; +} +#jquery-lightbox a img { border: none; } +#lightbox-container-image-box { + position: relative; + background-color: #181818; + width: 250px; + height: 250px; + margin: 0 auto; +} +#lightbox-container-image { padding: 10px; } +#lightbox-loading { + position: absolute; + top: 40%; + left: 0%; + height: 25%; + width: 100%; + text-align: center; + line-height: 0; +} +#lightbox-nav { + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + z-index: 10; +} +#lightbox-container-image-box > #lightbox-nav { left: 0; } +#lightbox-nav a { outline: none;} +#lightbox-nav-btnPrev, #lightbox-nav-btnNext { + width: 49%; + height: 100%; + display: block; +} +#lightbox-nav-btnPrev { + left: 0; + float: left; +} +#lightbox-nav-btnNext { + right: 0; + float: right; +} +#lightbox-container-image-data-box { + font: 10px Verdana, Helvetica, sans-serif; + background-color: #181818; + margin: 0 auto; + line-height: 1.4em; + overflow: auto; + width: 100%; + padding: 0 10px 0; +} +#lightbox-container-image-data { + padding: 0 10px; + color: #666; +} +#lightbox-container-image-data #lightbox-image-details { + width: 70%; + float: left; + text-align: left; +} +#lightbox-image-details-caption { font-weight: bold; } +#lightbox-image-details-currentNumber { + display: block; + clear: left; + padding-bottom: 1.0em; +} +#lightbox-secNav-btnClose { + width: 22px; + float: right; + padding-bottom: 0.7em; +} \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/resources/lightbox/lb.js b/components/com_morfeoshow/tpl/resources/lightbox/lb.js new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/lightbox/lb.js @@ -0,0 +1,42 @@ +/** + * jQuery lightBox plugin + * This jQuery plugin was inspired and based on Lightbox 2 by Lokesh Dhakar (http://www.huddletogether.com/projects/lightbox2/) + * and adapted to me for use like a plugin from jQuery. + * @name jquery-lightbox-0.5.js + * @author Leandro Vieira Pinho - http://leandrovieira.com + * @version 0.5 + * @date April 11, 2008 + * @category jQuery plugin + * @copyright (c) 2008 Leandro Vieira Pinho (leandrovieira.com) + * @license CC Attribution-No Derivative Works 2.5 Brazil - http://creativecommons.org/licenses/by-nd/2.5/br/deed.en_US + * @example Visit http://leandrovieira.com/projects/jquery/lightbox/ for more informations about this jQuery plugin + */ +(function($){$.fn.lightBox=function(settings){settings=jQuery.extend({overlayBgColor:'#000',overlayOpacity:0.8,fixedNavigation:false,imageLoading:'../../../components/com_morfeoshow/images/lightbox-ico-loading.gif',imageBtnPrev:'../../../components/com_morfeoshow/images/lightbox-btn-prev.gif',imageBtnNext:'../../../components/com_morfeoshow/images/lightbox-btn-next.gif',imageBtnClose:'../../../components/com_morfeoshow/images/lightbox-btn-close.gif',imageBlank:'../../../components/com_morfeoshow/images/lightbox-blank.gif',containerBorderSize:10,containerResizeSpeed:400,txtImage:'Image',txtOf:'of',keyToClose:'c',keyToPrev:'p',keyToNext:'n',imageArray:[],activeImage:0},settings);var jQueryMatchedObj=this;function _initialize(){_start(this,jQueryMatchedObj);return false;} +function _start(objClicked,jQueryMatchedObj){$('embed, object, select').css({'visibility':'hidden'});_set_interface();settings.imageArray.length=0;settings.activeImage=0;if(jQueryMatchedObj.length==1){settings.imageArray.push(new Array(objClicked.getAttribute('href'),objClicked.getAttribute('title')));}else{for(var i=0;i
');var arrPageSizes=___getPageSize();$('#jquery-overlay').css({backgroundColor:settings.overlayBgColor,opacity:settings.overlayOpacity,width:arrPageSizes[0],height:arrPageSizes[1]}).fadeIn();var arrPageScroll=___getPageScroll();$('#jquery-lightbox').css({top:arrPageScroll[1]+(arrPageSizes[3]/10),left:arrPageScroll[0]}).show();$('#jquery-overlay,#jquery-lightbox').click(function(){_finish();});$('#lightbox-loading-link,#lightbox-secNav-btnClose').click(function(){_finish();return false;});$(window).resize(function(){var arrPageSizes=___getPageSize();$('#jquery-overlay').css({width:arrPageSizes[0],height:arrPageSizes[1]});var arrPageScroll=___getPageScroll();$('#jquery-lightbox').css({top:arrPageScroll[1]+(arrPageSizes[3]/10),left:arrPageScroll[0]});});} +function _set_image_to_view(){$('#lightbox-loading').show();if(settings.fixedNavigation){$('#lightbox-image,#lightbox-container-image-data-box,#lightbox-image-details-currentNumber').hide();}else{$('#lightbox-image,#lightbox-nav,#lightbox-nav-btnPrev,#lightbox-nav-btnNext,#lightbox-container-image-data-box,#lightbox-image-details-currentNumber').hide();} +var objImagePreloader=new Image();objImagePreloader.onload=function(){$('#lightbox-image').attr('src',settings.imageArray[settings.activeImage][0]);_resize_container_image_box(objImagePreloader.width,objImagePreloader.height);objImagePreloader.onload=function(){};};objImagePreloader.src=settings.imageArray[settings.activeImage][0];};function _resize_container_image_box(intImageWidth,intImageHeight){var intCurrentWidth=$('#lightbox-container-image-box').width();var intCurrentHeight=$('#lightbox-container-image-box').height();var intWidth=(intImageWidth+(settings.containerBorderSize*2));var intHeight=(intImageHeight+(settings.containerBorderSize*2));var intDiffW=intCurrentWidth-intWidth;var intDiffH=intCurrentHeight-intHeight;$('#lightbox-container-image-box').animate({width:intWidth,height:intHeight},settings.containerResizeSpeed,function(){_show_image();});if((intDiffW==0)&&(intDiffH==0)){if($.browser.msie){___pause(250);}else{___pause(100);}} +$('#lightbox-container-image-data-box').css({width:intImageWidth});$('#lightbox-nav-btnPrev,#lightbox-nav-btnNext').css({height:intImageHeight+(settings.containerBorderSize*2)});};function _show_image(){$('#lightbox-loading').hide();$('#lightbox-image').fadeIn(function(){_show_image_data();_set_navigation();});_preload_neighbor_images();};function _show_image_data(){$('#lightbox-container-image-data-box').slideDown('fast');$('#lightbox-image-details-caption').hide();if(settings.imageArray[settings.activeImage][1]){$('#lightbox-image-details-caption').html(settings.imageArray[settings.activeImage][1]).show();} +if(settings.imageArray.length>1){$('#lightbox-image-details-currentNumber').html(settings.txtImage+' '+(settings.activeImage+1)+' '+settings.txtOf+' '+settings.imageArray.length).show();}} +function _set_navigation(){$('#lightbox-nav').show();$('#lightbox-nav-btnPrev,#lightbox-nav-btnNext').css({'background':'transparent url('+settings.imageBlank+') no-repeat'});if(settings.activeImage!=0){if(settings.fixedNavigation){$('#lightbox-nav-btnPrev').css({'background':'url('+settings.imageBtnPrev+') left 15% no-repeat'}).unbind().bind('click',function(){settings.activeImage=settings.activeImage-1;_set_image_to_view();return false;});}else{$('#lightbox-nav-btnPrev').unbind().hover(function(){$(this).css({'background':'url('+settings.imageBtnPrev+') left 15% no-repeat'});},function(){$(this).css({'background':'transparent url('+settings.imageBlank+') no-repeat'});}).show().bind('click',function(){settings.activeImage=settings.activeImage-1;_set_image_to_view();return false;});}} +if(settings.activeImage!=(settings.imageArray.length-1)){if(settings.fixedNavigation){$('#lightbox-nav-btnNext').css({'background':'url('+settings.imageBtnNext+') right 15% no-repeat'}).unbind().bind('click',function(){settings.activeImage=settings.activeImage+1;_set_image_to_view();return false;});}else{$('#lightbox-nav-btnNext').unbind().hover(function(){$(this).css({'background':'url('+settings.imageBtnNext+') right 15% no-repeat'});},function(){$(this).css({'background':'transparent url('+settings.imageBlank+') no-repeat'});}).show().bind('click',function(){settings.activeImage=settings.activeImage+1;_set_image_to_view();return false;});}} +_enable_keyboard_navigation();} +function _enable_keyboard_navigation(){$(document).keydown(function(objEvent){_keyboard_action(objEvent);});} +function _disable_keyboard_navigation(){$(document).unbind();} +function _keyboard_action(objEvent){if(objEvent==null){keycode=event.keyCode;escapeKey=27;}else{keycode=objEvent.keyCode;escapeKey=objEvent.DOM_VK_ESCAPE;} +key=String.fromCharCode(keycode).toLowerCase();if((key==settings.keyToClose)||(key=='x')||(keycode==escapeKey)){_finish();} +if((key==settings.keyToPrev)||(keycode==37)){if(settings.activeImage!=0){settings.activeImage=settings.activeImage-1;_set_image_to_view();_disable_keyboard_navigation();}} +if((key==settings.keyToNext)||(keycode==39)){if(settings.activeImage!=(settings.imageArray.length-1)){settings.activeImage=settings.activeImage+1;_set_image_to_view();_disable_keyboard_navigation();}}} +function _preload_neighbor_images(){if((settings.imageArray.length-1)>settings.activeImage){objNext=new Image();objNext.src=settings.imageArray[settings.activeImage+1][0];} +if(settings.activeImage>0){objPrev=new Image();objPrev.src=settings.imageArray[settings.activeImage-1][0];}} +function _finish(){$('#jquery-lightbox').remove();$('#jquery-overlay').fadeOut(function(){$('#jquery-overlay').remove();});$('embed, object, select').css({'visibility':'visible'});} +function ___getPageSize(){var xScroll,yScroll;if(window.innerHeight&&window.scrollMaxY){xScroll=window.innerWidth+window.scrollMaxX;yScroll=window.innerHeight+window.scrollMaxY;}else if(document.body.scrollHeight>document.body.offsetHeight){xScroll=document.body.scrollWidth;yScroll=document.body.scrollHeight;}else{xScroll=document.body.offsetWidth;yScroll=document.body.offsetHeight;} +var windowWidth,windowHeight;if(self.innerHeight){if(document.documentElement.clientWidth){windowWidth=document.documentElement.clientWidth;}else{windowWidth=self.innerWidth;} +windowHeight=self.innerHeight;}else if(document.documentElement&&document.documentElement.clientHeight){windowWidth=document.documentElement.clientWidth;windowHeight=document.documentElement.clientHeight;}else if(document.body){windowWidth=document.body.clientWidth;windowHeight=document.body.clientHeight;} +if(yScrollp~&KF|02 z%=~zMK2FZ@EPw^P0RRSrarNreHEY%+Cnx*+`^Uw_X*8Ousw#VXdn+p|A0MCI-rmvC zQQ*U4_IG1$+P3(NZ9-O7VnzZherJ64u9SG8P2%qDDS+885I~!I>mTTP@30MAk6>?m z8xCkNd$e-y>$#r-(Bnm;eu?p#nX$(LzQm%{2QzFBC3z^qPOKzr>^DqVa~y1KFD0u} z%|vwi(D;+Ib4Gl8Aqw6&~vrrx-xRW~-dT9L~gCce2tgkhX2P@Z#hN zA)TC+&2x`}Xglaoah9*3)O0W6;V$P;BVt-&WUf>a40dQ*4!LUdN?%>M`pD7N9@8ey zsoo5Bt#5kS{H~TPxmdn=-}kTI1EXOSc1GcmeNq7|ds%nPZRYm>D}9<>Nqa z^{Kh34n>9(VFCv4jKAdUz_X(P`c~nj@vG&MsN`(slPbj!W(cujFgkr*lMybSxnOvJ zMS+e(c8uSahZc9s316JH+Q2U4_OMFjlgnUKKiWLJ?+Pq1YKvk~?(6jYUL{J4^)9 z&ri@e<3?5zBN{89Z%KzAsq|H{WXxMPvW0#Uf>Uu#I1Md?;$U^&O|$)$D$g z183>ye7X`V>;@GaS(#X>z4BGmNhNV$$mwEs`PcFas_4+Ab!B+j9k&NZfGOa>$c2aB zKLNVVGoLxVejMf2RWXBK(omeG4tHp*KIS+lteq{m2?dE0Rfc8f1o(TgwT-?;_& z8?9XO=anAu^%T8vYj{@NY6CxZ@Pmhxg_&r`l2xlnxtu~I(JoBFgLh<^^qBT=>k+J7b9mLkQ@jRtzasU_IgXarO!WANrbrx!(Nd1zMQw6U zk_;Nk9wR7Wvdwv;E2;s>ow%u~9DZw6dN2O0WqM8GW*xig){EW0y5Ga6?qA+>clEZh z&jSZLKBgb~kMUdUX2vY7yfwnu`Wk|v9SRPmdQcQDW?%kIlqN5#YY}ACEnqu}&3PRw zgci}}Qu#ao?oS7N627cKz<8V)0tHuYNoAW1mfCvy1jlR*Uof>`ZP<7QX`^i_LgpLfFT9y)$DXDbl_}lW-(Oky^7w4wF6P%Vx#>)#{Gszk7~d1Dz|v#pBVVu zZ6a#IwfydJLfj;Dt78R`iZUX9a@%A1*<#OyAIA^RSMX+T0fctWE&y|XHmkLvhOW|j zhiuZ<9K*lGUj_)}<$wJ=>X?@HHle5?=}CxcpST2fn9Rh_W2>Xy`O%9F43D&tp!Ev` z8&PScII~vjprpOHkXH0F^(Z?>!2D!Q9GjG4o3__IZA0?ZYdYXcmCxrC(dZiQ9bTWn^bnseS zB(y!xBA9vy%MEzAHW;{!p$cWtY5=`6KHz=h4fLa28S&JD(f8=`Vgn&S@*iJjg-iaF z8nJkAz~aLuK<0aRI?sb-HVQ05Rp{WR^<~z<)&@r=U2jC_vInB}UX8}#s@#D>lzKsW*sGg0k)DuU|Eh+kzP2b(mI42jFi22L7mV8+m z0ajGPS$S(^l?t#{&aVfn6Ge{YZ7yJT5g$SjxWI#}(~%D?&vPyyA4A9)q8L*cje$<- z^j;1O*K80)`w3Xr9a1P+z1-?1Vsz(QKW7>F=22jB zT?!YzNhW5(*76^IGkup3e#d-C|0(v}1{7?K8>>IJ+ z@BE86lvPV$eUBpHRv%HUj2~#+$qL6|G?(j_WRfi4FOzQN*UE9R6SX8aUS99iyjxk% zXlkz0NQ)wBTx7N|g6we#EM(HiU0vKvaXxUmk6dQ#ozRnXtc&ajP{DJ+oQ2I@-Nhj2 z80=;nPPqq0`TEEwo!8=lgKXL)@5^fPaR??{0DZvTW_DvcdVv$D>31IzeVCvLo3vXwkY7P@9~W)9_C0TUH*h0 z$HjZlHaUC(|);Gs^42Ux55;d&adtEF}s} Va4$94^Y(s};xO9)*N<0;e**hBss;c6 diff --git a/components/com_morfeoshow/tpl/resources/lightbox/next.gif b/components/com_morfeoshow/tpl/resources/lightbox/next.gif new file mode 100644 index 0000000000000000000000000000000000000000..a0d4fcf84a784f2cf44c33084145dde5df294ccf GIT binary patch literal 812 zc${C%M@7tWnKck0xs6DLj_ zJ9g~Qp+g4_9N4pG&#qm&wr$(CWy_Y$n>TOVxN-gZ^=sFzUA=ns%9SgZFJHcN>C(lE z7tftLclPYrGiT16IB{Zse}8XpZ+CZhdwY9pYio0Jb7Ny;LqkJdU0qdGRYgTbSy@?0 zNl8ILL0(>7PEJl%R#rwvMp{~0N=iynQc^-fLR?&2OiWBvR8&MnL|9l@NJvOfP*6ZX zfS;eAudlDSx3{OKr@OnmtE;QCvop}+41)kD{$ycfX9#A{0dYWa!odE&Avl0@+?+0=!B+trwp=kF;A-vpKu2U1)c7QrOkrI(<7Y<0;|^v9$&b7b1DRa8gjhKQcWgZ3(dw+Wz{Epy;(->G z&q;b5NiOXtq~0AlTM?u(XW;_pP){2H1=q%oaay=@ zRn(h~*-oDPH4d{JB6Xj(aHzL&23ix-rz&z;-5`}_L`hr7#7;wCNlG=Yhc!5RQqDL0h> diff --git a/components/com_morfeoshow/tpl/resources/lightbox/prev.gif b/components/com_morfeoshow/tpl/resources/lightbox/prev.gif new file mode 100644 index 0000000000000000000000000000000000000000..040ee5992f7fdb9b51907cb4ba1c5570b1b5482a GIT binary patch literal 832 zc${gCIq&!0bk`t<4J$B!RAe0cx<{kwPX-oAbN)~#DNZrr$b?b?+qS1w$*aPHi>GiT16 zK7IP+$&<&AA3u8Z=;6bM4<0Ta{2P*ix)3mxNzb8`Sa(^n>T09oLRGG&6qJ`%9JS+CQRt>@9*vHZEbCBZf^0EX>c(&&|!v&d$!v%uG#9O-@cuN=iydNQjGz zi;0Peii(PehzJV{3keAc4h{|s4D|Q+_x1Jl_V)Jl^mKQ3cXD!aaBu(y1q0oI;!hSv zc7{j>9S{c;Ck*WW8yK3JTUy)NJ371CA|t!|Crs?`n>2OW^cgc}&7L!N-uwj%7cE}0 zblLJ1D`zuHC@9E_vNQ>=Qfcbpppe)(Ny)A6fdoUsArVQ26qQ5+ zlXgLVS&b7_+gzBrw3O$vcy<^aW^Cc$b9yJh^zZ~v%kw&kqKPhz4Dud)0dtei3bbpQ zPZE(?#mo`zq&LNaL80kXcXnV#h(xYp;{q1vRUbGid)OzQZceZ%Ok3bSm6v~B#Lh#~ z-JFh$2{D#|S_hig*05?$*bwH}%F3+bGs8~y-~wh5i&eMkIuA53G9BXn;iq8v-Gzy1 dMg0DMdwzfa@c8t6|NZ||y}pT>a# diff --git a/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/DB.php b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/DB.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/DB.php @@ -0,0 +1,1388 @@ + + * @author Tomas V.V.Cox + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: DB.php 32 2005-08-01 06:21:02Z dancoulter $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the PEAR class so it can be extended from + */ +require_once 'PEAR.php'; + + +// {{{ constants +// {{{ error codes + +/**#@+ + * One of PEAR DB's portable error codes. + * @see DB_common::errorCode(), DB::errorMessage() + * + * {@internal If you add an error code here, make sure you also add a textual + * version of it in DB::errorMessage().}} + */ + +/** + * The code returned by many methods upon success + */ +define('DB_OK', 1); + +/** + * Unkown error + */ +define('DB_ERROR', -1); + +/** + * Syntax error + */ +define('DB_ERROR_SYNTAX', -2); + +/** + * Tried to insert a duplicate value into a primary or unique index + */ +define('DB_ERROR_CONSTRAINT', -3); + +/** + * An identifier in the query refers to a non-existant object + */ +define('DB_ERROR_NOT_FOUND', -4); + +/** + * Tried to create a duplicate object + */ +define('DB_ERROR_ALREADY_EXISTS', -5); + +/** + * The current driver does not support the action you attempted + */ +define('DB_ERROR_UNSUPPORTED', -6); + +/** + * The number of parameters does not match the number of placeholders + */ +define('DB_ERROR_MISMATCH', -7); + +/** + * A literal submitted did not match the data type expected + */ +define('DB_ERROR_INVALID', -8); + +/** + * The current DBMS does not support the action you attempted + */ +define('DB_ERROR_NOT_CAPABLE', -9); + +/** + * A literal submitted was too long so the end of it was removed + */ +define('DB_ERROR_TRUNCATED', -10); + +/** + * A literal number submitted did not match the data type expected + */ +define('DB_ERROR_INVALID_NUMBER', -11); + +/** + * A literal date submitted did not match the data type expected + */ +define('DB_ERROR_INVALID_DATE', -12); + +/** + * Attempt to divide something by zero + */ +define('DB_ERROR_DIVZERO', -13); + +/** + * A database needs to be selected + */ +define('DB_ERROR_NODBSELECTED', -14); + +/** + * Could not create the object requested + */ +define('DB_ERROR_CANNOT_CREATE', -15); + +/** + * Could not drop the database requested because it does not exist + */ +define('DB_ERROR_CANNOT_DROP', -17); + +/** + * An identifier in the query refers to a non-existant table + */ +define('DB_ERROR_NOSUCHTABLE', -18); + +/** + * An identifier in the query refers to a non-existant column + */ +define('DB_ERROR_NOSUCHFIELD', -19); + +/** + * The data submitted to the method was inappropriate + */ +define('DB_ERROR_NEED_MORE_DATA', -20); + +/** + * The attempt to lock the table failed + */ +define('DB_ERROR_NOT_LOCKED', -21); + +/** + * The number of columns doesn't match the number of values + */ +define('DB_ERROR_VALUE_COUNT_ON_ROW', -22); + +/** + * The DSN submitted has problems + */ +define('DB_ERROR_INVALID_DSN', -23); + +/** + * Could not connect to the database + */ +define('DB_ERROR_CONNECT_FAILED', -24); + +/** + * The PHP extension needed for this DBMS could not be found + */ +define('DB_ERROR_EXTENSION_NOT_FOUND',-25); + +/** + * The present user has inadequate permissions to perform the task requestd + */ +define('DB_ERROR_ACCESS_VIOLATION', -26); + +/** + * The database requested does not exist + */ +define('DB_ERROR_NOSUCHDB', -27); + +/** + * Tried to insert a null value into a column that doesn't allow nulls + */ +define('DB_ERROR_CONSTRAINT_NOT_NULL',-29); +/**#@-*/ + + +// }}} +// {{{ prepared statement-related + + +/**#@+ + * Identifiers for the placeholders used in prepared statements. + * @see DB_common::prepare() + */ + +/** + * Indicates a scalar (?) placeholder was used + * + * Quote and escape the value as necessary. + */ +define('DB_PARAM_SCALAR', 1); + +/** + * Indicates an opaque (&) placeholder was used + * + * The value presented is a file name. Extract the contents of that file + * and place them in this column. + */ +define('DB_PARAM_OPAQUE', 2); + +/** + * Indicates a misc (!) placeholder was used + * + * The value should not be quoted or escaped. + */ +define('DB_PARAM_MISC', 3); +/**#@-*/ + + +// }}} +// {{{ binary data-related + + +/**#@+ + * The different ways of returning binary data from queries. + */ + +/** + * Sends the fetched data straight through to output + */ +define('DB_BINMODE_PASSTHRU', 1); + +/** + * Lets you return data as usual + */ +define('DB_BINMODE_RETURN', 2); + +/** + * Converts the data to hex format before returning it + * + * For example the string "123" would become "313233". + */ +define('DB_BINMODE_CONVERT', 3); +/**#@-*/ + + +// }}} +// {{{ fetch modes + + +/**#@+ + * Fetch Modes. + * @see DB_common::setFetchMode() + */ + +/** + * Indicates the current default fetch mode should be used + * @see DB_common::$fetchmode + */ +define('DB_FETCHMODE_DEFAULT', 0); + +/** + * Column data indexed by numbers, ordered from 0 and up + */ +define('DB_FETCHMODE_ORDERED', 1); + +/** + * Column data indexed by column names + */ +define('DB_FETCHMODE_ASSOC', 2); + +/** + * Column data as object properties + */ +define('DB_FETCHMODE_OBJECT', 3); + +/** + * For multi-dimensional results, make the column name the first level + * of the array and put the row number in the second level of the array + * + * This is flipped from the normal behavior, which puts the row numbers + * in the first level of the array and the column names in the second level. + */ +define('DB_FETCHMODE_FLIPPED', 4); +/**#@-*/ + +/**#@+ + * Old fetch modes. Left here for compatibility. + */ +define('DB_GETMODE_ORDERED', DB_FETCHMODE_ORDERED); +define('DB_GETMODE_ASSOC', DB_FETCHMODE_ASSOC); +define('DB_GETMODE_FLIPPED', DB_FETCHMODE_FLIPPED); +/**#@-*/ + + +// }}} +// {{{ tableInfo() && autoPrepare()-related + + +/**#@+ + * The type of information to return from the tableInfo() method. + * + * Bitwised constants, so they can be combined using | + * and removed using ^. + * + * @see DB_common::tableInfo() + * + * {@internal Since the TABLEINFO constants are bitwised, if more of them are + * added in the future, make sure to adjust DB_TABLEINFO_FULL accordingly.}} + */ +define('DB_TABLEINFO_ORDER', 1); +define('DB_TABLEINFO_ORDERTABLE', 2); +define('DB_TABLEINFO_FULL', 3); +/**#@-*/ + + +/**#@+ + * The type of query to create with the automatic query building methods. + * @see DB_common::autoPrepare(), DB_common::autoExecute() + */ +define('DB_AUTOQUERY_INSERT', 1); +define('DB_AUTOQUERY_UPDATE', 2); +/**#@-*/ + + +// }}} +// {{{ portability modes + + +/**#@+ + * Portability Modes. + * + * Bitwised constants, so they can be combined using | + * and removed using ^. + * + * @see DB_common::setOption() + * + * {@internal Since the PORTABILITY constants are bitwised, if more of them are + * added in the future, make sure to adjust DB_PORTABILITY_ALL accordingly.}} + */ + +/** + * Turn off all portability features + */ +define('DB_PORTABILITY_NONE', 0); + +/** + * Convert names of tables and fields to lower case + * when using the get*(), fetch*() and tableInfo() methods + */ +define('DB_PORTABILITY_LOWERCASE', 1); + +/** + * Right trim the data output by get*() and fetch*() + */ +define('DB_PORTABILITY_RTRIM', 2); + +/** + * Force reporting the number of rows deleted + */ +define('DB_PORTABILITY_DELETE_COUNT', 4); + +/** + * Enable hack that makes numRows() work in Oracle + */ +define('DB_PORTABILITY_NUMROWS', 8); + +/** + * Makes certain error messages in certain drivers compatible + * with those from other DBMS's + * + * + mysql, mysqli: change unique/primary key constraints + * DB_ERROR_ALREADY_EXISTS -> DB_ERROR_CONSTRAINT + * + * + odbc(access): MS's ODBC driver reports 'no such field' as code + * 07001, which means 'too few parameters.' When this option is on + * that code gets mapped to DB_ERROR_NOSUCHFIELD. + */ +define('DB_PORTABILITY_ERRORS', 16); + +/** + * Convert null values to empty strings in data output by + * get*() and fetch*() + */ +define('DB_PORTABILITY_NULL_TO_EMPTY', 32); + +/** + * Turn on all portability features + */ +define('DB_PORTABILITY_ALL', 63); +/**#@-*/ + +// }}} + + +// }}} +// {{{ class DB + +/** + * Database independent query interface + * + * The main "DB" class is simply a container class with some static + * methods for creating DB objects as well as some utility functions + * common to all parts of DB. + * + * The object model of DB is as follows (indentation means inheritance): + *
+ * DB           The main DB class.  This is simply a utility class
+ *              with some "static" methods for creating DB objects as
+ *              well as common utility functions for other DB classes.
+ *
+ * DB_common    The base for each DB implementation.  Provides default
+ * |            implementations (in OO lingo virtual methods) for
+ * |            the actual DB implementations as well as a bunch of
+ * |            query utility functions.
+ * |
+ * +-DB_mysql   The DB implementation for MySQL.  Inherits DB_common.
+ *              When calling DB::factory or DB::connect for MySQL
+ *              connections, the object returned is an instance of this
+ *              class.
+ * 
+ * + * @category Database + * @package DB + * @author Stig Bakken + * @author Tomas V.V.Cox + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: @package_version@ + * @link http://pear.php.net/package/DB + */ +class DB +{ + // {{{ &factory() + + /** + * Create a new DB object for the specified database type but don't + * connect to the database + * + * @param string $type the database type (eg "mysql") + * @param array $options an associative array of option names and values + * + * @return object a new DB object. A DB_Error object on failure. + * + * @see DB_common::setOption() + */ + function &factory($type, $options = false) + { + if (!is_array($options)) { + $options = array('persistent' => $options); + } + + if (isset($options['debug']) && $options['debug'] >= 2) { + // expose php errors with sufficient debug level + include_once "DB/{$type}.php"; + } else { + @include_once "DB/{$type}.php"; + } + + $classname = "DB_${type}"; + + if (!class_exists($classname)) { + $tmp = PEAR::raiseError(null, DB_ERROR_NOT_FOUND, null, null, + "Unable to include the DB/{$type}.php" + . " file for '$dsn'", + 'DB_Error', true); + return $tmp; + } + + @$obj =& new $classname; + + foreach ($options as $option => $value) { + $test = $obj->setOption($option, $value); + if (DB::isError($test)) { + return $test; + } + } + + return $obj; + } + + // }}} + // {{{ &connect() + + /** + * Create a new DB object including a connection to the specified database + * + * Example 1. + * + * require_once 'DB.php'; + * + * $dsn = 'pgsql://user:password@host/database'; + * $options = array( + * 'debug' => 2, + * 'portability' => DB_PORTABILITY_ALL, + * ); + * + * $db =& DB::connect($dsn, $options); + * if (PEAR::isError($db)) { + * die($db->getMessage()); + * } + * + * + * @param mixed $dsn the string "data source name" or array in the + * format returned by DB::parseDSN() + * @param array $options an associative array of option names and values + * + * @return object a new DB object. A DB_Error object on failure. + * + * @uses DB_dbase::connect(), DB_fbsql::connect(), DB_ibase::connect(), + * DB_ifx::connect(), DB_msql::connect(), DB_mssql::connect(), + * DB_mysql::connect(), DB_mysqli::connect(), DB_oci8::connect(), + * DB_odbc::connect(), DB_pgsql::connect(), DB_sqlite::connect(), + * DB_sybase::connect() + * + * @uses DB::parseDSN(), DB_common::setOption(), PEAR::isError() + */ + function &connect($dsn, $options = array()) + { + $dsninfo = DB::parseDSN($dsn); + $type = $dsninfo['phptype']; + + if (!is_array($options)) { + /* + * For backwards compatibility. $options used to be boolean, + * indicating whether the connection should be persistent. + */ + $options = array('persistent' => $options); + } + + if (isset($options['debug']) && $options['debug'] >= 2) { + // expose php errors with sufficient debug level + include_once "DB/${type}.php"; + } else { + @include_once "DB/${type}.php"; + } + + $classname = "DB_${type}"; + if (!class_exists($classname)) { + $tmp = PEAR::raiseError(null, DB_ERROR_NOT_FOUND, null, null, + "Unable to include the DB/{$type}.php" + . " file for '$dsn'", + 'DB_Error', true); + return $tmp; + } + + @$obj =& new $classname; + + foreach ($options as $option => $value) { + $test = $obj->setOption($option, $value); + if (DB::isError($test)) { + return $test; + } + } + + $err = $obj->connect($dsninfo, $obj->getOption('persistent')); + if (DB::isError($err)) { + $err->addUserInfo($dsn); + return $err; + } + + return $obj; + } + + // }}} + // {{{ apiVersion() + + /** + * Return the DB API version + * + * @return string the DB API version number + */ + function apiVersion() + { + return '@package_version@'; + } + + // }}} + // {{{ isError() + + /** + * Determines if a variable is a DB_Error object + * + * @param mixed $value the variable to check + * + * @return bool whether $value is DB_Error object + */ + function isError($value) + { + return is_a($value, 'DB_Error'); + } + + // }}} + // {{{ isConnection() + + /** + * Determines if a value is a DB_ object + * + * @param mixed $value the value to test + * + * @return bool whether $value is a DB_ object + */ + function isConnection($value) + { + return (is_object($value) && + is_subclass_of($value, 'db_common') && + method_exists($value, 'simpleQuery')); + } + + // }}} + // {{{ isManip() + + /** + * Tell whether a query is a data manipulation or data definition query + * + * Examples of data manipulation queries are INSERT, UPDATE and DELETE. + * Examples of data definition queries are CREATE, DROP, ALTER, GRANT, + * REVOKE. + * + * @param string $query the query + * + * @return boolean whether $query is a data manipulation query + */ + function isManip($query) + { + $manips = 'INSERT|UPDATE|DELETE|REPLACE|' + . 'CREATE|DROP|' + . 'LOAD DATA|SELECT .* INTO|COPY|' + . 'ALTER|GRANT|REVOKE|' + . 'LOCK|UNLOCK'; + if (preg_match('/^\s*"?(' . $manips . ')\s+/i', $query)) { + return true; + } + return false; + } + + // }}} + // {{{ errorMessage() + + /** + * Return a textual error message for a DB error code + * + * @param integer $value the DB error code + * + * @return string the error message or false if the error code was + * not recognized + */ + function errorMessage($value) + { + static $errorMessages; + if (!isset($errorMessages)) { + $errorMessages = array( + DB_ERROR => 'unknown error', + DB_ERROR_ACCESS_VIOLATION => 'insufficient permissions', + DB_ERROR_ALREADY_EXISTS => 'already exists', + DB_ERROR_CANNOT_CREATE => 'can not create', + DB_ERROR_CANNOT_DROP => 'can not drop', + DB_ERROR_CONNECT_FAILED => 'connect failed', + DB_ERROR_CONSTRAINT => 'constraint violation', + DB_ERROR_CONSTRAINT_NOT_NULL=> 'null value violates not-null constraint', + DB_ERROR_DIVZERO => 'division by zero', + DB_ERROR_EXTENSION_NOT_FOUND=> 'extension not found', + DB_ERROR_INVALID => 'invalid', + DB_ERROR_INVALID_DATE => 'invalid date or time', + DB_ERROR_INVALID_DSN => 'invalid DSN', + DB_ERROR_INVALID_NUMBER => 'invalid number', + DB_ERROR_MISMATCH => 'mismatch', + DB_ERROR_NEED_MORE_DATA => 'insufficient data supplied', + DB_ERROR_NODBSELECTED => 'no database selected', + DB_ERROR_NOSUCHDB => 'no such database', + DB_ERROR_NOSUCHFIELD => 'no such field', + DB_ERROR_NOSUCHTABLE => 'no such table', + DB_ERROR_NOT_CAPABLE => 'DB backend not capable', + DB_ERROR_NOT_FOUND => 'not found', + DB_ERROR_NOT_LOCKED => 'not locked', + DB_ERROR_SYNTAX => 'syntax error', + DB_ERROR_UNSUPPORTED => 'not supported', + DB_ERROR_TRUNCATED => 'truncated', + DB_ERROR_VALUE_COUNT_ON_ROW => 'value count on row', + DB_OK => 'no error', + ); + } + + if (DB::isError($value)) { + $value = $value->getCode(); + } + + return isset($errorMessages[$value]) ? $errorMessages[$value] + : $errorMessages[DB_ERROR]; + } + + // }}} + // {{{ parseDSN() + + /** + * Parse a data source name + * + * Additional keys can be added by appending a URI query string to the + * end of the DSN. + * + * The format of the supplied DSN is in its fullest form: + * + * phptype(dbsyntax)://username:password@protocol+hostspec/database?option=8&another=true + * + * + * Most variations are allowed: + * + * phptype://username:password@protocol+hostspec:110//usr/db_file.db?mode=0644 + * phptype://username:password@hostspec/database_name + * phptype://username:password@hostspec + * phptype://username@hostspec + * phptype://hostspec/database + * phptype://hostspec + * phptype(dbsyntax) + * phptype + * + * + * @param string $dsn Data Source Name to be parsed + * + * @return array an associative array with the following keys: + * + phptype: Database backend used in PHP (mysql, odbc etc.) + * + dbsyntax: Database used with regards to SQL syntax etc. + * + protocol: Communication protocol to use (tcp, unix etc.) + * + hostspec: Host specification (hostname[:port]) + * + database: Database to use on the DBMS server + * + username: User name for login + * + password: Password for login + */ + function parseDSN($dsn) + { + $parsed = array( + 'phptype' => false, + 'dbsyntax' => false, + 'username' => false, + 'password' => false, + 'protocol' => false, + 'hostspec' => false, + 'port' => false, + 'socket' => false, + 'database' => false, + ); + + if (is_array($dsn)) { + $dsn = array_merge($parsed, $dsn); + if (!$dsn['dbsyntax']) { + $dsn['dbsyntax'] = $dsn['phptype']; + } + return $dsn; + } + + // Find phptype and dbsyntax + if (($pos = strpos($dsn, '://')) !== false) { + $str = substr($dsn, 0, $pos); + $dsn = substr($dsn, $pos + 3); + } else { + $str = $dsn; + $dsn = null; + } + + // Get phptype and dbsyntax + // $str => phptype(dbsyntax) + if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) { + $parsed['phptype'] = $arr[1]; + $parsed['dbsyntax'] = !$arr[2] ? $arr[1] : $arr[2]; + } else { + $parsed['phptype'] = $str; + $parsed['dbsyntax'] = $str; + } + + if (!count($dsn)) { + return $parsed; + } + + // Get (if found): username and password + // $dsn => username:password@protocol+hostspec/database + if (($at = strrpos($dsn,'@')) !== false) { + $str = substr($dsn, 0, $at); + $dsn = substr($dsn, $at + 1); + if (($pos = strpos($str, ':')) !== false) { + $parsed['username'] = rawurldecode(substr($str, 0, $pos)); + $parsed['password'] = rawurldecode(substr($str, $pos + 1)); + } else { + $parsed['username'] = rawurldecode($str); + } + } + + // Find protocol and hostspec + + if (preg_match('|^([^(]+)\((.*?)\)/?(.*?)$|', $dsn, $match)) { + // $dsn => proto(proto_opts)/database + $proto = $match[1]; + $proto_opts = $match[2] ? $match[2] : false; + $dsn = $match[3]; + + } else { + // $dsn => protocol+hostspec/database (old format) + if (strpos($dsn, '+') !== false) { + list($proto, $dsn) = explode('+', $dsn, 2); + } + if (strpos($dsn, '/') !== false) { + list($proto_opts, $dsn) = explode('/', $dsn, 2); + } else { + $proto_opts = $dsn; + $dsn = null; + } + } + + // process the different protocol options + $parsed['protocol'] = (!empty($proto)) ? $proto : 'tcp'; + $proto_opts = rawurldecode($proto_opts); + if ($parsed['protocol'] == 'tcp') { + if (strpos($proto_opts, ':') !== false) { + list($parsed['hostspec'], + $parsed['port']) = explode(':', $proto_opts); + } else { + $parsed['hostspec'] = $proto_opts; + } + } elseif ($parsed['protocol'] == 'unix') { + $parsed['socket'] = $proto_opts; + } + + // Get dabase if any + // $dsn => database + if ($dsn) { + if (($pos = strpos($dsn, '?')) === false) { + // /database + $parsed['database'] = rawurldecode($dsn); + } else { + // /database?param1=value1¶m2=value2 + $parsed['database'] = rawurldecode(substr($dsn, 0, $pos)); + $dsn = substr($dsn, $pos + 1); + if (strpos($dsn, '&') !== false) { + $opts = explode('&', $dsn); + } else { // database?param1=value1 + $opts = array($dsn); + } + foreach ($opts as $opt) { + list($key, $value) = explode('=', $opt); + if (!isset($parsed[$key])) { + // don't allow params overwrite + $parsed[$key] = rawurldecode($value); + } + } + } + } + + return $parsed; + } + + // }}} +} + +// }}} +// {{{ class DB_Error + +/** + * DB_Error implements a class for reporting portable database error + * messages + * + * @category Database + * @package DB + * @author Stig Bakken + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: @package_version@ + * @link http://pear.php.net/package/DB + */ +class DB_Error extends PEAR_Error +{ + // {{{ constructor + + /** + * DB_Error constructor + * + * @param mixed $code DB error code, or string with error message + * @param int $mode what "error mode" to operate in + * @param int $level what error level to use for $mode & + * PEAR_ERROR_TRIGGER + * @param mixed $debuginfo additional debug info, such as the last query + * + * @see PEAR_Error + */ + function DB_Error($code = DB_ERROR, $mode = PEAR_ERROR_RETURN, + $level = E_USER_NOTICE, $debuginfo = null) + { + if (is_int($code)) { + $this->PEAR_Error('DB Error: ' . DB::errorMessage($code), $code, + $mode, $level, $debuginfo); + } else { + $this->PEAR_Error("DB Error: $code", DB_ERROR, + $mode, $level, $debuginfo); + } + } + + // }}} +} + +// }}} +// {{{ class DB_result + +/** + * This class implements a wrapper for a DB result set + * + * A new instance of this class will be returned by the DB implementation + * after processing a query that returns data. + * + * @category Database + * @package DB + * @author Stig Bakken + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: @package_version@ + * @link http://pear.php.net/package/DB + */ +class DB_result +{ + // {{{ properties + + /** + * Should results be freed automatically when there are no more rows? + * @var boolean + * @see DB_common::$options + */ + var $autofree; + + /** + * A reference to the DB_ object + * @var object + */ + var $dbh; + + /** + * The current default fetch mode + * @var integer + * @see DB_common::$fetchmode + */ + var $fetchmode; + + /** + * The name of the class into which results should be fetched when + * DB_FETCHMODE_OBJECT is in effect + * + * @var string + * @see DB_common::$fetchmode_object_class + */ + var $fetchmode_object_class; + + /** + * The number of rows to fetch from a limit query + * @var integer + */ + var $limit_count = null; + + /** + * The row to start fetching from in limit queries + * @var integer + */ + var $limit_from = null; + + /** + * The execute parameters that created this result + * @var array + * @since Property available since Release 1.7.0 + */ + var $parameters; + + /** + * The query string that created this result + * + * Copied here incase it changes in $dbh, which is referenced + * + * @var string + * @since Property available since Release 1.7.0 + */ + var $query; + + /** + * The query result resource id created by PHP + * @var resource + */ + var $result; + + /** + * The present row being dealt with + * @var integer + */ + var $row_counter = null; + + /** + * The prepared statement resource id created by PHP in $dbh + * + * This resource is only available when the result set was created using + * a driver's native execute() method, not PEAR DB's emulated one. + * + * Copied here incase it changes in $dbh, which is referenced + * + * {@internal Mainly here because the InterBase/Firebird API is only + * able to retrieve data from result sets if the statemnt handle is + * still in scope.}} + * + * @var resource + * @since Property available since Release 1.7.0 + */ + var $statement; + + + // }}} + // {{{ constructor + + /** + * This constructor sets the object's properties + * + * @param object &$dbh the DB object reference + * @param resource $result the result resource id + * @param array $options an associative array with result options + * + * @return void + */ + function DB_result(&$dbh, $result, $options = array()) + { + $this->autofree = $dbh->options['autofree']; + $this->dbh = &$dbh; + $this->fetchmode = $dbh->fetchmode; + $this->fetchmode_object_class = $dbh->fetchmode_object_class; + $this->parameters = $dbh->last_parameters; + $this->query = $dbh->last_query; + $this->result = $result; + $this->statement = empty($dbh->last_stmt) ? null : $dbh->last_stmt; + foreach ($options as $key => $value) { + $this->setOption($key, $value); + } + } + + /** + * Set options for the DB_result object + * + * @param string $key the option to set + * @param mixed $value the value to set the option to + * + * @return void + */ + function setOption($key, $value = null) + { + switch ($key) { + case 'limit_from': + $this->limit_from = $value; + break; + case 'limit_count': + $this->limit_count = $value; + } + } + + // }}} + // {{{ fetchRow() + + /** + * Fetch a row of data and return it by reference into an array + * + * The type of array returned can be controlled either by setting this + * method's $fetchmode parameter or by changing the default + * fetch mode setFetchMode() before calling this method. + * + * There are two options for standardizing the information returned + * from databases, ensuring their values are consistent when changing + * DBMS's. These portability options can be turned on when creating a + * new DB object or by using setOption(). + * + * + DB_PORTABILITY_LOWERCASE + * convert names of fields to lower case + * + * + DB_PORTABILITY_RTRIM + * right trim the data + * + * @param int $fetchmode the constant indicating how to format the data + * @param int $rownum the row number to fetch (index starts at 0) + * + * @return mixed an array or object containing the row's data, + * NULL when the end of the result set is reached + * or a DB_Error object on failure. + * + * @see DB_common::setOption(), DB_common::setFetchMode() + */ + function &fetchRow($fetchmode = DB_FETCHMODE_DEFAULT, $rownum = null) + { + if ($fetchmode === DB_FETCHMODE_DEFAULT) { + $fetchmode = $this->fetchmode; + } + if ($fetchmode === DB_FETCHMODE_OBJECT) { + $fetchmode = DB_FETCHMODE_ASSOC; + $object_class = $this->fetchmode_object_class; + } + if ($this->limit_from !== null) { + if ($this->row_counter === null) { + $this->row_counter = $this->limit_from; + // Skip rows + if ($this->dbh->features['limit'] === false) { + $i = 0; + while ($i++ < $this->limit_from) { + $this->dbh->fetchInto($this->result, $arr, $fetchmode); + } + } + } + if ($this->row_counter >= ($this->limit_from + $this->limit_count)) + { + if ($this->autofree) { + $this->free(); + } + $tmp = null; + return $tmp; + } + if ($this->dbh->features['limit'] === 'emulate') { + $rownum = $this->row_counter; + } + $this->row_counter++; + } + $res = $this->dbh->fetchInto($this->result, $arr, $fetchmode, $rownum); + if ($res === DB_OK) { + if (isset($object_class)) { + // The default mode is specified in the + // DB_common::fetchmode_object_class property + if ($object_class == 'stdClass') { + $arr = (object) $arr; + } else { + $arr = &new $object_class($arr); + } + } + return $arr; + } + if ($res == null && $this->autofree) { + $this->free(); + } + return $res; + } + + // }}} + // {{{ fetchInto() + + /** + * Fetch a row of data into an array which is passed by reference + * + * The type of array returned can be controlled either by setting this + * method's $fetchmode parameter or by changing the default + * fetch mode setFetchMode() before calling this method. + * + * There are two options for standardizing the information returned + * from databases, ensuring their values are consistent when changing + * DBMS's. These portability options can be turned on when creating a + * new DB object or by using setOption(). + * + * + DB_PORTABILITY_LOWERCASE + * convert names of fields to lower case + * + * + DB_PORTABILITY_RTRIM + * right trim the data + * + * @param array &$arr the variable where the data should be placed + * @param int $fetchmode the constant indicating how to format the data + * @param int $rownum the row number to fetch (index starts at 0) + * + * @return mixed DB_OK if a row is processed, NULL when the end of the + * result set is reached or a DB_Error object on failure + * + * @see DB_common::setOption(), DB_common::setFetchMode() + */ + function fetchInto(&$arr, $fetchmode = DB_FETCHMODE_DEFAULT, $rownum = null) + { + if ($fetchmode === DB_FETCHMODE_DEFAULT) { + $fetchmode = $this->fetchmode; + } + if ($fetchmode === DB_FETCHMODE_OBJECT) { + $fetchmode = DB_FETCHMODE_ASSOC; + $object_class = $this->fetchmode_object_class; + } + if ($this->limit_from !== null) { + if ($this->row_counter === null) { + $this->row_counter = $this->limit_from; + // Skip rows + if ($this->dbh->features['limit'] === false) { + $i = 0; + while ($i++ < $this->limit_from) { + $this->dbh->fetchInto($this->result, $arr, $fetchmode); + } + } + } + if ($this->row_counter >= ( + $this->limit_from + $this->limit_count)) + { + if ($this->autofree) { + $this->free(); + } + return null; + } + if ($this->dbh->features['limit'] === 'emulate') { + $rownum = $this->row_counter; + } + + $this->row_counter++; + } + $res = $this->dbh->fetchInto($this->result, $arr, $fetchmode, $rownum); + if ($res === DB_OK) { + if (isset($object_class)) { + // default mode specified in the + // DB_common::fetchmode_object_class property + if ($object_class == 'stdClass') { + $arr = (object) $arr; + } else { + $arr = new $object_class($arr); + } + } + return DB_OK; + } + if ($res == null && $this->autofree) { + $this->free(); + } + return $res; + } + + // }}} + // {{{ numCols() + + /** + * Get the the number of columns in a result set + * + * @return int the number of columns. A DB_Error object on failure. + */ + function numCols() + { + return $this->dbh->numCols($this->result); + } + + // }}} + // {{{ numRows() + + /** + * Get the number of rows in a result set + * + * @return int the number of rows. A DB_Error object on failure. + */ + function numRows() + { + if ($this->dbh->features['numrows'] === 'emulate' + && $this->dbh->options['portability'] & DB_PORTABILITY_NUMROWS) + { + if ($this->dbh->features['prepare']) { + $res = $this->dbh->query($this->query, $this->parameters); + } else { + $res = $this->dbh->query($this->query); + } + if (DB::isError($res)) { + return $res; + } + $i = 0; + while ($res->fetchInto($tmp, DB_FETCHMODE_ORDERED)) { + $i++; + } + return $i; + } else { + return $this->dbh->numRows($this->result); + } + } + + // }}} + // {{{ nextResult() + + /** + * Get the next result if a batch of queries was executed + * + * @return bool true if a new result is available or false if not + */ + function nextResult() + { + return $this->dbh->nextResult($this->result); + } + + // }}} + // {{{ free() + + /** + * Frees the resources allocated for this result set + * + * @return bool true on success. A DB_Error object on failure. + */ + function free() + { + $err = $this->dbh->freeResult($this->result); + if (DB::isError($err)) { + return $err; + } + $this->result = false; + $this->statement = false; + return true; + } + + // }}} + // {{{ tableInfo() + + /** + * @see DB_common::tableInfo() + * @deprecated Method deprecated some time before Release 1.2 + */ + function tableInfo($mode = null) + { + if (is_string($mode)) { + return $this->dbh->raiseError(DB_ERROR_NEED_MORE_DATA); + } + return $this->dbh->tableInfo($this, $mode); + } + + // }}} + // {{{ getQuery() + + /** + * Determine the query string that created this result + * + * @return string the query string + * + * @since Method available since Release 1.7.0 + */ + function getQuery() + { + return $this->query; + } + + // }}} + // {{{ getRowCounter() + + /** + * Tells which row number is currently being processed + * + * @return integer the current row being looked at. Starts at 1. + */ + function getRowCounter() + { + return $this->row_counter; + } + + // }}} +} + +// }}} +// {{{ class DB_row + +/** + * PEAR DB Row Object + * + * The object contains a row of data from a result set. Each column's data + * is placed in a property named for the column. + * + * @category Database + * @package DB + * @author Stig Bakken + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: @package_version@ + * @link http://pear.php.net/package/DB + * @see DB_common::setFetchMode() + */ +class DB_row +{ + // {{{ constructor + + /** + * The constructor places a row's data into properties of this object + * + * @param array the array containing the row's data + * + * @return void + */ + function DB_row(&$arr) + { + foreach ($arr as $key => $value) { + $this->$key = &$arr[$key]; + } + } + + // }}} +} + +// }}} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/DB/common.php b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/DB/common.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/DB/common.php @@ -0,0 +1,2157 @@ + + * @author Tomas V.V. Cox + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: common.php 32 2005-08-01 06:21:02Z dancoulter $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the PEAR class so it can be extended from + */ +require_once 'PEAR.php'; + +/** + * DB_common is the base class from which each database driver class extends + * + * All common methods are declared here. If a given DBMS driver contains + * a particular method, that method will overload the one here. + * + * @category Database + * @package DB + * @author Stig Bakken + * @author Tomas V.V. Cox + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: @package_version@ + * @link http://pear.php.net/package/DB + */ +class DB_common extends PEAR +{ + // {{{ properties + + /** + * The current default fetch mode + * @var integer + */ + var $fetchmode = DB_FETCHMODE_ORDERED; + + /** + * The name of the class into which results should be fetched when + * DB_FETCHMODE_OBJECT is in effect + * + * @var string + */ + var $fetchmode_object_class = 'stdClass'; + + /** + * Was a connection present when the object was serialized()? + * @var bool + * @see DB_common::__sleep(), DB_common::__wake() + */ + var $was_connected = null; + + /** + * The most recently executed query + * @var string + */ + var $last_query = ''; + + /** + * Run-time configuration options + * + * The 'optimize' option has been deprecated. Use the 'portability' + * option instead. + * + * @var array + * @see DB_common::setOption() + */ + var $options = array( + 'result_buffering' => 500, + 'persistent' => false, + 'ssl' => false, + 'debug' => 0, + 'seqname_format' => '%s_seq', + 'autofree' => false, + 'portability' => DB_PORTABILITY_NONE, + 'optimize' => 'performance', // Deprecated. Use 'portability'. + ); + + /** + * The parameters from the most recently executed query + * @var array + * @since Property available since Release 1.7.0 + */ + var $last_parameters = array(); + + /** + * The elements from each prepared statement + * @var array + */ + var $prepare_tokens = array(); + + /** + * The data types of the various elements in each prepared statement + * @var array + */ + var $prepare_types = array(); + + /** + * The prepared queries + * @var array + */ + var $prepared_queries = array(); + + + // }}} + // {{{ DB_common + + /** + * This constructor calls $this->PEAR('DB_Error') + * + * @return void + */ + function DB_common() + { + $this->PEAR('DB_Error'); + } + + // }}} + // {{{ __sleep() + + /** + * Automatically indicates which properties should be saved + * when PHP's serialize() function is called + * + * @return array the array of properties names that should be saved + */ + function __sleep() + { + if ($this->connection) { + // Don't disconnect(), people use serialize() for many reasons + $this->was_connected = true; + } else { + $this->was_connected = false; + } + if (isset($this->autocommit)) { + return array('autocommit', + 'dbsyntax', + 'dsn', + 'features', + 'fetchmode', + 'fetchmode_object_class', + 'options', + 'was_connected', + ); + } else { + return array('dbsyntax', + 'dsn', + 'features', + 'fetchmode', + 'fetchmode_object_class', + 'options', + 'was_connected', + ); + } + } + + // }}} + // {{{ __wakeup() + + /** + * Automatically reconnects to the database when PHP's unserialize() + * function is called + * + * The reconnection attempt is only performed if the object was connected + * at the time PHP's serialize() function was run. + * + * @return void + */ + function __wakeup() + { + if ($this->was_connected) { + $this->connect($this->dsn, $this->options); + } + } + + // }}} + // {{{ __toString() + + /** + * Automatic string conversion for PHP 5 + * + * @return string a string describing the current PEAR DB object + * + * @since Method available since Release 1.7.0 + */ + function __toString() + { + $info = strtolower(get_class($this)); + $info .= ': (phptype=' . $this->phptype . + ', dbsyntax=' . $this->dbsyntax . + ')'; + if ($this->connection) { + $info .= ' [connected]'; + } + return $info; + } + + // }}} + // {{{ toString() + + /** + * DEPRECATED: String conversion method + * + * @return string a string describing the current PEAR DB object + * + * @deprecated Method deprecated in Release 1.7.0 + */ + function toString() + { + return $this->__toString(); + } + + // }}} + // {{{ quoteString() + + /** + * DEPRECATED: Quotes a string so it can be safely used within string + * delimiters in a query + * + * @param string $string the string to be quoted + * + * @return string the quoted string + * + * @see DB_common::quoteSmart(), DB_common::escapeSimple() + * @deprecated Method deprecated some time before Release 1.2 + */ + function quoteString($string) + { + $string = $this->quote($string); + if ($string{0} == "'") { + return substr($string, 1, -1); + } + return $string; + } + + // }}} + // {{{ quote() + + /** + * DEPRECATED: Quotes a string so it can be safely used in a query + * + * @param string $string the string to quote + * + * @return string the quoted string or the string NULL + * if the value submitted is null. + * + * @see DB_common::quoteSmart(), DB_common::escapeSimple() + * @deprecated Deprecated in release 1.6.0 + */ + function quote($string = null) + { + return ($string === null) ? 'NULL' + : "'" . str_replace("'", "''", $string) . "'"; + } + + // }}} + // {{{ quoteIdentifier() + + /** + * Quotes a string so it can be safely used as a table or column name + * + * Delimiting style depends on which database driver is being used. + * + * NOTE: just because you CAN use delimited identifiers doesn't mean + * you SHOULD use them. In general, they end up causing way more + * problems than they solve. + * + * Portability is broken by using the following characters inside + * delimited identifiers: + * + backtick (`) -- due to MySQL + * + double quote (") -- due to Oracle + * + brackets ([ or ]) -- due to Access + * + * Delimited identifiers are known to generally work correctly under + * the following drivers: + * + mssql + * + mysql + * + mysqli + * + oci8 + * + odbc(access) + * + odbc(db2) + * + pgsql + * + sqlite + * + sybase (must execute set quoted_identifier on sometime + * prior to use) + * + * InterBase doesn't seem to be able to use delimited identifiers + * via PHP 4. They work fine under PHP 5. + * + * @param string $str the identifier name to be quoted + * + * @return string the quoted identifier + * + * @since Method available since Release 1.6.0 + */ + function quoteIdentifier($str) + { + return '"' . str_replace('"', '""', $str) . '"'; + } + + // }}} + // {{{ quoteSmart() + + /** + * Formats input so it can be safely used in a query + * + * The output depends on the PHP data type of input and the database + * type being used. + * + * @param mixed $in the data to be formatted + * + * @return mixed the formatted data. The format depends on the input's + * PHP type: + *
    + *
  • + * input -> returns + *
  • + *
  • + * null -> the string NULL + *
  • + *
  • + * integer or double -> the unquoted number + *
  • + *
  • + * bool -> output depends on the driver in use + * Most drivers return integers: 1 if + * true or 0 if + * false. + * Some return strings: TRUE if + * true or FALSE if + * false. + * Finally one returns strings: T if + * true or F if + * false. Here is a list of each DBMS, + * the values returned and the suggested column type: + *
      + *
    • + * dbase -> T/F + * (Logical) + *
    • + *
    • + * fbase -> TRUE/FALSE + * (BOOLEAN) + *
    • + *
    • + * ibase -> 1/0 + * (SMALLINT) [1] + *
    • + *
    • + * ifx -> 1/0 + * (SMALLINT) [1] + *
    • + *
    • + * msql -> 1/0 + * (INTEGER) + *
    • + *
    • + * mssql -> 1/0 + * (BIT) + *
    • + *
    • + * mysql -> 1/0 + * (TINYINT(1)) + *
    • + *
    • + * mysqli -> 1/0 + * (TINYINT(1)) + *
    • + *
    • + * oci8 -> 1/0 + * (NUMBER(1)) + *
    • + *
    • + * odbc -> 1/0 + * (SMALLINT) [1] + *
    • + *
    • + * pgsql -> TRUE/FALSE + * (BOOLEAN) + *
    • + *
    • + * sqlite -> 1/0 + * (INTEGER) + *
    • + *
    • + * sybase -> 1/0 + * (TINYINT(1)) + *
    • + *
    + * [1] Accommodate the lowest common denominator because not all + * versions of have BOOLEAN. + *
  • + *
  • + * other (including strings and numeric strings) -> + * the data with single quotes escaped by preceeding + * single quotes, backslashes are escaped by preceeding + * backslashes, then the whole string is encapsulated + * between single quotes + *
  • + *
+ * + * @see DB_common::escapeSimple() + * @since Method available since Release 1.6.0 + */ + function quoteSmart($in) + { + if (is_int($in) || is_double($in)) { + return $in; + } elseif (is_bool($in)) { + return $in ? 1 : 0; + } elseif (is_null($in)) { + return 'NULL'; + } else { + return "'" . $this->escapeSimple($in) . "'"; + } + } + + // }}} + // {{{ escapeSimple() + + /** + * Escapes a string according to the current DBMS's standards + * + * In SQLite, this makes things safe for inserts/updates, but may + * cause problems when performing text comparisons against columns + * containing binary data. See the + * {@link http://php.net/sqlite_escape_string PHP manual} for more info. + * + * @param string $str the string to be escaped + * + * @return string the escaped string + * + * @see DB_common::quoteSmart() + * @since Method available since Release 1.6.0 + */ + function escapeSimple($str) + { + return str_replace("'", "''", $str); + } + + // }}} + // {{{ provides() + + /** + * Tells whether the present driver supports a given feature + * + * @param string $feature the feature you're curious about + * + * @return bool whether this driver supports $feature + */ + function provides($feature) + { + return $this->features[$feature]; + } + + // }}} + // {{{ setFetchMode() + + /** + * Sets the fetch mode that should be used by default for query results + * + * @param integer $fetchmode DB_FETCHMODE_ORDERED, DB_FETCHMODE_ASSOC + * or DB_FETCHMODE_OBJECT + * @param string $object_class the class name of the object to be returned + * by the fetch methods when the + * DB_FETCHMODE_OBJECT mode is selected. + * If no class is specified by default a cast + * to object from the assoc array row will be + * done. There is also the posibility to use + * and extend the 'DB_row' class. + * + * @see DB_FETCHMODE_ORDERED, DB_FETCHMODE_ASSOC, DB_FETCHMODE_OBJECT + */ + function setFetchMode($fetchmode, $object_class = 'stdClass') + { + switch ($fetchmode) { + case DB_FETCHMODE_OBJECT: + $this->fetchmode_object_class = $object_class; + case DB_FETCHMODE_ORDERED: + case DB_FETCHMODE_ASSOC: + $this->fetchmode = $fetchmode; + break; + default: + return $this->raiseError('invalid fetchmode mode'); + } + } + + // }}} + // {{{ setOption() + + /** + * Sets run-time configuration options for PEAR DB + * + * Options, their data types, default values and description: + *
    + *
  • + * autofree boolean = false + *
    should results be freed automatically when there are no + * more rows? + *
  • + * result_buffering integer = 500 + *
    how many rows of the result set should be buffered? + *
    In mysql: mysql_unbuffered_query() is used instead of + * mysql_query() if this value is 0. (Release 1.7.0) + *
    In oci8: this value is passed to ocisetprefetch(). + * (Release 1.7.0) + *
  • + * debug integer = 0 + *
    debug level + *
  • + * persistent boolean = false + *
    should the connection be persistent? + *
  • + * portability integer = DB_PORTABILITY_NONE + *
    portability mode constant (see below) + *
  • + * seqname_format string = %s_seq + *
    the sprintf() format string used on sequence names. This + * format is applied to sequence names passed to + * createSequence(), nextID() and dropSequence(). + *
  • + * ssl boolean = false + *
    use ssl to connect? + *
  • + *
+ * + * ----------------------------------------- + * + * PORTABILITY MODES + * + * These modes are bitwised, so they can be combined using | + * and removed using ^. See the examples section below on how + * to do this. + * + * DB_PORTABILITY_NONE + * turn off all portability features + * + * This mode gets automatically turned on if the deprecated + * optimize option gets set to performance. + * + * + * DB_PORTABILITY_LOWERCASE + * convert names of tables and fields to lower case when using + * get*(), fetch*() and tableInfo() + * + * This mode gets automatically turned on in the following databases + * if the deprecated option optimize gets set to + * portability: + * + oci8 + * + * + * DB_PORTABILITY_RTRIM + * right trim the data output by get*() fetch*() + * + * + * DB_PORTABILITY_DELETE_COUNT + * force reporting the number of rows deleted + * + * Some DBMS's don't count the number of rows deleted when performing + * simple DELETE FROM tablename queries. This portability + * mode tricks such DBMS's into telling the count by adding + * WHERE 1=1 to the end of DELETE queries. + * + * This mode gets automatically turned on in the following databases + * if the deprecated option optimize gets set to + * portability: + * + fbsql + * + mysql + * + mysqli + * + sqlite + * + * + * DB_PORTABILITY_NUMROWS + * enable hack that makes numRows() work in Oracle + * + * This mode gets automatically turned on in the following databases + * if the deprecated option optimize gets set to + * portability: + * + oci8 + * + * + * DB_PORTABILITY_ERRORS + * makes certain error messages in certain drivers compatible + * with those from other DBMS's + * + * + mysql, mysqli: change unique/primary key constraints + * DB_ERROR_ALREADY_EXISTS -> DB_ERROR_CONSTRAINT + * + * + odbc(access): MS's ODBC driver reports 'no such field' as code + * 07001, which means 'too few parameters.' When this option is on + * that code gets mapped to DB_ERROR_NOSUCHFIELD. + * DB_ERROR_MISMATCH -> DB_ERROR_NOSUCHFIELD + * + * DB_PORTABILITY_NULL_TO_EMPTY + * convert null values to empty strings in data output by get*() and + * fetch*(). Needed because Oracle considers empty strings to be null, + * while most other DBMS's know the difference between empty and null. + * + * + * DB_PORTABILITY_ALL + * turn on all portability features + * + * ----------------------------------------- + * + * Example 1. Simple setOption() example + * + * $db->setOption('autofree', true); + * + * + * Example 2. Portability for lowercasing and trimming + * + * $db->setOption('portability', + * DB_PORTABILITY_LOWERCASE | DB_PORTABILITY_RTRIM); + * + * + * Example 3. All portability options except trimming + * + * $db->setOption('portability', + * DB_PORTABILITY_ALL ^ DB_PORTABILITY_RTRIM); + * + * + * @param string $option option name + * @param mixed $value value for the option + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::$options + */ + function setOption($option, $value) + { + if (isset($this->options[$option])) { + $this->options[$option] = $value; + + /* + * Backwards compatibility check for the deprecated 'optimize' + * option. Done here in case settings change after connecting. + */ + if ($option == 'optimize') { + if ($value == 'portability') { + switch ($this->phptype) { + case 'oci8': + $this->options['portability'] = + DB_PORTABILITY_LOWERCASE | + DB_PORTABILITY_NUMROWS; + break; + case 'fbsql': + case 'mysql': + case 'mysqli': + case 'sqlite': + $this->options['portability'] = + DB_PORTABILITY_DELETE_COUNT; + break; + } + } else { + $this->options['portability'] = DB_PORTABILITY_NONE; + } + } + + return DB_OK; + } + return $this->raiseError("unknown option $option"); + } + + // }}} + // {{{ getOption() + + /** + * Returns the value of an option + * + * @param string $option the option name you're curious about + * + * @return mixed the option's value + */ + function getOption($option) + { + if (isset($this->options[$option])) { + return $this->options[$option]; + } + return $this->raiseError("unknown option $option"); + } + + // }}} + // {{{ prepare() + + /** + * Prepares a query for multiple execution with execute() + * + * Creates a query that can be run multiple times. Each time it is run, + * the placeholders, if any, will be replaced by the contents of + * execute()'s $data argument. + * + * Three types of placeholders can be used: + * + ? scalar value (i.e. strings, integers). The system + * will automatically quote and escape the data. + * + ! value is inserted 'as is' + * + & requires a file name. The file's contents get + * inserted into the query (i.e. saving binary + * data in a db) + * + * Example 1. + * + * $sth = $db->prepare('INSERT INTO tbl (a, b, c) VALUES (?, !, &)'); + * $data = array( + * "John's text", + * "'it''s good'", + * 'filename.txt' + * ); + * $res = $db->execute($sth, $data); + * + * + * Use backslashes to escape placeholder characters if you don't want + * them to be interpreted as placeholders: + *
+     *    "UPDATE foo SET col=? WHERE col='over \& under'"
+     * 
+ * + * With some database backends, this is emulated. + * + * {@internal ibase and oci8 have their own prepare() methods.}} + * + * @param string $query the query to be prepared + * + * @return mixed DB statement resource on success. A DB_Error object + * on failure. + * + * @see DB_common::execute() + */ + function prepare($query) + { + $tokens = preg_split('/((?prepare_tokens[] = &$newtokens; + end($this->prepare_tokens); + + $k = key($this->prepare_tokens); + $this->prepare_types[$k] = $types; + $this->prepared_queries[$k] = implode(' ', $newtokens); + + return $k; + } + + // }}} + // {{{ autoPrepare() + + /** + * Automaticaly generates an insert or update query and pass it to prepare() + * + * @param string $table the table name + * @param array $table_fields the array of field names + * @param int $mode a type of query to make: + * DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE + * @param string $where for update queries: the WHERE clause to + * append to the SQL statement. Don't + * include the "WHERE" keyword. + * + * @return resource the query handle + * + * @uses DB_common::prepare(), DB_common::buildManipSQL() + */ + function autoPrepare($table, $table_fields, $mode = DB_AUTOQUERY_INSERT, + $where = false) + { + $query = $this->buildManipSQL($table, $table_fields, $mode, $where); + if (DB::isError($query)) { + return $query; + } + return $this->prepare($query); + } + + // }}} + // {{{ autoExecute() + + /** + * Automaticaly generates an insert or update query and call prepare() + * and execute() with it + * + * @param string $table the table name + * @param array $fields_values the associative array where $key is a + * field name and $value its value + * @param int $mode a type of query to make: + * DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE + * @param string $where for update queries: the WHERE clause to + * append to the SQL statement. Don't + * include the "WHERE" keyword. + * + * @return mixed a new DB_result object for successful SELECT queries + * or DB_OK for successul data manipulation queries. + * A DB_Error object on failure. + * + * @uses DB_common::autoPrepare(), DB_common::execute() + */ + function autoExecute($table, $fields_values, $mode = DB_AUTOQUERY_INSERT, + $where = false) + { + $sth = $this->autoPrepare($table, array_keys($fields_values), $mode, + $where); + if (DB::isError($sth)) { + return $sth; + } + $ret =& $this->execute($sth, array_values($fields_values)); + $this->freePrepared($sth); + return $ret; + + } + + // }}} + // {{{ buildManipSQL() + + /** + * Produces an SQL query string for autoPrepare() + * + * Example: + *
+     * buildManipSQL('table_sql', array('field1', 'field2', 'field3'),
+     *               DB_AUTOQUERY_INSERT);
+     * 
+ * + * That returns + * + * INSERT INTO table_sql (field1,field2,field3) VALUES (?,?,?) + * + * + * NOTES: + * - This belongs more to a SQL Builder class, but this is a simple + * facility. + * - Be carefull! If you don't give a $where param with an UPDATE + * query, all the records of the table will be updated! + * + * @param string $table the table name + * @param array $table_fields the array of field names + * @param int $mode a type of query to make: + * DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE + * @param string $where for update queries: the WHERE clause to + * append to the SQL statement. Don't + * include the "WHERE" keyword. + * + * @return string the sql query for autoPrepare() + */ + function buildManipSQL($table, $table_fields, $mode, $where = false) + { + if (count($table_fields) == 0) { + return $this->raiseError(DB_ERROR_NEED_MORE_DATA); + } + $first = true; + switch ($mode) { + case DB_AUTOQUERY_INSERT: + $values = ''; + $names = ''; + foreach ($table_fields as $value) { + if ($first) { + $first = false; + } else { + $names .= ','; + $values .= ','; + } + $names .= $value; + $values .= '?'; + } + return "INSERT INTO $table ($names) VALUES ($values)"; + case DB_AUTOQUERY_UPDATE: + $set = ''; + foreach ($table_fields as $value) { + if ($first) { + $first = false; + } else { + $set .= ','; + } + $set .= "$value = ?"; + } + $sql = "UPDATE $table SET $set"; + if ($where) { + $sql .= " WHERE $where"; + } + return $sql; + default: + return $this->raiseError(DB_ERROR_SYNTAX); + } + } + + // }}} + // {{{ execute() + + /** + * Executes a DB statement prepared with prepare() + * + * Example 1. + * + * $sth = $db->prepare('INSERT INTO tbl (a, b, c) VALUES (?, !, &)'); + * $data = array( + * "John's text", + * "'it''s good'", + * 'filename.txt' + * ); + * $res =& $db->execute($sth, $data); + * + * + * @param resource $stmt a DB statement resource returned from prepare() + * @param mixed $data array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return mixed a new DB_result object for successful SELECT queries + * or DB_OK for successul data manipulation queries. + * A DB_Error object on failure. + * + * {@internal ibase and oci8 have their own execute() methods.}} + * + * @see DB_common::prepare() + */ + function &execute($stmt, $data = array()) + { + $realquery = $this->executeEmulateQuery($stmt, $data); + if (DB::isError($realquery)) { + return $realquery; + } + $result = $this->simpleQuery($realquery); + + if ($result === DB_OK || DB::isError($result)) { + return $result; + } else { + $tmp =& new DB_result($this, $result); + return $tmp; + } + } + + // }}} + // {{{ executeEmulateQuery() + + /** + * Emulates executing prepared statements if the DBMS not support them + * + * @param resource $stmt a DB statement resource returned from execute() + * @param mixed $data array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return mixed a string containing the real query run when emulating + * prepare/execute. A DB_Error object on failure. + * + * @access protected + * @see DB_common::execute() + */ + function executeEmulateQuery($stmt, $data = array()) + { + $stmt = (int)$stmt; + $data = (array)$data; + $this->last_parameters = $data; + + if (count($this->prepare_types[$stmt]) != count($data)) { + $this->last_query = $this->prepared_queries[$stmt]; + return $this->raiseError(DB_ERROR_MISMATCH); + } + + $realquery = $this->prepare_tokens[$stmt][0]; + + $i = 0; + foreach ($data as $value) { + if ($this->prepare_types[$stmt][$i] == DB_PARAM_SCALAR) { + $realquery .= $this->quoteSmart($value); + } elseif ($this->prepare_types[$stmt][$i] == DB_PARAM_OPAQUE) { + $fp = @fopen($value, 'rb'); + if (!$fp) { + return $this->raiseError(DB_ERROR_ACCESS_VIOLATION); + } + $realquery .= $this->quoteSmart(fread($fp, filesize($value))); + fclose($fp); + } else { + $realquery .= $value; + } + + $realquery .= $this->prepare_tokens[$stmt][++$i]; + } + + return $realquery; + } + + // }}} + // {{{ executeMultiple() + + /** + * Performs several execute() calls on the same statement handle + * + * $data must be an array indexed numerically + * from 0, one execute call is done for every "row" in the array. + * + * If an error occurs during execute(), executeMultiple() does not + * execute the unfinished rows, but rather returns that error. + * + * @param resource $stmt query handle from prepare() + * @param array $data numeric array containing the + * data to insert into the query + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::prepare(), DB_common::execute() + */ + function executeMultiple($stmt, $data) + { + foreach ($data as $value) { + $res =& $this->execute($stmt, $value); + if (DB::isError($res)) { + return $res; + } + } + return DB_OK; + } + + // }}} + // {{{ freePrepared() + + /** + * Frees the internal resources associated with a prepared query + * + * @param resource $stmt the prepared statement's PHP resource + * @param bool $free_resource should the PHP resource be freed too? + * Use false if you need to get data + * from the result set later. + * + * @return bool TRUE on success, FALSE if $result is invalid + * + * @see DB_common::prepare() + */ + function freePrepared($stmt, $free_resource = true) + { + $stmt = (int)$stmt; + if (isset($this->prepare_tokens[$stmt])) { + unset($this->prepare_tokens[$stmt]); + unset($this->prepare_types[$stmt]); + unset($this->prepared_queries[$stmt]); + return true; + } + return false; + } + + // }}} + // {{{ modifyQuery() + + /** + * Changes a query string for various DBMS specific reasons + * + * It is defined here to ensure all drivers have this method available. + * + * @param string $query the query string to modify + * + * @return string the modified query string + * + * @access protected + * @see DB_mysql::modifyQuery(), DB_oci8::modifyQuery(), + * DB_sqlite::modifyQuery() + */ + function modifyQuery($query) + { + return $query; + } + + // }}} + // {{{ modifyLimitQuery() + + /** + * Adds LIMIT clauses to a query string according to current DBMS standards + * + * It is defined here to assure that all implementations + * have this method defined. + * + * @param string $query the query to modify + * @param int $from the row to start to fetching (0 = the first row) + * @param int $count the numbers of rows to fetch + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return string the query string with LIMIT clauses added + * + * @access protected + */ + function modifyLimitQuery($query, $from, $count, $params = array()) + { + return $query; + } + + // }}} + // {{{ query() + + /** + * Sends a query to the database server + * + * The query string can be either a normal statement to be sent directly + * to the server OR if $params are passed the query can have + * placeholders and it will be passed through prepare() and execute(). + * + * @param string $query the SQL query or the statement to prepare + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return mixed a new DB_result object for successful SELECT queries + * or DB_OK for successul data manipulation queries. + * A DB_Error object on failure. + * + * @see DB_result, DB_common::prepare(), DB_common::execute() + */ + function &query($query, $params = array()) + { + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + if (DB::isError($sth)) { + return $sth; + } + $ret =& $this->execute($sth, $params); + $this->freePrepared($sth, false); + return $ret; + } else { + $this->last_parameters = array(); + $result = $this->simpleQuery($query); + if ($result === DB_OK || DB::isError($result)) { + return $result; + } else { + $tmp =& new DB_result($this, $result); + return $tmp; + } + } + } + + // }}} + // {{{ limitQuery() + + /** + * Generates and executes a LIMIT query + * + * @param string $query the query + * @param intr $from the row to start to fetching (0 = the first row) + * @param int $count the numbers of rows to fetch + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return mixed a new DB_result object for successful SELECT queries + * or DB_OK for successul data manipulation queries. + * A DB_Error object on failure. + */ + function &limitQuery($query, $from, $count, $params = array()) + { + $query = $this->modifyLimitQuery($query, $from, $count, $params); + if (DB::isError($query)){ + return $query; + } + $result =& $this->query($query, $params); + if (is_a($result, 'DB_result')) { + $result->setOption('limit_from', $from); + $result->setOption('limit_count', $count); + } + return $result; + } + + // }}} + // {{{ getOne() + + /** + * Fetches the first column of the first row from a query result + * + * Takes care of doing the query and freeing the results when finished. + * + * @param string $query the SQL query + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return mixed the returned value of the query. + * A DB_Error object on failure. + */ + function &getOne($query, $params = array()) + { + $params = (array)$params; + // modifyLimitQuery() would be nice here, but it causes BC issues + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + if (DB::isError($sth)) { + return $sth; + } + $res =& $this->execute($sth, $params); + $this->freePrepared($sth); + } else { + $res =& $this->query($query); + } + + if (DB::isError($res)) { + return $res; + } + + $err = $res->fetchInto($row, DB_FETCHMODE_ORDERED); + $res->free(); + + if ($err !== DB_OK) { + return $err; + } + + return $row[0]; + } + + // }}} + // {{{ getRow() + + /** + * Fetches the first row of data returned from a query result + * + * Takes care of doing the query and freeing the results when finished. + * + * @param string $query the SQL query + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * @param int $fetchmode the fetch mode to use + * + * @return array the first row of results as an array. + * A DB_Error object on failure. + */ + function &getRow($query, $params = array(), + $fetchmode = DB_FETCHMODE_DEFAULT) + { + // compat check, the params and fetchmode parameters used to + // have the opposite order + if (!is_array($params)) { + if (is_array($fetchmode)) { + if ($params === null) { + $tmp = DB_FETCHMODE_DEFAULT; + } else { + $tmp = $params; + } + $params = $fetchmode; + $fetchmode = $tmp; + } elseif ($params !== null) { + $fetchmode = $params; + $params = array(); + } + } + // modifyLimitQuery() would be nice here, but it causes BC issues + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + if (DB::isError($sth)) { + return $sth; + } + $res =& $this->execute($sth, $params); + $this->freePrepared($sth); + } else { + $res =& $this->query($query); + } + + if (DB::isError($res)) { + return $res; + } + + $err = $res->fetchInto($row, $fetchmode); + + $res->free(); + + if ($err !== DB_OK) { + return $err; + } + + return $row; + } + + // }}} + // {{{ getCol() + + /** + * Fetches a single column from a query result and returns it as an + * indexed array + * + * @param string $query the SQL query + * @param mixed $col which column to return (integer [column number, + * starting at 0] or string [column name]) + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return array the results as an array. A DB_Error object on failure. + * + * @see DB_common::query() + */ + function &getCol($query, $col = 0, $params = array()) + { + $params = (array)$params; + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + + if (DB::isError($sth)) { + return $sth; + } + + $res =& $this->execute($sth, $params); + $this->freePrepared($sth); + } else { + $res =& $this->query($query); + } + + if (DB::isError($res)) { + return $res; + } + + $fetchmode = is_int($col) ? DB_FETCHMODE_ORDERED : DB_FETCHMODE_ASSOC; + + if (!is_array($row = $res->fetchRow($fetchmode))) { + $ret = array(); + } else { + if (!array_key_exists($col, $row)) { + $ret =& $this->raiseError(DB_ERROR_NOSUCHFIELD); + } else { + $ret = array($row[$col]); + while (is_array($row = $res->fetchRow($fetchmode))) { + $ret[] = $row[$col]; + } + } + } + + $res->free(); + + if (DB::isError($row)) { + $ret = $row; + } + + return $ret; + } + + // }}} + // {{{ getAssoc() + + /** + * Fetches an entire query result and returns it as an + * associative array using the first column as the key + * + * If the result set contains more than two columns, the value + * will be an array of the values from column 2-n. If the result + * set contains only two columns, the returned value will be a + * scalar with the value of the second column (unless forced to an + * array with the $force_array parameter). A DB error code is + * returned on errors. If the result set contains fewer than two + * columns, a DB_ERROR_TRUNCATED error is returned. + * + * For example, if the table "mytable" contains: + * + *
+     *  ID      TEXT       DATE
+     * --------------------------------
+     *  1       'one'      944679408
+     *  2       'two'      944679408
+     *  3       'three'    944679408
+     * 
+ * + * Then the call getAssoc('SELECT id,text FROM mytable') returns: + *
+     *   array(
+     *     '1' => 'one',
+     *     '2' => 'two',
+     *     '3' => 'three',
+     *   )
+     * 
+ * + * ...while the call getAssoc('SELECT id,text,date FROM mytable') returns: + *
+     *   array(
+     *     '1' => array('one', '944679408'),
+     *     '2' => array('two', '944679408'),
+     *     '3' => array('three', '944679408')
+     *   )
+     * 
+ * + * If the more than one row occurs with the same value in the + * first column, the last row overwrites all previous ones by + * default. Use the $group parameter if you don't want to + * overwrite like this. Example: + * + *
+     * getAssoc('SELECT category,id,name FROM mytable', false, null,
+     *          DB_FETCHMODE_ASSOC, true) returns:
+     *
+     *   array(
+     *     '1' => array(array('id' => '4', 'name' => 'number four'),
+     *                  array('id' => '6', 'name' => 'number six')
+     *            ),
+     *     '9' => array(array('id' => '4', 'name' => 'number four'),
+     *                  array('id' => '6', 'name' => 'number six')
+     *            )
+     *   )
+     * 
+ * + * Keep in mind that database functions in PHP usually return string + * values for results regardless of the database's internal type. + * + * @param string $query the SQL query + * @param bool $force_array used only when the query returns + * exactly two columns. If true, the values + * of the returned array will be one-element + * arrays instead of scalars. + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of + * items passed must match quantity of + * placeholders in query: meaning 1 + * placeholder for non-array parameters or + * 1 placeholder per array element. + * @param int $fetchmode the fetch mode to use + * @param bool $group if true, the values of the returned array + * is wrapped in another array. If the same + * key value (in the first column) repeats + * itself, the values will be appended to + * this array instead of overwriting the + * existing values. + * + * @return array the associative array containing the query results. + * A DB_Error object on failure. + */ + function &getAssoc($query, $force_array = false, $params = array(), + $fetchmode = DB_FETCHMODE_DEFAULT, $group = false) + { + $params = (array)$params; + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + + if (DB::isError($sth)) { + return $sth; + } + + $res =& $this->execute($sth, $params); + $this->freePrepared($sth); + } else { + $res =& $this->query($query); + } + + if (DB::isError($res)) { + return $res; + } + if ($fetchmode == DB_FETCHMODE_DEFAULT) { + $fetchmode = $this->fetchmode; + } + $cols = $res->numCols(); + + if ($cols < 2) { + $tmp =& $this->raiseError(DB_ERROR_TRUNCATED); + return $tmp; + } + + $results = array(); + + if ($cols > 2 || $force_array) { + // return array values + // XXX this part can be optimized + if ($fetchmode == DB_FETCHMODE_ASSOC) { + while (is_array($row = $res->fetchRow(DB_FETCHMODE_ASSOC))) { + reset($row); + $key = current($row); + unset($row[key($row)]); + if ($group) { + $results[$key][] = $row; + } else { + $results[$key] = $row; + } + } + } elseif ($fetchmode == DB_FETCHMODE_OBJECT) { + while ($row = $res->fetchRow(DB_FETCHMODE_OBJECT)) { + $arr = get_object_vars($row); + $key = current($arr); + if ($group) { + $results[$key][] = $row; + } else { + $results[$key] = $row; + } + } + } else { + while (is_array($row = $res->fetchRow(DB_FETCHMODE_ORDERED))) { + // we shift away the first element to get + // indices running from 0 again + $key = array_shift($row); + if ($group) { + $results[$key][] = $row; + } else { + $results[$key] = $row; + } + } + } + if (DB::isError($row)) { + $results = $row; + } + } else { + // return scalar values + while (is_array($row = $res->fetchRow(DB_FETCHMODE_ORDERED))) { + if ($group) { + $results[$row[0]][] = $row[1]; + } else { + $results[$row[0]] = $row[1]; + } + } + if (DB::isError($row)) { + $results = $row; + } + } + + $res->free(); + + return $results; + } + + // }}} + // {{{ getAll() + + /** + * Fetches all of the rows from a query result + * + * @param string $query the SQL query + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of + * items passed must match quantity of + * placeholders in query: meaning 1 + * placeholder for non-array parameters or + * 1 placeholder per array element. + * @param int $fetchmode the fetch mode to use: + * + DB_FETCHMODE_ORDERED + * + DB_FETCHMODE_ASSOC + * + DB_FETCHMODE_ORDERED | DB_FETCHMODE_FLIPPED + * + DB_FETCHMODE_ASSOC | DB_FETCHMODE_FLIPPED + * + * @return array the nested array. A DB_Error object on failure. + */ + function &getAll($query, $params = array(), + $fetchmode = DB_FETCHMODE_DEFAULT) + { + // compat check, the params and fetchmode parameters used to + // have the opposite order + if (!is_array($params)) { + if (is_array($fetchmode)) { + if ($params === null) { + $tmp = DB_FETCHMODE_DEFAULT; + } else { + $tmp = $params; + } + $params = $fetchmode; + $fetchmode = $tmp; + } elseif ($params !== null) { + $fetchmode = $params; + $params = array(); + } + } + + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + + if (DB::isError($sth)) { + return $sth; + } + + $res =& $this->execute($sth, $params); + $this->freePrepared($sth); + } else { + $res =& $this->query($query); + } + + if ($res === DB_OK || DB::isError($res)) { + return $res; + } + + $results = array(); + while (DB_OK === $res->fetchInto($row, $fetchmode)) { + if ($fetchmode & DB_FETCHMODE_FLIPPED) { + foreach ($row as $key => $val) { + $results[$key][] = $val; + } + } else { + $results[] = $row; + } + } + + $res->free(); + + if (DB::isError($row)) { + $tmp =& $this->raiseError($row); + return $tmp; + } + return $results; + } + + // }}} + // {{{ autoCommit() + + /** + * Enables or disables automatic commits + * + * @param bool $onoff true turns it on, false turns it off + * + * @return int DB_OK on success. A DB_Error object if the driver + * doesn't support auto-committing transactions. + */ + function autoCommit($onoff = false) + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ commit() + + /** + * Commits the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function commit() + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ rollback() + + /** + * Reverts the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function rollback() + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ numRows() + + /** + * Determines the number of rows in a query result + * + * @param resource $result the query result idenifier produced by PHP + * + * @return int the number of rows. A DB_Error object on failure. + */ + function numRows($result) + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ affectedRows() + + /** + * Determines the number of rows affected by a data maniuplation query + * + * 0 is returned for queries that don't manipulate data. + * + * @return int the number of rows. A DB_Error object on failure. + */ + function affectedRows() + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ getSequenceName() + + /** + * Generates the name used inside the database for a sequence + * + * The createSequence() docblock contains notes about storing sequence + * names. + * + * @param string $sqn the sequence's public name + * + * @return string the sequence's name in the backend + * + * @access protected + * @see DB_common::createSequence(), DB_common::dropSequence(), + * DB_common::nextID(), DB_common::setOption() + */ + function getSequenceName($sqn) + { + return sprintf($this->getOption('seqname_format'), + preg_replace('/[^a-z0-9_.]/i', '_', $sqn)); + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. + * A DB_Error object on failure. + * + * @see DB_common::createSequence(), DB_common::dropSequence(), + * DB_common::getSequenceName() + */ + function nextId($seq_name, $ondemand = true) + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ createSequence() + + /** + * Creates a new sequence + * + * The name of a given sequence is determined by passing the string + * provided in the $seq_name argument through PHP's sprintf() + * function using the value from the seqname_format option as + * the sprintf()'s format argument. + * + * seqname_format is set via setOption(). + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::dropSequence(), DB_common::getSequenceName(), + * DB_common::nextID() + */ + function createSequence($seq_name) + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::createSequence(), DB_common::getSequenceName(), + * DB_common::nextID() + */ + function dropSequence($seq_name) + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ raiseError() + + /** + * Communicates an error and invoke error callbacks, etc + * + * Basically a wrapper for PEAR::raiseError without the message string. + * + * @param mixed integer error code, or a PEAR error object (all + * other parameters are ignored if this parameter is + * an object + * @param int error mode, see PEAR_Error docs + * @param mixed if error mode is PEAR_ERROR_TRIGGER, this is the + * error level (E_USER_NOTICE etc). If error mode is + * PEAR_ERROR_CALLBACK, this is the callback function, + * either as a function name, or as an array of an + * object and method name. For other error modes this + * parameter is ignored. + * @param string extra debug information. Defaults to the last + * query and native error code. + * @param mixed native error code, integer or string depending the + * backend + * + * @return object the PEAR_Error object + * + * @see PEAR_Error + */ + function &raiseError($code = DB_ERROR, $mode = null, $options = null, + $userinfo = null, $nativecode = null) + { + // The error is yet a DB error object + if (is_object($code)) { + // because we the static PEAR::raiseError, our global + // handler should be used if it is set + if ($mode === null && !empty($this->_default_error_mode)) { + $mode = $this->_default_error_mode; + $options = $this->_default_error_options; + } + $tmp = PEAR::raiseError($code, null, $mode, $options, + null, null, true); + return $tmp; + } + + if ($userinfo === null) { + $userinfo = $this->last_query; + } + + if ($nativecode) { + $userinfo .= ' [nativecode=' . trim($nativecode) . ']'; + } else { + $userinfo .= ' [DB Error: ' . DB::errorMessage($code) . ']'; + } + + $tmp = PEAR::raiseError(null, $code, $mode, $options, $userinfo, + 'DB_Error', true); + return $tmp; + } + + // }}} + // {{{ errorNative() + + /** + * Gets the DBMS' native error code produced by the last query + * + * @return mixed the DBMS' error code. A DB_Error object on failure. + */ + function errorNative() + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ errorCode() + + /** + * Maps native error codes to DB's portable ones + * + * Uses the $errorcode_map property defined in each driver. + * + * @param string|int $nativecode the error code returned by the DBMS + * + * @return int the portable DB error code. Return DB_ERROR if the + * current driver doesn't have a mapping for the + * $nativecode submitted. + */ + function errorCode($nativecode) + { + if (isset($this->errorcode_map[$nativecode])) { + return $this->errorcode_map[$nativecode]; + } + // Fall back to DB_ERROR if there was no mapping. + return DB_ERROR; + } + + // }}} + // {{{ errorMessage() + + /** + * Maps a DB error code to a textual message + * + * @param integer $dbcode the DB error code + * + * @return string the error message corresponding to the error code + * submitted. FALSE if the error code is unknown. + * + * @see DB::errorMessage() + */ + function errorMessage($dbcode) + { + return DB::errorMessage($this->errorcode_map[$dbcode]); + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set + * + * The format of the resulting array depends on which $mode + * you select. The sample output below is based on this query: + *
+     *    SELECT tblFoo.fldID, tblFoo.fldPhone, tblBar.fldId
+     *    FROM tblFoo
+     *    JOIN tblBar ON tblFoo.fldId = tblBar.fldId
+     * 
+ * + *
    + *
  • + * + * null (default) + *
    +     *   [0] => Array (
    +     *       [table] => tblFoo
    +     *       [name] => fldId
    +     *       [type] => int
    +     *       [len] => 11
    +     *       [flags] => primary_key not_null
    +     *   )
    +     *   [1] => Array (
    +     *       [table] => tblFoo
    +     *       [name] => fldPhone
    +     *       [type] => string
    +     *       [len] => 20
    +     *       [flags] =>
    +     *   )
    +     *   [2] => Array (
    +     *       [table] => tblBar
    +     *       [name] => fldId
    +     *       [type] => int
    +     *       [len] => 11
    +     *       [flags] => primary_key not_null
    +     *   )
    +     *   
    + * + *
  • + * + * DB_TABLEINFO_ORDER + * + *

    In addition to the information found in the default output, + * a notation of the number of columns is provided by the + * num_fields element while the order + * element provides an array with the column names as the keys and + * their location index number (corresponding to the keys in the + * the default output) as the values.

    + * + *

    If a result set has identical field names, the last one is + * used.

    + * + *
    +     *   [num_fields] => 3
    +     *   [order] => Array (
    +     *       [fldId] => 2
    +     *       [fldTrans] => 1
    +     *   )
    +     *   
    + * + *
  • + * + * DB_TABLEINFO_ORDERTABLE + * + *

    Similar to DB_TABLEINFO_ORDER but adds more + * dimensions to the array in which the table names are keys and + * the field names are sub-keys. This is helpful for queries that + * join tables which have identical field names.

    + * + *
    +     *   [num_fields] => 3
    +     *   [ordertable] => Array (
    +     *       [tblFoo] => Array (
    +     *           [fldId] => 0
    +     *           [fldPhone] => 1
    +     *       )
    +     *       [tblBar] => Array (
    +     *           [fldId] => 2
    +     *       )
    +     *   )
    +     *   
    + * + *
  • + *
+ * + * The flags element contains a space separated list + * of extra information about the field. This data is inconsistent + * between DBMS's due to the way each DBMS works. + * + primary_key + * + unique_key + * + multiple_key + * + not_null + * + * Most DBMS's only provide the table and flags + * elements if $result is a table name. The following DBMS's + * provide full information from queries: + * + fbsql + * + mysql + * + * If the 'portability' option has DB_PORTABILITY_LOWERCASE + * turned on, the names of tables and fields will be lowercased. + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table. + * While this also accepts a query result + * resource identifier, this behavior is + * deprecated. + * @param int $mode either unused or one of the tableInfo modes: + * DB_TABLEINFO_ORDERTABLE, + * DB_TABLEINFO_ORDER or + * DB_TABLEINFO_FULL (which does both). + * These are bitwise, so the first two can be + * combined using |. + * + * @return array an associative array with the information requested. + * A DB_Error object on failure. + * + * @see DB_common::setOption() + */ + function tableInfo($result, $mode = null) + { + /* + * If the DB_ class has a tableInfo() method, that one + * overrides this one. But, if the driver doesn't have one, + * this method runs and tells users about that fact. + */ + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ getTables() + + /** + * Lists the tables in the current database + * + * @return array the list of tables. A DB_Error object on failure. + * + * @deprecated Method deprecated some time before Release 1.2 + */ + function getTables() + { + return $this->getListOf('tables'); + } + + // }}} + // {{{ getListOf() + + /** + * Lists internal database information + * + * @param string $type type of information being sought. + * Common items being sought are: + * tables, databases, users, views, functions + * Each DBMS's has its own capabilities. + * + * @return array an array listing the items sought. + * A DB DB_Error object on failure. + */ + function getListOf($type) + { + $sql = $this->getSpecialQuery($type); + if ($sql === null) { + $this->last_query = ''; + return $this->raiseError(DB_ERROR_UNSUPPORTED); + } elseif (is_int($sql) || DB::isError($sql)) { + // Previous error + return $this->raiseError($sql); + } elseif (is_array($sql)) { + // Already the result + return $sql; + } + // Launch this query + return $this->getCol($sql); + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Obtains the query string needed for listing a given type of objects + * + * @param string $type the kind of objects you want to retrieve + * + * @return string the SQL query string or null if the driver doesn't + * support the object type requested + * + * @access protected + * @see DB_common::getListOf() + */ + function getSpecialQuery($type) + { + return $this->raiseError(DB_ERROR_UNSUPPORTED); + } + + // }}} + // {{{ _rtrimArrayValues() + + /** + * Right-trims all strings in an array + * + * @param array $array the array to be trimmed (passed by reference) + * + * @return void + * + * @access protected + */ + function _rtrimArrayValues(&$array) + { + foreach ($array as $key => $value) { + if (is_string($value)) { + $array[$key] = rtrim($value); + } + } + } + + // }}} + // {{{ _convertNullArrayValuesToEmpty() + + /** + * Converts all null values in an array to empty strings + * + * @param array $array the array to be de-nullified (passed by reference) + * + * @return void + * + * @access protected + */ + function _convertNullArrayValuesToEmpty(&$array) + { + foreach ($array as $key => $value) { + if (is_null($value)) { + $array[$key] = ''; + } + } + } + + // }}} +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/DB/index.html b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/DB/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/DB/index.html @@ -0,0 +1,1 @@ + \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/DB/mysql.php b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/DB/mysql.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/DB/mysql.php @@ -0,0 +1,1034 @@ + + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: mysql.php 32 2005-08-01 06:21:02Z dancoulter $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the DB_common class so it can be extended from + */ +require_once 'DB/common.php'; + +/** + * The methods PEAR DB uses to interact with PHP's mysql extension + * for interacting with MySQL databases + * + * These methods overload the ones declared in DB_common. + * + * @category Database + * @package DB + * @author Stig Bakken + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: @package_version@ + * @link http://pear.php.net/package/DB + */ +class DB_mysql extends DB_common +{ + // {{{ properties + + /** + * The DB driver type (mysql, oci8, odbc, etc.) + * @var string + */ + var $phptype = 'mysql'; + + /** + * The database syntax variant to be used (db2, access, etc.), if any + * @var string + */ + var $dbsyntax = 'mysql'; + + /** + * The capabilities of this DB implementation + * + * The 'new_link' element contains the PHP version that first provided + * new_link support for this DBMS. Contains false if it's unsupported. + * + * Meaning of the 'limit' element: + * + 'emulate' = emulate with fetch row by number + * + 'alter' = alter the query + * + false = skip rows + * + * @var array + */ + var $features = array( + 'limit' => 'alter', + 'new_link' => '4.2.0', + 'numrows' => true, + 'pconnect' => true, + 'prepare' => false, + 'ssl' => false, + 'transactions' => true, + ); + + /** + * A mapping of native error codes to DB error codes + * @var array + */ + var $errorcode_map = array( + 1004 => DB_ERROR_CANNOT_CREATE, + 1005 => DB_ERROR_CANNOT_CREATE, + 1006 => DB_ERROR_CANNOT_CREATE, + 1007 => DB_ERROR_ALREADY_EXISTS, + 1008 => DB_ERROR_CANNOT_DROP, + 1022 => DB_ERROR_ALREADY_EXISTS, + 1044 => DB_ERROR_ACCESS_VIOLATION, + 1046 => DB_ERROR_NODBSELECTED, + 1048 => DB_ERROR_CONSTRAINT, + 1049 => DB_ERROR_NOSUCHDB, + 1050 => DB_ERROR_ALREADY_EXISTS, + 1051 => DB_ERROR_NOSUCHTABLE, + 1054 => DB_ERROR_NOSUCHFIELD, + 1061 => DB_ERROR_ALREADY_EXISTS, + 1062 => DB_ERROR_ALREADY_EXISTS, + 1064 => DB_ERROR_SYNTAX, + 1091 => DB_ERROR_NOT_FOUND, + 1100 => DB_ERROR_NOT_LOCKED, + 1136 => DB_ERROR_VALUE_COUNT_ON_ROW, + 1142 => DB_ERROR_ACCESS_VIOLATION, + 1146 => DB_ERROR_NOSUCHTABLE, + 1216 => DB_ERROR_CONSTRAINT, + 1217 => DB_ERROR_CONSTRAINT, + ); + + /** + * The raw database connection created by PHP + * @var resource + */ + var $connection; + + /** + * The DSN information for connecting to a database + * @var array + */ + var $dsn = array(); + + + /** + * Should data manipulation queries be committed automatically? + * @var bool + * @access private + */ + var $autocommit = true; + + /** + * The quantity of transactions begun + * + * {@internal While this is private, it can't actually be designated + * private in PHP 5 because it is directly accessed in the test suite.}} + * + * @var integer + * @access private + */ + var $transaction_opcount = 0; + + /** + * The database specified in the DSN + * + * It's a fix to allow calls to different databases in the same script. + * + * @var string + * @access private + */ + var $_db = ''; + + + // }}} + // {{{ constructor + + /** + * This constructor calls $this->DB_common() + * + * @return void + */ + function DB_mysql() + { + $this->DB_common(); + } + + // }}} + // {{{ connect() + + /** + * Connect to the database server, log in and open the database + * + * Don't call this method directly. Use DB::connect() instead. + * + * PEAR DB's mysql driver supports the following extra DSN options: + * + new_link If set to true, causes subsequent calls to connect() + * to return a new connection link instead of the + * existing one. WARNING: this is not portable to + * other DBMS's. Available since PEAR DB 1.7.0. + * + client_flags Any combination of MYSQL_CLIENT_* constants. + * Only used if PHP is at version 4.3.0 or greater. + * Available since PEAR DB 1.7.0. + * + * @param array $dsn the data source name + * @param bool $persistent should the connection be persistent? + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function connect($dsn, $persistent = false) + { + if (!PEAR::loadExtension('mysql')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsn; + if ($dsn['dbsyntax']) { + $this->dbsyntax = $dsn['dbsyntax']; + } + + $params = array(); + if ($dsn['protocol'] && $dsn['protocol'] == 'unix') { + $params[0] = ':' . $dsn['socket']; + } else { + $params[0] = $dsn['hostspec'] ? $dsn['hostspec'] + : 'localhost'; + if ($dsn['port']) { + $params[0] .= ':' . $dsn['port']; + } + } + $params[] = $dsn['username'] ? $dsn['username'] : null; + $params[] = $dsn['password'] ? $dsn['password'] : null; + + if (!$persistent) { + if (isset($dsn['new_link']) + && ($dsn['new_link'] == 'true' || $dsn['new_link'] === true)) + { + $params[] = true; + } else { + $params[] = false; + } + } + if (version_compare(phpversion(), '4.3.0', '>=')) { + $params[] = isset($dsn['client_flags']) + ? $dsn['client_flags'] : null; + } + + $connect_function = $persistent ? 'mysql_pconnect' : 'mysql_connect'; + + $ini = ini_get('track_errors'); + $php_errormsg = ''; + if ($ini) { + $this->connection = @call_user_func_array($connect_function, + $params); + } else { + ini_set('track_errors', 1); + $this->connection = @call_user_func_array($connect_function, + $params); + ini_set('track_errors', $ini); + } + + if (!$this->connection) { + if (($err = @mysql_error()) != '') { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + $err); + } else { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + $php_errormsg); + } + } + + if ($dsn['database']) { + if (!@mysql_select_db($dsn['database'], $this->connection)) { + return $this->mysqlRaiseError(); + } + $this->_db = $dsn['database']; + } + + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Disconnects from the database server + * + * @return bool TRUE on success, FALSE on failure + */ + function disconnect() + { + $ret = @mysql_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + /** + * Sends a query to the database server + * + * Generally uses mysql_query(). If you want to use + * mysql_unbuffered_query() set the "result_buffering" option to 0 using + * setOptions(). This option was added in Release 1.7.0. + * + * @param string the SQL query string + * + * @return mixed + a PHP result resrouce for successful SELECT queries + * + the DB_OK constant for other successful queries + * + a DB_Error object on failure + */ + function simpleQuery($query) + { + $ismanip = DB::isManip($query); + $this->last_query = $query; + $query = $this->modifyQuery($query); + if ($this->_db) { + if (!@mysql_select_db($this->_db, $this->connection)) { + return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED); + } + } + if (!$this->autocommit && $ismanip) { + if ($this->transaction_opcount == 0) { + $result = @mysql_query('SET AUTOCOMMIT=0', $this->connection); + $result = @mysql_query('BEGIN', $this->connection); + if (!$result) { + return $this->mysqlRaiseError(); + } + } + $this->transaction_opcount++; + } + if (!$this->options['result_buffering']) { + $result = @mysql_unbuffered_query($query, $this->connection); + } else { + $result = @mysql_query($query, $this->connection); + } + if (!$result) { + return $this->mysqlRaiseError(); + } + if (is_resource($result)) { + return $result; + } + return DB_OK; + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal mysql result pointer to the next available result + * + * This method has not been implemented yet. + * + * @param a valid sql result resource + * + * @return false + */ + function nextResult($result) + { + return false; + } + + // }}} + // {{{ fetchInto() + + /** + * Places a row from the result set into the given array + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * This method is not meant to be called directly. Use + * DB_result::fetchInto() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result the query result resource + * @param array $arr the referenced array to put the data in + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch (0 = first row) + * + * @return mixed DB_OK on success, NULL when the end of a result set is + * reached or on failure + * + * @see DB_result::fetchInto() + */ + function fetchInto($result, &$arr, $fetchmode, $rownum = null) + { + if ($rownum !== null) { + if (!@mysql_data_seek($result, $rownum)) { + return null; + } + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $arr = @mysql_fetch_array($result, MYSQL_ASSOC); + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @mysql_fetch_row($result); + } + if (!$arr) { + return null; + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + /* + * Even though this DBMS already trims output, we do this because + * a field might have intentional whitespace at the end that + * gets removed by DB_PORTABILITY_RTRIM under another driver. + */ + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ freeResult() + + /** + * Deletes the result set and frees the memory occupied by the result set + * + * This method is not meant to be called directly. Use + * DB_result::free() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return bool TRUE on success, FALSE if $result is invalid + * + * @see DB_result::free() + */ + function freeResult($result) + { + return @mysql_free_result($result); + } + + // }}} + // {{{ numCols() + + /** + * Gets the number of columns in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numCols() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of columns. A DB_Error object on failure. + * + * @see DB_result::numCols() + */ + function numCols($result) + { + $cols = @mysql_num_fields($result); + if (!$cols) { + return $this->mysqlRaiseError(); + } + return $cols; + } + + // }}} + // {{{ numRows() + + /** + * Gets the number of rows in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numRows() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of rows. A DB_Error object on failure. + * + * @see DB_result::numRows() + */ + function numRows($result) + { + $rows = @mysql_num_rows($result); + if ($rows === null) { + return $this->mysqlRaiseError(); + } + return $rows; + } + + // }}} + // {{{ autoCommit() + + /** + * Enables or disables automatic commits + * + * @param bool $onoff true turns it on, false turns it off + * + * @return int DB_OK on success. A DB_Error object if the driver + * doesn't support auto-committing transactions. + */ + function autoCommit($onoff = false) + { + // XXX if $this->transaction_opcount > 0, we should probably + // issue a warning here. + $this->autocommit = $onoff ? true : false; + return DB_OK; + } + + // }}} + // {{{ commit() + + /** + * Commits the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function commit() + { + if ($this->transaction_opcount > 0) { + if ($this->_db) { + if (!@mysql_select_db($this->_db, $this->connection)) { + return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED); + } + } + $result = @mysql_query('COMMIT', $this->connection); + $result = @mysql_query('SET AUTOCOMMIT=1', $this->connection); + $this->transaction_opcount = 0; + if (!$result) { + return $this->mysqlRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ rollback() + + /** + * Reverts the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function rollback() + { + if ($this->transaction_opcount > 0) { + if ($this->_db) { + if (!@mysql_select_db($this->_db, $this->connection)) { + return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED); + } + } + $result = @mysql_query('ROLLBACK', $this->connection); + $result = @mysql_query('SET AUTOCOMMIT=1', $this->connection); + $this->transaction_opcount = 0; + if (!$result) { + return $this->mysqlRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ affectedRows() + + /** + * Determines the number of rows affected by a data maniuplation query + * + * 0 is returned for queries that don't manipulate data. + * + * @return int the number of rows. A DB_Error object on failure. + */ + function affectedRows() + { + if (DB::isManip($this->last_query)) { + return @mysql_affected_rows($this->connection); + } else { + return 0; + } + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. + * A DB_Error object on failure. + * + * @see DB_common::nextID(), DB_common::getSequenceName(), + * DB_mysql::createSequence(), DB_mysql::dropSequence() + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + do { + $repeat = 0; + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->query("UPDATE ${seqname} ". + 'SET id=LAST_INSERT_ID(id+1)'); + $this->popErrorHandling(); + if ($result === DB_OK) { + // COMMON CASE + $id = @mysql_insert_id($this->connection); + if ($id != 0) { + return $id; + } + // EMPTY SEQ TABLE + // Sequence table must be empty for some reason, so fill + // it and return 1 and obtain a user-level lock + $result = $this->getOne("SELECT GET_LOCK('${seqname}_lock',10)"); + if (DB::isError($result)) { + return $this->raiseError($result); + } + if ($result == 0) { + // Failed to get the lock + return $this->mysqlRaiseError(DB_ERROR_NOT_LOCKED); + } + + // add the default value + $result = $this->query("REPLACE INTO ${seqname} (id) VALUES (0)"); + if (DB::isError($result)) { + return $this->raiseError($result); + } + + // Release the lock + $result = $this->getOne('SELECT RELEASE_LOCK(' + . "'${seqname}_lock')"); + if (DB::isError($result)) { + return $this->raiseError($result); + } + // We know what the result will be, so no need to try again + return 1; + + } elseif ($ondemand && DB::isError($result) && + $result->getCode() == DB_ERROR_NOSUCHTABLE) + { + // ONDEMAND TABLE CREATION + $result = $this->createSequence($seq_name); + if (DB::isError($result)) { + return $this->raiseError($result); + } else { + $repeat = 1; + } + + } elseif (DB::isError($result) && + $result->getCode() == DB_ERROR_ALREADY_EXISTS) + { + // BACKWARDS COMPAT + // see _BCsequence() comment + $result = $this->_BCsequence($seqname); + if (DB::isError($result)) { + return $this->raiseError($result); + } + $repeat = 1; + } + } while ($repeat); + + return $this->raiseError($result); + } + + // }}} + // {{{ createSequence() + + /** + * Creates a new sequence + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::createSequence(), DB_common::getSequenceName(), + * DB_mysql::nextID(), DB_mysql::dropSequence() + */ + function createSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + $res = $this->query('CREATE TABLE ' . $seqname + . ' (id INTEGER UNSIGNED AUTO_INCREMENT NOT NULL,' + . ' PRIMARY KEY(id))'); + if (DB::isError($res)) { + return $res; + } + // insert yields value 1, nextId call will generate ID 2 + $res = $this->query("INSERT INTO ${seqname} (id) VALUES (0)"); + if (DB::isError($res)) { + return $res; + } + // so reset to zero + return $this->query("UPDATE ${seqname} SET id = 0"); + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::dropSequence(), DB_common::getSequenceName(), + * DB_mysql::nextID(), DB_mysql::createSequence() + */ + function dropSequence($seq_name) + { + return $this->query('DROP TABLE ' . $this->getSequenceName($seq_name)); + } + + // }}} + // {{{ _BCsequence() + + /** + * Backwards compatibility with old sequence emulation implementation + * (clean up the dupes) + * + * @param string $seqname the sequence name to clean up + * + * @return bool true on success. A DB_Error object on failure. + * + * @access private + */ + function _BCsequence($seqname) + { + // Obtain a user-level lock... this will release any previous + // application locks, but unlike LOCK TABLES, it does not abort + // the current transaction and is much less frequently used. + $result = $this->getOne("SELECT GET_LOCK('${seqname}_lock',10)"); + if (DB::isError($result)) { + return $result; + } + if ($result == 0) { + // Failed to get the lock, can't do the conversion, bail + // with a DB_ERROR_NOT_LOCKED error + return $this->mysqlRaiseError(DB_ERROR_NOT_LOCKED); + } + + $highest_id = $this->getOne("SELECT MAX(id) FROM ${seqname}"); + if (DB::isError($highest_id)) { + return $highest_id; + } + // This should kill all rows except the highest + // We should probably do something if $highest_id isn't + // numeric, but I'm at a loss as how to handle that... + $result = $this->query('DELETE FROM ' . $seqname + . " WHERE id <> $highest_id"); + if (DB::isError($result)) { + return $result; + } + + // If another thread has been waiting for this lock, + // it will go thru the above procedure, but will have no + // real effect + $result = $this->getOne("SELECT RELEASE_LOCK('${seqname}_lock')"); + if (DB::isError($result)) { + return $result; + } + return true; + } + + // }}} + // {{{ quoteIdentifier() + + /** + * Quotes a string so it can be safely used as a table or column name + * + * MySQL can't handle the backtick character (`) in + * table or column names. + * + * @param string $str identifier name to be quoted + * + * @return string quoted identifier string + * + * @see DB_common::quoteIdentifier() + * @since Method available since Release 1.6.0 + */ + function quoteIdentifier($str) + { + return '`' . $str . '`'; + } + + // }}} + // {{{ quote() + + /** + * @deprecated Deprecated in release 1.6.0 + */ + function quote($str) + { + return $this->quoteSmart($str); + } + + // }}} + // {{{ escapeSimple() + + /** + * Escapes a string according to the current DBMS's standards + * + * @param string $str the string to be escaped + * + * @return string the escaped string + * + * @see DB_common::quoteSmart() + * @since Method available since Release 1.6.0 + */ + function escapeSimple($str) + { + if (function_exists('mysql_real_escape_string')) { + return @mysql_real_escape_string($str, $this->connection); + } else { + return @mysql_escape_string($str); + } + } + + // }}} + // {{{ modifyQuery() + + /** + * Changes a query string for various DBMS specific reasons + * + * This little hack lets you know how many rows were deleted + * when running a "DELETE FROM table" query. Only implemented + * if the DB_PORTABILITY_DELETE_COUNT portability option is on. + * + * @param string $query the query string to modify + * + * @return string the modified query string + * + * @access protected + * @see DB_common::setOption() + */ + function modifyQuery($query) + { + if ($this->options['portability'] & DB_PORTABILITY_DELETE_COUNT) { + // "DELETE FROM table" gives 0 affected rows in MySQL. + // This little hack lets you know how many rows were deleted. + if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $query)) { + $query = preg_replace('/^\s*DELETE\s+FROM\s+(\S+)\s*$/', + 'DELETE FROM \1 WHERE 1=1', $query); + } + } + return $query; + } + + // }}} + // {{{ modifyLimitQuery() + + /** + * Adds LIMIT clauses to a query string according to current DBMS standards + * + * @param string $query the query to modify + * @param int $from the row to start to fetching (0 = the first row) + * @param int $count the numbers of rows to fetch + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return string the query string with LIMIT clauses added + * + * @access protected + */ + function modifyLimitQuery($query, $from, $count, $params = array()) + { + if (DB::isManip($query)) { + return $query . " LIMIT $count"; + } else { + return $query . " LIMIT $from, $count"; + } + } + + // }}} + // {{{ mysqlRaiseError() + + /** + * Produces a DB_Error object regarding the current problem + * + * @param int $errno if the error is being manually raised pass a + * DB_ERROR* constant here. If this isn't passed + * the error information gathered from the DBMS. + * + * @return object the DB_Error object + * + * @see DB_common::raiseError(), + * DB_mysql::errorNative(), DB_common::errorCode() + */ + function mysqlRaiseError($errno = null) + { + if ($errno === null) { + if ($this->options['portability'] & DB_PORTABILITY_ERRORS) { + $this->errorcode_map[1022] = DB_ERROR_CONSTRAINT; + $this->errorcode_map[1048] = DB_ERROR_CONSTRAINT_NOT_NULL; + $this->errorcode_map[1062] = DB_ERROR_CONSTRAINT; + } else { + // Doing this in case mode changes during runtime. + $this->errorcode_map[1022] = DB_ERROR_ALREADY_EXISTS; + $this->errorcode_map[1048] = DB_ERROR_CONSTRAINT; + $this->errorcode_map[1062] = DB_ERROR_ALREADY_EXISTS; + } + $errno = $this->errorCode(mysql_errno($this->connection)); + } + return $this->raiseError($errno, null, null, null, + @mysql_errno($this->connection) . ' ** ' . + @mysql_error($this->connection)); + } + + // }}} + // {{{ errorNative() + + /** + * Gets the DBMS' native error code produced by the last query + * + * @return int the DBMS' error code + */ + function errorNative() + { + return @mysql_errno($this->connection); + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table. + * While this also accepts a query result + * resource identifier, this behavior is + * deprecated. + * @param int $mode a valid tableInfo mode + * + * @return array an associative array with the information requested. + * A DB_Error object on failure. + * + * @see DB_common::tableInfo() + */ + function tableInfo($result, $mode = null) + { + if (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + $id = @mysql_list_fields($this->dsn['database'], + $result, $this->connection); + $got_string = true; + } elseif (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $id = $result->result; + $got_string = false; + } else { + /* + * Probably received a result resource identifier. + * Copy it. + * Deprecated. Here for compatibility only. + */ + $id = $result; + $got_string = false; + } + + if (!is_resource($id)) { + return $this->mysqlRaiseError(DB_ERROR_NEED_MORE_DATA); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $count = @mysql_num_fields($id); + $res = array(); + + if ($mode) { + $res['num_fields'] = $count; + } + + for ($i = 0; $i < $count; $i++) { + $res[$i] = array( + 'table' => $case_func(@mysql_field_table($id, $i)), + 'name' => $case_func(@mysql_field_name($id, $i)), + 'type' => @mysql_field_type($id, $i), + 'len' => @mysql_field_len($id, $i), + 'flags' => @mysql_field_flags($id, $i), + ); + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + + // free the result only if we were called on a table + if ($got_string) { + @mysql_free_result($id); + } + return $res; + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Obtains the query string needed for listing a given type of objects + * + * @param string $type the kind of objects you want to retrieve + * + * @return string the SQL query string or null if the driver doesn't + * support the object type requested + * + * @access protected + * @see DB_common::getListOf() + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'tables': + return 'SHOW TABLES'; + case 'users': + return 'SELECT DISTINCT User FROM mysql.user'; + case 'databases': + return 'SHOW DATABASES'; + default: + return null; + } + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/DB/pgsql.php b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/DB/pgsql.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/DB/pgsql.php @@ -0,0 +1,1097 @@ + + * @author Stig Bakken + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: pgsql.php 32 2005-08-01 06:21:02Z dancoulter $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the DB_common class so it can be extended from + */ +require_once 'DB/common.php'; + +/** + * The methods PEAR DB uses to interact with PHP's pgsql extension + * for interacting with PostgreSQL databases + * + * These methods overload the ones declared in DB_common. + * + * @category Database + * @package DB + * @author Rui Hirokawa + * @author Stig Bakken + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: @package_version@ + * @link http://pear.php.net/package/DB + */ +class DB_pgsql extends DB_common +{ + // {{{ properties + + /** + * The DB driver type (mysql, oci8, odbc, etc.) + * @var string + */ + var $phptype = 'pgsql'; + + /** + * The database syntax variant to be used (db2, access, etc.), if any + * @var string + */ + var $dbsyntax = 'pgsql'; + + /** + * The capabilities of this DB implementation + * + * The 'new_link' element contains the PHP version that first provided + * new_link support for this DBMS. Contains false if it's unsupported. + * + * Meaning of the 'limit' element: + * + 'emulate' = emulate with fetch row by number + * + 'alter' = alter the query + * + false = skip rows + * + * @var array + */ + var $features = array( + 'limit' => 'alter', + 'new_link' => '4.3.0', + 'numrows' => true, + 'pconnect' => true, + 'prepare' => false, + 'ssl' => true, + 'transactions' => true, + ); + + /** + * A mapping of native error codes to DB error codes + * @var array + */ + var $errorcode_map = array( + ); + + /** + * The raw database connection created by PHP + * @var resource + */ + var $connection; + + /** + * The DSN information for connecting to a database + * @var array + */ + var $dsn = array(); + + + /** + * Should data manipulation queries be committed automatically? + * @var bool + * @access private + */ + var $autocommit = true; + + /** + * The quantity of transactions begun + * + * {@internal While this is private, it can't actually be designated + * private in PHP 5 because it is directly accessed in the test suite.}} + * + * @var integer + * @access private + */ + var $transaction_opcount = 0; + + /** + * The number of rows affected by a data manipulation query + * @var integer + */ + var $affected = 0; + + /** + * The current row being looked at in fetchInto() + * @var array + * @access private + */ + var $row = array(); + + /** + * The number of rows in a given result set + * @var array + * @access private + */ + var $_num_rows = array(); + + + // }}} + // {{{ constructor + + /** + * This constructor calls $this->DB_common() + * + * @return void + */ + function DB_pgsql() + { + $this->DB_common(); + } + + // }}} + // {{{ connect() + + /** + * Connect to the database server, log in and open the database + * + * Don't call this method directly. Use DB::connect() instead. + * + * PEAR DB's pgsql driver supports the following extra DSN options: + * + connect_timeout How many seconds to wait for a connection to + * be established. Available since PEAR DB 1.7.0. + * + new_link If set to true, causes subsequent calls to + * connect() to return a new connection link + * instead of the existing one. WARNING: this is + * not portable to other DBMS's. Available only + * if PHP is >= 4.3.0 and PEAR DB is >= 1.7.0. + * + options Command line options to be sent to the server. + * Available since PEAR DB 1.6.4. + * + service Specifies a service name in pg_service.conf that + * holds additional connection parameters. + * Available since PEAR DB 1.7.0. + * + sslmode How should SSL be used when connecting? Values: + * disable, allow, prefer or require. + * Available since PEAR DB 1.7.0. + * + tty This was used to specify where to send server + * debug output. Available since PEAR DB 1.6.4. + * + * Example of connecting to a new link via a socket: + * + * require_once 'DB.php'; + * + * $dsn = 'pgsql://user:pass@unix(/tmp)/dbname?new_link=true'; + * $options = array( + * 'portability' => DB_PORTABILITY_ALL, + * ); + * + * $db =& DB::connect($dsn, $options); + * if (PEAR::isError($db)) { + * die($db->getMessage()); + * } + * + * + * @param array $dsn the data source name + * @param bool $persistent should the connection be persistent? + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @link http://www.postgresql.org/docs/current/static/libpq.html#LIBPQ-CONNECT + */ + function connect($dsn, $persistent = false) + { + if (!PEAR::loadExtension('pgsql')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsn; + if ($dsn['dbsyntax']) { + $this->dbsyntax = $dsn['dbsyntax']; + } + + $protocol = $dsn['protocol'] ? $dsn['protocol'] : 'tcp'; + + $params = array(''); + if ($protocol == 'tcp') { + if ($dsn['hostspec']) { + $params[0] .= 'host=' . $dsn['hostspec']; + } + if ($dsn['port']) { + $params[0] .= ' port=' . $dsn['port']; + } + } elseif ($protocol == 'unix') { + // Allow for pg socket in non-standard locations. + if ($dsn['socket']) { + $params[0] .= 'host=' . $dsn['socket']; + } + if ($dsn['port']) { + $params[0] .= ' port=' . $dsn['port']; + } + } + if ($dsn['database']) { + $params[0] .= ' dbname=\'' . addslashes($dsn['database']) . '\''; + } + if ($dsn['username']) { + $params[0] .= ' user=\'' . addslashes($dsn['username']) . '\''; + } + if ($dsn['password']) { + $params[0] .= ' password=\'' . addslashes($dsn['password']) . '\''; + } + if (!empty($dsn['options'])) { + $params[0] .= ' options=' . $dsn['options']; + } + if (!empty($dsn['tty'])) { + $params[0] .= ' tty=' . $dsn['tty']; + } + if (!empty($dsn['connect_timeout'])) { + $params[0] .= ' connect_timeout=' . $dsn['connect_timeout']; + } + if (!empty($dsn['sslmode'])) { + $params[0] .= ' sslmode=' . $dsn['sslmode']; + } + if (!empty($dsn['service'])) { + $params[0] .= ' service=' . $dsn['service']; + } + + if (isset($dsn['new_link']) + && ($dsn['new_link'] == 'true' || $dsn['new_link'] === true)) + { + if (version_compare(phpversion(), '4.3.0', '>=')) { + $params[] = PGSQL_CONNECT_FORCE_NEW; + } + } + + $connect_function = $persistent ? 'pg_pconnect' : 'pg_connect'; + + $ini = ini_get('track_errors'); + $php_errormsg = ''; + if ($ini) { + $this->connection = @call_user_func_array($connect_function, + $params); + } else { + ini_set('track_errors', 1); + $this->connection = @call_user_func_array($connect_function, + $params); + ini_set('track_errors', $ini); + } + + if (!$this->connection) { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + $php_errormsg); + } + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Disconnects from the database server + * + * @return bool TRUE on success, FALSE on failure + */ + function disconnect() + { + $ret = @pg_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + /** + * Sends a query to the database server + * + * @param string the SQL query string + * + * @return mixed + a PHP result resrouce for successful SELECT queries + * + the DB_OK constant for other successful queries + * + a DB_Error object on failure + */ + function simpleQuery($query) + { + $ismanip = DB::isManip($query); + $this->last_query = $query; + $query = $this->modifyQuery($query); + if (!$this->autocommit && $ismanip) { + if ($this->transaction_opcount == 0) { + $result = @pg_exec($this->connection, 'begin;'); + if (!$result) { + return $this->pgsqlRaiseError(); + } + } + $this->transaction_opcount++; + } + $result = @pg_exec($this->connection, $query); + if (!$result) { + return $this->pgsqlRaiseError(); + } + // Determine which queries that should return data, and which + // should return an error code only. + if ($ismanip) { + $this->affected = @pg_affected_rows($result); + return DB_OK; + } elseif (preg_match('/^\s*\(*\s*(SELECT|EXPLAIN|SHOW)\s/si', $query)) { + /* PostgreSQL commands: + ABORT, ALTER, BEGIN, CLOSE, CLUSTER, COMMIT, COPY, + CREATE, DECLARE, DELETE, DROP TABLE, EXPLAIN, FETCH, + GRANT, INSERT, LISTEN, LOAD, LOCK, MOVE, NOTIFY, RESET, + REVOKE, ROLLBACK, SELECT, SELECT INTO, SET, SHOW, + UNLISTEN, UPDATE, VACUUM + */ + $this->row[(int)$result] = 0; // reset the row counter. + $numrows = $this->numRows($result); + if (is_object($numrows)) { + return $numrows; + } + $this->_num_rows[(int)$result] = $numrows; + $this->affected = 0; + return $result; + } else { + $this->affected = 0; + return DB_OK; + } + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal pgsql result pointer to the next available result + * + * @param a valid fbsql result resource + * + * @access public + * + * @return true if a result is available otherwise return false + */ + function nextResult($result) + { + return false; + } + + // }}} + // {{{ fetchInto() + + /** + * Places a row from the result set into the given array + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * This method is not meant to be called directly. Use + * DB_result::fetchInto() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result the query result resource + * @param array $arr the referenced array to put the data in + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch (0 = first row) + * + * @return mixed DB_OK on success, NULL when the end of a result set is + * reached or on failure + * + * @see DB_result::fetchInto() + */ + function fetchInto($result, &$arr, $fetchmode, $rownum = null) + { + $result_int = (int)$result; + $rownum = ($rownum !== null) ? $rownum : $this->row[$result_int]; + if ($rownum >= $this->_num_rows[$result_int]) { + return null; + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $arr = @pg_fetch_array($result, $rownum, PGSQL_ASSOC); + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @pg_fetch_row($result, $rownum); + } + if (!$arr) { + return null; + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + $this->row[$result_int] = ++$rownum; + return DB_OK; + } + + // }}} + // {{{ freeResult() + + /** + * Deletes the result set and frees the memory occupied by the result set + * + * This method is not meant to be called directly. Use + * DB_result::free() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return bool TRUE on success, FALSE if $result is invalid + * + * @see DB_result::free() + */ + function freeResult($result) + { + if (is_resource($result)) { + unset($this->row[(int)$result]); + unset($this->_num_rows[(int)$result]); + $this->affected = 0; + return @pg_freeresult($result); + } + return false; + } + + // }}} + // {{{ quote() + + /** + * @deprecated Deprecated in release 1.6.0 + * @internal + */ + function quote($str) + { + return $this->quoteSmart($str); + } + + // }}} + // {{{ quoteSmart() + + /** + * Formats input so it can be safely used in a query + * + * @param mixed $in the data to be formatted + * + * @return mixed the formatted data. The format depends on the input's + * PHP type: + * + null = the string NULL + * + boolean = string TRUE or FALSE + * + integer or double = the unquoted number + * + other (including strings and numeric strings) = + * the data escaped according to MySQL's settings + * then encapsulated between single quotes + * + * @see DB_common::quoteSmart() + * @since Method available since Release 1.6.0 + */ + function quoteSmart($in) + { + if (is_int($in) || is_double($in)) { + return $in; + } elseif (is_bool($in)) { + return $in ? 'TRUE' : 'FALSE'; + } elseif (is_null($in)) { + return 'NULL'; + } else { + return "'" . $this->escapeSimple($in) . "'"; + } + } + + // }}} + // {{{ escapeSimple() + + /** + * Escapes a string according to the current DBMS's standards + * + * {@internal PostgreSQL treats a backslash as an escape character, + * so they are escaped as well. + * + * Not using pg_escape_string() yet because it requires PostgreSQL + * to be at version 7.2 or greater.}} + * + * @param string $str the string to be escaped + * + * @return string the escaped string + * + * @see DB_common::quoteSmart() + * @since Method available since Release 1.6.0 + */ + function escapeSimple($str) + { + return str_replace("'", "''", str_replace('\\', '\\\\', $str)); + } + + // }}} + // {{{ numCols() + + /** + * Gets the number of columns in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numCols() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of columns. A DB_Error object on failure. + * + * @see DB_result::numCols() + */ + function numCols($result) + { + $cols = @pg_numfields($result); + if (!$cols) { + return $this->pgsqlRaiseError(); + } + return $cols; + } + + // }}} + // {{{ numRows() + + /** + * Gets the number of rows in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numRows() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of rows. A DB_Error object on failure. + * + * @see DB_result::numRows() + */ + function numRows($result) + { + $rows = @pg_numrows($result); + if ($rows === null) { + return $this->pgsqlRaiseError(); + } + return $rows; + } + + // }}} + // {{{ autoCommit() + + /** + * Enables or disables automatic commits + * + * @param bool $onoff true turns it on, false turns it off + * + * @return int DB_OK on success. A DB_Error object if the driver + * doesn't support auto-committing transactions. + */ + function autoCommit($onoff = false) + { + // XXX if $this->transaction_opcount > 0, we should probably + // issue a warning here. + $this->autocommit = $onoff ? true : false; + return DB_OK; + } + + // }}} + // {{{ commit() + + /** + * Commits the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function commit() + { + if ($this->transaction_opcount > 0) { + // (disabled) hack to shut up error messages from libpq.a + //@fclose(@fopen("php://stderr", "w")); + $result = @pg_exec($this->connection, 'end;'); + $this->transaction_opcount = 0; + if (!$result) { + return $this->pgsqlRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ rollback() + + /** + * Reverts the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function rollback() + { + if ($this->transaction_opcount > 0) { + $result = @pg_exec($this->connection, 'abort;'); + $this->transaction_opcount = 0; + if (!$result) { + return $this->pgsqlRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ affectedRows() + + /** + * Determines the number of rows affected by a data maniuplation query + * + * 0 is returned for queries that don't manipulate data. + * + * @return int the number of rows. A DB_Error object on failure. + */ + function affectedRows() + { + return $this->affected; + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. + * A DB_Error object on failure. + * + * @see DB_common::nextID(), DB_common::getSequenceName(), + * DB_pgsql::createSequence(), DB_pgsql::dropSequence() + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + $repeat = false; + do { + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result =& $this->query("SELECT NEXTVAL('${seqname}')"); + $this->popErrorHandling(); + if ($ondemand && DB::isError($result) && + $result->getCode() == DB_ERROR_NOSUCHTABLE) { + $repeat = true; + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->createSequence($seq_name); + $this->popErrorHandling(); + if (DB::isError($result)) { + return $this->raiseError($result); + } + } else { + $repeat = false; + } + } while ($repeat); + if (DB::isError($result)) { + return $this->raiseError($result); + } + $arr = $result->fetchRow(DB_FETCHMODE_ORDERED); + $result->free(); + return $arr[0]; + } + + // }}} + // {{{ createSequence() + + /** + * Creates a new sequence + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::createSequence(), DB_common::getSequenceName(), + * DB_pgsql::nextID(), DB_pgsql::dropSequence() + */ + function createSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + $result = $this->query("CREATE SEQUENCE ${seqname}"); + return $result; + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::dropSequence(), DB_common::getSequenceName(), + * DB_pgsql::nextID(), DB_pgsql::createSequence() + */ + function dropSequence($seq_name) + { + return $this->query('DROP SEQUENCE ' + . $this->getSequenceName($seq_name)); + } + + // }}} + // {{{ modifyLimitQuery() + + /** + * Adds LIMIT clauses to a query string according to current DBMS standards + * + * @param string $query the query to modify + * @param int $from the row to start to fetching (0 = the first row) + * @param int $count the numbers of rows to fetch + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return string the query string with LIMIT clauses added + * + * @access protected + */ + function modifyLimitQuery($query, $from, $count, $params = array()) + { + return "$query LIMIT $count OFFSET $from"; + } + + // }}} + // {{{ pgsqlRaiseError() + + /** + * Produces a DB_Error object regarding the current problem + * + * @param int $errno if the error is being manually raised pass a + * DB_ERROR* constant here. If this isn't passed + * the error information gathered from the DBMS. + * + * @return object the DB_Error object + * + * @see DB_common::raiseError(), + * DB_pgsql::errorNative(), DB_pgsql::errorCode() + */ + function pgsqlRaiseError($errno = null) + { + $native = $this->errorNative(); + if ($errno === null) { + $errno = $this->errorCode($native); + } + return $this->raiseError($errno, null, null, null, $native); + } + + // }}} + // {{{ errorNative() + + /** + * Gets the DBMS' native error message produced by the last query + * + * {@internal Error messages are used instead of error codes + * in order to support older versions of PostgreSQL.}} + * + * @return string the DBMS' error message + */ + function errorNative() + { + return @pg_errormessage($this->connection); + } + + // }}} + // {{{ errorCode() + + /** + * Determines PEAR::DB error code from the database's text error message. + * + * @param string $errormsg error message returned from the database + * @return integer an error number from a DB error constant + */ + function errorCode($errormsg) + { + static $error_regexps; + if (!isset($error_regexps)) { + $error_regexps = array( + '/(relation|sequence|table).*does not exist|class .* not found/i' + => DB_ERROR_NOSUCHTABLE, + '/index .* does not exist/' + => DB_ERROR_NOT_FOUND, + '/column .* does not exist/i' + => DB_ERROR_NOSUCHFIELD, + '/relation .* already exists/i' + => DB_ERROR_ALREADY_EXISTS, + '/(divide|division) by zero$/i' + => DB_ERROR_DIVZERO, + '/pg_atoi: error in .*: can\'t parse /i' + => DB_ERROR_INVALID_NUMBER, + '/invalid input syntax for( type)? (integer|numeric)/i' + => DB_ERROR_INVALID_NUMBER, + '/value .* is out of range for type \w*int/i' + => DB_ERROR_INVALID_NUMBER, + '/integer out of range/i' + => DB_ERROR_INVALID_NUMBER, + '/value too long for type character/i' + => DB_ERROR_INVALID, + '/attribute .* not found|relation .* does not have attribute/i' + => DB_ERROR_NOSUCHFIELD, + '/column .* specified in USING clause does not exist in (left|right) table/i' + => DB_ERROR_NOSUCHFIELD, + '/parser: parse error at or near/i' + => DB_ERROR_SYNTAX, + '/syntax error at/' + => DB_ERROR_SYNTAX, + '/column reference .* is ambiguous/i' + => DB_ERROR_SYNTAX, + '/permission denied/' + => DB_ERROR_ACCESS_VIOLATION, + '/violates not-null constraint/' + => DB_ERROR_CONSTRAINT_NOT_NULL, + '/violates [\w ]+ constraint/' + => DB_ERROR_CONSTRAINT, + '/referential integrity violation/' + => DB_ERROR_CONSTRAINT, + '/more expressions than target columns/i' + => DB_ERROR_VALUE_COUNT_ON_ROW, + ); + } + foreach ($error_regexps as $regexp => $code) { + if (preg_match($regexp, $errormsg)) { + return $code; + } + } + // Fall back to DB_ERROR if there was no mapping. + return DB_ERROR; + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set + * + * NOTE: only supports 'table' and 'flags' if $result + * is a table name. + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table. + * While this also accepts a query result + * resource identifier, this behavior is + * deprecated. + * @param int $mode a valid tableInfo mode + * + * @return array an associative array with the information requested. + * A DB_Error object on failure. + * + * @see DB_common::tableInfo() + */ + function tableInfo($result, $mode = null) + { + if (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + $id = @pg_exec($this->connection, "SELECT * FROM $result LIMIT 0"); + $got_string = true; + } elseif (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $id = $result->result; + $got_string = false; + } else { + /* + * Probably received a result resource identifier. + * Copy it. + * Deprecated. Here for compatibility only. + */ + $id = $result; + $got_string = false; + } + + if (!is_resource($id)) { + return $this->pgsqlRaiseError(DB_ERROR_NEED_MORE_DATA); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $count = @pg_numfields($id); + $res = array(); + + if ($mode) { + $res['num_fields'] = $count; + } + + for ($i = 0; $i < $count; $i++) { + $res[$i] = array( + 'table' => $got_string ? $case_func($result) : '', + 'name' => $case_func(@pg_fieldname($id, $i)), + 'type' => @pg_fieldtype($id, $i), + 'len' => @pg_fieldsize($id, $i), + 'flags' => $got_string + ? $this->_pgFieldFlags($id, $i, $result) + : '', + ); + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + + // free the result only if we were called on a table + if ($got_string) { + @pg_freeresult($id); + } + return $res; + } + + // }}} + // {{{ _pgFieldFlags() + + /** + * Get a column's flags + * + * Supports "not_null", "default_value", "primary_key", "unique_key" + * and "multiple_key". The default value is passed through + * rawurlencode() in case there are spaces in it. + * + * @param int $resource the PostgreSQL result identifier + * @param int $num_field the field number + * + * @return string the flags + * + * @access private + */ + function _pgFieldFlags($resource, $num_field, $table_name) + { + $field_name = @pg_fieldname($resource, $num_field); + + $result = @pg_exec($this->connection, "SELECT f.attnotnull, f.atthasdef + FROM pg_attribute f, pg_class tab, pg_type typ + WHERE tab.relname = typ.typname + AND typ.typrelid = f.attrelid + AND f.attname = '$field_name' + AND tab.relname = '$table_name'"); + if (@pg_numrows($result) > 0) { + $row = @pg_fetch_row($result, 0); + $flags = ($row[0] == 't') ? 'not_null ' : ''; + + if ($row[1] == 't') { + $result = @pg_exec($this->connection, "SELECT a.adsrc + FROM pg_attribute f, pg_class tab, pg_type typ, pg_attrdef a + WHERE tab.relname = typ.typname AND typ.typrelid = f.attrelid + AND f.attrelid = a.adrelid AND f.attname = '$field_name' + AND tab.relname = '$table_name' AND f.attnum = a.adnum"); + $row = @pg_fetch_row($result, 0); + $num = preg_replace("/'(.*)'::\w+/", "\\1", $row[0]); + $flags .= 'default_' . rawurlencode($num) . ' '; + } + } else { + $flags = ''; + } + $result = @pg_exec($this->connection, "SELECT i.indisunique, i.indisprimary, i.indkey + FROM pg_attribute f, pg_class tab, pg_type typ, pg_index i + WHERE tab.relname = typ.typname + AND typ.typrelid = f.attrelid + AND f.attrelid = i.indrelid + AND f.attname = '$field_name' + AND tab.relname = '$table_name'"); + $count = @pg_numrows($result); + + for ($i = 0; $i < $count ; $i++) { + $row = @pg_fetch_row($result, $i); + $keys = explode(' ', $row[2]); + + if (in_array($num_field + 1, $keys)) { + $flags .= ($row[0] == 't' && $row[1] == 'f') ? 'unique_key ' : ''; + $flags .= ($row[1] == 't') ? 'primary_key ' : ''; + if (count($keys) > 1) + $flags .= 'multiple_key '; + } + } + + return trim($flags); + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Obtains the query string needed for listing a given type of objects + * + * @param string $type the kind of objects you want to retrieve + * + * @return string the SQL query string or null if the driver doesn't + * support the object type requested + * + * @access protected + * @see DB_common::getListOf() + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'tables': + return 'SELECT c.relname AS "Name"' + . ' FROM pg_class c, pg_user u' + . ' WHERE c.relowner = u.usesysid' + . " AND c.relkind = 'r'" + . ' AND NOT EXISTS' + . ' (SELECT 1 FROM pg_views' + . ' WHERE viewname = c.relname)' + . " AND c.relname !~ '^(pg_|sql_)'" + . ' UNION' + . ' SELECT c.relname AS "Name"' + . ' FROM pg_class c' + . " WHERE c.relkind = 'r'" + . ' AND NOT EXISTS' + . ' (SELECT 1 FROM pg_views' + . ' WHERE viewname = c.relname)' + . ' AND NOT EXISTS' + . ' (SELECT 1 FROM pg_user' + . ' WHERE usesysid = c.relowner)' + . " AND c.relname !~ '^pg_'"; + case 'schema.tables': + return "SELECT schemaname || '.' || tablename" + . ' AS "Name"' + . ' FROM pg_catalog.pg_tables' + . ' WHERE schemaname NOT IN' + . " ('pg_catalog', 'information_schema', 'pg_toast')"; + case 'views': + // Table cols: viewname | viewowner | definition + return 'SELECT viewname from pg_views WHERE schemaname' + . " NOT IN ('information_schema', 'pg_catalog')"; + case 'users': + // cols: usename |usesysid|usecreatedb|usetrace|usesuper|usecatupd|passwd |valuntil + return 'SELECT usename FROM pg_user'; + case 'databases': + return 'SELECT datname FROM pg_database'; + case 'functions': + case 'procedures': + return 'SELECT proname FROM pg_proc WHERE proowner <> 1'; + default: + return null; + } + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/DB/storage.php b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/DB/storage.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/DB/storage.php @@ -0,0 +1,504 @@ + + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: storage.php 32 2005-08-01 06:21:02Z dancoulter $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the DB class so it can be extended from + */ +require_once 'DB.php'; + +/** + * Provides an object interface to a table row + * + * It lets you add, delete and change rows using objects rather than SQL + * statements. + * + * @category Database + * @package DB + * @author Stig Bakken + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: @package_version@ + * @link http://pear.php.net/package/DB + */ +class DB_storage extends PEAR +{ + // {{{ properties + + /** the name of the table (or view, if the backend database supports + updates in views) we hold data from */ + var $_table = null; + + /** which column(s) in the table contains primary keys, can be a + string for single-column primary keys, or an array of strings + for multiple-column primary keys */ + var $_keycolumn = null; + + /** DB connection handle used for all transactions */ + var $_dbh = null; + + /** an assoc with the names of database fields stored as properties + in this object */ + var $_properties = array(); + + /** an assoc with the names of the properties in this object that + have been changed since they were fetched from the database */ + var $_changes = array(); + + /** flag that decides if data in this object can be changed. + objects that don't have their table's key column in their + property lists will be flagged as read-only. */ + var $_readonly = false; + + /** function or method that implements a validator for fields that + are set, this validator function returns true if the field is + valid, false if not */ + var $_validator = null; + + // }}} + // {{{ constructor + + /** + * Constructor + * + * @param $table string the name of the database table + * + * @param $keycolumn mixed string with name of key column, or array of + * strings if the table has a primary key of more than one column + * + * @param $dbh object database connection object + * + * @param $validator mixed function or method used to validate + * each new value, called with three parameters: the name of the + * field/column that is changing, a reference to the new value and + * a reference to this object + * + */ + function DB_storage($table, $keycolumn, &$dbh, $validator = null) + { + $this->PEAR('DB_Error'); + $this->_table = $table; + $this->_keycolumn = $keycolumn; + $this->_dbh = $dbh; + $this->_readonly = false; + $this->_validator = $validator; + } + + // }}} + // {{{ _makeWhere() + + /** + * Utility method to build a "WHERE" clause to locate ourselves in + * the table. + * + * XXX future improvement: use rowids? + * + * @access private + */ + function _makeWhere($keyval = null) + { + if (is_array($this->_keycolumn)) { + if ($keyval === null) { + for ($i = 0; $i < sizeof($this->_keycolumn); $i++) { + $keyval[] = $this->{$this->_keycolumn[$i]}; + } + } + $whereclause = ''; + for ($i = 0; $i < sizeof($this->_keycolumn); $i++) { + if ($i > 0) { + $whereclause .= ' AND '; + } + $whereclause .= $this->_keycolumn[$i]; + if (is_null($keyval[$i])) { + // there's not much point in having a NULL key, + // but we support it anyway + $whereclause .= ' IS NULL'; + } else { + $whereclause .= ' = ' . $this->_dbh->quote($keyval[$i]); + } + } + } else { + if ($keyval === null) { + $keyval = @$this->{$this->_keycolumn}; + } + $whereclause = $this->_keycolumn; + if (is_null($keyval)) { + // there's not much point in having a NULL key, + // but we support it anyway + $whereclause .= ' IS NULL'; + } else { + $whereclause .= ' = ' . $this->_dbh->quote($keyval); + } + } + return $whereclause; + } + + // }}} + // {{{ setup() + + /** + * Method used to initialize a DB_storage object from the + * configured table. + * + * @param $keyval mixed the key[s] of the row to fetch (string or array) + * + * @return int DB_OK on success, a DB error if not + */ + function setup($keyval) + { + $whereclause = $this->_makeWhere($keyval); + $query = 'SELECT * FROM ' . $this->_table . ' WHERE ' . $whereclause; + $sth = $this->_dbh->query($query); + if (DB::isError($sth)) { + return $sth; + } + $row = $sth->fetchRow(DB_FETCHMODE_ASSOC); + if (DB::isError($row)) { + return $row; + } + if (!$row) { + return $this->raiseError(null, DB_ERROR_NOT_FOUND, null, null, + $query, null, true); + } + foreach ($row as $key => $value) { + $this->_properties[$key] = true; + $this->$key = $value; + } + return DB_OK; + } + + // }}} + // {{{ insert() + + /** + * Create a new (empty) row in the configured table for this + * object. + */ + function insert($newpk) + { + if (is_array($this->_keycolumn)) { + $primarykey = $this->_keycolumn; + } else { + $primarykey = array($this->_keycolumn); + } + settype($newpk, "array"); + for ($i = 0; $i < sizeof($primarykey); $i++) { + $pkvals[] = $this->_dbh->quote($newpk[$i]); + } + + $sth = $this->_dbh->query("INSERT INTO $this->_table (" . + implode(",", $primarykey) . ") VALUES(" . + implode(",", $pkvals) . ")"); + if (DB::isError($sth)) { + return $sth; + } + if (sizeof($newpk) == 1) { + $newpk = $newpk[0]; + } + $this->setup($newpk); + } + + // }}} + // {{{ toString() + + /** + * Output a simple description of this DB_storage object. + * @return string object description + */ + function toString() + { + $info = strtolower(get_class($this)); + $info .= " (table="; + $info .= $this->_table; + $info .= ", keycolumn="; + if (is_array($this->_keycolumn)) { + $info .= "(" . implode(",", $this->_keycolumn) . ")"; + } else { + $info .= $this->_keycolumn; + } + $info .= ", dbh="; + if (is_object($this->_dbh)) { + $info .= $this->_dbh->toString(); + } else { + $info .= "null"; + } + $info .= ")"; + if (sizeof($this->_properties)) { + $info .= " [loaded, key="; + $keyname = $this->_keycolumn; + if (is_array($keyname)) { + $info .= "("; + for ($i = 0; $i < sizeof($keyname); $i++) { + if ($i > 0) { + $info .= ","; + } + $info .= $this->$keyname[$i]; + } + $info .= ")"; + } else { + $info .= $this->$keyname; + } + $info .= "]"; + } + if (sizeof($this->_changes)) { + $info .= " [modified]"; + } + return $info; + } + + // }}} + // {{{ dump() + + /** + * Dump the contents of this object to "standard output". + */ + function dump() + { + foreach ($this->_properties as $prop => $foo) { + print "$prop = "; + print htmlentities($this->$prop); + print "
\n"; + } + } + + // }}} + // {{{ &create() + + /** + * Static method used to create new DB storage objects. + * @param $data assoc. array where the keys are the names + * of properties/columns + * @return object a new instance of DB_storage or a subclass of it + */ + function &create($table, &$data) + { + $classname = strtolower(get_class($this)); + $obj =& new $classname($table); + foreach ($data as $name => $value) { + $obj->_properties[$name] = true; + $obj->$name = &$value; + } + return $obj; + } + + // }}} + // {{{ loadFromQuery() + + /** + * Loads data into this object from the given query. If this + * object already contains table data, changes will be saved and + * the object re-initialized first. + * + * @param $query SQL query + * + * @param $params parameter list in case you want to use + * prepare/execute mode + * + * @return int DB_OK on success, DB_WARNING_READ_ONLY if the + * returned object is read-only (because the object's specified + * key column was not found among the columns returned by $query), + * or another DB error code in case of errors. + */ +// XXX commented out for now +/* + function loadFromQuery($query, $params = null) + { + if (sizeof($this->_properties)) { + if (sizeof($this->_changes)) { + $this->store(); + $this->_changes = array(); + } + $this->_properties = array(); + } + $rowdata = $this->_dbh->getRow($query, DB_FETCHMODE_ASSOC, $params); + if (DB::isError($rowdata)) { + return $rowdata; + } + reset($rowdata); + $found_keycolumn = false; + while (list($key, $value) = each($rowdata)) { + if ($key == $this->_keycolumn) { + $found_keycolumn = true; + } + $this->_properties[$key] = true; + $this->$key = &$value; + unset($value); // have to unset, or all properties will + // refer to the same value + } + if (!$found_keycolumn) { + $this->_readonly = true; + return DB_WARNING_READ_ONLY; + } + return DB_OK; + } + */ + + // }}} + // {{{ set() + + /** + * Modify an attriute value. + */ + function set($property, $newvalue) + { + // only change if $property is known and object is not + // read-only + if ($this->_readonly) { + return $this->raiseError(null, DB_WARNING_READ_ONLY, null, + null, null, null, true); + } + if (@isset($this->_properties[$property])) { + if (empty($this->_validator)) { + $valid = true; + } else { + $valid = @call_user_func($this->_validator, + $this->_table, + $property, + $newvalue, + $this->$property, + $this); + } + if ($valid) { + $this->$property = $newvalue; + if (empty($this->_changes[$property])) { + $this->_changes[$property] = 0; + } else { + $this->_changes[$property]++; + } + } else { + return $this->raiseError(null, DB_ERROR_INVALID, null, + null, "invalid field: $property", + null, true); + } + return true; + } + return $this->raiseError(null, DB_ERROR_NOSUCHFIELD, null, + null, "unknown field: $property", + null, true); + } + + // }}} + // {{{ &get() + + /** + * Fetch an attribute value. + * + * @param string attribute name + * + * @return attribute contents, or null if the attribute name is + * unknown + */ + function &get($property) + { + // only return if $property is known + if (isset($this->_properties[$property])) { + return $this->$property; + } + $tmp = null; + return $tmp; + } + + // }}} + // {{{ _DB_storage() + + /** + * Destructor, calls DB_storage::store() if there are changes + * that are to be kept. + */ + function _DB_storage() + { + if (sizeof($this->_changes)) { + $this->store(); + } + $this->_properties = array(); + $this->_changes = array(); + $this->_table = null; + } + + // }}} + // {{{ store() + + /** + * Stores changes to this object in the database. + * + * @return DB_OK or a DB error + */ + function store() + { + foreach ($this->_changes as $name => $foo) { + $params[] = &$this->$name; + $vars[] = $name . ' = ?'; + } + if ($vars) { + $query = 'UPDATE ' . $this->_table . ' SET ' . + implode(', ', $vars) . ' WHERE ' . + $this->_makeWhere(); + $stmt = $this->_dbh->prepare($query); + $res = $this->_dbh->execute($stmt, $params); + if (DB::isError($res)) { + return $res; + } + $this->_changes = array(); + } + return DB_OK; + } + + // }}} + // {{{ remove() + + /** + * Remove the row represented by this object from the database. + * + * @return mixed DB_OK or a DB error + */ + function remove() + { + if ($this->_readonly) { + return $this->raiseError(null, DB_WARNING_READ_ONLY, null, + null, null, null, true); + } + $query = 'DELETE FROM ' . $this->_table .' WHERE '. + $this->_makeWhere(); + $res = $this->_dbh->query($query); + if (DB::isError($res)) { + return $res; + } + foreach ($this->_properties as $prop => $foo) { + unset($this->$prop); + } + $this->_properties = array(); + $this->_changes = array(); + return DB_OK; + } + + // }}} +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/HTTP/Request.php b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/HTTP/Request.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/HTTP/Request.php @@ -0,0 +1,1484 @@ + + * @author Alexey Borzov + * @copyright 2002-2007 Richard Heyes + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version CVS: $Id: Request.php 127 2008-01-17 20:21:37Z dcoulter $ + * @link http://pear.php.net/package/HTTP_Request/ + */ + +/** + * PEAR and PEAR_Error classes (for error handling) + */ +require_once 'PEAR.php'; +/** + * Socket class + */ +require_once 'Net/Socket.php'; +/** + * URL handling class + */ +require_once 'Net/URL.php'; + +/**#@+ + * Constants for HTTP request methods + */ +define('HTTP_REQUEST_METHOD_GET', 'GET', true); +define('HTTP_REQUEST_METHOD_HEAD', 'HEAD', true); +define('HTTP_REQUEST_METHOD_POST', 'POST', true); +define('HTTP_REQUEST_METHOD_PUT', 'PUT', true); +define('HTTP_REQUEST_METHOD_DELETE', 'DELETE', true); +define('HTTP_REQUEST_METHOD_OPTIONS', 'OPTIONS', true); +define('HTTP_REQUEST_METHOD_TRACE', 'TRACE', true); +/**#@-*/ + +/**#@+ + * Constants for HTTP request error codes + */ +define('HTTP_REQUEST_ERROR_FILE', 1); +define('HTTP_REQUEST_ERROR_URL', 2); +define('HTTP_REQUEST_ERROR_PROXY', 4); +define('HTTP_REQUEST_ERROR_REDIRECTS', 8); +define('HTTP_REQUEST_ERROR_RESPONSE', 16); +define('HTTP_REQUEST_ERROR_GZIP_METHOD', 32); +define('HTTP_REQUEST_ERROR_GZIP_READ', 64); +define('HTTP_REQUEST_ERROR_GZIP_DATA', 128); +define('HTTP_REQUEST_ERROR_GZIP_CRC', 256); +/**#@-*/ + +/**#@+ + * Constants for HTTP protocol versions + */ +define('HTTP_REQUEST_HTTP_VER_1_0', '1.0', true); +define('HTTP_REQUEST_HTTP_VER_1_1', '1.1', true); +/**#@-*/ + +if (extension_loaded('mbstring') && (2 & ini_get('mbstring.func_overload'))) { + /** + * Whether string functions are overloaded by their mbstring equivalents + */ + define('HTTP_REQUEST_MBSTRING', true); +} else { + /** + * @ignore + */ + define('HTTP_REQUEST_MBSTRING', false); +} + +/** + * Class for performing HTTP requests + * + * Simple example (fetches yahoo.com and displays it): + * + * $a = &new HTTP_Request('http://www.yahoo.com/'); + * $a->sendRequest(); + * echo $a->getResponseBody(); + * + * + * @category HTTP + * @package HTTP_Request + * @author Richard Heyes + * @author Alexey Borzov + * @version Release: 1.4.2 + */ +class HTTP_Request +{ + /**#@+ + * @access private + */ + /** + * Instance of Net_URL + * @var Net_URL + */ + var $_url; + + /** + * Type of request + * @var string + */ + var $_method; + + /** + * HTTP Version + * @var string + */ + var $_http; + + /** + * Request headers + * @var array + */ + var $_requestHeaders; + + /** + * Basic Auth Username + * @var string + */ + var $_user; + + /** + * Basic Auth Password + * @var string + */ + var $_pass; + + /** + * Socket object + * @var Net_Socket + */ + var $_sock; + + /** + * Proxy server + * @var string + */ + var $_proxy_host; + + /** + * Proxy port + * @var integer + */ + var $_proxy_port; + + /** + * Proxy username + * @var string + */ + var $_proxy_user; + + /** + * Proxy password + * @var string + */ + var $_proxy_pass; + + /** + * Post data + * @var array + */ + var $_postData; + + /** + * Request body + * @var string + */ + var $_body; + + /** + * A list of methods that MUST NOT have a request body, per RFC 2616 + * @var array + */ + var $_bodyDisallowed = array('TRACE'); + + /** + * Files to post + * @var array + */ + var $_postFiles = array(); + + /** + * Connection timeout. + * @var float + */ + var $_timeout; + + /** + * HTTP_Response object + * @var HTTP_Response + */ + var $_response; + + /** + * Whether to allow redirects + * @var boolean + */ + var $_allowRedirects; + + /** + * Maximum redirects allowed + * @var integer + */ + var $_maxRedirects; + + /** + * Current number of redirects + * @var integer + */ + var $_redirects; + + /** + * Whether to append brackets [] to array variables + * @var bool + */ + var $_useBrackets = true; + + /** + * Attached listeners + * @var array + */ + var $_listeners = array(); + + /** + * Whether to save response body in response object property + * @var bool + */ + var $_saveBody = true; + + /** + * Timeout for reading from socket (array(seconds, microseconds)) + * @var array + */ + var $_readTimeout = null; + + /** + * Options to pass to Net_Socket::connect. See stream_context_create + * @var array + */ + var $_socketOptions = null; + /**#@-*/ + + /** + * Constructor + * + * Sets up the object + * @param string The url to fetch/access + * @param array Associative array of parameters which can have the following keys: + *
    + *
  • method - Method to use, GET, POST etc (string)
  • + *
  • http - HTTP Version to use, 1.0 or 1.1 (string)
  • + *
  • user - Basic Auth username (string)
  • + *
  • pass - Basic Auth password (string)
  • + *
  • proxy_host - Proxy server host (string)
  • + *
  • proxy_port - Proxy server port (integer)
  • + *
  • proxy_user - Proxy auth username (string)
  • + *
  • proxy_pass - Proxy auth password (string)
  • + *
  • timeout - Connection timeout in seconds (float)
  • + *
  • allowRedirects - Whether to follow redirects or not (bool)
  • + *
  • maxRedirects - Max number of redirects to follow (integer)
  • + *
  • useBrackets - Whether to append [] to array variable names (bool)
  • + *
  • saveBody - Whether to save response body in response object property (bool)
  • + *
  • readTimeout - Timeout for reading / writing data over the socket (array (seconds, microseconds))
  • + *
  • socketOptions - Options to pass to Net_Socket object (array)
  • + *
+ * @access public + */ + function HTTP_Request($url = '', $params = array()) + { + $this->_method = HTTP_REQUEST_METHOD_GET; + $this->_http = HTTP_REQUEST_HTTP_VER_1_1; + $this->_requestHeaders = array(); + $this->_postData = array(); + $this->_body = null; + + $this->_user = null; + $this->_pass = null; + + $this->_proxy_host = null; + $this->_proxy_port = null; + $this->_proxy_user = null; + $this->_proxy_pass = null; + + $this->_allowRedirects = false; + $this->_maxRedirects = 3; + $this->_redirects = 0; + + $this->_timeout = null; + $this->_response = null; + + foreach ($params as $key => $value) { + $this->{'_' . $key} = $value; + } + + if (!empty($url)) { + $this->setURL($url); + } + + // Default useragent + $this->addHeader('User-Agent', 'PEAR HTTP_Request class ( http://pear.php.net/ )'); + + // We don't do keep-alives by default + $this->addHeader('Connection', 'close'); + + // Basic authentication + if (!empty($this->_user)) { + $this->addHeader('Authorization', 'Basic ' . base64_encode($this->_user . ':' . $this->_pass)); + } + + // Proxy authentication (see bug #5913) + if (!empty($this->_proxy_user)) { + $this->addHeader('Proxy-Authorization', 'Basic ' . base64_encode($this->_proxy_user . ':' . $this->_proxy_pass)); + } + + // Use gzip encoding if possible + if (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http && extension_loaded('zlib')) { + $this->addHeader('Accept-Encoding', 'gzip'); + } + } + + /** + * Generates a Host header for HTTP/1.1 requests + * + * @access private + * @return string + */ + function _generateHostHeader() + { + if ($this->_url->port != 80 AND strcasecmp($this->_url->protocol, 'http') == 0) { + $host = $this->_url->host . ':' . $this->_url->port; + + } elseif ($this->_url->port != 443 AND strcasecmp($this->_url->protocol, 'https') == 0) { + $host = $this->_url->host . ':' . $this->_url->port; + + } elseif ($this->_url->port == 443 AND strcasecmp($this->_url->protocol, 'https') == 0 AND strpos($this->_url->url, ':443') !== false) { + $host = $this->_url->host . ':' . $this->_url->port; + + } else { + $host = $this->_url->host; + } + + return $host; + } + + /** + * Resets the object to its initial state (DEPRECATED). + * Takes the same parameters as the constructor. + * + * @param string $url The url to be requested + * @param array $params Associative array of parameters + * (see constructor for details) + * @access public + * @deprecated deprecated since 1.2, call the constructor if this is necessary + */ + function reset($url, $params = array()) + { + $this->HTTP_Request($url, $params); + } + + /** + * Sets the URL to be requested + * + * @param string The url to be requested + * @access public + */ + function setURL($url) + { + $this->_url = &new Net_URL($url, $this->_useBrackets); + + if (!empty($this->_url->user) || !empty($this->_url->pass)) { + $this->setBasicAuth($this->_url->user, $this->_url->pass); + } + + if (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http) { + $this->addHeader('Host', $this->_generateHostHeader()); + } + + // set '/' instead of empty path rather than check later (see bug #8662) + if (empty($this->_url->path)) { + $this->_url->path = '/'; + } + } + + /** + * Returns the current request URL + * + * @return string Current request URL + * @access public + */ + function getUrl() + { + return empty($this->_url)? '': $this->_url->getUrl(); + } + + /** + * Sets a proxy to be used + * + * @param string Proxy host + * @param int Proxy port + * @param string Proxy username + * @param string Proxy password + * @access public + */ + function setProxy($host, $port = 8080, $user = null, $pass = null) + { + $this->_proxy_host = $host; + $this->_proxy_port = $port; + $this->_proxy_user = $user; + $this->_proxy_pass = $pass; + + if (!empty($user)) { + $this->addHeader('Proxy-Authorization', 'Basic ' . base64_encode($user . ':' . $pass)); + } + } + + /** + * Sets basic authentication parameters + * + * @param string Username + * @param string Password + */ + function setBasicAuth($user, $pass) + { + $this->_user = $user; + $this->_pass = $pass; + + $this->addHeader('Authorization', 'Basic ' . base64_encode($user . ':' . $pass)); + } + + /** + * Sets the method to be used, GET, POST etc. + * + * @param string Method to use. Use the defined constants for this + * @access public + */ + function setMethod($method) + { + $this->_method = $method; + } + + /** + * Sets the HTTP version to use, 1.0 or 1.1 + * + * @param string Version to use. Use the defined constants for this + * @access public + */ + function setHttpVer($http) + { + $this->_http = $http; + } + + /** + * Adds a request header + * + * @param string Header name + * @param string Header value + * @access public + */ + function addHeader($name, $value) + { + $this->_requestHeaders[strtolower($name)] = $value; + } + + /** + * Removes a request header + * + * @param string Header name to remove + * @access public + */ + function removeHeader($name) + { + if (isset($this->_requestHeaders[strtolower($name)])) { + unset($this->_requestHeaders[strtolower($name)]); + } + } + + /** + * Adds a querystring parameter + * + * @param string Querystring parameter name + * @param string Querystring parameter value + * @param bool Whether the value is already urlencoded or not, default = not + * @access public + */ + function addQueryString($name, $value, $preencoded = false) + { + $this->_url->addQueryString($name, $value, $preencoded); + } + + /** + * Sets the querystring to literally what you supply + * + * @param string The querystring data. Should be of the format foo=bar&x=y etc + * @param bool Whether data is already urlencoded or not, default = already encoded + * @access public + */ + function addRawQueryString($querystring, $preencoded = true) + { + $this->_url->addRawQueryString($querystring, $preencoded); + } + + /** + * Adds postdata items + * + * @param string Post data name + * @param string Post data value + * @param bool Whether data is already urlencoded or not, default = not + * @access public + */ + function addPostData($name, $value, $preencoded = false) + { + if ($preencoded) { + $this->_postData[$name] = $value; + } else { + $this->_postData[$name] = $this->_arrayMapRecursive('urlencode', $value); + } + } + + /** + * Recursively applies the callback function to the value + * + * @param mixed Callback function + * @param mixed Value to process + * @access private + * @return mixed Processed value + */ + function _arrayMapRecursive($callback, $value) + { + if (!is_array($value)) { + return call_user_func($callback, $value); + } else { + $map = array(); + foreach ($value as $k => $v) { + $map[$k] = $this->_arrayMapRecursive($callback, $v); + } + return $map; + } + } + + /** + * Adds a file to upload + * + * This also changes content-type to 'multipart/form-data' for proper upload + * + * @access public + * @param string name of file-upload field + * @param mixed file name(s) + * @param mixed content-type(s) of file(s) being uploaded + * @return bool true on success + * @throws PEAR_Error + */ + function addFile($inputName, $fileName, $contentType = 'application/octet-stream') + { + if (!is_array($fileName) && !is_readable($fileName)) { + return PEAR::raiseError("File '{$fileName}' is not readable", HTTP_REQUEST_ERROR_FILE); + } elseif (is_array($fileName)) { + foreach ($fileName as $name) { + if (!is_readable($name)) { + return PEAR::raiseError("File '{$name}' is not readable", HTTP_REQUEST_ERROR_FILE); + } + } + } + $this->addHeader('Content-Type', 'multipart/form-data'); + $this->_postFiles[$inputName] = array( + 'name' => $fileName, + 'type' => $contentType + ); + return true; + } + + /** + * Adds raw postdata (DEPRECATED) + * + * @param string The data + * @param bool Whether data is preencoded or not, default = already encoded + * @access public + * @deprecated deprecated since 1.3.0, method setBody() should be used instead + */ + function addRawPostData($postdata, $preencoded = true) + { + $this->_body = $preencoded ? $postdata : urlencode($postdata); + } + + /** + * Sets the request body (for POST, PUT and similar requests) + * + * @param string Request body + * @access public + */ + function setBody($body) + { + $this->_body = $body; + } + + /** + * Clears any postdata that has been added (DEPRECATED). + * + * Useful for multiple request scenarios. + * + * @access public + * @deprecated deprecated since 1.2 + */ + function clearPostData() + { + $this->_postData = null; + } + + /** + * Appends a cookie to "Cookie:" header + * + * @param string $name cookie name + * @param string $value cookie value + * @access public + */ + function addCookie($name, $value) + { + $cookies = isset($this->_requestHeaders['cookie']) ? $this->_requestHeaders['cookie']. '; ' : ''; + $this->addHeader('Cookie', $cookies . $name . '=' . $value); + } + + /** + * Clears any cookies that have been added (DEPRECATED). + * + * Useful for multiple request scenarios + * + * @access public + * @deprecated deprecated since 1.2 + */ + function clearCookies() + { + $this->removeHeader('Cookie'); + } + + /** + * Sends the request + * + * @access public + * @param bool Whether to store response body in Response object property, + * set this to false if downloading a LARGE file and using a Listener + * @return mixed PEAR error on error, true otherwise + */ + function sendRequest($saveBody = true) + { + if (!is_a($this->_url, 'Net_URL')) { + return PEAR::raiseError('No URL given', HTTP_REQUEST_ERROR_URL); + } + + $host = isset($this->_proxy_host) ? $this->_proxy_host : $this->_url->host; + $port = isset($this->_proxy_port) ? $this->_proxy_port : $this->_url->port; + + // 4.3.0 supports SSL connections using OpenSSL. The function test determines + // we running on at least 4.3.0 + if (strcasecmp($this->_url->protocol, 'https') == 0 AND function_exists('file_get_contents') AND extension_loaded('openssl')) { + if (isset($this->_proxy_host)) { + return PEAR::raiseError('HTTPS proxies are not supported', HTTP_REQUEST_ERROR_PROXY); + } + $host = 'ssl://' . $host; + } + + // magic quotes may fuck up file uploads and chunked response processing + $magicQuotes = ini_get('magic_quotes_runtime'); + ini_set('magic_quotes_runtime', false); + + // RFC 2068, section 19.7.1: A client MUST NOT send the Keep-Alive + // connection token to a proxy server... + if (isset($this->_proxy_host) && !empty($this->_requestHeaders['connection']) && + 'Keep-Alive' == $this->_requestHeaders['connection']) + { + $this->removeHeader('connection'); + } + + $keepAlive = (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http && empty($this->_requestHeaders['connection'])) || + (!empty($this->_requestHeaders['connection']) && 'Keep-Alive' == $this->_requestHeaders['connection']); + $sockets = &PEAR::getStaticProperty('HTTP_Request', 'sockets'); + $sockKey = $host . ':' . $port; + unset($this->_sock); + + // There is a connected socket in the "static" property? + if ($keepAlive && !empty($sockets[$sockKey]) && + !empty($sockets[$sockKey]->fp)) + { + $this->_sock =& $sockets[$sockKey]; + $err = null; + } else { + $this->_notify('connect'); + $this->_sock =& new Net_Socket(); + $err = $this->_sock->connect($host, $port, null, $this->_timeout, $this->_socketOptions); + } + PEAR::isError($err) or $err = $this->_sock->write($this->_buildRequest()); + + if (!PEAR::isError($err)) { + if (!empty($this->_readTimeout)) { + $this->_sock->setTimeout($this->_readTimeout[0], $this->_readTimeout[1]); + } + + $this->_notify('sentRequest'); + + // Read the response + $this->_response = &new HTTP_Response($this->_sock, $this->_listeners); + $err = $this->_response->process( + $this->_saveBody && $saveBody, + HTTP_REQUEST_METHOD_HEAD != $this->_method + ); + + if ($keepAlive) { + $keepAlive = (isset($this->_response->_headers['content-length']) + || (isset($this->_response->_headers['transfer-encoding']) + && strtolower($this->_response->_headers['transfer-encoding']) == 'chunked')); + if ($keepAlive) { + if (isset($this->_response->_headers['connection'])) { + $keepAlive = strtolower($this->_response->_headers['connection']) == 'keep-alive'; + } else { + $keepAlive = 'HTTP/'.HTTP_REQUEST_HTTP_VER_1_1 == $this->_response->_protocol; + } + } + } + } + + ini_set('magic_quotes_runtime', $magicQuotes); + + if (PEAR::isError($err)) { + return $err; + } + + if (!$keepAlive) { + $this->disconnect(); + // Store the connected socket in "static" property + } elseif (empty($sockets[$sockKey]) || empty($sockets[$sockKey]->fp)) { + $sockets[$sockKey] =& $this->_sock; + } + + // Check for redirection + if ( $this->_allowRedirects + AND $this->_redirects <= $this->_maxRedirects + AND $this->getResponseCode() > 300 + AND $this->getResponseCode() < 399 + AND !empty($this->_response->_headers['location'])) { + + + $redirect = $this->_response->_headers['location']; + + // Absolute URL + if (preg_match('/^https?:\/\//i', $redirect)) { + $this->_url = &new Net_URL($redirect); + $this->addHeader('Host', $this->_generateHostHeader()); + // Absolute path + } elseif ($redirect{0} == '/') { + $this->_url->path = $redirect; + + // Relative path + } elseif (substr($redirect, 0, 3) == '../' OR substr($redirect, 0, 2) == './') { + if (substr($this->_url->path, -1) == '/') { + $redirect = $this->_url->path . $redirect; + } else { + $redirect = dirname($this->_url->path) . '/' . $redirect; + } + $redirect = Net_URL::resolvePath($redirect); + $this->_url->path = $redirect; + + // Filename, no path + } else { + if (substr($this->_url->path, -1) == '/') { + $redirect = $this->_url->path . $redirect; + } else { + $redirect = dirname($this->_url->path) . '/' . $redirect; + } + $this->_url->path = $redirect; + } + + $this->_redirects++; + return $this->sendRequest($saveBody); + + // Too many redirects + } elseif ($this->_allowRedirects AND $this->_redirects > $this->_maxRedirects) { + return PEAR::raiseError('Too many redirects', HTTP_REQUEST_ERROR_REDIRECTS); + } + + return true; + } + + /** + * Disconnect the socket, if connected. Only useful if using Keep-Alive. + * + * @access public + */ + function disconnect() + { + if (!empty($this->_sock) && !empty($this->_sock->fp)) { + $this->_notify('disconnect'); + $this->_sock->disconnect(); + } + } + + /** + * Returns the response code + * + * @access public + * @return mixed Response code, false if not set + */ + function getResponseCode() + { + return isset($this->_response->_code) ? $this->_response->_code : false; + } + + /** + * Returns either the named header or all if no name given + * + * @access public + * @param string The header name to return, do not set to get all headers + * @return mixed either the value of $headername (false if header is not present) + * or an array of all headers + */ + function getResponseHeader($headername = null) + { + if (!isset($headername)) { + return isset($this->_response->_headers)? $this->_response->_headers: array(); + } else { + $headername = strtolower($headername); + return isset($this->_response->_headers[$headername]) ? $this->_response->_headers[$headername] : false; + } + } + + /** + * Returns the body of the response + * + * @access public + * @return mixed response body, false if not set + */ + function getResponseBody() + { + return isset($this->_response->_body) ? $this->_response->_body : false; + } + + /** + * Returns cookies set in response + * + * @access public + * @return mixed array of response cookies, false if none are present + */ + function getResponseCookies() + { + return isset($this->_response->_cookies) ? $this->_response->_cookies : false; + } + + /** + * Builds the request string + * + * @access private + * @return string The request string + */ + function _buildRequest() + { + $separator = ini_get('arg_separator.output'); + ini_set('arg_separator.output', '&'); + $querystring = ($querystring = $this->_url->getQueryString()) ? '?' . $querystring : ''; + ini_set('arg_separator.output', $separator); + + $host = isset($this->_proxy_host) ? $this->_url->protocol . '://' . $this->_url->host : ''; + $port = (isset($this->_proxy_host) AND $this->_url->port != 80) ? ':' . $this->_url->port : ''; + $path = $this->_url->path . $querystring; + $url = $host . $port . $path; + + if (!strlen($url)) { + $url = '/'; + } + + $request = $this->_method . ' ' . $url . ' HTTP/' . $this->_http . "\r\n"; + + if (in_array($this->_method, $this->_bodyDisallowed) || + (0 == strlen($this->_body) && (HTTP_REQUEST_METHOD_POST != $this->_method || + (empty($this->_postData) && empty($this->_postFiles))))) + { + $this->removeHeader('Content-Type'); + } else { + if (empty($this->_requestHeaders['content-type'])) { + // Add default content-type + $this->addHeader('Content-Type', 'application/x-www-form-urlencoded'); + } elseif ('multipart/form-data' == $this->_requestHeaders['content-type']) { + $boundary = 'HTTP_Request_' . md5(uniqid('request') . microtime()); + $this->addHeader('Content-Type', 'multipart/form-data; boundary=' . $boundary); + } + } + + // Request Headers + if (!empty($this->_requestHeaders)) { + foreach ($this->_requestHeaders as $name => $value) { + $canonicalName = implode('-', array_map('ucfirst', explode('-', $name))); + $request .= $canonicalName . ': ' . $value . "\r\n"; + } + } + + // No post data or wrong method, so simply add a final CRLF + if (in_array($this->_method, $this->_bodyDisallowed) || + (HTTP_REQUEST_METHOD_POST != $this->_method && 0 == strlen($this->_body))) { + + $request .= "\r\n"; + + // Post data if it's an array + } elseif (HTTP_REQUEST_METHOD_POST == $this->_method && + (!empty($this->_postData) || !empty($this->_postFiles))) { + + // "normal" POST request + if (!isset($boundary)) { + $postdata = implode('&', array_map( + create_function('$a', 'return $a[0] . \'=\' . $a[1];'), + $this->_flattenArray('', $this->_postData) + )); + + // multipart request, probably with file uploads + } else { + $postdata = ''; + if (!empty($this->_postData)) { + $flatData = $this->_flattenArray('', $this->_postData); + foreach ($flatData as $item) { + $postdata .= '--' . $boundary . "\r\n"; + $postdata .= 'Content-Disposition: form-data; name="' . $item[0] . '"'; + $postdata .= "\r\n\r\n" . urldecode($item[1]) . "\r\n"; + } + } + foreach ($this->_postFiles as $name => $value) { + if (is_array($value['name'])) { + $varname = $name . ($this->_useBrackets? '[]': ''); + } else { + $varname = $name; + $value['name'] = array($value['name']); + } + foreach ($value['name'] as $key => $filename) { + $fp = fopen($filename, 'r'); + $data = fread($fp, filesize($filename)); + fclose($fp); + $basename = basename($filename); + $type = is_array($value['type'])? @$value['type'][$key]: $value['type']; + + $postdata .= '--' . $boundary . "\r\n"; + $postdata .= 'Content-Disposition: form-data; name="' . $varname . '"; filename="' . $basename . '"'; + $postdata .= "\r\nContent-Type: " . $type; + $postdata .= "\r\n\r\n" . $data . "\r\n"; + } + } + $postdata .= '--' . $boundary . "--\r\n"; + } + $request .= 'Content-Length: ' . + (HTTP_REQUEST_MBSTRING? mb_strlen($postdata, 'iso-8859-1'): strlen($postdata)) . + "\r\n\r\n"; + $request .= $postdata; + + // Explicitly set request body + } elseif (0 < strlen($this->_body)) { + + $request .= 'Content-Length: ' . + (HTTP_REQUEST_MBSTRING? mb_strlen($this->_body, 'iso-8859-1'): strlen($this->_body)) . + "\r\n\r\n"; + $request .= $this->_body; + + // Terminate headers with CRLF on POST request with no body, too + } else { + + $request .= "\r\n"; + } + + return $request; + } + + /** + * Helper function to change the (probably multidimensional) associative array + * into the simple one. + * + * @param string name for item + * @param mixed item's values + * @return array array with the following items: array('item name', 'item value'); + * @access private + */ + function _flattenArray($name, $values) + { + if (!is_array($values)) { + return array(array($name, $values)); + } else { + $ret = array(); + foreach ($values as $k => $v) { + if (empty($name)) { + $newName = $k; + } elseif ($this->_useBrackets) { + $newName = $name . '[' . $k . ']'; + } else { + $newName = $name; + } + $ret = array_merge($ret, $this->_flattenArray($newName, $v)); + } + return $ret; + } + } + + + /** + * Adds a Listener to the list of listeners that are notified of + * the object's events + * + * Events sent by HTTP_Request object + * - 'connect': on connection to server + * - 'sentRequest': after the request was sent + * - 'disconnect': on disconnection from server + * + * Events sent by HTTP_Response object + * - 'gotHeaders': after receiving response headers (headers are passed in $data) + * - 'tick': on receiving a part of response body (the part is passed in $data) + * - 'gzTick': on receiving a gzip-encoded part of response body (ditto) + * - 'gotBody': after receiving the response body (passes the decoded body in $data if it was gzipped) + * + * @param HTTP_Request_Listener listener to attach + * @return boolean whether the listener was successfully attached + * @access public + */ + function attach(&$listener) + { + if (!is_a($listener, 'HTTP_Request_Listener')) { + return false; + } + $this->_listeners[$listener->getId()] =& $listener; + return true; + } + + + /** + * Removes a Listener from the list of listeners + * + * @param HTTP_Request_Listener listener to detach + * @return boolean whether the listener was successfully detached + * @access public + */ + function detach(&$listener) + { + if (!is_a($listener, 'HTTP_Request_Listener') || + !isset($this->_listeners[$listener->getId()])) { + return false; + } + unset($this->_listeners[$listener->getId()]); + return true; + } + + + /** + * Notifies all registered listeners of an event. + * + * @param string Event name + * @param mixed Additional data + * @access private + * @see HTTP_Request::attach() + */ + function _notify($event, $data = null) + { + foreach (array_keys($this->_listeners) as $id) { + $this->_listeners[$id]->update($this, $event, $data); + } + } +} + + +/** + * Response class to complement the Request class + * + * @category HTTP + * @package HTTP_Request + * @author Richard Heyes + * @author Alexey Borzov + * @version Release: 1.4.2 + */ +class HTTP_Response +{ + /** + * Socket object + * @var Net_Socket + */ + var $_sock; + + /** + * Protocol + * @var string + */ + var $_protocol; + + /** + * Return code + * @var string + */ + var $_code; + + /** + * Response headers + * @var array + */ + var $_headers; + + /** + * Cookies set in response + * @var array + */ + var $_cookies; + + /** + * Response body + * @var string + */ + var $_body = ''; + + /** + * Used by _readChunked(): remaining length of the current chunk + * @var string + */ + var $_chunkLength = 0; + + /** + * Attached listeners + * @var array + */ + var $_listeners = array(); + + /** + * Bytes left to read from message-body + * @var null|int + */ + var $_toRead; + + /** + * Constructor + * + * @param Net_Socket socket to read the response from + * @param array listeners attached to request + */ + function HTTP_Response(&$sock, &$listeners) + { + $this->_sock =& $sock; + $this->_listeners =& $listeners; + } + + + /** + * Processes a HTTP response + * + * This extracts response code, headers, cookies and decodes body if it + * was encoded in some way + * + * @access public + * @param bool Whether to store response body in object property, set + * this to false if downloading a LARGE file and using a Listener. + * This is assumed to be true if body is gzip-encoded. + * @param bool Whether the response can actually have a message-body. + * Will be set to false for HEAD requests. + * @throws PEAR_Error + * @return mixed true on success, PEAR_Error in case of malformed response + */ + function process($saveBody = true, $canHaveBody = true) + { + do { + $line = $this->_sock->readLine(); + if (sscanf($line, 'HTTP/%s %s', $http_version, $returncode) != 2) { + return PEAR::raiseError('Malformed response', HTTP_REQUEST_ERROR_RESPONSE); + } else { + $this->_protocol = 'HTTP/' . $http_version; + $this->_code = intval($returncode); + } + while ('' !== ($header = $this->_sock->readLine())) { + $this->_processHeader($header); + } + } while (100 == $this->_code); + + $this->_notify('gotHeaders', $this->_headers); + + // RFC 2616, section 4.4: + // 1. Any response message which "MUST NOT" include a message-body ... + // is always terminated by the first empty line after the header fields + // 3. ... If a message is received with both a + // Transfer-Encoding header field and a Content-Length header field, + // the latter MUST be ignored. + $canHaveBody = $canHaveBody && $this->_code >= 200 && + $this->_code != 204 && $this->_code != 304; + + // If response body is present, read it and decode + $chunked = isset($this->_headers['transfer-encoding']) && ('chunked' == $this->_headers['transfer-encoding']); + $gzipped = isset($this->_headers['content-encoding']) && ('gzip' == $this->_headers['content-encoding']); + $hasBody = false; + if ($canHaveBody && ($chunked || !isset($this->_headers['content-length']) || + 0 != $this->_headers['content-length'])) + { + if ($chunked || !isset($this->_headers['content-length'])) { + $this->_toRead = null; + } else { + $this->_toRead = $this->_headers['content-length']; + } + while (!$this->_sock->eof() && (is_null($this->_toRead) || 0 < $this->_toRead)) { + if ($chunked) { + $data = $this->_readChunked(); + } elseif (is_null($this->_toRead)) { + $data = $this->_sock->read(4096); + } else { + $data = $this->_sock->read(min(4096, $this->_toRead)); + $this->_toRead -= HTTP_REQUEST_MBSTRING? mb_strlen($data, 'iso-8859-1'): strlen($data); + } + if ('' == $data) { + break; + } else { + $hasBody = true; + if ($saveBody || $gzipped) { + $this->_body .= $data; + } + $this->_notify($gzipped? 'gzTick': 'tick', $data); + } + } + } + + if ($hasBody) { + // Uncompress the body if needed + if ($gzipped) { + $body = $this->_decodeGzip($this->_body); + if (PEAR::isError($body)) { + return $body; + } + $this->_body = $body; + $this->_notify('gotBody', $this->_body); + } else { + $this->_notify('gotBody'); + } + } + return true; + } + + + /** + * Processes the response header + * + * @access private + * @param string HTTP header + */ + function _processHeader($header) + { + if (false === strpos($header, ':')) { + return; + } + list($headername, $headervalue) = explode(':', $header, 2); + $headername = strtolower($headername); + $headervalue = ltrim($headervalue); + + if ('set-cookie' != $headername) { + if (isset($this->_headers[$headername])) { + $this->_headers[$headername] .= ',' . $headervalue; + } else { + $this->_headers[$headername] = $headervalue; + } + } else { + $this->_parseCookie($headervalue); + } + } + + + /** + * Parse a Set-Cookie header to fill $_cookies array + * + * @access private + * @param string value of Set-Cookie header + */ + function _parseCookie($headervalue) + { + $cookie = array( + 'expires' => null, + 'domain' => null, + 'path' => null, + 'secure' => false + ); + + // Only a name=value pair + if (!strpos($headervalue, ';')) { + $pos = strpos($headervalue, '='); + $cookie['name'] = trim(substr($headervalue, 0, $pos)); + $cookie['value'] = trim(substr($headervalue, $pos + 1)); + + // Some optional parameters are supplied + } else { + $elements = explode(';', $headervalue); + $pos = strpos($elements[0], '='); + $cookie['name'] = trim(substr($elements[0], 0, $pos)); + $cookie['value'] = trim(substr($elements[0], $pos + 1)); + + for ($i = 1; $i < count($elements); $i++) { + if (false === strpos($elements[$i], '=')) { + $elName = trim($elements[$i]); + $elValue = null; + } else { + list ($elName, $elValue) = array_map('trim', explode('=', $elements[$i])); + } + $elName = strtolower($elName); + if ('secure' == $elName) { + $cookie['secure'] = true; + } elseif ('expires' == $elName) { + $cookie['expires'] = str_replace('"', '', $elValue); + } elseif ('path' == $elName || 'domain' == $elName) { + $cookie[$elName] = urldecode($elValue); + } else { + $cookie[$elName] = $elValue; + } + } + } + $this->_cookies[] = $cookie; + } + + + /** + * Read a part of response body encoded with chunked Transfer-Encoding + * + * @access private + * @return string + */ + function _readChunked() + { + // at start of the next chunk? + if (0 == $this->_chunkLength) { + $line = $this->_sock->readLine(); + if (preg_match('/^([0-9a-f]+)/i', $line, $matches)) { + $this->_chunkLength = hexdec($matches[1]); + // Chunk with zero length indicates the end + if (0 == $this->_chunkLength) { + $this->_sock->readLine(); // make this an eof() + return ''; + } + } else { + return ''; + } + } + $data = $this->_sock->read($this->_chunkLength); + $this->_chunkLength -= HTTP_REQUEST_MBSTRING? mb_strlen($data, 'iso-8859-1'): strlen($data); + if (0 == $this->_chunkLength) { + $this->_sock->readLine(); // Trailing CRLF + } + return $data; + } + + + /** + * Notifies all registered listeners of an event. + * + * @param string Event name + * @param mixed Additional data + * @access private + * @see HTTP_Request::_notify() + */ + function _notify($event, $data = null) + { + foreach (array_keys($this->_listeners) as $id) { + $this->_listeners[$id]->update($this, $event, $data); + } + } + + + /** + * Decodes the message-body encoded by gzip + * + * The real decoding work is done by gzinflate() built-in function, this + * method only parses the header and checks data for compliance with + * RFC 1952 + * + * @access private + * @param string gzip-encoded data + * @return string decoded data + */ + function _decodeGzip($data) + { + if (HTTP_REQUEST_MBSTRING) { + $oldEncoding = mb_internal_encoding(); + mb_internal_encoding('iso-8859-1'); + } + $length = strlen($data); + // If it doesn't look like gzip-encoded data, don't bother + if (18 > $length || strcmp(substr($data, 0, 2), "\x1f\x8b")) { + return $data; + } + $method = ord(substr($data, 2, 1)); + if (8 != $method) { + return PEAR::raiseError('_decodeGzip(): unknown compression method', HTTP_REQUEST_ERROR_GZIP_METHOD); + } + $flags = ord(substr($data, 3, 1)); + if ($flags & 224) { + return PEAR::raiseError('_decodeGzip(): reserved bits are set', HTTP_REQUEST_ERROR_GZIP_DATA); + } + + // header is 10 bytes minimum. may be longer, though. + $headerLength = 10; + // extra fields, need to skip 'em + if ($flags & 4) { + if ($length - $headerLength - 2 < 8) { + return PEAR::raiseError('_decodeGzip(): data too short', HTTP_REQUEST_ERROR_GZIP_DATA); + } + $extraLength = unpack('v', substr($data, 10, 2)); + if ($length - $headerLength - 2 - $extraLength[1] < 8) { + return PEAR::raiseError('_decodeGzip(): data too short', HTTP_REQUEST_ERROR_GZIP_DATA); + } + $headerLength += $extraLength[1] + 2; + } + // file name, need to skip that + if ($flags & 8) { + if ($length - $headerLength - 1 < 8) { + return PEAR::raiseError('_decodeGzip(): data too short', HTTP_REQUEST_ERROR_GZIP_DATA); + } + $filenameLength = strpos(substr($data, $headerLength), chr(0)); + if (false === $filenameLength || $length - $headerLength - $filenameLength - 1 < 8) { + return PEAR::raiseError('_decodeGzip(): data too short', HTTP_REQUEST_ERROR_GZIP_DATA); + } + $headerLength += $filenameLength + 1; + } + // comment, need to skip that also + if ($flags & 16) { + if ($length - $headerLength - 1 < 8) { + return PEAR::raiseError('_decodeGzip(): data too short', HTTP_REQUEST_ERROR_GZIP_DATA); + } + $commentLength = strpos(substr($data, $headerLength), chr(0)); + if (false === $commentLength || $length - $headerLength - $commentLength - 1 < 8) { + return PEAR::raiseError('_decodeGzip(): data too short', HTTP_REQUEST_ERROR_GZIP_DATA); + } + $headerLength += $commentLength + 1; + } + // have a CRC for header. let's check + if ($flags & 1) { + if ($length - $headerLength - 2 < 8) { + return PEAR::raiseError('_decodeGzip(): data too short', HTTP_REQUEST_ERROR_GZIP_DATA); + } + $crcReal = 0xffff & crc32(substr($data, 0, $headerLength)); + $crcStored = unpack('v', substr($data, $headerLength, 2)); + if ($crcReal != $crcStored[1]) { + return PEAR::raiseError('_decodeGzip(): header CRC check failed', HTTP_REQUEST_ERROR_GZIP_CRC); + } + $headerLength += 2; + } + // unpacked data CRC and size at the end of encoded data + $tmp = unpack('V2', substr($data, -8)); + $dataCrc = $tmp[1]; + $dataSize = $tmp[2]; + + // finally, call the gzinflate() function + $unpacked = @gzinflate(substr($data, $headerLength, -8), $dataSize); + if (false === $unpacked) { + return PEAR::raiseError('_decodeGzip(): gzinflate() call failed', HTTP_REQUEST_ERROR_GZIP_READ); + } elseif ($dataSize != strlen($unpacked)) { + return PEAR::raiseError('_decodeGzip(): data size check failed', HTTP_REQUEST_ERROR_GZIP_READ); + } elseif ((0xffffffff & $dataCrc) != (0xffffffff & crc32($unpacked))) { + return PEAR::raiseError('_decodeGzip(): data CRC check failed', HTTP_REQUEST_ERROR_GZIP_CRC); + } + if (HTTP_REQUEST_MBSTRING) { + mb_internal_encoding($oldEncoding); + } + return $unpacked; + } +} // End class HTTP_Response +?> diff --git a/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/HTTP/Request/Listener.php b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/HTTP/Request/Listener.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/HTTP/Request/Listener.php @@ -0,0 +1,106 @@ + + * @copyright 2002-2007 Richard Heyes + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version CVS: $Id: Listener.php 127 2008-01-17 20:21:37Z dcoulter $ + * @link http://pear.php.net/package/HTTP_Request/ + */ + +/** + * Listener for HTTP_Request and HTTP_Response objects + * + * This class implements the Observer part of a Subject-Observer + * design pattern. + * + * @category HTTP + * @package HTTP_Request + * @author Alexey Borzov + * @version Release: 1.4.2 + */ +class HTTP_Request_Listener +{ + /** + * A listener's identifier + * @var string + */ + var $_id; + + /** + * Constructor, sets the object's identifier + * + * @access public + */ + function HTTP_Request_Listener() + { + $this->_id = md5(uniqid('http_request_', 1)); + } + + + /** + * Returns the listener's identifier + * + * @access public + * @return string + */ + function getId() + { + return $this->_id; + } + + + /** + * This method is called when Listener is notified of an event + * + * @access public + * @param object an object the listener is attached to + * @param string Event name + * @param mixed Additional data + * @abstract + */ + function update(&$subject, $event, $data = null) + { + echo "Notified of event: '$event'\n"; + if (null !== $data) { + echo "Additional data: "; + var_dump($data); + } + } +} +?> diff --git a/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/HTTP/Request/index.html b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/HTTP/Request/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/HTTP/Request/index.html @@ -0,0 +1,1 @@ + \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/HTTP/index.html b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/HTTP/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/HTTP/index.html @@ -0,0 +1,1 @@ + \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/Net/Socket.php b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/Net/Socket.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/Net/Socket.php @@ -0,0 +1,528 @@ + | +// | Chuck Hagenbuch | +// +----------------------------------------------------------------------+ +// +// $Id: Socket.php 32 2005-08-01 06:21:02Z dancoulter $ + +require_once 'PEAR.php'; + +define('NET_SOCKET_READ', 1); +define('NET_SOCKET_WRITE', 2); +define('NET_SOCKET_ERROR', 3); + +/** + * Generalized Socket class. + * + * @version 1.1 + * @author Stig Bakken + * @author Chuck Hagenbuch + */ +class Net_Socket extends PEAR { + + /** + * Socket file pointer. + * @var resource $fp + */ + var $fp = null; + + /** + * Whether the socket is blocking. Defaults to true. + * @var boolean $blocking + */ + var $blocking = true; + + /** + * Whether the socket is persistent. Defaults to false. + * @var boolean $persistent + */ + var $persistent = false; + + /** + * The IP address to connect to. + * @var string $addr + */ + var $addr = ''; + + /** + * The port number to connect to. + * @var integer $port + */ + var $port = 0; + + /** + * Number of seconds to wait on socket connections before assuming + * there's no more data. Defaults to no timeout. + * @var integer $timeout + */ + var $timeout = false; + + /** + * Number of bytes to read at a time in readLine() and + * readAll(). Defaults to 2048. + * @var integer $lineLength + */ + var $lineLength = 2048; + + /** + * Connect to the specified port. If called when the socket is + * already connected, it disconnects and connects again. + * + * @param string $addr IP address or host name. + * @param integer $port TCP port number. + * @param boolean $persistent (optional) Whether the connection is + * persistent (kept open between requests + * by the web server). + * @param integer $timeout (optional) How long to wait for data. + * @param array $options See options for stream_context_create. + * + * @access public + * + * @return boolean | PEAR_Error True on success or a PEAR_Error on failure. + */ + function connect($addr, $port = 0, $persistent = null, $timeout = null, $options = null) + { + if (is_resource($this->fp)) { + @fclose($this->fp); + $this->fp = null; + } + + if (!$addr) { + return $this->raiseError('$addr cannot be empty'); + } elseif (strspn($addr, '.0123456789') == strlen($addr) || + strstr($addr, '/') !== false) { + $this->addr = $addr; + } else { + $this->addr = @gethostbyname($addr); + } + + $this->port = $port % 65536; + + if ($persistent !== null) { + $this->persistent = $persistent; + } + + if ($timeout !== null) { + $this->timeout = $timeout; + } + + $openfunc = $this->persistent ? 'pfsockopen' : 'fsockopen'; + $errno = 0; + $errstr = ''; + if ($options && function_exists('stream_context_create')) { + if ($this->timeout) { + $timeout = $this->timeout; + } else { + $timeout = 0; + } + $context = stream_context_create($options); + $fp = @$openfunc($this->addr, $this->port, $errno, $errstr, $timeout, $context); + } else { + if ($this->timeout) { + $fp = @$openfunc($this->addr, $this->port, $errno, $errstr, $this->timeout); + } else { + $fp = @$openfunc($this->addr, $this->port, $errno, $errstr); + } + } + + if (!$fp) { + return $this->raiseError($errstr, $errno); + } + + $this->fp = $fp; + + return $this->setBlocking($this->blocking); + } + + /** + * Disconnects from the peer, closes the socket. + * + * @access public + * @return mixed true on success or an error object otherwise + */ + function disconnect() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + @fclose($this->fp); + $this->fp = null; + return true; + } + + /** + * Find out if the socket is in blocking mode. + * + * @access public + * @return boolean The current blocking mode. + */ + function isBlocking() + { + return $this->blocking; + } + + /** + * Sets whether the socket connection should be blocking or + * not. A read call to a non-blocking socket will return immediately + * if there is no data available, whereas it will block until there + * is data for blocking sockets. + * + * @param boolean $mode True for blocking sockets, false for nonblocking. + * @access public + * @return mixed true on success or an error object otherwise + */ + function setBlocking($mode) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $this->blocking = $mode; + socket_set_blocking($this->fp, $this->blocking); + return true; + } + + /** + * Sets the timeout value on socket descriptor, + * expressed in the sum of seconds and microseconds + * + * @param integer $seconds Seconds. + * @param integer $microseconds Microseconds. + * @access public + * @return mixed true on success or an error object otherwise + */ + function setTimeout($seconds, $microseconds) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return socket_set_timeout($this->fp, $seconds, $microseconds); + } + + /** + * Returns information about an existing socket resource. + * Currently returns four entries in the result array: + * + *

+ * timed_out (bool) - The socket timed out waiting for data
+ * blocked (bool) - The socket was blocked
+ * eof (bool) - Indicates EOF event
+ * unread_bytes (int) - Number of bytes left in the socket buffer
+ *

+ * + * @access public + * @return mixed Array containing information about existing socket resource or an error object otherwise + */ + function getStatus() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return socket_get_status($this->fp); + } + + /** + * Get a specified line of data + * + * @access public + * @return $size bytes of data from the socket, or a PEAR_Error if + * not connected. + */ + function gets($size) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return @fgets($this->fp, $size); + } + + /** + * Read a specified amount of data. This is guaranteed to return, + * and has the added benefit of getting everything in one fread() + * chunk; if you know the size of the data you're getting + * beforehand, this is definitely the way to go. + * + * @param integer $size The number of bytes to read from the socket. + * @access public + * @return $size bytes of data from the socket, or a PEAR_Error if + * not connected. + */ + function read($size) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return @fread($this->fp, $size); + } + + /** + * Write a specified amount of data. + * + * @param string $data Data to write. + * @param integer $blocksize Amount of data to write at once. + * NULL means all at once. + * + * @access public + * @return mixed true on success or an error object otherwise + */ + function write($data, $blocksize = null) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + if (is_null($blocksize) && !OS_WINDOWS) { + return fwrite($this->fp, $data); + } else { + if (is_null($blocksize)) { + $blocksize = 1024; + } + + $pos = 0; + $size = strlen($data); + while ($pos < $size) { + $written = @fwrite($this->fp, substr($data, $pos, $blocksize)); + if ($written === false) { + return false; + } + $pos += $written; + } + + return $pos; + } + } + + /** + * Write a line of data to the socket, followed by a trailing "\r\n". + * + * @access public + * @return mixed fputs result, or an error + */ + function writeLine($data) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return fwrite($this->fp, $data . "\r\n"); + } + + /** + * Tests for end-of-file on a socket descriptor. + * + * @access public + * @return bool + */ + function eof() + { + return (is_resource($this->fp) && feof($this->fp)); + } + + /** + * Reads a byte of data + * + * @access public + * @return 1 byte of data from the socket, or a PEAR_Error if + * not connected. + */ + function readByte() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return ord(@fread($this->fp, 1)); + } + + /** + * Reads a word of data + * + * @access public + * @return 1 word of data from the socket, or a PEAR_Error if + * not connected. + */ + function readWord() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $buf = @fread($this->fp, 2); + return (ord($buf[0]) + (ord($buf[1]) << 8)); + } + + /** + * Reads an int of data + * + * @access public + * @return integer 1 int of data from the socket, or a PEAR_Error if + * not connected. + */ + function readInt() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $buf = @fread($this->fp, 4); + return (ord($buf[0]) + (ord($buf[1]) << 8) + + (ord($buf[2]) << 16) + (ord($buf[3]) << 24)); + } + + /** + * Reads a zero-terminated string of data + * + * @access public + * @return string, or a PEAR_Error if + * not connected. + */ + function readString() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $string = ''; + while (($char = @fread($this->fp, 1)) != "\x00") { + $string .= $char; + } + return $string; + } + + /** + * Reads an IP Address and returns it in a dot formated string + * + * @access public + * @return Dot formated string, or a PEAR_Error if + * not connected. + */ + function readIPAddress() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $buf = @fread($this->fp, 4); + return sprintf("%s.%s.%s.%s", ord($buf[0]), ord($buf[1]), + ord($buf[2]), ord($buf[3])); + } + + /** + * Read until either the end of the socket or a newline, whichever + * comes first. Strips the trailing newline from the returned data. + * + * @access public + * @return All available data up to a newline, without that + * newline, or until the end of the socket, or a PEAR_Error if + * not connected. + */ + function readLine() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $line = ''; + $timeout = time() + $this->timeout; + while (!feof($this->fp) && (!$this->timeout || time() < $timeout)) { + $line .= @fgets($this->fp, $this->lineLength); + if (substr($line, -1) == "\n") { + return rtrim($line, "\r\n"); + } + } + return $line; + } + + /** + * Read until the socket closes, or until there is no more data in + * the inner PHP buffer. If the inner buffer is empty, in blocking + * mode we wait for at least 1 byte of data. Therefore, in + * blocking mode, if there is no data at all to be read, this + * function will never exit (unless the socket is closed on the + * remote end). + * + * @access public + * + * @return string All data until the socket closes, or a PEAR_Error if + * not connected. + */ + function readAll() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $data = ''; + while (!feof($this->fp)) { + $data .= @fread($this->fp, $this->lineLength); + } + return $data; + } + + /** + * Runs the equivalent of the select() system call on the socket + * with a timeout specified by tv_sec and tv_usec. + * + * @param integer $state Which of read/write/error to check for. + * @param integer $tv_sec Number of seconds for timeout. + * @param integer $tv_usec Number of microseconds for timeout. + * + * @access public + * @return False if select fails, integer describing which of read/write/error + * are ready, or PEAR_Error if not connected. + */ + function select($state, $tv_sec, $tv_usec = 0) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $read = null; + $write = null; + $except = null; + if ($state & NET_SOCKET_READ) { + $read[] = $this->fp; + } + if ($state & NET_SOCKET_WRITE) { + $write[] = $this->fp; + } + if ($state & NET_SOCKET_ERROR) { + $except[] = $this->fp; + } + if (false === ($sr = stream_select($read, $write, $except, $tv_sec, $tv_usec))) { + return false; + } + + $result = 0; + if (count($read)) { + $result |= NET_SOCKET_READ; + } + if (count($write)) { + $result |= NET_SOCKET_WRITE; + } + if (count($except)) { + $result |= NET_SOCKET_ERROR; + } + return $result; + } + +} diff --git a/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/Net/URL.php b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/Net/URL.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/Net/URL.php @@ -0,0 +1,410 @@ + | +// +-----------------------------------------------------------------------+ +// +// $Id: URL.php 32 2005-08-01 06:21:02Z dancoulter $ +// +// Net_URL Class + +class Net_URL +{ + /** + * Full url + * @var string + */ + var $url; + + /** + * Protocol + * @var string + */ + var $protocol; + + /** + * Username + * @var string + */ + var $username; + + /** + * Password + * @var string + */ + var $password; + + /** + * Host + * @var string + */ + var $host; + + /** + * Port + * @var integer + */ + var $port; + + /** + * Path + * @var string + */ + var $path; + + /** + * Query string + * @var array + */ + var $querystring; + + /** + * Anchor + * @var string + */ + var $anchor; + + /** + * Whether to use [] + * @var bool + */ + var $useBrackets; + + /** + * PHP4 Constructor + * + * @see __construct() + */ + function Net_URL($url = null, $useBrackets = true) + { + $this->__construct($url, $useBrackets); + } + + /** + * PHP5 Constructor + * + * Parses the given url and stores the various parts + * Defaults are used in certain cases + * + * @param string $url Optional URL + * @param bool $useBrackets Whether to use square brackets when + * multiple querystrings with the same name + * exist + */ + function __construct($url = null, $useBrackets = true) + { + $HTTP_SERVER_VARS = !empty($_SERVER) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS']; + + $this->useBrackets = $useBrackets; + $this->url = $url; + $this->user = ''; + $this->pass = ''; + $this->host = ''; + $this->port = 80; + $this->path = ''; + $this->querystring = array(); + $this->anchor = ''; + + // Only use defaults if not an absolute URL given + if (!preg_match('/^[a-z0-9]+:\/\//i', $url)) { + + $this->protocol = (@$HTTP_SERVER_VARS['HTTPS'] == 'on' ? 'https' : 'http'); + + /** + * Figure out host/port + */ + if (!empty($HTTP_SERVER_VARS['HTTP_HOST']) AND preg_match('/^(.*)(:([0-9]+))?$/U', $HTTP_SERVER_VARS['HTTP_HOST'], $matches)) { + $host = $matches[1]; + if (!empty($matches[3])) { + $port = $matches[3]; + } else { + $port = $this->getStandardPort($this->protocol); + } + } + + $this->user = ''; + $this->pass = ''; + $this->host = !empty($host) ? $host : (isset($HTTP_SERVER_VARS['SERVER_NAME']) ? $HTTP_SERVER_VARS['SERVER_NAME'] : 'localhost'); + $this->port = !empty($port) ? $port : (isset($HTTP_SERVER_VARS['SERVER_PORT']) ? $HTTP_SERVER_VARS['SERVER_PORT'] : $this->getStandardPort($this->protocol)); + $this->path = !empty($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : '/'; + $this->querystring = isset($HTTP_SERVER_VARS['QUERY_STRING']) ? $this->_parseRawQuerystring($HTTP_SERVER_VARS['QUERY_STRING']) : null; + $this->anchor = ''; + } + + // Parse the url and store the various parts + if (!empty($url)) { + $urlinfo = parse_url($url); + + // Default querystring + $this->querystring = array(); + + foreach ($urlinfo as $key => $value) { + switch ($key) { + case 'scheme': + $this->protocol = $value; + $this->port = $this->getStandardPort($value); + break; + + case 'user': + case 'pass': + case 'host': + case 'port': + $this->$key = $value; + break; + + case 'path': + if ($value{0} == '/') { + $this->path = $value; + } else { + $path = dirname($this->path) == DIRECTORY_SEPARATOR ? '' : dirname($this->path); + $this->path = sprintf('%s/%s', $path, $value); + } + break; + + case 'query': + $this->querystring = $this->_parseRawQueryString($value); + break; + + case 'fragment': + $this->anchor = $value; + break; + } + } + } + } + + /** + * Returns full url + * + * @return string Full url + * @access public + */ + function getURL() + { + $querystring = $this->getQueryString(); + + $this->url = $this->protocol . '://' + . $this->user . (!empty($this->pass) ? ':' : '') + . $this->pass . (!empty($this->user) ? '@' : '') + . $this->host . ($this->port == $this->getStandardPort($this->protocol) ? '' : ':' . $this->port) + . $this->path + . (!empty($querystring) ? '?' . $querystring : '') + . (!empty($this->anchor) ? '#' . $this->anchor : ''); + + return $this->url; + } + + /** + * Adds a querystring item + * + * @param string $name Name of item + * @param string $value Value of item + * @param bool $preencoded Whether value is urlencoded or not, default = not + * @access public + */ + function addQueryString($name, $value, $preencoded = false) + { + if ($preencoded) { + $this->querystring[$name] = $value; + } else { + $this->querystring[$name] = is_array($value) ? array_map('rawurlencode', $value): rawurlencode($value); + } + } + + /** + * Removes a querystring item + * + * @param string $name Name of item + * @access public + */ + function removeQueryString($name) + { + if (isset($this->querystring[$name])) { + unset($this->querystring[$name]); + } + } + + /** + * Sets the querystring to literally what you supply + * + * @param string $querystring The querystring data. Should be of the format foo=bar&x=y etc + * @access public + */ + function addRawQueryString($querystring) + { + $this->querystring = $this->_parseRawQueryString($querystring); + } + + /** + * Returns flat querystring + * + * @return string Querystring + * @access public + */ + function getQueryString() + { + if (!empty($this->querystring)) { + foreach ($this->querystring as $name => $value) { + if (is_array($value)) { + foreach ($value as $k => $v) { + $querystring[] = $this->useBrackets ? sprintf('%s[%s]=%s', $name, $k, $v) : ($name . '=' . $v); + } + } elseif (!is_null($value)) { + $querystring[] = $name . '=' . $value; + } else { + $querystring[] = $name; + } + } + $querystring = implode(ini_get('arg_separator.output'), $querystring); + } else { + $querystring = ''; + } + + return $querystring; + } + + /** + * Parses raw querystring and returns an array of it + * + * @param string $querystring The querystring to parse + * @return array An array of the querystring data + * @access private + */ + function _parseRawQuerystring($querystring) + { + $parts = preg_split('/[' . preg_quote(ini_get('arg_separator.input'), '/') . ']/', $querystring, -1, PREG_SPLIT_NO_EMPTY); + $return = array(); + + foreach ($parts as $part) { + if (strpos($part, '=') !== false) { + $value = substr($part, strpos($part, '=') + 1); + $key = substr($part, 0, strpos($part, '=')); + } else { + $value = null; + $key = $part; + } + if (substr($key, -2) == '[]') { + $key = substr($key, 0, -2); + if (@!is_array($return[$key])) { + $return[$key] = array(); + $return[$key][] = $value; + } else { + $return[$key][] = $value; + } + } elseif (!$this->useBrackets AND !empty($return[$key])) { + $return[$key] = (array)$return[$key]; + $return[$key][] = $value; + } else { + $return[$key] = $value; + } + } + + return $return; + } + + /** + * Resolves //, ../ and ./ from a path and returns + * the result. Eg: + * + * /foo/bar/../boo.php => /foo/boo.php + * /foo/bar/../../boo.php => /boo.php + * /foo/bar/.././/boo.php => /foo/boo.php + * + * This method can also be called statically. + * + * @param string $url URL path to resolve + * @return string The result + */ + function resolvePath($path) + { + $path = explode('/', str_replace('//', '/', $path)); + + for ($i=0; $i 1 OR ($i == 1 AND $path[0] != '') ) ) { + unset($path[$i]); + unset($path[$i-1]); + $path = array_values($path); + $i -= 2; + + } elseif ($path[$i] == '..' AND $i == 1 AND $path[0] == '') { + unset($path[$i]); + $path = array_values($path); + $i--; + + } else { + continue; + } + } + + return implode('/', $path); + } + + /** + * Returns the standard port number for a protocol + * + * @param string $scheme The protocol to lookup + * @return integer Port number or NULL if no scheme matches + * + * @author Philippe Jausions + */ + function getStandardPort($scheme) + { + switch (strtolower($scheme)) { + case 'http': return 80; + case 'https': return 443; + case 'ftp': return 21; + case 'imap': return 143; + case 'imaps': return 993; + case 'pop3': return 110; + case 'pop3s': return 995; + default: return null; + } + } + + /** + * Forces the URL to a particular protocol + * + * @param string $protocol Protocol to force the URL to + * @param integer $port Optional port (standard port is used by default) + */ + function setProtocol($protocol, $port = null) + { + $this->protocol = $protocol; + $this->port = is_null($port) ? $this->getStandardPort() : $port; + } + +} +?> diff --git a/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/Net/index.html b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/Net/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/Net/index.html @@ -0,0 +1,1 @@ + \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/PEAR.php b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/PEAR.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/PEAR.php @@ -0,0 +1,1108 @@ + + * @author Stig Bakken + * @author Tomas V.V.Cox + * @author Greg Beaver + * @copyright 1997-2006 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: PEAR.php 127 2008-01-17 20:21:37Z dcoulter $ + * @link http://pear.php.net/package/PEAR + * @since File available since Release 0.1 + */ + +/**#@+ + * ERROR constants + */ +define('PEAR_ERROR_RETURN', 1); +define('PEAR_ERROR_PRINT', 2); +define('PEAR_ERROR_TRIGGER', 4); +define('PEAR_ERROR_DIE', 8); +define('PEAR_ERROR_CALLBACK', 16); +/** + * WARNING: obsolete + * @deprecated + */ +define('PEAR_ERROR_EXCEPTION', 32); +/**#@-*/ +define('PEAR_ZE2', (function_exists('version_compare') && + version_compare(zend_version(), "2-dev", "ge"))); + +if (substr(PHP_OS, 0, 3) == 'WIN') { + define('OS_WINDOWS', true); + define('OS_UNIX', false); + define('PEAR_OS', 'Windows'); +} else { + define('OS_WINDOWS', false); + define('OS_UNIX', true); + define('PEAR_OS', 'Unix'); // blatant assumption +} + +// instant backwards compatibility +if (!defined('PATH_SEPARATOR')) { + if (OS_WINDOWS) { + define('PATH_SEPARATOR', ';'); + } else { + define('PATH_SEPARATOR', ':'); + } +} + +$GLOBALS['_PEAR_default_error_mode'] = PEAR_ERROR_RETURN; +$GLOBALS['_PEAR_default_error_options'] = E_USER_NOTICE; +$GLOBALS['_PEAR_destructor_object_list'] = array(); +$GLOBALS['_PEAR_shutdown_funcs'] = array(); +$GLOBALS['_PEAR_error_handler_stack'] = array(); + +@ini_set('track_errors', true); + +/** + * Base class for other PEAR classes. Provides rudimentary + * emulation of destructors. + * + * If you want a destructor in your class, inherit PEAR and make a + * destructor method called _yourclassname (same name as the + * constructor, but with a "_" prefix). Also, in your constructor you + * have to call the PEAR constructor: $this->PEAR();. + * The destructor method will be called without parameters. Note that + * at in some SAPI implementations (such as Apache), any output during + * the request shutdown (in which destructors are called) seems to be + * discarded. If you need to get any debug information from your + * destructor, use error_log(), syslog() or something similar. + * + * IMPORTANT! To use the emulated destructors you need to create the + * objects by reference: $obj =& new PEAR_child; + * + * @category pear + * @package PEAR + * @author Stig Bakken + * @author Tomas V.V. Cox + * @author Greg Beaver + * @copyright 1997-2006 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.6.2 + * @link http://pear.php.net/package/PEAR + * @see PEAR_Error + * @since Class available since PHP 4.0.2 + * @link http://pear.php.net/manual/en/core.pear.php#core.pear.pear + */ +class PEAR +{ + // {{{ properties + + /** + * Whether to enable internal debug messages. + * + * @var bool + * @access private + */ + var $_debug = false; + + /** + * Default error mode for this object. + * + * @var int + * @access private + */ + var $_default_error_mode = null; + + /** + * Default error options used for this object when error mode + * is PEAR_ERROR_TRIGGER. + * + * @var int + * @access private + */ + var $_default_error_options = null; + + /** + * Default error handler (callback) for this object, if error mode is + * PEAR_ERROR_CALLBACK. + * + * @var string + * @access private + */ + var $_default_error_handler = ''; + + /** + * Which class to use for error objects. + * + * @var string + * @access private + */ + var $_error_class = 'PEAR_Error'; + + /** + * An array of expected errors. + * + * @var array + * @access private + */ + var $_expected_errors = array(); + + // }}} + + // {{{ constructor + + /** + * Constructor. Registers this object in + * $_PEAR_destructor_object_list for destructor emulation if a + * destructor object exists. + * + * @param string $error_class (optional) which class to use for + * error objects, defaults to PEAR_Error. + * @access public + * @return void + */ + function PEAR($error_class = null) + { + $classname = strtolower(get_class($this)); + if ($this->_debug) { + print "PEAR constructor called, class=$classname\n"; + } + if ($error_class !== null) { + $this->_error_class = $error_class; + } + while ($classname && strcasecmp($classname, "pear")) { + $destructor = "_$classname"; + if (method_exists($this, $destructor)) { + global $_PEAR_destructor_object_list; + $_PEAR_destructor_object_list[] = &$this; + if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) { + register_shutdown_function("_PEAR_call_destructors"); + $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true; + } + break; + } else { + $classname = get_parent_class($classname); + } + } + } + + // }}} + // {{{ destructor + + /** + * Destructor (the emulated type of...). Does nothing right now, + * but is included for forward compatibility, so subclass + * destructors should always call it. + * + * See the note in the class desciption about output from + * destructors. + * + * @access public + * @return void + */ + function _PEAR() { + if ($this->_debug) { + printf("PEAR destructor called, class=%s\n", strtolower(get_class($this))); + } + } + + // }}} + // {{{ getStaticProperty() + + /** + * If you have a class that's mostly/entirely static, and you need static + * properties, you can use this method to simulate them. Eg. in your method(s) + * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar'); + * You MUST use a reference, or they will not persist! + * + * @access public + * @param string $class The calling classname, to prevent clashes + * @param string $var The variable to retrieve. + * @return mixed A reference to the variable. If not set it will be + * auto initialised to NULL. + */ + function &getStaticProperty($class, $var) + { + static $properties; + if (!isset($properties[$class])) { + $properties[$class] = array(); + } + if (!array_key_exists($var, $properties[$class])) { + $properties[$class][$var] = null; + } + return $properties[$class][$var]; + } + + // }}} + // {{{ registerShutdownFunc() + + /** + * Use this function to register a shutdown method for static + * classes. + * + * @access public + * @param mixed $func The function name (or array of class/method) to call + * @param mixed $args The arguments to pass to the function + * @return void + */ + function registerShutdownFunc($func, $args = array()) + { + // if we are called statically, there is a potential + // that no shutdown func is registered. Bug #6445 + if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) { + register_shutdown_function("_PEAR_call_destructors"); + $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true; + } + $GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args); + } + + // }}} + // {{{ isError() + + /** + * Tell whether a value is a PEAR error. + * + * @param mixed $data the value to test + * @param int $code if $data is an error object, return true + * only if $code is a string and + * $obj->getMessage() == $code or + * $code is an integer and $obj->getCode() == $code + * @access public + * @return bool true if parameter is an error + */ + function isError($data, $code = null) + { + if (is_a($data, 'PEAR_Error')) { + if (is_null($code)) { + return true; + } elseif (is_string($code)) { + return $data->getMessage() == $code; + } else { + return $data->getCode() == $code; + } + } + return false; + } + + // }}} + // {{{ setErrorHandling() + + /** + * Sets how errors generated by this object should be handled. + * Can be invoked both in objects and statically. If called + * statically, setErrorHandling sets the default behaviour for all + * PEAR objects. If called in an object, setErrorHandling sets + * the default behaviour for that object. + * + * @param int $mode + * One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, + * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, + * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION. + * + * @param mixed $options + * When $mode is PEAR_ERROR_TRIGGER, this is the error level (one + * of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). + * + * When $mode is PEAR_ERROR_CALLBACK, this parameter is expected + * to be the callback function or method. A callback + * function is a string with the name of the function, a + * callback method is an array of two elements: the element + * at index 0 is the object, and the element at index 1 is + * the name of the method to call in the object. + * + * When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is + * a printf format string used when printing the error + * message. + * + * @access public + * @return void + * @see PEAR_ERROR_RETURN + * @see PEAR_ERROR_PRINT + * @see PEAR_ERROR_TRIGGER + * @see PEAR_ERROR_DIE + * @see PEAR_ERROR_CALLBACK + * @see PEAR_ERROR_EXCEPTION + * + * @since PHP 4.0.5 + */ + + function setErrorHandling($mode = null, $options = null) + { + if (isset($this) && is_a($this, 'PEAR')) { + $setmode = &$this->_default_error_mode; + $setoptions = &$this->_default_error_options; + } else { + $setmode = &$GLOBALS['_PEAR_default_error_mode']; + $setoptions = &$GLOBALS['_PEAR_default_error_options']; + } + + switch ($mode) { + case PEAR_ERROR_EXCEPTION: + case PEAR_ERROR_RETURN: + case PEAR_ERROR_PRINT: + case PEAR_ERROR_TRIGGER: + case PEAR_ERROR_DIE: + case null: + $setmode = $mode; + $setoptions = $options; + break; + + case PEAR_ERROR_CALLBACK: + $setmode = $mode; + // class/object method callback + if (is_callable($options)) { + $setoptions = $options; + } else { + trigger_error("invalid error callback", E_USER_WARNING); + } + break; + + default: + trigger_error("invalid error mode", E_USER_WARNING); + break; + } + } + + // }}} + // {{{ expectError() + + /** + * This method is used to tell which errors you expect to get. + * Expected errors are always returned with error mode + * PEAR_ERROR_RETURN. Expected error codes are stored in a stack, + * and this method pushes a new element onto it. The list of + * expected errors are in effect until they are popped off the + * stack with the popExpect() method. + * + * Note that this method can not be called statically + * + * @param mixed $code a single error code or an array of error codes to expect + * + * @return int the new depth of the "expected errors" stack + * @access public + */ + function expectError($code = '*') + { + if (is_array($code)) { + array_push($this->_expected_errors, $code); + } else { + array_push($this->_expected_errors, array($code)); + } + return sizeof($this->_expected_errors); + } + + // }}} + // {{{ popExpect() + + /** + * This method pops one element off the expected error codes + * stack. + * + * @return array the list of error codes that were popped + */ + function popExpect() + { + return array_pop($this->_expected_errors); + } + + // }}} + // {{{ _checkDelExpect() + + /** + * This method checks unsets an error code if available + * + * @param mixed error code + * @return bool true if the error code was unset, false otherwise + * @access private + * @since PHP 4.3.0 + */ + function _checkDelExpect($error_code) + { + $deleted = false; + + foreach ($this->_expected_errors AS $key => $error_array) { + if (in_array($error_code, $error_array)) { + unset($this->_expected_errors[$key][array_search($error_code, $error_array)]); + $deleted = true; + } + + // clean up empty arrays + if (0 == count($this->_expected_errors[$key])) { + unset($this->_expected_errors[$key]); + } + } + return $deleted; + } + + // }}} + // {{{ delExpect() + + /** + * This method deletes all occurences of the specified element from + * the expected error codes stack. + * + * @param mixed $error_code error code that should be deleted + * @return mixed list of error codes that were deleted or error + * @access public + * @since PHP 4.3.0 + */ + function delExpect($error_code) + { + $deleted = false; + + if ((is_array($error_code) && (0 != count($error_code)))) { + // $error_code is a non-empty array here; + // we walk through it trying to unset all + // values + foreach($error_code as $key => $error) { + if ($this->_checkDelExpect($error)) { + $deleted = true; + } else { + $deleted = false; + } + } + return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME + } elseif (!empty($error_code)) { + // $error_code comes alone, trying to unset it + if ($this->_checkDelExpect($error_code)) { + return true; + } else { + return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME + } + } else { + // $error_code is empty + return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME + } + } + + // }}} + // {{{ raiseError() + + /** + * This method is a wrapper that returns an instance of the + * configured error class with this object's default error + * handling applied. If the $mode and $options parameters are not + * specified, the object's defaults are used. + * + * @param mixed $message a text error message or a PEAR error object + * + * @param int $code a numeric error code (it is up to your class + * to define these if you want to use codes) + * + * @param int $mode One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, + * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, + * PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION. + * + * @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter + * specifies the PHP-internal error level (one of + * E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). + * If $mode is PEAR_ERROR_CALLBACK, this + * parameter specifies the callback function or + * method. In other error modes this parameter + * is ignored. + * + * @param string $userinfo If you need to pass along for example debug + * information, this parameter is meant for that. + * + * @param string $error_class The returned error object will be + * instantiated from this class, if specified. + * + * @param bool $skipmsg If true, raiseError will only pass error codes, + * the error message parameter will be dropped. + * + * @access public + * @return object a PEAR error object + * @see PEAR::setErrorHandling + * @since PHP 4.0.5 + */ + function &raiseError($message = null, + $code = null, + $mode = null, + $options = null, + $userinfo = null, + $error_class = null, + $skipmsg = false) + { + // The error is yet a PEAR error object + if (is_object($message)) { + $code = $message->getCode(); + $userinfo = $message->getUserInfo(); + $error_class = $message->getType(); + $message->error_message_prefix = ''; + $message = $message->getMessage(); + } + + if (isset($this) && isset($this->_expected_errors) && sizeof($this->_expected_errors) > 0 && sizeof($exp = end($this->_expected_errors))) { + if ($exp[0] == "*" || + (is_int(reset($exp)) && in_array($code, $exp)) || + (is_string(reset($exp)) && in_array($message, $exp))) { + $mode = PEAR_ERROR_RETURN; + } + } + // No mode given, try global ones + if ($mode === null) { + // Class error handler + if (isset($this) && isset($this->_default_error_mode)) { + $mode = $this->_default_error_mode; + $options = $this->_default_error_options; + // Global error handler + } elseif (isset($GLOBALS['_PEAR_default_error_mode'])) { + $mode = $GLOBALS['_PEAR_default_error_mode']; + $options = $GLOBALS['_PEAR_default_error_options']; + } + } + + if ($error_class !== null) { + $ec = $error_class; + } elseif (isset($this) && isset($this->_error_class)) { + $ec = $this->_error_class; + } else { + $ec = 'PEAR_Error'; + } + if ($skipmsg) { + $a = &new $ec($code, $mode, $options, $userinfo); + return $a; + } else { + $a = &new $ec($message, $code, $mode, $options, $userinfo); + return $a; + } + } + + // }}} + // {{{ throwError() + + /** + * Simpler form of raiseError with fewer options. In most cases + * message, code and userinfo are enough. + * + * @param string $message + * + */ + function &throwError($message = null, + $code = null, + $userinfo = null) + { + if (isset($this) && is_a($this, 'PEAR')) { + $a = &$this->raiseError($message, $code, null, null, $userinfo); + return $a; + } else { + $a = &PEAR::raiseError($message, $code, null, null, $userinfo); + return $a; + } + } + + // }}} + function staticPushErrorHandling($mode, $options = null) + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + $def_mode = &$GLOBALS['_PEAR_default_error_mode']; + $def_options = &$GLOBALS['_PEAR_default_error_options']; + $stack[] = array($def_mode, $def_options); + switch ($mode) { + case PEAR_ERROR_EXCEPTION: + case PEAR_ERROR_RETURN: + case PEAR_ERROR_PRINT: + case PEAR_ERROR_TRIGGER: + case PEAR_ERROR_DIE: + case null: + $def_mode = $mode; + $def_options = $options; + break; + + case PEAR_ERROR_CALLBACK: + $def_mode = $mode; + // class/object method callback + if (is_callable($options)) { + $def_options = $options; + } else { + trigger_error("invalid error callback", E_USER_WARNING); + } + break; + + default: + trigger_error("invalid error mode", E_USER_WARNING); + break; + } + $stack[] = array($mode, $options); + return true; + } + + function staticPopErrorHandling() + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + $setmode = &$GLOBALS['_PEAR_default_error_mode']; + $setoptions = &$GLOBALS['_PEAR_default_error_options']; + array_pop($stack); + list($mode, $options) = $stack[sizeof($stack) - 1]; + array_pop($stack); + switch ($mode) { + case PEAR_ERROR_EXCEPTION: + case PEAR_ERROR_RETURN: + case PEAR_ERROR_PRINT: + case PEAR_ERROR_TRIGGER: + case PEAR_ERROR_DIE: + case null: + $setmode = $mode; + $setoptions = $options; + break; + + case PEAR_ERROR_CALLBACK: + $setmode = $mode; + // class/object method callback + if (is_callable($options)) { + $setoptions = $options; + } else { + trigger_error("invalid error callback", E_USER_WARNING); + } + break; + + default: + trigger_error("invalid error mode", E_USER_WARNING); + break; + } + return true; + } + + // {{{ pushErrorHandling() + + /** + * Push a new error handler on top of the error handler options stack. With this + * you can easily override the actual error handler for some code and restore + * it later with popErrorHandling. + * + * @param mixed $mode (same as setErrorHandling) + * @param mixed $options (same as setErrorHandling) + * + * @return bool Always true + * + * @see PEAR::setErrorHandling + */ + function pushErrorHandling($mode, $options = null) + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + if (isset($this) && is_a($this, 'PEAR')) { + $def_mode = &$this->_default_error_mode; + $def_options = &$this->_default_error_options; + } else { + $def_mode = &$GLOBALS['_PEAR_default_error_mode']; + $def_options = &$GLOBALS['_PEAR_default_error_options']; + } + $stack[] = array($def_mode, $def_options); + + if (isset($this) && is_a($this, 'PEAR')) { + $this->setErrorHandling($mode, $options); + } else { + PEAR::setErrorHandling($mode, $options); + } + $stack[] = array($mode, $options); + return true; + } + + // }}} + // {{{ popErrorHandling() + + /** + * Pop the last error handler used + * + * @return bool Always true + * + * @see PEAR::pushErrorHandling + */ + function popErrorHandling() + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + array_pop($stack); + list($mode, $options) = $stack[sizeof($stack) - 1]; + array_pop($stack); + if (isset($this) && is_a($this, 'PEAR')) { + $this->setErrorHandling($mode, $options); + } else { + PEAR::setErrorHandling($mode, $options); + } + return true; + } + + // }}} + // {{{ loadExtension() + + /** + * OS independant PHP extension load. Remember to take care + * on the correct extension name for case sensitive OSes. + * + * @param string $ext The extension name + * @return bool Success or not on the dl() call + */ + function loadExtension($ext) + { + if (!extension_loaded($ext)) { + // if either returns true dl() will produce a FATAL error, stop that + if ((ini_get('enable_dl') != 1) || (ini_get('safe_mode') == 1)) { + return false; + } + if (OS_WINDOWS) { + $suffix = '.dll'; + } elseif (PHP_OS == 'HP-UX') { + $suffix = '.sl'; + } elseif (PHP_OS == 'AIX') { + $suffix = '.a'; + } elseif (PHP_OS == 'OSX') { + $suffix = '.bundle'; + } else { + $suffix = '.so'; + } + return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix); + } + return true; + } + + // }}} +} + +// {{{ _PEAR_call_destructors() + +function _PEAR_call_destructors() +{ + global $_PEAR_destructor_object_list; + if (is_array($_PEAR_destructor_object_list) && + sizeof($_PEAR_destructor_object_list)) + { + reset($_PEAR_destructor_object_list); + if (PEAR::getStaticProperty('PEAR', 'destructlifo')) { + $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list); + } + while (list($k, $objref) = each($_PEAR_destructor_object_list)) { + $classname = get_class($objref); + while ($classname) { + $destructor = "_$classname"; + if (method_exists($objref, $destructor)) { + $objref->$destructor(); + break; + } else { + $classname = get_parent_class($classname); + } + } + } + // Empty the object list to ensure that destructors are + // not called more than once. + $_PEAR_destructor_object_list = array(); + } + + // Now call the shutdown functions + if (is_array($GLOBALS['_PEAR_shutdown_funcs']) AND !empty($GLOBALS['_PEAR_shutdown_funcs'])) { + foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) { + call_user_func_array($value[0], $value[1]); + } + } +} + +// }}} +/** + * Standard PEAR error class for PHP 4 + * + * This class is supserseded by {@link PEAR_Exception} in PHP 5 + * + * @category pear + * @package PEAR + * @author Stig Bakken + * @author Tomas V.V. Cox + * @author Gregory Beaver + * @copyright 1997-2006 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.6.2 + * @link http://pear.php.net/manual/en/core.pear.pear-error.php + * @see PEAR::raiseError(), PEAR::throwError() + * @since Class available since PHP 4.0.2 + */ +class PEAR_Error +{ + // {{{ properties + + var $error_message_prefix = ''; + var $mode = PEAR_ERROR_RETURN; + var $level = E_USER_NOTICE; + var $code = -1; + var $message = ''; + var $userinfo = ''; + var $backtrace = null; + + // }}} + // {{{ constructor + + /** + * PEAR_Error constructor + * + * @param string $message message + * + * @param int $code (optional) error code + * + * @param int $mode (optional) error mode, one of: PEAR_ERROR_RETURN, + * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER, + * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION + * + * @param mixed $options (optional) error level, _OR_ in the case of + * PEAR_ERROR_CALLBACK, the callback function or object/method + * tuple. + * + * @param string $userinfo (optional) additional user/debug info + * + * @access public + * + */ + function PEAR_Error($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + if ($mode === null) { + $mode = PEAR_ERROR_RETURN; + } + $this->message = $message; + $this->code = $code; + $this->mode = $mode; + $this->userinfo = $userinfo; + if (!PEAR::getStaticProperty('PEAR_Error', 'skiptrace')) { + $this->backtrace = debug_backtrace(); + if (isset($this->backtrace[0]) && isset($this->backtrace[0]['object'])) { + unset($this->backtrace[0]['object']); + } + } + if ($mode & PEAR_ERROR_CALLBACK) { + $this->level = E_USER_NOTICE; + $this->callback = $options; + } else { + if ($options === null) { + $options = E_USER_NOTICE; + } + $this->level = $options; + $this->callback = null; + } + if ($this->mode & PEAR_ERROR_PRINT) { + if (is_null($options) || is_int($options)) { + $format = "%s"; + } else { + $format = $options; + } + printf($format, $this->getMessage()); + } + if ($this->mode & PEAR_ERROR_TRIGGER) { + trigger_error($this->getMessage(), $this->level); + } + if ($this->mode & PEAR_ERROR_DIE) { + $msg = $this->getMessage(); + if (is_null($options) || is_int($options)) { + $format = "%s"; + if (substr($msg, -1) != "\n") { + $msg .= "\n"; + } + } else { + $format = $options; + } + die(sprintf($format, $msg)); + } + if ($this->mode & PEAR_ERROR_CALLBACK) { + if (is_callable($this->callback)) { + call_user_func($this->callback, $this); + } + } + if ($this->mode & PEAR_ERROR_EXCEPTION) { + trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_Exception for exceptions", E_USER_WARNING); + eval('$e = new Exception($this->message, $this->code);throw($e);'); + } + } + + // }}} + // {{{ getMode() + + /** + * Get the error mode from an error object. + * + * @return int error mode + * @access public + */ + function getMode() { + return $this->mode; + } + + // }}} + // {{{ getCallback() + + /** + * Get the callback function/method from an error object. + * + * @return mixed callback function or object/method array + * @access public + */ + function getCallback() { + return $this->callback; + } + + // }}} + // {{{ getMessage() + + + /** + * Get the error message from an error object. + * + * @return string full error message + * @access public + */ + function getMessage() + { + return ($this->error_message_prefix . $this->message); + } + + + // }}} + // {{{ getCode() + + /** + * Get error code from an error object + * + * @return int error code + * @access public + */ + function getCode() + { + return $this->code; + } + + // }}} + // {{{ getType() + + /** + * Get the name of this error/exception. + * + * @return string error/exception name (type) + * @access public + */ + function getType() + { + return get_class($this); + } + + // }}} + // {{{ getUserInfo() + + /** + * Get additional user-supplied information. + * + * @return string user-supplied information + * @access public + */ + function getUserInfo() + { + return $this->userinfo; + } + + // }}} + // {{{ getDebugInfo() + + /** + * Get additional debug information supplied by the application. + * + * @return string debug information + * @access public + */ + function getDebugInfo() + { + return $this->getUserInfo(); + } + + // }}} + // {{{ getBacktrace() + + /** + * Get the call backtrace from where the error was generated. + * Supported with PHP 4.3.0 or newer. + * + * @param int $frame (optional) what frame to fetch + * @return array Backtrace, or NULL if not available. + * @access public + */ + function getBacktrace($frame = null) + { + if (defined('PEAR_IGNORE_BACKTRACE')) { + return null; + } + if ($frame === null) { + return $this->backtrace; + } + return $this->backtrace[$frame]; + } + + // }}} + // {{{ addUserInfo() + + function addUserInfo($info) + { + if (empty($this->userinfo)) { + $this->userinfo = $info; + } else { + $this->userinfo .= " ** $info"; + } + } + + // }}} + // {{{ toString() + + /** + * Make a string representation of this object. + * + * @return string a string with an object summary + * @access public + */ + function toString() { + $modes = array(); + $levels = array(E_USER_NOTICE => 'notice', + E_USER_WARNING => 'warning', + E_USER_ERROR => 'error'); + if ($this->mode & PEAR_ERROR_CALLBACK) { + if (is_array($this->callback)) { + $callback = (is_object($this->callback[0]) ? + strtolower(get_class($this->callback[0])) : + $this->callback[0]) . '::' . + $this->callback[1]; + } else { + $callback = $this->callback; + } + return sprintf('[%s: message="%s" code=%d mode=callback '. + 'callback=%s prefix="%s" info="%s"]', + strtolower(get_class($this)), $this->message, $this->code, + $callback, $this->error_message_prefix, + $this->userinfo); + } + if ($this->mode & PEAR_ERROR_PRINT) { + $modes[] = 'print'; + } + if ($this->mode & PEAR_ERROR_TRIGGER) { + $modes[] = 'trigger'; + } + if ($this->mode & PEAR_ERROR_DIE) { + $modes[] = 'die'; + } + if ($this->mode & PEAR_ERROR_RETURN) { + $modes[] = 'return'; + } + return sprintf('[%s: message="%s" code=%d mode=%s level=%s '. + 'prefix="%s" info="%s"]', + strtolower(get_class($this)), $this->message, $this->code, + implode("|", $modes), $levels[$this->level], + $this->error_message_prefix, + $this->userinfo); + } + + // }}} +} + +/* + * Local Variables: + * mode: php + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ +?> diff --git a/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/index.html b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/phpFlickr/PEAR/index.html @@ -0,0 +1,1 @@ + \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/resources/phpFlickr/auth.php b/components/com_morfeoshow/tpl/resources/phpFlickr/auth.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/phpFlickr/auth.php @@ -0,0 +1,37 @@ +auth($permissions, false); + } else { + $f->auth_getToken($_GET['frob']); + } + + if (empty($redirect)) { + header("Location: " . $default_redirect); + } else { + header("Location: " . $redirect); + } + +?> \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/resources/phpFlickr/getToken.php b/components/com_morfeoshow/tpl/resources/phpFlickr/getToken.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/phpFlickr/getToken.php @@ -0,0 +1,19 @@ +", ""); + + //change this to the permissions you will need + $f->auth("read"); + + echo "Copy this token into your code: " . $_SESSION['phpFlickr_auth_token']; + +?> \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/resources/phpFlickr/index.html b/components/com_morfeoshow/tpl/resources/phpFlickr/index.html new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/phpFlickr/index.html @@ -0,0 +1,1 @@ + \ No newline at end of file diff --git a/components/com_morfeoshow/tpl/resources/phpFlickr/phpFlickr.php b/components/com_morfeoshow/tpl/resources/phpFlickr/phpFlickr.php new file mode 100644 --- /dev/null +++ b/components/com_morfeoshow/tpl/resources/phpFlickr/phpFlickr.php @@ -0,0 +1,1414 @@ +api_key = $api_key; + $this->secret = $secret; + $this->die_on_error = $die_on_error; + $this->service = "flickr"; + + //Find the PHP version and store it for future reference + $this->php_version = explode("-", phpversion()); + $this->php_version = explode(".", $this->php_version[0]); + + //All calls to the API are done via the POST method using the PEAR::HTTP_Request package. + require_once 'HTTP/Request.php'; + $this->req =& new HTTP_Request(); + $this->req->setMethod(HTTP_REQUEST_METHOD_POST); + } + + function enableCache($type, $connection, $cache_expire = 600, $table = 'flickr_cache') + { + // Turns on caching. $type must be either "db" (for database caching) or "fs" (for filesystem). + // When using db, $connection must be a PEAR::DB connection string. Example: + // "mysql://user:password@server/database" + // If the $table, doesn't exist, it will attempt to create it. + // When using file system, caching, the $connection is the folder that the web server has write + // access to. Use absolute paths for best results. Relative paths may have unexpected behavior + // when you include this. They'll usually work, you'll just want to test them. + if ($type == 'db') { + require_once 'DB.php'; + $db =& DB::connect($connection); + if (PEAR::isError($db)) { + die($db->getMessage()); + } + + /* + * If high performance is crucial, you can easily comment + * out this query once you've created your database table. + */ + + $db->query(" + CREATE TABLE IF NOT EXISTS `$table` ( + `request` CHAR( 35 ) NOT NULL , + `response` MEDIUMTEXT NOT NULL , + `expiration` DATETIME NOT NULL , + INDEX ( `request` ) + ) TYPE = MYISAM"); + + if ($db->getOne("SELECT COUNT(*) FROM $table") > $this->max_cache_rows) { + $db->query("DELETE FROM $table WHERE expiration < DATE_SUB(NOW(), INTERVAL $cache_expire second)"); + $db->query('OPTIMIZE TABLE ' . $this->cache_table); + } + + $this->cache = 'db'; + $this->cache_db = $db; + $this->cache_table = $table; + } elseif ($type == 'fs') { + $this->cache = 'fs'; + $connection = realpath($connection); + $this->cache_dir = $connection; + if ($dir = opendir($this->cache_dir)) { + while ($file = readdir($dir)) { + if (substr($file, -6) == '.cache' && ((filemtime($this->cache_dir . '/' . $file) + $cache_expire) < time()) ) { + unlink($this->cache_dir . '/' . $file); + } + } + } + } + $this->cache_expire = $cache_expire; + } + + function getCached ($request) + { + //Checks the database or filesystem for a cached result to the request. + //If there is no cache result, it returns a value of false. If it finds one, + //it returns the unparsed XML. + $reqhash = md5(serialize($request)); + if ($this->cache == 'db') { + $result = $this->cache_db->getOne("SELECT response FROM " . $this->cache_table . " WHERE request = ? AND DATE_SUB(NOW(), INTERVAL " . (int) $this->cache_expire . " SECOND) < expiration", $reqhash); + if (!empty($result)) { + return $result; + } + } elseif ($this->cache == 'fs') { + $file = $this->cache_dir . '/' . $reqhash . '.cache'; + if (file_exists($file)) { + if ($this->php_version[0] > 4 || ($this->php_version[0] == 4 && $this->php_version[1] >= 3)) { + return file_get_contents($file); + } else { + return implode('', file($file)); + } + } + } + return false; + } + + function cache ($request, $response) + { + //Caches the unparsed XML of a request. + $reqhash = md5(serialize($request)); + if ($this->cache == 'db') { + //$this->cache_db->query("DELETE FROM $this->cache_table WHERE request = '$reqhash'"); + if ($this->cache_db->getOne("SELECT COUNT(*) FROM {$this->cache_table} WHERE request = '$reqhash'")) { + $sql = "UPDATE " . $this->cache_table . " SET response = ?, expiration = ? WHERE request = ?"; + $this->cache_db->query($sql, array($response, strftime("%Y-%m-%d %H:%M:%S"), $reqhash)); + } else { + $sql = "INSERT INTO " . $this->cache_table . " (request, response, expiration) VALUES ('$reqhash', '" . str_replace("'", "''", $response) . "', '" . strftime("%Y-%m-%d %H:%M:%S") . "')"; + $this->cache_db->query($sql); + } + } elseif ($this->cache == "fs") { + $file = $this->cache_dir . "/" . $reqhash . ".cache"; + $fstream = fopen($file, "w"); + $result = fwrite($fstream,$response); + fclose($fstream); + return $result; + } + return false; + } + + function request ($command, $args = array(), $nocache = false) + { + //Sends a request to Flickr's REST endpoint via POST. + $this->req->setURL($this->REST); + $this->req->clearPostData(); + if (substr($command,0,7) != "flickr.") { + $command = "flickr." . $command; + } + + //Process arguments, including method and login data. + $args = array_merge(array("method" => $command, "format" => "php_serial", "api_key" => $this->api_key), $args); + if (!empty($this->token)) { + $args = array_merge($args, array("auth_token" => $this->token)); + } elseif (!empty($_SESSION['phpFlickr_auth_token'])) { + $args = array_merge($args, array("auth_token" => $_SESSION['phpFlickr_auth_token'])); + } + ksort($args); + $auth_sig = ""; + if (!($this->response = $this->getCached($args)) || $nocache) { + foreach ($args as $key => $data) { + $auth_sig .= $key . $data; + $this->req->addPostData($key, $data); + } + if (!empty($this->secret)) { + $api_sig = md5($this->secret . $auth_sig); + $this->req->addPostData("api_sig", $api_sig); + } + + $this->req->addHeader("Connection", "Keep-Alive"); + + //Send Requests + if ($this->req->sendRequest()) { + $this->response = $this->req->getResponseBody(); + $this->cache($args, $this->response); + } else { + die("There has been a problem sending your command to the server."); + } + } + /* + * Uncomment this line (and comment out the next one) if you're doing large queries + * and you're concerned about time. This will, however, change the structure of + * the result, so be sure that you look at the results. + */ + //$this->parsed_response = unserialize($this->response); + $this->parsed_response = $this->clean_text_nodes(unserialize($this->response)); + if ($this->parsed_response['stat'] == 'fail') { + if ($this->die_on_error) die("The Flickr API returned the following error: #{$this->parsed_response['code']} - {$this->parsed_response['message']}"); + else { + $this->error_code = $this->parsed_response['code']; + $this->error_msg = $this->parsed_response['message']; + $this->parsed_response = false; + } + } else { + $this->error_code = false; + $this->error_msg = false; + } + return $this->response; + } + + function clean_text_nodes($arr) { + if (!is_array($arr)) { + return $arr; + } elseif (count($arr) == 0) { + return $arr; + } elseif (count($arr) == 1 && array_key_exists('_content', $arr)) { + return $arr['_content']; + } else { + foreach ($arr as $key => $element) { + $arr[$key] = $this->clean_text_nodes($element); + } + return($arr); + } + } + + function setToken($token) + { + // Sets an authentication token to use instead of the session variable + $this->token = $token; + } + + function setProxy($server, $port) + { + // Sets the proxy for all phpFlickr calls. + $this->req->setProxy($server, $port); + } + + function getErrorCode() + { + // Returns the error code of the last call. If the last call did not + // return an error. This will return a false boolean. + return $this->error_code; + } + + function getErrorMsg() + { + // Returns the error message of the last call. If the last call did not + // return an error. This will return a false boolean. + return $this->error_msg; + } + + /* These functions are front ends for the flickr calls */ + + function buildPhotoURL ($photo, $size = "Medium") + { + //receives an array (can use the individual photo data returned + //from an API call) and returns a URL (doesn't mean that the + //file size exists) + $sizes = array( + "square" => "_s", + "thumbnail" => "_t", + "small" => "_m", + "medium" => "", + "large" => "_b", + "original" => "_o" + ); + + $size = strtolower($size); + if (!array_key_exists($size, $sizes)) { + $size = "medium"; + } + + if ($size == "original") { + $url = "http://farm" . $photo['farm'] . ".static.flickr.com/" . $photo['server'] . "/" . $photo['id'] . "_" . $photo['originalsecret'] . "_o" . "." . $photo['originalformat']; + } else { + $url = "http://farm" . $photo['farm'] . ".static.flickr.com/" . $photo['server'] . "/" . $photo['id'] . "_" . $photo['secret'] . $sizes[$size] . ".jpg"; + } + return $url; + } + + function getFriendlyGeodata($lat, $lon) { + /* I've added this method to get the friendly geodata (i.e. 'in New York, NY') that the + * website provides, but isn't available in the API. I'm providing this service as long + * as it doesn't flood my server with requests and crash it all the time. + */ + return unserialize(file_get_contents('http://phpflickr.com/geodata/?format=php&lat=' . $lat . '&lon=' . $lon)); + } + + function sync_upload ($photo, $title = null, $description = null, $tags = null, $is_public = null, $is_friend = null, $is_family = null) { + $upload_req =& new HTTP_Request(); + $upload_req->setMethod(HTTP_REQUEST_METHOD_POST); + + + $upload_req->setURL($this->Upload); + $upload_req->clearPostData(); + + //Process arguments, including method and login data. + $args = array("api_key" => $this->api_key, "title" => $title, "description" => $description, "tags" => $tags, "is_public" => $is_public, "is_friend" => $is_friend, "is_family" => $is_family); + if (!empty($this->email)) { + $args = array_merge($args, array("email" => $this->email)); + } + if (!empty($this->password)) { + $args = array_merge($args, array("password" => $this->password)); + } + if (!empty($this->token)) { + $args = array_merge($args, array("auth_token" => $this->token)); + } elseif (!empty($_SESSION['phpFlickr_auth_token'])) { + $args = array_merge($args, array("auth_token" => $_SESSION['phpFlickr_auth_token'])); + } + + ksort($args); + $auth_sig = ""; + foreach ($args as $key => $data) { + if ($data !== null) { + $auth_sig .= $key . $data; + $upload_req->addPostData($key, $data); + } + } + if (!empty($this->secret)) { + $api_sig = md5($this->secret . $auth_sig); + $upload_req->addPostData("api_sig", $api_sig); + } + + $photo = realpath($photo); + + $result = $upload_req->addFile("photo", $photo); + + if (PEAR::isError($result)) { + die($result->getMessage()); + } + + //Send Requests + if ($upload_req->sendRequest()) { + $this->response = $upload_req->getResponseBody(); + } else { + die("There has been a problem sending your command to the server."); + } + + $rsp = explode("\n", $this->response); + foreach ($rsp as $line) { + if (ereg('die_on_error) + die("The Flickr API returned the following error: #{$match[1]} - {$match[2]}"); + else { + $this->error_code = $match[1]; + $this->error_msg = $match[2]; + $this->parsed_response = false; + return false; + } + } elseif (ereg("(.*)", $line, $match)) { + $this->error_code = false; + $this->error_msg = false; + return $match[1]; + } + } + } + + function async_upload ($photo, $title = null, $description = null, $tags = null, $is_public = null, $is_friend = null, $is_family = null) { + $upload_req =& new HTTP_Request(); + $upload_req->setMethod(HTTP_REQUEST_METHOD_POST); + + $upload_req->setURL($this->Upload); + $upload_req->clearPostData(); + + //Process arguments, including method and login data. + $args = array("async" => 1, "api_key" => $this->api_key, "title" => $title, "description" => $description, "tags" => $tags, "is_public" => $is_public, "is_friend" => $is_friend, "is_family" => $is_family); + if (!empty($this->email)) { + $args = array_merge($args, array("email" => $this->email)); + } + if (!empty($this->password)) { + $args = array_merge($args, array("password" => $this->password)); + } + if (!empty($this->token)) { + $args = array_merge($args, array("auth_token" => $this->token)); + } elseif (!empty($_SESSION['phpFlickr_auth_token'])) { + $args = array_merge($args, array("auth_token" => $_SESSION['phpFlickr_auth_token'])); + } + + ksort($args); + $auth_sig = ""; + foreach ($args as $key => $data) { + if ($data !== null) { + $auth_sig .= $key . $data; + $upload_req->addPostData($key, $data); + } + } + if (!empty($this->secret)) { + $api_sig = md5($this->secret . $auth_sig); + $upload_req->addPostData("api_sig", $api_sig); + } + + $photo = realpath($photo); + + $result = $upload_req->addFile("photo", $photo); + + if (PEAR::isError($result)) { + die($result->getMessage()); + } + + //Send Requests + if ($upload_req->sendRequest()) { + $this->response = $upload_req->getResponseBody(); + } else { + die("There has been a problem sending your command to the server."); + } + + $rsp = explode("\n", $this->response); + foreach ($rsp as $line) { + if (ereg('die_on_error) + die("The Flickr API returned the following error: #{$match[1]} - {$match[2]}"); + else { + $this->error_code = $match[1]; + $this->error_msg = $match[2]; + $this->parsed_response = false; + return false; + } + } elseif (ereg("(.*)error_code = false; + $this->error_msg = false; + return $match[1]; + } + } + } + + // Interface for new replace API method. + function replace ($photo, $photo_id, $async = null) { + $upload_req =& new HTTP_Request(); + $upload_req->setMethod(HTTP_REQUEST_METHOD_POST); + + $upload_req->setURL($this->Replace); + $upload_req->clearPostData(); + + //Process arguments, including method and login data. + $args = array("api_key" => $this->api_key, "photo_id" => $photo_id, "async" => $async); + if (!empty($this->email)) { + $args = array_merge($args, array("email" => $this->email)); + } + if (!empty($this->password)) { + $args = array_merge($args, array("password" => $this->password)); + } + if (!empty($this->token)) { + $args = array_merge($args, array("auth_token" => $this->token)); + } elseif (!empty($_SESSION['phpFlickr_auth_token'])) { + $args = array_merge($args, array("auth_token" => $_SESSION['phpFlickr_auth_token'])); + } + + ksort($args); + $auth_sig = ""; + foreach ($args as $key => $data) { + if ($data !== null) { + $auth_sig .= $key . $data; + $upload_req->addPostData($key, $data); + } + } + if (!empty($this->secret)) { + $api_sig = md5($this->secret . $auth_sig); + $upload_req->addPostData("api_sig", $api_sig); + } + + $photo = realpath($photo); + + $result = $upload_req->addFile("photo", $photo); + + if (PEAR::isError($result)) { + die($result->getMessage()); + } + + //Send Requests + if ($upload_req->sendRequest()) { + $this->response = $upload_req->getResponseBody(); + } else { + die("There has been a problem sending your command to the server."); + } + if ($async == 1) + $find = 'ticketid'; + else + $find = 'photoid'; + + $rsp = explode("\n", $this->response); + foreach ($rsp as $line) { + if (ereg('die_on_error) + die("The Flickr API returned the following error: #{$match[1]} - {$match[2]}"); + else { + $this->error_code = $match[1]; + $this->error_msg = $match[2]; + $this->parsed_response = false; + return false; + } + } elseif (ereg("<" . $find . ">(.*)error_code = false; + $this->error_msg = false; + return $match[1]; + } + } + } + + function auth ($perms = "read", $remember_uri = true) + { + // Redirects to Flickr's authentication piece if there is no valid token. + // If remember_uri is set to false, the callback script (included) will + // redirect to its default page. + + if (empty($_SESSION['phpFlickr_auth_token']) && empty($this->token)) { + if ($remember_uri) { + $redirect = $_SERVER['REQUEST_URI']; + } + $api_sig = md5($this->secret . "api_key" . $this->api_key . "extra" . $redirect . "perms" . $perms); + if ($this->service == "23") { + header("Location: http://www.23hq.com/services/auth/?api_key=" . $this->api_key . "&extra=" . $redirect . "&perms=" . $perms . "&api_sig=". $api_sig); + } else { + header("Location: http://www.flickr.com/services/auth/?api_key=" . $this->api_key . "&extra=" . $redirect . "&perms=" . $perms . "&api_sig=". $api_sig); + } + exit; + } else { + $tmp = $this->die_on_error; + $this->die_on_error = false; + $rsp = $this->auth_checkToken(); + if ($this->error_code !== false) { + unset($_SESSION['phpFlickr_auth_token']); + $this->auth($perms, $remember_uri); + } + $this->die_on_error = $tmp; + return $rsp['perms']; + } + } + + /******************************* + + To use the phpFlickr::call method, pass a string containing the API method you want + to use and an associative array of arguments. For example: + $result = $f->call("flickr.photos.comments.getList", array("photo_id"=>'34952612')); + This method will allow you to make calls to arbitrary methods that haven't been + implemented in phpFlickr yet. + + *******************************/ + + function call($method, $arguments) + { + $this->request($method, $arguments); + return $this->parsed_response ? $this->parsed_response : false; + } + + /* + These functions are the direct implementations of flickr calls. + For method documentation, including arguments, visit the address + included in a comment in the function. + */ + + /* Activity methods */ + function activity_userComments ($per_page = NULL, $page = NULL) + { + /* http://www.flickr.com/services/api/flickr.activity.userComments.html */ + $this->request('flickr.activity.userComments', array("per_page" => $per_page, "page" => $page)); + return $this->parsed_response ? $this->parsed_response['items']['item'] : false; + } + + function activity_userPhotos ($timeframe = NULL, $per_page = NULL, $page = NULL) + { + /* http://www.flickr.com/services/api/flickr.activity.userPhotos.html */ + $this->request('flickr.activity.userPhotos', array("timeframe" => $timeframe, "per_page" => $per_page, "page" => $page)); + return $this->parsed_response ? $this->parsed_response['items']['item'] : false; + } + + /* Authentication methods */ + function auth_checkToken () + { + /* http://www.flickr.com/services/api/flickr.auth.checkToken.html */ + $this->request('flickr.auth.checkToken'); + return $this->parsed_response ? $this->parsed_response['auth'] : false; + } + + function auth_getFrob () + { + /* http://www.flickr.com/services/api/flickr.auth.getFrob.html */ + $this->request('flickr.auth.getFrob'); + return $this->parsed_response ? $this->parsed_response['frob'] : false; + } + + function auth_getFullToken ($mini_token) + { + /* http://www.flickr.com/services/api/flickr.auth.getFullToken.html */ + $this->request('flickr.auth.getFullToken', array('mini_token'=>$mini_token)); + return $this->parsed_response ? $this->parsed_response['auth'] : false; + } + + function auth_getToken ($frob) + { + /* http://www.flickr.com/services/api/flickr.auth.getToken.html */ + $this->request('flickr.auth.getToken', array('frob'=>$frob)); + session_register('phpFlickr_auth_token'); + $_SESSION['phpFlickr_auth_token'] = $this->parsed_response['auth']['token']; + return $this->parsed_response ? $this->parsed_response['auth'] : false; + } + + /* Blogs methods */ + function blogs_getList () + { + /* http://www.flickr.com/services/api/flickr.blogs.getList.html */ + $this->request('flickr.blogs.getList'); + return $this->parsed_response ? $this->parsed_response['blogs']['blog'] : false; + } + + function blogs_postPhoto($blog_id, $photo_id, $title, $description, $blog_password = NULL) + { + /* http://www.flickr.com/services/api/flickr.blogs.postPhoto.html */ + $this->request('flickr.blogs.postPhoto', array('blog_id'=>$blog_id, 'photo_id'=>$photo_id, 'title'=>$title, 'description'=>$description, 'blog_password'=>$blog_password), TRUE); + return $this->parsed_response ? true : false; + } + + /* Contacts Methods */ + function contacts_getList ($filter = NULL, $page = NULL, $per_page = NULL) + { + /* http://www.flickr.com/services/api/flickr.contacts.getList.html */ + $this->request('flickr.contacts.getList', array('filter'=>$filter, 'page'=>$page, 'per_page'=>$per_page)); + return $this->parsed_response ? $this->parsed_response['contacts'] : false; + } + + function contacts_getPublicList($user_id, $page = NULL, $per_page = NULL) + { + /* http://www.flickr.com/services/api/flickr.contacts.getPublicList.html */ + $this->request('flickr.contacts.getPublicList', array('user_id'=>$user_id, 'page'=>$page, 'per_page'=>$per_page)); + return $this->parsed_response ? $this->parsed_response['contacts'] : false; + } + + /* Favorites Methods */ + function favorites_add ($photo_id) + { + /* http://www.flickr.com/services/api/flickr.favorites.add.html */ + $this->request('flickr.favorites.add', array('photo_id'=>$photo_id), TRUE); + return $this->parsed_response ? true : false; + } + + function favorites_getList($user_id = NULL, $extras = NULL, $per_page = NULL, $page = NULL) + { + /* http://www.flickr.com/services/api/flickr.favorites.getList.html */ + if (is_array($extras)) { $extras = implode(",", $extras); } + $this->request("flickr.favorites.getList", array("user_id"=>$user_id, "extras"=>$extras, "per_page"=>$per_page, "page"=>$page)); + return $this->parsed_response ? $this->parsed_response['photos'] : false; + } + + function favorites_getPublicList($user_id = NULL, $extras = NULL, $per_page = NULL, $page = NULL) + { + /* http://www.flickr.com/services/api/flickr.favorites.getPublicList.html */ + if (is_array($extras)) { + $extras = implode(",", $extras); + } + $this->request("flickr.favorites.getPublicList", array("user_id"=>$user_id, "extras"=>$extras, "per_page"=>$per_page, "page"=>$page)); + return $this->parsed_response ? $this->parsed_response['photos'] : false; + } + + function favorites_remove($photo_id) + { + /* http://www.flickr.com/services/api/flickr.favorites.remove.html */ + $this->request("flickr.favorites.remove", array("photo_id"=>$photo_id), TRUE); + return $this->parsed_response ? true : false; + } + + /* Groups Methods */ + function groups_browse ($cat_id = NULL) + { + /* http://www.flickr.com/services/api/flickr.groups.browse.html */ + $this->request("flickr.groups.browse", array("cat_id"=>$cat_id)); + return $this->parsed_response ? $this->parsed_response['category'] : false; + } + + function groups_getInfo ($group_id) + { + /* http://www.flickr.com/services/api/flickr.groups.getInfo.html */ + $this->request("flickr.groups.getInfo", array("group_id"=>$group_id)); + return $this->parsed_response ? $this->parsed_response['group'] : false; + } + + function groups_search ($text, $per_page=NULL, $page=NULL) + { + /* http://www.flickr.com/services/api/flickr.groups.search.html */ + $this->request("flickr.groups.search", array("text"=>$text,"per_page"=>$per_page,"page"=>$page)); + return $this->parsed_response ? $this->parsed_response['groups'] : false; + } + + /* Groups Pools Methods */ + function groups_pools_add ($photo_id, $group_id) + { + /* http://www.flickr.com/services/api/flickr.groups.pools.add.html */ + $this->request("flickr.groups.pools.add", array("photo_id"=>$photo_id, "group_id"=>$group_id), TRUE); + return $this->parsed_response ? true : false; + } + + function groups_pools_getContext ($photo_id, $group_id) + { + /* http://www.flickr.com/services/api/flickr.groups.pools.getContext.html */ + $this->request("flickr.groups.pools.getContext", array("photo_id"=>$photo_id, "group_id"=>$group_id)); + return $this->parsed_response ? $this->parsed_response : false; + } + + function groups_pools_getGroups ($page = NULL, $per_page = NULL) + { + /* http://www.flickr.com/services/api/flickr.groups.pools.getGroups.html */ + $this->request("flickr.groups.pools.getGroups", array('page'=>$page, 'per_page'=>$per_page)); + return $this->parsed_response ? $this->parsed_response['groups'] : false; + } + + function groups_pools_getPhotos ($group_id, $tags = NULL, $user_id = NULL, $extras = NULL, $per_page = NULL, $page = NULL) + { + /* http://www.flickr.com/services/api/flickr.groups.pools.getPhotos.html */ + if (is_array($extras)) { + $extras = implode(",", $extras); + } + $this->request("flickr.groups.pools.getPhotos", array("group_id"=>$group_id, "tags"=>$tags, "user_id"=>$user_id, "extras"=>$extras, "per_page"=>$per_page, "page"=>$page)); + return $this->parsed_response ? $this->parsed_response['photos'] : false; + } + + function groups_pools_remove ($photo_id, $group_id) + { + /* http://www.flickr.com/services/api/flickr.groups.pools.remove.html */ + $this->request("flickr.groups.pools.remove", array("photo_id"=>$photo_id, "group_id"=>$group_id), TRUE); + return $this->parsed_response ? true : false; + } + + /* Interestingness methods */ + function interestingness_getList($date = NULL, $extras = NULL, $per_page = NULL, $page = NULL) + { + /* http://www.flickr.com/services/api/flickr.interestingness.getList.html */ + if (is_array($extras)) { + $extras = implode(",", $extras); + } + + $this->request("flickr.interestingness.getList", array("date"=>$date, "extras"=>$extras, "per_page"=>$per_page, "page"=>$page)); + return $this->parsed_response ? $this->parsed_response['photos'] : false; + } + + /* People methods */ + function people_findByEmail ($find_email) + { + /* http://www.flickr.com/services/api/flickr.people.findByEmail.html */ + $this->request("flickr.people.findByEmail", array("find_email"=>$find_email)); + return $this->parsed_response ? $this->parsed_response['user'] : false; + } + + function people_findByUsername ($username) + { + /* http://www.flickr.com/services/api/flickr.people.findByUsername.html */ + $this->request("flickr.people.findByUsername", array("username"=>$username)); + return $this->parsed_response ? $this->parsed_response['user'] : false; + } + + function people_getInfo($user_id) + { + /* http://www.flickr.com/services/api/flickr.people.getInfo.html */ + $this->request("flickr.people.getInfo", array("user_id"=>$user_id)); + return $this->parsed_response ? $this->parsed_response['person'] : false; + } + + function people_getPublicGroups($user_id) + { + /* http://www.flickr.com/services/api/flickr.people.getPublicGroups.html */ + $this->request("flickr.people.getPublicGroups", array("user_id"=>$user_id)); + return $this->parsed_response ? $this->parsed_response['groups']['group'] : false; + } + + function people_getPublicPhotos($user_id, $extras = NULL, $per_page = NULL, $page = NULL) { + /* http://www.flickr.com/services/api/flickr.people.getPublicPhotos.html */ + if (is_array($extras)) { + $extras = implode(",", $extras); + } + + $this->request("flickr.people.getPublicPhotos", array("user_id"=>$user_id, "extras"=>$extras, "per_page"=>$per_page, "page"=>$page)); + return $this->parsed_response ? $this->parsed_response['photos'] : false; + } + + function people_getUploadStatus() + { + /* http://www.flickr.com/services/api/flickr.people.getUploadStatus.html */ + /* Requires Authentication */ + $this->request("flickr.people.getUploadStatus"); + return $this->parsed_response ? $this->parsed_response['user'] : false; + } + + + /* Photos Methods */ + function photos_addTags ($photo_id, $tags) + { + /* http://www.flickr.com/services/api/flickr.photos.addTags.html */ + $this->request("flickr.photos.addTags", array("photo_id"=>$photo_id, "tags"=>$tags), TRUE); + return $this->parsed_response ? true : false; + } + + function photos_delete($photo_id) + { + /* http://www.flickr.com/services/api/flickr.photos.delete.html */ + $this->request("flickr.photos.delete", array("photo_id"=>$photo_id), TRUE); + return $this->parsed_response ? true : false; + } + + function photos_getAllContexts ($photo_id) + { + /* http://www.flickr.com/services/api/flickr.photos.getAllContexts.html */ + $this->request("flickr.photos.getAllContexts", array("photo_id"=>$photo_id)); + return $this->parsed_response ? $this->parsed_response : false; + } + + function photos_getContactsPhotos ($count = NULL, $just_friends = NULL, $single_photo = NULL, $include_self = NULL, $extras = NULL) + { + /* http://www.flickr.com/services/api/flickr.photos.getContactsPhotos.html */ + $this->request("flickr.photos.getContactsPhotos", array("count"=>$count, "just_friends"=>$just_friends, "single_photo"=>$single_photo, "include_self"=>$include_self, "extras"=>$extras)); + return $this->parsed_response ? $this->parsed_response['photos']['photo'] : false; + } + + function photos_getContactsPublicPhotos ($user_id, $count = NULL, $just_friends = NULL, $single_photo = NULL, $include_self = NULL, $extras = NULL) + { + /* http://www.flickr.com/services/api/flickr.photos.getContactsPublicPhotos.html */ + $this->request("flickr.photos.getContactsPublicPhotos", array("user_id"=>$user_id, "count"=>$count, "just_friends"=>$just_friends, "single_photo"=>$single_photo, "include_self"=>$include_self, "extras"=>$extras)); + return $this->parsed_response ? $this->parsed_response['photos']['photo'] : false; + } + + function photos_getContext ($photo_id) + { + /* http://www.flickr.com/services/api/flickr.photos.getContext.html */ + $this->request("flickr.photos.getContext", array("photo_id"=>$photo_id)); + return $this->parsed_response ? $this->parsed_response : false; + } + + function photos_getCounts ($dates = NULL, $taken_dates = NULL) + { + /* http://www.flickr.com/services/api/flickr.photos.getCounts.html */ + $this->request("flickr.photos.getCounts", array("dates"=>$dates, "taken_dates"=>$taken_dates)); + return $this->parsed_response ? $this->parsed_response['photocounts']['photocount'] : false; + } + + function photos_getExif ($photo_id, $secret = NULL) + { + /* http://www.flickr.com/services/api/flickr.photos.getExif.html */ + $this->request("flickr.photos.getExif", array("photo_id"=>$photo_id, "secret"=>$secret)); + return $this->parsed_response ? $this->parsed_response['photo'] : false; + } + + function photos_getFavorites($photo_id, $page = NULL, $per_page = NULL) + { + /* http://www.flickr.com/services/api/flickr.photos.getFavorites.html */ + $this->request("flickr.photos.getFavorites", array("photo_id"=>$photo_id, "page"=>$page, "per_page"=>$per_page)); + return $this->parsed_response ? $this->parsed_response['photo'] : false; + } + + function photos_getInfo($photo_id, $secret = NULL) + { + /* http://www.flickr.com/services/api/flickr.photos.getInfo.html */ + $this->request("flickr.photos.getInfo", array("photo_id"=>$photo_id, "secret"=>$secret)); + return $this->parsed_response ? $this->parsed_response['photo'] : false; + } + + function photos_getNotInSet($min_upload_date = NULL, $max_upload_date = NULL, $min_taken_date = NULL, $max_taken_date = NULL, $privacy_filter = NULL, $extras = NULL, $per_page = NULL, $page = NULL) + { + /* http://www.flickr.com/services/api/flickr.photos.getNotInSet.html */ + if (is_array($extras)) { + $extras = implode(",", $extras); + } + $this->request("flickr.photos.getNotInSet", array("min_upload_date"=>$min_upload_date, "max_upload_date"=>$max_upload_date, "min_taken_date"=>$min_taken_date, "max_taken_date"=>$max_taken_date, "privacy_filter"=>$privacy_filter, "extras"=>$extras, "per_page"=>$per_page, "page"=>$page)); + return $this->parsed_response ? $this->parsed_response['photos'] : false; + } + + function photos_getPerms($photo_id) + { + /* http://www.flickr.com/services/api/flickr.photos.getPerms.html */ + $this->request("flickr.photos.getPerms", array("photo_id"=>$photo_id)); + return $this->parsed_response ? $this->parsed_response['perms'] : false; + } + + function photos_getRecent($extras = NULL, $per_page = NULL, $page = NULL) + { + /* http://www.flickr.com/services/api/flickr.photos.getRecent.html */ + + if (is_array($extras)) { + $extras = implode(",", $extras); + } + $this->request("flickr.photos.getRecent", array("extras"=>$extras, "per_page"=>$per_page, "page"=>$page)); + return $this->parsed_response ? $this->parsed_response['photos'] : false; + } + + function photos_getSizes($photo_id) + { + /* http://www.flickr.com/services/api/flickr.photos.getSizes.html */ + $this->request("flickr.photos.getSizes", array("photo_id"=>$photo_id)); + return $this->parsed_response ? $this->parsed_response['sizes']['size'] : false; + } + + function photos_getUntagged($min_upload_date = NULL, $max_upload_date = NULL, $min_taken_date = NULL, $max_taken_date = NULL, $privacy_filter = NULL, $extras = NULL, $per_page = NULL, $page = NULL) + { + /* http://www.flickr.com/services/api/flickr.photos.getUntagged.html */ + if (is_array($extras)) { + $extras = implode(",", $extras); + } + $this->request("flickr.photos.getUntagged", array("min_upload_date"=>$min_upload_date, "max_upload_date"=>$max_upload_date, "min_taken_date"=>$min_taken_date, "max_taken_date"=>$max_taken_date, "privacy_filter"=>$privacy_filter, "extras"=>$extras, "per_page"=>$per_page, "page"=>$page)); + return $this->parsed_response ? $this->parsed_response['photos'] : false; + } + + function photos_getWithGeoData($args = NULL) { + /* See the documentation included with the photos_search() function. + * I'm using the same style of arguments for this function. The only + * difference here is that this doesn't require any arguments. The + * flickr.photos.search method requires at least one search parameter. + */ + /* http://www.flickr.com/services/api/flickr.photos.getWithGeoData.html */ + if (is_null($args)) { + $args = array(); + } + $this->request("flickr.photos.getWithGeoData", $args); + return $this->parsed_response ? $this->parsed_response['photos'] : false; + } + + function photos_getWithoutGeoData($args = NULL) { + /* See the documentation included with the photos_search() function. + * I'm using the same style of arguments for this function. The only + * difference here is that this doesn't require any arguments. The + * flickr.photos.search method requires at least one search parameter. + */ + /* http://www.flickr.com/services/api/flickr.photos.getWithoutGeoData.html */ + if (is_null($args)) { + $args = array(); + } + $this->request("flickr.photos.getWithoutGeoData", $args); + return $this->parsed_response ? $this->parsed_response['photos'] : false; + } + + function photos_recentlyUpdated($min_date = NULL, $extras = NULL, $per_page = NULL, $page = NULL) + { + /* http://www.flickr.com/services/api/flickr.photos.getUntagged.html */ + if (is_array($extras)) { + $extras = implode(",", $extras); + } + $this->request("flickr.photos.recentlyUpdated", array("min_date"=>$min_date, "extras"=>$extras, "per_page"=>$per_page, "page"=>$page)); + return $this->parsed_response ? $this->parsed_response['photos'] : false; + } + + function photos_removeTag($tag_id) + { + /* http://www.flickr.com/services/api/flickr.photos.removeTag.html */ + $this->request("flickr.photos.removeTag", array("tag_id"=>$tag_id), TRUE); + return $this->parsed_response ? true : false; + } + + function photos_search($args) + { + /* This function strays from the method of arguments that I've + * used in the other functions for the fact that there are just + * so many arguments to this API method. What you'll need to do + * is pass an associative array to the function containing the + * arguments you want to pass to the API. For example: + * $photos = $f->photos_search(array("tags"=>"brown,cow", "tag_mode"=>"any")); + * This will return photos tagged with either "brown" or "cow" + * or both. See the API documentation (link below) for a full + * list of arguments. + */ + + /* http://www.flickr.com/services/api/flickr.photos.search.html */ + $this->request("flickr.photos.search", $args); + return $this->parsed_response ? $this->parsed_response['photos'] : false; + } + + function photos_setContentType ($photo_id, $content_type) { + /* http://www.flickr.com/services/api/flickr.photos.setContentType.html */ + return $this->call('flickr.photos.setContentType', array('photo_id' => $photo_id, 'content_type' => $content_type)); + } + + function photos_setDates($photo_id, $date_posted = NULL, $date_taken = NULL, $date_taken_granularity = NULL) + { + /* http://www.flickr.com/services/api/flickr.photos.setDates.html */ + $this->request("flickr.photos.setDates", array("photo_id"=>$photo_id, "date_posted"=>$date_posted, "date_taken"=>$date_taken, "date_taken_granularity"=>$date_taken_granularity), TRUE); + return $this->parsed_response ? true : false; + } + + function photos_setMeta($photo_id, $title, $description) + { + /* http://www.flickr.com/services/api/flickr.photos.setMeta.html */ + $this->request("flickr.photos.setMeta", array("photo_id"=>$photo_id, "title"=>$title, "description"=>$description), TRUE); + return $this->parsed_response ? true : false; + } + + function photos_setPerms($photo_id, $is_public, $is_friend, $is_family, $perm_comment, $perm_addmeta) + { + /* http://www.flickr.com/services/api/flickr.photos.setPerms.html */ + $this->request("flickr.photos.setPerms", array("photo_id"=>$photo_id, "is_public"=>$is_public, "is_friend"=>$is_friend, "is_family"=>$is_family, "perm_comment"=>$perm_comment, "perm_addmeta"=>$perm_addmeta), TRUE); + return $this->parsed_response ? true : false; + } + + function photos_setSafetyLevel ($photo_id, $safety_level, $hidden = null) { + /* http://www.flickr.com/services/api/flickr.photos.setSafetyLevel.html */ + return $this->call('flickr.photos.setSafetyLevel', array('photo_id' => $photo_id, 'safety_level' => $safety_level, 'hidden' => $hidden)); + } + + + function photos_setTags($photo_id, $tags) + { + /* http://www.flickr.com/services/api/flickr.photos.setTags.html */ + $this->request("flickr.photos.setTags", array("photo_id"=>$photo_id, "tags"=>$tags), TRUE); + return $this->parsed_response ? true : false; + } + + /* Photos - Comments Methods */ + function photos_comments_addComment($photo_id, $comment_text) { + /* http://www.flickr.com/services/api/flickr.photos.comments.addComment.html */ + $this->request("flickr.photos.comments.addComment", array("photo_id" => $photo_id, "comment_text"=>$comment_text), TRUE); + return $this->parsed_response ? $this->parsed_response['comment'] : false; + } + + function photos_comments_deleteComment($comment_id) { + /* http://www.flickr.com/services/api/flickr.photos.comments.deleteComment.html */ + $this->request("flickr.photos.comments.deleteComment", array("comment_id" => $comment_id), TRUE); + return $this->parsed_response ? true : false; + } + + function photos_comments_editComment($comment_id, $comment_text) { + /* http://www.flickr.com/services/api/flickr.photos.comments.editComment.html */ + $this->request("flickr.photos.comments.editComment", array("comment_id" => $comment_id, "comment_text"=>$comment_text), TRUE); + return $this->parsed_response ? true : false; + } + + function photos_comments_getList($photo_id) + { + /* http://www.flickr.com/services/api/flickr.photos.comments.getList.html */ + $this->request("flickr.photos.comments.getList", array("photo_id"=>$photo_id)); + return $this->parsed_response ? $this->parsed_response['comments'] : false; + } + + /* Photos - Geo Methods */ + function photos_geo_getLocation($photo_id) + { + /* http://www.flickr.com/services/api/flickr.photos.geo.getLocation.html */ + $this->request("flickr.photos.geo.getLocation", array("photo_id"=>$photo_id)); + return $this->parsed_response ? $this->parsed_response['photo'] : false; + } + + function photos_geo_getPerms($photo_id) + { + /* http://www.flickr.com/services/api/flickr.photos.geo.getPerms.html */ + $this->request("flickr.photos.geo.getPerms", array("photo_id"=>$photo_id)); + return $this->parsed_response ? $this->parsed_response['perms'] : false; + } + + function photos_geo_removeLocation($photo_id) + { + /* http://www.flickr.com/services/api/flickr.photos.geo.removeLocation.html */ + $this->request("flickr.photos.geo.removeLocation", array("photo_id"=>$photo_id), TRUE); + return $this->parsed_response ? true : false; + } + + function photos_geo_setLocation($photo_id, $lat, $lon, $accuracy = NULL) + { + /* http://www.flickr.com/services/api/flickr.photos.geo.setLocation.html */ + $this->request("flickr.photos.geo.setLocation", array("photo_id"=>$photo_id, "lat"=>$lat, "lon"=>$lon, "accuracy"=>$accuracy), TRUE); + return $this->parsed_response ? true : false; + } + + function photos_geo_setPerms($photo_id, $is_public, $is_contact, $is_friend, $is_family) + { + /* http://www.flickr.com/services/api/flickr.photos.geo.setPerms.html */ + $this->request("flickr.photos.geo.setPerms", array("photo_id"=>$photo_id, "is_public"=>$is_public, "is_contact"=>$is_contact, "is_friend"=>$is_friend, "is_family"=>$is_family), TRUE); + return $this->parsed_response ? true : false; + } + + /* Photos - Licenses Methods */ + function photos_licenses_getInfo() + { + /* http://www.flickr.com/services/api/flickr.photos.licenses.getInfo.html */ + $this->request("flickr.photos.licenses.getInfo"); + return $this->parsed_response ? $this->parsed_response['licenses']['license'] : false; + } + + function photos_licenses_setLicense($photo_id, $license_id) + { + /* http://www.flickr.com/services/api/flickr.photos.licenses.setLicense.html */ + /* Requires Authentication */ + $this->request("flickr.photos.licenses.setLicense", array("photo_id"=>$photo_id, "license_id"=>$license_id), TRUE); + return $this->parsed_response ? true : false; + } + + /* Photos - Notes Methods */ + function photos_notes_add($photo_id, $note_x, $note_y, $note_w, $note_h, $note_text) + { + /* http://www.flickr.com/services/api/flickr.photos.notes.add.html */ + $this->request("flickr.photos.notes.add", array("photo_id" => $photo_id, "note_x" => $note_x, "note_y" => $note_y, "note_w" => $note_w, "note_h" => $note_h, "note_text" => $note_text), TRUE); + return $this->parsed_response ? $this->parsed_response['note'] : false; + } + + function photos_notes_delete($note_id) + { + /* http://www.flickr.com/services/api/flickr.photos.notes.delete.html */ + $this->request("flickr.photos.notes.delete", array("note_id" => $note_id), TRUE); + return $this->parsed_response ? true : false; + } + + function photos_notes_edit($note_id, $note_x, $note_y, $note_w, $note_h, $note_text) + { + /* http://www.flickr.com/services/api/flickr.photos.notes.edit.html */ + $this->request("flickr.photos.notes.edit", array("note_id" => $note_id, "note_x" => $note_x, "note_y" => $note_y, "note_w" => $note_w, "note_h" => $note_h, "note_text" => $note_text), TRUE); + return $this->parsed_response ? true : false; + } + + /* Photos - Transform Methods */ + function photos_transform_rotate($photo_id, $degrees) + { + /* http://www.flickr.com/services/api/flickr.photos.transform.rotate.html */ + $this->request("flickr.photos.transform.rotate", array("photo_id" => $photo_id, "degrees" => $degrees), TRUE); + return $this->parsed_response ? true : false; + } + + /* Photos - Upload Methods */ + function photos_upload_checkTickets($tickets) + { + /* http://www.flickr.com/services/api/flickr.photos.upload.checkTickets.html */ + if (is_array($tickets)) { + $tickets = implode(",", $tickets); + } + $this->request("flickr.photos.upload.checkTickets", array("tickets" => $tickets), TRUE); + return $this->parsed_response ? $this->parsed_response['uploader']['ticket'] : false; + } + + /* Photosets Methods */ + function photosets_addPhoto($photoset_id, $photo_id) + { + /* http://www.flickr.com/services/api/flickr.photosets.addPhoto.html */ + $this->request("flickr.photosets.addPhoto", array("photoset_id" => $photoset_id, "photo_id" => $photo_id), TRUE); + return $this->parsed_response ? true : false; + } + + function photosets_create($title, $description, $primary_photo_id) + { + /* http://www.flickr.com/services/api/flickr.photosets.create.html */ + $this->request("flickr.photosets.create", array("title" => $title, "primary_photo_id" => $primary_photo_id, "description" => $description), TRUE); + return $this->parsed_response ? $this->parsed_response['photoset'] : false; + } + + function photosets_delete($photoset_id) + { + /* http://www.flickr.com/services/api/flickr.photosets.delete.html */ + $this->request("flickr.photosets.delete", array("photoset_id" => $photoset_id), TRUE); + return $this->parsed_response ? true : false; + } + + function photosets_editMeta($photoset_id, $title, $description = NULL) + { + /* http://www.flickr.com/services/api/flickr.photosets.editMeta.html */ + $this->request("flickr.photosets.editMeta", array("photoset_id" => $photoset_id, "title" => $title, "description" => $description), TRUE); + return $this->parsed_response ? true : false; + } + + function photosets_editPhotos($photoset_id, $primary_photo_id, $photo_ids) + { + /* http://www.flickr.com/services/api/flickr.photosets.editPhotos.html */ + $this->request("flickr.photosets.editPhotos", array("photoset_id" => $photoset_id, "primary_photo_id" => $primary_photo_id, "photo_ids" => $photo_ids), TRUE); + return $this->parsed_response ? true : false; + } + + function photosets_getContext($photo_id, $photoset_id) + { + /* http://www.flickr.com/services/api/flickr.photosets.getContext.html */ + $this->request("flickr.photosets.getContext", array("photo_id" => $photo_id, "photoset_id" => $photoset_id)); + return $this->parsed_response ? $this->parsed_response : false; + } + + function photosets_getInfo($photoset_id) + { + /* http://www.flickr.com/services/api/flickr.photosets.getInfo.html */ + $this->request("flickr.photosets.getInfo", array("photoset_id" => $photoset_id)); + return $this->parsed_response ? $this->parsed_response['photoset'] : false; + } + + function photosets_getList($user_id = NULL) + { + /* http://www.flickr.com/services/api/flickr.photosets.getList.html */ + $this->request("flickr.photosets.getList", array("user_id" => $user_id)); + return $this->parsed_response ? $this->parsed_response['photosets'] : false; + } + + function photosets_getPhotos($photoset_id, $extras = NULL, $privacy_filter = NULL, $per_page = NULL, $page = NULL) + { + /* http://www.flickr.com/services/api/flickr.photosets.getPhotos.html */ + $this->request("flickr.photosets.getPhotos", array("photoset_id" => $photoset_id, "extras" => $extras, "privacy_filter" => $privacy_filter, "per_page" => $per_page, "page" => $page)); + return $this->parsed_response ? $this->parsed_response['photoset'] : false; + } + + function photosets_orderSets($photoset_ids) + { + /* http://www.flickr.com/services/api/flickr.photosets.orderSets.html */ + if (is_array($photoset_ids)) { + $photoset_ids = implode(",", $photoset_ids); + } + $this->request("flickr.photosets.orderSets", array("photoset_ids" => $photoset_ids), TRUE); + return $this->parsed_response ? true : false; + } + + function photosets_removePhoto($photoset_id, $photo_id) + { + /* http://www.flickr.com/services/api/flickr.photosets.removePhoto.html */ + $this->request("flickr.photosets.removePhoto", array("photoset_id" => $photoset_id, "photo_id" => $photo_id), TRUE); + return $this->parsed_response ? true : false; + } + + /* Photosets Comments Methods */ + function photosets_comments_addComment($photoset_id, $comment_text) { + /* http://www.flickr.com/services/api/flickr.photosets.comments.addComment.html */ + $this->request("flickr.photosets.comments.addComment", array("photoset_id" => $photoset_id, "comment_text"=>$comment_text), TRUE); + return $this->parsed_response ? $this->parsed_response['comment'] : false; + } + + function photosets_comments_deleteComment($comment_id) { + /* http://www.flickr.com/services/api/flickr.photosets.comments.deleteComment.html */ + $this->request("flickr.photosets.comments.deleteComment", array("comment_id" => $comment_id), TRUE); + return $this->parsed_response ? true : false; + } + + function photosets_comments_editComment($comment_id, $comment_text) { + /* http://www.flickr.com/services/api/flickr.photosets.comments.editComment.html */ + $this->request("flickr.photosets.comments.editComment", array("comment_id" => $comment_id, "comment_text"=>$comment_text), TRUE); + return $this->parsed_response ? true : false; + } + + function photosets_comments_getList($photoset_id) + { + /* http://www.flickr.com/services/api/flickr.photosets.comments.getList.html */ + $this->request("flickr.photosets.comments.getList", array("photoset_id"=>$photoset_id)); + return $this->parsed_response ? $this->parsed_response['comments'] : false; + } + + /* Places Methods */ + function places_resolvePlaceId ($place_id) { + /* http://www.flickr.com/services/api/flickr.places.resolvePlaceId.html */ + $rsp = $this->call('flickr.places.resolvePlaceId', array('place_id' => $place_id)); + return $rsp ? $rsp['location'] : $rsp; + } + + function places_resolvePlaceURL ($url) { + /* http://www.flickr.com/services/api/flickr.places.resolvePlaceURL.html */ + $rsp = $this->call('flickr.places.resolvePlaceURL', array('url' => $url)); + return $rsp ? $rsp['location'] : $rsp; + } + + /* Prefs Methods */ + function prefs_getContentType () { + /* http://www.flickr.com/services/api/flickr.prefs.getContentType.html */ + $rsp = $this->call('flickr.prefs.getContentType', array()); + return $rsp ? $rsp['person'] : $rsp; + } + + function prefs_getHidden () { + /* http://www.flickr.com/services/api/flickr.prefs.getHidden.html */ + $rsp = $this->call('flickr.prefs.getHidden', array()); + return $rsp ? $rsp['person'] : $rsp; + } + + function prefs_getPrivacy () { + /* http://www.flickr.com/services/api/flickr.prefs.getPrivacy.html */ + $rsp = $this->call('flickr.prefs.getPrivacy', array()); + return $rsp ? $rsp['person'] : $rsp; + } + + function prefs_getSafetyLevel () { + /* http://www.flickr.com/services/api/flickr.prefs.getSafetyLevel.html */ + $rsp = $this->call('flickr.prefs.getSafetyLevel', array()); + return $rsp ? $rsp['person'] : $rsp; + } + + /* Reflection Methods */ + function reflection_getMethodInfo($method_name) + { + /* http://www.flickr.com/services/api/flickr.reflection.getMethodInfo.html */ + $this->request("flickr.reflection.getMethodInfo", array("method_name" => $method_name)); + return $this->parsed_response ? $this->parsed_response : false; + } + + function reflection_getMethods() + { + /* http://www.flickr.com/services/api/flickr.reflection.getMethods.html */ + $this->request("flickr.reflection.getMethods"); + return $this->parsed_response ? $this->parsed_response['methods']['method'] : false; + } + + /* Tags Methods */ + function tags_getHotList($period = NULL, $count = NULL) + { + /* http://www.flickr.com/services/api/flickr.tags.getHotList.html */ + $this->request("flickr.tags.getHotList", array("period" => $period, "count" => $count)); + return $this->parsed_response ? $this->parsed_response['hottags'] : false; + } + + function tags_getListPhoto($photo_id) + { + /* http://www.flickr.com/services/api/flickr.tags.getListPhoto.html */ + $this->request("flickr.tags.getListPhoto", array("photo_id" => $photo_id)); + return $this->parsed_response ? $this->parsed_response['photo']['tags']['tag'] : false; + } + + function tags_getListUser($user_id = NULL) + { + /* http://www.flickr.com/services/api/flickr.tags.getListUser.html */ + $this->request("flickr.tags.getListUser", array("user_id" => $user_id)); + return $this->parsed_response ? $this->parsed_response['who']['tags']['tag'] : false; + } + + function tags_getListUserPopular($user_id = NULL, $count = NULL) + { + /* http://www.flickr.com/services/api/flickr.tags.getListUserPopular.html */ + $this->request("flickr.tags.getListUserPopular", array("user_id" => $user_id, "count" => $count)); + return $this->parsed_response ? $this->parsed_response['who']['tags']['tag'] : false; + } + + function tags_getListUserRaw($tag) + { + /* http://www.flickr.com/services/api/flickr.tags.getListUserRaw.html */ + $this->request("flickr.tags.getListUserRaw", array("tag" => $tag)); + return $this->parsed_response ? $this->parsed_response['who']['tags']['tag'][0]['raw'] : false; + } + + function tags_getRelated($tag) + { + /* http://www.flickr.com/services/api/flickr.tags.getRelated.html */ + $this->request("flickr.tags.getRelated", array("tag" => $tag)); + return $this->parsed_response ? $this->parsed_response['tags'] : false; + } + + function test_echo($args = array()) + { + /* http://www.flickr.com/services/api/flickr.test.echo.html */ + $this->request("flickr.test.echo", $args); + return $this->parsed_response ? $this->parsed_response : false; + } + + function test_login() + { + /* http://www.flickr.com/services/api/flickr.test.login.html */ + $this->request("flickr.test.login"); + return $this->parsed_response ? $this->parsed_response['user'] : false; + } + + function urls_getGroup($group_id) + { + /* http://www.flickr.com/services/api/flickr.urls.getGroup.html */ + $this->request("flickr.urls.getGroup", array("group_id"=>$group_id)); + return $this->parsed_response ? $this->parsed_response['group']['url'] : false; + } + + function urls_getUserPhotos($user_id = NULL) + { + /* http://www.flickr.com/services/api/flickr.urls.getUserPhotos.html */ + $this->request("flickr.urls.getUserPhotos", array("user_id"=>$user_id)); + return $this->parsed_response ? $this->parsed_response['user']['url'] : false; + } + + function urls_getUserProfile($user_id = NULL) + { + /* http://www.flickr.com/services/api/flickr.urls.getUserProfile.html */ + $this->request("flickr.urls.getUserProfile", array("user_id"=>$user_id)); + return $this->parsed_response ? $this->parsed_response['user']['url'] : false; + } + + function urls_lookupGroup($url) + { + /* http://www.flickr.com/services/api/flickr.urls.lookupGroup.html */ + $this->request("flickr.urls.lookupGroup", array("url"=>$url)); + return $this->parsed_response ? $this->parsed_response['group'] : false; + } + + function urls_lookupUser($url) + { + /* http://www.flickr.com/services/api/flickr.photos.notes.edit.html */ + $this->request("flickr.urls.lookupUser", array("url"=>$url)); + return $this->parsed_response ? $this->parsed_response['user'] : false; + } +} + + +?>