diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1463de6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+.bundle/
+log/*.log
+pkg/
+test/dummy/db/*.sqlite3
+test/dummy/log/*.log
+test/dummy/tmp/
\ No newline at end of file
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 0000000..a6e487f
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,17 @@
+source "http://rubygems.org"
+
+# Declare your gem's dependencies in location.gemspec.
+# Bundler will treat runtime dependencies like base dependencies, and
+# development dependencies will be added by default to the :development group.
+gemspec
+
+# jquery-rails is used by the dummy application
+gem "jquery-rails"
+
+# Declare any dependencies that are still in development here instead of in
+# your gemspec. These might include edge Rails or gems from your path or
+# Git. Remember to move these dependencies to your gemspec before releasing
+# your gem to rubygems.org.
+
+# To use debugger
+# gem 'ruby-debug19', :require => 'ruby-debug'
diff --git a/MIT-LICENSE b/MIT-LICENSE
new file mode 100644
index 0000000..406f17b
--- /dev/null
+++ b/MIT-LICENSE
@@ -0,0 +1,20 @@
+Copyright 2012 YOURNAME
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/README.rdoc b/README.rdoc
new file mode 100644
index 0000000..937b414
--- /dev/null
+++ b/README.rdoc
@@ -0,0 +1,3 @@
+= Location
+
+This project rocks and uses MIT-LICENSE.
diff --git a/Rakefile b/Rakefile
new file mode 100644
index 0000000..6635337
--- /dev/null
+++ b/Rakefile
@@ -0,0 +1,39 @@
+#!/usr/bin/env rake
+begin
+ require 'bundler/setup'
+rescue LoadError
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
+end
+begin
+ require 'rdoc/task'
+rescue LoadError
+ require 'rdoc/rdoc'
+ require 'rake/rdoctask'
+ RDoc::Task = Rake::RDocTask
+end
+
+RDoc::Task.new(:rdoc) do |rdoc|
+ rdoc.rdoc_dir = 'rdoc'
+ rdoc.title = 'Location'
+ rdoc.options << '--line-numbers'
+ rdoc.rdoc_files.include('README.rdoc')
+ rdoc.rdoc_files.include('lib/**/*.rb')
+end
+
+APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
+load 'rails/tasks/engine.rake'
+
+
+Bundler::GemHelper.install_tasks
+
+require 'rake/testtask'
+
+Rake::TestTask.new(:test) do |t|
+ t.libs << 'lib'
+ t.libs << 'test'
+ t.pattern = 'test/**/*_test.rb'
+ t.verbose = false
+end
+
+
+task :default => :test
diff --git a/app/assets/images/gprs/.gitkeep b/app/assets/images/gprs/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/app/assets/images/location/.gitkeep b/app/assets/images/location/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/app/assets/javascripts/location.js b/app/assets/javascripts/location.js
new file mode 100644
index 0000000..3edb22c
--- /dev/null
+++ b/app/assets/javascripts/location.js
@@ -0,0 +1,131 @@
+var Locations = function(ls){
+ l = this;
+ this.name = "Locations";
+ this.locations = ls;
+ this.markerCounts = 0;
+ var map = null,
+ infowindow = new google.maps.InfoWindow(),
+ default_location = new google.maps.LatLng( 24.8043107, 121.03042159999995 ),
+ infowindow_template = "
",
+ markers = [];
+
+
+ var initialize = function() {
+ google.maps.visualRefresh = true;
+ var location = ( l.locations.length ? new google.maps.LatLng( l.locations[0].latitude, l.locations[0].longitude ) : default_location ),
+ mapOptions = {
+ zoom: 16,
+ center: location,
+ mapTypeId: google.maps.MapTypeId.ROADMAP
+ };
+
+ map = new google.maps.Map( document.getElementById('map'), mapOptions );
+
+ for( i = 0; i < l.locations.length; i++ ){
+ markers.push( addMarker( new google.maps.LatLng(l.locations[i].latitude, l.locations[i].longitude), l.locations[i].color, i, function( index ){
+
+ }) );
+ }
+
+ }
+
+ var addMarker = function( location, pinColor, index, markerCallback ){
+
+ var pin = getPin(( pinColor.substr( 0, 1 ) == "#" ? pinColor.replace("#","") : pinColor )),
+ marker = new google.maps.Marker({
+ map: map,
+ icon: pin.image,
+ shadow: pin.shadow,
+ position: location,
+ zIndex: 10
+ });
+
+ google.maps.event.addListener( marker, 'click', function() {
+
+ infowindow.setContent( getTemplate( index ) );
+ infowindow.open( map, marker );
+ if( typeof markerCallback == "function" )
+ markerCallback.call( this, index );
+
+ });
+
+ l.markerCounts++;
+ return {"marker" : marker, "category_id" : l.locations[index].category_id};
+ }
+
+
+
+ var getTemplate = function( obj ){
+
+ var object = ( typeof obj == "number" ? l.locations[obj] : ( typeof obj == "object" ? obj : null ) );
+
+ if ( object ){
+
+ var template = $( "" );
+ template.html( infowindow_template );
+ template.find( '.title' ).text( object.name );
+ template.find( "img.thumbnail" ).attr( "src", object.file.thumb.url );
+ return template.html();
+
+ }else{
+
+ throw new InvalidObjectError();
+ }
+
+ }
+
+ var getPin = function( color ){
+
+ var pinImage = new google.maps.MarkerImage("http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=%E2%80%A2|" + color,
+ new google.maps.Size(21, 34),
+ new google.maps.Point(0,0),
+ new google.maps.Point(10, 34));
+
+ var pinShadow = new google.maps.MarkerImage("http://chart.apis.google.com/chart?chst=d_map_pin_shadow",
+ new google.maps.Size(40, 37),
+ new google.maps.Point(0, 0),
+ new google.maps.Point(12, 35));
+
+ return {"image":pinImage,"shadow":pinShadow};
+ }
+
+ this.getMarker = function( index ){
+ return markers[index];
+ }
+ this.getAllMarkers = function( ){
+ return markers;
+ }
+
+ this.clearFilter = function(){
+ var m = l.getAllMarkers();
+ for( i = 0; i < m.length; i++ ){
+ m[i].marker.setVisible(true);
+ }
+ }
+
+ this.filterMarkers = function( categories ){
+ var filtered = [],
+ m = l.getAllMarkers();
+
+ for( i = 0; i < m.length; i++ ){
+ m[i].marker.setVisible(false);
+ }
+ for( i = 0; i < categories.length; i++ ){
+ filtered = filtered.concat(m.filter(function(a){return a.category_id == categories[i]}));
+ }
+ for( i = 0; i < filtered.length; i++ ){
+ filtered[i].marker.setVisible(true);
+ }
+ return filtered;
+ }
+ initialize();
+
+}
+
+var InvalidObjectError = function(){
+ this.name = "InvalidObjectError";
+ this.message = "Object not valid";
+}
+
+InvalidObjectError.prototype = new Error();
+InvalidObjectError.prototype.constructor = InvalidObjectError;
diff --git a/app/assets/javascripts/panel/location/back_end/locations.js b/app/assets/javascripts/panel/location/back_end/locations.js
new file mode 100644
index 0000000..dee720f
--- /dev/null
+++ b/app/assets/javascripts/panel/location/back_end/locations.js
@@ -0,0 +1,2 @@
+// Place all the behaviors and hooks related to the matching controller here.
+// All this logic will automatically be available in application.js.
diff --git a/app/assets/stylesheets/gprs/.gitkeep b/app/assets/stylesheets/gprs/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/app/assets/stylesheets/location/.gitkeep b/app/assets/stylesheets/location/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/app/assets/stylesheets/panel/gprs/back_end/locations.css b/app/assets/stylesheets/panel/gprs/back_end/locations.css
new file mode 100644
index 0000000..afad32d
--- /dev/null
+++ b/app/assets/stylesheets/panel/gprs/back_end/locations.css
@@ -0,0 +1,4 @@
+/*
+ Place all the styles related to the matching controller here.
+ They will automatically be included in application.css.
+*/
diff --git a/app/assets/stylesheets/panel/location/back_end/locations.css b/app/assets/stylesheets/panel/location/back_end/locations.css
new file mode 100644
index 0000000..afad32d
--- /dev/null
+++ b/app/assets/stylesheets/panel/location/back_end/locations.css
@@ -0,0 +1,4 @@
+/*
+ Place all the styles related to the matching controller here.
+ They will automatically be included in application.css.
+*/
diff --git a/app/controllers/.gitkeep b/app/controllers/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/app/controllers/panel/location/back_end/location_categories_controller.rb b/app/controllers/panel/location/back_end/location_categories_controller.rb
new file mode 100644
index 0000000..7dd5e22
--- /dev/null
+++ b/app/controllers/panel/location/back_end/location_categories_controller.rb
@@ -0,0 +1,19 @@
+class Panel::Location::BackEnd::LocationCategoriesController < OrbitBackendController
+ def index
+ @module_app_id = @module_app.id rescue nil
+ @categories = get_categories_for_index
+ @categories = @categories.page(params[:page]).per(10)
+ respond_to do |format|
+ format.html # index.html.erb
+ format.json { render json: @categories }
+ end
+ end
+
+ def list
+ @module_app_id = @module_app.id rescue nil
+ @categories = get_categories_for_index
+ @categories = @categories.page(params[:page]).per(10)
+ render :layout => false
+ end
+
+end
\ No newline at end of file
diff --git a/app/controllers/panel/location/back_end/locations_controller.rb b/app/controllers/panel/location/back_end/locations_controller.rb
new file mode 100644
index 0000000..e3baf79
--- /dev/null
+++ b/app/controllers/panel/location/back_end/locations_controller.rb
@@ -0,0 +1,132 @@
+class Panel::Location::BackEnd::LocationsController < OrbitBackendController
+ include AdminHelper
+ open_for_visitor :only => [:get_location_categories, :get_categorywise_locations]
+
+ def index
+ @locations = LocationInfo.all
+ @categories = get_categories_for_index
+ @location_infos = [];
+ @locations.each do |loc|
+ loc['color'] = Category.find(loc.category_id).custom_value
+ @location_infos << loc
+ end
+ respond_to do |format|
+ format.html # new.html.erb
+ format.json { render json: @locations }
+ end
+ end
+
+ def new
+ @location_info = LocationInfo.new
+ @categories = get_categories_for_index
+
+ respond_to do |format|
+ format.html # new.html.erb
+ format.json { render json: @location }
+ end
+ end
+
+ def edit
+ @location_info = LocationInfo.find(params[:id])
+ @categories = get_categories_for_index
+
+ end
+
+ def show
+ @location_info = LocationInfo.find(params[:id])
+ respond_to do |format|
+ format.html
+ format.json { render json: @location }
+ end
+ end
+
+ def create
+ @location_info = LocationInfo.new(params[:location_info])
+ @categories = get_categories_for_index
+ if @location_info.save
+ flash[:success] = "Success!!"
+ redirect_to panel_location_back_end_locations_url
+ else
+ error_msg = @location_info.errors.full_messages
+ render 'new'
+ end
+ end
+
+ def update
+ @location_info = LocationInfo.find(params[:id])
+ @location_info.update_attributes(params[:location_info])
+ redirect_to panel_location_back_end_locations_url
+ end
+
+ def destroy
+ @location_info = LocationInfo.find(params[:id])
+ @location_info.destroy
+ redirect_to panel_location_back_end_locations_url
+
+ end
+
+ def get_locations
+ location_infos = LocationInfo.all
+ @data = Array.new
+
+ location_infos.each do |location|
+ picurl = location.file.blank? ? '' : "http://#{request.host_with_port + location.file.url}"
+ thumburl = location.file.blank? ? '' : "http://#{request.host_with_port + location.file.thumb.url}"
+ @data << { name: location.name,
+ pic_url: picurl,
+ thumb_url: thumburl,
+ longitude: location.longitude,
+ latitude: location.latitude,
+ description: location.description }
+ end
+
+ render :json => JSON.pretty_generate(@data)
+ end
+
+ def get_categories
+ @data = Array.new
+ @data << { name: "Department",
+ link: "http://#{request.host_with_port}"+"/panel/location/back_end/locations/get_locations?locale=en" }
+
+ render :json => JSON.pretty_generate(@data)
+ end
+
+ def get_location_categories
+ check_mobile_api_openness
+ location_categories = get_categories_for_index
+ @data = Array.new
+
+ location_categories.each do |category|
+ I18n.locale = :en
+ name_en = category.title
+ I18n.locale = :zh_tw
+ name_zh_tw = category.title
+ category_id = category.id.to_s
+ @data << { name_en: name_en, name_zh_tw: name_zh_tw, category_id: category_id, location_link: "http://#{request.host_with_port}"+"/#{panel_location_back_end_locations_get_categorywise_locations_path}"+"?category_id=#{category_id}"}
+ end
+
+ render :json => JSON.pretty_generate(@data)
+ end
+
+ def get_categorywise_locations
+ check_mobile_api_openness
+ location_infos = LocationInfo.where(:category_id => params[:category_id])
+ @data = Array.new
+
+ location_infos.each do |location|
+
+ picurl = location.file.blank? ? '' : "http://#{request.host_with_port + location.file.url}"
+ thumburl = location.file.blank? ? '' : "http://#{request.host_with_port + location.file.thumb.url}"
+
+ @data << { id: location.id.to_s,
+ name: location.name,
+ pic_url: picurl,
+ thumb_url: thumburl,
+ longitude: location.longitude,
+ latitude: location.latitude,
+ description: location.description }
+ end
+
+ render :json => JSON.pretty_generate(@data)
+ end
+end
diff --git a/app/controllers/panel/location/front_end/locations_controller.rb b/app/controllers/panel/location/front_end/locations_controller.rb
new file mode 100644
index 0000000..4be3e2e
--- /dev/null
+++ b/app/controllers/panel/location/front_end/locations_controller.rb
@@ -0,0 +1,12 @@
+class Panel::Location::FrontEnd::LocationsController < OrbitWidgetController
+ def index
+ @categories = @module_app.categories.enabled
+ @locations = LocationInfo.all
+
+ @location_infos = [];
+ @locations.each do |loc|
+ loc['color'] = Category.find(loc.category_id).custom_value
+ @location_infos << loc
+ end
+ end
+end
\ No newline at end of file
diff --git a/app/controllers/panel/location/widget/locations_controller.rb b/app/controllers/panel/location/widget/locations_controller.rb
new file mode 100644
index 0000000..f03e808
--- /dev/null
+++ b/app/controllers/panel/location/widget/locations_controller.rb
@@ -0,0 +1,17 @@
+class Panel::Location::Widget::LocationsController < OrbitWidgetController
+ def location_widget
+ @categories = params[:category_id]
+ locations = LocationInfo.where(:category_id.in => @categories)
+ @url = "http://maps.googleapis.com/maps/api/staticmap?zoom=16&size=400x400&maptype=roadmap%20&sensor=false&"
+ markers = ""
+ locations.each do |loc|
+ color = Category.find(loc.category_id).custom_value
+ color.gsub!("#","")
+ markers = markers + "markers=color:0x#{color}|#{loc.latitude},#{loc.longitude}&"
+ end
+ @url = @url + markers.chop
+ # http://maps.googleapis.com/maps/api/staticmap?zoom=13&size=600x300&maptype=roadmap%20&markers=color:0xCF2C9B|40.702147,-74.015794&markers=color:CF2C9B|label:G|40.711614,-74.012318%20&markers=color:red|color:red|label:C|40.718217,-73.998284&sensor=false
+
+
+ end
+end
\ No newline at end of file
diff --git a/app/controllers/panel/locations/back_end/locations_controller.rb b/app/controllers/panel/locations/back_end/locations_controller.rb
new file mode 100644
index 0000000..b5bc2ed
--- /dev/null
+++ b/app/controllers/panel/locations/back_end/locations_controller.rb
@@ -0,0 +1,84 @@
+class Panel::Locations::BackEnd::LocationsController < OrbitBackendController
+
+ #before_filter :clean_values, :only => [:create, :update]
+
+ before_filter :force_order_for_visitor,:only => [:index, :new, :edit, :delete]
+ before_filter :force_order_for_user,:except => [:get_locations,:index]
+ #before_filter :for_app_sub_manager,:except => [:index, :new, :edit, :delete, :get_locations]
+
+ def index
+ @locations = Location.all
+ respond_to do |format|
+ format.html # new.html.erb
+ format.json { render json: @locations }
+ end
+ end
+
+ def new
+ @location = Location.new
+
+ respond_to do |format|
+ format.html # new.html.erb
+ format.json { render json: @location }
+ end
+ end
+
+ def edit
+ @location = Location.find(params[:id])
+ end
+
+ def show
+ @location = Location.find(params[:id])
+ respond_to do |format|
+ format.html
+ format.json { render json: @location }
+ end
+ end
+
+ def create
+ @location = Location.new(params[:location])
+ @location.save!
+ redirect_to panel_gprs_back_end_locations_url
+ end
+
+ def update
+ @location = Location.find(params[:id])
+ @location.update_attributes(params[:location])
+ redirect_to panel_gprs_back_end_locations_url
+ end
+
+ def destroy
+ @location = Location.find(params[:id])
+ @location.destroy
+ redirect_to panel_gprs_back_end_locations_url
+
+ end
+
+ def get_locations
+ locations = Location.all
+ @data = Array.new
+
+ locations.each do |location|
+ picurl = location.file.blank? ? '' : "http://#{request.host_with_port + location.file.url}"
+ thumburl = location.file.blank? ? '' : "http://#{request.host_with_port + location.file.thumb.url}"
+ @data << { name: location.name,
+ pic_url: picurl,
+ thumb_url: thumburl,
+ longitude: location.longitude,
+ latitude: location.latitude,
+ description: location.description }
+ end
+
+ #print readable json
+ render :json => JSON.pretty_generate({location: @data})
+
+ #render :json => {location: @data}.to_json
+ end
+ def get_categories
+ @data = Array.new
+ @data << { name: "Department",
+ link: "http://#{request.host_with_port}"+"/panel/location/back_end/location/get_locations" }
+
+ render :json => JSON.pretty_generate(@data)
+ end
+end
diff --git a/app/helpers/.gitkeep b/app/helpers/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/app/helpers/panel/location/back_end/locations_helper.rb b/app/helpers/panel/location/back_end/locations_helper.rb
new file mode 100644
index 0000000..a354c2c
--- /dev/null
+++ b/app/helpers/panel/location/back_end/locations_helper.rb
@@ -0,0 +1,2 @@
+module Panel::Location::BackEnd::LocationsHelper
+end
diff --git a/app/helpers/panel/locations/back_end/locations_helper.rb b/app/helpers/panel/locations/back_end/locations_helper.rb
new file mode 100644
index 0000000..c6dcef8
--- /dev/null
+++ b/app/helpers/panel/locations/back_end/locations_helper.rb
@@ -0,0 +1,2 @@
+module Panel::Locations::BackEnd::LocationsHelper
+end
diff --git a/app/mailers/.gitkeep b/app/mailers/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/app/models/.gitkeep b/app/models/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/app/models/location.rb b/app/models/location.rb
new file mode 100644
index 0000000..f381e72
--- /dev/null
+++ b/app/models/location.rb
@@ -0,0 +1,12 @@
+class Location
+ include Mongoid::Document
+ include Mongoid::Timestamps
+ include OrbitCategory::Categorizable
+
+ mount_uploader :file, LocationUploader
+
+ field :name
+ field :description
+ field :longitude, type: Float
+ field :latitude, type: Float
+end
diff --git a/app/models/location_info.rb b/app/models/location_info.rb
new file mode 100644
index 0000000..df6d80e
--- /dev/null
+++ b/app/models/location_info.rb
@@ -0,0 +1,21 @@
+class LocationInfo
+ include Mongoid::Document
+ include Mongoid::Timestamps
+ include OrbitCategory::Categorizable
+
+
+ mount_uploader :file, LocationsUploader
+
+ field :name, localize: true
+ field :description, localize: true
+ field :longitude, type: Float
+ field :latitude, type: Float
+
+ validates :file, presence: true
+ validates :longitude,
+ numericality: { less_than_or_equal_to: 180.0, greater_than_or_equal_to: -180.0 },
+ unless: Proc.new{self.longitude.blank?}
+ validates :latitude,
+ numericality: { less_than_or_equal_to: 90.0, greater_than_or_equal_to: -90.0 },
+ unless: Proc.new{self.latitude.blank?}
+end
diff --git a/app/uploaders/locations_uploader.rb b/app/uploaders/locations_uploader.rb
new file mode 100644
index 0000000..55056a5
--- /dev/null
+++ b/app/uploaders/locations_uploader.rb
@@ -0,0 +1,61 @@
+class LocationsUploader < CarrierWave::Uploader::Base
+
+ # Include RMagick or ImageScience support:
+ # include CarrierWave::RMagick
+ # include CarrierWave::ImageScience
+ include CarrierWave::MiniMagick
+
+ # Choose what kind of storage to use for this uploader:
+ # storage :file
+ # storage :s3
+
+ # Override the directory where uploaded files will be stored.
+ # This is a sensible default for uploaders that are meant to be mounted:
+ def store_dir
+ "location/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
+ end
+
+ # Provide a default URL as a default if there hasn't been a file uploaded:
+ # def default_url
+ # "/images/fallback/" + [version_name, "default.png"].compact.join('_')
+ # end
+
+ # Process files as they are uploaded:
+ # process :scale => [200, 300]
+ #
+ # def scale(width, height)
+ # # do something
+ # end
+
+ # Create different versions of your uploaded files:
+ # version :thumb do
+ # process :scale => [50, 50]
+ # end
+
+ version :thumb do
+ process :resize_to_fill => [150, 120]
+ end
+
+ # Add a white list of extensions which are allowed to be uploaded.
+ # For images you might use something like this:
+ # def extension_white_list
+ # %w(jpg jpeg gif png)
+ # end
+
+ # Override the filename of the uploaded files:
+ # def filename
+ # "something.jpg" if original_filename
+ # end
+
+# def manipulate!
+# raise current_path.inspect
+# image = ::MiniMagick::Image.open(current_path)
+# image = yield(image)
+# image.write(current_path)
+# ::MiniMagick::Image.open(current_path)
+# rescue ::MiniMagick::Error, ::MiniMagick::Invalid => e
+# raise CarrierWave::ProcessingError.new("Failed to manipulate with MiniMagick, maybe it is not an image? Original Error: #{e}")
+# end
+
+end
+
diff --git a/app/views/.gitkeep b/app/views/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/app/views/panel/location/back_end/location_categories/_category.html.erb b/app/views/panel/location/back_end/location_categories/_category.html.erb
new file mode 100644
index 0000000..096260c
--- /dev/null
+++ b/app/views/panel/location/back_end/location_categories/_category.html.erb
@@ -0,0 +1,21 @@
+
+ <% @site_valid_locales.each_with_index do |locale, i| %>
+
+ <%= category.title_translations[locale] %>
+ <% if i == 0 %>
+
+ <%= form_for :category, url: nil, html:{:id=>"color"}, remote: true do |f| %>
+
+ <% end %>
+
+
+
+
+
\ No newline at end of file
diff --git a/app/views/panel/location/back_end/location_categories/list.html.erb b/app/views/panel/location/back_end/location_categories/list.html.erb
new file mode 100644
index 0000000..38d4571
--- /dev/null
+++ b/app/views/panel/location/back_end/location_categories/list.html.erb
@@ -0,0 +1,21 @@
+
+
+
+ <% @site_valid_locales.each_with_index do |locale, i| %>
+
\ No newline at end of file
diff --git a/app/views/panel/location/back_end/locations/_form.html.erb b/app/views/panel/location/back_end/locations/_form.html.erb
new file mode 100644
index 0000000..41a6560
--- /dev/null
+++ b/app/views/panel/location/back_end/locations/_form.html.erb
@@ -0,0 +1,48 @@
+ <% @location_info.errors.full_messages.each do |msg| %>
+