123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818 |
- <?php //$Id: agenda.inc.php 22324 2009-07-23 17:44:22Z cfasanando $
- /* For licensing terms, see /dokeos_license.txt */
- /*
- ==============================================================================
- @author: Patrick Cool, patrick.cool@UGent.be
- @version: 1.1
- @todo: synchronisation with the function in myagenda.php (for instance: using one function for the mini_calendar
- ==============================================================================
- Large parts of the code are recycled from the old agenda tool, but I
- reworked it and cleaned the code to make it more readable. The code for
- the small calender on the left is taken from the My Agenda tool.
- Reabability is also the reason why I use the if ($is_allowed_to_edit)
- check for each part of the code. I'm aware that is duplication, but
- it makes the code much easier to read.
- ==============================================================================
- */
- /*
- -----------------------------------------------------------
- Constants and variables
- -----------------------------------------------------------
- */
- // the variables for the days and the months
- // Defining the shorts for the days
- $DaysShort = api_get_week_days_short();
- // Defining the days of the week to allow translation of the days
- $DaysLong = api_get_week_days_long();
- // Defining the months of the year to allow translation of the months
- $MonthsLong = api_get_months_long();
- /*
- ==============================================================================
- FUNCTIONS
- ==============================================================================
- */
- /**
- * Retrieves all the agenda items from the table
- * @author: Patrick Cool <patrick.cool@UGent.be>, Ghent University
- * @author Yannick Warnier <yannick.warnier@dokeos.com> - cleanup
- * @param integer $month: the integer value of the month we are viewing
- * @param integer $year: the 4-digit year indication e.g. 2005
- * @return array
- */
- function get_calendar_items($month, $year)
- {
- global $_user, $_course;
- global $is_allowed_to_edit;
- global $select_month, $select_year;
- $month=Database::escape_string($month);
- $year=Database::escape_string($year);
- // database variables
- $TABLEAGENDA=Database::get_course_table(TABLE_AGENDA);
- $TABLE_ITEM_PROPERTY=Database::get_course_table(TABLE_ITEM_PROPERTY);
- $month_first_day = mktime(0,0,0,$month,1,$year);
- $month_last_day = mktime(0,0,0,$month+1,1,$year)-1;
- if($month==12)
- {
- $month_last_day = mktime(0,0,0,1,1,$year+1)-1;
- }
- $group_memberships=GroupManager::get_group_ids($_course['dbName'], $_user['user_id']);
- $repeats = array();
- $session_condition = intval($_SESSION['id_session'])==0 ? '' : ' AND agenda.session_id IN (0,'.intval($_SESSION['id_session']).') ';
- /*--------------------------------------------------
- CONSTRUCT THE SQL STATEMENT
- --------------------------------------------------*/
- $start = 0;
- $stop = 0;
- // this is to make a difference between showing everything (all months) or only the current month)
- // $show_all_current is a part of the sql statement
- if ($_SESSION['show']!=="showall")
- {
- $show_all_current=" AND MONTH(start_date)=$select_month AND year(start_date)=$select_year";
- $start = mktime(0,0,0,$select_month,1,$select_year);
- $stop = 0;
- if(empty($select_year)){$select_year = date('Y');}
- if(empty($select_month)){$select_month = date('m');}
- if($select_month==12)
- {
- $stop = mktime(0,0,0,1,1,$select_year+1)-1;
- }
- else
- {
- $stop = mktime(0,0,0,$select_month+1,1,$select_year)-1;
- }
- }
- else
- {
- $show_all_current="";
- $start = time();
- $stop = mktime(0,0,0,1,1,2038);//by default, set year to maximum for mktime()
- }
- // by default we use the id of the current user. The course administrator can see the agenda of other users by using the user / group filter
- $user_id=$_user['user_id'];
- if ($_SESSION['user']!==null)
- {
- $user_id=intval($_SESSION['user']);
- }
- if ($_SESSION['group']!==null)
- {
- $group_id=intval($_SESSION['group']);
- }
- if ($_SESSION['toolgroup']!==null)
- {
- $group_id=intval($_SESSION['toolgroup']);
- }
- $repeats = array(); //placeholder for repeated events
- //echo "user:".$_SESSION['user']."group: ".$_SESSION['group'];
- // A. you are a course admin
- //if ($is_courseAdmin)
- $session_condition = intval($_SESSION['id_session'])==0 ? '' : ' AND agenda.session_id IN (0,'.intval($_SESSION['id_session']).') ';
- if (api_is_allowed_to_edit(false,true) OR (api_get_course_setting('allow_user_edit_agenda') && !api_is_anonymous()))
- {
- // A.1. you are a course admin with a USER filter
- // => see only the messages of this specific user + the messages of the group (s)he is member of.
- if (!empty($_SESSION['user']))
- {
- $group_memberships=GroupManager::get_group_ids($_course['dbName'],$_SESSION['user']);
- if (is_array($group_memberships) && count($group_memberships)>0)
- {
- $sql="SELECT
- agenda.*, toolitemproperties.*
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." toolitemproperties
- WHERE agenda.id = toolitemproperties.ref ".$show_all_current."
- AND toolitemproperties.tool='".TOOL_CALENDAR_EVENT."'
- AND ( toolitemproperties.to_user_id=$user_id OR toolitemproperties.to_group_id IN (0, ".implode(", ", $group_memberships).") )
- AND toolitemproperties.visibility='1'
- $session_condition
- ORDER BY start_date ".$_SESSION['sort'];
- }
- else
- {
- $sql="SELECT
- agenda.*, toolitemproperties.*
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." toolitemproperties
- WHERE agenda.id = toolitemproperties.ref ".$show_all_current."
- AND toolitemproperties.tool='".TOOL_CALENDAR_EVENT."'
- AND ( toolitemproperties.to_user_id=$user_id OR toolitemproperties.to_group_id='0')
- AND toolitemproperties.visibility='1'
- $session_condition
- ORDER BY start_date ".$_SESSION['sort'];
- }
- }
- // A.2. you are a course admin with a GROUP filter
- // => see only the messages of this specific group
- elseif (!empty($_SESSION['group']))
- {
- $sql="SELECT
- agenda.*, toolitemproperties.*
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." toolitemproperties
- WHERE agenda.id = toolitemproperties.ref ".$show_all_current."
- AND toolitemproperties.tool='".TOOL_CALENDAR_EVENT."'
- AND ( toolitemproperties.to_group_id=$group_id OR toolitemproperties.to_group_id='0')
- AND toolitemproperties.visibility='1'
- $session_condition
- GROUP BY toolitemproperties.ref
- ORDER BY start_date ".$_SESSION['sort'];
- }
- // A.3 you are a course admin without any group or user filter
- else
- {
- // A.3.a you are a course admin without user or group filter but WITH studentview
- // => see all the messages of all the users and groups without editing possibilities
- if ($_GET['isStudentView']=='true')
- {
- $sql="SELECT
- agenda.*, toolitemproperties.*
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." toolitemproperties
- WHERE agenda.id = toolitemproperties.ref ".$show_all_current."
- AND toolitemproperties.tool='".TOOL_CALENDAR_EVENT."'
- AND toolitemproperties.visibility='1'
- $session_condition
- GROUP BY toolitemproperties.ref
- ORDER BY start_date ".$_SESSION['sort'];
- }
- // A.3.b you are a course admin without user or group filter and WITHOUT studentview (= the normal course admin view)
- // => see all the messages of all the users and groups with editing possibilities
- else
- {
- $sql="SELECT
- agenda.*, toolitemproperties.*
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." toolitemproperties
- WHERE agenda.id = toolitemproperties.ref ".$show_all_current."
- AND toolitemproperties.tool='".TOOL_CALENDAR_EVENT."'
- AND ( toolitemproperties.visibility='0' or toolitemproperties.visibility='1')
- $session_condition
- GROUP BY toolitemproperties.ref
- ORDER BY start_date ".$_SESSION['sort'];
- }
- }
- } //if (is_allowed_to_edit() OR( api_get_course_setting('allow_user_edit_agenda') && !api_is_anonymous()))
- // B. you are a student
- else
- {
- if (is_array($group_memberships) and count($group_memberships)>0)
- {
- $sql="SELECT
- agenda.*, toolitemproperties.*
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." toolitemproperties
- WHERE agenda.id = toolitemproperties.ref ".$show_all_current."
- AND toolitemproperties.tool='".TOOL_CALENDAR_EVENT."'
- AND ( toolitemproperties.to_user_id=$user_id OR toolitemproperties.to_group_id IN (0, ".implode(", ", $group_memberships).") )
- AND toolitemproperties.visibility='1'
- $session_condition
- ORDER BY start_date ".$_SESSION['sort'];
- }
- else
- {
- if ($_user['user_id'])
- {
- $sql="SELECT
- agenda.*, toolitemproperties.*
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." toolitemproperties
- WHERE agenda.id = toolitemproperties.ref ".$show_all_current."
- AND toolitemproperties.tool='".TOOL_CALENDAR_EVENT."'
- AND ( toolitemproperties.to_user_id=$user_id OR toolitemproperties.to_group_id='0')
- AND toolitemproperties.visibility='1'
- $session_condition
- ORDER BY start_date ".$_SESSION['sort'];
- }
- else
- {
- $sql="SELECT
- agenda.*, toolitemproperties.*
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." toolitemproperties
- WHERE agenda.id = toolitemproperties.ref ".$show_all_current."
- AND toolitemproperties.tool='".TOOL_CALENDAR_EVENT."'
- AND toolitemproperties.to_group_id='0'
- AND toolitemproperties.visibility='1'
- $session_condition
- ORDER BY start_date ".$_SESSION['sort'];
- }
- }
- } // you are a student
- //echo "<pre>".$sql."</pre>";
- $result=Database::query($sql,__FILE__,__LINE__) or die(Database::error());
- /////////////////
- $data=array();
- while ($row=Database::fetch_array($result))
- {
- $datum_item=(int)substr($row["start_date"],8,2);
- $data[$datum_item][intval($datum_item)][] = $row;
- }
- return $data;
- }
- /**
- * show the mini calender of the given month
- * @author: Patrick Cool <patrick.cool@UGent.be>, Ghent University
- * @param array an array containing all the agenda items for the given month
- * @param integer $month: the integer value of the month we are viewing
- * @param integer $year: the 4-digit year indication e.g. 2005
- * @param string $monthName: the language variable for the mont name
- * @return html code
- * @todo refactor this so that $monthName is no longer needed as a parameter
- */
- function display_minimonthcalendar($agendaitems, $month, $year, $monthName)
- {
- global $DaysShort;
- //Handle leap year
- $numberofdays = array (0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
- if (($year % 400 == 0) or ($year % 4 == 0 and $year % 100 <> 0))
- $numberofdays[2] = 29;
- //Get the first day of the month
- $dayone = getdate(mktime(0, 0, 0, $month, 1, $year));
- //Start the week on monday
- $startdayofweek = $dayone['wday'] <> 0 ? ($dayone['wday'] - 1) : 6;
- $backwardsURL = api_get_self()."?".api_get_cidreq()."&coursePath=".(empty($_GET['coursePath'])?'':Security::remove_XSS($_GET['coursePath']))."&courseCode=".(empty($_GET['courseCode'])?'':Security::remove_XSS($_GET['courseCode']))."&month=". ($month == 1 ? 12 : $month -1)."&year=". ($month == 1 ? $year -1 : $year);
- $forewardsURL = api_get_self()."?".api_get_cidreq()."&coursePath=".(empty($_GET['coursePath'])?'':Security::remove_XSS($_GET['coursePath']))."&courseCode=".(empty($_GET['courseCode'])?'':Security::remove_XSS($_GET['courseCode']))."&month=". ($month == 12 ? 1 : $month +1)."&year=". ($month == 12 ? $year +1 : $year);
- echo "<table class=\"data_table\">\n",
- "<tr>\n",
- "<th width=\"10%\"><a href=\"", $backwardsURL, "\"> « </a></th>\n",
- "<th width=\"80%\" colspan=\"5\">", $monthName, " ", $year, "</th>\n",
- "<th width=\"10%\"><a href=\"", $forewardsURL, "\"> » </a></th>\n", "</tr>\n";
- echo "<tr>\n";
- for ($ii = 1; $ii < 8; $ii ++)
- {
- echo "<td class=\"weekdays\">", $DaysShort[$ii % 7], "</td>\n";
- }
- echo "</tr>\n";
- $curday = -1;
- $today = getdate();
- while ($curday <= $numberofdays[$month])
- {
- echo "<tr>\n";
- for ($ii = 0; $ii < 7; $ii ++)
- {
- if (($curday == -1) && ($ii == $startdayofweek))
- {
- $curday = 1;
- }
- if (($curday > 0) && ($curday <= $numberofdays[$month]))
- {
- $bgcolor = $ii < 5 ? $class="class=\"days_week\"" : $class="class=\"days_weekend\"";
- $dayheader = "$curday";
- if (($curday == $today['mday']) && ($year == $today['year']) && ($month == $today['mon']))
- {
- $dayheader = "$curday";
- $class = "class=\"days_today\"";
- }
- echo "\t<td ".$class.">";
- if (!empty($agendaitems[$curday]))
- {
- $month_curday = array();
- $items_curday = $agendaitems[$curday][$curday];
- foreach ($items_curday as $item_curday) {
- $start_date_item = $item_curday['start_date'];
- $month_item = (int)substr($start_date_item,5,2);
- if($month == $month_item) {
- $month_curday[] = $item_curday['start_date'];
- }
- }
- if (!empty($month_curday)) {
- echo "<a href=\"".api_get_self()."?".api_get_cidreq()."&sort=asc&toolgroup=".Security::remove_XSS($_GET['toolgroup'])."&action=view&view=day&day=".$curday."&month=".$month."&year=".$year."#".$curday."\">".$dayheader."</a>";
- } else {
- echo $dayheader;
- }
- }
- else
- {
- echo $dayheader;
- }
- // "a".$dayheader." <span class=\"agendaitem\">".$agendaitems[$curday]."</span>\n";
- echo "</td>\n";
- $curday ++;
- }
- else
- {
- echo "<td> </td>\n";
- }
- }
- echo "</tr>\n";
- }
- echo "</table>\n";
- }
- /**
- * show the calender of the given month
- * @author: Patrick Cool <patrick.cool@UGent.be>, Ghent University
- * @param integer $month: the integer value of the month we are viewing
- * @param integer $year: the 4-digit year indication e.g. 2005
- * @return html code
- */
- function display_monthcalendar($month, $year)
- {
- global $MonthsLong;
- global $DaysShort;
- global $origin;
- // grabbing all the calendar items for this year and storing it in a array
- $data=get_calendar_items($month,$year);
- // $data_global=get_global_calendar_items($month,$year);
- // $data_global=get_global_agenda_items($agendaitems, $day, $month, $year, $week, $type);
- //Handle leap year
- $numberofdays = array(0,31,28,31,30,31,30,31,31,30,31,30,31);
- if (($year%400 == 0) or ($year%4==0 and $year%100<>0)) $numberofdays[2] = 29;
- //Get the first day of the month
- $dayone = getdate(mktime(0,0,0,$month,1,$year));
- //Start the week on monday
- $startdayofweek = $dayone['wday']<>0 ? ($dayone['wday']-1) : 6;
- $backwardsURL = api_get_self()."?".api_get_cidreq()."&origin=$origin&month=".($month==1 ? 12 : $month-1)."&year=".($month==1 ? $year-1 : $year);
- $forewardsURL = api_get_self()."?".api_get_cidreq()."&origin=$origin&month=".($month==12 ? 1 : $month+1)."&year=".($month==12 ? $year+1 : $year);
- $maand_array_maandnummer=$month-1;
- echo "<table class=\"data_table\">\n",
- "<tr>\n",
- "<th width=\"10%\"><a href=\"",$backwardsURL,"\"> « </a></th>\n",
- "<th width=\"80%\" colspan=\"5\">",$MonthsLong[$maand_array_maandnummer]," ",$year,"</th>\n",
- "<th width=\"10%\"><a href=\"",$forewardsURL,"\"> » </a></th>\n",
- "</tr>\n";
- echo "<tr>\n";
- for ($ii=1;$ii<8; $ii++)
- {
- echo "<td class=\"weekdays\" width=\"14%\">",$DaysShort[$ii%7],"</td>\n";
- }
- echo "</tr>\n";
- $curday = -1;
- $today = getdate();
- while ($curday <=$numberofdays[$month])
- {
- echo "<tr>\n";
- for ($ii=0; $ii<7; $ii++)
- {
- if (($curday == -1)&&($ii==$startdayofweek))
- {
- $curday = 1;
- }
- if (($curday>0)&&($curday<=$numberofdays[$month]))
- {
- $bgcolor = $ii<5 ? "class=\"row_odd\"" : "class=\"row_even\"";
- $dayheader = "$curday";
- if (key_exists($curday,$data)) {
- $dayheader="<a href='".api_get_self()."?".api_get_cidreq()."&sort=asc&toolgroup=".Security::remove_XSS($_GET['toolgroup'])."&view=list&origin=$origin&month=$month&year=$year&day=$curday#$curday'>".$curday."</a>";
- foreach ($data[$curday] as $key=>$agenda_item)
- {
- foreach ($agenda_item as $key=>$value) {
- $month_start_date = (int)substr($value['start_date'],5,2);
- if ($month == $month_start_date) {
- $start_time= date("H:i",strtotime($value['start_date']));
- $end_time= date("H:i",strtotime($value['end_date']));
- if ($value['end_date']=='0000-00-00 00:00:00'){
- $dayheader .= '<br />'.get_lang("Work").'<br />';
- $dayheader .= $value['title'];
- $dayheader .= '<br/>';
- } else {
- $dayheader .= '<br />'.get_lang("StartTimeWindow").' <i>'.$start_time.'</i> - '.get_lang("EndTimeWindow").' <i>'.$end_time.' </i>';
- $dayheader .= '<br />';
- $dayheader .= $value['title'];
- $dayheader .= '<br/>';
- }
- }
- //$agendaitems = get_global_agenda_items($agendaitems, $curday, $month, $year, $startdayofweek, "month_view");
- //echo $agendaitems['title'];
- }
- }
- }
- if (($curday==$today['mday'])&&($year ==$today['year'])&&($month == $today['mon']))
- {
- echo "<td id=\"today\" ",$bgcolor,"\">".$dayheader." \n";
- }
- else
- {
- echo "<td id=\"days\" ",$bgcolor,"\">".$dayheader." \n";
- }
- echo "</td>\n";
- $curday++;
- }
- else
- {
- echo "<td> </td>";
- }
- }
- echo "</tr>";
- }
- echo "</table>";
- }
- /**
- * returns all the javascript that is required for easily selecting the target people/groups this goes into the $htmlHeadXtra[] array
- * @author: Patrick Cool <patrick.cool@UGent.be>, Ghent University
- * @return javascript code
- */
- function to_javascript()
- {
- $Send2All=get_lang("Send2All");
- return "<script type=\"text/javascript\" language=\"JavaScript\">
- <!-- Begin javascript menu swapper
- function move(fbox, tbox)
- {
- var arrFbox = new Array();
- var arrTbox = new Array();
- var arrLookup = new Array();
- var i;
- for (i = 0; i < tbox.options.length; i++)
- {
- arrLookup[tbox.options[i].text] = tbox.options[i].value;
- arrTbox[i] = tbox.options[i].text;
- }
- var fLength = 0;
- var tLength = arrTbox.length;
- for(i = 0; i < fbox.options.length; i++)
- {
- arrLookup[fbox.options[i].text] = fbox.options[i].value;
- if (fbox.options[i].selected && fbox.options[i].value != \"\")
- {
- arrTbox[tLength] = fbox.options[i].text;
- tLength++;
- }
- else
- {
- arrFbox[fLength] = fbox.options[i].text;
- fLength++;
- }
- }
- //arrFbox.sort();
- //arrTbox.sort()
- var arrFboxGroup = new Array();
- var arrFboxUser = new Array();
- var prefix_x;
- for (x = 0; x < arrFbox.length; x++) {
- prefix_x = arrFbox[x].substring(0,2);
- if (prefix_x == 'G:') {
- arrFboxGroup.push(arrFbox[x]);
- } else {
- arrFboxUser.push(arrFbox[x]);
- }
- }
- arrFboxGroup.sort();
- arrFboxUser.sort();
- arrFbox = arrFboxGroup.concat(arrFboxUser);
- var arrTboxGroup = new Array();
- var arrTboxUser = new Array();
- var prefix_y;
- for (y = 0; y < arrTbox.length; y++) {
- prefix_y = arrTbox[y].substring(0,2);
- if (prefix_y == 'G:') {
- arrTboxGroup.push(arrTbox[y]);
- } else {
- arrTboxUser.push(arrTbox[y]);
- }
- }
- arrTboxGroup.sort();
- arrTboxUser.sort();
- arrTbox = arrTboxGroup.concat(arrTboxUser);
- fbox.length = 0;
- tbox.length = 0;
- var c;
- for(c = 0; c < arrFbox.length; c++)
- {
- var no = new Option();
- no.value = arrLookup[arrFbox[c]];
- no.text = arrFbox[c];
- fbox[c] = no;
- }
- for(c = 0; c < arrTbox.length; c++)
- {
- var no = new Option();
- no.value = arrLookup[arrTbox[c]];
- no.text = arrTbox[c];
- tbox[c] = no;
- }
- }
- function checkDate(month, day, year)
- {
- var monthLength =
- new Array(31,28,31,30,31,30,31,31,30,31,30,31);
- if (!day || !month || !year)
- return false;
- // check for bisestile year
- if (year/4 == parseInt(year/4))
- monthLength[1] = 29;
- if (month < 1 || month > 12)
- return false;
- if (day > monthLength[month-1])
- return false;
- return true;
- }
- function mktime()
- {
- var no, ma = 0, mb = 0, i = 0, d = new Date(), argv = arguments, argc = argv.length;
- d.setHours(0,0,0); d.setDate(1); d.setMonth(1); d.setYear(1972);
- var dateManip = {
- 0: function(tt){ return d.setHours(tt); },
- 1: function(tt){ return d.setMinutes(tt); },
- 2: function(tt){ set = d.setSeconds(tt); mb = d.getDate() - 1; return set; },
- 3: function(tt){ set = d.setMonth(parseInt(tt)-1); ma = d.getFullYear() - 1972; return set; },
- 4: function(tt){ return d.setDate(tt+mb); },
- 5: function(tt){ return d.setYear(tt+ma); }
- };
- for( i = 0; i < argc; i++ ){
- no = parseInt(argv[i]*1);
- if (isNaN(no)) {
- return false;
- } else {
- // arg is number, lets manipulate date object
- if(!dateManip[i](no)){
- // failed
- return false;
- }
- }
- }
- return Math.floor(d.getTime()/1000);
- }
- function validate()
- {
- var f = document.new_calendar_item;
- f.submit();
- return true;
- }
- function selectAll(cbList,bSelect,showwarning)
- {
- var start_day = document.new_calendar_item.fday.value;
- var start_month = document.new_calendar_item.fmonth.value;
- var start_year = document.new_calendar_item.fyear.value;
- var start_hour = document.new_calendar_item.fhour.value;
- var start_minute = document.new_calendar_item.fminute.value;
- var start_date = mktime(start_hour,start_minute,0,start_month,start_day,start_year)
- var ends_day = document.new_calendar_item.end_fday.value;
- var ends_month = document.new_calendar_item.end_fmonth.value;
- var ends_year = document.new_calendar_item.end_fyear.value;
- var ends_hour = document.new_calendar_item.end_fhour.value;
- var ends_minute = document.new_calendar_item.end_fminute.value;
- var ends_date = mktime(ends_hour,ends_minute,0,ends_month,ends_day,ends_year)
- msg_err1 = document.getElementById(\"err_date\");
- msg_err2 = document.getElementById(\"err_start_date\");
- msg_err3 = document.getElementById(\"err_end_date\");
- msg_err4 = document.getElementById(\"err_title\");
-
- if (start_date > ends_date) {
- msg_err1.style.display =\"block\";
- msg_err1.innerHTML=\"".get_lang('EndDateCannotBeBeforeTheStartDate')."\";
- msg_err2.innerHTML=\"\";msg_err3.innerHTML=\"\";
- } else if (checkDate(start_month,start_day,start_year) == false) {
- msg_err2.style.display =\"block\";
- msg_err2.innerHTML=\"".get_lang('InvalidDate')."\";
- msg_err1.innerHTML=\"\";msg_err3.innerHTML=\"\";
- } else if (checkDate(ends_month,ends_day,ends_year) == false) {
- msg_err3.style.display =\"block\";
- msg_err3.innerHTML=\"".get_lang('InvalidDate')."\";
- msg_err1.innerHTML=\"\";msg_err2.innerHTML=\"\";
- } else if (document.new_calendar_item.title.value == '') {
- msg_err4.style.display =\"block\";
- msg_err4.innerHTML=\"".get_lang('FieldRequired')."\";
- msg_err1.innerHTML=\"\";msg_err2.innerHTML=\"\";msg_err3.innerHTML=\"\";
- } else {
- if (cbList.length < 1) {
- if (!confirm(\"".get_lang('Send2All')."\")) {
- return false;
- }
- }
- for (var i=0; i<cbList.length; i++)
- cbList[i].selected = cbList[i].checked = bSelect;
- document.new_calendar_item.submit();
- }
- }
- function reverseAll(cbList)
- {
- for (var i=0; i<cbList.length; i++)
- {
- cbList[i].checked = !(cbList[i].checked)
- cbList[i].selected = !(cbList[i].selected)
- }
- }
- function plus_attachment() {
- if (document.getElementById('options').style.display == 'none') {
- document.getElementById('options').style.display = 'block';
- document.getElementById('plus').innerHTML=' <img style=\"vertical-align:middle;\" src=\"../img/div_hide.gif\" alt=\"\" /> ".get_lang('AddAnAttachment')."';
- } else {
- document.getElementById('options').style.display = 'none';
- document.getElementById('plus').innerHTML=' <img style=\"vertical-align:middle;\" src=\"../img/div_show.gif\" alt=\"\" /> ".get_lang('AddAnAttachment')."';
- }
- }
- function plus_repeated_event() {
- if (document.getElementById('options2').style.display == 'none') {
- document.getElementById('options2').style.display = 'block';
- document.getElementById('plus2').innerHTML=' <img style=\"vertical-align:middle;\" src=\"../img/div_hide.gif\" alt=\"\" /> ".get_lang('RepeatEvent')."';
- } else {
- document.getElementById('options2').style.display = 'none';
- document.getElementById('plus2').innerHTML=' <img style=\"vertical-align:middle;\" src=\"../img/div_show.gif\" alt=\"\" /> ".get_lang('RepeatEvent')."';
- }
- }
- /*
- function plus_ical() {
- if (document.getElementById('icalform').style.display == 'none') {
- document.getElementById('icalform').style.display = 'block';
- document.getElementById('plusical').innerHTML='';
- }
- }
- */
- // End -->
- </script>";
- }
- /**
- * returns the javascript for setting a filter. This is a jump menu
- * @author: Patrick Cool <patrick.cool@UGent.be>, Ghent University
- * @return javascript code
- */
- function user_group_filter_javascript()
- {
- return "<script language=\"JavaScript\" type=\"text/JavaScript\">
- <!--
- function MM_jumpMenu(targ,selObj,restore){
- eval(targ+\".location='\"+selObj.options[selObj.selectedIndex].value+\"'\");
- if (restore) selObj.selectedIndex=0;
- }
- //-->
- </script>
- ";
- }
- /**
- * this function gets all the users of the current course
- * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
- * @return array: associative array where the key is the id of the user and the value is an array containing
- the first name, the last name, the user id
- */
- function get_course_users()
- {
- global $tbl_user;
- global $tbl_courseUser, $tbl_session_course_user;
- global $_cid;
- // not 100% if this is necessary, this however prevents a notice
- if (!isset($courseadmin_filter))
- {$courseadmin_filter='';}
- $order_clause = api_sort_by_first_name() ? ' ORDER BY u.firstname, u.lastname' : ' ORDER BY u.lastname, u.firstname';
- $sql = "SELECT u.user_id uid, u.lastname lastName, u.firstname firstName
- FROM $tbl_user as u, $tbl_courseUser as cu
- WHERE cu.course_code = '".$_cid."'
- AND cu.user_id = u.user_id $courseadmin_filter".$order_clause;
- $result = Database::query($sql,__FILE__,__LINE__);
- while($user=Database::fetch_array($result)){
- $users[$user[0]] = $user;
- }
- if(!empty($_SESSION['id_session'])){
- $sql = "SELECT u.user_id uid, u.lastname lastName, u.firstName firstName
- FROM $tbl_session_course_user AS session_course_user
- INNER JOIN $tbl_user u
- ON u.user_id = session_course_user.id_user
- WHERE id_session='".intval($_SESSION['id_session'])."'
- AND course_code='$_cid'";
- $result = Database::query($sql,__FILE__,__LINE__);
- while($user=Database::fetch_array($result)){
- $users[$user[0]] = $user;
- }
- }
- return $users;
- }
- /**
- * this function gets all the groups of the course
- * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
- * @return array
- */
- function get_course_groups()
- {
- $group_list = array();
- $group_list = CourseManager::get_group_list_of_course(api_get_course_id(), intval($_SESSION['id_session']));
- return $group_list;
- }
- /**
- * this function shows the form for sending a message to a specific group or user.
- * @author: Patrick Cool <patrick.cool@UGent.be>, Ghent University
- * @return html code
- */
- function show_to_form($to_already_selected)
- {
- $user_list=get_course_users();
- $group_list=get_course_groups();
- echo "\n<table id=\"recipient_list\" style=\"display: none;\">\n";
- echo "\t<tr>\n";
- // the form containing all the groups and all the users of the course
- echo "\t\t<td>\n";
- echo "<strong>".get_lang('Users')."</strong><br />";
- construct_not_selected_select_form($group_list,$user_list,$to_already_selected);
- echo "\t\t</td>\n";
- // the buttons for adding or removing groups/users
- echo "\n\t\t<td valign=\"middle\">\n";
- /* echo "\t\t<input type=\"button\" ",
- "onclick=\"move(document.getElementById('not_selected_form'),document.getElementById('selected_form'))\" ",
- "value=\" >> \" />",
- "\n\t\t<p> </p>",
- "\n\t\t<input type=\"button\" ",
- "onclick=\"move(document.getElementById('selected_form'),document.getElementById('not_selected_form'))\" ",
- "value=\" class=\"arrow\" \" />";
- */
- ?>
- <button class="arrowr" type="button" onclick="move(document.getElementById('not_selected_form'), document.getElementById('selected_form'))" onclick="move(document.getElementById('not_selected_form'), document.getElementById('selected_form'))"></button>
- <br /> <br />
- <button class="arrowl" type="button" onclick="move(document.getElementById('selected_form'), document.getElementById('not_selected_form'))" onclick="move(document.getElementById('selected_form'), document.getElementById('not_selected_form'))"></button>
- <?php
- echo "\t\t</td>\n";
- echo "\n\t\t<td>\n";
- echo "<strong>".get_lang('DestinationUsers')."</strong><br />";
- construct_selected_select_form($group_list,$user_list,$to_already_selected);
- echo "\t\t</td>\n";
- echo "\t</tr>\n";
- echo "</table>";
- }
- /**
- * this function shows the form with the user that were not selected
- * @author: Patrick Cool <patrick.cool@UGent.be>, Ghent University
- * @return html code
- */
- function construct_not_selected_select_form($group_list=null, $user_list=null,$to_already_selected=array())
- {
- echo "\t\t<select id=\"not_selected_form\" name=\"not_selected_form[]\" size=\"5\" multiple=\"multiple\" style=\"width:200px\">\n";
- // adding the groups to the select form
- if (isset($to_already_selected) && $to_already_selected==='everyone') {
- echo "\t\t<option value=\"\">--------------------------------------------</option>\n";
- } else {
- if (is_array($group_list))
- {
- foreach($group_list as $this_group)
- {
- //api_display_normal_message("group " . $thisGroup[id] . $thisGroup[name]);
- if (!is_array($to_already_selected) || !in_array("GROUP:".$this_group['id'],$to_already_selected)) // $to_already_selected is the array containing the groups (and users) that are already selected
- {
- echo "\t\t<option value=\"GROUP:".$this_group['id']."\">",
- "G: ",$this_group['name']," – " . $this_group['userNb'] . " " . get_lang('Users') .
- "</option>\n";
- }
- }
- // a divider
- }
- echo "<option value=\"\">--------------------------------------------</option>";
- // adding the individual users to the select form
- foreach($user_list as $this_user)
- {
- if (!is_array($to_already_selected) || !in_array("USER:".$this_user['uid'],$to_already_selected)) // $to_already_selected is the array containing the users (and groups) that are already selected
- {
- echo "\t\t<option value=\"USER:",$this_user['uid'],"\">",
- "",api_get_person_name($this_user['firstName'], $this_user['lastName']),
- "</option>\n";
- }
- }
- }
- echo "\t\t</select>\n";
- }
- /**
- * This function shows the form with the user that were selected
- * @author: Patrick Cool <patrick.cool@UGent.be>, Ghent University
- * @return html code
- */
- function construct_selected_select_form($group_list=null, $user_list=null,$to_already_selected)
- {
- // we separate the $to_already_selected array (containing groups AND users into
- // two separate arrays
- if (is_array($to_already_selected))
- {
- $groupuser=separate_users_groups($to_already_selected);
- }
- $groups_to_already_selected=$groupuser['groups'];
- $users_to_already_selected=$groupuser['users'];
- // we load all the groups and all the users into a reference array that we use to search the name of the group / user
- $ref_array_groups=get_course_groups();
- $ref_array_users=get_course_users();
- // we construct the form of the already selected groups / users
- echo "\t\t<select id=\"selected_form\" name=\"selectedform[]\" size=\"5\" multiple=\"multiple\" style=\"width:200px\">";
- if(is_array($to_already_selected))
- {
- $select_options_group = array();
- $select_options_user = array();
- $select_options_groupuser = array();
- foreach($to_already_selected as $groupuser)
- {
- list($type,$id)=explode(":",$groupuser);
- if ($type=="GROUP")
- {
- $select_options_group[] = "\t\t<option value=\"".$groupuser."\">G: ".$ref_array_groups[$id]['name']."</option>";
- //echo "\t\t<option value=\"".$groupuser."\">G: ".$ref_array_groups[$id]['name']."</option>";
- }
- else
- {
- $select_options_user[] = "\t\t<option value=\"".$groupuser."\">".api_get_person_name($ref_array_users[$id]['firstName'], $ref_array_users[$id]['lastName'])."</option>";
- //echo "\t\t<option value=\"".$groupuser."\">".api_get_person_name($ref_array_users[$id]['firstName'], $ref_array_users[$id]['lastName'])."</option>";
- }
- }
- $select_options_group[] = "<option value=\"\">--------------------------------------------</option>";
- $select_options_groupuser = array_merge($select_options_group,$select_options_user);
- foreach($select_options_groupuser as $select_options) {
- echo $select_options;
- }
- } else {
- if($to_already_selected=='everyone'){
- // adding the groups to the select form
- if (is_array($group_list))
- {
- foreach($group_list as $this_group)
- {
- //api_display_normal_message("group " . $thisGroup[id] . $thisGroup[name]);
- if (!is_array($to_already_selected) || !in_array("GROUP:".$this_group['id'],$to_already_selected)) // $to_already_selected is the array containing the groups (and users) that are already selected
- {
- echo "\t\t<option value=\"GROUP:".$this_group['id']."\">",
- "G: ",$this_group['name']," – " . $this_group['userNb'] . " " . get_lang('Users') .
- "</option>\n";
- }
- }
- }
- echo "<option value=\"\">--------------------------------------------</option>";
- // adding the individual users to the select form
- foreach($user_list as $this_user)
- {
- if (!is_array($to_already_selected) || !in_array("USER:".$this_user['uid'],$to_already_selected)) // $to_already_selected is the array containing the users (and groups) that are already selected
- {
- echo "\t\t<option value=\"USER:",$this_user['uid'],"\">",
- "",api_get_person_name($this_user['firstName'], $this_user['lastName']),
- "</option>\n";
- }
- }
- }
- }
- echo "</select>\n";
- }
- /**
- * This function stores the Agenda Item in the table calendar_event and updates the item_property table also
- * @author: Patrick Cool <patrick.cool@UGent.be>, Ghent University
- * @return integer the id of the last added agenda item
- */
- function store_new_agenda_item() {
- global $_user, $_course;
- $TABLEAGENDA = Database::get_course_table(TABLE_AGENDA);
- $t_agenda_repeat = Database::get_course_Table(TABLE_AGENDA_REPEAT);
- // some filtering of the input data
- $title=strip_tags(trim($_POST['title'])); // no html allowed in the title
- $content=trim($_POST['content']);
- $start_date=(int)$_POST['fyear']."-".(int)$_POST['fmonth']."-".(int)$_POST['fday']." ".(int)$_POST['fhour'].":".(int)$_POST['fminute'].":00";
- $end_date=(int)$_POST['end_fyear']."-".(int)$_POST['end_fmonth']."-".(int)$_POST['end_fday']." ".(int)$_POST['end_fhour'].":".(int)$_POST['end_fminute'].":00";
- $content=stripslashes($content);
- $title=Database::escape_string(Security::remove_XSS($title));
- $content = Database::escape_string(Security::remove_XSS($content,COURSEMANAGERLOWSECURITY));
- $start_date=Database::escape_string($start_date);
- $end_date=Database::escape_string($end_date);
- // store in the table calendar_event
- $sql = "INSERT INTO ".$TABLEAGENDA."
- (title,content, start_date, end_date)
- VALUES
- ('".$title."','".$content."', '".$start_date."','".$end_date."')";
- $result = Database::query($sql,__FILE__,__LINE__);
- $last_id = Database::insert_id();
- // store in last_tooledit (first the groups, then the users
- $to=$_POST['selectedform'];
- if ((!is_null($to)) || (!empty($_SESSION['toolgroup']))) // !is_null($to): when no user is selected we send it to everyone
- {
- $send_to=separate_users_groups($to);
- // storing the selected groups
- if (is_array($send_to['groups'])) {
- foreach ($send_to['groups'] as $group) {
- api_item_property_update($_course, TOOL_CALENDAR_EVENT, $last_id,"AgendaAdded", $_user['user_id'], $group,'',$start_date, $end_date);
- }
- }
- // storing the selected users
- if (is_array($send_to['users'])) {
- foreach ($send_to['users'] as $user) {
- api_item_property_update($_course, TOOL_CALENDAR_EVENT, $last_id,"AgendaAdded", $_user['user_id'],'',$user, $start_date,$end_date);
- }
- }
- }
- else // the message is sent to everyone, so we set the group to 0
- {
- api_item_property_update($_course, TOOL_CALENDAR_EVENT, $last_id,"AgendaAdded", $_user['user_id'], '','',$start_date,$end_date);
- }
- // storing the resources
- store_resources($_SESSION['source_type'],$last_id);
- //if repetitive, insert element into agenda_repeat table
- if(!empty($_POST['repeat']) && !empty($_POST['repeat_type'])) {
- if(!empty($_POST['repeat_end_year']) && !empty($_POST['repeat_end_month']) && !empty($_POST['repeat_end_day'])) {
- $end_y = intval($_POST['repeat_end_year']);
- $end_m = intval($_POST['repeat_end_month']);
- $end_d = intval($_POST['repeat_end_day']);
- $end = mktime((int)$_POST['fhour'],(int)$_POST['fminute'],0,$end_m,$end_d,$end_y);
- $now = time();
- $type = Database::escape_string($_POST['repeat_type']);
- if ($end > $now && in_array($type,array('daily','weekly','monthlyByDate','monthlyByDay','monthlyByDayR','yearly'))) {
- $sql = "INSERT INTO $t_agenda_repeat (cal_id, cal_type, cal_end)" .
- " VALUES ($last_id,'$type',$end)";
- $res = Database::query($sql,__FILE__,__LINE__);
- }
- }
- }
- return $last_id;
- }
- /**
- * Stores the given agenda item as an announcement (unlinked copy)
- * @param integer Agenda item's ID
- * @return integer New announcement item's ID
- */
- function store_agenda_item_as_announcement($item_id){
- $table_agenda = Database::get_course_table(TABLE_AGENDA);
- $table_ann = Database::get_course_table(TABLE_ANNOUNCEMENT);
- //check params
- if(empty($item_id) or $item_id != strval(intval($item_id))){return -1;}
- //get the agenda item
- $item_id=Database::escape_string($item_id);
- $sql = "SELECT * FROM $table_agenda WHERE id = '".$item_id."'";
- $res = Database::query($sql,__FILE__,__LINE__);
- if(Database::num_rows($res)>0){
- $row = Database::fetch_array($res);
- //we have the agenda event, copy it
- //get the maximum value for display order in announcement table
- $sql_max = "SELECT MAX(display_order) FROM $table_ann";
- $res_max = Database::query($sql_max,__FILE__,__LINE__);
- $row_max = Database::fetch_array($res_max);
- $max = $row_max[0]+1;
- //build the announcement text
- $content = $row['start_date']." - ".$row['end_date']."\n\n".$row['content'];
- //insert announcement
- $session_id = api_get_session_id();
- $sql_ins = "INSERT INTO $table_ann (title,content,end_date,display_order,session_id) " .
- "VALUES ('".Security::remove_XSS($row['title'])."','".$content."','".$row['end_date']."','$max','$session_id')";
- $res_ins = Database::query($sql_ins,__FILE__,__LINE__);
- if($res > 0)
- {
- $ann_id = Database::insert_id();
- //Now also get the list of item_properties rows for this agenda_item (calendar_event)
- //and copy them into announcement item_properties
- $table_props = Database::get_course_table(TABLE_ITEM_PROPERTY);
- $sql_props = "SELECT * FROM $table_props WHERE tool = 'calendar_event' AND ref='$item_id'";
- $res_props = Database::query($sql_props,__FILE__,__LINE__);
- if(Database::num_rows($res_props)>0)
- {
- while($row_props = Database::fetch_array($res_props))
- {
- //insert into announcement item_property
- $time = date("Y-m-d H:i:s", time());
- $sql_ins_props = "INSERT INTO $table_props " .
- "(tool, insert_user_id, insert_date, " .
- "lastedit_date, ref, lastedit_type," .
- "lastedit_user_id, to_group_id, to_user_id, " .
- "visibility, start_visible, end_visible)" .
- " VALUES " .
- "('announcement','".$row_props['insert_user_id']."','".$time."'," .
- "'$time','$ann_id','AnnouncementAdded'," .
- "'".$row_props['last_edit_user_id']."','".$row_props['to_group_id']."','".$row_props['to_user_id']."'," .
- "'".$row_props['visibility']."','".$row_props['start_visible']."','".$row_props['end_visible']."')";
- $res_ins_props = Database::query($sql_ins_props,__FILE__,__LINE__);
- if($res_ins_props <= 0){
- error_log('SQL Error in '.__FILE__.' at line '.__LINE__.': '.$sql_ins_props);
- }else{
- //copy was a success
- return $ann_id;
- }
- }
- }
- }else{
- return -1;
- }
- }
- return -1;
- }
- /**
- * This function separates the users from the groups
- * users have a value USER:XXX (with XXX the dokeos id
- * groups have a value GROUP:YYY (with YYY the group id)
- * @author: Patrick Cool <patrick.cool@UGent.be>, Ghent University
- * @return array
- */
- function separate_users_groups($to)
- {
- $grouplist = array();
- $userlist = array();
- $send_to = null;
- if(is_array($to) && count($to)>0)
- {
- foreach($to as $to_item)
- {
- list($type, $id) = explode(':', $to_item);
- switch($type)
- {
- case 'GROUP':
- $grouplist[] =$id;
- break;
- case 'USER':
- $userlist[] =$id;
- break;
- }
- }
- $send_to['groups']=$grouplist;
- $send_to['users']=$userlist;
- }
- return $send_to;
- }
- /**
- * returns all the users and all the groups a specific Agenda item has been sent to
- * @author: Patrick Cool <patrick.cool@UGent.be>, Ghent University
- * @return array
- */
- function sent_to($tool, $id)
- {
- global $_course;
- $TABLE_ITEM_PROPERTY = Database::get_course_table(TABLE_ITEM_PROPERTY);
- $tool=Database::escape_string($tool);
- $id=Database::escape_string($id);
- $sql="SELECT * FROM $TABLE_ITEM_PROPERTY WHERE tool='".$tool."' AND ref='".$id."'";
- $result=Database::query($sql,__FILE__,__LINE__);
- while ($row=Database::fetch_array($result))
- {
- // if to_group_id is null then it is sent to a specific user
- // if to_group_id = 0 then it is sent to everybody
- if (!is_null($row['to_group_id']) )
- {
- $sent_to_group[]=$row['to_group_id'];
- //echo $row['to_group_id'];
- }
- // if to_user_id <> 0 then it is sent to a specific user
- if ($row['to_user_id']<>0)
- {
- $sent_to_user[]=$row['to_user_id'];
- }
- }
- if (isset($sent_to_group))
- {
- $sent_to['groups']=$sent_to_group;
- }
- if (isset($sent_to_user))
- {
- $sent_to['users']=$sent_to_user;
- }
- return $sent_to;
- }
- /**
- * constructs the form to display all the groups and users the message has been sent to
- * @author: Patrick Cool <patrick.cool@UGent.be>, Ghent University
- * @param array $sent_to_array: a 2 dimensional array containing the groups and the users
- * the first level is a distinction between groups and users: $sent_to_array['groups'] and $sent_to_array['users']
- * $sent_to_array['groups'] (resp. $sent_to_array['users']) is also an array containing all the id's of the
- * groups (resp. users) who have received this message.
- * @return html
- */
- function sent_to_form($sent_to_array)
- {
- // we find all the names of the groups
- $group_names=get_course_groups();
- count($sent_to_array);
- // we count the number of users and the number of groups
- if (isset($sent_to_array['users']))
- {
- $number_users=count($sent_to_array['users']);
- }
- else
- {
- $number_users=0;
- }
- if (isset($sent_to_array['groups']))
- {
- $number_groups=count($sent_to_array['groups']);
- }
- else
- {
- $number_groups=0;
- }
- $total_numbers=$number_users+$number_groups;
- // starting the form if there is more than one user/group
- if ($total_numbers >1)
- {
- $output="<select name=\"sent to\">\n";
- $output.="<option>".get_lang("SentTo")."</option>";
- // outputting the name of the groups
- if (is_array($sent_to_array['groups']))
- {
- foreach ($sent_to_array['groups'] as $group_id)
- {
- $output.="\t<option value=\"\">G: ".$group_names[$group_id]['name']."</option>\n";
- }
- }
- if (isset($sent_to_array['users']))
- {
- if (is_array($sent_to_array['users']))
- {
- foreach ($sent_to_array['users'] as $user_id)
- {
- $user_info=api_get_user_info($user_id);
- $output.="\t<option value=\"\">".api_get_person_name($user_info['firstName'], $user_info['lastName'])."</option>\n";
- }
- }
- }
- // ending the form
- $output.="</select>\n";
- }
- else // there is only one user/group
- {
- if (is_array($sent_to_array['users']))
- {
- $user_info=api_get_user_info($sent_to_array['users'][0]);
- echo api_get_person_name($user_info['firstName'], $user_info['lastName']);
- }
- if (is_array($sent_to_array['groups']) and $sent_to_array['groups'][0]!==0)
- {
- $group_id=$sent_to_array['groups'][0];
- echo $group_names[$group_id]['name'];
- }
- if (is_array($sent_to_array['groups']) and $sent_to_array['groups'][0]==0)
- {
- echo get_lang("Everybody");
- }
- //.$sent_to_array['groups'][0];
- }
- echo $output;
- }
- /**
- * This function displays a dropdown list that allows the course administrator do view the calendar items of one specific group
- * @author: Patrick Cool <patrick.cool@UGent.be>, Ghent University
- */
- function show_group_filter_form()
- {
- $group_list=get_course_groups();
- echo "<select name=\"select\" onchange=\"javascript: MM_jumpMenu('parent',this,0)\">";
- echo "<option value=\"agenda.php?group=none\">show all groups</option>";
- foreach($group_list as $this_group)
- {
- // echo "<option value=\"agenda.php?isStudentView=true&group=".$this_group['id']."\">".$this_group['name']."</option>";
- echo "<option value=\"agenda.php?group=".$this_group['id']."\" ";
- echo ($this_group['id']==$_SESSION['group'])? " selected":"" ;
- echo ">".$this_group['name']."</option>";
- }
- echo "</select>";
- }
- /**
- * This function displays a dropdown list that allows the course administrator do view the calendar items of one specific group
- * @author: Patrick Cool <patrick.cool@UGent.be>, Ghent University
- */
- function show_user_filter_form()
- {
- $user_list=get_course_users();
- echo "<select name=\"select\" onchange=\"javascript: MM_jumpMenu('parent',this,0)\">";
- echo "<option value=\"agenda.php?user=none\">show all users</option>";
- foreach($user_list as $this_user)
- {
- // echo "<option value=\"agenda.php?isStudentView=true&user=".$this_user['uid']."\">".api_get_person_name($this_user['firstName'], $this_user['lastName'])."</option>";
- echo "<option value=\"agenda.php?user=".$this_user['uid']."\" ";
- echo ($this_user['uid']==$_SESSION['user'])? " selected":"" ;
- echo ">".api_get_person_name($this_user['firstName'], $this_user['lastName'])."</option>";
- }
- echo "</select>";
- }
- /**
- * This function displays a dropdown list that allows the course administrator do view the calendar items of one specific group
- * @author: Patrick Cool <patrick.cool@UGent.be>, Ghent University
- */
- function show_user_group_filter_form()
- {
- echo "\n<select name=\"select\" onchange=\"javascript: MM_jumpMenu('parent',this,0)\">";
- // Groups
- $option = "\n\t<optgroup label=\"".get_lang("Groups")."\">";
- $group_list=get_course_groups();
- //echo "\n\t<option value=\"agenda.php?user=none\">".get_lang("ShowAll")."</option>";
- $group_available_to_access =array();
- if(!empty($group_list)){
- foreach($group_list as $this_group) {
- // echo "<option value=\"agenda.php?isStudentView=true&group=".$this_group['id']."\">".$this_group['name']."</option>";
- $has_access = GroupManager::user_has_access(api_get_user_id(),$this_group['id'],GROUP_TOOL_CALENDAR);
- $result = GroupManager::get_group_properties($this_group['id']);
- if ($result['calendar_state']!='0') {
- $group_available_to_access[]=$this_group['id'];
- }
- // lastedit
- if ($has_access || $result['calendar_state']=='1') {
- $option.= "\n\t\t<option value=\"agenda.php?group=".$this_group['id']."\" ";
- $option.= ($this_group['id']==$_SESSION['group'])? " selected":"" ;
- $option.= ">".$this_group['name']."</option>";
- }
- }
- }
- $all = "\n\t<option value=\"agenda.php?user=none\">".get_lang("ShowAll")."</option>";
- $option = $all.$option;
- $option.= "\n\t</optgroup>";
- echo $option;
- global $_course;
- // Users
- echo "\n\t<optgroup label=\"".get_lang("Users")."\">";
- $user_list=get_course_users();
- foreach($user_list as $this_user) {
- echo "\n\t\t<option value=\"agenda.php?user=".$this_user['uid']."\" ";
- echo ($this_user['uid']==$_SESSION['user'])? " selected":"" ;
- echo ">".api_get_person_name($this_user['firstName'], $this_user['lastName'])."</option>";
- }
- echo "\n\t</optgroup>";
- echo "</select>";
- }
- /**
- * This tools loads all the users and all the groups who have received a specific item (in this case an agenda item)
- * @author: Patrick Cool <patrick.cool@UGent.be>, Ghent University
- */
- function load_edit_users($tool, $id)
- {
- global $_course;
- $tool=Database::escape_string($tool);
- $id=Database::escape_string($id);
- $TABLE_ITEM_PROPERTY = Database::get_course_table(TABLE_ITEM_PROPERTY);
- $sql="SELECT * FROM $TABLE_ITEM_PROPERTY WHERE tool='$tool' AND ref='$id'";
- $result=Database::query($sql,__FILE__,__LINE__) or die (Database::error());
- while ($row=Database::fetch_array($result))
- {
- $to_group=$row['to_group_id'];
- switch ($to_group)
- {
- // it was send to one specific user
- case null:
- $to[]="USER:".$row['to_user_id'];
- break;
- // it was sent to everyone
- case 0:
- return "everyone";
- exit;
- break;
- default:
- $to[]="GROUP:".$row['to_group_id'];
- }
- }
- return $to;
- }
- /**
- * This functions swithes the visibility a course resource using the visible field in 'last_tooledit' values: 0 = invisible
- * @author: Patrick Cool <patrick.cool@UGent.be>, Ghent University
- */
- function change_visibility($tool,$id,$visibility)
- {
- global $_course;
- $TABLE_ITEM_PROPERTY = Database::get_course_table(TABLE_ITEM_PROPERTY);
- $tool=Database::escape_string($tool);
- $id=Database::escape_string($id);
- /*
- $sql="SELECT * FROM $TABLE_ITEM_PROPERTY WHERE tool='".TOOL_CALENDAR_EVENT."' AND ref='$id'";
- $result=Database::query($sql,__FILE__,__LINE__) or die (Database::error());
- $row=Database::fetch_array($result);
- */
- if ($visibility == 0)
- {
- $sql_visibility="UPDATE $TABLE_ITEM_PROPERTY SET visibility='0' WHERE tool='$tool' AND ref='$id'";
- api_item_property_update($_course,TOOL_CALENDAR_EVENT,$id,"invisible",api_get_user_id());
- }
- else
- {
- $sql_visibility="UPDATE $TABLE_ITEM_PROPERTY SET visibility='1' WHERE tool='$tool' AND ref='$id'";
- api_item_property_update($_course,TOOL_CALENDAR_EVENT,$id,"visible",api_get_user_id());
- }
- }
- /**
- * The links that allows the course administrator to add a new agenda item, to filter on groups or users
- * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
- */
- function display_courseadmin_links() {
- //echo "<a href='".api_get_self()."?".api_get_cidreq()."&action=add&view=".(($_SESSION['view']=='month')?"list":Security::remove_XSS($_SESSION['view'])."&origin=".Security::remove_XSS($_GET['origin']))."'>".Display::return_icon('calendar_add.gif', get_lang('AgendaAdd'))." ".get_lang('AgendaAdd')."</a>";
- echo "<a href='".api_get_self()."?".api_get_cidreq()."&sort=asc&toolgroup=".Security::remove_XSS($_GET['toolgroup'])."&action=add&view=".(($_SESSION['view']=='month')?"list":Security::remove_XSS($_SESSION['view'])."&origin=".Security::remove_XSS($_GET['origin']))."'>".Display::return_icon('calendar_add.gif', get_lang('AgendaAdd'))." ".get_lang('AgendaAdd')."</a>";
- if (empty ($_SESSION['toolgroup']))
- {
- echo get_lang('UserGroupFilter');
- echo "<form name=\"filter\" style=\"display:inline;\">";
- show_user_group_filter_form();
- echo "</form> ";
- }
- //echo "<a href='".api_get_self()."?".api_get_cidreq()."&action=importical&view=".(($_SESSION['view']=='month')?"list":Security::remove_XSS($_SESSION['view'])."&origin=".Security::remove_XSS($_GET['origin']))."'>".Display::return_icon('ical_icon.gif', get_lang('ICalFileImport'))." ".get_lang('ICalFileImport')."</a>";
- }
- /**
- * The links that allows the student AND course administrator to show all agenda items and sort up/down
- * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
- */
- function display_student_links()
- {
- global $show;
- if ($_SESSION['sort'] == 'DESC')
- {
- echo "<a href='".api_get_self()."?".api_get_cidreq()."&sort=asc&toolgroup=".Security::remove_XSS($_GET['toolgroup'])."&origin=".Security::remove_XSS($_GET['origin'])."'>".Display::return_icon('calendar_up.gif',get_lang('AgendaSortChronologicallyUp')).' '.get_lang("AgendaSortChronologicallyUp")."</a> ";
- }
- else
- {
- echo "<a href='".api_get_self()."?".api_get_cidreq()."&sort=desc&toolgroup=".Security::remove_XSS($_GET['toolgroup'])."&origin=".Security::remove_XSS($_GET['origin'])."'>".Display::return_icon('calendar_down.gif',get_lang('AgendaSortChronologicallyDown')).' '.get_lang("AgendaSortChronologicallyDown")."</a> ";
- }
- // showing the link to show all items or only those of the current month
- if ($_SESSION['show']=="showcurrent")
- {
- echo "<a href='".api_get_self()."?".api_get_cidreq()."&action=showall&toolgroup=".Security::remove_XSS($_GET['toolgroup'])."&origin=".Security::remove_XSS($_GET['origin'])."'>".Display::return_icon('calendar_select.gif', get_lang("ShowAllEvents")).' '.get_lang("ShowAllEvents")."</a> ";
- }
- else
- {
- echo "<a href='".api_get_self()."?".api_get_cidreq()."&action=showcurrent&toolgroup=".Security::remove_XSS($_GET['toolgroup'])."&origin=".Security::remove_XSS($_GET['origin'])."'>".Display::return_icon('calendar_month.gif', get_lang("ShowCurrent")).' '.get_lang("ShowCurrent")."</a> ";
- }
- if ($_SESSION['view'] <> 'month')
- {
- echo "<a href=\"".api_get_self()."?action=view&toolgroup=".Security::remove_XSS($_GET['toolgroup'])."&view=month\">".Display::return_icon('calendar_month.gif', get_lang('MonthView'))." ".get_lang('MonthView')."</a> ";
- }
- else
- {
- echo "\t<a href=\"".api_get_self()."?action=view&toolgroup=".Security::remove_XSS($_GET['toolgroup'])."&view=list\">".Display::return_icon('calendar_select.gif', get_lang('ListView'))." ".get_lang('ListView')."</a> ";
- }
- }
- /**
- * get all the information of the agenda_item from the database
- * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
- * @param integer the id of the agenda item we are getting all the information of
- * @return an associative array that contains all the information of the agenda item. The keys are the database fields
- */
- function get_agenda_item($id)
- {
- global $TABLEAGENDA;
- $t_agenda_repeat = Database::get_course_table(TABLE_AGENDA_REPEAT);
- $id=Database::escape_string($id);
- $item = array();
- if(empty($id))
- {
- $id=(int)addslashes($_GET['id']);
- }
- else
- {
- $id = (int) $id;
- }
- if(empty($id)){return $item;}
- $sql = "SELECT * FROM ".$TABLEAGENDA." WHERE id='".$id."'";
- $result = Database::query($sql,__FILE__,__LINE__);
- $entry_to_edit = Database::fetch_array($result);
- $item['title'] = $entry_to_edit["title"];
- $item['content'] = $entry_to_edit["content"];
- $item['start_date'] = $entry_to_edit["start_date"];
- $item['end_date'] = $entry_to_edit["end_date"];
- $item['to'] = load_edit_users(TOOL_CALENDAR_EVENT, $id);
- // if the item has been sent to everybody then we show the compact to form
- if ($item['to']=="everyone")
- {
- $_SESSION['allow_individual_calendar']="hide";
- }
- else
- {
- $_SESSION['allow_individual_calendar']="show";
- }
- $item['repeat'] = false;
- $sql = "SELECT * FROM $t_agenda_repeat WHERE cal_id = $id";
- $res = Database::query($sql,__FILE__,__LINE__);
- if(Database::num_rows($res)>0)
- {
- //this event is repetitive
- $row = Database::fetch_array($res);
- $item['repeat'] = true;
- $item['repeat_type'] = $row['cal_type'];
- $item['repeat_end'] = $row['cal_end'];
- $item['repeat_frequency'] = $row['cal_frequency']; //unused in 1.8.5 RC1 - will be used later to say if once every 2 or 3 weeks, for example
- $item['repeat_days'] = $row['cal_days']; //unused in 1.8.5 RC1 - will be used later
- }
- //TODO - add management of repeat exceptions
- return $item;
- }
- /**
- * This is the function that updates an agenda item. It does 3 things
- * 1. storethe start_date, end_date, title and message in the calendar_event table
- * 2. store the groups/users who this message is meant for in the item_property table
- * 3. modify the attachments (if needed)
- * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
- */
- function store_edited_agenda_item($id_attach,$file_comment)
- {
- global $_user, $_course;
- // database definitions
- $TABLE_ITEM_PROPERTY = Database::get_course_table(TABLE_ITEM_PROPERTY);
- // STEP 1: editing the calendar_event table
- // 1.a. some filtering of the input data
- $id=(int)$_POST['id'];
- $title=strip_tags(trim($_POST['title'])); // no html allowed in the title
- $content=trim($_POST['content']);
- $start_date=(int)$_POST['fyear']."-".(int)$_POST['fmonth']."-".(int)$_POST['fday']." ".(int)$_POST['fhour'].":".(int)$_POST['fminute'].":00";
- $end_date=(int)$_POST['end_fyear']."-".(int)$_POST['end_fmonth']."-".(int)$_POST['end_fday']." ".(int)$_POST['end_fhour'].":".(int)$_POST['end_fminute'].":00";
- $to=$_POST['selectedform'];
- // 1.b. the actual saving in calendar_event table
- $edit_result=save_edit_agenda_item($id,$title,$content,$start_date,$end_date);
- if (empty($id_attach)) {
- add_agenda_attachment_file($file_comment,$id);
- } else {
- edit_agenda_attachment_file($file_comment,$id,$id_attach);
- }
- // step 2: editing the item_propery table (=delete all and add the new destination users/groups)
- if ($edit_result=true)
- {
- // 2.a. delete everything for the users
- $sql_delete="DELETE FROM ".$TABLE_ITEM_PROPERTY." WHERE ref='$id' AND tool='".TOOL_CALENDAR_EVENT."'";
- $result = Database::query($sql_delete,__FILE__,__LINE__) or die (Database::error());
- // 2.b. storing the new users/groups
- if (!is_null($to)) // !is_null($to): when no user is selected we send it to everyone
- {
- $send_to=separate_users_groups($to);
- // storing the selected groups
- if (is_array($send_to['groups']))
- {
- foreach ($send_to['groups'] as $group)
- {
- api_item_property_update($_course, TOOL_CALENDAR_EVENT, $id,"AgendaModified", $_user['user_id'], $group,'',$start_date, $end_date);
- }
- }
- // storing the selected users
- if (is_array($send_to['users']))
- {
- foreach ($send_to['users'] as $user)
- {
- api_item_property_update($_course, TOOL_CALENDAR_EVENT, $id,"AgendaModified", $_user['user_id'],'',$user, $start_date,$end_date);
- }
- }
- }
- else // the message is sent to everyone, so we set the group to 0
- {
- api_item_property_update($_course, TOOL_CALENDAR_EVENT, $id,"AgendaModified", $_user['user_id'], '','',$start_date,$end_date);
- }
- } //if ($edit_result=true)
- // step 3: update the attachments (=delete all and add those in the session
- update_added_resources("Agenda", $id);
- // return the message;
- Display::display_confirmation_message(get_lang("EditSuccess"));
- }
- /**
- * This function stores the Agenda Item in the table calendar_event and updates the item_property table also (after an edit)
- * @author: Patrick Cool <patrick.cool@UGent.be>, Ghent University
- */
- function save_edit_agenda_item($id,$title,$content,$start_date,$end_date)
- {
- $TABLEAGENDA = Database::get_course_table(TABLE_AGENDA);
- $id=Database::escape_string($id);
- $title=Database::escape_string(Security::remove_XSS($title));
- $content=stripslashes($content);
- $content = Database::escape_string(Security::remove_XSS($content,COURSEMANAGERLOWSECURITY));
- $start_date=Database::escape_string($start_date);
- $end_date=Database::escape_string($end_date);
- // store the modifications in the table calendar_event
- $sql = "UPDATE ".$TABLEAGENDA."
- SET title='".$title."',
- content='".$content."',
- start_date='".$start_date."',
- end_date='".$end_date."'
- WHERE id='".$id."'";
- $result = Database::query($sql,__FILE__,__LINE__) or die (Database::error());
- return true;
- }
- /**
- * This is the function that deletes an agenda item.
- * The agenda item is no longer fycically deleted but the visibility in the item_property table is set to 2
- * which means that it is invisible for the student AND course admin. Only the platform administrator can see it.
- * This will in a later stage allow the platform administrator to recover resources that were mistakenly deleted
- * by the course administrator
- * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
- * @param integer the id of the agenda item wa are deleting
- */
- function delete_agenda_item($id)
- {
- global $_course;
- $id=Database::escape_string($id);
- if (api_is_allowed_to_edit(false,true) OR (api_get_course_setting('allow_user_edit_agenda') && !api_is_anonymous()))
- {
- if (!empty($_GET['id']) && isset($_GET['action']) && $_GET['action']=="delete")
- {
- $t_agenda = Database::get_course_table(TABLE_AGENDA);
- $t_agenda_r = Database::get_course_table(TABLE_AGENDA_REPEAT);
- $id=(int)addslashes($_GET['id']);
- $sql = "SELECT * FROM $t_agenda_r WHERE cal_id = $id";
- $res = Database::query($sql,__FILE__,__LINE__);
- if(Database::num_rows($res)>0)
- {
- $sql_children = "SELECT * FROM $t_agenda WHERE parent_event_id = $id";
- $res_children = Database::query($sql_children,__FILE__,__LINE__);
- if(Database::num_rows($res_children)>0)
- {
- while ($row_child = Database::fetch_array($res_children))
- {
- api_item_property_update($_course,TOOL_CALENDAR_EVENT,$row_child['id'],'delete',api_get_user_id());
- }
- }
- $sql_del = "DELETE FROM $t_agenda_r WHERE cal_id = $id";
- $res_del = Database::query($sql_del,__FILE__,__LINE__);
- }
- //$sql = "DELETE FROM ".$TABLEAGENDA." WHERE id='$id'";
- //$sql= "UPDATE ".$TABLE_ITEM_PROPERTY." SET visibility='2' WHERE tool='Agenda' and ref='$id'";
- //$result = Database::query($sql,__FILE__,__LINE__) or die (Database::error());
- api_item_property_update($_course,TOOL_CALENDAR_EVENT,$id,'delete',api_get_user_id());
- // delete the resources that were added to this agenda item
- // 2DO: as we no longer fysically delete the agenda item (to make it possible to 'restore'
- // deleted items, we should not delete the added resources either.
- // delete_added_resource("Agenda", $id); // -> this is no longer needed as the message is not really deleted but only visibility=2 (only platform admin can see it)
- //resetting the $id;
- $id=null;
- // displaying the result message in the yellow box
- Display::display_confirmation_message(get_lang("AgendaDeleteSuccess"));
- } // if (isset($id)&&$id&&isset($action)&&$action=="delete")
- } // if ($is_allowed_to_edit)
- }
- /**
- * Makes an agenda item visible or invisible for a student
- * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
- * @param integer id the id of the agenda item we are changing the visibility of
- */
- function showhide_agenda_item($id)
- {
- global $nameTools;
- /*==================================================
- SHOW / HIDE A CALENDAR ITEM
- ==================================================*/
- // and $_GET['isStudentView']<>"false" is added to prevent that the visibility is changed after you do the following:
- // change visibility -> studentview -> course manager view
- if ((api_is_allowed_to_edit(false,true) OR (api_get_course_setting('allow_user_edit_agenda') && !api_is_anonymous())) and $_GET['isStudentView']<>"false")
- {
- if (isset($_GET['id']) && isset($_GET['action']) && $_GET['action']=="showhide")
- {
- $id=(int)addslashes($_GET['id']);
- if (isset($_GET['next_action']) && $_GET['next_action'] == strval(intval($_GET['next_action']))) {
- $visibility = $_GET['next_action'];
- change_visibility($nameTools,$id,$visibility);
- Display::display_confirmation_message(get_lang("VisibilityChanged"));
- }
- }
- }
- }
- /**
- * Displays all the agenda items
- * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
- * @author Yannick Warnier <yannick.warnier@dokeos.com> - cleanup
- */
- function display_agenda_items()
- {
- global $TABLEAGENDA;
- global $TABLE_ITEM_PROPERTY;
- global $select_month, $select_year;
- global $DaysShort, $DaysLong, $MonthsLong;
- global $is_courseAdmin;
- global $dateFormatLong, $timeNoSecFormat,$charset, $_user, $_course;
- // getting the group memberships
- $group_memberships=GroupManager::get_group_ids($_course['dbName'],$_user['user_id']);
- // getting the name of the groups
- $group_names=get_course_groups();
- /*--------------------------------------------------
- CONSTRUCT THE SQL STATEMENT
- --------------------------------------------------*/
- $start = 0;
- $stop = 0;
- // this is to make a difference between showing everything (all months) or only the current month)
- // $show_all_current is a part of the sql statement
- if ($_SESSION['show']!=="showall")
- {
- $show_all_current=" AND MONTH(start_date)=$select_month AND year(start_date)=$select_year";
- $start = mktime(0,0,0,$select_month,1,$select_year);
- $stop = 0;
- if(empty($select_year)){$select_year = date('Y');}
- if(empty($select_month)){$select_month = date('m');}
- if($select_month==12)
- {
- $stop = mktime(0,0,0,1,1,$select_year+1)-1;
- }
- else
- {
- $stop = mktime(0,0,0,$select_month+1,1,$select_year)-1;
- }
- }
- else
- {
- $show_all_current="";
- $start = time();
- $stop = mktime(0,0,0,1,1,2038);//by default, set year to maximum for mktime()
- }
- // by default we use the id of the current user. The course administrator can see the agenda of other users by using the user / group filter
- $user_id=$_user['user_id'];
- if ($_SESSION['user']!==null)
- {
- $user_id=intval($_SESSION['user']);
- }
- if ($_SESSION['group']!==null)
- {
- $group_id=intval($_SESSION['group']);
- }
- if ($_SESSION['toolgroup']!==null)
- {
- $group_id=intval($_SESSION['toolgroup']);
- }
- $repeats = array(); //placeholder for repeated events
- //echo "user:".$_SESSION['user']."group: ".$_SESSION['group'];
- // A. you are a course admin
- //if ($is_courseAdmin)
- //$session_condition = intval($_SESSION['id_session'])==0 ? '' : ' AND agenda.session_id IN (0,'.intval($_SESSION['id_session']).') ';
- $session_id = api_get_session_id();
- $session_condition = api_get_session_condition($session_id);
- if (api_is_allowed_to_edit(false,true) OR (api_get_course_setting('allow_user_edit_agenda') && !api_is_anonymous()))
- {
- // A.1. you are a course admin with a USER filter
- // => see only the messages of this specific user + the messages of the group (s)he is member of.
- if (!empty($_SESSION['user']))
- {
- $group_memberships=GroupManager::get_group_ids($_course['dbName'],$_SESSION['user']);
- $show_user =true;
- $new_group_memberships=array();
- foreach($group_memberships as $id)
- {
- // did i have access to the same
- $has_access = GroupManager::user_has_access(api_get_user_id(),$id,GROUP_TOOL_CALENDAR);
- $result = GroupManager::get_group_properties($id);
- if ($has_access && $result['calendar_state']!='0' )
- {
- $new_group_memberships[]=$id;
- }
- }
- $group_memberships = $new_group_memberships;
- if (is_array($group_memberships) && count($group_memberships)>0)
- {
- $sql="SELECT
- agenda.*, toolitemproperties.*
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." toolitemproperties
- WHERE agenda.id = toolitemproperties.ref ".$show_all_current."
- AND toolitemproperties.tool='".TOOL_CALENDAR_EVENT."'
- AND ( toolitemproperties.to_user_id=$user_id OR toolitemproperties.to_group_id IN (0, ".implode(", ", $group_memberships).") )
- AND toolitemproperties.visibility='1'
- $session_condition
- ORDER BY start_date ".$_SESSION['sort'];
- }
- else
- {
- $sql="SELECT
- agenda.*, toolitemproperties.*
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." toolitemproperties
- WHERE agenda.id = toolitemproperties.ref ".$show_all_current."
- AND toolitemproperties.tool='".TOOL_CALENDAR_EVENT."'
- AND ( toolitemproperties.to_user_id=$user_id OR toolitemproperties.to_group_id='0')
- AND toolitemproperties.visibility='1'
- $session_condition
- ORDER BY start_date ".$_SESSION['sort'];
- }
- }
- // A.2. you are a course admin with a GROUP filter
- // => see only the messages of this specific group
- elseif (!empty($_SESSION['group']))
- {
- if (!empty($group_id)) {
- $result = GroupManager::get_group_properties($group_id);
- $has_access = GroupManager::user_has_access(api_get_user_id(),$group_id,GROUP_TOOL_CALENDAR);
- //echo '<pre>';print_R($result);
- // lastedit
- if (!$has_access || $result['calendar_state']=='0' )
- {
- $group_id=0;
- }
- }
- $sql="SELECT
- agenda.*, toolitemproperties.*
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." toolitemproperties
- WHERE agenda.id = toolitemproperties.ref ".$show_all_current."
- AND toolitemproperties.tool='".TOOL_CALENDAR_EVENT."'
- AND ( toolitemproperties.to_group_id=$group_id OR toolitemproperties.to_group_id='0')
- AND toolitemproperties.lastedit_type<>'CalendareventDeleted'
- $session_condition
- GROUP BY toolitemproperties.ref
- ORDER BY start_date ".$_SESSION['sort'];
- //removed - > AND toolitemproperties.visibility='1'
- }
- // A.3 you are a course admin without any group or user filter
- else
- {
-
- // A.3.a you are a course admin without user or group filter but WITH studentview
- // => see all the messages of all the users and groups without editing possibilities
- if ($_GET['isStudentView']=='true')
- {
- $sql="SELECT
- agenda.*, toolitemproperties.*
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." toolitemproperties
- WHERE agenda.id = toolitemproperties.ref ".$show_all_current."
- AND toolitemproperties.tool='".TOOL_CALENDAR_EVENT."'
- AND toolitemproperties.visibility='1'
- $session_condition
- GROUP BY toolitemproperties.ref
- ORDER BY start_date ".$_SESSION['sort'];
- }
- // A.3.b you are a course admin or a student
- else
- {
- // A.3.b.1 you are a course admin without user or group filter and WITHOUT studentview (= the normal course admin view)
- // => see all the messages of all the users and groups with editing possibilities
- if (api_is_course_admin())
- {
- $sql="SELECT
- agenda.*, toolitemproperties.*
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." toolitemproperties
- WHERE agenda.id = toolitemproperties.ref ".$show_all_current."
- AND toolitemproperties.tool='".TOOL_CALENDAR_EVENT."'
- AND ( toolitemproperties.visibility='0' OR toolitemproperties.visibility='1')
- $session_condition
- GROUP BY toolitemproperties.ref
- ORDER BY start_date ".$_SESSION['sort'];
- }
- else
- {
- // A.3.b.2 you are a student with no group filter possibly showall
- //when showing all the events we do not show the group events
- //todo showing ALL events including the groups events that are available
- $sql="SELECT
- agenda.*, toolitemproperties.*
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." toolitemproperties
- WHERE agenda.id = toolitemproperties.ref ".$show_all_current."
- AND toolitemproperties.tool='".TOOL_CALENDAR_EVENT."'
- AND ( toolitemproperties.visibility='0' OR toolitemproperties.visibility='1')
- $session_condition
- GROUP BY toolitemproperties.ref
- ORDER BY start_date ".$_SESSION['sort'];
- /*
- if (is_array($group_memberships) && count($group_memberships)>0)
- {
- echo $sql="SELECT
- agenda.*, toolitemproperties.*
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." toolitemproperties
- WHERE agenda.id = toolitemproperties.ref ".$show_all_current."
- AND toolitemproperties.tool='".TOOL_CALENDAR_EVENT."'
- AND toolitemproperties.visibility='1' AND toolitemproperties.to_group_id IN (0, ".implode(", ", $group_memberships).")
- $session_condition
- GROUP BY toolitemproperties.ref
- ORDER BY start_date ".$_SESSION['sort'];
- }
- else
- {
- $sql="SELECT
- agenda.*, toolitemproperties.*
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." toolitemproperties
- WHERE agenda.id = toolitemproperties.ref ".$show_all_current."
- AND toolitemproperties.tool='".TOOL_CALENDAR_EVENT."'
- AND toolitemproperties.visibility='1' AND toolitemproperties.to_group_id='0'
- $session_condition
- GROUP BY toolitemproperties.ref
- ORDER BY start_date ".$_SESSION['sort'];
- }
- */
- }
- }
- }
- } //if (is_allowed_to_edit() OR( api_get_course_setting('allow_user_edit_agenda') && !api_is_anonymous()))
- // B. you are a student
- else
- {
- if (is_array($group_memberships) and count($group_memberships)>0)
- {
- $sql="SELECT
- agenda.*, toolitemproperties.*
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." toolitemproperties
- WHERE agenda.id = toolitemproperties.ref ".$show_all_current."
- AND toolitemproperties.tool='".TOOL_CALENDAR_EVENT."'
- AND ( toolitemproperties.to_user_id=$user_id OR toolitemproperties.to_group_id IN (0, ".implode(", ", $group_memberships).") )
- AND toolitemproperties.visibility='1'
- $session_condition
- ORDER BY start_date ".$_SESSION['sort'];
- }
- else
- {
- if ($_user['user_id'])
- {
- $sql="SELECT
- agenda.*, toolitemproperties.*
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." toolitemproperties
- WHERE agenda.id = toolitemproperties.ref ".$show_all_current."
- AND toolitemproperties.tool='".TOOL_CALENDAR_EVENT."'
- AND ( toolitemproperties.to_user_id=$user_id OR toolitemproperties.to_group_id='0')
- AND toolitemproperties.visibility='1'
- $session_condition
- ORDER BY start_date ".$_SESSION['sort'];
- }
- else
- {
- $sql="SELECT
- agenda.*, toolitemproperties.*
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." toolitemproperties
- WHERE agenda.id = toolitemproperties.ref ".$show_all_current."
- AND toolitemproperties.tool='".TOOL_CALENDAR_EVENT."'
- AND toolitemproperties.to_group_id='0'
- AND toolitemproperties.visibility='1'
- $session_condition
- ORDER BY start_date ".$_SESSION['sort'];
- }
- }
- } // you are a student
- //echo "<pre>".$sql."</pre>";
- $result=Database::query($sql,__FILE__,__LINE__) or die(Database::error());
- $number_items=Database::num_rows($result);
- /*--------------------------------------------------
- DISPLAY: NO ITEMS
- --------------------------------------------------*/
- if ($number_items==0)
- {
- echo "<table class=\"data_table\" ><tr><td>".get_lang("NoAgendaItems")."</td></tr></table>";
- }
- /*--------------------------------------------------
- DISPLAY: THE ITEMS
- --------------------------------------------------*/
- $month_bar="";
- $event_list="";
- $counter=0;
- $export_icon = 'export.png';
- $export_icon_low = 'export_low_fade.png';
- $export_icon_high = 'export_high_fade.png';
- while($myrow=Database::fetch_array($result))
- {
- $is_repeated = !empty($myrow['parent_event_id']);
- echo '<table class="data_table">',"\n";
- /*--------------------------------------------------
- display: the month bar
- --------------------------------------------------*/
- // Make the month bar appear only once.
- if ($month_bar != date("m",strtotime($myrow["start_date"])).date("Y",strtotime($myrow["start_date"])))
- {
- $month_bar = date("m",strtotime($myrow["start_date"])).date("Y",strtotime($myrow["start_date"]));
- echo "\t<tr>\n\t\t<td class=\"agenda_month_divider\" colspan=\"3\" valign=\"top\">".
- api_ucfirst(format_locale_date("%B %Y",strtotime($myrow["start_date"]))).
- "</td>\n\t</tr>\n";
- }
- /*--------------------------------------------------
- display: the icon, title, destinees of the item
- -------------------------------------------------*/
- echo '<tr>';
- // highlight: if a date in the small calendar is clicked we highlight the relevant items
- $db_date=(int)date("d",strtotime($myrow["start_date"])).date("n",strtotime($myrow["start_date"])).date("Y",strtotime($myrow["start_date"]));
- if ($_GET["day"].$_GET["month"].$_GET["year"] <>$db_date)
- {
- if ($myrow['visibility']=='0')
- {
- $style="data_hidden";
- $stylenotbold="datanotbold_hidden";
- $text_style="text_hidden";
- }
- else
- {
- $style="data";
- $stylenotbold="datanotbold";
- $text_style="text";
- }
- }
- else
- {
- $style="datanow";
- $stylenotbold="datanotboldnow";
- $text_style="textnow";
- }
- echo "\t\t<th>\n";
- // adding an internal anchor
- echo "\t\t\t<a name=\"".(int)date("d",strtotime($myrow["start_date"]))."\"></a>";
- // the icons. If the message is sent to one or more specific users/groups
- // we add the groups icon
- // 2do: if it is sent to groups we display the group icon, if it is sent to a user we show the user icon
- Display::display_icon('agenda.gif', get_lang('Agenda'));
- if ($myrow['to_group_id']!=='0')
- {
- echo Display::return_icon('group.gif', get_lang('ItemForUserSelection'));
- }
- echo " ".$myrow['title']."\n";
- echo "\t\t</th>\n";
- // the message has been sent to
- echo "\t\t<th>".get_lang("SentTo").": ";
- $sent_to=sent_to(TOOL_CALENDAR_EVENT, $myrow["ref"]);
- $sent_to_form=sent_to_form($sent_to);
- echo $sent_to_form;
- echo "</th>";
- if (!$is_repeated && (api_is_allowed_to_edit(false,true) OR (api_get_course_setting('allow_user_edit_agenda') && !api_is_anonymous())))
- {
- if( ! (api_is_course_coach() && !api_is_element_in_the_session(TOOL_AGENDA, $myrow['id'] ) ) )
- { // a coach can only delete an element belonging to his session
- echo '<th>'.get_lang('Modify');
- echo '</th></tr>';
- }
- }
- /*--------------------------------------------------
- display: the title
- --------------------------------------------------*/
- echo "<tr class='row_odd'>";
- echo "\t\t<td>".get_lang("StartTimeWindow").": ";
- echo api_ucfirst(format_locale_date($dateFormatLong,strtotime($myrow["start_date"])))." ";
- echo api_ucfirst(strftime($timeNoSecFormat,strtotime($myrow["start_date"])))."";
- echo "</td>\n";
- echo "\t\t<td>";
- if ($myrow["end_date"]<>"0000-00-00 00:00:00") {
- echo get_lang("EndTimeWindow").": ";
- echo api_ucfirst(format_locale_date($dateFormatLong,strtotime($myrow["end_date"])))." ";
- echo api_ucfirst(strftime($timeNoSecFormat,strtotime($myrow["end_date"])))."";
- }
- echo "</td>\n";
- // attachment list
- $attachment_list=get_attachment($myrow['id']);
- /*--------------------------------------------------
- display: edit delete button (course admin only)
- --------------------------------------------------*/
- if (!$is_repeated && (api_is_allowed_to_edit(false,true) OR (api_get_course_setting('allow_user_edit_agenda') && !api_is_anonymous())))
- {
- if( ! (api_is_course_coach() && !api_is_element_in_the_session(TOOL_AGENDA, $myrow['id'] ) ) )
- { // a coach can only delete an element belonging to his session
- $mylink = api_get_self().'?'.api_get_cidreq().'&origin='.Security::remove_XSS($_GET['origin']).'&id='.$myrow['id'];
- echo '<td align="center">';
- // edit
- echo '<a href="'.$mylink.api_get_cidreq()."&sort=asc&toolgroup=".Security::remove_XSS($_GET['toolgroup']).'&action=edit&id_attach='.$attachment_list['id'].'" title="'.get_lang("ModifyCalendarItem").'">';
- echo Display::return_icon('edit.gif', get_lang('ModifyCalendarItem'))."</a>";
- echo "<a href=\"".$mylink.api_get_cidreq()."&sort=asc&toolgroup=".Security::remove_XSS($_GET['toolgroup'])."&action=delete\" onclick=\"javascript:if(!confirm('".addslashes(api_htmlentities(get_lang("ConfirmYourChoice"),ENT_QUOTES,$charset))."')) return false;\" title=\"".get_lang("Delete")."\"> ";
- echo Display::return_icon('delete.gif', get_lang('Delete'))."</a>";
- echo '<a href="'.$mylink.api_get_cidreq()."&sort=asc&toolgroup=".Security::remove_XSS($_GET['toolgroup']).'&action=announce" title="'.get_lang("AddAnnouncement").'">';
- echo Display::return_icon('announce_add.gif', get_lang('AddAnnouncement'), array ('style' => 'width:16px; height:16px;'))."</a> ";
- if ($myrow['visibility']==1)
- {
- $image_visibility="visible.gif";
- $text_visibility=get_lang("Hide");
- $next_action = 0;
- }
- else
- {
- $image_visibility="invisible.gif";
- $text_visibility=get_lang("Show");
- $next_action = 1;
- }
- echo '<a href="'.$mylink.api_get_cidreq().'&sort=asc&toolgroup='.Security::remove_XSS($_GET['toolgroup']).'&action=showhide&next_action='.$next_action.'" title="'.$text_visibility.'">'.Display::return_icon($image_visibility, $text_visibility),'</a> ';
- }
- if (!$is_repeated && (api_is_allowed_to_edit(false,true) OR (api_get_course_setting('allow_user_edit_agenda') && !api_is_anonymous())))
- {
- if( ! (api_is_course_coach() && !api_is_element_in_the_session(TOOL_AGENDA, $myrow['id'] ) ) )
- { // a coach can only delete an element belonging to his session
- $td_colspan= '<td colspan="3">';
- }
- else
- {
- $td_colspan= '<td colspan="2">';
- }
- }
- else
- {
- $td_colspan= '<td colspan="2">';
- }
- $mylink = 'ical_export.php?'.api_get_cidreq().'&type=course&id='.$myrow['id'];
- //echo '<a class="ical_export" href="'.$mylink.'&class=confidential" title="'.get_lang('ExportiCalConfidential').'">'.Display::return_icon($export_icon_high, get_lang('ExportiCalConfidential')).'</a> ';
- //echo '<a class="ical_export" href="'.$mylink.'&class=private" title="'.get_lang('ExportiCalPrivate').'">'.Display::return_icon($export_icon_low, get_lang('ExportiCalPrivate')).'</a> ';
- //echo '<a class="ical_export" href="'.$mylink.'&class=public" title="'.get_lang('ExportiCalPublic').'">'.Display::return_icon($export_icon, get_lang('ExportiCalPublic')).'</a> ';
- echo '<a href="#" onclick="javascript:win_print=window.open(\'print.php?id='.$myrow['id'].'\',\'popup\',\'left=100,top=100,width=700,height=500,scrollbars=1,resizable=0\'); win_print.focus(); return false;">'.Display::return_icon('print.gif', get_lang('Print')).'</a> ';
- echo '</td>';
- echo '</tr>';
- }
- /*--------------------------------------------------
- display: the content
- --------------------------------------------------*/
- $content = $myrow['content'];
- $content = make_clickable($content);
- $content = text_filter($content);
- echo "<tr class='row_even'>";
- echo "<td colspan='3'>";
- echo $content;
- // show attachment list
- if (!empty($attachment_list)) {
- $realname=$attachment_list['path'];
- $user_filename=$attachment_list['filename'];
- $full_file_name = 'download.php?file='.$realname;
- echo Display::return_icon('attachment.gif',get_lang('Attachment'));
- echo '<a href="'.$full_file_name.'';
- echo ' "> '.$user_filename.' </a>';
- echo '<span class="forum_attach_comment" >'.$attachment_list['comment'].'</span>';
- if (api_is_allowed_to_edit()) {
- echo ' <a href="'.api_get_self().'?'.api_get_cidreq().'&origin='.Security::remove_XSS($_GET['origin']).'&action=delete_attach&id_attach='.$attachment_list['id'].'" onclick="javascript:if(!confirm(\''.addslashes(api_htmlentities(get_lang("ConfirmYourChoice"),ENT_QUOTES,$charset)).'\')) return false;">'.Display::return_icon('delete.gif',get_lang('Delete')).'</a><br />';
- }
- }
- echo '</td></tr>';
- /*--------------------------------------------------
- display: the added resources
- --------------------------------------------------*/
- if (check_added_resources("Agenda", $myrow["id"]))
- {
- echo '<tr>';
- echo '<td colspan="3">';
- echo "<i>".get_lang("AddedResources")."</i><br/>";
- if ($myrow['visibility']==0)
- {
- $addedresource_style="invisible";
- }
- display_added_resources("Agenda", $myrow["id"], $addedresource_style);
- echo "</td></tr>";
- }
- $event_list.=$myrow['id'].',';
- $counter++;
- /*--------------------------------------------------
- display: jump-to-top icon
- --------------------------------------------------*/
- echo '<tr>';
- echo '<td colspan="3">';
- if($is_repeated){echo get_lang('RepeatedEvent'),' <a href="',api_get_self(),'?',api_get_cidreq(),'&agenda_id=',$myrow['parent_event_id'],'" alt="',get_lang('RepeatedEventViewOriginalEvent'),'">',get_lang('RepeatedEventViewOriginalEvent'),'</a>';}
- echo "<a href=\"#top\">".Display::return_icon('top.gif', get_lang('Top'))."</a></td></tr>";
- echo "</table><br /><br />";
- } // end while ($myrow=Database::fetch_array($result))
- if(!empty($event_list))
- {
- $event_list=api_substr($event_list,0,-1);
- }
- else
- {
- $event_list='0';
- }
- echo "<form name=\"event_list_form\"><input type=\"hidden\" name=\"event_list\" value=\"$event_list\" /></form>";
- // closing the layout table
- echo "</td>",
- "</tr>",
- "</table>";
- }
- /**
- * Show a list with all the attachments according to the post's id
- * @param the post's id
- * @return array with the post info
- * @author Christian Fasanando
- * @version November 2008, dokeos 1.8.6
- */
- function get_attachment($agenda_id) {
- $agenda_table_attachment = Database::get_course_table(TABLE_AGENDA_ATTACHMENT);
- $agenda_id=Database::escape_string($agenda_id);
- $row=array();
- $sql = 'SELECT id,path, filename,comment FROM '. $agenda_table_attachment.' WHERE agenda_id = '.(int)$agenda_id.'';
- $result=Database::query($sql, __FILE__, __LINE__);
- if (Database::num_rows($result)!=0) {
- $row=Database::fetch_array($result);
- }
- return $row;
- }
- /**
- * Displays only 1 agenda item. This is used when an agenda item is added to the learning path.
- * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
- */
- function display_one_agenda_item($agenda_id)
- {
- global $TABLEAGENDA;
- global $TABLE_ITEM_PROPERTY;
- global $select_month, $select_year;
- global $DaysShort, $DaysLong, $MonthsLong;
- global $is_courseAdmin;
- global $dateFormatLong, $timeNoSecFormat, $charset;
- global $_user;
- //echo "displaying agenda items";
- // getting the name of the groups
- $group_names=get_course_groups();
- /*--------------------------------------------------
- CONSTRUCT THE SQL STATEMENT
- --------------------------------------------------*/
- $agenda_id = Database::escape_string($agenda_id);
- $sql="SELECT agenda.*, toolitemproperties.*
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." toolitemproperties
- WHERE agenda.id = toolitemproperties.ref
- AND toolitemproperties.tool='".TOOL_CALENDAR_EVENT."'
- AND toolitemproperties.visibility='1'
- AND agenda.id='$agenda_id'";
- $result=Database::query($sql,__FILE__,__LINE__) or die(Database::error());
- $number_items=Database::num_rows($result);
- $myrow=Database::fetch_array($result); // there should be only one item so no need for a while loop
- $sql_rep = "SELECT * FROM $TABLEAGENDA WHERE id = $agenda_id AND parent_event_id IS NOT NULL AND parent_event_id !=0";
- $res_rep = Database::query($sql_rep,__FILE__,__LINE__);
- $repeat = false;
- $repeat_id = 0;
- if(Database::num_rows($res_rep)>0)
- {
- $repeat=true;
- $row_rep = Database::fetch_array($res_rep);
- $repeat_id = $row_rep['parent_event_id'];
- }
- /*--------------------------------------------------
- DISPLAY: NO ITEMS
- --------------------------------------------------*/
- if ($number_items==0)
- {
- echo "<table id=\"data_table\" class=\"data_table\"><tr><td>".get_lang("NoAgendaItems")."</td></tr></table>";
- }
- /*--------------------------------------------------
- DISPLAY: THE ITEMS
- --------------------------------------------------*/
- echo "<table id=\"data_table\" class=\"data_table\">\n";
- /*--------------------------------------------------
- DISPLAY : the icon, title, destinees of the item
- --------------------------------------------------*/
- echo "\t<tr>\n";
- // highlight: if a date in the small calendar is clicked we highlight the relevant items
- $db_date=(int)date("d",strtotime($myrow["start_date"])).date("n",strtotime($myrow["start_date"])).date("Y",strtotime($myrow["start_date"]));
- if ($_GET["day"].$_GET["month"].$_GET["year"] <>$db_date)
- {
- if ($myrow['visibility']=='0')
- {
- $style="data_hidden";
- $stylenotbold="datanotbold_hidden";
- $text_style="text_hidden";
- }
- else
- {
- $style="data";
- $stylenotbold="datanotbold";
- $text_style="text";
- }
- }
- else
- {
- $style="datanow";
- $stylenotbold="datanotboldnow";
- $text_style="textnow";
- }
- echo "\t\t<th>\n";
- // adding an internal anchor
- echo "\t\t\t<a name=\"".(int)date("d",strtotime($myrow["start_date"]))."\"></a>";
- // the icons. If the message is sent to one or more specific users/groups
- // we add the groups icon
- // 2do: if it is sent to groups we display the group icon, if it is sent to a user we show the user icon
- echo Display::return_icon('agenda.gif');
- if ($myrow['to_group_id']!=='0')
- {
- echo Display::return_icon('group.gif');
- }
- echo " ".$myrow['title']."\n";
- echo "\t\t</th>\n";
- // the message has been sent to
- echo "\t\t<th>".get_lang("SentTo").": ";
- $sent_to=sent_to(TOOL_CALENDAR_EVENT, $myrow["ref"]);
- $sent_to_form=sent_to_form($sent_to);
- echo $sent_to_form;
- echo "</th>";
- if (api_is_allowed_to_edit()) {
- if( ! (api_is_course_coach() && !api_is_element_in_the_session(TOOL_AGENDA, $myrow['id'] ) ) )
- { // a coach can only delete an element belonging to his session
- echo '<th>'.get_lang('Modify');
- echo '</th></tr>';
- }
- }
- /*--------------------------------------------------
- DISPLAY: the title
- --------------------------------------------------*/
- echo "\t<tr class='row_odd'>\n";
- echo "\t\t<td>".get_lang("StartTime").": ";
- echo api_ucfirst(format_locale_date($dateFormatLong,strtotime($myrow["start_date"])))." ";
- echo api_ucfirst(strftime($timeNoSecFormat,strtotime($myrow["start_date"])))."";
- echo "</td>\n";
- echo "\t\t<td>".get_lang("EndTime").": ";
- echo api_ucfirst(format_locale_date($dateFormatLong,strtotime($myrow["end_date"])))." ";
- echo api_ucfirst(strftime($timeNoSecFormat,strtotime($myrow["end_date"])))."";
- echo "</td>\n";
- /*--------------------------------------------------
- DISPLAY: edit delete button (course admin only)
- --------------------------------------------------*/
- $export_icon = '../img/export.png';
- $export_icon_low = '../img/export_low_fade.png';
- $export_icon_high = '../img/export_high_fade.png';
- if (api_is_allowed_to_edit()) {
- echo '<td colspan="2">';
- if (!$repeat && api_is_allowed_to_edit(false,true)) {
- // edit
- $mylink = api_get_self()."?".api_get_cidreq()."&origin=".Security::remove_XSS($_GET['origin'])."&id=".$myrow['id'];
- if (!empty($_GET['agenda_id']))
- {
- // rather ugly hack because the id parameter is already set above but below we set it again
- $mylink .= '&agenda_id='.Security::remove_XSS($_GET['agenda_id']).'&id='.Security::remove_XSS($_GET['agenda_id']);
- }
- echo "<a href=\"".$mylink."&action=edit\">",
- Display::return_icon('edit.gif', get_lang('ModifyCalendarItem')), "</a>",
- "<a href=\"".$mylink."&action=delete\" onclick=\"javascript:if(!confirm('".addslashes(api_htmlentities(get_lang("ConfirmYourChoice"),ENT_QUOTES,$charset))."')) return false;\">",
- Display::return_icon('delete.gif', get_lang('Delete')),"</a>";
- if ($myrow['visibility']==1) {
- $image_visibility="visible";
- } else {
- $image_visibility="invisible";
- }
- echo '<a href="'.$mylink.'&action=showhide">',Display::return_icon($image_visibility.'.gif', get_lang('Visible')),'</a>';
- }
- $mylink = 'ical_export.php?'.api_get_cidreq().'&type=course&id='.$myrow['id'];
- //echo '<a class="ical_export" href="'.$mylink.'&class=confidential" title="'.get_lang('ExportiCalConfidential').'">'.Display::return_icon($export_icon_high, get_lang('ExportiCalConfidential')).'</a> ';
- //echo '<a class="ical_export" href="'.$mylink.'&class=private" title="'.get_lang('ExportiCalPrivate').'">'.Display::return_icon($export_icon_low, get_lang('ExportiCalPrivate')).'</a> ';
- //echo '<a class="ical_export" href="'.$mylink.'&class=public" title="'.get_lang('ExportiCalPublic').'">'.Display::return_icon($export_icon, get_lang('ExportiCalPublic')).'</a> ';
- echo '<a href="javascript: void(0);" onclick="javascript:win_print=window.open(\'print.php?id='.$myrow['id'].'\',\'popup\',\'left=100,top=100,width=700,height=500,scrollbars=1,resizable=0\'); win_print.focus(); return false;">'.Display::return_icon('print.gif', get_lang('Print')).'</a> ';
- echo "</td></tr>";
- if($repeat) {
- echo '<tr>';
- echo '<td colspan="2">',get_lang('RepeatedEvent'),'<a href="',api_get_self(),'?',api_get_cidreq(),'&agenda_id=',$repeat_id,'" alt="',get_lang('RepeatedEventViewOriginalEvent'),'">',get_lang('RepeatedEventViewOriginalEvent'),'</a></td>';
- echo '</tr>';
- }
- }
- /*--------------------------------------------------
- DISPLAY: the content
- --------------------------------------------------*/
- $content = $myrow['content'];
- $content = make_clickable($content);
- $content = text_filter($content);
- //echo "\t<tr>\n\t\t<td class=\"".$text_style."\" colspan='2'>";
- //echo $content;
- //echo "</td></tr>";
- echo "<tr class='row_even'>";
- echo '<td '.(api_is_allowed_to_edit()?'colspan="3"':'colspan="2"'). '>';
- echo $content;
- echo '</td></tr>';
- /*--------------------------------------------------
- DISPLAY: the added resources
- --------------------------------------------------*/
- if (check_added_resources("Agenda", $myrow["id"])) {
- echo "<tr><td colspan='3'>";
- echo "<i>".get_lang("AddedResources")."</i><br/>";
- if ($myrow['visibility']==0)
- {
- $addedresource_style="invisible";
- }
- display_added_resources("Agenda", $myrow["id"], $addedresource_style);
- echo "</td></tr>";
- }
- // closing the layout table
- echo "</td>",
- "</tr>",
- "</table>";
- }
- /**
- * Show the form for adding a new agenda item. This is the same function that is used whenever we are editing an
- * agenda item. When the id parameter is empty (default behaviour), then we show an empty form, else we are editing and
- * we have to retrieve the information that is in the database and use this information in the forms.
- * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
- * @param integer id, the id of the agenda item we are editing. By default this is empty which means that we are adding an
- * agenda item.
- */
- function show_add_form($id = '')
- {
- global $MonthsLong;
- $htmlHeadXtra[] = to_javascript();
- // the default values for the forms
- if ($_GET['originalresource'] !== 'no')
- {
- $day = date('d');
- $month = date('m');
- $year = date('Y');
- $hours = 9;
- $minutes= '00';
- $end_day = date('d');
- $end_month = date('m');
- $end_year = date('Y');
- $end_hours = 17;
- $end_minutes= '00';
- $repeat = false;
- }
- else
- {
- // we are coming from the resource linker so there might already have been some information in the form.
- // When we clicked on the button to add resources we stored every form information into a session and now we
- // are doing the opposite thing: getting the information out of the session and putting it into variables to
- // display it in the forms.
- $form_elements=$_SESSION['formelements'];
- $day=$form_elements['day'];
- $month=$form_elements['month'];
- $year=$form_elements['year'];
- $hours=$form_elements['hour'];
- $minutes=$form_elements['minutes'];
- $end_day=$form_elements['end_day'];
- $end_month=$form_elements['end_month'];
- $end_year=$form_elements['end_year'];
- $end_hours=$form_elements['end_hours'];
- $end_minutes=$form_elements['end_minutes'];
- $title=$form_elements['title'];
- $content=$form_elements['content'];
- $id=$form_elements['id'];
- $to=$form_elements['to'];
- $repeat = $form_elements['repeat'];
- }
- // switching the send to all/send to groups/send to users
- if ($_POST['To'])
- {
- $day = $_POST['fday'];
- $month = $_POST['fmonth'];
- $year = $_POST['fyear'];
- $hours = $_POST['fhour'];
- $minutes = $_POST['fminute'];
- $end_day = $_POST['end_fday'];
- $end_month = $_POST['end_fmonth'];
- $end_year = $_POST['end_fyear'];
- $end_hours = $_POST['end_fhour'];
- $end_minutes = $_POST['end_fminute'];
- $title = $_POST['title'];
- $content = $_POST['content'];
- // the invisible fields
- $action = $_POST['action'];
- $id = $_POST['id'];
- $repeat = !empty($_POST['repeat'])?true:false;
- }
- // if the id is set then we are editing an agenda item
- if (is_int($id))
- {
- //echo "before get_agenda_item".$_SESSION['allow_individual_calendar'];
- $item_2_edit=get_agenda_item($id);
- $title = $item_2_edit['title'];
- $content= $item_2_edit['content'];
- // start date
- list($datepart, $timepart) = split(" ", $item_2_edit['start_date']);
- list($year, $month, $day) = explode("-", $datepart);
- list($hours, $minutes, $seconds) = explode(":", $timepart);
- // end date
- list($datepart, $timepart) = split(" ", $item_2_edit['end_date']);
- list($end_year, $end_month, $end_day) = explode("-", $datepart);
- list($end_hours, $end_minutes, $end_seconds) = explode(":", $timepart);
- // attachments
- edit_added_resources("Agenda", $id);
- $to=$item_2_edit['to'];
- //echo "<br />after get_agenda_item".$_SESSION['allow_individual_calendar'];
- }
- $content=stripslashes($content);
- $title=stripslashes($title);
- // we start a completely new item, we do not come from the resource linker
- if ($_GET['originalresource']!=="no" and $_GET['action']=="add")
- {
- $_SESSION["formelements"]=null;
- unset_session_resources();
- }
- ?>
- <!-- START OF THE FORM -->
- <form enctype="multipart/form-data" action="<?php echo api_get_self().'?origin='.$_GET['origin'].api_get_cidreq()."&sort=asc&toolgroup=".Security::remove_XSS($_GET['toolgroup']).'&action='.$_GET['action']; ?>" method="post" name="new_calendar_item">
- <input type="hidden" name="id" value="<?php if (isset($id)) echo $id; ?>" />
- <input type="hidden" name="action" value="<?php if (isset($_GET['action'])) echo $_GET['action']; ?>" />
- <input type="hidden" name="id_attach" value="<?php echo Security::remove_XSS($_REQUEST['id_attach']); ?>" />
- <input type="hidden" name="sort" value="asc" />
- <input type="hidden" name="submit_event" value="ok" />
- <?php
- // The form title
- if (isset($id) AND $id<>'')
- {
- $form_title = get_lang('ModifyCalendarItem');
- }
- else
- {
- $form_title = get_lang('AddCalendarItem');
- }
- echo '<div class="row"><div class="form_header">'.$form_title.'</div></div>';
- // selecting the users / groups
- if (isset ($_SESSION['toolgroup']))
- {
- echo '<input type="hidden" name="selectedform[0]" value="GROUP:'.intval($_SESSION['toolgroup']).'"/>' ;
- echo '<input type="hidden" name="To" value="true"/>' ;
- }
- else
- {
- echo ' <div class="row">
- <div class="label">
- <a href="javascript: void(0);" onclick="if(document.getElementById(\'recipient_list\').style.display==\'none\') document.getElementById(\'recipient_list\').style.display=\'block\'; else document.getElementById(\'recipient_list\').style.display=\'none\';">'.Display::return_icon('group.gif', get_lang('SentTo'), array ('align' => 'absmiddle')).' '.get_lang('SentTo').'</a>
- </div>
- <div class="formw">';
- if ((isset($_GET['id']) && $to=='everyone') || !isset($_GET['id']))
- {
- echo get_lang("Everybody").' ';
- }
- show_to_form($to);
- if (isset($_GET['id']) && $to!='everyone') {
- echo '<script>document.getElementById(\'recipient_list\').style.display=\'block\';</script>';
- }
- echo ' </div>
- </div>';
- }
- // start date and time
- echo '<div class="row">
- <div class="label">
- '.get_lang('StartDate').'
- </div>
- <div class="formw">
- <div id="err_date" style="display:none;color:red"></div>
- <div id="err_start_date" style="display:none;color:red"></div>';
- ?>
- <select name="fday" onchange="javascript:document.new_calendar_item.end_fday.value=this.value;">
- <?php
- // small loop for filling all the dates
- // 2do: the available dates should be those of the selected month => february is from 1 to 28 (or 29) and not to 31
- echo "\n";
- foreach (range(1, 31) as $i)
- {
- // values have to have double digits
- $value = ($i <= 9 ? '0'.$i : $i );
- // the current day is indicated with [] around the date
- if ($value==$day)
- {
- echo "\t\t\t\t <option value=\"".$value."\" selected> ".$i." </option>\n";
- }
- else
- {
- echo "\t\t\t\t<option value=\"$value\">$i</option>\n";
- }
- }
- ?>
- </select>
- <select name="fmonth" onchange="javascript:document.new_calendar_item.end_fmonth.value=this.value;">
- <?php
- echo "\n";
- for ($i=1; $i<=12; $i++)
- {
- // values have to have double digits
- if ($i<=9)
- {
- $value="0".$i;
- }
- else
- {
- $value=$i;
- }
- if ($value==$month)
- {
- echo "\t\t\t\t <option value=\"".$value."\" selected>".$MonthsLong[$i-1]."</option>\n";
- }
- else
- {
- echo "\t\t\t\t <option value=\"".$value."\">".$MonthsLong[$i-1]."</option>\n";
- }
- } ?>
- </select>
- <select name="fyear" onchange="javascript:document.new_calendar_item.end_fyear.value=this.value;">
- <option value="<?php echo ($year-1); ?>"><?php echo ($year-1); ?></option>
- <option value="<?php echo $year; ?>" selected="selected"><?php echo $year; ?></option>
- <?php
- echo "\n";
- for ($i=1; $i<=5; $i++)
- {
- $value=$year+$i;
- echo "\t\t\t\t<option value=\"$value\">$value</option>\n";
- } ?>
- </select>
- <a href="javascript:openCalendar('new_calendar_item', 'f')"><?php Display::display_icon('calendar_select.gif', get_lang('Select'), array ('style' => 'vertical-align: middle;')); ?></a>
- <?php echo get_lang('StartTime').": \n"; ?>
- <select name="fhour" onchange="javascript:document.new_calendar_item.end_fhour.value=this.value;">
- <!-- <option value="--">--</option> -->
- <?php
- echo "\n";
- foreach (range(0, 23) as $i)
- {
- // values have to have double digits
- $value = ($i <= 9 ? '0'.$i : $i );
- // the current hour is indicated with [] around the hour
- if ($hours==$value)
- {
- echo "\t\t\t\t<option value=\"".$value."\" selected> ".$value." </option>\n";
- }
- else
- {
- echo "\t\t\t\t<option value=\"$value\">$value</option>\n";
- }
- } ?>
- </select>
- <select name="fminute" onchange="javascript:document.new_calendar_item.end_fminute.value=this.value;">
- <!-- <option value="<?php echo $minutes ?>"><?php echo $minutes; ?></option> -->
- <!-- <option value="--">--</option> -->
- <?php
- foreach (range(0, 59) as $i)
- {
- // values have to have double digits
- $value = ($i <= 9 ? '0'.$i : $i );
- echo "\t\t\t\t<option value=\"$value\">$value</option>\n";
- } ?>
- </select>
- <?php
- echo ' </div>
- </div>';
- // end date and time
- echo '<div class="row">
- <div class="label">
- '.get_lang('EndDate').'
- </div>
- <div class="formw">
- <div id="err_end_date" style="display:none;color:red"></div>';
- ?>
- <select name="end_fday">
- <?php
- // small loop for filling all the dates
- // 2do: the available dates should be those of the selected month => february is from 1 to 28 (or 29) and not to 31
- echo "\n";
- foreach (range(1, 31) as $i)
- {
- // values have to have double digits
- $value = ($i <= 9 ? '0'.$i : $i );
- // the current day is indicated with [] around the date
- if ($value==$end_day)
- { echo "\t\t\t\t <option value=\"".$value."\" selected> ".$i." </option>\n";}
- else
- { echo "\t\t\t\t <option value=\"".$value."\">".$i."</option>\n"; }
- }?>
- </select>
- <!-- month: january -> december -->
- <select name="end_fmonth">
- <?php
- echo "\n";
- foreach (range(1, 12) as $i)
- {
- // values have to have double digits
- $value = ($i <= 9 ? '0'.$i : $i );
- if ($value==$end_month)
- { echo "\t\t\t\t <option value=\"".$value."\" selected>".$MonthsLong[$i-1]."</option>\n"; }
- else
- { echo "\t\t\t\t <option value=\"".$value."\">".$MonthsLong[$i-1]."</option>\n"; }
- }?>
- </select>
- <select name="end_fyear">
- <option value="<?php echo ($end_year-1) ?>"><?php echo ($end_year-1) ?></option>
- <option value="<?php echo $end_year ?>" selected> <?php echo $end_year ?> </option>
- <?php
- echo "\n";
- for ($i=1; $i<=5; $i++)
- {
- $value=$end_year+$i;
- echo "\t\t\t\t<option value=\"$value\">$value</option>\n";
- } ?>
- </select>
- <a href="javascript:openCalendar('new_calendar_item', 'end_f')"><?php Display::display_icon('calendar_select.gif', get_lang('Select'), array ('style' => 'vertical-align: middle;')); ?></a>
- <?php echo get_lang('EndTime').": \n"; ?>
- <select name="end_fhour">
- <!-- <option value="--">--</option> -->
- <?php
- echo "\n";
- foreach (range(0, 23) as $i)
- {
- // values have to have double digits
- $value = ($i <= 9 ? '0'.$i : $i );
- // the current hour is indicated with [] around the hour
- if ($end_hours==$value)
- { echo "\t\t\t\t<option value=\"".$value."\" selected> ".$value." </option>\n"; }
- else
- { echo "\t\t\t\t<option value=\"".$value."\"> ".$value." </option>\n"; }
- } ?>
- </select>
- <select name="end_fminute">
- <!-- <option value="<?php echo $end_minutes; ?>"><?php echo $end_minutes; ?></option> -->
- <!-- <option value="--">--</option> -->
- <?php
- foreach (range(0, 59) as $i)
- {
- // values have to have double digits
- $value = ($i <= 9 ? '0'.$i : $i );
- echo "\t\t\t\t<option value=\"$value\">$value</option>\n";
- } ?>
- </select>
- <?php
- echo ' </div>
- </div>';
- // the title of the agenda item
- echo ' <div class="row">
- <div class="label">
- <span class="form_required">*</span>'.get_lang('ItemTitle').'
- </div>
- <div class="formw">
- <div id="err_title" style="display:none;color:red"></div>
- <input type="text" size="60" name="title" value="';
- if (isset($title)) echo $title;
- echo '" />
- </div>
- </div>';
- // the main area of the agenda item: the wysiwyg editor
- echo ' <div class="row">
- <div class="label">
- <span class="form_required">*</span>'.get_lang('Description').'
- </div>
- <div class="formw">';
- require_once(api_get_path(LIBRARY_PATH) . "/fckeditor/fckeditor.php");
- $oFCKeditor = new FCKeditor('content') ;
- $oFCKeditor->Width = '100%';
- $oFCKeditor->Height = '200';
- if(!api_is_allowed_to_edit(null,true))
- {
- $oFCKeditor->ToolbarSet = 'AgendaStudent';
- }
- else
- {
- $oFCKeditor->ToolbarSet = 'Agenda';
- }
- $oFCKeditor->Value = $content;
- $return = $oFCKeditor->CreateHtml();
- echo $return;
- echo ' </div>
- </div>';
- // the added resources
- /*echo ' <div class="row">
- <div class="label">
- '.get_lang('AddedResources').'
- </div>
- <div class="formw">';
- if ($_SESSION['allow_individual_calendar']=='show')
- show_addresource_button('onclick="selectAll(this.form.elements[6],true)"');
- else
- show_addresource_button();
- $form_elements=$_SESSION['formelements'];
- echo display_resources(0);
- $test=$_SESSION['addedresource'];
- echo ' </div>
- </div>';
- */
- // File attachment
- echo ' <div class="row">
- <div class="label">
- <a href="javascript://" onclick="return plus_attachment();"><span id="plus"><img style="vertical-align:middle;" src="../img/div_show.gif" alt="" /> '.get_lang('AddAnAttachment').'</span></a>
- </div>
- <div class="formw">
- <table id="options" style="display: none;">
- <tr>
- <td colspan="2">
- <label for="file_name">'.get_lang('FileName').' </label>
- <input type="file" name="user_upload"/>
- </td>
- </tr>
- <tr>
- <td colspan="2">
- <label for="comment">'.get_lang('FileComment').'</label><br />
- <textarea name="file_comment" rows ="4" cols = "34" ></textarea>
- </td>
- </tr>
- </table>
- </div>
- </div>';
- // Repeating the calendar item
- if(empty($id)) //only show repeat fields when adding, not for editing an calendar item
- {
- echo ' <div class="row">
- <div class="label">
- <a href="javascript://" onclick="return plus_repeated_event();"><span id="plus2"><img style="vertical-align:middle;" src="../img/div_show.gif" alt="" /> '.get_lang('RepeatEvent').'</span></a>
- </div>
- <div class="formw">';
- ?>
- <table id="options2" style="display: none;">
- <tr>
- <td><label for="repeat"><?php echo get_lang('RepeatEvent');?></label></td>
- <td><input type="checkbox" name="repeat" <?php echo ($repeat?'checked="checked"':'');?>/></td>
- </tr>
- <tr>
- <td><label for="repeat_type"><?php echo get_lang('RepeatType');?></label></td>
- <td>
- <select name="repeat_type">
- <option value="daily"><?php echo get_lang('RepeatDaily');?></option>
- <option value="weekly"><?php echo get_lang('RepeatWeekly');?></option>
- <option value="monthlyByDate"><?php echo get_lang('RepeatMonthlyByDate');?></option>
- <!--option value="monthlyByDay"><?php echo get_lang('RepeatMonthlyByDay');?></option>
- <option value="monthlyByDayR"><?php echo get_lang('RepeatMonthlyByDayR');?></option-->
- <option value="yearly"><?php echo get_lang('RepeatYearly');?></option>
- </select>
- </td>
- </tr>
- <tr>
- <td><label for="repeat_end_day"><?php echo get_lang('RepeatEnd');?></label></td>
- <td>
- <select name="repeat_end_day">
- <?php
- // small loop for filling all the dates
- // 2do: the available dates should be those of the selected month => february is from 1 to 28 (or 29) and not to 31
- echo "\n";
- foreach (range(1, 31) as $i)
- {
- // values have to have double digits
- $value = ($i <= 9 ? '0'.$i : $i );
- // the current day is indicated with [] around the date
- if ($value==$end_day)
- { echo "\t\t\t\t <option value=\"".$value."\" selected> ".$i." </option>\n";}
- else
- { echo "\t\t\t\t <option value=\"".$value."\">".$i."</option>\n"; }
- }?>
- </select>
- <!-- month: january -> december -->
- <select name="repeat_end_month">
- <?php
- echo "\n";
- foreach (range(1, 12) as $i)
- {
- // values have to have double digits
- $value = ($i <= 9 ? '0'.$i : $i );
- if ($value==$end_month+1)
- { echo "\t\t\t\t ",'<option value="',$value,'" selected="selected">',$MonthsLong[$i-1],"</option>\n"; }
- else
- { echo "\t\t\t\t ",'<option value="',$value,'">',$MonthsLong[$i-1],"</option>\n"; }
- }?>
- </select>
- <select name="repeat_end_year">
- <option value="<?php echo ($end_year-1) ?>"><?php echo ($end_year-1) ?></option>
- <option value="<?php echo $end_year ?>" selected> <?php echo $end_year ?> </option>
- <?php
- echo "\n";
- for ($i=1; $i<=5; $i++)
- {
- $value=$end_year+$i;
- echo "\t\t\t\t<option value=\"$value\">$value</option>\n";
- } ?>
- </select>
- <a href="javascript:openCalendar('new_calendar_item', 'repeat_end_')"><?php Display::display_icon('calendar_select.gif', get_lang('Select'), array ('style' => 'vertical-align: middle;')); ?></a>
- </td>
- </tr>
- </table>
- <?php
- echo ' </div>
- </div>';
- }//only show repeat fields if adding, not if editing
- // the submit button for storing the calendar item
- echo ' <div class="row">
- <div class="label">
- </div>
- <div class="formw">';
- if(isset($_GET['id']) ) {
- $class='save';
- $text=get_lang('ModifyEvent');
- } else {
- $class='add';
- $text=get_lang('AgendaAdd');
- }
- echo '<button class="'.$class.'" type="button" name="name" onclick="selectAll(document.getElementById(\'selected_form\'),true)">'.$text.'</button>';
- echo ' </div>
- </div>';
- ?>
- </form>
- <?php
- }
- function get_agendaitems($month, $year)
- {
- global $_user;
- global $_configuration;
- $items = array ();
- $month = Database::escape_string($month);
- $year = Database::escape_string($year);
- //databases of the courses
- $TABLEAGENDA = Database :: get_course_table(TABLE_AGENDA);
- $TABLE_ITEMPROPERTY = Database :: get_course_table(TABLE_ITEM_PROPERTY);
- $group_memberships = GroupManager :: get_group_ids(Database::get_current_course_database(), $_user['user_id']);
- // if the user is administrator of that course we show all the agenda items
- if (api_is_allowed_to_edit(false,true)) {
- //echo "course admin";
- $sqlquery = "SELECT
- DISTINCT agenda.*, item_property.*
- FROM ".$TABLEAGENDA." agenda,
- ".$TABLE_ITEMPROPERTY." item_property
- WHERE agenda.id = item_property.ref
- AND MONTH(agenda.start_date)='".$month."'
- AND YEAR(agenda.start_date)='".$year."'
- AND item_property.tool='".TOOL_CALENDAR_EVENT."'
- AND item_property.visibility='1'
- GROUP BY agenda.id
- ORDER BY start_date ";
- }
- // if the user is not an administrator of that course
- else
- {
- //echo "GEEN course admin";
- if (is_array($group_memberships) && count($group_memberships)>0)
- {
- $sqlquery = "SELECT
- agenda.*, item_property.*
- FROM ".$TABLEAGENDA." agenda,
- ".$TABLE_ITEMPROPERTY." item_property
- WHERE agenda.id = item_property.ref
- AND MONTH(agenda.start_date)='".$month."'
- AND YEAR(agenda.start_date)='".$year."'
- AND item_property.tool='".TOOL_CALENDAR_EVENT."'
- AND ( item_property.to_user_id='".$_user['user_id']."' OR item_property.to_group_id IN (0, ".implode(", ", $group_memberships).") )
- AND item_property.visibility='1'
- ORDER BY start_date ";
- }
- else
- {
- $sqlquery = "SELECT
- agenda.*, item_property.*
- FROM ".$TABLEAGENDA." agenda,
- ".$TABLE_ITEMPROPERTY." item_property
- WHERE agenda.id = item_property.ref
- AND MONTH(agenda.start_date)='".$month."'
- AND YEAR(agenda.start_date)='".$year."'
- AND item_property.tool='".TOOL_CALENDAR_EVENT."'
- AND ( item_property.to_user_id='".$_user['user_id']."' OR item_property.to_group_id='0')
- AND item_property.visibility='1'
- ORDER BY start_date ";
- }
- }
- $mycourse = api_get_course_info();
- $result = Database::query($sqlquery, __FILE__, __LINE__);
- global $_configuration;
- $root_url = $_configuration['root_web'];
- if ($_configuration['multiple_access_urls']==true) {
- $access_url_id = api_get_current_access_url_id();
- if ($access_url_id != -1 ){
- $url = api_get_access_url($access_url_id);
- $root_url = $url['url'];
- }
- }
- while ($item = Database::fetch_array($result))
- {
- $agendaday = date('j',strtotime($item['start_date']));
- $time= date('H:i',strtotime($item['start_date']));
- $URL = $root_url.'main/calendar/agenda.php?cidReq='.$mycourse['id']."&day=$agendaday&month=$month&year=$year#$agendaday"; // RH //Patrick Cool: to highlight the relevant agenda item
- $items[$agendaday][$item['start_time']] .= '<i>'.$time.'</i> <a href="'.$URL.'" title="'.$mycourse['name'].'">'.$mycourse['official_code'].'</a> '.$item['title'].'<br />';
- }
- // sorting by hour for every day
- $agendaitems = array ();
- while (list ($agendaday, $tmpitems) = each($items))
- {
- sort($tmpitems);
- while (list ($key, $val) = each($tmpitems))
- {
- $agendaitems[$agendaday] .= $val;
- }
- }
- return $agendaitems;
- }
- function display_upcoming_events()
- {
- echo '<b>'.get_lang('UpcomingEvent').'</b><br />';
- $number_of_items_to_show = (int)api_get_setting('number_of_upcoming_events');
- //databases of the courses
- $TABLEAGENDA = Database :: get_course_table(TABLE_AGENDA);
- $TABLE_ITEMPROPERTY = Database :: get_course_table(TABLE_ITEM_PROPERTY);
- $mycourse = api_get_course_info();
- $myuser = api_get_user_info();
- $group_memberships = GroupManager :: get_group_ids($mycourse['dbName'], $myuser['user_id']);
- // if the user is administrator of that course we show all the agenda items
- if (api_is_allowed_to_edit(false,true))
- {
- //echo "course admin";
- $sqlquery = "SELECT
- DISTINCT agenda.*, item_property.*
- FROM ".$TABLEAGENDA." agenda,
- ".$TABLE_ITEMPROPERTY." item_property
- WHERE agenda.id = item_property.ref
- AND item_property.tool='".TOOL_CALENDAR_EVENT."'
- AND item_property.visibility='1'
- AND agenda.start_date > NOW()
- GROUP BY agenda.id
- ORDER BY start_date ";
- }
- // if the user is not an administrator of that course
- else
- {
- //echo "GEEN course admin";
- if (is_array($group_memberships) and count($group_memberships)>0)
- {
- $sqlquery = "SELECT
- agenda.*, item_property.*
- FROM ".$TABLEAGENDA." agenda,
- ".$TABLE_ITEMPROPERTY." item_property
- WHERE agenda.id = item_property.ref
- AND item_property.tool='".TOOL_CALENDAR_EVENT."'
- AND ( item_property.to_user_id='".$myuser['user_id']."' OR item_property.to_group_id IN (0, ".implode(", ", $group_memberships).") )
- AND item_property.visibility='1'
- AND agenda.start_date > NOW()
- ORDER BY start_date ";
- }
- else
- {
- $sqlquery = "SELECT
- agenda.*, item_property.*
- FROM ".$TABLEAGENDA." agenda,
- ".$TABLE_ITEMPROPERTY." item_property
- WHERE agenda.id = item_property.ref
- AND item_property.tool='".TOOL_CALENDAR_EVENT."'
- AND ( item_property.to_user_id='".$myuser['user_id']."' OR item_property.to_group_id='0')
- AND item_property.visibility='1'
- AND agenda.start_date > NOW()
- ORDER BY start_date ";
- }
- }
- $result = Database::query($sqlquery, __FILE__, __LINE__);
- $counter = 0;
- while ($item = Database::fetch_array($result,'ASSOC'))
- {
- if ($counter < $number_of_items_to_show)
- {
- echo $item['start_date'],' - ',$item['title'],'<br />';
- $counter++;
- }
- }
- }
- /**
- * This function calculates the startdate of the week (monday)
- * and the enddate of the week (sunday)
- * and returns it as an array
- */
- function calculate_start_end_of_week($week_number, $year)
- {
- // determine the start and end date
- // step 1: we calculate a timestamp for a day in this week
- $random_day_in_week = mktime(0, 0, 0, 1, 1, $year) + ($week_number-1) * (7 * 24 * 60 * 60); // we calculate a random day in this week
- // step 2: we which day this is (0=sunday, 1=monday, ...)
- $number_day_in_week = date('w', $random_day_in_week);
- // step 3: we calculate the timestamp of the monday of the week we are in
- $start_timestamp = $random_day_in_week - (($number_day_in_week -1) * 24 * 60 * 60);
- // step 4: we calculate the timestamp of the sunday of the week we are in
- $end_timestamp = $random_day_in_week + ((7 - $number_day_in_week +1) * 24 * 60 * 60) - 3600;
- // step 5: calculating the start_day, end_day, start_month, end_month, start_year, end_year
- $start_day = date('j', $start_timestamp);
- $start_month = date('n', $start_timestamp);
- $start_year = date('Y', $start_timestamp);
- $end_day = date('j', $end_timestamp);
- $end_month = date('n', $end_timestamp);
- $end_year = date('Y', $end_timestamp);
- $start_end_array['start']['day'] = $start_day;
- $start_end_array['start']['month'] = $start_month;
- $start_end_array['start']['year'] = $start_year;
- $start_end_array['end']['day'] = $end_day;
- $start_end_array['end']['month'] = $end_month;
- $start_end_array['end']['year'] = $end_year;
- return $start_end_array;
- }
- /**
- * Show the mini calendar of the given month
- */
- function display_daycalendar($agendaitems, $day, $month, $year, $weekdaynames, $monthName)
- {
- global $DaysShort, $DaysLong, $course_path;
- global $MonthsLong;
- global $query;
- // timestamp of today
- $today = mktime();
- $nextday = $today + (24 * 60 * 60);
- $previousday = $today - (24 * 60 * 60);
- // the week number of the year
- $week_number = date("W", $today);
- // if we moved to the next / previous day we have to recalculate the $today variable
- if ($_GET['day'])
- {
- $today = mktime(0, 0, 0, $month, $day, $year);
- $nextday = $today + (24 * 60 * 60);
- $previousday = $today - (24 * 60 * 60);
- $week_number = date("W", $today);
- }
- // calculating the start date of the week
- // the date of the monday of this week is the timestamp of today minus
- // number of days that have already passed this week * 24 hours * 60 minutes * 60 seconds
- $current_day = date("j", $today); // Day of the month without leading zeros (1 to 31) of today
- $day_of_the_week = date("w", $today); // Numeric representation of the day of the week 0 (for Sunday) through 6 (for Saturday) of today
- //$timestamp_first_date_of_week=$today-(($day_of_the_week-1)*24*60*60); // timestamp of the monday of this week
- //$timestamp_last_date_of_week=$today+((7-$day_of_the_week)*24*60*60); // timestamp of the sunday of this week
- // we are loading all the calendar items of all the courses for today
- echo "<table class=\"data_table\">\n";
- // the forward and backwards url
- $backwardsURL = api_get_self()."?coursePath=".urlencode($course_path)."&courseCode=".Security::remove_XSS($_GET['courseCode'])."&action=view&view=day&day=".date("j", $previousday)."&month=".date("n", $previousday)."&year=".date("Y", $previousday);
- $forewardsURL = api_get_self()."?coursePath=".urlencode($course_path)."&courseCode=".Security::remove_XSS($_GET['courseCode'])."&action=view&view=day&day=".date("j", $nextday)."&month=".date("n", $nextday)."&year=".date("Y", $nextday);
- // The title row containing the day
- echo "<tr>\n", "<th width=\"10%\"><a href=\"", $backwardsURL, "\">«</a></th>\n", "<th>";
- echo $DaysLong[$day_of_the_week]." ".date("j", $today)." ".$MonthsLong[date("n", $today) - 1]." ".date("Y", $today);
- echo "</th>";
- echo "<th width=\"10%\"><a href=\"", $forewardsURL, "\">»</a></th>\n";
- echo "</tr>\n";
- // the rows for each half an hour
- for ($i = 10; $i < 48; $i ++)
- {
- if ($i % 2 == 0)
- {
- $class = "class=\"row_even\"";
- }
- else
- {
- $class = "class=\"row_odd\"";
- }
- echo "<tr $class>\n";
- echo "\t";
- if ($i % 2 == 0)
- {
- echo ("<td valign=\"top\" width=\"75\">". (($i) / 2)." ".get_lang("HourShort")." 00</td>\n");
- }
- else
- {
- echo ("<td valign=\"top\" width=\"75\">". ((($i) / 2) - (1 / 2))." ".get_lang("HourShort")." 30</td>\n");
- }
- echo "\t<td $class valign=\"top\" colspan=\"2\">\n";
- if (is_array($agendaitems[$i]))
- {
- foreach ($agendaitems[$i] as $key => $value)
- {
- echo $value;
- }
- }
- else
- {
- echo $agendaitems[$i];
- }
- echo "\t</td>\n";
- echo "</tr>\n";
- }
- echo "</table>\n";
- }
- /**
- * Display the weekly view of the calendar
- */
- function display_weekcalendar($agendaitems, $month, $year, $weekdaynames, $monthName)
- {
- global $DaysShort,$course_path;
- global $MonthsLong;
- // timestamp of today
- $today = time();
- $day_of_the_week = date("w", $today);
- $thisday_of_the_week = date("w", $today);
- // the week number of the year
- $week_number = date("W", $today);
- $thisweek_number = $week_number;
- // if we moved to the next / previous week we have to recalculate the $today variable
- if ($_GET['week'])
- {
- $today = mktime(0, 0, 0, 1, 1, $year);
- $today = $today + (((int)$_GET['week']-1) * (7 * 24 * 60 * 60));
- $week_number = date("W", $today);
- }
- // calculating the start date of the week
- // the date of the monday of this week is the timestamp of today minus
- // number of days that have already passed this week * 24 hours * 60 minutes * 60 seconds
- $current_day = date("j", $today); // Day of the month without leading zeros (1 to 31) of today
- $day_of_the_week = date("w", $today); // Numeric representation of the day of the week 0 (for Sunday) through 6 (for Saturday) of today
- $timestamp_first_date_of_week = $today - (($day_of_the_week -1) * 24 * 60 * 60); // timestamp of the monday of this week
- $timestamp_last_date_of_week = $today + ((7 - $day_of_the_week) * 24 * 60 * 60); // timestamp of the sunday of this week
- $backwardsURL = api_get_self()."?coursePath=".urlencode($course_path)."&courseCode=".Security::remove_XSS($_GET['courseCode'])."&action=view&view=week&week=". ($week_number -1);
- $forewardsURL = api_get_self()."?coursePath=".urlencode($course_path)."&courseCode=".Security::remove_XSS($_GET['courseCode'])."&action=view&view=week&week=". ($week_number +1);
- echo "<table class=\"data_table\">\n";
- // The title row containing the the week information (week of the year (startdate of week - enddate of week)
- echo "<tr>\n";
- echo "<th width=\"10%\"><a href=\"", $backwardsURL, "\">«</a></th>\n";
- echo "<th colspan=\"5\">".get_lang("Week")." ".$week_number;
- echo " (".$DaysShort['1']." ".date("j", $timestamp_first_date_of_week)." ".$MonthsLong[date("n", $timestamp_first_date_of_week) - 1]." ".date("Y", $timestamp_first_date_of_week)." - ".$DaysShort['0']." ".date("j", $timestamp_last_date_of_week)." ".$MonthsLong[date("n", $timestamp_last_date_of_week) - 1]." ".date("Y", $timestamp_last_date_of_week).')';
- echo "</th>";
- echo "<th width=\"10%\"><a href=\"", $forewardsURL, "\">»</a></th>\n", "</tr>\n";
- // The second row containing the short names of the days of the week
- echo "<tr>\n";
- // this is the Day of the month without leading zeros (1 to 31) of the monday of this week
- $tmp_timestamp = $timestamp_first_date_of_week;
- for ($ii = 1; $ii < 8; $ii ++)
- {
- $is_today = ($ii == $thisday_of_the_week AND (!isset($_GET['week']) OR $_GET['week']==$thisweek_number));
- echo "\t<td class=\"weekdays\">";
- if ($is_today)
- {
- echo "<font color=#CC3300>";
- }
- echo $DaysShort[$ii % 7]." ".date("j", $tmp_timestamp)." ".$MonthsLong[date("n", $tmp_timestamp) - 1];
- if ($is_today)
- {
- echo "</font>";
- }
- echo "</td>\n";
- // we 24 hours * 60 minutes * 60 seconds to the $tmp_timestamp
- $array_tmp_timestamp[] = $tmp_timestamp;
- $tmp_timestamp = $tmp_timestamp + (24 * 60 * 60);
- }
- echo "</tr>\n";
- // the table cells containing all the entries for that day
- echo "<tr>\n";
- $counter = 0;
- foreach ($array_tmp_timestamp as $key => $value)
- {
- if ($counter < 5)
- {
- $class = "class=\"days_week\"";
- }
- else
- {
- $class = "class=\"days_weekend\"";
- }
- if ($counter == $thisday_of_the_week -1 AND (!isset($_GET['week']) OR $_GET['week']==$thisweek_number))
- {
- $class = "class=\"days_today\"";
- }
- echo "\t<td ".$class.">";
- echo "<span class=\"agendaitem\">".$agendaitems[date('j', $value)]." </span> ";
- echo "</td>\n";
- $counter ++;
- }
- echo "</tr>\n";
- echo "</table>\n";
- }
- /**
- * Show the monthcalender of the given month
- */
- function get_day_agendaitems($courses_dbs, $month, $year, $day)
- {
- global $_user;
- global $_configuration;
- global $setting_agenda_link;
- $items = array ();
- // get agenda-items for every course
- //$query=Database::query($sql_select_courses);
- foreach ($courses_dbs as $key => $array_course_info)
- {
- //databases of the courses
- $TABLEAGENDA = Database :: get_course_table(TABLE_AGENDA, $array_course_info['db']);
- $TABLE_ITEMPROPERTY = Database :: get_course_table(TABLE_ITEM_PROPERTY, $array_course_info['db']);
- // getting all the groups of the user for the current course
- $group_memberships = GroupManager :: get_group_ids($array_course_info['db'], $_user['user_id']);
- // if the user is administrator of that course we show all the agenda items
- if ($array_course_info['status'] == '1')
- {
- //echo "course admin";
- $sqlquery = "SELECT
- DISTINCT agenda.*, item_property.*
- FROM ".$TABLEAGENDA." agenda,
- ".$TABLE_ITEMPROPERTY." item_property
- WHERE agenda.id = item_property.ref
- AND DAYOFMONTH(start_date)='".$day."' AND MONTH(start_date)='".$month."' AND YEAR(start_date)='".$year."'
- AND item_property.tool='".TOOL_CALENDAR_EVENT."'
- AND item_property.visibility='1'
- GROUP BY agenda.id
- ORDER BY start_date ";
- }
- // if the user is not an administrator of that course
- else
- {
- //echo "GEEN course admin";
- if (is_array($group_memberships) && count($group_memberships)>0)
- {
- $sqlquery = "SELECT
- agenda.*, item_property.*
- FROM ".$TABLEAGENDA." agenda,
- ".$TABLE_ITEMPROPERTY." item_property
- WHERE agenda.id = item_property.ref
- AND DAYOFMONTH(start_date)='".$day."' AND MONTH(start_date)='".$month."' AND YEAR(start_date)='".$year."'
- AND item_property.tool='".TOOL_CALENDAR_EVENT."'
- AND ( item_property.to_user_id='".$_user['user_id']."' OR `item_property`.`to_group_id` IN (0, ".implode(", ", $group_memberships).") )
- AND item_property.visibility='1'
- ORDER BY start_date ";
- }
- else
- {
- $sqlquery = "SELECT
- agenda.*, item_property.*
- FROM ".$TABLEAGENDA." agenda,
- ".$TABLE_ITEMPROPERTY." item_property
- WHERE agenda.id = item_property.ref
- AND DAYOFMONTH(start_date)='".$day."' AND MONTH(start_date)='".$month."' AND YEAR(start_date)='".$year."'
- AND item_property.tool='".TOOL_CALENDAR_EVENT."'
- AND ( item_property.to_user_id='".$_user['user_id']."' OR item_property.to_group_id='0')
- AND item_property.visibility='1'
- ORDER BY start_date ";
- }
- }
- //$sqlquery = "SELECT * FROM $agendadb WHERE DAYOFMONTH(day)='$day' AND month(day)='$month' AND year(day)='$year'";
- //echo "abc";
- //echo $sqlquery;
- $result = Database::query($sqlquery, __FILE__, __LINE__);
- //echo Database::num_rows($result);
- while ($item = Database::fetch_array($result))
- {
- // in the display_daycalendar function we use $i (ranging from 0 to 47) for each halfhour
- // we want to know for each agenda item for this day to wich halfhour it must be assigned
- list ($datepart, $timepart) = split(" ", $item['start_date']);
- list ($year, $month, $day) = explode("-", $datepart);
- list ($hours, $minutes, $seconds) = explode(":", $timepart);
- $halfhour = 2 * $hours;
- if ($minutes >= '30')
- {
- $halfhour = $halfhour +1;
- }
- if ($setting_agenda_link == 'coursecode')
- {
- $title=$array_course_info['title'];
- $agenda_link = cut($title,14,true);
- }
- else
- {
- $agenda_link = Display::return_icon('course_home.gif');
- }
- //$URL = $_configuration['root_web'].$mycours["dir"]."/";
- $URL = $_configuration['root_web'].'main/calendar/agenda.php?cidReq='.urlencode($array_course_info["code"])."&day=$day&month=$month&year=$year#$day"; // RH //Patrick Cool: to highlight the relevant agenda item
- $items[$halfhour][] .= "<i>".$hours.":".$minutes."</i> <a href=\"$URL\" title=\"".$array_course_info['name']."\">".$agenda_link."</a> ".$item['title']."<br />";
- }
- }
- // sorting by hour for every day
- /*$agendaitems = array();
- while (list($agendaday, $tmpitems) = each($items))
- {
- sort($tmpitems);
- while (list($key,$val) = each($tmpitems))
- {
- $agendaitems[$agendaday].=$val;
- }
- }*/
- $agendaitems = $items;
- //print_r($agendaitems);
- return $agendaitems;
- }
- /**
- * Return agenda items of the week
- */
- function get_week_agendaitems($courses_dbs, $month, $year, $week = '')
- {
- global $TABLEAGENDA, $TABLE_ITEMPROPERTY;
- global $_user;
- global $_configuration;
- global $setting_agenda_link;
- $items = array ();
- // The default value of the week
- if ($week == '')
- {
- $week_number = date("W", time());
- }
- else
- {
- $week_number = $week;
- }
- $start_end = calculate_start_end_of_week($week_number, $year);
- $start_filter = $start_end['start']['year']."-".$start_end['start']['month']."-".$start_end['start']['day'];
- $end_filter = $start_end['end']['year']."-".$start_end['end']['month']."-".$start_end['end']['day'];
- // get agenda-items for every course
- foreach ($courses_dbs as $key => $array_course_info)
- {
- //databases of the courses
- $TABLEAGENDA = Database :: get_course_table(TABLE_AGENDA, $array_course_info["db"]);
- $TABLE_ITEMPROPERTY = Database :: get_course_table(TABLE_ITEM_PROPERTY, $array_course_info["db"]);
- // getting all the groups of the user for the current course
- $group_memberships = GroupManager :: get_group_ids($array_course_info["db"], $_user['user_id']);
- // if the user is administrator of that course we show all the agenda items
- if ($array_course_info['status'] == '1')
- {
- //echo "course admin";
- $sqlquery = "SELECT
- DISTINCT a.*, i.*
- FROM ".$TABLEAGENDA." a,
- ".$TABLE_ITEMPROPERTY." i
- WHERE a.id = i.ref
- AND a.start_date>='".$start_filter."' AND a.start_date<='".$end_filter."'
- AND i.tool='".TOOL_CALENDAR_EVENT."'
- AND i.visibility='1'
- GROUP BY a.id
- ORDER BY a.start_date";
- }
- // if the user is not an administrator of that course
- else
- {
- //echo "GEEN course admin";
- if (is_array($group_memberships) && count($group_memberships)>0)
- {
- $sqlquery = "SELECT
- a.*, i.*
- FROM ".$TABLEAGENDA." a,
- ".$TABLE_ITEMPROPERTY." i
- WHERE a.id = i.`ref`
- AND a.start_date>='".$start_filter."' AND a.start_date<='".$end_filter."'
- AND i.tool='".TOOL_CALENDAR_EVENT."'
- AND ( i.to_user_id='".$_user['user_id']."' OR i.to_group_id IN (0, ".implode(", ", $group_memberships).") )
- AND i.visibility='1'
- ORDER BY a.start_date";
- }
- else
- {
- $sqlquery = "SELECT
- a.*, i.*
- FROM ".$TABLEAGENDA." a,
- ".$TABLE_ITEMPROPERTY." i
- WHERE a.id = i.ref
- AND a.start_date>='".$start_filter."' AND a.start_date<='".$end_filter."'
- AND i.tool='".TOOL_CALENDAR_EVENT."'
- AND ( i.to_user_id='".$_user['user_id']."' OR i.to_group_id='0')
- AND i.visibility='1'
- ORDER BY a.start_date";
- }
- }
- //echo "<pre>".$sqlquery."</pre>";
- // $sqlquery = "SELECT * FROM $agendadb WHERE (DAYOFMONTH(day)>='$start_day' AND DAYOFMONTH(day)<='$end_day')
- // AND (MONTH(day)>='$start_month' AND MONTH(day)<='$end_month')
- // AND (YEAR(day)>='$start_year' AND YEAR(day)<='$end_year')";
- $result = Database::query($sqlquery, __FILE__, __LINE__);
- while ($item = Database::fetch_array($result))
- {
- $agendaday = date("j",strtotime($item['start_date']));
- $time= date("H:i",strtotime($item['start_date']));
- if ($setting_agenda_link == 'coursecode')
- {
- $title=$array_course_info['title'];
- $agenda_link = cut($title, 14, true);
- }
- else
- {
- $agenda_link = Display::return_icon('course_home.gif');
- }
- $URL = $_configuration['root_web']."main/calendar/agenda.php?cidReq=".urlencode($array_course_info["code"])."&day=$agendaday&month=$month&year=$year#$agendaday"; // RH //Patrick Cool: to highlight the relevant agenda item
- //Display the events in agenda
- $items[$agendaday][$item['start_date']] .= "<i>$time</i> <a href=\"$URL\" title=\"".$array_course_info["name"]."\">".$agenda_link."</a>";
- $items[$agendaday][$item['start_date']] .= "<div>".$item['title']."</div><br>";
- }
- }
- // sorting by hour for every day
- $agendaitems = array ();
- while (list ($agendaday, $tmpitems) = each($items))
- {
- sort($tmpitems);
- while (list ($key, $val) = each($tmpitems))
- {
- $agendaitems[$agendaday] .= $val;
- }
- }
- //print_r($agendaitems);
- return $agendaitems;
- }
- /**
- * Get repeated events of a course between two dates (timespan of a day).
- * Returns an array containing the events
- * @param string Course info array (as returned by api_get_course_info())
- * @param int UNIX timestamp of span start. Defaults 0, later transformed into today's start
- * @param int UNIX timestamp. Defaults to 0, later transformed into today's end
- * @param array A set of parameters to alter the SQL query
- * @return array [int] => [course_id,parent_event_id,start_date,end_date,title,description]
- */
- function get_repeated_events_day_view($course_info,$start=0,$end=0,$params)
- {
- $events = array();
- //initialise all values
- $y=0;
- $m=0;
- $d=0;
- //block $end if higher than 2038 -- PHP doesn't go past that
- if($end>2145934800){$end = 2145934800;}
- if($start == 0 or $end == 0)
- {
- $y=date('Y');
- $m=date('m');
- $d=date('j');
- }
- if($start==0)
- {
- $start = mktime(0,0,0,$m,$d,$y);
- }
- $db_start = date('Y-m-d H:i:s',$start);
- if($end==0)
- {
- $end = mktime(23,59,59,$m,$d,$y);
- }
- //$db_end = date('Y-m-d H:i:s',$end);
- $t_cal = Database::get_course_table(TABLE_AGENDA,$course_info['dbName']);
- $t_cal_repeat = Database::get_course_table(TABLE_AGENDA_REPEAT,$course_info['dbName']);
- $t_ip = Database::get_course_table(TABLE_ITEM_PROPERTY,$course_info['dbName']);
- $sql = "SELECT c.id, c.title, c.content, " .
- " UNIX_TIMESTAMP(c.start_date) as orig_start, UNIX_TIMESTAMP(c.end_date) as orig_end, " .
- " cr.cal_type, cr.cal_end " .
- " FROM $t_cal c, $t_cal_repeat cr, $t_ip as item_property " .
- " WHERE cr.cal_end >= $start " .
- " AND cr.cal_id = c.id " .
- " AND item_property.ref = c.id ".
- " AND item_property.tool = '".TOOL_CALENDAR_EVENT."' ".
- " AND c.start_date <= '$db_start' "
- .(!empty($params['conditions'])?$params['conditions']:'')
- .(!empty($params['groupby'])?' GROUP BY '.$params['groupby']:'')
- .(!empty($params['orderby'])?' ORDER BY '.$params['orderby']:'');
- $res = Database::query($sql,__FILE__,__LINE__);
- if(Database::num_rows($res)>0)
- {
- while($row = Database::fetch_array($res))
- {
- $orig_start = $row['orig_start'];
- $orig_end = $row['orig_end'];
- $repeat_type = $row['cal_type'];
- switch($repeat_type)
- {
- case 'daily':
- //we are in the daily view, so if this element is repeated daily and
- //the repetition is still active today (which is a condition of the SQL query)
- //then the event happens today. Just build today's timestamp for start and end
- $time_orig_h = date('H',$orig_start);
- $time_orig_m = date('i',$orig_start);
- $time_orig_s = date('s',$orig_start);
- $int_time = (($time_orig_h*60)+$time_orig_m)*60+$time_orig_s; //time in seconds since 00:00:00
- $span = $orig_end - $orig_start; //total seconds between start and stop of original event
- $current_start =$start + $int_time; //unixtimestamp start of today's event
- $current_stop = $start+$int_time+$span; //unixtimestamp stop of today's event
- $events[] = array($course_info['id'],$row['id'],$current_start,$current_stop,$row['title'],$row['content']);
- break;
- case 'weekly':
- $time_orig = date('Y/n/W/j/N/G/i/s',$orig_start);
- list($y_orig,$m_orig,$w_orig,$d_orig,$dw_orig,$h_orig,$n_orig,$s_orig) = split('/',$time_orig);
- $time_now = date('Y/n/W/j/N/G/i/s',$end);
- list($y_now,$m_now,$w_now,$d_now,$dw_now,$h_now,$n_now,$s_now) = split('/',$time_now);
- if((($y_now>$y_orig) OR (($y_now == $y_orig) && ($w_now>$w_orig))) && ($dw_orig == $dw_now))
- { //if the event is after the original (at least one week) and the day of the week is the same
- $time_orig_end = date('Y/n/W/j/N/G/i/s',$orig_end);
- list($y_orig_e,$m_orig_e,$w_orig_e,$d_orig_e,$dw_orig_e,$h_orig_e,$n_orig_e,$s_orig_e) = split('/',$time_orig_end);
- $events[] = array($course_info['id'],$row['id'],mktime($h_orig,$n_orig,$s_orig,$m_now,$d_orig,$y_now),mktime($h_orig_e,$n_orig_e,$s_orig_e,$m_now,$d_orig_e,$y_now),$row['title'],$row['content']);
- }
- break;
- case 'monthlyByDate':
- $time_orig = date('Y/n/j/G/i/s',$orig_start);
- list($y_orig,$m_orig,$d_orig,$h_orig,$n_orig,$s_orig) = split('/',$time_orig);
- $time_now = date('Y/n/j/G/i/s',$end);
- list($y_now,$m_now,$d_now,$h_now,$n_now,$s_now) = split('/',$time_now);
- if((($y_now>$y_orig) OR (($y_now == $y_orig) && ($m_now>$m_orig))) && ($d_orig == $d_now))
- {
- $time_orig_end = date('Y/n/j/G/i/s',$orig_end);
- list($y_orig_e,$m_orig_e,$d_orig_e,$h_orig_e,$n_orig_e,$s_orig_e) = split('/',$time_orig_end);
- $events[] = array($course_info['id'],$row['id'],mktime($h_orig,$n_orig,$s_orig,$m_now,$d_orig,$y_now),mktime($h_orig_e,$n_orig_e,$s_orig_e,$m_now,$d_orig_e,$y_now),$row['title'],$row['content']);
- }
- break;
- case 'monthlyByDayR':
- //not implemented yet
- break;
- case 'monthlyByDay':
- //not implemented yet
- break;
- case 'yearly':
- $time_orig = date('Y/n/j/z/G/i/s',$orig_start);
- list($y_orig,$m_orig,$d_orig,$dy_orig,$h_orig,$n_orig,$s_orig) = split('/',$time_orig);
- $time_now = date('Y/n/j/z/G/i/s',$end);
- list($y_now,$m_now,$d_now,$dy_now,$h_now,$n_now,$s_now) = split('/',$time_now);
- if(($y_now>$y_orig) && ($dy_orig == $dy_now))
- {
- $time_orig_end = date('Y/n/j/G/i/s',$orig_end);
- list($y_orig_e,$m_orig_e,$d_orig_e,$dy_orig_e,$h_orig_e,$n_orig_e,$s_orig_e) = split('/',$time_orig_end);
- $events[] = array($course_info['id'],$row['id'],mktime($h_orig,$n_orig,$s_orig,$m_now,$d_orig,$y_now),mktime($h_orig_e,$n_orig_e,$s_orig_e,$m_now,$d_orig_e,$y_now),$row['title'],$row['content']);
- }
- break;
- default:
- break;
- }
- }
- }
- return $events;
- }
- /**
- * Get repeated events of a course between two dates (timespan of a week).
- * Returns an array containing the events
- * @param string Course info array (as returned by api_get_course_info())
- * @param int UNIX timestamp of span start. Defaults 0, later transformed into today's start
- * @param int UNIX timestamp. Defaults to 0, later transformed into today's end
- * @param array A set of parameters to alter the SQL query
- * @return array [int] => [course_id,parent_event_id,start_date,end_date,title,description]
- */
- function get_repeated_events_week_view($course_info,$start=0,$end=0,$params)
- {
- $events = array();
- //block $end if higher than 2038 -- PHP doesn't go past that
- if($end>2145934800){$end = 2145934800;}
- //initialise all values
- $y=0;
- $m=0;
- $d=0;
- if($start == 0 or $end == 0)
- {
- $time = time();
- $dw = date('w',$time);
- $week_start = $time - (($dw-1)*86400);
- $y = date('Y',$week_start);
- $m = date('m',$week_start);
- $d = date('j',$week_start);
- $w = date('W',$week_start);
- }
- if($start==0)
- {
- $start = mktime(0,0,0,$m,$d,$y);
- }
- $db_start = date('Y-m-d H:i:s',$start);
- if($end==0)
- {
- $end = $start+(86400*7)-1; //start of week, more 7 days, minus 1 second to get back to the previoyus day
- }
- //$db_end = date('Y-m-d H:i:s',$end);
- $t_cal = Database::get_course_table(TABLE_AGENDA,$course_info['dbName']);
- $t_cal_repeat = Database::get_course_table(TABLE_AGENDA_REPEAT,$course_info['dbName']);
- $t_ip = Database::get_course_table(TABLE_ITEM_PROPERTY,$course_info['dbName']);
- $sql = "SELECT c.id, c.title, c.content, " .
- " UNIX_TIMESTAMP(c.start_date) as orig_start, UNIX_TIMESTAMP(c.end_date) as orig_end, " .
- " cr.cal_type, cr.cal_end " .
- " FROM $t_cal c, $t_cal_repeat cr, $t_ip as item_property " .
- " WHERE cr.cal_end >= $start " .
- " AND cr.cal_id = c.id " .
- " AND item_property.ref = c.id ".
- " AND item_property.tool = '".TOOL_CALENDAR_EVENT."' ".
- " AND c.start_date <= '$db_start' "
- .(!empty($params['conditions'])?$params['conditions']:'')
- .(!empty($params['groupby'])?' GROUP BY '.$params['groupby']:'')
- .(!empty($params['orderby'])?' ORDER BY '.$params['orderby']:'');
- $res = Database::query($sql,__FILE__,__LINE__);
- if(Database::num_rows($res)>0)
- {
- while($row = Database::fetch_array($res))
- {
- $orig_start = $row['orig_start'];
- $orig_end = $row['orig_end'];
- $repeat_type = $row['cal_type'];
- switch($repeat_type)
- {
- case 'daily':
- $time_orig_h = date('H',$orig_start);
- $time_orig_m = date('i',$orig_start);
- $time_orig_s = date('s',$orig_start);
- $int_time = (($time_orig_h*60)+$time_orig_m)*60+$time_orig_s; //time in seconds since 00:00:00
- $span = $orig_end - $orig_start; //total seconds between start and stop of original event
- for($i=0;$i<7;$i++)
- {
- $current_start = $start + ($i*86400) + $int_time; //unixtimestamp start of today's event
- $current_stop = $start + ($i*86400) + $int_time + $span; //unixtimestamp stop of today's event
- $events[] = array($course_info['id'],$row['id'],$current_start,$current_stop,$row['title'],$row['content']);
- }
- break;
- case 'weekly':
- $time_orig = date('Y/n/W/j/N/G/i/s',$orig_start);
- list($y_orig,$m_orig,$w_orig,$d_orig,$dw_orig,$h_orig,$n_orig,$s_orig) = split('/',$time_orig);
- $time_now = date('Y/n/W/j/N/G/i/s',$end);
- list($y_now,$m_now,$w_now,$d_now,$dw_now,$h_now,$n_now,$s_now) = split('/',$time_now);
- if((($y_now>$y_orig) OR (($y_now == $y_orig) && ($w_now>$w_orig))))
- { //if the event is after the original (at least one week) and the day of the week is the same
- $time_orig_end = date('Y/n/W/j/N/G/i/s',$orig_end);
- list($y_orig_e,$m_orig_e,$w_orig_e,$d_orig_e,$dw_orig_e,$h_orig_e,$n_orig_e,$s_orig_e) = split('/',$time_orig_end);
- $events[] = array($course_info['id'],$row['id'],mktime($h_orig,$n_orig,$s_orig,$m_now,$d_orig,$y_now),mktime($h_orig_e,$n_orig_e,$s_orig_e,$m_now,$d_orig_e,$y_now),$row['title'],$row['content']);
- }
- break;
- case 'monthlyByDate':
- $time_orig = date('Y/n/W/j/G/i/s',$orig_start);
- list($y_orig,$m_orig,$w_orig,$d_orig,$h_orig,$n_orig,$s_orig) = split('/',$time_orig);
- $time_now = date('Y/n/W/j/G/i/s',$end);
- list($y_now,$m_now,$w_now,$d_now,$h_now,$n_now,$s_now) = split('/',$time_now);
- $event_repetition_time = mktime($h_orig,$n_orig,$s_orig,$m_now,$d_orig,$y_now);
- if((($y_now>$y_orig) OR (($y_now == $y_orig) && ($m_now>$m_orig))) && ($start<$event_repetition_time && $event_repetition_time<$end))
- { //if the event is after the original (at least one month) and the original event's day is between the first day of the week and the last day of the week
- $time_orig_end = date('Y/n/j/G/i/s',$orig_end);
- list($y_orig_e,$m_orig_e,$d_orig_e,$h_orig_e,$n_orig_e,$s_orig_e) = split('/',$time_orig_end);
- $events[] = array($course_info['id'],$row['id'],mktime($h_orig,$n_orig,$s_orig,$m_now,$d_orig,$y_now),mktime($h_orig_e,$n_orig_e,$s_orig_e,$m_now,$d_orig_e,$y_now),$row['title'],$row['content']);
- }
- break;
- case 'monthlyByDayR':
- //not implemented yet
- break;
- case 'monthlyByDay':
- //not implemented yet
- break;
- case 'yearly':
- $time_orig = date('Y/n/j/z/G/i/s',$orig_start);
- list($y_orig,$m_orig,$d_orig,$dy_orig,$h_orig,$n_orig,$s_orig) = split('/',$time_orig);
- $time_now = date('Y/n/j/z/G/i/s',$end);
- list($y_now,$m_now,$d_now,$dy_now,$h_now,$n_now,$s_now) = split('/',$time_now);
- $event_repetition_time = mktime($h_orig,$n_orig,$s_orig,$m_orig,$d_orig,$y_now);
- if((($y_now>$y_orig) && ($start<$event_repetition_time && $event_repetition_time<$end)))
- {
- $time_orig_end = date('Y/n/j/G/i/s',$orig_end);
- list($y_orig_e,$m_orig_e,$d_orig_e,$dy_orig_e,$h_orig_e,$n_orig_e,$s_orig_e) = split('/',$time_orig_end);
- $events[] = array($course_info['id'],$row['id'],mktime($h_orig,$n_orig,$s_orig,$m_now,$d_orig,$y_now),mktime($h_orig_e,$n_orig_e,$s_orig_e,$m_now,$d_orig_e,$y_now),$row['title'],$row['content']);
- }
- break;
- default:
- break;
- }
- }
- }
- return $events;
- }
- /**
- * Get repeated events of a course between two dates (timespan of a month).
- * Returns an array containing the events
- * @param string Course info array (as returned by api_get_course_info())
- * @param int UNIX timestamp of span start. Defaults 0, later transformed into today's start
- * @param int UNIX timestamp. Defaults to 0, later transformed into today's end
- * @param array A set of parameters to alter the SQL query
- * @return array [int] => [course_id,parent_event_id,start_date,end_date,title,description]
- */
- function get_repeated_events_month_view($course_info,$start=0,$end=0,$params)
- {
- $events = array();
- //block $end if higher than 2038 -- PHP doesn't go past that
- if($end>2145934800){$end = 2145934800;}
- //initialise all values
- $y=0;
- $m=0;
- $d=0;
- if($start == 0 or $end == 0)
- {
- $time = time();
- $y = date('Y');
- $m = date('m');
- }
- if($start==0)
- {
- $start = mktime(0,0,0,$m,1,$y);
- }
- $db_start = date('Y-m-d H:i:s',$start);
- if($end==0)
- {
- if($m==12)
- {
- $end = mktime(0,0,0,1,1,$y+1)-1; //start of next month, minus 1 second to get back to the previoyus day
- }
- else
- {
- $end = mktime(0,0,0,$m+1,1,$y)-1;
- }
- }
- //$db_end = date('Y-m-d H:i:s',$end);
- $t_cal = Database::get_course_table(TABLE_AGENDA,$course_info['dbName']);
- $t_cal_repeat = Database::get_course_table(TABLE_AGENDA_REPEAT,$course_info['dbName']);
- $t_ip = Database::get_course_table(TABLE_ITEM_PROPERTY,$course_info['dbName']);
- $sql = "SELECT c.id, c.title, c.content, " .
- " UNIX_TIMESTAMP(c.start_date) as orig_start, UNIX_TIMESTAMP(c.end_date) as orig_end, " .
- " cr.cal_type, cr.cal_end " .
- " FROM $t_cal c, $t_cal_repeat cr, $t_ip as item_property " .
- " WHERE cr.cal_end >= $start " .
- " AND cr.cal_id = c.id " .
- " AND item_property.ref = c.id ".
- " AND item_property.tool = '".TOOL_CALENDAR_EVENT."' ".
- " AND c.start_date <= '$db_start' "
- .(!empty($params['conditions'])?$params['conditions']:'')
- .(!empty($params['groupby'])?' GROUP BY '.$params['groupby']:'')
- .(!empty($params['orderby'])?' ORDER BY '.$params['orderby']:'');
- $res = Database::query($sql,__FILE__,__LINE__);
- if(Database::num_rows($res)>0)
- {
- while($row = Database::fetch_array($res))
- {
- $orig_start = $row['orig_start'];
- $orig_end = $row['orig_end'];
- $repeat_type = $row['cal_type'];
- switch($repeat_type)
- {
- case 'daily':
- $time_orig_h = date('H',$orig_start);
- $time_orig_m = date('i',$orig_start);
- $time_orig_s = date('s',$orig_start);
- $month_last_day = date('d',$end);
- $int_time = (($time_orig_h*60)+$time_orig_m)*60+$time_orig_s; //time in seconds since 00:00:00
- $span = $orig_end - $orig_start; //total seconds between start and stop of original event
- for($i=0;$i<$month_last_day;$i++)
- {
- $current_start = $start + ($i*86400) + $int_time; //unixtimestamp start of today's event
- $current_stop = $start + ($i*86400) + $int_time + $span; //unixtimestamp stop of today's event
- $events[] = array($course_info['id'],$row['id'],$current_start,$current_stop,$row['title'],$row['content']);
- }
- break;
- case 'weekly':
- //A weekly repeated event is very difficult to catch in a month view,
- //because weeks start before or at the same time as the first day of the month
- //The same can be said for the end of the month.
- // The idea is thus to get all possible events by enlarging the scope of
- // the month to get complete weeks covering the complete month, and then take out
- // the events that start before the 1st ($start) or after the last day of the month ($end)
- $time_orig = date('Y/n/W/j/N/G/i/s',$orig_start);
- list($y_orig,$m_orig,$w_orig,$d_orig,$dw_orig,$h_orig,$n_orig,$s_orig) = split('/',$time_orig);
- $time_orig_end = date('Y/n/W/j/N/G/i/s',$orig_end);
- list($y_orig_e,$m_orig_e,$w_orig_e,$d_orig_e,$dw_orig_e,$h_orig_e,$n_orig_e,$s_orig_e) = split('/',$time_orig_end);
- $time_now = date('Y/n/W/j/N/G/i/s',$end);
- list($y_now,$m_now,$w_now,$d_now,$dw_now,$h_now,$n_now,$s_now) = split('/',$time_now);
- $month_first_week = date('W',$start);
- $month_last_week = date('W',$end);
- if(($y_now>$y_orig) OR (($y_now == $y_orig) && ($w_now>$w_orig)))
- { //if the event is after the original (at least one week) and the day of the week is the same
- for($i=$month_first_week;$i<=$month_last_week;$i++)
- {
- //the "day of the week" of repetition is the same as the $dw_orig,
- //so to get the "day of the month" from the "day of the week", we have
- //to get the first "day of the week" for this week and add the number
- //of days (in seconds) to reach the $dw_orig
- //example: the first week spans between the 28th of April (Monday) to the
- // 4th of May (Sunday). The event occurs on the 2nd day of each week.
- // This means the event occurs on 29/4, 6/5, 13/5, 20/5 and 27/5.
- // We want to get all of these, and then reject 29/4 because it is out
- // of the month itself.
- //First, to get the start time of the first day of the month view (even if
- // the day is from the past month), we get the month start date (1/5) and
- // see which day of the week it is, and subtract the number of days necessary
- // to get back to the first day of the week.
- $month_first_day_weekday = date('N',$start);
- $first_week_start = $start - (($month_first_day_weekday-1)*86400);
- //Second, we add the week day of the original event, so that we have an
- // absolute time that represents the first repetition of the event in
- // our 4- or 5-weeks timespan
- $first_event_repeat_start = $first_week_start + (($dw_orig-1)*86400) + ($h_orig*3600) + ($n_orig*60) + $s_orig;
- //Third, we start looping through the repetitions and see if they are between
- // $start and $end
- for($i = $first_event_repeat_start; $i<=$end; $i+=604800)
- {
- if($start<$i && $i<$end)
- {
- list($y_repeat,$m_repeat,$d_repeat,$h_repeat,$n_repeat,$s_repeat) = split('/',date('Y/m/j/H/i/s',$i));
- $events[] = array($course_info['id'],$row['id'],mktime($h_orig,$n_orig,$s_orig,$m_now,$d_orig,$y_now),mktime($h_orig_e,$n_orig_e,$s_orig_e,$m_now,$d_orig_e,$y_now),$row['title'],$row['content']);
- }
- }
- }
- }
- break;
- case 'monthlyByDate':
- $time_orig = date('Y/n/W/j/G/i/s',$orig_start);
- list($y_orig,$m_orig,$w_orig,$d_orig,$h_orig,$n_orig,$s_orig) = split('/',$time_orig);
- $time_now = date('Y/n/W/j/G/i/s',$end);
- list($y_now,$m_now,$w_now,$d_now,$h_now,$n_now,$s_now) = split('/',$time_now);
- $event_repetition_time = mktime($h_orig,$n_orig,$s_orig,$m_now,$d_orig,$y_now);
- if(($y_now>$y_orig) OR (($y_now == $y_orig) && ($m_now>$m_orig)))
- { //if the event is after the original (at least one month) and the original event's day is between the first day of the week and the last day of the week
- $time_orig_end = date('Y/n/j/G/i/s',$orig_end);
- list($y_orig_e,$m_orig_e,$d_orig_e,$h_orig_e,$n_orig_e,$s_orig_e) = split('/',$time_orig_end);
- $events[] = array($course_info['id'],$row['id'],mktime($h_orig,$n_orig,$s_orig,$m_now,$d_orig,$y_now),mktime($h_orig_e,$n_orig_e,$s_orig_e,$m_now,$d_orig_e,$y_now),$row['title'],$row['content']);
- }
- break;
- case 'monthlyByDayR':
- //not implemented yet
- break;
- case 'monthlyByDay':
- //not implemented yet
- break;
- case 'yearly':
- $time_orig = date('Y/n/j/z/G/i/s',$orig_start);
- list($y_orig,$m_orig,$d_orig,$dy_orig,$h_orig,$n_orig,$s_orig) = split('/',$time_orig);
- $time_now = date('Y/n/j/z/G/i/s',$end);
- list($y_now,$m_now,$d_now,$dy_now,$h_now,$n_now,$s_now) = split('/',$time_now);
- $event_repetition_time = mktime($h_orig,$n_orig,$s_orig,$m_orig,$d_orig,$y_now);
- if((($y_now>$y_orig) && ($start<$event_repetition_time && $event_repetition_time<$end)))
- {
- $time_orig_end = date('Y/n/j/G/i/s',$orig_end);
- list($y_orig_e,$m_orig_e,$d_orig_e,$dy_orig_e,$h_orig_e,$n_orig_e,$s_orig_e) = split('/',$time_orig_end);
- $events[] = array($course_info['id'],$row['id'],mktime($h_orig,$n_orig,$s_orig,$m_now,$d_orig,$y_now),mktime($h_orig_e,$n_orig_e,$s_orig_e,$m_now,$d_orig_e,$y_now),$row['title'],$row['content']);
- }
- break;
- default:
- break;
- }
- }
- }
- return $events;
- }
- /**
- * Get repeated events of a course between two dates (1 year timespan). Used for the list display.
- * This is virtually unlimited but by default it shortens to 100 years from now (even a birthday shouldn't be useful more than this time - except for turtles)
- * Returns an array containing the events
- * @param string Course info array (as returned by api_get_course_info())
- * @param int UNIX timestamp of span start. Defaults 0, later transformed into today's start
- * @param int UNIX timestamp. Defaults to 0, later transformed into today's end
- * @param array A set of parameters to alter the SQL query
- * @return array [int] => [course_id,parent_event_id,start_date,end_date,title,description]
- */
- function get_repeated_events_list_view($course_info,$start=0,$end=0,$params)
- {
- $events = array();
- //block $end if higher than 2038 -- PHP doesn't go past that
- if($end>2145934800){$end = 2145934800;}
- //initialise all values
- $y=0;
- $m=0;
- $d=0;
- if(empty($start) or empty($end))
- {
- $time = time();
- $y = date('Y');
- $m = date('m');
- }
- if(empty($start))
- {
- $start = mktime(0, 0, 0, $m, 1, $y);
- }
- $db_start = date('Y-m-d H:i:s', $start);
- if(empty($end))
- {
- $end = mktime(0, 0, 0, 1, 1, 2037);
- }
- //$db_end = date('Y-m-d H:i:s',$end);
- $t_cal = Database::get_course_table(TABLE_AGENDA,$course_info['dbName']);
- $t_cal_repeat = Database::get_course_table(TABLE_AGENDA_REPEAT,$course_info['dbName']);
- $t_ip = Database::get_course_table(TABLE_ITEM_PROPERTY,$course_info['dbName']);
- $sql = "SELECT c.id, c.title, c.content, " .
- " UNIX_TIMESTAMP(c.start_date) as orig_start, UNIX_TIMESTAMP(c.end_date) as orig_end, " .
- " cr.cal_type, cr.cal_end " .
- " FROM $t_cal c, $t_cal_repeat cr, $t_ip as item_property " .
- " WHERE cr.cal_end >= $start " .
- " AND cr.cal_id = c.id " .
- " AND item_property.ref = c.id ".
- " AND item_property.tool = '".TOOL_CALENDAR_EVENT."' ".
- " AND c.start_date <= '$db_start' "
- .(!empty($params['conditions'])?$params['conditions']:'')
- .(!empty($params['groupby'])?' GROUP BY '.$params['groupby']:'')
- .(!empty($params['orderby'])?' ORDER BY '.$params['orderby']:'');
- $res = Database::query($sql,__FILE__,__LINE__);
- if(Database::num_rows($res)>0)
- {
- while($row = Database::fetch_array($res))
- {
- $orig_start = $row['orig_start'];
- $orig_end = $row['orig_end'];
- $repeat_type = $row['cal_type'];
- $repeat_end = $row['cal_end'];
- switch($repeat_type)
- {
- case 'daily':
- $time_orig_h = date('H',$orig_start);
- $time_orig_m = date('i',$orig_start);
- $time_orig_s = date('s',$orig_start);
- $span = $orig_end - $orig_start; //total seconds between start and stop of original event
- for($i=$orig_start+86400;($i<$end && $i<=$repeat_end);$i+=86400)
- {
- $current_start = $i; //unixtimestamp start of today's event
- $current_stop = $i + $span; //unixtimestamp stop of today's event
- $events[] = array($course_info['id'],$row['id'],$current_start,$current_stop,$row['title'],$row['content']);
- }
- break;
- case 'weekly':
- //A weekly repeated event is very difficult to catch in a month view,
- // because weeks start before or at the same time as the first day of the month
- //The same can be said for the end of the month.
- // The idea is thus to get all possible events by enlarging the scope of
- // the month to get complete weeks covering the complete month, and then take out
- // the events that start before the 1st ($start) or after the last day of the month ($end)
- $time_orig = date('Y/n/W/j/N/G/i/s',$orig_start);
- list($y_orig,$m_orig,$w_orig,$d_orig,$dw_orig,$h_orig,$n_orig,$s_orig) = split('/',$time_orig);
- $time_orig_end = date('Y/n/W/j/N/G/i/s',$orig_end);
- list($y_orig_e,$m_orig_e,$w_orig_e,$d_orig_e,$dw_orig_e,$h_orig_e,$n_orig_e,$s_orig_e) = split('/',$time_orig_end);
- $time_now = date('Y/n/W/j/N/G/i/s',$end);
- list($y_now,$m_now,$w_now,$d_now,$dw_now,$h_now,$n_now,$s_now) = split('/',$time_now);
- if($w_now==52)
- {
- ++$y_now;
- $w_now=1;
- }
- else
- {
- ++$w_now;
- }
- $month_first_week = date('W',$start);
- $total_weeks = ((date('Y',$end)-$y_orig)-1)*52;
- $month_last_week = $month_first_week + $total_weeks;
- if(($y_now>$y_orig) OR (($y_now == $y_orig) && ($w_now>$w_orig)))
- { //if the event is after the original (at least one week) and the day of the week is the same
- //for($i=$month_first_week;($i<=$month_last_week && $i<1000);$i++)
- //{
- /*
- The "day of the week" of repetition is the same as the $dw_orig,
- so to get the "day of the month" from the "day of the week", we have
- to get the first "day of the week" for this week and add the number
- of days (in seconds) to reach the $dw_orig
- example: the first week spans between the 28th of April (Monday) to the
- 4th of May (Sunday). The event occurs on the 2nd day of each week.
- This means the event occurs on 29/4, 6/5, 13/5, 20/5 and 27/5.
- We want to get all of these, and then reject 29/4 because it is out
- of the month itself.
- First, to get the start time of the first day of the month view (even if
- the day is from the past month), we get the month start date (1/5) and
- see which day of the week it is, and subtract the number of days necessary
- to get back to the first day of the week.
- */
- $month_first_day_weekday = date('N',$start);
- $first_week_start = $start - (($month_first_day_weekday-1)*86400);
- //Second, we add the week day of the original event, so that we have an
- // absolute time that represents the first repetition of the event in
- // our 4- or 5-weeks timespan
- $first_event_repeat_start = $first_week_start + (($dw_orig-1)*86400) + ($h_orig*3600) + ($n_orig*60) + $s_orig;
- //Third, we start looping through the repetitions and see if they are between
- // $start and $end
- for($i = $first_event_repeat_start; ($i<=$end && $i<=$repeat_end); $i+=604800)
- {
- if($start<$i && $i<=$end && $i<=$repeat_end)
- {
- list($y_repeat,$m_repeat,$d_repeat,$h_repeat,$n_repeat,$s_repeat) = split('/',date('Y/m/j/H/i/s',$i));
- $new_start_time = mktime($h_orig,$n_orig,$s_orig,$m_now,$d_orig,$y_now);
- $new_stop_time = mktime($h_orig_e,$n_orig_e,$s_orig_e,$m_now,$d_orig_e,$y_now);
- $events[] = array($course_info['id'], $row['id'], $new_start_time, $new_stop_time, $row['title'], $row['content']);
- }
- $time_now = date('Y/n/W/j/N/G/i/s',$i+604800);
- list($y_now,$m_now,$w_now,$d_now,$dw_now,$h_now,$n_now,$s_now) = split('/',$time_now);
- }
- //}
- }
- break;
- case 'monthlyByDate':
- $time_orig = date('Y/n/W/j/G/i/s',$orig_start);
- list($y_orig,$m_orig,$w_orig,$d_orig,$h_orig,$n_orig,$s_orig) = split('/',$time_orig);
- $time_now = date('Y/n/W/j/G/i/s',$start);
- list($y_now,$m_now,$w_now,$d_now,$h_now,$n_now,$s_now) = split('/',$time_now);
- //make sure we are one month ahead (to avoid being the same month as the original event)
- if($m_now==12)
- {
- ++$y_now;
- $m_now = 1;
- }
- else
- {
- ++$m_now;
- }
- $time_orig_end = date('Y/n/j/G/i/s',$orig_end);
- list($y_orig_e,$m_orig_e,$d_orig_e,$h_orig_e,$n_orig_e,$s_orig_e) = split('/',$time_orig_end);
- $event_repetition_time = mktime($h_orig,$n_orig,$s_orig,$m_now,$d_orig,$y_now);
- $diff = $orig_end - $orig_start;
- while((($y_now>$y_orig) OR (($y_now == $y_orig) && ($m_now>$m_orig))) && ($event_repetition_time < $end) && ($event_repetition_time < $repeat_end))
- { //if the event is after the original (at least one month) and the original event's day is between the first day of the week and the last day of the week
- $new_start_time = mktime($h_orig,$n_orig,$s_orig,$m_now,$d_orig,$y_now);
- $new_stop_time = mktime($h_orig_e,$n_orig_e,$s_orig_e,$m_now,$d_orig_e,$y_now);
- $events[] = array($course_info['id'],$row['id'],$new_start_time,$new_stop_time,$row['title'],$row['content']);
- if($m_now==12)
- {
- ++$y_now;
- $m_now = 1;
- }
- else
- {
- ++$m_now;
- }
- $event_repetition_time = mktime($h_orig,$n_orig,$s_orig,$m_now,$d_orig,$y_now);
- }
- break;
- case 'monthlyByDayR':
- //not implemented yet
- break;
- case 'monthlyByDay':
- //not implemented yet
- break;
- case 'yearly':
- $time_orig = date('Y/n/j/z/G/i/s',$orig_start);
- list($y_orig,$m_orig,$d_orig,$dy_orig,$h_orig,$n_orig,$s_orig) = split('/',$time_orig);
- $time_now = date('Y/n/j/z/G/i/s',$end);
- list($y_now,$m_now,$d_now,$dy_now,$h_now,$n_now,$s_now) = split('/',$time_now);
- $event_repetition_time = mktime($h_orig,$n_orig,$s_orig,$m_orig,$d_orig,$y_now);
- while((($y_now>$y_orig) && ($start<$event_repetition_time && $event_repetition_time<$end && $event_repetition_time<$repeat_end)))
- {
- $time_orig_end = date('Y/n/j/G/i/s',$orig_end);
- list($y_orig_e,$m_orig_e,$d_orig_e,$dy_orig_e,$h_orig_e,$n_orig_e,$s_orig_e) = split('/',$time_orig_end);
- $events[] = array($course_info['id'],$row['id'],mktime($h_orig,$n_orig,$s_orig,$m_now,$d_orig,$y_now),mktime($h_orig_e,$n_orig_e,$s_orig_e,$m_now,$d_orig_e,$y_now),$row['title'],$row['content']);
- ++$y_now;
- $event_repetition_time = mktime($h_orig,$n_orig,$s_orig,$m_orig,$d_orig,$y_now);
- }
- break;
- default:
- break;
- }
- }
- }
- return $events;
- }
- /**
- * Tells if an agenda item is repeated
- * @param string Course database
- * @param int The agenda item
- * @return boolean True if repeated, false otherwise
- */
- function is_repeated_event($id,$course=null)
- {
- if(empty($course))
- {
- $course_info = api_get_course_info();
- $course = $course_info['dbName'];
- }
- $id = (int) $id;
- $t_agenda_repeat = Database::get_course_table(TABLE_AGENDA_REPEAT,$course);
- $sql = "SELECT * FROM $t_agenda_repeat WHERE cal_id = $id";
- $res = Database::query($sql,__FILE__,__LINE__);
- if(Database::num_rows($res)>0)
- {
- return true;
- }
- return false;
- }
- /**
- * Adds x weeks to a UNIX timestamp
- * @param int The timestamp
- * @param int The number of weeks to add
- * @return int The new timestamp
- */
- function add_week($timestamp,$num=1)
- {
- return $timestamp + $num*604800;
- }
- /**
- * Adds x months to a UNIX timestamp
- * @param int The timestamp
- * @param int The number of years to add
- * @return int The new timestamp
- */
- function add_month($timestamp,$num=1)
- {
- list($y, $m, $d, $h, $n, $s) = split('/',date('Y/m/d/h/i/s',$timestamp));
- if($m+$num>12)
- {
- $y += floor($num/12);
- $m += $num%12;
- }
- else
- {
- $m += $num;
- }
- return mktime($h, $n, $s, $m, $d, $y);
- }
- /**
- * Adds x years to a UNIX timestamp
- * @param int The timestamp
- * @param int The number of years to add
- * @return int The new timestamp
- */
- function add_year($timestamp,$num=1)
- {
- list($y, $m, $d, $h, $n, $s) = split('/',date('Y/m/d/h/i/s',$timestamp));
- return mktime($h, $n, $s, $m, $d, $y+$num);
- }
- /**
- * Adds an agenda item in the database. Similar to store_new_agenda_item() except it takes parameters
- * @param array Course info
- * @param string Event title
- * @param string Event content/description
- * @param string Start date
- * @param string End date
- * @param array List of groups to which this event is added
- * @param int Parent id (optional)
- * @return int The new item's DB ID
- */
- function agenda_add_item($course_info, $title, $content, $db_start_date, $db_end_date,$to=array(), $parent_id=null,$file_comment='')
- {
- global $_course;
- $user_id = api_get_user_id();
- // database table definitions
- $t_agenda = Database::get_course_table(TABLE_AGENDA,$course_info['dbName']);
- $agenda_table_attachment = Database::get_course_table(TABLE_AGENDA_ATTACHMENT);
- $item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
- // some filtering of the input data
- $content=stripslashes($content);
- $title=Database::escape_string(Security::remove_XSS($title));
- $content = Database::escape_string(Security::remove_XSS($content,COURSEMANAGERLOWSECURITY));
- $start_date = Database::escape_string($db_start_date);
- $end_date = Database::escape_string($db_end_date);
- isset($_SESSION['id_session'])?$id_session=intval($_SESSION['id_session']):$id_session=null;
- // store in the table calendar_event
- // check if exists in calendar_event table and if it is not deleted!
- $sql = "SELECT * FROM $t_agenda agenda, $item_property item_property
- WHERE agenda.title='$title'
- AND agenda.content = '$content'
- AND agenda.start_date = '$start_date'
- AND agenda.end_date = '$end_date' ".(!empty($parent_id)? "
- AND agenda.parent_event_id = '$parent_id'":"")."
- AND agenda.session_id = '$id_session'
- AND item_property.tool = '".TOOL_CALENDAR_EVENT."'
- AND item_property.ref = agenda.id
- AND item_property.visibility <> 2
- ";
- $result = Database::query($sql,__FILE__,__LINE__);
- $count = Database::num_rows($result);
- if ($count > 0) {
- return false;
- }
- $sql = "INSERT INTO ".$t_agenda."
- (title,content, start_date, end_date".(!empty($parent_id)?',parent_event_id':'').", session_id)
- VALUES
- ('".$title."','".$content."', '".$start_date."','".$end_date."'".(!empty($parent_id)?','.((int)$parent_id):'').", '".$id_session."')";
- $result = Database::query($sql,__FILE__,__LINE__) or die (Database::error());
- $last_id=Database::insert_id();
- // add a attachment file in agenda
- add_agenda_attachment_file($file_comment,$last_id);
- // store in last_tooledit (first the groups, then the users
- $done = false;
- if ((!is_null($to))or (!empty($_SESSION['toolgroup']))) // !is_null($to): when no user is selected we send it to everyone
- {
- $send_to=separate_users_groups($to);
- // storing the selected groups
- if (is_array($send_to['groups']))
- {
- foreach ($send_to['groups'] as $group)
- {
- api_item_property_update($course_info, TOOL_CALENDAR_EVENT, $last_id, "AgendaAdded", $user_id, $group,0,$start_date, $end_date);
- $done = true;
- }
- }
- // storing the selected users
- if (is_array($send_to['users']))
- {
- foreach ($send_to['users'] as $user)
- {
- api_item_property_update($course_info, TOOL_CALENDAR_EVENT, $last_id, "AgendaAdded", $user_id,0,$user, $start_date,$end_date);
- $done = true;
- }
- }
- }
- if(!$done) // the message is sent to everyone, so we set the group to 0
- {
- api_item_property_update($course_info, TOOL_CALENDAR_EVENT, $last_id, "AgendaAdded", $user_id,0,0, $start_date,$end_date);
- }
- // storing the resources
- if (!empty($_SESSION['source_type']) && !empty($last_id)) {
- store_resources($_SESSION['source_type'],$last_id);
- }
- return $last_id;
- }
- /**
- * This function delete a attachment file by id
- * @param integer attachment file Id
- *
- */
- function delete_attachment_file($id_attach) {
- global $_course;
- $agenda_table_attachment = Database::get_course_table(TABLE_AGENDA_ATTACHMENT);
- $id_attach=Database::escape_string($id_attach);
- $sql="DELETE FROM $agenda_table_attachment WHERE id = ".(int)$id_attach;
- $result=Database::query($sql, __LINE__, __FILE__);
- $last_id_file=Database::insert_id();
- // update item_property
- api_item_property_update($_course, 'calendar_event_attachment', $id_attach ,'AgendaAttachmentDeleted', api_get_user_id());
- if (!empty($result)) {
- Display::display_confirmation_message(get_lang("AttachmentFileDeleteSuccess"));
- }
- }
- /**
- * This function add a attachment file into agenda
- * @param string a comment about file
- * @param int last id from calendar table
- *
- */
- function add_agenda_attachment_file($file_comment,$last_id) {
- global $_course;
- $agenda_table_attachment = Database::get_course_table(TABLE_AGENDA_ATTACHMENT);
- // Storing the attachments
- if(!empty($_FILES['user_upload']['name'])) {
- $upload_ok = process_uploaded_file($_FILES['user_upload']);
- }
- if (!empty($upload_ok)) {
- $courseDir = $_course['path'].'/upload/calendar';
- $sys_course_path = api_get_path(SYS_COURSE_PATH);
- $updir = $sys_course_path.$courseDir;
- // Try to add an extension to the file if it hasn't one
- $new_file_name = add_ext_on_mime(stripslashes($_FILES['user_upload']['name']), $_FILES['user_upload']['type']);
- // user's file name
- $file_name =$_FILES['user_upload']['name'];
- if (!filter_extension($new_file_name)) {
- Display :: display_error_message(get_lang('UplUnableToSaveFileFilteredExtension'));
- } else {
- $new_file_name = uniqid('');
- $new_path=$updir.'/'.$new_file_name;
- $result= @move_uploaded_file($_FILES['user_upload']['tmp_name'], $new_path);
- $safe_file_comment= Database::escape_string($file_comment);
- $safe_file_name = Database::escape_string($file_name);
- $safe_new_file_name = Database::escape_string($new_file_name);
- // Storing the attachments if any
- if ($result) {
- $sql='INSERT INTO '.$agenda_table_attachment.'(filename,comment, path,agenda_id,size) '.
- "VALUES ( '".$safe_file_name."', '".$safe_file_comment."', '".$safe_new_file_name."' , '".$last_id."', '".$_FILES['user_upload']['size']."' )";
- $result=Database::query($sql, __LINE__, __FILE__);
- $message.=' / '.get_lang('FileUploadSucces').'<br />';
- $last_id_file=Database::insert_id();
- api_item_property_update($_course, 'calendar_event_attachment', $last_id_file ,'AgendaAttachmentAdded', api_get_user_id());
- }
- }
- }
- }
- /**
- * This function edit a attachment file into agenda
- * @param string a comment about file
- * @param int Agenda Id
- * @param int attachment file Id
- */
- function edit_agenda_attachment_file($file_comment,$agenda_id,$id_attach) {
- global $_course;
- $agenda_table_attachment = Database::get_course_table(TABLE_AGENDA_ATTACHMENT);
- // Storing the attachments
- if(!empty($_FILES['user_upload']['name'])) {
- $upload_ok = process_uploaded_file($_FILES['user_upload']);
- }
- if (!empty($upload_ok)) {
- $courseDir = $_course['path'].'/upload/calendar';
- $sys_course_path = api_get_path(SYS_COURSE_PATH);
- $updir = $sys_course_path.$courseDir;
- // Try to add an extension to the file if it hasn't one
- $new_file_name = add_ext_on_mime(stripslashes($_FILES['user_upload']['name']), $_FILES['user_upload']['type']);
- // user's file name
- $file_name =$_FILES['user_upload']['name'];
- if (!filter_extension($new_file_name)) {
- Display :: display_error_message(get_lang('UplUnableToSaveFileFilteredExtension'));
- } else {
- $new_file_name = uniqid('');
- $new_path=$updir.'/'.$new_file_name;
- $result= @move_uploaded_file($_FILES['user_upload']['tmp_name'], $new_path);
- $safe_file_comment= Database::escape_string($file_comment);
- $safe_file_name = Database::escape_string($file_name);
- $safe_new_file_name = Database::escape_string($new_file_name);
- $safe_agenda_id = (int)$agenda_id;
- $safe_id_attach = (int)$id_attach;
- // Storing the attachments if any
- if ($result) {
- $sql="UPDATE $agenda_table_attachment SET filename = '$safe_file_name', comment = '$safe_file_comment', path = '$safe_new_file_name', agenda_id = '$safe_agenda_id', size ='".$_FILES['user_upload']['size']."'
- WHERE id = '$safe_id_attach'";
- $result=Database::query($sql, __LINE__, __FILE__);
- api_item_property_update($_course, 'calendar_event_attachment', $safe_id_attach ,'AgendaAttachmentUpdated', api_get_user_id());
- }
- }
- }
- }
- /**
- * Adds a repetitive item to the database
- * @param array Course info
- * @param int The original event's id
- * @param string Type of repetition
- * @param int Timestamp of end of repetition (repeating until that date)
- * @param array Original event's destination (users list)
- * @param string a comment about a attachment file into agenda
- * @return boolean False if error, True otherwise
- */
- function agenda_add_repeat_item($course_info,$orig_id,$type,$end,$orig_dest,$file_comment='')
- {
- $t_agenda = Database::get_course_table(TABLE_AGENDA,$course_info['dbName']);
- $t_agenda_r = Database::get_course_table(TABLE_AGENDA_REPEAT,$course_info['dbName']);
- //$sql = "SELECT title, content, UNIX_TIMESTAMP(start_date) as sd, UNIX_TIMESTAMP(end_date) as ed FROM $t_agenda WHERE id = $orig_id";
- $sql = 'SELECT title, content, start_date as sd, end_date as ed FROM '. $t_agenda.' WHERE id ="'.Database::escape_string($orig_id).'" ';
- $res = Database::query($sql,__FILE__,__LINE__);
- if(Database::num_rows($res)!==1){return false;}
- $row = Database::fetch_array($res);
- //$orig_start = $row['sd'];
- $orig_start = mktime(substr($row['sd'],11,2),substr($row['sd'],14,2),substr($row['sd'],17,2),substr($row['sd'],5,2),substr($row['sd'],8,2),substr($row['sd'],0,4));
- //$orig_end = $row['ed'];
- $orig_end = mktime(substr($row['ed'],11,2),substr($row['ed'],14,2),substr($row['ed'],17,2),substr($row['ed'],5,2),substr($row['ed'],8,2),substr($row['ed'],0,4));
- $diff = $orig_end - $orig_start;
- $orig_title = $row['title'];
- $orig_content = $row['content'];
- $now = time();
- $type = Database::escape_string($type);
- $end = (int) $end;
- if(1<=$end && $end<=500)
- {
- //we assume that, with this type of value, the user actually gives a count of repetitions
- //and that he wants us to calculate the end date with that (particularly in case of imports from ical)
- switch($type)
- {
- case 'daily':
- $end = $orig_start + (86400*$end);
- break;
- case 'weekly':
- $end = add_week($orig_start,$end);
- break;
- case 'monthlyByDate':
- $end = add_month($orig_start,$end);
- break;
- case 'monthlyByDay':
- //TODO
- break;
- case 'monthlyByDayR':
- //TODO
- break;
- case 'yearly':
- $end = add_year($orig_start,$end);
- break;
- }
- }
- if($end > $now
- && in_array($type,array('daily','weekly','monthlyByDate','monthlyByDay','monthlyByDayR','yearly')))
- {
- $sql = "INSERT INTO $t_agenda_r (cal_id, cal_type, cal_end)" .
- " VALUES ($orig_id,'$type',$end)";
- $res = Database::query($sql,__FILE__,__LINE__);
- switch($type)
- {
- case 'daily':
- for($i = $orig_start + 86400; ($i <= $end); $i += 86400)
- {
- $res = agenda_add_item($course_info, $orig_title, $orig_content, date('Y-m-d H:i:s', $i), date('Y-m-d H:i:s', $i+$diff), $orig_dest, $orig_id,$file_comment);
- }
- break;
- case 'weekly':
- for($i = $orig_start + 604800; ($i <= $end); $i += 604800)
- {
- $res = agenda_add_item($course_info, $orig_title, $orig_content, date('Y-m-d H:i:s', $i), date('Y-m-d H:i:s', $i+$diff), $orig_dest, $orig_id,$file_comment);
- }
- break;
- case 'monthlyByDate':
- $next_start = add_month($orig_start);
- while($next_start <= $end)
- {
- $res = agenda_add_item($course_info, $orig_title, $orig_content, date('Y-m-d H:i:s', $next_start), date('Y-m-d H:i:s', $next_start+$diff), $orig_dest, $orig_id,$file_comment);
- $next_start = add_month($next_start);
- }
- break;
- case 'monthlyByDay':
- //not yet implemented
- break;
- case 'monthlyByDayR':
- //not yet implemented
- break;
- case 'yearly':
- $next_start = add_year($orig_start);
- while($next_start <= $end)
- {
- $res = agenda_add_item($course_info, $orig_title, $orig_content, date('Y-m-d H:i:s', $next_start), date('Y-m-d H:i:s', $next_start+$diff), $orig_dest, $orig_id,$file_comment);
- $next_start = add_year($next_start);
- }
- break;
- }
- }
- return true;
- }
- /**
- * Import an iCal file into the database
- * @param array Course info
- * @return boolean True on success, false otherwise
- */
- function agenda_import_ical($course_info,$file) {
- require_once(api_get_path(LIBRARY_PATH).'fileUpload.lib.php');
- $charset = api_get_setting('platform_charset');
- $filepath = api_get_path(SYS_ARCHIVE_PATH).$file['name'];
- if(!@move_uploaded_file($file['tmp_name'],$filepath))
- {
- error_log('Problem moving uploaded file: '.$file['error'].' in '.__FILE__.' line '.__LINE__);
- return false;
- }
- require_once (api_get_path(LIBRARY_PATH).'icalcreator/iCalcreator.class.php');
- $ical = new vcalendar();
- $ical->setConfig( 'directory', dirname($filepath) );
- $ical->setConfig( 'filename', basename($filepath) );
- $ical->parse();
- //we need to recover: summary, description, dtstart, dtend, organizer, attendee, location (=course name),
- // rrule
- $ve = $ical->getComponent(0);
- //print_r($ve);
- $ttitle = $ve->getProperty('summary');
- $title = api_convert_encoding($ttitle,$charset,'UTF-8');
- $tdesc = $ve->getProperty('description');
- $desc = api_convert_encoding($tdesc,$charset,'UTF-8');
- $ts = $ve->getProperty('dtstart');
- $start_date = $ts['year'].'-'.$ts['month'].'-'.$ts['day'].' '.$ts['hour'].':'.$ts['min'].':'.$ts['sec'];
- $ts = $ve->getProperty('dtend');
- $end_date = $ts['year'].'-'.$ts['month'].'-'.$ts['day'].' '.$ts['hour'].':'.$ts['min'].':'.$ts['sec'];
- //echo $start_date.' - '.$end_date;
- $organizer = $ve->getProperty('organizer');
- $attendee = $ve->getProperty('attendee');
- $course_name = $ve->getProperty('location');
- //insert the event in our database
- $id = agenda_add_item($course_info,$title,$desc,$start_date,$end_date,$_POST['selectedform']);
- $repeat = $ve->getProperty('rrule');
- if(is_array($repeat) && !empty($repeat['FREQ']))
- {
- $trans = array('DAILY'=>'daily','WEEKLY'=>'weekly','MONTHLY'=>'monthlyByDate','YEARLY'=>'yearly');
- $freq = $trans[$repeat['FREQ']];
- $interval = $repeat['INTERVAL'];
- if(isset($repeat['UNTIL']) && is_array($repeat['UNTIL']))
- {
- $until = mktime(23,59,59,$repeat['UNTIL']['month'],$repeat['UNTIL']['day'],$repeat['UNTIL']['year']);
- $res = agenda_add_repeat_item($course_info,$id,$freq,$until,$_POST['selectedform']);
- }
- //TODO: deal with count
- if(!empty($repeat['COUNT']))
- {
- $count = $repeat['COUNT'];
- $res = agenda_add_repeat_item($course_info,$id,$freq,$count,$_POST['selectedform']);
- }
- }
- return true;
- }
- /**
- * This function retrieves one personal agenda item returns it.
- * @param array The array containing existing events. We add to this array.
- * @param int Day
- * @param int Month
- * @param int Year (4 digits)
- * @param int Week number
- * @param string Type of view (month_view, week_view, day_view)
- * @return array The results of the database query, or null if not found
- */
- function get_global_agenda_items($agendaitems, $day = "", $month = "", $year = "", $week = "", $type)
- {
- $tbl_global_agenda= Database::get_main_table(TABLE_MAIN_SYSTEM_CALENDAR);
- global $_user;
- global $_configuration;
- $month=Database::escape_string($month);
- $year=Database::escape_string($year);
- $week=Database::escape_string($week);
- $day=Database::escape_string($day);
- // 1. creating the SQL statement for getting the personal agenda items in MONTH view
- if ($type == "month_view" or $type == "") // we are in month view
- {
- $sql = "SELECT * FROM ".$tbl_global_agenda." WHERE MONTH(start_date)='".$month."' AND YEAR(start_date) = '".$year."' ORDER BY start_date ASC";
- }
- // 2. creating the SQL statement for getting the personal agenda items in WEEK view
- if ($type == "week_view") // we are in week view
- {
- $start_end_day_of_week = calculate_start_end_of_week($week, $year);
- $start_day = $start_end_day_of_week['start']['day'];
- $start_month = $start_end_day_of_week['start']['month'];
- $start_year = $start_end_day_of_week['start']['year'];
- $end_day = $start_end_day_of_week['end']['day'];
- $end_month = $start_end_day_of_week['end']['month'];
- $end_year = $start_end_day_of_week['end']['year'];
- // in sql statements you have to use year-month-day for date calculations
- $start_filter = $start_year."-".$start_month."-".$start_day." 00:00:00";
- $end_filter = $end_year."-".$end_month."-".$end_day." 23:59:59";
- $sql = " SELECT * FROM ".$tbl_global_agenda." WHERE start_date>='".$start_filter."' AND start_date<='".$end_filter."'";
- }
- // 3. creating the SQL statement for getting the personal agenda items in DAY view
- if ($type == "day_view") // we are in day view
- {
- // we could use mysql date() function but this is only available from 4.1 and higher
- $start_filter = $year."-".$month."-".$day." 00:00:00";
- $end_filter = $year."-".$month."-".$day." 23:59:59";
- $sql = " SELECT * FROM ".$tbl_global_agenda." WHERE start_date>='".$start_filter."' AND start_date<='".$end_filter."'";
- }
- $result = Database::query($sql, __FILE__, __LINE__);
- while ($item = Database::fetch_array($result))
- {
- // we break the date field in the database into a date and a time part
- $agenda_db_date = explode(" ", $item['start_date']);
- $date = $agenda_db_date[0];
- $time = $agenda_db_date[1];
- // we divide the date part into a day, a month and a year
- $agendadate = explode("-", $date);
- $year = intval($agendadate[0]);
- $month = intval($agendadate[1]);
- $day = intval($agendadate[2]);
- // we divide the time part into hour, minutes, seconds
- $agendatime = explode(":", $time);
- $hour = $agendatime[0];
- $minute = $agendatime[1];
- $second = $agendatime[2];
- // if the student has specified a course we a add a link to that course
- if ($item['course'] <> "")
- {
- $url = $_configuration['root_web']."main/admin/agenda.php?cidReq=".urlencode($item['course'])."&day=$day&month=$month&year=$year#$day"; // RH //Patrick Cool: to highlight the relevant agenda item
- $course_link = "<a href=\"$url\" title=\"".$item['course']."\">".$item['course']."</a>";
- }
- else
- {
- $course_link = "";
- }
- // Creating the array that will be returned. If we have week or month view we have an array with the date as the key
- // if we have a day_view we use a half hour as index => key 33 = 16h30
- if ($type !== "day_view") // This is the array construction for the WEEK or MONTH view
- {
- //Display the Agenda global in the tab agenda (administrator)
- $agendaitems[$day] .= "".get_lang('StartTimeWindow')." <i>$hour:$minute</i> - ";
- $agendaitems[$day] .= "<b>".get_lang('GlobalEvent')."</b>";
- $agendaitems[$day] .= "<div>".$item['title']."</div><br>";
- } else {
- // this is the array construction for the DAY view
- $halfhour = 2 * $agendatime['0'];
- if ($agendatime['1'] >= '30') {
- $halfhour = $halfhour +1;
- }
- //$agendaitems[$halfhour] .= "<div><i>$hour:$minute</i> <b>".get_lang('Evento Global'). ": </b><a href=\"myagenda.php?action=view&view=personal&day=$day&month=$month&year=$year&id=".$item['id']."#".$item['id']."\" class=\"personal_agenda\">".$item['title']."</a></div>";
- if (!is_array($agendaitems[$halfhour]))
- $content = $agendaitems[$halfhour];
- $agendaitems[$halfhour] = $content."<div><i>$hour:$minute</i> <b>".get_lang('GlobalEvent'). ": </b>".$item['title']."</div>";
- }
- }
- //print_r($agendaitems);
- return $agendaitems;
- }
- function display_ical_import_form()
- {
- echo '<div class="row"><div class="form_header">'.get_lang('ICalFileImport').'</div></div>';
- echo '<form enctype="multipart/form-data" action="'.api_get_self().'?origin='.Security::remove_XSS($_GET['origin']).'&action='.Security::remove_XSS($_GET['action']).'" method="post" name="frm_import_ical">';
- echo '<div class="row">
- <div class="label">
- <span class="form_required">*</span> '.get_lang('ICalFileImport').'
- </div>
- <div class="formw"><input type="file" name="ical_import"/>
- </div>
- </div>';
- echo '<div class="row">
- <div class="label">
- </div>
- <div class="formw">
- <button class="save" type="submit" name="ical_submit" value="'.get_lang('Import').'">'.get_lang('Import').'</button>
- </div>
- </div>';
- echo '</form>';
- }
|