diff -r 000000000000 -r 03b0d1493584 web/wp-content/plugins/gigs-calendar/gigs-classes.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/wp-content/plugins/gigs-calendar/gigs-classes.php Wed Dec 23 17:55:33 2009 +0000 @@ -0,0 +1,794 @@ +prefix)); +define('TABLE_VENUES', GIGS_DB_PREFIX . 'gigs_venue'); +define('TABLE_GIGS', GIGS_DB_PREFIX . 'gigs_gig'); +define('TABLE_PERFORMANCES', GIGS_DB_PREFIX . 'gigs_performance'); +define('TABLE_TOURS', GIGS_DB_PREFIX . 'gigs_tour'); + +class dtcGigs { + + function generateSlug($x) { + $x = strtolower($x); + $x = str_replace(' ', '-', $x); + $x = preg_replace('#[^a-z\-0-9]#', '', $x); + return $x; + } + + function escapeForInput($x) { + if ( '0000-00-00' == $x ) { + $x = ''; + } + echo htmlspecialchars($x); + } + + function dateFormat($date, $type = 'short') { + if ( is_null($date) || $date == '0000-00-00' ) return null; + $options = get_option('gigs-calendar'); + if ( isset($options['date'][$type]) ) { + return mysql2date($options['date'][$type], $date); + } else { + return mysql2date($type, $date); + } + } + + function selectFields($fields, $g) { + $options = get_option('gigs-calendar'); + + $result = ''; + foreach ( $options['gigs-table-show'] as $f ) { + if ( isset($fields[$f]) ) { + $tmp = $fields[$f]; + if ( $f == 'venue' && $options['list-venue-link'] && !empty($g->venueLink) ) { + $tmp = preg_replace("~\{(.*?)\}~", '\1', $tmp); + } elseif ( $f == $options['gig-link-field'] ) { + $tmp = preg_replace("~\{(.*?)\}~", '\1', $tmp); + } else { + $tmp = preg_replace("~\{(.*?)\}~", '\1', $tmp); + } + + $result .= $tmp; + } + } + + return $result; + } + + function timeFormat($time, $format = false) { + $options = get_option('gigs-calendar'); + if ( is_null($time) ) { + return $options['tbd-text']; + } + if ( $options['time-12h'] || $format === "12h" ) { + return mysql2date("g:ia", '2008-01-01 ' . $time); + } else { + return mysql2date("H:i", '2000-01-01 ' . $time); + } + } + + function mapLink($gig) { + global $options; + if ( empty($gig->customMap) ) { + $a = array(); + + if ( empty($gig->address) ) + $a[] = $gig->name . ' near:'; + else {} + $a[] = str_replace("\n", ", ", $gig->address); + if ( !empty($gig->city) ) $a[] = $gig->city; + if ( !empty($gig->state) ) $a[] = $gig->state; + if ( !empty($gig->country) ) $a[] = $gig->country; + if ( !empty($gig->postalCode) ) $a[] = $gig->postalCode; + return 'http://maps.google.com/?q=' . urlencode(str_replace('near:,', 'near:', implode(', ', $a))); + } else { + if ( preg_match("/^https?:\/\//", $gig->customMap) ) { + return $gig->customMap; + } else { + return 'http://maps.google.com/?q=' . urlencode($gig->customMap); + } + } + } + + function getAttribution() { + $options = get_option('gigs-calendar'); + ?> +
+ + Powered by Blogs for Bands + + + Silk icons by Mark James + +
+ $field ) { + if ( isset($data[$field['name']]) ) { + $value = array_pop($data[$field['name']]); + if ( empty($data[$field['name']]) ) unset($data[$field['name']]); + } else { + $value = $field['default']; + } + ?> + + + + + + + + + + + + + + + + + + $oValue ) : ?> + /> + +
+ + + + $oValue ) : ?> + /> + + +
+ + + + + id) ) { + $gig = $gig->id; + } elseif ( is_array($gig) && isset($gig['id']) ) { + $gig = $gig['id']; + } + + $g = new gig(); + if ( !$g->get($gig) ) { + return false; + } + + $classes = array( + 'gig', + mysql2date('\yY', $g->date), + mysql2date('\mm', $g->date), + ( $g->date >= date('Y-m-d') ? 'upcoming' : 'archive' ), + ); + + $classes = array_merge($classes, $g->getTags(true, 'gc-')); + + return implode(' ', apply_filters('gigCal_gigs_css_classes', $classes, $g)); + } +} + +class dtc_gigs_baseAR { + var $wpdb, $_rows, $_row, $_new = true, $_table, $_count; + + function dtc_gigs_baseAR($id = null){ + global $wpdb; + $this->wpdb = $wpdb; + if ( $id !== null ) { + $this->get($id); + } + } + + function fetch() { + if ( count($this->_rows) ) { + $this->_row = each($this->_rows); + if ( $this->_row ) { + $this->load(); + return true; + } else { + return false; + } + } else { + return false; + } + } + + function generate_slug() { + if ( isset($this->slug) ) { + $first = true; + $name = $this->_name; + do { + if ( $first ) { + $this->slug = dtcGigs::generateSlug($this->$name); + $first = false; + } else { + ereg('[0-9]*$', $this->slug, $match); + $match = ((int) $match[0]) + 1; + if ( 1 == $match ) $match++; + $this->slug = preg_replace('/[0-9]*$/', '', $this->slug); + $this->slug .= $match; + } + + } while ( $this->wpdb->get_var('SELECT COUNT(*) FROM `' . $this->_table . '` WHERE slug = "' . $this->slug . '"') ); + } + } + + + function get($id) { + $this->search('`id` = ' . (int) $id); + return $this->fetch(); + } + + function getRow() { + $row = array(); + foreach ( $this->_fields as $f ) { + $row[$f] = $this->$f; + } + return $row; + } + + function getTags($slugs = false, $prefix = '') { + if ( function_exists('wp_get_post_tags') ) { + $tags = wp_get_post_tags($this->postID); + foreach ( $tags as $key => $tag ) { + $tags[$key] = $prefix . ($slugs ? $tag->slug : $tag->name); + } + return $tags; + } else { + return array(); + } + } + + function getCustom() { + if ( !empty($this->postID) ) { + return get_post_custom($this->postID); + } + } + + function setTags($tags) { + if ( function_exists('wp_set_post_tags') ) + wp_set_post_tags($this->postID, $tags, false); + } + + + + + + function load() { + foreach ( $this->_fields as $f ) { + if ( is_null($this->_row['value']->$f) ) { + $this->$f = null; + } else { + $this->$f = stripslashes($this->_row['value']->$f); + } + } + } + + function search($where = null, $order = null) { + $this->_new = false; + $this->_rows = $this->wpdb->get_results('SELECT * FROM `' . $this->_table . '` ' . ($where !== null ? 'WHERE ' . $where : '') . ($order !== null ? ' ORDER BY ' . $order : '')); + $this->_count = count($this->_rows); + return count($this->_rows); + } + + function save($get_after = true) { + $first = true; + $name = $this->_name; + $this->generate_slug(); + if ( $this->_new ) { + $fields = $this->_fields; + $values = array(); + unset($fields[0]); + + $this->pre_insert(); + + foreach ( $fields as $f ) { + if ( is_null($this->$f) ) { + $values[$f] = 'null'; + } else { + $values[$f] = '"' . $this->wpdb->escape(stripslashes($this->$f)) . '"'; + } + } + + if ( !$this->wpdb->query('INSERT INTO `' . $this->_table . '` (`' . implode('`, `', $fields) . '`) VALUES (' . implode(', ', $values) . ')') ) { + return false; + } + $this->id = $this->wpdb->insert_id; + + $this->post_insert(); + if ( $get_after ) + $this->get((int) $this->id); + + return true; + } else { + $fields = $this->_fields; + $values = array(); + unset($fields[0]); + + $this->pre_update(); + + foreach ( $fields as $f ) { + if ( is_null($this->$f) ) { + $values[$f] = '`' . $f . '` = null'; + } else { + $values[$f] = '`' . $f . '` = "' . $this->wpdb->escape(stripslashes($this->$f)) . '"'; + } + } + + $result = (bool) $this->wpdb->query('UPDATE `' . $this->_table . '` SET ' . implode(', ', $values) . ' WHERE `id` = ' . (int) $this->id); + + if ( $result ) $this->post_update(); + + if ( $get_after ) + $this->get((int) $this->id); + + return $result; + } + } + + function pre_insert(){} + function post_insert(){} + function pre_update(){} + function post_update(){} + function extraJSON() {return array();} + + function delete() { + if ( !empty($this->id) ) { + return (bool) $this->wpdb->query('DELETE FROM `' . $this->_table . '` WHERE `id` = ' . (int) $this->id); + } + } + + function toJSON($single = true) { + if ( $single ) { + $fields = array(); + if ( function_exists("json_encode") ) { + foreach ( $this->_fields as $f ) { + $fields[$f] = $this->$f; + } + + $extra = $this->extraJSON(); + $fields = array_merge($fields, $extra); + return json_encode($fields); + } else { + foreach ( $this->_fields as $f ) { + $fields[] = '"' . $f . '":"' . str_replace("\n", '\n', addslashes($this->$f)) . '"'; + } + + $extra = $this->extraJSON(); + $fields = array_merge($fields, $extra); + + return '{' . implode(', ', $fields) . '}'; + } + } + } + + function getError() { + return $this->wpdb->last_error; + } +} + +class venue extends dtc_gigs_baseAR { + var $_table = TABLE_VENUES, $_name = 'name'; + var $id, $name, $address, $city, $state, $country, $postalCode, $contact, + $phone, $email, $link, $notes, $private = 0, $apiID = 0, $deleted = 0, $customMap; + var $_fields = array( + 'id', + 'name', + 'address', + 'city', + 'state', + 'country', + 'postalCode', + 'contact', + 'phone', + 'email', + 'link', + 'notes', + 'private', + 'apiID', + 'deleted', + 'customMap', + ); + + function delete($forReal = false) { + if ( $forReal ) { + return parent::delete(); + } else { + $this->deleted = 1; + return $this->save(); + + } + } + + function getAddress($oneLine = false) { + $a = array(); + $city = ""; + if ( $oneLine ) { + if ( !empty($this->address) ) $a[] = str_replace("\n", ', ', $this->address); + if ( !empty($this->city) ) $a[] = $this->city; + if ( !empty($this->state) ) $a[] = $this->state; + if ( !empty($this->postalCode) ) $a[] = $this->postalCode; + if ( !empty($this->country) ) $a[] = $this->country; + return implode(', ', $a); + } else { + if ( !empty($this->address) ) $a[] = $this->address; + if ( !empty($this->city) ) $temp .= $this->city; + if ( !empty($this->state) ) $temp .= (!empty($temp) ? ', ' : '' ) . $this->state; + if ( !empty($this->country) ) $temp .= (!empty($temp) ? ', ' : '' ) . $this->country; + if ( !empty($this->postalCode) ) $temp .= (!empty($temp) ? ' ' : '' ) . $this->postalCode; + if ( !empty($temp) ) $a[] = $temp; + return implode("\n", $a); + } + } + + function getCity() { + $c = array(); + if ( !empty($this->city) ) $c[] = $this->city; + if ( !empty($this->state) ) $c[] = $this->state; + //if ( !empty($this->country) ) $c[] = $this->country; + return implode(', ', $c); + } + + function getMapLink() { + global $options; + if ( empty($this->customMap) ) { + $a = array(); + + if ( empty($this->address) ) + $a[] = $this->name . ' near:'; + else {} + $a[] = str_replace("\n", ", ", $this->address); + if ( !empty($this->city) ) $a[] = $this->city; + if ( !empty($this->state) ) $a[] = $this->state; + if ( !empty($this->country) ) $a[] = $this->country; + if ( !empty($this->postalCode) ) $a[] = $this->postalCode; + return 'http://maps.google.com/?q=' . urlencode(str_replace('near:,', 'near:', implode(', ', $a))); + } else { + if ( preg_match("/^https?:\/\//", $this->customMap) ) { + return $this->customMap; + } else { + return 'http://maps.google.com/?q=' . urlencode($this->customMap); + } + } + } + + function extraJSON() { + if ( function_exists("json_encode") ) { + $fields['mapLink'] = $this->getMapLink(); + } else { + $fields[] = '"mapLink":"' . str_replace("\n", '\n', addslashes($this->getMapLink())) . '"'; + } + return $fields; + } +} + +class gig extends dtc_gigs_baseAR { + var $_table = TABLE_GIGS, $_name = 'id'; + var $id, $venueID = 0, $date, $notes, $postID = 0, $eventName, $tour_id = 0; + var $_fields = array( + 'id', + 'venueID', + 'date', + 'notes', + 'postID', + 'eventName', + 'tour_id', + ); + + function delete() { + $p = $this->getPerformances(); + while ( $p->fetch() ) { + $p->delete(); + } + wp_delete_post($this->postID); + return parent::delete(); + } + + function getByPostID($postID) { + $this->search("postID = " . (int) $postID); + return $this->fetch(); + } + + function getPermalink() { + $post = get_permalink($this->postID); + return $post; + } + + function getPerformances() { + $p = new performance(); + if ( $this->id ) { + $p->search("`gigID` = " . (int) $this->id, "`time`"); + } + return $p; + } + + function getVenue() { + $v = new venue(); + if ( $this->venueID ) { + $v->get($this->venueID); + } + return $v; + } + + function pre_insert() { + global $options, $wpdb; + $user = wp_get_current_user(); + $v = $this->getVenue(); + $p = $this->getPerformances(); + $p->fetch(); + + if ( $this->tour_id == -1 ) $this->tour_id = null; + + $title = array(); + foreach ( $options['gig-title-show'] as $f ) { + switch ( $f ) { + case 'city' : + $title[] = $v->getCity(); + break; + case 'eventName' : + $title[] = $this->eventName; + break; + case 'venue' : + $title[] = $v->name; + break; + case 'date' : + $title[] = dtcGigs::dateFormat($this->date); + break; + case 'country' : + $title[] = $v->country; + break; + } + } + + foreach ( $title as $key => $value ) { + if ( empty($value) ) unset($title[$key]); + } + + $post_data = array( + 'post_author' => $user->ID, + 'post_title' => $wpdb->escape(implode(' - ', $title)), + 'post_status' => 'publish', + 'post_type' => 'post', + 'post_category' => array($options['category']), + 'post_content' => '', + ); + + if ( $options['post-filtering'] ) { + $post_data = array_merge($post_data, array( + 'post_date' => $wpdb->escape($this->date . ' ' . $p->time), + 'post_modified' => $wpdb->escape($this->date . ' ' . $p->time), + 'post_date_gmt' => date('Y-m-d H:i:s', strtotime($this->date . ' ' . $p->time) - (60 * 60 * get_option('gmt_offset'))), + 'post_modified_gmt' => date('Y-m-d H:i:s', strtotime($this->date . ' ' . $p->time) - (60 * 60 * get_option('gmt_offset'))), + )); + } + $id = wp_insert_post($post_data); + $this->postID = $id; + } + + function pre_update() { + global $options, $wpdb, $wp_version; + $v = $this->getVenue(); + $p = $this->getPerformances(); + $p->fetch(); + + if ( $this->tour_id == -1 ) $this->tour_id = null; + + $title = array(); + foreach ( $options['gig-title-show'] as $f ) { + switch ( $f ) { + case 'city' : + $title[] = $v->getCity(); + break; + case 'eventName' : + $title[] = $this->eventName; + break; + case 'venue' : + $title[] = $v->name; + break; + case 'date' : + $title[] = dtcGigs::dateFormat($this->date); + break; + case 'country' : + $title[] = $v->country; + break; + } + } + + foreach ( $title as $key => $value ) { + if ( empty($value) ) unset($title[$key]); + } + + + $post = get_post($this->postID); + + if ( $options['post-filtering'] ) { + $post->post_date = $wpdb->escape($this->date . ' ' . $p->time); + $post->post_modified = $wpdb->escape($this->date . ' ' . $p->time); + $post->post_date_gmt = date('Y-m-d H:i:s', strtotime($this->date . ' ' . $p->time) - (60 * 60 * get_option('gmt_offset'))); + $post->post_modified_gmt = date('Y-m-d H:i:s', strtotime($this->date . ' ' . $p->time) - (60 * 60 * get_option('gmt_offset'))); + } + + $post->post_title = $wpdb->escape(implode(' - ', $title)); + $post->post_name = ""; + $post->post_status = "publish"; // Do this to trick WordPress into resetting the GUID. + $post->post_category = array($options['category']); + + wp_update_post($post); + if ( (float) $wp_version < 2.3 ) { // Hack to make it compatible with WP 2.2 + global $wpdb; + $wpdb->query('UPDATE ' . $wpdb->prefix . 'posts SET post_status = "publish" WHERE ID = ' . (int) $this->postID); + } + } + + function post_insert() { + global $wp_version; + if ( (float) $wp_version < 2.3 ) { // Hack to make it compatible with WP 2.2 + global $wpdb; + $wpdb->query('UPDATE ' . $wpdb->prefix . 'posts SET post_status = "publish" WHERE ID = ' . (int) $this->postID); + } else { + $post = get_post($this->postID); + $post->post_status = "publish"; + wp_update_post($post); + } + } + + function extraJSON() { + $post = get_post($this->postID); + $v = $this->getVenue(); + $p = $this->getPerformances(); + if ( function_exists("json_encode") ) { + $fields['permalink'] = $this->getPermalink(); + $fields['venue'] = $v->getRow(); + while ( $p->fetch() ) { + $fields['performances'][] = $p->getRow(); + } + } else { + $fields[] = '"permalink":"' . str_replace("\n", '\n', addslashes($this->getPermalink())) . '"'; + $ps = array(); + $fields[] = '"venue":' . $v->toJSON(); + while ( $p && $p->fetch() ) { + $ps[] = $p->toJSON(); + } + $fields[] = '"performances":[' . implode(', ', $ps) . ']'; + } + return $fields; + } +} + +class performance extends dtc_gigs_baseAR { + var $_table = TABLE_PERFORMANCES, $_name = 'id'; + var $id, $gigID = 0, $time = '20:00', $link, $shortNotes, $ages; + + var $_fields = array( + 'id', + 'gigID', + 'time', + 'link', + 'shortNotes', + 'ages', + ); +} + +class tour extends dtc_gigs_baseAR { + var $_table = TABLE_TOURS, $_name = 'id'; + var $id, $name, $notes, $pos = 0; + var $_fields = array( + 'id', + 'name', + 'notes', + 'pos', + ); + + function post_insert() { + $max = $this->wpdb->get_var('SELECT MAX(`pos`) FROM `' . $this->_table . '`') + 1; + $this->wpdb->query('UPDATE `' . $this->_table . '` SET `pos` = ' . $max . ' WHERE `id` = ' . (int) $this->id); + } + + function delete() { + $g = $this->getGigs(); + while ( $g->fetch() ) { + $g->tour_id = null; + $g->save(); + } + return parent::delete(); + } + + function sortTours($type = null) { + $options = get_option('gigs-calendar'); + $type = is_null($type) ? $options['tours-sort'] : $type; + switch ($type) { + case 'date' : + return $this->wpdb->get_col(' + SELECT DISTINCT + t.id + FROM + ' . TABLE_TOURS . ' t + LEFT JOIN + ' . TABLE_GIGS . ' g + ON + t.`id` = g.`tour_id` + WHERE + `date` is null OR `date` >= CURDATE() + ORDER BY + g.`date`, `name` + '); + break; + case 'alpha' : + return $this->wpdb->get_col(' + SELECT DISTINCT + t.id + FROM + ' . TABLE_TOURS . ' t + ORDER BY + `name` + '); + break; + } + } + + function getGigs($slice = 'all') { + $g = new gig(); + if ( $slice == 'past' ) { + $g->search('`date` <= CURDATE() AND `tour_id` = ' . (int) $this->id, '`date`'); + } elseif ( $slice == 'future' ) { + $g->search('`date` >= CURDATE() AND `tour_id` = ' . (int) $this->id, '`date`'); + } else { + $g->search('`tour_id` = ' . (int) $this->id, '`date`'); + } + return $g; + } + + function extraJSON(){ + $fields = array(); + $g = $this->getGigs(); + $gs = array(); + if ( function_exists("json_encode") ) { + while ( $g->fetch() ) { + $gs[] = $g->getRow(); + } + $fields['gigs'] = $gs; + } else { + while ( $g->fetch() ) { + $gs[] = $g->toJSON(); + } + $fields[] = '"gigs":[' . implode(',', $gs) . ']'; + } + return $fields; + } +} + +?>