Exemplo n.º 1
0
 /**
  * Render view.
  *
  * @return  string
  */
 public function content()
 {
     ob_start();
     $foursquare = $this->venue->foursquare();
     if (!$foursquare) {
         echo new View_Alert(__('This venue has not been linked to Foursquare yet.'), null, View_Alert::INFO);
     } else {
         // Homepage
         echo HTML::anchor(Arr::path($foursquare, 'short_url'), HTML::image(Arr::path($foursquare, 'primarycategory.iconurl'), array('alt' => HTML::chars(Arr::path($foursquare, 'primarycategory.nodename')), 'title' => HTML::chars(Arr::path($foursquare, 'primarycategory.nodename')))) . ' ' . HTML::chars(Arr::path($foursquare, 'primarycategory.nodename'))), '<br />';
         // Mayor
         if ($mayor = Arr::path($foursquare, 'stats.mayor.user')) {
             echo __('Mayor: :mayor, :city', array(':mayor' => HTML::anchor('http://foursquare.com/user/' . Arr::get($mayor, 'id'), HTML::chars(Arr::get($mayor, 'firstname')) . ' ' . HTML::chars(Arr::get($mayor, 'lastname'))), ':city' => HTML::chars($mayor['homecity']))), '<br />';
         }
         // Checkins
         echo __('Check-ins: :checkins', array(':checkins' => '<var>' . Arr::path($foursquare, 'stats.checkins') . '</var>')), '<br />';
         // Here now
         echo __('Here now: :herenow', array(':herenow' => '<var>' . Arr::path($foursquare, 'stats.herenow') . '</var>')), '<br />';
         // Tips
         if ($tips = Arr::path($foursquare, 'tips')) {
             echo '<h5>', __('Tips (:tips)', array(':tips' => '<var>' . count($tips) . '</var>')), '</h5><dl>';
             foreach (array_slice($tips, 0, 5) as $tip) {
                 echo '<dt>', HTML::anchor('http://foursquare.com/user/' . Arr::path($tip, 'user.id'), HTML::chars(Arr::path($tip, 'user.firstname')) . ' ' . HTML::chars(Arr::path($tip, 'user.lastname'))), ', ', HTML::chars(Arr::path($tip, 'user.homecity')), ':</dt>';
                 echo '<dd>', Text::auto_p(HTML::chars(Arr::path($tip, 'text'))), '</dd>';
             }
             echo '</dl>';
         }
     }
     // Admin controls
     if (Permission::has($this->venue, Model_Venue::PERMISSION_UPDATE)) {
         echo HTML::anchor('#map', __('Link to Foursquare'), array('class' => 'action', 'id' => 'link-foursquare'));
         echo $this->form();
     }
     return ob_get_clean();
 }
Exemplo n.º 2
0
 public static function createVenue($system_venue_id, $venue, $region_id = false)
 {
     $BaseVenue = new \Model_Venue();
     $BaseVenue->id = $system_venue_id;
     $BaseVenue->name = $venue->name;
     $BaseVenue->lat = $venue->location->lat;
     $BaseVenue->lng = $venue->location->lng;
     $BaseVenue->street = isset($venue->location->address) ? $venue->location->address : '-';
     $BaseVenue->postalCode = isset($venue->location->postalCode) ? $venue->location->postalCode : 0;
     $BaseVenue->city = isset($venue->location->city) ? $venue->location->city : '-';
     $BaseVenue->state = isset($venue->location->state) ? $venue->location->state : '-';
     $BaseVenue->cc = $venue->location->cc;
     $BaseVenue->region_id = $region_id;
     $BaseVenue->save();
 }
Exemplo n.º 3
0
Arquivo: venues.php Projeto: anqh/anqh
 /**
  * Get anchor to newsfeed item target.
  *
  * @static
  * @param   Model_NewsfeedItem  $item
  * @return  string
  */
 public static function get_link(Model_NewsfeedItem $item)
 {
     $text = '';
     switch ($item->type) {
         case self::TYPE_VENUE:
         case self::TYPE_VENUE_EDIT:
             $venue = Model_Venue::factory($item->data['venue_id']);
             if ($venue->loaded()) {
                 $text = HTML::anchor(Route::model($venue), '<i class="fa fa-map-marker"></i> ' . HTML::chars($venue->name), array('class' => 'venue'));
             }
             break;
     }
     return $text;
 }
Exemplo n.º 4
0
 public function get_venues()
 {
     $text = \Input::get('query');
     if (!$text) {
         return $this->response(array());
     }
     $result = \DB::select()->from('venue')->join('roles', 'LEFT')->on('roles.id', '=', 'users.role_id');
     $Results = \Model_Venue::query()->where('region_id', 1)->limit(100)->get();
     $response = array();
     foreach ($Results as $Result) {
         $response[] = $Result->name;
     }
     return $this->response($response);
 }
Exemplo n.º 5
0
 /**
  * Get newsfeed item as HTML
  *
  * @static
  * @param   Model_NewsfeedItem  $item
  * @return  string
  */
 public static function get(Model_NewsFeedItem $item)
 {
     $text = '';
     switch ($item->type) {
         case self::TYPE_VENUE:
             $venue = Model_Venue::factory($item->data['venue_id']);
             if ($venue->loaded()) {
                 $text = __('added new venue<br />:venue', array(':venue' => HTML::anchor(Route::model($venue), '<i class="icon-map-marker icon-white"></i> ' . HTML::chars($venue->name), array('class' => 'venue'))));
             }
             break;
         case self::TYPE_VENUE_EDIT:
             $venue = Model_Venue::factory($item->data['venue_id']);
             if ($venue->loaded()) {
                 $text = __('updated venue<br />:venue', array(':venue' => HTML::anchor(Route::model($venue), '<i class="icon-map-marker icon-white"></i> ' . HTML::chars($venue->name), array('class' => 'venue'))));
             }
             break;
     }
     return $text;
 }
Exemplo n.º 6
0
    /**
     * Render view.
     *
     * @return  string
     */
    public function content()
    {
        ob_start();
        echo Form::open();
        if ($this->venue_duplicate) {
            // Confirm
            $venue = new View_Venue_Info($this->venue);
            $duplicate = new View_Venue_Info($this->venue_duplicate);
            ?>

<div class="col-sm-3">

	<h3><?php 
            echo HTML::anchor(Route::model($this->venue_duplicate), HTML::chars($this->venue_duplicate->name));
            ?>
</h3>
	#<?php 
            echo $this->venue_duplicate->id;
            ?>

	<?php 
            echo $duplicate->content();
            ?>

</div>

<div class="col-sm-1">

	<h3><?php 
            echo __('to');
            ?>
</h3>

</div>

<div class="col-sm-3">

	<h3><?php 
            echo HTML::anchor(Route::model($this->venue), HTML::chars($this->venue->name));
            ?>
</h3>
	#<?php 
            echo $this->venue->id;
            ?>

	<?php 
            echo $venue->content();
            ?>

</div>

<div class="col-sm-1">

	<?php 
            echo HTML::anchor(Route::model($this->venue, 'combine') . '/' . $this->venue_duplicate->id . '?' . Security::csrf_query(), __('Merge'), array('class' => 'btn btn-primary'));
            ?>

</div>

<?php 
        } else {
            // Select duplicate
            echo Form::input_wrap('venue', null, null, __('Combine to'));
            ?>

<script>
	head.ready('anqh', function() {

		var venues = <?php 
            echo json_encode(Model_Venue::factory()->find_all_autocomplete($this->venue->id));
            ?>
;
		$('input[name=venue]').autocompleteVenue({
			source: venues,
			action: function(event, ui) {
				window.location = window.location + '/' + ui.item.id;
			}
		});

	});
</script>

<?php 
        }
        echo Form::close();
        return ob_get_clean();
    }
Exemplo n.º 7
0
Arquivo: api.php Projeto: anqh/anqh
 /**
  * Action: search
  */
 public function action_search()
 {
     $this->data['venues'] = array();
     $term = trim(Arr::get($_REQUEST, 'q', ''));
     $search = explode(':', Arr::get($_REQUEST, 'search', 'name'));
     $limit = (int) Arr::get($_REQUEST, 'limit', 25);
     $order = Arr::get($_REQUEST, 'order', 'name.asc');
     $field = explode(':', Arr::get($_REQUEST, 'field', 'id:name:city'));
     // Term must be at least 2 characters
     if (strlen($term) >= 3) {
         // 500 events max
         $limit = min($limit, 500);
         // Get order
         $orders = $this->_prepare_order($order, self::$_orderable);
         $orders = empty($orders) ? array('name' => 'asc') : $orders;
         // Get fields
         $fields = empty($field) ? self::$_fields : array_intersect($field, self::$_fields);
         $fields = empty($fields) ? array('id', 'name') : $fields;
         // Get search
         $searches = empty($search) ? self::$_searchable : array_intersect($search, self::$_searchable);
         $searches = empty($searches) ? array('name') : $searches;
         // Build query
         $venue = new Model_Venue();
         $venues = DB::select_array($venue->fields());
         foreach ($orders as $column => $direction) {
             $venues->order_by($column, $direction);
         }
         $venues->where_open();
         foreach ($searches as $search) {
             if ($search == 'city') {
                 $search .= '_name';
             }
             $venues->or_where($search, 'ILIKE', '%' . $term . '%');
         }
         $venues->where_close();
         // Build data
         foreach ($venue->load($venues, $limit) as $venue) {
             $this->data['venues'][] = $this->_prepare_venue($venue, $fields);
         }
     }
 }
Exemplo n.º 8
0
 /**
  * Get event venue
  *
  * @return  Model_Venue
  */
 public function venue()
 {
     try {
         return $this->venue_id ? Model_Venue::factory($this->venue_id) : null;
     } catch (AutoModeler_Exception $e) {
         return null;
     }
 }
Exemplo n.º 9
0
Arquivo: edit.php Projeto: anqh/anqh
    /**
     * Get JavaScripts.
     *
     * @return  string
     */
    public function javascript()
    {
        // Date picker options
        $datepicker = array('changeMonth' => true, 'changeYear' => true, 'dateFormat' => 'd.m.yy', 'dayNames' => array(__('Sunday'), __('Monday'), __('Tuesday'), __('Wednesday'), __('Thursday'), __('Friday'), __('Saturday')), 'dayNamesMin' => array(__('Su'), __('Mo'), __('Tu'), __('We'), __('Th'), __('Fr'), __('Sa')), 'firstDay' => 1, 'monthNames' => array(__('January'), __('February'), __('March'), __('April'), __('May'), __('June'), __('July'), __('August'), __('September'), __('October'), __('November'), __('December')), 'monthNamesShort' => array(__('Jan'), __('Feb'), __('Mar'), __('Apr'), __('May'), __('Jun'), __('Jul'), __('Aug'), __('Sep'), __('Oct'), __('Nov'), __('Dec')), 'nextText' => '&#9658;', 'prevText' => '&#9668;', 'showWeek' => true, 'showOtherMonths' => true, 'weekHeader' => __('Wk'));
        $venues = Model_Venue::factory()->find_all_autocomplete();
        // Venues, Maps and tickets
        ob_start();
        ?>
<script>
head.ready('anqh', function() {

	// Tickets
	$('#field-free input').on('click', function() {
		console.log($(this).is(':checked'));
		if ($(this).is(':checked')) {
			$('input[name=price]').attr('disabled', 'disabled');
		} else {
			$('input[name=price]').removeAttr('disabled');
		}
	});

	// Venue
	$('#field-ug input').on('click', function() {
		console.log(this.checked);
		if ($(this).is(':checked')) {
			$('input[name=venue_name]').attr('disabled', 'disabled');
		} else {
			$('input[name=venue_name]').removeAttr('disabled');
		}
	});

	// Datepicker
	var pickerOptions = <?php 
        echo json_encode($datepicker);
        ?>
	  , $dateBegin = $('input[name="stamp_begin[date]"]')
	  , $dateEnd   = $('input[name="stamp_end[date]"]');
	$dateEnd.datepicker(pickerOptions);
	$dateBegin.datepicker($.extend(pickerOptions, {
		onClose: function(dateText, inst) {
			var startDate = $dateBegin.datepicker('getDate');
			startDate.setDate(startDate.getDate() + 1);
			$dateEnd.datepicker('setDate', startDate);
		}
	}));

	// City autocomplete
/*	$('input[name=city_name]').placecomplete({
		requestParams: {
			types: [ '(cities)' ]
		}
	});*/
	var $city = $('input[name=city_name]');
	$city.geocomplete({
		map:              '#map',
		details:          '#form-event',
		detailsAttribute: 'data-geo',
		location:         <?php 
        echo $this->venue->latitude ? '[ ' . $this->venue->latitude . ', ' . $this->venue->longitude . ' ]' : "'" . ($this->event->city_name ? $this->event->city_name : 'Helsinki') . "'";
        ?>
,
		types:            [ '(cities)' ]
	});

	// Venue autocomplete
	function toggleVenue(toggle) {
		$('#fields-venue div').toggleClass('hidden', toggle);
		$('#fields-venue .venue-placeholder').toggleClass('hidden', !toggle);
	}

	var $latitude  = $('input[name=latitude]')
	  , $longitude = $('input[name=longitude]');

	var venues = <?php 
        echo json_encode($venues);
        ?>
;
	$('input[name=venue_name]')
		.on('change', function() {
			$('input[name=venue_id]').val('');
		})
		.on('typeahead:selected', function(event, selection, name) {
			var map    = $city.geocomplete('map')
			  , marker = $city.geocomplete('marker');

			// Update form
			if (selection.foursquare_id) {
				$('input[name=venue_id]').val('');
				$('input[name=foursquare_id]').val(selection.foursquare_id);
			} else {
				$('input[name=venue_id]').val(selection.id);
				$('input[name=foursquare_id]').val('');
			}
			if (selection.latitude && selection.longitude) {
				$latitude.val(selection.latitude);
				$longitude.val(selection.longitude);
				var center = new google.maps.LatLng(selection.latitude, selection.longitude);
				map.setCenter(center);
				marker.setPosition(center);
			} else {
				$city.geocomplete('find', selection.city);
			}
			$('input[name=city_name], input[name=city]').val(selection.city);

			// Update label
			$('#fields-venue .venue-name').text(selection.value);
			$('#fields-venue .venue-city').text(selection.city || '');
			toggleVenue(true);
		})
		.typeahead([
			{
				name:   'local',
				header: '<header class="dropdown-header"><?php 
        echo __('Existing');
        ?>
</header>',
				local:  venues
			},
			{
				name:   'foursquare',
				header: '<header class="dropdown-header"><i class="fa fa-foursquare"></i> <?php 
        echo __('Foursquare');
        ?>
</header>',
				remote: {
					url:      Anqh.APIURL + '/v1/venues/foursquare',
					dataType: 'jsonp',
					replace:  function(url, uriEncodedQuery) {
						return url += '?method=venues&ll=' + $latitude.val() + ',' + $longitude.val() + '&query=' + uriEncodedQuery;
					},
					filter: function(parsedResponse) {
						return parsedResponse.venues || [];
					}
				}
			}
		]);

	$('.venue-placeholder a').on('click', function() {
		toggleVenue(false);

		return false;
	});

	<?php 
        if (!$this->venue_errors && $this->event->venue_name && $this->event->city_name) {
            ?>
	toggleVenue(true);
	<?php 
        }
        ?>

});
</script>
<?php 
        return ob_get_clean();
    }
Exemplo n.º 10
0
 /**
  * Edit event
  *
  * @param  integer  $event_id
  */
 protected function _edit_event($event_id = null)
 {
     $this->history = false;
     if ($event_id) {
         // Editing old
         $event = Model_Event::factory($event_id);
         if (!$event->loaded()) {
             throw new Model_Exception($event, $event_id);
         }
         Permission::required($event, Model_Event::PERMISSION_UPDATE, self::$user);
         $cancel = Request::back(Route::model($event), true);
         $this->view = View_Page::factory(HTML::chars($event->name));
         // Set actions
         if (Permission::has($event, Model_Event::PERMISSION_DELETE, self::$user)) {
             $this->view->actions[] = array('link' => Route::model($event, 'delete') . '?token=' . Security::csrf(), 'text' => '<i class="icon-trash icon-white"></i> ' . __('Delete event'), 'class' => 'btn-danger event-delete');
         }
         $edit = true;
     } else {
         // Creating new
         $event = new Model_Event();
         Permission::required($event, Model_Event::PERMISSION_CREATE, self::$user);
         $cancel = Request::back(Route::get('events')->uri(), true);
         $this->view = View_Page::factory(__('New event'));
         $event->author_id = self::$user->id;
         $event->created = time();
         $edit = false;
     }
     // Handle post
     if ($_POST && Security::csrf_valid()) {
         // Handle venue
         if ($venue_hidden = Arr::get($_POST, 'venue_hidden')) {
             // Hidden events require only city
         } else {
             if ($venue_id = (int) Arr::get_once($_POST, 'venue_id')) {
                 // Old venue
                 $venue = Model_Venue::factory($venue_id);
             } else {
                 if ($venue_name = Arr::get($_POST, 'venue_name')) {
                     // Check for duplicate venue
                     $venues = Model_Venue::factory()->find_by_name($venue_name);
                     if ($venues->count()) {
                         $city_name = strtolower(Arr::get($_POST, 'city_name'));
                         foreach ($venues as $venue_old) {
                             if (strtolower($venue_old->city_name) == $city_name) {
                                 $venue = $venue_old;
                                 break;
                             }
                         }
                     }
                 }
             }
         }
         $post = Arr::intersect($_POST, Model_Event::$editable_fields);
         if (isset($post['stamp_begin']['date']) && isset($post['stamp_end']['time'])) {
             $post['stamp_end']['date'] = $post['stamp_begin']['date'];
         }
         $event->set_fields($post);
         if (Arr::get($_POST, 'free')) {
             $event->price = 0;
         }
         // Venue/location
         $event->venue_hidden = (bool) $venue_hidden;
         if ($venue_hidden) {
             // Hidden events don't have a venue
             $event->venue_id = null;
             $event->venue_name = null;
         } else {
             if (isset($venue)) {
                 // Venue loaded
                 $event->venue_id = $venue->id;
                 $event->city_name = $venue->city_name;
             } else {
                 if (!empty($venue_name)) {
                     // Create new venue
                     $venue = Model_Venue::factory();
                     $venue->name = Arr::get($_POST, 'venue_name');
                     $venue->address = Arr::get($_POST, 'address');
                     $venue->latitude = Arr::get($_POST, 'latitude');
                     $venue->longitude = Arr::get($_POST, 'longitude');
                     $venue->event_host = true;
                     $venue->author_id = self::$user->id;
                     $venue->city_name = $event->city_name;
                     try {
                         $venue->save();
                         $event->venue_id = $venue->id;
                     } catch (Validation_Exception $venue_validation) {
                     }
                 }
             }
         }
         // Validate event
         try {
             $event->is_valid();
         } catch (Validation_Exception $event_validation) {
         }
         // If no errors found, save
         if (!isset($venue_validation) && !isset($event_validation)) {
             // Make sure end time is after start time, i.e. the next day
             if ($event->stamp_end < $event->stamp_begin) {
                 $event->stamp_end += Date::DAY;
             }
             $event->save();
             // Set tags
             $event->set_tags(Arr::get($_POST, 'tag'));
             $edit ? NewsfeedItem_Events::event_edit(self::$user, $event) : NewsfeedItem_Events::event(self::$user, $event);
             $this->request->redirect(Route::model($event));
         }
     }
     // Fill the required information to view
     $this->view->event = $event;
     $this->view->event_errors = isset($event_validation) ? $event_validation->array->errors('validation') : null;
     $this->view->venue = isset($venue) ? $venue : null;
     $this->view->venue_errors = isset($venue_validation) ? $venue_validation->array->errors('validation') : null;
     // Tags
     $tags = array();
     $tag_group = new Model_Tag_Group('Music');
     if ($tag_group->loaded() && count($tag_group->tags())) {
         foreach ($tag_group->tags() as $tag) {
             $tags[$tag->id()] = $tag->name();
         }
     }
     // Form
     $section = $this->section_event_edit($event);
     $section->event_errors = isset($event_validation) ? $event_validation->array->errors('validation') : null;
     $section->venue = isset($venue) ? $venue : $event->venue;
     $section->venue_errors = isset($venue_validation) ? $venue_validation->array->errors('validation') : null;
     $section->cancel = $cancel;
     $this->view->add(View_Page::COLUMN_TOP, $section);
 }
Exemplo n.º 11
0
Arquivo: edit.php Projeto: anqh/events
    /**
     * Get JavaScripts.
     *
     * @return  string
     */
    public function javascript()
    {
        // Date picker options
        $datepicker = array('changeMonth' => true, 'changeYear' => true, 'dateFormat' => 'd.m.yy', 'dayNames' => array(__('Sunday'), __('Monday'), __('Tuesday'), __('Wednesday'), __('Thursday'), __('Friday'), __('Saturday')), 'dayNamesMin' => array(__('Su'), __('Mo'), __('Tu'), __('We'), __('Th'), __('Fr'), __('Sa')), 'firstDay' => 1, 'monthNames' => array(__('January'), __('February'), __('March'), __('April'), __('May'), __('June'), __('July'), __('August'), __('September'), __('October'), __('November'), __('December')), 'monthNamesShort' => array(__('Jan'), __('Feb'), __('Mar'), __('Apr'), __('May'), __('Jun'), __('Jul'), __('Aug'), __('Sep'), __('Oct'), __('Nov'), __('Dec')), 'nextText' => __('&raquo;'), 'prevText' => __('&laquo;'), 'showWeek' => true, 'showOtherMonths' => true, 'weekHeader' => __('Wk'));
        $venues = Model_Venue::factory()->find_all_autocomplete();
        // Venues, Maps and tickets
        ob_start();
        ?>
<script>
head.ready('anqh', function() {

	// Datepicker
	$('input.date').datepicker(<?php 
        echo json_encode($datepicker);
        ?>
);

	// City autocomplete
	$('input[name=city_name]').autocompleteGeo();

	// Venue autocomplete
	var venues = <?php 
        echo json_encode($venues);
        ?>
;
	$('input[name=venue_name]').autocompleteVenue({ source: venues });

	// Tickets
	$('#field-free').change(function _togglePrice() {
		if (this.checked) {
			$('input[name=price]').attr('disabled', 'disabled');
			$('#group-price').slideUp();
		} else {
			$('input[name=price]').removeAttr('disabled');
			$('#group-price').slideDown();
		}
	});

	// Venue
	$('#field-ug').change(function _toggleVenue() {
		if (this.checked) {
			$('input[name=venue_name]').attr('disabled', 'disabled');
			$('#group-venue').slideUp();
		} else {
			$('input[name=venue_name]').removeAttr('disabled');
			$('#group-venue').slideDown();
		}
	});
});
</script>
<?php 
        return ob_get_clean();
    }
Exemplo n.º 12
0
 public function post_price()
 {
     $system_venue_id = \Input::post('venue_id');
     $price = intval(\Input::post('price'));
     if (!$price || !$system_venue_id) {
         return $this->sendAPIResponse(null, 400, 'Please provide a value both for venue_id and price!');
     }
     $Venue = \Model_Venue::find($system_venue_id);
     if (!$Venue) {
         return $this->sendAPIResponse(null, 400, 'Unkown venue / invalid venue_id!');
     }
     try {
         $Record = new \Model_Record();
         // $Record->record_hash = $record_hash;
         $Record->object_id = $system_venue_id;
         $Record->property = 'price';
         $Record->value = $price;
         $Record->datatype = 'absolute';
         $Record->save();
         if (\Collection\Venue::calculateVenuePriceScore($system_venue_id)) {
             return $this->sendAPIResponse(array('success' => true));
         }
         return $this->sendAPIResponse(null, 400, 'Unkown error');
     } catch (\Database_Exception $err) {
         // catch error. normally there shouldn't be an error, but in the development phase it's possible to have incomplete data, so errors could occur at this place.
         return $this->sendAPIResponse(null, 400, $err);
     }
 }
Exemplo n.º 13
0
Arquivo: venues.php Projeto: anqh/anqh
 /**
  * Add side views.
  */
 protected function _side_views()
 {
     // New venues
     $section = $this->section_venue_list(Model_Venue::factory()->find_new(10));
     $section->title = __('New venues');
     $this->view->add(View_Page::COLUMN_RIGHT, $section);
     // Updated venues
     $section = $this->section_venue_list(Model_Venue::factory()->find_updated(10));
     $section->title = __('Updated venues');
     $this->view->add(View_Page::COLUMN_RIGHT, $section);
 }
Exemplo n.º 14
0
Arquivo: events.php Projeto: anqh/anqh
 /**
  * Edit event
  *
  * @param  integer  $event_id
  */
 protected function _edit_event($event_id = null)
 {
     $this->history = false;
     if ($event_id) {
         // Editing old
         $event = Model_Event::factory($event_id);
         if (!$event->loaded()) {
             throw new Model_Exception($event, $event_id);
         }
         Permission::required($event, Model_Event::PERMISSION_UPDATE);
         $cancel = Request::back(Route::model($event), true);
         $this->view = View_Page::factory(HTML::chars($event->name));
         // Set actions
         if (Permission::has($event, Model_Event::PERMISSION_DELETE)) {
             $this->view->actions[] = array('link' => Route::model($event, 'delete') . '?token=' . Security::csrf(), 'text' => '<i class="fa fa-trash-o"></i> ' . __('Delete event'), 'class' => 'btn-danger event-delete');
         }
         $edit = true;
         $event->update_count++;
         $event->modified = time();
     } else {
         // Creating new
         $event = new Model_Event();
         Permission::required($event, Model_Event::PERMISSION_CREATE);
         $cancel = Request::back(Route::get('events')->uri(), true);
         $this->view = View_Page::factory(__('New event'));
         $event->author_id = Visitor::$user->id;
         $event->created = time();
         $edit = false;
     }
     // Handle post
     if ($_POST && Security::csrf_valid()) {
         $preview = isset($_POST['preview']);
         // Handle venue
         if ($venue_hidden = Arr::get($_POST, 'venue_hidden')) {
             // Hidden events require only city
         } else {
             if ($venue_id = (int) Arr::get_once($_POST, 'venue_id')) {
                 // Old venue
                 $venue = Model_Venue::factory($venue_id);
             } else {
                 if ($venue_name = Arr::get($_POST, 'venue_name')) {
                     // Check for duplicate venue
                     $venues = Model_Venue::factory()->find_by_name($venue_name);
                     if ($venues->count()) {
                         $city_name = strtolower(Arr::get($_POST, 'city_name'));
                         foreach ($venues as $venue_old) {
                             if (strtolower($venue_old->city_name) == $city_name) {
                                 $venue = $venue_old;
                                 break;
                             }
                         }
                     }
                 }
             }
         }
         $post = Arr::intersect($_POST, Model_Event::$editable_fields);
         if (isset($post['stamp_begin']['date']) && isset($post['stamp_end']['time']) && !isset($post['stamp_end']['date'])) {
             $post['stamp_end']['date'] = $post['stamp_begin']['date'];
         }
         $event->set_fields($post);
         if (Arr::get($_POST, 'free')) {
             $event->price = 0;
         }
         // Venue/location
         $event->venue_hidden = (bool) $venue_hidden;
         if ($venue_hidden) {
             // Hidden events don't have a venue
             $event->venue_id = null;
             $event->venue_name = null;
         } else {
             if (isset($venue)) {
                 // Venue loaded
                 $event->venue_id = $venue->id;
                 $event->city_name = $venue->city_name;
             } else {
                 if (!empty($venue_name)) {
                     // Create new venue
                     $venue = Model_Venue::factory();
                     $venue->name = Arr::get($_POST, 'venue_name');
                     $venue->address = Arr::get($_POST, 'address');
                     $venue->latitude = Arr::get($_POST, 'latitude');
                     $venue->longitude = Arr::get($_POST, 'longitude');
                     $venue->foursquare_id = Arr::get($_POST, 'foursquare_id');
                     $venue->event_host = true;
                     $venue->author_id = Visitor::$user->id;
                     $venue->city_name = $event->city_name;
                     if (!$preview) {
                         try {
                             $venue->save();
                             $event->venue_id = $venue->id;
                         } catch (Validation_Exception $venue_validation) {
                         }
                     }
                 }
             }
         }
         // Validate event
         try {
             $event->is_valid();
         } catch (Validation_Exception $event_validation) {
         }
         // Handle preview request
         if ($preview) {
             if ($this->ajax) {
                 $preview = '<p>' . self::_event_subtitle($event) . '</p>';
                 $preview .= '<div id="main" class="col-md-8">';
                 $preview .= $this->section_event_main($event);
                 $preview .= '<hr></div>';
                 $this->response->body($preview);
             }
             return;
         }
         // Flyer
         if ($flyer_url = Arr::get($_POST, 'flyer')) {
             $event->flyer_url = $flyer_url;
             $image = new Model_Image();
             $image->remote = $flyer_url;
             $image->created = time();
             $image->author_id = Visitor::$user->id;
             try {
                 $image->save();
                 try {
                     $flyer = new Model_Flyer();
                     $flyer->set_fields(array('image_id' => $image->id, 'name' => $event->name, 'stamp_begin' => $event->stamp_begin));
                     $flyer->save();
                 } catch (Validation_Exception $flyer_validation) {
                     $flyer_error = print_r($flyer_validation->array->errors('validation'), true);
                 }
             } catch (Validation_Exception $image_validation) {
                 $flyer_error = print_r($image_validation->array->errors('validation'), true);
             } catch (Kohana_Exception $e) {
                 $flyer_error = $e->getMessage();
             }
         }
         // If no errors found, save
         if (!isset($venue_validation) && !isset($event_validation) && !isset($flyer_error)) {
             // Make sure end time is after start time, i.e. the next day
             if ($event->stamp_end < $event->stamp_begin) {
                 $event->stamp_end += Date::DAY;
             }
             $event->save();
             // Handle flyer
             if (isset($image) && isset($flyer) && $flyer->loaded()) {
                 $flyer->event_id = $event->id;
                 $flyer->save();
                 $event->set_flyer($flyer);
                 $event->save();
             }
             // Set tags
             $event->set_tags(Arr::get($_POST, 'tag'));
             if ($edit) {
                 // Don't flood edits right after save
                 if (time() - $event->created > 60 * 30) {
                     NewsfeedItem_Events::event_edit(Visitor::$user, $event);
                 }
             } else {
                 NewsfeedItem_Events::event(Visitor::$user, $event);
                 // Add to favorites
                 $event->add_favorite(Visitor::$user);
                 // Create forum topic
                 if ($event->add_forum_topic()) {
                     Visitor::$user->post_count++;
                     Visitor::$user->save();
                 }
             }
             $this->request->redirect(Route::model($event));
         }
     }
     // Remove orphan flyer on all errors
     if (isset($flyer)) {
         $flyer->delete();
     } else {
         if (isset($image)) {
             $image->delete();
         }
     }
     // Tags
     $tags = array();
     $tag_group = new Model_Tag_Group('Music');
     if ($tag_group->loaded() && count($tag_group->tags())) {
         foreach ($tag_group->tags() as $tag) {
             $tags[$tag->id()] = $tag->name();
         }
     }
     // Form
     $section = $this->section_event_edit($event);
     $section->event_errors = isset($event_validation) ? $event_validation->array->errors('validation') : null;
     $section->flyer_error = isset($flyer_error) ? $flyer_error : null;
     $section->venue = isset($venue) ? $venue : $event->venue;
     $section->venue_errors = isset($venue_validation) ? $venue_validation->array->errors('validation') : null;
     $section->cancel = $cancel;
     $this->view->add(View_Page::COLUMN_TOP, $section);
 }