diff --git a/site/controllers/maps_controller.php b/site/controllers/maps_controller.php new file mode 100644 index 0000000..fe97ee7 --- /dev/null +++ b/site/controllers/maps_controller.php @@ -0,0 +1,308 @@ +Map->recursive = 0; +/* $this->Map->MapSize->unbindModel(array('hasMany' => array('Map'))); */ +/* $this->Map->MapSize->MapType->unbindModel(array('hasMany' => array('MapSize'))); */ + //$this->Map->bindModel(array('hasOne' => array('MapType'))); + //function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null) { + $this->set('maps', $this->paginate(null, null, null, null, null, 0)); + } + + function view($id = null) { + if (!$id) { + $this->Session->setFlash(__('Invalid Item.', true)); + $this->redirect(array('action'=>'index')); + } + $this->Map->recursive = 0; + $this->set('map', $this->Map->read(null, $id)); + +/* $this->Map->MapSize->unbindModel(array('hasMany' => array('Map'))); */ +/* $this->Map->MapSize->MapType->unbindModel(array('hasMany' => array('MapSize'))); */ +/* $this->Map->Lease->unbindModel(array('belongsTo' => array('Map'))); */ +/* $this->Map->Lease->LeaseType->unbindModel(array('hasMany' => array('Lease'))); */ +/* $this->Map->Lease->Charge->unbindModel(array('belongsTo' => array('Lease'))); */ +/* $this->Map->Lease->Charge->ChargeType->unbindModel(array('hasMany' => array('Charge'))); */ +/* $this->Map->Lease->Charge->Receipt->unbindModel(array('hasMany' => array('ChargesReceipt'))); */ + +/* //$this->Map->Lease->unbindModel(array('hasMany' => array('Contact'))); */ +/* $this->Map->Lease->unbindModel(array('hasAndBelongsToMany' => array('Contact'))); */ +/* //$this->Map->Lease->unbindModel(array('hasOne' => array('Contact'))); */ +/* //$this->Map->Lease->unbindModel(array('belongsTo' => array('Contact'))); */ +/* //$this->Map->Lease->bindModel(array('hasOne' => array('ContactsLease'))); */ +/* //$this->Map->Lease->bindModel(array('hasOne' => array('Contact'))); */ +/* /\* $this->Map->Lease->bindModel(array('hasOne' => array('ContactsLease', *\/ */ +/* /\* 'Contact' => array( *\/ */ +/* /\* 'foreignKey' => false, *\/ */ +/* /\* 'conditions' => *\/ */ +/* /\* array('Contact.id = ContactsLease.contact_id', *\/ */ +/* /\* //'ContactsLease.type = "TENANT"' *\/ */ +/* /\* ))))); *\/ */ + +/* $this->Map->bindModel(array('hasOne' => array('Lease' => array( */ +/* 'foreignKey' => false, */ +/* 'conditions' => array('Lease.map_id = Map.id') */ +/* ), */ +/* 'ContactsLease' => array( */ +/* 'foreignKey' => false, */ +/* 'conditions' => array('ContactsLease.lease_id = Lease.id') */ +/* ), */ +/* 'Contact' => array( */ +/* 'foreignKey' => false, */ +/* 'conditions' => array('Contact.id = ContactsLease.contact_id') */ +/* ))), */ +/* false); */ + + +/* $this->Map->Lease->bindModel(array('hasOne' => array('Contact' => array( */ +/* 'className' => 'ContactsLease', */ +/* 'foreignKey' => false, */ +/* 'conditions' => */ +/* array('ContactsLease.lease_id = Lease.id', */ +/* 'ContactsLease.type = "TENANT"'))))); */ + +/* # 'hasOne' => array( */ +/* # 'RecipesTag', */ +/* # 'FilterTag' => array( */ +/* # 'className' => 'Tag', */ +/* # 'foreignKey' => false, */ +/* # 'conditions' => array('FilterTag.id = RecipesTag.tag_id') */ +/* # )))); */ + +/* $this->Map->id = $id; */ +/* if ($id !== null && $id !== false) { */ +/* $this->Map->data = $this->Map->find('first', */ +/* array('conditions' => array( */ +/* $this->Map->alias . '.' . $this->Map->primaryKey => $id, */ +/* 'ContactsLease.type = "TENANT"' */ +/* ) */ +/* )); */ +/* $this->set('map', $this->Map->data); */ +/* } */ + } + + + // Temporary function + function unitStatusList() { + return + array('DELETED' => array(), + 'DAMAGED' => array(), + 'COMPANY' => array(), + 'UNAVAILABLE' => array(), + 'RESERVED' => array(), + 'DIRTY' => array(), + 'VACANT' => array(), + 'OCCUPIED' => array(), + 'LATE' => array(), + 'LOCKED' => array(), + 'LIENED' => array(), + ); + } + + function map($id = null, $requested_width = 600) { + $info = $this->mapInfo($id); + $info['border'] = true; + $info['clickable'] = true; + $this->image($info, $requested_width); + } + + function legend($id = null, $requested_width = 400) { + $status = $this->unitStatusList(); + $cols = 6; + $rows = (int)((count($status) + $cols - 1) / $cols); + + $info = array('extents' => array(), 'units' => array(), 'legend' => array()); + $info['legend']['width'] = 360; + $info['legend']['depth'] = 120; + + $info['extents']['right'] = $info['legend']['width'] * $cols; + $info['extents']['bottom'] = $info['legend']['depth'] * $rows; + + $top = $lft = 0; + foreach ($status AS $code => $color) { + $info['units'][] = array('name' => $code, + 'status' => $code, + 'width' => $info['legend']['width'], + 'depth' => $info['legend']['depth'], + 'left' => $lft, + 'right' => $lft + $info['legend']['width'], + 'top' => $top, + 'bottom' => $top + $info['legend']['depth']); + $top += $info['legend']['depth']; + if ($top >= $info['legend']['depth'] * $rows) { + $top = 0; $lft += $info['legend']['width']; + } + } + + $this->image($info, $requested_width, true); + } + + function image($info, $requested_width, $legend = false) { + //var $helpers = array('Html', 'Form', 'Javascript', 'Graph'); + $this->layout = null; + $this->autoLayout = false; + Configure::write('debug', '0'); + + // Define our color palate + // REVISIT : 20090513 + // Get colors from DB option tables + $info['palate']['main']['layout']['bg'] = array('red' => 255, 'green' => 255, 'blue' => 255); + $info['palate']['main']['layout']['border'] = array('red' => 192, 'green' => 192, 'blue' => 192); + $info['palate']['main']['layout']['wall'] = array('red' => 0, 'green' => 0, 'blue' => 0); + $info['palate']['unit']['DELETED']['bg'] = array('red' => 0, 'green' => 0, 'blue' => 0); + $info['palate']['unit']['DAMAGED']['bg'] = array('red' => 192, 'green' => 128, 'blue' => 128); + $info['palate']['unit']['COMPANY']['bg'] = array('red' => 128, 'green' => 192, 'blue' => 128); + $info['palate']['unit']['UNAVAILABLE']['bg'] = array('red' => 128, 'green' => 128, 'blue' => 192); + $info['palate']['unit']['RESERVED']['bg'] = array('red' => 192, 'green' => 192, 'blue' => 128); + $info['palate']['unit']['DIRTY']['bg'] = array('red' => 128, 'green' => 192, 'blue' => 192); + $info['palate']['unit']['VACANT']['bg'] = array('red' => 0, 'green' => 255, 'blue' => 128); + $info['palate']['unit']['OCCUPIED']['bg'] = array('red' => 0, 'green' => 128, 'blue' => 255); + $info['palate']['unit']['LATE']['bg'] = array('red' => 255, 'green' => 64, 'blue' => 64); + $info['palate']['unit']['LOCKED']['bg'] = array('red' => 255, 'green' => 128, 'blue' => 128); + $info['palate']['unit']['LIENED']['bg'] = array('red' => 255, 'green' => 192, 'blue' => 192); + + // Determine text color to go with each background + foreach ($info['palate']['unit'] AS &$code) { + $component = $code['bg']; + $method = 3; + if ($method == 1) { + foreach (array('red', 'green', 'blue') AS $prim) + $component[$prim] = 255 - $component[$prim]; + } elseif ($method == 2) { + foreach (array('red', 'green', 'blue') AS $prim) + $component[$prim] = ($component[$prim]) >= 128 ? 0 : 255; + } elseif ($method == 3) { + $val = (sqrt(pow($component['red'], 2) + + pow($component['green'], 2) + + pow($component['blue'], 2)) >= sqrt(3) * 128) ? 0 : 255; + foreach (array('red', 'green', 'blue') AS $prim) + $component[$prim] = $val; + } + + $code['fg'] = $component; + } + + //pr($info); + + /***** + * The preference would be to leave all things "screen" related + * to reside in the view. However, two separate views need this + * information. The 'view' needs it to include a clickable map + * that corresponds to the map image, and of course, the 'map' + * (or 'image') view needs it to render the image. So, in the + * controller for now, unless I come up with a better idea. + *****/ + + // Scale things according to desired display width + $screen_adjustment_factor = $requested_width / $info['extents']['right'];; + + // Define image size + $info['width'] = $info['extents']['right'] * $screen_adjustment_factor; + $info['depth'] = $info['extents']['bottom'] * $screen_adjustment_factor; + + // Go through each unit, adjusting map locations + foreach ($info['units'] AS $unit) { + $unit['left'] *= $screen_adjustment_factor; + $unit['right'] *= $screen_adjustment_factor; + $unit['top'] *= $screen_adjustment_factor; + $unit['bottom'] *= $screen_adjustment_factor; + } + + $this->set(compact('info')); + $this->render('image'); + } + + + + /************************************************************************** + ************************************************************************** + ************************************************************************** + * mapInfo + */ + + function mapInfo($site_area_id) { + // Set up array to hold the map information + $info = array('extents' => array(), 'units' => array()); + + $map = $this->Map->SiteArea->read(null, $site_area_id); + //pr($map); + + $top_adjustment = 5; + $left_adjustment = 5; + $info['extents']['top'] = 0; + $info['extents']['left'] = 0; + $info['extents']['bottom'] = $top_adjustment + $map['Map']['depth'] + 5; + $info['extents']['right'] = $left_adjustment + $map['Map']['width'] + 5; + return $info; + + // Get the overall site limits + $query = "SELECT M.id, M.width, M.depth"; + $query .= " FROM pmgr_maps M"; + $query .= " WHERE site_area_id = $site_area_id"; + $result = $this->Map->query($query); + + //pr($result); + $info['extents']['top'] = 0; + $info['extents']['left'] = 0; + $info['extents']['bottom'] = 360; + $info['extents']['right'] = 480; + $info['map_id'] = 1; + return $info; + + /* // Fetch and verify the result */ + /* $row = mysql_fetch_array($result); */ + /* if (!$row) die("Site map query failed!"); */ + /* mysql_free_result($result); */ + + /* // Compute the actual boundaries, adjusting for a border */ + /* $top_adjustment = 5; */ + /* $left_adjustment = 5; */ + /* $info['extents']['top'] = 0; */ + /* $info['extents']['left'] = 0; */ + /* $info['extents']['bottom'] = $top_adjustment + $row['depth'] + 5; */ + /* $info['extents']['right'] = $left_adjustment + $row['width'] + 5; */ + /* $info['map_id'] = $row['id']; */ + + /* // Get list of units and positions */ + /* $query = "SELECT U.id, U.name, U.status,"; */ + /* $query .= " ($top_adjustment + Mu.pt_top) AS pt_top,"; */ + /* $query .= " ($left_adjustment + Mu.pt_left) AS pt_left,"; */ + /* //$query .= " ($top_adjustment + Mu.pt_bottom) AS pt_bottom,"; */ + /* //$query .= " ($left_adjustment + Mu.pt_right) AS pt_right,"; */ + /* $query .= " IF(Mu.transpose, S.depth, S.width) AS width,"; */ + /* $query .= " IF(Mu.transpose, S.width, S.depth) AS depth"; */ + /* //$query .= " Mu.transpose"; */ + /* $query .= " FROM pmgr_maps_units Mu"; */ + /* $query .= " JOIN pmgr_units U ON U.id = Mu.unit_id"; */ + /* $query .= " JOIN pmgr_unit_sizes S ON S.id = U.size_id"; */ + /* $query .= " WHERE Mu.map_id = $info[map_id]"; */ + /* $result = sql_query($query); */ + + /* // Go through each one, calculating the map location */ + /* while ($row = mysql_fetch_array($result)) { */ + /* $info['units'][$row['id']] = */ + /* array( 'id' => $row['id'], */ + /* 'name' => $row['name'], */ + /* 'left' => $row['pt_left'], */ + /* 'right' => $row['pt_left'] + $row['width'], */ + /* 'top' => $row['pt_top'], */ + /* 'bottom' => $row['pt_top'] + $row['depth'], */ + /* 'width' => $row['width'], */ + /* 'depth' => $row['depth'], */ + /* 'n-s' => $row['reverseWL'], */ + /* 'status' => $row['status'] */ + /* ); */ + /* } */ + + /* // Free the result */ + /* mysql_free_result($result); */ + + /* return $info; */ + } + +} + +?> \ No newline at end of file diff --git a/site/views/elements/maps.ctp b/site/views/elements/maps.ctp new file mode 100644 index 0000000..a62fcaa --- /dev/null +++ b/site/views/elements/maps.ctp @@ -0,0 +1,61 @@ + + +

+'.__('Maps',true).''; +?> +

+ + + + counter(array( + 'format' => __('Page %page% of %pages%, showing %current% records (%start% - %end%) of %count% total', true))); + + $rows = array($paginator->sort('id'), + $paginator->sort('name'), + $paginator->sort('site_area_id'), + $paginator->sort('width'), + $paginator->sort('depth'), + $paginator->sort('comment')); + } else { + $rows = array('Id', 'Name', 'Area', 'Width', 'Depth', 'Comment'); + } + echo $html->tableHeaders($rows); + + $rows = array(); + foreach ($maps as $map) { + $rows[] = array($html->link($map['Map']['id'], + array('controller' => 'maps', + 'action' => 'view', + $map['Map']['id'])), + $html->link($map['Map']['name'], + array('controller' => 'maps', + 'action' => 'view', + $map['Map']['id'])), + $map['SiteArea']['name'], + $map['Map']['width'] / 12, + $map['Map']['depth'] / 12, + $map['Map']['comment']); + } + echo $html->tableCells($rows, null, array('class' => "altrow"), false, false); + } +?> +
+ +' . "\n"); + echo $paginator->prev('<< '.__('previous', true), array(), null, array('class'=>'disabled')); + echo(' | '); + echo $paginator->numbers(); + echo(' | '); + echo $paginator->next(__('next', true).' >>', array(), null, array('class'=>'disabled')); + echo('' . "\n"); + } +?> diff --git a/site/views/maps/image.ctp b/site/views/maps/image.ctp new file mode 100644 index 0000000..0d910b2 --- /dev/null +++ b/site/views/maps/image.ctp @@ -0,0 +1,95 @@ + 100) { + imagestring($image, 1, + $unit['left']+3, $unit['top']+3, + $unit['name'], + $info['palate']['unit'][$unit['status']]['fg']['color']); + } + else { + imagestringup($image, 1, + $unit['left']+3, $unit['bottom']-3, + $unit['name'], + $info['palate']['unit'][$unit['status']]['fg']['color']); + } + +} + + +header("Content-type: image/png"); +if (! imagepng($image)) { + die("Couldn't output image!"); +} + +// Clear image from memory +imagedestroy($image); + +// Closing PHP tag intentionally omitted diff --git a/site/views/maps/index.ctp b/site/views/maps/index.ctp new file mode 100644 index 0000000..8660dda --- /dev/null +++ b/site/views/maps/index.ctp @@ -0,0 +1,3 @@ +
+element('maps') ?> +
diff --git a/site/views/maps/view.ctp b/site/views/maps/view.ctp new file mode 100644 index 0000000..bc90c4a --- /dev/null +++ b/site/views/maps/view.ctp @@ -0,0 +1,25 @@ + + +
+image(array('controller' => 'maps', + 'action' => 'map', + $map['Map']['id']), + array('alt' => 'Site Map', + 'class' => 'imagemap', + 'usemap' => '#mapimg')); +?> +
+ +
+image(array('controller' => 'maps', + 'action' => 'legend', + $map['Map']['id']), + array('alt' => 'Site Map Legend')); + */ +?> +
+ +