From: Tom Hughes Date: Mon, 19 Apr 2010 20:57:13 +0000 (+0100) Subject: Merge branch 'master' into copyright X-Git-Tag: live~6384^2~4^2~1 X-Git-Url: https://git.openstreetmap.org/rails.git/commitdiff_plain/7a5ac0394dfcd5d1cd5a8b659563ddd7afc33332?hp=bd869a82c71870838ef95f21498c9340e80abbca Merge branch 'master' into copyright --- diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..74094e8b3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +log +tmp diff --git a/app/controllers/browse_controller.rb b/app/controllers/browse_controller.rb index a77b0f94a..a511d67d3 100644 --- a/app/controllers/browse_controller.rb +++ b/app/controllers/browse_controller.rb @@ -86,11 +86,11 @@ private end rescue ActionView::TemplateError => ex if ex.original_exception.is_a?(Timeout::Error) - render :action => "timeout", :status => :request_timeout + render :action => "timeout" else raise end rescue Timeout::Error - render :action => "timeout", :status => :request_timeout + render :action => "timeout" end end diff --git a/app/models/user.rb b/app/models/user.rb index 0b8b512ee..f02c9a5cd 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -85,7 +85,7 @@ class User < ActiveRecord::Base end def languages - attribute_present?(:languages) ? read_attribute(:languages).split(",") : [] + attribute_present?(:languages) ? read_attribute(:languages).split(/ *, */) : [] end def languages=(languages) diff --git a/app/views/geocoder/error.html.erb b/app/views/geocoder/error.html.erb index e2ce07b6e..c4b6f8964 100644 --- a/app/views/geocoder/error.html.erb +++ b/app/views/geocoder/error.html.erb @@ -1 +1 @@ -

<%= @error %>

+

<%= h(@error) %>

diff --git a/app/views/site/_key.html.erb b/app/views/site/_key.html.erb index 22261900d..e990071c8 100644 --- a/app/views/site/_key.html.erb +++ b/app/views/site/_key.html.erb @@ -17,7 +17,7 @@ } function updateMapKey() { - var layer = map.baseLayer.name.toLowerCase().replace(/\s+/g, "_"); + var layer = map.baseLayer.keyid; var zoom = map.getZoom(); <%= remote_function :update => "sidebar_content", diff --git a/config/.gitignore b/config/.gitignore new file mode 100644 index 000000000..b5649dd03 --- /dev/null +++ b/config/.gitignore @@ -0,0 +1 @@ +database.yml diff --git a/config/environment.rb b/config/environment.rb index c8c874a3c..539af83b2 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -54,9 +54,6 @@ Rails::Initializer.run do |config| config.gem 'httpclient' config.gem 'SystemTimer', :version => '>= 1.1.3', :lib => 'system_timer' config.gem 'sanitize' - # if Rails.env == "development" - config.gem 'timecop' - # end # Only load the plugins named here, in the order given. By default, all plugins # in vendor/plugins are loaded in alphabetical order. diff --git a/config/environments/test.rb b/config/environments/test.rb index 58850a797..a26b6ef92 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -20,3 +20,6 @@ config.action_controller.allow_forgery_protection = false # The :test delivery method accumulates sent emails in the # ActionMailer::Base.deliveries array. config.action_mailer.delivery_method = :test + +# Load timecop to help with testing time dependent code +config.gem 'timecop' diff --git a/config/locales/ar.yml b/config/locales/ar.yml index fb3742c6c..8a0125175 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -3,6 +3,7 @@ # Export driver: syck # Author: Aude # Author: Bassem JARKAS +# Author: Grille chompa # Author: Mutarjem horr # Author: OsamaK ar: @@ -859,6 +860,8 @@ ar: water_point: نقطة ماء شفة waterfall: شلال weir: هدار (سدّ منخفض) + html: + dir: rtl javascripts: map: base: diff --git a/config/locales/ca.yml b/config/locales/ca.yml index bac306aae..d2c1f31b3 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -86,6 +86,7 @@ ca: title: Conjunt de canvis changeset_details: belongs_to: "Pertany a:" + bounding_box: "Caixa contenidora:" box: caixa closed_at: "Tancat el:" created_at: "Creat el:" @@ -480,6 +481,7 @@ ca: cliff: Cingle coastline: Litoral crater: Cràter + fell: Forest fjord: Fiord geyser: Guèiser glacier: Glacera @@ -491,11 +493,13 @@ ca: peak: Pic point: Punt reef: Escull + ridge: Cresta river: Riu rock: Roca scree: Pedregar shoal: Banc spring: Deu + strait: Estret tree: Arbre valley: Vall volcano: Volcà @@ -509,6 +513,7 @@ ca: country: País county: Comtat farm: Granja + hamlet: Aldea house: Casa houses: Cases island: Illa @@ -569,6 +574,7 @@ ca: viewpoint: Mirador zoo: Zoològic waterway: + canal: Canal ditch: Séquia mooring: Amarradors rapids: Ràpids @@ -863,6 +869,7 @@ ca: ago: (fa {{time_in_words_ago}}) confirm: Confirmeu create_block: boca aquest usuari + created from: "Creat a partir de:" deactivate_user: desactiva aquest usuari delete_user: Suprimeix aquest usuari description: Descripció diff --git a/config/locales/de.yml b/config/locales/de.yml index ebab1a86d..7cbdb2c71 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1115,7 +1115,7 @@ de: no_apps: Wenn du mit einer Anwendung gerne den {{oauth}}-Standard verwenden würdest, musst du sie hier registrieren. register_new: Anwendung registrieren registered_apps: "Du hast die folgenden Client-Anwendungen registriert:" - revoke: Wiederrufen! + revoke: Widerrufen! title: Meine OAuth Details new: submit: Registrieren diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 10347892e..cb579699d 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -123,7 +123,7 @@ fi: node: Näytä piste suurella kartalla relation: Näytä relaatio suurella kartalla way: Näytä polku suurella kartalla - loading: Lataa tietoja... + loading: Ladataan… node: download: "{{download_xml_link}}, {{view_history_link}} tai {{edit_link}}" download_xml: Lataa XML diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 44233bd24..5e75c380d 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -166,7 +166,7 @@ gl: load_data: Cargar os datos loaded_an_area_with_num_features: Cargou unha zona que contén [[num_features]] funcionalidades. Pode que algúns navegadores teñan problemas para amosar correctamente esta cantidade de datos. Xeralmente, os navegadores traballan mellor amosando menos de 100 funcionalidades á vez. Utilizar máis pode provocar que o navegador vaia lento ou non responda. Se está seguro de que quere amosar estes datos, pode facelo premendo no seguinte botón. loading: Cargando... - manually_select: Escolla manualmente unha zona distinta + manually_select: Escoller manualmente unha zona distinta object_list: api: Obter esta área desde o API back: Mostrar a lista de obxectos @@ -264,6 +264,7 @@ gl: save_button: Gardar export: start: + add_marker: Engadir un marcador ao mapa area_to_export: Zona a exportar export_button: Exportar format: Formato @@ -275,19 +276,32 @@ gl: mapnik_image: Imaxe de Mapnik max: máx. options: Opcións + osm_xml_data: Datos XML do OpenStreetMap scale: Escala + too_large: + body: Esta zona é grande de máis para ser exportada como datos XML do OpenStreetMap. Amplíe a zona ou escolla unha menor. + heading: Zona demasiado grande zoom: Zoom start_rjs: + add_marker: Engadir un marcador ao mapa + change_marker: Cambiar a posición do marcador + click_add_marker: Prema sobre o mapa para engadir un marcador + drag_a_box: Arrastre unha caixa sobre o mapa para escoller unha zona export: Exportar + manually_select: Escoller manualmente unha zona distinta + view_larger_map: Ver un mapa máis grande geocoder: description: title: geonames: Localización desde GeoNames osm_namefinder: "{{types}} desde OpenStreetMap Namefinder" + osm_nominatim: Localización desde OpenStreetMap Nominatim types: cities: Cidades places: Lugares towns: Municipios + description_osm_namefinder: + prefix: "{{distance}} ao {{direction}} de {{type}}" direction: east: leste north: norte @@ -297,6 +311,10 @@ gl: south_east: sueste south_west: suroeste west: oeste + distance: + one: arredor de 1km + other: arredor de {{count}}km + zero: menos de 1km results: more_results: Máis resultados no_results: Non se atopou ningún resultado @@ -306,8 +324,119 @@ gl: geonames: Resultados desde GeoNames latlon: Resultados internos osm_namefinder: Resultados desde OpenStreetMap Namefinder + osm_nominatim: Resultados desde OpenStreetMap Nominatim uk_postcode: Resultados desde NPEMap / FreeThe Postcode us_postcode: Resultados desde Geocoder.us + search_osm_namefinder: + suffix_parent: "{{suffix}} ({{parentdistance}} {{parentdirection}} de {{parentname}})" + suffix_place: ", {{distance}} ao {{direction}} de {{placename}}" + search_osm_nominatim: + prefix: + highway: + emergency_access_point: Punto de acceso de emerxencia + footway: Carreiro + motorway_junction: Cruce de autovías + primary_link: Estrada principal + secondary_link: Estrada secundaria + leisure: + beach_resort: Balneario + common: Terreo común + fishing: Área de pesca + garden: Xardín + golf_course: Campo de golf + ice_rink: Pista de patinaxe sobre xeo + marina: Porto deportivo + miniature_golf: Minigolf + nature_reserve: Reserva natural + park: Parque + pitch: Cancha deportiva + playground: Patio de recreo + recreation_ground: Área recreativa + slipway: Varadoiro + sports_centre: Centro deportivo + stadium: Estadio + swimming_pool: Piscina + track: Pista de carreiras + water_park: Parque acuático + natural: + bay: Baía + beach: Praia + cape: Cabo + cave_entrance: Entrada de cova + channel: Canal + cliff: Cantil + coastline: Litoral + crater: Cráter + feature: Elemento + fell: Brañal + fjord: Fiorde + glacier: Glaciar + hill: Outeiro + island: Illa + land: Terra + marsh: Marisma + moor: Páramo + mud: Lama + peak: Pico + point: Punto + reef: Arrecife + river: Río + rock: Rocha + scree: Pedregal + shoal: Cardume + spring: Primavera + strait: Estreito + tree: Árbore + valley: Val + volcano: Volcán + water: Auga + wetland: Pantano + wetlands: Pantano + wood: Bosque + place: + airport: Aeroporto + city: Cidade + country: País + county: Condado + farm: Granxa + hamlet: Aldea + house: Casa + houses: Casas + island: Illa + islet: Illote + locality: Localidade + moor: Páramo + municipality: Municipio + postcode: Código postal + region: Rexión + sea: Mar + state: Estado/Provincia + subdivision: Subdivisión + suburb: Barrio + town: Cidade + unincorporated_area: Área non incorporada + village: Vila + tourism: + alpine_hut: Cabana alpina + artwork: Obra de arte + attraction: Atracción + bed_and_breakfast: Cama e almorzo + cabin: Cabana + camp_site: Campamento + caravan_site: Sitio de caravanas + chalet: Chalé + guest_house: Albergue + hostel: Hostal + hotel: Hotel + information: Información + lean_to: Caseta + motel: Motel + museum: Museo + picnic_site: Sitio de pícnic + theme_park: Parque temático + valley: Val + viewpoint: Miradoiro + zoo: Zoolóxico layouts: edit: Editar export: Exportar @@ -341,9 +470,16 @@ gl: subject: Asunto sent_message_summary: delete_button: Borrar + notifier: + email_confirm: + subject: "[OpenStreetMap] Confirme o seu enderezo de correo electrónico" oauth_clients: edit: submit: Editar + title: Editar a súa aplicación + index: + application: Nome da aplicación + register_new: Rexistrar a súa aplicación time: formats: friendly: "%e %B %Y ás %H:%M" @@ -359,6 +495,7 @@ gl: save_button: Gardar os cambios start_coord: "Coordenada de inicio:" tags: "Etiquetas:" + tags_help: separadas por comas uploaded_at: "Cargado o:" visibility: "Visibilidade:" visibility_help: que significa isto? @@ -382,6 +519,7 @@ gl: description: Descrición help: Axuda tags: Etiquetas + tags_help: separadas por comas upload_button: Cargar visibility: Visibilidade visibility_help: que significa isto? @@ -409,6 +547,8 @@ gl: current email address: "Enderezo de correo electrónico actual:" delete image: Eliminar a imaxe actual email never displayed publicly: (nunca mostrado publicamente) + flash update success: Información de usuario actualizada correctamente. + flash update success confirm needed: Información de usuario actualizada correctamente. Busque no seu correo electrónico unha mensaxe para confirmar o seu novo enderezo. home location: "Lugar de orixe:" image: "Imaxe:" keep image: Manter a imaxe actual @@ -431,48 +571,70 @@ gl: return to profile: Voltar ao perfil save changes button: Gardar os cambios title: Editar a conta + update home location on click: Quere actualizar o domicilio ao premer sobre o mapa? confirm: button: Confirmar + failure: Xa se confirmou unha conta de usuario con este pase. heading: Confirmar unha conta de usuario press confirm button: Prema sobre o botón de confirmación que aparece a continuación para activar a súa conta. + success: Confirmouse a súa conta. Grazas por se rexistrar! confirm_email: button: Confirmar + failure: Xa se confirmou un enderezo de correo electrónico con este pase. + heading: Confirmar o cambio do enderezo de correo electrónico press confirm button: Prema sobre o botón de confirmación que aparece a continuación para confirmar o seu novo enderezo de correo electrónico. + success: Confirmouse o seu enderezo de correo electrónico. Grazas por se rexistrar! filter: not_an_administrator: Ten que ser administrador para poder levar a cabo esta acción. login: + create_account: cree unha conta email or username: "Enderezo de correo electrónico ou nome de usuario:" lost password link: Perdeu o seu contrasinal? password: "Contrasinal:" + please login: Identifíquese ou {{create_user_link}}. remember: "Lembrádeme:" lost_password: email address: "Enderezo de correo electrónico:" heading: Esqueceu o contrasinal? new password button: Restablecer o contrasinal + notice email cannot find: Non se puido atopar o enderezo de correo electrónico. + notice email on way: Por desgraza perdeuno, pero hai en camiño unha mensaxe de correo electrónico coa que o poderá restablecer axiña. title: Contrasinal perdido make_friend: already_a_friend: Xa é amigo de {{name}}. + failed: Houbo un erro ao engadir a {{name}} como amigo. success: "{{name}} xa é o seu amigo." new: confirm email address: Confirmar o enderezo de correo electrónico confirm password: "Confirmar o contrasinal:" display name: "Nome mostrado:" + display name description: O seu nome de usuario mostrado publicamente. Pode cambialo máis tarde nas preferencias. email address: "Enderezo de correo electrónico:" + fill_form: Encha o formulario e axiña recibirá un correo electrónico coas instrucións para activar a súa conta. heading: Crear unha conta de usuario + no_auto_account_create: Por desgraza, arestora non podemos crear automaticamente unha conta para vostede. password: "Contrasinal:" title: Crear unha conta no_such_user: + body: Non existe ningún usuario co nome "{{user}}". Comprobe a ortografía ou que a ligazón que seguiu estea ben. + heading: O usuario {{user}} non existe title: Non existe tal usuario popup: friend: Amigo your location: A súa localización + remove_friend: + not_a_friend: "{{name}} non é un dos seus amigos." + success: "{{name}} foi eliminado dos seus amigos." reset_password: confirm password: "Confirmar o contrasinal:" flash changed: Cambiouse o seu contrasinal. + flash token bad: Non se atopou o pase. Quizais debería comprobar o enderezo URL. heading: Restablecer o contrasinal de {{user}} password: "Contrasinal:" reset: Restablecer o contrasinal title: Restablecer o contrasinal + set_home: + flash success: Gardouse o domicilio view: activate_user: activar este usuario add as friend: engadir como amigo @@ -496,6 +658,15 @@ gl: no friends: Aínda non engadiu ningún amigo. oauth settings: axustes OAuth remove as friend: eliminar como amigo + role: + administrator: Este usuario é administrador + grant: + administrator: Conceder o acceso de administrador + moderator: Conceder o acceso de moderador + moderator: Este usuario é moderador + revoke: + administrator: Revogar o acceso de administrador + moderator: Revogar o acceso de moderador send message: enviar unha mensaxe settings_link_text: axustes unhide_user: descubrir este usuario diff --git a/config/locales/it.yml b/config/locales/it.yml index 37fecd410..3af1e40e8 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -1007,7 +1007,7 @@ it: login: account not active: Spiacenti, il tuo profilo non è ancora attivo.
Clicca sul collegamento presente nell'email di conferma per attivare il tuo profilo. auth failure: Spiacenti, non si può accedere con questi dettagli. - create_account: crea un profilo + create_account: crealo ora email or username: "Indirizzo email o nome utente:" heading: Entra login_button: Entra diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 82a40ace1..d14d38ea4 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -863,7 +863,6 @@ nl: history_tooltip: Bewerkingen voor dit gebied bekijken history_zoom_alert: U moet inzoomen om de kaart te bewerkingsgeschiedenis te bekijken layouts: - copyright: Auteursrechten & licentie donate: Ondersteun OpenStreetMap door te {{link}} aan het Hardware Upgrade-fonds. donate_link_text: doneren edit: Bewerken diff --git a/config/locales/no.yml b/config/locales/no.yml index 64dd40125..8c127eea1 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -920,6 +920,7 @@ hopefully_you_1: Noen (forhÃ¥pentligvis deg) ønsker Ã¥ endre e-postadressen for hopefully_you_2: "{{server_url}} til {{new_address}}." friend_notification: + befriend_them: Du kan ogsÃ¥ legge dem til som venn pÃ¥ {{befriendurl}}. had_added_you: "{{user}} har lagt deg til som venn pÃ¥ OpenStreetMap." see_their_profile: Du kan se profilen deres pÃ¥ {{userurl}}. subject: "[OpenStreetMap] {{user}} la deg til som en venn" @@ -959,6 +960,7 @@ signup_confirm_html: click_the_link: Hvis dette er deg, sÃ¥ er du velkommen! Klikke lenka nedenfor for Ã¥ bekrefte kontoen og les videre for mer informasjon om OpenStreetMap current_user: En liste over nÃ¥værende brukere i kategorier, basert pÃ¥ hvor i verden de er, er tilgjengelig fra Category:Users_by_geographical_region. + get_reading: Start Ã¥ lese om OpenStreetMap pÃ¥ wikien, fÃ¥ med deg de siste nyhetene via OpenStreetMap-bloggen eller Twitter. Eller bla gjennom OpenStreetMaps grunnlegger Steve Coasts OpenGeoData-blogg for hele historien til prosjektet, som ogsÃ¥ har engelske podkaster du kan lytte til. greeting: Hei der! hopefully_you: Noen (forhÃ¥pentligvis deg) ønsker Ã¥ opprette en konto pÃ¥ introductory_video: Du kan se en {{introductory_video_link}}. @@ -1046,6 +1048,7 @@ site: edit: anon_edits_link_text: Finn ut hvorfor dette er tilfellet. + flash_player_required: Du trenger en Flash-spiller for Ã¥ kunne bruke Potlatch, Flasheditoren for OpenStreetMap. Du kan laste ned Flash Player fra Adobe.com. Flere andre alternativ er ogsÃ¥ tilgjengelig for redigering av OpenStreetMap. not_public: Du har ikke satt dine redigeringer til Ã¥ være offentlige. not_public_description: Du kan ikke lenger redigere kartet om du ikke gjør det. Du kan gjøre dine redigeringer offentlige fra din {{user_page}}. potlatch_unsaved_changes: Du har ulagrede endringer. (For Ã¥ lagre i Potlatch, mÃ¥ du fjerne markeringen av gjeldende vei eller punkt hvis du redigerer i live-modues eller klikke lagre hvis du har en lagreknapp.) @@ -1414,6 +1417,7 @@ back: Vis alle blokkeringer heading: Endrer blokkering av {{name}} needs_view: MÃ¥ brukeren logge inn før denne blokkeringen blir fjernet? + period: Hvor lenge, fra nÃ¥, brukeren vil bli blokkert fra API-en. reason: Årsaken til hvorfor {{name}} blir blokkert. Vennligst vær sÃ¥ rolig og rimelig som mulig og oppgi sÃ¥ mange detaljer du kan om situasjonen. Husk at ikke alle brukere forstÃ¥r felleskapssjargongen sÃ¥ prøv Ã¥ bruke lekmannsuttrykk. show: Vis denne blokkeringen submit: Oppdater blokkering @@ -1437,6 +1441,7 @@ back: Vis alle blokkeringer heading: Oppretter blokkering av {{name}} needs_view: Brukeren mÃ¥ logge inn før denne blokkeringen blir fjernet. + period: Hvor lenge, fra nÃ¥, brukeren vil bli blokkert fra API-en. reason: Årsaken til at {{name}} blir blokkert. Vennligst vær sÃ¥ rolig og rimelig som mulig og gi sÃ¥ mange detaljer du kan om situasjonen, og husk pÃ¥ at meldingen blir synlig for offentligheten. Husk pÃ¥ at ikke alle brukere forstÃ¥r fellesskapssjargongen sÃ¥ prøv Ã¥ bruke lekmannsuttrykk. submit: Opprett blokkering title: Oppretter blokkering av {{name}} @@ -1444,6 +1449,7 @@ tried_waiting: Jeg har gitt brukeren rimelig med tid til Ã¥ svare pÃ¥ disse kommunikasjonene. not_found: back: Tilbake til indeksen + sorry: Beklager, brukerblokkeringen med ID {{id}} ble ikke funnet. partial: confirm: Er du sikker? creator_name: Opprettet av diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 5a0be1c3c..7a878ff43 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -246,7 +246,7 @@ sl: reply_link: Odgovori na ta vnos edit: body: "Besedilo:" - language: "Jezki:" + language: "Jezik:" latitude: "Z. Å¡irina:" location: "Lokacija:" longitude: "Z. dolžina:" diff --git a/config/locales/vi.yml b/config/locales/vi.yml index d6f3f87a6..f777fdef7 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -424,6 +424,7 @@ vi: bicycle_rental: Chỗ Mướn Xe đạp cafe: Quán Cà phê car_rental: Chỗ Mướn Xe + car_sharing: Chia sẻ Xe cộ car_wash: Tiệm Rá»­a Xe casino: Sòng bạc cinema: Rạp phim @@ -478,11 +479,13 @@ vi: university: Trường Đại học waste_basket: Thùng rác wifi: Điểm Truy cập Không dây + youth_centre: Trung tâm Thanh niên boundary: administrative: Biên giới Hành chính building: bunker: Boong ke church: Nhà thờ + city_hall: Trụ sở Thành phố commercial: Tòa nhà ThÆ°Æ¡ng mại dormitory: Ký túc xá entrance: Cá»­a vào @@ -638,11 +641,13 @@ vi: monorail: Đường Một Ray station: Nhà ga subway: Trạm Xe điện Ngầm + subway_entrance: Cá»­a vào Nhà ga Xe điện ngầm tram: Đường Xe điện shop: bakery: Tiệm Bánh bicycle: Tiệm Xe đạp books: Tiệm Sách + car: Tiệm Xe hÆ¡i car_dealer: Cá»­a hàng Xe hÆ¡i car_repair: Tiệm Sá»­a Xe carpet: Tiệm Thảm @@ -655,6 +660,7 @@ vi: fashion: Tiệm Thời trang fish: Tiệm Cá florist: Tiệm Hoa + food: Tiệm Thá»±c phẩm grocery: Tiệm Tạp phẩm hairdresser: Tiệm Làm tóc insurance: Bảo hiểm @@ -690,6 +696,7 @@ vi: waterway: canal: Kênh dam: Đập + rapids: Thác ghềnh river: Sông riverbank: Bờ sông stream: Dòng suối @@ -793,10 +800,14 @@ vi: send_message_to: Gá»­i thÆ° mới cho {{name}} subject: Tiêu đề title: Gá»­i thÆ° + no_such_message: + body: Rất tiếc, không có thÆ° nào với ID đó. + heading: ThÆ° không tồn tại + title: ThÆ° không tồn tại no_such_user: - body: Rất tiếc, không có người dùng hoặc thÆ° với tên hoặc ID đó - heading: Người dùng hoặc thÆ° không tồn tại - title: Người dùng hoặc thÆ° không tồn tại + body: Rất tiếc, không có người dùng với tên đó. + heading: Người dùng không tồn tại + title: Người dùng không tồn tại outbox: date: Ngày inbox: thÆ° đến @@ -840,8 +851,9 @@ vi: hopefully_you_1: Ai (chắc bạn) muốn đổi địa chỉ thÆ° điện tá»­ bên hopefully_you_2: "{{server_url}} thành {{new_address}}." friend_notification: + befriend_them: CÅ©ng có thể thêm họ vào danh sách người bạn tại {{befriendurl}}. had_added_you: "{{user}} đã thêm bạn vào danh sách bạn tại OpenStreetMap." - see_their_profile: Có thể xem trang cá nhân của họ tại {{userurl}} và cÅ©ng thêm họ vào danh sách của bạn tùy ý. + see_their_profile: Có thể xem trang cá nhân của họ tại {{userurl}}. subject: "[OpenStreetMap] {{user}} đã thêm bạn là người bạn" gpx_notification: and_no_tags: và không có thẻ @@ -1070,6 +1082,9 @@ vi: sidebar: close: Đóng search_results: Kết quả Tìm kiếm + time: + formats: + friendly: "%e tháng %m năm %Y lúc %H:%M" trace: create: trace_uploaded: Tập tin GPX của bạn đã được tải lên và đang chờ được chèn vào cÆ¡ sở dữ liệu. Thường chỉ cần chờ đợi trong vòng ná»­a tiếng, và bạn sẽ nhận thÆ° điện tá»­ lúc khi nó xong. @@ -1179,6 +1194,7 @@ vi: flash update success confirm needed: Đã cập nhật thông tin cá nhân thành công. Kiểm tra thÆ° điện tá»­ xác nhận địa chỉ thÆ° điện tá»­ mới. home location: "Vị trí Nhà:" image: "Hình:" + image size hint: (hình vuông ít nhất 100×100 điểm ảnh là tốt nhất) keep image: Giữ hình hiện dùng latitude: "VÄ© độ:" longitude: "Kinh độ:" @@ -1230,7 +1246,12 @@ vi: lost password link: Quên mất Mật khẩu? password: "Mật khẩu:" please login: Xin hãy đăng nhập hoặc {{create_user_link}}. + remember: "Nhớ tôi:" title: Đăng nhập + logout: + heading: Đăng xuất OpenStreetMap + logout_button: Đăng xuất + title: Đăng xuất lost_password: email address: "Địa chỉ ThÆ° điện tá»­:" heading: Quên mất Mật khẩu? @@ -1264,6 +1285,7 @@ vi: heading: Người dùng {{user}} không tồn tại title: Người dùng không tồn tại popup: + friend: Người bạn nearby mapper: Người vẽ bản đồ ở gần your location: Vị trí của bạn remove_friend: @@ -1305,10 +1327,11 @@ vi: my edits: đóng góp của tôi my settings: tùy chọn my traces: tuyến đường của tôi - nearby users: "Người dùng ở gần:" + nearby users: Người dùng khác ở gần new diary entry: mục nhật ký mới no friends: Bạn chÆ°a thêm người bạn. - no nearby users: ChÆ°a có người dùng nào nhận là họ ở gần. + no nearby users: Không có người dùng nào nhận rằng họ ở gần. + oauth settings: Thiết lập OAuth remove as friend: dời người bạn role: administrator: Người dùng này là quản lý viên diff --git a/config/mongrel_cluster.yml b/config/mongrel_cluster.yml index 954be24af..d6c477b9a 100644 --- a/config/mongrel_cluster.yml +++ b/config/mongrel_cluster.yml @@ -1,5 +1,5 @@ ---- -log_file: log/mongrel.log -port: 8000 -pid_file: tmp/mongrel.pid +--- +log_file: log/mongrel.log +port: 8000 +pid_file: tmp/mongrel.pid servers: 8 \ No newline at end of file diff --git a/config/potlatch/locales/ca.yml b/config/potlatch/locales/ca.yml index adf935171..eccc3e953 100644 --- a/config/potlatch/locales/ca.yml +++ b/config/potlatch/locales/ca.yml @@ -130,6 +130,7 @@ ca: option_layer_ooc_7th: "Regne Unit històric: 7th" option_layer_ooc_npe: "Regne Unit històric: NPE" option_layer_ooc_scotland: "Regne Unit històric: Escòcia" + option_layer_os_streetview: "UK: OS StreetView" option_layer_streets_haiti: "Haití: noms de carrers" option_layer_tip: Escollir el fons a mostrar option_limitways: Avisar si hi ha molta càrrega de dades @@ -193,6 +194,7 @@ ca: tags_backtolist: Torna a la llista tags_descriptions: Descripcions de '$1' tags_findatag: Troba una etiqueta + tags_findtag: Cerca una etiqueta tags_matching: Etiquetes populars que coincideixen amb '$1' tags_typesearchterm: "Introdueixi una paraula per a buscar:" tip_addrelation: Afegir a una relació diff --git a/config/potlatch/locales/da.yml b/config/potlatch/locales/da.yml index d7ba069cf..1fa4426b1 100644 --- a/config/potlatch/locales/da.yml +++ b/config/potlatch/locales/da.yml @@ -2,11 +2,13 @@ # Exported from translatewiki.net # Export driver: syck # Author: Ebbe +# Author: Winbladh da: a_poi: $1 et POI a_way: $1 en vej action_addpoint: tilføjer et punkt til enden af en vej action_cancelchanges: afbryder ændringer af + action_createparallel: skaber parallelle veje action_createpoi: lave et POI (interessant punkt) action_deletepoint: sletter et punkt action_insertnode: tilføj et punkt pÃ¥ vejen @@ -17,36 +19,133 @@ da: action_pointtags: sætter tags pÃ¥ et punkt action_poitags: sætter tags pÃ¥ et POI (interessant punkt) action_reverseway: vend retningen pÃ¥ en vej + action_revertway: returnere en vej action_splitway: del en vej action_waytags: sætter tags pÃ¥ en vej + advanced: Avanceret + advanced_close: Luk Changeset + advanced_maximise: Maksimer vinduet + advanced_minimise: Minimer vindue + advanced_parallel: Parallel vej + advanced_undelete: Genopret + advice_deletingpoi: Sletning af POI (Z for at fortryde) + advice_deletingway: Sletter vej (Z for at fortryde) + advice_revertingway: Vender tilbage til sidst gemte vej (Z for at fortryde) + advice_toolong: For lang for lÃ¥se op - venligst opdel i kortere veje + advice_uploadempty: Intet at uploade + advice_uploadsuccess: Alle data uploadet succesfuldt + advice_waydragged: Way flyttet (Z for at fortryde) cancel: Afbryd + closechangeset: Lukker Changeset + conflict_overwrite: Overskriv deres version + conflict_poichanged: Siden du begyndte at redigere, har en anden ændret punkt $ 1 $ 2. + conflict_relchanged: Siden du begyndte at redigere, har en anden ændret relation $1 $2. + conflict_visitway: Klik pÃ¥ 'Ok' for at vise vejen. + conflict_waychanged: Siden du begyndte at redigere, har en anden ændret vej $1 $2. createrelation: Lav en ny relation + custom: "Custom:" delete: Slet deleting: sletter + editinglive: Live redigering + editingoffline: Redigering offline emailauthor: \n\nVenligst send en e-mail (pÃ¥ engelsk) til richard\@systemeD.net med en fejlrapport, og forklar hvad du gjorde da det skete. error_connectionfailed: Beklager - forbindelsen til OpenStreetMap-serveren fejlede, eventuelle nye ændringer er ikke blevet gemt. \n\nVil du prøve igen? error_nopoi: Fandt ikke POI-et, sÃ¥ det er ikke muligt at fortryde. (MÃ¥ske er den ikke pÃ¥ skærmen længere?) error_nosharedpoint: Vejene $1 og $2 deler ikke noget punkt længere, sÃ¥ det er ikke muligt at fortryde delingen. error_noway: Fandt ikke vejen $1 sÃ¥ det er ikke muligt at fortryde. (MÃ¥ske er den ikke pÃ¥ skærmen længere?) + error_readfailed: Beklager - OpenStreetMap-serveren reagere ikke.\n\nVil du prøve igen? existingrelation: Føj til en eksisterende relation findrelation: Find en relation som indeholder gpxpleasewait: Vent venligst mens GPX sporet behandles. + heading_introduction: Indledning + heading_surveying: Undersøge help: Hjælp hint_drawmode: klik for at tilføje punkt\ndobbeltklik eller enter\nfor at afslutte linie hint_loading: henter veje hint_overendpoint: over endepunkt\nklik for at forbinde\nshift+klik for at slÃ¥ sammen til en hint_overpoint: over punkt\nklik for at forbinde hint_pointselected: punkt valgt\n(shift+klik punktet for at\nstarte en ny linie) + hint_saving: gemmer data + inspector: Inspektor + inspector_duplicate: Duplikat af + inspector_in_ways: I veje + inspector_locked: LÃ¥st + inspector_not_in_any_ways: Ikke pÃ¥ nogen veje (POI) + inspector_unsaved: Ikke gemt + inspector_uploading: (Uploading) + inspector_way_connects_to_principal: Forbinder til $1 $2 og $3 andre $4 + inspector_way_nodes_closed: $1 noder (lukkede) + login_pwd: "Password:" + login_retry: Dit login blev ikke genkendt. Prøv venligst igen. + login_title: Kunne ikke logge ind + login_uid: "Brugernavn:" + mail: Post + newchangeset: "Prøv venligst igen: Potlatch vil starte et nyt changeset.." + "no": Nej + nobackground: Ingen baggrund norelations: Ingen relationer i omrÃ¥det pÃ¥ skærmen + offset_choose: Vælg offset (m) + offset_dual: Dobbelt vej (D2) + ok: Ok + openchangeset: Åbner Changeset option_custompointers: Brug pen- og hÃ¥ndvisere option_fadebackground: Fjern baggrund + option_layer_cycle_map: OSM - cykel kort + option_layer_maplint: OSM - Maplint (fejl) + option_layer_nearmap: "Australien: NearMap" + option_layer_ooc_25k: "UK historisk: 1:25 k" + option_layer_os_streetview: "UK: OS StreetView" + option_layer_streets_haiti: "Haiti: gadenavne" + option_layer_tip: Vælg baggrunden til visning + option_limitways: Advar ved loading af masser af data + option_microblog_id: "Microblog navn:" + option_microblog_pwd: "Microblog password:" + option_photo: "Foto KML:" + option_thinareas: Brug tyndere linjer for omrÃ¥der option_thinlines: Brug tynde linier uanset skalering + option_tiger: Fremhæv uændret TIGER + option_warnings: Vis flydende advarsler point: Punkt + preset_icon_airport: Lufthavn + preset_icon_bar: Bar + preset_icon_cafe: Café + preset_icon_cinema: Biograf + preset_icon_disaster: Haiti bygning + preset_icon_fast_food: Fast food + preset_icon_ferry_terminal: Færge + preset_icon_fire_station: Brandstation + preset_icon_hospital: Hospital + preset_icon_hotel: Hotel + preset_icon_museum: Museum + preset_icon_parking: Parkering + preset_icon_place_of_worship: Sted for tilbedelse + preset_icon_police: Politistation + preset_icon_post_box: Postkasse + preset_icon_recycling: Genbrug + preset_icon_school: Skole + preset_icon_station: Togstation + preset_icon_taxi: Taxaholdeplads + preset_icon_telephone: Telefon + preset_tip: Vælg fra menuen af preset tags, der beskriver $1 prompt_addtorelation: Tilføj $1 til en relation + prompt_changesetcomment: "Indtast en beskrivelse af dine ændringer:" + prompt_createparallel: Opret parallel vej + prompt_editlive: Edit live + prompt_helpavailable: Ny bruger? Kig nederst til venstre for at fÃ¥ hjælp. + prompt_launch: Start ekstern URL + prompt_manyways: Dette omrÃ¥de er meget detaljerede, og vil tage lang tid at hente. Foretrækker du at zoome ind? prompt_revertversion: "Ret tilbage til tidligere lagret version:" - prompt_taggedpoints: Nogle af punktene pÃ¥ denne vej har tags. Vil du virkelig slette? + prompt_savechanges: Gem ændringer + prompt_taggedpoints: Nogle af punktene pÃ¥ denne vej har tags eller er i en relation. Vil du virkelig slette? prompt_track: Overfør dine GPS-spor til (lÃ¥ste) veje for redigering. prompt_welcome: Velkommen til OpenStreetMap! + retry: Prøv igen + revert: Fortryd + save: Gem + tags_backtolist: Tilbage til listen + tags_descriptions: Beskrivelser af '$ 1' + tags_findtag: Find tag + tags_matching: Populære tags matchende '$1' tip_addrelation: Føj til en relation tip_addtag: Tilføj et tag tip_alert: Der opstod en fejl, klik for detaljer @@ -56,10 +155,19 @@ da: tip_gps: Vis GPS spor (G) tip_noundo: Intet at fortryde tip_options: Sæt indstillinger (vælg kortbaggrund) + tip_photo: Load billeder tip_presettype: Vælg hvilke type forhÃ¥ndsinstillinger som er tilgænglige i menuen tip_repeattag: Gentag tags fra senest valgte vej (R) tip_revertversion: Vælg versionen der skal rettes tilbage til tip_selectrelation: Føj til den valgte rute tip_splitway: Del vej i valgt punkt (X) + tip_tidy: Nydeliggøre vejpunkter (T) tip_undo: Fortryd $1 (Z) + uploading: Overfører ... + uploading_deleting_ways: Sletter veje + uploading_poi: Uploading POI $1 + uploading_relation_name: Uploading relation $1, $2 + uploading_way_name: Uploading vej$ 1, $ 2 + warning: Advarsel! way: Vej + "yes": Ja diff --git a/config/potlatch/locales/de.yml b/config/potlatch/locales/de.yml index 9aa30c35c..f4e491c02 100644 --- a/config/potlatch/locales/de.yml +++ b/config/potlatch/locales/de.yml @@ -6,6 +6,7 @@ # Author: CygnusOlor # Author: Fnolz # Author: Grille chompa +# Author: LWChris # Author: Markobr # Author: Michi # Author: Pill @@ -20,7 +21,7 @@ de: action_createpoi: Einen Ort von Interesse (POI) erstellen action_deletepoint: Punkt löschen action_insertnode: Punkt auf Weg hinzufügen - action_mergeways: Zwei Wege verschmelzen + action_mergeways: Zwei Wege zusammenlegen action_movepoi: Ort von Interesse (POI) verschieben action_movepoint: Punkt verschieben action_moveway: einen Weg verschieben diff --git a/config/potlatch/locales/en.yml b/config/potlatch/locales/en.yml index 1cbd21dcf..5ef926f6a 100644 --- a/config/potlatch/locales/en.yml +++ b/config/potlatch/locales/en.yml @@ -200,6 +200,7 @@ en: retry: Retry revert: Revert save: Save + tags_findtag: Find tag tags_findatag: Find a tag tags_typesearchterm: "Type a word to look for:" tags_matching: Popular tags matching '$1' diff --git a/config/potlatch/locales/es.yml b/config/potlatch/locales/es.yml index 7e58b0e4e..e3cc0324f 100644 --- a/config/potlatch/locales/es.yml +++ b/config/potlatch/locales/es.yml @@ -132,6 +132,7 @@ es: option_layer_ooc_7th: "Histórico de UK: 7th" option_layer_ooc_npe: "Histórico de UK: NPE" option_layer_ooc_scotland: "UK histórico: Escocia" + option_layer_os_streetview: "UK: OS StreetView" option_layer_streets_haiti: "Haiti: nombres de calles" option_layer_tip: Elija el fondo a mostrar option_limitways: Lanza una advertencia al cargar gran cantidad de datos. @@ -194,7 +195,8 @@ es: save: Guardar tags_backtolist: Volver a la lista tags_descriptions: Descripciones de '$1' - tags_findatag: Encontrar una etiqueta + tags_findatag: Busca una etiqueta + tags_findtag: Busca una etiqueta tags_matching: Etiquetas populares que coinciden con '$1' tags_typesearchterm: "Introduzca una palabra para buscar:" tip_addrelation: Añadir a una relación diff --git a/config/potlatch/locales/fr.yml b/config/potlatch/locales/fr.yml index 3e91d868d..26a11cf24 100644 --- a/config/potlatch/locales/fr.yml +++ b/config/potlatch/locales/fr.yml @@ -136,6 +136,7 @@ fr: option_layer_ooc_7th: Historique UK 7e option_layer_ooc_npe: Historique UK NPE option_layer_ooc_scotland: "Royaume-Uni historique : Ecosse" + option_layer_os_streetview: "RU : OS StreetView" option_layer_streets_haiti: "Haïti: noms des rues" option_layer_tip: Choisir l'arrière-plan à afficher option_limitways: Avertir lors du chargement d'une grande quantité de données @@ -189,7 +190,7 @@ fr: prompt_microblog: Poster sur $1 ($2 restant) prompt_revertversion: "Revenir à une version sauvegardée antérieure :" prompt_savechanges: Sauvegarder les modifications - prompt_taggedpoints: Certains points de ce chemin sont associés à des mots-clé ou dans des relations. Voulez-vous vraiment les supprimer ? + prompt_taggedpoints: Certains points de ce chemin sont associés à des balises ou dans des relations. Voulez-vous vraiment les supprimer ? prompt_track: Conversion d'une trace GPS en chemin (verrouillé) pour l'édition prompt_unlock: Cliquer pour déverrouiller prompt_welcome: Bienvenue sur OpenStreetMap ! @@ -198,8 +199,9 @@ fr: save: Sauvegarder tags_backtolist: Retour à la liste tags_descriptions: Descriptions de « $1 » - tags_findatag: Rechercher un mot-clé - tags_matching: Mots-clés populaires correspondant à « $1 » + tags_findatag: Rechercher une balise + tags_findtag: Rechercher balise + tags_matching: Balises populaires correspondant à « $1 » tags_typesearchterm: "Tapez le mot à rechercher :" tip_addrelation: Ajouter à une relation tip_addtag: Ajouter une nouvelle balise diff --git a/config/potlatch/locales/gl.yml b/config/potlatch/locales/gl.yml index 293693dba..3f4d7e75e 100644 --- a/config/potlatch/locales/gl.yml +++ b/config/potlatch/locales/gl.yml @@ -129,6 +129,7 @@ gl: option_layer_ooc_7th: "Historial UK: 7º" option_layer_ooc_npe: "Historial UK: NPE" option_layer_ooc_scotland: "RU histórico: Escocia" + option_layer_os_streetview: "RU: OS StreetView" option_layer_streets_haiti: "Haití: nomes de rúas" option_layer_tip: Escolla o fondo a mostrar option_limitways: Avisar ao cargar moitos datos @@ -192,6 +193,7 @@ gl: tags_backtolist: Voltar á lista tags_descriptions: Descricións de "$1" tags_findatag: Atopar unha etiqueta + tags_findtag: Atopar unha etiqueta tags_matching: Etiquetas populares que coinciden con "$1" tags_typesearchterm: "Escriba unha palabra a procurar:" tip_addrelation: Engadir a unha relación diff --git a/config/potlatch/locales/hsb.yml b/config/potlatch/locales/hsb.yml index bdd1eb192..7b5abd14b 100644 --- a/config/potlatch/locales/hsb.yml +++ b/config/potlatch/locales/hsb.yml @@ -130,6 +130,7 @@ hsb: option_layer_ooc_7th: "Wulka Britaniska historisce: 7th" option_layer_ooc_npe: "Wulka Britaniska historisce: NPE" option_layer_ooc_scotland: "Zjednoćene kralestwo historisce: Å otiska" + option_layer_os_streetview: "Zjednoćene kralestwo: OS StreetView" option_layer_streets_haiti: "Haiti: dróhowe mjena" option_layer_tip: Pozadk wubrać option_limitways: Warnować, hdyž so jara wjele datow začituja @@ -193,6 +194,7 @@ hsb: tags_backtolist: Wróćo k lisćinje tags_descriptions: Wopisanja wot '$1' tags_findatag: Atribut namakać + tags_findtag: Atribut namakać tags_matching: Popularne atributy za '$1' tags_typesearchterm: "Zapodaj pytanski wuraz:" tip_addrelation: Relaciji přidać diff --git a/config/potlatch/locales/hu.yml b/config/potlatch/locales/hu.yml index 6b5508c13..0748666bd 100644 --- a/config/potlatch/locales/hu.yml +++ b/config/potlatch/locales/hu.yml @@ -132,6 +132,7 @@ hu: option_layer_ooc_7th: "UK történelmi: 7th" option_layer_ooc_npe: "UK történelmi: NPE" option_layer_ooc_scotland: "UK történelmi: Skócia" + option_layer_os_streetview: "UK: OS utcanézet" option_layer_streets_haiti: "Haiti: utcanevek" option_layer_tip: Válaszd ki a megjelenítendő hátteret option_limitways: Figyelmeztetés sok adat betöltése előtt @@ -195,6 +196,7 @@ hu: tags_backtolist: Vissza a listához tags_descriptions: "'$1' leírása" tags_findatag: Címke keresése + tags_findtag: Címke keresése tags_matching: "Népszerű címkék, amelyek illeszkednek a következőre: '$1'" tags_typesearchterm: "Írj be egy szót a kereséshez:" tip_addrelation: Hozzáadás kapcsolathoz diff --git a/config/potlatch/locales/ia.yml b/config/potlatch/locales/ia.yml index b36f52c5d..b5383f1fc 100644 --- a/config/potlatch/locales/ia.yml +++ b/config/potlatch/locales/ia.yml @@ -130,6 +130,7 @@ ia: option_layer_ooc_7th: "RU historic: 7me" option_layer_ooc_npe: "RU historic: NPE" option_layer_ooc_scotland: "RU historic: Scotia" + option_layer_os_streetview: "Regno Unite: OS StreetView" option_layer_streets_haiti: "Haiti: nomines de stratas" option_layer_tip: Selige le fundo a monstrar option_limitways: Advertir si multe datos debe esser cargate @@ -183,7 +184,7 @@ ia: prompt_microblog: Publicar in $1 (il remane $2) prompt_revertversion: "Reverter a un version previemente salveguardate:" prompt_savechanges: Salveguardar modificationes - prompt_taggedpoints: Alcunes del punctos in iste via es etiquettate. Realmente deler? + prompt_taggedpoints: Alcunes del punctos in iste via ha etiquettas o relationes. Realmente deler? prompt_track: Converter tracia GPS in vias prompt_unlock: Clicca pro disblocar prompt_welcome: Benvenite a OpenStreetMap! @@ -193,6 +194,7 @@ ia: tags_backtolist: Retornar al lista tags_descriptions: Descriptiones de '$1' tags_findatag: Cercar un etiquetta + tags_findtag: Cercar etiquetta tags_matching: Etiquettas popular correspondente a '$1' tags_typesearchterm: "Entra un parola a cercar:" tip_addrelation: Adder a un relation diff --git a/config/potlatch/locales/it.yml b/config/potlatch/locales/it.yml index e951b8cd5..36224e77b 100644 --- a/config/potlatch/locales/it.yml +++ b/config/potlatch/locales/it.yml @@ -108,7 +108,7 @@ it: login_pwd: "Password:" login_retry: Il tuo login non è stato riconosciuto. Riprova login_title: Impossibile fare il login - login_uid: Nome utente + login_uid: "Nome utente:" mail: Posta more: Ancora newchangeset: "Si prega di riprovare: Potlatch aprirà un nuovo gruppo di modifiche." @@ -221,4 +221,4 @@ it: uploading_way_name: Caricamento percorso $1, $2 warning: Attenzione! way: Percorso - "yes": Si + "yes": Sì diff --git a/config/potlatch/locales/mk.yml b/config/potlatch/locales/mk.yml index 75998b12f..f13289af2 100644 --- a/config/potlatch/locales/mk.yml +++ b/config/potlatch/locales/mk.yml @@ -130,6 +130,7 @@ mk: option_layer_ooc_7th: "Историски британски: 7-ми" option_layer_ooc_npe: "Историски британски: NPE" option_layer_ooc_scotland: "Историски британски: Шкотска" + option_layer_os_streetview: "Британија: OS StreetView" option_layer_streets_haiti: "Хаити: имиња на улици" option_layer_tip: Изберете позадина option_limitways: Предупреди ме кога се вчитува голем број на податоци @@ -193,6 +194,7 @@ mk: tags_backtolist: Назад кон листата tags_descriptions: Описи на „$1“ tags_findatag: Најди ознака + tags_findtag: Најди ознака tags_matching: Популарни ознаки соодветни на „$1“ tags_typesearchterm: "Внесете збор за пребарување:" tip_addrelation: Додај во релација diff --git a/config/potlatch/locales/nl.yml b/config/potlatch/locales/nl.yml index de2232591..263c121b0 100644 --- a/config/potlatch/locales/nl.yml +++ b/config/potlatch/locales/nl.yml @@ -195,6 +195,7 @@ nl: tags_backtolist: Terug naar de lijst tags_descriptions: Beschrijvingen van "$1" tags_findatag: Label zoeken + tags_findtag: Label zoeken tags_matching: Populaire labels voor "$1" tags_typesearchterm: "Zoeken naar:" tip_addrelation: Voeg toe aan een relatie diff --git a/config/potlatch/locales/no.yml b/config/potlatch/locales/no.yml index 88b1846ab..50afb5a68 100644 --- a/config/potlatch/locales/no.yml +++ b/config/potlatch/locales/no.yml @@ -147,6 +147,7 @@ preset_icon_bus_stop: Busstopp preset_icon_cafe: Kafé preset_icon_cinema: Kino + preset_icon_convenience: Nærbutikk preset_icon_disaster: Bygning i Haiti preset_icon_fast_food: Fastfood preset_icon_ferry_terminal: Ferge @@ -165,6 +166,7 @@ preset_icon_school: Skole preset_icon_station: Jernbanestasjon preset_icon_supermarket: Supermarked + preset_icon_taxi: Drosjeholdeplass preset_icon_telephone: Telefon preset_icon_theatre: Teater preset_tip: Velg fra en meny med forhÃ¥ndsdefinerte merkelapper som beskriver $1 @@ -191,6 +193,7 @@ tags_backtolist: Tilbake til liste tags_descriptions: Beskrivelser av '$1' tags_findatag: Finn et merke + tags_findtag: Finn merkelapp tags_matching: Populære merker som passer '$1̈́' tags_typesearchterm: "Skriv inn et ord Ã¥ lete etter:" tip_addrelation: Legg til i en relasjon diff --git a/config/potlatch/locales/pt-BR.yml b/config/potlatch/locales/pt-BR.yml index 26fec4b42..974e0e2da 100644 --- a/config/potlatch/locales/pt-BR.yml +++ b/config/potlatch/locales/pt-BR.yml @@ -141,6 +141,7 @@ pt-BR: option_layer_ooc_7th: "UK histórico: 7th" option_layer_ooc_npe: "UK histórico: NPE" option_layer_ooc_scotland: "UK histórico: Escócia" + option_layer_os_streetview: "UK: OS StreetView" option_layer_osmarender: OSM - Osmarender option_layer_streets_haiti: "Haiti: nomes de ruas" option_layer_tip: Escolha o fundo a mostrar @@ -206,6 +207,7 @@ pt-BR: tags_backtolist: Voltar à lista tags_descriptions: Descrições de '$1' tags_findatag: Encontrar uma etiqueta + tags_findtag: Etiquetas tags_matching: Etiquetas populares que coincidem com '$1' tags_typesearchterm: "Digite uma palavra para buscar:" tip_addrelation: Adicionar a uma relação diff --git a/config/potlatch/locales/ru.yml b/config/potlatch/locales/ru.yml index 4ad220ce2..f041f125b 100644 --- a/config/potlatch/locales/ru.yml +++ b/config/potlatch/locales/ru.yml @@ -139,6 +139,7 @@ ru: option_layer_ooc_7th: "UK historic: 7th" option_layer_ooc_npe: "UK historic: NPE" option_layer_ooc_scotland: "UK historic: Scotland" + option_layer_os_streetview: "UK: OS StreetView" option_layer_osmarender: OSM - Osmarender option_layer_streets_haiti: "Гаити: названия улиц" option_layer_tip: Выберите фон @@ -204,6 +205,7 @@ ru: tags_backtolist: Вернуться к списку tags_descriptions: Описание «$1» tags_findatag: Найти тег + tags_findtag: Найти тег tags_matching: Популярные теги, соответствующие «$1» tags_typesearchterm: "Введите слово для поиска:" tip_addrelation: Добавить отношение diff --git a/config/potlatch/locales/vi.yml b/config/potlatch/locales/vi.yml index 6dd1a3fec..3d48cca13 100644 --- a/config/potlatch/locales/vi.yml +++ b/config/potlatch/locales/vi.yml @@ -132,6 +132,7 @@ vi: option_layer_ooc_7th: "Anh lịch sá»­: lần in 7" option_layer_ooc_npe: "Anh lịch sá»­: NPE" option_layer_ooc_scotland: "Anh lịch sá»­: Scotland" + option_layer_os_streetview: "Anh: OS StreetView" option_layer_osmarender: OSM – Osmarender option_layer_streets_haiti: "Haiti: tên đường sá" option_layer_tip: Chọn nền để hiển thị @@ -186,7 +187,7 @@ vi: prompt_microblog: Đăng lên $1 (còn $2 chữ) prompt_revertversion: "Lùi lại phiên bản cÅ© hÆ¡n:" prompt_savechanges: LÆ°u các thay đổi - prompt_taggedpoints: Một số điểm trên lối này đã được gắn thẻ. Bạn có chắc muốn xóa nó? + prompt_taggedpoints: Một số điểm trên lối này đã được gắn thẻ hoặc thuộc về quan hệ. Bạn có chắc muốn xóa nó? prompt_track: Chuyển đổi tuyến đường GPS thành các lối (khóa) để sá»­a đổi. prompt_unlock: Nhấn chuột để mở khóa prompt_welcome: Hoan nghênh bạn đã đến OpenStreetMap! @@ -196,6 +197,7 @@ vi: tags_backtolist: Quay lại danh sách tags_descriptions: Miêu tả “$1” tags_findatag: Tìm kiếm thẻ + tags_findtag: Tìm kiếm thẻ tags_matching: Các thẻ phổ biến trùng hợp với “$1” tags_typesearchterm: "Nhập từ để tìm kiếm:" tip_addrelation: Xếp vào quan hệ diff --git a/lib/quad_tile/.gitignore b/lib/quad_tile/.gitignore new file mode 100644 index 000000000..978f071e9 --- /dev/null +++ b/lib/quad_tile/.gitignore @@ -0,0 +1,3 @@ +Makefile +quad_tile.o +quad_tile_so.so diff --git a/public/.gitignore b/public/.gitignore new file mode 100644 index 000000000..6296b76d2 --- /dev/null +++ b/public/.gitignore @@ -0,0 +1,2 @@ +stats +user diff --git a/public/javascripts/map.js b/public/javascripts/map.js index ab15198ab..fd45d9304 100644 --- a/public/javascripts/map.js +++ b/public/javascripts/map.js @@ -32,18 +32,21 @@ function createMap(divName, options) { }); var mapnik = new OpenLayers.Layer.OSM.Mapnik(i18n("javascripts.map.base.mapnik"), { + keyid: "mapnik", displayOutsideMaxExtent: true, wrapDateLine: true }); map.addLayer(mapnik); var osmarender = new OpenLayers.Layer.OSM.Osmarender(i18n("javascripts.map.base.osmarender"), { + keyid: "osmarender", displayOutsideMaxExtent: true, wrapDateLine: true }); map.addLayer(osmarender); var cyclemap = new OpenLayers.Layer.OSM.CycleMap(i18n("javascripts.map.base.cycle_map"), { + keyid: "cyclemap", displayOutsideMaxExtent: true, wrapDateLine: true }); diff --git a/public/lib/OpenLayers.js b/public/lib/OpenLayers.js deleted file mode 100644 index 57afe8530..000000000 --- a/public/lib/OpenLayers.js +++ /dev/null @@ -1,104 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -//// -/// This blob sucks in all the files in uncompressed form for ease of use -/// - -OpenLayers = new Object(); - -OpenLayers._scriptName = ( - typeof(_OPENLAYERS_SFL_) == "undefined" ? "lib/OpenLayers.js" - : "OpenLayers.js" ); - -OpenLayers._getScriptLocation = function () { - var scriptLocation = ""; - var SCRIPT_NAME = OpenLayers._scriptName; - - var scripts = document.getElementsByTagName('script'); - for (var i = 0; i < scripts.length; i++) { - var src = scripts[i].getAttribute('src'); - if (src) { - var index = src.lastIndexOf(SCRIPT_NAME); - // is it found, at the end of the URL? - if ((index > -1) && (index + SCRIPT_NAME.length == src.length)) { - scriptLocation = src.slice(0, -SCRIPT_NAME.length); - break; - } - } - } - return scriptLocation; -} - -/* - `_OPENLAYERS_SFL_` is a flag indicating this file is being included - in a Single File Library build of the OpenLayers Library. - - When we are *not* part of a SFL build we dynamically include the - OpenLayers library code. - - When we *are* part of a SFL build we do not dynamically include the - OpenLayers library code as it will be appended at the end of this file. -*/ -if (typeof(_OPENLAYERS_SFL_) == "undefined") { - /* - The original code appeared to use a try/catch block - to avoid polluting the global namespace, - we now use a anonymous function to achieve the same result. - */ - (function() { - var jsfiles=new Array( - "Prototype.js", - "Rico/Corner.js", - "Rico/Color.js", - "OpenLayers/Util.js", - "OpenLayers/Ajax.js", - "OpenLayers/Events.js", - "OpenLayers/Map.js", - "OpenLayers/Layer.js", - "OpenLayers/Icon.js", - "OpenLayers/Marker.js", - "OpenLayers/Popup.js", - "OpenLayers/Tile.js", - "OpenLayers/Feature.js", - "OpenLayers/Feature/WFS.js", - "OpenLayers/Tile/Image.js", - "OpenLayers/Tile/WFS.js", -// "OpenLayers/Layer/Google.js", -// "OpenLayers/Layer/VirtualEarth.js", -// "OpenLayers/Layer/Yahoo.js", - "OpenLayers/Layer/Grid.js", - "OpenLayers/Layer/KaMap.js", - "OpenLayers/Layer/Markers.js", - "OpenLayers/Layer/Text.js", - "OpenLayers/Layer/WMS.js", - "OpenLayers/Layer/WFS.js", - "OpenLayers/Layer/WMS/Untiled.js", - "OpenLayers/Popup/Anchored.js", - "OpenLayers/Popup/AnchoredBubble.js", - "OpenLayers/Control.js", - "OpenLayers/Control/MouseDefaults.js", - "OpenLayers/Control/MouseToolbar.js", - "OpenLayers/Control/KeyboardDefaults.js", - "OpenLayers/Control/PanZoom.js", - "OpenLayers/Control/PanZoomBar.js", - "OpenLayers/Control/LayerSwitcher.js" - ); // etc. - - var allScriptTags = ""; - var host = OpenLayers._getScriptLocation() + "lib/"; - - // check to see if prototype.js was already loaded - // if so, skip the first dynamic include - // - var start=1; - try { x = Prototype; } - catch (e) { start=0; } - - for (var i = start; i < jsfiles.length; i++) { - var currentScriptTag = ""; - allScriptTags += currentScriptTag; - } - document.write(allScriptTags); - })(); -} diff --git a/public/lib/OpenLayers/Ajax.js b/public/lib/OpenLayers/Ajax.js deleted file mode 100644 index 5c92c1aa7..000000000 --- a/public/lib/OpenLayers/Ajax.js +++ /dev/null @@ -1,113 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ - -OpenLayers.ProxyHost = "/proxy/?url="; -//OpenLayers.ProxyHost = "examples/proxy.cgi?url="; - -/** -* Ajax reader for OpenLayers -* -*@uri url to do remote XML http get -*@param 'get' format params (x=y&a=b...) -*@who object to handle callbacks for this request -*@complete the function to be called on success -*@failure the function to be called on failure -* -* example usage from a caller: -* -* caps: function(request) { -* -blah- -* }, -* -* OpenLayers.loadURL(url,params,this,caps); -* -* Notice the above example does not provide an error handler; a default empty -* handler is provided which merely logs the error if a failure handler is not -* supplied -* -*/ - - -/** -* @param {} request -*/ -OpenLayers.nullHandler = function(request) { - alert("Unhandled request return " + request.statusText); -}; - -/** Background load a document -* -* @param {String} uri URI of source doc -* @param {String} params Params on get (doesnt seem to work) -* @param {Object} caller object which gets callbacks -* @param {Function} onComplete callback for success -* @param {Function} onFailure callback for failure -* -* Both callbacks optional (though silly) -*/ -OpenLayers.loadURL = function(uri, params, caller, - onComplete, onFailure) { - - if (OpenLayers.ProxyHost && uri.startsWith("http")) { - uri = OpenLayers.ProxyHost + escape(uri); - - if (!params) { - params=""; - } - params += "&cachehack=" + new Date().getTime(); - } - - var success = (onComplete) ? onComplete.bind(caller) - : OpenLayers.nullHandler; - - var failure = (onFailure) ? onFailure.bind(caller) - : OpenLayers.nullHandler; - - // from prototype.js - new Ajax.Request(uri, - { method: 'get', - parameters: params, - onComplete: success, - onFailure: failure - } - ); -}; - -/** Parse XML into a doc structure -* @param {String} text -* -* @returns Parsed Ajax Response ?? -* @type ? -*/ -OpenLayers.parseXMLString = function(text) { - - //MS sucks, if the server is bad it dies - var index = text.indexOf('<'); - if (index > 0) { - text = text.substring(index); - } - - var ajaxResponse = Try.these( - function() { - var xmldom = new ActiveXObject('Microsoft.XMLDOM'); - xmldom.loadXML(text); - return xmldom; - }, - function() { - return new DOMParser().parseFromString(text, 'text/xml'); - }, - function() { - var req = new XMLHttpRequest(); - req.open("GET", "data:" + "text/xml" + - ";charset=utf-8," + encodeURIComponent(text), false); - if (req.overrideMimeType) { - req.overrideMimeType("text/xml"); - } - req.send(null); - return req.responseXML; - } - ); - - return ajaxResponse; -}; diff --git a/public/lib/OpenLayers/Control.js b/public/lib/OpenLayers/Control.js deleted file mode 100644 index 117fb26c4..000000000 --- a/public/lib/OpenLayers/Control.js +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -/** -* @class -*/ -OpenLayers.Control = Class.create(); -OpenLayers.Control.prototype = { - - /** this gets set in the addControl() function in OpenLayers.Map - * @type OpenLayers.Map */ - map: null, - - /** @type DOMElement */ - div: null, - - /** @type OpenLayers.Pixel */ - position: null, - - /** - * @constructor - */ - initialize: function (options) { - Object.extend(this, options); - }, - - /** - * @param {OpenLayers.Pixel} px - * - * @returns A reference to the DIV DOMElement containing the control - * @type DOMElement - */ - draw: function (px) { - if (this.div == null) { - this.div = OpenLayers.Util.createDiv(); - } - if (px != null) { - this.position = px.copyOf(); - } - this.moveTo(this.position); - return this.div; - }, - - /** - * @param {OpenLayers.Pixel} px - */ - moveTo: function (px) { - if ((px != null) && (this.div != null)) { - this.div.style.left = px.x + "px"; - this.div.style.top = px.x + "px"; - } - }, - - /** - */ - destroy: function () { - // eliminate circular references - this.map = null; - }, - - /** @final @type String */ - CLASS_NAME: "OpenLayers.Control" -}; diff --git a/public/lib/OpenLayers/Control/KeyboardDefaults.js b/public/lib/OpenLayers/Control/KeyboardDefaults.js deleted file mode 100644 index e93ad969d..000000000 --- a/public/lib/OpenLayers/Control/KeyboardDefaults.js +++ /dev/null @@ -1,65 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -// @require: OpenLayers/Control.js - -/** - * @class - */ -OpenLayers.Control.KeyboardDefaults = Class.create(); -OpenLayers.Control.KeyboardDefaults.prototype = - Object.extend( new OpenLayers.Control(), { - - /** @type int */ - slideFactor: 50, - - /** - * @constructor - */ - initialize: function() { - OpenLayers.Control.prototype.initialize.apply(this, arguments); - }, - - /** - * - */ - draw: function() { - Event.observe(document, - 'keypress', - this.defaultKeyDown.bind(this)); - }, - - /** - * @param {Event} evt - */ - defaultKeyDown: function (evt) { - - var slide = this.map.getResolution() * this.slideFactor; - var center = this.map.getCenter(); - - var newCenter = center.copyOf(); - - switch(evt.keyCode) { - case Event.KEY_LEFT: - newCenter = newCenter.add( -slide, 0); - break; - case Event.KEY_RIGHT: - newCenter = newCenter.add( slide, 0); - break; - case Event.KEY_UP: - newCenter = newCenter.add( 0, slide); - break; - case Event.KEY_DOWN: - newCenter = newCenter.add( 0, -slide); - break; - } - - if (!newCenter.equals(center)) { - this.map.setCenter(newCenter); - Event.stop(evt); - } - }, - - /** @final @type String */ - CLASS_NAME: "OpenLayers.Control.KeyboardDefaults" -}); diff --git a/public/lib/OpenLayers/Control/LayerSwitcher.js b/public/lib/OpenLayers/Control/LayerSwitcher.js deleted file mode 100644 index 032763978..000000000 --- a/public/lib/OpenLayers/Control/LayerSwitcher.js +++ /dev/null @@ -1,224 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -// @require: OpenLayers/Control.js -/** -* @class -*/ -OpenLayers.Control.LayerSwitcher = Class.create(); - -/** color used in the UI to show a layer is active/displayed -* -* @final -* @type String -*/ -OpenLayers.Control.LayerSwitcher.ACTIVE_COLOR = "darkblue"; - -/** color used in the UI to show a layer is deactivated/hidden -* -* @final -* @type String -*/ -OpenLayers.Control.LayerSwitcher.NONACTIVE_COLOR = "lightblue"; - - -OpenLayers.Control.LayerSwitcher.prototype = - Object.extend( new OpenLayers.Control(), { - - /** @type String */ - activeColor: "", - - /** @type String */ - nonActiveColor: "", - - /** @type String */ - mode: "checkbox", - - /** - * @constructor - */ - initialize: function(options) { - this.activeColor = OpenLayers.Control.LayerSwitcher.ACTIVE_COLOR; - this.nonActiveColor = OpenLayers.Control.LayerSwitcher.NONACTIVE_COLOR; - this.backdrops = []; - OpenLayers.Control.prototype.initialize.apply(this, arguments); - }, - - /** - * @returns A reference to the DIV DOMElement containing the switcher tabs - * @type DOMElement - */ - draw: function() { - // initialize our internal div - OpenLayers.Control.prototype.draw.apply(this); - - this.div.style.position = "absolute"; - this.div.style.top = "10px"; - this.div.style.right = "0px"; - this.div.style.left = ""; - this.div.style.fontFamily = "sans-serif"; - this.div.style.color = "white"; - this.div.style.fontWeight = "bold"; - this.div.style.marginTop = "3px"; - this.div.style.marginLeft = "3px"; - this.div.style.marginBottom = "3px"; - this.div.style.fontSize="smaller"; - this.div.style.width = "10em"; - - this.map.events.register("addlayer", this, this.redraw); - this.map.events.register("removelayer", this, this.redraw); - return this.redraw(); - }, - - /** - * @returns A reference to the DIV DOMElement containing the switcher tabs - * @type DOMElement - */ - redraw: function() { - - //clear out previous incarnation of LayerSwitcher tabs - this.div.innerHTML = ""; - var visible = false; - for( var i = 0; i < this.map.layers.length; i++) { - if (visible && this.mode == "radio") { - this.map.layers[i].setVisibility(false); - } else { - visible = this.map.layers[i].getVisibility(); - } - this.addTab(this.map.layers[i]); - } - - return this.div; - }, - - /** - * @param {event} evt - */ - singleClick: function(evt) { - var div = Event.element(evt); - - // See comment about OL #57 fix below. - // If the click occurred on the corner spans we need - // to make sure we act on the actual label tab instead. - div = div.labelElement || div; - - var layer = div.layer; - if (this.mode == "radio") { - for(var i=0; i < this.backdrops.length; i++) { - this.setTabActivation(this.backdrops[i], false); - this.backdrops[i].layer.setVisibility(false); - } - this.setTabActivation(div, true); - layer.setVisibility(true); - } else { - var visible = layer.getVisibility(); - - this.setTabActivation(div, !visible); - layer.setVisibility(!visible); - } - Event.stop(evt); - }, - - /** - * @private - * - * @param {event} evt - */ - ignoreEvent: function(evt) { - Event.stop(evt); - return false; - }, - - /** - * @private - * - * @param {OpenLayers.Layer} layer - */ - addTab: function(layer) { - - // Outer DIV - for Rico Corners - // - var backdropLabelOuter = document.createElement('div'); - backdropLabelOuter.id = "LayerSwitcher_" + layer.name + "_Tab"; - backdropLabelOuter.style.marginTop = "4px"; - backdropLabelOuter.style.marginBottom = "4px"; - - this._setEventHandlers(backdropLabelOuter); - - // Inner Label - for Rico Corners - // - var backdropLabel = document.createElement('p'); - backdropLabel.innerHTML = layer.name; - backdropLabel.style.marginTop = "0px"; - backdropLabel.style.marginBottom = "0px"; - backdropLabel.style.paddingLeft = "10px"; - backdropLabel.style.paddingRight = "10px"; - - // add reference to layer onto the div for use in event handlers - backdropLabel.layer = layer; - - // set event handlers - this._setEventHandlers(backdropLabel); - - // add label to div - backdropLabelOuter.appendChild(backdropLabel); - - this.backdrops.append(backdropLabel); - - // add div to main LayerSwitcher Div - this.div.appendChild(backdropLabelOuter); - - Rico.Corner.round(backdropLabelOuter, {corners: "tl bl", - bgColor: "transparent", - color: "white", - blend: false}); - - // extend the event handlers to operate on the - // rounded corners as well. (Fixes OL #57.) - var spanElements=backdropLabel.parentNode.getElementsByTagName("span"); - - for (var currIdx = 0; currIdx < spanElements.length; currIdx++) { - this._setEventHandlers(spanElements[currIdx], backdropLabel); - } - - this.setTabActivation(backdropLabel, layer.getVisibility()); - }, - - /* - @private - - @param {DOMElement} div - @param {Boolean} activate - */ - _setEventHandlers : function(element, labelDiv) { - - // We only want to respond to a mousedown event. - element.onclick = this.singleClick.bindAsEventListener(this); - element.ondblclick = this.singleClick.bindAsEventListener(this); - element.onmouseup = this.ignoreEvent.bindAsEventListener(this); - element.onmousedown = this.ignoreEvent.bindAsEventListener(this); - - // If we are operating on a corner span we need to store a - // reference to the actual tab. (See comment about OL #57 fix above.) - if (labelDiv) { - element.labelElement = labelDiv; - } - }, - - /** - * @private - * - * @param {DOMElement} div - * @param {Boolean} activate - */ - setTabActivation:function(div, activate) { - var color = (activate) ? this.activeColor : this.nonActiveColor; - Rico.Corner.changeColor(div, color); - }, - - - - /** @final @type String */ - CLASS_NAME: "OpenLayers.Control.LayerSwitcher" -}); - diff --git a/public/lib/OpenLayers/Control/MouseDefaults.js b/public/lib/OpenLayers/Control/MouseDefaults.js deleted file mode 100644 index 3ae7edd5d..000000000 --- a/public/lib/OpenLayers/Control/MouseDefaults.js +++ /dev/null @@ -1,130 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -// @require: OpenLayers/Control.js -OpenLayers.Control.MouseDefaults = Class.create(); -OpenLayers.Control.MouseDefaults.prototype = - Object.extend( new OpenLayers.Control(), { - - performedDrag: false, - - initialize: function() { - OpenLayers.Control.prototype.initialize.apply(this, arguments); - }, - - draw: function() { - this.map.events.register( "click", this, this.defaultClick ); - this.map.events.register( "dblclick", this, this.defaultDblClick ); - this.map.events.register( "mousedown", this, this.defaultMouseDown ); - this.map.events.register( "mouseup", this, this.defaultMouseUp ); - this.map.events.register( "mousemove", this, this.defaultMouseMove ); - this.map.events.register( "mouseout", this, this.defaultMouseOut ); - }, - - defaultClick: function (evt) { - if (!Event.isLeftClick(evt)) return; - var notAfterDrag = !this.performedDrag; - this.performedDrag = false; - return notAfterDrag; - }, - - /** - * @param {Event} evt - */ - defaultDblClick: function (evt) { - var newCenter = this.map.getLonLatFromViewPortPx( evt.xy ); - this.map.setCenter(newCenter, this.map.zoom + 1); - }, - - /** - * @param {Event} evt - */ - defaultMouseDown: function (evt) { - if (!Event.isLeftClick(evt)) return; - this.mouseDragStart = evt.xy.copyOf(); - this.performedDrag = false; - if (evt.shiftKey) { - this.map.div.style.cursor = "crosshair"; - this.zoomBox = OpenLayers.Util.createDiv('zoomBox', - this.mouseDragStart, - null, - null, - "absolute", - "2px solid red"); - this.zoomBox.style.backgroundColor = "white"; - this.zoomBox.style.filter = "alpha(opacity=50)"; // IE - this.zoomBox.style.opacity = "0.50"; - this.zoomBox.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1; - this.map.viewPortDiv.appendChild(this.zoomBox); - } - document.onselectstart=function() { return false; } - Event.stop(evt); - }, - - /** - * @param {Event} evt - */ - defaultMouseMove: function (evt) { - if (this.mouseDragStart != null) { - if (this.zoomBox) { - var deltaX = Math.abs(this.mouseDragStart.x - evt.xy.x); - var deltaY = Math.abs(this.mouseDragStart.y - evt.xy.y); - this.zoomBox.style.width = deltaX+"px"; - this.zoomBox.style.height = deltaY+"px"; - if (evt.xy.x < this.mouseDragStart.x) { - this.zoomBox.style.left = evt.xy.x+"px"; - } - if (evt.xy.y < this.mouseDragStart.y) { - this.zoomBox.style.top = evt.xy.y+"px"; - } - } else { - var deltaX = this.mouseDragStart.x - evt.xy.x; - var deltaY = this.mouseDragStart.y - evt.xy.y; - var size = this.map.getSize(); - var newXY = new OpenLayers.Pixel(size.w / 2 + deltaX, - size.h / 2 + deltaY); - var newCenter = this.map.getLonLatFromViewPortPx( newXY ); - this.map.setCenter(newCenter, null, true); - this.mouseDragStart = evt.xy.copyOf(); - this.map.div.style.cursor = "move"; - } - this.performedDrag = true; - } - }, - - /** - * @param {Event} evt - */ - defaultMouseUp: function (evt) { - if (!Event.isLeftClick(evt)) return; - if (this.zoomBox) { - var start = this.map.getLonLatFromViewPortPx( this.mouseDragStart ); - var end = this.map.getLonLatFromViewPortPx( evt.xy ); - var top = Math.max(start.lat, end.lat); - var bottom = Math.min(start.lat, end.lat); - var left = Math.min(start.lon, end.lon); - var right = Math.max(start.lon, end.lon); - var bounds = new OpenLayers.Bounds(left, bottom, right, top); - var zoom = this.map.getZoomForExtent(bounds); - this.map.setCenter(new OpenLayers.LonLat( - (start.lon + end.lon) / 2, - (start.lat + end.lat) / 2 - ), zoom); - this.map.viewPortDiv.removeChild(document.getElementById("zoomBox")); - this.zoomBox = null; - } else { - this.map.setCenter(this.map.center); - } - document.onselectstart=null; - this.mouseDragStart = null; - this.map.div.style.cursor = "default"; - }, - - defaultMouseOut: function (evt) { - if (this.mouseDragStart != null - && OpenLayers.Util.mouseLeft(evt, this.map.div)) { - this.defaultMouseUp(evt); - } - } -}); - diff --git a/public/lib/OpenLayers/Control/MouseToolbar.js b/public/lib/OpenLayers/Control/MouseToolbar.js deleted file mode 100644 index 28b78d606..000000000 --- a/public/lib/OpenLayers/Control/MouseToolbar.js +++ /dev/null @@ -1,262 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -// @require: OpenLayers/Control.js -OpenLayers.Control.MouseToolbar = Class.create(); -OpenLayers.Control.MouseToolbar.X = 6; -OpenLayers.Control.MouseToolbar.Y = 300; -OpenLayers.Control.MouseToolbar.prototype = - Object.extend( new OpenLayers.Control(), { - - mode: null, - - buttons: null, - - direction: "vertical", - - initialize: function(position, direction) { - OpenLayers.Control.prototype.initialize.apply(this, arguments); - this.position = new OpenLayers.Pixel(OpenLayers.Control.MouseToolbar.X, - OpenLayers.Control.MouseToolbar.Y); - if (position) { - this.position = position; - } - if (direction) { - this.direction = direction; - } - this.measureDivs = []; - }, - - draw: function() { - OpenLayers.Control.prototype.draw.apply(this, arguments); - this.buttons = new Object(); - this.map.events.register( "dblclick", this, this.defaultDblClick ); - this.map.events.register( "mousedown", this, this.defaultMouseDown ); - this.map.events.register( "mouseup", this, this.defaultMouseUp ); - this.map.events.register( "mousemove", this, this.defaultMouseMove ); - this.map.events.register( "mouseout", this, this.defaultMouseOut ); - var sz = new OpenLayers.Size(28,28); - var centered = this.position; - this._addButton("zoombox", "drag-rectangle-off.png", "drag-rectangle-on.png", centered, sz, "Shift->Drag to zoom to area"); - centered = centered.add((this.direction == "vertical" ? 0 : sz.w), (this.direction == "vertical" ? sz.h : 0)); - this._addButton("pan", "panning-hand-off.png", "panning-hand-on.png", centered, sz, "Drag the map to pan."); - centered = centered.add((this.direction == "vertical" ? 0 : sz.w), (this.direction == "vertical" ? sz.h : 0)); - this._addButton("measure", "measuring-stick-off.png", "measuring-stick-on.png", centered, sz, "Hold alt when clicking to show distance between selected points"); - this.switchModeTo("pan"); - this.map.events.register("zoomend", this, function() { this.switchModeTo("pan"); }); - return this.div; - - }, - - _addButton:function(id, img, activeImg, xy, sz, title) { - var imgLocation = OpenLayers.Util.getImagesLocation() + img; - var activeImgLocation = OpenLayers.Util.getImagesLocation() + activeImg; - // var btn = new ol.AlphaImage("_"+id, imgLocation, xy, sz); - var btn = OpenLayers.Util.createAlphaImageDiv( - "OpenLayers_Control_MouseToolbar_" + id, - xy, sz, imgLocation, "absolute"); - - //we want to add the outer div - this.div.appendChild(btn); - btn.imgLocation = imgLocation; - btn.activeImgLocation = activeImgLocation; - - btn.events = new OpenLayers.Events(this, btn); - btn.events.register("mousedown", this, this.buttonClick); - btn.events.register("mouseup", this, Event.stop); - btn.action = id; - btn.title = title; - btn.alt = title; - btn.map = this.map; - - //we want to remember/reference the outer div - this.buttons[id] = btn; - return btn; - }, - - buttonClick: function(evt) { - if (!Event.isLeftClick(evt)) return; - this.switchModeTo(evt.div.action); - Event.stop(evt); - }, - - /** - * @param {Event} evt - */ - defaultDblClick: function (evt) { - this.switchModeTo("pan"); - var newCenter = this.map.getLonLatFromViewPortPx( evt.xy ); - this.map.setCenter(newCenter, this.map.zoom + 2); - }, - - /** - * @param {Event} evt - */ - defaultMouseDown: function (evt) { - if (!Event.isLeftClick(evt)) return; - this.mouseDragStart = evt.xy.copyOf(); - if (evt.shiftKey && this.mode !="zoombox") { - this.switchModeTo("zoombox"); - } else if (evt.altKey && this.mode !="measure") { - this.switchModeTo("measure"); - } else if (!this.mode) { - this.switchModeTo("pan"); - } - - switch (this.mode) { - case "zoombox": - this.map.div.style.cursor = "crosshair"; - this.zoomBox = OpenLayers.Util.createDiv('zoomBox', - this.mouseDragStart, - null, - null, - "absolute", - "2px solid red"); - this.zoomBox.style.backgroundColor = "white"; - this.zoomBox.style.filter = "alpha(opacity=50)"; // IE - this.zoomBox.style.opacity = "0.50"; - this.zoomBox.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1; - this.map.viewPortDiv.appendChild(this.zoomBox); - break; - case "measure": - var distance = ""; - if (this.measureStart) { - measureEnd = this.map.getLonLatFromViewPortPx(this.mouseDragStart); - distance = OpenLayers.Util.distVincenty(this.measureStart, measureEnd); - distance = Math.round(distance * 100) / 100; - distance = distance + "km"; - this.measureStartBox = this.measureBox; - } - this.measureStart = this.map.getLonLatFromViewPortPx(this.mouseDragStart);; - this.measureBox = OpenLayers.Util.createDiv(null, - this.mouseDragStart.add( - -2-parseInt(this.map.layerContainerDiv.style.left), - -2-parseInt(this.map.layerContainerDiv.style.top)), - null, - null, - "absolute"); - this.measureBox.style.width="4px"; - this.measureBox.style.height="4px"; - this.measureBox.style.backgroundColor="red"; - this.measureBox.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1; - this.map.layerContainerDiv.appendChild(this.measureBox); - if (distance) { - this.measureBoxDistance = OpenLayers.Util.createDiv(null, - this.mouseDragStart.add( - -2-parseInt(this.map.layerContainerDiv.style.left), - 2-parseInt(this.map.layerContainerDiv.style.top)), - null, - null, - "absolute"); - - this.measureBoxDistance.innerHTML = distance; - this.measureBoxDistance.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1; - this.map.layerContainerDiv.appendChild(this.measureBoxDistance); - this.measureDivs.append(this.measureBoxDistance); - } - this.measureBox.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1; - this.map.layerContainerDiv.appendChild(this.measureBox); - this.measureDivs.append(this.measureBox); - break; - default: - this.map.div.style.cursor = "move"; - break; - } - document.onselectstart = function() { return false; } - Event.stop(evt); - }, - - switchModeTo: function(mode) { - if (mode != this.mode) { - if (this.mode) { - OpenLayers.Util.modifyAlphaImageDiv(this.buttons[this.mode], null, null, null, this.buttons[this.mode].imgLocation); - } - if (this.mode == "measure" && mode != "measure") { - for(var i = 0; i < this.measureDivs.length; i++) { - if (this.measureDivs[i]) { - this.map.layerContainerDiv.removeChild(this.measureDivs[i]); - } - } - this.measureDivs = []; - this.measureStart = null; - } - this.mode = mode; - OpenLayers.Util.modifyAlphaImageDiv(this.buttons[mode], null, null, null, this.buttons[mode].activeImgLocation); - } - }, - - leaveMode: function() { - this.switchModeTo("pan"); - }, - - /** - * @param {Event} evt - */ - defaultMouseMove: function (evt) { - if (this.mouseDragStart != null) { - switch (this.mode) { - case "zoombox": - var deltaX = Math.abs(this.mouseDragStart.x - evt.xy.x); - var deltaY = Math.abs(this.mouseDragStart.y - evt.xy.y); - this.zoomBox.style.width = deltaX+"px"; - this.zoomBox.style.height = deltaY+"px"; - if (evt.xy.x < this.mouseDragStart.x) { - this.zoomBox.style.left = evt.xy.x+"px"; - } - if (evt.xy.y < this.mouseDragStart.y) { - this.zoomBox.style.top = evt.xy.y+"px"; - } - break; - default: - var deltaX = this.mouseDragStart.x - evt.xy.x; - var deltaY = this.mouseDragStart.y - evt.xy.y; - var size = this.map.getSize(); - var newXY = new OpenLayers.Pixel(size.w / 2 + deltaX, - size.h / 2 + deltaY); - var newCenter = this.map.getLonLatFromViewPortPx( newXY ); - this.map.setCenter(newCenter, null, true); - this.mouseDragStart = evt.xy.copyOf(); - } - } - }, - - /** - * @param {Event} evt - */ - defaultMouseUp: function (evt) { - if (!Event.isLeftClick(evt)) return; - switch (this.mode) { - case "zoombox": - var start = this.map.getLonLatFromViewPortPx( this.mouseDragStart ); - var end = this.map.getLonLatFromViewPortPx( evt.xy ); - var top = Math.max(start.lat, end.lat); - var bottom = Math.min(start.lat, end.lat); - var left = Math.min(start.lon, end.lon); - var right = Math.max(start.lon, end.lon); - var bounds = new OpenLayers.Bounds(left, bottom, right, top); - var zoom = this.map.getZoomForExtent(bounds); - this.map.setCenter(new OpenLayers.LonLat( - (start.lon + end.lon) / 2, - (start.lat + end.lat) / 2 - ), zoom); - this.map.viewPortDiv.removeChild(document.getElementById("zoomBox")); - this.zoomBox = null; - this.leaveMode(); - break; - case "pan": - this.map.setCenter(this.map.center); - - } - document.onselectstart = null; - this.mouseDragStart = null; - this.map.div.style.cursor = "default"; - }, - - defaultMouseOut: function (evt) { - if (this.mouseDragStart != null - && OpenLayers.Util.mouseLeft(evt, this.map.div)) { - this.defaultMouseUp(evt); - } - } -}); - diff --git a/public/lib/OpenLayers/Control/PanZoom.js b/public/lib/OpenLayers/Control/PanZoom.js deleted file mode 100644 index 32eed2feb..000000000 --- a/public/lib/OpenLayers/Control/PanZoom.js +++ /dev/null @@ -1,164 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -// @require: OpenLayers/Control.js - -/** - * @class - * - * default zoom/pan controls - */ -OpenLayers.Control.PanZoom = Class.create(); -OpenLayers.Control.PanZoom.X = 4; -OpenLayers.Control.PanZoom.Y = 4; -OpenLayers.Control.PanZoom.prototype = - Object.extend( new OpenLayers.Control(), { - - /** @type int */ - slideFactor: 50, - - /** @type Array of Button Divs */ - buttons: null, - - /** @type OpenLayers.Pixel */ - position: null, - - /** - * @constructor - */ - initialize: function() { - OpenLayers.Control.prototype.initialize.apply(this, arguments); - this.position = new OpenLayers.Pixel(OpenLayers.Control.PanZoom.X, - OpenLayers.Control.PanZoom.Y); - }, - - /** - * @param {OpenLayers.Pixel} px - * - * @returns A reference to the container div for the PanZoom control - * @type DOMElement - */ - draw: function(px) { - // initialize our internal div - OpenLayers.Control.prototype.draw.apply(this, arguments); - px = this.position; - - // place the controls - this.buttons = new Array(); - - var sz = new OpenLayers.Size(18,18); - var centered = new OpenLayers.Pixel(px.x+sz.w/2, px.y); - - this._addButton("panup", "north-mini.png", centered, sz); - px.y = centered.y+sz.h; - this._addButton("panleft", "west-mini.png", px, sz); - this._addButton("panright", "east-mini.png", px.add(sz.w, 0), sz); - this._addButton("pandown", "south-mini.png", - centered.add(0, sz.h*2), sz); - this._addButton("zoomin", "zoom-plus-mini.png", - centered.add(0, sz.h*3+5), sz); - this._addButton("zoomworld", "zoom-world-mini.png", - centered.add(0, sz.h*4+5), sz); - this._addButton("zoomout", "zoom-minus-mini.png", - centered.add(0, sz.h*5+5), sz); - return this.div; - }, - - /** - * @param {String} id - * @param {String} img - * @param {OpenLayers.Pixel} xy - * @param {OpenLayers.Size} sz - * - * @returns A Div (an alphaImageDiv, to be precise) that contains the - * image of the button, and has all the proper event handlers - * set. - * @type DOMElement - */ - _addButton:function(id, img, xy, sz) { - var imgLocation = OpenLayers.Util.getImagesLocation() + img; - // var btn = new ol.AlphaImage("_"+id, imgLocation, xy, sz); - var btn = OpenLayers.Util.createAlphaImageDiv( - "OpenLayers_Control_PanZoom_" + id, - xy, sz, imgLocation, "absolute"); - - //we want to add the outer div - this.div.appendChild(btn); - - btn.onmousedown = this.buttonDown.bindAsEventListener(btn); - btn.ondblclick = this.doubleClick.bindAsEventListener(btn); - btn.onclick = this.doubleClick.bindAsEventListener(btn); - btn.action = id; - btn.map = this.map; - btn.slideFactor = this.slideFactor; - - //we want to remember/reference the outer div - this.buttons.push(btn); - return btn; - }, - - /** - * @param {event} evt - * - * @type Boolean - */ - doubleClick: function (evt) { - Event.stop(evt); - return false; - }, - - /** - * @param {event} evt - */ - buttonDown: function (evt) { - if (!Event.isLeftClick(evt)) return; - - var slide = this.map.getResolution() * this.slideFactor; - var center = this.map.getCenter(); - - var newCenter = center.copyOf(); - - switch (this.action) { - case "panup": - newCenter = newCenter.add( 0, slide); - break; - case "pandown": - newCenter = newCenter.add( 0, -slide); - break; - case "panleft": - newCenter = newCenter.add( -slide, 0); - break; - case "panright": - newCenter = newCenter.add( slide, 0); - break; - case "zoomin": - this.map.zoomIn(); - break; - case "zoomout": - this.map.zoomOut(); - break; - case "zoomworld": - this.map.zoomToFullExtent(); - break; - } - - if (!newCenter.equals(center)) { - this.map.setCenter(newCenter); - } - - Event.stop(evt); - }, - - /** - * - */ - destroy: function() { - OpenLayers.Control.prototype.destroy.apply(this, arguments); - for(i=0; i 0 && - (evt.clientY - offsets[1]) < parseInt(this.zoombarDiv.style.height) - 2) { - var newTop = parseInt(this.slider.style.top) - deltaY; - this.slider.style.top = newTop+"px"; - } - this.mouseDragStart = evt.xy.copyOf(); - } - Event.stop(evt); - }, - - /* - * @param evt - * Perform cleanup when a mouseup event is received -- discover new zoom level - * and switch to it. - */ - zoomBarUp:function(evt) { - if (!Event.isLeftClick(evt)) return; - if (this.zoomStart) { - this.div.style.cursor="default"; - this.map.events.remove("mousemove"); - this.map.events.remove("mouseup"); - var deltaY = this.zoomStart.y - evt.xy.y - this.map.zoomTo(this.map.zoom + Math.round(deltaY/this.zoomStopHeight)); - this.moveZoomBar(); - this.mouseDragStart = null; - Event.stop(evt); - } - }, - - /* - * Change the location of the slider to match the current zoom level. - */ - moveZoomBar:function() { - var newTop = - (this.map.getZoomLevels() - this.map.getZoom()) * this.zoomStopHeight - + this.startTop + 1; - this.slider.style.top = newTop + "px"; - }, - - CLASS_NAME: "OpenLayers.Control.PanZoomBar" -}); diff --git a/public/lib/OpenLayers/Events.js b/public/lib/OpenLayers/Events.js deleted file mode 100644 index 00e158b4f..000000000 --- a/public/lib/OpenLayers/Events.js +++ /dev/null @@ -1,124 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -OpenLayers.Events = Class.create(); - -OpenLayers.Events.prototype = { - // Array: supported events - BROWSER_EVENTS: [ - "mouseover", "mouseout", - "mousedown", "mouseup", "mousemove", - "click", "dblclick", - "resize", "focus", "blur" - ], - - // hash of Array(Function): events listener functions - listeners: null, - - // Object: the code object issuing application events - object: null, - - // DOMElement: the DOM element receiving browser events - div: null, - - // Array: list of support application events - eventTypes: null, - - /** - * @param {OpenLayers.Map} map - * @param {DOMElement} div - */ - initialize: function (object, div, eventTypes) { - this.listeners = {}; - this.object = object; - this.div = div; - this.eventTypes = eventTypes; - if (eventTypes) { - for (var i = 0; i < this.eventTypes.length; i++) { - // create a listener list for every custom application event - this.listeners[ this.eventTypes[i] ] = []; - } - } - for (var i = 0; i < this.BROWSER_EVENTS.length; i++) { - var eventType = this.BROWSER_EVENTS[i]; - - // every browser event has a corresponding application event - // (whether it's listened for or not). - this.listeners[ eventType ] = []; - - Event.observe(div, eventType, - this.handleBrowserEvent.bindAsEventListener(this)); - } - // disable dragstart in IE so that mousedown/move/up works normally - Event.observe(div, "dragstart", Event.stop); - }, - - /** - * @param {str} type - * @param {Object} obj - * @param {Function} func - */ - register: function (type, obj, func) { - if (func == null) { - obj = this.object; - func = obj; - } - var listeners = this.listeners[type]; - listeners.push( {obj: obj, func: func} ); - }, - - unregister: function (type, obj, func) { - var listeners = this.listeners[type]; - for (var i = 0; i < listeners.length; i++) { - if (listeners[i].obj == obj && listeners[i].type == type) { - listeners.splice(i, 1); - break; - } - } - }, - - remove: function(type) { - this.listeners[type].pop(); - }, - - /** - * @param {event} evt - */ - handleBrowserEvent: function (evt) { - evt.xy = this.getMousePosition(evt); - this.triggerEvent(evt.type, evt) - }, - - /** - * @param {event} evt - * - * @return {OpenLayers.Pixel} - */ - getMousePosition: function (evt) { - if (!this.div.offsets) { - this.div.offsets = Position.page(this.div); - } - return new OpenLayers.Pixel( - evt.clientX - this.div.offsets[0], - evt.clientY - this.div.offsets[1]); - }, - - /** - * @param {str} type - * @param {event} evt - */ - triggerEvent: function (type, evt) { - if (evt == null) { - evt = {}; - } - evt.object = this.object; - evt.div = this.div; - - var listeners = this.listeners[type]; - for (var i = 0; i < listeners.length; i++) { - var callback = listeners[i]; - var continueChain = callback.func.call(callback.obj, evt); - if (continueChain != null && !continueChain) break; - } - } -}; diff --git a/public/lib/OpenLayers/Feature.js b/public/lib/OpenLayers/Feature.js deleted file mode 100644 index a15318001..000000000 --- a/public/lib/OpenLayers/Feature.js +++ /dev/null @@ -1,110 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -/** - * @class - */ -OpenLayers.Feature = Class.create(); -OpenLayers.Feature.prototype= { - - /** @type OpenLayers.Events */ - events:null, - - /** @type OpenLayers.Layer */ - layer: null, - - /** @type String */ - id: null, - - /** @type OpenLayers.LonLat */ - lonlat:null, - - /** @type Object */ - data:null, - - /** @type OpenLayers.Marker */ - marker: null, - - /** @type OpenLayers.Popup */ - popup: null, - - /** - * @constructor - * - * @param {OpenLayers.Layer} layer - * @param {String} id - * @param {OpenLayers.LonLat} lonlat - * @param {Object} data - */ - initialize: function(layer, lonlat, data, id) { - this.layer = layer; - this.lonlat = lonlat; - this.data = (data != null) ? data : new Object(); - this.id = (id ? id : 'f' + Math.random()); - }, - - /** - * - */ - destroy: function() { - - //remove the popup from the map - if ((this.layer != null) && (this.layer.map != null)) { - if (this.popup != null) { - this.layer.map.removePopup(this.popup); - } - } - - this.events = null; - this.layer = null; - this.id = null; - this.lonlat = null; - this.data = null; - if (this.marker != null) { - this.marker.destroy(); - this.marker = null; - } - if (this.popup != null) { - this.popup.destroy(); - this.popup = null; - } - }, - - - /** - * @returns A Marker Object created from the 'lonlat' and 'icon' properties - * set in this.data. If no 'lonlat' is set, returns null. If no - * 'icon' is set, OpenLayers.Marker() will load the default image - * @type OpenLayers.Marker - */ - createMarker: function() { - - var marker = null; - - if (this.lonlat != null) { - this.marker = new OpenLayers.Marker(this.lonlat, this.data.icon); - } - return this.marker; - }, - - /** - * - */ - createPopup: function() { - - if (this.lonlat != null) { - - var id = this.id + "_popup"; - var anchor = (this.marker) ? this.marker.icon : null; - - this.popup = new OpenLayers.Popup.AnchoredBubble(id, - this.lonlat, - this.data.popupSize, - this.data.popupContentHTML, - anchor); - } - return this.popup; - }, - - CLASS_NAME: "OpenLayers.Feature" -}; diff --git a/public/lib/OpenLayers/Feature/WFS.js b/public/lib/OpenLayers/Feature/WFS.js deleted file mode 100644 index b2eb0f522..000000000 --- a/public/lib/OpenLayers/Feature/WFS.js +++ /dev/null @@ -1,64 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -/** - * @class - */ -OpenLayers.Feature.WFS = Class.create(); -OpenLayers.Feature.WFS.prototype = - Object.extend( new OpenLayers.Feature(), { - - /** - * @constructor - * - * @param {OpenLayers.Layer} layer - * @param {XMLNode} xmlNode - */ - initialize: function(layer, xmlNode) { - var newArguments = arguments; - if (arguments.length > 0) { - var data = this.processXMLNode(xmlNode); - newArguments = new Array(layer, data.lonlat, data, data.id) - } - OpenLayers.Feature.prototype.initialize.apply(this, newArguments); - - if (arguments.length > 0) { - this.createMarker(); - this.layer.addMarker(this.marker); - } - }, - - destroy: function() { - if (this.marker != null) { - this.layer.removeMarker(this.marker); - } - OpenLayers.Feature.prototype.destroy.apply(this, arguments); - }, - - /** - * @param {XMLNode} xmlNode - * - * @returns Data Object with 'id', 'lonlat', and private properties set - * @type Object - */ - processXMLNode: function(xmlNode) { - //this should be overridden by subclasses - // must return an Object with 'id' and 'lonlat' values set - var point = xmlNode.getElementsByTagName("Point"); - var text = point[0].textContent; - var floats = text.split(","); - - return {lonlat: new OpenLayers.LonLat(parseFloat(floats[0]), - parseFloat(floats[1])), - id: null}; - - }, - - /** @final @type String */ - CLASS_NAME: "OpenLayers.Feature.WFS" -}); - - - - - diff --git a/public/lib/OpenLayers/Icon.js b/public/lib/OpenLayers/Icon.js deleted file mode 100644 index 76a233899..000000000 --- a/public/lib/OpenLayers/Icon.js +++ /dev/null @@ -1,106 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -/** -* @class -*/ -OpenLayers.Icon = Class.create(); -OpenLayers.Icon.prototype = { - - /** image url - * @type String */ - url: null, - - /** @type OpenLayers.Size */ - size:null, - - /** distance in pixels to offset the image when being rendered - * @type OpenLayers.Pixel */ - offset: null, - - /** Function to calculate the offset (based on the size) - * @type OpenLayers.Pixel */ - calculateOffset: null, - - /** @type DOMElement */ - imageDiv: null, - - /** @type OpenLayers.Pixel */ - px: null, - - /** - * @constructor - * - * @param {String} url - * @param {OpenLayers.Size} size - * @param {Function} calculateOffset - */ - initialize: function(url, size, offset, calculateOffset) { - this.url = url; - this.size = (size) ? size : new OpenLayers.Size(20,20); - this.offset = (offset) ? offset : new OpenLayers.Pixel(0,0); - this.calculateOffset = calculateOffset; - - this.imageDiv = OpenLayers.Util.createAlphaImageDiv(); - }, - - destroy: function() { - this.imageDiv = null; - }, - - /** - * @returns A fresh copy of the icon. - * @type OpenLayers.Icon - */ - clone: function() { - return new OpenLayers.Icon(this.size, this.url, this.offset); - }, - - /** - * @param {OpenLayers.Size} size - */ - setSize: function(size) { - if (size != null) { - this.size = size; - } - this.draw(); - }, - - /** - * @param {OpenLayers.Pixel} px - * - * @return A new DOM Image of this icon set at the location passed-in - * @type DOMElement - */ - draw: function(px) { - OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, - null, - null, - this.size, - this.url, - "absolute"); - this.moveTo(px); - return this.imageDiv; - }, - - /** - * @param {OpenLayers.Pixel} px - */ - moveTo: function (px) { - //if no px passed in, use stored location - if (px != null) { - this.px = px; - } - - if ((this.px != null) && (this.imageDiv != null)) { - if (this.calculateOffset) { - this.offset = this.calculateOffset(this.size); - } - var offsetPx = this.px.offset(this.offset); - OpenLayers.Util.modifyAlphaImageDiv(this.imageDiv, null, offsetPx); - } - }, - - /** @final @type String */ - CLASS_NAME: "OpenLayers.Icon" -}; \ No newline at end of file diff --git a/public/lib/OpenLayers/Layer.js b/public/lib/OpenLayers/Layer.js deleted file mode 100644 index 23da82e7d..000000000 --- a/public/lib/OpenLayers/Layer.js +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -/** - * @class - */ -OpenLayers.Layer = Class.create(); -OpenLayers.Layer.prototype = { - - /** @type String */ - name: null, - - /** @type DOMElement */ - div: null, - - /** This variable is set in map.addLayer, not within the layer itself - * @type OpenLayers.Map */ - map: null, - - /** - * @constructor - * - * @param {String} name - */ - initialize: function(name) { - if (arguments.length > 0) { - this.name = name; - if (this.div == null) { - this.div = OpenLayers.Util.createDiv(); - this.div.style.width = "100%"; - this.div.style.height = "100%"; - } - } - }, - - /** - * Destroy is a destructor: this is to alleviate cyclic references which - * the Javascript garbage cleaner can not take care of on its own. - */ - destroy: function() { - if (this.map != null) { - this.map.removeLayer(this); - } - this.map = null; - }, - - /** - * @params {OpenLayers.Bounds} bound - * @params {Boolean} zoomChanged tells when zoom has changed, as layers have to do some init work in that case. - */ - moveTo: function (bound, zoomChanged) { - // not implemented here - return; - }, - - /** - * @param {OpenLayers.Map} map - */ - setMap: function(map) { - this.map = map; - }, - - /** - * @returns Whether or not the layer is a base layer. This should be - * determined individually by all subclasses. - * @type Boolean - */ - isBaseLayer: function() { - //this function should be implemented by all subclasses. - }, - - /** - * @returns Whether or not the layer is visible - * @type Boolean - */ - getVisibility: function() { - return (this.div.style.display != "none"); - }, - - /** - * @param {bool} visible - */ - setVisibility: function(visible) { - this.div.style.display = (visible) ? "block" : "none"; - if ((visible) && (this.map != null)) { - this.moveTo(this.map.getExtent()); - } - }, - - /** @final @type String */ - CLASS_NAME: "OpenLayers.Layer" -}; diff --git a/public/lib/OpenLayers/Layer/Google.js b/public/lib/OpenLayers/Layer/Google.js deleted file mode 100644 index 6d9b9b6e4..000000000 --- a/public/lib/OpenLayers/Layer/Google.js +++ /dev/null @@ -1,152 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -// @require: OpenLayers/Layer.js - -// load Google map control script -// this key was generated for: http://openlayers.python-hosting.com/testing/euzuro/ -document.write(""); - -/** - * @class - */ -OpenLayers.Layer.Google = Class.create(); -OpenLayers.Layer.Google.prototype = Object.extend( new OpenLayers.Layer(), { - - /** @type Boolean */ - viewPortLayer: true, - - /** @type GMap2 gmap stores the Google Map element */ - gmap:null, - - /** @type Boolean */ - dragging:false, - - /** - * @constructor - * - * @param {String} name - */ - initialize: function(name) { - OpenLayers.Layer.prototype.initialize.apply(this, [name]); - }, - - /** - * @param {OpenLayers.Map} map - */ - setMap:function(map) { - OpenLayers.Layer.prototype.setMap.apply(this, arguments); - - // once our layer has been added to the map, we can create the vemap - this.map.events.register("addlayer", this, this.loadGMap); - }, - - /** Google layer is always a base class. - * @type Boolean - */ - isBaseLayer: function() { - return true; - }, - - /** - * @param {OpenLayers.Bounds} bounds - * @param {int} zoomChanged - */ - moveTo:function(bounds,zoomChanged) { - - if ((this.gmap != null) && (!this.dragging)) { - - var olCenter = this.map.getCenter(); - var gCenter = this.getGMapCenter(); - - var olZoom = this.map.getZoom(); - var gZoom = this.gmap.getZoom(); - - if ((!olCenter.equals(gCenter)) || ((olZoom +1) != gZoom)) { - this.gmap.setCenter(new GLatLng(olCenter.lat, olCenter.lon), - olZoom + 1); - } - } - }, - - /** - * - */ - loadGMap:function() { - // create div and set to same size as map - var gDiv = OpenLayers.Util.createDiv(this.name); - var sz = this.map.getSize(); - gDiv.style.width = sz.w; - gDiv.style.height = sz.h; - this.div.appendChild(gDiv); - - // create GMap, hide nav controls - this.gmap = new GMap2(this.div); - this.moveTo(); - - // catch pans and zooms from GMap - GEvent.addListener(this.gmap, - "moveend", - this.catchPanZoom.bindAsEventListener(this)); - - - // attach to the drag start and end and we´ll set a flag so that - // we dont get recursivity. this is because the events fall through - // the gmaps div and into the main layer div - GEvent.addListener(this.gmap, - "dragstart", - this.dragStart.bindAsEventListener(this)); - - GEvent.addListener(this.gmap, - "dragend", - this.dragEnd.bindAsEventListener(this)); - - }, - - /** - * @private - */ - dragStart: function() { - this.dragging = true; - }, - - /** - * @private - */ - dragEnd: function() { - this.dragging = false; - }, - - /** - * @private - * - * @param {event} e - */ - catchPanZoom: function(e) { - var olCenter = this.getGMapCenter(); - var gZoom = this.gmap.getZoom(); - - this.map.setCenter(olCenter, gZoom - 1); - - }, - - /** - * @private - * - * @returns An OpenLayers.LonLat with the center of the gmap, or null if - * the GMap has not been centered yet - * @type OpenLayers.LonLat - */ - getGMapCenter:function() { - var olCenter = null; - var gCenter = this.gmap.getCenter(); - if (gCenter != null) { - olCenter = new OpenLayers.LonLat(gCenter.lng(), gCenter.lat()); - } - return olCenter; - }, - - - /** @final @type String */ - CLASS_NAME: "OpenLayers.Layer.Google" -}); diff --git a/public/lib/OpenLayers/Layer/Grid.js b/public/lib/OpenLayers/Layer/Grid.js deleted file mode 100644 index 736972b30..000000000 --- a/public/lib/OpenLayers/Layer/Grid.js +++ /dev/null @@ -1,296 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -// @require: OpenLayers/Layer.js -// @require: OpenLayers/Util.js -OpenLayers.Layer.Grid = Class.create(); -OpenLayers.Layer.Grid.TILE_WIDTH = 256; -OpenLayers.Layer.Grid.TILE_HEIGHT = 256; -OpenLayers.Layer.Grid.prototype = Object.extend( new OpenLayers.Layer(), { - - // str: url - url: null, - - // hash: params - params: null, - - // tileSize: OpenLayers.Size - tileSize: null, - - // grid: Array(Array()) - // this is an array of rows, each row is an array of tiles - grid: null, - - /** - * @param {str} name - * @param {str} url - * @param {hash} params - */ - initialize: function(name, url, params) { - var newArguments = arguments; - if (arguments.length > 0) { - newArguments = [name]; - } - OpenLayers.Layer.prototype.initialize.apply(this, newArguments); - this.url = url; - this.params = params; - this.tileSize = new OpenLayers.Size(OpenLayers.Layer.Grid.TILE_WIDTH, - OpenLayers.Layer.Grid.TILE_HEIGHT); - }, - - /** - * - */ - destroy: function() { - this.params = null; - this.clearGrid(); - this.grid = null; - OpenLayers.Layer.prototype.destroy.apply(this, arguments); - }, - - setTileSize: function (size) { - this.tileSize = size.copyOf(); - }, - - /** - * moveTo - * moveTo is a function called whenever the map is moved. All the moving - * of actual 'tiles' is done by the map, but moveTo's role is to accept - * a bounds and make sure the data that that bounds requires is pre-loaded. - * @param {OpenLayers.Bounds} - */ - moveTo:function(bounds,zoomChanged) { - if (!this.getVisibility()) { - if (zoomChanged) { - this.grid = null; - } - return; - } - if (!this.grid || zoomChanged) { - this._initTiles(); - } else { - var i = 0; - while (this.getGridBounds().bottom > bounds.bottom) { - this.insertRow(false); - } - while (this.getGridBounds().left > bounds.left) { - this.insertColumn(true); - } - while (this.getGridBounds().top < bounds.top) { - this.insertRow(true); - } - while (this.getGridBounds().right < bounds.right) { - this.insertColumn(false); - } - } - }, - getGridBounds:function() { - var topLeftTile = this.grid[0][0]; - var bottomRightTile = this.grid[this.grid.length-1][this.grid[0].length-1]; - return new OpenLayers.Bounds(topLeftTile.bounds.left, - bottomRightTile.bounds.bottom, - bottomRightTile.bounds.right, - topLeftTile.bounds.top); - }, - - /** - */ - _initTiles:function() { - - //first of all, clear out the main div - this.div.innerHTML = ""; - - //now clear out the old grid and start a new one - this.clearGrid(); - this.grid = new Array(); - - var viewSize = this.map.getSize(); - var bounds = this.map.getExtent(); - var extent = this.map.getFullExtent(); - var resolution = this.map.getResolution(); - var tilelon = resolution*this.tileSize.w; - var tilelat = resolution*this.tileSize.h; - - var offsetlon = bounds.left - extent.left; - var tilecol = Math.floor(offsetlon/tilelon); - var tilecolremain = offsetlon/tilelon - tilecol; - var tileoffsetx = -tilecolremain * this.tileSize.w; - var tileoffsetlon = extent.left + tilecol * tilelon; - - var offsetlat = bounds.top - (extent.bottom + tilelat); - var tilerow = Math.ceil(offsetlat/tilelat); - var tilerowremain = tilerow - offsetlat/tilelat; - var tileoffsety = -tilerowremain * this.tileSize.h; - var tileoffsetlat = extent.bottom + tilerow * tilelat; - - tileoffsetx = Math.round(tileoffsetx); // heaven help us - tileoffsety = Math.round(tileoffsety); - - this.origin = new OpenLayers.Pixel(tileoffsetx,tileoffsety); - - var startX = tileoffsetx; - var startLon = tileoffsetlon; - - do { - var row = new Array(); - this.grid.append(row); - tileoffsetlon = startLon; - tileoffsetx = startX; - do { - var tileBounds = new OpenLayers.Bounds(tileoffsetlon, - tileoffsetlat, - tileoffsetlon+tilelon, - tileoffsetlat+tilelat); - - var tile = this.addTile(tileBounds, - new OpenLayers.Pixel(tileoffsetx - parseInt(this.map.layerContainerDiv.style.left), - tileoffsety - parseInt(this.map.layerContainerDiv.style.top)) - ); - tile.draw((this.params.TRANSPARENT == 'true')); - row.append(tile); - - tileoffsetlon += tilelon; - tileoffsetx += this.tileSize.w; - } while (tileoffsetlon < bounds.right) - - tileoffsetlat -= tilelat; - tileoffsety += this.tileSize.h; - } while(tileoffsetlat > bounds.bottom - tilelat) - - }, - - /** - * @param {bool} prepend - if true, prepend to beginning. - * if false, then append to end - */ - insertRow:function(prepend) { - var modelRowIndex = (prepend) ? 0 : (this.grid.length - 1); - var modelRow = this.grid[modelRowIndex]; - - var newRow = new Array(); - - var resolution = this.map.getResolution(); - var deltaY = (prepend) ? -this.tileSize.h : this.tileSize.h; - var deltaLat = resolution * -deltaY; - - for (var i=0; i < modelRow.length; i++) { - var modelTile = modelRow[i]; - var bounds = modelTile.bounds.copyOf(); - var position = modelTile.position.copyOf(); - bounds.bottom = bounds.bottom + deltaLat; - bounds.top = bounds.top + deltaLat; - position.y = position.y + deltaY; - var newTile = this.addTile(bounds, position); - newTile.draw((this.params.TRANSPARENT == 'true')); - newRow.append(newTile); - } - - if (newRow.length>0){ - if (prepend) { - this.grid.prepend(newRow); - } else { - this.grid.append(newRow); - } - } - }, - - /** - * @param {bool} prepend - if true, prepend to beginning. - * if false, then append to end - */ - insertColumn:function(prepend) { - var modelCellIndex; - var deltaX = (prepend) ? -this.tileSize.w : this.tileSize.w; - var resolution = this.map.getResolution(); - var deltaLon = resolution * deltaX; - - for (var i=0; i 0) { - var row = this.grid[0]; - while(row.length > 0) { - var tile = row[0]; - tile.destroy(); - row.remove(tile); - } - this.grid.remove(row); - } - } - }, - - /** - * addTile gives subclasses of Grid the opportunity to create an - * OpenLayer.Tile of their choosing. The implementer should initialize - * the new tile and take whatever steps necessary to display it. - * - * @param {OpenLayers.Bounds} bounds - * - * @returns The added OpenLayers.Tile - * @type OpenLayers.Tile - */ - addTile:function(bounds,position) { - // Should be implemented by subclasses - }, - - /** @final @type String */ - CLASS_NAME: "OpenLayers.Grid" -}); diff --git a/public/lib/OpenLayers/Layer/KaMap.js b/public/lib/OpenLayers/Layer/KaMap.js deleted file mode 100644 index e4f414541..000000000 --- a/public/lib/OpenLayers/Layer/KaMap.js +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -// @require: OpenLayers/Layer/Grid.js -/** -* @class -*/ -OpenLayers.Layer.KaMap = Class.create(); -OpenLayers.Layer.KaMap.prototype = - Object.extend( new OpenLayers.Layer.Grid(), { - metaTileHeight: 6, - metaTileWidth: 6, - - DEFAULT_PARAMS: { - i: 'jpeg', - map: '' - }, - - // this.cellSize = newScale/(oMap.resolution * inchesPerUnit[oMap.units]); - // kaMap.prototype.geoToPix = function( gX, gY ) { var pX = gX / this.cellSize; var pY = -1 * gY / this.cellSize; } - initialize: function(name, url, params, origin) { - this.kaOrigin = origin; - var newArguments = new Array(); - newArguments.push(name, url, params); - OpenLayers.Layer.Grid.prototype.initialize.apply(this, newArguments); - this.params = (params ? params : {}); - if (arguments.length > 0 && params) { - OpenLayers.Util.applyDefaults( - this.params, - this.DEFAULT_PARAMS - ); - } - }, - addTile:function(bounds,position) { - var zoom = this.map.getZoom(); - var resolution = this.map.getResolution(); - var scale = 128000000 / Math.pow(2, zoom); - // 1280000 is an empirical value for a specific tile server, not yet figured out the right way to do this in general. - // This will probably be based on map.maxResolution. - var cellSize = new OpenLayers.Size(resolution*this.tileSize.w, resolution*this.tileSize.h); - var pX = Math.floor(((bounds.left + this.kaOrigin.lon) / cellSize.w) * this.tileSize.w); - var pY = -Math.floor(((bounds.top+this.kaOrigin.lat) / cellSize.h) * this.tileSize.h); - var url = this.getFullRequestString( - { t: pY, - l: pX, - s: scale - }); - return new OpenLayers.Tile.Image(this, position, bounds, - url, this.tileSize); - }, - /** @final @type String */ - CLASS_NAME: "OpenLayers.Layer.KaMap" -}); diff --git a/public/lib/OpenLayers/Layer/Markers.js b/public/lib/OpenLayers/Layer/Markers.js deleted file mode 100644 index 173b64d7a..000000000 --- a/public/lib/OpenLayers/Layer/Markers.js +++ /dev/null @@ -1,113 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -// @require: OpenLayers/Layer.js -/** -* @class -*/ -OpenLayers.Layer.Markers = Class.create(); -OpenLayers.Layer.Markers.prototype = - Object.extend( new OpenLayers.Layer(), { - - /** internal marker list - * @type Array(OpenLayers.Marker) */ - markers: null, - - /** - * @constructor - * - * @param {String} name - */ - initialize: function(name) { - OpenLayers.Layer.prototype.initialize.apply(this, arguments); - this.markers = new Array(); - }, - - /** - * - */ - destroy: function() { - this.clearMarkers(); - markers = null; - OpenLayers.Layer.prototype.destroy.apply(this, arguments); - }, - - - /** - * @param {OpenLayers.Bounds} bounds - * @param {Boolean} zoomChanged - */ - moveTo: function(bounds, zoomChanged) { - if (zoomChanged) { - this.redraw(); - } - }, - - /** WFS layer is never a base class. - * @type Boolean - */ - isBaseLayer: function() { - return false; - }, - - /** - * @param {OpenLayers.Marker} marker - */ - addMarker: function(marker) { - this.markers.append(marker); - if (this.map && this.map.getExtent()) { - marker.map = this.map; - this.drawMarker(marker); - } - }, - - /** - * @param {OpenLayers.Marker} marker - */ - removeMarker: function(marker) { - this.markers.remove(marker); - if ((marker.icon != null) && (marker.icon.imageDiv != null) && - (marker.icon.imageDiv.parentNode == this.div) ) { - this.div.removeChild(marker.icon.imageDiv); - } - }, - - /** - * - */ - clearMarkers: function() { - if (this.markers != null) { - while(this.markers.length > 0) { - this.removeMarker(this.markers[0]); - } - } - }, - - /** clear all the marker div's from the layer and then redraw all of them. - * Use the map to recalculate new placement of markers. - */ - redraw: function() { - for(i=0; i < this.markers.length; i++) { - this.drawMarker(this.markers[i]); - } - }, - - /** Calculate the pixel location for the marker, create it, and - * add it to the layer's div - * - * @private - * - * @param {OpenLayers.Marker} marker - */ - drawMarker: function(marker) { - var px = this.map.getLayerPxFromLonLat(marker.lonlat); - var markerImg = marker.draw(px); - if (!marker.drawn) { - this.div.appendChild(markerImg); - marker.drawn = true; - } - }, - - /** @final @type String */ - CLASS_NAME: "OpenLayers.Layer.Markers" -}); diff --git a/public/lib/OpenLayers/Layer/Text.js b/public/lib/OpenLayers/Layer/Text.js deleted file mode 100644 index 4c5df8323..000000000 --- a/public/lib/OpenLayers/Layer/Text.js +++ /dev/null @@ -1,172 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -// @require: OpenLayers/Layer/Markers.js - -/** -* @class -*/ -OpenLayers.Layer.Text = Class.create(); -OpenLayers.Layer.Text.prototype = - Object.extend( new OpenLayers.Layer.Markers(), { - - /** store url of text file - * @type str */ - location:null, - - /** @type Array(OpenLayers.Feature) */ - features: null, - - /** @type OpenLayers.Feature */ - selectedFeature: null, - - /** - * @constructor - * - * @param {String} name - * @param {String} location - */ - initialize: function(name, location) { - OpenLayers.Layer.Markers.prototype.initialize.apply(this, [name]); - this.location = location; - this.features = new Array(); - new Ajax.Request(location, - { method: 'get', onComplete:this.parseData.bind(this) } ); - }, - - /** - * - */ - destroy: function() { - this.clearFeatures(); - this.features = null; - OpenLayers.Layer.Markers.prototype.destroy.apply(this, arguments); - }, - - /** WFS layer is never a base class. - * @type Boolean - */ - isBaseLayer: function() { - return false; - }, - - - /** - * @param {?} ajaxRequest - */ - parseData: function(ajaxRequest) { - var text = ajaxRequest.responseText; - var lines = text.split('\n'); - var columns; - // length - 1 to allow for trailing new line - for (var lcv = 0; lcv < (lines.length - 1); lcv++) { - var currLine = lines[lcv].replace(/^\s*/,'').replace(/\s*$/,''); - - if (currLine.charAt(0) != '#') { /* not a comment */ - - if (!columns) { - //First line is columns - columns = currLine.split('\t'); - } else { - var vals = currLine.split('\t'); - var location = new OpenLayers.LonLat(0,0); - var title; var url; - var icon, iconSize, iconOffset; - var set = false; - for (var valIndex = 0; valIndex < vals.length; valIndex++) { - if (vals[valIndex]) { - if (columns[valIndex] == 'point') { - var coords = vals[valIndex].split(','); - location.lat = parseFloat(coords[0]); - location.lon = parseFloat(coords[1]); - set = true; - } else if (columns[valIndex] == 'lat') { - location.lat = parseFloat(vals[valIndex]); - set = true; - } else if (columns[valIndex] == 'lon') { - location.lon = parseFloat(vals[valIndex]); - set = true; - } else if (columns[valIndex] == 'title') - title = vals[valIndex]; - else if (columns[valIndex] == 'image' || - columns[valIndex] == 'icon') - url = vals[valIndex]; - else if (columns[valIndex] == 'iconSize') { - var size = vals[valIndex].split(','); - iconSize = new OpenLayers.Size(parseFloat(size[0]), - parseFloat(size[1])); - } else if (columns[valIndex] == 'iconOffset') { - var offset = vals[valIndex].split(','); - iconOffset = new OpenLayers.Pixel(parseFloat(offset[0]), - parseFloat(offset[1])); - } else if (columns[valIndex] == 'title') { - title = vals[valIndex]; - } else if (columns[valIndex] == 'description') { - description = vals[valIndex]; - } - } - } - if (set) { - var data = new Object(); - if (url != null) { - data.icon = new OpenLayers.Icon(url, - iconSize, - iconOffset); - } else { - data.icon = OpenLayers.Marker.defaultIcon(); - - //allows for the case where the image url is not - // specified but the size is. use a default icon - // but change the size - if (iconSize != null) { - data.icon.setSize(iconSize); - } - - } - if ((title != null) && (description != null)) { - data['popupContentHTML'] = '

'+title+'

'+description+'

'; - } - var feature = new OpenLayers.Feature(this, location, data); - this.features.append(feature); - var marker = feature.createMarker(); - marker.events.register('click', feature, this.markerClick); - this.addMarker(marker); - } - } - } - } - }, - - /** - * @param {Event} evt - */ - markerClick: function(evt) { - sameMarkerClicked = (this == this.layer.selectedFeature); - this.layer.selectedFeature = (!sameMarkerClicked) ? this : null; - for(var i=0; i < this.layer.map.popups.length; i++) { - this.layer.map.removePopup(this.layer.map.popups[i]); - } - if (!sameMarkerClicked) { - this.layer.map.addPopup(this.createPopup()); - } - Event.stop(evt); - }, - - /** - * - */ - clearFeatures: function() { - if (this.features != null) { - while(this.features.length > 0) { - var feature = this.features[0]; - this.features.remove(feature); - feature.destroy(); - } - } - }, - - /** @final @type String */ - CLASS_NAME: "OpenLayers.Text" -}); - - diff --git a/public/lib/OpenLayers/Layer/VirtualEarth.js b/public/lib/OpenLayers/Layer/VirtualEarth.js deleted file mode 100644 index 19db24817..000000000 --- a/public/lib/OpenLayers/Layer/VirtualEarth.js +++ /dev/null @@ -1,107 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -// @require: OpenLayers/Layer.js - -// load VE map control script -document.write(""); - - -/** - * @class - */ -OpenLayers.Layer.VirtualEarth = Class.create(); -OpenLayers.Layer.VirtualEarth.prototype = - Object.extend( new OpenLayers.Layer(), { - - /** @type Boolean */ - viewPortLayer: true, - - /** @type VEMap */ - vemap: null, - - /** - * @constructor - * - * @param {str} name - */ - initialize:function(name) { - OpenLayers.Layer.prototype.initialize.apply(this, arguments); - }, - - /** - * @param {OpenLayers.Map} map - */ - setMap:function(map) { - OpenLayers.Layer.prototype.setMap.apply(this, arguments); - - // once our layer has been added to the map, we can create the vemap - this.map.events.register("addlayer", this, this.loadVEMap); - }, - - /** Virtual Earth layer is always a base class. - * @type Boolean - */ - isBaseLayer: function() { - return true; - }, - - /** - * @param {OpenLayers.Bounds} bounds - * @param {int} zoomChanged - */ - moveTo:function(bounds,zoomChanged) { - - if (this.vemap != null) { - var olCenter = this.map.getCenter(); - var olZoom = this.map.getZoom(); - - this.vemap.SetCenterAndZoom(new VELatLong(olCenter.lat, olCenter.lon), - olZoom + 1); - } - }, - - - /** - * - */ - loadVEMap:function() { - // create div and set to same size as map - var veDiv = OpenLayers.Util.createDiv(this.name); - var sz = this.map.getSize(); - veDiv.style.width = sz.w; - veDiv.style.height = sz.h; - this.div.appendChild(veDiv); - - // create VEMap, hide nav controls - this.vemap = new VEMap(this.name); - this.vemap.LoadMap(); - this.vemap.HideDashboard(); - - // catch pans and zooms from VE Map - this.vemap.AttachEvent("onendcontinuouspan", - this.catchPanZoom.bindAsEventListener(this)); - this.vemap.AttachEvent("onendzoom", - this.catchPanZoom.bindAsEventListener(this)); - - - }, - - /** - * @param {event} e - */ - catchPanZoom: function(e) { - var veCenter = this.vemap.GetCenter(); - var veZoom = this.vemap.GetZoomLevel(); - - var olCenter = new OpenLayers.LonLat(veCenter.Longitude, - veCenter.Latitude); - - this.map.setCenter(olCenter, veZoom - 1); - - }, - - - /** @final @type String */ - CLASS_NAME: "OpenLayers.Layer.VirtualEarth" -}); \ No newline at end of file diff --git a/public/lib/OpenLayers/Layer/WFS.js b/public/lib/OpenLayers/Layer/WFS.js deleted file mode 100644 index 6885b3024..000000000 --- a/public/lib/OpenLayers/Layer/WFS.js +++ /dev/null @@ -1,116 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -// @require: OpenLayers/Layer/Grid.js -// @require: OpenLayers/Layer/Markers.js -/** -* @class -*/ -OpenLayers.Layer.WFS = Class.create(); -OpenLayers.Layer.WFS.prototype = - Object.extend(new OpenLayers.Layer.Grid(), - Object.extend(new OpenLayers.Layer.Markers(), { - - /** @type Object */ - featureClass: OpenLayers.Feature.WFS, - - /** @final @type hash */ - DEFAULT_PARAMS: { service: "WFS", - version: "1.0.0", - request: "GetFeature", - typename: "docpoint" - }, - - /** - * @constructor - * - * @param {str} name - * @param {str} url - * @param {hash} params - * @param {Object} featureClass - */ - initialize: function(name, url, params, featureClass) { - if (featureClass != null) this.featureClass = featureClass; - - var newArguments = new Array(); - if (arguments.length > 0) { - //uppercase params - params = OpenLayers.Util.upperCaseObject(params); - newArguments.push(name, url, params); - } - OpenLayers.Layer.Grid.prototype.initialize.apply(this, newArguments); - OpenLayers.Layer.Markers.prototype.initialize.apply(this, newArguments); - - if (arguments.length > 0) { - OpenLayers.Util.applyDefaults( - this.params, - OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS) - ); - } - }, - - - /** - * - */ - destroy: function() { - OpenLayers.Layer.Grid.prototype.destroy.apply(this, arguments); - OpenLayers.Layer.Markers.prototype.destroy.apply(this, arguments); - }, - - /** - * @param {OpenLayers.Bounds} bounds - * @param {Boolean} zoomChanged - */ - moveTo: function(bounds, zoomChanged) { - OpenLayers.Layer.Grid.prototype.moveTo.apply(this, arguments); - OpenLayers.Layer.Markers.prototype.moveTo.apply(this, arguments); - }, - - /** WFS layer is never a base class. - * @type Boolean - */ - isBaseLayer: function() { - return false; - }, - - /** - * @param {String} name - * @param {hash} params - * - * @returns A clone of this OpenLayers.Layer.WMS, with the passed-in - * parameters merged in. - * @type OpenLayers.Layer.WMS - */ - clone: function (name, params) { - var mergedParams = {} - Object.extend(mergedParams, this.params); - Object.extend(mergedParams, params); - var obj = new OpenLayers.Layer.WFS(name, this.url, mergedParams); - obj.setTileSize(this.tileSize); - return obj; - }, - - /** - * addTile creates a tile, initializes it (via 'draw' in this case), and - * adds it to the layer div. - * - * @param {OpenLayers.Bounds} bounds - * - * @returns The added OpenLayers.Tile.WFS - * @type OpenLayers.Tile.WFS - */ - addTile:function(bounds, position) { - url = this.getFullRequestString( - { BBOX:bounds.toBBOX() }); - - return new OpenLayers.Tile.WFS(this, position, bounds, - url, this.tileSize); - }, - - - /** @final @type String */ - CLASS_NAME: "OpenLayers.Layer.WFS" -} -) -); diff --git a/public/lib/OpenLayers/Layer/WMS.js b/public/lib/OpenLayers/Layer/WMS.js deleted file mode 100644 index d0e21f7f5..000000000 --- a/public/lib/OpenLayers/Layer/WMS.js +++ /dev/null @@ -1,91 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -// @require: OpenLayers/Layer/Grid.js -/** -* @class -*/ -OpenLayers.Layer.WMS = Class.create(); -OpenLayers.Layer.WMS.prototype = - Object.extend( new OpenLayers.Layer.Grid(), { - - /** @final @type hash */ - DEFAULT_PARAMS: { service: "WMS", - version: "1.1.1", - request: "GetMap", - styles: "", - exceptions: "application/vnd.ogc.se_inimage", - format: "image/jpeg" - }, - - /** - * @constructor - * - * @param {str} name - * @param {str} url - * @param {hash} params - */ - initialize: function(name, url, params) { - var newArguments = new Array(); - if (arguments.length > 0) { - //uppercase params - params = OpenLayers.Util.upperCaseObject(params); - newArguments.push(name, url, params); - } - OpenLayers.Layer.Grid.prototype.initialize.apply(this, newArguments); - - if (arguments.length > 0) { - OpenLayers.Util.applyDefaults( - this.params, - OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS) - ); - } - }, - - - /** WFS layer is never a base class. - * @type Boolean - */ - isBaseLayer: function() { - return (this.params.TRANSPARENT != 'true'); - }, - - /** - * @param {String} name - * @param {hash} params - * - * @returns A clone of this OpenLayers.Layer.WMS, with the passed-in - * parameters merged in. - * @type OpenLayers.Layer.WMS - */ - clone: function (name, params) { - var mergedParams = {}; - Object.extend(mergedParams, this.params); - Object.extend(mergedParams, params); - var obj = new OpenLayers.Layer.WMS(name, this.url, mergedParams); - obj.setTileSize(this.tileSize); - return obj; - }, - - /** - * addTile creates a tile, initializes it (via 'draw' in this case), and - * adds it to the layer div. - * - * @param {OpenLayers.Bounds} bounds - * - * @returns The added OpenLayers.Tile.Image - * @type OpenLayers.Tile.Image - */ - addTile:function(bounds,position) { - url = this.getFullRequestString( - {BBOX:bounds.toBBOX(), - WIDTH:this.tileSize.w, - HEIGHT:this.tileSize.h}); - - return new OpenLayers.Tile.Image(this, position, bounds, - url, this.tileSize); - }, - - /** @final @type String */ - CLASS_NAME: "OpenLayers.Layer.WMS" -}); diff --git a/public/lib/OpenLayers/Layer/WMS/Untiled.js b/public/lib/OpenLayers/Layer/WMS/Untiled.js deleted file mode 100644 index 4486c4f02..000000000 --- a/public/lib/OpenLayers/Layer/WMS/Untiled.js +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -// @require: OpenLayers/Layer/Grid.js -/** -* @class -*/ -OpenLayers.Layer.WMS.Untiled = Class.create(); -OpenLayers.Layer.WMS.Untiled.prototype = - Object.extend( new OpenLayers.Layer.Grid(), { - - /** @final @type hash */ - DEFAULT_PARAMS: { service: "WMS", - version: "1.1.1", - request: "GetMap", - styles: "", - exceptions: "application/vnd.ogc.se_inimage", - format: "image/jpeg" - }, - - /** - * @constructor - * - * @param {str} name - * @param {str} url - * @param {hash} params - */ - initialize: function(name, url, params) { - var newArguments = new Array(); - if (arguments.length > 0) { - //uppercase params - params = OpenLayers.Util.upperCaseObject(params); - newArguments.push(name, url, params); - } - OpenLayers.Layer.Grid.prototype.initialize.apply(this, newArguments); - - if (arguments.length > 0) { - OpenLayers.Util.applyDefaults( - this.params, - OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS) - ); - } - }, - - - /** WFS layer is never a base class. - * @type Boolean - */ - isBaseLayer: function() { - return (this.params.TRANSPARENT != true); - }, - - /** - * @param {String} name - * @param {hash} params - * - * @returns A clone of this OpenLayers.Layer.WMS, with the passed-in - * parameters merged in. - * @type OpenLayers.Layer.WMS - */ - clone: function (name, params) { - var mergedParams = {}; - Object.extend(mergedParams, this.params); - Object.extend(mergedParams, params); - var obj = new OpenLayers.Layer.WMS(name, this.url, mergedParams); - obj.setTileSize(this.tileSize); - return obj; - }, - - /** - * addTile creates a tile, initializes it (via 'draw' in this case), and - * adds it to the layer div. - * - * @param {OpenLayers.Bounds} bounds - * - * @returns The added OpenLayers.Tile.Image - * @type OpenLayers.Tile.Image - */ - addTile:function(bounds,position) { - url = this.getFullRequestString( - {BBOX:bounds.toBBOX(), - WIDTH:this.map.getSize().w, - HEIGHT:this.map.getSize().h}); - - return new OpenLayers.Tile.Image(this, position, bounds, - url, this.map.getSize()); - }, - moveTo:function(bounds,zoomChanged, minor) { - if (!minor) { - this.div.innerHTML = ""; - tile = this.addTile(bounds, new OpenLayers.Pixel(-parseInt(this.map.layerContainerDiv.style.left), -parseInt(this.map.layerContainerDiv.style.top))); - tile.draw(); - } - }, - /** @final @type String */ - CLASS_NAME: "OpenLayers.Layer.WMS.Untiled" -}); diff --git a/public/lib/OpenLayers/Layer/Yahoo.js b/public/lib/OpenLayers/Layer/Yahoo.js deleted file mode 100644 index eb9fab728..000000000 --- a/public/lib/OpenLayers/Layer/Yahoo.js +++ /dev/null @@ -1,149 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -// @require: OpenLayers/Layer.js - -// load Yahoo map control script -document.write(""); - -/** - * @class - */ -OpenLayers.Layer.Yahoo = Class.create(); -OpenLayers.Layer.Yahoo.prototype = Object.extend( new OpenLayers.Layer(), { - - /** @type Boolean */ - viewPortLayer: true, - - /** @type GMap2 gmap stores the Google Map element */ - ymap:null, - - /** @type Boolean */ - dragging:false, - - /** - * @constructor - * - * @param {String} name - */ - initialize: function(name) { - OpenLayers.Layer.prototype.initialize.apply(this, [name]); - }, - - /** - * @param {OpenLayers.Map} map - */ - setMap:function(map) { - OpenLayers.Layer.prototype.setMap.apply(this, arguments); - - // once our layer has been added to the map, we can create the vemap - this.map.events.register("addlayer", this, this.loadYMap); - }, - - /** Yahoo layer is always a base class. - * @type Boolean - */ - isBaseLayer: function() { - return true; - }, - - /** - * @param {OpenLayers.Bounds} bounds - * @param {int} zoomChanged - */ - moveTo:function(bounds,zoomChanged) { - - if ((this.ymap != null) && (!this.dragging)) { - - var olCenter = this.map.getCenter(); - var yCenter = this.getYMapCenter(); - - var olZoom = this.map.getZoom(); - var yZoom = this.ymap.getZoomLevel(); - - if ((!olCenter.equals(yCenter)) || (( 16 - olZoom) != yZoom)) { - this.ymap.drawZoomAndCenter(new YGeoPoint(olCenter.lat, olCenter.lon), - 16 - olZoom); - } - } - }, - - /** - * - */ - loadYMap:function() { - // create div and set to same size as map - var yDiv = OpenLayers.Util.createDiv(this.name); - var sz = this.map.getSize(); - yDiv.style.width = sz.w; - yDiv.style.height = sz.h; - this.div.appendChild(yDiv); - - // create GMap, hide nav controls - this.ymap = new YMap(this.div); - - // catch pans and zooms from GMap - YEvent.Capture(this.ymap, - EventsList.endPan, - this.catchPanZoom, - this); - - // catch pans and zooms from GMap - YEvent.Capture(this.ymap, - EventsList.endAutoPan, - this.catchPanZoom, - this); - - - // attach to the drag start and end and we´ll set a flag so that - // we dont get recursivity. this is because the events fall through - // the gmaps div and into the main layer div - YEvent.Capture(this.ymap, - EventsList.startPan, - this.dragStart, - this); - - }, - - /** - * @private - */ - dragStart: function() { - this.dragging = true; - }, - - /** - * @private - * - * @param {event} e - */ - catchPanZoom: function(e) { - this.dragging = false; - - var olCenter = this.getYMapCenter(); - var yZoom = this.ymap.getZoomLevel(); - - this.map.setCenter(olCenter, 16 - yZoom); - - }, - - /** - * @private - * - * @returns An OpenLayers.LonLat with the center of the ymap, or null if - * the YMap has not been centered yet - * @type OpenLayers.LonLat - */ - getYMapCenter:function() { - var olCenter = null; - var yCenter = this.ymap.getCenterLatLon(); - if (yCenter != null) { - olCenter = new OpenLayers.LonLat(yCenter.Lon, yCenter.Lat); - } - return olCenter; - }, - - - /** @final @type String */ - CLASS_NAME: "OpenLayers.Layer.Yahoo" -}); diff --git a/public/lib/OpenLayers/Map.js b/public/lib/OpenLayers/Map.js deleted file mode 100644 index 259175714..000000000 --- a/public/lib/OpenLayers/Map.js +++ /dev/null @@ -1,574 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -// @require: OpenLayers/Util.js -/** -* @class -* -* -*/ - -OpenLayers.Map = Class.create(); -OpenLayers.Map.prototype = { - // Hash: base z-indexes for different classes of thing - Z_INDEX_BASE: { Layer: 100, Popup: 200, Control: 1000 }, - - // Array: supported application event types - EVENT_TYPES: [ - "addlayer", "removelayer", "movestart", "move", "moveend", - "zoomend", "layerchanged", "popupopen", "popupclose", - "addmarker", "removemarker", "clearmarkers", "mouseover", - "mouseout", "mousemove", "dragstart", "drag", "dragend" ], - - // int: zoom levels, used to draw zoom dragging control and limit zooming - maxZoomLevel: 16, - - // OpenLayers.Bounds - maxExtent: new OpenLayers.Bounds(-180, -90, 180, 90), - - /* projection */ - projection: "EPSG:4326", - - /** @type OpenLayers.Size */ - size: null, - - // float - maxResolution: 1.40625, // degrees per pixel - // Default is whole world in 256 pixels, from GMaps - - // DOMElement: the div that our map lives in - div: null, - - // HTMLDivElement: the map's view port - viewPortDiv: null, - - // HTMLDivElement: the map's layer container - layerContainerDiv: null, - - // Array(OpenLayers.Layer): ordered list of layers in the map - layers: null, - - // Array(OpenLayers.Control) - controls: null, - - // Array(OpenLayers.Popup) - popups: null, - - // OpenLayers.LonLat - center: null, - - // int - zoom: null, - - // OpenLayers.Events - events: null, - - // OpenLayers.Pixel - mouseDragStart: null, - - /** @type OpenLayers.Layer */ - baseLayer: null, - - /** - * @param {DOMElement} div - */ - initialize: function (div, options) { - Object.extend(this, options); - - this.div = div = $(div); - - // the viewPortDiv is the outermost div we modify - var id = div.id + "_OpenLayers_ViewPort"; - this.viewPortDiv = OpenLayers.Util.createDiv(id, null, null, null, - "relative", null, - "hidden"); - this.viewPortDiv.style.width = "100%"; - this.viewPortDiv.style.height = "100%"; - this.div.appendChild(this.viewPortDiv); - - // the layerContainerDiv is the one that holds all the layers - id = div.id + "_OpenLayers_Container"; - this.layerContainerDiv = OpenLayers.Util.createDiv(id); - this.viewPortDiv.appendChild(this.layerContainerDiv); - - this.events = new OpenLayers.Events(this, div, this.EVENT_TYPES); - - this.updateSize(); - // make the entire maxExtent fix in zoom level 0 by default - if (this.maxResolution == null || this.maxResolution == "auto") { - this.maxResolution = Math.max( - this.maxExtent.getWidth() / this.size.w, - this.maxExtent.getHeight() / this.size.h ); - } - // update the internal size register whenever the div is resized - this.events.register("resize", this, this.updateSize); - - this.layers = []; - - if (!this.controls) { - this.controls = []; - this.addControl(new OpenLayers.Control.MouseDefaults()); - this.addControl(new OpenLayers.Control.PanZoom()); - } - - this.popups = new Array(); - - // always call map.destroy() - Event.observe(window, 'unload', - this.destroy.bindAsEventListener(this)); - }, - - /** - * @private - */ - destroy:function() { - if (this.layers != null) { - for(var i=0; i< this.layers.length; i++) { - this.layers[i].destroy(); - } - this.layers = null; - } - if (this.controls != null) { - for(var i=0; i< this.controls.length; i++) { - this.controls[i].destroy(); - } - this.controls = null; - } - }, - - /** - * @param {OpenLayers.Layer} layer - */ - addLayer: function (layer) { - layer.setMap(this); - layer.div.style.overflow = ""; - layer.div.style.zIndex = this.Z_INDEX_BASE['Layer'] + this.layers.length; - - if (layer.viewPortLayer) { - this.viewPortDiv.appendChild(layer.div); - } else { - this.layerContainerDiv.appendChild(layer.div); - } - this.layers.push(layer); - - // hack hack hack - until we add a more robust layer switcher, - // which is able to determine which layers are base layers and - // which are not (and put baselayers in a radiobutton group and - // other layers in checkboxes) this seems to be the most straight- - // forward way of dealing with this. - // - if (layer.isBaseLayer()) { - this.baseLayer = layer; - } - this.events.triggerEvent("addlayer"); - }, - - /** Removes a layer from the map by removing its visual element (the - * layer.div property), then removing it from the map's internal list - * of layers, setting the layer's map property to null. - * - * a "removelayer" event is triggered. - * - * very worthy of mention is that simply removing a layer from a map - * will not cause the removal of any popups which may have been created - * by the layer. this is due to the fact that it was decided at some - * point that popups would not belong to layers. thus there is no way - * for us to know here to which layer the popup belongs. - * - * A simple solution to this is simply to call destroy() on the layer. - * the default OpenLayers.Layer class's destroy() function - * automatically takes care to remove itself from whatever map it has - * been attached to. - * - * The correct solution is for the layer itself to register an - * event-handler on "removelayer" and when it is called, if it - * recognizes itself as the layer being removed, then it cycles through - * its own personal list of popups, removing them from the map. - * - * @param {OpenLayers.Layer} layer - */ - removeLayer: function(layer) { - this.layerContainerDiv.removeChild(layer.div); - this.layers.remove(layer); - layer.map = null; - this.events.triggerEvent("removelayer"); - }, - - /** - * @param {Array(OpenLayers.Layer)} layers - */ - addLayers: function (layers) { - for (var i = 0; i < layers.length; i++) { - this.addLayer(layers[i]); - } - }, - - /** - * @param {OpenLayers.Control} control - * @param {OpenLayers.Pixel} px - */ - addControl: function (control, px) { - control.map = this; - this.controls.push(control); - var div = control.draw(px); - if (div) { - div.style.zIndex = this.Z_INDEX_BASE['Control'] + - this.controls.length; - this.viewPortDiv.appendChild( div ); - } - }, - - /** - * @param {OpenLayers.Popup} popup - */ - addPopup: function(popup) { - popup.map = this; - this.popups.push(popup); - var popupDiv = popup.draw(); - if (popupDiv) { - popupDiv.style.zIndex = this.Z_INDEX_BASE['Popup'] + - this.popups.length; - this.layerContainerDiv.appendChild(popupDiv); - } - }, - - /** - * @param {OpenLayers.Popup} popup - */ - removePopup: function(popup) { - this.popups.remove(popup); - if (popup.div) { - this.layerContainerDiv.removeChild(popup.div); - } - popup.map = null; - }, - - /** - * @return {float} - */ - getResolution: function () { - // return degrees per pixel - return this.maxResolution / Math.pow(2, this.zoom); - }, - - /** - * @return {int} - */ - getZoom: function () { - return this.zoom; - }, - - /** - * @returns {OpenLayers.Size} - */ - getSize: function () { - return this.size; - }, - - /** - * @private - */ - updateSize: function() { - this.size = new OpenLayers.Size( - this.div.clientWidth, this.div.clientHeight); - this.events.div.offsets = null; - // Workaround for the fact that hidden elements return 0 for size. - if (this.size.w == 0 && this.size.h == 0) { - var dim = Element.getDimensions(this.div); - this.size.w = dim.width; - this.size.h = dim.height; - } - if (this.size.w == 0 && this.size.h == 0) { - this.size.w = parseInt(this.div.style.width); - this.size.h = parseInt(this.div.style.height); - } - }, - - /** - * @return {OpenLayers.LonLat} - */ - getCenter: function () { - return this.center; - }, - - /** - * @return {OpenLayers.Bounds} - */ - getExtent: function () { - if (this.center) { - var res = this.getResolution(); - var size = this.getSize(); - var w_deg = size.w * res; - var h_deg = size.h * res; - return new OpenLayers.Bounds( - this.center.lon - w_deg / 2, - this.center.lat - h_deg / 2, - this.center.lon + w_deg / 2, - this.center.lat + h_deg / 2); - } else { - return null; - } - }, - - /** - * @return {OpenLayers.Bounds} - */ - getFullExtent: function () { - return this.maxExtent; - }, - - getZoomLevels: function() { - return this.maxZoomLevel; - }, - - /** - * @param {OpenLayers.Bounds} bounds - * - * @return {int} - */ - getZoomForExtent: function (bounds) { - var size = this.getSize(); - var width = bounds.getWidth(); - var height = bounds.getHeight(); - var deg_per_pixel = (width > height ? width / size.w : height / size.h); - var zoom = Math.log(this.maxResolution / deg_per_pixel) / Math.log(2); - return Math.floor(Math.min(Math.max(zoom, 0), this.getZoomLevels())); - }, - - /** - * @param {OpenLayers.Pixel} layerPx - * - * @returns px translated into view port pixel coordinates - * @type OpenLayers.Pixel - * @private - */ - getViewPortPxFromLayerPx:function(layerPx) { - var viewPortPx = layerPx.copyOf(); - - viewPortPx.x += parseInt(this.layerContainerDiv.style.left); - viewPortPx.y += parseInt(this.layerContainerDiv.style.top); - - return viewPortPx; - }, - - /** - * @param {OpenLayers.Pixel} viewPortPx - * - * @returns px translated into view port pixel coordinates - * @type OpenLayers.Pixel - * @private - */ - getLayerPxFromViewPortPx:function(viewPortPx) { - var layerPx = viewPortPx.copyOf(); - - layerPx.x -= parseInt(this.layerContainerDiv.style.left); - layerPx.y -= parseInt(this.layerContainerDiv.style.top); - - return layerPx; - }, - - - /** - * @param {OpenLayers.Pixel} px - * - * @return {OpenLayers.LonLat} - */ - getLonLatFromLayerPx: function (px) { - //adjust for displacement of layerContainerDiv - px = this.getViewPortPxFromLayerPx(px); - return this.getLonLatFromViewPortPx(px); - }, - - /** - * @param {OpenLayers.Pixel} viewPortPx - * - * @returns An OpenLayers.LonLat which is the passed-in view port - * OpenLayers.Pixel, translated into lon/lat given the - * current extent and resolution - * @type OpenLayers.LonLat - * @private - */ - getLonLatFromViewPortPx: function (viewPortPx) { - var center = this.getCenter(); //map center lon/lat - var res = this.getResolution(); - var size = this.getSize(); - - var delta_x = viewPortPx.x - (size.w / 2); - var delta_y = viewPortPx.y - (size.h / 2); - - return new OpenLayers.LonLat(center.lon + delta_x * res , - center.lat - delta_y * res); - }, - - // getLonLatFromPixel is a convenience function for the API - /** - * @param {OpenLayers.Pixel} pixel - * - * @returns An OpenLayers.LonLat corresponding to the given - * OpenLayers.Pixel, translated into lon/lat using the - * current extent and resolution - * @type OpenLayers.LonLat - */ - getLonLatFromPixel: function (px) { - return this.getLonLatFromViewPortPx(px); - }, - - /** - * @param {OpenLayers.LonLat} lonlat - * - * @returns An OpenLayers.Pixel which is the passed-in OpenLayers.LonLat, - * translated into layer pixels given the current extent - * and resolution - * @type OpenLayers.Pixel - */ - getLayerPxFromLonLat: function (lonlat) { - //adjust for displacement of layerContainerDiv - var px = this.getViewPortPxFromLonLat(lonlat); - return this.getLayerPxFromViewPortPx(px); - }, - - /** - * @param {OpenLayers.LonLat} lonlat - * - * @returns An OpenLayers.Pixel which is the passed-in OpenLayers.LonLat, - * translated into view port pixels given the current extent - * and resolution - * @type OpenLayers.Pixel - * @private - */ - getViewPortPxFromLonLat: function (lonlat) { - var resolution = this.getResolution(); - var extent = this.getExtent(); - return new OpenLayers.Pixel( - Math.round(1/resolution * (lonlat.lon - extent.left)), - Math.round(1/resolution * (extent.top - lonlat.lat)) - ); - }, - - // getLonLatFromPixel is a convenience function for the API - /** - * @param {OpenLayers.LonLat} lonlat - * - * @returns An OpenLayers.Pixel corresponding to the OpenLayers.LonLat - * translated into view port pixels using the current extent - * and resolution - * @type OpenLayers.Pixel - */ - getPixelFromLonLat: function (lonlat) { - return this.getViewPortPxFromLonLat(lonlat); - }, - - /** - * @param {OpenLayers.LonLat} lonlat - * @param {int} zoom - */ - setCenter: function (lonlat, zoom, minor) { - if (this.center) { // otherwise there's nothing to move yet - this.moveLayerContainer(lonlat); - } - this.center = lonlat.copyOf(); - var zoomChanged = null; - if (zoom != null && zoom != this.zoom - && zoom >= 0 && zoom <= this.getZoomLevels()) { - zoomChanged = (this.zoom == null ? 0 : this.zoom); - this.zoom = zoom; - } - - if (!minor) this.events.triggerEvent("movestart"); - this.moveToNewExtent(zoomChanged, minor); - if (!minor) this.events.triggerEvent("moveend"); - }, - - /** - * ZOOM TO BOUNDS FUNCTION - * @private - */ - moveToNewExtent: function (zoomChanged, minor) { - if (zoomChanged != null) { // reset the layerContainerDiv's location - this.layerContainerDiv.style.left = "0px"; - this.layerContainerDiv.style.top = "0px"; - - //redraw popups - for (var i = 0; i < this.popups.length; i++) { - this.popups[i].updatePosition(); - } - - } - var bounds = this.getExtent(); - for (var i = 0; i < this.layers.length; i++) { - this.layers[i].moveTo(bounds, (zoomChanged != null), minor); - } - this.events.triggerEvent("move"); - if (zoomChanged != null) - this.events.triggerEvent("zoomend", - {oldZoom: zoomChanged, newZoom: this.zoom}); - }, - - /** - * zoomIn - * Increase zoom level by one. - * @param {int} zoom - */ - zoomIn: function() { - if (this.zoom != null && this.zoom <= this.getZoomLevels()) { - this.zoomTo( this.zoom += 1 ); - } - }, - - /** - * zoomTo - * Set Zoom To int - * @param {int} zoom - */ - zoomTo: function(zoom) { - if (zoom >= 0 && zoom <= this.getZoomLevels()) { - var oldZoom = this.zoom; - this.zoom = zoom; - this.moveToNewExtent(oldZoom); - } - }, - - /** - * zoomOut - * Decrease zoom level by one. - * @param {int} zoom - */ - zoomOut: function() { - if (this.zoom != null && this.zoom > 0) { - this.zoomTo( this.zoom - 1 ); - } - }, - - /** - * zoomToFullExtent - * Zoom to the full extent and recenter. - */ - zoomToFullExtent: function() { - var fullExtent = this.getFullExtent(); - this.setCenter( - new OpenLayers.LonLat((fullExtent.left+fullExtent.right)/2, - (fullExtent.bottom+fullExtent.top)/2), - this.getZoomForExtent(fullExtent) - ); - }, - - /** - * @param {OpenLayers.LonLat} lonlat - * @private - */ - moveLayerContainer: function (lonlat) { - var container = this.layerContainerDiv; - var resolution = this.getResolution(); - - var deltaX = Math.round((this.center.lon - lonlat.lon) / resolution); - var deltaY = Math.round((this.center.lat - lonlat.lat) / resolution); - - var offsetLeft = parseInt(container.style.left); - var offsetTop = parseInt(container.style.top); - - container.style.left = (offsetLeft + deltaX) + "px"; - container.style.top = (offsetTop - deltaY) + "px"; - }, - - CLASS_NAME: "OpenLayers.Map" -}; diff --git a/public/lib/OpenLayers/Marker.js b/public/lib/OpenLayers/Marker.js deleted file mode 100644 index 0640295d7..000000000 --- a/public/lib/OpenLayers/Marker.js +++ /dev/null @@ -1,109 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -/** -* @class -*/ -OpenLayers.Marker = Class.create(); -OpenLayers.Marker.prototype = { - - /** @type OpenLayers.Icon */ - icon: null, - - /** location of object - * @type OpenLayers.LonLat */ - lonlat: null, - - /** @type OpenLayers.Events*/ - events: null, - - /** @type OpenLayers.Map */ - map: null, - - /** - * @constructor - * - * @param {OpenLayers.Icon} icon - * @param {OpenLayers.LonLat lonlat - */ - initialize: function(lonlat, icon) { - this.lonlat = lonlat; - this.icon = (icon) ? icon : OpenLayers.Marker.defaultIcon(); - - this.events = new OpenLayers.Events(this, this.icon.imageDiv, null); - }, - - destroy: function() { - this.map = null; - - if (this.icon != null) { - this.icon.destroy(); - this.icon = null; - } - }, - - /** - * @param {OpenLayers.Pixel} px - * - * @return A new DOM Image with this marker´s icon set at the - * location passed-in - * @type DOMElement - */ - draw: function(px) { - return this.icon.draw(px); - }, - - /** - * @param {OpenLayers.Pixel} px - */ - moveTo: function (px) { - if ((px != null) && (this.icon != null)) { - this.icon.moveTo(px); - } - }, - - /** - * @returns Whether or not the marker is currently visible on screen. - * @type Boolean - */ - onScreen:function() { - - var onScreen = false; - if (this.map) { - var screenBounds = this.map.getExtent(); - onScreen = screenBounds.contains(this.lonlat.lon, this.lonlat.lat); - } - return onScreen; - }, - - /** - * @param {float} inflate - */ - inflate: function(inflate) { - if (this.icon) { - var newSize = new OpenLayers.Size(this.icon.size.w * inflate, - this.icon.size.h * inflate); - this.icon.setSize(newSize); - } - }, - - /** @final @type String */ - CLASS_NAME: "OpenLayers.Marker" -}; - - -/** - * @returns A default OpenLayers.Icon to use for a marker - * @type OpenLayers.Icon - */ -OpenLayers.Marker.defaultIcon = function() { - var url = OpenLayers.Util.getImagesLocation() + "marker.png"; - var size = new OpenLayers.Size(21, 25); - var calculateOffset = function(size) { - return new OpenLayers.Pixel(-(size.w/2), -size.h); - }; - - return new OpenLayers.Icon(url, size, null, calculateOffset); -}; - - diff --git a/public/lib/OpenLayers/Popup.js b/public/lib/OpenLayers/Popup.js deleted file mode 100644 index 1491109c5..000000000 --- a/public/lib/OpenLayers/Popup.js +++ /dev/null @@ -1,232 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -/** -* @class -*/ -OpenLayers.Popup = Class.create(); - -OpenLayers.Popup.count = 0; -OpenLayers.Popup.WIDTH = 200; -OpenLayers.Popup.HEIGHT = 200; -OpenLayers.Popup.COLOR = "white"; -OpenLayers.Popup.OPACITY = 1; -OpenLayers.Popup.BORDER = "0px"; - -OpenLayers.Popup.prototype = { - - /** @type OpenLayers.Events*/ - events: null, - - /** @type String */ - id: "", - - /** @type OpenLayers.LonLat */ - lonlat: null, - - /** @type DOMElement */ - div: null, - - /** @type OpenLayers.Size*/ - size: null, - - /** @type String */ - contentHTML: "", - - /** @type String */ - backgroundColor: "", - - /** @type float */ - opacity: "", - - /** @type String */ - border: "", - - /** this gets set in Map.js when the popup is added to the map - * @type OpenLayers.Map */ - map: null, - - /** - * @constructor - * - * @param {String} id - * @param {OpenLayers.LonLat} lonlat - * @param {OpenLayers.Size} size - * @param {String} contentHTML - */ - initialize:function(id, lonlat, size, contentHTML) { - OpenLayers.Popup.count += 1; - this.id = (id != null) ? id : "Popup" + OpenLayers.Popup.count; - this.lonlat = lonlat; - this.size = (size != null) ? size - : new OpenLayers.Size( - OpenLayers.Popup.WIDTH, - OpenLayers.Popup.HEIGHT); - if (contentHTML != null) { - this.contentHTML = contentHTML; - } - this.backgroundColor = OpenLayers.Popup.COLOR; - this.opacity = OpenLayers.Popup.OPACITY; - this.border = OpenLayers.Popup.BORDER; - - this.div = OpenLayers.Util.createDiv(this.id + "_div", null, null, - null, null, null, "hidden"); - - this.events = new OpenLayers.Events(this, this.div, null); - }, - - /** - */ - destroy: function() { - if (this.map != null) { - this.map.removePopup(this); - } - this.div = null; - this.map = null; - }, - - /** - * @param {OpenLayers.Pixel} px - * - * @returns Reference to a div that contains the drawn popup - * @type DOMElement - */ - draw: function(px) { - if (px == null) { - if ((this.lonlat != null) && (this.map != null)) { - px = this.map.getLayerPxFromLonLat(this.lonlat); - } - } - - this.setSize(); - this.setBackgroundColor(); - this.setOpacity(); - this.setBorder(); - this.setContentHTML(); - this.moveTo(px); - - return this.div; - }, - - /** - * if the popup has a lonlat and its map members set, - * then have it move itself to its proper position - */ - updatePosition: function() { - if ((this.lonlat) && (this.map)) { - var px = this.map.getLayerPxFromLonLat(this.lonlat); - this.moveTo(px); - } - }, - - /** - * @param {OpenLayers.Pixel} px - */ - moveTo: function(px) { - if ((px != null) && (this.div != null)) { - this.div.style.left = px.x + "px"; - this.div.style.top = px.y + "px"; - } - }, - - /** - * @returns Boolean indicating whether or not the popup is visible - * @type Boolean - */ - visible: function() { - return Element.visible(this.div); - }, - - /** - * - */ - toggle: function() { - Element.toggle(this.div); - }, - - /** - * - */ - show: function() { - Element.show(this.div); - }, - - /** - * - */ - hide: function() { - Element.hide(this.div); - }, - - /** - * @param {OpenLayers.Size} size - */ - setSize:function(size) { - if (size != undefined) { - this.size = size; - } - - if (this.div != null) { - this.div.style.width = this.size.w; - this.div.style.height = this.size.h; - } - }, - - /** - * @param {String} color - */ - setBackgroundColor:function(color) { - if (color != undefined) { - this.backgroundColor = color; - } - - if (this.div != null) { - this.div.style.backgroundColor = this.backgroundColor; - } - }, - - /** - * @param {float} opacity - */ - setOpacity:function(opacity) { - if (opacity != undefined) { - this.opacity = opacity; - } - - if (this.div != null) { - // for Mozilla and Safari - this.div.style.opacity = this.opacity; - - // for IE - this.div.style.filter = 'alpha(opacity=' + this.opacity*100 + ')'; - } - }, - - /** - * @param {int} border - */ - setBorder:function(border) { - if (border != undefined) { - this.border = border; - } - - if (this.div != null) { - this.div.style.border = this.border; - } - }, - - /** - * @param {String} contentHTML - */ - setContentHTML:function(contentHTML) { - if (contentHTML != null) { - this.contentHTML = contentHTML; - } - - if (this.div != null) { - this.div.innerHTML = this.contentHTML; - } - }, - - CLASS_NAME: "OpenLayers.Popup" -}; diff --git a/public/lib/OpenLayers/Popup/Anchored.js b/public/lib/OpenLayers/Popup/Anchored.js deleted file mode 100644 index 90db91279..000000000 --- a/public/lib/OpenLayers/Popup/Anchored.js +++ /dev/null @@ -1,125 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -// @require: OpenLayers/Popup.js - -/** -* @class -*/ -OpenLayers.Popup.Anchored = Class.create(); -OpenLayers.Popup.Anchored.prototype = - Object.extend( new OpenLayers.Popup(), { - - /** "lr", "ll", "tr", "tl" - relative position of the popup. - * @type String */ - relativePosition: null, - - /** Object which must have expose a 'size' (OpenLayers.Size) and - * 'offset' (OpenLayers.Pixel) - * @type Object */ - anchor: null, - - /** - * @constructor - * - * @param {String} id - * @param {OpenLayers.LonLat} lonlat - * @param {OpenLayers.Size} size - * @param {String} contentHTML - * @param {Object} anchor Object which must expose a - * - 'size' (OpenLayers.Size) and - * - 'offset' (OpenLayers.Pixel) - * (this is generally an OpenLayers.Icon) - */ - initialize:function(id, lonlat, size, contentHTML, anchor) { - var newArguments = new Array(id, lonlat, size, contentHTML); - OpenLayers.Popup.prototype.initialize.apply(this, newArguments); - - this.anchor = (anchor != null) ? anchor - : { size: new OpenLayers.Size(0,0), - offset: new OpenLayers.Pixel(0,0)}; - }, - - /** - * @param {OpenLayers.Pixel} px - * - * @returns Reference to a div that contains the drawn popup - * @type DOMElement - */ - draw: function(px) { - if (px == null) { - if ((this.lonlat != null) && (this.map != null)) { - px = this.map.getLayerPxFromLonLat(this.lonlat); - } - } - - //calculate relative position - this.relativePosition = this.calculateRelativePosition(px); - - return OpenLayers.Popup.prototype.draw.apply(this, arguments); - }, - - /** - * @private - * - * @param {OpenLayers.Pixel} px - * - * @returns The relative position ("br" "tr" "tl "bl") at which the popup - * should be placed - * @type String - */ - calculateRelativePosition:function(px) { - var lonlat = this.map.getLonLatFromLayerPx(px); - - var extent = this.map.getExtent(); - var quadrant = extent.determineQuadrant(lonlat); - - return OpenLayers.Bounds.oppositeQuadrant(quadrant); - }, - - /** - * @param {OpenLayers.Pixel} px - */ - moveTo: function(px) { - - var newPx = this.calculateNewPx(px); - - var newArguments = new Array(newPx); - OpenLayers.Popup.prototype.moveTo.apply(this, newArguments); - }, - - /** - * @param {OpenLayers.Size} size - */ - setSize:function(size) { - OpenLayers.Popup.prototype.setSize.apply(this, arguments); - - if ((this.lonlat) && (this.map)) { - var px = this.map.getLayerPxFromLonLat(this.lonlat); - this.moveTo(px); - } - }, - - /** - * @private - * - * @param {OpenLayers.Pixel} px - * - * @returns The the new px position of the popup on the screen - * relative to the passed-in px - * @type OpenLayers.Pixel - */ - calculateNewPx:function(px) { - var newPx = px.offset(this.anchor.offset); - - var top = (this.relativePosition.charAt(0) == 't'); - newPx.y += (top) ? -this.size.h : this.anchor.size.h; - - var left = (this.relativePosition.charAt(1) == 'l'); - newPx.x += (left) ? -this.size.w : this.anchor.size.w; - - return newPx; - }, - - CLASS_NAME: "OpenLayers.Popup.Anchored" -}); diff --git a/public/lib/OpenLayers/Popup/AnchoredBubble.js b/public/lib/OpenLayers/Popup/AnchoredBubble.js deleted file mode 100644 index 352086dbd..000000000 --- a/public/lib/OpenLayers/Popup/AnchoredBubble.js +++ /dev/null @@ -1,183 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -// @require: OpenLayers/Popup/Anchored.js - -/** -* @class -*/ -OpenLayers.Popup.AnchoredBubble = Class.create(); - -//Border space for the rico corners -OpenLayers.Popup.AnchoredBubble.CORNER_SIZE = 5; - -OpenLayers.Popup.AnchoredBubble.prototype = - Object.extend( new OpenLayers.Popup.Anchored(), { - - /** @type DOMElement */ - contentDiv:null, - - - /** - * @constructor - * - * @param {String} id - * @param {OpenLayers.LonLat} lonlat - * @param {OpenLayers.Size} size - * @param {String} contentHTML - * @param {Object} anchor Object which must expose a - * - 'size' (OpenLayers.Size) and - * - 'offset' (OpenLayers.Pixel) - * (this is generally an OpenLayers.Icon) - */ - initialize:function(id, lonlat, size, contentHTML, anchor) { - OpenLayers.Popup.Anchored.prototype.initialize.apply(this, arguments); - }, - - /** - * @param {OpenLayers.Pixel} px - * - * @returns Reference to a div that contains the drawn popup - * @type DOMElement - */ - draw: function(px) { - - OpenLayers.Popup.Anchored.prototype.draw.apply(this, arguments); - - // make the content Div - var contentSize = this.size.copyOf(); - contentSize.h -= (2 * OpenLayers.Popup.AnchoredBubble.CORNER_SIZE); - - var id = this.div.id + "-contentDiv"; - this.contentDiv = OpenLayers.Util.createDiv(id, null, contentSize, - null, "relative", null, - "hidden"); - this.div.appendChild(this.contentDiv); - this.setContentHTML(); - - this.setRicoCorners(true); - - //set the popup color and opacity - this.setBackgroundColor(); - this.setOpacity(); - - return this.div; - }, - - /** - * @param {OpenLayers.Size} size - */ - setSize:function(size) { - OpenLayers.Popup.Anchored.prototype.setSize.apply(this, arguments); - - if (this.contentDiv != null) { - - var contentSize = this.size.copyOf(); - contentSize.h -= (2 * OpenLayers.Popup.AnchoredBubble.CORNER_SIZE); - - this.contentDiv.style.height = contentSize.h + "px"; - - //size has changed - must redo corners - this.setRicoCorners(false); - } - }, - - /** - * @param {String} color - */ - setBackgroundColor:function(color) { - if (color != undefined) { - this.backgroundColor = color; - } - - if (this.div != null) { - if (this.contentDiv != null) { - this.div.style.background = "transparent"; - Rico.Corner.changeColor(this.contentDiv, this.backgroundColor); - } - } - }, - - /** - * @param {float} opacity - */ - setOpacity:function(opacity) { - if (opacity != undefined) { - this.opacity = opacity; - } - - if (this.div != null) { - if (this.contentDiv != null) { - Rico.Corner.changeOpacity(this.contentDiv, this.opacity); - } - } - }, - - /** Bubble Popups can not have a border - * - * @param {int} border - */ - setBorder:function(border) { - this.border = 0; - }, - - /** - * @param {String} contentHTML - */ - setContentHTML:function(contentHTML) { - if (contentHTML != null) { - this.contentHTML = contentHTML; - } - - if (this.contentDiv != null) { - this.contentDiv.innerHTML = this.contentHTML; - } - }, - - /** - * @private - * - * @param {Boolean} firstTime Is this the first time the corners are being - * rounded? - * - * update the rico corners according to the popup's - * current relative postion - */ - setRicoCorners:function(firstTime) { - - var corners = this.getCornersToRound(this.relativePosition); - var options = {corners: corners, - color: this.backgroundColor, - bgColor: "transparent", - blend: false}; - - if (firstTime) { - Rico.Corner.round(this.div, options); - } else { - Rico.Corner.reRound(this.contentDiv, options); - //set the popup color and opacity - this.setBackgroundColor(); - this.setOpacity(); - } - }, - - /** - * @private - * - * @returns The proper corners string ("tr tl bl br") for rico - * to round - * @type String - */ - getCornersToRound:function() { - - var corners = ['tl', 'tr', 'bl', 'br']; - - //we want to round all the corners _except_ the opposite one. - var corner = OpenLayers.Bounds.oppositeQuadrant(this.relativePosition); - corners.remove(corner); - - return corners.join(" "); - }, - - CLASS_NAME: "OpenLayers.Popup.AnchoredBubble" -}); diff --git a/public/lib/OpenLayers/SingleFile.js b/public/lib/OpenLayers/SingleFile.js deleted file mode 100644 index 857c48490..000000000 --- a/public/lib/OpenLayers/SingleFile.js +++ /dev/null @@ -1,5 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -_OPENLAYERS_SFL_=true - diff --git a/public/lib/OpenLayers/Tile.js b/public/lib/OpenLayers/Tile.js deleted file mode 100644 index eca7c0bca..000000000 --- a/public/lib/OpenLayers/Tile.js +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -/* - * OpenLayers.Tile - * - * @class This is a class designed to designate a single tile, however - * it is explicitly designed to do relatively little. Tiles store information - * about themselves -- such as the URL that they are related to, and their - * size - but do not add themselves to the layer div automatically, for - * example. - */ -OpenLayers.Tile = Class.create(); -OpenLayers.Tile.prototype = { - - /** @type OpenLayers.Layer */ - layer: null, - - /** @type String url of the request */ - url:null, - - /** @type OpenLayers.Bounds */ - bounds:null, - - /** @type OpenLayers.Size */ - size:null, - - /** Top Left pixel of the tile - * @type OpenLayers.Pixel */ - position:null, - - /** - * @constructor - * - * @param {OpenLayers.Layer} layer - * @param {OpenLayers.Pixel} position - * @param {OpenLayers.Bounds} bounds - * @param {String} url - * @param {OpenLayers.Size} size - */ - initialize: function(layer, position, bounds, url, size) { - if (arguments.length > 0) { - this.layer = layer; - this.position = position; - this.bounds = bounds; - this.url = url; - this.size = size; - } - }, - - /** nullify references to prevent circular references and memory leaks - */ - destroy:function() { - this.layer = null; - this.bounds = null; - this.size = null; - }, - - /** - */ - draw:function() { - - // HACK HACK - should we make it a standard to put this sort of warning - // message in functions that are supposed to be overridden? - // - // Log.warn(this.CLASS_NAME + ": draw() not implemented"); - - }, - - /** remove this tile from the ds - */ - remove:function() { - }, - - /** - * @type OpenLayers.Pixel - */ - getPosition: function() { - return this.position; - }, - - /** @final @type String */ - CLASS_NAME: "OpenLayers.Tile" -}; - diff --git a/public/lib/OpenLayers/Tile/Image.js b/public/lib/OpenLayers/Tile/Image.js deleted file mode 100644 index 6a386f8c2..000000000 --- a/public/lib/OpenLayers/Tile/Image.js +++ /dev/null @@ -1,60 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -// @require: OpenLayers/Tile.js -/** -* @class -*/ -OpenLayers.Tile.Image = Class.create(); -OpenLayers.Tile.Image.prototype = - Object.extend( new OpenLayers.Tile(), { - - /** @type DOMElement img */ - imgDiv:null, - - /** - * @constructor - * - * @param {OpenLayers.Grid} layer - * @param {OpenLayers.Pixel} position - * @param {OpenLayers.Bounds} bounds - * @param {String} url - * @param {OpenLayers.Size} size - */ - initialize: function(layer, position, bounds, url, size) { - OpenLayers.Tile.prototype.initialize.apply(this, arguments); - }, - - destroy: function() { - if ((this.imgDiv != null) && (this.imgDiv.parentNode == this.layer.div)) { - this.layer.div.removeChild(this.imgDiv); - } - this.imgDiv = null; - OpenLayers.Tile.prototype.destroy.apply(this, arguments); - }, - - /** - */ - draw:function(transparent) { - if (false) { // don't actually use the alpha PNG hack right now - // it has a fiercely bad effect on IE6's performance - // if (transparent) { - this.imgDiv = OpenLayers.Util.createAlphaImageDiv(null, - this.position, - this.size, - this.url, - "absolute"); - } else { - this.imgDiv = OpenLayers.Util.createImage(null, - this.position, - this.size, - this.url, - "absolute"); - } - this.layer.div.appendChild(this.imgDiv); - }, - - /** @final @type String */ - CLASS_NAME: "OpenLayers.Tile.Image" - } -); diff --git a/public/lib/OpenLayers/Tile/WFS.js b/public/lib/OpenLayers/Tile/WFS.js deleted file mode 100644 index 486d1384c..000000000 --- a/public/lib/OpenLayers/Tile/WFS.js +++ /dev/null @@ -1,100 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -// @require: OpenLayers/Tile.js -/** -* @class -*/ -OpenLayers.Tile.WFS = Class.create(); -OpenLayers.Tile.WFS.prototype = - Object.extend( new OpenLayers.Tile(), { - - /** @type Array(OpenLayers.Feature)*/ - features: null, - - - /** - * @constructor - * - * @param {OpenLayers.Layer} layer - * @param {OpenLayers.Pixel} position - * @param {OpenLayers.Bounds} bounds - * @param {String} url - * @param {OpenLayers.Size} size - */ - initialize: function(layer, position, bounds, url, size) { - OpenLayers.Tile.prototype.initialize.apply(this, arguments); - - this.features = new Array(); - }, - - /** - * - */ - destroy: function() { - for(var i=0; i < this.features.length; i++) { - this.features[i].destroy(); - } - OpenLayers.Tile.prototype.destroy.apply(this, arguments); - }, - - /** - */ - draw:function() { - this.loadFeaturesForRegion(this.requestSuccess); - }, - - - /** get the full request string from the ds and the tile params - * and call the AJAX loadURL(). - * - * input are function pointers for what to do on success and failure. - * - * @param {function} success - * @param {function} failure - */ - loadFeaturesForRegion:function(success, failure) { - - if (!this.loaded) { - - if (this.url != "") { - - // TODO: Hmmm, this stops multiple loads of the data when a - // result isn't immediately retrieved, but it's hacky. - // Do it better. - this.loaded = true; - OpenLayers.loadURL(this.url, null, this, success, failure); - } - } - }, - - /** Return from AJAX request - * - * @param {} request - */ - requestSuccess:function(request) { - var doc = request.responseXML; - - if (!doc || request.fileType!="XML") { - doc = OpenLayers.parseXMLString(request.responseText); - } - - var resultFeatures = doc.getElementsByTagName("featureMember"); - - //clear old featureList - this.features = new Array(); - - for (var i=0; i < resultFeatures.length; i++) { - - var feature = new this.layer.featureClass(this.layer, - resultFeatures[i]); - this.features.append(feature); - } - - }, - - /** @final @type String */ - CLASS_NAME: "OpenLayers.Tile.WFS" - } -); - diff --git a/public/lib/OpenLayers/Util.js b/public/lib/OpenLayers/Util.js deleted file mode 100644 index 9270821e0..000000000 --- a/public/lib/OpenLayers/Util.js +++ /dev/null @@ -1,1010 +0,0 @@ -/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full - * text of the license. */ -/** -* @class -*/ -OpenLayers.Util = new Object(); - - - - -/** -* @class This class represents a screen coordinate, in x and y coordinates -*/ -OpenLayers.Pixel = Class.create(); -OpenLayers.Pixel.prototype = { - - /** @type float */ - x: 0.0, - - /** @type float */ - y: 0.0, - - /** - * @constructor - * - * @param {float} x - * @param {float} y - */ - initialize: function(x, y) { - this.x = x; - this.y = y; - }, - - /** - * @return string representation of Pixel. ex: "x=200.4,y=242.2" - * @type str - */ - toString:function() { - return ("x=" + this.x + ",y=" + this.y); - }, - - /** - * @type OpenLayers.Pixel - */ - copyOf:function() { - return new OpenLayers.Pixel(this.x, this.y); - }, - - /** - * @param {OpenLayers.Pixel} px - * - * @return whether or not the point passed in as parameter is equal to this - * note that if px passed in is null, returns false - * @type bool - */ - equals:function(px) { - var equals = false; - if (px != null) { - equals = ((this.x == px.x) && (this.y == px.y)); - } - return equals; - }, - - /** - * @param {int} x - * @param {int} y - * - * @return a new Pixel with this pixel's x&y augmented by the - * values passed in. - * @type OpenLayers.Pixel - */ - add:function(x, y) { - return new OpenLayers.Pixel(this.x + x, this.y + y); - }, - - /** - * @param {OpenLayers.Pixel} px - * - * @return a new Pixel with this pixel's x&y augmented by the - * x&y values of the pixel passed in. - * @type OpenLayers.Pixel - */ - offset:function(px) { - return this.add(px.x, px.y); - }, - - /** @final @type str */ - CLASS_NAME: "OpenLayers.Pixel" -}; - - -/** -* @class This class represents a width and height pair -*/ -OpenLayers.Size = Class.create(); -OpenLayers.Size.prototype = { - - /** @type float */ - w: 0.0, - - /** @type float */ - h: 0.0, - - - /** - * @constructor - * - * @param {float} w - * @param {float} h - */ - initialize: function(w, h) { - this.w = w; - this.h = h; - }, - - /** - * @return String representation of OpenLayers.Size object. - * (ex. "w=55,h=66") - * @type String - */ - toString:function() { - return ("w=" + this.w + ",h=" + this.h); - }, - - /** - * @return New OpenLayers.Size object with the same w and h values - * @type OpenLayers.Size - */ - copyOf:function() { - return new OpenLayers.Size(this.w, this.h); - }, - - /** - * @param {OpenLayers.Size} sz - * @returns Boolean value indicating whether the passed-in OpenLayers.Size - * object has the same w and h components as this - * note that if sz passed in is null, returns false - * - * @type bool - */ - equals:function(sz) { - var equals = false; - if (sz != null) { - equals = ((this.w == sz.w) && (this.h == sz.h)); - } - return equals; - }, - - /** @final @type String */ - CLASS_NAME: "OpenLayers.Size" -}; - -/** -* @class This class represents a longitude and latitude pair -*/ -OpenLayers.LonLat = Class.create(); -OpenLayers.LonLat.prototype = { - - /** @type float */ - lon: 0.0, - - /** @type float */ - lat: 0.0, - - /** - * @constructor - * - * @param {float} lon - * @param {float} lat - */ - initialize: function(lon, lat) { - this.lon = lon; - this.lat = lat; - }, - - /** - * @return String representation of OpenLayers.LonLat object. - * (ex. "lon=5,lat=42") - * @type String - */ - toString:function() { - return ("lon=" + this.lon + ",lat=" + this.lat); - }, - - /** - * @return Shortened String representation of OpenLayers.LonLat object. - * (ex. "5, 42") - * @type String - */ - toShortString:function() { - return (this.lon + ", " + this.lat); - }, - - /** - * @return New OpenLayers.LonLat object with the same lon and lat values - * @type OpenLayers.LonLat - */ - copyOf:function() { - return new OpenLayers.LonLat(this.lon, this.lat); - }, - - /** - * @param {float} lon - * @param {float} lat - * - * @return A new OpenLayers.LonLat object with the lon and lat passed-in - * added to this's. - * @type OpenLayers.LonLat - */ - add:function(lon, lat) { - return new OpenLayers.LonLat(this.lon + lon, this.lat + lat); - }, - - /** - * @param {OpenLayers.LonLat} ll - * @returns Boolean value indicating whether the passed-in OpenLayers.LonLat - * object has the same lon and lat components as this - * note that if ll passed in is null, returns false - * - * @type bool - */ - equals:function(ll) { - var equals = false; - if (ll != null) { - equals = ((this.lon == ll.lon) && (this.lat == ll.lat)); - } - return equals; - }, - - /** @final @type String */ - CLASS_NAME: "OpenLayers.LonLat" -}; - -/** Alternative constructor that builds a new OpenLayers.LonLat from a -* parameter string -* -* @constructor -* -* @param {String} str Comma-separated Lon,Lat coordinate string. -* (ex. "5,40") -* -* @returns New OpenLayers.LonLat object built from the passed-in String. -* @type OpenLayers.LonLat -*/ -OpenLayers.LonLat.fromString = function(str) { - var pair = str.split(","); - return new OpenLayers.LonLat(parseFloat(pair[0]), - parseFloat(pair[1])); -}; - - - - -/** -* @class This class represents a bounding box. -* Data stored as left, bottom, right, top floats -*/ -OpenLayers.Bounds = Class.create(); -OpenLayers.Bounds.prototype = { - - /** @type float */ - left: 0.0, - - /** @type float */ - bottom: 0.0, - - /** @type float */ - right: 0.0, - - /** @type float */ - top: 0.0, - - /** - * @constructor - * - * @param {float} left - * @param {float} bottom - * @param {float} right - * @param {float} top - * - */ - initialize: function(left, bottom, right, top) { - this.left = left; - this.bottom = bottom; - this.right = right; - this.top = top; - }, - - /** - * @returns A fresh copy of the bounds - * @type OpenLayers.Bounds - */ - copyOf:function() { - return new OpenLayers.Bounds(this.left, this.bottom, - this.right, this.top); - }, - - /** - * @param {OpenLayers.Bounds} bounds - * @returns Boolean value indicating whether the passed-in OpenLayers.Bounds - * object has the same left, right, top, bottom components as this - * note that if bounds passed in is null, returns false - * - * @type bool - */ - equals:function(bounds) { - var equals = false; - if (bounds != null) { - equals = ((this.left == bounds.left) && - (this.right == bounds.right) && - (this.top == bounds.top) && - (this.bottom == bounds.bottom)); - } - return equals; - }, - - /** - * @return String representation of OpenLayers.Bounds object. - * (ex."left-bottom=(5,42) right-top=(10,45)") - * @type String - */ - toString:function(){ - return ( "left-bottom=(" + this.left + "," + this.bottom + ")" - + " right-top=(" + this.right + "," + this.top + ")" ); - }, - - /** - * @return Simple String representation of OpenLayers.Bounds object. - * (ex. "5,42,10,45") - * @type String - */ - toBBOX:function() { - return (this.left + "," + this.bottom + "," - + this.right + "," + this.top); - }, - - /** - * @returns The width of the bounds - * @type float - */ - getWidth:function() { - return (this.right - this.left); - }, - - /** - * @returns The height of the bounds - * @type float - */ - getHeight:function() { - return (this.top - this.bottom); - }, - - /** - * @returns An OpenLayers.Size which represents the size of the box - * @type OpenLayers.Size - */ - getSize:function() { - return new OpenLayers.Size(this.getWidth(), this.getHeight()); - }, - - /** - * @returns An OpenLayers.Pixel which represents the center of the bounds - * @type OpenLayers.Pixel - */ - getCenterPixel:function() { - return new OpenLayers.Pixel( (this.left + this.right) / 2, - (this.bottom + this.top) / 2); - }, - - /** - * @returns An OpenLayers.LonLat which represents the center of the bounds - * @type OpenLayers.LonLat - */ - getCenterLonLat:function() { - return new OpenLayers.LonLat( (this.left + this.right) / 2, - (this.bottom + this.top) / 2); - }, - - /** - * @param {float} x - * @param {float} y - * - * @returns A new OpenLayers.Bounds whose coordinates are the same as this, - * but shifted by the passed-in x and y values - * @type OpenLayers.Bounds - */ - add:function(x, y){ - return new OpenLayers.Box(this.left + x, this.bottom + y, - this.right + x, this.top + y); - }, - - /** - * @param {float} x - * @param {float} y - * @param {Boolean} inclusive Whether or not to include the border. - * Default is true - * - * @return Whether or not the passed-in coordinates are within this bounds - * @type Boolean - */ - contains:function(x, y, inclusive) { - - //set default - if (inclusive == null) { - inclusive = true; - } - - var contains = false; - if (inclusive) { - contains = ((x >= this.left) && (x <= this.right) && - (y >= this.bottom) && (y <= this.top)); - } else { - contains = ((x > this.left) && (x < this.right) && - (y > this.bottom) && (y < this.top)); - } - return contains; - }, - - /** - * @param {OpenLayers.Bounds} bounds - * @param {Boolean} partial If true, only part of passed-in - * OpenLayers.Bounds needs be within this bounds. - * If false, the entire passed-in bounds must be - * within. Default is false - * @param {Boolean} inclusive Whether or not to include the border. - * Default is true - * - * @return Whether or not the passed-in OpenLayers.Bounds object is - * contained within this bounds. - * @type Boolean - */ - containsBounds:function(bounds, partial, inclusive) { - - //set defaults - if (partial == null) { - partial = false; - } - if (inclusive == null) { - inclusive = true; - } - - var inLeft; - var inTop; - var inRight; - var inBottom; - - if (inclusive) { - inLeft = (bounds.left >= this.left) && (bounds.left <= this.right); - inTop = (bounds.top >= this.bottom) && (bounds.top <= this.top); - inRight= (bounds.right >= this.left) && (bounds.right <= this.right); - inBottom = (bounds.bottom >= this.bottom) && (bounds.bottom <= this.top); - } else { - inLeft = (bounds.left > this.left) && (bounds.left < this.right); - inTop = (bounds.top > this.bottom) && (bounds.top < this.top); - inRight= (bounds.right > this.left) && (bounds.right < this.right); - inBottom = (bounds.bottom > this.bottom) && (bounds.bottom < this.top); - } - - return (partial) ? (inTop || inBottom) && (inLeft || inRight ) - : (inTop && inLeft && inBottom && inRight); - }, - - /** - * @param {OpenLayers.LonLat} lonlat - * - * @returns The quadrant ("br" "tr" "tl" "bl") of the bounds in which - * the coordinate lies. - * @type String - */ - determineQuadrant: function(lonlat) { - - var quadrant = ""; - var center = this.getCenterLonLat(); - - quadrant += (lonlat.lat < center.lat) ? "b" : "t"; - quadrant += (lonlat.lon < center.lon) ? "l" : "r"; - - return quadrant; - }, - - /** @final @type String */ - CLASS_NAME: "OpenLayers.Bounds" -}; - -/** Alternative constructor that builds a new OpenLayers.Bounds from a -* parameter string -* -* @constructor -* -* @param {String} str Comma-separated bounds string. (ex. "5,42,10,45") -* -* @returns New OpenLayers.Bounds object built from the passed-in String. -* @type OpenLayers.Bounds -*/ -OpenLayers.Bounds.fromString = function(str) { - var bounds = str.split(","); - return OpenLayers.Bounds.fromArray(bounds); -}; - -/** Alternative constructor that builds a new OpenLayers.Bounds -* from an array -* -* @constructor -* -* @param {Array} bbox Array of bounds values (ex. [5,42,10,45]) -* -* @returns New OpenLayers.Bounds object built from the passed-in Array. -* @type OpenLayers.Bounds -*/ -OpenLayers.Bounds.fromArray = function(bbox) { - return new OpenLayers.Bounds(parseFloat(bbox[0]), - parseFloat(bbox[1]), - parseFloat(bbox[2]), - parseFloat(bbox[3])); -}; - -/** Alternative constructor that builds a new OpenLayers.Bounds -* from an OpenLayers.Size -* -* @constructor -* -* @param {OpenLayers.Size} size -* -* @returns New OpenLayers.Bounds object built with top and left set to 0 and -* bottom right taken from the passed-in OpenLayers.Size. -* @type OpenLayers.Bounds -*/ -OpenLayers.Bounds.fromSize = function(size) { - return new OpenLayers.Bounds(0, - size.h, - size.w, - 0); -}; -/** - * @param {String} quadrant - * - * @returns The opposing quadrant ("br" "tr" "tl" "bl"). For Example, if - * you pass in "bl" it returns "tr", if you pass in "br" it - * returns "tl", etc. - * @type String - */ -OpenLayers.Bounds.oppositeQuadrant = function(quadrant) { - var opp = ""; - - opp += (quadrant.charAt(0) == 't') ? 'b' : 't'; - opp += (quadrant.charAt(1) == 'l') ? 'r' : 'l'; - - return opp; -}; - -// Some other helpful things - -/** -* @param {String} sStart -* -* @returns Whether or not this string starts with the string passed in. -* @type Boolean -*/ -String.prototype.startsWith = function(sStart){ - return (this.substr(0,sStart.length) == sStart); -}; - -/** -* @returns A trimmed version of the string - all leading and -* trailing spaces removed -* @type String -*/ -String.prototype.trim = function() { - - var b = 0; - while(this.substr(b,1) == " ") { - b++; - } - - var e = this.length - 1; - while(this.substr(e,1) == " ") { - e--; - } - - return this.substring(b, e+1); -}; - -/** Remove an object from an array. Iterates through the array -* to find the item, then removes it. -* -* @param {Object} item -* -* @returns A reference to the array -* @type Array -*/ -Array.prototype.remove = function(item) { - for(var i=0; i < this.length; i++) { - if(this[i] == item) { - this.splice(i,1); - //break;more than once?? - } - } - return this; -} - -/** -* @returns A fresh copy of the array -* @type Array -*/ -Array.prototype.copyOf = function() { - var copy = new Array(); - for (var i = 0; i < this.length; i++) { - copy[i] = this[i]; - } - return copy; -}; - -/** -* @param {Object} item -*/ -Array.prototype.prepend = function(item) { - this.splice(0, 0, item); -}; - -/** -* @param {Object} item -*/ -Array.prototype.append = function(item){ - this[this.length] = item; -}; - -/** -*/ -Array.prototype.clear = function() { - this.length = 0; -}; - -/** -* @param {Object} element -* -* @returns The first index of the element in the array if found. Else returns -1 -* @type int -*/ -Array.prototype.indexOf = function(element) { - var index = -1; - for(var i=0; i < this.length; i++) { - if (this[i] == element) { - index = i; - break; - } - } - return index; -} - -/** - * @param {String} id - * @param {OpenLayers.Pixel} px - * @param {OpenLayers.Size} sz - * @param {String} position - * @param {String} border - * @param {String} overflow - */ -OpenLayers.Util.modifyDOMElement = function(element, id, px, sz, position, - border, overflow) { - - if (id) { - element.id = id; - } - if (px) { - element.style.left = px.x + "px"; - element.style.top = px.y + "px"; - } - if (sz) { - element.style.width = sz.w + "px"; - element.style.height = sz.h + "px"; - } - if (position) { - element.style.position = position; - } - if (border) { - element.style.border = border; - } - if (overflow) { - element.style.overflow = overflow; - } -}; - -/** -* zIndex is NOT set -* -* @param {String} id -* @param {OpenLayers.Pixel} px -* @param {OpenLayers.Size} sz -* @param {String} imgURL -* @param {String} position -* @param {String} border -* @param {String} overflow -* -* @returns A DOM Div created with the specified attributes. -* @type DOMElement -*/ -OpenLayers.Util.createDiv = function(id, px, sz, imgURL, position, - border, overflow) { - - var dom = document.createElement('div'); - - //set specific properties - dom.style.padding = "0"; - dom.style.margin = "0"; - if (imgURL) { - dom.style.backgroundImage = 'url(' + imgURL + ')'; - } - - //set generic properties - if (!id) { - id = "OpenLayersDiv" + (Math.random() * 10000 % 10000); - } - if (!position) { - position = "absolute"; - } - OpenLayers.Util.modifyDOMElement(dom, id, px, sz, - position, border, overflow); - - return dom; -}; - -/** -* @param {String} id -* @param {OpenLayers.Pixel} px -* @param {OpenLayers.Size} sz -* @param {String} imgURL -* @param {String} position -* @param {String} border -* -* @returns A DOM Image created with the specified attributes. -* @type DOMElement -*/ -OpenLayers.Util.createImage = function(id, px, sz, imgURL, position, border) { - - image = document.createElement("img"); - - //set special properties - image.style.alt = id; - image.galleryImg = "no"; - if (imgURL) { - image.src = imgURL; - } - - //set generic properties - if (!id) { - id = "OpenLayersDiv" + (Math.random() * 10000 % 10000); - } - if (!position) { - position = "relative"; - } - OpenLayers.Util.modifyDOMElement(image, id, px, sz, position, border); - - return image; -}; - -OpenLayers.Util.alphaHack = function() { - var arVersion = navigator.appVersion.split("MSIE"); - var version = parseFloat(arVersion[1]); - - return ( (document.body.filters) && - (version >= 5.5) && (version < 7) ); -} - -/** -* @param {DOMElement} div Div containing Alpha-adjusted Image -* @param {String} id -* @param {OpenLayers.Pixel} px -* @param {OpenLayers.Size} sz -* @param {String} imgURL -* @param {String} position -* @param {String} border -* @param {String} sizing 'crop', 'scale', or 'image'. Default is "scale" -*/ -OpenLayers.Util.modifyAlphaImageDiv = function(div, id, px, sz, imgURL, - position, border, sizing) { - - OpenLayers.Util.modifyDOMElement(div, id, px, sz); - - var img = div.childNodes[0]; - - if (imgURL) { - img.src = imgURL; - } - OpenLayers.Util.modifyDOMElement(img, div.id + "_innerImage", null, sz, - "relative", border); - - if (OpenLayers.Util.alphaHack()) { - div.style.display = "inline-block"; - if (sizing == null) { - sizing = "scale"; - } - div.style.filter = "progid:DXImageTransform.Microsoft" + - ".AlphaImageLoader(src='" + img.src + "', " + - "sizingMethod='" + sizing + "')"; - img.style.filter = "progid:DXImageTransform.Microsoft" + - ".Alpha(opacity=0)"; - } -}; - -/** -* @param {String} id -* @param {OpenLayers.Pixel} px -* @param {OpenLayers.Size} sz -* @param {String} imgURL -* @param {String} position -* @param {String} border -* @param {String} sizing 'crop', 'scale', or 'image'. Default is "scale" -* -* @returns A DOM Div created with a DOM Image inside it. If the hack is -* needed for transparency in IE, it is added. -* @type DOMElement -*/ -OpenLayers.Util.createAlphaImageDiv = function(id, px, sz, imgURL, - position, border, sizing) { - - var div = OpenLayers.Util.createDiv(); - var img = OpenLayers.Util.createImage(); - div.appendChild(img); - - OpenLayers.Util.modifyAlphaImageDiv(div, id, px, sz, imgURL, - position, border, sizing); - - return div; -}; - - -/** Creates a new hash and copies over all the keys from the -* passed-in object, but storing them under an uppercased -* version of the key at which they were stored. -* -* @param {Object} object -* -* @returns A new Object with all the same keys but uppercased -* @type Object -*/ -OpenLayers.Util.upperCaseObject = function (object) { - var uObject = new Object(); - for (var key in object) { - uObject[key.toUpperCase()] = object[key]; - } - return uObject; -}; - -/** Takes a hash and copies any keys that don't exist from -* another hash, by analogy with Object.extend() from -* Prototype.js. -* -* @param {Object} to -* @param {Object} from -* -* @type Object -*/ -OpenLayers.Util.applyDefaults = function (to, from) { - for (var key in from) { - if (to[key] == null) { - to[key] = from[key]; - } - } - return to; -}; - -/** -* @param {Object} params -* -* @returns a concatenation of the properties of an object in -* http parameter notation. -* (ex. "key1=value1&key2=value2&key3=value3") -* @type String -*/ -OpenLayers.Util.getParameterString = function(params) { - paramsArray = new Array(); - - for (var key in params) { - var value = params[key]; - //skip functions - if (typeof value == 'function') continue; - - paramsArray.push(key + "=" + value); - } - - return paramsArray.join("&"); -}; - -/** -* @returns The fully formatted image location string -* @type String -*/ -OpenLayers.Util.getImagesLocation = function() { - return OpenLayers._getScriptLocation() + "img/"; -}; - - - -/** These could/should be made namespace aware? -* -* @param {} p -* @param {str} tagName -* -* @return {Array} -*/ -OpenLayers.Util.getNodes=function(p, tagName) { - var nodes = Try.these( - function () { - return OpenLayers.Util._getNodes(p.documentElement.childNodes, - tagName); - }, - function () { - return OpenLayers.Util._getNodes(p.childNodes, tagName); - } - ); - return nodes; -}; - -/** -* @param {Array} nodes -* @param {str} tagName -* -* @return {Array} -*/ -OpenLayers.Util._getNodes=function(nodes, tagName) { - var retArray = new Array(); - for (var i=0;i 0)) - { - if (!index) { - index=0; - } - if (result[index].childNodes.length > 1) { - return result.childNodes[1].nodeValue; - } - else if (result[index].childNodes.length == 1) { - return result[index].firstChild.nodeValue; - } - } else { - return ""; - } -}; - -/** -* @param {Event} evt -* @param {HTMLDivElement} div -* -* @return {boolean} -*/ -OpenLayers.Util.mouseLeft = function (evt, div) { - // start with the element to which the mouse has moved - var target = (evt.relatedTarget) ? evt.relatedTarget : evt.toElement; - // walk up the DOM tree. - while (target != div && target != null) { - target = target.parentNode; - } - // if the target we stop at isn't the div, then we've left the div. - return (target != div); -}; - -OpenLayers.Util.rad = function(x) {return x*Math.PI/180;}; -OpenLayers.Util.distVincenty=function(p1, p2) { - var a = 6378137, b = 6356752.3142, f = 1/298.257223563; - var L = OpenLayers.Util.rad(p2.lon - p1.lon); - var U1 = Math.atan((1-f) * Math.tan(OpenLayers.Util.rad(p1.lat))); - var U2 = Math.atan((1-f) * Math.tan(OpenLayers.Util.rad(p2.lat))); - var sinU1 = Math.sin(U1), cosU1 = Math.cos(U1); - var sinU2 = Math.sin(U2), cosU2 = Math.cos(U2); - var lambda = L, lambdaP = 2*Math.PI; - var iterLimit = 20; - while (Math.abs(lambda-lambdaP) > 1e-12 && --iterLimit>0) { - var sinLambda = Math.sin(lambda), cosLambda = Math.cos(lambda); - var sinSigma = Math.sqrt((cosU2*sinLambda) * (cosU2*sinLambda) + - (cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda)); - if (sinSigma==0) return 0; // co-incident points - var cosSigma = sinU1*sinU2 + cosU1*cosU2*cosLambda; - var sigma = Math.atan2(sinSigma, cosSigma); - var alpha = Math.asin(cosU1 * cosU2 * sinLambda / sinSigma); - var cosSqAlpha = Math.cos(alpha) * Math.cos(alpha); - var cos2SigmaM = cosSigma - 2*sinU1*sinU2/cosSqAlpha; - var C = f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha)); - lambdaP = lambda; - lambda = L + (1-C) * f * Math.sin(alpha) * - (sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM))); - } - if (iterLimit==0) return NaN // formula failed to converge - var uSq = cosSqAlpha * (a*a - b*b) / (b*b); - var A = 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq))); - var B = uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq))); - var deltaSigma = B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)- - B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM))); - var s = b*A*(sigma-deltaSigma); - var d = s.toFixed(3)/1000; // round to 1mm precision - return d; -}; diff --git a/public/lib/Prototype.js b/public/lib/Prototype.js deleted file mode 100644 index 07baf1030..000000000 --- a/public/lib/Prototype.js +++ /dev/null @@ -1,1781 +0,0 @@ -/* Prototype JavaScript framework, version 1.4.0 - * (c) 2005 Sam Stephenson - * - * Prototype is freely distributable under the terms of an MIT-style license. - * For details, see the Prototype web site: http://prototype.conio.net/ - * -/*--------------------------------------------------------------------------*/ - -var Prototype = { - Version: '1.4.0', - ScriptFragment: '(?:)((\n|\r|.)*?)(?:<\/script>)', - - emptyFunction: function() {}, - K: function(x) {return x} -} - -var Class = { - create: function() { - return function() { - this.initialize.apply(this, arguments); - } - } -} - -var Abstract = new Object(); - -Object.extend = function(destination, source) { - for (property in source) { - destination[property] = source[property]; - } - return destination; -} - -Object.inspect = function(object) { - try { - if (object == undefined) return 'undefined'; - if (object == null) return 'null'; - return object.inspect ? object.inspect() : object.toString(); - } catch (e) { - if (e instanceof RangeError) return '...'; - throw e; - } -} - -Function.prototype.bind = function() { - var __method = this, args = $A(arguments), object = args.shift(); - return function() { - return __method.apply(object, args.concat($A(arguments))); - } -} - -Function.prototype.bindAsEventListener = function(object) { - var __method = this; - return function(event) { - return __method.call(object, event || window.event); - } -} - -Object.extend(Number.prototype, { - toColorPart: function() { - var digits = this.toString(16); - if (this < 16) return '0' + digits; - return digits; - }, - - succ: function() { - return this + 1; - }, - - times: function(iterator) { - $R(0, this, true).each(iterator); - return this; - } -}); - -var Try = { - these: function() { - var returnValue; - - for (var i = 0; i < arguments.length; i++) { - var lambda = arguments[i]; - try { - returnValue = lambda(); - break; - } catch (e) {} - } - - return returnValue; - } -} - -/*--------------------------------------------------------------------------*/ - -var PeriodicalExecuter = Class.create(); -PeriodicalExecuter.prototype = { - initialize: function(callback, frequency) { - this.callback = callback; - this.frequency = frequency; - this.currentlyExecuting = false; - - this.registerCallback(); - }, - - registerCallback: function() { - setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); - }, - - onTimerEvent: function() { - if (!this.currentlyExecuting) { - try { - this.currentlyExecuting = true; - this.callback(); - } finally { - this.currentlyExecuting = false; - } - } - } -} - -/*--------------------------------------------------------------------------*/ - -function $() { - var elements = new Array(); - - for (var i = 0; i < arguments.length; i++) { - var element = arguments[i]; - if (typeof element == 'string') - element = document.getElementById(element); - - if (arguments.length == 1) - return element; - - elements.push(element); - } - - return elements; -} -Object.extend(String.prototype, { - stripTags: function() { - return this.replace(/<\/?[^>]+>/gi, ''); - }, - - stripScripts: function() { - return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); - }, - - extractScripts: function() { - var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); - var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); - return (this.match(matchAll) || []).map(function(scriptTag) { - return (scriptTag.match(matchOne) || ['', ''])[1]; - }); - }, - - evalScripts: function() { - return this.extractScripts().map(eval); - }, - - escapeHTML: function() { - var div = document.createElement('div'); - var text = document.createTextNode(this); - div.appendChild(text); - return div.innerHTML; - }, - - unescapeHTML: function() { - var div = document.createElement('div'); - div.innerHTML = this.stripTags(); - return div.childNodes[0] ? div.childNodes[0].nodeValue : ''; - }, - - toQueryParams: function() { - var pairs = this.match(/^\??(.*)$/)[1].split('&'); - return pairs.inject({}, function(params, pairString) { - var pair = pairString.split('='); - params[pair[0]] = pair[1]; - return params; - }); - }, - - toArray: function() { - return this.split(''); - }, - - camelize: function() { - var oStringList = this.split('-'); - if (oStringList.length == 1) return oStringList[0]; - - var camelizedString = this.indexOf('-') == 0 - ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1) - : oStringList[0]; - - for (var i = 1, len = oStringList.length; i < len; i++) { - var s = oStringList[i]; - camelizedString += s.charAt(0).toUpperCase() + s.substring(1); - } - - return camelizedString; - }, - - inspect: function() { - return "'" + this.replace('\\', '\\\\').replace("'", '\\\'') + "'"; - } -}); - -String.prototype.parseQuery = String.prototype.toQueryParams; - -var $break = new Object(); -var $continue = new Object(); - -var Enumerable = { - each: function(iterator) { - var index = 0; - try { - this._each(function(value) { - try { - iterator(value, index++); - } catch (e) { - if (e != $continue) throw e; - } - }); - } catch (e) { - if (e != $break) throw e; - } - }, - - all: function(iterator) { - var result = true; - this.each(function(value, index) { - result = result && !!(iterator || Prototype.K)(value, index); - if (!result) throw $break; - }); - return result; - }, - - any: function(iterator) { - var result = true; - this.each(function(value, index) { - if (result = !!(iterator || Prototype.K)(value, index)) - throw $break; - }); - return result; - }, - - collect: function(iterator) { - var results = []; - this.each(function(value, index) { - results.push(iterator(value, index)); - }); - return results; - }, - - detect: function (iterator) { - var result; - this.each(function(value, index) { - if (iterator(value, index)) { - result = value; - throw $break; - } - }); - return result; - }, - - findAll: function(iterator) { - var results = []; - this.each(function(value, index) { - if (iterator(value, index)) - results.push(value); - }); - return results; - }, - - grep: function(pattern, iterator) { - var results = []; - this.each(function(value, index) { - var stringValue = value.toString(); - if (stringValue.match(pattern)) - results.push((iterator || Prototype.K)(value, index)); - }) - return results; - }, - - include: function(object) { - var found = false; - this.each(function(value) { - if (value == object) { - found = true; - throw $break; - } - }); - return found; - }, - - inject: function(memo, iterator) { - this.each(function(value, index) { - memo = iterator(memo, value, index); - }); - return memo; - }, - - invoke: function(method) { - var args = $A(arguments).slice(1); - return this.collect(function(value) { - return value[method].apply(value, args); - }); - }, - - max: function(iterator) { - var result; - this.each(function(value, index) { - value = (iterator || Prototype.K)(value, index); - if (value >= (result || value)) - result = value; - }); - return result; - }, - - min: function(iterator) { - var result; - this.each(function(value, index) { - value = (iterator || Prototype.K)(value, index); - if (value <= (result || value)) - result = value; - }); - return result; - }, - - partition: function(iterator) { - var trues = [], falses = []; - this.each(function(value, index) { - ((iterator || Prototype.K)(value, index) ? - trues : falses).push(value); - }); - return [trues, falses]; - }, - - pluck: function(property) { - var results = []; - this.each(function(value, index) { - results.push(value[property]); - }); - return results; - }, - - reject: function(iterator) { - var results = []; - this.each(function(value, index) { - if (!iterator(value, index)) - results.push(value); - }); - return results; - }, - - sortBy: function(iterator) { - return this.collect(function(value, index) { - return {value: value, criteria: iterator(value, index)}; - }).sort(function(left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }).pluck('value'); - }, - - toArray: function() { - return this.collect(Prototype.K); - }, - - zip: function() { - var iterator = Prototype.K, args = $A(arguments); - if (typeof args.last() == 'function') - iterator = args.pop(); - - var collections = [this].concat(args).map($A); - return this.map(function(value, index) { - iterator(value = collections.pluck(index)); - return value; - }); - }, - - inspect: function() { - return '#'; - } -} - -Object.extend(Enumerable, { - map: Enumerable.collect, - find: Enumerable.detect, - select: Enumerable.findAll, - member: Enumerable.include, - entries: Enumerable.toArray -}); -var $A = Array.from = function(iterable) { - if (!iterable) return []; - if (iterable.toArray) { - return iterable.toArray(); - } else { - var results = []; - for (var i = 0; i < iterable.length; i++) - results.push(iterable[i]); - return results; - } -} - -Object.extend(Array.prototype, Enumerable); - -Array.prototype._reverse = Array.prototype.reverse; - -Object.extend(Array.prototype, { - _each: function(iterator) { - for (var i = 0; i < this.length; i++) - iterator(this[i]); - }, - - clear: function() { - this.length = 0; - return this; - }, - - first: function() { - return this[0]; - }, - - last: function() { - return this[this.length - 1]; - }, - - compact: function() { - return this.select(function(value) { - return value != undefined || value != null; - }); - }, - - flatten: function() { - return this.inject([], function(array, value) { - return array.concat(value.constructor == Array ? - value.flatten() : [value]); - }); - }, - - without: function() { - var values = $A(arguments); - return this.select(function(value) { - return !values.include(value); - }); - }, - - indexOf: function(object) { - for (var i = 0; i < this.length; i++) - if (this[i] == object) return i; - return -1; - }, - - reverse: function(inline) { - return (inline !== false ? this : this.toArray())._reverse(); - }, - - shift: function() { - var result = this[0]; - for (var i = 0; i < this.length - 1; i++) - this[i] = this[i + 1]; - this.length--; - return result; - }, - - inspect: function() { - return '[' + this.map(Object.inspect).join(', ') + ']'; - } -}); -var Hash = { - _each: function(iterator) { - for (key in this) { - var value = this[key]; - if (typeof value == 'function') continue; - - var pair = [key, value]; - pair.key = key; - pair.value = value; - iterator(pair); - } - }, - - keys: function() { - return this.pluck('key'); - }, - - values: function() { - return this.pluck('value'); - }, - - merge: function(hash) { - return $H(hash).inject($H(this), function(mergedHash, pair) { - mergedHash[pair.key] = pair.value; - return mergedHash; - }); - }, - - toQueryString: function() { - return this.map(function(pair) { - return pair.map(encodeURIComponent).join('='); - }).join('&'); - }, - - inspect: function() { - return '#'; - } -} - -function $H(object) { - var hash = Object.extend({}, object || {}); - Object.extend(hash, Enumerable); - Object.extend(hash, Hash); - return hash; -} -ObjectRange = Class.create(); -Object.extend(ObjectRange.prototype, Enumerable); -Object.extend(ObjectRange.prototype, { - initialize: function(start, end, exclusive) { - this.start = start; - this.end = end; - this.exclusive = exclusive; - }, - - _each: function(iterator) { - var value = this.start; - do { - iterator(value); - value = value.succ(); - } while (this.include(value)); - }, - - include: function(value) { - if (value < this.start) - return false; - if (this.exclusive) - return value < this.end; - return value <= this.end; - } -}); - -var $R = function(start, end, exclusive) { - return new ObjectRange(start, end, exclusive); -} - -var Ajax = { - getTransport: function() { - return Try.these( - function() {return new ActiveXObject('Msxml2.XMLHTTP')}, - function() {return new ActiveXObject('Microsoft.XMLHTTP')}, - function() {return new XMLHttpRequest()} - ) || false; - }, - - activeRequestCount: 0 -} - -Ajax.Responders = { - responders: [], - - _each: function(iterator) { - this.responders._each(iterator); - }, - - register: function(responderToAdd) { - if (!this.include(responderToAdd)) - this.responders.push(responderToAdd); - }, - - unregister: function(responderToRemove) { - this.responders = this.responders.without(responderToRemove); - }, - - dispatch: function(callback, request, transport, json) { - this.each(function(responder) { - if (responder[callback] && typeof responder[callback] == 'function') { - try { - responder[callback].apply(responder, [request, transport, json]); - } catch (e) {} - } - }); - } -}; - -Object.extend(Ajax.Responders, Enumerable); - -Ajax.Responders.register({ - onCreate: function() { - Ajax.activeRequestCount++; - }, - - onComplete: function() { - Ajax.activeRequestCount--; - } -}); - -Ajax.Base = function() {}; -Ajax.Base.prototype = { - setOptions: function(options) { - this.options = { - method: 'post', - asynchronous: true, - parameters: '' - } - Object.extend(this.options, options || {}); - }, - - responseIsSuccess: function() { - return this.transport.status == undefined - || this.transport.status == 0 - || (this.transport.status >= 200 && this.transport.status < 300); - }, - - responseIsFailure: function() { - return !this.responseIsSuccess(); - } -} - -Ajax.Request = Class.create(); -Ajax.Request.Events = - ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; - -Ajax.Request.prototype = Object.extend(new Ajax.Base(), { - initialize: function(url, options) { - this.transport = Ajax.getTransport(); - this.setOptions(options); - this.request(url); - }, - - request: function(url) { - var parameters = this.options.parameters || ''; - if (parameters.length > 0) parameters += '&_='; - - try { - this.url = url; - if (this.options.method == 'get' && parameters.length > 0) - this.url += (this.url.match(/\?/) ? '&' : '?') + parameters; - - Ajax.Responders.dispatch('onCreate', this, this.transport); - - this.transport.open(this.options.method, this.url, - this.options.asynchronous); - - if (this.options.asynchronous) { - this.transport.onreadystatechange = this.onStateChange.bind(this); - setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10); - } - - this.setRequestHeaders(); - - var body = this.options.postBody ? this.options.postBody : parameters; - this.transport.send(this.options.method == 'post' ? body : null); - - } catch (e) { - this.dispatchException(e); - } - }, - - setRequestHeaders: function() { - var requestHeaders = - ['X-Requested-With', 'XMLHttpRequest', - 'X-Prototype-Version', Prototype.Version]; - - if (this.options.method == 'post') { - requestHeaders.push('Content-type', - 'application/x-www-form-urlencoded'); - - /* Force "Connection: close" for Mozilla browsers to work around - * a bug where XMLHttpReqeuest sends an incorrect Content-length - * header. See Mozilla Bugzilla #246651. - */ - if (this.transport.overrideMimeType) - requestHeaders.push('Connection', 'close'); - } - - if (this.options.requestHeaders) - requestHeaders.push.apply(requestHeaders, this.options.requestHeaders); - - for (var i = 0; i < requestHeaders.length; i += 2) - this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]); - }, - - onStateChange: function() { - var readyState = this.transport.readyState; - if (readyState != 1) - this.respondToReadyState(this.transport.readyState); - }, - - header: function(name) { - try { - return this.transport.getResponseHeader(name); - } catch (e) {} - }, - - evalJSON: function() { - try { - return eval(this.header('X-JSON')); - } catch (e) {} - }, - - evalResponse: function() { - try { - return eval(this.transport.responseText); - } catch (e) { - this.dispatchException(e); - } - }, - - respondToReadyState: function(readyState) { - var event = Ajax.Request.Events[readyState]; - var transport = this.transport, json = this.evalJSON(); - - if (event == 'Complete') { - try { - (this.options['on' + this.transport.status] - || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')] - || Prototype.emptyFunction)(transport, json); - } catch (e) { - this.dispatchException(e); - } - - if ((this.header('Content-type') || '').match(/^text\/javascript/i)) - this.evalResponse(); - } - - try { - (this.options['on' + event] || Prototype.emptyFunction)(transport, json); - Ajax.Responders.dispatch('on' + event, this, transport, json); - } catch (e) { - this.dispatchException(e); - } - - /* Avoid memory leak in MSIE: clean up the oncomplete event handler */ - if (event == 'Complete') - this.transport.onreadystatechange = Prototype.emptyFunction; - }, - - dispatchException: function(exception) { - (this.options.onException || Prototype.emptyFunction)(this, exception); - Ajax.Responders.dispatch('onException', this, exception); - } -}); - -Ajax.Updater = Class.create(); - -Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), { - initialize: function(container, url, options) { - this.containers = { - success: container.success ? $(container.success) : $(container), - failure: container.failure ? $(container.failure) : - (container.success ? null : $(container)) - } - - this.transport = Ajax.getTransport(); - this.setOptions(options); - - var onComplete = this.options.onComplete || Prototype.emptyFunction; - this.options.onComplete = (function(transport, object) { - this.updateContent(); - onComplete(transport, object); - }).bind(this); - - this.request(url); - }, - - updateContent: function() { - var receiver = this.responseIsSuccess() ? - this.containers.success : this.containers.failure; - var response = this.transport.responseText; - - if (!this.options.evalScripts) - response = response.stripScripts(); - - if (receiver) { - if (this.options.insertion) { - new this.options.insertion(receiver, response); - } else { - Element.update(receiver, response); - } - } - - if (this.responseIsSuccess()) { - if (this.onComplete) - setTimeout(this.onComplete.bind(this), 10); - } - } -}); - -Ajax.PeriodicalUpdater = Class.create(); -Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), { - initialize: function(container, url, options) { - this.setOptions(options); - this.onComplete = this.options.onComplete; - - this.frequency = (this.options.frequency || 2); - this.decay = (this.options.decay || 1); - - this.updater = {}; - this.container = container; - this.url = url; - - this.start(); - }, - - start: function() { - this.options.onComplete = this.updateComplete.bind(this); - this.onTimerEvent(); - }, - - stop: function() { - this.updater.onComplete = undefined; - clearTimeout(this.timer); - (this.onComplete || Prototype.emptyFunction).apply(this, arguments); - }, - - updateComplete: function(request) { - if (this.options.decay) { - this.decay = (request.responseText == this.lastText ? - this.decay * this.options.decay : 1); - - this.lastText = request.responseText; - } - this.timer = setTimeout(this.onTimerEvent.bind(this), - this.decay * this.frequency * 1000); - }, - - onTimerEvent: function() { - this.updater = new Ajax.Updater(this.container, this.url, this.options); - } -}); -document.getElementsByClassName = function(className, parentElement) { - var children = ($(parentElement) || document.body).getElementsByTagName('*'); - return $A(children).inject([], function(elements, child) { - if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) - elements.push(child); - return elements; - }); -} - -/*--------------------------------------------------------------------------*/ - -if (!window.Element) { - var Element = new Object(); -} - -Object.extend(Element, { - visible: function(element) { - return $(element).style.display != 'none'; - }, - - toggle: function() { - for (var i = 0; i < arguments.length; i++) { - var element = $(arguments[i]); - Element[Element.visible(element) ? 'hide' : 'show'](element); - } - }, - - hide: function() { - for (var i = 0; i < arguments.length; i++) { - var element = $(arguments[i]); - element.style.display = 'none'; - } - }, - - show: function() { - for (var i = 0; i < arguments.length; i++) { - var element = $(arguments[i]); - element.style.display = ''; - } - }, - - remove: function(element) { - element = $(element); - element.parentNode.removeChild(element); - }, - - update: function(element, html) { - $(element).innerHTML = html.stripScripts(); - setTimeout(function() {html.evalScripts()}, 10); - }, - - getHeight: function(element) { - element = $(element); - return element.offsetHeight; - }, - - classNames: function(element) { - return new Element.ClassNames(element); - }, - - hasClassName: function(element, className) { - if (!(element = $(element))) return; - return Element.classNames(element).include(className); - }, - - addClassName: function(element, className) { - if (!(element = $(element))) return; - return Element.classNames(element).add(className); - }, - - removeClassName: function(element, className) { - if (!(element = $(element))) return; - return Element.classNames(element).remove(className); - }, - - // removes whitespace-only text node children - cleanWhitespace: function(element) { - element = $(element); - for (var i = 0; i < element.childNodes.length; i++) { - var node = element.childNodes[i]; - if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) - Element.remove(node); - } - }, - - empty: function(element) { - return $(element).innerHTML.match(/^\s*$/); - }, - - scrollTo: function(element) { - element = $(element); - var x = element.x ? element.x : element.offsetLeft, - y = element.y ? element.y : element.offsetTop; - window.scrollTo(x, y); - }, - - getStyle: function(element, style) { - element = $(element); - var value = element.style[style.camelize()]; - if (!value) { - if (document.defaultView && document.defaultView.getComputedStyle) { - var css = document.defaultView.getComputedStyle(element, null); - value = css ? css.getPropertyValue(style) : null; - } else if (element.currentStyle) { - value = element.currentStyle[style.camelize()]; - } - } - - if (window.opera && ['left', 'top', 'right', 'bottom'].include(style)) - if (Element.getStyle(element, 'position') == 'static') value = 'auto'; - - return value == 'auto' ? null : value; - }, - - setStyle: function(element, style) { - element = $(element); - for (name in style) - element.style[name.camelize()] = style[name]; - }, - - getDimensions: function(element) { - element = $(element); - if (Element.getStyle(element, 'display') != 'none') - return {width: element.offsetWidth, height: element.offsetHeight}; - - // All *Width and *Height properties give 0 on elements with display none, - // so enable the element temporarily - var els = element.style; - var originalVisibility = els.visibility; - var originalPosition = els.position; - els.visibility = 'hidden'; - els.position = 'absolute'; - els.display = ''; - var originalWidth = element.clientWidth; - var originalHeight = element.clientHeight; - els.display = 'none'; - els.position = originalPosition; - els.visibility = originalVisibility; - return {width: originalWidth, height: originalHeight}; - }, - - makePositioned: function(element) { - element = $(element); - var pos = Element.getStyle(element, 'position'); - if (pos == 'static' || !pos) { - element._madePositioned = true; - element.style.position = 'relative'; - // Opera returns the offset relative to the positioning context, when an - // element is position relative but top and left have not been defined - if (window.opera) { - element.style.top = 0; - element.style.left = 0; - } - } - }, - - undoPositioned: function(element) { - element = $(element); - if (element._madePositioned) { - element._madePositioned = undefined; - element.style.position = - element.style.top = - element.style.left = - element.style.bottom = - element.style.right = ''; - } - }, - - makeClipping: function(element) { - element = $(element); - if (element._overflow) return; - element._overflow = element.style.overflow; - if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden') - element.style.overflow = 'hidden'; - }, - - undoClipping: function(element) { - element = $(element); - if (element._overflow) return; - element.style.overflow = element._overflow; - element._overflow = undefined; - } -}); - -var Toggle = new Object(); -Toggle.display = Element.toggle; - -/*--------------------------------------------------------------------------*/ - -Abstract.Insertion = function(adjacency) { - this.adjacency = adjacency; -} - -Abstract.Insertion.prototype = { - initialize: function(element, content) { - this.element = $(element); - this.content = content.stripScripts(); - - if (this.adjacency && this.element.insertAdjacentHTML) { - try { - this.element.insertAdjacentHTML(this.adjacency, this.content); - } catch (e) { - if (this.element.tagName.toLowerCase() == 'tbody') { - this.insertContent(this.contentFromAnonymousTable()); - } else { - throw e; - } - } - } else { - this.range = this.element.ownerDocument.createRange(); - if (this.initializeRange) this.initializeRange(); - this.insertContent([this.range.createContextualFragment(this.content)]); - } - - setTimeout(function() {content.evalScripts()}, 10); - }, - - contentFromAnonymousTable: function() { - var div = document.createElement('div'); - div.innerHTML = '' + this.content + '
'; - return $A(div.childNodes[0].childNodes[0].childNodes); - } -} - -var Insertion = new Object(); - -Insertion.Before = Class.create(); -Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), { - initializeRange: function() { - this.range.setStartBefore(this.element); - }, - - insertContent: function(fragments) { - fragments.each((function(fragment) { - this.element.parentNode.insertBefore(fragment, this.element); - }).bind(this)); - } -}); - -Insertion.Top = Class.create(); -Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), { - initializeRange: function() { - this.range.selectNodeContents(this.element); - this.range.collapse(true); - }, - - insertContent: function(fragments) { - fragments.reverse(false).each((function(fragment) { - this.element.insertBefore(fragment, this.element.firstChild); - }).bind(this)); - } -}); - -Insertion.Bottom = Class.create(); -Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), { - initializeRange: function() { - this.range.selectNodeContents(this.element); - this.range.collapse(this.element); - }, - - insertContent: function(fragments) { - fragments.each((function(fragment) { - this.element.appendChild(fragment); - }).bind(this)); - } -}); - -Insertion.After = Class.create(); -Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), { - initializeRange: function() { - this.range.setStartAfter(this.element); - }, - - insertContent: function(fragments) { - fragments.each((function(fragment) { - this.element.parentNode.insertBefore(fragment, - this.element.nextSibling); - }).bind(this)); - } -}); - -/*--------------------------------------------------------------------------*/ - -Element.ClassNames = Class.create(); -Element.ClassNames.prototype = { - initialize: function(element) { - this.element = $(element); - }, - - _each: function(iterator) { - this.element.className.split(/\s+/).select(function(name) { - return name.length > 0; - })._each(iterator); - }, - - set: function(className) { - this.element.className = className; - }, - - add: function(classNameToAdd) { - if (this.include(classNameToAdd)) return; - this.set(this.toArray().concat(classNameToAdd).join(' ')); - }, - - remove: function(classNameToRemove) { - if (!this.include(classNameToRemove)) return; - this.set(this.select(function(className) { - return className != classNameToRemove; - }).join(' ')); - }, - - toString: function() { - return this.toArray().join(' '); - } -} - -Object.extend(Element.ClassNames.prototype, Enumerable); -var Field = { - clear: function() { - for (var i = 0; i < arguments.length; i++) - $(arguments[i]).value = ''; - }, - - focus: function(element) { - $(element).focus(); - }, - - present: function() { - for (var i = 0; i < arguments.length; i++) - if ($(arguments[i]).value == '') return false; - return true; - }, - - select: function(element) { - $(element).select(); - }, - - activate: function(element) { - element = $(element); - element.focus(); - if (element.select) - element.select(); - } -} - -/*--------------------------------------------------------------------------*/ - -var Form = { - serialize: function(form) { - var elements = Form.getElements($(form)); - var queryComponents = new Array(); - - for (var i = 0; i < elements.length; i++) { - var queryComponent = Form.Element.serialize(elements[i]); - if (queryComponent) - queryComponents.push(queryComponent); - } - - return queryComponents.join('&'); - }, - - getElements: function(form) { - form = $(form); - var elements = new Array(); - - for (tagName in Form.Element.Serializers) { - var tagElements = form.getElementsByTagName(tagName); - for (var j = 0; j < tagElements.length; j++) - elements.push(tagElements[j]); - } - return elements; - }, - - getInputs: function(form, typeName, name) { - form = $(form); - var inputs = form.getElementsByTagName('input'); - - if (!typeName && !name) - return inputs; - - var matchingInputs = new Array(); - for (var i = 0; i < inputs.length; i++) { - var input = inputs[i]; - if ((typeName && input.type != typeName) || - (name && input.name != name)) - continue; - matchingInputs.push(input); - } - - return matchingInputs; - }, - - disable: function(form) { - var elements = Form.getElements(form); - for (var i = 0; i < elements.length; i++) { - var element = elements[i]; - element.blur(); - element.disabled = 'true'; - } - }, - - enable: function(form) { - var elements = Form.getElements(form); - for (var i = 0; i < elements.length; i++) { - var element = elements[i]; - element.disabled = ''; - } - }, - - findFirstElement: function(form) { - return Form.getElements(form).find(function(element) { - return element.type != 'hidden' && !element.disabled && - ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); - }); - }, - - focusFirstElement: function(form) { - Field.activate(Form.findFirstElement(form)); - }, - - reset: function(form) { - $(form).reset(); - } -} - -Form.Element = { - serialize: function(element) { - element = $(element); - var method = element.tagName.toLowerCase(); - var parameter = Form.Element.Serializers[method](element); - - if (parameter) { - var key = encodeURIComponent(parameter[0]); - if (key.length == 0) return; - - if (parameter[1].constructor != Array) - parameter[1] = [parameter[1]]; - - return parameter[1].map(function(value) { - return key + '=' + encodeURIComponent(value); - }).join('&'); - } - }, - - getValue: function(element) { - element = $(element); - var method = element.tagName.toLowerCase(); - var parameter = Form.Element.Serializers[method](element); - - if (parameter) - return parameter[1]; - } -} - -Form.Element.Serializers = { - input: function(element) { - switch (element.type.toLowerCase()) { - case 'submit': - case 'hidden': - case 'password': - case 'text': - return Form.Element.Serializers.textarea(element); - case 'checkbox': - case 'radio': - return Form.Element.Serializers.inputSelector(element); - } - return false; - }, - - inputSelector: function(element) { - if (element.checked) - return [element.name, element.value]; - }, - - textarea: function(element) { - return [element.name, element.value]; - }, - - select: function(element) { - return Form.Element.Serializers[element.type == 'select-one' ? - 'selectOne' : 'selectMany'](element); - }, - - selectOne: function(element) { - var value = '', opt, index = element.selectedIndex; - if (index >= 0) { - opt = element.options[index]; - value = opt.value; - if (!value && !('value' in opt)) - value = opt.text; - } - return [element.name, value]; - }, - - selectMany: function(element) { - var value = new Array(); - for (var i = 0; i < element.length; i++) { - var opt = element.options[i]; - if (opt.selected) { - var optValue = opt.value; - if (!optValue && !('value' in opt)) - optValue = opt.text; - value.push(optValue); - } - } - return [element.name, value]; - } -} - -/*--------------------------------------------------------------------------*/ - -var $F = Form.Element.getValue; - -/*--------------------------------------------------------------------------*/ - -Abstract.TimedObserver = function() {} -Abstract.TimedObserver.prototype = { - initialize: function(element, frequency, callback) { - this.frequency = frequency; - this.element = $(element); - this.callback = callback; - - this.lastValue = this.getValue(); - this.registerCallback(); - }, - - registerCallback: function() { - setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); - }, - - onTimerEvent: function() { - var value = this.getValue(); - if (this.lastValue != value) { - this.callback(this.element, value); - this.lastValue = value; - } - } -} - -Form.Element.Observer = Class.create(); -Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.Observer = Class.create(); -Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { - getValue: function() { - return Form.serialize(this.element); - } -}); - -/*--------------------------------------------------------------------------*/ - -Abstract.EventObserver = function() {} -Abstract.EventObserver.prototype = { - initialize: function(element, callback) { - this.element = $(element); - this.callback = callback; - - this.lastValue = this.getValue(); - if (this.element.tagName.toLowerCase() == 'form') - this.registerFormCallbacks(); - else - this.registerCallback(this.element); - }, - - onElementEvent: function() { - var value = this.getValue(); - if (this.lastValue != value) { - this.callback(this.element, value); - this.lastValue = value; - } - }, - - registerFormCallbacks: function() { - var elements = Form.getElements(this.element); - for (var i = 0; i < elements.length; i++) - this.registerCallback(elements[i]); - }, - - registerCallback: function(element) { - if (element.type) { - switch (element.type.toLowerCase()) { - case 'checkbox': - case 'radio': - Event.observe(element, 'click', this.onElementEvent.bind(this)); - break; - case 'password': - case 'text': - case 'textarea': - case 'select-one': - case 'select-multiple': - Event.observe(element, 'change', this.onElementEvent.bind(this)); - break; - } - } - } -} - -Form.Element.EventObserver = Class.create(); -Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.EventObserver = Class.create(); -Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { - getValue: function() { - return Form.serialize(this.element); - } -}); -if (!window.Event) { - var Event = new Object(); -} - -Object.extend(Event, { - KEY_BACKSPACE: 8, - KEY_TAB: 9, - KEY_RETURN: 13, - KEY_ESC: 27, - KEY_LEFT: 37, - KEY_UP: 38, - KEY_RIGHT: 39, - KEY_DOWN: 40, - KEY_DELETE: 46, - - element: function(event) { - return event.target || event.srcElement; - }, - - isLeftClick: function(event) { - return (((event.which) && (event.which == 1)) || - ((event.button) && (event.button == 1))); - }, - - pointerX: function(event) { - return event.pageX || (event.clientX + - (document.documentElement.scrollLeft || document.body.scrollLeft)); - }, - - pointerY: function(event) { - return event.pageY || (event.clientY + - (document.documentElement.scrollTop || document.body.scrollTop)); - }, - - stop: function(event) { - if (event.preventDefault) { - event.preventDefault(); - event.stopPropagation(); - } else { - event.returnValue = false; - event.cancelBubble = true; - } - }, - - // find the first node with the given tagName, starting from the - // node the event was triggered on; traverses the DOM upwards - findElement: function(event, tagName) { - var element = Event.element(event); - while (element.parentNode && (!element.tagName || - (element.tagName.toUpperCase() != tagName.toUpperCase()))) - element = element.parentNode; - return element; - }, - - observers: false, - - _observeAndCache: function(element, name, observer, useCapture) { - if (!this.observers) this.observers = []; - if (element.addEventListener) { - this.observers.push([element, name, observer, useCapture]); - element.addEventListener(name, observer, useCapture); - } else if (element.attachEvent) { - this.observers.push([element, name, observer, useCapture]); - element.attachEvent('on' + name, observer); - } - }, - - unloadCache: function() { - if (!Event.observers) return; - for (var i = 0; i < Event.observers.length; i++) { - Event.stopObserving.apply(this, Event.observers[i]); - Event.observers[i][0] = null; - } - Event.observers = false; - }, - - observe: function(elementParam, name, observer, useCapture) { - var element = $(elementParam); - useCapture = useCapture || false; - - if (name == 'keypress' && - (navigator.appVersion.match(/Konqueror|Safari|KHTML/) - || element.attachEvent)) - name = 'keydown'; - - this._observeAndCache(element, name, observer, useCapture); - }, - - stopObserving: function(elementParam, name, observer, useCapture) { - var element = $(elementParam); - useCapture = useCapture || false; - - if (name == 'keypress' && - (navigator.appVersion.match(/Konqueror|Safari|KHTML/) - || element.detachEvent)) - name = 'keydown'; - - if (element.removeEventListener) { - element.removeEventListener(name, observer, useCapture); - } else if (element.detachEvent) { - element.detachEvent('on' + name, observer); - } - } -}); - -/* prevent memory leaks in IE */ -Event.observe(window, 'unload', Event.unloadCache, false); -var Position = { - // set to true if needed, warning: firefox performance problems - // NOT neeeded for page scrolling, only if draggable contained in - // scrollable elements - includeScrollOffsets: false, - - // must be called before calling withinIncludingScrolloffset, every time the - // page is scrolled - prepare: function() { - this.deltaX = window.pageXOffset - || document.documentElement.scrollLeft - || document.body.scrollLeft - || 0; - this.deltaY = window.pageYOffset - || document.documentElement.scrollTop - || document.body.scrollTop - || 0; - }, - - realOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.scrollTop || 0; - valueL += element.scrollLeft || 0; - element = element.parentNode; - } while (element); - return [valueL, valueT]; - }, - - cumulativeOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - } while (element); - return [valueL, valueT]; - }, - - positionedOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - if (element) { - p = Element.getStyle(element, 'position'); - if (p == 'relative' || p == 'absolute') break; - } - } while (element); - return [valueL, valueT]; - }, - - offsetParent: function(element) { - if (element.offsetParent) return element.offsetParent; - if (element == document.body) return element; - - while ((element = element.parentNode) && element != document.body) - if (Element.getStyle(element, 'position') != 'static') - return element; - - return document.body; - }, - - // caches x/y coordinate pair to use with overlap - within: function(element, x, y) { - if (this.includeScrollOffsets) - return this.withinIncludingScrolloffsets(element, x, y); - this.xcomp = x; - this.ycomp = y; - this.offset = this.cumulativeOffset(element); - - return (y >= this.offset[1] && - y < this.offset[1] + element.offsetHeight && - x >= this.offset[0] && - x < this.offset[0] + element.offsetWidth); - }, - - withinIncludingScrolloffsets: function(element, x, y) { - var offsetcache = this.realOffset(element); - - this.xcomp = x + offsetcache[0] - this.deltaX; - this.ycomp = y + offsetcache[1] - this.deltaY; - this.offset = this.cumulativeOffset(element); - - return (this.ycomp >= this.offset[1] && - this.ycomp < this.offset[1] + element.offsetHeight && - this.xcomp >= this.offset[0] && - this.xcomp < this.offset[0] + element.offsetWidth); - }, - - // within must be called directly before - overlap: function(mode, element) { - if (!mode) return 0; - if (mode == 'vertical') - return ((this.offset[1] + element.offsetHeight) - this.ycomp) / - element.offsetHeight; - if (mode == 'horizontal') - return ((this.offset[0] + element.offsetWidth) - this.xcomp) / - element.offsetWidth; - }, - - clone: function(source, target) { - source = $(source); - target = $(target); - target.style.position = 'absolute'; - var offsets = this.cumulativeOffset(source); - target.style.top = offsets[1] + 'px'; - target.style.left = offsets[0] + 'px'; - target.style.width = source.offsetWidth + 'px'; - target.style.height = source.offsetHeight + 'px'; - }, - - page: function(forElement) { - var valueT = 0, valueL = 0; - - var element = forElement; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - - // Safari fix - if (element.offsetParent==document.body) - if (Element.getStyle(element,'position')=='absolute') break; - - } while (element = element.offsetParent); - - element = forElement; - do { - valueT -= element.scrollTop || 0; - valueL -= element.scrollLeft || 0; - } while (element = element.parentNode); - - return [valueL, valueT]; - }, - - clone: function(source, target) { - var options = Object.extend({ - setLeft: true, - setTop: true, - setWidth: true, - setHeight: true, - offsetTop: 0, - offsetLeft: 0 - }, arguments[2] || {}) - - // find page position of source - source = $(source); - var p = Position.page(source); - - // find coordinate system to use - target = $(target); - var delta = [0, 0]; - var parent = null; - // delta [0,0] will do fine with position: fixed elements, - // position:absolute needs offsetParent deltas - if (Element.getStyle(target,'position') == 'absolute') { - parent = Position.offsetParent(target); - delta = Position.page(parent); - } - - // correct by body offsets (fixes Safari) - if (parent == document.body) { - delta[0] -= document.body.offsetLeft; - delta[1] -= document.body.offsetTop; - } - - // set position - if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; - if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; - if(options.setWidth) target.style.width = source.offsetWidth + 'px'; - if(options.setHeight) target.style.height = source.offsetHeight + 'px'; - }, - - absolutize: function(element) { - element = $(element); - if (element.style.position == 'absolute') return; - Position.prepare(); - - var offsets = Position.positionedOffset(element); - var top = offsets[1]; - var left = offsets[0]; - var width = element.clientWidth; - var height = element.clientHeight; - - element._originalLeft = left - parseFloat(element.style.left || 0); - element._originalTop = top - parseFloat(element.style.top || 0); - element._originalWidth = element.style.width; - element._originalHeight = element.style.height; - - element.style.position = 'absolute'; - element.style.top = top + 'px';; - element.style.left = left + 'px';; - element.style.width = width + 'px';; - element.style.height = height + 'px';; - }, - - relativize: function(element) { - element = $(element); - if (element.style.position == 'relative') return; - Position.prepare(); - - element.style.position = 'relative'; - var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); - var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); - - element.style.top = top + 'px'; - element.style.left = left + 'px'; - element.style.height = element._originalHeight; - element.style.width = element._originalWidth; - } -} - -// Safari returns margins on body which is incorrect if the child is absolutely -// positioned. For performance reasons, redefine Position.cumulativeOffset for -// KHTML/WebKit only. -if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) { - Position.cumulativeOffset = function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - if (element.offsetParent == document.body) - if (Element.getStyle(element, 'position') == 'absolute') break; - - element = element.offsetParent; - } while (element); - - return [valueL, valueT]; - } -} diff --git a/public/lib/Rico/Color.js b/public/lib/Rico/Color.js deleted file mode 100644 index e61ae2942..000000000 --- a/public/lib/Rico/Color.js +++ /dev/null @@ -1,232 +0,0 @@ -Rico.Color = Class.create(); - -Rico.Color.prototype = { - - initialize: function(red, green, blue) { - this.rgb = { r: red, g : green, b : blue }; - }, - - setRed: function(r) { - this.rgb.r = r; - }, - - setGreen: function(g) { - this.rgb.g = g; - }, - - setBlue: function(b) { - this.rgb.b = b; - }, - - setHue: function(h) { - - // get an HSB model, and set the new hue... - var hsb = this.asHSB(); - hsb.h = h; - - // convert back to RGB... - this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, hsb.b); - }, - - setSaturation: function(s) { - // get an HSB model, and set the new hue... - var hsb = this.asHSB(); - hsb.s = s; - - // convert back to RGB and set values... - this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, hsb.b); - }, - - setBrightness: function(b) { - // get an HSB model, and set the new hue... - var hsb = this.asHSB(); - hsb.b = b; - - // convert back to RGB and set values... - this.rgb = Rico.Color.HSBtoRGB( hsb.h, hsb.s, hsb.b ); - }, - - darken: function(percent) { - var hsb = this.asHSB(); - this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, Math.max(hsb.b - percent,0)); - }, - - brighten: function(percent) { - var hsb = this.asHSB(); - this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, Math.min(hsb.b + percent,1)); - }, - - blend: function(other) { - this.rgb.r = Math.floor((this.rgb.r + other.rgb.r)/2); - this.rgb.g = Math.floor((this.rgb.g + other.rgb.g)/2); - this.rgb.b = Math.floor((this.rgb.b + other.rgb.b)/2); - }, - - isBright: function() { - var hsb = this.asHSB(); - return this.asHSB().b > 0.5; - }, - - isDark: function() { - return ! this.isBright(); - }, - - asRGB: function() { - return "rgb(" + this.rgb.r + "," + this.rgb.g + "," + this.rgb.b + ")"; - }, - - asHex: function() { - return "#" + this.rgb.r.toColorPart() + this.rgb.g.toColorPart() + this.rgb.b.toColorPart(); - }, - - asHSB: function() { - return Rico.Color.RGBtoHSB(this.rgb.r, this.rgb.g, this.rgb.b); - }, - - toString: function() { - return this.asHex(); - } - -}; - -Rico.Color.createFromHex = function(hexCode) { - if(hexCode.length==4) { - var shortHexCode = hexCode; - var hexCode = '#'; - for(var i=1;i<4;i++) hexCode += (shortHexCode.charAt(i) + -shortHexCode.charAt(i)); - } - if ( hexCode.indexOf('#') == 0 ) - hexCode = hexCode.substring(1); - var red = hexCode.substring(0,2); - var green = hexCode.substring(2,4); - var blue = hexCode.substring(4,6); - return new Rico.Color( parseInt(red,16), parseInt(green,16), parseInt(blue,16) ); -} - -/** - * Factory method for creating a color from the background of - * an HTML element. - */ -Rico.Color.createColorFromBackground = function(elem) { - - var actualColor = RicoUtil.getElementsComputedStyle($(elem), "backgroundColor", "background-color"); - - if ( actualColor == "transparent" && elem.parentNode ) - return Rico.Color.createColorFromBackground(elem.parentNode); - - if ( actualColor == null ) - return new Rico.Color(255,255,255); - - if ( actualColor.indexOf("rgb(") == 0 ) { - var colors = actualColor.substring(4, actualColor.length - 1 ); - var colorArray = colors.split(","); - return new Rico.Color( parseInt( colorArray[0] ), - parseInt( colorArray[1] ), - parseInt( colorArray[2] ) ); - - } - else if ( actualColor.indexOf("#") == 0 ) { - return Rico.Color.createFromHex(actualColor); - } - else - return new Rico.Color(255,255,255); -} - -Rico.Color.HSBtoRGB = function(hue, saturation, brightness) { - - var red = 0; - var green = 0; - var blue = 0; - - if (saturation == 0) { - red = parseInt(brightness * 255.0 + 0.5); - green = red; - blue = red; - } - else { - var h = (hue - Math.floor(hue)) * 6.0; - var f = h - Math.floor(h); - var p = brightness * (1.0 - saturation); - var q = brightness * (1.0 - saturation * f); - var t = brightness * (1.0 - (saturation * (1.0 - f))); - - switch (parseInt(h)) { - case 0: - red = (brightness * 255.0 + 0.5); - green = (t * 255.0 + 0.5); - blue = (p * 255.0 + 0.5); - break; - case 1: - red = (q * 255.0 + 0.5); - green = (brightness * 255.0 + 0.5); - blue = (p * 255.0 + 0.5); - break; - case 2: - red = (p * 255.0 + 0.5); - green = (brightness * 255.0 + 0.5); - blue = (t * 255.0 + 0.5); - break; - case 3: - red = (p * 255.0 + 0.5); - green = (q * 255.0 + 0.5); - blue = (brightness * 255.0 + 0.5); - break; - case 4: - red = (t * 255.0 + 0.5); - green = (p * 255.0 + 0.5); - blue = (brightness * 255.0 + 0.5); - break; - case 5: - red = (brightness * 255.0 + 0.5); - green = (p * 255.0 + 0.5); - blue = (q * 255.0 + 0.5); - break; - } - } - - return { r : parseInt(red), g : parseInt(green) , b : parseInt(blue) }; -} - -Rico.Color.RGBtoHSB = function(r, g, b) { - - var hue; - var saturation; - var brightness; - - var cmax = (r > g) ? r : g; - if (b > cmax) - cmax = b; - - var cmin = (r < g) ? r : g; - if (b < cmin) - cmin = b; - - brightness = cmax / 255.0; - if (cmax != 0) - saturation = (cmax - cmin)/cmax; - else - saturation = 0; - - if (saturation == 0) - hue = 0; - else { - var redc = (cmax - r)/(cmax - cmin); - var greenc = (cmax - g)/(cmax - cmin); - var bluec = (cmax - b)/(cmax - cmin); - - if (r == cmax) - hue = bluec - greenc; - else if (g == cmax) - hue = 2.0 + redc - bluec; - else - hue = 4.0 + greenc - redc; - - hue = hue / 6.0; - if (hue < 0) - hue = hue + 1.0; - } - - return { h : hue, s : saturation, b : brightness }; -} - diff --git a/public/lib/Rico/Corner.js b/public/lib/Rico/Corner.js deleted file mode 100644 index b3a2970a1..000000000 --- a/public/lib/Rico/Corner.js +++ /dev/null @@ -1,314 +0,0 @@ -/** -* -* Copyright 2005 Sabre Airline Solutions -* -* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this -* file except in compliance with the License. You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software distributed under the -* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, -* either express or implied. See the License for the specific language governing permissions -* and limitations under the License. -**/ - - -var Rico = new Object(); -Rico.Corner = { - - round: function(e, options) { - var e = $(e); - this._setOptions(options); - - var color = this.options.color; - if ( this.options.color == "fromElement" ) - color = this._background(e); - - var bgColor = this.options.bgColor; - if ( this.options.bgColor == "fromParent" ) - bgColor = this._background(e.offsetParent); - - this._roundCornersImpl(e, color, bgColor); - }, - - /** This is a helper function to change the background - * color of
that has had Rico rounded corners added. - * - * It seems we cannot just set the background color for the - * outer
so each element used to create the - * corners must have its background color set individually. - * - * @param {DOM} theDiv - A child of the outer
that was - * supplied to the `round` method. - * - * @param {str} newColor - The new background color to use. - */ - changeColor: function(theDiv, newColor) { - - theDiv.style.backgroundColor = newColor; - - var spanElements = theDiv.parentNode.getElementsByTagName("span"); - - for (var currIdx = 0; currIdx < spanElements.length; currIdx++) { - spanElements[currIdx].style.backgroundColor = newColor; - } - }, - - - /** This is a helper function to change the background - * opacity of
that has had Rico rounded corners added. - * - * See changeColor (above) for algorithm explanation - * - * @param {DOM} theDiv A child of the outer
that was - * supplied to the `round` method. - * - * @param {int} newOpacity The new opacity to use (0-1). - */ - changeOpacity: function(theDiv, newOpacity) { - - var mozillaOpacity = newOpacity; - var ieOpacity = 'alpha(opacity=' + newOpacity * 100 + ')'; - - theDiv.style.opacity = mozillaOpacity; - theDiv.style.filter = ieOpacity; - - var spanElements = theDiv.parentNode.getElementsByTagName("span"); - - for (var currIdx = 0; currIdx < spanElements.length; currIdx++) { - spanElements[currIdx].style.opacity = mozillaOpacity; - spanElements[currIdx].style.filter = ieOpacity; - } - - }, - - /** this function takes care of redoing the rico cornering - * - * you can't just call updateRicoCorners() again and pass it a - * new options string. you have to first remove the divs that - * rico puts on top and below the content div. - * - * @param {DOM} theDiv - A child of the outer
that was - * supplied to the `round` method. - * - * @param {Array} options - list of options - */ - reRound: function(theDiv, options) { - - var topRico = theDiv.parentNode.childNodes[0]; - //theDiv would be theDiv.parentNode.childNodes[1] - var bottomRico = theDiv.parentNode.childNodes[2]; - - theDiv.parentNode.removeChild(topRico); - theDiv.parentNode.removeChild(bottomRico); - - this.round(theDiv.parentNode, options); - }, - - _roundCornersImpl: function(e, color, bgColor) { - if(this.options.border) - this._renderBorder(e,bgColor); - if(this._isTopRounded()) - this._roundTopCorners(e,color,bgColor); - if(this._isBottomRounded()) - this._roundBottomCorners(e,color,bgColor); - }, - - _renderBorder: function(el,bgColor) { - var borderValue = "1px solid " + this._borderColor(bgColor); - var borderL = "border-left: " + borderValue; - var borderR = "border-right: " + borderValue; - var style = "style='" + borderL + ";" + borderR + "'"; - el.innerHTML = "
" + el.innerHTML + "
" - }, - - _roundTopCorners: function(el, color, bgColor) { - var corner = this._createCorner(bgColor); - for(var i=0 ; i < this.options.numSlices ; i++ ) - corner.appendChild(this._createCornerSlice(color,bgColor,i,"top")); - el.style.paddingTop = 0; - el.insertBefore(corner,el.firstChild); - }, - - _roundBottomCorners: function(el, color, bgColor) { - var corner = this._createCorner(bgColor); - for(var i=(this.options.numSlices-1) ; i >= 0 ; i-- ) - corner.appendChild(this._createCornerSlice(color,bgColor,i,"bottom")); - el.style.paddingBottom = 0; - el.appendChild(corner); - }, - - _createCorner: function(bgColor) { - var corner = document.createElement("div"); - corner.style.backgroundColor = (this._isTransparent() ? "transparent" : bgColor); - return corner; - }, - - _createCornerSlice: function(color,bgColor, n, position) { - var slice = document.createElement("span"); - - var inStyle = slice.style; - inStyle.backgroundColor = color; - inStyle.display = "block"; - inStyle.height = "1px"; - inStyle.overflow = "hidden"; - inStyle.fontSize = "1px"; - - var borderColor = this._borderColor(color,bgColor); - if ( this.options.border && n == 0 ) { - inStyle.borderTopStyle = "solid"; - inStyle.borderTopWidth = "1px"; - inStyle.borderLeftWidth = "0px"; - inStyle.borderRightWidth = "0px"; - inStyle.borderBottomWidth = "0px"; - inStyle.height = "0px"; // assumes css compliant box model - inStyle.borderColor = borderColor; - } - else if(borderColor) { - inStyle.borderColor = borderColor; - inStyle.borderStyle = "solid"; - inStyle.borderWidth = "0px 1px"; - } - - if ( !this.options.compact && (n == (this.options.numSlices-1)) ) - inStyle.height = "2px"; - - this._setMargin(slice, n, position); - this._setBorder(slice, n, position); - return slice; - }, - - _setOptions: function(options) { - this.options = { - corners : "all", - color : "fromElement", - bgColor : "fromParent", - blend : true, - border : false, - compact : false - } - Object.extend(this.options, options || {}); - - this.options.numSlices = this.options.compact ? 2 : 4; - if ( this._isTransparent() ) - this.options.blend = false; - }, - - _whichSideTop: function() { - if ( this._hasString(this.options.corners, "all", "top") ) - return ""; - - if ( this.options.corners.indexOf("tl") >= 0 && this.options.corners.indexOf("tr") >= 0 ) - return ""; - - if (this.options.corners.indexOf("tl") >= 0) - return "left"; - else if (this.options.corners.indexOf("tr") >= 0) - return "right"; - return ""; - }, - - _whichSideBottom: function() { - if ( this._hasString(this.options.corners, "all", "bottom") ) - return ""; - - if ( this.options.corners.indexOf("bl")>=0 && this.options.corners.indexOf("br")>=0 ) - return ""; - - if(this.options.corners.indexOf("bl") >=0) - return "left"; - else if(this.options.corners.indexOf("br")>=0) - return "right"; - return ""; - }, - - _borderColor : function(color,bgColor) { - if ( color == "transparent" ) - return bgColor; - else if ( this.options.border ) - return this.options.border; - else if ( this.options.blend ) - return this._blend( bgColor, color ); - else - return ""; - }, - - - _setMargin: function(el, n, corners) { - var marginSize = this._marginSize(n); - var whichSide = corners == "top" ? this._whichSideTop() : this._whichSideBottom(); - - if ( whichSide == "left" ) { - el.style.marginLeft = marginSize + "px"; el.style.marginRight = "0px"; - } - else if ( whichSide == "right" ) { - el.style.marginRight = marginSize + "px"; el.style.marginLeft = "0px"; - } - else { - el.style.marginLeft = marginSize + "px"; el.style.marginRight = marginSize + "px"; - } - }, - - _setBorder: function(el,n,corners) { - var borderSize = this._borderSize(n); - var whichSide = corners == "top" ? this._whichSideTop() : this._whichSideBottom(); - if ( whichSide == "left" ) { - el.style.borderLeftWidth = borderSize + "px"; el.style.borderRightWidth = "0px"; - } - else if ( whichSide == "right" ) { - el.style.borderRightWidth = borderSize + "px"; el.style.borderLeftWidth = "0px"; - } - else { - el.style.borderLeftWidth = borderSize + "px"; el.style.borderRightWidth = borderSize + "px"; - } - if (this.options.border != false) - el.style.borderLeftWidth = borderSize + "px"; el.style.borderRightWidth = borderSize + "px"; - }, - - _marginSize: function(n) { - if ( this._isTransparent() ) - return 0; - - var marginSizes = [ 5, 3, 2, 1 ]; - var blendedMarginSizes = [ 3, 2, 1, 0 ]; - var compactMarginSizes = [ 2, 1 ]; - var smBlendedMarginSizes = [ 1, 0 ]; - - if ( this.options.compact && this.options.blend ) - return smBlendedMarginSizes[n]; - else if ( this.options.compact ) - return compactMarginSizes[n]; - else if ( this.options.blend ) - return blendedMarginSizes[n]; - else - return marginSizes[n]; - }, - - _borderSize: function(n) { - var transparentBorderSizes = [ 5, 3, 2, 1 ]; - var blendedBorderSizes = [ 2, 1, 1, 1 ]; - var compactBorderSizes = [ 1, 0 ]; - var actualBorderSizes = [ 0, 2, 0, 0 ]; - - if ( this.options.compact && (this.options.blend || this._isTransparent()) ) - return 1; - else if ( this.options.compact ) - return compactBorderSizes[n]; - else if ( this.options.blend ) - return blendedBorderSizes[n]; - else if ( this.options.border ) - return actualBorderSizes[n]; - else if ( this._isTransparent() ) - return transparentBorderSizes[n]; - return 0; - }, - - _hasString: function(str) { for(var i=1 ; i= 0) return true; return false; }, - _blend: function(c1, c2) { var cc1 = Rico.Color.createFromHex(c1); cc1.blend(Rico.Color.createFromHex(c2)); return cc1; }, - _background: function(el) { try { return Rico.Color.createColorFromBackground(el).asHex(); } catch(err) { return "#ffffff"; } }, - _isTransparent: function() { return this.options.color == "transparent"; }, - _isTopRounded: function() { return this._hasString(this.options.corners, "all", "top", "tl", "tr"); }, - _isBottomRounded: function() { return this._hasString(this.options.corners, "all", "bottom", "bl", "br"); }, - _hasSingleTextChild: function(el) { return el.childNodes.length == 1 && el.childNodes[0].nodeType == 3; } -} diff --git a/public/opensearch/osm.xml b/public/opensearch/osm.xml index a060ce7ee..754d78e5d 100644 --- a/public/opensearch/osm.xml +++ b/public/opensearch/osm.xml @@ -1,17 +1,17 @@ - - - OpenStreetMap - OpenStreetMap Search - Search for a place in OpenStreetMap, the Wiki World Map - UTF-8 - UTF-8 - data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%10%00%00%00%10%08%06%00%00%00%1F%F3%FFa%00%00%00%19tEXtSoftware%00www.inkscape.org%9B%EE%3C%1A%00%00%01'IDATx%9C%9D%93%B1q%C30%0CE%1F%5Dd%80l%90I%C4*%A7%22%95%CF%85J%97%AE%B2%82%3DC%CE%03%A0%B3%9B%B8f%95%A3%17H%93%05%5C%A7%C8%0A%3F%05E%8A%92l%E7.%D0%E9N%02%81%07%E0Cr%FCaf%A6%FC%BC%5E%AF%DD%F4%3C%3Bt%C5%87%99)%84P%0E%DA%B6%BD%0AI%00%A1%A8%A8%1E%263S%D7u%C9'F%FE%9B%80%0C%C9%C9%22%BD'%B0%0A%AC%86%2CJ%DB%0E%22%11%8F%2F%D4%B3%22%8D%F34%CE%13u%06R%0C%40%D7u%AA%01%C5r%40%0Dq%88%C6%F9i%E8%7C%8CX%5D%A9M%95%D6%A3%A2Ti%C3Xx%CA%9C%F5mf3h%11%B6%07%B8%0APh%97%DD%1E%9E%5E%08!%D0%B6m%F1%87%108%1E%8EY5%007%03%5Cv%7B%00%3E%BF%3E%F8~x%1E%CD%B89l%00%F0I%0FWw%00%20%DB%AEJr%B6%E5%FB%09%80%C6y%CE%7D%91%1AP%B6p%2B%D9%BB%06%18V%3A%B5E%9F%AC%5B%95%AFY%3F%EE%20%A2mW%AA%93%DFN%3F%A0%E1%9B%F0u%E5%BC%BC%89%88%BC.%1F%D5'%DF%FD%C1%EE%F8%FFg%BFp%96%DF%E2%DCw%25%2B%00%00%00%00IEND%AEB%60%82 - - - - - Jonathan Bennett - false - Data &copy; OpenStreetMap contributors, Some Rights Reserved. CC by-sa 2.0. Geolocation provided by npemap.org.uk, geocoder.us, geocoder.ca and geonames.org. - + + + OpenStreetMap + OpenStreetMap Search + Search for a place in OpenStreetMap, the Wiki World Map + UTF-8 + UTF-8 + data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%10%00%00%00%10%08%06%00%00%00%1F%F3%FFa%00%00%00%19tEXtSoftware%00www.inkscape.org%9B%EE%3C%1A%00%00%01'IDATx%9C%9D%93%B1q%C30%0CE%1F%5Dd%80l%90I%C4*%A7%22%95%CF%85J%97%AE%B2%82%3DC%CE%03%A0%B3%9B%B8f%95%A3%17H%93%05%5C%A7%C8%0A%3F%05E%8A%92l%E7.%D0%E9N%02%81%07%E0Cr%FCaf%A6%FC%BC%5E%AF%DD%F4%3C%3Bt%C5%87%99)%84P%0E%DA%B6%BD%0AI%00%A1%A8%A8%1E%263S%D7u%C9'F%FE%9B%80%0C%C9%C9%22%BD'%B0%0A%AC%86%2CJ%DB%0E%22%11%8F%2F%D4%B3%22%8D%F34%CE%13u%06R%0C%40%D7u%AA%01%C5r%40%0Dq%88%C6%F9i%E8%7C%8CX%5D%A9M%95%D6%A3%A2Ti%C3Xx%CA%9C%F5mf3h%11%B6%07%B8%0APh%97%DD%1E%9E%5E%08!%D0%B6m%F1%87%108%1E%8EY5%007%03%5Cv%7B%00%3E%BF%3E%F8~x%1E%CD%B89l%00%F0I%0FWw%00%20%DB%AEJr%B6%E5%FB%09%80%C6y%CE%7D%91%1AP%B6p%2B%D9%BB%06%18V%3A%B5E%9F%AC%5B%95%AFY%3F%EE%20%A2mW%AA%93%DFN%3F%A0%E1%9B%F0u%E5%BC%BC%89%88%BC.%1F%D5'%DF%FD%C1%EE%F8%FFg%BFp%96%DF%E2%DCw%25%2B%00%00%00%00IEND%AEB%60%82 + + + + + Jonathan Bennett + false + Data &copy; OpenStreetMap contributors, Some Rights Reserved. CC by-sa 2.0. Geolocation provided by npemap.org.uk, geocoder.us, geocoder.ca and geonames.org. + diff --git a/public/potlatch/potlatch.swf b/public/potlatch/potlatch.swf index e4bc3c5d4..24f2012aa 100644 Binary files a/public/potlatch/potlatch.swf and b/public/potlatch/potlatch.swf differ diff --git a/vendor/gems/composite_primary_keys-2.2.2/README.txt b/vendor/gems/composite_primary_keys-2.2.2/README.txt index 11daeb922..b0d8c12d6 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/README.txt +++ b/vendor/gems/composite_primary_keys-2.2.2/README.txt @@ -1,41 +1,41 @@ -= Composite Primary Keys for ActiveRecords - -== Summary - -ActiveRecords/Rails famously doesn't support composite primary keys. -This RubyGem extends the activerecord gem to provide CPK support. - -== Installation - - gem install composite_primary_keys - -== Usage - - require 'composite_primary_keys' - class ProductVariation - set_primary_keys :product_id, :variation_seq - end - - pv = ProductVariation.find(345, 12) - -It even supports composite foreign keys for associations. - -See http://compositekeys.rubyforge.org for more. - -== Running Tests - -See test/README.tests.txt - -== Url - -http://compositekeys.rubyforge.org - -== Questions, Discussion and Contributions - -http://groups.google.com/compositekeys - -== Author - -Written by Dr Nic Williams, drnicwilliams@gmail -Contributions by many! - += Composite Primary Keys for ActiveRecords + +== Summary + +ActiveRecords/Rails famously doesn't support composite primary keys. +This RubyGem extends the activerecord gem to provide CPK support. + +== Installation + + gem install composite_primary_keys + +== Usage + + require 'composite_primary_keys' + class ProductVariation + set_primary_keys :product_id, :variation_seq + end + + pv = ProductVariation.find(345, 12) + +It even supports composite foreign keys for associations. + +See http://compositekeys.rubyforge.org for more. + +== Running Tests + +See test/README.tests.txt + +== Url + +http://compositekeys.rubyforge.org + +== Questions, Discussion and Contributions + +http://groups.google.com/compositekeys + +== Author + +Written by Dr Nic Williams, drnicwilliams@gmail +Contributions by many! + diff --git a/vendor/gems/composite_primary_keys-2.2.2/Rakefile b/vendor/gems/composite_primary_keys-2.2.2/Rakefile index fe0b8fd78..e5bebdb97 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/Rakefile +++ b/vendor/gems/composite_primary_keys-2.2.2/Rakefile @@ -1,65 +1,65 @@ -require 'rubygems' -require 'rake' -require 'rake/clean' -require 'rake/testtask' -require 'rake/rdoctask' -require 'rake/packagetask' -require 'rake/gempackagetask' -require 'rake/contrib/rubyforgepublisher' -require 'fileutils' -require 'hoe' -include FileUtils -require File.join(File.dirname(__FILE__), 'lib', 'composite_primary_keys', 'version') - -AUTHOR = "Dr Nic Williams" -EMAIL = "drnicwilliams@gmail.com" -DESCRIPTION = "Composite key support for ActiveRecords" -GEM_NAME = "composite_primary_keys" # what ppl will type to install your gem -if File.exists?("~/.rubyforge/user-config.yml") - # TODO this should prob go in a local/ file - config = YAML.load(File.read(File.expand_path("~/.rubyforge/user-config.yml"))) - RUBYFORGE_USERNAME = config["username"] -end -RUBYFORGE_PROJECT = "compositekeys" -HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org" - -REV = nil #File.read(".svn/entries")[/committed-rev="(\d+)"/, 1] rescue nil -VERS = ENV['VERSION'] || (CompositePrimaryKeys::VERSION::STRING + (REV ? ".#{REV}" : "")) -CLEAN.include ['**/.*.sw?', '*.gem', '.config','debug.log','*.db','logfile','log/**/*','**/.DS_Store', '.project'] -RDOC_OPTS = ['--quiet', '--title', "newgem documentation", - "--opname", "index.html", - "--line-numbers", - "--main", "README", - "--inline-source"] - -class Hoe - def extra_deps - @extra_deps.reject { |x| Array(x).first == 'hoe' } - end -end - -# Generate all the Rake tasks -# Run 'rake -T' to see list of generated tasks (from gem root directory) -hoe = Hoe.new(GEM_NAME, VERS) do |p| - p.author = AUTHOR - p.description = DESCRIPTION - p.email = EMAIL - p.summary = DESCRIPTION - p.url = HOMEPATH - p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT - p.test_globs = ["test/**/test*.rb"] - p.clean_globs |= CLEAN #An array of file patterns to delete on clean. - - # == Optional - p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n") - p.extra_deps = [['activerecord', '>= 2.2.0']] #An array of rubygem dependencies. - #p.spec_extras - A hash of extra values to set in the gemspec. -end - -CHANGES = hoe.paragraphs_of('History.txt', 0..1).join("\n\n") -PATH = RUBYFORGE_PROJECT -hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''), 'rdoc') - -PROJECT_ROOT = File.expand_path(".") - -require 'loader' +require 'rubygems' +require 'rake' +require 'rake/clean' +require 'rake/testtask' +require 'rake/rdoctask' +require 'rake/packagetask' +require 'rake/gempackagetask' +require 'rake/contrib/rubyforgepublisher' +require 'fileutils' +require 'hoe' +include FileUtils +require File.join(File.dirname(__FILE__), 'lib', 'composite_primary_keys', 'version') + +AUTHOR = "Dr Nic Williams" +EMAIL = "drnicwilliams@gmail.com" +DESCRIPTION = "Composite key support for ActiveRecords" +GEM_NAME = "composite_primary_keys" # what ppl will type to install your gem +if File.exists?("~/.rubyforge/user-config.yml") + # TODO this should prob go in a local/ file + config = YAML.load(File.read(File.expand_path("~/.rubyforge/user-config.yml"))) + RUBYFORGE_USERNAME = config["username"] +end +RUBYFORGE_PROJECT = "compositekeys" +HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org" + +REV = nil #File.read(".svn/entries")[/committed-rev="(\d+)"/, 1] rescue nil +VERS = ENV['VERSION'] || (CompositePrimaryKeys::VERSION::STRING + (REV ? ".#{REV}" : "")) +CLEAN.include ['**/.*.sw?', '*.gem', '.config','debug.log','*.db','logfile','log/**/*','**/.DS_Store', '.project'] +RDOC_OPTS = ['--quiet', '--title', "newgem documentation", + "--opname", "index.html", + "--line-numbers", + "--main", "README", + "--inline-source"] + +class Hoe + def extra_deps + @extra_deps.reject { |x| Array(x).first == 'hoe' } + end +end + +# Generate all the Rake tasks +# Run 'rake -T' to see list of generated tasks (from gem root directory) +hoe = Hoe.new(GEM_NAME, VERS) do |p| + p.author = AUTHOR + p.description = DESCRIPTION + p.email = EMAIL + p.summary = DESCRIPTION + p.url = HOMEPATH + p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT + p.test_globs = ["test/**/test*.rb"] + p.clean_globs |= CLEAN #An array of file patterns to delete on clean. + + # == Optional + p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n") + p.extra_deps = [['activerecord', '>= 2.2.0']] #An array of rubygem dependencies. + #p.spec_extras - A hash of extra values to set in the gemspec. +end + +CHANGES = hoe.paragraphs_of('History.txt', 0..1).join("\n\n") +PATH = RUBYFORGE_PROJECT +hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''), 'rdoc') + +PROJECT_ROOT = File.expand_path(".") + +require 'loader' diff --git a/vendor/gems/composite_primary_keys-2.2.2/install.rb b/vendor/gems/composite_primary_keys-2.2.2/install.rb index 5be89cf10..7d021ce1d 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/install.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/install.rb @@ -1,30 +1,30 @@ -require 'rbconfig' -require 'find' -require 'ftools' - -include Config - -# this was adapted from rdoc's install.rb by ways of Log4r - -$sitedir = CONFIG["sitelibdir"] -unless $sitedir - version = CONFIG["MAJOR"] + "." + CONFIG["MINOR"] - $libdir = File.join(CONFIG["libdir"], "ruby", version) - $sitedir = $:.find {|x| x =~ /site_ruby/ } - if !$sitedir - $sitedir = File.join($libdir, "site_ruby") - elsif $sitedir !~ Regexp.quote(version) - $sitedir = File.join($sitedir, version) - end -end - -# the acual gruntwork -Dir.chdir("lib") - -Find.find("composite_primary_keys", "composite_primary_keys.rb") { |f| - if f[-3..-1] == ".rb" - File::install(f, File.join($sitedir, *f.split(/\//)), 0644, true) - else - File::makedirs(File.join($sitedir, *f.split(/\//))) - end -} +require 'rbconfig' +require 'find' +require 'ftools' + +include Config + +# this was adapted from rdoc's install.rb by ways of Log4r + +$sitedir = CONFIG["sitelibdir"] +unless $sitedir + version = CONFIG["MAJOR"] + "." + CONFIG["MINOR"] + $libdir = File.join(CONFIG["libdir"], "ruby", version) + $sitedir = $:.find {|x| x =~ /site_ruby/ } + if !$sitedir + $sitedir = File.join($libdir, "site_ruby") + elsif $sitedir !~ Regexp.quote(version) + $sitedir = File.join($sitedir, version) + end +end + +# the acual gruntwork +Dir.chdir("lib") + +Find.find("composite_primary_keys", "composite_primary_keys.rb") { |f| + if f[-3..-1] == ".rb" + File::install(f, File.join($sitedir, *f.split(/\//)), 0644, true) + else + File::makedirs(File.join($sitedir, *f.split(/\//))) + end +} diff --git a/vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys.rb b/vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys.rb index 99b61407e..64f7e14b3 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys.rb @@ -1,55 +1,55 @@ -#-- -# Copyright (c) 2006 Nic Williams -# -# 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. -#++ - -$:.unshift(File.dirname(__FILE__)) unless - $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__))) - -unless defined?(ActiveRecord) - begin - require 'active_record' - rescue LoadError - require 'rubygems' - require_gem 'activerecord' - end -end - -require 'composite_primary_keys/fixtures' -require 'composite_primary_keys/composite_arrays' -require 'composite_primary_keys/associations' -require 'composite_primary_keys/association_preload' -require 'composite_primary_keys/reflection' -require 'composite_primary_keys/base' -require 'composite_primary_keys/calculations' -require 'composite_primary_keys/migration' -require 'composite_primary_keys/attribute_methods' - -ActiveRecord::Base.class_eval do - include CompositePrimaryKeys::ActiveRecord::Base -end - -Dir[File.dirname(__FILE__) + '/composite_primary_keys/connection_adapters/*.rb'].each do |adapter| - begin - require adapter.gsub('.rb','') - rescue MissingSourceFile - end -end +#-- +# Copyright (c) 2006 Nic Williams +# +# 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. +#++ + +$:.unshift(File.dirname(__FILE__)) unless + $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__))) + +unless defined?(ActiveRecord) + begin + require 'active_record' + rescue LoadError + require 'rubygems' + require_gem 'activerecord' + end +end + +require 'composite_primary_keys/fixtures' +require 'composite_primary_keys/composite_arrays' +require 'composite_primary_keys/associations' +require 'composite_primary_keys/association_preload' +require 'composite_primary_keys/reflection' +require 'composite_primary_keys/base' +require 'composite_primary_keys/calculations' +require 'composite_primary_keys/migration' +require 'composite_primary_keys/attribute_methods' + +ActiveRecord::Base.class_eval do + include CompositePrimaryKeys::ActiveRecord::Base +end + +Dir[File.dirname(__FILE__) + '/composite_primary_keys/connection_adapters/*.rb'].each do |adapter| + begin + require adapter.gsub('.rb','') + rescue MissingSourceFile + end +end diff --git a/vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/base.rb b/vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/base.rb index a4c7ff93a..4558f97a3 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/base.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/base.rb @@ -1,341 +1,341 @@ -module CompositePrimaryKeys - module ActiveRecord #:nodoc: - class CompositeKeyError < StandardError #:nodoc: - end - - module Base #:nodoc: - - INVALID_FOR_COMPOSITE_KEYS = 'Not appropriate for composite primary keys' - NOT_IMPLEMENTED_YET = 'Not implemented for composite primary keys yet' - - def self.append_features(base) - super - base.send(:include, InstanceMethods) - base.extend(ClassMethods) - end - - module ClassMethods - def set_primary_keys(*keys) - keys = keys.first if keys.first.is_a?(Array) - keys = keys.map { |k| k.to_sym } - cattr_accessor :primary_keys - self.primary_keys = keys.to_composite_keys - - class_eval <<-EOV - extend CompositeClassMethods - include CompositeInstanceMethods - - include CompositePrimaryKeys::ActiveRecord::Associations - include CompositePrimaryKeys::ActiveRecord::AssociationPreload - include CompositePrimaryKeys::ActiveRecord::Calculations - include CompositePrimaryKeys::ActiveRecord::AttributeMethods - EOV - end - - def composite? - false - end - end - - module InstanceMethods - def composite?; self.class.composite?; end - end - - module CompositeInstanceMethods - - # A model instance's primary keys is always available as model.ids - # whether you name it the default 'id' or set it to something else. - def id - attr_names = self.class.primary_keys - CompositeIds.new(attr_names.map { |attr_name| read_attribute(attr_name) }) - end - alias_method :ids, :id - - def to_param - id.to_s - end - - def id_before_type_cast #:nodoc: - raise CompositeKeyError, CompositePrimaryKeys::ActiveRecord::Base::NOT_IMPLEMENTED_YET - end - - def quoted_id #:nodoc: - [self.class.primary_keys, ids]. - transpose. - map {|attr_name,id| quote_value(id, column_for_attribute(attr_name))}. - to_composite_ids - end - - # Sets the primary ID. - def id=(ids) - ids = ids.split(ID_SEP) if ids.is_a?(String) - ids.flatten! - unless ids.is_a?(Array) and ids.length == self.class.primary_keys.length - raise "#{self.class}.id= requires #{self.class.primary_keys.length} ids" - end - [primary_keys, ids].transpose.each {|key, an_id| write_attribute(key , an_id)} - id - end - - # Returns a clone of the record that hasn't been assigned an id yet and - # is treated as a new record. Note that this is a "shallow" clone: - # it copies the object's attributes only, not its associations. - # The extent of a "deep" clone is application-specific and is therefore - # left to the application to implement according to its need. - def clone - attrs = self.attributes_before_type_cast - self.class.primary_keys.each {|key| attrs.delete(key.to_s)} - self.class.new do |record| - record.send :instance_variable_set, '@attributes', attrs - end - end - - - private - # The xx_without_callbacks methods are overwritten as that is the end of the alias chain - - # Creates a new record with values matching those of the instance attributes. - def create_without_callbacks - unless self.id - raise CompositeKeyError, "Composite keys do not generated ids from sequences, you must provide id values" - end - attributes_minus_pks = attributes_with_quotes(false) - quoted_pk_columns = self.class.primary_key.map { |col| connection.quote_column_name(col) } - cols = quoted_column_names(attributes_minus_pks) << quoted_pk_columns - vals = attributes_minus_pks.values << quoted_id - connection.insert( - "INSERT INTO #{self.class.quoted_table_name} " + - "(#{cols.join(', ')}) " + - "VALUES (#{vals.join(', ')})", - "#{self.class.name} Create", - self.class.primary_key, - self.id - ) - @new_record = false - return true - end - - # Updates the associated record with values matching those of the instance attributes. - def update_without_callbacks - where_clause_terms = [self.class.primary_key, quoted_id].transpose.map do |pair| - "(#{connection.quote_column_name(pair[0])} = #{pair[1]})" - end - where_clause = where_clause_terms.join(" AND ") - connection.update( - "UPDATE #{self.class.quoted_table_name} " + - "SET #{quoted_comma_pair_list(connection, attributes_with_quotes(false))} " + - "WHERE #{where_clause}", - "#{self.class.name} Update" - ) - return true - end - - # Deletes the record in the database and freezes this instance to reflect that no changes should - # be made (since they can't be persisted). - def destroy_without_callbacks - where_clause_terms = [self.class.primary_key, quoted_id].transpose.map do |pair| - "(#{connection.quote_column_name(pair[0])} = #{pair[1]})" - end - where_clause = where_clause_terms.join(" AND ") - unless new_record? - connection.delete( - "DELETE FROM #{self.class.quoted_table_name} " + - "WHERE #{where_clause}", - "#{self.class.name} Destroy" - ) - end - freeze - end - end - - module CompositeClassMethods - def primary_key; primary_keys; end - def primary_key=(keys); primary_keys = keys; end - - def composite? - true - end - - #ids_to_s([[1,2],[7,3]]) -> "(1,2),(7,3)" - #ids_to_s([[1,2],[7,3]], ',', ';') -> "1,2;7,3" - def ids_to_s(many_ids, id_sep = CompositePrimaryKeys::ID_SEP, list_sep = ',', left_bracket = '(', right_bracket = ')') - many_ids.map {|ids| "#{left_bracket}#{ids}#{right_bracket}"}.join(list_sep) - end - - # Creates WHERE condition from list of composited ids - # User.update_all({:role => 'admin'}, :conditions => composite_where_clause([[1, 2], [2, 2]])) #=> UPDATE admins SET admin.role='admin' WHERE (admin.type=1 AND admin.type2=2) OR (admin.type=2 AND admin.type2=2) - # User.find(:all, :conditions => composite_where_clause([[1, 2], [2, 2]])) #=> SELECT * FROM admins WHERE (admin.type=1 AND admin.type2=2) OR (admin.type=2 AND admin.type2=2) - def composite_where_clause(ids) - if ids.is_a?(String) - ids = [[ids]] - elsif not ids.first.is_a?(Array) # if single comp key passed, turn into an array of 1 - ids = [ids.to_composite_ids] - end - - ids.map do |id_set| - [primary_keys, id_set].transpose.map do |key, id| - "#{table_name}.#{key.to_s}=#{sanitize(id)}" - end.join(" AND ") - end.join(") OR (") - end - - # Returns true if the given +ids+ represents the primary keys of a record in the database, false otherwise. - # Example: - # Person.exists?(5,7) - def exists?(ids) - if ids.is_a?(Array) && ids.first.is_a?(String) - count(:conditions => ids) > 0 - else - obj = find(ids) rescue false - !obj.nil? and obj.is_a?(self) - end - end - - # Deletes the record with the given +ids+ without instantiating an object first, e.g. delete(1,2) - # If an array of ids is provided (e.g. delete([1,2], [3,4]), all of them - # are deleted. - def delete(*ids) - unless ids.is_a?(Array); raise "*ids must be an Array"; end - ids = [ids.to_composite_ids] if not ids.first.is_a?(Array) - where_clause = ids.map do |id_set| - [primary_keys, id_set].transpose.map do |key, id| - "#{quoted_table_name}.#{connection.quote_column_name(key.to_s)}=#{sanitize(id)}" - end.join(" AND ") - end.join(") OR (") - delete_all([ "(#{where_clause})" ]) - end - - # Destroys the record with the given +ids+ by instantiating the object and calling #destroy (all the callbacks are the triggered). - # If an array of ids is provided, all of them are destroyed. - def destroy(*ids) - unless ids.is_a?(Array); raise "*ids must be an Array"; end - if ids.first.is_a?(Array) - ids = ids.map{|compids| compids.to_composite_ids} - else - ids = ids.to_composite_ids - end - ids.first.is_a?(CompositeIds) ? ids.each { |id_set| find(id_set).destroy } : find(ids).destroy - end - - # Returns an array of column objects for the table associated with this class. - # Each column that matches to one of the primary keys has its - # primary attribute set to true - def columns - unless @columns - @columns = connection.columns(table_name, "#{name} Columns") - @columns.each {|column| column.primary = primary_keys.include?(column.name.to_sym)} - end - @columns - end - - ## DEACTIVATED METHODS ## - public - # Lazy-set the sequence name to the connection's default. This method - # is only ever called once since set_sequence_name overrides it. - def sequence_name #:nodoc: - raise CompositeKeyError, CompositePrimaryKeys::ActiveRecord::Base::INVALID_FOR_COMPOSITE_KEYS - end - - def reset_sequence_name #:nodoc: - raise CompositeKeyError, CompositePrimaryKeys::ActiveRecord::Base::INVALID_FOR_COMPOSITE_KEYS - end - - def set_primary_key(value = nil, &block) - raise CompositeKeyError, CompositePrimaryKeys::ActiveRecord::Base::INVALID_FOR_COMPOSITE_KEYS - end - - private - def find_one(id, options) - raise CompositeKeyError, CompositePrimaryKeys::ActiveRecord::Base::INVALID_FOR_COMPOSITE_KEYS - end - - def find_some(ids, options) - raise CompositeKeyError, CompositePrimaryKeys::ActiveRecord::Base::INVALID_FOR_COMPOSITE_KEYS - end - - def find_from_ids(ids, options) - ids = ids.first if ids.last == nil - conditions = " AND (#{sanitize_sql(options[:conditions])})" if options[:conditions] - # if ids is just a flat list, then its size must = primary_key.length (one id per primary key, in order) - # if ids is list of lists, then each inner list must follow rule above - if ids.first.is_a? String - # find '2,1' -> ids = ['2,1'] - # find '2,1;7,3' -> ids = ['2,1;7,3'] - ids = ids.first.split(ID_SET_SEP).map {|id_set| id_set.split(ID_SEP).to_composite_ids} - # find '2,1;7,3' -> ids = [['2','1'],['7','3']], inner [] are CompositeIds - end - ids = [ids.to_composite_ids] if not ids.first.kind_of?(Array) - ids.each do |id_set| - unless id_set.is_a?(Array) - raise "Ids must be in an Array, instead received: #{id_set.inspect}" - end - unless id_set.length == primary_keys.length - raise "#{id_set.inspect}: Incorrect number of primary keys for #{class_name}: #{primary_keys.inspect}" - end - end - - # Let keys = [:a, :b] - # If ids = [[10, 50], [11, 51]], then :conditions => - # "(#{quoted_table_name}.a, #{quoted_table_name}.b) IN ((10, 50), (11, 51))" - - conditions = ids.map do |id_set| - [primary_keys, id_set].transpose.map do |key, id| - col = columns_hash[key.to_s] - val = quote_value(id, col) - "#{quoted_table_name}.#{connection.quote_column_name(key.to_s)}=#{val}" - end.join(" AND ") - end.join(") OR (") - - options.update :conditions => "(#{conditions})" - - result = find_every(options) - - if result.size == ids.size - ids.size == 1 ? result[0] : result - else - raise ::ActiveRecord::RecordNotFound, "Couldn't find all #{name.pluralize} with IDs (#{ids.inspect})#{conditions}" - end - end - end - end - end -end - - -module ActiveRecord - ID_SEP = ',' - ID_SET_SEP = ';' - - class Base - # Allows +attr_name+ to be the list of primary_keys, and returns the id - # of the object - # e.g. @object[@object.class.primary_key] => [1,1] - def [](attr_name) - if attr_name.is_a?(String) and attr_name != attr_name.split(ID_SEP).first - attr_name = attr_name.split(ID_SEP) - end - attr_name.is_a?(Array) ? - attr_name.map {|name| read_attribute(name)} : - read_attribute(attr_name) - end - - # Updates the attribute identified by attr_name with the specified +value+. - # (Alias for the protected write_attribute method). - def []=(attr_name, value) - if attr_name.is_a?(String) and attr_name != attr_name.split(ID_SEP).first - attr_name = attr_name.split(ID_SEP) - end - - if attr_name.is_a? Array - value = value.split(ID_SEP) if value.is_a? String - unless value.length == attr_name.length - raise "Number of attr_names and values do not match" - end - #breakpoint - [attr_name, value].transpose.map {|name,val| write_attribute(name.to_s, val)} - else - write_attribute(attr_name, value) - end - end - end -end +module CompositePrimaryKeys + module ActiveRecord #:nodoc: + class CompositeKeyError < StandardError #:nodoc: + end + + module Base #:nodoc: + + INVALID_FOR_COMPOSITE_KEYS = 'Not appropriate for composite primary keys' + NOT_IMPLEMENTED_YET = 'Not implemented for composite primary keys yet' + + def self.append_features(base) + super + base.send(:include, InstanceMethods) + base.extend(ClassMethods) + end + + module ClassMethods + def set_primary_keys(*keys) + keys = keys.first if keys.first.is_a?(Array) + keys = keys.map { |k| k.to_sym } + cattr_accessor :primary_keys + self.primary_keys = keys.to_composite_keys + + class_eval <<-EOV + extend CompositeClassMethods + include CompositeInstanceMethods + + include CompositePrimaryKeys::ActiveRecord::Associations + include CompositePrimaryKeys::ActiveRecord::AssociationPreload + include CompositePrimaryKeys::ActiveRecord::Calculations + include CompositePrimaryKeys::ActiveRecord::AttributeMethods + EOV + end + + def composite? + false + end + end + + module InstanceMethods + def composite?; self.class.composite?; end + end + + module CompositeInstanceMethods + + # A model instance's primary keys is always available as model.ids + # whether you name it the default 'id' or set it to something else. + def id + attr_names = self.class.primary_keys + CompositeIds.new(attr_names.map { |attr_name| read_attribute(attr_name) }) + end + alias_method :ids, :id + + def to_param + id.to_s + end + + def id_before_type_cast #:nodoc: + raise CompositeKeyError, CompositePrimaryKeys::ActiveRecord::Base::NOT_IMPLEMENTED_YET + end + + def quoted_id #:nodoc: + [self.class.primary_keys, ids]. + transpose. + map {|attr_name,id| quote_value(id, column_for_attribute(attr_name))}. + to_composite_ids + end + + # Sets the primary ID. + def id=(ids) + ids = ids.split(ID_SEP) if ids.is_a?(String) + ids.flatten! + unless ids.is_a?(Array) and ids.length == self.class.primary_keys.length + raise "#{self.class}.id= requires #{self.class.primary_keys.length} ids" + end + [primary_keys, ids].transpose.each {|key, an_id| write_attribute(key , an_id)} + id + end + + # Returns a clone of the record that hasn't been assigned an id yet and + # is treated as a new record. Note that this is a "shallow" clone: + # it copies the object's attributes only, not its associations. + # The extent of a "deep" clone is application-specific and is therefore + # left to the application to implement according to its need. + def clone + attrs = self.attributes_before_type_cast + self.class.primary_keys.each {|key| attrs.delete(key.to_s)} + self.class.new do |record| + record.send :instance_variable_set, '@attributes', attrs + end + end + + + private + # The xx_without_callbacks methods are overwritten as that is the end of the alias chain + + # Creates a new record with values matching those of the instance attributes. + def create_without_callbacks + unless self.id + raise CompositeKeyError, "Composite keys do not generated ids from sequences, you must provide id values" + end + attributes_minus_pks = attributes_with_quotes(false) + quoted_pk_columns = self.class.primary_key.map { |col| connection.quote_column_name(col) } + cols = quoted_column_names(attributes_minus_pks) << quoted_pk_columns + vals = attributes_minus_pks.values << quoted_id + connection.insert( + "INSERT INTO #{self.class.quoted_table_name} " + + "(#{cols.join(', ')}) " + + "VALUES (#{vals.join(', ')})", + "#{self.class.name} Create", + self.class.primary_key, + self.id + ) + @new_record = false + return true + end + + # Updates the associated record with values matching those of the instance attributes. + def update_without_callbacks + where_clause_terms = [self.class.primary_key, quoted_id].transpose.map do |pair| + "(#{connection.quote_column_name(pair[0])} = #{pair[1]})" + end + where_clause = where_clause_terms.join(" AND ") + connection.update( + "UPDATE #{self.class.quoted_table_name} " + + "SET #{quoted_comma_pair_list(connection, attributes_with_quotes(false))} " + + "WHERE #{where_clause}", + "#{self.class.name} Update" + ) + return true + end + + # Deletes the record in the database and freezes this instance to reflect that no changes should + # be made (since they can't be persisted). + def destroy_without_callbacks + where_clause_terms = [self.class.primary_key, quoted_id].transpose.map do |pair| + "(#{connection.quote_column_name(pair[0])} = #{pair[1]})" + end + where_clause = where_clause_terms.join(" AND ") + unless new_record? + connection.delete( + "DELETE FROM #{self.class.quoted_table_name} " + + "WHERE #{where_clause}", + "#{self.class.name} Destroy" + ) + end + freeze + end + end + + module CompositeClassMethods + def primary_key; primary_keys; end + def primary_key=(keys); primary_keys = keys; end + + def composite? + true + end + + #ids_to_s([[1,2],[7,3]]) -> "(1,2),(7,3)" + #ids_to_s([[1,2],[7,3]], ',', ';') -> "1,2;7,3" + def ids_to_s(many_ids, id_sep = CompositePrimaryKeys::ID_SEP, list_sep = ',', left_bracket = '(', right_bracket = ')') + many_ids.map {|ids| "#{left_bracket}#{ids}#{right_bracket}"}.join(list_sep) + end + + # Creates WHERE condition from list of composited ids + # User.update_all({:role => 'admin'}, :conditions => composite_where_clause([[1, 2], [2, 2]])) #=> UPDATE admins SET admin.role='admin' WHERE (admin.type=1 AND admin.type2=2) OR (admin.type=2 AND admin.type2=2) + # User.find(:all, :conditions => composite_where_clause([[1, 2], [2, 2]])) #=> SELECT * FROM admins WHERE (admin.type=1 AND admin.type2=2) OR (admin.type=2 AND admin.type2=2) + def composite_where_clause(ids) + if ids.is_a?(String) + ids = [[ids]] + elsif not ids.first.is_a?(Array) # if single comp key passed, turn into an array of 1 + ids = [ids.to_composite_ids] + end + + ids.map do |id_set| + [primary_keys, id_set].transpose.map do |key, id| + "#{table_name}.#{key.to_s}=#{sanitize(id)}" + end.join(" AND ") + end.join(") OR (") + end + + # Returns true if the given +ids+ represents the primary keys of a record in the database, false otherwise. + # Example: + # Person.exists?(5,7) + def exists?(ids) + if ids.is_a?(Array) && ids.first.is_a?(String) + count(:conditions => ids) > 0 + else + obj = find(ids) rescue false + !obj.nil? and obj.is_a?(self) + end + end + + # Deletes the record with the given +ids+ without instantiating an object first, e.g. delete(1,2) + # If an array of ids is provided (e.g. delete([1,2], [3,4]), all of them + # are deleted. + def delete(*ids) + unless ids.is_a?(Array); raise "*ids must be an Array"; end + ids = [ids.to_composite_ids] if not ids.first.is_a?(Array) + where_clause = ids.map do |id_set| + [primary_keys, id_set].transpose.map do |key, id| + "#{quoted_table_name}.#{connection.quote_column_name(key.to_s)}=#{sanitize(id)}" + end.join(" AND ") + end.join(") OR (") + delete_all([ "(#{where_clause})" ]) + end + + # Destroys the record with the given +ids+ by instantiating the object and calling #destroy (all the callbacks are the triggered). + # If an array of ids is provided, all of them are destroyed. + def destroy(*ids) + unless ids.is_a?(Array); raise "*ids must be an Array"; end + if ids.first.is_a?(Array) + ids = ids.map{|compids| compids.to_composite_ids} + else + ids = ids.to_composite_ids + end + ids.first.is_a?(CompositeIds) ? ids.each { |id_set| find(id_set).destroy } : find(ids).destroy + end + + # Returns an array of column objects for the table associated with this class. + # Each column that matches to one of the primary keys has its + # primary attribute set to true + def columns + unless @columns + @columns = connection.columns(table_name, "#{name} Columns") + @columns.each {|column| column.primary = primary_keys.include?(column.name.to_sym)} + end + @columns + end + + ## DEACTIVATED METHODS ## + public + # Lazy-set the sequence name to the connection's default. This method + # is only ever called once since set_sequence_name overrides it. + def sequence_name #:nodoc: + raise CompositeKeyError, CompositePrimaryKeys::ActiveRecord::Base::INVALID_FOR_COMPOSITE_KEYS + end + + def reset_sequence_name #:nodoc: + raise CompositeKeyError, CompositePrimaryKeys::ActiveRecord::Base::INVALID_FOR_COMPOSITE_KEYS + end + + def set_primary_key(value = nil, &block) + raise CompositeKeyError, CompositePrimaryKeys::ActiveRecord::Base::INVALID_FOR_COMPOSITE_KEYS + end + + private + def find_one(id, options) + raise CompositeKeyError, CompositePrimaryKeys::ActiveRecord::Base::INVALID_FOR_COMPOSITE_KEYS + end + + def find_some(ids, options) + raise CompositeKeyError, CompositePrimaryKeys::ActiveRecord::Base::INVALID_FOR_COMPOSITE_KEYS + end + + def find_from_ids(ids, options) + ids = ids.first if ids.last == nil + conditions = " AND (#{sanitize_sql(options[:conditions])})" if options[:conditions] + # if ids is just a flat list, then its size must = primary_key.length (one id per primary key, in order) + # if ids is list of lists, then each inner list must follow rule above + if ids.first.is_a? String + # find '2,1' -> ids = ['2,1'] + # find '2,1;7,3' -> ids = ['2,1;7,3'] + ids = ids.first.split(ID_SET_SEP).map {|id_set| id_set.split(ID_SEP).to_composite_ids} + # find '2,1;7,3' -> ids = [['2','1'],['7','3']], inner [] are CompositeIds + end + ids = [ids.to_composite_ids] if not ids.first.kind_of?(Array) + ids.each do |id_set| + unless id_set.is_a?(Array) + raise "Ids must be in an Array, instead received: #{id_set.inspect}" + end + unless id_set.length == primary_keys.length + raise "#{id_set.inspect}: Incorrect number of primary keys for #{class_name}: #{primary_keys.inspect}" + end + end + + # Let keys = [:a, :b] + # If ids = [[10, 50], [11, 51]], then :conditions => + # "(#{quoted_table_name}.a, #{quoted_table_name}.b) IN ((10, 50), (11, 51))" + + conditions = ids.map do |id_set| + [primary_keys, id_set].transpose.map do |key, id| + col = columns_hash[key.to_s] + val = quote_value(id, col) + "#{quoted_table_name}.#{connection.quote_column_name(key.to_s)}=#{val}" + end.join(" AND ") + end.join(") OR (") + + options.update :conditions => "(#{conditions})" + + result = find_every(options) + + if result.size == ids.size + ids.size == 1 ? result[0] : result + else + raise ::ActiveRecord::RecordNotFound, "Couldn't find all #{name.pluralize} with IDs (#{ids.inspect})#{conditions}" + end + end + end + end + end +end + + +module ActiveRecord + ID_SEP = ',' + ID_SET_SEP = ';' + + class Base + # Allows +attr_name+ to be the list of primary_keys, and returns the id + # of the object + # e.g. @object[@object.class.primary_key] => [1,1] + def [](attr_name) + if attr_name.is_a?(String) and attr_name != attr_name.split(ID_SEP).first + attr_name = attr_name.split(ID_SEP) + end + attr_name.is_a?(Array) ? + attr_name.map {|name| read_attribute(name)} : + read_attribute(attr_name) + end + + # Updates the attribute identified by attr_name with the specified +value+. + # (Alias for the protected write_attribute method). + def []=(attr_name, value) + if attr_name.is_a?(String) and attr_name != attr_name.split(ID_SEP).first + attr_name = attr_name.split(ID_SEP) + end + + if attr_name.is_a? Array + value = value.split(ID_SEP) if value.is_a? String + unless value.length == attr_name.length + raise "Number of attr_names and values do not match" + end + #breakpoint + [attr_name, value].transpose.map {|name,val| write_attribute(name.to_s, val)} + else + write_attribute(attr_name, value) + end + end + end +end diff --git a/vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/composite_arrays.rb b/vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/composite_arrays.rb index 030c416f3..dab39142b 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/composite_arrays.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/composite_arrays.rb @@ -1,30 +1,30 @@ -module CompositePrimaryKeys - ID_SEP = ',' - ID_SET_SEP = ';' - - module ArrayExtension - def to_composite_keys - CompositeKeys.new(self) - end - - def to_composite_ids - CompositeIds.new(self) - end - end - - class CompositeArray < Array - def to_s - join(ID_SEP) - end - end - - class CompositeKeys < CompositeArray - - end - - class CompositeIds < CompositeArray - - end -end - -Array.send(:include, CompositePrimaryKeys::ArrayExtension) +module CompositePrimaryKeys + ID_SEP = ',' + ID_SET_SEP = ';' + + module ArrayExtension + def to_composite_keys + CompositeKeys.new(self) + end + + def to_composite_ids + CompositeIds.new(self) + end + end + + class CompositeArray < Array + def to_s + join(ID_SEP) + end + end + + class CompositeKeys < CompositeArray + + end + + class CompositeIds < CompositeArray + + end +end + +Array.send(:include, CompositePrimaryKeys::ArrayExtension) diff --git a/vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/reflection.rb b/vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/reflection.rb index 309baf118..2d82d9c8a 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/reflection.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/reflection.rb @@ -1,19 +1,19 @@ -module ActiveRecord - module Reflection - class AssociationReflection - def primary_key_name - return @primary_key_name if @primary_key_name - case - when macro == :belongs_to - @primary_key_name = options[:foreign_key] || class_name.foreign_key - when options[:as] - @primary_key_name = options[:foreign_key] || "#{options[:as]}_id" - else - @primary_key_name = options[:foreign_key] || active_record.name.foreign_key - end - @primary_key_name = @primary_key_name.to_composite_keys.to_s if @primary_key_name.is_a? Array - @primary_key_name - end - end - end +module ActiveRecord + module Reflection + class AssociationReflection + def primary_key_name + return @primary_key_name if @primary_key_name + case + when macro == :belongs_to + @primary_key_name = options[:foreign_key] || class_name.foreign_key + when options[:as] + @primary_key_name = options[:foreign_key] || "#{options[:as]}_id" + else + @primary_key_name = options[:foreign_key] || active_record.name.foreign_key + end + @primary_key_name = @primary_key_name.to_composite_keys.to_s if @primary_key_name.is_a? Array + @primary_key_name + end + end + end end \ No newline at end of file diff --git a/vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/version.rb b/vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/version.rb index 0b83ba692..49a11be2a 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/version.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/version.rb @@ -1,8 +1,8 @@ -module CompositePrimaryKeys - module VERSION #:nodoc: - MAJOR = 2 - MINOR = 2 - TINY = 2 - STRING = [MAJOR, MINOR, TINY].join('.') - end -end +module CompositePrimaryKeys + module VERSION #:nodoc: + MAJOR = 2 + MINOR = 2 + TINY = 2 + STRING = [MAJOR, MINOR, TINY].join('.') + end +end diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/article.rb b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/article.rb index 7233f8126..7fae392bd 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/article.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/article.rb @@ -1,5 +1,5 @@ -class Article < ActiveRecord::Base - has_many :readings - has_many :users, :through => :readings -end - +class Article < ActiveRecord::Base + has_many :readings + has_many :users, :through => :readings +end + diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/articles.yml b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/articles.yml index e51060463..f4cb4778a 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/articles.yml +++ b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/articles.yml @@ -1,6 +1,6 @@ -first: - id: 1 - name: Article One -second: - id: 2 +first: + id: 1 + name: Article One +second: + id: 2 name: Article Two \ No newline at end of file diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/product.rb b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/product.rb index 5466dcabe..e780fd2f4 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/product.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/product.rb @@ -1,7 +1,7 @@ -class Product < ActiveRecord::Base - set_primary_keys :id # redundant - has_many :product_tariffs, :foreign_key => :product_id - has_one :product_tariff, :foreign_key => :product_id - - has_many :tariffs, :through => :product_tariffs, :foreign_key => [:tariff_id, :tariff_start_date] -end +class Product < ActiveRecord::Base + set_primary_keys :id # redundant + has_many :product_tariffs, :foreign_key => :product_id + has_one :product_tariff, :foreign_key => :product_id + + has_many :tariffs, :through => :product_tariffs, :foreign_key => [:tariff_id, :tariff_start_date] +end diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/product_tariff.rb b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/product_tariff.rb index cbabee7c5..d5c9befbb 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/product_tariff.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/product_tariff.rb @@ -1,5 +1,5 @@ -class ProductTariff < ActiveRecord::Base - set_primary_keys :product_id, :tariff_id, :tariff_start_date - belongs_to :product, :foreign_key => :product_id - belongs_to :tariff, :foreign_key => [:tariff_id, :tariff_start_date] -end +class ProductTariff < ActiveRecord::Base + set_primary_keys :product_id, :tariff_id, :tariff_start_date + belongs_to :product, :foreign_key => :product_id + belongs_to :tariff, :foreign_key => [:tariff_id, :tariff_start_date] +end diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/product_tariffs.yml b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/product_tariffs.yml index 27a464fb3..72be1e7ad 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/product_tariffs.yml +++ b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/product_tariffs.yml @@ -1,12 +1,12 @@ -first_flat: - product_id: 1 - tariff_id: 1 - tariff_start_date: <%= Date.today.to_s(:db) %> -first_free: - product_id: 1 - tariff_id: 2 - tariff_start_date: <%= Date.today.to_s(:db) %> -second_free: - product_id: 2 - tariff_id: 2 - tariff_start_date: <%= Date.today.to_s(:db) %> +first_flat: + product_id: 1 + tariff_id: 1 + tariff_start_date: <%= Date.today.to_s(:db) %> +first_free: + product_id: 1 + tariff_id: 2 + tariff_start_date: <%= Date.today.to_s(:db) %> +second_free: + product_id: 2 + tariff_id: 2 + tariff_start_date: <%= Date.today.to_s(:db) %> diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/products.yml b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/products.yml index 3c38a5ba0..c436c296b 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/products.yml +++ b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/products.yml @@ -1,6 +1,6 @@ -first_product: - id: 1 - name: Product One -second_product: - id: 2 +first_product: + id: 1 + name: Product One +second_product: + id: 2 name: Product Two \ No newline at end of file diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reading.rb b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reading.rb index 2e8197062..014d8b810 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reading.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reading.rb @@ -1,4 +1,4 @@ -class Reading < ActiveRecord::Base - belongs_to :article - belongs_to :user -end +class Reading < ActiveRecord::Base + belongs_to :article + belongs_to :user +end diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/readings.yml b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/readings.yml index e3afaa9cd..36e9ac300 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/readings.yml +++ b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/readings.yml @@ -1,10 +1,10 @@ -santiago_first: - id: 1 - user_id: 1 - article_id: 1 - rating: 4 -santiago_second: - id: 2 - user_id: 1 - article_id: 2 +santiago_first: + id: 1 + user_id: 1 + article_id: 1 + rating: 4 +santiago_second: + id: 2 + user_id: 1 + article_id: 2 rating: 5 \ No newline at end of file diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reference_code.rb b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reference_code.rb index 594d8d8be..e20fb0644 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reference_code.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reference_code.rb @@ -1,7 +1,7 @@ -class ReferenceCode < ActiveRecord::Base - set_primary_keys :reference_type_id, :reference_code - - belongs_to :reference_type, :foreign_key => "reference_type_id" - - validates_presence_of :reference_code, :code_label, :abbreviation -end +class ReferenceCode < ActiveRecord::Base + set_primary_keys :reference_type_id, :reference_code + + belongs_to :reference_type, :foreign_key => "reference_type_id" + + validates_presence_of :reference_code, :code_label, :abbreviation +end diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reference_codes.yml b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reference_codes.yml index 397938199..f4d88bc86 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reference_codes.yml +++ b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reference_codes.yml @@ -1,28 +1,28 @@ -name_prefix_mr: - reference_type_id: 1 - reference_code: 1 - code_label: MR - abbreviation: Mr -name_prefix_mrs: - reference_type_id: 1 - reference_code: 2 - code_label: MRS - abbreviation: Mrs -name_prefix_ms: - reference_type_id: 1 - reference_code: 3 - code_label: MS - abbreviation: Ms - -gender_male: - reference_type_id: 2 - reference_code: 1 - code_label: MALE - abbreviation: Male -gender_female: - reference_type_id: 2 - reference_code: 2 - code_label: FEMALE - abbreviation: Female - +name_prefix_mr: + reference_type_id: 1 + reference_code: 1 + code_label: MR + abbreviation: Mr +name_prefix_mrs: + reference_type_id: 1 + reference_code: 2 + code_label: MRS + abbreviation: Mrs +name_prefix_ms: + reference_type_id: 1 + reference_code: 3 + code_label: MS + abbreviation: Ms + +gender_male: + reference_type_id: 2 + reference_code: 1 + code_label: MALE + abbreviation: Male +gender_female: + reference_type_id: 2 + reference_code: 2 + code_label: FEMALE + abbreviation: Female + \ No newline at end of file diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reference_type.rb b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reference_type.rb index 5b2b12b4e..c09bd2f20 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reference_type.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reference_type.rb @@ -1,7 +1,7 @@ -class ReferenceType < ActiveRecord::Base - set_primary_key :reference_type_id - has_many :reference_codes, :foreign_key => "reference_type_id" - - validates_presence_of :type_label, :abbreviation - validates_uniqueness_of :type_label -end +class ReferenceType < ActiveRecord::Base + set_primary_key :reference_type_id + has_many :reference_codes, :foreign_key => "reference_type_id" + + validates_presence_of :type_label, :abbreviation + validates_uniqueness_of :type_label +end diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reference_types.yml b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reference_types.yml index 0520ba9f9..9c5e3d347 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reference_types.yml +++ b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reference_types.yml @@ -1,9 +1,9 @@ -name_prefix: - reference_type_id: 1 - type_label: NAME_PREFIX - abbreviation: Name Prefix - -gender: - reference_type_id: 2 - type_label: GENDER - abbreviation: Gender +name_prefix: + reference_type_id: 1 + type_label: NAME_PREFIX + abbreviation: Name Prefix + +gender: + reference_type_id: 2 + type_label: GENDER + abbreviation: Gender diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/suburb.rb b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/suburb.rb index 93045350e..f2eb181c3 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/suburb.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/suburb.rb @@ -1,6 +1,6 @@ -class Suburb < ActiveRecord::Base - set_primary_keys :city_id, :suburb_id - has_many :streets, :foreign_key => [:city_id, :suburb_id] - has_many :first_streets, :foreign_key => [:city_id, :suburb_id], - :class_name => 'Street', :conditions => "streets.name = 'First Street'" +class Suburb < ActiveRecord::Base + set_primary_keys :city_id, :suburb_id + has_many :streets, :foreign_key => [:city_id, :suburb_id] + has_many :first_streets, :foreign_key => [:city_id, :suburb_id], + :class_name => 'Street', :conditions => "streets.name = 'First Street'" end \ No newline at end of file diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/suburbs.yml b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/suburbs.yml index efae0c0a2..d230fbae4 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/suburbs.yml +++ b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/suburbs.yml @@ -1,9 +1,9 @@ -first: - city_id: 1 - suburb_id: 1 - name: First Suburb -second: - city_id: 2 - suburb_id: 1 - name: Second Suburb +first: + city_id: 1 + suburb_id: 1 + name: First Suburb +second: + city_id: 2 + suburb_id: 1 + name: Second Suburb \ No newline at end of file diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/tariff.rb b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/tariff.rb index d5cb07da1..3feba4434 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/tariff.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/tariff.rb @@ -1,6 +1,6 @@ -class Tariff < ActiveRecord::Base - set_primary_keys [:tariff_id, :start_date] - has_many :product_tariffs, :foreign_key => [:tariff_id, :tariff_start_date] - has_one :product_tariff, :foreign_key => [:tariff_id, :tariff_start_date] - has_many :products, :through => :product_tariffs, :foreign_key => [:tariff_id, :tariff_start_date] -end +class Tariff < ActiveRecord::Base + set_primary_keys [:tariff_id, :start_date] + has_many :product_tariffs, :foreign_key => [:tariff_id, :tariff_start_date] + has_one :product_tariff, :foreign_key => [:tariff_id, :tariff_start_date] + has_many :products, :through => :product_tariffs, :foreign_key => [:tariff_id, :tariff_start_date] +end diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/tariffs.yml b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/tariffs.yml index 7346fc510..997ebb8f1 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/tariffs.yml +++ b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/tariffs.yml @@ -1,13 +1,13 @@ -flat: - tariff_id: 1 - start_date: <%= Date.today.to_s(:db) %> - amount: 50 -free: - tariff_id: 2 - start_date: <%= Date.today.to_s(:db) %> - amount: 0 -flat_future: - tariff_id: 1 - start_date: <%= Date.today.next.to_s(:db) %> - amount: 100 +flat: + tariff_id: 1 + start_date: <%= Date.today.to_s(:db) %> + amount: 50 +free: + tariff_id: 2 + start_date: <%= Date.today.to_s(:db) %> + amount: 0 +flat_future: + tariff_id: 1 + start_date: <%= Date.today.next.to_s(:db) %> + amount: 100 \ No newline at end of file diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/user.rb b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/user.rb index a8487c49f..674481835 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/user.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/user.rb @@ -1,10 +1,10 @@ -class User < ActiveRecord::Base - has_many :readings - has_many :articles, :through => :readings - has_many :comments, :as => :person - has_many :hacks, :through => :comments, :source => :hack - - def find_custom_articles - articles.find(:all, :conditions => ["name = ?", "Article One"]) - end -end +class User < ActiveRecord::Base + has_many :readings + has_many :articles, :through => :readings + has_many :comments, :as => :person + has_many :hacks, :through => :comments, :source => :hack + + def find_custom_articles + articles.find(:all, :conditions => ["name = ?", "Article One"]) + end +end diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/users.yml b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/users.yml index d33a38a4a..858c47cab 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/users.yml +++ b/vendor/gems/composite_primary_keys-2.2.2/test/fixtures/users.yml @@ -1,6 +1,6 @@ -santiago: - id: 1 - name: Santiago -drnic: - id: 2 +santiago: + id: 1 + name: Santiago +drnic: + id: 2 name: Dr Nic \ No newline at end of file diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/hash_tricks.rb b/vendor/gems/composite_primary_keys-2.2.2/test/hash_tricks.rb index b37bbbbf1..856fc5fea 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/hash_tricks.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/test/hash_tricks.rb @@ -1,34 +1,34 @@ -# From: -# http://www.bigbold.com/snippets/posts/show/2178 -# http://blog.caboo.se/articles/2006/06/11/stupid-hash-tricks -# -# An example utilisation of these methods in a controller is: -# def some_action -# # some script kiddie also passed in :bee, which we don't want tampered with _here_. -# @model = Model.create(params.pass(:foo, :bar)) -# end -class Hash - - # lets through the keys in the argument - # >> {:one => 1, :two => 2, :three => 3}.pass(:one) - # => {:one=>1} - def pass(*keys) - keys = keys.first if keys.first.is_a?(Array) - tmp = self.clone - tmp.delete_if {|k,v| ! keys.include?(k.to_sym) } - tmp.delete_if {|k,v| ! keys.include?(k.to_s) } - tmp - end - - # blocks the keys in the arguments - # >> {:one => 1, :two => 2, :three => 3}.block(:one) - # => {:two=>2, :three=>3} - def block(*keys) - keys = keys.first if keys.first.is_a?(Array) - tmp = self.clone - tmp.delete_if {|k,v| keys.include?(k.to_sym) } - tmp.delete_if {|k,v| keys.include?(k.to_s) } - tmp - end - -end +# From: +# http://www.bigbold.com/snippets/posts/show/2178 +# http://blog.caboo.se/articles/2006/06/11/stupid-hash-tricks +# +# An example utilisation of these methods in a controller is: +# def some_action +# # some script kiddie also passed in :bee, which we don't want tampered with _here_. +# @model = Model.create(params.pass(:foo, :bar)) +# end +class Hash + + # lets through the keys in the argument + # >> {:one => 1, :two => 2, :three => 3}.pass(:one) + # => {:one=>1} + def pass(*keys) + keys = keys.first if keys.first.is_a?(Array) + tmp = self.clone + tmp.delete_if {|k,v| ! keys.include?(k.to_sym) } + tmp.delete_if {|k,v| ! keys.include?(k.to_s) } + tmp + end + + # blocks the keys in the arguments + # >> {:one => 1, :two => 2, :three => 3}.block(:one) + # => {:two=>2, :three=>3} + def block(*keys) + keys = keys.first if keys.first.is_a?(Array) + tmp = self.clone + tmp.delete_if {|k,v| keys.include?(k.to_sym) } + tmp.delete_if {|k,v| keys.include?(k.to_s) } + tmp + end + +end diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/test_associations.rb b/vendor/gems/composite_primary_keys-2.2.2/test/test_associations.rb index 78302f86c..4c69ce57b 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/test_associations.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/test/test_associations.rb @@ -1,160 +1,160 @@ -require 'abstract_unit' -require 'fixtures/article' -require 'fixtures/product' -require 'fixtures/tariff' -require 'fixtures/product_tariff' -require 'fixtures/suburb' -require 'fixtures/street' -require 'fixtures/restaurant' -require 'fixtures/dorm' -require 'fixtures/room' -require 'fixtures/room_attribute' -require 'fixtures/room_attribute_assignment' -require 'fixtures/student' -require 'fixtures/room_assignment' -require 'fixtures/user' -require 'fixtures/reading' - -class TestAssociations < Test::Unit::TestCase - fixtures :articles, :products, :tariffs, :product_tariffs, :suburbs, :streets, :restaurants, :restaurants_suburbs, - :dorms, :rooms, :room_attributes, :room_attribute_assignments, :students, :room_assignments, :users, :readings - - def test_has_many_through_with_conditions_when_through_association_is_not_composite - user = User.find(:first) - assert_equal 1, user.articles.find(:all, :conditions => ["articles.name = ?", "Article One"]).size - end - - def test_has_many_through_with_conditions_when_through_association_is_composite - room = Room.find(:first) - assert_equal 0, room.room_attributes.find(:all, :conditions => ["room_attributes.name != ?", "keg"]).size - end - - def test_has_many_through_on_custom_finder_when_through_association_is_composite_finder_when_through_association_is_not_composite - user = User.find(:first) - assert_equal 1, user.find_custom_articles.size - end - - def test_has_many_through_on_custom_finder_when_through_association_is_composite - room = Room.find(:first) - assert_equal 0, room.find_custom_room_attributes.size - end - - def test_count - assert_equal 2, Product.count(:include => :product_tariffs) - assert_equal 3, Tariff.count(:include => :product_tariffs) - assert_equal 2, Tariff.count(:group => :start_date).size - end - - def test_products - assert_not_nil products(:first_product).product_tariffs - assert_equal 2, products(:first_product).product_tariffs.length - assert_not_nil products(:first_product).tariffs - assert_equal 2, products(:first_product).tariffs.length - assert_not_nil products(:first_product).product_tariff - end - - def test_product_tariffs - assert_not_nil product_tariffs(:first_flat).product - assert_not_nil product_tariffs(:first_flat).tariff - assert_equal Product, product_tariffs(:first_flat).product.class - assert_equal Tariff, product_tariffs(:first_flat).tariff.class - end - - def test_tariffs - assert_not_nil tariffs(:flat).product_tariffs - assert_equal 1, tariffs(:flat).product_tariffs.length - assert_not_nil tariffs(:flat).products - assert_equal 1, tariffs(:flat).products.length - assert_not_nil tariffs(:flat).product_tariff - end - - # Its not generating the instances of associated classes from the rows - def test_find_includes_products - assert @products = Product.find(:all, :include => :product_tariffs) - assert_equal 2, @products.length - assert_not_nil @products.first.instance_variable_get('@product_tariffs'), '@product_tariffs not set; should be array' - assert_equal 3, @products.inject(0) {|sum, tariff| sum + tariff.instance_variable_get('@product_tariffs').length}, - "Incorrect number of product_tariffs returned" - end - - def test_find_includes_tariffs - assert @tariffs = Tariff.find(:all, :include => :product_tariffs) - assert_equal 3, @tariffs.length - assert_not_nil @tariffs.first.instance_variable_get('@product_tariffs'), '@product_tariffs not set; should be array' - assert_equal 3, @tariffs.inject(0) {|sum, tariff| sum + tariff.instance_variable_get('@product_tariffs').length}, - "Incorrect number of product_tariffs returnedturned" - end - - def test_find_includes_product - assert @product_tariffs = ProductTariff.find(:all, :include => :product) - assert_equal 3, @product_tariffs.length - assert_not_nil @product_tariffs.first.instance_variable_get('@product'), '@product not set' - end - - def test_find_includes_comp_belongs_to_tariff - assert @product_tariffs = ProductTariff.find(:all, :include => :tariff) - assert_equal 3, @product_tariffs.length - assert_not_nil @product_tariffs.first.instance_variable_get('@tariff'), '@tariff not set' - end - - def test_find_includes_extended - assert @products = Product.find(:all, :include => {:product_tariffs => :tariff}) - assert_equal 3, @products.inject(0) {|sum, product| sum + product.instance_variable_get('@product_tariffs').length}, - "Incorrect number of product_tariffs returned" - - assert @tariffs = Tariff.find(:all, :include => {:product_tariffs => :product}) - assert_equal 3, @tariffs.inject(0) {|sum, tariff| sum + tariff.instance_variable_get('@product_tariffs').length}, - "Incorrect number of product_tariffs returned" - end - - def test_join_where_clause - @product = Product.find(:first, :include => :product_tariffs) - where_clause = @product.product_tariffs.composite_where_clause( - ['foo','bar'], [1,2] - ) - assert_equal('(foo=1 AND bar=2)', where_clause) - end - - def test_has_many_through - @products = Product.find(:all, :include => :tariffs) - assert_equal 3, @products.inject(0) {|sum, product| sum + product.instance_variable_get('@tariffs').length}, - "Incorrect number of tariffs returned" - end - - def test_has_many_through_when_not_pre_loaded - student = Student.find(:first) - rooms = student.rooms - assert_equal 1, rooms.size - assert_equal 1, rooms.first.dorm_id - assert_equal 1, rooms.first.room_id - end - - def test_has_many_through_when_through_association_is_composite - dorm = Dorm.find(:first) - assert_equal 1, dorm.rooms.length - assert_equal 1, dorm.rooms.first.room_attributes.length - assert_equal 'keg', dorm.rooms.first.room_attributes.first.name - end - - def test_associations_with_conditions - @suburb = Suburb.find([2, 1]) - assert_equal 2, @suburb.streets.size - - @suburb = Suburb.find([2, 1]) - assert_equal 1, @suburb.first_streets.size - - @suburb = Suburb.find([2, 1], :include => :streets) - assert_equal 2, @suburb.streets.size - - @suburb = Suburb.find([2, 1], :include => :first_streets) - assert_equal 1, @suburb.first_streets.size - end - - def test_has_and_belongs_to_many - @restaurant = Restaurant.find([1,1]) - assert_equal 2, @restaurant.suburbs.size - - @restaurant = Restaurant.find([1,1], :include => :suburbs) - assert_equal 2, @restaurant.suburbs.size - end -end +require 'abstract_unit' +require 'fixtures/article' +require 'fixtures/product' +require 'fixtures/tariff' +require 'fixtures/product_tariff' +require 'fixtures/suburb' +require 'fixtures/street' +require 'fixtures/restaurant' +require 'fixtures/dorm' +require 'fixtures/room' +require 'fixtures/room_attribute' +require 'fixtures/room_attribute_assignment' +require 'fixtures/student' +require 'fixtures/room_assignment' +require 'fixtures/user' +require 'fixtures/reading' + +class TestAssociations < Test::Unit::TestCase + fixtures :articles, :products, :tariffs, :product_tariffs, :suburbs, :streets, :restaurants, :restaurants_suburbs, + :dorms, :rooms, :room_attributes, :room_attribute_assignments, :students, :room_assignments, :users, :readings + + def test_has_many_through_with_conditions_when_through_association_is_not_composite + user = User.find(:first) + assert_equal 1, user.articles.find(:all, :conditions => ["articles.name = ?", "Article One"]).size + end + + def test_has_many_through_with_conditions_when_through_association_is_composite + room = Room.find(:first) + assert_equal 0, room.room_attributes.find(:all, :conditions => ["room_attributes.name != ?", "keg"]).size + end + + def test_has_many_through_on_custom_finder_when_through_association_is_composite_finder_when_through_association_is_not_composite + user = User.find(:first) + assert_equal 1, user.find_custom_articles.size + end + + def test_has_many_through_on_custom_finder_when_through_association_is_composite + room = Room.find(:first) + assert_equal 0, room.find_custom_room_attributes.size + end + + def test_count + assert_equal 2, Product.count(:include => :product_tariffs) + assert_equal 3, Tariff.count(:include => :product_tariffs) + assert_equal 2, Tariff.count(:group => :start_date).size + end + + def test_products + assert_not_nil products(:first_product).product_tariffs + assert_equal 2, products(:first_product).product_tariffs.length + assert_not_nil products(:first_product).tariffs + assert_equal 2, products(:first_product).tariffs.length + assert_not_nil products(:first_product).product_tariff + end + + def test_product_tariffs + assert_not_nil product_tariffs(:first_flat).product + assert_not_nil product_tariffs(:first_flat).tariff + assert_equal Product, product_tariffs(:first_flat).product.class + assert_equal Tariff, product_tariffs(:first_flat).tariff.class + end + + def test_tariffs + assert_not_nil tariffs(:flat).product_tariffs + assert_equal 1, tariffs(:flat).product_tariffs.length + assert_not_nil tariffs(:flat).products + assert_equal 1, tariffs(:flat).products.length + assert_not_nil tariffs(:flat).product_tariff + end + + # Its not generating the instances of associated classes from the rows + def test_find_includes_products + assert @products = Product.find(:all, :include => :product_tariffs) + assert_equal 2, @products.length + assert_not_nil @products.first.instance_variable_get('@product_tariffs'), '@product_tariffs not set; should be array' + assert_equal 3, @products.inject(0) {|sum, tariff| sum + tariff.instance_variable_get('@product_tariffs').length}, + "Incorrect number of product_tariffs returned" + end + + def test_find_includes_tariffs + assert @tariffs = Tariff.find(:all, :include => :product_tariffs) + assert_equal 3, @tariffs.length + assert_not_nil @tariffs.first.instance_variable_get('@product_tariffs'), '@product_tariffs not set; should be array' + assert_equal 3, @tariffs.inject(0) {|sum, tariff| sum + tariff.instance_variable_get('@product_tariffs').length}, + "Incorrect number of product_tariffs returnedturned" + end + + def test_find_includes_product + assert @product_tariffs = ProductTariff.find(:all, :include => :product) + assert_equal 3, @product_tariffs.length + assert_not_nil @product_tariffs.first.instance_variable_get('@product'), '@product not set' + end + + def test_find_includes_comp_belongs_to_tariff + assert @product_tariffs = ProductTariff.find(:all, :include => :tariff) + assert_equal 3, @product_tariffs.length + assert_not_nil @product_tariffs.first.instance_variable_get('@tariff'), '@tariff not set' + end + + def test_find_includes_extended + assert @products = Product.find(:all, :include => {:product_tariffs => :tariff}) + assert_equal 3, @products.inject(0) {|sum, product| sum + product.instance_variable_get('@product_tariffs').length}, + "Incorrect number of product_tariffs returned" + + assert @tariffs = Tariff.find(:all, :include => {:product_tariffs => :product}) + assert_equal 3, @tariffs.inject(0) {|sum, tariff| sum + tariff.instance_variable_get('@product_tariffs').length}, + "Incorrect number of product_tariffs returned" + end + + def test_join_where_clause + @product = Product.find(:first, :include => :product_tariffs) + where_clause = @product.product_tariffs.composite_where_clause( + ['foo','bar'], [1,2] + ) + assert_equal('(foo=1 AND bar=2)', where_clause) + end + + def test_has_many_through + @products = Product.find(:all, :include => :tariffs) + assert_equal 3, @products.inject(0) {|sum, product| sum + product.instance_variable_get('@tariffs').length}, + "Incorrect number of tariffs returned" + end + + def test_has_many_through_when_not_pre_loaded + student = Student.find(:first) + rooms = student.rooms + assert_equal 1, rooms.size + assert_equal 1, rooms.first.dorm_id + assert_equal 1, rooms.first.room_id + end + + def test_has_many_through_when_through_association_is_composite + dorm = Dorm.find(:first) + assert_equal 1, dorm.rooms.length + assert_equal 1, dorm.rooms.first.room_attributes.length + assert_equal 'keg', dorm.rooms.first.room_attributes.first.name + end + + def test_associations_with_conditions + @suburb = Suburb.find([2, 1]) + assert_equal 2, @suburb.streets.size + + @suburb = Suburb.find([2, 1]) + assert_equal 1, @suburb.first_streets.size + + @suburb = Suburb.find([2, 1], :include => :streets) + assert_equal 2, @suburb.streets.size + + @suburb = Suburb.find([2, 1], :include => :first_streets) + assert_equal 1, @suburb.first_streets.size + end + + def test_has_and_belongs_to_many + @restaurant = Restaurant.find([1,1]) + assert_equal 2, @restaurant.suburbs.size + + @restaurant = Restaurant.find([1,1], :include => :suburbs) + assert_equal 2, @restaurant.suburbs.size + end +end diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/test_clone.rb b/vendor/gems/composite_primary_keys-2.2.2/test/test_clone.rb index 822974430..26e7970d5 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/test_clone.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/test/test_clone.rb @@ -1,34 +1,34 @@ -require 'abstract_unit' -require 'fixtures/reference_type' -require 'fixtures/reference_code' - -class TestClone < Test::Unit::TestCase - fixtures :reference_types, :reference_codes - - CLASSES = { - :single => { - :class => ReferenceType, - :primary_keys => :reference_type_id, - }, - :dual => { - :class => ReferenceCode, - :primary_keys => [:reference_type_id, :reference_code], - }, - } - - def setup - self.class.classes = CLASSES - end - - def test_truth - testing_with do - clone = @first.clone - assert_equal @first.attributes.block(@klass.primary_key), clone.attributes - if composite? - @klass.primary_key.each {|key| assert_nil clone[key], "Primary key '#{key}' should be nil"} - else - assert_nil clone[@klass.primary_key], "Sole primary key should be nil" - end - end - end +require 'abstract_unit' +require 'fixtures/reference_type' +require 'fixtures/reference_code' + +class TestClone < Test::Unit::TestCase + fixtures :reference_types, :reference_codes + + CLASSES = { + :single => { + :class => ReferenceType, + :primary_keys => :reference_type_id, + }, + :dual => { + :class => ReferenceCode, + :primary_keys => [:reference_type_id, :reference_code], + }, + } + + def setup + self.class.classes = CLASSES + end + + def test_truth + testing_with do + clone = @first.clone + assert_equal @first.attributes.block(@klass.primary_key), clone.attributes + if composite? + @klass.primary_key.each {|key| assert_nil clone[key], "Primary key '#{key}' should be nil"} + else + assert_nil clone[@klass.primary_key], "Sole primary key should be nil" + end + end + end end \ No newline at end of file diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/test_delete.rb b/vendor/gems/composite_primary_keys-2.2.2/test/test_delete.rb index cd79bbd72..2bd0d2abe 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/test_delete.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/test/test_delete.rb @@ -1,96 +1,96 @@ -require 'abstract_unit' -require 'fixtures/reference_type' -require 'fixtures/reference_code' -require 'fixtures/department' -require 'fixtures/employee' - -class TestDelete < Test::Unit::TestCase - fixtures :reference_types, :reference_codes, :departments, :employees - - CLASSES = { - :single => { - :class => ReferenceType, - :primary_keys => :reference_type_id, - }, - :dual => { - :class => ReferenceCode, - :primary_keys => [:reference_type_id, :reference_code], - }, - } - - def setup - self.class.classes = CLASSES - end - - def test_destroy_one - testing_with do - #assert @first.destroy - assert true - end - end - - def test_destroy_one_via_class - testing_with do - assert @klass.destroy(*@first.id) - end - end - - def test_destroy_one_alone_via_class - testing_with do - assert @klass.destroy(@first.id) - end - end - - def test_delete_one - testing_with do - assert @klass.delete(*@first.id) if composite? - end - end - - def test_delete_one_alone - testing_with do - assert @klass.delete(@first.id) - end - end - - def test_delete_many - testing_with do - to_delete = @klass.find(:all)[0..1] - assert_equal 2, to_delete.length - end - end - - def test_delete_all - testing_with do - @klass.delete_all - end - end - - def test_clear_association - department = Department.find(1,1) - assert_equal 2, department.employees.size, "Before clear employee count should be 2." - department.employees.clear - assert_equal 0, department.employees.size, "After clear employee count should be 0." - department.reload - assert_equal 0, department.employees.size, "After clear and a reload from DB employee count should be 0." - end - - def test_delete_association - department = Department.find(1,1) - assert_equal 2, department.employees.size , "Before delete employee count should be 2." - first_employee = department.employees[0] - department.employees.delete(first_employee) - assert_equal 1, department.employees.size, "After delete employee count should be 1." - department.reload - assert_equal 1, department.employees.size, "After delete and a reload from DB employee count should be 1." - end - - def test_delete_records_for_has_many_association_with_composite_primary_key - reference_type = ReferenceType.find(1) - codes_to_delete = reference_type.reference_codes[0..1] - assert_equal 3, reference_type.reference_codes.size, "Before deleting records reference_code count should be 3." - reference_type.reference_codes.delete_records(codes_to_delete) - reference_type.reload - assert_equal 1, reference_type.reference_codes.size, "After deleting 2 records and a reload from DB reference_code count should be 1." - end -end +require 'abstract_unit' +require 'fixtures/reference_type' +require 'fixtures/reference_code' +require 'fixtures/department' +require 'fixtures/employee' + +class TestDelete < Test::Unit::TestCase + fixtures :reference_types, :reference_codes, :departments, :employees + + CLASSES = { + :single => { + :class => ReferenceType, + :primary_keys => :reference_type_id, + }, + :dual => { + :class => ReferenceCode, + :primary_keys => [:reference_type_id, :reference_code], + }, + } + + def setup + self.class.classes = CLASSES + end + + def test_destroy_one + testing_with do + #assert @first.destroy + assert true + end + end + + def test_destroy_one_via_class + testing_with do + assert @klass.destroy(*@first.id) + end + end + + def test_destroy_one_alone_via_class + testing_with do + assert @klass.destroy(@first.id) + end + end + + def test_delete_one + testing_with do + assert @klass.delete(*@first.id) if composite? + end + end + + def test_delete_one_alone + testing_with do + assert @klass.delete(@first.id) + end + end + + def test_delete_many + testing_with do + to_delete = @klass.find(:all)[0..1] + assert_equal 2, to_delete.length + end + end + + def test_delete_all + testing_with do + @klass.delete_all + end + end + + def test_clear_association + department = Department.find(1,1) + assert_equal 2, department.employees.size, "Before clear employee count should be 2." + department.employees.clear + assert_equal 0, department.employees.size, "After clear employee count should be 0." + department.reload + assert_equal 0, department.employees.size, "After clear and a reload from DB employee count should be 0." + end + + def test_delete_association + department = Department.find(1,1) + assert_equal 2, department.employees.size , "Before delete employee count should be 2." + first_employee = department.employees[0] + department.employees.delete(first_employee) + assert_equal 1, department.employees.size, "After delete employee count should be 1." + department.reload + assert_equal 1, department.employees.size, "After delete and a reload from DB employee count should be 1." + end + + def test_delete_records_for_has_many_association_with_composite_primary_key + reference_type = ReferenceType.find(1) + codes_to_delete = reference_type.reference_codes[0..1] + assert_equal 3, reference_type.reference_codes.size, "Before deleting records reference_code count should be 3." + reference_type.reference_codes.delete_records(codes_to_delete) + reference_type.reload + assert_equal 1, reference_type.reference_codes.size, "After deleting 2 records and a reload from DB reference_code count should be 1." + end +end diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/test_dummy.rb b/vendor/gems/composite_primary_keys-2.2.2/test/test_dummy.rb index 44386685b..da21c4716 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/test_dummy.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/test/test_dummy.rb @@ -1,28 +1,28 @@ -require 'abstract_unit' -require 'fixtures/reference_type' -require 'fixtures/reference_code' - -class TestDummy < Test::Unit::TestCase - fixtures :reference_types, :reference_codes - - classes = { - :single => { - :class => ReferenceType, - :primary_keys => :reference_type_id, - }, - :dual => { - :class => ReferenceCode, - :primary_keys => [:reference_type_id, :reference_code], - }, - } - - def setup - self.class.classes = classes - end - - def test_truth - testing_with do - assert true - end - end +require 'abstract_unit' +require 'fixtures/reference_type' +require 'fixtures/reference_code' + +class TestDummy < Test::Unit::TestCase + fixtures :reference_types, :reference_codes + + classes = { + :single => { + :class => ReferenceType, + :primary_keys => :reference_type_id, + }, + :dual => { + :class => ReferenceCode, + :primary_keys => [:reference_type_id, :reference_code], + }, + } + + def setup + self.class.classes = classes + end + + def test_truth + testing_with do + assert true + end + end end \ No newline at end of file diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/test_find.rb b/vendor/gems/composite_primary_keys-2.2.2/test/test_find.rb index a07d30a64..c8c1af7dc 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/test_find.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/test/test_find.rb @@ -1,73 +1,73 @@ -require 'abstract_unit' -require 'fixtures/reference_type' -require 'fixtures/reference_code' - -# Testing the find action on composite ActiveRecords with two primary keys -class TestFind < Test::Unit::TestCase - fixtures :reference_types, :reference_codes - - CLASSES = { - :single => { - :class => ReferenceType, - :primary_keys => [:reference_type_id], - }, - :dual => { - :class => ReferenceCode, - :primary_keys => [:reference_type_id, :reference_code], - }, - :dual_strs => { - :class => ReferenceCode, - :primary_keys => ['reference_type_id', 'reference_code'], - }, - } - - def setup - self.class.classes = CLASSES - end - - def test_find_first - testing_with do - obj = @klass.find(:first) - assert obj - assert_equal @klass, obj.class - end - end - - def test_find - testing_with do - found = @klass.find(*first_id) # e.g. find(1,1) or find 1,1 - assert found - assert_equal @klass, found.class - assert_equal found, @klass.find(found.id) - assert_equal found, @klass.find(found.to_param) - end - end - - def test_find_composite_ids - testing_with do - found = @klass.find(first_id) # e.g. find([1,1].to_composite_ids) - assert found - assert_equal @klass, found.class - assert_equal found, @klass.find(found.id) - assert_equal found, @klass.find(found.to_param) - end - end - - def test_to_param - testing_with do - assert_equal first_id_str, @first.to_param.to_s - end - end - - def things_to_look_at - testing_with do - assert_equal found, @klass.find(found.id.to_s) # fails for 2+ keys - end - end - - def test_not_found - assert_raise(::ActiveRecord::RecordNotFound) do - ReferenceCode.send :find, '999,999' - end - end +require 'abstract_unit' +require 'fixtures/reference_type' +require 'fixtures/reference_code' + +# Testing the find action on composite ActiveRecords with two primary keys +class TestFind < Test::Unit::TestCase + fixtures :reference_types, :reference_codes + + CLASSES = { + :single => { + :class => ReferenceType, + :primary_keys => [:reference_type_id], + }, + :dual => { + :class => ReferenceCode, + :primary_keys => [:reference_type_id, :reference_code], + }, + :dual_strs => { + :class => ReferenceCode, + :primary_keys => ['reference_type_id', 'reference_code'], + }, + } + + def setup + self.class.classes = CLASSES + end + + def test_find_first + testing_with do + obj = @klass.find(:first) + assert obj + assert_equal @klass, obj.class + end + end + + def test_find + testing_with do + found = @klass.find(*first_id) # e.g. find(1,1) or find 1,1 + assert found + assert_equal @klass, found.class + assert_equal found, @klass.find(found.id) + assert_equal found, @klass.find(found.to_param) + end + end + + def test_find_composite_ids + testing_with do + found = @klass.find(first_id) # e.g. find([1,1].to_composite_ids) + assert found + assert_equal @klass, found.class + assert_equal found, @klass.find(found.id) + assert_equal found, @klass.find(found.to_param) + end + end + + def test_to_param + testing_with do + assert_equal first_id_str, @first.to_param.to_s + end + end + + def things_to_look_at + testing_with do + assert_equal found, @klass.find(found.id.to_s) # fails for 2+ keys + end + end + + def test_not_found + assert_raise(::ActiveRecord::RecordNotFound) do + ReferenceCode.send :find, '999,999' + end + end end \ No newline at end of file diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/test_ids.rb b/vendor/gems/composite_primary_keys-2.2.2/test/test_ids.rb index 9ba2d92a7..3cd4f3c9e 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/test_ids.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/test/test_ids.rb @@ -1,97 +1,97 @@ -require 'abstract_unit' -require 'fixtures/reference_type' -require 'fixtures/reference_code' - -class TestIds < Test::Unit::TestCase - fixtures :reference_types, :reference_codes - - CLASSES = { - :single => { - :class => ReferenceType, - :primary_keys => [:reference_type_id], - }, - :dual => { - :class => ReferenceCode, - :primary_keys => [:reference_type_id, :reference_code], - }, - :dual_strs => { - :class => ReferenceCode, - :primary_keys => ['reference_type_id', 'reference_code'], - }, - } - - def setup - self.class.classes = CLASSES - end - - def test_id - testing_with do - assert_equal @first.id, @first.ids if composite? - end - end - - def test_id_to_s - testing_with do - assert_equal first_id_str, @first.id.to_s - assert_equal first_id_str, "#{@first.id}" - end - end - - def test_ids_to_s - testing_with do - order = @klass.primary_key.is_a?(String) ? @klass.primary_key : @klass.primary_key.join(',') - to_test = @klass.find(:all, :order => order)[0..1].map(&:id) - assert_equal '(1,1),(1,2)', @klass.ids_to_s(to_test) if @key_test == :dual - assert_equal '1,1;1,2', @klass.ids_to_s(to_test, ',', ';', '', '') if @key_test == :dual - end - end - - def test_composite_where_clause - testing_with do - where = 'reference_codes.reference_type_id=1 AND reference_codes.reference_code=2) OR (reference_codes.reference_type_id=2 AND reference_codes.reference_code=2' - assert_equal(where, @klass.composite_where_clause([[1, 2], [2, 2]])) if @key_test == :dual - end - end - - def test_set_ids_string - testing_with do - array = @primary_keys.collect {|key| 5} - expected = composite? ? array.to_composite_keys : array.first - @first.id = expected.to_s - assert_equal expected, @first.id - end - end - - def test_set_ids_array - testing_with do - array = @primary_keys.collect {|key| 5} - expected = composite? ? array.to_composite_keys : array.first - @first.id = expected - assert_equal expected, @first.id - end - end - - def test_set_ids_comp - testing_with do - array = @primary_keys.collect {|key| 5} - expected = composite? ? array.to_composite_keys : array.first - @first.id = expected - assert_equal expected, @first.id - end - end - - def test_primary_keys - testing_with do - if composite? - assert_not_nil @klass.primary_keys - assert_equal @primary_keys.map {|key| key.to_sym}, @klass.primary_keys - assert_equal @klass.primary_keys, @klass.primary_key - else - assert_not_nil @klass.primary_key - assert_equal @primary_keys, [@klass.primary_key.to_sym] - end - assert_equal @primary_keys.join(','), @klass.primary_key.to_s - # Need a :primary_keys should be Array with to_s overridden - end - end +require 'abstract_unit' +require 'fixtures/reference_type' +require 'fixtures/reference_code' + +class TestIds < Test::Unit::TestCase + fixtures :reference_types, :reference_codes + + CLASSES = { + :single => { + :class => ReferenceType, + :primary_keys => [:reference_type_id], + }, + :dual => { + :class => ReferenceCode, + :primary_keys => [:reference_type_id, :reference_code], + }, + :dual_strs => { + :class => ReferenceCode, + :primary_keys => ['reference_type_id', 'reference_code'], + }, + } + + def setup + self.class.classes = CLASSES + end + + def test_id + testing_with do + assert_equal @first.id, @first.ids if composite? + end + end + + def test_id_to_s + testing_with do + assert_equal first_id_str, @first.id.to_s + assert_equal first_id_str, "#{@first.id}" + end + end + + def test_ids_to_s + testing_with do + order = @klass.primary_key.is_a?(String) ? @klass.primary_key : @klass.primary_key.join(',') + to_test = @klass.find(:all, :order => order)[0..1].map(&:id) + assert_equal '(1,1),(1,2)', @klass.ids_to_s(to_test) if @key_test == :dual + assert_equal '1,1;1,2', @klass.ids_to_s(to_test, ',', ';', '', '') if @key_test == :dual + end + end + + def test_composite_where_clause + testing_with do + where = 'reference_codes.reference_type_id=1 AND reference_codes.reference_code=2) OR (reference_codes.reference_type_id=2 AND reference_codes.reference_code=2' + assert_equal(where, @klass.composite_where_clause([[1, 2], [2, 2]])) if @key_test == :dual + end + end + + def test_set_ids_string + testing_with do + array = @primary_keys.collect {|key| 5} + expected = composite? ? array.to_composite_keys : array.first + @first.id = expected.to_s + assert_equal expected, @first.id + end + end + + def test_set_ids_array + testing_with do + array = @primary_keys.collect {|key| 5} + expected = composite? ? array.to_composite_keys : array.first + @first.id = expected + assert_equal expected, @first.id + end + end + + def test_set_ids_comp + testing_with do + array = @primary_keys.collect {|key| 5} + expected = composite? ? array.to_composite_keys : array.first + @first.id = expected + assert_equal expected, @first.id + end + end + + def test_primary_keys + testing_with do + if composite? + assert_not_nil @klass.primary_keys + assert_equal @primary_keys.map {|key| key.to_sym}, @klass.primary_keys + assert_equal @klass.primary_keys, @klass.primary_key + else + assert_not_nil @klass.primary_key + assert_equal @primary_keys, [@klass.primary_key.to_sym] + end + assert_equal @primary_keys.join(','), @klass.primary_key.to_s + # Need a :primary_keys should be Array with to_s overridden + end + end end \ No newline at end of file diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/test_miscellaneous.rb b/vendor/gems/composite_primary_keys-2.2.2/test/test_miscellaneous.rb index 25f6096fe..e5de57021 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/test_miscellaneous.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/test/test_miscellaneous.rb @@ -1,39 +1,39 @@ -require 'abstract_unit' -require 'fixtures/reference_type' -require 'fixtures/reference_code' - -class TestMiscellaneous < Test::Unit::TestCase - fixtures :reference_types, :reference_codes, :products - - CLASSES = { - :single => { - :class => ReferenceType, - :primary_keys => :reference_type_id, - }, - :dual => { - :class => ReferenceCode, - :primary_keys => [:reference_type_id, :reference_code], - }, - } - - def setup - self.class.classes = CLASSES - end - - def test_composite_class - testing_with do - assert_equal composite?, @klass.composite? - end - end - - def test_composite_instance - testing_with do - assert_equal composite?, @first.composite? - end - end - - def test_count - assert_equal 2, Product.count - end - +require 'abstract_unit' +require 'fixtures/reference_type' +require 'fixtures/reference_code' + +class TestMiscellaneous < Test::Unit::TestCase + fixtures :reference_types, :reference_codes, :products + + CLASSES = { + :single => { + :class => ReferenceType, + :primary_keys => :reference_type_id, + }, + :dual => { + :class => ReferenceCode, + :primary_keys => [:reference_type_id, :reference_code], + }, + } + + def setup + self.class.classes = CLASSES + end + + def test_composite_class + testing_with do + assert_equal composite?, @klass.composite? + end + end + + def test_composite_instance + testing_with do + assert_equal composite?, @first.composite? + end + end + + def test_count + assert_equal 2, Product.count + end + end \ No newline at end of file diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/test_pagination.rb b/vendor/gems/composite_primary_keys-2.2.2/test/test_pagination.rb index fa19d95a6..4952ff207 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/test_pagination.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/test/test_pagination.rb @@ -1,38 +1,38 @@ -require 'abstract_unit' -require 'fixtures/reference_type' -require 'fixtures/reference_code' -require 'plugins/pagination' - -class TestPagination < Test::Unit::TestCase - fixtures :reference_types, :reference_codes - - include ActionController::Pagination - DEFAULT_PAGE_SIZE = 2 - - attr_accessor :params - - CLASSES = { - :single => { - :class => ReferenceType, - :primary_keys => :reference_type_id, - :table => :reference_types, - }, - :dual => { - :class => ReferenceCode, - :primary_keys => [:reference_type_id, :reference_code], - :table => :reference_codes, - }, - } - - def setup - self.class.classes = CLASSES - @params = {} - end - - def test_paginate_all - testing_with do - @object_pages, @objects = paginate @klass_info[:table], :per_page => DEFAULT_PAGE_SIZE - assert_equal 2, @objects.length, "Each page should have #{DEFAULT_PAGE_SIZE} items" - end - end +require 'abstract_unit' +require 'fixtures/reference_type' +require 'fixtures/reference_code' +require 'plugins/pagination' + +class TestPagination < Test::Unit::TestCase + fixtures :reference_types, :reference_codes + + include ActionController::Pagination + DEFAULT_PAGE_SIZE = 2 + + attr_accessor :params + + CLASSES = { + :single => { + :class => ReferenceType, + :primary_keys => :reference_type_id, + :table => :reference_types, + }, + :dual => { + :class => ReferenceCode, + :primary_keys => [:reference_type_id, :reference_code], + :table => :reference_codes, + }, + } + + def setup + self.class.classes = CLASSES + @params = {} + end + + def test_paginate_all + testing_with do + @object_pages, @objects = paginate @klass_info[:table], :per_page => DEFAULT_PAGE_SIZE + assert_equal 2, @objects.length, "Each page should have #{DEFAULT_PAGE_SIZE} items" + end + end end \ No newline at end of file diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/test_santiago.rb b/vendor/gems/composite_primary_keys-2.2.2/test/test_santiago.rb index 4b5f433e4..771c414a7 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/test_santiago.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/test/test_santiago.rb @@ -1,27 +1,27 @@ -# Test cases devised by Santiago that broke the Composite Primary Keys -# code at one point in time. But no more!!! - -require 'abstract_unit' -require 'fixtures/user' -require 'fixtures/article' -require 'fixtures/reading' - -class TestSantiago < Test::Unit::TestCase - fixtures :suburbs, :streets, :users, :articles, :readings - - def test_normal_and_composite_associations - assert_not_nil @suburb = Suburb.find(1,1) - assert_equal 1, @suburb.streets.length - - assert_not_nil @street = Street.find(1) - assert_not_nil @street.suburb - end - - def test_single_keys - @santiago = User.find(1) - assert_not_nil @santiago.articles - assert_equal 2, @santiago.articles.length - assert_not_nil @santiago.readings - assert_equal 2, @santiago.readings.length - end -end +# Test cases devised by Santiago that broke the Composite Primary Keys +# code at one point in time. But no more!!! + +require 'abstract_unit' +require 'fixtures/user' +require 'fixtures/article' +require 'fixtures/reading' + +class TestSantiago < Test::Unit::TestCase + fixtures :suburbs, :streets, :users, :articles, :readings + + def test_normal_and_composite_associations + assert_not_nil @suburb = Suburb.find(1,1) + assert_equal 1, @suburb.streets.length + + assert_not_nil @street = Street.find(1) + assert_not_nil @street.suburb + end + + def test_single_keys + @santiago = User.find(1) + assert_not_nil @santiago.articles + assert_equal 2, @santiago.articles.length + assert_not_nil @santiago.readings + assert_equal 2, @santiago.readings.length + end +end diff --git a/vendor/gems/composite_primary_keys-2.2.2/test/test_update.rb b/vendor/gems/composite_primary_keys-2.2.2/test/test_update.rb index d612c92a8..87ca8f5f4 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/test/test_update.rb +++ b/vendor/gems/composite_primary_keys-2.2.2/test/test_update.rb @@ -1,40 +1,40 @@ -require 'abstract_unit' -require 'fixtures/reference_type' -require 'fixtures/reference_code' - -class TestUpdate < Test::Unit::TestCase - fixtures :reference_types, :reference_codes - - CLASSES = { - :single => { - :class => ReferenceType, - :primary_keys => :reference_type_id, - :update => { :description => 'RT Desc' }, - }, - :dual => { - :class => ReferenceCode, - :primary_keys => [:reference_type_id, :reference_code], - :update => { :description => 'RT Desc' }, - }, - } - - def setup - self.class.classes = CLASSES - end - - def test_setup - testing_with do - assert_not_nil @klass_info[:update] - end - end - - def test_update_attributes - testing_with do - assert @first.update_attributes(@klass_info[:update]) - assert @first.reload - @klass_info[:update].each_pair do |attr_name, new_value| - assert_equal new_value, @first[attr_name], "Attribute #{attr_name} is incorrect" - end - end - end +require 'abstract_unit' +require 'fixtures/reference_type' +require 'fixtures/reference_code' + +class TestUpdate < Test::Unit::TestCase + fixtures :reference_types, :reference_codes + + CLASSES = { + :single => { + :class => ReferenceType, + :primary_keys => :reference_type_id, + :update => { :description => 'RT Desc' }, + }, + :dual => { + :class => ReferenceCode, + :primary_keys => [:reference_type_id, :reference_code], + :update => { :description => 'RT Desc' }, + }, + } + + def setup + self.class.classes = CLASSES + end + + def test_setup + testing_with do + assert_not_nil @klass_info[:update] + end + end + + def test_update_attributes + testing_with do + assert @first.update_attributes(@klass_info[:update]) + assert @first.reload + @klass_info[:update].each_pair do |attr_name, new_value| + assert_equal new_value, @first[attr_name], "Attribute #{attr_name} is incorrect" + end + end + end end \ No newline at end of file diff --git a/vendor/gems/composite_primary_keys-2.2.2/website/stylesheets/screen.css b/vendor/gems/composite_primary_keys-2.2.2/website/stylesheets/screen.css index 3f2d8f951..cfa43425b 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/website/stylesheets/screen.css +++ b/vendor/gems/composite_primary_keys-2.2.2/website/stylesheets/screen.css @@ -1,126 +1,126 @@ -body { - background-color: #2F30EE; - font-family: "Georgia", sans-serif; - font-size: 16px; - line-height: 1.6em; - padding: 1.6em 0 0 0; - color: #eee; -} -h1, h2, h3, h4, h5, h6 { - color: #FFEDFA; -} -h1 { - font-family: sans-serif; - font-weight: normal; - font-size: 4em; - line-height: 0.8em; - letter-spacing: -0.1ex; - margin: 5px; -} -li { - padding: 0; - margin: 0; - list-style-type: square; -} -a { - color: #99f; - font-weight: normal; - text-decoration: underline; -} -blockquote { - font-size: 90%; - font-style: italic; - border-left: 1px solid #eee; - padding-left: 1em; -} -.caps { - font-size: 80%; -} - -#main { - width: 45em; - padding: 0; - margin: 0 auto; -} -.coda { - text-align: right; - color: #77f; - font-size: smaller; -} - -table { - font-size: 90%; - line-height: 1.4em; - color: #ff8; - background-color: #111; - padding: 2px 10px 2px 10px; - border-style: dashed; -} - -th { - color: #fff; -} - -td { - padding: 2px 10px 2px 10px; -} - -.success { - color: #0CC52B; -} - -.failed { - color: #E90A1B; -} - -.unknown { - color: #995000; -} -pre, code { - font-family: monospace; - font-size: 90%; - line-height: 1.4em; - color: #ff8; - background-color: #111; - padding: 2px 10px 2px 10px; -} -.comment { color: #aaa; font-style: italic; } -.keyword { color: #eff; font-weight: bold; } -.punct { color: #eee; font-weight: bold; } -.symbol { color: #0bb; } -.string { color: #6b4; } -.ident { color: #ff8; } -.constant { color: #66f; } -.regex { color: #ec6; } -.number { color: #F99; } -.expr { color: #227; } - -#version { - float: right; - text-align: right; - font-family: sans-serif; - font-weight: normal; - background-color: #ff8; - color: #66f; - padding: 15px 20px 10px 20px; - margin: 0 auto; - margin-top: 15px; - border: 3px solid #66f; -} - -#version .numbers { - display: block; - font-size: 4em; - line-height: 0.8em; - letter-spacing: -0.1ex; -} - -#version a { - text-decoration: none; -} - -.clickable { - cursor: pointer; - cursor: hand; -} - +body { + background-color: #2F30EE; + font-family: "Georgia", sans-serif; + font-size: 16px; + line-height: 1.6em; + padding: 1.6em 0 0 0; + color: #eee; +} +h1, h2, h3, h4, h5, h6 { + color: #FFEDFA; +} +h1 { + font-family: sans-serif; + font-weight: normal; + font-size: 4em; + line-height: 0.8em; + letter-spacing: -0.1ex; + margin: 5px; +} +li { + padding: 0; + margin: 0; + list-style-type: square; +} +a { + color: #99f; + font-weight: normal; + text-decoration: underline; +} +blockquote { + font-size: 90%; + font-style: italic; + border-left: 1px solid #eee; + padding-left: 1em; +} +.caps { + font-size: 80%; +} + +#main { + width: 45em; + padding: 0; + margin: 0 auto; +} +.coda { + text-align: right; + color: #77f; + font-size: smaller; +} + +table { + font-size: 90%; + line-height: 1.4em; + color: #ff8; + background-color: #111; + padding: 2px 10px 2px 10px; + border-style: dashed; +} + +th { + color: #fff; +} + +td { + padding: 2px 10px 2px 10px; +} + +.success { + color: #0CC52B; +} + +.failed { + color: #E90A1B; +} + +.unknown { + color: #995000; +} +pre, code { + font-family: monospace; + font-size: 90%; + line-height: 1.4em; + color: #ff8; + background-color: #111; + padding: 2px 10px 2px 10px; +} +.comment { color: #aaa; font-style: italic; } +.keyword { color: #eff; font-weight: bold; } +.punct { color: #eee; font-weight: bold; } +.symbol { color: #0bb; } +.string { color: #6b4; } +.ident { color: #ff8; } +.constant { color: #66f; } +.regex { color: #ec6; } +.number { color: #F99; } +.expr { color: #227; } + +#version { + float: right; + text-align: right; + font-family: sans-serif; + font-weight: normal; + background-color: #ff8; + color: #66f; + padding: 15px 20px 10px 20px; + margin: 0 auto; + margin-top: 15px; + border: 3px solid #66f; +} + +#version .numbers { + display: block; + font-size: 4em; + line-height: 0.8em; + letter-spacing: -0.1ex; +} + +#version a { + text-decoration: none; +} + +.clickable { + cursor: pointer; + cursor: hand; +} + diff --git a/vendor/gems/composite_primary_keys-2.2.2/website/version-raw.txt b/vendor/gems/composite_primary_keys-2.2.2/website/version-raw.txt index 74ca3ac67..9059e938d 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/website/version-raw.txt +++ b/vendor/gems/composite_primary_keys-2.2.2/website/version-raw.txt @@ -1,2 +1,2 @@ -h1. Announcement JS file +h1. Announcement JS file MagicAnnouncement.show('compositekeys', version); \ No newline at end of file diff --git a/vendor/gems/composite_primary_keys-2.2.2/website/version.js b/vendor/gems/composite_primary_keys-2.2.2/website/version.js index d0a9dab1d..3225547c9 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/website/version.js +++ b/vendor/gems/composite_primary_keys-2.2.2/website/version.js @@ -1,4 +1,4 @@ // Version JS file var version = "2.2.2"; - + document.write(" - " + version); diff --git a/vendor/gems/composite_primary_keys-2.2.2/website/version.txt b/vendor/gems/composite_primary_keys-2.2.2/website/version.txt index d0ac6a7ac..6054d2f4b 100644 --- a/vendor/gems/composite_primary_keys-2.2.2/website/version.txt +++ b/vendor/gems/composite_primary_keys-2.2.2/website/version.txt @@ -1,3 +1,3 @@ -h1. Version JS file - +h1. Version JS file + document.write(" - " + version); \ No newline at end of file diff --git a/vendor/plugins/rails-i18n/locale/dsb.yml b/vendor/plugins/rails-i18n/locale/dsb.yml index e3fdad824..6fd2c7a64 100644 --- a/vendor/plugins/rails-i18n/locale/dsb.yml +++ b/vendor/plugins/rails-i18n/locale/dsb.yml @@ -1,182 +1,182 @@ -# Lower Sorbian translations for Ruby on Rails -# by Michael Wolf (preklady@wolfmicha.de) - -dsb: - # ActiveSupport - support: - array: - words_connector: ", " - two_words_connector: " a " - last_word_connector: " a " - sentence_connector: "a" - skip_last_comma: true - - # Date - date: - formats: - default: "%d. %m. %Y" - short: "%d %b" - long: "%d. %B %Y" - day_names: [njeźela, pónjeźele, wałtora, srjoda, stwórtk, pětk, sobota] - abbr_day_names: [Nj, Pó, Wu, Sr, St, Pě, So] - month_names: [~, Januar, Februar, Měrc, Apryl, Maj, Junij, Julij, Awgust, September, Oktober, Nowember, December] - abbr_month_names: [~, jan, feb, měr, apr, maj, jun, jul, awg, sep, okt, now, dec] - order: [:day, :month, :year] - - # Time - time: - formats: - default: "%A, %d. %B %Y, %H:%M hodź" - short: "%d. %B, %H:%M hodź." - long: "%A, %d. %B %Y, %H:%M hodź." - am: "dopołdnja" - pm: "wótpołdnja" - - - # Numbers - number: - format: - precision: 3 - separator: "," - delimiter: "." - currency: - format: - unit: "€" - precision: 2 - format: "%n %u" - separator: "," - delimiter: " " - human: - format: - precision: 1 - delimiter: "" - storage_units: - format: "%n %u" - units: - byte: - one: "bajt" - two: "bajta" - few: "bajty" - other: "bajtow" - kb: "KB" - mb: "MB" - gb: "GB" - tb: "TB" - - percentage: - format: - delimiter: "" - - precision: - format: - delimiter: "" - - - # Distance of time ... helper - # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words() - datetime: - distance_in_words: - half_a_minute: "poł minuty" - less_than_x_seconds: - one: "mjenjej ako 1 sekundu" - two: "mjenjej ako {{count}} sekundoma" - few: "mjenjej ako {{count}} sekundami" - other: "mjenjej ako {{count}} sekundami" - x_seconds: - one: "1 sekundu" - two: "{{count}} sekundoma" - few: "{{count}} sekundami" - other: "{{count}} sekundami" - less_than_x_minutes: - one: "mjenjej ako 1 minutu" - two: "mjenjej ako {{count}} minutoma" - few: "mjenjej ako {{count}} minutami" - other: "mjenjej ako {{count}} minutami" - x_minutes: - one: "1 minutu" - two: "{{count}} minutoma" - few: "{{count}} minutami" - other: "{{count}} minutami" - about_x_hours: - one: "něźi 1 góźinu" - two: "něźi {{count}} góźinoma" - few: "něźi {{count}} góźinami" - other: "něźi {{count}} góźinami" - x_days: - one: "1 dnjom" - two: "{{count}} dnjoma" - few: "{{count}} dnjami" - other: "{{count}} dnjami" - about_x_months: - one: "něźi 1 mjasecom" - two: "něźi {{count}} mjasecoma" - few: "něźi {{count}} mjasecami" - other: "něźi {{count}} mjasecami" - x_months: - one: "1 mjasecom" - two: "{{count}} mjasecoma" - few: "{{count}} mjasecami" - other: "{{count}} mjasecami" - about_x_years: - one: "něźi 1 lětom" - two: "něźi {{count}} lětoma" - few: "něźi {{count}} lětami" - other: "něźi {{count}} lětami" - over_x_years: - one: "wěcej ako 1 lětom" - two: "wěcej ako {{count}} lětoma" - few: "wěcej ako {{count}} lětami" - other: "wěcej ako {{count}} lětami" - prompts: - year: "Lěto" - month: "Mjasec" - day: "Źeń" - hour: "Góźina" - minute: "Minuta" - second: "Sekunda" - - # ActiveRecord validation messages - activerecord: - errors: - messages: - inclusion: "njejo płaśiwa gódnota" - exclusion: "njestoj k dispoziciji" - invalid: "njejo płaśiwy" - confirmation: "njejo se wobkšuśiło" - accepted: "musy se wobkšuśiś" - empty: "njesmějo prozny byś" - blank: "jo trěbny" - too_long: - one: "jo pśedłujki (maks. 1 znamješko)" - two: "jo pśedłujki (maks. {{count}} znamješce)" - few: "jo pśedłujki (maks. {{count}} znamješka)" - other: "jo pśedłujki (maks. {{count}} znamješkow)" - too_short: - one: "jo překrotki (min. 1 znamješko)" - two: "jo překrotki (min. {{count}} znamješće)" - few: "jo překrotki (min. {{count}} znamješka)" - other: "jo překrotki (min. {{count}} znamješkow)" - wrong_length: - one: "njama pšawu dłujkosć (1 znamješko wócakane)" - two: "njama pšawu dłujkosć ({{count}} znamješce wócakanej)" - few: "njama pšawu dłujkosć ({{count}} znamješka wócakane)" - other: "njama pšawu dłujkosć ({{count}} znamješkow wócakanych)" - taken: "jo južo w datowej bance" - not_a_number: "njejo licba" - greater_than: "musy wětšy ako {{count}} byś" - greater_than_or_equal_to: "musy wětšy abo jadnak {{count}} być" - equal_to: "musy jadnak {{count}} byś" - less_than: "musy mjeńšy ako {{count}} byś" - less_than_or_equal_to: "musy mjeńšy abo jadnak {{count}} byś" - odd: "musy njerowna licba byś" - even: "musy rowna licba byś" - - template: - header: - one: "Pśi składowanju objekta {{model}} jo k zmólce dojšło a njejo było móžno składowaś" - two: "Pśi składowanju objekta {{model}} jo k {{count}} zmólkam dojšło a njejo było móžno składowaś" - few: "Pśi składowanju objekta {{model}} jo k {{count}} zmólkam dojšło a njejo było móžno składowaś" - other: "Pśi składowanju objekta {{model}} jo k {{count}} zmólkam dojšło a njejo było móžno składowaś" - body: "Pšosym pśeglědaj slědujuce póla:" - - models: +# Lower Sorbian translations for Ruby on Rails +# by Michael Wolf (preklady@wolfmicha.de) + +dsb: + # ActiveSupport + support: + array: + words_connector: ", " + two_words_connector: " a " + last_word_connector: " a " + sentence_connector: "a" + skip_last_comma: true + + # Date + date: + formats: + default: "%d. %m. %Y" + short: "%d %b" + long: "%d. %B %Y" + day_names: [njeźela, pónjeźele, wałtora, srjoda, stwórtk, pětk, sobota] + abbr_day_names: [Nj, Pó, Wu, Sr, St, Pě, So] + month_names: [~, Januar, Februar, Měrc, Apryl, Maj, Junij, Julij, Awgust, September, Oktober, Nowember, December] + abbr_month_names: [~, jan, feb, měr, apr, maj, jun, jul, awg, sep, okt, now, dec] + order: [:day, :month, :year] + + # Time + time: + formats: + default: "%A, %d. %B %Y, %H:%M hodź" + short: "%d. %B, %H:%M hodź." + long: "%A, %d. %B %Y, %H:%M hodź." + am: "dopołdnja" + pm: "wótpołdnja" + + + # Numbers + number: + format: + precision: 3 + separator: "," + delimiter: "." + currency: + format: + unit: "€" + precision: 2 + format: "%n %u" + separator: "," + delimiter: " " + human: + format: + precision: 1 + delimiter: "" + storage_units: + format: "%n %u" + units: + byte: + one: "bajt" + two: "bajta" + few: "bajty" + other: "bajtow" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + percentage: + format: + delimiter: "" + + precision: + format: + delimiter: "" + + + # Distance of time ... helper + # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words() + datetime: + distance_in_words: + half_a_minute: "poł minuty" + less_than_x_seconds: + one: "mjenjej ako 1 sekundu" + two: "mjenjej ako {{count}} sekundoma" + few: "mjenjej ako {{count}} sekundami" + other: "mjenjej ako {{count}} sekundami" + x_seconds: + one: "1 sekundu" + two: "{{count}} sekundoma" + few: "{{count}} sekundami" + other: "{{count}} sekundami" + less_than_x_minutes: + one: "mjenjej ako 1 minutu" + two: "mjenjej ako {{count}} minutoma" + few: "mjenjej ako {{count}} minutami" + other: "mjenjej ako {{count}} minutami" + x_minutes: + one: "1 minutu" + two: "{{count}} minutoma" + few: "{{count}} minutami" + other: "{{count}} minutami" + about_x_hours: + one: "něźi 1 góźinu" + two: "něźi {{count}} góźinoma" + few: "něźi {{count}} góźinami" + other: "něźi {{count}} góźinami" + x_days: + one: "1 dnjom" + two: "{{count}} dnjoma" + few: "{{count}} dnjami" + other: "{{count}} dnjami" + about_x_months: + one: "něźi 1 mjasecom" + two: "něźi {{count}} mjasecoma" + few: "něźi {{count}} mjasecami" + other: "něźi {{count}} mjasecami" + x_months: + one: "1 mjasecom" + two: "{{count}} mjasecoma" + few: "{{count}} mjasecami" + other: "{{count}} mjasecami" + about_x_years: + one: "něźi 1 lětom" + two: "něźi {{count}} lětoma" + few: "něźi {{count}} lětami" + other: "něźi {{count}} lětami" + over_x_years: + one: "wěcej ako 1 lětom" + two: "wěcej ako {{count}} lětoma" + few: "wěcej ako {{count}} lětami" + other: "wěcej ako {{count}} lětami" + prompts: + year: "Lěto" + month: "Mjasec" + day: "Źeń" + hour: "Góźina" + minute: "Minuta" + second: "Sekunda" + + # ActiveRecord validation messages + activerecord: + errors: + messages: + inclusion: "njejo płaśiwa gódnota" + exclusion: "njestoj k dispoziciji" + invalid: "njejo płaśiwy" + confirmation: "njejo se wobkšuśiło" + accepted: "musy se wobkšuśiś" + empty: "njesmějo prozny byś" + blank: "jo trěbny" + too_long: + one: "jo pśedłujki (maks. 1 znamješko)" + two: "jo pśedłujki (maks. {{count}} znamješce)" + few: "jo pśedłujki (maks. {{count}} znamješka)" + other: "jo pśedłujki (maks. {{count}} znamješkow)" + too_short: + one: "jo překrotki (min. 1 znamješko)" + two: "jo překrotki (min. {{count}} znamješće)" + few: "jo překrotki (min. {{count}} znamješka)" + other: "jo překrotki (min. {{count}} znamješkow)" + wrong_length: + one: "njama pšawu dłujkosć (1 znamješko wócakane)" + two: "njama pšawu dłujkosć ({{count}} znamješce wócakanej)" + few: "njama pšawu dłujkosć ({{count}} znamješka wócakane)" + other: "njama pšawu dłujkosć ({{count}} znamješkow wócakanych)" + taken: "jo južo w datowej bance" + not_a_number: "njejo licba" + greater_than: "musy wětšy ako {{count}} byś" + greater_than_or_equal_to: "musy wětšy abo jadnak {{count}} być" + equal_to: "musy jadnak {{count}} byś" + less_than: "musy mjeńšy ako {{count}} byś" + less_than_or_equal_to: "musy mjeńšy abo jadnak {{count}} byś" + odd: "musy njerowna licba byś" + even: "musy rowna licba byś" + + template: + header: + one: "Pśi składowanju objekta {{model}} jo k zmólce dojšło a njejo było móžno składowaś" + two: "Pśi składowanju objekta {{model}} jo k {{count}} zmólkam dojšło a njejo było móžno składowaś" + few: "Pśi składowanju objekta {{model}} jo k {{count}} zmólkam dojšło a njejo było móžno składowaś" + other: "Pśi składowanju objekta {{model}} jo k {{count}} zmólkam dojšło a njejo było móžno składowaś" + body: "Pšosym pśeglědaj slědujuce póla:" + + models: diff --git a/vendor/plugins/rails-i18n/locale/es.yml b/vendor/plugins/rails-i18n/locale/es.yml index 54bd3d9e9..779279c06 100644 --- a/vendor/plugins/rails-i18n/locale/es.yml +++ b/vendor/plugins/rails-i18n/locale/es.yml @@ -7,9 +7,9 @@ es: # These are also the defaults for 'currency', 'percentage', 'precision', and 'human' format: # Sets the separator between the units, for more precision (e.g. 1.0 / 2.0 == 0.5) - separator: "," + separator: "," # Delimets thousands (e.g. 1,000,000 is a million) (always in groups of three) - delimiter: "." + delimiter: "." # Number of decimals, behind the separator (1 with a precision of 2 gives: 1.00) precision: 3 @@ -17,35 +17,35 @@ es: currency: format: # Where is the currency sign? %u is the currency unit, %n the number (default: $5.00) - format: "%n %u" - unit: "€" + format: "%n %u" + unit: "€" # These three are to override number.format and are optional - separator: "," - delimiter: "." + separator: "," + delimiter: "." precision: 2 # Used in number_to_percentage() percentage: format: # These three are to override number.format and are optional - # separator: - delimiter: "" - # precision: + # separator: + delimiter: "" + # precision: # Used in number_to_precision() precision: format: # These three are to override number.format and are optional # separator: - delimiter: "" + delimiter: "" # precision: # Used in number_to_human_size() human: format: # These three are to override number.format and are optional - # separator: - delimiter: "" + # separator: + delimiter: "" precision: 1 # Rails <= v2.2.2 # storage_units: [Bytes, KB, MB, GB, TB] @@ -64,37 +64,37 @@ es: # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words() datetime: distance_in_words: - half_a_minute: "medio minuto" + half_a_minute: "medio minuto" less_than_x_seconds: - one: "menos de 1 segundo" + one: "menos de 1 segundo" other: "menos de {{count}} segundos" x_seconds: - one: "1 segundo" - other: "{{count}} segundos" + one: "1 segundo" + other: "{{count}} segundos" less_than_x_minutes: - one: "menos de 1 minuto" - other: "menos de {{count}} minutos" + one: "menos de 1 minuto" + other: "menos de {{count}} minutos" x_minutes: - one: "1 minuto" - other: "{{count}} minutos" + one: "1 minuto" + other: "{{count}} minutos" about_x_hours: - one: "alrededor de 1 hora" - other: "alrededor de {{count}} horas" + one: "alrededor de 1 hora" + other: "alrededor de {{count}} horas" x_days: - one: "1 día" - other: "{{count}} días" + one: "1 día" + other: "{{count}} días" about_x_months: - one: "alrededor de 1 mes" - other: "alrededor de {{count}} meses" + one: "alrededor de 1 mes" + other: "alrededor de {{count}} meses" x_months: - one: "1 mes" - other: "{{count}} meses" + one: "1 mes" + other: "{{count}} meses" about_x_years: - one: "alrededor de 1 año" - other: "alrededor de {{count}} años" + one: "alrededor de 1 año" + other: "alrededor de {{count}} años" over_x_years: - one: "más de 1 año" - other: "más de {{count}} años" + one: "más de 1 año" + other: "más de {{count}} años" almost_x_years: one: "casi 1 año" other: "casi {{count}} años" @@ -110,17 +110,17 @@ es: errors: template: header: - one: "no se pudo guardar este {{model}} porque se encontró 1 error" - other: "no se pudo guardar este {{model}} porque se encontraron {{count}} errores" + one: "No se pudo guardar este/a {{model}} porque se encontró 1 error" + other: "No se pudo guardar este/a {{model}} porque se encontraron {{count}} errores" # The variable :count is also available - body: "Se encontraron problemas con los siguientes campos:" + body: "Se encontraron problemas con los siguientes campos:" # The values :model, :attribute and :value are always available for interpolation # The value :count is available when applicable. Can be used for pluralization. messages: - inclusion: "no está incluido en la lista" - exclusion: "está reservado" - invalid: "no es válido" + inclusion: "no está incluido en la lista" + exclusion: "está reservado" + invalid: "no es válido" confirmation: "no coincide con la confirmación" accepted: "debe ser aceptado" empty: "no puede estar vacío" @@ -140,6 +140,9 @@ es: record_invalid: "La validación falló: {{errors}}" # Append your own errors here or at the model/attributes scope. + full_messages: + format: "{{attribute}} {{message}}" + models: # Overrides default messages @@ -152,8 +155,8 @@ es: # When no format has been given, it uses default. # You can provide other formats here if you like! default: "%e/%m/%Y" - short: "%e de %b" - long: "%e de %B de %Y" + short: "%e de %b" + long: "%e de %B de %Y" day_names: [Domingo, Lunes, Martes, Miércoles, Jueves, Viernes, Sábado] abbr_day_names: [Dom, Lun, Mar, Mie, Jue, Vie, Sab] @@ -167,10 +170,10 @@ es: time: formats: default: "%A, %e de %B de %Y %H:%M:%S %z" - short: "%e de %b %H:%M" - long: "%e de %B de %Y %H:%M" - am: "am" - pm: "pm" + short: "%e de %b %H:%M" + long: "%e de %B de %Y %H:%M" + am: "am" + pm: "pm" # Used in array.to_sentence. support: diff --git a/vendor/plugins/rails-i18n/locale/fa.yml b/vendor/plugins/rails-i18n/locale/fa.yml index e6102aaf9..288bab185 100644 --- a/vendor/plugins/rails-i18n/locale/fa.yml +++ b/vendor/plugins/rails-i18n/locale/fa.yml @@ -34,7 +34,7 @@ fa: only_day: "%e" day_names: [یکشنبه, دوشنبه, سه‌شنبه, چهارشنبه, پنج‌شنبه, جمعه, شنبه] - abbr_day_names: [ی, د, س, چ, پ, ج] + abbr_day_names: [ی, د, س, چ, پ, ج, ش] month_names: [~, ژانویه, فوریه, مارس, آوریل, مه, ژوئن, ژوئیه, اوت, سپتامبر, اکتبر, نوامبر, دسامبر] abbr_month_names: [~, ژانویه, فوریه, مارس, آوریل, مه, ژوئن, ژوئیه, اوت, سپتامبر, اکتبر, نوامبر, دسامبر] order: [ :day, :month, :year ] @@ -116,4 +116,4 @@ fa: odd: "باید فرد باشد" even: "باید زوج باشد" presence: "را فراموش کرده‌اید" - format: "فرمت مشکل دارد" \ No newline at end of file + format: "فرمت مشکل دارد" diff --git a/vendor/plugins/rails-i18n/locale/fi.yml b/vendor/plugins/rails-i18n/locale/fi.yml index f823eafa9..9bcd10952 100644 --- a/vendor/plugins/rails-i18n/locale/fi.yml +++ b/vendor/plugins/rails-i18n/locale/fi.yml @@ -30,6 +30,8 @@ fi: words_connector: ", " two_words_connector: " ja " last_word_connector: " ja " + select: + prompt: "Valitse" number: format: @@ -116,10 +118,6 @@ fi: minute: "Minuutti" second: "Sekunti" - support: - select: - prompt: "Valitse" - # which one should it be #activemodel: activerecord: diff --git a/vendor/plugins/rails-i18n/locale/hsb.yml b/vendor/plugins/rails-i18n/locale/hsb.yml index 2e4275d2f..dde340af0 100644 --- a/vendor/plugins/rails-i18n/locale/hsb.yml +++ b/vendor/plugins/rails-i18n/locale/hsb.yml @@ -1,190 +1,190 @@ -# Upper Sorbian translations for Ruby on Rails -# by Michael Wolf (preklady@wolfmicha.de) - -hsb: - - # ActiveSupport - support: - array: - words_connector: ", " - two_words_connector: " a " - last_word_connector: " a " - sentence_connector: "a" - skip_last_comma: true - - - - # Date - date: - formats: - default: "%d. %m. %Y" - short: "%d %b" - long: "%d. %B %Y" - - day_names: [njedźela, póndźela, wutora, srjeda, štwórtk, pjatk, sobota] - abbr_day_names: [Nj, Pó, Wu, Sr, Št, Pj, So] - month_names: [~, Januar, Februar, Měrc, Apryl, Meja, Junij, Julij, Awgust, September, Oktober, Nowember, December] - abbr_month_names: [~, jan, feb, měr, apr, mej, jun, jul, awg, sep, okt, now, dec] - order: [:day, :month, :year] - - # Time - time: - formats: - default: "%A, %d. %B %Y, %H:%M hodź" - short: "%d. %B, %H:%M hodź." - long: "%A, %d. %B %Y, %H:%M hodź." - - am: "dopołdnja" - pm: "popołdnju" - - - # Numbers - number: - format: - precision: 3 - separator: "," - delimiter: "." - - currency: - format: - unit: "€" - precision: 2 - format: "%n %u" - separator: "," - delimiter: " " - - human: - format: - precision: 1 - delimiter: "" - - storage_units: - format: "%n %u" - units: - byte: - one: "bajt" - two: "bajtaj" - few: "bajty" - other: "bajtow" - kb: "KB" - mb: "MB" - gb: "GB" - tb: "TB" - - percentage: - format: - delimiter: "" - - precision: - format: - delimiter: "" - - - # Distance of time ... helper - # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words() - datetime: - distance_in_words: - half_a_minute: "poł mjeńšiny" - less_than_x_seconds: - one: "mjenje hač 1 sekundu" - two: "mjenje hač {{count}} sekundomaj" - few: "mjenje hač {{count}} sekundami" - other: "mjenje hač {{count}} sekundami" - x_seconds: - one: "1 sekundu" - two: "{{count}} sekundomaj" - few: "{{count}} sekundami" - other: "{{count}} sekundami" - less_than_x_minutes: - one: "mjenje hač 1 mjeńšinu" - two: "mjenje hač {{count}} mjeńšinomaj" - few: "mjenje hač {{count}} mjeńšinami" - other: "mjenje hač {{count}} mjeńšinami" - x_minutes: - one: "1 mjeńšinu" - two: "{{count}} mjeńšinomaj" - few: "{{count}} mjeńšinami" - other: "{{count}} mjeńšinami" - about_x_hours: - one: "něhdźe 1 hodźinu" - two: "něhdźe {{count}} hodźinomaj" - few: "něhdźe {{count}} hodźinami" - other: "něhdźe {{count}} hodźinami" - x_days: - one: "1 dnjom" - two: "{{count}} dnjomaj" - few: "{{count}} dnjemi" - other: "{{count}} dnjemi" - about_x_months: - one: "něhdźe 1 měsacom" - two: "něhdźe {{count}} měsacomaj" - few: "něhdźe {{count}} měsacami" - other: "něhdźe {{count}} měsacami" - x_months: - one: "1 měsacom" - two: "{{count}} měsacomaj" - few: "{{count}} měsacami" - other: "{{count}} měsacami" - about_x_years: - one: "něhdźe 1 lětom" - two: "něhdźe {{count}} lětomaj" - few: "něhdźe {{count}} lětami" - other: "něhdźe {{count}} lětami" - over_x_years: - one: "přez 1 lětom" - two: "přez {{count}} lětomaj" - few: "přez {{count}} lětami" - other: "přez {{count}} lětami" - prompts: - year: "Lěto" - month: "Měsac" - day: "Dźeń" - hour: "Hodźina" - minute: "Mjeńšina" - second: "Sekunda" - - # ActiveRecord validation messages - activerecord: - errors: - messages: - inclusion: "njeje płaćiwa hódnota" - exclusion: "njesteji k dispoziciji" - invalid: "njeje płaćiwy" - confirmation: "njebu wobkrućene" - accepted: "dyrbi so wobkrućić" - empty: "njesmě prózdny być" - blank: "je trěbny" - too_long: - one: "je předołhi (maks. 1 znamješko)" - two: "je předołhi (maks. {{count}} znamješce)" - few: "je předołhi (maks. {{count}} znamješka)" - other: "je předołhi (maks. {{count}} znamješkow)" - too_short: - one: "je překrótki (min. 1 znamješko)" - two: "je překrótki (min. {{count}} znamješće)" - few: "je překrótki (min. {{count}} znamješka)" - other: "je překrótki (min. {{count}} znamješkow)" - wrong_length: - one: "nima prawu dołhosć (1 znamješko wočakowane)" - two: "nima prawu dołhosć ({{count}} znamješce wočakowanej)" - few: "nima prawu dołhosć ({{count}} znamješka wočakowane)" - other: "nima prawu dołhosć ({{count}} znamješkow wočakowanych)" - taken: "je hižo w datowej bance" - not_a_number: "njeje ličba" - greater_than: "dyrbi wjetši hač {{count}} być" - greater_than_or_equal_to: "dyrbi wjetši abo runja {{count}} być" - equal_to: "dyrbi runja {{count}} być" - less_than: "dyrbi mjenje hač {{count}} być" - less_than_or_equal_to: "dyrbi mjenje abo runja {{count}} być" - odd: "dyrbi njeruna ličby być" - even: "dyrbi runa ličba być" - - template: - header: - one: "Při składowanju objekta {{model}} je k zmylkej dóšło a njebě móžno składować" - two: "Při składowanju objekta {{model}} je k {{count}} zmylkam dóšło a njebě móžno składować" - few: "Při składowanju objekta {{model}} je k {{count}} zmylkam dóšło a njebě móžno składować" - other: "Při składowanju objekta {{model}} je k {{count}} zmylkam dóšło a njebě móžno składować" - body: "Prošu přepruwuj slědowace pola:" - - models: +# Upper Sorbian translations for Ruby on Rails +# by Michael Wolf (preklady@wolfmicha.de) + +hsb: + + # ActiveSupport + support: + array: + words_connector: ", " + two_words_connector: " a " + last_word_connector: " a " + sentence_connector: "a" + skip_last_comma: true + + + + # Date + date: + formats: + default: "%d. %m. %Y" + short: "%d %b" + long: "%d. %B %Y" + + day_names: [njedźela, póndźela, wutora, srjeda, štwórtk, pjatk, sobota] + abbr_day_names: [Nj, Pó, Wu, Sr, Št, Pj, So] + month_names: [~, Januar, Februar, Měrc, Apryl, Meja, Junij, Julij, Awgust, September, Oktober, Nowember, December] + abbr_month_names: [~, jan, feb, měr, apr, mej, jun, jul, awg, sep, okt, now, dec] + order: [:day, :month, :year] + + # Time + time: + formats: + default: "%A, %d. %B %Y, %H:%M hodź" + short: "%d. %B, %H:%M hodź." + long: "%A, %d. %B %Y, %H:%M hodź." + + am: "dopołdnja" + pm: "popołdnju" + + + # Numbers + number: + format: + precision: 3 + separator: "," + delimiter: "." + + currency: + format: + unit: "€" + precision: 2 + format: "%n %u" + separator: "," + delimiter: " " + + human: + format: + precision: 1 + delimiter: "" + + storage_units: + format: "%n %u" + units: + byte: + one: "bajt" + two: "bajtaj" + few: "bajty" + other: "bajtow" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + + percentage: + format: + delimiter: "" + + precision: + format: + delimiter: "" + + + # Distance of time ... helper + # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words() + datetime: + distance_in_words: + half_a_minute: "poł mjeńšiny" + less_than_x_seconds: + one: "mjenje hač 1 sekundu" + two: "mjenje hač {{count}} sekundomaj" + few: "mjenje hač {{count}} sekundami" + other: "mjenje hač {{count}} sekundami" + x_seconds: + one: "1 sekundu" + two: "{{count}} sekundomaj" + few: "{{count}} sekundami" + other: "{{count}} sekundami" + less_than_x_minutes: + one: "mjenje hač 1 mjeńšinu" + two: "mjenje hač {{count}} mjeńšinomaj" + few: "mjenje hač {{count}} mjeńšinami" + other: "mjenje hač {{count}} mjeńšinami" + x_minutes: + one: "1 mjeńšinu" + two: "{{count}} mjeńšinomaj" + few: "{{count}} mjeńšinami" + other: "{{count}} mjeńšinami" + about_x_hours: + one: "něhdźe 1 hodźinu" + two: "něhdźe {{count}} hodźinomaj" + few: "něhdźe {{count}} hodźinami" + other: "něhdźe {{count}} hodźinami" + x_days: + one: "1 dnjom" + two: "{{count}} dnjomaj" + few: "{{count}} dnjemi" + other: "{{count}} dnjemi" + about_x_months: + one: "něhdźe 1 měsacom" + two: "něhdźe {{count}} měsacomaj" + few: "něhdźe {{count}} měsacami" + other: "něhdźe {{count}} měsacami" + x_months: + one: "1 měsacom" + two: "{{count}} měsacomaj" + few: "{{count}} měsacami" + other: "{{count}} měsacami" + about_x_years: + one: "něhdźe 1 lětom" + two: "něhdźe {{count}} lětomaj" + few: "něhdźe {{count}} lětami" + other: "něhdźe {{count}} lětami" + over_x_years: + one: "přez 1 lětom" + two: "přez {{count}} lětomaj" + few: "přez {{count}} lětami" + other: "přez {{count}} lětami" + prompts: + year: "Lěto" + month: "Měsac" + day: "Dźeń" + hour: "Hodźina" + minute: "Mjeńšina" + second: "Sekunda" + + # ActiveRecord validation messages + activerecord: + errors: + messages: + inclusion: "njeje płaćiwa hódnota" + exclusion: "njesteji k dispoziciji" + invalid: "njeje płaćiwy" + confirmation: "njebu wobkrućene" + accepted: "dyrbi so wobkrućić" + empty: "njesmě prózdny być" + blank: "je trěbny" + too_long: + one: "je předołhi (maks. 1 znamješko)" + two: "je předołhi (maks. {{count}} znamješce)" + few: "je předołhi (maks. {{count}} znamješka)" + other: "je předołhi (maks. {{count}} znamješkow)" + too_short: + one: "je překrótki (min. 1 znamješko)" + two: "je překrótki (min. {{count}} znamješće)" + few: "je překrótki (min. {{count}} znamješka)" + other: "je překrótki (min. {{count}} znamješkow)" + wrong_length: + one: "nima prawu dołhosć (1 znamješko wočakowane)" + two: "nima prawu dołhosć ({{count}} znamješce wočakowanej)" + few: "nima prawu dołhosć ({{count}} znamješka wočakowane)" + other: "nima prawu dołhosć ({{count}} znamješkow wočakowanych)" + taken: "je hižo w datowej bance" + not_a_number: "njeje ličba" + greater_than: "dyrbi wjetši hač {{count}} być" + greater_than_or_equal_to: "dyrbi wjetši abo runja {{count}} być" + equal_to: "dyrbi runja {{count}} być" + less_than: "dyrbi mjenje hač {{count}} być" + less_than_or_equal_to: "dyrbi mjenje abo runja {{count}} być" + odd: "dyrbi njeruna ličby być" + even: "dyrbi runa ličba być" + + template: + header: + one: "Při składowanju objekta {{model}} je k zmylkej dóšło a njebě móžno składować" + two: "Při składowanju objekta {{model}} je k {{count}} zmylkam dóšło a njebě móžno składować" + few: "Při składowanju objekta {{model}} je k {{count}} zmylkam dóšło a njebě móžno składować" + other: "Při składowanju objekta {{model}} je k {{count}} zmylkam dóšło a njebě móžno składować" + body: "Prošu přepruwuj slědowace pola:" + + models: diff --git a/vendor/plugins/rails-i18n/locale/sk.yml b/vendor/plugins/rails-i18n/locale/sk.yml index 14c6a282e..af659f50a 100644 --- a/vendor/plugins/rails-i18n/locale/sk.yml +++ b/vendor/plugins/rails-i18n/locale/sk.yml @@ -1,139 +1,139 @@ -# Sample localization file for English. Add more files in this directory for other locales. -# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. - -# Slovak translations for Ruby on Rails (inspired by the Czech localization - thanx to Karel Minařík) -# by Jozef Fulop (jofi-rails@silake.com) - -sk: - # ActiveSupport - support: - array: - words_connector: ', ' - two_words_connector: ' a ' - last_word_connector: ' a ' - - # Date - date: - formats: - default: "%d. %m. %Y" - short: "%d %b" - long: "%d. %B %Y" - day_names: [Nedeľa, Pondelok, Utorok, Streda, Štvrtok, Piatok, Sobota] - abbr_day_names: [Ne, Po, Ut, St, Št, Pi, So] - month_names: [~, Január, Február, Marec, Apríl, Máj, Jún, Júl, August, September, Október, November, December] - abbr_month_names: [~, Jan, Feb, Mar, Apr, Máj, Jún, Júl, Aug, Sep, Okt, Nov, Dec] - order: [:day, :month, :year] - - # Time - time: - formats: - default: "%a %d. %B %Y %H:%M %z" - short: "%d. %m. %H:%M" - long: "%A %d. %B %Y %H:%M" - am: 'dopoludnia' - pm: 'popoludní' - - # Numbers - number: - format: - precision: 3 - separator: '.' - delimiter: ',' - currency: - format: - unit: '€' - precision: 2 - format: '%n %u' - separator: "," - delimiter: " " - human: - format: - precision: 1 - delimiter: '' - storage_units: - format: "%n %u" - units: - byte: - other: "B" - one: "B" - kb: "KB" - mb: "MB" - gb: "GB" - tb: "TB" - percentage: - format: - delimiter: '' - precision: - format: - delimiter: '' - - # Distance of time ... helper - datetime: - prompts: - second: "Sekunda" - minute: "Minúta" - hour: "Hodina" - day: "Deň" - month: "Mesiac" - year: "Rok" - distance_in_words: - half_a_minute: 'pol minutou' - less_than_x_seconds: - one: 'asi pred sekundou' - other: 'asi pred {{count}} sekundami' - x_seconds: - one: 'sekundou' - other: '{{count}} sekundami' - less_than_x_minutes: - one: 'pred necelou minútou' - other: 'pred ani nie {{count}} minútami' - x_minutes: - one: 'minútou' - other: '{{count}} minútami' - about_x_hours: - one: 'asi hodinou' - other: 'asi {{count}} hodinami' - x_days: - one: '24 hodinami' - other: '{{count}} dňami' - about_x_months: - one: 'asi mesiacom' - other: 'asi {{count}} mesiacmi' - x_months: - one: 'mesiacom' - other: '{{count}} mesiacmi' - about_x_years: - one: 'asi rokom' - other: 'asi {{count}} rokmi' - over_x_years: - one: 'pred viac ako rokom' - other: 'viac ako {{count}} rokmi' - - # ActiveRecord validation messages - activerecord: - errors: - messages: - inclusion: "nie je v zozname povolených hodnôt" - exclusion: "je vyhradené pre iný účel" - invalid: "nie je platná hodnota" - confirmation: "nebolo potvrdené" - accepted: "musí byť potvrdené" - empty: "nesmie byť prázdný/é" - blank: "je povinná položka" - too_long: "je príliš dlhá/ý (max. {{count}} znakov)" - too_short: "je príliš krátký/á (min. {{count}} znakov)" - wrong_length: "nemá správnu dĺžku (očakáva sa {{count}} znakov)" - taken: "sa už nachádza v databáze" - not_a_number: "nie je číslo" - greater_than: "musí byť väčšíe ako {{count}}" - greater_than_or_equal_to: "musí byť väčšie alebo rovnaké ako {{count}}" - equal_to: "sa musí rovnať {{count}}" - less_than: "musí byť menšie ako {{count}}" - less_than_or_equal_to: "musí byť menšie ako {{count}}" - odd: "musí byť nepárne číslo" - even: "musí byť párne číslo" - template: - header: - one: "Pri ukladaní objektu {{model}} došlo k chybám a nebolo možné objekt uložiť" - other: "Pri ukladaní objektu {{model}} došlo ku {{count}} chybe/ám a nebolo možné objekt uložiť" - body: "Nasledujúce polia obsahujú chybne vyplnené údaje:" +# Sample localization file for English. Add more files in this directory for other locales. +# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. + +# Slovak translations for Ruby on Rails (inspired by the Czech localization - thanx to Karel Minařík) +# by Jozef Fulop (jofi-rails@silake.com) + +sk: + # ActiveSupport + support: + array: + words_connector: ', ' + two_words_connector: ' a ' + last_word_connector: ' a ' + + # Date + date: + formats: + default: "%d. %m. %Y" + short: "%d %b" + long: "%d. %B %Y" + day_names: [Nedeľa, Pondelok, Utorok, Streda, Štvrtok, Piatok, Sobota] + abbr_day_names: [Ne, Po, Ut, St, Št, Pi, So] + month_names: [~, Január, Február, Marec, Apríl, Máj, Jún, Júl, August, September, Október, November, December] + abbr_month_names: [~, Jan, Feb, Mar, Apr, Máj, Jún, Júl, Aug, Sep, Okt, Nov, Dec] + order: [:day, :month, :year] + + # Time + time: + formats: + default: "%a %d. %B %Y %H:%M %z" + short: "%d. %m. %H:%M" + long: "%A %d. %B %Y %H:%M" + am: 'dopoludnia' + pm: 'popoludní' + + # Numbers + number: + format: + precision: 3 + separator: '.' + delimiter: ',' + currency: + format: + unit: '€' + precision: 2 + format: '%n %u' + separator: "," + delimiter: " " + human: + format: + precision: 1 + delimiter: '' + storage_units: + format: "%n %u" + units: + byte: + other: "B" + one: "B" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + percentage: + format: + delimiter: '' + precision: + format: + delimiter: '' + + # Distance of time ... helper + datetime: + prompts: + second: "Sekunda" + minute: "Minúta" + hour: "Hodina" + day: "Deň" + month: "Mesiac" + year: "Rok" + distance_in_words: + half_a_minute: 'pol minutou' + less_than_x_seconds: + one: 'asi pred sekundou' + other: 'asi pred {{count}} sekundami' + x_seconds: + one: 'sekundou' + other: '{{count}} sekundami' + less_than_x_minutes: + one: 'pred necelou minútou' + other: 'pred ani nie {{count}} minútami' + x_minutes: + one: 'minútou' + other: '{{count}} minútami' + about_x_hours: + one: 'asi hodinou' + other: 'asi {{count}} hodinami' + x_days: + one: '24 hodinami' + other: '{{count}} dňami' + about_x_months: + one: 'asi mesiacom' + other: 'asi {{count}} mesiacmi' + x_months: + one: 'mesiacom' + other: '{{count}} mesiacmi' + about_x_years: + one: 'asi rokom' + other: 'asi {{count}} rokmi' + over_x_years: + one: 'pred viac ako rokom' + other: 'viac ako {{count}} rokmi' + + # ActiveRecord validation messages + activerecord: + errors: + messages: + inclusion: "nie je v zozname povolených hodnôt" + exclusion: "je vyhradené pre iný účel" + invalid: "nie je platná hodnota" + confirmation: "nebolo potvrdené" + accepted: "musí byť potvrdené" + empty: "nesmie byť prázdný/é" + blank: "je povinná položka" + too_long: "je príliš dlhá/ý (max. {{count}} znakov)" + too_short: "je príliš krátký/á (min. {{count}} znakov)" + wrong_length: "nemá správnu dĺžku (očakáva sa {{count}} znakov)" + taken: "sa už nachádza v databáze" + not_a_number: "nie je číslo" + greater_than: "musí byť väčšíe ako {{count}}" + greater_than_or_equal_to: "musí byť väčšie alebo rovnaké ako {{count}}" + equal_to: "sa musí rovnať {{count}}" + less_than: "musí byť menšie ako {{count}}" + less_than_or_equal_to: "musí byť menšie ako {{count}}" + odd: "musí byť nepárne číslo" + even: "musí byť párne číslo" + template: + header: + one: "Pri ukladaní objektu {{model}} došlo k chybám a nebolo možné objekt uložiť" + other: "Pri ukladaní objektu {{model}} došlo ku {{count}} chybe/ám a nebolo možné objekt uložiť" + body: "Nasledujúce polia obsahujú chybne vyplnené údaje:" diff --git a/vendor/plugins/validates_email_format_of/MIT-LICENSE b/vendor/plugins/validates_email_format_of/MIT-LICENSE index 1bae24d25..c94752595 100644 --- a/vendor/plugins/validates_email_format_of/MIT-LICENSE +++ b/vendor/plugins/validates_email_format_of/MIT-LICENSE @@ -1,20 +1,20 @@ -Copyright (c) 2006 Alex Dunae - -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. +Copyright (c) 2006 Alex Dunae + +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/vendor/plugins/validates_email_format_of/rails/init.rb b/vendor/plugins/validates_email_format_of/rails/init.rb index a30177232..bdc8b5794 100644 --- a/vendor/plugins/validates_email_format_of/rails/init.rb +++ b/vendor/plugins/validates_email_format_of/rails/init.rb @@ -1 +1 @@ -require 'validates_email_format_of' +require 'validates_email_format_of'