1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768 |
- <?php
- /* For licensing terms, see /license.txt */
- /**
- * @author: Julio Montoya <gugli100@gmail.com> BeezNest 2011 - Lots of fixes - UI improvements, security fixes,
- * @author: Patrick Cool, patrick.cool@UGent.be
- * @todo this code should be clean as well as the myagenda.inc.php - jmontoya
- * @package chamilo.calendar
- */
- /**
- * Code
- */
- // 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();
- $htmlHeadXtra[] = to_javascript();
- $htmlHeadXtra[] = '<script>
- function setFocus(){
- $("#agenda_title").focus();
- }
- $(function() {
- setFocus();
- $("#selected_form_id_search").change(function() {
- var temp ="&user_id="+$("#selected_form_id_search").val();
- var position =String(window.location).indexOf("&user");
- var url_length = String(window.location).length;
- var url = String(window.location).substring(0,position)+temp;
- if (position > 0){
- window.location.replace(url);
- } else {
- url = String(window.location)+temp;
- window.location.replace(url);
- }
- });
- });
- </script>';
- /**
- * 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
- * @author Julio Montoya - Refactoring
- * @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($select_month, $select_year, $select_day = false)
- {
- $course_info = api_get_course_info();
- $select_month = intval($select_month);
- $select_year = intval($select_year);
- if ($select_day) {
- $select_day = intval($select_day);
- }
- if (!empty($select_month) && !empty($select_year)) {
- $show_all_current = " AND MONTH(start_date) = $select_month AND year(start_date) = $select_year";
- if ($select_day) {
- $show_all_current .= ' AND DAY(start_date) = '.$select_day;
- }
- $show_all_current_personal = " AND MONTH(date) = $select_month AND year(date) = $select_year";
- if ($select_day) {
- $show_all_current_personal .= ' AND DAY(date) = '.$select_day;
- }
- } else {
- $show_all_current = '';
- $show_all_current_personal = '';
- }
- // database variables
- $TABLEAGENDA = Database::get_course_table(TABLE_AGENDA);
- $TABLE_ITEM_PROPERTY = Database::get_course_table(TABLE_ITEM_PROPERTY);
- $group_memberships = GroupManager::get_group_ids($course_info['real_id'], api_get_user_id());
- $repeats = array();
- /* CONSTRUCT THE SQL STATEMENT */
- // 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 = api_get_user_id();
- if (isset($_SESSION['user'])) {
- $user_id = intval($_SESSION['user']);
- }
- $group_id = api_get_group_id();
- $session_condition = api_get_session_condition(api_get_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_info['real_id'], $_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, GroupManager::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.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.ref
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." ip
- WHERE agenda.id = ip.ref ".$show_all_current."
- AND ip.tool='".TOOL_CALENDAR_EVENT."'
- AND ( ip.to_user_id = $user_id OR ip.to_group_id IN (0, ".implode(", ", $group_memberships).") )
- AND ip.visibility='1'
- $session_condition";
- } else {
- //AND ( ip.to_user_id=$user_id OR ip.to_group_id='0')
- $sql = "SELECT agenda.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.ref
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." ip
- WHERE agenda.id = ip.ref ".$show_all_current."
- AND ip.tool='".TOOL_CALENDAR_EVENT."'
- AND ( ip.to_user_id = $user_id )
- AND ip.visibility='1'
- $session_condition";
- }
- }
- // 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,
- GroupManager::GROUP_TOOL_CALENDAR
- );
- //echo '<pre>';print_R($result);
- // lastedit
- if (!$has_access || $result['calendar_state'] == '0') {
- $group_id = 0;
- }
- }
- $sql = "SELECT agenda.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.ref
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." ip
- WHERE agenda.id = ip.ref ".$show_all_current."
- AND ip.tool='".TOOL_CALENDAR_EVENT."'
- AND ( ip.to_group_id=$group_id)
- AND ip.lastedit_type<>'CalendareventDeleted'
- $session_condition
- GROUP BY ip.ref";
- //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 (isset($_GET['isStudentView']) && $_GET['isStudentView'] == 'true') {
- $sql = "SELECT
- agenda.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.ref
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." ip
- WHERE agenda.id = ip.ref ".$show_all_current."
- AND ip.tool='".TOOL_CALENDAR_EVENT."'
- AND ip.visibility='1'
- $session_condition
- GROUP BY ip.ref
- ORDER $sort_item $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.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.ref
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." ip
- WHERE agenda.id = ip.ref ".$show_all_current."
- AND ip.tool='".TOOL_CALENDAR_EVENT."'
- AND ( ip.visibility='0' OR ip.visibility='1')
- $session_condition
- GROUP BY ip.ref";
- } 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.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.ref
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." ip
- WHERE agenda.id = ip.ref ".$show_all_current."
- AND ip.tool='".TOOL_CALENDAR_EVENT."'
- AND ( ip.visibility='0' OR ip.visibility='1')
- $session_condition
- GROUP BY ip.ref";
- /*
- 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 ".$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 ".$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) && count($group_memberships) > 0) {
- $sql = "SELECT
- agenda.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.ref
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." ip
- WHERE agenda.id = ip.ref ".$show_all_current."
- AND ip.tool='".TOOL_CALENDAR_EVENT."'
- AND ( ip.to_user_id=$user_id OR ip.to_group_id IN (0, ".implode(", ", $group_memberships).") )
- AND ip.visibility='1'
- $session_condition";
- } else {
- if (api_get_user_id()) {
- $sql = "SELECT
- agenda.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.ref
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." ip
- WHERE agenda.id = ip.ref ".$show_all_current."
- AND ip.tool='".TOOL_CALENDAR_EVENT."'
- AND ( ip.to_user_id=$user_id OR ip.to_group_id='0')
- AND ip.visibility='1'
- $session_condition";
- } else {
- $sql = "SELECT
- agenda.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.ref
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." ip
- WHERE agenda.id = ip.ref ".$show_all_current."
- AND ip.tool='".TOOL_CALENDAR_EVENT."'
- AND ip.to_group_id='0'
- AND ip.visibility='1'
- $session_condition";
- }
- }
- } // you are a student
- $my_events = array();
- $avoid_doubles = array();
- $result = Database::query($sql);
- //Course venets
- while ($row = Database::fetch_array($result, 'ASSOC')) {
- $row['calendar_type'] = 'course';
- if (!in_array($row['id'], $avoid_doubles)) {
- if (!empty($row['start_date']) && $row['start_date'] != '0000-00-00 00:00:00') {
- $row['start_date'] = api_get_local_time($row['start_date']);
- $row['start_date_tms'] = api_strtotime($row['start_date']);
- }
- if (!empty($row['end_date']) && $row['end_date'] != '0000-00-00 00:00:00') {
- $row['end_date'] = api_get_local_time($row['end_date']);
- $row['end_date_tms'] = api_strtotime($row['end_date']);
- }
- $my_events[] = $row;
- $avoid_doubles[] = $row['id'];
- }
- }
- //Check my personal calendar items
- if (api_get_setting('allow_personal_agenda') == 'true' && empty($_SESSION['user']) && empty($_SESSION['group'])) {
- $tbl_personal_agenda = Database :: get_main_table(TABLE_PERSONAL_AGENDA);
- // 1. creating the SQL statement for getting the personal agenda items in MONTH view
- $sql = "SELECT id, title, text as content , date as start_date, enddate as end_date, parent_event_id FROM ".$tbl_personal_agenda."
- WHERE user='".api_get_user_id()."' ".$show_all_current_personal;
- $result = Database::query($sql);
- while ($row = Database::fetch_array($result, 'ASSOC')) {
- $row['calendar_type'] = 'personal';
- if (!empty($row['start_date']) && $row['start_date'] != '0000-00-00 00:00:00') {
- $row['start_date'] = api_get_local_time($row['start_date']);
- $row['start_date_tms'] = api_strtotime($row['start_date']);
- }
- if (!empty($row['end_date']) && $row['end_date'] != '0000-00-00 00:00:00') {
- $row['end_date'] = api_get_local_time($row['end_date']);
- $row['end_date_tms'] = api_strtotime($row['end_date']);
- }
- $my_events[] = $row;
- }
- }
- //Check global agenda events
- if (empty($_SESSION['user']) && empty($_SESSION['group'])) {
- $table_agenda_system = Database :: get_main_table(TABLE_MAIN_SYSTEM_CALENDAR);
- $current_access_url_id = api_get_current_access_url_id();
- $sql = "SELECT DISTINCT id, title, content , start_date, end_date FROM ".$table_agenda_system."
- WHERE 1=1 ".$show_all_current." AND access_url_id = $current_access_url_id";
- $result = Database::query($sql);
- while ($row = Database::fetch_array($result, 'ASSOC')) {
- if (!empty($row['start_date']) && $row['start_date'] != '0000-00-00 00:00:00') {
- $row['start_date'] = api_get_local_time($row['start_date']);
- $row['start_date_tms'] = api_strtotime($row['start_date']);
- }
- if (!empty($row['end_date']) && $row['end_date'] != '0000-00-00 00:00:00') {
- $row['end_date'] = api_get_local_time($row['end_date']);
- $row['end_date_tms'] = api_strtotime($row['end_date']);
- }
- $row['calendar_type'] = 'global';
- $my_events[] = $row;
- }
- }
- return $my_events;
- }
- /**
- * 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($agenda_items, $month, $year)
- {
- global $DaysShort, $MonthsLong;
- if (empty($month)) {
- $month = intval(date('m'));
- }
- if (empty($year)) {
- $month = date('Y');
- }
- $month_name = $MonthsLong[$month - 1];
- //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);
- $month_link = Display::url($month_name." ".$year, api_get_self()."?".api_get_cidreq()."&month=".($month)."&year=".$year);
- $new_items = array();
- foreach ($agenda_items as $item) {
- $day = intval(substr($item["start_date"], 8, 2));
- $my_month = intval(substr($item["start_date"], 5, 2));
- if ($my_month == $month) {
- $new_items[$day][] = 1;
- }
- }
- $agenda_items = $new_items;
- echo "<table class=\"data_table\">",
- "<tr>",
- "<th width=\"10%\"><a href=\"", $backwardsURL, "\">".Display::return_icon('action_prev.png', get_lang('Previous'))." </a></th>",
- "<th width=\"80%\" colspan=\"5\">".$month_link."</th>",
- "<th width=\"10%\"><a href=\"", $forewardsURL, "\"> ".Display::return_icon('action_next.png', get_lang('Next'))." </a></th></tr>";
- echo "<tr>";
- for ($ii = 1; $ii < 8; $ii++) {
- echo "<td class=\"weekdays\">", $DaysShort[$ii % 7], "</td>";
- }
- echo "</tr>";
- $curday = -1;
- $today = getdate();
- while ($curday <= $numberofdays[$month]) {
- echo "<tr>";
- 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 "<td ".$class.">";
- if (!empty($agenda_items[$curday])) {
- echo "<a href=\"".api_get_self()."?".api_get_cidreq()."&sort=asc&toolgroup=".api_get_group_id()."&action=view&view=day&day=".$curday."&month=".$month."&year=".$year."#".$curday."\">".$dayheader."</a>";
- } else {
- echo $dayheader;
- }
- // "a".$dayheader." <span class=\"agendaitem\">".$agenda_items[$curday]."</span>";
- echo "</td>";
- $curday++;
- } else {
- echo "<td></td>";
- }
- }
- echo "</tr>";
- }
- echo "</table>";
- }
- /**
- * show the calender of the given month
- * @author: Patrick Cool <patrick.cool@UGent.be>, Ghent University
- * @author Julio Montoya - adding some nice styles
- * @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, $agenda_items)
- {
- global $MonthsLong;
- global $DaysShort;
- global $origin;
- //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()."&view=".Security::remove_XSS($_GET['view'])."&origin=$origin&month=".($month == 1 ? 12 : $month - 1)."&year=".($month == 1 ? $year - 1 : $year);
- $forewardsURL = api_get_self()."?".api_get_cidreq()."&view=".Security::remove_XSS($_GET['view'])."&origin=$origin&month=".($month == 12 ? 1 : $month + 1)."&year=".($month == 12 ? $year + 1 : $year);
- $new_month = $month - 1;
- echo '<table id="agenda_list">';
- echo '<tr>';
- echo '<th width="10%"><a href="'.$backwardsURL.'">'.Display::return_icon('action_prev.png', get_lang('Previous'), array(), 32).'</a></th>';
- echo '<th width="80%" colspan="5"><br /><h3>'.$MonthsLong[$new_month].' '.$year.'</h3></th>';
- echo '<th width="10%"><a href="'.$forewardsURL.'"> '.Display::return_icon('action_next.png', get_lang('Next'), array(), 32).'</a></th>';
- echo '</tr>';
- echo '<tr>';
- for ($ii = 1; $ii < 8; $ii++) {
- echo '<td class="weekdays" width="14%">'.$DaysShort[$ii % 7].'</td>';
- }
- echo '</tr>';
- $curday = -1;
- $today = getdate();
- $new_items = array();
- foreach ($agenda_items as $item) {
- $day = intval(substr($item["start_date"], 8, 2));
- $my_month = intval(substr($item["start_date"], 5, 2));
- if ($my_month == $month) {
- $new_items[$day][] = $item;
- }
- }
- $agenda_items = $new_items;
- while ($curday <= $numberofdays[$month]) {
- echo '<tr>';
- //week
- 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 = Display::div($curday, array('class' => 'agenda_day'));
- if (key_exists($curday, $agenda_items)) {
- $dayheader = Display::div($curday, array('class' => 'agenda_day'));
- $events_in_day = ArrayClass::msort($agenda_items[$curday], 'start_date_tms');
- foreach ($events_in_day as $value) {
- $some_content = false;
- $month_start_date = (int) substr($value['start_date'], 5, 2);
- if ($month == $month_start_date) {
- $some_content = true;
- $start_time = api_format_date($value['start_date'], TIME_NO_SEC_FORMAT);
- $end_time = '';
- if (!empty($value['end_date']) && $value['end_date'] != '0000-00-00 00:00:00') {
- $end_time = '- <i>'.api_format_date(
- $value['end_date'],
- DATE_TIME_FORMAT_LONG
- ).'</i>';
- }
- $complete_time = '<i>'.api_format_date(
- $value['start_date'],
- DATE_TIME_FORMAT_LONG
- ).'</i> '.$end_time;
- $time = '<i>'.$start_time.'</i>';
- switch ($value['calendar_type']) {
- case 'personal':
- $bg_color = '#D0E7F4';
- $icon = Display::return_icon('user.png', get_lang('MyAgenda'), array(), 22);
- break;
- case 'global':
- $bg_color = '#FFBC89';
- $icon = Display::return_icon(
- 'view_remove.png',
- get_lang('GlobalEvent'),
- array(),
- 22
- );
- break;
- case 'course':
- $bg_color = '#CAFFAA';
- $value['course_name'] = isset($value['course_name']) ? $value['course_name'] : null;
- $value['url'] = isset($value['url']) ? $value['url'] : null;
- $icon = Display::url(
- Display::return_icon(
- 'course.png',
- $value['course_name'].' '.get_lang('Course'),
- array(),
- 22
- ),
- $value['url']
- );
- break;
- default:
- break;
- }
- $icon = Display::div($icon, array('style' => 'float:right'));
- //Setting a personal event to green
- $dayheader.= '<div class="rounded_div_agenda" style="background-color:'.$bg_color.';">';
- //Link to bubble
- $url = Display::url(
- Text::cut($value['title'], 40),
- '#',
- array('id' => $value['calendar_type'].'_'.$value['id'], 'class' => 'opener')
- );
- $dayheader .= $time.' '.$icon.' '.Display::div($url);
- //Hidden content
- $content = Display::div(
- $icon.Display::tag('h1', $value['title']).$complete_time.'<hr />'.$value['content']
- );
- //Main div
- $dayheader .= Display::div(
- $content,
- array(
- 'id' => 'main_'.$value['calendar_type'].'_'.$value['id'],
- 'class' => 'dialog',
- 'style' => 'display:none'
- )
- );
- $dayheader .= '</div>';
- }
- //Do not show links with no content
- if (!$some_content) {
- $dayheader = Display::div($curday, array('class' => 'agenda_day'));
- }
- }
- }
- if (($curday == $today['mday']) && ($year == $today['year']) && ($month == $today['mon'])) {
- echo '<td class="days_today"'.$bgcolor.' style="height:122px;width:10%">'.$dayheader;
- } else {
- $class = 'days_week';
- echo '<td class="'.$class.'" '.$bgcolor.' style="height:122px;width:10%">'.$dayheader;
- }
- echo '</td>';
- $curday++;
- } else {
- echo '<td> </td>';
- }
- }
- echo '</tr>';
- } // end while
- 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()
- {
- $showImg = Display::return_icon('div_show.gif');
- $hideImg = Display::return_icon('div_hide.gif');
- return "<script type=\"text/javascript\">
- $(function() {
- //js used when generating images on the fly see function Tracking::show_course_detail()
- $(\".dialog\").dialog(\"destroy\");
- $(\".dialog\").dialog({
- autoOpen: false,
- show: \"blind\",
- resizable: false,
- height:300,
- width:550,
- modal: true
- });
- $(\".opener\").click(function() {
- var my_id = $(this).attr('id');
- var big_image = '#main_' + my_id;
- $( big_image ).dialog(\"open\");
- return false;
- });
- });
- function move(fbox, tbox)
- {
- // @todo : change associative arrays arrLookup and arrLookupTitle that use firstname/lastnam as key
- // so, pb with homonyms
- var arrFbox = new Array();
- var arrTbox = new Array();
- var arrLookup = new Array();
- var arrLookupTitle = new Array();
- var i;
- for (i = 0; i < tbox.options.length; i++)
- {
- arrLookup[tbox.options[i].text] = tbox.options[i].value;
- arrLookupTitle[tbox.options[i].text] = tbox.options[i].title;
- 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;
- arrLookupTitle[fbox.options[i].text] = fbox.options[i].title;
- 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];
- no.title = arrLookupTitle[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];
- no.title = arrLookupTitle[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\");
- var error = false;
- if (start_date > ends_date) {
- if ($('#empty_end_date').is(':checked')) {
- msg_err1.innerHTML=\"\";
- msg_err2.innerHTML=\"\";
- msg_err3.innerHTML=\"\";
- } else {
- error = true;
- msg_err1.style.display =\"block\";
- msg_err1.innerHTML=\"".get_lang('EndDateCannotBeBeforeTheStartDate')."\";
- msg_err2.innerHTML=\"\";
- msg_err3.innerHTML=\"\";
- }
- }
- if (!checkDate(start_month,start_day,start_year)) {
- msg_err2.style.display =\"block\";
- msg_err2.innerHTML=\"".get_lang('InvalidDate')."\";
- msg_err1.innerHTML=\"\";
- msg_err3.innerHTML=\"\";
- error = true;
- }
- if (!checkDate(ends_month,ends_day,ends_year)) {
- msg_err3.style.display =\"block\";
- msg_err3.innerHTML=\"".get_lang('InvalidDate')."\";
- msg_err1.innerHTML=\"\";msg_err2.innerHTML=\"\";
- error = true;
- }
- 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=\"\";
- error = true;
- }
- if (error == false) {
- if (cbList) {
- 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=' ".$hideImg." ".get_lang(
- 'AddAnAttachment'
- )."';
- } else {
- document.getElementById('options').style.display = 'none';
- document.getElementById('plus').innerHTML=' ".$showImg." ".get_lang(
- 'AddAnAttachment'
- )."';
- }
- }
- function plus_repeated_event() {
- if (document.getElementById('options2').style.display == 'none') {
- document.getElementById('options2').style.display = 'block';
- document.getElementById('plus2').innerHTML=' ".$hideImg." ".get_lang(
- 'RepeatEvent'
- )."';
- } else {
- document.getElementById('options2').style.display = 'none';
- document.getElementById('plus2').innerHTML=' ".$showImg." ".get_lang(
- 'RepeatEvent'
- )."';
- }
- }
- /*
- function plus_ical() {
- if (document.getElementById('icalform').style.display == 'none') {
- document.getElementById('icalform').style.display = 'block';
- document.getElementById('plusical').innerHTML='';
- }
- }
- */
- </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>
- 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()
- {
- $tbl_user = Database::get_main_table(TABLE_MAIN_USER);
- $tbl_courseUser = Database::get_main_table(TABLE_MAIN_COURSE_USER);
- $tbl_session_course_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
- // 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, u.username
- FROM $tbl_user as u, $tbl_courseUser as cu
- WHERE cu.c_id = '".api_get_course_int_id()."'
- AND cu.user_id = u.user_id $courseadmin_filter".$order_clause;
- $result = Database::query($sql);
- while ($user = Database::fetch_array($result)) {
- $users[$user[0]] = $user;
- }
- $session_id = api_get_session_id();
- if (!empty($session_id)) {
- $users = array();
- $sql = "SELECT u.user_id uid, u.lastname lastName, u.firstName firstName, u.username
- 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 = ".$session_id."
- AND c_id = '".api_get_course_int_id()."'";
- $result = Database::query($sql);
- 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 = CourseManager::get_group_list_of_course(api_get_course_id(), api_get_session_id());
- 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)
- {
- $order = 'lastname';
- if (api_is_western_name_order()) {
- $order = 'firstname';
- }
- $user_list = CourseManager::get_user_list_from_course_code(api_get_course_id(), api_get_session_id(), null, $order);
- $group_list = CourseManager::get_group_list_of_course(api_get_course_id(), api_get_session_id());
- construct_not_selected_select_form($group_list, $user_list, $to_already_selected);
- }
- /**
- * 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 '<select data-placeholder="'.get_lang('Select').'" style="width:150px;" class="chzn-select" id="selected_form_id_search" name="selected_form[]" multiple="multiple">';
- // Adding the groups to the select form
- if (isset($to_already_selected) && $to_already_selected === 'everyone') {
- echo '<option selected="selected" value="everyone">'.get_lang('Everyone').'</option>';
- //} else {
- } else {
- echo '<option value="everyone">'.get_lang('Everyone').'</option>';
- }
- if (is_array($group_list)) {
- echo '<optgroup label="'.get_lang('Groups').'">';
- 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 "<option value=\"GROUP:".$this_group['id']."\">",
- "G: ", $this_group['name'], " – ".$this_group['userNb']." ".get_lang('Users').
- "</option>";
- }
- }
- // a divider
- }
- echo "</optgroup>";
- // adding the individual users to the select form
- if (!empty($user_list)) {
- echo '<optgroup label="'.get_lang('Users').'">';
- foreach ($user_list as $this_user) {
- // $to_already_selected is the array containing the users (and groups) that are already selected
- if (!is_array($to_already_selected) || !in_array("USER:".$this_user['user_id'], $to_already_selected)) {
- $username = api_htmlentities(sprintf(get_lang('LoginX'), $this_user['username']), ENT_QUOTES);
- $user_info = api_get_person_name($this_user['firstname'], $this_user['lastname']).' ('.$this_user['username'].')';
- echo "<option title='$username' value='USER:".$this_user['user_id']."'>$user_info</option>";
- }
- }
- echo "</optgroup>";
- }
- echo "</select>";
- }
- function show_to($filter = 0, $id = null)
- {
- $order = 'lastname';
- if (api_is_western_name_order()) {
- $order = 'firstname';
- }
- $user_list = CourseManager::get_user_list_from_course_code(api_get_course_id(), api_get_session_id(), null, $order);
- $group_list = CourseManager::get_group_list_of_course(api_get_course_id(), api_get_session_id());
- return construct_to_select_form($group_list, $user_list, $filter, $id);
- }
- function construct_to_select_form($group_list = null, $user_list = null, $filter = 0, $id = null)
- {
- $result = '<form class="form-search" style="margin-top:3px;">';
- $result .= '<select data-placeholder= "'.get_lang('FilterAll').'" name="sel_to" class="chzn-select" id="selected_form_id_search">';
- // adding the groups to the select form
- $result .= '<option value=""></option>';
- $result .= '<option value="0">'.get_lang('FilterAll').'</option>';
- if (is_array($group_list)) {
- $result .= '<optgroup label="'.get_lang('FilterByGroup').'">';
- $this_group_name = count($group_list);
- foreach ($group_list as $this_group) {
- $group_filter = 'G:'.$this_group['id'];
- $selected = $group_filter == $filter ? "selected" : null;
- $result .= "<option value=G:".$this_group['id']." ".$selected.">".$this_group['name']."</option>";
- }
- $result .= "</optgroup>";
- }
-
- // adding the individual users to the select form
- if (!empty($user_list)) {
- $result .= '<optgroup label="'.get_lang('FilterByUser').'">';
- foreach ($user_list as $this_user) {
- $username = api_htmlentities(sprintf(get_lang('LoginX'), $this_user['username']), ENT_QUOTES);
- $user_info = api_get_person_name($this_user['firstname'], $this_user['lastname']).' ('.$this_user['username'].')';
- $selected = $this_user['user_id'] == $filter ? "selected" : null;
- $result .= "<option title='$username' value=".$this_user['user_id']." ".$selected.">$user_info</option>";
- }
- $result .= "</optgroup>";
- }
- $result .= "</select>";
- $result .= "</form>";
- return $result;
- }
- /**
- * 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 "<select id=\"selected_form2\" name=\"selectedform2[]\" 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[] = "<option value=\"".$groupuser."\">G: ".$ref_array_groups[$id]['name']."</option>";
- //echo "<option value=\"".$groupuser."\">G: ".$ref_array_groups[$id]['name']."</option>";
- } else {
- $username = api_htmlentities(sprintf(get_lang('LoginX'), $ref_array_users[$id]['username']), ENT_QUOTES);
- $user_info = api_get_person_name($ref_array_users[$id]['firstName'], $ref_array_users[$id]['lastName']);
- $select_options_user[] = "<option title='$username' value='".$groupuser."'>$user_info</option>";
- //echo "<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 "<option value=\"GROUP:".$this_group['id']."\">",
- "G: ", $this_group['name'], " – ".$this_group['userNb']." ".get_lang('Users').
- "</option>";
- }
- }
- }
- 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 "<option value=\"USER:", $this_user['uid'], "\">",
- "", api_get_person_name($this_user['firstName'], $this_user['lastName']),
- "</option>";
- }
- }
- }
- }
- echo "</select>";
- }
- /**
- * 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()
- {
- $_course = api_get_course_info();
- $TABLEAGENDA = Database::get_course_table(TABLE_AGENDA);
- $t_agenda_repeat = Database::get_course_Table(TABLE_AGENDA_REPEAT);
- $course_id = api_get_course_int_id();
- // some filtering of the input data
- $title = 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";
- $title = Database::escape_string($title);
- $content = Database::escape_string($content);
- $start_date = Database::escape_string($start_date);
- $end_date = Database::escape_string($end_date);
- if ($_POST['empty_end_date'] == 'on') {
- $end_date = "0000-00-00 00:00:00";
- }
- // store in the table calendar_event
- $sql = "INSERT INTO ".$TABLEAGENDA." (c_id, title,content, start_date, end_date)
- VALUES ($course_id, '".$title."','".$content."', '".$start_date."','".$end_date."')";
- $result = Database::query($sql);
- $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);
- $send_to = separate_users_groups(explode('|', $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", api_get_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", api_get_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", api_get_user_id(), '', '', $start_date, $end_date);
- }
- // storing the resources
- store_resources($_SESSION['source_type'], $last_id);
- $course_id = api_get_course_int_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 (c_id, cal_id, cal_type, cal_end)".
- " VALUES ($course_id, $last_id,'$type',$end)";
- $res = Database::query($sql);
- }
- }
- }
- 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);
- $course_id = api_get_course_int_id();
- 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 WHERE c_id = $course_id ";
- $res_max = Database::query($sql_max);
- $row_max = Database::fetch_array($res_max);
- $max = intval($row_max[0]) + 1;
- //build the announcement text
- $content = $row['content'];
- //insert announcement
- $session_id = api_get_session_id();
- $sql_ins = "INSERT INTO $table_ann (c_id, title,content,end_date,display_order,session_id) ".
- "VALUES ($course_id, '".Database::escape_string($row['title'])."','".Database::escape_string($content)."','".Database::escape_string($row['end_date'])."','$max','$session_id')";
- $res_ins = Database::query($sql_ins);
- 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);
- if (Database::num_rows($res_props) > 0) {
- while ($row_props = Database::fetch_array($res_props)) {
- //insert into announcement item_property
- $time = api_get_utc_datetime();
- $sql_ins_props = "INSERT INTO $table_props ".
- "(c_id, 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 ".
- "($course_id, '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);
- if ($res_ins_props <= 0) {
- return -1;
- } 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;
- $send_to['everyone'] = false;
- if (is_array($to) && count($to) > 0) {
- foreach ($to as $to_item) {
- list($type, $id) = explode(':', $to_item);
- switch ($type) {
- case 'everyone':
- $send_to['everyone'] = true;
- 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)
- {
- $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);
- 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();
- // 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;
- $output = array();
- // starting the form if there is more than one user/group
- if ($total_numbers > 1) {
- //$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) {
- if (isset($group_names[$group_id]['name'])) {
- $output[] = $group_names[$group_id]['name'];
- }
- }
- }
- if (isset($sent_to_array['users'])) {
- if (is_array($sent_to_array['users'])) {
- foreach ($sent_to_array['users'] as $user_id) {
- // @todo add username as tooltip - is this fucntion still used ?
- // $user_info= api_get_user_info($user_id);
- // $username = api_htmlentities(sprintf(get_lang('LoginX'), $user_info['username']), ENT_QUOTES);
- $output[] = api_get_person_name($user_info['firstName'], $user_info['lastName']);
- }
- }
- }
- } else {
- // there is only one user/group
- if (is_array($sent_to_array['users'])) {
- // @todo add username as tooltip - is this fucntion still used ?
- // $user_info = api_get_user_info($sent_to_array['users'][0]);
- // $username = api_htmlentities(sprintf(get_lang('LoginX'), $user_info['username']), ENT_QUOTES);
- $output[] = 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];
- $output[] = $group_names[$group_id]['name'];
- }
- if (is_array($sent_to_array['groups']) and $sent_to_array['groups'][0] == 0) {
- $output[] = get_lang("Everybody");
- }
- }
- if (!empty($output)) {
- $output = array_filter($output);
- if (count($output) > 0) {
- $output = implode(', ', $output);
- }
- return $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\">".get_lang('ShowAll')."</option>";
- foreach ($group_list as $this_group) {
- echo "<option value=\"agenda.php?action=view&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\">".get_lang('ShowAll')."</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?action=view&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 "<select name=\"select\" onchange=\"javascript: MM_jumpMenu('parent',this,0)\">";
- echo "<option value=\"agenda.php?user=none&action=view\">".get_lang("ShowAll")."</option>";
- // Groups
- $group_list = get_course_groups();
- $group_available_to_access = array();
- $option = '';
- if (!empty($group_list)) {
- $option = "<optgroup label=\"".get_lang("Groups")."\">";
- 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'],
- GroupManager::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.= "<option value=\"agenda.php?action=view&group=".$this_group['id']."\" ";
- $option.= ($this_group['id'] == $_SESSION['group']) ? " selected" : "";
- $option.= ">".$this_group['name']."</option>";
- }
- }
- $option.= "</optgroup>";
- }
- echo $option;
- // Users
- $user_list = get_course_users();
- if (!empty($user_list)) {
- echo "<optgroup label=\"".get_lang("Users")."\">";
- foreach ($user_list as $this_user) {
- echo "<option value=\"agenda.php?action=view&user=".$this_user['uid']."\" ";
- echo (isset($_SESSION['user']) && $this_user['uid'] == $_SESSION['user']) ? " selected" : "";
- echo ">".api_get_person_name($this_user['firstName'], $this_user['lastName'])."</option>";
- }
- echo "</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)
- {
- $tool = Database::escape_string($tool);
- $id = Database::escape_string($id);
- $TABLE_ITEM_PROPERTY = Database::get_course_table(TABLE_ITEM_PROPERTY);
- $course_id = api_get_course_int_id();
- $sql = "SELECT * FROM $TABLE_ITEM_PROPERTY WHERE c_id = $course_id AND tool='$tool' AND ref='$id'";
- $result = Database::query($sql) or die(Database::error());
- $to = array();
- 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)
- {
- $_course = api_get_course_info();
- $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) 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($filter = 0)
- {
- if (!api_get_course_int_id()) {
- $type = isset($_REQUEST['type']) ? Security::remove_XSS($_REQUEST['type']) : 'personal';
- if ($type == 'platform') {
- $type = 'admin';
- }
- return "<a href='agenda_js.php?type=$type'>".Display::return_icon('calendar.png', get_lang('Agenda'), '', ICON_SIZE_MEDIUM)."</a>";
- }
- $form = null;
- if (!isset($_GET['action'])) {
- $form = show_to($filter, 'selected_form_id_search');
- $actions = "<a href='agenda_js.php?type=course&".api_get_cidreq()."'>".Display::return_icon('calendar_na.png', get_lang('Agenda'), '', ICON_SIZE_MEDIUM)."</a>";
- } else {
- $actions = "<a href='agenda_js.php?type=course&".api_get_cidreq()."'>".Display::return_icon('calendar.png', get_lang('Agenda'), '', ICON_SIZE_MEDIUM)."</a>";
- }
- $actions .= "<a href='agenda.php?".api_get_cidreq()."&sort=asc&toolgroup=".api_get_group_id()."&action=add'>".Display::return_icon('new_event.png', get_lang('AgendaAdd'), '', ICON_SIZE_MEDIUM)."</a>";
- $actions .= "<a href='agenda.php?".api_get_cidreq()."&action=importical'>".Display::return_icon('import_calendar.png', get_lang('ICalFileImport'), '', ICON_SIZE_MEDIUM)."</a>";
- $actions .= $form;
- return $actions;
- }
- /**
- * 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
- * @author Julio Montoya removing options, changing to a simple agenda tool
- */
- function display_student_links()
- {
- global $show;
- $month = isset($_GET['month']) ? intval($_GET['month']) : null;
- $year = isset($_GET['year']) ? intval($_GET['year']) : null;
- $day_url = '&month='.$month.'&year='.$year;
- if ($_SESSION['view'] <> 'month') {
- echo "<a href=\"".api_get_self()."?action=view".$day_url."&toolgroup=".api_get_group_id()."&view=month\">".Display::return_icon('month_empty.png', get_lang('MonthView'), '', ICON_SIZE_MEDIUM)."</a> ";
- } else {
- echo "<a href=\"".api_get_self()."?action=view".$day_url."&toolgroup=".api_get_group_id()."&view=list\">".Display::return_icon('week.png', get_lang('ListView'), '', ICON_SIZE_MEDIUM)."</a> ";
- }
- $day_url = '&month='.date('m').'&year='.date('Y').'&view='.Security::remove_XSS($_GET['view']);
- $today_url = api_get_self()."?action=view".$day_url."&toolgroup=".api_get_group_id();
- echo Display::url(get_lang('Today'), $today_url, array('class' => 'btn'));
- }
- /**
- * 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 array 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 = intval(Database::escape_string(($_GET['id'])));
- } else {
- $id = (int) $id;
- }
- $course_id = api_get_course_int_id();
- if (empty($id)) {
- return $item;
- }
- $sql = "SELECT * FROM ".$TABLEAGENDA." WHERE id='".$id."' AND c_id = $course_id ";
- $result = Database::query($sql);
- $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 c_id = $course_id AND cal_id = $id";
- $res = Database::query($sql);
- 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
- * @author Julio Montoya Adding UTC support
- */
- function store_edited_agenda_item($event_id, $id_attach, $file_comment)
- {
- // STEP 1: editing the calendar_event table
- // 1.a. some filtering of the input data
- $id = $event_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'];
- if ($_POST['empty_end_date'] == 'on') {
- $end_date = "0000-00-00 00:00:00";
- }
- $course_info = api_get_course_info();
- $agendaObj = new Agenda();
- if (empty($course_info)) {
- $agendaObj->type = 'personal';
- } else {
- $agendaObj->set_course($course_info);
- $agendaObj->type = 'course';
- if (api_is_course_coach() && !api_is_element_in_the_session(TOOL_AGENDA, $event_id)) {
- return false;
- }
- if (!api_is_allowed_to_edit(null, true)) {
- return false;
- }
- }
- $all_day = isset($_REQUEST['all_day']) && !empty($_REQUEST['all_day']) ? 1 : 0;
- $agendaObj->edit_event($id, $start_date, $end_date, $all_day, null, $title, $content);
- 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_property 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 c_id = $course_id AND ref='$id' AND tool='".TOOL_CALENDAR_EVENT."'";
- $result = Database::query($sql_delete) 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", api_get_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", api_get_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", api_get_user_id(), '', '', $start_date, $end_date);
- }
- }*/
- // 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($title);
- $content = Database::escape_string($content);
- $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);
- return true;
- }
- /**
- * This is the function that deletes an agenda item.
- * The agenda item is no longer physically 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)
- {
- $_course = api_get_course_info();
- $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 = intval($_GET['id']);
- $sql = "SELECT * FROM $t_agenda_r WHERE cal_id = $id";
- $res = Database::query($sql);
- if (Database::num_rows($res) > 0) {
- $sql_children = "SELECT * FROM $t_agenda WHERE parent_event_id = $id";
- $res_children = Database::query($sql_children);
- 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);
- }
- //$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) 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@beeznest.com> - cleanup
- * @author Julio Montoya <gugli100@gmail.com> - Refactoring
- */
- function display_agenda_items($agenda_items, $day = false)
- {
- global $charset;
- if (isset($day) && $day) {
- $new_items = array();
- foreach ($agenda_items as $item) {
- if (substr($item['start_date'], 8, 2) == $day) {
- $new_items[] = $item;
- }
- }
- $agenda_items = $new_items;
- }
- if (isset($_GET['sort']) && $_GET['sort'] == 'asc') {
- $sort_inverse = 'desc';
- $sort = 'asc';
- } else {
- $sort_inverse = 'asc';
- $sort = 'desc';
- }
- if (isset($_GET['col']) && $_GET['col'] == 'end') {
- $sort_item = 'end_date_tms';
- $col = 'end';
- } else {
- $sort_item = 'start_date_tms';
- $col = 'start';
- }
- $agenda_items = ArrayClass::msort($agenda_items, $sort_item, $sort);
- //DISPLAY: NO ITEMS
- if (empty($agenda_items)) {
- echo Display::display_warning_message(get_lang('NoAgendaItems'));
- } else {
- echo '<table class="data_table">';
- $th = Display::tag('th', get_lang('Title'));
- $month = isset($_GET['month']) ? intval($_GET['month']) : null;
- $year = isset($_GET['year']) ? intval($_GET['year']) : null;
- $day = isset($_GET['day']) ? intval($_GET['day']) : null;
- $url = api_get_self().'?'.api_get_cidreq().'&month='.$month.'&year='.$year.'&day='.$day;
- $th .= Display::tag('th', Display::url(get_lang('StartTimeWindow'), $url.'&sort='.$sort_inverse.'&col=start'));
- $th .= Display::tag('th', Display::url(get_lang('EndTimeWindow'), $url.'&sort='.$sort_inverse.'&col=end'));
- if ((api_is_allowed_to_edit(false, true) OR (api_get_course_setting('allow_user_edit_agenda') && !api_is_anonymous()))) {
- $th .= Display::tag('th', get_lang('Modify'));
- }
- echo Display::tag('tr', $th);
- $counter = 0;
- foreach ($agenda_items as $myrow) {
- $is_repeated = !empty($myrow['parent_event_id']);
- $class = 'row_even';
- if ($counter % 2) {
- $class = 'row_odd';
- }
- /* display: the icon, title, destinees of the item */
- echo '<tr class="'.$class.'">';
- //Title
- echo "<td>";
- $attach_icon = '';
- // attachment list
- $attachment_list = get_attachment($myrow['id']);
- if (!empty($attachment_list)) {
- $attach_icon = ' '.Display::return_icon('attachment.gif', get_lang('Attachment'));
- }
- $title_class = '';
- if (isset($myrow['visibility']) && $myrow['visibility'] == 0) {
- $title_class = 'invisible';
- }
- switch ($myrow['calendar_type']) {
- case 'global':
- $icon_type = Display::return_icon('view_remove.png', get_lang('GlobalEvent'), array(), 22);
- echo $icon_type.' '.$myrow['title'].$attach_icon;
- break;
- case 'personal':
- $icon_type = Display::return_icon('user.png', get_lang(' '), array(), 22);
- echo $icon_type.' '.$myrow['title'].$attach_icon;
- break;
- case 'course':
- $icon_type = Display::return_icon('course.png', get_lang('Course'), array(), 22);
- $agenda_url = api_get_path(WEB_CODE_PATH).'calendar/agenda.php?agenda_id='.$myrow['id'].'&action=view';
- echo Display::url($icon_type.' '.$myrow['title'].$attach_icon, $agenda_url, array('class' => $title_class));
- break;
- }
- echo '</td>';
- //Start date
- echo '<td>';
- if (!empty($myrow['start_date']) && $myrow['start_date'] != '0000-00-00 00:00:00') {
- echo api_format_date($myrow['start_date']);
- }
- echo '</td>';
- //End date
- echo '<td>';
- if (!empty($myrow['end_date']) && $myrow['end_date'] != '0000-00-00 00:00:00') {
- echo api_format_date($myrow['end_date']);
- }
- echo '</td>';
- /* 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())) && $myrow['calendar_type'] == 'course') {
- echo '<td align="center">';
- 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'].'&sort='.$sort.'&col='.$col.'&';
- // edit
- echo '<a href="'.$mylink.api_get_cidreq()."&toolgroup=".Security::remove_XSS($_GET['toolgroup']).'&action=edit&id_attach='.$attachment_list['id'].'" title="'.get_lang("ModifyCalendarItem").'">';
- echo Display::return_icon('edit.png', get_lang('ModifyCalendarItem'), '', ICON_SIZE_SMALL)."</a>";
- echo '<a href="'.$mylink.api_get_cidreq()."&toolgroup=".Security::remove_XSS($_GET['toolgroup']).'&action=announce" title="'.get_lang("AddAnnouncement").'">';
- echo Display::return_icon('new_announce.png', get_lang('AddAnnouncement'), array(), ICON_SIZE_SMALL)."</a> ";
- if ($myrow['visibility'] == 1) {
- $image_visibility = "visible";
- $text_visibility = get_lang("Hide");
- $next_action = 0;
- } else {
- $image_visibility = "invisible";
- $text_visibility = get_lang("Show");
- $next_action = 1;
- }
- echo '<a href="'.$mylink.api_get_cidreq().'&toolgroup='.Security::remove_XSS($_GET['toolgroup']).'&action=showhide&next_action='.$next_action.'" title="'.$text_visibility.'">'.Display::return_icon($image_visibility.'.png', $text_visibility, '', ICON_SIZE_SMALL).'</a> ';
- echo "<a href=\"".$mylink.api_get_cidreq()."&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.png', get_lang('Delete'), '', ICON_SIZE_SMALL)." </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="#" 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('printer.png', get_lang('Print'), '', ICON_SIZE_SMALL).'</a> ';
- echo '</td>';
- } else {
- if ($is_repeated && (api_is_allowed_to_edit(false, true) || api_get_course_setting('allow_user_edit_agenda') && !api_is_anonymous() )) {
- echo '<td align="center">';
- 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 '</td>';
- }
- if ((api_is_allowed_to_edit(false, true) || (api_get_course_setting('allow_user_edit_agenda') && !api_is_anonymous()) ) && ($myrow['calendar_type'] == 'personal' OR $myrow['calendar_type'] == 'global')) {
- echo '<td align="center">';
- echo '</td>';
- }
- }
- $counter++;
- echo "</tr>";
- } // end while ($myrow=Database::fetch_array($result))
- echo "</table><br /><br />";
- }
- 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, $course_id = null)
- {
- $agenda_table_attachment = Database::get_course_table(TABLE_AGENDA_ATTACHMENT);
- if (empty($course_id)) {
- $course_id = api_get_course_int_id();
- } else {
- $course_id = intval($course_id);
- }
- $agenda_id = Database::escape_string($agenda_id);
- $row = array();
- $sql = 'SELECT id,path, filename,comment FROM '.$agenda_table_attachment.' WHERE c_id = '.$course_id.' AND agenda_id = '.(int) $agenda_id.'';
- $result = Database::query($sql);
- 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 $dateFormatLong, $timeNoSecFormat, $charset;
- // getting the name of the groups
- $group_names = get_course_groups();
- $agenda_id = intval($agenda_id);
- if (!(api_is_allowed_to_edit(false, true) || (api_get_course_setting('allow_user_edit_agenda') && !api_is_anonymous(
- )))
- ) {
- $visibility_condition = " AND ip.visibility='1' ";
- }
- $sql = "SELECT agenda.*, ip.visibility, ip.to_group_id, ip.insert_user_id, ip.ref
- FROM ".$TABLEAGENDA." agenda, ".$TABLE_ITEM_PROPERTY." ip
- WHERE agenda.id = ip.ref
- AND ip.tool='".TOOL_CALENDAR_EVENT."'
- $visibility_condition
- AND agenda.id='$agenda_id'";
- $result = Database::query($sql);
- $number_items = Database::num_rows($result);
- $myrow = Database::fetch_array($result, 'ASSOC'); // 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);
- $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) {
- Display::display_warning_message(get_lang("NoAgendaItems"));
- return false;
- }
- // DISPLAY: THE ITEMS
- echo "<table id=\"data_table\" class=\"data_table\">";
- // DISPLAY : the icon, title, destinees of the item
- $myrow["start_date"] = api_get_local_time($myrow["start_date"]);
- // highlight: if a date in the small calendar is clicked we highlight the relevant items
- $db_date = (int) api_format_date($myrow["start_date"], "%d").intval(api_format_date($myrow["start_date"], "%m")).api_format_date($myrow["start_date"], "%Y");
- 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 Display::tag('h2', $myrow['title']);
- echo "<tr>";
- if (api_is_allowed_to_edit(false, true)) {
- 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
- // 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';
- echo '<th style="text-align:right">';
- 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']);
- }
- if ($myrow['visibility'] == 1) {
- $image_visibility = "visible";
- $next_action = 0;
- } else {
- $image_visibility = "invisible";
- $next_action = 1;
- }
- echo '<a href="'.$mylink.'&action=showhide&next_action='.$next_action.'">'.Display::return_icon($image_visibility.'.png', get_lang('Visible'), '', ICON_SIZE_SMALL).'</a>';
- echo "<a href=\"".$mylink."&action=edit\">",
- Display::return_icon('edit.png', get_lang('ModifyCalendarItem'), '', ICON_SIZE_SMALL), "</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.png', get_lang('Delete'), '', ICON_SIZE_SMALL), "</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('printer.png', get_lang('Print'), '', ICON_SIZE_SMALL).'</a> ';
- echo "</th>";
- }
- }
- // title
- echo "<tr class='row_odd'>";
- echo '<td colspan="2">'.get_lang("StartTime").": ";
- echo api_format_date($myrow['start_date']);
- echo "</td>";
- echo "</td>";
- echo "<tr class='row_odd'>";
- echo '<td colspan="2">'.get_lang("EndTime").": ";
- echo api_convert_and_format_date($myrow['end_date']);
- echo "</td>";
- // Content
- $content = $myrow['content'];
- $content = Text::make_clickable($content);
- echo '<tr class="row_even">';
- echo '<td '.(api_is_allowed_to_edit() ? 'colspan="3"' : 'colspan="2"').'>';
- echo $content;
- echo '</td></tr>';
- //Attachments
- $attachment_list = get_attachment($agenda_id);
- if (!empty($attachment_list)) {
- echo '<tr class="row_even"><td colspan="2">';
- $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.'"> '.$user_filename.'</a>';
- 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.png', get_lang('Delete'), '', ICON_SIZE_SMALL).'</a><br />';
- }
- echo '<br /><span class="forum_attach_comment" >'.$attachment_list['comment'].'</span>';
- echo '</td></tr>';
- }
- // the message has been sent to
- echo '<tr>';
- echo "<td class='announcements_datum'>".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 "</td></tr>";
- if ($repeat) {
- echo '<tr>';
- echo '<td colspan="2">';
- echo get_lang('RepeatedEvent').' <a href="', api_get_self(), '?', api_get_cidreq(), '&agenda_id=', $repeat_id, '" alt="', get_lang('RepeatedEventViewOriginalEvent'), '">', get_lang('RepeatedEventViewOriginalEvent'), '</a>';
- echo '</td>';
- echo '</tr>';
- }
- /* 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 = '', $type = null)
- {
- $showImg = Display::return_icon('div_show.gif');
- $hideImg = Display::return_icon('div_hide.gif');
- $MonthsLong = api_get_months_long();
- $htmlHeadXtra[] = to_javascript();
- // the default values for the forms
- //if (isset(!$_GET['originalresource']) && $_GET['originalresource'] !== 'no') {
- if (!isset($_GET['originalresource'])) {
- $day = date('d');
- $month = date('m');
- $year = date('Y');
- $hours = 9;
- $minutes = '00';
- $title = null;
- $content = null;
- $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 = isset($_SESSION['formelements']) ? $_SESSION['formelements'] : null;
- $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 (isset($_POST['To']) && $_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;
- }
- $default_no_empty_end_date = 0;
- $course_info = null;
- // if the id is set then we are editing an agenda item
- if (!empty($id)) {
- $course_info = api_get_course_info();
- $agendaObj = new Agenda();
- if (!empty($course_info)) {
- $agendaObj->set_course($course_info);
- $agendaObj->type = 'course';
- } else {
- if (api_is_platform_admin() && $type == 'platform') {
- $agendaObj->type = 'admin';
- } else {
- $agendaObj->type = 'personal';
- }
- }
- $agendaItem = $agendaObj->get_event($id);
- $title = $agendaItem['title'];
- $content = $agendaItem['description'];
- // start date
- if ($agendaItem['start_date'] != '0000-00-00 00:00:00') {
- $agendaItem['start_date'] = api_get_local_time($agendaItem['start_date']);
- list($datepart, $timepart) = explode(" ", $agendaItem['start_date']);
- list($year, $month, $day) = explode("-", $datepart);
- list($hours, $minutes, $seconds) = explode(":", $timepart);
- }
- // end date
- if (!empty($agendaItem['end_date']) && $agendaItem['end_date'] != '0000-00-00 00:00:00') {
- $agendaItem['end_date'] = api_get_local_time($agendaItem['end_date']);
- list($datepart, $timepart) = explode(" ", $agendaItem['end_date']);
- list($end_year, $end_month, $end_day) = explode("-", $datepart);
- list($end_hours, $end_minutes, $end_seconds) = explode(":", $timepart);
- } else {
- if ($agendaItem['all_day']) {
- $end_year = $year;
- $end_month = $month;
- $end_day = $day;
- $end_hours = $hours;
- $end_minutes = $minutes;
- $end_seconds = $seconds;
- }
- }
- // attachments
- //edit_added_resources("Agenda", $id);
- //$to = $item_2_edit['to'];
- } else {
- $to = load_edit_users(TOOL_CALENDAR_EVENT, $id);
- }
- $content = stripslashes($content);
- $title = stripslashes($title);
- // we start a completely new item, we do not come from the resource linker
- if (isset($_GET['originalresource']) && $_GET['originalresource'] !== "no" and $_GET['action'] == "add") {
- $_SESSION["formelements"] = null;
- unset_session_resources();
- }
- $origin = isset($_GET['origin']) ? Security::remove_XSS($_GET['origin']) : null;
- $course_url = empty($course_info) ? null : api_get_cidreq();
- ?>
- <form class="form-horizontal" enctype="multipart/form-data" action="<?php echo api_get_self().'?type='.Security::remove_XSS($type).'&origin='.$origin.'&'.$course_url."&sort=asc&toolgroup=".api_get_group_id().'&action='.Security::remove_XSS($_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 isset($_REQUEST['id_attach']) ? intval($_REQUEST['id_attach']) : null; ?>" />
- <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 '<legend>'.$form_title.'</legend>';
- // the title of the agenda item
- echo '<div class="control-group">
- <label class="control-label">
- <span class="form_required">*</span>'.get_lang('ItemTitle').'
- </label>
- <div class="controls">
- <div id="err_title" style="display:none;color:red"></div>
- <input type="text" id="agenda_title" class="span5" name="title" value="';
- if (isset($title)) {
- echo $title;
- }
- echo '" />
- </div>
- </div>';
- // selecting the users / groups
- $group_id = api_get_group_id();
- if (empty($id)) {
- if (isset($group_id) && !empty($group_id)) {
- echo '<input type="hidden" name="selected_form[0]" value="GROUP:'.$group_id.'"/>';
- echo '<input type="hidden" name="To" value="true"/>';
- } else {
- echo '<div class="control-group">
- <label class="control-label">
- '.Display::return_icon('group.png', get_lang('To'), array('align' => 'absmiddle'), ICON_SIZE_SMALL).' '.get_lang('To').'</a>
- </label>
- <div class="controls">';
- show_to_form($to);
- echo '</div>
- </div>';
- }
- }
- // start date and time
- echo '<div class="control-group">';
- echo '<label class="control-label">'.get_lang('StartDate').'</label>
- <div class="controls">
- <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
- 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 "<option value=\"".$value."\" selected> ".$i." </option>";
- } else {
- echo "<option value=\"$value\">$i</option>";
- }
- }
- ?>
- </select>
- <select name="fmonth" onchange="javascript:document.new_calendar_item.end_fmonth.value=this.value;">
- <?php
- 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 "<option value=\"".$value."\" selected>".$MonthsLong[$i - 1]."</option>";
- } else {
- echo "<option value=\"".$value."\">".$MonthsLong[$i - 1]."</option>";
- }
- }
- ?>
- </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
- for ($i = 1; $i <= 5; $i++) {
- $value = $year + $i;
- echo "<option value=\"$value\">$value</option>";
- }
- ?>
- </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').": "; ?>
- <select name="fhour" onchange="javascript:document.new_calendar_item.end_fhour.value=this.value;">
- <!-- <option value="--">--</option> -->
- <?php
- 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 "<option value=\"".$value."\" selected> ".$value." </option>";
- } else {
- echo "<option value=\"$value\">$value</option>";
- }
- }
- ?>
- </select>
- <select name="fminute" onchange="javascript:document.new_calendar_item.end_fminute.value=this.value;">
- <!-- <option value="<?php echo $minutes ?>"><?php echo $minutes; ?></option> -->
- <?php
- foreach (range(0, 59) as $i) {
- // values have to have double digits
- $value = ($i <= 9 ? '0'.$i : $i );
- if ($minutes == $value) {
- echo "<option value=\"".$value."\" selected> ".$value." </option>";
- } else {
- echo "<option value=\"$value\">$value</option>";
- }
- }
- ?>
- </select>
- <?php
- echo ' </div>
- </div>';
- echo '<script>
- $(function() {
- $("#empty_end_date").click(function(){
- if ($("#empty_end_date").is(":checked")) {
- $("#end_date_span").hide();
- } else {
- $("#end_date_span").show();
- }
- });';
- if (isset($item_2_edit['end_date']) && $item_2_edit['end_date'] == '0000-00-00 00:00:00') {
- echo '$("#end_date_span").hide();';
- } echo '
- });
- </script>';
- // end date and time
- echo '<span id="end_date_span">';
- echo '<div class="control-group">
- <label class="control-label">
- '.get_lang('EndDate').'
- </label>
- <div class="controls">
- <div id="err_end_date" style="display:none;color:red"></div>';
- ?>
- <select id="end_fday" 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
- 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 "<option value=\"".$value."\" selected> ".$i." </option>";
- } else {
- echo "<option value=\"".$value."\">".$i."</option>";
- }
- }
- ?>
- </select>
- <!-- month: january -> december -->
- <select id="end_fmonth" name="end_fmonth">
- <?php
- foreach (range(1, 12) as $i) {
- // values have to have double digits
- $value = ($i <= 9 ? '0'.$i : $i );
- if ($value == $end_month) {
- echo "<option value=\"".$value."\" selected>".$MonthsLong[$i - 1]."</option>";
- } else {
- echo "<option value=\"".$value."\">".$MonthsLong[$i - 1]."</option>";
- }
- }
- ?>
- </select>
- <select id="end_fyear" name="end_fyear">
- <option value="<?php echo ($end_year - 2) ?>"><?php echo ($end_year - 2) ?></option>
- <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
- for ($i = 1; $i <= 5; $i++) {
- $value = $end_year + $i;
- echo "<option value=\"$value\">$value</option>";
- }
- ?>
- </select>
- <a href="javascript:openCalendar('new_calendar_item', 'end_f')">
- <?php echo Display::span(Display::return_icon('calendar_select.gif', get_lang('Select'), array('style' => 'vertical-align: middle;')), array('id' => 'end_date_calendar_icon')); ?>
- </a>
- <?php echo get_lang('EndTime').": "; ?>
- <select id="end_fhour" name="end_fhour">
- <!-- <option value="--">--</option> -->
- <?php
- 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 "<option value=\"".$value."\" selected> ".$value." </option>";
- } else {
- echo "<option value=\"".$value."\"> ".$value." </option>";
- }
- }
- ?>
- </select>
- <select id="end_fminute" 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 );
- $value = ($i <= 9 ? '0'.$i : $i );
- if ($end_minutes == $value) {
- echo "<option value=\"".$value."\" selected> ".$value." </option>";
- } else {
- echo "<option value=\"$value\">$value</option>";
- }
- }
- ?>
- </select>
- <?php
- echo ' </div>
- </div> </span>';
- // Repeating the calendar item
- if (empty($id)) {
- //only show repeat fields when adding, not for editing an calendar item
- echo '<div class="control-group">
- <label class="control-label"></label>
- <div class="controls">
- <a href="javascript://" onclick="return plus_repeated_event();"><span id="plus2">
- '.$showImg.' '.get_lang('RepeatEvent').'</span>
- </a>';
- ?>
- <table id="options2" style="display: none;">
- <tr>
- <td>
- <label for="repeat_id">
- <input id="repeat_id" type="checkbox" name="repeat" <?php echo ($repeat ? 'checked="checked"' : ''); ?>/>
- <?php echo get_lang('RepeatEvent'); ?>
- </label></td>
- <td>
- </td>
- </tr>
- <tr>
- <td><label><?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><?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
- 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 "<option value=\"".$value."\" selected> ".$i." </option>";
- } else {
- echo "<option value=\"".$value."\">".$i."</option>";
- }
- }
- ?>
- </select>
- <!-- month: january -> december -->
- <select name="repeat_end_month">
- <?php
- foreach (range(1, 12) as $i) {
- // values have to have double digits
- $value = ($i <= 9 ? '0'.$i : $i );
- if ($value == $end_month + 1) {
- echo '<option value="', $value, '" selected="selected">', $MonthsLong[$i - 1], "</option>";
- } else {
- echo '<option value="', $value, '">', $MonthsLong[$i - 1], "</option>";
- }
- }
- ?>
- </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
- for ($i = 1; $i <= 5; $i++) {
- $value = $end_year + $i;
- echo "<option value=\"$value\">$value</option>";
- }
- ?>
- </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>';
- }
- if (isset($agendaItem['all_day'])) {
- $checked = null;
- if ($agendaItem['all_day']) {
- $checked = 'checked';
- }
- echo ' <div class="control-group">
- <label class="control-label"></label>
- <div class="controls">
- <input type="checkbox" '.$checked.' name="all_day"/> '.get_lang('AllDay').'
- </div>
- </div>';
- }
- //only show repeat fields if adding, not if editing
- // the main area of the agenda item: the wysiwyg editor
- echo ' <div class="control-group">
- <label class="control-label">
- <span class="form_required">*</span>'.get_lang('Description').'
- </label>
- <div class="controls">';
- $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 '<textarea class="span5" rows="4" name="content">'.$content.'</textarea>';
- echo '</div>
- </div>';
- if (isset($agendaObj) && $agendaObj->type == 'course') {
- // File attachment
- echo ' <div class="control-group">
- <label class="control-label">
- '.get_lang('AddAnAttachment').' </label>
- <div class="controls">
- <input type="file" name="user_upload"/> '.get_lang('Comment').' <input name="file_comment" type="text" size="20" />
- </div>
- </div>';
- }
- // the submit button for storing the calendar item
- echo ' <div class="control-group">
- <label class="control-label">
- </label>
- <div class="controls">';
- 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)
- {
- $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);
- $course_info = api_get_course_info();
- $group_memberships = GroupManager :: get_group_ids($course_info['real_id'], api_get_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='".api_get_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='".api_get_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);
- while ($item = Database::fetch_array($result)) {
- $agendaday_string = api_convert_and_format_date($item['start_date'], "%d", date_default_timezone_get());
- $agendaday = intval($agendaday_string);
- $time = api_convert_and_format_date($item['start_date'], TIME_NO_SEC_FORMAT);
- $URL = api_get_path(
- WEB_CODE_PATH
- ).'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()
- {
- $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();
- $session_id = api_get_session_id();
- $course_id = $mycourse['real_id'];
- $group_memberships = GroupManager :: get_group_ids($mycourse['real_id'], $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.c_id = $course_id AND
- item_property.c_id = $course_id AND
- agenda.id = item_property.ref
- AND item_property.tool='".TOOL_CALENDAR_EVENT."'
- AND item_property.visibility='1'
- AND agenda.start_date > NOW()
- AND session_id = '".$session_id."'
- 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.c_id = $course_id AND
- item_property.c_id = $course_id AND
- 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()
- AND session_id = '".$session_id."'
- ORDER BY start_date ";
- } else {
- $sqlquery = "SELECT
- agenda.*, item_property.*
- FROM ".$TABLEAGENDA." agenda,
- ".$TABLE_ITEMPROPERTY." item_property
- WHERE
- agenda.c_id = $course_id AND
- item_property.c_id = $course_id AND
- 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()
- AND session_id = '".$session_id."'
- ORDER BY start_date ";
- }
- }
- $result = Database::query($sqlquery);
- $counter = 0;
- if (Database::num_rows($result) > 0) {
- echo '<h4>'.get_lang('UpcomingEvent').'</h4><br />';
- while ($item = Database::fetch_array($result, 'ASSOC')) {
- if ($counter < $number_of_items_to_show) {
- echo api_get_local_time($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
- * @todo check if this function is correct
- */
- 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
- //@todo Why ($week_number - 1) ?
- //$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
- $random_day_in_week = mktime(0, 0, 0, 1, 1, $year) + ($week_number) * (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 (isset($_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
- // we are loading all the calendar items of all the courses for today
- echo "<table class=\"data_table\">";
- // the forward and backwards url
- $course_code = isset($_GET['courseCode']) ? Security::remove_XSS($_GET['courseCode']) : null;
- $backwardsURL = api_get_self()."?coursePath=".urlencode($course_path)."&courseCode=".$course_code."&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=".$course_code."&action=view&view=day&day=".date("j", $nextday)."&month=".date("n", $nextday)."&year=".date("Y", $nextday);
- // The title row containing the day
- echo "<tr>", "<th width=\"10%\"><a href=\"", $backwardsURL, "\">".Display::return_icon('action_prev.png', get_lang('Previous'))."</a></th>", "<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, "\">".Display::return_icon('action_next.png', get_lang('Next'))."</a></th>";
- echo "</tr>";
- // From 0 to 5h
- $class = "class=\"row_even\"";
- echo "<tr $class>";
- echo ("<td valign=\"top\" width=\"75\">0:00 ".get_lang("HourShort")." - 4:30 ".get_lang("HourShort")."</td>");
- echo "<td $class valign=\"top\" colspan=\"2\">";
- for ($i = 0; $i < 10; $i++) {
- if (isset($agendaitems[$i])) {
- if (is_array($agendaitems[$i])) {
- foreach ($agendaitems[$i] as $key => $value) {
- echo $value;
- }
- } else {
- echo $agendaitems[$i];
- }
- }
- }
- echo "</td>";
- echo "</tr>";
- // 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>";
- echo "";
- if ($i % 2 == 0) {
- echo ("<td valign=\"top\" width=\"75\">".(($i) / 2)." ".get_lang("HourShort")." 00</td>");
- } else {
- echo ("<td valign=\"top\" width=\"75\">".((($i) / 2) - (1 / 2))." ".get_lang("HourShort")." 30</td>");
- }
- echo "<td $class valign=\"top\" colspan=\"2\">";
- if (isset($agendaitems[$i])) {
- if (is_array($agendaitems[$i])) {
- foreach ($agendaitems[$i] as $key => $value) {
- echo $value;
- }
- } else {
- echo $agendaitems[$i];
- }
- }
- echo "</td>";
- echo "</tr>";
- }
- echo "</table>";
- }
- /**
- * 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 (!isset($_GET['week'])) {
- $week_number = date("W", $today);
- } else {
- $week_number = intval($_GET['week']);
- }
- // 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
- //Using the same script to calculate the start/end of a week
- $start_end = calculate_start_end_of_week($week_number, $year);
- $timestamp_first_date_of_week = mktime(0, 0, 0, $start_end['start']['month'], $start_end['start']['day'], $start_end['start']['year']);
- $timestamp_last_date_of_week = mktime(0, 0, 0, $start_end['end']['month'], $start_end['end']['day'], $start_end['end']['year']);
- $backwardsURL = api_get_self()."?coursePath=".urlencode($course_path)."&courseCode=".api_get_course_id()."&action=view&view=week&week=".($week_number - 1);
- $forewardsURL = api_get_self()."?coursePath=".urlencode($course_path)."&courseCode=".api_get_course_id()."&action=view&view=week&week=".($week_number + 1);
- echo '<table class="data_table">';
- // The title row containing the the week information (week of the year (startdate of week - enddate of week)
- echo '<tr>';
- echo "<th width=\"10%\"><a href=\"", $backwardsURL, "\">".Display::return_icon('action_prev.png', get_lang('Previous'))."</a></th>";
- 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, "\">".Display::return_icon('action_next.png', get_lang('Next'))."</a></th>", "</tr>";
- // The second row containing the short names of the days of the week
- echo "<tr>";
- //Printing the week days
- // 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 "<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>";
- // 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>";
- // The table cells containing all the entries for that day
- echo "<tr>";
- $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 "<td ".$class.">";
- $data = isset($agendaitems[date('j', $value)]) ? $agendaitems[date('j', $value)] : null;
- echo "<span class=\"agendaitem\">".$data." </span> ";
- echo "</td>";
- $counter++;
- }
- echo "</tr>";
- echo "</table>";
- }
- /**
- * Show the monthcalender of the given month
- */
- function get_day_agendaitems($courses_dbs, $month, $year, $day)
- {
- 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) {
- //echo $array_course_info['db'];
- //databases of the courses
- $TABLEAGENDA = Database :: get_course_table(TABLE_AGENDA);
- $TABLE_ITEMPROPERTY = Database :: get_course_table(TABLE_ITEM_PROPERTY);
- // getting all the groups of the user for the current course
- $group_memberships = GroupManager :: get_group_ids($array_course_info['real_id'], api_get_user_id());
- $course_user_status = CourseManager::get_user_in_course_status(api_get_user_id(), $array_course_info['code']);
- $start_filter = $year."-".$month."-".$day." 00:00:00";
- $start_filter = api_get_utc_datetime($start_filter);
- $end_filter = $year."-".$month."-".$day." 23:59:59";
- $end_filter = api_get_utc_datetime($end_filter);
- // if the user is administrator of that course we show all the agenda items
- if ($course_user_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 start_date>='".$start_filter."' AND start_date<='".$end_filter."'
- 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 "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 start_date>='".$start_filter."' AND start_date<='".$end_filter."'
- AND item_property.tool='".TOOL_CALENDAR_EVENT."'
- AND ( item_property.to_user_id='".api_get_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 start_date>='".$start_filter."' AND start_date<='".$end_filter."'
- AND item_property.tool='".TOOL_CALENDAR_EVENT."'
- AND ( item_property.to_user_id='".api_get_user_id()."' OR item_property.to_group_id='0')
- AND item_property.visibility='1'
- ORDER BY start_date ";
- }
- }
- $result = Database::query($sqlquery);
- 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
- $item['start_date'] = api_get_local_time($item['start_date']);
- $time_minute = api_format_date($item['start_date'], TIME_NO_SEC_FORMAT);
- list ($datepart, $timepart) = explode(" ", $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 = Text::cut($title, 14, true);
- } else {
- $agenda_link = Display::return_icon('course_home.png', ' ', '', ICON_SIZE_SMALL);
- }
- $URL = api_get_path(WEB_CODE_PATH).'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>$time_minute</i> <a href=\"$URL\" title=\"".$array_course_info['title']."\">".$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;
- }
- }
- return $agendaitems;
- }
- /**
- * Return agenda items of the week
- */
- function get_week_agendaitems($courses_dbs, $month, $year, $week = '')
- {
- global $setting_agenda_link;
- $TABLEAGENDA = Database :: get_course_table(TABLE_AGENDA);
- $TABLE_ITEMPROPERTY = Database :: get_course_table(TABLE_ITEM_PROPERTY);
- $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']." 00:00:00";
- $start_filter = api_get_utc_datetime($start_filter);
- $end_filter = $start_end['end']['year']."-".$start_end['end']['month']."-".$start_end['end']['day']." 23:59:59";
- $end_filter = api_get_utc_datetime($end_filter);
- // 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);
- $TABLE_ITEMPROPERTY = Database :: get_course_table(TABLE_ITEM_PROPERTY);
- // getting all the groups of the user for the current course
- $group_memberships = GroupManager :: get_group_ids($array_course_info["real_id"], api_get_user_id());
- $user_course_status = CourseManager::get_user_in_course_status(api_get_user_id(), $array_course_info["code"]);
- // if the user is administrator of that course we show all the agenda items
- if ($user_course_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='".api_get_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='".api_get_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')";
- //var_dump($sqlquery);
- $result = Database::query($sqlquery);
- while ($item = Database::fetch_array($result)) {
- $agendaday_string = api_convert_and_format_date($item['start_date'], "%d", date_default_timezone_get());
- $agendaday = intval($agendaday_string);
- $start_time = api_convert_and_format_date($item['start_date'], TIME_NO_SEC_FORMAT);
- $end_time = api_convert_and_format_date($item['end_date'], DATE_TIME_FORMAT_LONG);
- if ($setting_agenda_link == 'coursecode') {
- $title = $array_course_info['title'];
- $agenda_link = Text::cut($title, 14, true);
- } else {
- $agenda_link = Display::return_icon('course_home.png', ' ', '', ICON_SIZE_SMALL);
- }
- $URL = api_get_path(WEB_CODE_PATH)."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
- $content = "<i>$start_time - $end_time</i> <a href=\"$URL\" title=\"".$array_course_info["title"]."\"> <br />".$agenda_link."</a>";
- $content .= "<div>".$item['title']."</div><br>";
- $items[$agendaday][$item['start_date']] .= $content;
- }
- }
- $agendaitems = array();
- // sorting by hour for every day
- while (list ($agendaday, $tmpitems) = each($items)) {
- sort($tmpitems);
- while (list ($key, $val) = each($tmpitems)) {
- $agendaitems[$agendaday] .= $val;
- }
- }
- 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);
- 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;
- }
- /**
- * (This function is not been use in the code)
- * 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);
- 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);
- 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);
- 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);
- 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 = ''
- ) {
- $user_id = api_get_user_id();
- // database table definitions
- $t_agenda = Database::get_course_table(TABLE_AGENDA);
- $item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
- // some filtering of the input data
- $title = Database::escape_string($title);
- $content = Database::escape_string($content);
- $db_start_date = api_get_utc_datetime($db_start_date);
- $start_date = Database::escape_string($db_start_date);
- if (!empty($db_end_date)) {
- $db_end_date = api_get_utc_datetime($db_end_date);
- }
- $end_date = Database::escape_string($db_end_date);
- $id_session = api_get_session_id();
- $course_id = api_get_course_int_id();
- $group_id = api_get_group_id();
- // 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.c_id = $course_id AND
- item_property.c_id = $course_id AND
- 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);
- $count = Database::num_rows($result);
- if ($count > 0) {
- return false;
- }
- $course_id = api_get_course_int_id();
- $sql = "INSERT INTO ".$t_agenda." (c_id, title,content, start_date, end_date".(!empty($parent_id) ? ',parent_event_id' : '').", session_id)
- VALUES($course_id, '".$title."','".$content."', '".$start_date."','".$end_date."'".(!empty($parent_id) ? ','.((int) $parent_id) : '').", '".$id_session."')";
- $result = Database::query($sql);
- $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
- if (!empty($to)) {
- $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 (isset($send_to['everyone']) && $send_to['everyone']) {
- 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)
- {
- $_course = api_get_course_info();
- $agenda_table_attachment = Database::get_course_table(TABLE_AGENDA_ATTACHMENT);
- $id_attach = intval($id_attach);
- $sql = "DELETE FROM $agenda_table_attachment WHERE id = ".$id_attach;
- $result = Database::query($sql);
- $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)
- {
- $_course = api_get_course_info();
- $agenda_table_attachment = Database::get_course_table(TABLE_AGENDA_ATTACHMENT);
- $last_id = intval($last_id);
- // Storing the attachments
- if (!empty($_FILES['user_upload']['name'])) {
- $upload_ok = FileManager::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 = FileManager::add_ext_on_mime(
- stripslashes($_FILES['user_upload']['name']),
- $_FILES['user_upload']['type']
- );
- // user's file name
- $file_name = $_FILES['user_upload']['name'];
- if (!FileManager::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);
- $course_id = api_get_course_int_id();
- // Storing the attachments if any
- if ($result) {
- $sql = 'INSERT INTO '.$agenda_table_attachment.'(c_id, filename,comment, path,agenda_id,size) '.
- "VALUES ($course_id, '".$safe_file_name."', '".$safe_file_comment."', '".$safe_new_file_name."' , '".$last_id."', '".intval($_FILES['user_upload']['size'])."' )";
- Database::query($sql);
- //$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)
- {
- $_course = api_get_course_info();
- $agenda_table_attachment = Database::get_course_table(TABLE_AGENDA_ATTACHMENT);
- // Storing the attachments
- if (!empty($_FILES['user_upload']['name'])) {
- $upload_ok = FileManager::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 = FileManager::add_ext_on_mime(
- stripslashes($_FILES['user_upload']['name']),
- $_FILES['user_upload']['type']
- );
- // user's file name
- $file_name = $_FILES['user_upload']['name'];
- if (!FileManager::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 ='".intval($_FILES['user_upload']['size'])."'
- WHERE id = '$safe_id_attach'";
- Database::query($sql);
- 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);
- $t_agenda_r = Database::get_course_table(TABLE_AGENDA_REPEAT);
- $course_id = $course_info['real_id'];
- $sql = 'SELECT title, content, start_date as sd, end_date as ed FROM '.$t_agenda.' WHERE c_id = '.$course_id.' AND id ="'.intval($orig_id).'" ';
- $res = Database::query($sql);
- if (Database::num_rows($res) !== 1) {
- return false;
- }
- $row = Database::fetch_array($res);
- $orig_start = api_strtotime(api_get_local_time($row['sd']));
- $orig_end = api_strtotime(api_get_local_time($row['ed']));
- $diff = $orig_end - $orig_start;
- $orig_title = $row['title'];
- $orig_content = $row['content'];
- $now = time();
- $type = Database::escape_string($type);
- $end = intval($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 (c_id, cal_id, cal_type, cal_end) VALUES ($course_id, '$orig_id','$type',$end)";
- $res = Database::query($sql);
- 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)
- {
- $charset = api_get_system_encoding();
- $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));
- $return = $ical->parse();
- //we need to recover: summary, description, dtstart, dtend, organizer, attendee, location (=course name),
- /*
- $ve = $ical->getComponent(VEVENT);
- $ttitle = $ve->getProperty('summary');
- $title = api_convert_encoding($ttitle,$charset,'UTF-8');
- $tdesc = $ve->getProperty('description');
- $desc = api_convert_encoding($tdesc,$charset,'UTF-8');
- $start_date = $ve->getProperty('dtstart');
- $start_date_string = $start_date['year'].'-'.$start_date['month'].'-'.$start_date['day'].' '.$start_date['hour'].':'.$start_date['min'].':'.$start_date['sec'];
- $ts = $ve->getProperty('dtend');
- if ($ts) {
- $end_date_string = $ts['year'].'-'.$ts['month'].'-'.$ts['day'].' '.$ts['hour'].':'.$ts['min'].':'.$ts['sec'];
- } else {
- //Check duration if dtend does not exist
- $duration = $ve->getProperty('duration');
- if ($duration) {
- $duration = $ve->getProperty('duration');
- $duration_string = $duration['year'].'-'.$duration['month'].'-'.$duration['day'].' '.$duration['hour'].':'.$duration['min'].':'.$duration['sec'];
- $start_date_tms = mktime(intval($start_date['hour']), intval($start_date['min']), intval($start_date['sec']), intval($start_date['month']), intval($start_date['day']), intval($start_date['year']));
- //$start_date_tms = mktime(($start_date['hour']), ($start_date['min']), ($start_date['sec']), ($start_date['month']), ($start_date['day']), ($start_date['year']));
- //echo date('d-m-Y - h:i:s', $start_date_tms);
- $end_date_string = mktime(intval($start_date['hour']) +$duration['hour'], intval($start_date['min']) + $duration['min'], intval($start_date['sec']) + $duration['sec'], intval($start_date['month']) + $duration['month'], intval($start_date['day'])+$duration['day'], intval($start_date['year']) + $duration['year']);
- $end_date_string = date('Y-m-d H:i:s', $end_date_string);
- //echo date('d-m-Y - h:i:s', $end_date_string);
- }
- }
- //echo $start_date.' - '.$end_date;
- $organizer = $ve->getProperty('organizer');
- $attendee = $ve->getProperty('attendee');
- $course_name = $ve->getProperty('location');
- //insert the event in our database
- //var_dump($title,$desc,$start_date,$end_date);
- $id = agenda_add_item($course_info,$title,$desc,$start_date_string,$end_date_string,$_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']);
- } */
- $eventcount = 0;
- $message = array();
- $agenda_obj = new Agenda();
- while (true) {
- //we need to recover: summary, description, dtstart, dtend, organizer, attendee, location (=course name)
- $ve = $ical->getComponent('VEVENT', $eventcount);
- if (!$ve) {
- break;
- }
- $ttitle = $ve->getProperty('summary');
- $title = api_convert_encoding($ttitle, $charset, 'UTF-8');
- $tdesc = $ve->getProperty('description');
- $desc = api_convert_encoding($tdesc, $charset, 'UTF-8');
- $start_date = $ve->getProperty('dtstart', false, true);
- if (isset($start_date['params']['VALUE'])) {
- $start_date_value = $start_date['value'];
- if ($start_date['params']['VALUE'] == 'DATE') {
- $start_date_string = $start_date_value['year'].'-'.$start_date_value['month'].'-'.$start_date_value['day'].'';
- } else {
- $start_date_string = $start_date_value['year'].'-'.$start_date_value['month'].'-'.$start_date_value['day'].' '.$start_date_value['hour'].':'.$start_date_value['min'].':'.$start_date_value['sec'];
- }
- } else {
- continue;
- }
- $ts = $ve->getProperty('dtend');
- if ($ts) {
- $end_date = $ve->getProperty('dtend', false, true);
- if (isset($end_date['params']['VALUE'])) {
- $end_date_value = $end_date['value'];
- if ($end_date['params']['VALUE'] == 'DATE') {
- $end_date_string = $end_date_value['year'].'-'.$end_date_value['month'].'-'.$end_date_value['day'].'';
- } else {
- $end_date_string = $end_date_value['year'].'-'.$end_date_value['month'].'-'.$end_date_value['day'].' '.$end_date_value['hour'].':'.$end_date_value['min'].':'.$end_date_value['sec'];
- }
- } else {
- //Default behaviour
- $end_date_string = $ts['year'].'-'.$ts['month'].'-'.$ts['day'].' '.$ts['hour'].':'.$ts['min'].':'.$ts['sec'];
- }
- } else {
- //Check duration if dtend does not exist
- $duration = $ve->getProperty('duration');
- if ($duration) {
- $duration = $ve->getProperty('duration');
- $duration_string = $duration['year'].'-'.$duration['month'].'-'.$duration['day'].' '.$duration['hour'].':'.$duration['min'].':'.$duration['sec'];
- $start_date_tms = mktime(intval($start_date['hour']), intval($start_date['min']), intval($start_date['sec']), intval($start_date['month']), intval($start_date['day']), intval($start_date['year']));
- //$start_date_tms = mktime(($start_date['hour']), ($start_date['min']), ($start_date['sec']), ($start_date['month']), ($start_date['day']), ($start_date['year']));
- //echo date('d-m-Y - h:i:s', $start_date_tms);
- $end_date_string = mktime(intval($start_date['hour']) + $duration['hour'], intval($start_date['min']) + $duration['min'], intval($start_date['sec']) + $duration['sec'], intval($start_date['month']) + $duration['month'], intval($start_date['day']) + $duration['day'], intval($start_date['year']) + $duration['year']);
- $end_date_string = api_get_utc_datetime($end_date_string);
- //echo date('d-m-Y - h:i:s', $end_date_string);
- }
- }
- //echo $start_date.' - '.$end_date;
- $organizer = $ve->getProperty('organizer');
- $attendee = $ve->getProperty('attendee');
- $course_name = $ve->getProperty('location');
- //insert the event in our database
- $agenda_obj->type = 'course';
- $all_day = 'false';
- if ($start_date_string == $end_date_string) {
- $all_day = 'true';
- }
- $date = new DateTime($start_date_string);
- $date->add(new DateInterval('P1D'));
- if ($start_date_string == $date->format('Y-m-d h:i:s')) {
- $all_day = 'true';
- }
- $id = $agenda_obj->add_event(
- $start_date_string,
- $end_date_string,
- $all_day,
- null,
- $title,
- $desc,
- array('everyone')
- );
- $message[] = " $title - ".$start_date_string." - ".$end_date_string;
- $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, $attendee);
- }
- //TODO: deal with count
- if (!empty($repeat['COUNT'])) {
- $count = $repeat['COUNT'];
- $res = agenda_add_repeat_item($course_info, $id, $freq, $count, $attendee);
- }
- }
- $eventcount++;
- }
- if (!empty($message)) {
- $message = implode('<br /> ', $message);
- }
- return $message;
- }
- /**
- * 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);
- $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
- $current_access_url_id = api_get_current_access_url_id();
- 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."' AND access_url_id = $current_access_url_id 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";
- $start_filter = api_get_utc_datetime($start_filter);
- $end_filter = $end_year."-".$end_month."-".$end_day." 23:59:59";
- $end_filter = api_get_utc_datetime($end_filter);
- $sql = " SELECT * FROM ".$tbl_global_agenda." WHERE start_date>='".$start_filter."' AND start_date<='".$end_filter."' AND access_url_id = $current_access_url_id ";
- }
- // 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";
- $start_filter = api_get_utc_datetime($start_filter);
- $end_filter = $year."-".$month."-".$day." 23:59:59";
- $end_filter = api_get_utc_datetime($end_filter);
- $sql = " SELECT * FROM ".$tbl_global_agenda." WHERE start_date>='".$start_filter."' AND start_date<='".$end_filter."' AND access_url_id = $current_access_url_id";
- }
- $result = Database::query($sql);
- while ($item = Database::fetch_array($result)) {
- if ($item['start_date'] != '0000-00-00 00:00:00') {
- $item['start_date'] = api_get_local_time($item['start_date']);
- $item['start_date_tms'] = api_strtotime($item['start_date']);
- }
- if ($item['end_date'] != '0000-00-00 00:00:00') {
- $item['end_date'] = api_get_local_time($item['end_date']);
- }
- // 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 ($type == 'month_view') {
- $item['calendar_type'] = 'global';
- $agendaitems[$day][] = $item;
- continue;
- }
- $start_time = api_format_date($item['start_date'], TIME_NO_SEC_FORMAT);
- $end_time = '';
- if ($item['end_date'] != '0000-00-00 00:00:00') {
- $end_time = ' - '.api_format_date($item['end_date'], DATE_TIME_FORMAT_LONG);
- }
- // if the student has specified a course we a add a link to that course
- if ($item['course'] <> "") {
- $url = api_get_path(WEB_CODE_PATH)."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] .= "<i>$start_time $end_time</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;
- }
- if (!is_array($agendaitems[$halfhour])) {
- $content = $agendaitems[$halfhour];
- }
- $agendaitems[$halfhour] = $content."<div><i>$hour:$minute</i> <b>".get_lang(
- 'GlobalEvent'
- ).": </b>".$item['title']."</div>";
- }
- }
- return $agendaitems;
- }
- function display_ical_import_form()
- {
- $form = new FormValidator('frm_import_ical', 'post', api_get_self().'?action='.Security::remove_XSS($_GET['action']), array('enctype' => 'multipart/form-data'));
- $form->addElement('header', get_lang('ICalFileImport'));
- $form->addElement('file', 'ical_import', get_lang('ICalFileImport'));
- $form->addRule('ical_import', get_lang('ThisFieldIsRequired'), 'required');
- $form->addElement('button', 'ical_submit', get_lang('Import'));
- $form->display();
- }
|