From 83088930fe3b15e1955d29eca3a7066af0831f6f Mon Sep 17 00:00:00 2001 From: Wojciech Todryk Date: Sat, 18 Jun 2011 11:07:09 +0200 Subject: [PATCH 01/88] some changes for rails 2.3.11 --- config/environment.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/config/environment.rb b/config/environment.rb index aed5bc8..d4f6f88 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -4,7 +4,7 @@ # (Use only when you can't set environment variables through your web/app server) # ENV['RAILS_ENV'] = 'production' -RAILS_GEM_VERSION = '2.3.3' unless defined? RAILS_GEM_VERSION +RAILS_GEM_VERSION = '2.3.11' unless defined? RAILS_GEM_VERSION # Bootstrap the Rails environment, frameworks, and default configuration require File.join(File.dirname(__FILE__), 'boot') @@ -14,9 +14,9 @@ Rails::Initializer.run do |config| # config.frameworks -= [ :action_web_service, :action_mailer ] # Add additional load paths for your own custom dirs - config.load_paths += %W( #{RAILS_ROOT}/vendor/ezcrypto-0.1.1/lib ) - config.load_paths += %W( #{RAILS_ROOT}/lib/webmail ) - # Force all environments to use the same logger level + config.autoload_paths += %W( #{RAILS_ROOT}/vendor/ezcrypto-0.1.1/lib ) + config.autoload_paths += %W( #{RAILS_ROOT}/lib/webmail ) + # Force all environments to use the same logger level # (by default production uses :info, the others :debug) # config.log_level = :debug @@ -35,7 +35,7 @@ Rails::Initializer.run do |config| config.active_record.default_timezone = :utc config.i18n.default_locale = "es-ES" - + # Use Active Record's schema dumper instead of SQL when creating the test database # (enables use of different database adapters for development and test environments) # config.active_record.schema_format = :ruby @@ -44,7 +44,7 @@ Rails::Initializer.run do |config| config.action_controller.session = { :session_key => "_mailr_session", :secret => "123456789012345678901234567890" } end -# Add new inflection rules using the following format +# Add new inflection rules using the following format # (all these examples are active by default): # Inflector.inflections do |inflect| # inflect.plural /^(ox)$/i, '\1en' From 7145c6486d6f6e2c090d3e6f9a47a94c6943e938 Mon Sep 17 00:00:00 2001 From: Wojciech Todryk Date: Sat, 18 Jun 2011 13:27:44 +0200 Subject: [PATCH 02/88] some fix for locale,new polish locale --- README | 23 ++-- app/controllers/webmail_controller.rb | 178 ++++++++++++++------------ config/environment.rb | 7 +- config/locales/pl-PL.yml | 70 ++++++++++ lib/webmail/mail2screen.rb | 50 ++++---- 5 files changed, 206 insertions(+), 122 deletions(-) create mode 100644 config/locales/pl-PL.yml diff --git a/README b/README index 6a4374f..c41a035 100644 --- a/README +++ b/README @@ -2,7 +2,7 @@ Installation Guide Requirements - * Ruby 1.8.7 + * Ruby 1.8.7 * Rails 2.3.2 Installation @@ -14,18 +14,21 @@ Installation LOCALCONFIG = { :imap_server => 'your.imap.server' - } + } end 3. Configure SMTP settings # initializers/smtp_settings.rb - ActionMailer::Base.smtp_settings = { - :address => "mail.example.com.py", - :port => 26, - :authentication => :plain, - :enable_starttls_auto => true, - :user_name => "emilio@example.com.py", - :password => "yourpass" + ActionMailer::Base.smtp_settings = { + :address => "mail.example.com.py", + :port => 26, + :authentication => :plain, + :enable_starttls_auto => true, + :user_name => "emilio@example.com.py", + :password => "yourpass" } - 4 Use it + 4. Prepare config/database.yml file (see config/database.yml.example) + 5. Migrate database (rake db:migrate) + + 6. Use it diff --git a/app/controllers/webmail_controller.rb b/app/controllers/webmail_controller.rb index 565d8be..2500697 100644 --- a/app/controllers/webmail_controller.rb +++ b/app/controllers/webmail_controller.rb @@ -6,55 +6,55 @@ require 'ezcrypto' class WebmailController < ApplicationController include ImapUtils - + # Administrative functions before_filter :login_required before_filter :obtain_cookies_for_search_and_nav, :only=>[:messages] before_filter :load_imap_session after_filter :close_imap_session - + layout "public", :except => [:view_source, :download] - + # model :filter, :expression, :mail_pref, :customer - + BOOL_ON = "on" - + def index redirect_to(:action=>"messages") end - + def error_connection end - + def refresh @mailbox.reload @folders = @mailbox.folders redirect_to(:action=>'messages') end - + def messages session["return_to"] = nil @search_field = params['search_field'] @search_value = params['search_value'] - + # handle sorting - tsort session field contains last reverse or no for field # and lsort - last sort field if session['tsort'].nil? or session['lsort'].nil? session['lsort'] = "DATE" session['tsort'] = {"DATE" => true, "FROM" => true, "SUBJECT" => true, "TO" => false} end - + case operation_param when t(:copy) # copy msg_ids = [] - messages_param.each { |msg_id, bool| + messages_param.each { |msg_id, bool| msg_ids << msg_id.to_i if bool == BOOL_ON and dst_folder != @folder_name } if messages_param - folder.copy_multiple(msg_ids, dst_folder) if msg_ids.size > 0 + folder.copy_multiple(msg_ids, dst_folder) if msg_ids.size > 0 when t(:move) # move msg_ids = [] - messages_param.each { |msg_id, bool| + messages_param.each { |msg_id, bool| msg_ids << msg_id.to_i if bool == BOOL_ON and dst_folder != @folder_name } if messages_param - folder.move_multiple(msg_ids, dst_folder) if msg_ids.size > 0 + folder.move_multiple(msg_ids, dst_folder) if msg_ids.size > 0 when t(:delete) # delete msg_ids = [] messages_param.each { |msg_id, bool| msg_ids << msg_id.to_i if bool == BOOL_ON } if messages_param @@ -67,10 +67,10 @@ class WebmailController < ApplicationController session['lsort'] = sort_query = params["scc"] session['tsort'][sort_query] = (session['tsort'][sort_query]? false : true) @search_field, @search_value = session['search_field'], session['search_value'] - when t(:search) # search + when t(:search) # search session['search_field'] = @search_field session['search_value'] = @search_value - when t(:show_all) # search + when t(:show_all) # search session['search_field'] = @search_field = nil session['search_value'] = @search_value = nil else @@ -78,7 +78,7 @@ class WebmailController < ApplicationController @search_field = session['search_field'] @search_value = session['search_value'] end - + sort_query = session['lsort'] reverse_sort = session['tsort'][sort_query] query = ["ALL"] @@ -89,42 +89,50 @@ class WebmailController < ApplicationController @pages = Paginator.new self, 0, get_mail_prefs.wm_rows, @page @messages = folder.messages_search([@search_field, @search_value], sort_query + (reverse_sort ? ' desc' : ' asc')) else + + logger.info "total #{folder.total}" + logger.info "prews #{get_mail_prefs.wm_rows}" + logger.info "@page #{@page.inspect}" + logger.info "========================folder #{folder.messages.count}" + @pages = Paginator.new self, folder.total, get_mail_prefs.wm_rows, @page @messages = folder.messages(@pages.current.first_item - 1, get_mail_prefs.wm_rows, sort_query + (reverse_sort ? ' desc' : ' asc')) + logger.info "========================folder after #{folder.messages.count}" + end - + end - + def delete @msg_id = msg_id_param.to_i folder.delete(@msg_id) redirect_to(:action=>"messages") end - + def reply # not ready at all @msg_id = msg_id_param.to_i @imapmail = folder.message(@msg_id) fb = @imapmail.full_body - @tmail = TMail::Mail.parse(fb) - + @tmail = TMail::Mail.parse(fb) + @mail = prepare_mail @mail.reply(@tmail, fb, get_mail_prefs.mail_type) - + render :action => 'compose' end - + def forward @msg_id = msg_id_param.to_i @imapmail = folder.message(@msg_id) fb = @imapmail.full_body - @tmail = TMail::Mail.parse(fb) - + @tmail = TMail::Mail.parse(fb) + @mail = prepare_mail @mail.forward(@tmail, fb) - + render :action => 'compose' end - + def compose if @mail.nil? operation = operation_param @@ -133,13 +141,13 @@ class WebmailController < ApplicationController encmail = @mail.send_mail get_imap_session @mailbox.message_sent(encmail) - + # delete temporary files (attachments) @mail.delete_attachments() render :action => :mailsent elsif operation == t(:add) @mail = create_mail - if params['attachment'] + if params['attachment'] attachment = CDF::Attachment.new(@mail) attachment.file = params['attachment'] end @@ -149,7 +157,7 @@ class WebmailController < ApplicationController end end end - + def empty # empty trash folder (works for any one else :-)) folder.messages(0, -1).each{ |message| folder.delete(message) @@ -157,50 +165,50 @@ class WebmailController < ApplicationController folder.expunge redirect_to(:action=>"messages") end - + def message @msg_id = msg_id_param @imapmail = folder.message(@msg_id) folder.mark_read(@imapmail.uid) if @imapmail.unread @mail = TMail::Mail.parse(@imapmail.full_body) end - + def download msg_id = msg_id_param imapmail = folder.message(msg_id) - mail = TMail::Mail.parse(imapmail.full_body) - + mail = TMail::Mail.parse(imapmail.full_body) + if mail.multipart? - get_parts(mail).each { |part| - return send_part(part) if part.header and part.header['content-type']['name'] == params['ctype'] + get_parts(mail).each { |part| + return send_part(part) if part.header and part.header['content-type']['name'] == params['ctype'] } render("webmail/noattachment") - else + else render("webmail/noattachment") - end + end end - + def prefs @customer = Customer.find(logged_customer) @mailpref = MailPref.find_or_create_by_customer_id logged_customer - + if params['op'] == _('Save') if params['customer'] @customer.fname = params['customer']['fname'] @customer.lname = params['customer']['lname'] @customer.save end - @mailpref.attributes = params["mailpref"] + @mailpref.attributes = params["mailpref"] @mailpref.save session["wmimapseskey"] = nil redirect_to(:action=>"messages") end end - + # Message filters management def filters end - + def filter if params['op'] @filter = Filter.new(params['filter']) @@ -209,7 +217,7 @@ class WebmailController < ApplicationController case params['op'] when _('Add') @filter.expressions << Expression.new - when _('Save') + when _('Save') if params['filter']['id'] and params['filter']['id'] != "" @sf = Filter.find(params['filter']['id']) @sf.name, @sf.destination_folder = @filter.name, @filter.destination_folder @@ -228,11 +236,11 @@ class WebmailController < ApplicationController @expressions = @filter.expressions else @filter = Filter.find(params["id"]) if params["id"] - @expressions = @filter.expressions + @expressions = @filter.expressions end @destfolders = get_to_folders end - + def filter_delete Filter.delete(params["id"]) # reindex other filters @@ -246,7 +254,7 @@ class WebmailController < ApplicationController @user.serialize_to_file redirect_to :action=>"filters" end - + def filter_up filt = @user.filters.find(params['id']) ufilt = @user.filters.find_all("order_num = #{filt.order_num - 1}").first @@ -257,7 +265,7 @@ class WebmailController < ApplicationController @user.serialize_to_file redirect_to :action=>"filters" end - + def filter_down filt = Filter.find(params["id"]) dfilt = @user.filters[filt.order_num] @@ -268,7 +276,7 @@ class WebmailController < ApplicationController @user.serialize_to_file redirect_to :action=>"filters" end - + def filter_add @filter = Filter.new @filter.expressions << Expression.new @@ -277,58 +285,58 @@ class WebmailController < ApplicationController render "filter" end # end of filters - + def view_source @msg_id = msg_id_param.to_i @imapmail = folder.message(@msg_id) @msg_source = CGI.escapeHTML(@imapmail.full_body).gsub("\n", "
") end - + def auto_complete_for_mail_to auto_complete_responder_for_contacts params[:mail][:to] end - + def auto_complete_for_mail_cc auto_complete_responder_for_contacts params[:mail][:cc] end - + def auto_complete_for_mail_bcc auto_complete_responder_for_contacts params[:mail][:bcc] end - + private - + def auto_complete_responder_for_contacts(value) # first split by "," and take last name searchName = value.split(',').last.strip - + # if there are 2 names search by them if searchName.split.size > 1 fname, lname = searchName.split.first, searchName.split.last conditions = ['customer_id = ? and LOWER(fname) LIKE ? and LOWER(lname) like ?', logged_customer, fname.downcase + '%', lname.downcase + '%'] else conditions = ['customer_id = ? and LOWER(fname) LIKE ?', logged_customer, searchName.downcase + '%'] - end + end @contacts = Contact.find(:all, :conditions => conditions, :order => 'fname ASC',:limit => 8) render :partial => 'contacts' end - + protected - + def additional_scripts() @additional_css = ["webmail/webmail"] @additional_js = ["webmail"] end - + private - + def get_to_folders res = Array.new @folders.each{|f| res << f unless f.name == CDF::CONFIG[:mail_sent] or f.name == CDF::CONFIG[:mail_inbox] } res end - - + + def create_mail m = CDF::Mail.new(user.mail_temporary_path) if params["mail"] @@ -343,24 +351,24 @@ class WebmailController < ApplicationController end else m.from, m.content_type = user.friendlly_local_email, get_mail_prefs.mail_type - end + end m.customer_id = logged_customer m end - + def prepare_mail m = CDF::Mail.new(user.mail_temporary_path) m.from, m.content_type = user.friendlly_local_email, get_mail_prefs.mail_type m end - - + + def send_part(part) if part.content_type == "text/html" disposition = "inline" elsif part.content_type.include?("image/") - disposition = "inline" - else + disposition = "inline" + else disposition = "attachment" end headers['Content-Length'] = part.body.size @@ -369,48 +377,48 @@ class WebmailController < ApplicationController headers['Content-Disposition'] = disposition << %(; filename="#{part.header['content-type']['name']}") render :text => part.body end - + def get_parts(mail) parts = Array.new parts << mail - mail.parts.each { |part| + mail.parts.each { |part| if part.multipart? - parts = parts.concat(get_parts(part)) + parts = parts.concat(get_parts(part)) elsif part.content_type and part.content_type.include?("rfc822") parts = parts.concat(get_parts(TMail::Mail.parse(part.body))) << part - else + else parts << part end - } - parts + } + parts end - + def obtain_cookies_for_search_and_nav @srch_class = ((cookies['_wmlms'] and cookies['_wmlms'] == 'closed') ? 'closed' : 'open') - @srch_img_src = ((cookies['_wmlms'] and cookies['_wmlms'] == 'closed') ? 'closed' : 'opened') + @srch_img_src = ((cookies['_wmlms'] and cookies['_wmlms'] == 'closed') ? 'closed' : 'opened') @ops_class = ((cookies['_wmlmo'] and cookies['_wmlmo'] == 'closed') ? 'closed' : 'open') - @ops_img_src = ((cookies['_wmlmo'] and cookies['_wmlmo'] == 'closed') ? 'closed' : 'opened') - end - + @ops_img_src = ((cookies['_wmlmo'] and cookies['_wmlmo'] == 'closed') ? 'closed' : 'opened') + end + ################################################################### ### Some fixed parameters and session variables ################################################################### def folder @folders[@folder_name] end - + def msg_id_param params["msg_id"] end - + def messages_param params["messages"] end - + def dst_folder params["cpdest"] end - + def operation_param params["op"] end diff --git a/config/environment.rb b/config/environment.rb index d4f6f88..f134880 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -4,7 +4,7 @@ # (Use only when you can't set environment variables through your web/app server) # ENV['RAILS_ENV'] = 'production' -RAILS_GEM_VERSION = '2.3.11' unless defined? RAILS_GEM_VERSION +#RAILS_GEM_VERSION = '2.3.11' unless defined? RAILS_GEM_VERSION # Bootstrap the Rails environment, frameworks, and default configuration require File.join(File.dirname(__FILE__), 'boot') @@ -34,7 +34,7 @@ Rails::Initializer.run do |config| # Make Active Record use UTC-base instead of local time config.active_record.default_timezone = :utc - config.i18n.default_locale = "es-ES" + #config.i18n.default_locale = "en" # Use Active Record's schema dumper instead of SQL when creating the test database # (enables use of different database adapters for development and test environments) @@ -65,6 +65,9 @@ rescue LoadError STDERR.puts 'WARNING: config/site.rb not found, using default settings from ' + default_config_path end +#if CONFIG[:locale] is nil then I18n.default_locale will be used +I18n.default_locale = CDF::CONFIG[:locale] + require 'tmail_patch' $KCODE = 'u' require 'jcode' diff --git a/config/locales/pl-PL.yml b/config/locales/pl-PL.yml new file mode 100644 index 0000000..9435a5b --- /dev/null +++ b/config/locales/pl-PL.yml @@ -0,0 +1,70 @@ +pl-PL: + mailr: Mailr + email: E-mail + password: Hasło + log_in: Zaloguj + wrong_email_or_password: Podano nieprawidłowy login lub hasło. + mailbox: Poczta + folders: Foldery + folder: Folder + empty: Pusty + logout: Wyloguj + compose: Nowa wiadomość + preferences: Ustawienia + filters: Filtry + contacts: Kontakty + search: Szukaj + search_txt: Szukaj w polu wiadomości + refresh: Odśwież + operations: Akcje + operations_txt: Akcje na zaznaczonych wiadomościach + delete: Usuń + copy: Skopiuj + move: Przenieś + mark_read: Zaznacz jako przeczytane + mark_unread: Zaznacz jako nieprzeczytane + destination_txt: Miejsce docelowe dla akcji + for: ciągu znaków + to: Do + subject: Temat + date: Data + size: Rozmiar + from: Od + show_all: Pokaż wszystkie + pages: Strony + first: Pierwsza + prev: Poprzednia + next: Następna + last: Ostatnia + back_to_list: Powrót do listy + back_to_message: Powrót do wiadomości + reply: Odpowiedz + forward: Przekaż + delete: Usuń + view_source: Pokaż źródło + add_filter: Dodaj filtr + cc: Cc + bcc: Bcc + send: Wyslij + choose_address: Wybierz adres z kontaktów + compose_txt: Utwórz nową wiadomość + attachment: Załącznik + add: Dodaj + first_name: Imię + last_name: Nazwisko + send_type: Format wiadomości wychodzącej + messages_per_page: Ilość wiadomości na stronie + check_external_mail: Check external mail? + check_external_mail_txt: Note that by selecting this option webmail system will try to log you using your original email on a local server. + save: Zapisz + cancel: Anuluj + add_one_contact: Dodaj jeden kontakt + add_multiple: Dodaj wiele + name: Nazwa + add_folder: Dodaj folder + total_messages: Total messages + unseen: Unseen + add_edit_folder: Zarządzanie folderami + user_logged_out: Użytkownik został wylogowany + please_login: Logowanie + add_to_contacts: Dodaj do kontaktów diff --git a/lib/webmail/mail2screen.rb b/lib/webmail/mail2screen.rb index 0ded836..5504cc0 100644 --- a/lib/webmail/mail2screen.rb +++ b/lib/webmail/mail2screen.rb @@ -3,7 +3,7 @@ module Mail2Screen def mail2html(mail, msg_id) footer = "" parsed_body = create_body(mail, msg_id, footer) - + ret = "\n" ret << "\n" ret << " \n" @@ -14,7 +14,7 @@ module Mail2Screen if @mail.bcc_addrs ret << " \n" end - ret << " \n" if footer != '' ret << " \n" @@ -26,7 +26,7 @@ module Mail2Screen ret << parsed_body ret << "\n" end - + def create_body(mail, msg_id, footer) charset = (mail.charset.nil? ? 'iso-8859-1' : mail.charset) if mail.multipart? @@ -38,7 +38,7 @@ module Mail2Screen ret << create_body(part, msg_id, footer) end } - return ret + return ret else mail.parts.each { |part| if part.multipart? @@ -55,13 +55,13 @@ module Mail2Screen elsif part.content_type.include?("image/") ctype = part.header['content-type'] ret << add_image(ctype, msg_id) - elsif part.content_type.include?("message/rfc822") + elsif part.content_type.include?("message/rfc822") ret << "
#{_('Follows attached message')}:
" << mail2html(TMail::Mail.parse(part.body), msg_id) end end } return ret - end + end else ret = "" if mail.content_type == "text/plain" or mail.content_type.nil? @@ -72,24 +72,24 @@ module Mail2Screen return ret end end - + def add_text(part, encoding, charset) - CGI.escapeHTML(decode_part_text("#{part}", encoding, charset)).gsub(/\r\n/,"
").gsub(/\r/, "
").gsub(/\n/,"
") + CGI.escapeHTML(decode_part_text("#{part}", encoding, charset)).gsub(/\r\n/,"
").gsub(/\r/, "
").gsub(/\n/,"
") end - def add_html(part, encoding, charset) + def add_html(part, encoding, charset) strip_html(decode_part_text("#{part}", encoding, charset)) end - + def decode_part_text(part_str, encoding, charset) # Parse mail header, text = "", "" - + # Get header and body #Content-type: text/plain; charset="ISO-8859-1" - #Content-transfer-encoding: quoted-printable + #Content-transfer-encoding: quoted-printable isBody = false - part_str.each_line { |line| + part_str.each_line { |line| if isBody text << line else @@ -105,7 +105,7 @@ module Mail2Screen ret = from_qp(text) elsif not(encoding.nil?) and encoding.downcase == "base64" ret = "#{text.unpack("m")}" - else + else ret = text end # manage charset @@ -118,9 +118,9 @@ module Mail2Screen RAILS_DEFAULT_LOGGER.debug("Exception occured #{ex}\n#{ex.backtrace.join('\n')}") return ret end - end + end end - + def add_attachment(content_type, msg_id) filename = (content_type.nil? or content_type['name'].nil? ? "" : content_type['name']) if filename == "" @@ -129,28 +129,28 @@ module Mail2Screen " #{filename}" end end - + def add_image(content_type, msg_id) filename = (content_type.nil? or content_type['name'].nil? ? "" : content_type['name']) "

#{filename}
" end - + def friendly_address(addr) addr.kind_of?(Net::IMAP::Address) ? ((addr.name.nil? or addr.name.strip == "") ? "#{addr.mailbox}@#{addr.host}" : "#{(mime_encoded?(addr.name.strip) ? mime_decode(addr.name.to_s): addr.name.to_s)}<#{addr.mailbox}@#{addr.host}>") : ((addr.name.nil? or addr.name.strip == "") ? "#{addr.spec}" : "#{(mime_encoded?(addr.name.strip) ? mime_decode(addr.name.to_s): addr.name.to_s)}<#{addr.spec}>") end - + def friendly_address_or_name(addr) - if addr.kind_of?(Net::IMAP::Address) - ((addr.name.nil? or addr.name.to_s == "") ? "#{addr.mailbox}@#{addr.host}" : (mime_encoded?(addr.name.to_s) ? mime_decode(addr.name.to_s): addr.name.to_s)) + if addr.kind_of?(Net::IMAP::Address) + ((addr.name.nil? or addr.name.to_s == "") ? "#{addr.mailbox}@#{addr.host}" : (mime_encoded?(addr.name.to_s) ? mime_decode(addr.name.to_s): addr.name.to_s)) else ((addr.nil? or addr.to_s == "") ? "#{addr.to_s}" : (mime_encoded?(addr.to_s) ? mime_decode(addr.to_s): addr.to_s)) end end - + def add_to_contact(addr, msg_id) - " Agregar a contactos" + " "+t(:add_to_contacts) end - + def short_address(addresses) ret = "" addresses.each { |addr| #split(/,\s*/) @@ -159,7 +159,7 @@ module Mail2Screen } unless addresses.nil? ret end - + def address(addresses, msg_id) ret = "" addresses.each { |addr| #split(/,\s*/) From 860fc1479e78a799239a384e73957781caff0b01 Mon Sep 17 00:00:00 2001 From: Wojciech Todryk Date: Sat, 18 Jun 2011 19:24:50 +0200 Subject: [PATCH 03/88] return to rails 2.3.3 --- config/environment.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/config/environment.rb b/config/environment.rb index f134880..1df597d 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -2,7 +2,8 @@ # Uncomment below to force Rails into production mode # (Use only when you can't set environment variables through your web/app server) -# ENV['RAILS_ENV'] = 'production' + +ENV['RAILS_ENV'] = 'production' #RAILS_GEM_VERSION = '2.3.11' unless defined? RAILS_GEM_VERSION @@ -14,8 +15,8 @@ Rails::Initializer.run do |config| # config.frameworks -= [ :action_web_service, :action_mailer ] # Add additional load paths for your own custom dirs - config.autoload_paths += %W( #{RAILS_ROOT}/vendor/ezcrypto-0.1.1/lib ) - config.autoload_paths += %W( #{RAILS_ROOT}/lib/webmail ) + config.load_paths += %W( #{RAILS_ROOT}/vendor/ezcrypto-0.1.1/lib ) + config.load_paths += %W( #{RAILS_ROOT}/lib/webmail ) # Force all environments to use the same logger level # (by default production uses :info, the others :debug) # config.log_level = :debug From cf56c7555a8da4f4383133decd7dc27c6f4ad2b4 Mon Sep 17 00:00:00 2001 From: Wojciech Todryk Date: Sat, 18 Jun 2011 19:26:24 +0200 Subject: [PATCH 04/88] some fixes to locale --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 38c4877..510568f 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ config/site.rb tmp mail_temp config/site.rb +.svn From 0ec83db287f106e91f388a357607bbafbae9013d Mon Sep 17 00:00:00 2001 From: Wojciech Todryk Date: Sun, 19 Jun 2011 10:55:37 +0200 Subject: [PATCH 05/88] devel --- app/controllers/webmail_controller.rb | 178 ++++++++++++-------------- config/environment.rb | 7 +- config/locales/pl-PL.yml | 2 +- 3 files changed, 89 insertions(+), 98 deletions(-) diff --git a/app/controllers/webmail_controller.rb b/app/controllers/webmail_controller.rb index 2500697..565d8be 100644 --- a/app/controllers/webmail_controller.rb +++ b/app/controllers/webmail_controller.rb @@ -6,55 +6,55 @@ require 'ezcrypto' class WebmailController < ApplicationController include ImapUtils - + # Administrative functions before_filter :login_required before_filter :obtain_cookies_for_search_and_nav, :only=>[:messages] before_filter :load_imap_session after_filter :close_imap_session - + layout "public", :except => [:view_source, :download] - + # model :filter, :expression, :mail_pref, :customer - + BOOL_ON = "on" - + def index redirect_to(:action=>"messages") end - + def error_connection end - + def refresh @mailbox.reload @folders = @mailbox.folders redirect_to(:action=>'messages') end - + def messages session["return_to"] = nil @search_field = params['search_field'] @search_value = params['search_value'] - + # handle sorting - tsort session field contains last reverse or no for field # and lsort - last sort field if session['tsort'].nil? or session['lsort'].nil? session['lsort'] = "DATE" session['tsort'] = {"DATE" => true, "FROM" => true, "SUBJECT" => true, "TO" => false} end - + case operation_param when t(:copy) # copy msg_ids = [] - messages_param.each { |msg_id, bool| + messages_param.each { |msg_id, bool| msg_ids << msg_id.to_i if bool == BOOL_ON and dst_folder != @folder_name } if messages_param - folder.copy_multiple(msg_ids, dst_folder) if msg_ids.size > 0 + folder.copy_multiple(msg_ids, dst_folder) if msg_ids.size > 0 when t(:move) # move msg_ids = [] - messages_param.each { |msg_id, bool| + messages_param.each { |msg_id, bool| msg_ids << msg_id.to_i if bool == BOOL_ON and dst_folder != @folder_name } if messages_param - folder.move_multiple(msg_ids, dst_folder) if msg_ids.size > 0 + folder.move_multiple(msg_ids, dst_folder) if msg_ids.size > 0 when t(:delete) # delete msg_ids = [] messages_param.each { |msg_id, bool| msg_ids << msg_id.to_i if bool == BOOL_ON } if messages_param @@ -67,10 +67,10 @@ class WebmailController < ApplicationController session['lsort'] = sort_query = params["scc"] session['tsort'][sort_query] = (session['tsort'][sort_query]? false : true) @search_field, @search_value = session['search_field'], session['search_value'] - when t(:search) # search + when t(:search) # search session['search_field'] = @search_field session['search_value'] = @search_value - when t(:show_all) # search + when t(:show_all) # search session['search_field'] = @search_field = nil session['search_value'] = @search_value = nil else @@ -78,7 +78,7 @@ class WebmailController < ApplicationController @search_field = session['search_field'] @search_value = session['search_value'] end - + sort_query = session['lsort'] reverse_sort = session['tsort'][sort_query] query = ["ALL"] @@ -89,50 +89,42 @@ class WebmailController < ApplicationController @pages = Paginator.new self, 0, get_mail_prefs.wm_rows, @page @messages = folder.messages_search([@search_field, @search_value], sort_query + (reverse_sort ? ' desc' : ' asc')) else - - logger.info "total #{folder.total}" - logger.info "prews #{get_mail_prefs.wm_rows}" - logger.info "@page #{@page.inspect}" - logger.info "========================folder #{folder.messages.count}" - @pages = Paginator.new self, folder.total, get_mail_prefs.wm_rows, @page @messages = folder.messages(@pages.current.first_item - 1, get_mail_prefs.wm_rows, sort_query + (reverse_sort ? ' desc' : ' asc')) - logger.info "========================folder after #{folder.messages.count}" - end - + end - + def delete @msg_id = msg_id_param.to_i folder.delete(@msg_id) redirect_to(:action=>"messages") end - + def reply # not ready at all @msg_id = msg_id_param.to_i @imapmail = folder.message(@msg_id) fb = @imapmail.full_body - @tmail = TMail::Mail.parse(fb) - + @tmail = TMail::Mail.parse(fb) + @mail = prepare_mail @mail.reply(@tmail, fb, get_mail_prefs.mail_type) - + render :action => 'compose' end - + def forward @msg_id = msg_id_param.to_i @imapmail = folder.message(@msg_id) fb = @imapmail.full_body - @tmail = TMail::Mail.parse(fb) - + @tmail = TMail::Mail.parse(fb) + @mail = prepare_mail @mail.forward(@tmail, fb) - + render :action => 'compose' end - + def compose if @mail.nil? operation = operation_param @@ -141,13 +133,13 @@ class WebmailController < ApplicationController encmail = @mail.send_mail get_imap_session @mailbox.message_sent(encmail) - + # delete temporary files (attachments) @mail.delete_attachments() render :action => :mailsent elsif operation == t(:add) @mail = create_mail - if params['attachment'] + if params['attachment'] attachment = CDF::Attachment.new(@mail) attachment.file = params['attachment'] end @@ -157,7 +149,7 @@ class WebmailController < ApplicationController end end end - + def empty # empty trash folder (works for any one else :-)) folder.messages(0, -1).each{ |message| folder.delete(message) @@ -165,50 +157,50 @@ class WebmailController < ApplicationController folder.expunge redirect_to(:action=>"messages") end - + def message @msg_id = msg_id_param @imapmail = folder.message(@msg_id) folder.mark_read(@imapmail.uid) if @imapmail.unread @mail = TMail::Mail.parse(@imapmail.full_body) end - + def download msg_id = msg_id_param imapmail = folder.message(msg_id) - mail = TMail::Mail.parse(imapmail.full_body) - + mail = TMail::Mail.parse(imapmail.full_body) + if mail.multipart? - get_parts(mail).each { |part| - return send_part(part) if part.header and part.header['content-type']['name'] == params['ctype'] + get_parts(mail).each { |part| + return send_part(part) if part.header and part.header['content-type']['name'] == params['ctype'] } render("webmail/noattachment") - else + else render("webmail/noattachment") - end + end end - + def prefs @customer = Customer.find(logged_customer) @mailpref = MailPref.find_or_create_by_customer_id logged_customer - + if params['op'] == _('Save') if params['customer'] @customer.fname = params['customer']['fname'] @customer.lname = params['customer']['lname'] @customer.save end - @mailpref.attributes = params["mailpref"] + @mailpref.attributes = params["mailpref"] @mailpref.save session["wmimapseskey"] = nil redirect_to(:action=>"messages") end end - + # Message filters management def filters end - + def filter if params['op'] @filter = Filter.new(params['filter']) @@ -217,7 +209,7 @@ class WebmailController < ApplicationController case params['op'] when _('Add') @filter.expressions << Expression.new - when _('Save') + when _('Save') if params['filter']['id'] and params['filter']['id'] != "" @sf = Filter.find(params['filter']['id']) @sf.name, @sf.destination_folder = @filter.name, @filter.destination_folder @@ -236,11 +228,11 @@ class WebmailController < ApplicationController @expressions = @filter.expressions else @filter = Filter.find(params["id"]) if params["id"] - @expressions = @filter.expressions + @expressions = @filter.expressions end @destfolders = get_to_folders end - + def filter_delete Filter.delete(params["id"]) # reindex other filters @@ -254,7 +246,7 @@ class WebmailController < ApplicationController @user.serialize_to_file redirect_to :action=>"filters" end - + def filter_up filt = @user.filters.find(params['id']) ufilt = @user.filters.find_all("order_num = #{filt.order_num - 1}").first @@ -265,7 +257,7 @@ class WebmailController < ApplicationController @user.serialize_to_file redirect_to :action=>"filters" end - + def filter_down filt = Filter.find(params["id"]) dfilt = @user.filters[filt.order_num] @@ -276,7 +268,7 @@ class WebmailController < ApplicationController @user.serialize_to_file redirect_to :action=>"filters" end - + def filter_add @filter = Filter.new @filter.expressions << Expression.new @@ -285,58 +277,58 @@ class WebmailController < ApplicationController render "filter" end # end of filters - + def view_source @msg_id = msg_id_param.to_i @imapmail = folder.message(@msg_id) @msg_source = CGI.escapeHTML(@imapmail.full_body).gsub("\n", "
") end - + def auto_complete_for_mail_to auto_complete_responder_for_contacts params[:mail][:to] end - + def auto_complete_for_mail_cc auto_complete_responder_for_contacts params[:mail][:cc] end - + def auto_complete_for_mail_bcc auto_complete_responder_for_contacts params[:mail][:bcc] end - + private - + def auto_complete_responder_for_contacts(value) # first split by "," and take last name searchName = value.split(',').last.strip - + # if there are 2 names search by them if searchName.split.size > 1 fname, lname = searchName.split.first, searchName.split.last conditions = ['customer_id = ? and LOWER(fname) LIKE ? and LOWER(lname) like ?', logged_customer, fname.downcase + '%', lname.downcase + '%'] else conditions = ['customer_id = ? and LOWER(fname) LIKE ?', logged_customer, searchName.downcase + '%'] - end + end @contacts = Contact.find(:all, :conditions => conditions, :order => 'fname ASC',:limit => 8) render :partial => 'contacts' end - + protected - + def additional_scripts() @additional_css = ["webmail/webmail"] @additional_js = ["webmail"] end - + private - + def get_to_folders res = Array.new @folders.each{|f| res << f unless f.name == CDF::CONFIG[:mail_sent] or f.name == CDF::CONFIG[:mail_inbox] } res end - - + + def create_mail m = CDF::Mail.new(user.mail_temporary_path) if params["mail"] @@ -351,24 +343,24 @@ class WebmailController < ApplicationController end else m.from, m.content_type = user.friendlly_local_email, get_mail_prefs.mail_type - end + end m.customer_id = logged_customer m end - + def prepare_mail m = CDF::Mail.new(user.mail_temporary_path) m.from, m.content_type = user.friendlly_local_email, get_mail_prefs.mail_type m end - - + + def send_part(part) if part.content_type == "text/html" disposition = "inline" elsif part.content_type.include?("image/") - disposition = "inline" - else + disposition = "inline" + else disposition = "attachment" end headers['Content-Length'] = part.body.size @@ -377,48 +369,48 @@ class WebmailController < ApplicationController headers['Content-Disposition'] = disposition << %(; filename="#{part.header['content-type']['name']}") render :text => part.body end - + def get_parts(mail) parts = Array.new parts << mail - mail.parts.each { |part| + mail.parts.each { |part| if part.multipart? - parts = parts.concat(get_parts(part)) + parts = parts.concat(get_parts(part)) elsif part.content_type and part.content_type.include?("rfc822") parts = parts.concat(get_parts(TMail::Mail.parse(part.body))) << part - else + else parts << part end - } - parts + } + parts end - + def obtain_cookies_for_search_and_nav @srch_class = ((cookies['_wmlms'] and cookies['_wmlms'] == 'closed') ? 'closed' : 'open') - @srch_img_src = ((cookies['_wmlms'] and cookies['_wmlms'] == 'closed') ? 'closed' : 'opened') + @srch_img_src = ((cookies['_wmlms'] and cookies['_wmlms'] == 'closed') ? 'closed' : 'opened') @ops_class = ((cookies['_wmlmo'] and cookies['_wmlmo'] == 'closed') ? 'closed' : 'open') - @ops_img_src = ((cookies['_wmlmo'] and cookies['_wmlmo'] == 'closed') ? 'closed' : 'opened') - end - + @ops_img_src = ((cookies['_wmlmo'] and cookies['_wmlmo'] == 'closed') ? 'closed' : 'opened') + end + ################################################################### ### Some fixed parameters and session variables ################################################################### def folder @folders[@folder_name] end - + def msg_id_param params["msg_id"] end - + def messages_param params["messages"] end - + def dst_folder params["cpdest"] end - + def operation_param params["op"] end diff --git a/config/environment.rb b/config/environment.rb index 1df597d..7390e53 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -2,10 +2,9 @@ # Uncomment below to force Rails into production mode # (Use only when you can't set environment variables through your web/app server) +# ENV['RAILS_ENV'] = 'production' -ENV['RAILS_ENV'] = 'production' - -#RAILS_GEM_VERSION = '2.3.11' unless defined? RAILS_GEM_VERSION +#RAILS_GEM_VERSION = '2.3.3' unless defined? RAILS_GEM_VERSION # Bootstrap the Rails environment, frameworks, and default configuration require File.join(File.dirname(__FILE__), 'boot') @@ -35,7 +34,7 @@ Rails::Initializer.run do |config| # Make Active Record use UTC-base instead of local time config.active_record.default_timezone = :utc - #config.i18n.default_locale = "en" + config.i18n.default_locale = "en" # Use Active Record's schema dumper instead of SQL when creating the test database # (enables use of different database adapters for development and test environments) diff --git a/config/locales/pl-PL.yml b/config/locales/pl-PL.yml index 9435a5b..dd7f194 100644 --- a/config/locales/pl-PL.yml +++ b/config/locales/pl-PL.yml @@ -45,7 +45,7 @@ pl-PL: add_filter: Dodaj filtr cc: Cc bcc: Bcc - send: Wyslij + send: Wyślij choose_address: Wybierz adres z kontaktów compose_txt: Utwórz nową wiadomość attachment: Załącznik From 8cc24cb8cfa85c22afe924d2d1f6929d2c468ce8 Mon Sep 17 00:00:00 2001 From: Luben Manolov Date: Thu, 23 Jun 2011 18:39:46 +0300 Subject: [PATCH 06/88] Unlicense the project --- AUTHORS | 5 + CHANGELOG | 718 ---------------------------------------------------- MIT-LICENSE | 23 -- UNLICENSE | 24 ++ 4 files changed, 29 insertions(+), 741 deletions(-) create mode 100644 AUTHORS delete mode 100644 CHANGELOG delete mode 100644 MIT-LICENSE create mode 100644 UNLICENSE diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..d291795 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,5 @@ +* Luben Manolov +* Nick Penkov +* Eugene Korbut +* Emilio Blanco +* Wojciech Todryk diff --git a/CHANGELOG b/CHANGELOG deleted file mode 100644 index 18b4288..0000000 --- a/CHANGELOG +++ /dev/null @@ -1,718 +0,0 @@ -*0.14.2 (RC3)* (October 26th, 2005) - -* Constants set in the development/test/production environment file are set in Object - -* Scaffold generator pays attention to the controller name. #2562 [self@mattmower.com] - -* Include tasks from vendor/plugins/*/tasks in the Rakefile #2545 [Rick Olson] - - -*0.14.1 (RC2)* (October 19th, 2005) - -* Don't clean RAILS_ROOT on windows - -* Remove trailing '/' from RAILS_ROOT [Nicholas Seckar] - -* Upgraded to Active Record 1.12.1 and Action Pack 1.10.1 - - -*0.14.0 (RC1)* (October 16th, 2005) - -* Moved generator folder from RAILS_ROOT/generators to RAILS_ROOT/lib/generators [Tobias Luetke] - -* Fix rake dev and related commands [Nicholas Seckar] - -* The rails command tries to deduce your MySQL socket by running `mysql_config ---socket`. If it fails, default to /path/to/your/mysql.sock - -* Made the rails command use the application name for database names in the tailored database.yml file. Example: "rails ~/projects/blog" will use "blog_development" instead of "rails_development". [Florian Weber] - -* Added Rails framework freezing tasks: freeze_gems (freeze to current gems), freeze_edge (freeze to Rails SVN trunk), unfreeze_rails (float with newest gems on system) - -* Added update_javascripts task which will fetch all the latest js files from your current rails install. Use after updating rails. [Tobias Luetke] - -* Added cleaning of RAILS_ROOT to useless elements such as '../non-dot-dot/'. Provides cleaner backtraces and error messages. [Nicholas Seckar] - -* Made the instantiated/transactional fixtures settings be controlled through Rails::Initializer. Transactional and non-instantiated fixtures are default from now on. [Florian Weber] - -* Support using different database adapters for development and test with ActiveRecord::Base.schema_format = :ruby [Sam Stephenson] - -* Make webrick work with session(:off) - -* Add --version, -v option to the Rails command. Closes #1840. [stancell] - -* Update Prototype to V1.4.0_pre11, script.aculo.us to V1.5_rc3 [2504] and fix the rails generator to include the new .js files [Thomas Fuchs] - -* Make the generator skip a file if it already exists and is identical to the new file. - -* Add experimental plugin support #2335 - -* Made Rakefile aware of new .js files in script.aculo.us [Thomas Fuchs] - -* Make table_name and controller_name in generators honor AR::Base.pluralize_table_names. #1216 #2213 [kazuhiko@fdiary.net] - -* Clearly label functional and unit tests in rake stats output. #2297 [lasse.koskela@gmail.com] - -* Make the migration generator only check files ending in *.rb when calculating the next file name #2317 [Chad Fowler] - -* Added prevention of duplicate migrations from the generator #2240 [fbeausoleil@ftml.net] - -* Add db_schema_dump and db_schema_import rake tasks to work with the new ActiveRecord::SchemaDumper (for dumping a schema to and reading a schema from a ruby file). - -* Reformed all the config/environments/* files to conform to the new Rails::Configuration approach. Fully backwards compatible. - -* Added create_sessions_table, drop_sessions_table, and purge_sessions_table as rake tasks for databases that supports migrations (MySQL, PostgreSQL, SQLite) to get a table for use with CGI::Session::ActiveRecordStore - -* Added dump of schema version to the db_structure_dump task for databases that support migrations #1835 [Rick Olson] - -* Fixed script/profiler for Ruby 1.8.2 #1863 [Rick Olson] - -* Fixed clone_structure_to_test task for SQLite #1864 [jon@burningbush.us] - -* Added -m/--mime-types option to the WEBrick server, so you can specify a Apache-style mime.types file to load #2059 [ask@develooper.com] - -* Added -c/--svn option to the generator that'll add new files and remove destroyed files using svn add/revert/remove as appropriate #2064 [kevin.clark@gmail.com] - -* Added -c/--charset option to WEBrick server, so you can specify a default charset (which without changes is UTF-8) #2084 [wejn@box.cz] - -* Make the default stats task extendable by modifying the STATS_DIRECTORIES constant - -* Allow the selected environment to define RAILS_DEFAULT_LOGGER, and have Rails::Initializer use it if it exists. - -* Moved all the shared tasks from Rakefile into Rails, so that the Rakefile is empty and doesn't require updating. - -* Added Rails::Initializer and Rails::Configuration to abstract all of the common setup out of config/environment.rb (uses config/boot.rb to bootstrap the initializer and paths) - -* Fixed the scaffold generator to fail right away if the database isn't accessible instead of in mid-air #1169 [Chad Fowler] - -* Corrected project-local generator location in scripts.rb #2010 [Michael Schuerig] - -* Don't require the environment just to clear the logs #2093 [Scott Barron] - -* Make the default rakefile read *.rake files from config/tasks (for easy extension of the rakefile by e.g. generators) - -* Only load breakpoint in development mode and when BREAKPOINT_SERVER_PORT is defined. - -* Allow the --toggle-spin switch on process/reaper to be negated - -* Replace render_partial with render :partial in scaffold generator [Nicholas Seckar] - -* Added -w flag to ps in process/reaper #1934 [Scott Barron] - -* Allow ERb in the database.yml file (just like with fixtures), so you can pull out the database configuration in environment variables #1822 [Duane Johnson] - -* Added convenience controls for FCGI processes (especially when managed remotely): spinner, spawner, and reaper. They reside in script/process. More details can be had by calling them with -h/--help. - -* Added load_fixtures task to the Rakefile, which will load all the fixtures into the database for the current environment #1791 [Marcel Molina] - -* Added an empty robots.txt to public/, so that web servers asking for it won't trigger a dynamic call, like favicon.ico #1738 [michael@schubert] - -* Dropped the 'immediate close-down' of FCGI processes since it didn't work consistently and produced bad responses when it didn't. So now a TERM ensures exit after the next request (just as if the process is handling a request when it receives the signal). This means that you'll have to 'nudge' all FCGI processes with a request in order to ensure that they have all reloaded. This can be done by something like ./script/process/repear --nudge 'http://www.myapp.com' --instances 10, which will load the myapp site 10 times (and thus hit all of the 10 FCGI processes once, enough to shut down). - - -*0.13.1* (11 July, 2005) - -* Look for app-specific generators in RAILS_ROOT/generators rather than the clunky old RAILS_ROOT/script/generators. Nobody really uses this feature except for the unit tests, so it's a negligible-impact change. If you want to work with third-party generators, drop them in ~/.rails/generators or simply install gems. - -* Fixed that each request with the WEBrick adapter would open a new database connection #1685 [Sam Stephenson] - -* Added support for SQL Server in the database rake tasks #1652 [ken.barker@gmail.com] Note: osql and scptxfr may need to be installed on your development environment. This involves getting the .exes and a .rll (scptxfr) from a production SQL Server (not developer level SQL Server). Add their location to your Environment PATH and you are all set. - -* Added a VERSION parameter to the migrate task that allows you to do "rake migrate VERSION=34" to migrate to the 34th version traveling up or down depending on the current version - -* Extend Ruby version check to include RUBY_RELEASE_DATE >= '2005-12-25', the final Ruby 1.8.2 release #1674 [court3nay@gmail.com] - -* Improved documentation for environment config files #1625 [court3nay@gmail.com] - - -*0.13.0* (6 July, 2005) - -* Changed the default logging level in config/environment.rb to INFO for production (so SQL statements won't be logged) - -* Added migration generator: ./script/generate migration add_system_settings - -* Added "migrate" as rake task to execute all the pending migrations from db/migrate - -* Fixed that model generator would make fixtures plural, even if ActiveRecord::Base.pluralize_table_names was false #1185 [Marcel Molina] - -* Added a DOCTYPE of HTML transitional to the HTML files generated by Rails #1124 [Michael Koziarski] - -* SIGTERM also gracefully exits dispatch.fcgi. Ignore SIGUSR1 on Windows. - -* Add the option to manually manage garbage collection in the FastCGI dispatcher. Set the number of requests between GC runs in your public/dispatch.fcgi [skaes@web.de] - -* Allow dynamic application reloading for dispatch.fcgi processes by sending a SIGHUP. If the process is currently handling a request, the request will be allowed to complete first. This allows production fcgi's to be reloaded without having to restart them. - -* RailsFCGIHandler (dispatch.fcgi) no longer tries to explicitly flush $stdout (CgiProcess#out always calls flush) - -* Fixed rakefile actions against PostgreSQL when the password is all numeric #1462 [michael@schubert.cx] - -* ActionMailer::Base subclasses are reloaded with the other rails components #1262 - -* Made the WEBrick adapter not use a mutex around action performance if ActionController::Base.allow_concurrency is true (default is false) - -* Fixed that mailer generator generated fixtures/plural while units expected fixtures/singular #1457 [Scott Barron] - -* Added a 'whiny nil' that's aim to ensure that when users pass nil to methods where that isn't appropriate, instead of NoMethodError? and the name of some method used by the framework users will see a message explaining what type of object was expected. Only active in test and development environments by default #1209 [Michael Koziarski] - -* Fixed the test_helper.rb to be safe for requiring controllers from multiple spots, like app/controllers/article_controller.rb and app/controllers/admin/article_controller.rb, without reloading the environment twice #1390 [Nicholas Seckar] - -* Fixed Webrick to escape + characters in URL's the same way that lighttpd and apache do #1397 [Nicholas Seckar] - -* Added -e/--environment option to script/runner #1408 [fbeausoleil@ftml.net] - -* Modernize the scaffold generator to use the simplified render and test methods and to change style from @params["id"] to params[:id]. #1367 - -* Added graceful exit from pressing CTRL-C during the run of the rails command #1150 [Caleb Tennis] - -* Allow graceful exits for dispatch.fcgi processes by sending a SIGUSR1. If the process is currently handling a request, the request will be allowed to complete and then will terminate itself. If a request is not being handled, the process is terminated immediately (via #exit). This basically works like restart graceful on Apache. [Jamis Buck] - -* Made dispatch.fcgi more robust by catching fluke errors and retrying unless its a permanent condition. [Jamis Buck] - -* Added console --profile for profiling an IRB session #1154 [Jeremy Kemper] - -* Changed console_sandbox into console --sandbox #1154 [Jeremy Kemper] - - -*0.12.1* (20th April, 2005) - -* Upgraded to Active Record 1.10.1, Action Pack 1.8.1, Action Mailer 0.9.1, Action Web Service 0.7.1 - - -*0.12.0* (19th April, 2005) - -* Fixed that purge_test_database would use database settings from the development environment when recreating the test database #1122 [rails@cogentdude.com] - -* Added script/benchmarker to easily benchmark one or more statement a number of times from within the environment. Examples: - - # runs the one statement 10 times - script/benchmarker 10 'Person.expensive_method(10)' - - # pits the two statements against each other with 50 runs each - script/benchmarker 50 'Person.expensive_method(10)' 'Person.cheap_method(10)' - -* Added script/profiler to easily profile a single statement from within the environment. Examples: - - script/profiler 'Person.expensive_method(10)' - script/profiler 'Person.expensive_method(10)' 10 # runs the statement 10 times - -* Added Rake target clear_logs that'll truncate all the *.log files in log/ to zero #1079 [Lucas Carlson] - -* Added lazy typing for generate, such that ./script/generate cn == ./script/generate controller and the likes #1051 [k@v2studio.com] - -* Fixed that ownership is brought over in pg_dump during tests for PostgreSQL #1060 [pburleson@gmail.com] - -* Upgraded to Active Record 1.10.0, Action Pack 1.8.0, Action Mailer 0.9.0, Action Web Service 0.7.0, Active Support 1.0.4 - - -*0.11.1* (27th March, 2005) - -* Fixed the dispatch.fcgi use of a logger - -* Upgraded to Active Record 1.9.1, Action Pack 1.7.0, Action Mailer 0.8.1, Action Web Service 0.6.2, Active Support 1.0.3 - - -*0.11.0* (22th March, 2005) - -* Removed SCRIPT_NAME from the WEBrick environment to prevent conflicts with PATH_INFO #896 [Nicholas Seckar] - -* Removed ?$1 from the dispatch.f/cgi redirect line to get rid of 'complete/path/from/request.html' => nil being in the @params now that the ENV["REQUEST_URI"] is used to determine the path #895 [dblack/Nicholas Seckar] - -* Added additional error handling to the FastCGI dispatcher to catch even errors taking down the entire process - -* Improved the generated scaffold code a lot to take advantage of recent Rails developments #882 [Tobias Luetke] - -* Combined the script/environment.rb used for gems and regular files version. If vendor/rails/* has all the frameworks, then files version is used, otherwise gems #878 [Nicholas Seckar] - -* Changed .htaccess to allow dispatch.* to be called from a sub-directory as part of the push with Action Pack to make Rails work on non-vhost setups #826 [Nicholas Seckar/Tobias Luetke] - -* Added script/runner which can be used to run code inside the environment by eval'ing the first parameter. Examples: - - ./script/runner 'ReminderService.deliver' - ./script/runner 'Mailer.receive(STDIN.read)' - - This makes it easier to do CRON and postfix scripts without actually making a script just to trigger 1 line of code. - -* Fixed webrick_server cookie handling to allow multiple cookes to be set at once #800, #813 [dave@cherryville.org] - -* Fixed the Rakefile's interaction with postgresql to: - - 1. Use PGPASSWORD and PGHOST in the environment to fix prompting for - passwords when connecting to a remote db and local socket connections. - 2. Add a '-x' flag to pg_dump which stops it dumping privileges #807 [rasputnik] - 3. Quote the user name and use template0 when dumping so the functions doesn't get dumped too #855 [pburleson] - 4. Use the port if available #875 [madrobby] - -* Upgraded to Active Record 1.9.0, Action Pack 1.6.0, Action Mailer 0.8.0, Action Web Service 0.6.1, Active Support 1.0.2 - - -*0.10.1* (7th March, 2005) - -* Fixed rake stats to ignore editor backup files like model.rb~ #791 [skanthak] - -* Added exception shallowing if the DRb server can't be started (not worth making a fuss about to distract new users) #779 [Tobias Luetke] - -* Added an empty favicon.ico file to the public directory of new applications (so the logs are not spammed by its absence) - -* Fixed that scaffold generator new template should use local variable instead of instance variable #778 [Dan Peterson] - -* Allow unit tests to run on a remote server for PostgreSQL #781 [adamm@galacticasoftware.com] - -* Added web_service generator (run ./script/generate web_service for help) #776 [Leon Bredt] - -* Added app/apis and components to code statistics report #729 [Scott Barron] - -* Fixed WEBrick server to use ABSOLUTE_RAILS_ROOT instead of working_directory #687 [Nicholas Seckar] - -* Fixed rails_generator to be usable without RubyGems #686 [Cristi BALAN] - -* Fixed -h/--help for generate and destroy generators #331 - -* Added begin/rescue around the FCGI dispatcher so no uncaught exceptions can bubble up to kill the process (logs to log/fastcgi.crash.log) - -* Fixed that association#count would produce invalid sql when called sequentialy #659 [kanis@comcard.de] - -* Fixed test/mocks/testing to the correct test/mocks/test #740 - -* Added early failure if the Ruby version isn't 1.8.2 or above #735 - -* Removed the obsolete -i/--index option from the WEBrick servlet #743 - -* Upgraded to Active Record 1.8.0, Action Pack 1.5.1, Action Mailer 0.7.1, Action Web Service 0.6.0, Active Support 1.0.1 - - -*0.10.0* (24th February, 2005) - -* Changed default IP binding for WEBrick from 127.0.0.1 to 0.0.0.0 so that the server is accessible both locally and remotely #696 [Marcel] - -* Fixed that script/server -d was broken so daemon mode couldn't be used #687 [Nicholas Seckar] - -* Upgraded to breakpoint 92 which fixes: - - * overload IRB.parse_opts(), fixes #443 - => breakpoints in tests work even when running them via rake - * untaint handlers, might fix an issue discussed on the Rails ML - * added verbose mode to breakpoint_client - * less noise caused by breakpoint_client by default - * ignored TerminateLineInput exception in signal handler - => quiet exit on Ctrl-C - -* Added support for independent components residing in /components. Example: - - Controller: components/list/items_controller.rb - (holds a List::ItemsController class with uses_component_template_root called) - - Model : components/list/item.rb - (namespace is still shared, so an Item model in app/models will take precedence) - - Views : components/list/items/show.rhtml - - -* Added --sandbox option to script/console that'll roll back all changes made to the database when you quit #672 [Jeremy Kemper] - -* Added 'recent' as a rake target that'll run tests for files that changed in the last 10 minutes #612 [Jeremy Kemper] - -* Changed script/console to default to development environment and drop --no-inspect #650 [Jeremy Kemper] - -* Added that the 'fixture :posts' syntax can be used for has_and_belongs_to_many fixtures where a model doesn't exist #572 [Jeremy Kemper] - -* Added that running test_units and test_functional now performs the clone_structure_to_test as well #566 [rasputnik] - -* Added new generator framework that informs about its doings on generation and enables updating and destruction of generated artifacts. See the new script/destroy and script/update for more details #487 [Jeremy Kemper] - -* Added Action Web Service as a new add-on framework for Action Pack [Leon Bredt] - -* Added Active Support as an independent utility and standard library extension bundle - -* Upgraded to Active Record 1.7.0, Action Pack 1.5.0, Action Mailer 0.7.0 - - -*0.9.5* (January 25th, 2005) - -* Fixed dependency reloading by switching to a remove_const approach where all Active Records, Active Record Observers, and Action Controllers are reloading by undefining their classes. This enables you to remove methods in all three types and see the change reflected immediately and it fixes #539. This also means that only those three types of classes will benefit from the const_missing and reloading approach. If you want other classes (like some in lib/) to reload, you must use require_dependency to do it. - -* Added Florian Gross' latest version of Breakpointer and friends that fixes a variaty of bugs #441 [Florian Gross] - -* Fixed skeleton Rakefile to work with sqlite3 out of the box #521 [rasputnik] - -* Fixed that script/breakpointer didn't get the Ruby path rewritten as the other scripts #523 [brandt@kurowski.net] - -* Fixed handling of syntax errors in models that had already been succesfully required once in the current interpreter - -* Fixed that models that weren't referenced in associations weren't being reloaded in the development mode by reinstating the reload - -* Fixed that generate scaffold would produce bad functional tests - -* Fixed that FCGI can also display SyntaxErrors - -* Upgraded to Active Record 1.6.0, Action Pack 1.4.0 - - -*0.9.4.1* (January 18th, 2005) - -* Added 5-second timeout to WordNet alternatives on creating reserved-word models #501 [Marcel Molina] - -* Fixed binding of caller #496 [Alexey] - -* Upgraded to Active Record 1.5.1, Action Pack 1.3.1, Action Mailer 0.6.1 - - -*0.9.4* (January 17th, 2005) - -* Added that ApplicationController will catch a ControllerNotFound exception if someone attempts to access a url pointing to an unexisting controller [Tobias Luetke] - -* Flipped code-to-test ratio around to be more readable #468 [Scott Baron] - -* Fixed log file permissions to be 666 instead of 777 (so they're not executable) #471 [Lucas Carlson] - -* Fixed that auto reloading would some times not work or would reload the models twice #475 [Tobias Luetke] - -* Added rewrite rules to deal with caching to public/.htaccess - -* Added the option to specify a controller name to "generate scaffold" and made the default controller name the plural form of the model. - -* Added that rake clone_structure_to_test, db_structure_dump, and purge_test_database tasks now pick up the source database to use from - RAILS_ENV instead of just forcing development #424 [Tobias Luetke] - -* Fixed script/console to work with Windows (that requires the use of irb.bat) #418 [octopod] - -* Fixed WEBrick servlet slowdown over time by restricting the load path reloading to mod_ruby - -* Removed Fancy Indexing as a default option on the WEBrick servlet as it made it harder to use various caching schemes - -* Upgraded to Active Record 1.5, Action Pack 1.3, Action Mailer 0.6 - - -*0.9.3* (January 4th, 2005) - -* Added support for SQLite in the auto-dumping/importing of schemas for development -> test #416 - -* Added automated rewriting of the shebang lines on installs through the gem rails command #379 [Manfred Stienstra] - -* Added ActionMailer::Base.deliver_method = :test to the test environment so that mail objects are available in ActionMailer::Base.deliveries - for functional testing. - -* Added protection for creating a model through the generators with a name of an existing class, like Thread or Date. - It'll even offer you a synonym using wordnet.princeton.edu as a look-up. No, I'm not kidding :) [Florian Gross] - -* Fixed dependency management to happen in a unified fashion for Active Record and Action Pack using the new Dependencies module. This means that - the environment options needs to change from: - - Before in development.rb: - ActionController::Base.reload_dependencies = true   - ActiveRecord::Base.reload_associations     = true - - Now in development.rb: - Dependencies.mechanism = :load - - Before in production.rb and test.rb: - ActionController::Base.reload_dependencies = false - ActiveRecord::Base.reload_associations     = false - - Now in production.rb and test.rb: - Dependencies.mechanism = :require - -* Fixed problems with dependency caching and controller hierarchies on Ruby 1.8.2 in development mode #351 - -* Fixed that generated action_mailers doesnt need to require the action_mailer since thats already done in the environment #382 [Lucas Carlson] - -* Upgraded to Action Pack 1.2.0 and Active Record 1.4.0 - - -*0.9.2* - -* Fixed CTRL-C exists from the Breakpointer to be a clean affair without error dumping [Kent Sibilev] - -* Fixed "rake stats" to work with sub-directories in models and controllers and to report the code to test ration [Scott Baron] - -* Added that Active Record associations are now reloaded instead of cleared to work with the new const_missing hook in Active Record. - -* Added graceful handling of an inaccessible log file by redirecting output to STDERR with a warning #330 [rainmkr] - -* Added support for a -h/--help parameter in the generator #331 [Ulysses] - -* Fixed that File.expand_path in config/environment.rb would fail when dealing with symlinked public directories [mjobin] - -* Upgraded to Action Pack 1.1.0 and Active Record 1.3.0 - - -*0.9.1* - -* Upgraded to Action Pack 1.0.1 for important bug fix - -* Updated gem dependencies - - -*0.9.0* - -* Renamed public/dispatch.servlet to script/server -- it wasn't really dispatching anyway as its delegating calls to public/dispatch.rb - -* Renamed AbstractApplicationController and abstract_application.rb to ApplicationController and application.rb, so that it will be possible - for the framework to automatically pick up on app/views/layouts/application.rhtml and app/helpers/application.rb - -* Added script/console that makes it even easier to start an IRB session for interacting with the domain model. Run with no-args to - see help. - -* Added breakpoint support through the script/breakpointer client. This means that you can break out of execution at any point in - the code, investigate and change the model, AND then resume execution! Example: - - class WeblogController < ActionController::Base - def index - @posts = Post.find_all - breakpoint "Breaking out from the list" - end - end - - So the controller will accept the action, run the first line, then present you with a IRB prompt in the breakpointer window. - Here you can do things like: - - Executing breakpoint "Breaking out from the list" at .../webrick_server.rb:16 in 'breakpoint' - - >> @posts.inspect - => "[#nil, \"body\"=>nil, \"id\"=>\"1\"}>, - #\"Rails you know!\", \"body\"=>\"Only ten..\", \"id\"=>\"2\"}>]" - >> @posts.first.title = "hello from a breakpoint" - => "hello from a breakpoint" - - ...and even better is that you can examine how your runtime objects actually work: - - >> f = @posts.first - => #nil, "body"=>nil, "id"=>"1"}> - >> f. - Display all 152 possibilities? (y or n) - - Finally, when you're ready to resume execution, you press CTRL-D - -* Changed environments to be configurable through an environment variable. By default, the environment is "development", but you - can change that and set your own by configuring the Apache vhost with a string like (mod_env must be available on the server): - - SetEnv RAILS_ENV production - - ...if you're using WEBrick, you can pick the environment to use with the command-line parameters -e/--environment, like this: - - ruby public/dispatcher.servlet -e production - -* Added a new default environment called "development", which leaves the production environment to be tuned exclusively for that. - -* Added a start_server in the root of the Rails application to make it even easier to get started - -* Fixed public/.htaccess to use RewriteBase and share the same rewrite rules for all the dispatch methods - -* Fixed webrick_server to handle requests in a serialized manner (the Rails reloading infrastructure is not thread-safe) - -* Added support for controllers in directories. So you can have: - - app/controllers/account_controller.rb # URL: /account/ - app/controllers/admin/account_controller.rb # URL: /admin/account/ - - NOTE: You need to update your public/.htaccess with the new rules to pick it up - -* Added reloading for associations and dependencies under cached environments like FastCGI and mod_ruby. This makes it possible to use - those environments for development. This is turned on by default, but can be turned off with - ActiveRecord::Base.reload_associations = false and ActionController::Base.reload_dependencies = false in production environments. - -* Added support for sub-directories in app/models. So now you can have something like Basecamp with: - - app/models/accounting - app/models/project - app/models/participants - app/models/settings - - It's poor man's namespacing, but only for file-system organization. You still require files just like before. - Nothing changes inside the files themselves. - - -* Fixed a few references in the tests generated by new_mailer [Jeremy Kemper] - -* Added support for mocks in testing with test/mocks - -* Cleaned up the environments a bit and added global constant RAILS_ROOT - - -*0.8.5* (9) - -* Made dev-util available to all tests, so you can insert breakpoints in any test case to get an IRB prompt at that point [Jeremy Kemper]: - - def test_complex_stuff - @david.projects << @new_project - breakpoint "Let's have a closer look at @david" - end - - You need to install dev-utils yourself for this to work ("gem install dev-util"). - -* Added shared generator behavior so future upgrades should be possible without manually copying over files [Jeremy Kemper] - -* Added the new helper style to both controller and helper templates [Jeremy Kemper] - -* Added new_crud generator for creating a model and controller at the same time with explicit scaffolding [Jeremy Kemper] - -* Added configuration of Test::Unit::TestCase.fixture_path to test_helper to concide with the new AR fixtures style - -* Fixed that new_model was generating singular table/fixture names - -* Upgraded to Action Mailer 0.4.0 - -* Upgraded to Action Pack 0.9.5 - -* Upgraded to Active Record 1.1.0 - - -*0.8.0 (15)* - -* Removed custom_table_name option for new_model now that the Inflector is as powerful as it is - -* Changed the default rake action to just do testing and separate API generation and coding statistics into a "doc" task. - -* Fixed WEBrick dispatcher to handle missing slashes in the URLs gracefully [alexey] - -* Added user option for all postgresql tool calls in the rakefile [elvstone] - -* Fixed problem with running "ruby public/dispatch.servlet" instead of "cd public; ruby dispatch.servlet" [alexey] - -* Fixed WEBrick server so that it no longer hardcodes the ruby interpreter used to "ruby" but will get the one used based - on the Ruby runtime configuration. [Marcel Molina Jr.] - -* Fixed Dispatcher so it'll route requests to magic_beans to MagicBeansController/magic_beans_controller.rb [Caio Chassot] - -* "new_controller MagicBeans" and "new_model SubscriptionPayments" will now both behave properly as they use the new Inflector. - -* Fixed problem with MySQL foreign key constraint checks in Rake :clone_production_structure_to_test target [Andreas Schwarz] - -* Changed WEBrick server to by default be auto-reloading, which is slower but makes source changes instant. - Class compilation cache can be turned on with "-c" or "--cache-classes". - -* Added "-b/--binding" option to WEBrick dispatcher to bind the server to a specific IP address (default: 127.0.0.1) [Kevin Temp] - -* dispatch.fcgi now DOESN'T set FCGI_PURE_RUBY as it was slowing things down for now reason [Andreas Schwarz] - -* Added new_mailer generator to work with Action Mailer - -* Included new framework: Action Mailer 0.3 - -* Upgraded to Action Pack 0.9.0 - -* Upgraded to Active Record 1.0.0 - - -*0.7.0* - -* Added an optional second argument to the new_model script that allows the programmer to specify the table name, - which will used to generate a custom table_name method in the model and will also be used in the creation of fixtures. - [Kevin Radloff] - -* script/new_model now turns AccountHolder into account_holder instead of accountholder [Kevin Radloff] - -* Fixed the faulty handleing of static files with WEBrick [Andreas Schwarz] - -* Unified function_test_helper and unit_test_helper into test_helper - -* Fixed bug with the automated production => test database dropping on PostgreSQL [dhawkins] - -* create_fixtures in both the functional and unit test helper now turns off the log during fixture generation - and can generate more than one fixture at a time. Which makes it possible for assignments like: - - @people, @projects, @project_access, @companies, @accounts = - create_fixtures "people", "projects", "project_access", "companies", "accounts" - -* Upgraded to Action Pack 0.8.5 (locally-scoped variables, partials, advanced send_file) - -* Upgraded to Active Record 0.9.5 (better table_name guessing, cloning, find_all_in_collection) - - -*0.6.5* - -* No longer specifies a template for rdoc, so it'll use whatever is default (you can change it in the rakefile) - -* The new_model generator will now use the same rules for plural wordings as Active Record - (so Category will give categories, not categorys) [Kevin Radloff] - -* dispatch.fcgi now sets FCGI_PURE_RUBY to true to ensure that it's the Ruby version that's loaded [danp] - -* Made the GEM work with Windows - -* Fixed bug where mod_ruby would "forget" the load paths added when switching between controllers - -* PostgreSQL are now supported for the automated production => test database dropping [Kevin Radloff] - -* Errors thrown by the dispatcher are now properly handled in FCGI. - -* Upgraded to Action Pack 0.8.0 (lots and lots and lots of fixes) - -* Upgraded to Active Record 0.9.4 (a bunch of fixes) - - -*0.6.0* - -* Added AbstractionApplicationController as a superclass for all controllers generated. This class can be used - to carry filters and methods that are to be shared by all. It has an accompanying ApplicationHelper that all - controllers will also automatically have available. - -* Added environments that can be included from any script to get the full Active Record and Action Controller - context running. This can be used by maintenance scripts or to interact with the model through IRB. Example: - - require 'config/environments/production' - - for account in Account.find_all - account.recalculate_interests - end - - A short migration script for an account model that had it's interest calculation strategy changed. - -* Accessing the index of a controller with "/weblog" will now redirect to "/weblog/" (only on Apache, not WEBrick) - -* Simplified the default Apache config so even remote requests are served off CGI as a default. - You'll now have to do something specific to activate mod_ruby and FCGI (like using the force urls). - This should make it easier for new comers that start on an external server. - -* Added more of the necessary Apache options to .htaccess to make it easier to setup - -* Upgraded to Action Pack 0.7.9 (lots of fixes) - -* Upgraded to Active Record 0.9.3 (lots of fixes) - - -*0.5.7* - -* Fixed bug in the WEBrick dispatcher that prevented it from getting parameters from the URL - (through GET requests or otherwise) - -* Added lib in root as a place to store app specific libraries - -* Added lib and vendor to load_path, so anything store within can be loaded directly. - Hence lib/redcloth.rb can be loaded with require "redcloth" - -* Upgraded to Action Pack 0.7.8 (lots of fixes) - -* Upgraded to Active Record 0.9.2 (minor upgrade) - - -*0.5.6* - -* Upgraded to Action Pack 0.7.7 (multipart form fix) - -* Updated the generated template stubs to valid XHTML files - -* Ensure that controllers generated are capitalized, so "new_controller TodoLists" - gives the same as "new_controller Todolists" and "new_controller todolists". - - -*0.5.5* - -* Works on Windows out of the box! (Dropped symlinks) - -* Added webrick dispatcher: Try "ruby public/dispatch.servlet --help" [Florian Gross] - -* Report errors about initialization to browser (instead of attempting to use uninitialized logger) - -* Upgraded to Action Pack 0.7.6 - -* Upgraded to Active Record 0.9.1 - -* Added distinct 500.html instead of reusing 404.html - -* Added MIT license - - -*0.5.0* - -* First public release diff --git a/MIT-LICENSE b/MIT-LICENSE deleted file mode 100644 index 67625d0..0000000 --- a/MIT-LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) 2005, 2006 VibrantPlanet Ltd. -Copyright (c) 2005, 2006 Luben Manolov -Copyright (c) 2005, 2006 Nick Penkov - -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/UNLICENSE b/UNLICENSE new file mode 100644 index 0000000..68a49da --- /dev/null +++ b/UNLICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +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 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. + +For more information, please refer to From e40a859b7defb5549f99c26a86e7a756131aea2b Mon Sep 17 00:00:00 2001 From: Wojciech Todryk Date: Fri, 24 Jun 2011 23:48:08 +0200 Subject: [PATCH 07/88] works but need some cleanup --- .gitignore | 1 - AUTHORS | 5 + CHANGELOG | 718 --- Gemfile | 36 + Gemfile.lock | 81 + MIT-LICENSE | 23 - README | 34 - README.markdown | 40 + Rakefile | 9 +- UNLICENSE | 24 + app/controllers/application_controller.rb | 43 +- app/controllers/contact_groups_controller.rb | 0 app/controllers/contacts_controller.rb | 0 app/controllers/folders_controller.rb | 0 app/controllers/login_controller.rb | 38 +- app/controllers/webmail_controller.rb | 175 +- app/helpers/application_helper.rb | 0 app/helpers/contact_group_helper.rb | 0 app/helpers/contacts_helper.rb | 0 app/helpers/folders_helper.rb | 0 app/helpers/navigation_helper.rb | 0 app/helpers/webmail_helper.rb | 63 +- app/models/contact.rb | 71 +- app/models/contact_group.rb | 43 +- app/models/customer.rb | 0 app/models/mail_pref.rb | 0 .../{edit.rhtml => edit.html.erb} | 0 app/views/contact_groups/index.html.erb | 0 ...d_multiple.rhtml => add_multiple.html.erb} | 0 .../{choose.rhtml => choose.html.erb} | 0 ..._preview.rhtml => import_preview.html.erb} | 0 app/views/contacts/index.html.erb | 0 app/views/contacts/new.html.erb | 20 +- app/views/folders/index.html.erb | 8 +- app/views/layouts/chooser.html.erb | 0 app/views/layouts/login.html.erb | 0 app/views/layouts/public.html.erb | 5 +- app/views/login/index.rhtml | 0 app/views/shared/_folders.html.erb | 4 +- .../{_contacts.rhtml => _contacts.html.erb} | 0 .../webmail/{_expr.rhtml => _expr.html.erb} | 0 .../{_filter.rhtml => _filter.html.erb} | 0 ...essage_row.rhtml => _message_row.html.erb} | 0 .../{_search.rhtml => _search.html.erb} | 0 .../{compose.rhtml => compose.html.erb} | 0 ...ection.rhtml => error_connection.html.erb} | 0 .../webmail/{filter.rhtml => filter.html.erb} | 0 .../{filters.rhtml => filters.html.erb} | 0 .../{folders.rhtml => folders.html.erb} | 0 .../{mailsent.rhtml => mailsent.html.erb} | 0 .../{message.rhtml => message.html.erb} | 0 .../{messages.rhtml => messages.html.erb} | 10 +- ...attachment.rhtml => noattachment.html.erb} | 0 .../webmail/{prefs.rhtml => prefs.html.erb} | 0 ...view_source.rhtml => view_source.html.erb} | 0 arts/logo.png | Bin 0 -> 61554 bytes arts/logo.xcf | Bin 0 -> 254283 bytes config.ru | 4 + config/application.rb | 63 + config/boot.rb | 111 +- config/default_site.rb | 0 config/environment.rb | 84 +- config/environments/development.rb | 34 +- config/environments/production.rb | 56 +- config/environments/test.rb | 50 +- config/initializers/backtrace_silencers.rb | 7 + config/initializers/inflections.rb | 10 + config/initializers/mime_types.rb | 5 + config/initializers/pluralization.rb | 36 + config/initializers/secret_token.rb | 7 + config/initializers/session_store.rb | 8 + config/lighttpd.conf | 79 - config/locales/en.yml | 7 +- config/locales/es-ES.yml | 0 config/locales/{pl-PL.yml => pl.yml} | 6 +- config/routes.rb | 99 +- db/migrate/20090107193228_init.rb | 0 db/schema.mysql.sql | 111 - db/schema.pgsql.sql | 111 - db/schema.rb | 13 +- db/seeds.rb | 7 + doc/README_FOR_APP | 2 +- lib/cdfutils.rb | 0 lib/imap_utils.rb | 14 +- lib/tasks/.gitkeep | 0 lib/tmail_patch.rb | 0 lib/webmail/bounced_mail.rb | 0 lib/webmail/cdfmail.rb | 134 +- lib/webmail/environment.rb | 0 lib/webmail/expression.rb | 0 lib/webmail/filter.rb | 0 lib/webmail/imap_message.rb | 0 lib/webmail/imapmailbox.rb | 189 +- lib/webmail/mail2screen.rb | 0 lib/webmail/mail_transform.rb | 0 lib/webmail/maildropserializator.rb | 0 lib/webmail/routes.rb | 0 lib/webmail/virtual_email.rb | 0 public/404.html | 28 +- public/422.html | 26 + public/500.html | 28 +- public/favicon.ico | 0 public/images/attachment.png | Bin public/images/d6deec.gif | Bin public/images/deselect.png | Bin public/images/list_closed.gif | Bin public/images/list_opened.gif | Bin public/images/noprogress.gif | Bin public/images/rails.png | Bin 0 -> 6646 bytes public/images/select.png | Bin public/images/white.gif | Bin public/images/white.png | Bin public/javascripts/application.js | 0 public/javascripts/controls.js | 8 +- public/javascripts/dragdrop.js | 13 +- public/javascripts/effects.js | 21 +- public/javascripts/effects2.js | 0 public/javascripts/global.js | 0 public/javascripts/global_src.js | 0 public/javascripts/prototype.js | 5493 +++++++++++------ public/javascripts/prototype_src.js | 0 public/javascripts/rails.js | 191 + public/javascripts/scriptaculous.js | 0 public/javascripts/slider.js | 0 public/robots.txt | 5 + public/stylesheets/.gitkeep | 0 public/stylesheets/admin.css | 0 public/stylesheets/mailr.css | 8 +- public/stylesheets/tabs.css | 0 .../stylesheets/webmail/icon-folder-open.gif | Bin public/tiny_mce/blank.htm | 10 - public/tiny_mce/jstrim.pl | 75 - public/tiny_mce/langs/ar.js | 39 - public/tiny_mce/langs/ca.js | 38 - public/tiny_mce/langs/cs.js | 38 - public/tiny_mce/langs/da.js | 38 - public/tiny_mce/langs/de.js | 38 - public/tiny_mce/langs/el.js | 38 - public/tiny_mce/langs/en.js | 44 - public/tiny_mce/langs/es.js | 38 - public/tiny_mce/langs/fa.js | 43 - public/tiny_mce/langs/fi.js | 38 - public/tiny_mce/langs/fr.js | 38 - public/tiny_mce/langs/fr_ca.js | 38 - public/tiny_mce/langs/hu.js | 39 - public/tiny_mce/langs/it.js | 38 - public/tiny_mce/langs/ja.js | 38 - public/tiny_mce/langs/ko.js | 37 - public/tiny_mce/langs/nl.js | 38 - public/tiny_mce/langs/no.js | 37 - public/tiny_mce/langs/pl.js | 38 - public/tiny_mce/langs/pt.js | 41 - public/tiny_mce/langs/pt_br.js | 41 - public/tiny_mce/langs/readme.txt | 2 - public/tiny_mce/langs/ru.js | 40 - public/tiny_mce/langs/sv.js | 40 - public/tiny_mce/langs/th.js | 37 - public/tiny_mce/langs/zh_cn.js | 39 - .../plugins/_template/editor_plugin.js | 118 - .../plugins/_template/images/template.gif | Bin 879 -> 0 bytes public/tiny_mce/plugins/_template/langs/en.js | 6 - .../tiny_mce/plugins/_template/langs/zh_cn.js | 7 - public/tiny_mce/plugins/_template/popup.htm | 31 - public/tiny_mce/plugins/_template/readme.txt | 1 - .../tiny_mce/plugins/advhr/editor_plugin.js | 2 - .../plugins/advhr/editor_plugin_src.js | 58 - .../tiny_mce/plugins/advhr/images/advhr.gif | Bin 209 -> 0 bytes public/tiny_mce/plugins/advhr/langs/cs.js | 6 - public/tiny_mce/plugins/advhr/langs/de.js | 6 - public/tiny_mce/plugins/advhr/langs/en.js | 6 - public/tiny_mce/plugins/advhr/langs/fa.js | 11 - public/tiny_mce/plugins/advhr/langs/fr.js | 6 - public/tiny_mce/plugins/advhr/langs/fr_ca.js | 6 - public/tiny_mce/plugins/advhr/langs/pl.js | 6 - public/tiny_mce/plugins/advhr/langs/pt_br.js | 6 - public/tiny_mce/plugins/advhr/langs/sv.js | 6 - public/tiny_mce/plugins/advhr/langs/zh_cn.js | 7 - public/tiny_mce/plugins/advhr/readme.txt | 20 - public/tiny_mce/plugins/advhr/rule.htm | 107 - .../plugins/advimage/editor_plugin.js | 2 - .../plugins/advimage/editor_plugin_src.js | 61 - public/tiny_mce/plugins/advimage/image.htm | 371 -- public/tiny_mce/plugins/advimage/langs/cs.js | 6 - public/tiny_mce/plugins/advimage/langs/de.js | 6 - public/tiny_mce/plugins/advimage/langs/en.js | 6 - public/tiny_mce/plugins/advimage/langs/fa.js | 11 - public/tiny_mce/plugins/advimage/langs/fr.js | 6 - .../tiny_mce/plugins/advimage/langs/fr_ca.js | 6 - public/tiny_mce/plugins/advimage/langs/ko.js | 6 - public/tiny_mce/plugins/advimage/langs/pl.js | 6 - .../tiny_mce/plugins/advimage/langs/pt_br.js | 6 - public/tiny_mce/plugins/advimage/langs/sv.js | 6 - .../tiny_mce/plugins/advimage/langs/zh_cn.js | 7 - public/tiny_mce/plugins/advimage/readme.txt | 19 - .../tiny_mce/plugins/advlink/editor_plugin.js | 2 - .../plugins/advlink/editor_plugin_src.js | 18 - public/tiny_mce/plugins/advlink/langs/cs.js | 20 - public/tiny_mce/plugins/advlink/langs/de.js | 20 - public/tiny_mce/plugins/advlink/langs/en.js | 20 - public/tiny_mce/plugins/advlink/langs/fa.js | 25 - public/tiny_mce/plugins/advlink/langs/fr.js | 20 - .../tiny_mce/plugins/advlink/langs/fr_ca.js | 20 - public/tiny_mce/plugins/advlink/langs/ko.js | 19 - public/tiny_mce/plugins/advlink/langs/pl.js | 23 - .../tiny_mce/plugins/advlink/langs/pt_br.js | 20 - public/tiny_mce/plugins/advlink/langs/sv.js | 20 - .../tiny_mce/plugins/advlink/langs/zh_cn.js | 21 - public/tiny_mce/plugins/advlink/link.htm | 444 -- public/tiny_mce/plugins/advlink/readme.txt | 19 - .../plugins/contextmenu/contextmenu.css | 60 - .../plugins/contextmenu/editor_plugin.js | 2 - .../plugins/contextmenu/editor_plugin_src.js | 289 - .../plugins/contextmenu/images/spacer.gif | Bin 43 -> 0 bytes .../plugins/directionality/editor_plugin.js | 2 - .../directionality/editor_plugin_src.js | 71 - .../plugins/directionality/images/ltr.gif | Bin 314 -> 0 bytes .../plugins/directionality/images/rtl.gif | Bin 314 -> 0 bytes .../plugins/directionality/langs/en.js | 4 - .../plugins/directionality/langs/sv.js | 4 - .../plugins/directionality/langs/zh_cn.js | 5 - .../plugins/directionality/readme.txt | 16 - .../plugins/emotions/editor_plugin.js | 2 - .../plugins/emotions/editor_plugin_src.js | 36 - public/tiny_mce/plugins/emotions/emotions.htm | 45 - .../plugins/emotions/images/emotions.gif | Bin 1127 -> 0 bytes .../plugins/emotions/images/readme.txt | 2 - .../plugins/emotions/images/smiley-cool.gif | Bin 1135 -> 0 bytes .../plugins/emotions/images/smiley-cry.gif | Bin 1127 -> 0 bytes .../emotions/images/smiley-embarassed.gif | Bin 1134 -> 0 bytes .../emotions/images/smiley-foot-in-mouth.gif | Bin 1120 -> 0 bytes .../plugins/emotions/images/smiley-frown.gif | Bin 1116 -> 0 bytes .../emotions/images/smiley-innocent.gif | Bin 1139 -> 0 bytes .../plugins/emotions/images/smiley-kiss.gif | Bin 1129 -> 0 bytes .../emotions/images/smiley-laughing.gif | Bin 1122 -> 0 bytes .../emotions/images/smiley-money-mouth.gif | Bin 1112 -> 0 bytes .../plugins/emotions/images/smiley-sealed.gif | Bin 1110 -> 0 bytes .../plugins/emotions/images/smiley-smile.gif | Bin 1116 -> 0 bytes .../emotions/images/smiley-surprised.gif | Bin 1122 -> 0 bytes .../emotions/images/smiley-tongue-out.gif | Bin 1112 -> 0 bytes .../emotions/images/smiley-undecided.gif | Bin 1117 -> 0 bytes .../plugins/emotions/images/smiley-wink.gif | Bin 1124 -> 0 bytes .../plugins/emotions/images/smiley-yell.gif | Bin 1132 -> 0 bytes public/tiny_mce/plugins/emotions/langs/cs.js | 4 - public/tiny_mce/plugins/emotions/langs/de.js | 6 - public/tiny_mce/plugins/emotions/langs/el.js | 5 - public/tiny_mce/plugins/emotions/langs/en.js | 5 - public/tiny_mce/plugins/emotions/langs/fa.js | 10 - public/tiny_mce/plugins/emotions/langs/fr.js | 5 - .../tiny_mce/plugins/emotions/langs/fr_ca.js | 5 - public/tiny_mce/plugins/emotions/langs/it.js | 5 - public/tiny_mce/plugins/emotions/langs/ko.js | 5 - public/tiny_mce/plugins/emotions/langs/pl.js | 4 - .../tiny_mce/plugins/emotions/langs/pt_br.js | 5 - public/tiny_mce/plugins/emotions/langs/sv.js | 4 - .../tiny_mce/plugins/emotions/langs/zh_cn.js | 6 - public/tiny_mce/plugins/emotions/readme.txt | 20 - .../tiny_mce/plugins/flash/editor_plugin.js | 2 - .../plugins/flash/editor_plugin_src.js | 225 - public/tiny_mce/plugins/flash/flash.css | 7 - public/tiny_mce/plugins/flash/flash.htm | 182 - .../tiny_mce/plugins/flash/images/flash.gif | Bin 664 -> 0 bytes public/tiny_mce/plugins/flash/langs/cs.js | 7 - public/tiny_mce/plugins/flash/langs/de.js | 7 - public/tiny_mce/plugins/flash/langs/en.js | 7 - public/tiny_mce/plugins/flash/langs/fa.js | 11 - public/tiny_mce/plugins/flash/langs/fr.js | 7 - public/tiny_mce/plugins/flash/langs/fr_ca.js | 6 - public/tiny_mce/plugins/flash/langs/pl.js | 7 - public/tiny_mce/plugins/flash/langs/pt_br.js | 7 - public/tiny_mce/plugins/flash/langs/sv.js | 7 - public/tiny_mce/plugins/flash/langs/zh_cn.js | 8 - public/tiny_mce/plugins/flash/readme.txt | 48 - .../plugins/fullscreen/editor_plugin.js | 2 - .../plugins/fullscreen/editor_plugin_src.js | 34 - .../plugins/fullscreen/fullscreen.htm | 72 - .../plugins/fullscreen/images/fullscreen.gif | Bin 391 -> 0 bytes .../tiny_mce/plugins/fullscreen/langs/cs.js | 4 - .../tiny_mce/plugins/fullscreen/langs/en.js | 4 - .../tiny_mce/plugins/fullscreen/langs/sv.js | 4 - .../plugins/fullscreen/langs/zh_cn.js | 5 - public/tiny_mce/plugins/fullscreen/readme.txt | 17 - .../tiny_mce/plugins/iespell/editor_plugin.js | 2 - .../plugins/iespell/editor_plugin_src.js | 37 - .../plugins/iespell/images/iespell.gif | Bin 151 -> 0 bytes public/tiny_mce/plugins/iespell/langs/cs.js | 4 - public/tiny_mce/plugins/iespell/langs/de.js | 4 - public/tiny_mce/plugins/iespell/langs/el.js | 4 - public/tiny_mce/plugins/iespell/langs/en.js | 4 - public/tiny_mce/plugins/iespell/langs/fr.js | 4 - .../tiny_mce/plugins/iespell/langs/fr_ca.js | 4 - public/tiny_mce/plugins/iespell/langs/it.js | 4 - public/tiny_mce/plugins/iespell/langs/ko.js | 4 - public/tiny_mce/plugins/iespell/langs/pl.js | 4 - .../tiny_mce/plugins/iespell/langs/pt_br.js | 4 - public/tiny_mce/plugins/iespell/langs/sv.js | 4 - .../tiny_mce/plugins/iespell/langs/zh_cn.js | 5 - public/tiny_mce/plugins/iespell/readme.txt | 20 - .../plugins/insertdatetime/editor_plugin.js | 2 - .../insertdatetime/editor_plugin_src.js | 75 - .../insertdatetime/images/insertdate.gif | Bin 1031 -> 0 bytes .../insertdatetime/images/inserttime.gif | Bin 958 -> 0 bytes .../plugins/insertdatetime/langs/cs.js | 8 - .../plugins/insertdatetime/langs/de.js | 8 - .../plugins/insertdatetime/langs/el.js | 8 - .../plugins/insertdatetime/langs/en.js | 8 - .../plugins/insertdatetime/langs/fa.js | 9 - .../plugins/insertdatetime/langs/fr.js | 8 - .../plugins/insertdatetime/langs/fr_ca.js | 8 - .../plugins/insertdatetime/langs/it.js | 8 - .../plugins/insertdatetime/langs/ko.js | 8 - .../plugins/insertdatetime/langs/pl.js | 9 - .../plugins/insertdatetime/langs/pt_br.js | 8 - .../plugins/insertdatetime/langs/sv.js | 8 - .../plugins/insertdatetime/langs/zh_cn.js | 9 - .../plugins/insertdatetime/readme.txt | 35 - .../plugins/linkattach/attachment.htm | 448 -- .../plugins/linkattach/editor_plugin.js | 2 - .../plugins/linkattach/editor_plugin_src.js | 18 - .../tiny_mce/plugins/linkattach/langs/en.js | 20 - public/tiny_mce/plugins/paste/blank.htm | 15 - .../tiny_mce/plugins/paste/editor_plugin.js | 25 - .../plugins/paste/editor_plugin_src.js | 174 - .../plugins/paste/images/pastetext.gif | Bin 1023 -> 0 bytes .../plugins/paste/images/pasteword.gif | Bin 640 -> 0 bytes .../plugins/paste/images/selectall.gif | Bin 998 -> 0 bytes public/tiny_mce/plugins/paste/langs/cs.js | 8 - public/tiny_mce/plugins/paste/langs/en.js | 8 - public/tiny_mce/plugins/paste/langs/sv.js | 8 - public/tiny_mce/plugins/paste/langs/zh_cn.js | 9 - public/tiny_mce/plugins/paste/pastetext.htm | 76 - public/tiny_mce/plugins/paste/pasteword.htm | 111 - public/tiny_mce/plugins/paste/readme.txt | 28 - .../tiny_mce/plugins/preview/editor_plugin.js | 2 - .../plugins/preview/editor_plugin_src.js | 61 - public/tiny_mce/plugins/preview/example.html | 14 - .../plugins/preview/images/preview.gif | Bin 1024 -> 0 bytes public/tiny_mce/plugins/preview/langs/cs.js | 3 - public/tiny_mce/plugins/preview/langs/de.js | 3 - public/tiny_mce/plugins/preview/langs/el.js | 3 - public/tiny_mce/plugins/preview/langs/en.js | 3 - public/tiny_mce/plugins/preview/langs/fa.js | 8 - public/tiny_mce/plugins/preview/langs/fr.js | 3 - .../tiny_mce/plugins/preview/langs/fr_ca.js | 3 - public/tiny_mce/plugins/preview/langs/it.js | 3 - public/tiny_mce/plugins/preview/langs/ko.js | 3 - public/tiny_mce/plugins/preview/langs/pl.js | 4 - public/tiny_mce/plugins/preview/langs/pt.js | 3 - .../tiny_mce/plugins/preview/langs/pt_br.js | 3 - public/tiny_mce/plugins/preview/langs/sv.js | 3 - .../tiny_mce/plugins/preview/langs/zh_cn.js | 3 - public/tiny_mce/plugins/preview/readme.txt | 23 - .../tiny_mce/plugins/print/editor_plugin.js | 2 - .../plugins/print/editor_plugin_src.js | 26 - .../tiny_mce/plugins/print/images/print.gif | Bin 1013 -> 0 bytes public/tiny_mce/plugins/print/langs/cs.js | 3 - public/tiny_mce/plugins/print/langs/de.js | 3 - public/tiny_mce/plugins/print/langs/en.js | 3 - public/tiny_mce/plugins/print/langs/fa.js | 8 - public/tiny_mce/plugins/print/langs/fr.js | 3 - public/tiny_mce/plugins/print/langs/fr_ca.js | 3 - public/tiny_mce/plugins/print/langs/pl.js | 4 - public/tiny_mce/plugins/print/langs/pt_br.js | 3 - public/tiny_mce/plugins/print/langs/sv.js | 3 - public/tiny_mce/plugins/print/langs/zh_cn.js | 4 - public/tiny_mce/plugins/print/readme.txt | 17 - public/tiny_mce/plugins/readme.txt | 1 - public/tiny_mce/plugins/save/editor_plugin.js | 2 - .../plugins/save/editor_plugin_src.js | 43 - public/tiny_mce/plugins/save/images/save.gif | Bin 1001 -> 0 bytes public/tiny_mce/plugins/save/langs/cs.js | 3 - public/tiny_mce/plugins/save/langs/de.js | 3 - public/tiny_mce/plugins/save/langs/en.js | 3 - public/tiny_mce/plugins/save/langs/fa.js | 8 - public/tiny_mce/plugins/save/langs/fr.js | 3 - public/tiny_mce/plugins/save/langs/fr_ca.js | 3 - public/tiny_mce/plugins/save/langs/pl.js | 4 - public/tiny_mce/plugins/save/langs/pt_br.js | 3 - public/tiny_mce/plugins/save/langs/zh_cn.js | 4 - public/tiny_mce/plugins/save/readme.txt | 19 - .../plugins/searchreplace/editor_plugin.js | 2 - .../searchreplace/editor_plugin_src.js | 173 - .../plugins/searchreplace/images/replace.gif | Bin 152 -> 0 bytes .../plugins/searchreplace/images/search.gif | Bin 990 -> 0 bytes .../plugins/searchreplace/langs/cs.js | 19 - .../plugins/searchreplace/langs/de.js | 19 - .../plugins/searchreplace/langs/en.js | 19 - .../plugins/searchreplace/langs/fa.js | 24 - .../plugins/searchreplace/langs/fr.js | 19 - .../plugins/searchreplace/langs/fr_ca.js | 20 - .../plugins/searchreplace/langs/pl.js | 20 - .../plugins/searchreplace/langs/pt_br.js | 19 - .../plugins/searchreplace/langs/sv.js | 19 - .../plugins/searchreplace/langs/zh_cn.js | 20 - .../tiny_mce/plugins/searchreplace/readme.txt | 18 - .../plugins/searchreplace/replace.htm | 88 - .../tiny_mce/plugins/searchreplace/search.htm | 77 - public/tiny_mce/plugins/table/cell.htm | 137 - .../tiny_mce/plugins/table/editor_plugin.js | 2 - .../plugins/table/editor_plugin_src.js | 1142 ---- .../tiny_mce/plugins/table/images/buttons.gif | Bin 2113 -> 0 bytes .../tiny_mce/plugins/table/images/table.gif | Bin 1018 -> 0 bytes .../plugins/table/images/table_cell_props.gif | Bin 369 -> 0 bytes .../plugins/table/images/table_delete_col.gif | Bin 929 -> 0 bytes .../plugins/table/images/table_delete_row.gif | Bin 942 -> 0 bytes .../table/images/table_insert_col_after.gif | Bin 936 -> 0 bytes .../table/images/table_insert_col_before.gif | Bin 935 -> 0 bytes .../table/images/table_insert_row_after.gif | Bin 928 -> 0 bytes .../table/images/table_insert_row_before.gif | Bin 928 -> 0 bytes .../table/images/table_merge_cells.gif | Bin 383 -> 0 bytes .../plugins/table/images/table_row_props.gif | Bin 367 -> 0 bytes .../table/images/table_split_cells.gif | Bin 396 -> 0 bytes public/tiny_mce/plugins/table/langs/ar.js | 41 - public/tiny_mce/plugins/table/langs/cs.js | 41 - public/tiny_mce/plugins/table/langs/da.js | 41 - public/tiny_mce/plugins/table/langs/de.js | 41 - public/tiny_mce/plugins/table/langs/el.js | 41 - public/tiny_mce/plugins/table/langs/en.js | 41 - public/tiny_mce/plugins/table/langs/es.js | 41 - public/tiny_mce/plugins/table/langs/fa.js | 45 - public/tiny_mce/plugins/table/langs/fi.js | 41 - public/tiny_mce/plugins/table/langs/fr.js | 41 - public/tiny_mce/plugins/table/langs/fr_ca.js | 41 - public/tiny_mce/plugins/table/langs/hu.js | 41 - public/tiny_mce/plugins/table/langs/it.js | 41 - public/tiny_mce/plugins/table/langs/ja.js | 41 - public/tiny_mce/plugins/table/langs/ko.js | 41 - public/tiny_mce/plugins/table/langs/nl.js | 41 - public/tiny_mce/plugins/table/langs/no.js | 41 - public/tiny_mce/plugins/table/langs/pl.js | 39 - public/tiny_mce/plugins/table/langs/pt.js | 41 - .../tiny_mce/plugins/table/langs/readme.txt | 4 - public/tiny_mce/plugins/table/langs/sv.js | 41 - public/tiny_mce/plugins/table/langs/tw.js | 41 - public/tiny_mce/plugins/table/langs/zh_cn.js | 42 - public/tiny_mce/plugins/table/merge_cells.htm | 56 - public/tiny_mce/plugins/table/readme.txt | 44 - public/tiny_mce/plugins/table/row.htm | 127 - public/tiny_mce/plugins/table/table.htm | 153 - public/tiny_mce/plugins/zoom/editor_plugin.js | 7 - .../plugins/zoom/editor_plugin_src.js | 38 - public/tiny_mce/plugins/zoom/langs/fa.js | 8 - public/tiny_mce/plugins/zoom/langs/fr_ca.js | 3 - public/tiny_mce/plugins/zoom/langs/pl.js | 4 - public/tiny_mce/plugins/zoom/langs/pt_br.js | 3 - public/tiny_mce/plugins/zoom/langs/zh_cn.js | 5 - public/tiny_mce/plugins/zoom/readme.txt | 22 - public/tiny_mce/themes/advanced/anchor.htm | 45 - public/tiny_mce/themes/advanced/charmap.htm | 378 -- .../tiny_mce/themes/advanced/color_picker.htm | 271 - .../themes/advanced/docs/en/about.htm | 32 - .../advanced/docs/en/common_buttons.htm | 163 - .../docs/en/images/insert_anchor_window.gif | Bin 5189 -> 0 bytes .../docs/en/images/insert_image_window.gif | Bin 7195 -> 0 bytes .../docs/en/images/insert_link_window.gif | Bin 5658 -> 0 bytes .../docs/en/images/insert_table_window.gif | Bin 7094 -> 0 bytes .../themes/advanced/docs/en/index.htm | 27 - .../advanced/docs/en/insert_anchor_button.htm | 33 - .../advanced/docs/en/insert_image_button.htm | 66 - .../advanced/docs/en/insert_link_button.htm | 34 - .../advanced/docs/en/insert_table_button.htm | 72 - .../themes/advanced/docs/en/style.css | 28 - .../themes/advanced/docs/images/table.gif | Bin 1018 -> 0 bytes .../advanced/docs/images/table_delete_col.gif | Bin 929 -> 0 bytes .../advanced/docs/images/table_delete_row.gif | Bin 942 -> 0 bytes .../docs/images/table_insert_col_after.gif | Bin 936 -> 0 bytes .../docs/images/table_insert_col_before.gif | Bin 935 -> 0 bytes .../docs/images/table_insert_row_after.gif | Bin 928 -> 0 bytes .../docs/images/table_insert_row_before.gif | Bin 928 -> 0 bytes .../themes/advanced/editor_content.css | 27 - .../tiny_mce/themes/advanced/editor_popup.css | 121 - .../themes/advanced/editor_template.js | 31 - .../themes/advanced/editor_template_src.js | 1010 --- public/tiny_mce/themes/advanced/editor_ui.css | 199 - public/tiny_mce/themes/advanced/image.htm | 186 - .../themes/advanced/images/anchor.gif | Bin 943 -> 0 bytes .../themes/advanced/images/attachment.gif | Bin 182 -> 0 bytes .../themes/advanced/images/backcolor.gif | Bin 943 -> 0 bytes .../tiny_mce/themes/advanced/images/bold.gif | Bin 864 -> 0 bytes .../themes/advanced/images/bold_de_se.gif | Bin 79 -> 0 bytes .../themes/advanced/images/bold_fr.gif | Bin 78 -> 0 bytes .../themes/advanced/images/bold_ru.gif | Bin 77 -> 0 bytes .../themes/advanced/images/browse.gif | Bin 113 -> 0 bytes .../themes/advanced/images/bullist.gif | Bin 883 -> 0 bytes .../themes/advanced/images/buttons.gif | Bin 3889 -> 0 bytes .../themes/advanced/images/center.gif | Bin 855 -> 0 bytes .../themes/advanced/images/charmap.gif | Bin 958 -> 0 bytes .../themes/advanced/images/cleanup.gif | Bin 977 -> 0 bytes .../tiny_mce/themes/advanced/images/close.gif | Bin 110 -> 0 bytes .../tiny_mce/themes/advanced/images/code.gif | Bin 110 -> 0 bytes .../tiny_mce/themes/advanced/images/copy.gif | Bin 987 -> 0 bytes .../themes/advanced/images/custom_1.gif | Bin 854 -> 0 bytes .../tiny_mce/themes/advanced/images/cut.gif | Bin 358 -> 0 bytes .../themes/advanced/images/forecolor.gif | Bin 605 -> 0 bytes .../tiny_mce/themes/advanced/images/full.gif | Bin 856 -> 0 bytes .../tiny_mce/themes/advanced/images/help.gif | Bin 1027 -> 0 bytes public/tiny_mce/themes/advanced/images/hr.gif | Bin 844 -> 0 bytes .../tiny_mce/themes/advanced/images/image.gif | Bin 194 -> 0 bytes .../themes/advanced/images/indent.gif | Bin 890 -> 0 bytes .../themes/advanced/images/italic.gif | Bin 860 -> 0 bytes .../themes/advanced/images/italic_de_se.gif | Bin 81 -> 0 bytes .../themes/advanced/images/italic_ru.gif | Bin 78 -> 0 bytes .../tiny_mce/themes/advanced/images/left.gif | Bin 856 -> 0 bytes .../tiny_mce/themes/advanced/images/link.gif | Bin 545 -> 0 bytes .../themes/advanced/images/newdocument.gif | Bin 230 -> 0 bytes .../themes/advanced/images/numlist.gif | Bin 889 -> 0 bytes .../themes/advanced/images/outdent.gif | Bin 887 -> 0 bytes .../tiny_mce/themes/advanced/images/paste.gif | Bin 1022 -> 0 bytes .../tiny_mce/themes/advanced/images/redo.gif | Bin 942 -> 0 bytes .../themes/advanced/images/removeformat.gif | Bin 340 -> 0 bytes .../tiny_mce/themes/advanced/images/right.gif | Bin 855 -> 0 bytes .../themes/advanced/images/spacer.gif | Bin 43 -> 0 bytes .../themes/advanced/images/strikethrough.gif | Bin 873 -> 0 bytes .../tiny_mce/themes/advanced/images/sub.gif | Bin 900 -> 0 bytes .../tiny_mce/themes/advanced/images/sup.gif | Bin 906 -> 0 bytes .../tiny_mce/themes/advanced/images/table.gif | Bin 1018 -> 0 bytes .../advanced/images/table_delete_col.gif | Bin 929 -> 0 bytes .../advanced/images/table_delete_row.gif | Bin 942 -> 0 bytes .../images/table_insert_col_after.gif | Bin 936 -> 0 bytes .../images/table_insert_col_before.gif | Bin 935 -> 0 bytes .../images/table_insert_row_after.gif | Bin 928 -> 0 bytes .../images/table_insert_row_before.gif | Bin 928 -> 0 bytes .../themes/advanced/images/underline.gif | Bin 872 -> 0 bytes .../themes/advanced/images/underline_fr.gif | Bin 125 -> 0 bytes .../themes/advanced/images/underline_ru.gif | Bin 77 -> 0 bytes .../tiny_mce/themes/advanced/images/undo.gif | Bin 945 -> 0 bytes .../themes/advanced/images/unlink.gif | Bin 561 -> 0 bytes .../themes/advanced/images/visualaid.gif | Bin 1006 -> 0 bytes public/tiny_mce/themes/advanced/langs/ar.js | 60 - public/tiny_mce/themes/advanced/langs/ca.js | 61 - public/tiny_mce/themes/advanced/langs/cs.js | 60 - public/tiny_mce/themes/advanced/langs/da.js | 61 - public/tiny_mce/themes/advanced/langs/de.js | 63 - public/tiny_mce/themes/advanced/langs/el.js | 61 - public/tiny_mce/themes/advanced/langs/en.js | 61 - public/tiny_mce/themes/advanced/langs/es.js | 61 - public/tiny_mce/themes/advanced/langs/fa.js | 62 - public/tiny_mce/themes/advanced/langs/fi.js | 60 - public/tiny_mce/themes/advanced/langs/fr.js | 62 - .../tiny_mce/themes/advanced/langs/fr_ca.js | 60 - public/tiny_mce/themes/advanced/langs/hu.js | 61 - public/tiny_mce/themes/advanced/langs/it.js | 61 - public/tiny_mce/themes/advanced/langs/ja.js | 59 - public/tiny_mce/themes/advanced/langs/ko.js | 62 - public/tiny_mce/themes/advanced/langs/nl.js | 63 - public/tiny_mce/themes/advanced/langs/no.js | 63 - public/tiny_mce/themes/advanced/langs/pl.js | 61 - public/tiny_mce/themes/advanced/langs/pt.js | 62 - .../tiny_mce/themes/advanced/langs/pt_br.js | 61 - .../tiny_mce/themes/advanced/langs/readme.txt | 4 - public/tiny_mce/themes/advanced/langs/sv.js | 62 - public/tiny_mce/themes/advanced/langs/tw.js | 88 - .../tiny_mce/themes/advanced/langs/zh_cn.js | 62 - public/tiny_mce/themes/advanced/link.htm | 181 - .../themes/advanced/source_editor.htm | 86 - .../tiny_mce/themes/default/docs/en/about.htm | 32 - .../themes/default/docs/en/common_buttons.htm | 111 - .../docs/en/images/insert_image_window.gif | Bin 5680 -> 0 bytes .../docs/en/images/insert_link_window.gif | Bin 5658 -> 0 bytes .../tiny_mce/themes/default/docs/en/index.htm | 25 - .../default/docs/en/insert_image_button.htm | 34 - .../default/docs/en/insert_link_button.htm | 34 - .../tiny_mce/themes/default/docs/en/style.css | 28 - .../themes/default/editor_content.css | 27 - .../tiny_mce/themes/default/editor_popup.css | 41 - .../themes/default/editor_template.js | 32 - .../themes/default/editor_template_src.js | 151 - public/tiny_mce/themes/default/editor_ui.css | 100 - public/tiny_mce/themes/default/image.htm | 57 - .../tiny_mce/themes/default/images/bold.gif | Bin 864 -> 0 bytes .../themes/default/images/bold_de_se.gif | Bin 79 -> 0 bytes .../themes/default/images/bold_fr.gif | Bin 78 -> 0 bytes .../themes/default/images/bold_ru.gif | Bin 77 -> 0 bytes .../themes/default/images/bullist.gif | Bin 883 -> 0 bytes .../tiny_mce/themes/default/images/center.gif | Bin 855 -> 0 bytes .../themes/default/images/cleanup.gif | Bin 977 -> 0 bytes .../tiny_mce/themes/default/images/copy.gif | Bin 987 -> 0 bytes public/tiny_mce/themes/default/images/cut.gif | Bin 358 -> 0 bytes .../tiny_mce/themes/default/images/full.gif | Bin 856 -> 0 bytes .../tiny_mce/themes/default/images/help.gif | Bin 1027 -> 0 bytes .../tiny_mce/themes/default/images/image.gif | Bin 194 -> 0 bytes .../tiny_mce/themes/default/images/indent.gif | Bin 890 -> 0 bytes .../tiny_mce/themes/default/images/italic.gif | Bin 860 -> 0 bytes .../themes/default/images/italic_de_se.gif | Bin 81 -> 0 bytes .../themes/default/images/italic_ru.gif | Bin 78 -> 0 bytes .../tiny_mce/themes/default/images/left.gif | Bin 856 -> 0 bytes .../tiny_mce/themes/default/images/link.gif | Bin 545 -> 0 bytes .../themes/default/images/numlist.gif | Bin 889 -> 0 bytes .../themes/default/images/outdent.gif | Bin 887 -> 0 bytes .../tiny_mce/themes/default/images/paste.gif | Bin 1022 -> 0 bytes .../tiny_mce/themes/default/images/redo.gif | Bin 942 -> 0 bytes .../tiny_mce/themes/default/images/right.gif | Bin 855 -> 0 bytes .../tiny_mce/themes/default/images/spacer.gif | Bin 43 -> 0 bytes .../themes/default/images/strikethrough.gif | Bin 873 -> 0 bytes .../themes/default/images/underline.gif | Bin 872 -> 0 bytes .../themes/default/images/underline_ru.gif | Bin 77 -> 0 bytes .../tiny_mce/themes/default/images/undo.gif | Bin 945 -> 0 bytes .../tiny_mce/themes/default/images/unlink.gif | Bin 561 -> 0 bytes public/tiny_mce/themes/default/link.htm | 64 - .../tiny_mce/themes/simple/editor_content.css | 27 - .../tiny_mce/themes/simple/editor_popup.css | 41 - .../tiny_mce/themes/simple/editor_template.js | 20 - .../themes/simple/editor_template_src.js | 70 - public/tiny_mce/themes/simple/editor_ui.css | 100 - public/tiny_mce/themes/simple/images/bold.gif | Bin 864 -> 0 bytes .../themes/simple/images/bold_de_se.gif | Bin 79 -> 0 bytes .../tiny_mce/themes/simple/images/bold_fr.gif | Bin 78 -> 0 bytes .../tiny_mce/themes/simple/images/bold_ru.gif | Bin 77 -> 0 bytes .../tiny_mce/themes/simple/images/bullist.gif | Bin 883 -> 0 bytes .../tiny_mce/themes/simple/images/cleanup.gif | Bin 977 -> 0 bytes .../tiny_mce/themes/simple/images/italic.gif | Bin 860 -> 0 bytes .../themes/simple/images/italic_de_se.gif | Bin 81 -> 0 bytes .../themes/simple/images/italic_ru.gif | Bin 78 -> 0 bytes .../tiny_mce/themes/simple/images/numlist.gif | Bin 889 -> 0 bytes public/tiny_mce/themes/simple/images/redo.gif | Bin 942 -> 0 bytes .../tiny_mce/themes/simple/images/spacer.gif | Bin 43 -> 0 bytes .../themes/simple/images/strikethrough.gif | Bin 873 -> 0 bytes .../themes/simple/images/underline.gif | Bin 129 -> 0 bytes .../themes/simple/images/underline_ru.gif | Bin 77 -> 0 bytes public/tiny_mce/themes/simple/images/undo.gif | Bin 945 -> 0 bytes public/tiny_mce/tiny_mce.js | 12 - public/tiny_mce/tiny_mce_gzip.php | 88 - public/tiny_mce/tiny_mce_popup.js | 96 - public/tiny_mce/tiny_mce_src.js | 4884 --------------- script/about | 4 - script/benchmarker | 19 - script/breakpointer | 3 - script/console | 3 - script/console_sandbox.rb | 7 - script/dbconsole | 3 - script/destroy | 3 - script/generate | 3 - script/lighttpd | 2 - script/local2gettext | 47 - script/localize | 48 - script/performance/benchmarker | 3 - script/performance/profiler | 3 - script/performance/request | 3 - script/plugin | 3 - script/process/inspector | 3 - script/process/reaper | 3 - script/process/spawner | 3 - script/process/spinner | 3 - script/profiler | 34 - script/rails | 6 + script/rgettext.rb | 215 - script/runner | 3 - script/scgi_rails | 339 - script/server | 3 - test/fixtures/expressions.yml | 5 - test/fixtures/filters.yml | 5 - test/fixtures/users.yml | 5 - test/performance/browsing_test.rb | 9 + test/test_helper.rb | 18 +- test/unit/expression_test.rb | 14 - test/unit/filter_test.rb | 14 - test/unit/user_test.rb | 14 - vendor/ezcrypto-0.1.1/._README | Bin vendor/ezcrypto-0.1.1/._rakefile | Bin vendor/ezcrypto-0.1.1/MIT-LICENSE | 0 vendor/ezcrypto-0.1.1/README | 0 vendor/ezcrypto-0.1.1/lib/ezcrypto.rb | 0 vendor/ezcrypto-0.1.1/rakefile | 0 vendor/ezcrypto-0.1.1/test/ezcrypto_test.rb | 0 vendor/plugins/.gitkeep | 0 vendor/plugins/auto_complete/README | 0 vendor/plugins/auto_complete/Rakefile | 0 vendor/plugins/auto_complete/init.rb | 0 .../auto_complete/lib/auto_complete.rb | 0 .../lib/auto_complete_macros_helper.rb | 0 .../auto_complete/test/auto_complete_test.rb | 0 vendor/plugins/classic_pagination/CHANGELOG | 0 vendor/plugins/classic_pagination/README | 0 vendor/plugins/classic_pagination/Rakefile | 0 vendor/plugins/classic_pagination/init.rb | 0 vendor/plugins/classic_pagination/install.rb | 0 .../classic_pagination/lib/pagination.rb | 0 .../lib/pagination_helper.rb | 0 .../test/fixtures/companies.yml | 0 .../test/fixtures/company.rb | 0 .../test/fixtures/developer.rb | 0 .../test/fixtures/developers.yml | 0 .../test/fixtures/developers_projects.yml | 0 .../test/fixtures/project.rb | 0 .../test/fixtures/projects.yml | 0 .../test/fixtures/replies.yml | 0 .../classic_pagination/test/fixtures/reply.rb | 0 .../test/fixtures/schema.sql | 0 .../classic_pagination/test/fixtures/topic.rb | 0 .../test/fixtures/topics.yml | 0 .../plugins/classic_pagination/test/helper.rb | 0 .../test/pagination_helper_test.rb | 0 .../test/pagination_test.rb | 0 vendor/plugins/will_paginate/.autotest | 54 - vendor/plugins/will_paginate/.gitignore | 4 - vendor/plugins/will_paginate/.manifest | 66 - vendor/plugins/will_paginate/CHANGELOG.rdoc | 104 - vendor/plugins/will_paginate/LICENSE | 18 - vendor/plugins/will_paginate/README.rdoc | 123 - vendor/plugins/will_paginate/Rakefile | 62 - .../will_paginate/examples/apple-circle.gif | Bin 178 -> 0 bytes .../plugins/will_paginate/examples/index.haml | 69 - .../plugins/will_paginate/examples/index.html | 92 - .../will_paginate/examples/pagination.css | 90 - .../will_paginate/examples/pagination.sass | 91 - vendor/plugins/will_paginate/init.rb | 1 - .../will_paginate/lib/will_paginate.rb | 43 - .../will_paginate/lib/will_paginate/array.rb | 33 - .../lib/will_paginate/collection.rb | 145 - .../lib/will_paginate/core_ext.rb | 58 - .../lib/will_paginate/deprecation.rb | 50 - .../lib/will_paginate/finders.rb | 9 - .../will_paginate/finders/active_record.rb | 204 - .../finders/active_record/named_scope.rb | 170 - .../active_record/named_scope_patch.rb | 39 - .../will_paginate/finders/active_resource.rb | 48 - .../lib/will_paginate/finders/base.rb | 80 - .../lib/will_paginate/finders/data_mapper.rb | 30 - .../lib/will_paginate/version.rb | 9 - .../lib/will_paginate/view_helpers.rb | 39 - .../will_paginate/view_helpers/action_view.rb | 82 - .../lib/will_paginate/view_helpers/base.rb | 137 - .../view_helpers/link_renderer.rb | 177 - .../view_helpers/link_renderer_base.rb | 76 - .../will_paginate/spec/collection_spec.rb | 147 - vendor/plugins/will_paginate/spec/console | 8 - .../will_paginate/spec/console_fixtures.rb | 8 - .../plugins/will_paginate/spec/database.yml | 22 - .../spec/finders/active_record_spec.rb | 460 -- .../spec/finders/active_resource_spec.rb | 52 - .../finders/activerecord_test_connector.rb | 107 - .../will_paginate/spec/finders_spec.rb | 76 - .../will_paginate/spec/fixtures/admin.rb | 3 - .../will_paginate/spec/fixtures/developer.rb | 13 - .../spec/fixtures/developers_projects.yml | 13 - .../will_paginate/spec/fixtures/project.rb | 15 - .../will_paginate/spec/fixtures/projects.yml | 6 - .../will_paginate/spec/fixtures/replies.yml | 29 - .../will_paginate/spec/fixtures/reply.rb | 7 - .../will_paginate/spec/fixtures/schema.rb | 38 - .../will_paginate/spec/fixtures/topic.rb | 6 - .../will_paginate/spec/fixtures/topics.yml | 30 - .../will_paginate/spec/fixtures/user.rb | 2 - .../will_paginate/spec/fixtures/users.yml | 35 - vendor/plugins/will_paginate/spec/rcov.opts | 2 - vendor/plugins/will_paginate/spec/spec.opts | 2 - .../plugins/will_paginate/spec/spec_helper.rb | 76 - vendor/plugins/will_paginate/spec/tasks.rake | 34 - .../spec/view_helpers/action_view_spec.rb | 343 - .../spec/view_helpers/base_spec.rb | 64 - .../view_helpers/link_renderer_base_spec.rb | 84 - .../spec/view_helpers/view_example_group.rb | 111 - .../will_paginate/will_paginate.gemspec | 20 - 752 files changed, 4866 insertions(+), 27923 deletions(-) create mode 100644 AUTHORS delete mode 100644 CHANGELOG create mode 100755 Gemfile create mode 100755 Gemfile.lock delete mode 100644 MIT-LICENSE delete mode 100644 README create mode 100755 README.markdown mode change 100644 => 100755 Rakefile create mode 100644 UNLICENSE mode change 100644 => 100755 app/controllers/application_controller.rb mode change 100644 => 100755 app/controllers/contact_groups_controller.rb mode change 100644 => 100755 app/controllers/contacts_controller.rb mode change 100644 => 100755 app/controllers/folders_controller.rb mode change 100644 => 100755 app/controllers/login_controller.rb mode change 100644 => 100755 app/controllers/webmail_controller.rb mode change 100644 => 100755 app/helpers/application_helper.rb mode change 100644 => 100755 app/helpers/contact_group_helper.rb mode change 100644 => 100755 app/helpers/contacts_helper.rb mode change 100644 => 100755 app/helpers/folders_helper.rb mode change 100644 => 100755 app/helpers/navigation_helper.rb mode change 100644 => 100755 app/helpers/webmail_helper.rb mode change 100644 => 100755 app/models/contact.rb mode change 100644 => 100755 app/models/contact_group.rb mode change 100644 => 100755 app/models/customer.rb mode change 100644 => 100755 app/models/mail_pref.rb rename app/views/contact_groups/{edit.rhtml => edit.html.erb} (100%) mode change 100644 => 100755 mode change 100644 => 100755 app/views/contact_groups/index.html.erb rename app/views/contacts/{add_multiple.rhtml => add_multiple.html.erb} (100%) mode change 100644 => 100755 rename app/views/contacts/{choose.rhtml => choose.html.erb} (100%) mode change 100644 => 100755 rename app/views/contacts/{import_preview.rhtml => import_preview.html.erb} (100%) mode change 100644 => 100755 mode change 100644 => 100755 app/views/contacts/index.html.erb mode change 100644 => 100755 app/views/contacts/new.html.erb mode change 100644 => 100755 app/views/folders/index.html.erb mode change 100644 => 100755 app/views/layouts/chooser.html.erb mode change 100644 => 100755 app/views/layouts/login.html.erb mode change 100644 => 100755 app/views/layouts/public.html.erb mode change 100644 => 100755 app/views/login/index.rhtml mode change 100644 => 100755 app/views/shared/_folders.html.erb rename app/views/webmail/{_contacts.rhtml => _contacts.html.erb} (100%) mode change 100644 => 100755 rename app/views/webmail/{_expr.rhtml => _expr.html.erb} (100%) mode change 100644 => 100755 rename app/views/webmail/{_filter.rhtml => _filter.html.erb} (100%) mode change 100644 => 100755 rename app/views/webmail/{_message_row.rhtml => _message_row.html.erb} (100%) mode change 100644 => 100755 rename app/views/webmail/{_search.rhtml => _search.html.erb} (100%) mode change 100644 => 100755 rename app/views/webmail/{compose.rhtml => compose.html.erb} (100%) mode change 100644 => 100755 rename app/views/webmail/{error_connection.rhtml => error_connection.html.erb} (100%) mode change 100644 => 100755 rename app/views/webmail/{filter.rhtml => filter.html.erb} (100%) mode change 100644 => 100755 rename app/views/webmail/{filters.rhtml => filters.html.erb} (100%) mode change 100644 => 100755 rename app/views/webmail/{folders.rhtml => folders.html.erb} (100%) mode change 100644 => 100755 rename app/views/webmail/{mailsent.rhtml => mailsent.html.erb} (100%) mode change 100644 => 100755 rename app/views/webmail/{message.rhtml => message.html.erb} (100%) mode change 100644 => 100755 rename app/views/webmail/{messages.rhtml => messages.html.erb} (96%) mode change 100644 => 100755 rename app/views/webmail/{noattachment.rhtml => noattachment.html.erb} (100%) mode change 100644 => 100755 rename app/views/webmail/{prefs.rhtml => prefs.html.erb} (100%) mode change 100644 => 100755 rename app/views/webmail/{view_source.rhtml => view_source.html.erb} (100%) mode change 100644 => 100755 create mode 100755 arts/logo.png create mode 100755 arts/logo.xcf create mode 100755 config.ru create mode 100755 config/application.rb mode change 100644 => 100755 config/boot.rb mode change 100644 => 100755 config/default_site.rb mode change 100644 => 100755 config/environment.rb mode change 100644 => 100755 config/environments/development.rb mode change 100644 => 100755 config/environments/production.rb mode change 100644 => 100755 config/environments/test.rb create mode 100755 config/initializers/backtrace_silencers.rb create mode 100755 config/initializers/inflections.rb create mode 100755 config/initializers/mime_types.rb create mode 100755 config/initializers/pluralization.rb create mode 100755 config/initializers/secret_token.rb create mode 100755 config/initializers/session_store.rb delete mode 100644 config/lighttpd.conf mode change 100644 => 100755 config/locales/en.yml mode change 100644 => 100755 config/locales/es-ES.yml rename config/locales/{pl-PL.yml => pl.yml} (96%) mode change 100644 => 100755 mode change 100644 => 100755 config/routes.rb mode change 100644 => 100755 db/migrate/20090107193228_init.rb delete mode 100644 db/schema.mysql.sql delete mode 100644 db/schema.pgsql.sql mode change 100644 => 100755 db/schema.rb create mode 100755 db/seeds.rb mode change 100644 => 100755 doc/README_FOR_APP mode change 100644 => 100755 lib/cdfutils.rb mode change 100644 => 100755 lib/imap_utils.rb create mode 100755 lib/tasks/.gitkeep mode change 100644 => 100755 lib/tmail_patch.rb mode change 100644 => 100755 lib/webmail/bounced_mail.rb mode change 100644 => 100755 lib/webmail/cdfmail.rb mode change 100644 => 100755 lib/webmail/environment.rb mode change 100644 => 100755 lib/webmail/expression.rb mode change 100644 => 100755 lib/webmail/filter.rb mode change 100644 => 100755 lib/webmail/imap_message.rb mode change 100644 => 100755 lib/webmail/imapmailbox.rb mode change 100644 => 100755 lib/webmail/mail2screen.rb mode change 100644 => 100755 lib/webmail/mail_transform.rb mode change 100644 => 100755 lib/webmail/maildropserializator.rb mode change 100644 => 100755 lib/webmail/routes.rb mode change 100644 => 100755 lib/webmail/virtual_email.rb mode change 100644 => 100755 public/404.html create mode 100755 public/422.html mode change 100644 => 100755 public/500.html mode change 100644 => 100755 public/favicon.ico mode change 100644 => 100755 public/images/attachment.png mode change 100644 => 100755 public/images/d6deec.gif mode change 100644 => 100755 public/images/deselect.png mode change 100644 => 100755 public/images/list_closed.gif mode change 100644 => 100755 public/images/list_opened.gif mode change 100644 => 100755 public/images/noprogress.gif create mode 100755 public/images/rails.png mode change 100644 => 100755 public/images/select.png mode change 100644 => 100755 public/images/white.gif mode change 100644 => 100755 public/images/white.png mode change 100644 => 100755 public/javascripts/application.js mode change 100644 => 100755 public/javascripts/controls.js mode change 100644 => 100755 public/javascripts/dragdrop.js mode change 100644 => 100755 public/javascripts/effects.js mode change 100644 => 100755 public/javascripts/effects2.js mode change 100644 => 100755 public/javascripts/global.js mode change 100644 => 100755 public/javascripts/global_src.js mode change 100644 => 100755 public/javascripts/prototype.js mode change 100644 => 100755 public/javascripts/prototype_src.js create mode 100755 public/javascripts/rails.js mode change 100644 => 100755 public/javascripts/scriptaculous.js mode change 100644 => 100755 public/javascripts/slider.js create mode 100755 public/robots.txt create mode 100755 public/stylesheets/.gitkeep mode change 100644 => 100755 public/stylesheets/admin.css mode change 100644 => 100755 public/stylesheets/mailr.css mode change 100644 => 100755 public/stylesheets/tabs.css mode change 100644 => 100755 public/stylesheets/webmail/icon-folder-open.gif delete mode 100644 public/tiny_mce/blank.htm delete mode 100755 public/tiny_mce/jstrim.pl delete mode 100644 public/tiny_mce/langs/ar.js delete mode 100644 public/tiny_mce/langs/ca.js delete mode 100644 public/tiny_mce/langs/cs.js delete mode 100644 public/tiny_mce/langs/da.js delete mode 100644 public/tiny_mce/langs/de.js delete mode 100644 public/tiny_mce/langs/el.js delete mode 100644 public/tiny_mce/langs/en.js delete mode 100644 public/tiny_mce/langs/es.js delete mode 100644 public/tiny_mce/langs/fa.js delete mode 100644 public/tiny_mce/langs/fi.js delete mode 100644 public/tiny_mce/langs/fr.js delete mode 100644 public/tiny_mce/langs/fr_ca.js delete mode 100644 public/tiny_mce/langs/hu.js delete mode 100644 public/tiny_mce/langs/it.js delete mode 100644 public/tiny_mce/langs/ja.js delete mode 100644 public/tiny_mce/langs/ko.js delete mode 100644 public/tiny_mce/langs/nl.js delete mode 100644 public/tiny_mce/langs/no.js delete mode 100644 public/tiny_mce/langs/pl.js delete mode 100644 public/tiny_mce/langs/pt.js delete mode 100644 public/tiny_mce/langs/pt_br.js delete mode 100644 public/tiny_mce/langs/readme.txt delete mode 100644 public/tiny_mce/langs/ru.js delete mode 100644 public/tiny_mce/langs/sv.js delete mode 100644 public/tiny_mce/langs/th.js delete mode 100644 public/tiny_mce/langs/zh_cn.js delete mode 100644 public/tiny_mce/plugins/_template/editor_plugin.js delete mode 100644 public/tiny_mce/plugins/_template/images/template.gif delete mode 100644 public/tiny_mce/plugins/_template/langs/en.js delete mode 100644 public/tiny_mce/plugins/_template/langs/zh_cn.js delete mode 100644 public/tiny_mce/plugins/_template/popup.htm delete mode 100644 public/tiny_mce/plugins/_template/readme.txt delete mode 100644 public/tiny_mce/plugins/advhr/editor_plugin.js delete mode 100644 public/tiny_mce/plugins/advhr/editor_plugin_src.js delete mode 100644 public/tiny_mce/plugins/advhr/images/advhr.gif delete mode 100644 public/tiny_mce/plugins/advhr/langs/cs.js delete mode 100644 public/tiny_mce/plugins/advhr/langs/de.js delete mode 100644 public/tiny_mce/plugins/advhr/langs/en.js delete mode 100644 public/tiny_mce/plugins/advhr/langs/fa.js delete mode 100644 public/tiny_mce/plugins/advhr/langs/fr.js delete mode 100644 public/tiny_mce/plugins/advhr/langs/fr_ca.js delete mode 100644 public/tiny_mce/plugins/advhr/langs/pl.js delete mode 100644 public/tiny_mce/plugins/advhr/langs/pt_br.js delete mode 100644 public/tiny_mce/plugins/advhr/langs/sv.js delete mode 100644 public/tiny_mce/plugins/advhr/langs/zh_cn.js delete mode 100644 public/tiny_mce/plugins/advhr/readme.txt delete mode 100644 public/tiny_mce/plugins/advhr/rule.htm delete mode 100644 public/tiny_mce/plugins/advimage/editor_plugin.js delete mode 100644 public/tiny_mce/plugins/advimage/editor_plugin_src.js delete mode 100644 public/tiny_mce/plugins/advimage/image.htm delete mode 100644 public/tiny_mce/plugins/advimage/langs/cs.js delete mode 100644 public/tiny_mce/plugins/advimage/langs/de.js delete mode 100644 public/tiny_mce/plugins/advimage/langs/en.js delete mode 100644 public/tiny_mce/plugins/advimage/langs/fa.js delete mode 100644 public/tiny_mce/plugins/advimage/langs/fr.js delete mode 100644 public/tiny_mce/plugins/advimage/langs/fr_ca.js delete mode 100644 public/tiny_mce/plugins/advimage/langs/ko.js delete mode 100644 public/tiny_mce/plugins/advimage/langs/pl.js delete mode 100644 public/tiny_mce/plugins/advimage/langs/pt_br.js delete mode 100644 public/tiny_mce/plugins/advimage/langs/sv.js delete mode 100644 public/tiny_mce/plugins/advimage/langs/zh_cn.js delete mode 100644 public/tiny_mce/plugins/advimage/readme.txt delete mode 100644 public/tiny_mce/plugins/advlink/editor_plugin.js delete mode 100644 public/tiny_mce/plugins/advlink/editor_plugin_src.js delete mode 100644 public/tiny_mce/plugins/advlink/langs/cs.js delete mode 100644 public/tiny_mce/plugins/advlink/langs/de.js delete mode 100644 public/tiny_mce/plugins/advlink/langs/en.js delete mode 100644 public/tiny_mce/plugins/advlink/langs/fa.js delete mode 100644 public/tiny_mce/plugins/advlink/langs/fr.js delete mode 100644 public/tiny_mce/plugins/advlink/langs/fr_ca.js delete mode 100644 public/tiny_mce/plugins/advlink/langs/ko.js delete mode 100644 public/tiny_mce/plugins/advlink/langs/pl.js delete mode 100644 public/tiny_mce/plugins/advlink/langs/pt_br.js delete mode 100644 public/tiny_mce/plugins/advlink/langs/sv.js delete mode 100644 public/tiny_mce/plugins/advlink/langs/zh_cn.js delete mode 100644 public/tiny_mce/plugins/advlink/link.htm delete mode 100644 public/tiny_mce/plugins/advlink/readme.txt delete mode 100644 public/tiny_mce/plugins/contextmenu/contextmenu.css delete mode 100644 public/tiny_mce/plugins/contextmenu/editor_plugin.js delete mode 100644 public/tiny_mce/plugins/contextmenu/editor_plugin_src.js delete mode 100644 public/tiny_mce/plugins/contextmenu/images/spacer.gif delete mode 100644 public/tiny_mce/plugins/directionality/editor_plugin.js delete mode 100644 public/tiny_mce/plugins/directionality/editor_plugin_src.js delete mode 100644 public/tiny_mce/plugins/directionality/images/ltr.gif delete mode 100644 public/tiny_mce/plugins/directionality/images/rtl.gif delete mode 100644 public/tiny_mce/plugins/directionality/langs/en.js delete mode 100644 public/tiny_mce/plugins/directionality/langs/sv.js delete mode 100644 public/tiny_mce/plugins/directionality/langs/zh_cn.js delete mode 100644 public/tiny_mce/plugins/directionality/readme.txt delete mode 100644 public/tiny_mce/plugins/emotions/editor_plugin.js delete mode 100644 public/tiny_mce/plugins/emotions/editor_plugin_src.js delete mode 100644 public/tiny_mce/plugins/emotions/emotions.htm delete mode 100644 public/tiny_mce/plugins/emotions/images/emotions.gif delete mode 100644 public/tiny_mce/plugins/emotions/images/readme.txt delete mode 100644 public/tiny_mce/plugins/emotions/images/smiley-cool.gif delete mode 100644 public/tiny_mce/plugins/emotions/images/smiley-cry.gif delete mode 100644 public/tiny_mce/plugins/emotions/images/smiley-embarassed.gif delete mode 100644 public/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif delete mode 100644 public/tiny_mce/plugins/emotions/images/smiley-frown.gif delete mode 100644 public/tiny_mce/plugins/emotions/images/smiley-innocent.gif delete mode 100644 public/tiny_mce/plugins/emotions/images/smiley-kiss.gif delete mode 100644 public/tiny_mce/plugins/emotions/images/smiley-laughing.gif delete mode 100644 public/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif delete mode 100644 public/tiny_mce/plugins/emotions/images/smiley-sealed.gif delete mode 100644 public/tiny_mce/plugins/emotions/images/smiley-smile.gif delete mode 100644 public/tiny_mce/plugins/emotions/images/smiley-surprised.gif delete mode 100644 public/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif delete mode 100644 public/tiny_mce/plugins/emotions/images/smiley-undecided.gif delete mode 100644 public/tiny_mce/plugins/emotions/images/smiley-wink.gif delete mode 100644 public/tiny_mce/plugins/emotions/images/smiley-yell.gif delete mode 100644 public/tiny_mce/plugins/emotions/langs/cs.js delete mode 100644 public/tiny_mce/plugins/emotions/langs/de.js delete mode 100644 public/tiny_mce/plugins/emotions/langs/el.js delete mode 100644 public/tiny_mce/plugins/emotions/langs/en.js delete mode 100644 public/tiny_mce/plugins/emotions/langs/fa.js delete mode 100644 public/tiny_mce/plugins/emotions/langs/fr.js delete mode 100644 public/tiny_mce/plugins/emotions/langs/fr_ca.js delete mode 100644 public/tiny_mce/plugins/emotions/langs/it.js delete mode 100644 public/tiny_mce/plugins/emotions/langs/ko.js delete mode 100644 public/tiny_mce/plugins/emotions/langs/pl.js delete mode 100644 public/tiny_mce/plugins/emotions/langs/pt_br.js delete mode 100644 public/tiny_mce/plugins/emotions/langs/sv.js delete mode 100644 public/tiny_mce/plugins/emotions/langs/zh_cn.js delete mode 100644 public/tiny_mce/plugins/emotions/readme.txt delete mode 100644 public/tiny_mce/plugins/flash/editor_plugin.js delete mode 100644 public/tiny_mce/plugins/flash/editor_plugin_src.js delete mode 100644 public/tiny_mce/plugins/flash/flash.css delete mode 100644 public/tiny_mce/plugins/flash/flash.htm delete mode 100644 public/tiny_mce/plugins/flash/images/flash.gif delete mode 100644 public/tiny_mce/plugins/flash/langs/cs.js delete mode 100644 public/tiny_mce/plugins/flash/langs/de.js delete mode 100644 public/tiny_mce/plugins/flash/langs/en.js delete mode 100644 public/tiny_mce/plugins/flash/langs/fa.js delete mode 100644 public/tiny_mce/plugins/flash/langs/fr.js delete mode 100644 public/tiny_mce/plugins/flash/langs/fr_ca.js delete mode 100644 public/tiny_mce/plugins/flash/langs/pl.js delete mode 100644 public/tiny_mce/plugins/flash/langs/pt_br.js delete mode 100644 public/tiny_mce/plugins/flash/langs/sv.js delete mode 100644 public/tiny_mce/plugins/flash/langs/zh_cn.js delete mode 100644 public/tiny_mce/plugins/flash/readme.txt delete mode 100644 public/tiny_mce/plugins/fullscreen/editor_plugin.js delete mode 100644 public/tiny_mce/plugins/fullscreen/editor_plugin_src.js delete mode 100644 public/tiny_mce/plugins/fullscreen/fullscreen.htm delete mode 100644 public/tiny_mce/plugins/fullscreen/images/fullscreen.gif delete mode 100644 public/tiny_mce/plugins/fullscreen/langs/cs.js delete mode 100644 public/tiny_mce/plugins/fullscreen/langs/en.js delete mode 100644 public/tiny_mce/plugins/fullscreen/langs/sv.js delete mode 100644 public/tiny_mce/plugins/fullscreen/langs/zh_cn.js delete mode 100644 public/tiny_mce/plugins/fullscreen/readme.txt delete mode 100644 public/tiny_mce/plugins/iespell/editor_plugin.js delete mode 100644 public/tiny_mce/plugins/iespell/editor_plugin_src.js delete mode 100644 public/tiny_mce/plugins/iespell/images/iespell.gif delete mode 100644 public/tiny_mce/plugins/iespell/langs/cs.js delete mode 100644 public/tiny_mce/plugins/iespell/langs/de.js delete mode 100644 public/tiny_mce/plugins/iespell/langs/el.js delete mode 100644 public/tiny_mce/plugins/iespell/langs/en.js delete mode 100644 public/tiny_mce/plugins/iespell/langs/fr.js delete mode 100644 public/tiny_mce/plugins/iespell/langs/fr_ca.js delete mode 100644 public/tiny_mce/plugins/iespell/langs/it.js delete mode 100644 public/tiny_mce/plugins/iespell/langs/ko.js delete mode 100644 public/tiny_mce/plugins/iespell/langs/pl.js delete mode 100644 public/tiny_mce/plugins/iespell/langs/pt_br.js delete mode 100644 public/tiny_mce/plugins/iespell/langs/sv.js delete mode 100644 public/tiny_mce/plugins/iespell/langs/zh_cn.js delete mode 100644 public/tiny_mce/plugins/iespell/readme.txt delete mode 100644 public/tiny_mce/plugins/insertdatetime/editor_plugin.js delete mode 100644 public/tiny_mce/plugins/insertdatetime/editor_plugin_src.js delete mode 100644 public/tiny_mce/plugins/insertdatetime/images/insertdate.gif delete mode 100644 public/tiny_mce/plugins/insertdatetime/images/inserttime.gif delete mode 100644 public/tiny_mce/plugins/insertdatetime/langs/cs.js delete mode 100644 public/tiny_mce/plugins/insertdatetime/langs/de.js delete mode 100644 public/tiny_mce/plugins/insertdatetime/langs/el.js delete mode 100644 public/tiny_mce/plugins/insertdatetime/langs/en.js delete mode 100644 public/tiny_mce/plugins/insertdatetime/langs/fa.js delete mode 100644 public/tiny_mce/plugins/insertdatetime/langs/fr.js delete mode 100644 public/tiny_mce/plugins/insertdatetime/langs/fr_ca.js delete mode 100644 public/tiny_mce/plugins/insertdatetime/langs/it.js delete mode 100644 public/tiny_mce/plugins/insertdatetime/langs/ko.js delete mode 100644 public/tiny_mce/plugins/insertdatetime/langs/pl.js delete mode 100644 public/tiny_mce/plugins/insertdatetime/langs/pt_br.js delete mode 100644 public/tiny_mce/plugins/insertdatetime/langs/sv.js delete mode 100644 public/tiny_mce/plugins/insertdatetime/langs/zh_cn.js delete mode 100644 public/tiny_mce/plugins/insertdatetime/readme.txt delete mode 100644 public/tiny_mce/plugins/linkattach/attachment.htm delete mode 100644 public/tiny_mce/plugins/linkattach/editor_plugin.js delete mode 100644 public/tiny_mce/plugins/linkattach/editor_plugin_src.js delete mode 100644 public/tiny_mce/plugins/linkattach/langs/en.js delete mode 100644 public/tiny_mce/plugins/paste/blank.htm delete mode 100644 public/tiny_mce/plugins/paste/editor_plugin.js delete mode 100644 public/tiny_mce/plugins/paste/editor_plugin_src.js delete mode 100644 public/tiny_mce/plugins/paste/images/pastetext.gif delete mode 100644 public/tiny_mce/plugins/paste/images/pasteword.gif delete mode 100644 public/tiny_mce/plugins/paste/images/selectall.gif delete mode 100644 public/tiny_mce/plugins/paste/langs/cs.js delete mode 100644 public/tiny_mce/plugins/paste/langs/en.js delete mode 100644 public/tiny_mce/plugins/paste/langs/sv.js delete mode 100644 public/tiny_mce/plugins/paste/langs/zh_cn.js delete mode 100644 public/tiny_mce/plugins/paste/pastetext.htm delete mode 100644 public/tiny_mce/plugins/paste/pasteword.htm delete mode 100644 public/tiny_mce/plugins/paste/readme.txt delete mode 100644 public/tiny_mce/plugins/preview/editor_plugin.js delete mode 100644 public/tiny_mce/plugins/preview/editor_plugin_src.js delete mode 100644 public/tiny_mce/plugins/preview/example.html delete mode 100644 public/tiny_mce/plugins/preview/images/preview.gif delete mode 100644 public/tiny_mce/plugins/preview/langs/cs.js delete mode 100644 public/tiny_mce/plugins/preview/langs/de.js delete mode 100644 public/tiny_mce/plugins/preview/langs/el.js delete mode 100644 public/tiny_mce/plugins/preview/langs/en.js delete mode 100644 public/tiny_mce/plugins/preview/langs/fa.js delete mode 100644 public/tiny_mce/plugins/preview/langs/fr.js delete mode 100644 public/tiny_mce/plugins/preview/langs/fr_ca.js delete mode 100644 public/tiny_mce/plugins/preview/langs/it.js delete mode 100644 public/tiny_mce/plugins/preview/langs/ko.js delete mode 100644 public/tiny_mce/plugins/preview/langs/pl.js delete mode 100644 public/tiny_mce/plugins/preview/langs/pt.js delete mode 100644 public/tiny_mce/plugins/preview/langs/pt_br.js delete mode 100644 public/tiny_mce/plugins/preview/langs/sv.js delete mode 100644 public/tiny_mce/plugins/preview/langs/zh_cn.js delete mode 100644 public/tiny_mce/plugins/preview/readme.txt delete mode 100644 public/tiny_mce/plugins/print/editor_plugin.js delete mode 100644 public/tiny_mce/plugins/print/editor_plugin_src.js delete mode 100644 public/tiny_mce/plugins/print/images/print.gif delete mode 100644 public/tiny_mce/plugins/print/langs/cs.js delete mode 100644 public/tiny_mce/plugins/print/langs/de.js delete mode 100644 public/tiny_mce/plugins/print/langs/en.js delete mode 100644 public/tiny_mce/plugins/print/langs/fa.js delete mode 100644 public/tiny_mce/plugins/print/langs/fr.js delete mode 100644 public/tiny_mce/plugins/print/langs/fr_ca.js delete mode 100644 public/tiny_mce/plugins/print/langs/pl.js delete mode 100644 public/tiny_mce/plugins/print/langs/pt_br.js delete mode 100644 public/tiny_mce/plugins/print/langs/sv.js delete mode 100644 public/tiny_mce/plugins/print/langs/zh_cn.js delete mode 100644 public/tiny_mce/plugins/print/readme.txt delete mode 100644 public/tiny_mce/plugins/readme.txt delete mode 100644 public/tiny_mce/plugins/save/editor_plugin.js delete mode 100644 public/tiny_mce/plugins/save/editor_plugin_src.js delete mode 100644 public/tiny_mce/plugins/save/images/save.gif delete mode 100644 public/tiny_mce/plugins/save/langs/cs.js delete mode 100644 public/tiny_mce/plugins/save/langs/de.js delete mode 100644 public/tiny_mce/plugins/save/langs/en.js delete mode 100644 public/tiny_mce/plugins/save/langs/fa.js delete mode 100644 public/tiny_mce/plugins/save/langs/fr.js delete mode 100644 public/tiny_mce/plugins/save/langs/fr_ca.js delete mode 100644 public/tiny_mce/plugins/save/langs/pl.js delete mode 100644 public/tiny_mce/plugins/save/langs/pt_br.js delete mode 100644 public/tiny_mce/plugins/save/langs/zh_cn.js delete mode 100644 public/tiny_mce/plugins/save/readme.txt delete mode 100644 public/tiny_mce/plugins/searchreplace/editor_plugin.js delete mode 100644 public/tiny_mce/plugins/searchreplace/editor_plugin_src.js delete mode 100644 public/tiny_mce/plugins/searchreplace/images/replace.gif delete mode 100644 public/tiny_mce/plugins/searchreplace/images/search.gif delete mode 100644 public/tiny_mce/plugins/searchreplace/langs/cs.js delete mode 100644 public/tiny_mce/plugins/searchreplace/langs/de.js delete mode 100644 public/tiny_mce/plugins/searchreplace/langs/en.js delete mode 100644 public/tiny_mce/plugins/searchreplace/langs/fa.js delete mode 100644 public/tiny_mce/plugins/searchreplace/langs/fr.js delete mode 100644 public/tiny_mce/plugins/searchreplace/langs/fr_ca.js delete mode 100644 public/tiny_mce/plugins/searchreplace/langs/pl.js delete mode 100644 public/tiny_mce/plugins/searchreplace/langs/pt_br.js delete mode 100644 public/tiny_mce/plugins/searchreplace/langs/sv.js delete mode 100644 public/tiny_mce/plugins/searchreplace/langs/zh_cn.js delete mode 100644 public/tiny_mce/plugins/searchreplace/readme.txt delete mode 100644 public/tiny_mce/plugins/searchreplace/replace.htm delete mode 100644 public/tiny_mce/plugins/searchreplace/search.htm delete mode 100644 public/tiny_mce/plugins/table/cell.htm delete mode 100644 public/tiny_mce/plugins/table/editor_plugin.js delete mode 100644 public/tiny_mce/plugins/table/editor_plugin_src.js delete mode 100644 public/tiny_mce/plugins/table/images/buttons.gif delete mode 100644 public/tiny_mce/plugins/table/images/table.gif delete mode 100644 public/tiny_mce/plugins/table/images/table_cell_props.gif delete mode 100644 public/tiny_mce/plugins/table/images/table_delete_col.gif delete mode 100644 public/tiny_mce/plugins/table/images/table_delete_row.gif delete mode 100644 public/tiny_mce/plugins/table/images/table_insert_col_after.gif delete mode 100644 public/tiny_mce/plugins/table/images/table_insert_col_before.gif delete mode 100644 public/tiny_mce/plugins/table/images/table_insert_row_after.gif delete mode 100644 public/tiny_mce/plugins/table/images/table_insert_row_before.gif delete mode 100644 public/tiny_mce/plugins/table/images/table_merge_cells.gif delete mode 100644 public/tiny_mce/plugins/table/images/table_row_props.gif delete mode 100644 public/tiny_mce/plugins/table/images/table_split_cells.gif delete mode 100644 public/tiny_mce/plugins/table/langs/ar.js delete mode 100644 public/tiny_mce/plugins/table/langs/cs.js delete mode 100644 public/tiny_mce/plugins/table/langs/da.js delete mode 100644 public/tiny_mce/plugins/table/langs/de.js delete mode 100644 public/tiny_mce/plugins/table/langs/el.js delete mode 100644 public/tiny_mce/plugins/table/langs/en.js delete mode 100644 public/tiny_mce/plugins/table/langs/es.js delete mode 100644 public/tiny_mce/plugins/table/langs/fa.js delete mode 100644 public/tiny_mce/plugins/table/langs/fi.js delete mode 100644 public/tiny_mce/plugins/table/langs/fr.js delete mode 100644 public/tiny_mce/plugins/table/langs/fr_ca.js delete mode 100644 public/tiny_mce/plugins/table/langs/hu.js delete mode 100644 public/tiny_mce/plugins/table/langs/it.js delete mode 100644 public/tiny_mce/plugins/table/langs/ja.js delete mode 100644 public/tiny_mce/plugins/table/langs/ko.js delete mode 100644 public/tiny_mce/plugins/table/langs/nl.js delete mode 100644 public/tiny_mce/plugins/table/langs/no.js delete mode 100644 public/tiny_mce/plugins/table/langs/pl.js delete mode 100644 public/tiny_mce/plugins/table/langs/pt.js delete mode 100644 public/tiny_mce/plugins/table/langs/readme.txt delete mode 100644 public/tiny_mce/plugins/table/langs/sv.js delete mode 100644 public/tiny_mce/plugins/table/langs/tw.js delete mode 100644 public/tiny_mce/plugins/table/langs/zh_cn.js delete mode 100644 public/tiny_mce/plugins/table/merge_cells.htm delete mode 100644 public/tiny_mce/plugins/table/readme.txt delete mode 100644 public/tiny_mce/plugins/table/row.htm delete mode 100644 public/tiny_mce/plugins/table/table.htm delete mode 100644 public/tiny_mce/plugins/zoom/editor_plugin.js delete mode 100644 public/tiny_mce/plugins/zoom/editor_plugin_src.js delete mode 100644 public/tiny_mce/plugins/zoom/langs/fa.js delete mode 100644 public/tiny_mce/plugins/zoom/langs/fr_ca.js delete mode 100644 public/tiny_mce/plugins/zoom/langs/pl.js delete mode 100644 public/tiny_mce/plugins/zoom/langs/pt_br.js delete mode 100644 public/tiny_mce/plugins/zoom/langs/zh_cn.js delete mode 100644 public/tiny_mce/plugins/zoom/readme.txt delete mode 100644 public/tiny_mce/themes/advanced/anchor.htm delete mode 100644 public/tiny_mce/themes/advanced/charmap.htm delete mode 100644 public/tiny_mce/themes/advanced/color_picker.htm delete mode 100644 public/tiny_mce/themes/advanced/docs/en/about.htm delete mode 100644 public/tiny_mce/themes/advanced/docs/en/common_buttons.htm delete mode 100644 public/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif delete mode 100644 public/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif delete mode 100644 public/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif delete mode 100644 public/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif delete mode 100644 public/tiny_mce/themes/advanced/docs/en/index.htm delete mode 100644 public/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm delete mode 100644 public/tiny_mce/themes/advanced/docs/en/insert_image_button.htm delete mode 100644 public/tiny_mce/themes/advanced/docs/en/insert_link_button.htm delete mode 100644 public/tiny_mce/themes/advanced/docs/en/insert_table_button.htm delete mode 100644 public/tiny_mce/themes/advanced/docs/en/style.css delete mode 100644 public/tiny_mce/themes/advanced/docs/images/table.gif delete mode 100644 public/tiny_mce/themes/advanced/docs/images/table_delete_col.gif delete mode 100644 public/tiny_mce/themes/advanced/docs/images/table_delete_row.gif delete mode 100644 public/tiny_mce/themes/advanced/docs/images/table_insert_col_after.gif delete mode 100644 public/tiny_mce/themes/advanced/docs/images/table_insert_col_before.gif delete mode 100644 public/tiny_mce/themes/advanced/docs/images/table_insert_row_after.gif delete mode 100644 public/tiny_mce/themes/advanced/docs/images/table_insert_row_before.gif delete mode 100644 public/tiny_mce/themes/advanced/editor_content.css delete mode 100644 public/tiny_mce/themes/advanced/editor_popup.css delete mode 100644 public/tiny_mce/themes/advanced/editor_template.js delete mode 100644 public/tiny_mce/themes/advanced/editor_template_src.js delete mode 100644 public/tiny_mce/themes/advanced/editor_ui.css delete mode 100644 public/tiny_mce/themes/advanced/image.htm delete mode 100644 public/tiny_mce/themes/advanced/images/anchor.gif delete mode 100644 public/tiny_mce/themes/advanced/images/attachment.gif delete mode 100644 public/tiny_mce/themes/advanced/images/backcolor.gif delete mode 100644 public/tiny_mce/themes/advanced/images/bold.gif delete mode 100644 public/tiny_mce/themes/advanced/images/bold_de_se.gif delete mode 100644 public/tiny_mce/themes/advanced/images/bold_fr.gif delete mode 100644 public/tiny_mce/themes/advanced/images/bold_ru.gif delete mode 100644 public/tiny_mce/themes/advanced/images/browse.gif delete mode 100644 public/tiny_mce/themes/advanced/images/bullist.gif delete mode 100644 public/tiny_mce/themes/advanced/images/buttons.gif delete mode 100644 public/tiny_mce/themes/advanced/images/center.gif delete mode 100644 public/tiny_mce/themes/advanced/images/charmap.gif delete mode 100644 public/tiny_mce/themes/advanced/images/cleanup.gif delete mode 100644 public/tiny_mce/themes/advanced/images/close.gif delete mode 100644 public/tiny_mce/themes/advanced/images/code.gif delete mode 100644 public/tiny_mce/themes/advanced/images/copy.gif delete mode 100644 public/tiny_mce/themes/advanced/images/custom_1.gif delete mode 100644 public/tiny_mce/themes/advanced/images/cut.gif delete mode 100644 public/tiny_mce/themes/advanced/images/forecolor.gif delete mode 100644 public/tiny_mce/themes/advanced/images/full.gif delete mode 100644 public/tiny_mce/themes/advanced/images/help.gif delete mode 100644 public/tiny_mce/themes/advanced/images/hr.gif delete mode 100644 public/tiny_mce/themes/advanced/images/image.gif delete mode 100644 public/tiny_mce/themes/advanced/images/indent.gif delete mode 100644 public/tiny_mce/themes/advanced/images/italic.gif delete mode 100644 public/tiny_mce/themes/advanced/images/italic_de_se.gif delete mode 100644 public/tiny_mce/themes/advanced/images/italic_ru.gif delete mode 100644 public/tiny_mce/themes/advanced/images/left.gif delete mode 100644 public/tiny_mce/themes/advanced/images/link.gif delete mode 100644 public/tiny_mce/themes/advanced/images/newdocument.gif delete mode 100644 public/tiny_mce/themes/advanced/images/numlist.gif delete mode 100644 public/tiny_mce/themes/advanced/images/outdent.gif delete mode 100644 public/tiny_mce/themes/advanced/images/paste.gif delete mode 100644 public/tiny_mce/themes/advanced/images/redo.gif delete mode 100644 public/tiny_mce/themes/advanced/images/removeformat.gif delete mode 100644 public/tiny_mce/themes/advanced/images/right.gif delete mode 100644 public/tiny_mce/themes/advanced/images/spacer.gif delete mode 100644 public/tiny_mce/themes/advanced/images/strikethrough.gif delete mode 100644 public/tiny_mce/themes/advanced/images/sub.gif delete mode 100644 public/tiny_mce/themes/advanced/images/sup.gif delete mode 100644 public/tiny_mce/themes/advanced/images/table.gif delete mode 100644 public/tiny_mce/themes/advanced/images/table_delete_col.gif delete mode 100644 public/tiny_mce/themes/advanced/images/table_delete_row.gif delete mode 100644 public/tiny_mce/themes/advanced/images/table_insert_col_after.gif delete mode 100644 public/tiny_mce/themes/advanced/images/table_insert_col_before.gif delete mode 100644 public/tiny_mce/themes/advanced/images/table_insert_row_after.gif delete mode 100644 public/tiny_mce/themes/advanced/images/table_insert_row_before.gif delete mode 100644 public/tiny_mce/themes/advanced/images/underline.gif delete mode 100644 public/tiny_mce/themes/advanced/images/underline_fr.gif delete mode 100644 public/tiny_mce/themes/advanced/images/underline_ru.gif delete mode 100644 public/tiny_mce/themes/advanced/images/undo.gif delete mode 100644 public/tiny_mce/themes/advanced/images/unlink.gif delete mode 100644 public/tiny_mce/themes/advanced/images/visualaid.gif delete mode 100644 public/tiny_mce/themes/advanced/langs/ar.js delete mode 100644 public/tiny_mce/themes/advanced/langs/ca.js delete mode 100644 public/tiny_mce/themes/advanced/langs/cs.js delete mode 100644 public/tiny_mce/themes/advanced/langs/da.js delete mode 100644 public/tiny_mce/themes/advanced/langs/de.js delete mode 100644 public/tiny_mce/themes/advanced/langs/el.js delete mode 100644 public/tiny_mce/themes/advanced/langs/en.js delete mode 100644 public/tiny_mce/themes/advanced/langs/es.js delete mode 100644 public/tiny_mce/themes/advanced/langs/fa.js delete mode 100644 public/tiny_mce/themes/advanced/langs/fi.js delete mode 100644 public/tiny_mce/themes/advanced/langs/fr.js delete mode 100644 public/tiny_mce/themes/advanced/langs/fr_ca.js delete mode 100644 public/tiny_mce/themes/advanced/langs/hu.js delete mode 100644 public/tiny_mce/themes/advanced/langs/it.js delete mode 100644 public/tiny_mce/themes/advanced/langs/ja.js delete mode 100644 public/tiny_mce/themes/advanced/langs/ko.js delete mode 100644 public/tiny_mce/themes/advanced/langs/nl.js delete mode 100644 public/tiny_mce/themes/advanced/langs/no.js delete mode 100644 public/tiny_mce/themes/advanced/langs/pl.js delete mode 100644 public/tiny_mce/themes/advanced/langs/pt.js delete mode 100644 public/tiny_mce/themes/advanced/langs/pt_br.js delete mode 100644 public/tiny_mce/themes/advanced/langs/readme.txt delete mode 100644 public/tiny_mce/themes/advanced/langs/sv.js delete mode 100644 public/tiny_mce/themes/advanced/langs/tw.js delete mode 100644 public/tiny_mce/themes/advanced/langs/zh_cn.js delete mode 100644 public/tiny_mce/themes/advanced/link.htm delete mode 100644 public/tiny_mce/themes/advanced/source_editor.htm delete mode 100644 public/tiny_mce/themes/default/docs/en/about.htm delete mode 100644 public/tiny_mce/themes/default/docs/en/common_buttons.htm delete mode 100644 public/tiny_mce/themes/default/docs/en/images/insert_image_window.gif delete mode 100644 public/tiny_mce/themes/default/docs/en/images/insert_link_window.gif delete mode 100644 public/tiny_mce/themes/default/docs/en/index.htm delete mode 100644 public/tiny_mce/themes/default/docs/en/insert_image_button.htm delete mode 100644 public/tiny_mce/themes/default/docs/en/insert_link_button.htm delete mode 100644 public/tiny_mce/themes/default/docs/en/style.css delete mode 100644 public/tiny_mce/themes/default/editor_content.css delete mode 100644 public/tiny_mce/themes/default/editor_popup.css delete mode 100644 public/tiny_mce/themes/default/editor_template.js delete mode 100644 public/tiny_mce/themes/default/editor_template_src.js delete mode 100644 public/tiny_mce/themes/default/editor_ui.css delete mode 100644 public/tiny_mce/themes/default/image.htm delete mode 100644 public/tiny_mce/themes/default/images/bold.gif delete mode 100644 public/tiny_mce/themes/default/images/bold_de_se.gif delete mode 100644 public/tiny_mce/themes/default/images/bold_fr.gif delete mode 100644 public/tiny_mce/themes/default/images/bold_ru.gif delete mode 100644 public/tiny_mce/themes/default/images/bullist.gif delete mode 100644 public/tiny_mce/themes/default/images/center.gif delete mode 100644 public/tiny_mce/themes/default/images/cleanup.gif delete mode 100644 public/tiny_mce/themes/default/images/copy.gif delete mode 100644 public/tiny_mce/themes/default/images/cut.gif delete mode 100644 public/tiny_mce/themes/default/images/full.gif delete mode 100644 public/tiny_mce/themes/default/images/help.gif delete mode 100644 public/tiny_mce/themes/default/images/image.gif delete mode 100644 public/tiny_mce/themes/default/images/indent.gif delete mode 100644 public/tiny_mce/themes/default/images/italic.gif delete mode 100644 public/tiny_mce/themes/default/images/italic_de_se.gif delete mode 100644 public/tiny_mce/themes/default/images/italic_ru.gif delete mode 100644 public/tiny_mce/themes/default/images/left.gif delete mode 100644 public/tiny_mce/themes/default/images/link.gif delete mode 100644 public/tiny_mce/themes/default/images/numlist.gif delete mode 100644 public/tiny_mce/themes/default/images/outdent.gif delete mode 100644 public/tiny_mce/themes/default/images/paste.gif delete mode 100644 public/tiny_mce/themes/default/images/redo.gif delete mode 100644 public/tiny_mce/themes/default/images/right.gif delete mode 100644 public/tiny_mce/themes/default/images/spacer.gif delete mode 100644 public/tiny_mce/themes/default/images/strikethrough.gif delete mode 100644 public/tiny_mce/themes/default/images/underline.gif delete mode 100644 public/tiny_mce/themes/default/images/underline_ru.gif delete mode 100644 public/tiny_mce/themes/default/images/undo.gif delete mode 100644 public/tiny_mce/themes/default/images/unlink.gif delete mode 100644 public/tiny_mce/themes/default/link.htm delete mode 100644 public/tiny_mce/themes/simple/editor_content.css delete mode 100644 public/tiny_mce/themes/simple/editor_popup.css delete mode 100644 public/tiny_mce/themes/simple/editor_template.js delete mode 100644 public/tiny_mce/themes/simple/editor_template_src.js delete mode 100644 public/tiny_mce/themes/simple/editor_ui.css delete mode 100644 public/tiny_mce/themes/simple/images/bold.gif delete mode 100644 public/tiny_mce/themes/simple/images/bold_de_se.gif delete mode 100644 public/tiny_mce/themes/simple/images/bold_fr.gif delete mode 100644 public/tiny_mce/themes/simple/images/bold_ru.gif delete mode 100644 public/tiny_mce/themes/simple/images/bullist.gif delete mode 100644 public/tiny_mce/themes/simple/images/cleanup.gif delete mode 100644 public/tiny_mce/themes/simple/images/italic.gif delete mode 100644 public/tiny_mce/themes/simple/images/italic_de_se.gif delete mode 100644 public/tiny_mce/themes/simple/images/italic_ru.gif delete mode 100644 public/tiny_mce/themes/simple/images/numlist.gif delete mode 100644 public/tiny_mce/themes/simple/images/redo.gif delete mode 100644 public/tiny_mce/themes/simple/images/spacer.gif delete mode 100644 public/tiny_mce/themes/simple/images/strikethrough.gif delete mode 100644 public/tiny_mce/themes/simple/images/underline.gif delete mode 100644 public/tiny_mce/themes/simple/images/underline_ru.gif delete mode 100644 public/tiny_mce/themes/simple/images/undo.gif delete mode 100644 public/tiny_mce/tiny_mce.js delete mode 100644 public/tiny_mce/tiny_mce_gzip.php delete mode 100644 public/tiny_mce/tiny_mce_popup.js delete mode 100644 public/tiny_mce/tiny_mce_src.js delete mode 100755 script/about delete mode 100755 script/benchmarker delete mode 100755 script/breakpointer delete mode 100755 script/console delete mode 100755 script/console_sandbox.rb delete mode 100755 script/dbconsole delete mode 100755 script/destroy delete mode 100755 script/generate delete mode 100755 script/lighttpd delete mode 100755 script/local2gettext delete mode 100755 script/localize delete mode 100755 script/performance/benchmarker delete mode 100755 script/performance/profiler delete mode 100755 script/performance/request delete mode 100755 script/plugin delete mode 100755 script/process/inspector delete mode 100755 script/process/reaper delete mode 100755 script/process/spawner delete mode 100755 script/process/spinner delete mode 100755 script/profiler create mode 100755 script/rails delete mode 100755 script/rgettext.rb delete mode 100755 script/runner delete mode 100755 script/scgi_rails delete mode 100755 script/server delete mode 100644 test/fixtures/expressions.yml delete mode 100644 test/fixtures/filters.yml delete mode 100644 test/fixtures/users.yml create mode 100755 test/performance/browsing_test.rb mode change 100644 => 100755 test/test_helper.rb delete mode 100644 test/unit/expression_test.rb delete mode 100644 test/unit/filter_test.rb delete mode 100644 test/unit/user_test.rb mode change 100644 => 100755 vendor/ezcrypto-0.1.1/._README mode change 100644 => 100755 vendor/ezcrypto-0.1.1/._rakefile mode change 100644 => 100755 vendor/ezcrypto-0.1.1/MIT-LICENSE mode change 100644 => 100755 vendor/ezcrypto-0.1.1/README mode change 100644 => 100755 vendor/ezcrypto-0.1.1/lib/ezcrypto.rb mode change 100644 => 100755 vendor/ezcrypto-0.1.1/rakefile mode change 100644 => 100755 vendor/ezcrypto-0.1.1/test/ezcrypto_test.rb create mode 100755 vendor/plugins/.gitkeep mode change 100644 => 100755 vendor/plugins/auto_complete/README mode change 100644 => 100755 vendor/plugins/auto_complete/Rakefile mode change 100644 => 100755 vendor/plugins/auto_complete/init.rb mode change 100644 => 100755 vendor/plugins/auto_complete/lib/auto_complete.rb mode change 100644 => 100755 vendor/plugins/auto_complete/lib/auto_complete_macros_helper.rb mode change 100644 => 100755 vendor/plugins/auto_complete/test/auto_complete_test.rb mode change 100644 => 100755 vendor/plugins/classic_pagination/CHANGELOG mode change 100644 => 100755 vendor/plugins/classic_pagination/README mode change 100644 => 100755 vendor/plugins/classic_pagination/Rakefile mode change 100644 => 100755 vendor/plugins/classic_pagination/init.rb mode change 100644 => 100755 vendor/plugins/classic_pagination/install.rb mode change 100644 => 100755 vendor/plugins/classic_pagination/lib/pagination.rb mode change 100644 => 100755 vendor/plugins/classic_pagination/lib/pagination_helper.rb mode change 100644 => 100755 vendor/plugins/classic_pagination/test/fixtures/companies.yml mode change 100644 => 100755 vendor/plugins/classic_pagination/test/fixtures/company.rb mode change 100644 => 100755 vendor/plugins/classic_pagination/test/fixtures/developer.rb mode change 100644 => 100755 vendor/plugins/classic_pagination/test/fixtures/developers.yml mode change 100644 => 100755 vendor/plugins/classic_pagination/test/fixtures/developers_projects.yml mode change 100644 => 100755 vendor/plugins/classic_pagination/test/fixtures/project.rb mode change 100644 => 100755 vendor/plugins/classic_pagination/test/fixtures/projects.yml mode change 100644 => 100755 vendor/plugins/classic_pagination/test/fixtures/replies.yml mode change 100644 => 100755 vendor/plugins/classic_pagination/test/fixtures/reply.rb mode change 100644 => 100755 vendor/plugins/classic_pagination/test/fixtures/schema.sql mode change 100644 => 100755 vendor/plugins/classic_pagination/test/fixtures/topic.rb mode change 100644 => 100755 vendor/plugins/classic_pagination/test/fixtures/topics.yml mode change 100644 => 100755 vendor/plugins/classic_pagination/test/helper.rb mode change 100644 => 100755 vendor/plugins/classic_pagination/test/pagination_helper_test.rb mode change 100644 => 100755 vendor/plugins/classic_pagination/test/pagination_test.rb delete mode 100644 vendor/plugins/will_paginate/.autotest delete mode 100644 vendor/plugins/will_paginate/.gitignore delete mode 100644 vendor/plugins/will_paginate/.manifest delete mode 100644 vendor/plugins/will_paginate/CHANGELOG.rdoc delete mode 100644 vendor/plugins/will_paginate/LICENSE delete mode 100644 vendor/plugins/will_paginate/README.rdoc delete mode 100644 vendor/plugins/will_paginate/Rakefile delete mode 100644 vendor/plugins/will_paginate/examples/apple-circle.gif delete mode 100644 vendor/plugins/will_paginate/examples/index.haml delete mode 100644 vendor/plugins/will_paginate/examples/index.html delete mode 100644 vendor/plugins/will_paginate/examples/pagination.css delete mode 100644 vendor/plugins/will_paginate/examples/pagination.sass delete mode 100644 vendor/plugins/will_paginate/init.rb delete mode 100644 vendor/plugins/will_paginate/lib/will_paginate.rb delete mode 100644 vendor/plugins/will_paginate/lib/will_paginate/array.rb delete mode 100644 vendor/plugins/will_paginate/lib/will_paginate/collection.rb delete mode 100644 vendor/plugins/will_paginate/lib/will_paginate/core_ext.rb delete mode 100644 vendor/plugins/will_paginate/lib/will_paginate/deprecation.rb delete mode 100644 vendor/plugins/will_paginate/lib/will_paginate/finders.rb delete mode 100644 vendor/plugins/will_paginate/lib/will_paginate/finders/active_record.rb delete mode 100644 vendor/plugins/will_paginate/lib/will_paginate/finders/active_record/named_scope.rb delete mode 100644 vendor/plugins/will_paginate/lib/will_paginate/finders/active_record/named_scope_patch.rb delete mode 100644 vendor/plugins/will_paginate/lib/will_paginate/finders/active_resource.rb delete mode 100644 vendor/plugins/will_paginate/lib/will_paginate/finders/base.rb delete mode 100644 vendor/plugins/will_paginate/lib/will_paginate/finders/data_mapper.rb delete mode 100644 vendor/plugins/will_paginate/lib/will_paginate/version.rb delete mode 100644 vendor/plugins/will_paginate/lib/will_paginate/view_helpers.rb delete mode 100644 vendor/plugins/will_paginate/lib/will_paginate/view_helpers/action_view.rb delete mode 100644 vendor/plugins/will_paginate/lib/will_paginate/view_helpers/base.rb delete mode 100644 vendor/plugins/will_paginate/lib/will_paginate/view_helpers/link_renderer.rb delete mode 100644 vendor/plugins/will_paginate/lib/will_paginate/view_helpers/link_renderer_base.rb delete mode 100644 vendor/plugins/will_paginate/spec/collection_spec.rb delete mode 100755 vendor/plugins/will_paginate/spec/console delete mode 100644 vendor/plugins/will_paginate/spec/console_fixtures.rb delete mode 100644 vendor/plugins/will_paginate/spec/database.yml delete mode 100644 vendor/plugins/will_paginate/spec/finders/active_record_spec.rb delete mode 100644 vendor/plugins/will_paginate/spec/finders/active_resource_spec.rb delete mode 100644 vendor/plugins/will_paginate/spec/finders/activerecord_test_connector.rb delete mode 100644 vendor/plugins/will_paginate/spec/finders_spec.rb delete mode 100644 vendor/plugins/will_paginate/spec/fixtures/admin.rb delete mode 100644 vendor/plugins/will_paginate/spec/fixtures/developer.rb delete mode 100644 vendor/plugins/will_paginate/spec/fixtures/developers_projects.yml delete mode 100644 vendor/plugins/will_paginate/spec/fixtures/project.rb delete mode 100644 vendor/plugins/will_paginate/spec/fixtures/projects.yml delete mode 100644 vendor/plugins/will_paginate/spec/fixtures/replies.yml delete mode 100644 vendor/plugins/will_paginate/spec/fixtures/reply.rb delete mode 100644 vendor/plugins/will_paginate/spec/fixtures/schema.rb delete mode 100644 vendor/plugins/will_paginate/spec/fixtures/topic.rb delete mode 100644 vendor/plugins/will_paginate/spec/fixtures/topics.yml delete mode 100644 vendor/plugins/will_paginate/spec/fixtures/user.rb delete mode 100644 vendor/plugins/will_paginate/spec/fixtures/users.yml delete mode 100644 vendor/plugins/will_paginate/spec/rcov.opts delete mode 100644 vendor/plugins/will_paginate/spec/spec.opts delete mode 100644 vendor/plugins/will_paginate/spec/spec_helper.rb delete mode 100644 vendor/plugins/will_paginate/spec/tasks.rake delete mode 100644 vendor/plugins/will_paginate/spec/view_helpers/action_view_spec.rb delete mode 100644 vendor/plugins/will_paginate/spec/view_helpers/base_spec.rb delete mode 100644 vendor/plugins/will_paginate/spec/view_helpers/link_renderer_base_spec.rb delete mode 100644 vendor/plugins/will_paginate/spec/view_helpers/view_example_group.rb delete mode 100644 vendor/plugins/will_paginate/will_paginate.gemspec diff --git a/.gitignore b/.gitignore index 510568f..d6ea040 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,4 @@ config/database.yml config/site.rb tmp mail_temp -config/site.rb .svn diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..79766f5 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,5 @@ +* Luben Manolov +* Nick Penkov +* Eugene Korbut +* Emilio Blanco +* Wojciech Todryk diff --git a/CHANGELOG b/CHANGELOG deleted file mode 100644 index 18b4288..0000000 --- a/CHANGELOG +++ /dev/null @@ -1,718 +0,0 @@ -*0.14.2 (RC3)* (October 26th, 2005) - -* Constants set in the development/test/production environment file are set in Object - -* Scaffold generator pays attention to the controller name. #2562 [self@mattmower.com] - -* Include tasks from vendor/plugins/*/tasks in the Rakefile #2545 [Rick Olson] - - -*0.14.1 (RC2)* (October 19th, 2005) - -* Don't clean RAILS_ROOT on windows - -* Remove trailing '/' from RAILS_ROOT [Nicholas Seckar] - -* Upgraded to Active Record 1.12.1 and Action Pack 1.10.1 - - -*0.14.0 (RC1)* (October 16th, 2005) - -* Moved generator folder from RAILS_ROOT/generators to RAILS_ROOT/lib/generators [Tobias Luetke] - -* Fix rake dev and related commands [Nicholas Seckar] - -* The rails command tries to deduce your MySQL socket by running `mysql_config ---socket`. If it fails, default to /path/to/your/mysql.sock - -* Made the rails command use the application name for database names in the tailored database.yml file. Example: "rails ~/projects/blog" will use "blog_development" instead of "rails_development". [Florian Weber] - -* Added Rails framework freezing tasks: freeze_gems (freeze to current gems), freeze_edge (freeze to Rails SVN trunk), unfreeze_rails (float with newest gems on system) - -* Added update_javascripts task which will fetch all the latest js files from your current rails install. Use after updating rails. [Tobias Luetke] - -* Added cleaning of RAILS_ROOT to useless elements such as '../non-dot-dot/'. Provides cleaner backtraces and error messages. [Nicholas Seckar] - -* Made the instantiated/transactional fixtures settings be controlled through Rails::Initializer. Transactional and non-instantiated fixtures are default from now on. [Florian Weber] - -* Support using different database adapters for development and test with ActiveRecord::Base.schema_format = :ruby [Sam Stephenson] - -* Make webrick work with session(:off) - -* Add --version, -v option to the Rails command. Closes #1840. [stancell] - -* Update Prototype to V1.4.0_pre11, script.aculo.us to V1.5_rc3 [2504] and fix the rails generator to include the new .js files [Thomas Fuchs] - -* Make the generator skip a file if it already exists and is identical to the new file. - -* Add experimental plugin support #2335 - -* Made Rakefile aware of new .js files in script.aculo.us [Thomas Fuchs] - -* Make table_name and controller_name in generators honor AR::Base.pluralize_table_names. #1216 #2213 [kazuhiko@fdiary.net] - -* Clearly label functional and unit tests in rake stats output. #2297 [lasse.koskela@gmail.com] - -* Make the migration generator only check files ending in *.rb when calculating the next file name #2317 [Chad Fowler] - -* Added prevention of duplicate migrations from the generator #2240 [fbeausoleil@ftml.net] - -* Add db_schema_dump and db_schema_import rake tasks to work with the new ActiveRecord::SchemaDumper (for dumping a schema to and reading a schema from a ruby file). - -* Reformed all the config/environments/* files to conform to the new Rails::Configuration approach. Fully backwards compatible. - -* Added create_sessions_table, drop_sessions_table, and purge_sessions_table as rake tasks for databases that supports migrations (MySQL, PostgreSQL, SQLite) to get a table for use with CGI::Session::ActiveRecordStore - -* Added dump of schema version to the db_structure_dump task for databases that support migrations #1835 [Rick Olson] - -* Fixed script/profiler for Ruby 1.8.2 #1863 [Rick Olson] - -* Fixed clone_structure_to_test task for SQLite #1864 [jon@burningbush.us] - -* Added -m/--mime-types option to the WEBrick server, so you can specify a Apache-style mime.types file to load #2059 [ask@develooper.com] - -* Added -c/--svn option to the generator that'll add new files and remove destroyed files using svn add/revert/remove as appropriate #2064 [kevin.clark@gmail.com] - -* Added -c/--charset option to WEBrick server, so you can specify a default charset (which without changes is UTF-8) #2084 [wejn@box.cz] - -* Make the default stats task extendable by modifying the STATS_DIRECTORIES constant - -* Allow the selected environment to define RAILS_DEFAULT_LOGGER, and have Rails::Initializer use it if it exists. - -* Moved all the shared tasks from Rakefile into Rails, so that the Rakefile is empty and doesn't require updating. - -* Added Rails::Initializer and Rails::Configuration to abstract all of the common setup out of config/environment.rb (uses config/boot.rb to bootstrap the initializer and paths) - -* Fixed the scaffold generator to fail right away if the database isn't accessible instead of in mid-air #1169 [Chad Fowler] - -* Corrected project-local generator location in scripts.rb #2010 [Michael Schuerig] - -* Don't require the environment just to clear the logs #2093 [Scott Barron] - -* Make the default rakefile read *.rake files from config/tasks (for easy extension of the rakefile by e.g. generators) - -* Only load breakpoint in development mode and when BREAKPOINT_SERVER_PORT is defined. - -* Allow the --toggle-spin switch on process/reaper to be negated - -* Replace render_partial with render :partial in scaffold generator [Nicholas Seckar] - -* Added -w flag to ps in process/reaper #1934 [Scott Barron] - -* Allow ERb in the database.yml file (just like with fixtures), so you can pull out the database configuration in environment variables #1822 [Duane Johnson] - -* Added convenience controls for FCGI processes (especially when managed remotely): spinner, spawner, and reaper. They reside in script/process. More details can be had by calling them with -h/--help. - -* Added load_fixtures task to the Rakefile, which will load all the fixtures into the database for the current environment #1791 [Marcel Molina] - -* Added an empty robots.txt to public/, so that web servers asking for it won't trigger a dynamic call, like favicon.ico #1738 [michael@schubert] - -* Dropped the 'immediate close-down' of FCGI processes since it didn't work consistently and produced bad responses when it didn't. So now a TERM ensures exit after the next request (just as if the process is handling a request when it receives the signal). This means that you'll have to 'nudge' all FCGI processes with a request in order to ensure that they have all reloaded. This can be done by something like ./script/process/repear --nudge 'http://www.myapp.com' --instances 10, which will load the myapp site 10 times (and thus hit all of the 10 FCGI processes once, enough to shut down). - - -*0.13.1* (11 July, 2005) - -* Look for app-specific generators in RAILS_ROOT/generators rather than the clunky old RAILS_ROOT/script/generators. Nobody really uses this feature except for the unit tests, so it's a negligible-impact change. If you want to work with third-party generators, drop them in ~/.rails/generators or simply install gems. - -* Fixed that each request with the WEBrick adapter would open a new database connection #1685 [Sam Stephenson] - -* Added support for SQL Server in the database rake tasks #1652 [ken.barker@gmail.com] Note: osql and scptxfr may need to be installed on your development environment. This involves getting the .exes and a .rll (scptxfr) from a production SQL Server (not developer level SQL Server). Add their location to your Environment PATH and you are all set. - -* Added a VERSION parameter to the migrate task that allows you to do "rake migrate VERSION=34" to migrate to the 34th version traveling up or down depending on the current version - -* Extend Ruby version check to include RUBY_RELEASE_DATE >= '2005-12-25', the final Ruby 1.8.2 release #1674 [court3nay@gmail.com] - -* Improved documentation for environment config files #1625 [court3nay@gmail.com] - - -*0.13.0* (6 July, 2005) - -* Changed the default logging level in config/environment.rb to INFO for production (so SQL statements won't be logged) - -* Added migration generator: ./script/generate migration add_system_settings - -* Added "migrate" as rake task to execute all the pending migrations from db/migrate - -* Fixed that model generator would make fixtures plural, even if ActiveRecord::Base.pluralize_table_names was false #1185 [Marcel Molina] - -* Added a DOCTYPE of HTML transitional to the HTML files generated by Rails #1124 [Michael Koziarski] - -* SIGTERM also gracefully exits dispatch.fcgi. Ignore SIGUSR1 on Windows. - -* Add the option to manually manage garbage collection in the FastCGI dispatcher. Set the number of requests between GC runs in your public/dispatch.fcgi [skaes@web.de] - -* Allow dynamic application reloading for dispatch.fcgi processes by sending a SIGHUP. If the process is currently handling a request, the request will be allowed to complete first. This allows production fcgi's to be reloaded without having to restart them. - -* RailsFCGIHandler (dispatch.fcgi) no longer tries to explicitly flush $stdout (CgiProcess#out always calls flush) - -* Fixed rakefile actions against PostgreSQL when the password is all numeric #1462 [michael@schubert.cx] - -* ActionMailer::Base subclasses are reloaded with the other rails components #1262 - -* Made the WEBrick adapter not use a mutex around action performance if ActionController::Base.allow_concurrency is true (default is false) - -* Fixed that mailer generator generated fixtures/plural while units expected fixtures/singular #1457 [Scott Barron] - -* Added a 'whiny nil' that's aim to ensure that when users pass nil to methods where that isn't appropriate, instead of NoMethodError? and the name of some method used by the framework users will see a message explaining what type of object was expected. Only active in test and development environments by default #1209 [Michael Koziarski] - -* Fixed the test_helper.rb to be safe for requiring controllers from multiple spots, like app/controllers/article_controller.rb and app/controllers/admin/article_controller.rb, without reloading the environment twice #1390 [Nicholas Seckar] - -* Fixed Webrick to escape + characters in URL's the same way that lighttpd and apache do #1397 [Nicholas Seckar] - -* Added -e/--environment option to script/runner #1408 [fbeausoleil@ftml.net] - -* Modernize the scaffold generator to use the simplified render and test methods and to change style from @params["id"] to params[:id]. #1367 - -* Added graceful exit from pressing CTRL-C during the run of the rails command #1150 [Caleb Tennis] - -* Allow graceful exits for dispatch.fcgi processes by sending a SIGUSR1. If the process is currently handling a request, the request will be allowed to complete and then will terminate itself. If a request is not being handled, the process is terminated immediately (via #exit). This basically works like restart graceful on Apache. [Jamis Buck] - -* Made dispatch.fcgi more robust by catching fluke errors and retrying unless its a permanent condition. [Jamis Buck] - -* Added console --profile for profiling an IRB session #1154 [Jeremy Kemper] - -* Changed console_sandbox into console --sandbox #1154 [Jeremy Kemper] - - -*0.12.1* (20th April, 2005) - -* Upgraded to Active Record 1.10.1, Action Pack 1.8.1, Action Mailer 0.9.1, Action Web Service 0.7.1 - - -*0.12.0* (19th April, 2005) - -* Fixed that purge_test_database would use database settings from the development environment when recreating the test database #1122 [rails@cogentdude.com] - -* Added script/benchmarker to easily benchmark one or more statement a number of times from within the environment. Examples: - - # runs the one statement 10 times - script/benchmarker 10 'Person.expensive_method(10)' - - # pits the two statements against each other with 50 runs each - script/benchmarker 50 'Person.expensive_method(10)' 'Person.cheap_method(10)' - -* Added script/profiler to easily profile a single statement from within the environment. Examples: - - script/profiler 'Person.expensive_method(10)' - script/profiler 'Person.expensive_method(10)' 10 # runs the statement 10 times - -* Added Rake target clear_logs that'll truncate all the *.log files in log/ to zero #1079 [Lucas Carlson] - -* Added lazy typing for generate, such that ./script/generate cn == ./script/generate controller and the likes #1051 [k@v2studio.com] - -* Fixed that ownership is brought over in pg_dump during tests for PostgreSQL #1060 [pburleson@gmail.com] - -* Upgraded to Active Record 1.10.0, Action Pack 1.8.0, Action Mailer 0.9.0, Action Web Service 0.7.0, Active Support 1.0.4 - - -*0.11.1* (27th March, 2005) - -* Fixed the dispatch.fcgi use of a logger - -* Upgraded to Active Record 1.9.1, Action Pack 1.7.0, Action Mailer 0.8.1, Action Web Service 0.6.2, Active Support 1.0.3 - - -*0.11.0* (22th March, 2005) - -* Removed SCRIPT_NAME from the WEBrick environment to prevent conflicts with PATH_INFO #896 [Nicholas Seckar] - -* Removed ?$1 from the dispatch.f/cgi redirect line to get rid of 'complete/path/from/request.html' => nil being in the @params now that the ENV["REQUEST_URI"] is used to determine the path #895 [dblack/Nicholas Seckar] - -* Added additional error handling to the FastCGI dispatcher to catch even errors taking down the entire process - -* Improved the generated scaffold code a lot to take advantage of recent Rails developments #882 [Tobias Luetke] - -* Combined the script/environment.rb used for gems and regular files version. If vendor/rails/* has all the frameworks, then files version is used, otherwise gems #878 [Nicholas Seckar] - -* Changed .htaccess to allow dispatch.* to be called from a sub-directory as part of the push with Action Pack to make Rails work on non-vhost setups #826 [Nicholas Seckar/Tobias Luetke] - -* Added script/runner which can be used to run code inside the environment by eval'ing the first parameter. Examples: - - ./script/runner 'ReminderService.deliver' - ./script/runner 'Mailer.receive(STDIN.read)' - - This makes it easier to do CRON and postfix scripts without actually making a script just to trigger 1 line of code. - -* Fixed webrick_server cookie handling to allow multiple cookes to be set at once #800, #813 [dave@cherryville.org] - -* Fixed the Rakefile's interaction with postgresql to: - - 1. Use PGPASSWORD and PGHOST in the environment to fix prompting for - passwords when connecting to a remote db and local socket connections. - 2. Add a '-x' flag to pg_dump which stops it dumping privileges #807 [rasputnik] - 3. Quote the user name and use template0 when dumping so the functions doesn't get dumped too #855 [pburleson] - 4. Use the port if available #875 [madrobby] - -* Upgraded to Active Record 1.9.0, Action Pack 1.6.0, Action Mailer 0.8.0, Action Web Service 0.6.1, Active Support 1.0.2 - - -*0.10.1* (7th March, 2005) - -* Fixed rake stats to ignore editor backup files like model.rb~ #791 [skanthak] - -* Added exception shallowing if the DRb server can't be started (not worth making a fuss about to distract new users) #779 [Tobias Luetke] - -* Added an empty favicon.ico file to the public directory of new applications (so the logs are not spammed by its absence) - -* Fixed that scaffold generator new template should use local variable instead of instance variable #778 [Dan Peterson] - -* Allow unit tests to run on a remote server for PostgreSQL #781 [adamm@galacticasoftware.com] - -* Added web_service generator (run ./script/generate web_service for help) #776 [Leon Bredt] - -* Added app/apis and components to code statistics report #729 [Scott Barron] - -* Fixed WEBrick server to use ABSOLUTE_RAILS_ROOT instead of working_directory #687 [Nicholas Seckar] - -* Fixed rails_generator to be usable without RubyGems #686 [Cristi BALAN] - -* Fixed -h/--help for generate and destroy generators #331 - -* Added begin/rescue around the FCGI dispatcher so no uncaught exceptions can bubble up to kill the process (logs to log/fastcgi.crash.log) - -* Fixed that association#count would produce invalid sql when called sequentialy #659 [kanis@comcard.de] - -* Fixed test/mocks/testing to the correct test/mocks/test #740 - -* Added early failure if the Ruby version isn't 1.8.2 or above #735 - -* Removed the obsolete -i/--index option from the WEBrick servlet #743 - -* Upgraded to Active Record 1.8.0, Action Pack 1.5.1, Action Mailer 0.7.1, Action Web Service 0.6.0, Active Support 1.0.1 - - -*0.10.0* (24th February, 2005) - -* Changed default IP binding for WEBrick from 127.0.0.1 to 0.0.0.0 so that the server is accessible both locally and remotely #696 [Marcel] - -* Fixed that script/server -d was broken so daemon mode couldn't be used #687 [Nicholas Seckar] - -* Upgraded to breakpoint 92 which fixes: - - * overload IRB.parse_opts(), fixes #443 - => breakpoints in tests work even when running them via rake - * untaint handlers, might fix an issue discussed on the Rails ML - * added verbose mode to breakpoint_client - * less noise caused by breakpoint_client by default - * ignored TerminateLineInput exception in signal handler - => quiet exit on Ctrl-C - -* Added support for independent components residing in /components. Example: - - Controller: components/list/items_controller.rb - (holds a List::ItemsController class with uses_component_template_root called) - - Model : components/list/item.rb - (namespace is still shared, so an Item model in app/models will take precedence) - - Views : components/list/items/show.rhtml - - -* Added --sandbox option to script/console that'll roll back all changes made to the database when you quit #672 [Jeremy Kemper] - -* Added 'recent' as a rake target that'll run tests for files that changed in the last 10 minutes #612 [Jeremy Kemper] - -* Changed script/console to default to development environment and drop --no-inspect #650 [Jeremy Kemper] - -* Added that the 'fixture :posts' syntax can be used for has_and_belongs_to_many fixtures where a model doesn't exist #572 [Jeremy Kemper] - -* Added that running test_units and test_functional now performs the clone_structure_to_test as well #566 [rasputnik] - -* Added new generator framework that informs about its doings on generation and enables updating and destruction of generated artifacts. See the new script/destroy and script/update for more details #487 [Jeremy Kemper] - -* Added Action Web Service as a new add-on framework for Action Pack [Leon Bredt] - -* Added Active Support as an independent utility and standard library extension bundle - -* Upgraded to Active Record 1.7.0, Action Pack 1.5.0, Action Mailer 0.7.0 - - -*0.9.5* (January 25th, 2005) - -* Fixed dependency reloading by switching to a remove_const approach where all Active Records, Active Record Observers, and Action Controllers are reloading by undefining their classes. This enables you to remove methods in all three types and see the change reflected immediately and it fixes #539. This also means that only those three types of classes will benefit from the const_missing and reloading approach. If you want other classes (like some in lib/) to reload, you must use require_dependency to do it. - -* Added Florian Gross' latest version of Breakpointer and friends that fixes a variaty of bugs #441 [Florian Gross] - -* Fixed skeleton Rakefile to work with sqlite3 out of the box #521 [rasputnik] - -* Fixed that script/breakpointer didn't get the Ruby path rewritten as the other scripts #523 [brandt@kurowski.net] - -* Fixed handling of syntax errors in models that had already been succesfully required once in the current interpreter - -* Fixed that models that weren't referenced in associations weren't being reloaded in the development mode by reinstating the reload - -* Fixed that generate scaffold would produce bad functional tests - -* Fixed that FCGI can also display SyntaxErrors - -* Upgraded to Active Record 1.6.0, Action Pack 1.4.0 - - -*0.9.4.1* (January 18th, 2005) - -* Added 5-second timeout to WordNet alternatives on creating reserved-word models #501 [Marcel Molina] - -* Fixed binding of caller #496 [Alexey] - -* Upgraded to Active Record 1.5.1, Action Pack 1.3.1, Action Mailer 0.6.1 - - -*0.9.4* (January 17th, 2005) - -* Added that ApplicationController will catch a ControllerNotFound exception if someone attempts to access a url pointing to an unexisting controller [Tobias Luetke] - -* Flipped code-to-test ratio around to be more readable #468 [Scott Baron] - -* Fixed log file permissions to be 666 instead of 777 (so they're not executable) #471 [Lucas Carlson] - -* Fixed that auto reloading would some times not work or would reload the models twice #475 [Tobias Luetke] - -* Added rewrite rules to deal with caching to public/.htaccess - -* Added the option to specify a controller name to "generate scaffold" and made the default controller name the plural form of the model. - -* Added that rake clone_structure_to_test, db_structure_dump, and purge_test_database tasks now pick up the source database to use from - RAILS_ENV instead of just forcing development #424 [Tobias Luetke] - -* Fixed script/console to work with Windows (that requires the use of irb.bat) #418 [octopod] - -* Fixed WEBrick servlet slowdown over time by restricting the load path reloading to mod_ruby - -* Removed Fancy Indexing as a default option on the WEBrick servlet as it made it harder to use various caching schemes - -* Upgraded to Active Record 1.5, Action Pack 1.3, Action Mailer 0.6 - - -*0.9.3* (January 4th, 2005) - -* Added support for SQLite in the auto-dumping/importing of schemas for development -> test #416 - -* Added automated rewriting of the shebang lines on installs through the gem rails command #379 [Manfred Stienstra] - -* Added ActionMailer::Base.deliver_method = :test to the test environment so that mail objects are available in ActionMailer::Base.deliveries - for functional testing. - -* Added protection for creating a model through the generators with a name of an existing class, like Thread or Date. - It'll even offer you a synonym using wordnet.princeton.edu as a look-up. No, I'm not kidding :) [Florian Gross] - -* Fixed dependency management to happen in a unified fashion for Active Record and Action Pack using the new Dependencies module. This means that - the environment options needs to change from: - - Before in development.rb: - ActionController::Base.reload_dependencies = true   - ActiveRecord::Base.reload_associations     = true - - Now in development.rb: - Dependencies.mechanism = :load - - Before in production.rb and test.rb: - ActionController::Base.reload_dependencies = false - ActiveRecord::Base.reload_associations     = false - - Now in production.rb and test.rb: - Dependencies.mechanism = :require - -* Fixed problems with dependency caching and controller hierarchies on Ruby 1.8.2 in development mode #351 - -* Fixed that generated action_mailers doesnt need to require the action_mailer since thats already done in the environment #382 [Lucas Carlson] - -* Upgraded to Action Pack 1.2.0 and Active Record 1.4.0 - - -*0.9.2* - -* Fixed CTRL-C exists from the Breakpointer to be a clean affair without error dumping [Kent Sibilev] - -* Fixed "rake stats" to work with sub-directories in models and controllers and to report the code to test ration [Scott Baron] - -* Added that Active Record associations are now reloaded instead of cleared to work with the new const_missing hook in Active Record. - -* Added graceful handling of an inaccessible log file by redirecting output to STDERR with a warning #330 [rainmkr] - -* Added support for a -h/--help parameter in the generator #331 [Ulysses] - -* Fixed that File.expand_path in config/environment.rb would fail when dealing with symlinked public directories [mjobin] - -* Upgraded to Action Pack 1.1.0 and Active Record 1.3.0 - - -*0.9.1* - -* Upgraded to Action Pack 1.0.1 for important bug fix - -* Updated gem dependencies - - -*0.9.0* - -* Renamed public/dispatch.servlet to script/server -- it wasn't really dispatching anyway as its delegating calls to public/dispatch.rb - -* Renamed AbstractApplicationController and abstract_application.rb to ApplicationController and application.rb, so that it will be possible - for the framework to automatically pick up on app/views/layouts/application.rhtml and app/helpers/application.rb - -* Added script/console that makes it even easier to start an IRB session for interacting with the domain model. Run with no-args to - see help. - -* Added breakpoint support through the script/breakpointer client. This means that you can break out of execution at any point in - the code, investigate and change the model, AND then resume execution! Example: - - class WeblogController < ActionController::Base - def index - @posts = Post.find_all - breakpoint "Breaking out from the list" - end - end - - So the controller will accept the action, run the first line, then present you with a IRB prompt in the breakpointer window. - Here you can do things like: - - Executing breakpoint "Breaking out from the list" at .../webrick_server.rb:16 in 'breakpoint' - - >> @posts.inspect - => "[#nil, \"body\"=>nil, \"id\"=>\"1\"}>, - #\"Rails you know!\", \"body\"=>\"Only ten..\", \"id\"=>\"2\"}>]" - >> @posts.first.title = "hello from a breakpoint" - => "hello from a breakpoint" - - ...and even better is that you can examine how your runtime objects actually work: - - >> f = @posts.first - => #nil, "body"=>nil, "id"=>"1"}> - >> f. - Display all 152 possibilities? (y or n) - - Finally, when you're ready to resume execution, you press CTRL-D - -* Changed environments to be configurable through an environment variable. By default, the environment is "development", but you - can change that and set your own by configuring the Apache vhost with a string like (mod_env must be available on the server): - - SetEnv RAILS_ENV production - - ...if you're using WEBrick, you can pick the environment to use with the command-line parameters -e/--environment, like this: - - ruby public/dispatcher.servlet -e production - -* Added a new default environment called "development", which leaves the production environment to be tuned exclusively for that. - -* Added a start_server in the root of the Rails application to make it even easier to get started - -* Fixed public/.htaccess to use RewriteBase and share the same rewrite rules for all the dispatch methods - -* Fixed webrick_server to handle requests in a serialized manner (the Rails reloading infrastructure is not thread-safe) - -* Added support for controllers in directories. So you can have: - - app/controllers/account_controller.rb # URL: /account/ - app/controllers/admin/account_controller.rb # URL: /admin/account/ - - NOTE: You need to update your public/.htaccess with the new rules to pick it up - -* Added reloading for associations and dependencies under cached environments like FastCGI and mod_ruby. This makes it possible to use - those environments for development. This is turned on by default, but can be turned off with - ActiveRecord::Base.reload_associations = false and ActionController::Base.reload_dependencies = false in production environments. - -* Added support for sub-directories in app/models. So now you can have something like Basecamp with: - - app/models/accounting - app/models/project - app/models/participants - app/models/settings - - It's poor man's namespacing, but only for file-system organization. You still require files just like before. - Nothing changes inside the files themselves. - - -* Fixed a few references in the tests generated by new_mailer [Jeremy Kemper] - -* Added support for mocks in testing with test/mocks - -* Cleaned up the environments a bit and added global constant RAILS_ROOT - - -*0.8.5* (9) - -* Made dev-util available to all tests, so you can insert breakpoints in any test case to get an IRB prompt at that point [Jeremy Kemper]: - - def test_complex_stuff - @david.projects << @new_project - breakpoint "Let's have a closer look at @david" - end - - You need to install dev-utils yourself for this to work ("gem install dev-util"). - -* Added shared generator behavior so future upgrades should be possible without manually copying over files [Jeremy Kemper] - -* Added the new helper style to both controller and helper templates [Jeremy Kemper] - -* Added new_crud generator for creating a model and controller at the same time with explicit scaffolding [Jeremy Kemper] - -* Added configuration of Test::Unit::TestCase.fixture_path to test_helper to concide with the new AR fixtures style - -* Fixed that new_model was generating singular table/fixture names - -* Upgraded to Action Mailer 0.4.0 - -* Upgraded to Action Pack 0.9.5 - -* Upgraded to Active Record 1.1.0 - - -*0.8.0 (15)* - -* Removed custom_table_name option for new_model now that the Inflector is as powerful as it is - -* Changed the default rake action to just do testing and separate API generation and coding statistics into a "doc" task. - -* Fixed WEBrick dispatcher to handle missing slashes in the URLs gracefully [alexey] - -* Added user option for all postgresql tool calls in the rakefile [elvstone] - -* Fixed problem with running "ruby public/dispatch.servlet" instead of "cd public; ruby dispatch.servlet" [alexey] - -* Fixed WEBrick server so that it no longer hardcodes the ruby interpreter used to "ruby" but will get the one used based - on the Ruby runtime configuration. [Marcel Molina Jr.] - -* Fixed Dispatcher so it'll route requests to magic_beans to MagicBeansController/magic_beans_controller.rb [Caio Chassot] - -* "new_controller MagicBeans" and "new_model SubscriptionPayments" will now both behave properly as they use the new Inflector. - -* Fixed problem with MySQL foreign key constraint checks in Rake :clone_production_structure_to_test target [Andreas Schwarz] - -* Changed WEBrick server to by default be auto-reloading, which is slower but makes source changes instant. - Class compilation cache can be turned on with "-c" or "--cache-classes". - -* Added "-b/--binding" option to WEBrick dispatcher to bind the server to a specific IP address (default: 127.0.0.1) [Kevin Temp] - -* dispatch.fcgi now DOESN'T set FCGI_PURE_RUBY as it was slowing things down for now reason [Andreas Schwarz] - -* Added new_mailer generator to work with Action Mailer - -* Included new framework: Action Mailer 0.3 - -* Upgraded to Action Pack 0.9.0 - -* Upgraded to Active Record 1.0.0 - - -*0.7.0* - -* Added an optional second argument to the new_model script that allows the programmer to specify the table name, - which will used to generate a custom table_name method in the model and will also be used in the creation of fixtures. - [Kevin Radloff] - -* script/new_model now turns AccountHolder into account_holder instead of accountholder [Kevin Radloff] - -* Fixed the faulty handleing of static files with WEBrick [Andreas Schwarz] - -* Unified function_test_helper and unit_test_helper into test_helper - -* Fixed bug with the automated production => test database dropping on PostgreSQL [dhawkins] - -* create_fixtures in both the functional and unit test helper now turns off the log during fixture generation - and can generate more than one fixture at a time. Which makes it possible for assignments like: - - @people, @projects, @project_access, @companies, @accounts = - create_fixtures "people", "projects", "project_access", "companies", "accounts" - -* Upgraded to Action Pack 0.8.5 (locally-scoped variables, partials, advanced send_file) - -* Upgraded to Active Record 0.9.5 (better table_name guessing, cloning, find_all_in_collection) - - -*0.6.5* - -* No longer specifies a template for rdoc, so it'll use whatever is default (you can change it in the rakefile) - -* The new_model generator will now use the same rules for plural wordings as Active Record - (so Category will give categories, not categorys) [Kevin Radloff] - -* dispatch.fcgi now sets FCGI_PURE_RUBY to true to ensure that it's the Ruby version that's loaded [danp] - -* Made the GEM work with Windows - -* Fixed bug where mod_ruby would "forget" the load paths added when switching between controllers - -* PostgreSQL are now supported for the automated production => test database dropping [Kevin Radloff] - -* Errors thrown by the dispatcher are now properly handled in FCGI. - -* Upgraded to Action Pack 0.8.0 (lots and lots and lots of fixes) - -* Upgraded to Active Record 0.9.4 (a bunch of fixes) - - -*0.6.0* - -* Added AbstractionApplicationController as a superclass for all controllers generated. This class can be used - to carry filters and methods that are to be shared by all. It has an accompanying ApplicationHelper that all - controllers will also automatically have available. - -* Added environments that can be included from any script to get the full Active Record and Action Controller - context running. This can be used by maintenance scripts or to interact with the model through IRB. Example: - - require 'config/environments/production' - - for account in Account.find_all - account.recalculate_interests - end - - A short migration script for an account model that had it's interest calculation strategy changed. - -* Accessing the index of a controller with "/weblog" will now redirect to "/weblog/" (only on Apache, not WEBrick) - -* Simplified the default Apache config so even remote requests are served off CGI as a default. - You'll now have to do something specific to activate mod_ruby and FCGI (like using the force urls). - This should make it easier for new comers that start on an external server. - -* Added more of the necessary Apache options to .htaccess to make it easier to setup - -* Upgraded to Action Pack 0.7.9 (lots of fixes) - -* Upgraded to Active Record 0.9.3 (lots of fixes) - - -*0.5.7* - -* Fixed bug in the WEBrick dispatcher that prevented it from getting parameters from the URL - (through GET requests or otherwise) - -* Added lib in root as a place to store app specific libraries - -* Added lib and vendor to load_path, so anything store within can be loaded directly. - Hence lib/redcloth.rb can be loaded with require "redcloth" - -* Upgraded to Action Pack 0.7.8 (lots of fixes) - -* Upgraded to Active Record 0.9.2 (minor upgrade) - - -*0.5.6* - -* Upgraded to Action Pack 0.7.7 (multipart form fix) - -* Updated the generated template stubs to valid XHTML files - -* Ensure that controllers generated are capitalized, so "new_controller TodoLists" - gives the same as "new_controller Todolists" and "new_controller todolists". - - -*0.5.5* - -* Works on Windows out of the box! (Dropped symlinks) - -* Added webrick dispatcher: Try "ruby public/dispatch.servlet --help" [Florian Gross] - -* Report errors about initialization to browser (instead of attempting to use uninitialized logger) - -* Upgraded to Action Pack 0.7.6 - -* Upgraded to Active Record 0.9.1 - -* Added distinct 500.html instead of reusing 404.html - -* Added MIT license - - -*0.5.0* - -* First public release diff --git a/Gemfile b/Gemfile new file mode 100755 index 0000000..d910b4b --- /dev/null +++ b/Gemfile @@ -0,0 +1,36 @@ +source 'http://rubygems.org' + +gem 'rails', '3.0.7' + +# Bundle edge Rails instead: +# gem 'rails', :git => 'git://github.com/rails/rails.git' + +gem 'sqlite3-ruby',:require => 'sqlite3' +gem 'arel' +gem 'mysql2' +gem 'will_paginate' +gem 'web-app-theme' +gem 'tmail' + +# Use unicorn as the web server +# gem 'unicorn' + +# Deploy with Capistrano +# gem 'capistrano' + +# To use debugger (ruby-debug for Ruby 1.8.7+, ruby-debug19 for Ruby 1.9.2+) +# gem 'ruby-debug' +# gem 'ruby-debug19', :require => 'ruby-debug' + +# Bundle the extra gems: +# gem 'bj' +# gem 'nokogiri' +# gem 'sqlite3-ruby', :require => 'sqlite3' +# gem 'aws-s3', :require => 'aws/s3' + +# Bundle gems for the local environment. Make sure to +# put test-only gems in this group so their generators +# and rake tasks are available in development mode: +# group :development, :test do +# gem 'webrat' +# end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100755 index 0000000..eb08281 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,81 @@ +GEM + remote: http://rubygems.org/ + specs: + actionmailer (3.0.7) + actionpack (= 3.0.7) + mail (~> 2.2.15) + actionpack (3.0.7) + activemodel (= 3.0.7) + activesupport (= 3.0.7) + builder (~> 2.1.2) + erubis (>= 2.6.6) + i18n (~> 0.5.0) + rack (~> 1.2.1) + rack-mount (>= 0.6.14) + rack-test (~> 0.5.7) + tzinfo (~> 0.3.23) + activemodel (3.0.7) + activesupport (= 3.0.7) + builder (~> 2.1.2) + i18n (~> 0.5.0) + activerecord (3.0.7) + activemodel (= 3.0.7) + activesupport (= 3.0.7) + arel (~> 2.0.2) + tzinfo (~> 0.3.23) + activeresource (3.0.7) + activemodel (= 3.0.7) + activesupport (= 3.0.7) + activesupport (3.0.7) + arel (2.0.4) + builder (2.1.2) + erubis (2.7.0) + i18n (0.5.0) + mail (2.2.18) + activesupport (>= 2.3.6) + i18n (>= 0.4.0) + mime-types (>= 1.16) + treetop (>= 1.4.8) + mime-types (1.16) + mysql2 (0.2.7) + polyglot (0.3.1) + rack (1.2.2) + rack-mount (0.7.3) + rack-test (0.5.7) + rack (>= 1.0) + rails (3.0.7) + actionmailer (= 3.0.7) + actionpack (= 3.0.7) + activerecord (= 3.0.7) + activeresource (= 3.0.7) + activesupport (= 3.0.7) + bundler (~> 1.0) + railties (= 3.0.7) + railties (3.0.7) + actionpack (= 3.0.7) + activesupport (= 3.0.7) + rake (>= 0.8.7) + thor (~> 0.14.4) + rake (0.8.7) + sqlite3 (1.3.3) + sqlite3-ruby (1.3.3) + sqlite3 (>= 1.3.3) + thor (0.14.6) + tmail (1.2.7.1) + treetop (1.4.9) + polyglot (>= 0.3.1) + tzinfo (0.3.24) + web-app-theme (0.6.3) + will_paginate (2.3.15) + +PLATFORMS + ruby + +DEPENDENCIES + arel + mysql2 + rails (= 3.0.7) + sqlite3-ruby + tmail + web-app-theme + will_paginate diff --git a/MIT-LICENSE b/MIT-LICENSE deleted file mode 100644 index 67625d0..0000000 --- a/MIT-LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) 2005, 2006 VibrantPlanet Ltd. -Copyright (c) 2005, 2006 Luben Manolov -Copyright (c) 2005, 2006 Nick Penkov - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/README b/README deleted file mode 100644 index c41a035..0000000 --- a/README +++ /dev/null @@ -1,34 +0,0 @@ - -Installation Guide -Requirements - - * Ruby 1.8.7 - * Rails 2.3.2 - -Installation - - 1. Checkout the source code - 2. If you need to override some of the default constants used in the application take a look at config/default_site.rb. Then create config/site.rb that contains only the keys which you want to override. Example content of config/site.rb is: - - module CDF - - LOCALCONFIG = { - :imap_server => 'your.imap.server' - } - end - - 3. Configure SMTP settings - # initializers/smtp_settings.rb - ActionMailer::Base.smtp_settings = { - :address => "mail.example.com.py", - :port => 26, - :authentication => :plain, - :enable_starttls_auto => true, - :user_name => "emilio@example.com.py", - :password => "yourpass" - } - - 4. Prepare config/database.yml file (see config/database.yml.example) - 5. Migrate database (rake db:migrate) - - 6. Use it diff --git a/README.markdown b/README.markdown new file mode 100755 index 0000000..887f305 --- /dev/null +++ b/README.markdown @@ -0,0 +1,40 @@ +## Introduction +_Mailr_ is a IMAP mail client based on _Ruby on Rails_ platform. + +## Installation guide + +**NOTE** All path and filenames are based on _Rails.root_ directory. + +### Requirements +In _Rails 3_ all dependencies should be defined in file _.Gemfile_. All needed gems can be installed using bundler. + +### Installation procedure +1. Checkout the source code. + +2. If you need to override some of the default constants used in the application take a look at config/default_site.rb. Then create config/site.rb that contains only the keys which you want to override. Example content of config/site.rb is: + + module CDF + + LOCALCONFIG = { + :imap_server => 'your.imap.server' + } + end + +3. Configure SMTP settings + # initializers/smtp_settings.rb + ActionMailer::Base.smtp_settings = { + :address => "mail.example.com.py", + :port => 26, + :authentication => :plain, + :enable_starttls_auto => true, + :user_name => "emilio@example.com.py", + :password => "yourpass" + } + +4. Prepare config/database.yml file (see config/database.yml.example). + Check if proper gems (sqlite3/mysql/postgresql) are defined in _Gemfile_ and installed. + +5. Migrate database (rake db:migrate) + +6. Use it. + diff --git a/Rakefile b/Rakefile old mode 100644 new mode 100755 index cffd19f..f7fac98 --- a/Rakefile +++ b/Rakefile @@ -1,10 +1,7 @@ # Add your own tasks in files placed in lib/tasks ending in .rake, -# for example lib/tasks/switchtower.rake, and they will automatically be available to Rake. - -require(File.join(File.dirname(__FILE__), 'config', 'boot')) +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. +require File.expand_path('../config/application', __FILE__) require 'rake' -require 'rake/testtask' -require 'rake/rdoctask' -require 'tasks/rails' \ No newline at end of file +Rails3::Application.load_tasks diff --git a/UNLICENSE b/UNLICENSE new file mode 100644 index 0000000..68a49da --- /dev/null +++ b/UNLICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +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 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. + +For more information, please refer to diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb old mode 100644 new mode 100755 index 9e0a25b..7882e6f --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,34 +1,43 @@ # The filters added to this controller will be run for all controllers in the application. # Likewise will all the methods added be available for all controllers. class ApplicationController < ActionController::Base + + protect_from_forgery + before_filter :user_login_filter before_filter :add_scripts #before_filter :localize - - filter_parameter_logging :password + + #filter_parameter_logging :password #upgrade to Rails3 + protected def secure_user?() true end def secure_cust?() false end def additional_scripts() "" end def onload_function() "" end - + private def add_scripts @additional_scripts = additional_scripts() @onload_function = onload_function() end - + def user_login_filter if (secure_user? or secure_cust? )and logged_user.nil? - session["return_to"] = request.request_uri + + #upgrade Rails 3 + #session["return_to"] = request.request_uri + logger.debug "*** return_to => #{request.fullpath}" + session["return_to"] = request.fullpath + redirect_to :controller=>"/login", :action => "index" return false end end - - alias login_required user_login_filter - + + alias login_required user_login_filter + def logged_user # returns customer id session['user'] end @@ -36,7 +45,7 @@ class ApplicationController < ActionController::Base def logged_customer session['user'] end - + def localize # We will use instance vars for the locale so we can make use of them in # the templates. @@ -65,7 +74,7 @@ class ApplicationController < ActionController::Base end public - + def include_tinymce(mode="textareas",elements="") tinymce='' tinymce << ' @@ -76,11 +85,11 @@ class ApplicationController < ActionController::Base tinymce << mode << '",' if mode == "exact" tinymce << 'elements : "' << elements << '", - ' + ' end tinymce << ' theme : "advanced", - cleanup : true, + cleanup : true, width: "100%", remove_linebreaks : false, entity_encoding : "named", @@ -142,25 +151,25 @@ class ApplicationController < ActionController::Base ' tinymce end - + helper_method :include_tinymce def include_simple_tinymce(mode="textareas",elements="") tinymce = '' tinymce << ' - ' tinymce end @@ -168,7 +177,7 @@ class ApplicationController < ActionController::Base def _(text) t text end - + helper_method :include_simple_tinymce, :_ diff --git a/app/controllers/contact_groups_controller.rb b/app/controllers/contact_groups_controller.rb old mode 100644 new mode 100755 diff --git a/app/controllers/contacts_controller.rb b/app/controllers/contacts_controller.rb old mode 100644 new mode 100755 diff --git a/app/controllers/folders_controller.rb b/app/controllers/folders_controller.rb old mode 100644 new mode 100755 diff --git a/app/controllers/login_controller.rb b/app/controllers/login_controller.rb old mode 100644 new mode 100755 index 979f056..462a634 --- a/app/controllers/login_controller.rb +++ b/app/controllers/login_controller.rb @@ -1,14 +1,16 @@ require 'ezcrypto' +require 'imapmailbox' + class LoginController < ApplicationController - + def index if not(logged_user.nil?) - redirect_to :controller =>"webmail", :action=>"index" + redirect_to :controller =>"webmail", :action=>"index" else @login_user = Customer.new - end + end end - + def authenticate if user = auth(params['login_user']["email"], params['login_user']["password"]) session["user"] = user.id @@ -17,26 +19,27 @@ class LoginController < ApplicationController else # dont use crypt session["wmp"] = params['login_user']["password"] - end + end if session["return_to"] redirect_to(session["return_to"]) session["return_to"] = nil else - redirect_to :action=>"index" + redirect_to :action=>"index" end else + logger.debug "*** Not logged" @login_user = Customer.new flash["error"] = t :wrong_email_or_password - redirect_to :action => "index" + redirect_to :action => "index" end end - + def logout reset_session flash["status"] = t(:user_logged_out) - redirect_to :action => "index" + redirect_to :action => "index" end - + protected def need_subdomain?() true end @@ -45,12 +48,15 @@ class LoginController < ApplicationController private def auth(email, password) - mailbox = IMAPMailbox.new + mailbox = IMAPMailbox.new(Rails.logger) + logger.info "*** mailbox #{mailbox.inspect}" begin - mailbox.connect(email, password) - rescue - return nil + mailbox.connect(email, password) + rescue Exception => exc + logger.debug "*** auth/Mailbox Object => #{exc.message}" + return nil end + mailbox.disconnect mailbox = nil if user = Customer.find_by_email(email) @@ -60,6 +66,6 @@ class LoginController < ApplicationController user = Customer.create("email"=>email) MailPref.create('customer_id' => user.id) return user - end - end + end + end end diff --git a/app/controllers/webmail_controller.rb b/app/controllers/webmail_controller.rb old mode 100644 new mode 100755 index 565d8be..12c6a1e --- a/app/controllers/webmail_controller.rb +++ b/app/controllers/webmail_controller.rb @@ -3,58 +3,63 @@ require 'net/smtp' require 'net/imap' require 'mail2screen' require 'ezcrypto' +require 'imapmailbox' +require 'imap_utils' + class WebmailController < ApplicationController include ImapUtils - + + logger.info "*** WebmailController #{logger.inspect}" + # Administrative functions before_filter :login_required before_filter :obtain_cookies_for_search_and_nav, :only=>[:messages] before_filter :load_imap_session after_filter :close_imap_session - + layout "public", :except => [:view_source, :download] - + # model :filter, :expression, :mail_pref, :customer - + BOOL_ON = "on" - + def index redirect_to(:action=>"messages") end - + def error_connection end - + def refresh @mailbox.reload @folders = @mailbox.folders redirect_to(:action=>'messages') end - + def messages session["return_to"] = nil @search_field = params['search_field'] @search_value = params['search_value'] - + # handle sorting - tsort session field contains last reverse or no for field # and lsort - last sort field if session['tsort'].nil? or session['lsort'].nil? session['lsort'] = "DATE" session['tsort'] = {"DATE" => true, "FROM" => true, "SUBJECT" => true, "TO" => false} end - + case operation_param when t(:copy) # copy msg_ids = [] - messages_param.each { |msg_id, bool| + messages_param.each { |msg_id, bool| msg_ids << msg_id.to_i if bool == BOOL_ON and dst_folder != @folder_name } if messages_param - folder.copy_multiple(msg_ids, dst_folder) if msg_ids.size > 0 + folder.copy_multiple(msg_ids, dst_folder) if msg_ids.size > 0 when t(:move) # move msg_ids = [] - messages_param.each { |msg_id, bool| + messages_param.each { |msg_id, bool| msg_ids << msg_id.to_i if bool == BOOL_ON and dst_folder != @folder_name } if messages_param - folder.move_multiple(msg_ids, dst_folder) if msg_ids.size > 0 + folder.move_multiple(msg_ids, dst_folder) if msg_ids.size > 0 when t(:delete) # delete msg_ids = [] messages_param.each { |msg_id, bool| msg_ids << msg_id.to_i if bool == BOOL_ON } if messages_param @@ -67,10 +72,10 @@ class WebmailController < ApplicationController session['lsort'] = sort_query = params["scc"] session['tsort'][sort_query] = (session['tsort'][sort_query]? false : true) @search_field, @search_value = session['search_field'], session['search_value'] - when t(:search) # search + when t(:search) # search session['search_field'] = @search_field session['search_value'] = @search_value - when t(:show_all) # search + when t(:show_all) # search session['search_field'] = @search_field = nil session['search_value'] = @search_value = nil else @@ -78,7 +83,7 @@ class WebmailController < ApplicationController @search_field = session['search_field'] @search_value = session['search_value'] end - + sort_query = session['lsort'] reverse_sort = session['tsort'][sort_query] query = ["ALL"] @@ -92,39 +97,39 @@ class WebmailController < ApplicationController @pages = Paginator.new self, folder.total, get_mail_prefs.wm_rows, @page @messages = folder.messages(@pages.current.first_item - 1, get_mail_prefs.wm_rows, sort_query + (reverse_sort ? ' desc' : ' asc')) end - + end - + def delete @msg_id = msg_id_param.to_i folder.delete(@msg_id) redirect_to(:action=>"messages") end - + def reply # not ready at all @msg_id = msg_id_param.to_i @imapmail = folder.message(@msg_id) fb = @imapmail.full_body - @tmail = TMail::Mail.parse(fb) - + @tmail = TMail::Mail.parse(fb) + @mail = prepare_mail @mail.reply(@tmail, fb, get_mail_prefs.mail_type) - + render :action => 'compose' end - + def forward @msg_id = msg_id_param.to_i @imapmail = folder.message(@msg_id) fb = @imapmail.full_body - @tmail = TMail::Mail.parse(fb) - + @tmail = TMail::Mail.parse(fb) + @mail = prepare_mail @mail.forward(@tmail, fb) - + render :action => 'compose' end - + def compose if @mail.nil? operation = operation_param @@ -133,13 +138,13 @@ class WebmailController < ApplicationController encmail = @mail.send_mail get_imap_session @mailbox.message_sent(encmail) - + # delete temporary files (attachments) @mail.delete_attachments() render :action => :mailsent elsif operation == t(:add) @mail = create_mail - if params['attachment'] + if params['attachment'] attachment = CDF::Attachment.new(@mail) attachment.file = params['attachment'] end @@ -149,7 +154,7 @@ class WebmailController < ApplicationController end end end - + def empty # empty trash folder (works for any one else :-)) folder.messages(0, -1).each{ |message| folder.delete(message) @@ -157,50 +162,50 @@ class WebmailController < ApplicationController folder.expunge redirect_to(:action=>"messages") end - + def message @msg_id = msg_id_param @imapmail = folder.message(@msg_id) folder.mark_read(@imapmail.uid) if @imapmail.unread @mail = TMail::Mail.parse(@imapmail.full_body) end - + def download msg_id = msg_id_param imapmail = folder.message(msg_id) - mail = TMail::Mail.parse(imapmail.full_body) - + mail = TMail::Mail.parse(imapmail.full_body) + if mail.multipart? - get_parts(mail).each { |part| - return send_part(part) if part.header and part.header['content-type']['name'] == params['ctype'] + get_parts(mail).each { |part| + return send_part(part) if part.header and part.header['content-type']['name'] == params['ctype'] } render("webmail/noattachment") - else + else render("webmail/noattachment") - end + end end - + def prefs @customer = Customer.find(logged_customer) @mailpref = MailPref.find_or_create_by_customer_id logged_customer - + if params['op'] == _('Save') if params['customer'] @customer.fname = params['customer']['fname'] @customer.lname = params['customer']['lname'] @customer.save end - @mailpref.attributes = params["mailpref"] + @mailpref.attributes = params["mailpref"] @mailpref.save session["wmimapseskey"] = nil redirect_to(:action=>"messages") end end - + # Message filters management def filters end - + def filter if params['op'] @filter = Filter.new(params['filter']) @@ -209,7 +214,7 @@ class WebmailController < ApplicationController case params['op'] when _('Add') @filter.expressions << Expression.new - when _('Save') + when _('Save') if params['filter']['id'] and params['filter']['id'] != "" @sf = Filter.find(params['filter']['id']) @sf.name, @sf.destination_folder = @filter.name, @filter.destination_folder @@ -228,11 +233,11 @@ class WebmailController < ApplicationController @expressions = @filter.expressions else @filter = Filter.find(params["id"]) if params["id"] - @expressions = @filter.expressions + @expressions = @filter.expressions end @destfolders = get_to_folders end - + def filter_delete Filter.delete(params["id"]) # reindex other filters @@ -246,7 +251,7 @@ class WebmailController < ApplicationController @user.serialize_to_file redirect_to :action=>"filters" end - + def filter_up filt = @user.filters.find(params['id']) ufilt = @user.filters.find_all("order_num = #{filt.order_num - 1}").first @@ -257,7 +262,7 @@ class WebmailController < ApplicationController @user.serialize_to_file redirect_to :action=>"filters" end - + def filter_down filt = Filter.find(params["id"]) dfilt = @user.filters[filt.order_num] @@ -268,7 +273,7 @@ class WebmailController < ApplicationController @user.serialize_to_file redirect_to :action=>"filters" end - + def filter_add @filter = Filter.new @filter.expressions << Expression.new @@ -277,58 +282,58 @@ class WebmailController < ApplicationController render "filter" end # end of filters - + def view_source @msg_id = msg_id_param.to_i @imapmail = folder.message(@msg_id) @msg_source = CGI.escapeHTML(@imapmail.full_body).gsub("\n", "
") end - + def auto_complete_for_mail_to auto_complete_responder_for_contacts params[:mail][:to] end - + def auto_complete_for_mail_cc auto_complete_responder_for_contacts params[:mail][:cc] end - + def auto_complete_for_mail_bcc auto_complete_responder_for_contacts params[:mail][:bcc] end - + private - + def auto_complete_responder_for_contacts(value) # first split by "," and take last name searchName = value.split(',').last.strip - + # if there are 2 names search by them if searchName.split.size > 1 fname, lname = searchName.split.first, searchName.split.last conditions = ['customer_id = ? and LOWER(fname) LIKE ? and LOWER(lname) like ?', logged_customer, fname.downcase + '%', lname.downcase + '%'] else conditions = ['customer_id = ? and LOWER(fname) LIKE ?', logged_customer, searchName.downcase + '%'] - end + end @contacts = Contact.find(:all, :conditions => conditions, :order => 'fname ASC',:limit => 8) render :partial => 'contacts' end - + protected - + def additional_scripts() @additional_css = ["webmail/webmail"] @additional_js = ["webmail"] end - + private - + def get_to_folders res = Array.new @folders.each{|f| res << f unless f.name == CDF::CONFIG[:mail_sent] or f.name == CDF::CONFIG[:mail_inbox] } res end - - + + def create_mail m = CDF::Mail.new(user.mail_temporary_path) if params["mail"] @@ -343,24 +348,24 @@ class WebmailController < ApplicationController end else m.from, m.content_type = user.friendlly_local_email, get_mail_prefs.mail_type - end + end m.customer_id = logged_customer m end - + def prepare_mail m = CDF::Mail.new(user.mail_temporary_path) m.from, m.content_type = user.friendlly_local_email, get_mail_prefs.mail_type m end - - + + def send_part(part) if part.content_type == "text/html" disposition = "inline" elsif part.content_type.include?("image/") - disposition = "inline" - else + disposition = "inline" + else disposition = "attachment" end headers['Content-Length'] = part.body.size @@ -369,48 +374,48 @@ class WebmailController < ApplicationController headers['Content-Disposition'] = disposition << %(; filename="#{part.header['content-type']['name']}") render :text => part.body end - + def get_parts(mail) parts = Array.new parts << mail - mail.parts.each { |part| + mail.parts.each { |part| if part.multipart? - parts = parts.concat(get_parts(part)) + parts = parts.concat(get_parts(part)) elsif part.content_type and part.content_type.include?("rfc822") parts = parts.concat(get_parts(TMail::Mail.parse(part.body))) << part - else + else parts << part end - } - parts + } + parts end - + def obtain_cookies_for_search_and_nav @srch_class = ((cookies['_wmlms'] and cookies['_wmlms'] == 'closed') ? 'closed' : 'open') - @srch_img_src = ((cookies['_wmlms'] and cookies['_wmlms'] == 'closed') ? 'closed' : 'opened') + @srch_img_src = ((cookies['_wmlms'] and cookies['_wmlms'] == 'closed') ? 'closed' : 'opened') @ops_class = ((cookies['_wmlmo'] and cookies['_wmlmo'] == 'closed') ? 'closed' : 'open') - @ops_img_src = ((cookies['_wmlmo'] and cookies['_wmlmo'] == 'closed') ? 'closed' : 'opened') - end - + @ops_img_src = ((cookies['_wmlmo'] and cookies['_wmlmo'] == 'closed') ? 'closed' : 'opened') + end + ################################################################### ### Some fixed parameters and session variables ################################################################### def folder @folders[@folder_name] end - + def msg_id_param params["msg_id"] end - + def messages_param params["messages"] end - + def dst_folder params["cpdest"] end - + def operation_param params["op"] end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb old mode 100644 new mode 100755 diff --git a/app/helpers/contact_group_helper.rb b/app/helpers/contact_group_helper.rb old mode 100644 new mode 100755 diff --git a/app/helpers/contacts_helper.rb b/app/helpers/contacts_helper.rb old mode 100644 new mode 100755 diff --git a/app/helpers/folders_helper.rb b/app/helpers/folders_helper.rb old mode 100644 new mode 100755 diff --git a/app/helpers/navigation_helper.rb b/app/helpers/navigation_helper.rb old mode 100644 new mode 100755 diff --git a/app/helpers/webmail_helper.rb b/app/helpers/webmail_helper.rb old mode 100644 new mode 100755 index 447a04e..4204fbe --- a/app/helpers/webmail_helper.rb +++ b/app/helpers/webmail_helper.rb @@ -6,35 +6,35 @@ module WebmailHelper def link_compose_new link_to(t(:compose_txt), :controller=>"webmail", :action=>"compose") end - + def link_refresh link_to(t(:refresh), :controller=>"webmail", :action=>"refresh") end - + def link_message_list link_to(_('Message list'), :controller=>"webmail", :action=>"messages") end - + def link_reply_to_sender(msg_id) link_to(t(:reply), :controller=>"webmail", :action=>"reply", :params=>{"msg_id"=>msg_id}) end - + def link_forward_message(msg_id) link_to(t(:forward), :controller=>"webmail", :action=>"forward", :params=>{"msg_id"=>msg_id}) end - + def link_flag_for_deletion(msg_id) link_to(t(:delete), :controller=>"webmail", :action=>"delete", :params=>{"msg_id"=>msg_id}) end - + def link_view_source(msg_id) link_to(t(:view_source), {:controller=>"webmail", :action=>"view_source", :params=>{"msg_id"=>msg_id}}, {'target'=>"_blank"}) end - + def link_filter_add link_to(t(:add_filter), :controller=>'webmail', :action=>'filter_add') end - + def folder_link(folder) return folder.name if folder.attribs.include?(:Noselect) folder_name = short_fn(folder) @@ -42,7 +42,8 @@ module WebmailHelper title = folder.unseen > 0 ? "#{folder_name} (#{folder.unseen})" : "#{folder_name}" link = link_to title, :controller => 'webmail', :action => 'messages', :folder_name => folder.name link = content_tag('b', link) if folder.name == @folder_name - link += ' ' + empty_trash_link(folder.name) if folder.trash? + link += raw(' ' + empty_trash_link(folder.name)) if folder.trash? + logger.info link link end @@ -58,7 +59,7 @@ module WebmailHelper d.strftime("%H:%M") else d.strftime("%Y-%m-%d") - end + end rescue begin d = imap2time(datestr) @@ -66,43 +67,43 @@ module WebmailHelper d.strftime("%H:%M") else d.strftime("%Y-%m-%d") - end + end rescue datestr end end end - + def attachment(att, index) ret = "#{att.filename}" # todo: add link to delete attachment - #ret << + #ret << ret << "" ret << "" ret << "" end - + def link_filter_up(filter_id) link_to(_('Up'), :controller=>"webmail", :action=>"filter_up", :id=>filter_id) end - + def link_filter_down(filter_id) link_to(_('Down'), :controller=>"webmail", :action=>"filter_down", :id=>filter_id) end - + def link_filter_edit(filter_id) link_to(_('Edit'), :controller=>"webmail", :action=>"filter", :id=>filter_id) end - + def link_filter_delete(filter_id) link_to(_('Delete'), :controller=>"webmail", :action=>"filter_delete", :id=>filter_id) end - + def page_navigation_webmail(pages) nav = "

" - + nav << "(#{pages.length} #{t :pages})   " - + window_pages = pages.current.window.pages nav << "..." unless window_pages[0].first? for page in window_pages @@ -114,27 +115,27 @@ module WebmailHelper end nav << "..." unless window_pages[-1].last? nav << "   " - + nav << link_to(t(:first), :controller=>"webmail", :action=>'messages', :page=>@pages.first.number) << " | " unless @pages.current.first? nav << link_to(t(:prev), :controller=>"webmail", :action=>'messages', :page=>@pages.current.previous.number) << " | " if @pages.current.previous nav << link_to(t(:next), :controller=>"webmail", :action=>'messages', :page=>@pages.current.next.number) << " | " if @pages.current.next nav << link_to(t(:last), :controller=>"webmail", :action=>'messages', :page=>@pages.last.number) << " | " unless @pages.current.last? - + nav << "

" - + return nav end def parse_subject(subject) begin if mime_encoded?(subject) - if mime_decode(subject) == '' + if mime_decode(subject) == '' _('(No subject)') else mime_decode(subject) end else - if from_qp(subject) == '' + if from_qp(subject) == '' _('(No subject)') else from_qp(subject) @@ -143,17 +144,17 @@ module WebmailHelper rescue Exception => ex RAILS_DEFAULT_LOGGER.debug('Exception occured - #{ex}') return "" - end + end end - - def message_size(size) + + def message_size(size) if size / (1024*1024) > 0 return "#{(size / (1024*1024)).round} MB" - elsif size / 1024 > 0 + elsif size / 1024 > 0 return "#{(size / (1024)).round} KB" else return "#{size} B" - end + end end private @@ -161,6 +162,6 @@ module WebmailHelper def empty_trash_link(folder_name) link_to( "(#{t :empty})", { :controller => "webmail", :action => "empty", :params=>{"folder_name"=>folder_name}}, - :confirm => t(:want_to_empty_trash_message)) + :confirm => t(:want_to_empty_trash_message)) end end diff --git a/app/models/contact.rb b/app/models/contact.rb old mode 100644 new mode 100755 index a039675..97ffac8 --- a/app/models/contact.rb +++ b/app/models/contact.rb @@ -1,34 +1,37 @@ require 'cdfutils' require_association 'contact_group' -class Contact < ActiveRecord::Base - +class Contact < ActiveRecord::Base + + validate :check_fname_and_lname, :check_mail_cannot_be_changed + validate :check_email, :on => :create + has_and_belongs_to_many :groups, :class_name => "ContactGroup", :join_table => "contact_contact_groups", :association_foreign_key => "contact_group_id", :foreign_key => "contact_id" - + # Finder methods follow def Contact.find_by_user(user_id) find(:all, :conditions => ["customer_id = ?", user_id], :order => "fname asc", :limit => 10) end - + def Contact.find_by_user_email(user_id, email) find(:first, :conditions => ["customer_id = #{user_id} and email = ?", email]) end - + def Contact.find_by_group_user(user_id, grp_id) result = Array.new find(:all, :conditions => ["customer_id = ?", user_id], :order => "fname asc").each { |c| - begin + begin c.groups.find(grp_id) - result << c + result << c rescue ActiveRecord::RecordNotFound end } result end - named_scope :for_customer, lambda{ |customer_id| {:conditions => {:customer_id => customer_id}} } - named_scope :letter, lambda{ |letter| {:conditions => ["contacts.fname LIKE ?", "#{letter}%"]} } - + scope :for_customer, lambda{ |customer_id| {:conditions => {:customer_id => customer_id}} } + scope :letter, lambda{ |letter| {:conditions => ["contacts.fname LIKE ?", "#{letter}%"]} } + def Contact.find_by_user_letter(user_id, letter) find_by_sql("select * from contacts where customer_id=#{user_id} and substr(UPPER(fname),1,1) = '#{letter}' order by fname") end @@ -36,36 +39,38 @@ class Contact < ActiveRecord::Base def full_name "#{fname} #{lname}" end - + def show_name "#{fname} #{lname}" end - + def full_address "#{fname} #{lname}<#{email}>" end - - protected - def validate - errors.add 'fname', I18n.t(:validate_fname_error) unless self.fname =~ /^.{2,20}$/i - errors.add 'lname', I18n.t(:validate_lname_error) unless self.lname =~ /^.{2,20}$/i - - # Contact e-mail cannot be changed - unless self.new_record? + + protected + def check_fname_and_lname + errors.add 'fname', t(:validate_fname_error) unless self.fname =~ /^.{2,20}$/i + errors.add 'lname', t(:validate_lname_error) unless self.lname =~ /^.{2,20}$/i + end + + def check_mail_cannot_be_changed + # Contact e-mail cannot be changed + unless self.new_record? old_record = Contact.find(self.id) - errors.add 'email', I18n.t(:contacto_cannot_be_changed) unless old_record.email == self.email + errors.add 'email', t(:contact_cannot_be_changed) unless old_record.email == self.email end + end + + def check_mail + # Contact e-mail cannot be changed, so we only need to validate it on create + errors.add 'email', t(:validate_email_error) unless valid_email?(self.email) + # Already existing e-mail in contacts for this user is not allowed + if self.new_record? + if Contact.find :first, :conditions => {:email => email, :customer_id => customer_id} + errors.add('email', I18n.t(:email_exists)) + end + end end - - def validate_on_create - # Contact e-mail cannot be changed, so we only need to validate it on create - errors.add 'email', I18n.t(:validate_email_error) unless valid_email?(self.email) - # Already existing e-mail in contacts for this user is not allowed - if self.new_record? - if Contact.find :first, :conditions => {:email => email, :customer_id => customer_id} - errors.add('email', I18n.t(:email_exists)) - end - end - end - + end diff --git a/app/models/contact_group.rb b/app/models/contact_group.rb old mode 100644 new mode 100755 index 628d69a..63da4c1 --- a/app/models/contact_group.rb +++ b/app/models/contact_group.rb @@ -1,25 +1,30 @@ class ContactGroup < ActiveRecord::Base - has_and_belongs_to_many :contacts, :class_name => "Contact", :join_table => "contact_contact_groups", :association_foreign_key => "contact_id", :foreign_key => "contact_group_id" + has_and_belongs_to_many :contacts, :class_name => "Contact", :join_table => "contact_contact_groups", :association_foreign_key => "contact_id", :foreign_key => "contact_group_id" + + validate :check_group_name + validate :check_group_id, :on => :create + validate :check_group_uniqness, :on => :update - def ContactGroup.find_by_user(user_id) - find_by_sql("select * from contact_groups where customer_id = #{user_id} order by name asc") - end - - protected - def validate - errors.add('name', :contactgroup_name_invalid) unless self.name =~ /^.{1,50}$/i + def ContactGroup.find_by_user(user_id) + find_by_sql("select * from contact_groups where customer_id = #{user_id} order by name asc") end - - def validate_on_create - if ContactGroup.find_first(["name = '#{name}' and customer_id = #{user_id}"]) - errors.add("name", _('Please enter group name (1 to 50 characters)')) - end + + protected + + def check_group_name + errors.add('name', t(:contactgroup_name_invalid)) unless self.name =~ /^.{1,50}$/i + end + + def check_group_id + if ContactGroup.find_first(["name = '#{name}' and customer_id = #{user_id}"]) + errors.add("name", _('Please enter group name (1 to 50 characters)')) + end end - - def validate_on_update - if ContactGroup.find_first(["name = '#{name}' and customer_id = #{user_id} and id <> #{id}"]) - errors.add("name", _('You already have contact group with this name')) - end + + def check_group_uniqness + if ContactGroup.find_first(["name = '#{name}' and customer_id = #{user_id} and id <> #{id}"]) + errors.add("name", _('You already have contact group with this name')) + end end - + end diff --git a/app/models/customer.rb b/app/models/customer.rb old mode 100644 new mode 100755 diff --git a/app/models/mail_pref.rb b/app/models/mail_pref.rb old mode 100644 new mode 100755 diff --git a/app/views/contact_groups/edit.rhtml b/app/views/contact_groups/edit.html.erb old mode 100644 new mode 100755 similarity index 100% rename from app/views/contact_groups/edit.rhtml rename to app/views/contact_groups/edit.html.erb diff --git a/app/views/contact_groups/index.html.erb b/app/views/contact_groups/index.html.erb old mode 100644 new mode 100755 diff --git a/app/views/contacts/add_multiple.rhtml b/app/views/contacts/add_multiple.html.erb old mode 100644 new mode 100755 similarity index 100% rename from app/views/contacts/add_multiple.rhtml rename to app/views/contacts/add_multiple.html.erb diff --git a/app/views/contacts/choose.rhtml b/app/views/contacts/choose.html.erb old mode 100644 new mode 100755 similarity index 100% rename from app/views/contacts/choose.rhtml rename to app/views/contacts/choose.html.erb diff --git a/app/views/contacts/import_preview.rhtml b/app/views/contacts/import_preview.html.erb old mode 100644 new mode 100755 similarity index 100% rename from app/views/contacts/import_preview.rhtml rename to app/views/contacts/import_preview.html.erb diff --git a/app/views/contacts/index.html.erb b/app/views/contacts/index.html.erb old mode 100644 new mode 100755 diff --git a/app/views/contacts/new.html.erb b/app/views/contacts/new.html.erb old mode 100644 new mode 100755 index 0b73341..dd19e45 --- a/app/views/contacts/new.html.erb +++ b/app/views/contacts/new.html.erb @@ -20,24 +20,24 @@
- <% form_tag( contacts_path, 'method' => 'post', 'class' => 'two_columns') do %> + <%= form_tag( contacts_path, 'method' => 'post', 'class' => 'two_columns') do %> <%= form_input(:hidden_field, 'contact', 'id') %> <%= form_input(:hidden_field, 'contact', 'customer_id') %> - +
#{t :from}:#{address(mail.from_addrs, @msg_id)}
#{t :bcc}:#{address(mail.bcc_addrs, @msg_id)}
#{t :subject}:#{h(mime_encoded?(mail.subject) ? mime_decode(mail.subject) : mail.subject)}\n" + ret << "
#{t :subject}:#{h(mime_encoded?(mail.subject) ? mime_decode(mail.subject) : mail.subject)}\n" ret << "
#{t :date}:#{h message_date(mail.date)}
#{image_tag('attachment.png')}#{footer}
<%= form_input(:text_field, 'contact', 'fname', t(:first_name), 'class'=>'two_columns') %> <%= form_input(:text_field, 'contact', 'lname', t(:last_name), 'class'=>'two_columns') %> <%= form_input((@contact.new_record? ? :text_field : :read_only_field), 'contact', 'email', t(:email), 'class'=>'two_columns')%>
- + <% for group in @contactgroups %> - <% end %> + <% end %> <% if not(@contactgroups.empty?) %> <%=_('Contact belong to these groups')%>: - <% + <% end col = 1 for group in @contactgroups %> @@ -57,17 +57,17 @@ <% end %> <% if not(@contactgroups.empty?) %> -
+ <% end %> - - + +
- -
+ + <% end %> diff --git a/app/views/folders/index.html.erb b/app/views/folders/index.html.erb old mode 100644 new mode 100755 index 599cbe8..530e2ab --- a/app/views/folders/index.html.erb +++ b/app/views/folders/index.html.erb @@ -15,18 +15,18 @@
-<% content_for('sidebar') { %> +<% content_for('sidebar') { %>

<%= t :add_folder %>


- <% form_tag folders_path, :id => 'new_folder' do %> + <%= form_tag folders_path, :id => 'new_folder' do %>
  • <%= text_field_tag 'folder', '', :size => 18 %>
  • <%= submit_tag t(:add_folder) %>
<% end %> -
+
<% } %>
@@ -45,4 +45,4 @@
- + diff --git a/app/views/layouts/chooser.html.erb b/app/views/layouts/chooser.html.erb old mode 100644 new mode 100755 diff --git a/app/views/layouts/login.html.erb b/app/views/layouts/login.html.erb old mode 100644 new mode 100755 diff --git a/app/views/layouts/public.html.erb b/app/views/layouts/public.html.erb old mode 100644 new mode 100755 index ccaf432..9aa6bbe --- a/app/views/layouts/public.html.erb +++ b/app/views/layouts/public.html.erb @@ -14,7 +14,10 @@
<%= yield %>

diff --git a/app/views/login/index.rhtml b/app/views/login/index.rhtml old mode 100644 new mode 100755 diff --git a/app/views/shared/_folders.html.erb b/app/views/shared/_folders.html.erb old mode 100644 new mode 100755 index 9b22322..cdb6633 --- a/app/views/shared/_folders.html.erb +++ b/app/views/shared/_folders.html.erb @@ -3,8 +3,8 @@
    <% @folders.each do |folder| -%> -
  • <%= folder_link(folder) %>
  • - <% end -%> +
  • <%= raw folder_link(folder) %>
  • + <% end -%>
diff --git a/app/views/webmail/_contacts.rhtml b/app/views/webmail/_contacts.html.erb old mode 100644 new mode 100755 similarity index 100% rename from app/views/webmail/_contacts.rhtml rename to app/views/webmail/_contacts.html.erb diff --git a/app/views/webmail/_expr.rhtml b/app/views/webmail/_expr.html.erb old mode 100644 new mode 100755 similarity index 100% rename from app/views/webmail/_expr.rhtml rename to app/views/webmail/_expr.html.erb diff --git a/app/views/webmail/_filter.rhtml b/app/views/webmail/_filter.html.erb old mode 100644 new mode 100755 similarity index 100% rename from app/views/webmail/_filter.rhtml rename to app/views/webmail/_filter.html.erb diff --git a/app/views/webmail/_message_row.rhtml b/app/views/webmail/_message_row.html.erb old mode 100644 new mode 100755 similarity index 100% rename from app/views/webmail/_message_row.rhtml rename to app/views/webmail/_message_row.html.erb diff --git a/app/views/webmail/_search.rhtml b/app/views/webmail/_search.html.erb old mode 100644 new mode 100755 similarity index 100% rename from app/views/webmail/_search.rhtml rename to app/views/webmail/_search.html.erb diff --git a/app/views/webmail/compose.rhtml b/app/views/webmail/compose.html.erb old mode 100644 new mode 100755 similarity index 100% rename from app/views/webmail/compose.rhtml rename to app/views/webmail/compose.html.erb diff --git a/app/views/webmail/error_connection.rhtml b/app/views/webmail/error_connection.html.erb old mode 100644 new mode 100755 similarity index 100% rename from app/views/webmail/error_connection.rhtml rename to app/views/webmail/error_connection.html.erb diff --git a/app/views/webmail/filter.rhtml b/app/views/webmail/filter.html.erb old mode 100644 new mode 100755 similarity index 100% rename from app/views/webmail/filter.rhtml rename to app/views/webmail/filter.html.erb diff --git a/app/views/webmail/filters.rhtml b/app/views/webmail/filters.html.erb old mode 100644 new mode 100755 similarity index 100% rename from app/views/webmail/filters.rhtml rename to app/views/webmail/filters.html.erb diff --git a/app/views/webmail/folders.rhtml b/app/views/webmail/folders.html.erb old mode 100644 new mode 100755 similarity index 100% rename from app/views/webmail/folders.rhtml rename to app/views/webmail/folders.html.erb diff --git a/app/views/webmail/mailsent.rhtml b/app/views/webmail/mailsent.html.erb old mode 100644 new mode 100755 similarity index 100% rename from app/views/webmail/mailsent.rhtml rename to app/views/webmail/mailsent.html.erb diff --git a/app/views/webmail/message.rhtml b/app/views/webmail/message.html.erb old mode 100644 new mode 100755 similarity index 100% rename from app/views/webmail/message.rhtml rename to app/views/webmail/message.html.erb diff --git a/app/views/webmail/messages.rhtml b/app/views/webmail/messages.html.erb old mode 100644 new mode 100755 similarity index 96% rename from app/views/webmail/messages.rhtml rename to app/views/webmail/messages.html.erb index 965fd37..b4b0314 --- a/app/views/webmail/messages.rhtml +++ b/app/views/webmail/messages.html.erb @@ -15,9 +15,9 @@
-<% content_for('sidebar') { %> - <%= render :partial => 'shared/folders' %> -<% } %> +<% content_for :sidebar do %> +<%= render :partial => 'shared/folders' %> +<% end %>
@@ -25,11 +25,11 @@ <%= form_tag({:controller=>'webmail', :action=>'messages'})%>
- +
<%=t :operations%>open - +

<%= t :operations_txt %>

diff --git a/app/views/webmail/noattachment.rhtml b/app/views/webmail/noattachment.html.erb old mode 100644 new mode 100755 similarity index 100% rename from app/views/webmail/noattachment.rhtml rename to app/views/webmail/noattachment.html.erb diff --git a/app/views/webmail/prefs.rhtml b/app/views/webmail/prefs.html.erb old mode 100644 new mode 100755 similarity index 100% rename from app/views/webmail/prefs.rhtml rename to app/views/webmail/prefs.html.erb diff --git a/app/views/webmail/view_source.rhtml b/app/views/webmail/view_source.html.erb old mode 100644 new mode 100755 similarity index 100% rename from app/views/webmail/view_source.rhtml rename to app/views/webmail/view_source.html.erb diff --git a/arts/logo.png b/arts/logo.png new file mode 100755 index 0000000000000000000000000000000000000000..0bf187deae6e23953a8804113d5c8eff73ff4cc4 GIT binary patch literal 61554 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

x)#o2sc=LTXN957P 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 E08(x)LjV8( literal 0 HcmV?d00001 diff --git a/arts/logo.xcf b/arts/logo.xcf new file mode 100755 index 0000000000000000000000000000000000000000..7ff1b6c1e557c9d469feaa0785e5579447eb86ef GIT binary patch literal 254283 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

wfyb>3aPXD+5|2N^!|9XzS|3M4Q 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 literal 0 HcmV?d00001 diff --git a/config.ru b/config.ru new file mode 100755 index 0000000..8476511 --- /dev/null +++ b/config.ru @@ -0,0 +1,4 @@ +# This file is used by Rack-based servers to start the application. + +require ::File.expand_path('../config/environment', __FILE__) +run Rails3::Application diff --git a/config/application.rb b/config/application.rb new file mode 100755 index 0000000..6e5c572 --- /dev/null +++ b/config/application.rb @@ -0,0 +1,63 @@ +require File.expand_path('../boot', __FILE__) + +require 'rails/all' + +# If you have a Gemfile, require the gems listed there, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(:default, Rails.env) if defined?(Bundler) + +module Rails3 + class Application < Rails::Application + # Settings in config/environments/* take precedence over those specified here. + # Application configuration should go into files in config/initializers + # -- all .rb files in that directory are automatically loaded. + + # Custom directories with classes and modules you want to be autoloadable. + # config.autoload_paths += %W(#{config.root}/extras) + + config.autoload_paths << Rails.root.join("vendor/ezcrypto-0.1.1/lib") + config.autoload_paths << Rails.root.join("lib/webmail") + + # Only load the plugins named here, in the order given (default is alphabetical). + # :all can be used as a placeholder for all plugins not explicitly named. + # config.plugins = [ :exception_notification, :ssl_requirement, :all ] + + # Activate observers that should always be running. + # config.active_record.observers = :cacher, :garbage_collector, :forum_observer + + # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. + # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. + # config.time_zone = 'Central Time (US & Canada)' + + # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. + #config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] + #config.i18n.default_locale = :en + + # JavaScript files you want as :defaults (application.js is always included). + # config.action_view.javascript_expansions[:defaults] = %w(jquery rails) + + # Configure the default encoding used in templates for Ruby 1.9. + config.encoding = "utf-8" + + # Configure sensitive parameters which will be filtered from the log file. + config.filter_parameters += [:password] + + default_config_path = 'config/default_site' + default_config = Rails.root.join(default_config_path) + require default_config + begin + require Rails.root.join("config/site") + CDF::CONFIG.update(CDF::LOCALCONFIG) if CDF::LOCALCONFIG + rescue LoadError + STDERR.puts 'WARNING: config/site.rb not found, using default settings from ' + default_config_path + end + + #if CONFIG[:locale] is nil then I18n.default_locale will be used + config.i18n.default_locale = CDF::CONFIG[:locale] + + require 'tmail_patch' + $KCODE = 'u' + require 'jcode' + + end +end diff --git a/config/boot.rb b/config/boot.rb old mode 100644 new mode 100755 index 0a51688..4489e58 --- a/config/boot.rb +++ b/config/boot.rb @@ -1,109 +1,6 @@ -# Don't change this file! -# Configure your app in config/environment.rb and config/environments/*.rb +require 'rubygems' -RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT) +# Set up gems listed in the Gemfile. +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) -module Rails - class << self - def boot! - unless booted? - preinitialize - pick_boot.run - end - end - - def booted? - defined? Rails::Initializer - end - - def pick_boot - (vendor_rails? ? VendorBoot : GemBoot).new - end - - def vendor_rails? - File.exist?("#{RAILS_ROOT}/vendor/rails") - end - - def preinitialize - load(preinitializer_path) if File.exist?(preinitializer_path) - end - - def preinitializer_path - "#{RAILS_ROOT}/config/preinitializer.rb" - end - end - - class Boot - def run - load_initializer - Rails::Initializer.run(:set_load_path) - end - end - - class VendorBoot < Boot - def load_initializer - require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer" - Rails::Initializer.run(:install_gem_spec_stubs) - end - end - - class GemBoot < Boot - def load_initializer - self.class.load_rubygems - load_rails_gem - require 'initializer' - end - - def load_rails_gem - if version = self.class.gem_version - gem 'rails', version - else - gem 'rails' - end - rescue Gem::LoadError => load_error - $stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.) - exit 1 - end - - class << self - def rubygems_version - Gem::RubyGemsVersion rescue nil - end - - def gem_version - if defined? RAILS_GEM_VERSION - RAILS_GEM_VERSION - elsif ENV.include?('RAILS_GEM_VERSION') - ENV['RAILS_GEM_VERSION'] - else - parse_gem_version(read_environment_rb) - end - end - - def load_rubygems - require 'rubygems' - min_version = '1.3.1' - unless rubygems_version >= min_version - $stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.) - exit 1 - end - - rescue LoadError - $stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org) - exit 1 - end - - def parse_gem_version(text) - $1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/ - end - - private - def read_environment_rb - File.read("#{RAILS_ROOT}/config/environment.rb") - end - end - end -end - -# All that for this: -Rails.boot! +require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE']) diff --git a/config/default_site.rb b/config/default_site.rb old mode 100644 new mode 100755 diff --git a/config/environment.rb b/config/environment.rb old mode 100644 new mode 100755 index 7390e53..4317a43 --- a/config/environment.rb +++ b/config/environment.rb @@ -1,81 +1,5 @@ -# Be sure to restart your webserver when you modify this file. +# Load the rails application +require File.expand_path('../application', __FILE__) -# Uncomment below to force Rails into production mode -# (Use only when you can't set environment variables through your web/app server) -# ENV['RAILS_ENV'] = 'production' - -#RAILS_GEM_VERSION = '2.3.3' unless defined? RAILS_GEM_VERSION - -# Bootstrap the Rails environment, frameworks, and default configuration -require File.join(File.dirname(__FILE__), 'boot') - -Rails::Initializer.run do |config| - # Skip frameworks you're not going to use - # config.frameworks -= [ :action_web_service, :action_mailer ] - - # Add additional load paths for your own custom dirs - config.load_paths += %W( #{RAILS_ROOT}/vendor/ezcrypto-0.1.1/lib ) - config.load_paths += %W( #{RAILS_ROOT}/lib/webmail ) - # Force all environments to use the same logger level - # (by default production uses :info, the others :debug) - # config.log_level = :debug - - # Use the database for sessions instead of the file system - # (create the session table with 'rake create_sessions_table') - #config.action_controller.session_store = :active_record_store - - # Enable page/fragment caching by setting a file-based store - # (remember to create the caching directory and make it readable to the application) - # config.action_controller.fragment_cache_store = :file_store, "#{RAILS_ROOT}/cache" - - # Activate observers that should always be running - # config.active_record.observers = :cacher, :garbage_collector - - # Make Active Record use UTC-base instead of local time - config.active_record.default_timezone = :utc - - config.i18n.default_locale = "en" - - # Use Active Record's schema dumper instead of SQL when creating the test database - # (enables use of different database adapters for development and test environments) - # config.active_record.schema_format = :ruby - - # See Rails::Configuration for more options - config.action_controller.session = { :session_key => "_mailr_session", :secret => "123456789012345678901234567890" } -end - -# Add new inflection rules using the following format -# (all these examples are active by default): -# Inflector.inflections do |inflect| -# inflect.plural /^(ox)$/i, '\1en' -# inflect.singular /^(ox)en/i, '\1' -# inflect.irregular 'person', 'people' -# inflect.uncountable %w( fish sheep ) -# end - -# Include your application configuration below - -default_config_path = 'config/default_site' -default_config = File.join(RAILS_ROOT, default_config_path) -require default_config -begin - require File.join(RAILS_ROOT, 'config/site') - CDF::CONFIG.update(CDF::LOCALCONFIG) if CDF::LOCALCONFIG -rescue LoadError - STDERR.puts 'WARNING: config/site.rb not found, using default settings from ' + default_config_path -end - -#if CONFIG[:locale] is nil then I18n.default_locale will be used -I18n.default_locale = CDF::CONFIG[:locale] - -require 'tmail_patch' -$KCODE = 'u' -require 'jcode' - -# set UTF8 as a client interface to Database -RAILS_DEFAULT_LOGGER.debug("Using MySQL Version #{CDF::CONFIG[:mysql_version]}") -ActiveRecord::Base.connection.execute("SET NAMES utf8", 'Set Client encoding to UTF8') if CDF::CONFIG[:mysql_version] == '4.1' -ActiveRecord::Base.connection.execute("set character set utf8", 'Set Connection encoding to UTF8') if CDF::CONFIG[:mysql_version] == '4.1' - -require 'imapmailbox' -[IMAPMailbox, IMAPFolderList, IMAPFolder].each { |mod| mod.logger ||= RAILS_DEFAULT_LOGGER } +# Initialize the rails application +Rails3::Application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb old mode 100644 new mode 100755 index 01c8978..787a9e7 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -1,14 +1,26 @@ -# In the development environment your application's code is reloaded on -# every request. This slows down response time but is perfect for development -# since you don't have to restart the webserver when you make code changes. -config.cache_classes = false +Rails3::Application.configure do + # Settings specified here will take precedence over those in config/application.rb -# Log error messages when you accidentally call methods on nil. -config.whiny_nils = true + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the webserver when you make code changes. + config.cache_classes = false -# Show full error reports and disable caching -config.action_controller.consider_all_requests_local = true -config.action_controller.perform_caching = false + # Log error messages when you accidentally call methods on nil. + config.whiny_nils = true + + # Show full error reports and disable caching + config.consider_all_requests_local = true + config.action_view.debug_rjs = true + config.action_controller.perform_caching = false + + # Don't care if the mailer can't send + config.action_mailer.raise_delivery_errors = false + + # Print deprecation notices to the Rails logger + config.active_support.deprecation = :log + + # Only use best-standards-support built into browsers + config.action_dispatch.best_standards_support = :builtin +end -# Don't care if the mailer can't send -config.action_mailer.raise_delivery_errors = false diff --git a/config/environments/production.rb b/config/environments/production.rb old mode 100644 new mode 100755 index f2b9ed6..baa574b --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -1,17 +1,49 @@ -# The production environment is meant for finished, "live" apps. -# Code is not reloaded between requests -config.cache_classes = true +Rails3::Application.configure do + # Settings specified here will take precedence over those in config/application.rb -# Use a different logger for distributed setups -# config.logger = SyslogLogger.new + # The production environment is meant for finished, "live" apps. + # Code is not reloaded between requests + config.cache_classes = true + # Full error reports are disabled and caching is turned on + config.consider_all_requests_local = false + config.action_controller.perform_caching = true -# Full error reports are disabled and caching is turned on -config.action_controller.consider_all_requests_local = false -config.action_controller.perform_caching = true + # Specifies the header that your server uses for sending files + config.action_dispatch.x_sendfile_header = "X-Sendfile" -# Enable serving of images, stylesheets, and javascripts from an asset server -# config.action_controller.asset_host = "http://assets.example.com" + # For nginx: + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' -# Disable delivery errors if you bad email addresses should just be ignored -# config.action_mailer.raise_delivery_errors = false + # If you have no front-end server that supports something like X-Sendfile, + # just comment this out and Rails will serve the files + + # See everything in the log (default is :info) + # config.log_level = :debug + + # Use a different logger for distributed setups + # config.logger = SyslogLogger.new + + # Use a different cache store in production + # config.cache_store = :mem_cache_store + + # Disable Rails's static asset server + # In production, Apache or nginx will already do this + config.serve_static_assets = false + + # Enable serving of images, stylesheets, and javascripts from an asset server + # config.action_controller.asset_host = "http://assets.example.com" + + # Disable delivery errors, bad email addresses will be ignored + # config.action_mailer.raise_delivery_errors = false + + # Enable threaded mode + # config.threadsafe! + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation can not be found) + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners + config.active_support.deprecation = :notify +end diff --git a/config/environments/test.rb b/config/environments/test.rb old mode 100644 new mode 100755 index 66b823d..8065328 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -1,23 +1,35 @@ -# The test environment is used exclusively to run your application's -# test suite. You never need to work with it otherwise. Remember that -# your test database is "scratch space" for the test suite and is wiped -# and recreated between test runs. Don't rely on the data there! -config.cache_classes = true +Rails3::Application.configure do + # Settings specified here will take precedence over those in config/application.rb -# Log error messages when you accidentally call methods on nil. -config.whiny_nils = true + # The test environment is used exclusively to run your application's + # test suite. You never need to work with it otherwise. Remember that + # your test database is "scratch space" for the test suite and is wiped + # and recreated between test runs. Don't rely on the data there! + config.cache_classes = true -# Show full error reports and disable caching -config.action_controller.consider_all_requests_local = true -config.action_controller.perform_caching = false + # Log error messages when you accidentally call methods on nil. + config.whiny_nils = true -# Tell ActionMailer not to deliver emails to the real world. -# The :test delivery method accumulates sent emails in the -# ActionMailer::Base.deliveries array. -config.action_mailer.delivery_method = :test + # Show full error reports and disable caching + config.consider_all_requests_local = true + config.action_controller.perform_caching = false -# Overwrite the default settings for fixtures in tests. See Fixtures -# for more details about these settings. -# config.transactional_fixtures = true -# config.instantiated_fixtures = false -# config.pre_loaded_fixtures = false \ No newline at end of file + # Raise exceptions instead of rendering exception templates + config.action_dispatch.show_exceptions = false + + # Disable request forgery protection in test environment + config.action_controller.allow_forgery_protection = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Use SQL instead of Active Record's schema dumper when creating the test database. + # This is necessary if your schema can't be completely dumped by the schema dumper, + # like if you have constraints or database-specific column types + # config.active_record.schema_format = :sql + + # Print deprecation notices to the stderr + config.active_support.deprecation = :stderr +end diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb new file mode 100755 index 0000000..59385cd --- /dev/null +++ b/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb new file mode 100755 index 0000000..9e8b013 --- /dev/null +++ b/config/initializers/inflections.rb @@ -0,0 +1,10 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format +# (all these examples are active by default): +# ActiveSupport::Inflector.inflections do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb new file mode 100755 index 0000000..72aca7e --- /dev/null +++ b/config/initializers/mime_types.rb @@ -0,0 +1,5 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf +# Mime::Type.register_alias "text/html", :iphone diff --git a/config/initializers/pluralization.rb b/config/initializers/pluralization.rb new file mode 100755 index 0000000..a119797 --- /dev/null +++ b/config/initializers/pluralization.rb @@ -0,0 +1,36 @@ +# config/initializers/pluralization.rb +module I18n::Backend::Pluralization + # rules taken from : http://www.gnu.org/software/hello/manual/gettext/Plural-forms.html + def pluralize(locale, entry, n) + return entry unless entry.is_a?(Hash) && n + if n == 0 && entry.has_key?(:zero) + key = :zero + else + key = case locale + when :pl # Polish + n==1 ? :one : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? :few : :other + when :cs, :sk # Czech, Slovak + n==1 ? :one : (n>=2 && n<=4) ? :few : :other + when lt # Lithuanian + n%10==1 && n%100!=11 ? :one : n%10>=2 && (n%100<10 || n%100>=20) ? :few : :other + when :lv # Latvian + n%10==1 && n%100!=11 ? :one : n != 0 ? :few : :other + when :ru, :uk, :sr, :hr # Russian, Ukrainian, Serbian, Croatian + n%10==1 && n%100!=11 ? :one : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? :few : :other + when :sl # Slovenian + n%100==1 ? :one : n%100==2 ? :few : n%100==3 || n%100==4 ? :many : :other + when :ro # Romanian + n==1 ? :one : (n==0 || (n%100 > 0 && n%100 < 20)) ? :few : :other + when :gd # Gaeilge + n==1 ? :one : n==2 ? :two : :other; + # add another language if you like... + else + n==1 ? :one : :other # default :en + end + end + raise InvalidPluralizationData.new(entry, n) unless entry.has_key?(key) + entry[key] + end +end + +I18n::Backend::Simple.send(:include, I18n::Backend::Pluralization) diff --git a/config/initializers/secret_token.rb b/config/initializers/secret_token.rb new file mode 100755 index 0000000..4beb550 --- /dev/null +++ b/config/initializers/secret_token.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# Your secret key for verifying the integrity of signed cookies. +# If you change this key, all old signed cookies will become invalid! +# Make sure the secret is at least 30 characters and all random, +# no regular words or you'll be exposed to dictionary attacks. +Rails3::Application.config.secret_token = 'ade84d567b0c637fd3547fd18b97d1677fd6ca3c5331e6ed1a1b13bb6a7823cc367cbe317caf102f29f8c35eb487ff3ca33e6321d037c14ebb055eb530841ff6' diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb new file mode 100755 index 0000000..a3c4157 --- /dev/null +++ b/config/initializers/session_store.rb @@ -0,0 +1,8 @@ +# Be sure to restart your server when you modify this file. + +Rails3::Application.config.session_store :cookie_store, :key => '_rails3_session' + +# Use the database for sessions instead of the cookie-based default, +# which shouldn't be used to store highly confidential information +# (create the session table with "rails generate session_migration") +# Rails3::Application.config.session_store :active_record_store diff --git a/config/lighttpd.conf b/config/lighttpd.conf deleted file mode 100644 index 380d9e1..0000000 --- a/config/lighttpd.conf +++ /dev/null @@ -1,79 +0,0 @@ -server.port = 80 -server.bind = "127.0.0.1" -#server.event-handler = "freebsd-kqueue" - -server.modules = ( "mod_rewrite", "mod_fastcgi", ) -server.indexfiles = ( "dispatch.fcgi" ) -server.document-root = "public/" -server.error-handler-404 = "/dispatch.fcgi" -server.errorlog = "log/error.log" - -url.rewrite = ( "^/$" => "/login", "^([^.]+)$" => "$1.html" ) - -#### fastcgi module -fastcgi.server = ( - ".fcgi" => ( - "mailr" => ( - "min-procs" => 2, - "max-procs" => 2, - "socket" => "/tmp/mailr1.socket", - "bin-path" => "public/dispatch.fcgi", - "idle-timeout" => 120, - "bin-environment" => ( "RAILS_ENV" => "production" ) - ) - ) -) - - -mimetype.assign = ( - ".rpm" => "application/x-rpm", - ".pdf" => "application/pdf", - ".sig" => "application/pgp-signature", - ".spl" => "application/futuresplash", - ".class" => "application/octet-stream", - ".ps" => "application/postscript", - ".torrent" => "application/x-bittorrent", - ".dvi" => "application/x-dvi", - ".gz" => "application/x-gzip", - ".pac" => "application/x-ns-proxy-autoconfig", - ".swf" => "application/x-shockwave-flash", - ".tar.gz" => "application/x-tgz", - ".tgz" => "application/x-tgz", - ".tar" => "application/x-tar", - ".zip" => "application/zip", - ".mp3" => "audio/mpeg", - ".m3u" => "audio/x-mpegurl", - ".wma" => "audio/x-ms-wma", - ".wax" => "audio/x-ms-wax", - ".ogg" => "audio/x-wav", - ".wav" => "audio/x-wav", - ".gif" => "image/gif", - ".jpg" => "image/jpeg", - ".jpeg" => "image/jpeg", - ".png" => "image/png", - ".xbm" => "image/x-xbitmap", - ".xpm" => "image/x-xpixmap", - ".xwd" => "image/x-xwindowdump", - ".css" => "text/css", - ".html" => "text/html", - ".htm" => "text/html", - ".js" => "text/javascript", - ".asc" => "text/plain", - ".c" => "text/plain", - ".conf" => "text/plain", - ".text" => "text/plain", - ".txt" => "text/plain", - ".dtd" => "text/xml", - ".xml" => "text/xml", - ".mpeg" => "video/mpeg", - ".mpg" => "video/mpeg", - ".mov" => "video/quicktime", - ".qt" => "video/quicktime", - ".avi" => "video/x-msvideo", - ".asf" => "video/x-ms-asf", - ".asx" => "video/x-ms-asf", - ".wmv" => "video/x-ms-wmv", - ".bz2" => "application/x-bzip", - ".tbz" => "application/x-bzip-compressed-tar", - ".tar.bz2" => "application/x-bzip-compressed-tar" - ) diff --git a/config/locales/en.yml b/config/locales/en.yml old mode 100644 new mode 100755 index 57f3a7a..0411e8b --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1,7 +1,7 @@ en: mailr: Mailr email: Email - password: Password + password: Password log_in: Log In wrong_email_or_password: Wrong email or password specified. mailbox: Mailbox @@ -46,7 +46,7 @@ en: cc: CC bcc: BCC send: Send - choose_address: Choose addresses from contacts + choose_address: Choose addresses from contacts compose_txt: Compose new mail attachment: Attachment add: Add @@ -59,8 +59,9 @@ en: save: Save cancel: Cancel add_one_contact: Add one contact - add_multiple: Add multiple + add_multiple: Add multiple name: name add_folder: Add folder total_messages: Total messages unseen: Unseen + please_login: Log in diff --git a/config/locales/es-ES.yml b/config/locales/es-ES.yml old mode 100644 new mode 100755 diff --git a/config/locales/pl-PL.yml b/config/locales/pl.yml old mode 100644 new mode 100755 similarity index 96% rename from config/locales/pl-PL.yml rename to config/locales/pl.yml index dd7f194..9cf4ef9 --- a/config/locales/pl-PL.yml +++ b/config/locales/pl.yml @@ -1,4 +1,4 @@ -pl-PL: +pl: mailr: Mailr email: E-mail password: Hasło @@ -7,7 +7,7 @@ pl-PL: mailbox: Poczta folders: Foldery folder: Folder - empty: Pusty + empty: Opróżnij logout: Wyloguj compose: Nowa wiadomość preferences: Ustawienia @@ -68,3 +68,5 @@ pl-PL: user_logged_out: Użytkownik został wylogowany please_login: Logowanie add_to_contacts: Dodaj do kontaktów + want_to_empty_trash_message: Czy chcesz opróznic kosz? + diff --git a/config/routes.rb b/config/routes.rb old mode 100644 new mode 100755 index 36fed1f..289e679 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,27 +1,78 @@ -ActionController::Routing::Routes.draw do |map| - map.resources :folders, :requirements => {:id => /[^\/]+/} - map.resources :contacts, :member => {:add_from_mail => :get}, :collection => {:add_multiple => :get} - map.resources :contact_groups +Rails3::Application.routes.draw do + resources :folders + resources :contacts do + collection do + get :add_multiple + end + member do + get :add_from_mail + end + end - # Add your own custom routes here. - # The priority is based upon order of creation: first created -> highest priority. - - # Here's a sample route: - # map.connect 'products/:id', :controller => 'catalog', :action => 'view' - # Keep in mind you can assign values other than :controller and :action - map.root :controller=>'webmail', :action=>'index' + resources :contact_groups + match '/' => 'webmail#index' + match 'webmail' => 'webmail#index' + match 'webmail/:action' => 'webmail#index' + match '/contact/:action' => 'contacts#index' + match 'admin/main' => 'login#logout' + match ':controller/service.wsdl' => '#wsdl' + match '/:controller(/:action(/:id))' - map.connect 'webmail', :controller=>'webmail', :action=>'index' - - map.connect 'webmail/:action', :controller=>'webmail' - - map.connect '/contact/:action', :controller=>'contacts' - - map.connect 'admin/main', :controller=> 'login', :action=>'logout' - # Allow downloading Web Service WSDL as a file with an extension - # instead of a file named 'wsdl' - map.connect ':controller/service.wsdl', :action => 'wsdl' - - # Install the default route as the lowest priority. - map.connect ':controller/:action/:id' end + + # The priority is based upon order of creation: + # first created -> highest priority. + + # Sample of regular route: + # match 'products/:id' => 'catalog#view' + # Keep in mind you can assign values other than :controller and :action + + # Sample of named route: + # match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase + # This route can be invoked with purchase_url(:id => product.id) + + # Sample resource route (maps HTTP verbs to controller actions automatically): + # resources :products + + # Sample resource route with options: + # resources :products do + # member do + # get 'short' + # post 'toggle' + # end + # + # collection do + # get 'sold' + # end + # end + + # Sample resource route with sub-resources: + # resources :products do + # resources :comments, :sales + # resource :seller + # end + + # Sample resource route with more complex sub-resources + # resources :products do + # resources :comments + # resources :sales do + # get 'recent', :on => :collection + # end + # end + + # Sample resource route within a namespace: + # namespace :admin do + # # Directs /admin/products/* to Admin::ProductsController + # # (app/controllers/admin/products_controller.rb) + # resources :products + # end + + # You can have the root of your site routed with "root" + # just remember to delete public/index.html. + # root :to => "welcome#index" + + # See how all your routes lay out with "rake routes" + + # This is a legacy wild controller route that's not recommended for RESTful applications. + # Note: This route will make all actions in every controller accessible via GET requests. + # match ':controller(/:action(/:id(.:format)))' diff --git a/db/migrate/20090107193228_init.rb b/db/migrate/20090107193228_init.rb old mode 100644 new mode 100755 diff --git a/db/schema.mysql.sql b/db/schema.mysql.sql deleted file mode 100644 index 081577d..0000000 --- a/db/schema.mysql.sql +++ /dev/null @@ -1,111 +0,0 @@ -CREATE TABLE customers ( - id bigint(20) NOT NULL auto_increment, - fname varchar(50) default NULL, - lname varchar(50) default NULL, - email varchar(100) NOT NULL, - PRIMARY KEY (id), - UNIQUE INDEX (email) -) TYPE=MyISAM; - -CREATE TABLE filters ( - id bigint(20) NOT NULL auto_increment, - name varchar(50) default NULL, - destination_folder varchar(50) default NULL, - customer_id bigint(20) NOT NULL, - order_num int default 1, - PRIMARY KEY (id), - INDEX (customer_id), - FOREIGN KEY (customer_id) REFERENCES customers(id) -) TYPE=MyISAM; - -CREATE TABLE expressions ( - id bigint(20) NOT NULL auto_increment, - field_name varchar(20) default '^Subject' NOT NULL, - operator varchar(20) default 'contains' NOT NULL, - expr_value varchar(100) default '' NOT NULL, - case_sensitive bool default 0, - filter_id bigint(20) NOT NULL, - PRIMARY KEY (id), - INDEX (filter_id), - FOREIGN KEY (filter_id) REFERENCES filters(id) -) TYPE=MyISAM; - -CREATE TABLE `mail_prefs` ( - `id` int(11) NOT NULL auto_increment, - `mail_type` varchar(10) default 'text/plain', - `wm_rows` int(11) default '20', - `customer_id` bigint(20) default NULL, - `check_external_mail` tinyint(1) default '0', - PRIMARY KEY (`id`), - UNIQUE KEY `customer_id` (`customer_id`) -) TYPE=MyISAM; - -CREATE TABLE contacts ( - id bigint(20) NOT NULL auto_increment, - fname varchar(50) default NULL, - lname varchar(50) default NULL, - email varchar(100) default NULL, - hphone varchar(20) default NULL, - wphone varchar(20) default NULL, - mobile varchar(20) default NULL, - fax varchar(20) default NULL, - notes text, - create_date datetime default NULL, - delete_date datetime default NULL, - customer_id bigint(20) default NULL, - PRIMARY KEY (id), - INDEX (customer_id), - INDEX (customer_id, email), - INDEX (email), - FOREIGN KEY (customer_id) REFERENCES customers(id) -) TYPE=MyISAM; - -CREATE TABLE contact_groups ( - id bigint(20) NOT NULL auto_increment, - name varchar(50) default NULL, - customer_id bigint(20) default NULL, - PRIMARY KEY (id), - INDEX (customer_id), - FOREIGN KEY (customer_id) REFERENCES customers(id) -) TYPE=MyISAM; - -CREATE TABLE contact_contact_groups ( - contact_id bigint(20) NOT NULL, - contact_group_id bigint(20) NOT NULL, - PRIMARY KEY (contact_id, contact_group_id), - INDEX (contact_id), - INDEX (contact_group_id), - FOREIGN KEY (contact_id) REFERENCES contacts(id), - FOREIGN KEY (contact_group_id) REFERENCES contact_groups(id) -) TYPE=MyISAM; - --- Mysql Sessions -create table sessions ( - id bigint(20) NOT NULL auto_increment, - session_id varchar(255), - data text, - updated_at timestamp, - primary key(id), - index(session_id) -); - --- Cache -CREATE TABLE imap_messages ( - id bigint(20) NOT NULL auto_increment, - folder_name varchar(100) NOT NULL, - username varchar(100) NOT NULL, - msg_id varchar(100), - uid bigint(20) NOT NULL, - `from` varchar(255), - `from_flat` varchar(255), - `to` varchar(255), - `to_flat` varchar(255), - `subject` varchar(255), - `content_type` varchar(30), - `date` timestamp, - `unread` tinyint(1), - `size` bigint(20), - PRIMARY KEY (id), - INDEX (folder_name, username), - INDEX (folder_name, username,uid) -) TYPE=MyISAM; \ No newline at end of file diff --git a/db/schema.pgsql.sql b/db/schema.pgsql.sql deleted file mode 100644 index 8601175..0000000 --- a/db/schema.pgsql.sql +++ /dev/null @@ -1,111 +0,0 @@ -CREATE TABLE customers ( - id bigserial NOT NULL, - fname varchar(50) default NULL, - lname varchar(50) default NULL, - email varchar(100) NOT NULL, - PRIMARY KEY (id) -); -CREATE UNIQUE INDEX customers_email_idx ON customers(email); - -CREATE TABLE filters ( - id bigserial NOT NULL, - name varchar(50) default NULL, - destination_folder varchar(50) default NULL, - customer_id bigint NOT NULL, - order_num int default 1, - PRIMARY KEY (id), - FOREIGN KEY (customer_id) REFERENCES customers(id) -); -CREATE INDEX filters_customer_id_idx ON filters(customer_id); - -CREATE TABLE expressions ( - id bigserial NOT NULL, - field_name varchar(20) default '^Subject' NOT NULL, - operator varchar(20) default 'contains' NOT NULL, - expr_value varchar(100) default '' NOT NULL, - case_sensitive bool default FALSE, - filter_id bigint NOT NULL, - PRIMARY KEY (id), - FOREIGN KEY (filter_id) REFERENCES filters(id) -); -CREATE INDEX expressions_filter_id_idx ON expressions(filter_id); - -CREATE TABLE mail_prefs ( - id serial NOT NULL, - mail_type varchar(10) default 'text/plain', - wm_rows int default '20', - customer_id bigint default NULL, - check_external_mail bool default false, - PRIMARY KEY (id) -); -CREATE UNIQUE INDEX mail_prefs_customer_id_idx ON mail_prefs(customer_id); - -CREATE TABLE contacts ( - id bigserial NOT NULL, - fname varchar(50) default NULL, - lname varchar(50) default NULL, - email varchar(100) default NULL, - hphone varchar(20) default NULL, - wphone varchar(20) default NULL, - mobile varchar(20) default NULL, - fax varchar(20) default NULL, - notes text, - create_date timestamp default NULL, - delete_date timestamp default NULL, - customer_id bigint default NULL, - PRIMARY KEY (id), - FOREIGN KEY (customer_id) REFERENCES customers(id) -); -CREATE INDEX contacts_customer_id_idx ON contacts(customer_id); -CREATE INDEX contacts_customer_id_email_idx ON contacts(customer_id,email); -CREATE INDEX contacts_email_idx ON contacts(email); - - -CREATE TABLE contact_groups ( - id bigserial NOT NULL, - name varchar(50) default NULL, - customer_id bigint default NULL, - PRIMARY KEY (id), - FOREIGN KEY (customer_id) REFERENCES customers(id) -); -CREATE INDEX contact_groups_customer_id_idx ON contact_groups(customer_id); - -CREATE TABLE contact_contact_groups ( - contact_id bigint NOT NULL, - contact_group_id bigint NOT NULL, - PRIMARY KEY (contact_id, contact_group_id), - FOREIGN KEY (contact_id) REFERENCES contacts(id), - FOREIGN KEY (contact_group_id) REFERENCES contact_groups(id) -); -CREATE INDEX contact_contact_groups_contact_id_idx ON contact_contact_groups(contact_id); -CREATE INDEX contact_contact_groups_contact_group_id_idx ON contact_contact_groups(contact_group_id); - -create table sessions ( - id BIGSERIAL NOT NULL, - session_id VARCHAR(255) NULL, - data TEXT NULL, - updated_at TIMESTAMP default null, - PRIMARY KEY (id) -); -CREATE INDEX session_idx ON sessions(session_id); - -CREATE TABLE imap_messages ( - id BIGSERIAL NOT NULL, - folder_name VARCHAR(100) NOT NULL, - username VARCHAR(100) NOT NULL, - msg_id VARCHAR(100), - uid BIGINT NOT NULL, - "from" TEXT, - "from_flat" TEXT, - "to" TEXT, - "to_flat" TEXT, - "subject" TEXT, - "content_type" VARCHAR(30), - "date" TIMESTAMP, - "unread" BOOL default false, - "size" BIGINT, - PRIMARY KEY (id) -); - -CREATE INDEX msg_cache_fu_idx ON imap_messages(folder_name, username); -CREATE INDEX msg_cache_fuui_idx ON imap_messages(folder_name, username, uid); diff --git a/db/schema.rb b/db/schema.rb old mode 100644 new mode 100755 index 5bc7b90..16e407a --- a/db/schema.rb +++ b/db/schema.rb @@ -1,10 +1,11 @@ -# This file is auto-generated from the current state of the database. Instead of editing this file, -# please use the migrations feature of Active Record to incrementally modify your database, and -# then regenerate this schema definition. +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. # -# Note that this schema.rb definition is the authoritative source for your database schema. If you need -# to create the application database on another system, you should be using db:schema:load, not running -# all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations # you'll amass, the slower it'll run and the greater likelihood for issues). # # It's strongly recommended to check this file into your version control system. diff --git a/db/seeds.rb b/db/seeds.rb new file mode 100755 index 0000000..664d8c7 --- /dev/null +++ b/db/seeds.rb @@ -0,0 +1,7 @@ +# This file should contain all the record creation needed to seed the database with its default values. +# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). +# +# Examples: +# +# cities = City.create([{ :name => 'Chicago' }, { :name => 'Copenhagen' }]) +# Mayor.create(:name => 'Daley', :city => cities.first) diff --git a/doc/README_FOR_APP b/doc/README_FOR_APP old mode 100644 new mode 100755 index ac6c149..fe41f5c --- a/doc/README_FOR_APP +++ b/doc/README_FOR_APP @@ -1,2 +1,2 @@ Use this README file to introduce your application and point to useful places in the API for learning more. -Run "rake appdoc" to generate API documentation for your models and controllers. \ No newline at end of file +Run "rake doc:app" to generate API documentation for your models, controllers, helpers, and libraries. diff --git a/lib/cdfutils.rb b/lib/cdfutils.rb old mode 100644 new mode 100755 diff --git a/lib/imap_utils.rb b/lib/imap_utils.rb old mode 100644 new mode 100755 index 8cdf4fe..d38fb20 --- a/lib/imap_utils.rb +++ b/lib/imap_utils.rb @@ -1,5 +1,5 @@ module ImapUtils - private + private def load_imap_session return if ['error_connection'].include?(action_name) @@ -8,7 +8,7 @@ module ImapUtils def get_imap_session begin - @mailbox = IMAPMailbox.new + @mailbox = IMAPMailbox.new(self.logger) uname = (get_mail_prefs.check_external_mail == 1 ? user.email : user.local_email) upass = get_upass @mailbox.connect(uname, upass) @@ -17,7 +17,7 @@ module ImapUtils # logger.error("Exception on loggin webmail session - #{ex} - #{ex.backtrace.join("\t\n")}") # render :action => "error_connection" render :text => ex.inspect, :content_type => 'text/plain' - end + end end def close_imap_session @@ -31,7 +31,7 @@ module ImapUtils if not(@mailprefs = MailPref.find_by_customer_id(logged_customer)) @mailprefs = MailPref.create("customer_id"=>logged_customer) end - end + end @mailprefs end @@ -41,8 +41,8 @@ module ImapUtils else # retrun it plain session["wmp"] - end - end + end + end def load_folders if have_to_load_folders?() @@ -53,7 +53,7 @@ module ImapUtils end session["folder_name"] = @folder_name @folders = @mailbox.folders if @folders.nil? - end + end end def user diff --git a/lib/tasks/.gitkeep b/lib/tasks/.gitkeep new file mode 100755 index 0000000..e69de29 diff --git a/lib/tmail_patch.rb b/lib/tmail_patch.rb old mode 100644 new mode 100755 diff --git a/lib/webmail/bounced_mail.rb b/lib/webmail/bounced_mail.rb old mode 100644 new mode 100755 diff --git a/lib/webmail/cdfmail.rb b/lib/webmail/cdfmail.rb old mode 100644 new mode 100755 index b3cbe73..28ad051 --- a/lib/webmail/cdfmail.rb +++ b/lib/webmail/cdfmail.rb @@ -6,35 +6,35 @@ module CDF end class CDF::Mail - include ActionMailer::Quoting - + #include ActionMailer::Quoting #upgrade to Rails3 + def initialize(senderTempLocation) @attachments = Array.new @sender_temp_location = senderTempLocation @to_contacts = Array.new end - + def customer_id() @customer_id end - + def customer_id=(arg) @customer_id = arg end - + def from() @from end - + def from=(arg) @from = arg end - + def to() @to end - + def to=(arg) @to = arg end - + def to_contacts() @to_contacts end - + def to_contacts=(arg) @to_contacts = arg end - + def toc=(arg) @to_contacts = Array.new arg.split(",").each { |token| @to_contacts << token.to_i unless token == "" or token.strip() == "undefined"} unless arg.nil? or arg == "undefined" end - + def toc ret = String.new @to_contacts.each { |contact| @@ -47,60 +47,60 @@ class CDF::Mail } ret end - + def bcc() @bcc end - + def bcc=(arg) @bcc = arg end - + def cc() @cc end - + def cc=(arg) @cc = arg end - + def subject() @subject end - + def subject=(arg) @subject = arg end - + def attachments @attachments end - + def add_attachment(attachment) @attachments << attachment end - + def multipart? @attachments && @attachments.size > 0 end - + def delete_attachment(att_filename) @attachments.each { |att| att.delete_temp_data() if arr.filename == att_filename } @attachments.delete_if() { |att| att.filename == att_filename } end - + def delete_attachments() @attachments.each { |att| att.delete_temp_data() } @attachments = Array.new end - + def body() @body end - + def body=(arg) @body = arg end - + def content_type() @content_type end - + def content_type=(arg) @content_type = arg end - + def temp_location() @sender_temp_location end - + def send_mail(db_msg_id = 0) m = TMail::Mail.new m.from, m.body = self.from, self.body m.date = Time.now - m.subject, = quote_any_if_necessary("UTF-8", self.subject) + m.subject, = quote_any_if_necessary("UTF-8", self.subject) m.to = decode_addresses(self.to) - + m.cc, m.bcc = decode_addresses(self.cc), decode_addresses(self.bcc) - + if multipart? m.set_content_type("multipart/mixed") p = TMail::Mail.new(TMail::StringPort.new("")) @@ -127,21 +127,21 @@ class CDF::Mail } encmail = m.encoded RAILS_DEFAULT_LOGGER.debug("Sending message \n #{encmail}") - Net::SMTP.start(ActionMailer::Base.smtp_settings[:address], ActionMailer::Base.smtp_settings[:port], - ActionMailer::Base.smtp_settings[:domain], ActionMailer::Base.smtp_settings[:user_name], + Net::SMTP.start(ActionMailer::Base.smtp_settings[:address], ActionMailer::Base.smtp_settings[:port], + ActionMailer::Base.smtp_settings[:domain], ActionMailer::Base.smtp_settings[:user_name], ActionMailer::Base.smtp_settings[:password], ActionMailer::Base.smtp_settings[:authentication]) do |smtp| smtp.sendmail(encmail, m.from, m.destinations) end return encmail end - + def forward(tmail, fb) decoded_subject = mime_encoded?(tmail.subject) ? mime_decode(tmail.subject) : tmail.subject self.subject = "[Fwd: #{decoded_subject}]" attachment = CDF::Attachment.new(self) attachment.body(tmail, fb) end - + def reply(tmail, fb, type) decoded_subject = mime_encoded?(tmail.subject) ? mime_decode(tmail.subject) : tmail.subject self.subject = "Re: #{decoded_subject}" @@ -152,9 +152,9 @@ class CDF::Mail mt = MailTransform.new self.body = mt.get_body(tmail, type) end - - private - + + private + def delimeter if self.content_type == "text/plain" "\n" @@ -162,41 +162,41 @@ class CDF::Mail "
" end end - + def text2html(str) CGI.escapeHTML(str).gsub("\n", "
") end - + def html2text(txt) clear_html(txt) end - + def prepare_text(msg, ctype, bdy) msg.set_content_type(ctype, nil, {"charset"=>"utf-8"}) msg.transfer_encoding = "8bit" msg.body = bdy end - + def prepare_html(msg, ctype, bdy) msg.set_content_type(ctype, nil, {"charset"=>"utf8"}) msg.transfer_encoding = "8bit" msg.body = bdy end - + def prepare_alternative(msg, bdy) bound = ::TMail.new_boundary - + msg.set_content_type("multipart/alternative", nil, {"charset"=>"utf8", "boundary"=>bound}) msg.transfer_encoding = "8bit" - + ptext = TMail::Mail.new(TMail::StringPort.new("")) phtml = TMail::Mail.new(TMail::StringPort.new("")) - + prepare_text(ptext, "text/plain", html2text(bdy)) prepare_html(phtml, "text/html", bdy) - + msg.parts << ptext msg.parts << phtml end - + def decode_addresses(str) ret = String.new str.split(",").each { |addr| @@ -218,37 +218,37 @@ class CDF::Mail ret end end - + class CDF::Attachment - + def initialize(arg) @mail = arg @mail.add_attachment(self) @index = @mail.attachments.size - 1 end - + def filename=(arg) @filename = arg.tr('\\/:*?"\'<>|', '__________') end - + def filename() @filename end - + def temp_filename=(arg) @temp_filename = arg end - + def temp_filename() @temp_filename end - + def content_type=(arg) @content_type = arg end - + def content_type() @content_type end - + def delete_temp_data() File.delete(self.temp_filename) end - + def file File.open(self.temp_filename, "rb") { |fp| fp.read } end - + def file=(data) return if data.size == 0 @content_type = data.content_type @@ -258,7 +258,7 @@ class CDF::Attachment data.rewind File.open(@temp_filename, "wb") { |f| f.write(data.read) } end - + def body(data, fb) @content_type = "message/rfc822" filename = data.content_type['filename'] @@ -267,7 +267,7 @@ class CDF::Attachment check_store_path File.open(@temp_filename, "wb") { |f| f.write(fb) } end - + def check_store_path() path = "" "#{@mail.temp_location}".split(File::SEPARATOR).each { |p| @@ -275,11 +275,11 @@ class CDF::Attachment begin Dir.mkdir(path) rescue - end + end path << File::SEPARATOR - } + } end - + def encoded p = TMail::Mail.new(TMail::StringPort.new("")) data = self.file @@ -294,13 +294,13 @@ class CDF::Attachment p.set_content_type(@content_type, nil, {"charset"=>"utf8"}) p.set_disposition("inline;") p.transfer_encoding = "8bit" - else + else p.set_content_type(@content_type, nil, {"name"=>@filename}) p.set_disposition("inline; filename=#{@filename}") unless @filename.nil? p.set_disposition("inline;") if @filename.nil? p.transfer_encoding='Base64' p.body = TMail::Base64.folding_encode(data) end - return p + return p end end diff --git a/lib/webmail/environment.rb b/lib/webmail/environment.rb old mode 100644 new mode 100755 diff --git a/lib/webmail/expression.rb b/lib/webmail/expression.rb old mode 100644 new mode 100755 diff --git a/lib/webmail/filter.rb b/lib/webmail/filter.rb old mode 100644 new mode 100755 diff --git a/lib/webmail/imap_message.rb b/lib/webmail/imap_message.rb old mode 100644 new mode 100755 diff --git a/lib/webmail/imapmailbox.rb b/lib/webmail/imapmailbox.rb old mode 100644 new mode 100755 index e688d8e..24d7345 --- a/lib/webmail/imapmailbox.rb +++ b/lib/webmail/imapmailbox.rb @@ -22,9 +22,9 @@ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -# +# # Modifications (c) 2005 by littlegreen -# +# require 'net/imap' Net::IMAP.debug = true if CDF::CONFIG[:debug_imap] @@ -34,8 +34,8 @@ class Net::IMAP def process(data) return "\0#{@user}\0#{@password}" end - - private + + private def initialize(user, password) @user = user @password = password @@ -61,17 +61,20 @@ class IMAPMailbox attr_reader :connected attr_accessor :selected_mailbox cattr_accessor :logger - - def initialize + + def initialize(logger) @selected_mailbox = '' @folders = {} @connected = false + @logger = logger end - + def connect(username, password) + #logger.debug "*** connect: @connected" unless @connected use_ssl = CDF::CONFIG[:imap_use_ssl] ? true : false port = CDF::CONFIG[:imap_port] || (use_ssl ? 993 : 143) + # logger.debug "*** IMAP params: use_ssl => #{use_ssl}, port => #{port}" begin @imap = Net::IMAP.new(CDF::CONFIG[:imap_server], port, use_ssl) rescue Net::IMAP::ByeResponseError => bye @@ -80,26 +83,26 @@ class IMAPMailbox System.sleep(CDF::CONFIG[:imap_bye_timeout_retry_seconds]) @imap = Net::IMAP.new(CDF::CONFIG[:imap_server], port, use_ssl) rescue Error => ex - logger.error "Error on authentication!" - logger.error bye.backtrace.join("\n") + # logger.error "Error on authentication!" + # logger.error bye.backtrace.join("\n") raise AuthenticationError.new - end + end rescue Net::IMAP::NoResponseError => noresp - logger.error "Error on authentication!" - logger.error noresp.backtrace.join("\n") + # logger.error "Error on authentication!" + # logger.error noresp.backtrace.join("\n") raise AuthenticationError.new rescue Net::IMAP::BadResponseError => bad - logger.error "Error on authentication!" - logger.error bad.backtrace.join("\n") + # logger.error "Error on authentication!" + # logger.error bad.backtrace.join("\n") raise AuthenticationError.new rescue Net::IMAP::ResponseError => resp - logger.error "Error on authentication!" - logger.error resp.backtrace.join("\n") + # logger.error "Error on authentication!" + # logger.error resp.backtrace.join("\n") raise AuthenticationError.new - end + end @username = username begin - logger.error "IMAP authentication - #{CDF::CONFIG[:imap_auth]}." + # logger.error "IMAP authentication - #{CDF::CONFIG[:imap_auth]}." if CDF::CONFIG[:imap_auth] == 'NOAUTH' @imap.login(username, password) else @@ -107,17 +110,17 @@ class IMAPMailbox end @connected = true rescue Exception => ex - logger.error "Error on authentication!" - logger.error ex.backtrace.join("\n") + # logger.error "Error on authentication!" + # logger.error ex.backtrace.join("\n") raise AuthenticationError.new end end end - + def imap @imap end - + # Function chnage password works only if root has run imap_backend # and users courier-authlib utility authtest - from courier-imap version 4.0.1 def change_password(username, password, new_password) @@ -127,34 +130,34 @@ class IMAPMailbox if ret.include?("Password change succeeded.") return true else - logger.error "[!] Error on change password! - #{ret}" + logger.error "[!] Error on change password! - #{ret}" return false - end + end end - + def disconnect if @connected @imap.logout #@imap.disconnect @imap = nil @connected = false - end + end end - + def [](mailboxname) @last_folder = IMAPFolderList.new(self, @username)[mailboxname] end - + def folders # reference just to stop GC @folder_list ||= IMAPFolderList.new(self, @username) @folder_list end - + def reload @folder_list.reload if @folder_list end - + def create_folder(name) # begin @imap.create(Net::IMAP.encode_utf7(name)) @@ -162,16 +165,16 @@ class IMAPMailbox # rescue Exception=>e # end end - + def delete_folder(name) begin @imap.delete(folders[name].utf7_name) reload rescue Exception=>e - logger.error("Exception on delete #{name} folder #{e}") + logger.error("Exception on delete #{name} folder #{e}") end end - + def message_sent(message) # ensure we have sent folder begin @@ -179,14 +182,14 @@ class IMAPMailbox rescue Exception=>e end begin - @imap.append(CDF::CONFIG[:mail_sent], message) + @imap.append(CDF::CONFIG[:mail_sent], message) folders[CDF::CONFIG[:mail_sent]].cached = false if folders[CDF::CONFIG[:mail_sent]] rescue Exception=>e - logger.error("Error on append - #{e}") + logger.error("Error on append - #{e}") end - + end - + def message_bulk(message) # ensure we have sent folder begin @@ -194,24 +197,24 @@ class IMAPMailbox rescue Exception=>e end begin - @imap.append(CDF::CONFIG[:mail_bulk_sent], message) + @imap.append(CDF::CONFIG[:mail_bulk_sent], message) folders[CDF::CONFIG[:mail_sent]].cached = false if folders[CDF::CONFIG[:mail_bulk_sent]] rescue Exception=>e - logger.error("Error on bulk - #{e}") - end + logger.error("Error on bulk - #{e}") + end end end class IMAPFolderList include Enumerable cattr_accessor :logger - + def initialize(mailbox, username) @mailbox = mailbox @folders = Hash.new @username = username end - + def each refresh if @folders.empty? #@folders.each_value { |folder| yield folder } @@ -219,11 +222,11 @@ class IMAPFolderList @folders.sort.each { |pair| yield pair.last } end - + def reload refresh end - + def [](name) refresh if @folders.empty? @folders[name] @@ -233,7 +236,7 @@ class IMAPFolderList def refresh @folders = {} result = @mailbox.imap.list('', '*') - if result + if result result.each do |info| folder = IMAPFolder.new(@mailbox, info.name, @username, info.attr, info.delim) @folders[folder.name] = folder @@ -257,14 +260,14 @@ class IMAPFolder attr_reader :username attr_reader :delim attr_reader :attribs - + attr_writer :cached attr_writer :mcached - + cattr_accessor :logger - + @@fetch_attr = ['ENVELOPE','BODYSTRUCTURE', 'FLAGS', 'UID', 'RFC822.SIZE'] - + def initialize(mailbox, utf7_name, username, attribs, delim) @mailbox = mailbox @utf7_name = utf7_name @@ -276,7 +279,7 @@ class IMAPFolder @cached = false @mcached = false end - + def activate if(@mailbox.selected_mailbox != @name) @mailbox.selected_mailbox = @name @@ -284,7 +287,7 @@ class IMAPFolder load_total_unseen if !@cached end end - + # Just delete message without interaction with Trash folder def delete(message) activate @@ -295,17 +298,17 @@ class IMAPFolder ImapMessage.delete_all(["username = ? and folder_name = ? and uid = ?", @username, @name, uid]) @cached = false end - + # Deleted messages - move to trash folder def delete_multiple(uids) # ensure we have trash folder begin @mailbox.imap.create(CDF::CONFIG[:mail_trash]) - rescue + rescue end move_multiple(uids, CDF::CONFIG[:mail_trash]) end - + def copy(message, dst_folder) uid = (message.kind_of?(Integer) ? message : message.uid) activate @@ -313,14 +316,14 @@ class IMAPFolder @mailbox.folders[dst_folder].cached = false if @mailbox.folders[dst_folder] @mailbox.folders[dst_folder].mcached = false if @mailbox.folders[dst_folder] end - + def copy_multiple(message_uids, dst_folder) activate @mailbox.imap.uid_copy(message_uids, dst_folder) @mailbox.folders[dst_folder].cached = false if @mailbox.folders[dst_folder] @mailbox.folders[dst_folder].mcached = false if @mailbox.folders[dst_folder] end - + def move(message, dst_folder) uid = (message.kind_of?(Integer) ? message : message.uid) activate @@ -333,7 +336,7 @@ class IMAPFolder @cached = false @mcached = false end - + def move_multiple(message_uids, dst_folder) activate @mailbox.imap.uid_copy(message_uids, @mailbox.folders[dst_folder].utf7_name) @@ -345,7 +348,7 @@ class IMAPFolder @cached = false @mcached = false end - + def mark_read(message_uid) activate cached = ImapMessage.find(:first, :conditions => ["username = ? and folder_name = ? and uid = ?", @username, @name, message_uid]) @@ -357,7 +360,7 @@ class IMAPFolder @unseen_messages = @unseen_messages - 1 end end - + def mark_unread(message_uid) activate cached = ImapMessage.find(:first, :conditions => ["username = ? and folder_name = ? and uid = ?", @username, @name, message_uid]) @@ -369,7 +372,7 @@ class IMAPFolder @unseen_messages = @unseen_messages + 1 end end - + def expunge activate @mailbox.imap.expunge @@ -385,33 +388,33 @@ class IMAPFolder count = @mailbox.imap.fetch(1..-1, "UID") to = count.size if count.size < to - + range = (offset..to) - logger.info range.inspect + #logger.info range.inspect server_messages = @mailbox.imap.fetch(range, "(UID FLAGS)") #server_messages = @mailbox.imap.uid_fetch(sequence_uids, ["UID", "FLAGS"]) - + startDbFetch = Time.now cached_messages = ImapMessage.find(:all, :conditions => ["username = ? and folder_name = ?", @username, @name]) - + cached_unread_uids = Array.new cached_read_uids = Array.new uids_to_be_deleted = Array.new - - cached_messages.each { |msg| + + cached_messages.each { |msg| cached_unread_uids << msg.uid if msg.unread cached_read_uids << msg.uid unless msg.unread uids_to_be_deleted << msg.uid } - + uids_to_be_fetched = Array.new server_msg_uids = Array.new - + uids_unread = Array.new uids_read = Array.new - - server_messages.each { |server_msg| + + server_messages.each { |server_msg| uid, flags = server_msg.attr['UID'], server_msg.attr['FLAGS'] server_msg_uids << uid unless uids_to_be_deleted.include?(uid) @@ -421,32 +424,32 @@ class IMAPFolder uids_read << uid elsif !flags.member?(:Seen) && cached_read_uids.include?(uid) uids_unread << uid - end + end end uids_to_be_deleted.delete(uid) } unless server_messages.nil? - + ImapMessage.delete_all(["username = ? and folder_name = ? and uid in ( ? )", @username, @name, uids_to_be_deleted]) unless uids_to_be_deleted.empty? ImapMessage.update_all('unread = 0', ["username = ? and folder_name = ? and uid in ( ? )", @username, @name, uids_read]) unless uids_read.empty? ImapMessage.update_all('unread = 1', ["username = ? and folder_name = ? and uid in ( ? )", @username, @name, uids_unread]) unless uids_unread.empty? - - + + # fetch and store not cached messages - unless uids_to_be_fetched.empty? - logger.debug("About to fetch #{uids_to_be_fetched.join(",")}") + unless uids_to_be_fetched.empty? + # logger.debug("About to fetch #{uids_to_be_fetched.join(",")}") uids_to_be_fetched.each_slice(20) do |slice| fetch_uids(slice) end - end + end #FIX: @mcached = true - logger.debug("Synchonization done for folder #{@name} in #{Time.now - startSync} ms.") + # logger.debug("Synchonization done for folder #{@name} in #{Time.now - startSync} ms.") end - + def fetch_uids(uids) imapres = @mailbox.imap.uid_fetch(uids, @@fetch_attr) - imapres.each { |cache| + imapres.each { |cache| envelope = cache.attr['ENVELOPE']; - message = ImapMessage.create( :folder_name => @name, + message = ImapMessage.create( :folder_name => @name, :username => @username, :msg_id => envelope.message_id, :uid => cache.attr['UID'], @@ -459,18 +462,18 @@ class IMAPFolder :size => cache.attr['RFC822.SIZE']) } end - + def messages(offset = 0, limit = 10, sort = 'date desc') # Synchronize first retrieval time synchronize_cache(offset+1, limit) #unless @mcached - + if limit == -1 @messages = ImapMessage.find(:all, :conditions => ["username = ? and folder_name = ?", @username, @name], :order => sort) else @messages = ImapMessage.find(:all, :conditions => ["username = ? and folder_name = ?", @username, @name], :order => sort ) - end + end end - + def messages_search(query = ["ALL"], sort = 'date desc') activate uids = @mailbox.imap.uid_search(query) @@ -481,38 +484,38 @@ class IMAPFolder else return Array.new end - + end - + def message(uid) activate message = ImapMessage.find(:first, :conditions => ["username = ? and folder_name = ? and uid = ?", @username, @name, uid]) message.set_folder(self) message end - + def unseen activate load_total_unseen if !@cached - @unseen_messages + @unseen_messages end - + def total activate load_total_unseen if !@cached @total_messages end - + def load_total_unseen stat = @mailbox.imap.status(@utf7_name, ["MESSAGES", "UNSEEN"]) @total_messages, @unseen_messages = stat["MESSAGES"], stat['UNSEEN'] @cached = true end - + def update_status @status ||= @mailbox.imap.status(@utf7_name, ["MESSAGES"]) end - + def subscribe @mailbox.imap.subscribe(@utf7_name) end diff --git a/lib/webmail/mail2screen.rb b/lib/webmail/mail2screen.rb old mode 100644 new mode 100755 diff --git a/lib/webmail/mail_transform.rb b/lib/webmail/mail_transform.rb old mode 100644 new mode 100755 diff --git a/lib/webmail/maildropserializator.rb b/lib/webmail/maildropserializator.rb old mode 100644 new mode 100755 diff --git a/lib/webmail/routes.rb b/lib/webmail/routes.rb old mode 100644 new mode 100755 diff --git a/lib/webmail/virtual_email.rb b/lib/webmail/virtual_email.rb old mode 100644 new mode 100755 diff --git a/public/404.html b/public/404.html old mode 100644 new mode 100755 index 0e18456..9a48320 --- a/public/404.html +++ b/public/404.html @@ -1,8 +1,26 @@ - + + + The page you were looking for doesn't exist (404) + + + -

File not found

-

Change this error message for pages not found in public/404.html

+ +
+

The page you were looking for doesn't exist.

+

You may have mistyped the address or the page may have moved.

+
- \ No newline at end of file + diff --git a/public/422.html b/public/422.html new file mode 100755 index 0000000..83660ab --- /dev/null +++ b/public/422.html @@ -0,0 +1,26 @@ + + + + The change you wanted was rejected (422) + + + + + +
+

The change you wanted was rejected.

+

Maybe you tried to change something you didn't have access to.

+
+ + diff --git a/public/500.html b/public/500.html old mode 100644 new mode 100755 index a1001a0..b80307f --- a/public/500.html +++ b/public/500.html @@ -1,8 +1,26 @@ - + + + We're sorry, but something went wrong (500) + + + -

Application error (Apache)

-

Change this error message for exceptions thrown outside of an action (like in Dispatcher setups or broken Ruby code) in public/500.html

+ +
+

We're sorry, but something went wrong.

+

We've been notified about this issue and we'll take a look at it shortly.

+
- \ No newline at end of file + diff --git a/public/favicon.ico b/public/favicon.ico old mode 100644 new mode 100755 diff --git a/public/images/attachment.png b/public/images/attachment.png old mode 100644 new mode 100755 diff --git a/public/images/d6deec.gif b/public/images/d6deec.gif old mode 100644 new mode 100755 diff --git a/public/images/deselect.png b/public/images/deselect.png old mode 100644 new mode 100755 diff --git a/public/images/list_closed.gif b/public/images/list_closed.gif old mode 100644 new mode 100755 diff --git a/public/images/list_opened.gif b/public/images/list_opened.gif old mode 100644 new mode 100755 diff --git a/public/images/noprogress.gif b/public/images/noprogress.gif old mode 100644 new mode 100755 diff --git a/public/images/rails.png b/public/images/rails.png new file mode 100755 index 0000000000000000000000000000000000000000..d5edc04e65f555e3ba4dcdaad39dc352e75b575e GIT binary patch literal 6646 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 literal 0 HcmV?d00001 diff --git a/public/images/select.png b/public/images/select.png old mode 100644 new mode 100755 diff --git a/public/images/white.gif b/public/images/white.gif old mode 100644 new mode 100755 diff --git a/public/images/white.png b/public/images/white.png old mode 100644 new mode 100755 diff --git a/public/javascripts/application.js b/public/javascripts/application.js old mode 100644 new mode 100755 diff --git a/public/javascripts/controls.js b/public/javascripts/controls.js old mode 100644 new mode 100755 index ca29aef..7392fb6 --- a/public/javascripts/controls.js +++ b/public/javascripts/controls.js @@ -1,6 +1,8 @@ -// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// (c) 2005-2008 Ivan Krstic (http://blogs.law.harvard.edu/ivan) -// (c) 2005-2008 Jon Tirsen (http://www.tirsen.com) +// script.aculo.us controls.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 + +// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// (c) 2005-2009 Ivan Krstic (http://blogs.law.harvard.edu/ivan) +// (c) 2005-2009 Jon Tirsen (http://www.tirsen.com) // Contributors: // Richard Livsey // Rahul Bhargava diff --git a/public/javascripts/dragdrop.js b/public/javascripts/dragdrop.js old mode 100644 new mode 100755 index 07229f9..15c6dbc --- a/public/javascripts/dragdrop.js +++ b/public/javascripts/dragdrop.js @@ -1,5 +1,6 @@ -// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// (c) 2005-2008 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz) +// script.aculo.us dragdrop.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 + +// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) // // script.aculo.us is freely distributable under the terms of an MIT-style license. // For details, see the script.aculo.us web site: http://script.aculo.us/ @@ -311,7 +312,7 @@ var Draggable = Class.create({ tag_name=='TEXTAREA')) return; var pointer = [Event.pointerX(event), Event.pointerY(event)]; - var pos = Position.cumulativeOffset(this.element); + var pos = this.element.cumulativeOffset(); this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) }); Draggables.activate(this); @@ -454,7 +455,7 @@ var Draggable = Class.create({ }, draw: function(point) { - var pos = Position.cumulativeOffset(this.element); + var pos = this.element.cumulativeOffset(); if(this.options.ghosting) { var r = Position.realOffset(this.element); pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY; @@ -730,7 +731,7 @@ var Sortable = { } // keep reference - this.sortables[element.id] = options; + this.sortables[element.identify()] = options; // for onupdate Draggables.addObserver(new SortableObserver(element, options.onUpdate)); @@ -825,7 +826,7 @@ var Sortable = { hide().addClassName('dropmarker').setStyle({position:'absolute'}); document.getElementsByTagName("body").item(0).appendChild(Sortable._marker); } - var offsets = Position.cumulativeOffset(dropon); + var offsets = dropon.cumulativeOffset(); Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'}); if(position=='after') diff --git a/public/javascripts/effects.js b/public/javascripts/effects.js old mode 100644 new mode 100755 index 5a639d2..c81e6c7 --- a/public/javascripts/effects.js +++ b/public/javascripts/effects.js @@ -1,4 +1,6 @@ -// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// script.aculo.us effects.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 + +// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) // Contributors: // Justin Palmer (http://encytemedia.com/) // Mark Pilgrim (http://diveintomark.org/) @@ -145,14 +147,13 @@ var Effect = { 'blind': ['BlindDown','BlindUp'], 'appear': ['Appear','Fade'] }, - toggle: function(element, effect) { + toggle: function(element, effect, options) { element = $(element); - effect = (effect || 'appear').toLowerCase(); - var options = Object.extend({ + effect = (effect || 'appear').toLowerCase(); + + return Effect[ Effect.PAIRS[ effect ][ element.visible() ? 1 : 0 ] ](element, Object.extend({ queue: { position:'end', scope:(element.id || 'global'), limit: 1 } - }, arguments[2] || { }); - Effect[element.visible() ? - Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options); + }, options || {})); } }; @@ -228,12 +229,6 @@ Effect.Queue = Effect.Queues.get('global'); Effect.Base = Class.create({ position: null, start: function(options) { - function codeForEvent(options,eventName){ - return ( - (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') + - (options[eventName] ? 'this.options.'+eventName+'(this);' : '') - ); - } if (options && options.transition === false) options.transition = Effect.Transitions.linear; this.options = Object.extend(Object.extend({ },Effect.DefaultOptions), options || { }); this.currentFrame = 0; diff --git a/public/javascripts/effects2.js b/public/javascripts/effects2.js old mode 100644 new mode 100755 diff --git a/public/javascripts/global.js b/public/javascripts/global.js old mode 100644 new mode 100755 diff --git a/public/javascripts/global_src.js b/public/javascripts/global_src.js old mode 100644 new mode 100755 diff --git a/public/javascripts/prototype.js b/public/javascripts/prototype.js old mode 100644 new mode 100755 index dfe8ab4..06249a6 --- a/public/javascripts/prototype.js +++ b/public/javascripts/prototype.js @@ -1,5 +1,5 @@ -/* Prototype JavaScript framework, version 1.6.0.3 - * (c) 2005-2008 Sam Stephenson +/* Prototype JavaScript framework, version 1.7_rc2 + * (c) 2005-2010 Sam Stephenson * * Prototype is freely distributable under the terms of an MIT-style license. * For details, see the Prototype web site: http://www.prototypejs.org/ @@ -7,32 +7,53 @@ *--------------------------------------------------------------------------*/ var Prototype = { - Version: '1.6.0.3', - Browser: { - IE: !!(window.attachEvent && - navigator.userAgent.indexOf('Opera') === -1), - Opera: navigator.userAgent.indexOf('Opera') > -1, - WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1, - Gecko: navigator.userAgent.indexOf('Gecko') > -1 && - navigator.userAgent.indexOf('KHTML') === -1, - MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/) - }, + Version: '1.7_rc2', + + Browser: (function(){ + var ua = navigator.userAgent; + var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]'; + return { + IE: !!window.attachEvent && !isOpera, + Opera: isOpera, + WebKit: ua.indexOf('AppleWebKit/') > -1, + Gecko: ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1, + MobileSafari: /Apple.*Mobile/.test(ua) + } + })(), BrowserFeatures: { XPath: !!document.evaluate, + SelectorsAPI: !!document.querySelector, - ElementExtensions: !!window.HTMLElement, - SpecificElementExtensions: - document.createElement('div')['__proto__'] && - document.createElement('div')['__proto__'] !== - document.createElement('form')['__proto__'] + + ElementExtensions: (function() { + var constructor = window.Element || window.HTMLElement; + return !!(constructor && constructor.prototype); + })(), + SpecificElementExtensions: (function() { + if (typeof window.HTMLDivElement !== 'undefined') + return true; + + var div = document.createElement('div'), + form = document.createElement('form'), + isSupported = false; + + if (div['__proto__'] && (div['__proto__'] !== form['__proto__'])) { + isSupported = true; + } + + div = form = null; + + return isSupported; + })() }, ScriptFragment: ']*>([\\S\\s]*?)<\/script>', JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, emptyFunction: function() { }, + K: function(x) { return x } }; @@ -40,232 +61,8 @@ if (Prototype.Browser.MobileSafari) Prototype.BrowserFeatures.SpecificElementExtensions = false; -/* Based on Alex Arnell's inheritance implementation. */ -var Class = { - create: function() { - var parent = null, properties = $A(arguments); - if (Object.isFunction(properties[0])) - parent = properties.shift(); - - function klass() { - this.initialize.apply(this, arguments); - } - - Object.extend(klass, Class.Methods); - klass.superclass = parent; - klass.subclasses = []; - - if (parent) { - var subclass = function() { }; - subclass.prototype = parent.prototype; - klass.prototype = new subclass; - parent.subclasses.push(klass); - } - - for (var i = 0; i < properties.length; i++) - klass.addMethods(properties[i]); - - if (!klass.prototype.initialize) - klass.prototype.initialize = Prototype.emptyFunction; - - klass.prototype.constructor = klass; - - return klass; - } -}; - -Class.Methods = { - addMethods: function(source) { - var ancestor = this.superclass && this.superclass.prototype; - var properties = Object.keys(source); - - if (!Object.keys({ toString: true }).length) - properties.push("toString", "valueOf"); - - for (var i = 0, length = properties.length; i < length; i++) { - var property = properties[i], value = source[property]; - if (ancestor && Object.isFunction(value) && - value.argumentNames().first() == "$super") { - var method = value; - value = (function(m) { - return function() { return ancestor[m].apply(this, arguments) }; - })(property).wrap(method); - - value.valueOf = method.valueOf.bind(method); - value.toString = method.toString.bind(method); - } - this.prototype[property] = value; - } - - return this; - } -}; - var Abstract = { }; -Object.extend = function(destination, source) { - for (var property in source) - destination[property] = source[property]; - return destination; -}; - -Object.extend(Object, { - inspect: function(object) { - try { - if (Object.isUndefined(object)) return 'undefined'; - if (object === null) return 'null'; - return object.inspect ? object.inspect() : String(object); - } catch (e) { - if (e instanceof RangeError) return '...'; - throw e; - } - }, - - toJSON: function(object) { - var type = typeof object; - switch (type) { - case 'undefined': - case 'function': - case 'unknown': return; - case 'boolean': return object.toString(); - } - - if (object === null) return 'null'; - if (object.toJSON) return object.toJSON(); - if (Object.isElement(object)) return; - - var results = []; - for (var property in object) { - var value = Object.toJSON(object[property]); - if (!Object.isUndefined(value)) - results.push(property.toJSON() + ': ' + value); - } - - return '{' + results.join(', ') + '}'; - }, - - toQueryString: function(object) { - return $H(object).toQueryString(); - }, - - toHTML: function(object) { - return object && object.toHTML ? object.toHTML() : String.interpret(object); - }, - - keys: function(object) { - var keys = []; - for (var property in object) - keys.push(property); - return keys; - }, - - values: function(object) { - var values = []; - for (var property in object) - values.push(object[property]); - return values; - }, - - clone: function(object) { - return Object.extend({ }, object); - }, - - isElement: function(object) { - return !!(object && object.nodeType == 1); - }, - - isArray: function(object) { - return object != null && typeof object == "object" && - 'splice' in object && 'join' in object; - }, - - isHash: function(object) { - return object instanceof Hash; - }, - - isFunction: function(object) { - return typeof object == "function"; - }, - - isString: function(object) { - return typeof object == "string"; - }, - - isNumber: function(object) { - return typeof object == "number"; - }, - - isUndefined: function(object) { - return typeof object == "undefined"; - } -}); - -Object.extend(Function.prototype, { - argumentNames: function() { - var names = this.toString().match(/^[\s\(]*function[^(]*\(([^\)]*)\)/)[1] - .replace(/\s+/g, '').split(','); - return names.length == 1 && !names[0] ? [] : names; - }, - - bind: function() { - if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this; - var __method = this, args = $A(arguments), object = args.shift(); - return function() { - return __method.apply(object, args.concat($A(arguments))); - } - }, - - bindAsEventListener: function() { - var __method = this, args = $A(arguments), object = args.shift(); - return function(event) { - return __method.apply(object, [event || window.event].concat(args)); - } - }, - - curry: function() { - if (!arguments.length) return this; - var __method = this, args = $A(arguments); - return function() { - return __method.apply(this, args.concat($A(arguments))); - } - }, - - delay: function() { - var __method = this, args = $A(arguments), timeout = args.shift() * 1000; - return window.setTimeout(function() { - return __method.apply(__method, args); - }, timeout); - }, - - defer: function() { - var args = [0.01].concat($A(arguments)); - return this.delay.apply(this, args); - }, - - wrap: function(wrapper) { - var __method = this; - return function() { - return wrapper.apply(this, [__method.bind(this)].concat($A(arguments))); - } - }, - - methodize: function() { - if (this._methodized) return this._methodized; - var __method = this; - return this._methodized = function() { - return __method.apply(null, [this].concat($A(arguments))); - }; - } -}); - -Date.prototype.toJSON = function() { - return '"' + this.getUTCFullYear() + '-' + - (this.getUTCMonth() + 1).toPaddedString(2) + '-' + - this.getUTCDate().toPaddedString(2) + 'T' + - this.getUTCHours().toPaddedString(2) + ':' + - this.getUTCMinutes().toPaddedString(2) + ':' + - this.getUTCSeconds().toPaddedString(2) + 'Z"'; -}; var Try = { these: function() { @@ -283,14 +80,400 @@ var Try = { } }; +/* Based on Alex Arnell's inheritance implementation. */ + +var Class = (function() { + + var IS_DONTENUM_BUGGY = (function(){ + for (var p in { toString: 1 }) { + if (p === 'toString') return false; + } + return true; + })(); + + function subclass() {}; + function create() { + var parent = null, properties = $A(arguments); + if (Object.isFunction(properties[0])) + parent = properties.shift(); + + function klass() { + this.initialize.apply(this, arguments); + } + + Object.extend(klass, Class.Methods); + klass.superclass = parent; + klass.subclasses = []; + + if (parent) { + subclass.prototype = parent.prototype; + klass.prototype = new subclass; + parent.subclasses.push(klass); + } + + for (var i = 0, length = properties.length; i < length; i++) + klass.addMethods(properties[i]); + + if (!klass.prototype.initialize) + klass.prototype.initialize = Prototype.emptyFunction; + + klass.prototype.constructor = klass; + return klass; + } + + function addMethods(source) { + var ancestor = this.superclass && this.superclass.prototype, + properties = Object.keys(source); + + if (IS_DONTENUM_BUGGY) { + if (source.toString != Object.prototype.toString) + properties.push("toString"); + if (source.valueOf != Object.prototype.valueOf) + properties.push("valueOf"); + } + + for (var i = 0, length = properties.length; i < length; i++) { + var property = properties[i], value = source[property]; + if (ancestor && Object.isFunction(value) && + value.argumentNames()[0] == "$super") { + var method = value; + value = (function(m) { + return function() { return ancestor[m].apply(this, arguments); }; + })(property).wrap(method); + + value.valueOf = method.valueOf.bind(method); + value.toString = method.toString.bind(method); + } + this.prototype[property] = value; + } + + return this; + } + + return { + create: create, + Methods: { + addMethods: addMethods + } + }; +})(); +(function() { + + var _toString = Object.prototype.toString, + NULL_TYPE = 'Null', + UNDEFINED_TYPE = 'Undefined', + BOOLEAN_TYPE = 'Boolean', + NUMBER_TYPE = 'Number', + STRING_TYPE = 'String', + OBJECT_TYPE = 'Object', + BOOLEAN_CLASS = '[object Boolean]', + NUMBER_CLASS = '[object Number]', + STRING_CLASS = '[object String]', + ARRAY_CLASS = '[object Array]', + NATIVE_JSON_STRINGIFY_SUPPORT = window.JSON && + typeof JSON.stringify === 'function' && + JSON.stringify(0) === '0' && + typeof JSON.stringify(Prototype.K) === 'undefined'; + + function Type(o) { + switch(o) { + case null: return NULL_TYPE; + case (void 0): return UNDEFINED_TYPE; + } + var type = typeof o; + switch(type) { + case 'boolean': return BOOLEAN_TYPE; + case 'number': return NUMBER_TYPE; + case 'string': return STRING_TYPE; + } + return OBJECT_TYPE; + } + + function extend(destination, source) { + for (var property in source) + destination[property] = source[property]; + return destination; + } + + function inspect(object) { + try { + if (isUndefined(object)) return 'undefined'; + if (object === null) return 'null'; + return object.inspect ? object.inspect() : String(object); + } catch (e) { + if (e instanceof RangeError) return '...'; + throw e; + } + } + + function toJSON(value) { + return Str('', { '': value }, []); + } + + function Str(key, holder, stack) { + var value = holder[key], + type = typeof value; + + if (Type(value) === OBJECT_TYPE && typeof value.toJSON === 'function') { + value = value.toJSON(key); + } + + var _class = _toString.call(value); + + switch (_class) { + case NUMBER_CLASS: + case BOOLEAN_CLASS: + case STRING_CLASS: + value = value.valueOf(); + } + + switch (value) { + case null: return 'null'; + case true: return 'true'; + case false: return 'false'; + } + + type = typeof value; + switch (type) { + case 'string': + return value.inspect(true); + case 'number': + return isFinite(value) ? String(value) : 'null'; + case 'object': + + for (var i = 0, length = stack.length; i < length; i++) { + if (stack[i] === value) { throw new TypeError(); } + } + stack.push(value); + + var partial = []; + if (_class === ARRAY_CLASS) { + for (var i = 0, length = value.length; i < length; i++) { + var str = Str(i, value, stack); + partial.push(typeof str === 'undefined' ? 'null' : str); + } + partial = '[' + partial.join(',') + ']'; + } else { + var keys = Object.keys(value); + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i], str = Str(key, value, stack); + if (typeof str !== "undefined") { + partial.push(key.inspect(true)+ ':' + str); + } + } + partial = '{' + partial.join(',') + '}'; + } + stack.pop(); + return partial; + } + } + + function stringify(object) { + return JSON.stringify(object); + } + + function toQueryString(object) { + return $H(object).toQueryString(); + } + + function toHTML(object) { + return object && object.toHTML ? object.toHTML() : String.interpret(object); + } + + function keys(object) { + if (Type(object) !== OBJECT_TYPE) { throw new TypeError(); } + var results = []; + for (var property in object) { + if (object.hasOwnProperty(property)) { + results.push(property); + } + } + return results; + } + + function values(object) { + var results = []; + for (var property in object) + results.push(object[property]); + return results; + } + + function clone(object) { + return extend({ }, object); + } + + function isElement(object) { + return !!(object && object.nodeType == 1); + } + + function isArray(object) { + return _toString.call(object) === ARRAY_CLASS; + } + + var hasNativeIsArray = (typeof Array.isArray == 'function') + && Array.isArray([]) && !Array.isArray({}); + + if (hasNativeIsArray) { + isArray = Array.isArray; + } + + function isHash(object) { + return object instanceof Hash; + } + + function isFunction(object) { + return typeof object === "function"; + } + + function isString(object) { + return _toString.call(object) === STRING_CLASS; + } + + function isNumber(object) { + return _toString.call(object) === NUMBER_CLASS; + } + + function isUndefined(object) { + return typeof object === "undefined"; + } + + extend(Object, { + extend: extend, + inspect: inspect, + toJSON: NATIVE_JSON_STRINGIFY_SUPPORT ? stringify : toJSON, + toQueryString: toQueryString, + toHTML: toHTML, + keys: Object.keys || keys, + values: values, + clone: clone, + isElement: isElement, + isArray: isArray, + isHash: isHash, + isFunction: isFunction, + isString: isString, + isNumber: isNumber, + isUndefined: isUndefined + }); +})(); +Object.extend(Function.prototype, (function() { + var slice = Array.prototype.slice; + + function update(array, args) { + var arrayLength = array.length, length = args.length; + while (length--) array[arrayLength + length] = args[length]; + return array; + } + + function merge(array, args) { + array = slice.call(array, 0); + return update(array, args); + } + + function argumentNames() { + var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1] + .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '') + .replace(/\s+/g, '').split(','); + return names.length == 1 && !names[0] ? [] : names; + } + + function bind(context) { + if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this; + var __method = this, args = slice.call(arguments, 1); + return function() { + var a = merge(args, arguments); + return __method.apply(context, a); + } + } + + function bindAsEventListener(context) { + var __method = this, args = slice.call(arguments, 1); + return function(event) { + var a = update([event || window.event], args); + return __method.apply(context, a); + } + } + + function curry() { + if (!arguments.length) return this; + var __method = this, args = slice.call(arguments, 0); + return function() { + var a = merge(args, arguments); + return __method.apply(this, a); + } + } + + function delay(timeout) { + var __method = this, args = slice.call(arguments, 1); + timeout = timeout * 1000; + return window.setTimeout(function() { + return __method.apply(__method, args); + }, timeout); + } + + function defer() { + var args = update([0.01], arguments); + return this.delay.apply(this, args); + } + + function wrap(wrapper) { + var __method = this; + return function() { + var a = update([__method.bind(this)], arguments); + return wrapper.apply(this, a); + } + } + + function methodize() { + if (this._methodized) return this._methodized; + var __method = this; + return this._methodized = function() { + var a = update([this], arguments); + return __method.apply(null, a); + }; + } + + return { + argumentNames: argumentNames, + bind: bind, + bindAsEventListener: bindAsEventListener, + curry: curry, + delay: delay, + defer: defer, + wrap: wrap, + methodize: methodize + } +})()); + + + +(function(proto) { + + + function toISOString() { + return this.getUTCFullYear() + '-' + + (this.getUTCMonth() + 1).toPaddedString(2) + '-' + + this.getUTCDate().toPaddedString(2) + 'T' + + this.getUTCHours().toPaddedString(2) + ':' + + this.getUTCMinutes().toPaddedString(2) + ':' + + this.getUTCSeconds().toPaddedString(2) + 'Z'; + } + + + function toJSON() { + return this.toISOString(); + } + + if (!proto.toISOString) proto.toISOString = toISOString; + if (!proto.toJSON) proto.toJSON = toJSON; + +})(Date.prototype); + + RegExp.prototype.match = RegExp.prototype.test; RegExp.escape = function(str) { return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); }; - -/*--------------------------------------------------------------------------*/ - var PeriodicalExecuter = Class.create({ initialize: function(callback, frequency) { this.callback = callback; @@ -319,8 +502,10 @@ var PeriodicalExecuter = Class.create({ try { this.currentlyExecuting = true; this.execute(); - } finally { this.currentlyExecuting = false; + } catch(e) { + this.currentlyExecuting = false; + throw e; } } } @@ -339,10 +524,28 @@ Object.extend(String, { } }); -Object.extend(String.prototype, { - gsub: function(pattern, replacement) { +Object.extend(String.prototype, (function() { + var NATIVE_JSON_PARSE_SUPPORT = window.JSON && + typeof JSON.parse === 'function' && + JSON.parse('{"test": true}').test; + + function prepareReplacement(replacement) { + if (Object.isFunction(replacement)) return replacement; + var template = new Template(replacement); + return function(match) { return template.evaluate(match) }; + } + + function gsub(pattern, replacement) { var result = '', source = this, match; - replacement = arguments.callee.prepareReplacement(replacement); + replacement = prepareReplacement(replacement); + + if (Object.isString(pattern)) + pattern = RegExp.escape(pattern); + + if (!(pattern.length || pattern.source)) { + replacement = replacement(''); + return replacement + source.split('').join(replacement) + replacement; + } while (source.length > 0) { if (match = source.match(pattern)) { @@ -354,76 +557,72 @@ Object.extend(String.prototype, { } } return result; - }, + } - sub: function(pattern, replacement, count) { - replacement = this.gsub.prepareReplacement(replacement); + function sub(pattern, replacement, count) { + replacement = prepareReplacement(replacement); count = Object.isUndefined(count) ? 1 : count; return this.gsub(pattern, function(match) { if (--count < 0) return match[0]; return replacement(match); }); - }, + } - scan: function(pattern, iterator) { + function scan(pattern, iterator) { this.gsub(pattern, iterator); return String(this); - }, + } - truncate: function(length, truncation) { + function truncate(length, truncation) { length = length || 30; truncation = Object.isUndefined(truncation) ? '...' : truncation; return this.length > length ? this.slice(0, length - truncation.length) + truncation : String(this); - }, + } - strip: function() { + function strip() { return this.replace(/^\s+/, '').replace(/\s+$/, ''); - }, + } - stripTags: function() { - return this.replace(/<\/?[^>]+>/gi, ''); - }, + function stripTags() { + return this.replace(/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi, ''); + } - stripScripts: function() { + function stripScripts() { return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); - }, + } - extractScripts: function() { - var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); - var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); + function extractScripts() { + var matchAll = new RegExp(Prototype.ScriptFragment, 'img'), + matchOne = new RegExp(Prototype.ScriptFragment, 'im'); return (this.match(matchAll) || []).map(function(scriptTag) { return (scriptTag.match(matchOne) || ['', ''])[1]; }); - }, + } - evalScripts: function() { + function evalScripts() { return this.extractScripts().map(function(script) { return eval(script) }); - }, + } - escapeHTML: function() { - var self = arguments.callee; - self.text.data = this; - return self.div.innerHTML; - }, + function escapeHTML() { + return this.replace(/&/g,'&').replace(//g,'>'); + } - unescapeHTML: function() { - var div = new Element('div'); - div.innerHTML = this.stripTags(); - return div.childNodes[0] ? (div.childNodes.length > 1 ? - $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) : - div.childNodes[0].nodeValue) : ''; - }, + function unescapeHTML() { + return this.stripTags().replace(/</g,'<').replace(/>/g,'>').replace(/&/g,'&'); + } - toQueryParams: function(separator) { + + function toQueryParams(separator) { var match = this.strip().match(/([^?#]*)(#.*)?$/); if (!match) return { }; return match[1].split(separator || '&').inject({ }, function(hash, pair) { if ((pair = pair.split('='))[0]) { - var key = decodeURIComponent(pair.shift()); - var value = pair.length > 1 ? pair.join('=') : pair[0]; + var key = decodeURIComponent(pair.shift()), + value = pair.length > 1 ? pair.join('=') : pair[0]; + if (value != undefined) value = decodeURIComponent(value); if (key in hash) { @@ -434,128 +633,144 @@ Object.extend(String.prototype, { } return hash; }); - }, + } - toArray: function() { + function toArray() { return this.split(''); - }, + } - succ: function() { + function succ() { return this.slice(0, this.length - 1) + String.fromCharCode(this.charCodeAt(this.length - 1) + 1); - }, + } - times: function(count) { + function times(count) { return count < 1 ? '' : new Array(count + 1).join(this); - }, + } - camelize: function() { - var parts = this.split('-'), len = parts.length; - if (len == 1) return parts[0]; + function camelize() { + return this.replace(/-+(.)?/g, function(match, chr) { + return chr ? chr.toUpperCase() : ''; + }); + } - var camelized = this.charAt(0) == '-' - ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) - : parts[0]; - - for (var i = 1; i < len; i++) - camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1); - - return camelized; - }, - - capitalize: function() { + function capitalize() { return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); - }, + } - underscore: function() { - return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase(); - }, + function underscore() { + return this.replace(/::/g, '/') + .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2') + .replace(/([a-z\d])([A-Z])/g, '$1_$2') + .replace(/-/g, '_') + .toLowerCase(); + } - dasherize: function() { - return this.gsub(/_/,'-'); - }, + function dasherize() { + return this.replace(/_/g, '-'); + } - inspect: function(useDoubleQuotes) { - var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) { - var character = String.specialChar[match[0]]; - return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16); + function inspect(useDoubleQuotes) { + var escapedString = this.replace(/[\x00-\x1f\\]/g, function(character) { + if (character in String.specialChar) { + return String.specialChar[character]; + } + return '\\u00' + character.charCodeAt().toPaddedString(2, 16); }); if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; return "'" + escapedString.replace(/'/g, '\\\'') + "'"; - }, + } - toJSON: function() { - return this.inspect(true); - }, + function unfilterJSON(filter) { + return this.replace(filter || Prototype.JSONFilter, '$1'); + } - unfilterJSON: function(filter) { - return this.sub(filter || Prototype.JSONFilter, '#{1}'); - }, - - isJSON: function() { + function isJSON() { var str = this; if (str.blank()) return false; - str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''); - return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str); - }, + str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@'); + str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'); + str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, ''); + return (/^[\],:{}\s]*$/).test(str); + } - evalJSON: function(sanitize) { - var json = this.unfilterJSON(); + function evalJSON(sanitize) { + var json = this.unfilterJSON(), + cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; + if (cx.test(json)) { + json = json.replace(cx, function (a) { + return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } try { if (!sanitize || json.isJSON()) return eval('(' + json + ')'); } catch (e) { } throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); - }, + } - include: function(pattern) { + function parseJSON() { + var json = this.unfilterJSON(); + return JSON.parse(json); + } + + function include(pattern) { return this.indexOf(pattern) > -1; - }, + } - startsWith: function(pattern) { - return this.indexOf(pattern) === 0; - }, + function startsWith(pattern) { + return this.lastIndexOf(pattern, 0) === 0; + } - endsWith: function(pattern) { + function endsWith(pattern) { var d = this.length - pattern.length; - return d >= 0 && this.lastIndexOf(pattern) === d; - }, + return d >= 0 && this.indexOf(pattern, d) === d; + } - empty: function() { + function empty() { return this == ''; - }, + } - blank: function() { + function blank() { return /^\s*$/.test(this); - }, + } - interpolate: function(object, pattern) { + function interpolate(object, pattern) { return new Template(this, pattern).evaluate(object); } -}); -if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, { - escapeHTML: function() { - return this.replace(/&/g,'&').replace(//g,'>'); - }, - unescapeHTML: function() { - return this.stripTags().replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); - } -}); - -String.prototype.gsub.prepareReplacement = function(replacement) { - if (Object.isFunction(replacement)) return replacement; - var template = new Template(replacement); - return function(match) { return template.evaluate(match) }; -}; - -String.prototype.parseQuery = String.prototype.toQueryParams; - -Object.extend(String.prototype.escapeHTML, { - div: document.createElement('div'), - text: document.createTextNode('') -}); - -String.prototype.escapeHTML.div.appendChild(String.prototype.escapeHTML.text); + return { + gsub: gsub, + sub: sub, + scan: scan, + truncate: truncate, + strip: String.prototype.trim || strip, + stripTags: stripTags, + stripScripts: stripScripts, + extractScripts: extractScripts, + evalScripts: evalScripts, + escapeHTML: escapeHTML, + unescapeHTML: unescapeHTML, + toQueryParams: toQueryParams, + parseQuery: toQueryParams, + toArray: toArray, + succ: succ, + times: times, + camelize: camelize, + capitalize: capitalize, + underscore: underscore, + dasherize: dasherize, + inspect: inspect, + unfilterJSON: unfilterJSON, + isJSON: isJSON, + evalJSON: NATIVE_JSON_PARSE_SUPPORT ? parseJSON : evalJSON, + include: include, + startsWith: startsWith, + endsWith: endsWith, + empty: empty, + blank: blank, + interpolate: interpolate + }; +})()); var Template = Class.create({ initialize: function(template, pattern) { @@ -564,22 +779,23 @@ var Template = Class.create({ }, evaluate: function(object) { - if (Object.isFunction(object.toTemplateReplacements)) + if (object && Object.isFunction(object.toTemplateReplacements)) object = object.toTemplateReplacements(); return this.template.gsub(this.pattern, function(match) { - if (object == null) return ''; + if (object == null) return (match[1] + ''); var before = match[1] || ''; if (before == '\\') return match[2]; - var ctx = object, expr = match[3]; - var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; + var ctx = object, expr = match[3], + pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; + match = pattern.exec(expr); if (match == null) return before; while (match != null) { - var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1]; + var comp = match[1].startsWith('[') ? match[2].replace(/\\\\]/g, ']') : match[1]; ctx = ctx[comp]; if (null == ctx || '' == match[3]) break; expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); @@ -594,8 +810,8 @@ Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; var $break = { }; -var Enumerable = { - each: function(iterator, context) { +var Enumerable = (function() { + function each(iterator, context) { var index = 0; try { this._each(function(value) { @@ -605,17 +821,17 @@ var Enumerable = { if (e != $break) throw e; } return this; - }, + } - eachSlice: function(number, iterator, context) { + function eachSlice(number, iterator, context) { var index = -number, slices = [], array = this.toArray(); if (number < 1) return array; while ((index += number) < array.length) slices.push(array.slice(index, index+number)); return slices.collect(iterator, context); - }, + } - all: function(iterator, context) { + function all(iterator, context) { iterator = iterator || Prototype.K; var result = true; this.each(function(value, index) { @@ -623,9 +839,9 @@ var Enumerable = { if (!result) throw $break; }); return result; - }, + } - any: function(iterator, context) { + function any(iterator, context) { iterator = iterator || Prototype.K; var result = false; this.each(function(value, index) { @@ -633,18 +849,18 @@ var Enumerable = { throw $break; }); return result; - }, + } - collect: function(iterator, context) { + function collect(iterator, context) { iterator = iterator || Prototype.K; var results = []; this.each(function(value, index) { results.push(iterator.call(context, value, index)); }); return results; - }, + } - detect: function(iterator, context) { + function detect(iterator, context) { var result; this.each(function(value, index) { if (iterator.call(context, value, index)) { @@ -653,32 +869,32 @@ var Enumerable = { } }); return result; - }, + } - findAll: function(iterator, context) { + function findAll(iterator, context) { var results = []; this.each(function(value, index) { if (iterator.call(context, value, index)) results.push(value); }); return results; - }, + } - grep: function(filter, iterator, context) { + function grep(filter, iterator, context) { iterator = iterator || Prototype.K; var results = []; if (Object.isString(filter)) - filter = new RegExp(filter); + filter = new RegExp(RegExp.escape(filter)); this.each(function(value, index) { if (filter.match(value)) results.push(iterator.call(context, value, index)); }); return results; - }, + } - include: function(object) { + function include(object) { if (Object.isFunction(this.indexOf)) if (this.indexOf(object) != -1) return true; @@ -690,31 +906,31 @@ var Enumerable = { } }); return found; - }, + } - inGroupsOf: function(number, fillWith) { + function inGroupsOf(number, fillWith) { fillWith = Object.isUndefined(fillWith) ? null : fillWith; return this.eachSlice(number, function(slice) { while(slice.length < number) slice.push(fillWith); return slice; }); - }, + } - inject: function(memo, iterator, context) { + function inject(memo, iterator, context) { this.each(function(value, index) { memo = iterator.call(context, memo, value, index); }); return memo; - }, + } - invoke: function(method) { + function invoke(method) { var args = $A(arguments).slice(1); return this.map(function(value) { return value[method].apply(value, args); }); - }, + } - max: function(iterator, context) { + function max(iterator, context) { iterator = iterator || Prototype.K; var result; this.each(function(value, index) { @@ -723,9 +939,9 @@ var Enumerable = { result = value; }); return result; - }, + } - min: function(iterator, context) { + function min(iterator, context) { iterator = iterator || Prototype.K; var result; this.each(function(value, index) { @@ -734,9 +950,9 @@ var Enumerable = { result = value; }); return result; - }, + } - partition: function(iterator, context) { + function partition(iterator, context) { iterator = iterator || Prototype.K; var trues = [], falses = []; this.each(function(value, index) { @@ -744,26 +960,26 @@ var Enumerable = { trues : falses).push(value); }); return [trues, falses]; - }, + } - pluck: function(property) { + function pluck(property) { var results = []; this.each(function(value) { results.push(value[property]); }); return results; - }, + } - reject: function(iterator, context) { + function reject(iterator, context) { var results = []; this.each(function(value, index) { if (!iterator.call(context, value, index)) results.push(value); }); return results; - }, + } - sortBy: function(iterator, context) { + function sortBy(iterator, context) { return this.map(function(value, index) { return { value: value, @@ -773,13 +989,13 @@ var Enumerable = { var a = left.criteria, b = right.criteria; return a < b ? -1 : a > b ? 1 : 0; }).pluck('value'); - }, + } - toArray: function() { + function toArray() { return this.map(); - }, + } - zip: function() { + function zip() { var iterator = Prototype.K, args = $A(arguments); if (Object.isFunction(args.last())) iterator = args.pop(); @@ -788,159 +1004,66 @@ var Enumerable = { return this.map(function(value, index) { return iterator(collections.pluck(index)); }); - }, + } - size: function() { + function size() { return this.toArray().length; - }, + } - inspect: function() { + function inspect() { return '#'; } -}; -Object.extend(Enumerable, { - map: Enumerable.collect, - find: Enumerable.detect, - select: Enumerable.findAll, - filter: Enumerable.findAll, - member: Enumerable.include, - entries: Enumerable.toArray, - every: Enumerable.all, - some: Enumerable.any -}); + + + + + + + + + return { + each: each, + eachSlice: eachSlice, + all: all, + every: all, + any: any, + some: any, + collect: collect, + map: collect, + detect: detect, + findAll: findAll, + select: findAll, + filter: findAll, + grep: grep, + include: include, + member: include, + inGroupsOf: inGroupsOf, + inject: inject, + invoke: invoke, + max: max, + min: min, + partition: partition, + pluck: pluck, + reject: reject, + sortBy: sortBy, + toArray: toArray, + entries: toArray, + zip: zip, + size: size, + inspect: inspect, + find: detect + }; +})(); + function $A(iterable) { if (!iterable) return []; - if (iterable.toArray) return iterable.toArray(); + if ('toArray' in Object(iterable)) return iterable.toArray(); var length = iterable.length || 0, results = new Array(length); while (length--) results[length] = iterable[length]; return results; } -if (Prototype.Browser.WebKit) { - $A = function(iterable) { - if (!iterable) return []; - // In Safari, only use the `toArray` method if it's not a NodeList. - // A NodeList is a function, has an function `item` property, and a numeric - // `length` property. Adapted from Google Doctype. - if (!(typeof iterable === 'function' && typeof iterable.length === - 'number' && typeof iterable.item === 'function') && iterable.toArray) - return iterable.toArray(); - var length = iterable.length || 0, results = new Array(length); - while (length--) results[length] = iterable[length]; - return results; - }; -} - -Array.from = $A; - -Object.extend(Array.prototype, Enumerable); - -if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse; - -Object.extend(Array.prototype, { - _each: function(iterator) { - for (var i = 0, length = this.length; i < 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 != null; - }); - }, - - flatten: function() { - return this.inject([], function(array, value) { - return array.concat(Object.isArray(value) ? - value.flatten() : [value]); - }); - }, - - without: function() { - var values = $A(arguments); - return this.select(function(value) { - return !values.include(value); - }); - }, - - reverse: function(inline) { - return (inline !== false ? this : this.toArray())._reverse(); - }, - - reduce: function() { - return this.length > 1 ? this : this[0]; - }, - - uniq: function(sorted) { - return this.inject([], function(array, value, index) { - if (0 == index || (sorted ? array.last() != value : !array.include(value))) - array.push(value); - return array; - }); - }, - - intersect: function(array) { - return this.uniq().findAll(function(item) { - return array.detect(function(value) { return item === value }); - }); - }, - - clone: function() { - return [].concat(this); - }, - - size: function() { - return this.length; - }, - - inspect: function() { - return '[' + this.map(Object.inspect).join(', ') + ']'; - }, - - toJSON: function() { - var results = []; - this.each(function(object) { - var value = Object.toJSON(object); - if (!Object.isUndefined(value)) results.push(value); - }); - return '[' + results.join(', ') + ']'; - } -}); - -// use native browser JS 1.6 implementation if available -if (Object.isFunction(Array.prototype.forEach)) - Array.prototype._each = Array.prototype.forEach; - -if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) { - i || (i = 0); - var length = this.length; - if (i < 0) i = length + i; - for (; i < length; i++) - if (this[i] === item) return i; - return -1; -}; - -if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) { - i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; - var n = this.slice(0, i).reverse().indexOf(item); - return (n < 0) ? n : i - n - 1; -}; - -Array.prototype.toArray = Array.prototype.clone; function $w(string) { if (!Object.isString(string)) return []; @@ -948,176 +1071,342 @@ function $w(string) { return string ? string.split(/\s+/) : []; } -if (Prototype.Browser.Opera){ - Array.prototype.concat = function() { - var array = []; - for (var i = 0, length = this.length; i < length; i++) array.push(this[i]); +Array.from = $A; + + +(function() { + var arrayProto = Array.prototype, + slice = arrayProto.slice, + _each = arrayProto.forEach; // use native browser JS 1.6 implementation if available + + function each(iterator) { + for (var i = 0, length = this.length; i < length; i++) + iterator(this[i]); + } + if (!_each) _each = each; + + function clear() { + this.length = 0; + return this; + } + + function first() { + return this[0]; + } + + function last() { + return this[this.length - 1]; + } + + function compact() { + return this.select(function(value) { + return value != null; + }); + } + + function flatten() { + return this.inject([], function(array, value) { + if (Object.isArray(value)) + return array.concat(value.flatten()); + array.push(value); + return array; + }); + } + + function without() { + var values = slice.call(arguments, 0); + return this.select(function(value) { + return !values.include(value); + }); + } + + function reverse(inline) { + return (inline === false ? this.toArray() : this)._reverse(); + } + + function uniq(sorted) { + return this.inject([], function(array, value, index) { + if (0 == index || (sorted ? array.last() != value : !array.include(value))) + array.push(value); + return array; + }); + } + + function intersect(array) { + return this.uniq().findAll(function(item) { + return array.detect(function(value) { return item === value }); + }); + } + + + function clone() { + return slice.call(this, 0); + } + + function size() { + return this.length; + } + + function inspect() { + return '[' + this.map(Object.inspect).join(', ') + ']'; + } + + function indexOf(item, i) { + i || (i = 0); + var length = this.length; + if (i < 0) i = length + i; + for (; i < length; i++) + if (this[i] === item) return i; + return -1; + } + + function lastIndexOf(item, i) { + i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; + var n = this.slice(0, i).reverse().indexOf(item); + return (n < 0) ? n : i - n - 1; + } + + function concat() { + var array = slice.call(this, 0), item; for (var i = 0, length = arguments.length; i < length; i++) { - if (Object.isArray(arguments[i])) { - for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++) - array.push(arguments[i][j]); + item = arguments[i]; + if (Object.isArray(item) && !('callee' in item)) { + for (var j = 0, arrayLength = item.length; j < arrayLength; j++) + array.push(item[j]); } else { - array.push(arguments[i]); + array.push(item); } } return array; - }; -} -Object.extend(Number.prototype, { - toColorPart: function() { - return this.toPaddedString(2, 16); - }, - - succ: function() { - return this + 1; - }, - - times: function(iterator, context) { - $R(0, this, true).each(iterator, context); - return this; - }, - - toPaddedString: function(length, radix) { - var string = this.toString(radix || 10); - return '0'.times(length - string.length) + string; - }, - - toJSON: function() { - return isFinite(this) ? this.toString() : 'null'; } -}); -$w('abs round ceil floor').each(function(method){ - Number.prototype[method] = Math[method].methodize(); -}); + Object.extend(arrayProto, Enumerable); + + if (!arrayProto._reverse) + arrayProto._reverse = arrayProto.reverse; + + Object.extend(arrayProto, { + _each: _each, + clear: clear, + first: first, + last: last, + compact: compact, + flatten: flatten, + without: without, + reverse: reverse, + uniq: uniq, + intersect: intersect, + clone: clone, + toArray: clone, + size: size, + inspect: inspect + }); + + var CONCAT_ARGUMENTS_BUGGY = (function() { + return [].concat(arguments)[0][0] !== 1; + })(1,2) + + if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat; + + if (!arrayProto.indexOf) arrayProto.indexOf = indexOf; + if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf = lastIndexOf; +})(); function $H(object) { return new Hash(object); }; var Hash = Class.create(Enumerable, (function() { + function initialize(object) { + this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); + } + + + function _each(iterator) { + for (var key in this._object) { + var value = this._object[key], pair = [key, value]; + pair.key = key; + pair.value = value; + iterator(pair); + } + } + + function set(key, value) { + return this._object[key] = value; + } + + function get(key) { + if (this._object[key] !== Object.prototype[key]) + return this._object[key]; + } + + function unset(key) { + var value = this._object[key]; + delete this._object[key]; + return value; + } + + function toObject() { + return Object.clone(this._object); + } + + + + function keys() { + return this.pluck('key'); + } + + function values() { + return this.pluck('value'); + } + + function index(value) { + var match = this.detect(function(pair) { + return pair.value === value; + }); + return match && match.key; + } + + function merge(object) { + return this.clone().update(object); + } + + function update(object) { + return new Hash(object).inject(this, function(result, pair) { + result.set(pair.key, pair.value); + return result; + }); + } function toQueryPair(key, value) { if (Object.isUndefined(value)) return key; return key + '=' + encodeURIComponent(String.interpret(value)); } - return { - initialize: function(object) { - this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); - }, + function toQueryString() { + return this.inject([], function(results, pair) { + var key = encodeURIComponent(pair.key), values = pair.value; - _each: function(iterator) { - for (var key in this._object) { - var value = this._object[key], pair = [key, value]; - pair.key = key; - pair.value = value; - iterator(pair); - } - }, - - set: function(key, value) { - return this._object[key] = value; - }, - - get: function(key) { - // simulating poorly supported hasOwnProperty - if (this._object[key] !== Object.prototype[key]) - return this._object[key]; - }, - - unset: function(key) { - var value = this._object[key]; - delete this._object[key]; - return value; - }, - - toObject: function() { - return Object.clone(this._object); - }, - - keys: function() { - return this.pluck('key'); - }, - - values: function() { - return this.pluck('value'); - }, - - index: function(value) { - var match = this.detect(function(pair) { - return pair.value === value; - }); - return match && match.key; - }, - - merge: function(object) { - return this.clone().update(object); - }, - - update: function(object) { - return new Hash(object).inject(this, function(result, pair) { - result.set(pair.key, pair.value); - return result; - }); - }, - - toQueryString: function() { - return this.inject([], function(results, pair) { - var key = encodeURIComponent(pair.key), values = pair.value; - - if (values && typeof values == 'object') { - if (Object.isArray(values)) - return results.concat(values.map(toQueryPair.curry(key))); - } else results.push(toQueryPair(key, values)); - return results; - }).join('&'); - }, - - inspect: function() { - return '#'; - }, - - toJSON: function() { - return Object.toJSON(this.toObject()); - }, - - clone: function() { - return new Hash(this); - } + if (values && typeof values == 'object') { + if (Object.isArray(values)) + return results.concat(values.map(toQueryPair.curry(key))); + } else results.push(toQueryPair(key, values)); + return results; + }).join('&'); } + + function inspect() { + return '#'; + } + + function clone() { + return new Hash(this); + } + + return { + initialize: initialize, + _each: _each, + set: set, + get: get, + unset: unset, + toObject: toObject, + toTemplateReplacements: toObject, + keys: keys, + values: values, + index: index, + merge: merge, + update: update, + toQueryString: toQueryString, + inspect: inspect, + toJSON: toObject, + clone: clone + }; })()); -Hash.prototype.toTemplateReplacements = Hash.prototype.toObject; Hash.from = $H; -var ObjectRange = Class.create(Enumerable, { - initialize: function(start, end, exclusive) { +Object.extend(Number.prototype, (function() { + function toColorPart() { + return this.toPaddedString(2, 16); + } + + function succ() { + return this + 1; + } + + function times(iterator, context) { + $R(0, this, true).each(iterator, context); + return this; + } + + function toPaddedString(length, radix) { + var string = this.toString(radix || 10); + return '0'.times(length - string.length) + string; + } + + function abs() { + return Math.abs(this); + } + + function round() { + return Math.round(this); + } + + function ceil() { + return Math.ceil(this); + } + + function floor() { + return Math.floor(this); + } + + return { + toColorPart: toColorPart, + succ: succ, + times: times, + toPaddedString: toPaddedString, + abs: abs, + round: round, + ceil: ceil, + floor: floor + }; +})()); + +function $R(start, end, exclusive) { + return new ObjectRange(start, end, exclusive); +} + +var ObjectRange = Class.create(Enumerable, (function() { + function initialize(start, end, exclusive) { this.start = start; this.end = end; this.exclusive = exclusive; - }, + } - _each: function(iterator) { + function _each(iterator) { var value = this.start; while (this.include(value)) { iterator(value); value = value.succ(); } - }, + } - include: function(value) { + function include(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); -}; + return { + initialize: initialize, + _each: _each, + include: include + }; +})()); + + var Ajax = { getTransport: function() { @@ -1164,7 +1453,6 @@ Ajax.Responders.register({ onCreate: function() { Ajax.activeRequestCount++ }, onComplete: function() { Ajax.activeRequestCount-- } }); - Ajax.Base = Class.create({ initialize: function(options) { this.options = { @@ -1186,7 +1474,6 @@ Ajax.Base = Class.create({ this.options.parameters = this.options.parameters.toObject(); } }); - Ajax.Request = Class.create(Ajax.Base, { _complete: false, @@ -1202,7 +1489,6 @@ Ajax.Request = Class.create(Ajax.Base, { var params = Object.clone(this.options.parameters); if (!['get', 'post'].include(this.method)) { - // simulate other verbs over post params['_method'] = this.method; this.method = 'post'; } @@ -1210,7 +1496,6 @@ Ajax.Request = Class.create(Ajax.Base, { this.parameters = params; if (params = Object.toQueryString(params)) { - // when GET, append parameters to URL if (this.method == 'get') this.url += (this.url.include('?') ? '&' : '?') + params; else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) @@ -1269,7 +1554,6 @@ Ajax.Request = Class.create(Ajax.Base, { headers['Connection'] = 'close'; } - // user-defined headers if (typeof this.options.requestHeaders == 'object') { var extras = this.options.requestHeaders; @@ -1323,7 +1607,6 @@ Ajax.Request = Class.create(Ajax.Base, { } if (state == 'Complete') { - // avoid memory leak in MSIE: clean up this.transport.onreadystatechange = Prototype.emptyFunction; } }, @@ -1340,7 +1623,7 @@ Ajax.Request = Class.create(Ajax.Base, { getHeader: function(name) { try { return this.transport.getResponseHeader(name) || null; - } catch (e) { return null } + } catch (e) { return null; } }, evalResponse: function() { @@ -1360,20 +1643,27 @@ Ajax.Request = Class.create(Ajax.Base, { Ajax.Request.Events = ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; + + + + + + + Ajax.Response = Class.create({ initialize: function(request){ this.request = request; var transport = this.transport = request.transport, readyState = this.readyState = transport.readyState; - if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { + if ((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { this.status = this.getStatus(); this.statusText = this.getStatusText(); this.responseText = String.interpret(transport.responseText); this.headerJSON = this._getHeaderJSON(); } - if(readyState == 4) { + if (readyState == 4) { var xml = transport.responseXML; this.responseXML = Object.isUndefined(xml) ? null : xml; this.responseJSON = this._getResponseJSON(); @@ -1381,6 +1671,7 @@ Ajax.Response = Class.create({ }, status: 0, + statusText: '', getStatus: Ajax.Request.prototype.getStatus, @@ -1510,6 +1801,8 @@ Ajax.PeriodicalUpdater = Class.create(Ajax.Base, { this.updater = new Ajax.Updater(this.container, this.url, this.options); } }); + + function $(element) { if (arguments.length > 1) { for (var i = 0, elements = [], length = arguments.length; i < length; i++) @@ -1534,10 +1827,9 @@ if (Prototype.BrowserFeatures.XPath) { /*--------------------------------------------------------------------------*/ -if (!window.Node) var Node = { }; +if (!Node) var Node = { }; if (!Node.ELEMENT_NODE) { - // DOM level 2 ECMAScript Language Binding Object.extend(Node, { ELEMENT_NODE: 1, ATTRIBUTE_NODE: 2, @@ -1554,13 +1846,27 @@ if (!Node.ELEMENT_NODE) { }); } -(function() { - var element = this.Element; - this.Element = function(tagName, attributes) { + + +(function(global) { + + var HAS_EXTENDED_CREATE_ELEMENT_SYNTAX = (function(){ + try { + var el = document.createElement(''); + return el.tagName.toLowerCase() === 'input' && el.name === 'x'; + } + catch(err) { + return false; + } + })(); + + var element = global.Element; + + global.Element = function(tagName, attributes) { attributes = attributes || { }; tagName = tagName.toLowerCase(); var cache = Element.cache; - if (Prototype.Browser.IE && attributes.name) { + if (HAS_EXTENDED_CREATE_ELEMENT_SYNTAX && attributes.name) { tagName = '<' + tagName + ' name="' + attributes.name + '">'; delete attributes.name; return Element.writeAttribute(document.createElement(tagName), attributes); @@ -1568,12 +1874,24 @@ if (!Node.ELEMENT_NODE) { if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName)); return Element.writeAttribute(cache[tagName].cloneNode(false), attributes); }; - Object.extend(this.Element, element || { }); - if (element) this.Element.prototype = element.prototype; -}).call(window); + Object.extend(global.Element, element || { }); + if (element) global.Element.prototype = element.prototype; + +})(this); + +Element.idCounter = 1; Element.cache = { }; +function purgeElement(element) { + var uid = element._prototypeUID; + if (uid) { + Element.stopObserving(element); + element._prototypeUID = void 0; + delete Element.Storage[uid]; + } +} + Element.Methods = { visible: function(element) { return $(element).style.display != 'none'; @@ -1603,15 +1921,93 @@ Element.Methods = { return element; }, - update: function(element, content) { - element = $(element); - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) return element.update().insert(content); - content = Object.toHTML(content); - element.innerHTML = content.stripScripts(); - content.evalScripts.bind(content).defer(); - return element; - }, + update: (function(){ + + var SELECT_ELEMENT_INNERHTML_BUGGY = (function(){ + var el = document.createElement("select"), + isBuggy = true; + el.innerHTML = ""; + if (el.options && el.options[0]) { + isBuggy = el.options[0].nodeName.toUpperCase() !== "OPTION"; + } + el = null; + return isBuggy; + })(); + + var TABLE_ELEMENT_INNERHTML_BUGGY = (function(){ + try { + var el = document.createElement("table"); + if (el && el.tBodies) { + el.innerHTML = "test"; + var isBuggy = typeof el.tBodies[0] == "undefined"; + el = null; + return isBuggy; + } + } catch (e) { + return true; + } + })(); + + var SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING = (function () { + var s = document.createElement("script"), + isBuggy = false; + try { + s.appendChild(document.createTextNode("")); + isBuggy = !s.firstChild || + s.firstChild && s.firstChild.nodeType !== 3; + } catch (e) { + isBuggy = true; + } + s = null; + return isBuggy; + })(); + + function update(element, content) { + element = $(element); + + var descendants = element.getElementsByTagName('*'), + i = descendants.length; + while (i--) purgeElement(descendants[i]); + + if (content && content.toElement) + content = content.toElement(); + + if (Object.isElement(content)) + return element.update().insert(content); + + content = Object.toHTML(content); + + var tagName = element.tagName.toUpperCase(); + + if (tagName === 'SCRIPT' && SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING) { + element.text = content; + return element; + } + + if (SELECT_ELEMENT_INNERHTML_BUGGY || TABLE_ELEMENT_INNERHTML_BUGGY) { + if (tagName in Element._insertionTranslations.tags) { + while (element.firstChild) { + element.removeChild(element.firstChild); + } + Element._getContentFromAnonymousElement(tagName, content.stripScripts()) + .each(function(node) { + element.appendChild(node) + }); + } + else { + element.innerHTML = content.stripScripts(); + } + } + else { + element.innerHTML = content.stripScripts(); + } + + content.evalScripts.bind(content).defer(); + return element; + } + + return update; + })(), replace: function(element, content) { element = $(element); @@ -1679,28 +2075,35 @@ Element.Methods = { element = $(element); var result = '<' + element.tagName.toLowerCase(); $H({'id': 'id', 'className': 'class'}).each(function(pair) { - var property = pair.first(), attribute = pair.last(); - var value = (element[property] || '').toString(); + var property = pair.first(), + attribute = pair.last(), + value = (element[property] || '').toString(); if (value) result += ' ' + attribute + '=' + value.inspect(true); }); return result + '>'; }, - recursivelyCollect: function(element, property) { + recursivelyCollect: function(element, property, maximumLength) { element = $(element); + maximumLength = maximumLength || -1; var elements = []; - while (element = element[property]) + + while (element = element[property]) { if (element.nodeType == 1) elements.push(Element.extend(element)); + if (elements.length == maximumLength) + break; + } + return elements; }, ancestors: function(element) { - return $(element).recursivelyCollect('parentNode'); + return Element.recursivelyCollect(element, 'parentNode'); }, descendants: function(element) { - return $(element).select("*"); + return Element.select(element, "*"); }, firstDescendant: function(element) { @@ -1710,78 +2113,96 @@ Element.Methods = { }, immediateDescendants: function(element) { - if (!(element = $(element).firstChild)) return []; - while (element && element.nodeType != 1) element = element.nextSibling; - if (element) return [element].concat($(element).nextSiblings()); - return []; + var results = [], child = $(element).firstChild; + while (child) { + if (child.nodeType === 1) { + results.push(Element.extend(child)); + } + child = child.nextSibling; + } + return results; }, - previousSiblings: function(element) { - return $(element).recursivelyCollect('previousSibling'); + previousSiblings: function(element, maximumLength) { + return Element.recursivelyCollect(element, 'previousSibling'); }, nextSiblings: function(element) { - return $(element).recursivelyCollect('nextSibling'); + return Element.recursivelyCollect(element, 'nextSibling'); }, siblings: function(element) { element = $(element); - return element.previousSiblings().reverse().concat(element.nextSiblings()); + return Element.previousSiblings(element).reverse() + .concat(Element.nextSiblings(element)); }, match: function(element, selector) { + element = $(element); if (Object.isString(selector)) - selector = new Selector(selector); - return selector.match($(element)); + return Prototype.Selector.match(element, selector); + return selector.match(element); }, up: function(element, expression, index) { element = $(element); if (arguments.length == 1) return $(element.parentNode); - var ancestors = element.ancestors(); + var ancestors = Element.ancestors(element); return Object.isNumber(expression) ? ancestors[expression] : - Selector.findElement(ancestors, expression, index); + Prototype.Selector.find(ancestors, expression, index); }, down: function(element, expression, index) { element = $(element); - if (arguments.length == 1) return element.firstDescendant(); - return Object.isNumber(expression) ? element.descendants()[expression] : + if (arguments.length == 1) return Element.firstDescendant(element); + return Object.isNumber(expression) ? Element.descendants(element)[expression] : Element.select(element, expression)[index || 0]; }, previous: function(element, expression, index) { element = $(element); - if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element)); - var previousSiblings = element.previousSiblings(); - return Object.isNumber(expression) ? previousSiblings[expression] : - Selector.findElement(previousSiblings, expression, index); + if (Object.isNumber(expression)) index = expression, expression = false; + if (!Object.isNumber(index)) index = 0; + + if (expression) { + return Prototype.Selector.find(element.previousSiblings(), expression, index); + } else { + return element.recursivelyCollect("previousSibling", index + 1)[index]; + } }, next: function(element, expression, index) { element = $(element); - if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element)); - var nextSiblings = element.nextSiblings(); - return Object.isNumber(expression) ? nextSiblings[expression] : - Selector.findElement(nextSiblings, expression, index); + if (Object.isNumber(expression)) index = expression, expression = false; + if (!Object.isNumber(index)) index = 0; + + if (expression) { + return Prototype.Selector.find(element.nextSiblings(), expression, index); + } else { + var maximumLength = Object.isNumber(index) ? index + 1 : 1; + return element.recursivelyCollect("nextSibling", index + 1)[index]; + } }, - select: function() { - var args = $A(arguments), element = $(args.shift()); - return Selector.findChildElements(element, args); + + select: function(element) { + element = $(element); + var expressions = Array.prototype.slice.call(arguments, 1).join(', '); + return Prototype.Selector.select(expressions, element); }, - adjacent: function() { - var args = $A(arguments), element = $(args.shift()); - return Selector.findChildElements(element.parentNode, args).without(element); + adjacent: function(element) { + element = $(element); + var expressions = Array.prototype.slice.call(arguments, 1).join(', '); + return Prototype.Selector.select(expressions, element.parentNode).without(element); }, identify: function(element) { element = $(element); - var id = element.readAttribute('id'), self = arguments.callee; + var id = Element.readAttribute(element, 'id'); if (id) return id; - do { id = 'anonymous_element_' + self.counter++ } while ($(id)); - element.writeAttribute('id', id); + do { id = 'anonymous_element_' + Element.idCounter++ } while ($(id)); + Element.writeAttribute(element, 'id', id); return id; }, @@ -1820,11 +2241,11 @@ Element.Methods = { }, getHeight: function(element) { - return $(element).getDimensions().height; + return Element.getDimensions(element).height; }, getWidth: function(element) { - return $(element).getDimensions().width; + return Element.getDimensions(element).width; }, classNames: function(element) { @@ -1840,7 +2261,7 @@ Element.Methods = { addClassName: function(element, className) { if (!(element = $(element))) return; - if (!element.hasClassName(className)) + if (!Element.hasClassName(element, className)) element.className += (element.className ? ' ' : '') + className; return element; }, @@ -1854,11 +2275,10 @@ Element.Methods = { toggleClassName: function(element, className) { if (!(element = $(element))) return; - return element[element.hasClassName(className) ? - 'removeClassName' : 'addClassName'](className); + return Element[Element.hasClassName(element, className) ? + 'removeClassName' : 'addClassName'](element, className); }, - // removes whitespace-only text node children cleanWhitespace: function(element) { element = $(element); var node = element.firstChild; @@ -1892,7 +2312,7 @@ Element.Methods = { scrollTo: function(element) { element = $(element); - var pos = element.cumulativeOffset(); + var pos = Element.cumulativeOffset(element); window.scrollTo(pos[0], pos[1]); return element; }, @@ -1938,37 +2358,12 @@ Element.Methods = { return element; }, - getDimensions: function(element) { - element = $(element); - var display = element.getStyle('display'); - if (display != 'none' && display != null) // Safari bug - 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; - var originalDisplay = els.display; - els.visibility = 'hidden'; - els.position = 'absolute'; - els.display = 'block'; - var originalWidth = element.clientWidth; - var originalHeight = element.clientHeight; - els.display = originalDisplay; - 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 (Prototype.Browser.Opera) { element.style.top = 0; element.style.left = 0; @@ -2009,11 +2404,13 @@ Element.Methods = { cumulativeOffset: function(element) { var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - } while (element); + if (element.parentNode) { + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + } while (element); + } return Element._returnOffset(valueL, valueT); }, @@ -2034,14 +2431,13 @@ Element.Methods = { absolutize: function(element) { element = $(element); - if (element.getStyle('position') == 'absolute') return element; - // Position.prepare(); // To be done manually by Scripty when it needs it. + if (Element.getStyle(element, 'position') == 'absolute') return element; - var offsets = element.positionedOffset(); - var top = offsets[1]; - var left = offsets[0]; - var width = element.clientWidth; - var height = element.clientHeight; + var offsets = Element.positionedOffset(element), + top = offsets[1], + left = offsets[0], + width = element.clientWidth, + height = element.clientHeight; element._originalLeft = left - parseFloat(element.style.left || 0); element._originalTop = top - parseFloat(element.style.top || 0); @@ -2058,12 +2454,11 @@ Element.Methods = { relativize: function(element) { element = $(element); - if (element.getStyle('position') == 'relative') return element; - // Position.prepare(); // To be done manually by Scripty when it needs it. + if (Element.getStyle(element, 'position') == 'relative') return element; element.style.position = 'relative'; - var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); - var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); + var top = parseFloat(element.style.top || 0) - (element._originalTop || 0), + left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); element.style.top = top + 'px'; element.style.left = left + 'px'; @@ -2094,14 +2489,14 @@ Element.Methods = { }, viewportOffset: function(forElement) { - var valueT = 0, valueL = 0; + var valueT = 0, + valueL = 0, + element = forElement; - var element = forElement; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; - // Safari fix if (element.offsetParent == document.body && Element.getStyle(element, 'position') == 'absolute') break; @@ -2128,28 +2523,21 @@ Element.Methods = { offsetLeft: 0 }, arguments[2] || { }); - // find page position of source source = $(source); - var p = source.viewportOffset(); + var p = Element.viewportOffset(source), delta = [0, 0], parent = null; - // find coordinate system to use element = $(element); - 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(element, 'position') == 'absolute') { - parent = element.getOffsetParent(); - delta = parent.viewportOffset(); + parent = Element.getOffsetParent(element); + delta = Element.viewportOffset(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) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; if (options.setWidth) element.style.width = source.offsetWidth + 'px'; @@ -2158,10 +2546,9 @@ Element.Methods = { } }; -Element.Methods.identify.counter = 1; - Object.extend(Element.Methods, { getElementsBySelector: Element.Methods.select, + childElements: Element.Methods.immediateDescendants }); @@ -2182,11 +2569,8 @@ if (Prototype.Browser.Opera) { case 'left': case 'top': case 'right': case 'bottom': if (proceed(element, 'position') === 'static') return null; case 'height': case 'width': - // returns '0px' for hidden elements; we want it to return null if (!Element.visible(element)) return null; - // returns the border-box dimensions rather than the content-box - // dimensions, so we subtract padding and borders from the value var dim = parseInt(proceed(element, style), 10); if (dim !== element['offset' + style.capitalize()]) @@ -2219,14 +2603,10 @@ if (Prototype.Browser.Opera) { } else if (Prototype.Browser.IE) { - // IE doesn't report offsets correctly for static elements, so we change them - // to "relative" to get the values, then change them back. Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap( function(proceed, element) { element = $(element); - // IE throws an error if element is not in document - try { element.offsetParent } - catch(e) { return $(document.body) } + if (!element.parentNode) return $(document.body); var position = element.getStyle('position'); if (position !== 'static') return proceed(element); element.setStyle({ position: 'relative' }); @@ -2240,12 +2620,9 @@ else if (Prototype.Browser.IE) { Element.Methods[method] = Element.Methods[method].wrap( function(proceed, element) { element = $(element); - try { element.offsetParent } - catch(e) { return Element._returnOffset(0,0) } + if (!element.parentNode) return Element._returnOffset(0, 0); var position = element.getStyle('position'); if (position !== 'static') return proceed(element); - // Trigger hasLayout on the offset parent so that IE6 reports - // accurate offsetTop and offsetLeft values for position: fixed. var offsetParent = element.getOffsetParent(); if (offsetParent && offsetParent.getStyle('position') === 'fixed') offsetParent.setStyle({ zoom: 1 }); @@ -2257,14 +2634,6 @@ else if (Prototype.Browser.IE) { ); }); - Element.Methods.cumulativeOffset = Element.Methods.cumulativeOffset.wrap( - function(proceed, element) { - try { element.offsetParent } - catch(e) { return Element._returnOffset(0,0) } - return proceed(element); - } - ); - Element.Methods.getStyle = function(element, style) { element = $(element); style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); @@ -2306,36 +2675,90 @@ else if (Prototype.Browser.IE) { return element; }; - Element._attributeTranslations = { - read: { - names: { - 'class': 'className', - 'for': 'htmlFor' - }, - values: { - _getAttr: function(element, attribute) { - return element.getAttribute(attribute, 2); + Element._attributeTranslations = (function(){ + + var classProp = 'className', + forProp = 'for', + el = document.createElement('div'); + + el.setAttribute(classProp, 'x'); + + if (el.className !== 'x') { + el.setAttribute('class', 'x'); + if (el.className === 'x') { + classProp = 'class'; + } + } + el = null; + + el = document.createElement('label'); + el.setAttribute(forProp, 'x'); + if (el.htmlFor !== 'x') { + el.setAttribute('htmlFor', 'x'); + if (el.htmlFor === 'x') { + forProp = 'htmlFor'; + } + } + el = null; + + return { + read: { + names: { + 'class': classProp, + 'className': classProp, + 'for': forProp, + 'htmlFor': forProp }, - _getAttrNode: function(element, attribute) { - var node = element.getAttributeNode(attribute); - return node ? node.value : ""; - }, - _getEv: function(element, attribute) { - attribute = element.getAttribute(attribute); - return attribute ? attribute.toString().slice(23, -2) : null; - }, - _flag: function(element, attribute) { - return $(element).hasAttribute(attribute) ? attribute : null; - }, - style: function(element) { - return element.style.cssText.toLowerCase(); - }, - title: function(element) { - return element.title; + values: { + _getAttr: function(element, attribute) { + return element.getAttribute(attribute); + }, + _getAttr2: function(element, attribute) { + return element.getAttribute(attribute, 2); + }, + _getAttrNode: function(element, attribute) { + var node = element.getAttributeNode(attribute); + return node ? node.value : ""; + }, + _getEv: (function(){ + + var el = document.createElement('div'), f; + el.onclick = Prototype.emptyFunction; + var value = el.getAttribute('onclick'); + + if (String(value).indexOf('{') > -1) { + f = function(element, attribute) { + attribute = element.getAttribute(attribute); + if (!attribute) return null; + attribute = attribute.toString(); + attribute = attribute.split('{')[1]; + attribute = attribute.split('}')[0]; + return attribute.strip(); + }; + } + else if (value === '') { + f = function(element, attribute) { + attribute = element.getAttribute(attribute); + if (!attribute) return null; + return attribute.strip(); + }; + } + el = null; + return f; + })(), + _flag: function(element, attribute) { + return $(element).hasAttribute(attribute) ? attribute : null; + }, + style: function(element) { + return element.style.cssText.toLowerCase(); + }, + title: function(element) { + return element.title; + } } } } - }; + })(); Element._attributeTranslations.write = { names: Object.extend({ @@ -2363,8 +2786,8 @@ else if (Prototype.Browser.IE) { (function(v) { Object.extend(v, { - href: v._getAttr, - src: v._getAttr, + href: v._getAttr2, + src: v._getAttr2, type: v._getAttr, action: v._getAttrNode, disabled: v._flag, @@ -2391,6 +2814,26 @@ else if (Prototype.Browser.IE) { onchange: v._getEv }); })(Element._attributeTranslations.read.values); + + if (Prototype.BrowserFeatures.ElementExtensions) { + (function() { + function _descendants(element) { + var nodes = element.getElementsByTagName('*'), results = []; + for (var i = 0, node; node = nodes[i]; i++) + if (node.tagName !== "!") // Filter out comment nodes. + results.push(node); + return results; + } + + Element.Methods.down = function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return element.firstDescendant(); + return Object.isNumber(expression) ? _descendants(element)[expression] : + Element.select(element, expression)[index || 0]; + } + })(); + } + } else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) { @@ -2409,7 +2852,7 @@ else if (Prototype.Browser.WebKit) { (value < 0.00001) ? 0 : value; if (value == 1) - if(element.tagName.toUpperCase() == 'IMG' && element.width) { + if (element.tagName.toUpperCase() == 'IMG' && element.width) { element.width++; element.width--; } else try { var n = document.createTextNode(' '); @@ -2420,9 +2863,6 @@ else if (Prototype.Browser.WebKit) { return element; }; - // Safari returns margins on body which is incorrect if the child is absolutely - // positioned. For performance reasons, redefine Element#cumulativeOffset for - // KHTML/WebKit only. Element.Methods.cumulativeOffset = function(element) { var valueT = 0, valueL = 0; do { @@ -2438,30 +2878,7 @@ else if (Prototype.Browser.WebKit) { }; } -if (Prototype.Browser.IE || Prototype.Browser.Opera) { - // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements - Element.Methods.update = function(element, content) { - element = $(element); - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) return element.update().insert(content); - - content = Object.toHTML(content); - var tagName = element.tagName.toUpperCase(); - - if (tagName in Element._insertionTranslations.tags) { - $A(element.childNodes).each(function(node) { element.removeChild(node) }); - Element._getContentFromAnonymousElement(tagName, content.stripScripts()) - .each(function(node) { element.appendChild(node) }); - } - else element.innerHTML = content.stripScripts(); - - content.evalScripts.bind(content).defer(); - return element; - }; -} - -if ('outerHTML' in document.createElement('div')) { +if ('outerHTML' in document.documentElement) { Element.Methods.replace = function(element, content) { element = $(element); @@ -2475,8 +2892,8 @@ if ('outerHTML' in document.createElement('div')) { var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); if (Element._insertionTranslations.tags[tagName]) { - var nextSibling = element.next(); - var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); + var nextSibling = element.next(), + fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); parent.removeChild(element); if (nextSibling) fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); @@ -2498,11 +2915,17 @@ Element._returnOffset = function(l, t) { }; Element._getContentFromAnonymousElement = function(tagName, html) { - var div = new Element('div'), t = Element._insertionTranslations.tags[tagName]; + var div = new Element('div'), + t = Element._insertionTranslations.tags[tagName]; if (t) { div.innerHTML = t[0] + html + t[1]; - t[2].times(function() { div = div.firstChild }); - } else div.innerHTML = html; + for (var i = t[2]; i--; ) { + div = div.firstChild; + } + } + else { + div.innerHTML = html; + } return $A(div.childNodes); }; @@ -2529,12 +2952,13 @@ Element._insertionTranslations = { }; (function() { - Object.extend(this.tags, { - THEAD: this.tags.TBODY, - TFOOT: this.tags.TBODY, - TH: this.tags.TD + var tags = Element._insertionTranslations.tags; + Object.extend(tags, { + THEAD: tags.TBODY, + TFOOT: tags.TBODY, + TH: tags.TD }); -}).call(Element._insertionTranslations); +})(); Element.Methods.Simulated = { hasAttribute: function(element, attribute) { @@ -2548,41 +2972,81 @@ Element.Methods.ByTag = { }; Object.extend(Element, Element.Methods); -if (!Prototype.BrowserFeatures.ElementExtensions && - document.createElement('div')['__proto__']) { - window.HTMLElement = { }; - window.HTMLElement.prototype = document.createElement('div')['__proto__']; - Prototype.BrowserFeatures.ElementExtensions = true; -} +(function(div) { + + if (!Prototype.BrowserFeatures.ElementExtensions && div['__proto__']) { + window.HTMLElement = { }; + window.HTMLElement.prototype = div['__proto__']; + Prototype.BrowserFeatures.ElementExtensions = true; + } + + div = null; + +})(document.createElement('div')); Element.extend = (function() { - if (Prototype.BrowserFeatures.SpecificElementExtensions) + + function checkDeficiency(tagName) { + if (typeof window.Element != 'undefined') { + var proto = window.Element.prototype; + if (proto) { + var id = '_' + (Math.random()+'').slice(2), + el = document.createElement(tagName); + proto[id] = 'x'; + var isBuggy = (el[id] !== 'x'); + delete proto[id]; + el = null; + return isBuggy; + } + } + return false; + } + + function extendElementWith(element, methods) { + for (var property in methods) { + var value = methods[property]; + if (Object.isFunction(value) && !(property in element)) + element[property] = value.methodize(); + } + } + + var HTMLOBJECTELEMENT_PROTOTYPE_BUGGY = checkDeficiency('object'); + + if (Prototype.BrowserFeatures.SpecificElementExtensions) { + if (HTMLOBJECTELEMENT_PROTOTYPE_BUGGY) { + return function(element) { + if (element && typeof element._extendedByPrototype == 'undefined') { + var t = element.tagName; + if (t && (/^(?:object|applet|embed)$/i.test(t))) { + extendElementWith(element, Element.Methods); + extendElementWith(element, Element.Methods.Simulated); + extendElementWith(element, Element.Methods.ByTag[t.toUpperCase()]); + } + } + return element; + } + } return Prototype.K; + } var Methods = { }, ByTag = Element.Methods.ByTag; var extend = Object.extend(function(element) { - if (!element || element._extendedByPrototype || + if (!element || typeof element._extendedByPrototype != 'undefined' || element.nodeType != 1 || element == window) return element; var methods = Object.clone(Methods), - tagName = element.tagName.toUpperCase(), property, value; + tagName = element.tagName.toUpperCase(); - // extend methods for specific tags if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); - for (property in methods) { - value = methods[property]; - if (Object.isFunction(value) && !(property in element)) - element[property] = value.methodize(); - } + extendElementWith(element, methods); element._extendedByPrototype = Prototype.emptyFunction; return element; }, { refresh: function() { - // extend methods for all tags (Safari doesn't need this) if (!Prototype.BrowserFeatures.ElementExtensions) { Object.extend(Methods, Element.Methods); Object.extend(Methods, Element.Methods.Simulated); @@ -2594,10 +3058,14 @@ Element.extend = (function() { return extend; })(); -Element.hasAttribute = function(element, attribute) { - if (element.hasAttribute) return element.hasAttribute(attribute); - return Element.Methods.Simulated.hasAttribute(element, attribute); -}; +if (document.documentElement.hasAttribute) { + Element.hasAttribute = function(element, attribute) { + return element.hasAttribute(attribute); + }; +} +else { + Element.hasAttribute = Element.Methods.Simulated.hasAttribute; +} Element.addMethods = function(methods) { var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; @@ -2661,14 +3129,19 @@ Element.addMethods = function(methods) { klass = 'HTML' + tagName.capitalize() + 'Element'; if (window[klass]) return window[klass]; - window[klass] = { }; - window[klass].prototype = document.createElement(tagName)['__proto__']; - return window[klass]; + var element = document.createElement(tagName), + proto = element['__proto__'] || element.constructor.prototype; + + element = null; + return proto; } + var elementPrototype = window.HTMLElement ? HTMLElement.prototype : + Element.prototype; + if (F.ElementExtensions) { - copy(Element.Methods, HTMLElement.prototype); - copy(Element.Methods.Simulated, HTMLElement.prototype, true); + copy(Element.Methods, elementPrototype); + copy(Element.Methods.Simulated, elementPrototype, true); } if (F.SpecificElementExtensions) { @@ -2686,766 +3159,1803 @@ Element.addMethods = function(methods) { Element.cache = { }; }; + document.viewport = { + getDimensions: function() { - var dimensions = { }, B = Prototype.Browser; - $w('width height').each(function(d) { - var D = d.capitalize(); - if (B.WebKit && !document.evaluate) { - // Safari <3.0 needs self.innerWidth/Height - dimensions[d] = self['inner' + D]; - } else if (B.Opera && parseFloat(window.opera.version()) < 9.5) { - // Opera <9.5 needs document.body.clientWidth/Height - dimensions[d] = document.body['client' + D] - } else { - dimensions[d] = document.documentElement['client' + D]; - } - }); - return dimensions; - }, - - getWidth: function() { - return this.getDimensions().width; - }, - - getHeight: function() { - return this.getDimensions().height; + return { width: this.getWidth(), height: this.getHeight() }; }, getScrollOffsets: function() { return Element._returnOffset( window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, - window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop); + window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop); } }; -/* Portions of the Selector class are derived from Jack Slocum's DomQuery, - * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style - * license. Please see http://www.yui-ext.com/ for more information. */ -var Selector = Class.create({ - initialize: function(expression) { - this.expression = expression.strip(); +(function(viewport) { + var B = Prototype.Browser, doc = document, element, property = {}; - if (this.shouldUseSelectorsAPI()) { - this.mode = 'selectorsAPI'; - } else if (this.shouldUseXPath()) { - this.mode = 'xpath'; - this.compileXPathMatcher(); + function getRootElement() { + if (B.WebKit && !doc.evaluate) + return document; + + if (B.Opera && window.parseFloat(window.opera.version()) < 9.5) + return document.body; + + return document.documentElement; + } + + function define(D) { + if (!element) element = getRootElement(); + + property[D] = 'client' + D; + + viewport['get' + D] = function() { return element[property[D]] }; + return viewport['get' + D](); + } + + viewport.getWidth = define.curry('Width'); + + viewport.getHeight = define.curry('Height'); +})(document.viewport); + + +Element.Storage = { + UID: 1 +}; + +Element.addMethods({ + getStorage: function(element) { + if (!(element = $(element))) return; + + var uid; + if (element === window) { + uid = 0; } else { - this.mode = "normal"; - this.compileMatcher(); + if (typeof element._prototypeUID === "undefined") + element._prototypeUID = Element.Storage.UID++; + uid = element._prototypeUID; } + if (!Element.Storage[uid]) + Element.Storage[uid] = $H(); + + return Element.Storage[uid]; }, - shouldUseXPath: function() { - if (!Prototype.BrowserFeatures.XPath) return false; + store: function(element, key, value) { + if (!(element = $(element))) return; - var e = this.expression; - - // Safari 3 chokes on :*-of-type and :empty - if (Prototype.Browser.WebKit && - (e.include("-of-type") || e.include(":empty"))) - return false; - - // XPath can't do namespaced attributes, nor can it read - // the "checked" property from DOM nodes - if ((/(\[[\w-]*?:|:checked)/).test(e)) - return false; - - return true; - }, - - shouldUseSelectorsAPI: function() { - if (!Prototype.BrowserFeatures.SelectorsAPI) return false; - - if (!Selector._div) Selector._div = new Element('div'); - - // Make sure the browser treats the selector as valid. Test on an - // isolated element to minimize cost of this check. - try { - Selector._div.querySelector(this.expression); - } catch(e) { - return false; + if (arguments.length === 2) { + Element.getStorage(element).update(key); + } else { + Element.getStorage(element).set(key, value); } - return true; + return element; }, - compileMatcher: function() { - var e = this.expression, ps = Selector.patterns, h = Selector.handlers, - c = Selector.criteria, le, p, m; + retrieve: function(element, key, defaultValue) { + if (!(element = $(element))) return; + var hash = Element.getStorage(element), value = hash.get(key); - if (Selector._cache[e]) { - this.matcher = Selector._cache[e]; - return; + if (Object.isUndefined(value)) { + hash.set(key, defaultValue); + value = defaultValue; } - this.matcher = ["this.matcher = function(root) {", - "var r = root, h = Selector.handlers, c = false, n;"]; + return value; + }, - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i in ps) { - p = ps[i]; - if (m = e.match(p)) { - this.matcher.push(Object.isFunction(c[i]) ? c[i](m) : - new Template(c[i]).evaluate(m)); - e = e.replace(m[0], ''); - break; - } + clone: function(element, deep) { + if (!(element = $(element))) return; + var clone = element.cloneNode(deep); + clone._prototypeUID = void 0; + if (deep) { + var descendants = Element.select(clone, '*'), + i = descendants.length; + while (i--) { + descendants[i]._prototypeUID = void 0; } } - - this.matcher.push("return h.unique(n);\n}"); - eval(this.matcher.join('\n')); - Selector._cache[this.expression] = this.matcher; + return Element.extend(clone); }, - compileXPathMatcher: function() { - var e = this.expression, ps = Selector.patterns, - x = Selector.xpath, le, m; + purge: function(element) { + if (!(element = $(element))) return; + purgeElement(element); - if (Selector._cache[e]) { - this.xpath = Selector._cache[e]; return; - } + var descendants = element.getElementsByTagName('*'), + i = descendants.length; - this.matcher = ['.//*']; - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i in ps) { - if (m = e.match(ps[i])) { - this.matcher.push(Object.isFunction(x[i]) ? x[i](m) : - new Template(x[i]).evaluate(m)); - e = e.replace(m[0], ''); - break; - } - } - } + while (i--) purgeElement(descendants[i]); - this.xpath = this.matcher.join(''); - Selector._cache[this.expression] = this.xpath; - }, - - findElements: function(root) { - root = root || document; - var e = this.expression, results; - - switch (this.mode) { - case 'selectorsAPI': - // querySelectorAll queries document-wide, then filters to descendants - // of the context element. That's not what we want. - // Add an explicit context to the selector if necessary. - if (root !== document) { - var oldId = root.id, id = $(root).identify(); - e = "#" + id + " " + e; - } - - results = $A(root.querySelectorAll(e)).map(Element.extend); - root.id = oldId; - - return results; - case 'xpath': - return document._getElementsByXPath(this.xpath, root); - default: - return this.matcher(root); - } - }, - - match: function(element) { - this.tokens = []; - - var e = this.expression, ps = Selector.patterns, as = Selector.assertions; - var le, p, m; - - while (e && le !== e && (/\S/).test(e)) { - le = e; - for (var i in ps) { - p = ps[i]; - if (m = e.match(p)) { - // use the Selector.assertions methods unless the selector - // is too complex. - if (as[i]) { - this.tokens.push([i, Object.clone(m)]); - e = e.replace(m[0], ''); - } else { - // reluctantly do a document-wide search - // and look for a match in the array - return this.findElements(document).include(element); - } - } - } - } - - var match = true, name, matches; - for (var i = 0, token; token = this.tokens[i]; i++) { - name = token[0], matches = token[1]; - if (!Selector.assertions[name](element, matches)) { - match = false; break; - } - } - - return match; - }, - - toString: function() { - return this.expression; - }, - - inspect: function() { - return "#"; + return null; } }); -Object.extend(Selector, { - _cache: { }, +(function() { - xpath: { - descendant: "//*", - child: "/*", - adjacent: "/following-sibling::*[1]", - laterSibling: '/following-sibling::*', - tagName: function(m) { - if (m[1] == '*') return ''; - return "[local-name()='" + m[1].toLowerCase() + - "' or local-name()='" + m[1].toUpperCase() + "']"; - }, - className: "[contains(concat(' ', @class, ' '), ' #{1} ')]", - id: "[@id='#{1}']", - attrPresence: function(m) { - m[1] = m[1].toLowerCase(); - return new Template("[@#{1}]").evaluate(m); - }, - attr: function(m) { - m[1] = m[1].toLowerCase(); - m[3] = m[5] || m[6]; - return new Template(Selector.xpath.operators[m[2]]).evaluate(m); - }, - pseudo: function(m) { - var h = Selector.xpath.pseudos[m[1]]; - if (!h) return ''; - if (Object.isFunction(h)) return h(m); - return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m); - }, - operators: { - '=': "[@#{1}='#{3}']", - '!=': "[@#{1}!='#{3}']", - '^=': "[starts-with(@#{1}, '#{3}')]", - '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']", - '*=': "[contains(@#{1}, '#{3}')]", - '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]", - '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]" - }, - pseudos: { - 'first-child': '[not(preceding-sibling::*)]', - 'last-child': '[not(following-sibling::*)]', - 'only-child': '[not(preceding-sibling::* or following-sibling::*)]', - 'empty': "[count(*) = 0 and (count(text()) = 0)]", - 'checked': "[@checked]", - 'disabled': "[(@disabled) and (@type!='hidden')]", - 'enabled': "[not(@disabled) and (@type!='hidden')]", - 'not': function(m) { - var e = m[6], p = Selector.patterns, - x = Selector.xpath, le, v; + function toDecimal(pctString) { + var match = pctString.match(/^(\d+)%?$/i); + if (!match) return null; + return (Number(match[1]) / 100); + } - var exclusion = []; - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i in p) { - if (m = e.match(p[i])) { - v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m); - exclusion.push("(" + v.substring(1, v.length - 1) + ")"); - e = e.replace(m[0], ''); - break; - } - } - } - return "[not(" + exclusion.join(" and ") + ")]"; - }, - 'nth-child': function(m) { - return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m); - }, - 'nth-last-child': function(m) { - return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m); - }, - 'nth-of-type': function(m) { - return Selector.xpath.pseudos.nth("position() ", m); - }, - 'nth-last-of-type': function(m) { - return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m); - }, - 'first-of-type': function(m) { - m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m); - }, - 'last-of-type': function(m) { - m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m); - }, - 'only-of-type': function(m) { - var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m); - }, - nth: function(fragment, m) { - var mm, formula = m[6], predicate; - if (formula == 'even') formula = '2n+0'; - if (formula == 'odd') formula = '2n+1'; - if (mm = formula.match(/^(\d+)$/)) // digit only - return '[' + fragment + "= " + mm[1] + ']'; - if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b - if (mm[1] == "-") mm[1] = -1; - var a = mm[1] ? Number(mm[1]) : 1; - var b = mm[2] ? Number(mm[2]) : 0; - predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " + - "((#{fragment} - #{b}) div #{a} >= 0)]"; - return new Template(predicate).evaluate({ - fragment: fragment, a: a, b: b }); - } - } + function getPixelValue(value, property) { + if (Object.isElement(value)) { + element = value; + value = element.getStyle(property); } - }, - - criteria: { - tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;', - className: 'n = h.className(n, r, "#{1}", c); c = false;', - id: 'n = h.id(n, r, "#{1}", c); c = false;', - attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;', - attr: function(m) { - m[3] = (m[5] || m[6]); - return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m); - }, - pseudo: function(m) { - if (m[6]) m[6] = m[6].replace(/"/g, '\\"'); - return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m); - }, - descendant: 'c = "descendant";', - child: 'c = "child";', - adjacent: 'c = "adjacent";', - laterSibling: 'c = "laterSibling";' - }, - - patterns: { - // combinators must be listed first - // (and descendant needs to be last combinator) - laterSibling: /^\s*~\s*/, - child: /^\s*>\s*/, - adjacent: /^\s*\+\s*/, - descendant: /^\s/, - - // selectors follow - tagName: /^\s*(\*|[\w\-]+)(\b|$)?/, - id: /^#([\w\-\*]+)(\b|$)/, - className: /^\.([\w\-\*]+)(\b|$)/, - pseudo: -/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/, - attrPresence: /^\[((?:[\w]+:)?[\w]+)\]/, - attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/ - }, - - // for Selector.match and Element#match - assertions: { - tagName: function(element, matches) { - return matches[1].toUpperCase() == element.tagName.toUpperCase(); - }, - - className: function(element, matches) { - return Element.hasClassName(element, matches[1]); - }, - - id: function(element, matches) { - return element.id === matches[1]; - }, - - attrPresence: function(element, matches) { - return Element.hasAttribute(element, matches[1]); - }, - - attr: function(element, matches) { - var nodeValue = Element.readAttribute(element, matches[1]); - return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]); - } - }, - - handlers: { - // UTILITY FUNCTIONS - // joins two collections - concat: function(a, b) { - for (var i = 0, node; node = b[i]; i++) - a.push(node); - return a; - }, - - // marks an array of nodes for counting - mark: function(nodes) { - var _true = Prototype.emptyFunction; - for (var i = 0, node; node = nodes[i]; i++) - node._countedByPrototype = _true; - return nodes; - }, - - unmark: function(nodes) { - for (var i = 0, node; node = nodes[i]; i++) - node._countedByPrototype = undefined; - return nodes; - }, - - // mark each child node with its position (for nth calls) - // "ofType" flag indicates whether we're indexing for nth-of-type - // rather than nth-child - index: function(parentNode, reverse, ofType) { - parentNode._countedByPrototype = Prototype.emptyFunction; - if (reverse) { - for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) { - var node = nodes[i]; - if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; - } - } else { - for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++) - if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; - } - }, - - // filters out duplicates and extends all nodes - unique: function(nodes) { - if (nodes.length == 0) return nodes; - var results = [], n; - for (var i = 0, l = nodes.length; i < l; i++) - if (!(n = nodes[i])._countedByPrototype) { - n._countedByPrototype = Prototype.emptyFunction; - results.push(Element.extend(n)); - } - return Selector.handlers.unmark(results); - }, - - // COMBINATOR FUNCTIONS - descendant: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - h.concat(results, node.getElementsByTagName('*')); - return results; - }, - - child: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) { - for (var j = 0, child; child = node.childNodes[j]; j++) - if (child.nodeType == 1 && child.tagName != '!') results.push(child); - } - return results; - }, - - adjacent: function(nodes) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - var next = this.nextElementSibling(node); - if (next) results.push(next); - } - return results; - }, - - laterSibling: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - h.concat(results, Element.nextSiblings(node)); - return results; - }, - - nextElementSibling: function(node) { - while (node = node.nextSibling) - if (node.nodeType == 1) return node; + if (value === null) { return null; - }, - - previousElementSibling: function(node) { - while (node = node.previousSibling) - if (node.nodeType == 1) return node; - return null; - }, - - // TOKEN FUNCTIONS - tagName: function(nodes, root, tagName, combinator) { - var uTagName = tagName.toUpperCase(); - var results = [], h = Selector.handlers; - if (nodes) { - if (combinator) { - // fastlane for ordinary descendant combinators - if (combinator == "descendant") { - for (var i = 0, node; node = nodes[i]; i++) - h.concat(results, node.getElementsByTagName(tagName)); - return results; - } else nodes = this[combinator](nodes); - if (tagName == "*") return nodes; - } - for (var i = 0, node; node = nodes[i]; i++) - if (node.tagName.toUpperCase() === uTagName) results.push(node); - return results; - } else return root.getElementsByTagName(tagName); - }, - - id: function(nodes, root, id, combinator) { - var targetNode = $(id), h = Selector.handlers; - if (!targetNode) return []; - if (!nodes && root == document) return [targetNode]; - if (nodes) { - if (combinator) { - if (combinator == 'child') { - for (var i = 0, node; node = nodes[i]; i++) - if (targetNode.parentNode == node) return [targetNode]; - } else if (combinator == 'descendant') { - for (var i = 0, node; node = nodes[i]; i++) - if (Element.descendantOf(targetNode, node)) return [targetNode]; - } else if (combinator == 'adjacent') { - for (var i = 0, node; node = nodes[i]; i++) - if (Selector.handlers.previousElementSibling(targetNode) == node) - return [targetNode]; - } else nodes = h[combinator](nodes); - } - for (var i = 0, node; node = nodes[i]; i++) - if (node == targetNode) return [targetNode]; - return []; - } - return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : []; - }, - - className: function(nodes, root, className, combinator) { - if (nodes && combinator) nodes = this[combinator](nodes); - return Selector.handlers.byClassName(nodes, root, className); - }, - - byClassName: function(nodes, root, className) { - if (!nodes) nodes = Selector.handlers.descendant([root]); - var needle = ' ' + className + ' '; - for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) { - nodeClassName = node.className; - if (nodeClassName.length == 0) continue; - if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle)) - results.push(node); - } - return results; - }, - - attrPresence: function(nodes, root, attr, combinator) { - if (!nodes) nodes = root.getElementsByTagName("*"); - if (nodes && combinator) nodes = this[combinator](nodes); - var results = []; - for (var i = 0, node; node = nodes[i]; i++) - if (Element.hasAttribute(node, attr)) results.push(node); - return results; - }, - - attr: function(nodes, root, attr, value, operator, combinator) { - if (!nodes) nodes = root.getElementsByTagName("*"); - if (nodes && combinator) nodes = this[combinator](nodes); - var handler = Selector.operators[operator], results = []; - for (var i = 0, node; node = nodes[i]; i++) { - var nodeValue = Element.readAttribute(node, attr); - if (nodeValue === null) continue; - if (handler(nodeValue, value)) results.push(node); - } - return results; - }, - - pseudo: function(nodes, name, value, root, combinator) { - if (nodes && combinator) nodes = this[combinator](nodes); - if (!nodes) nodes = root.getElementsByTagName("*"); - return Selector.pseudos[name](nodes, value, root); } - }, - pseudos: { - 'first-child': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - if (Selector.handlers.previousElementSibling(node)) continue; - results.push(node); + if ((/^(?:-)?\d+(\.\d+)?(px)?$/i).test(value)) { + return window.parseFloat(value); + } + + if (/\d/.test(value) && element.runtimeStyle) { + var style = element.style.left, rStyle = element.runtimeStyle.left; + element.runtimeStyle.left = element.currentStyle.left; + element.style.left = value || 0; + value = element.style.pixelLeft; + element.style.left = style; + element.runtimeStyle.left = rStyle; + + return value; + } + + if (value.include('%')) { + var decimal = toDecimal(value); + var whole; + if (property.include('left') || property.include('right') || + property.include('width')) { + whole = $(element.parentNode).measure('width'); + } else if (property.include('top') || property.include('bottom') || + property.include('height')) { + whole = $(element.parentNode).measure('height'); } - return results; - }, - 'last-child': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - if (Selector.handlers.nextElementSibling(node)) continue; - results.push(node); + + return whole * decimal; + } + + return 0; + } + + function toCSSPixels(number) { + if (Object.isString(number) && number.endsWith('px')) { + return number; + } + return number + 'px'; + } + + function isDisplayed(element) { + var originalElement = element; + while (element && element.parentNode) { + var display = element.getStyle('display'); + if (display === 'none') { + return false; + } + element = $(element.parentNode); + } + return true; + } + + var hasLayout = Prototype.K; + if ('currentStyle' in document.documentElement) { + hasLayout = function(element) { + if (!element.currentStyle.hasLayout) { + element.style.zoom = 1; + } + return element; + }; + } + + function cssNameFor(key) { + if (key.include('border')) key = key + '-width'; + return key.camelize(); + } + + Element.Layout = Class.create(Hash, { + initialize: function($super, element, preCompute) { + $super(); + this.element = $(element); + + Element.Layout.PROPERTIES.each( function(property) { + this._set(property, null); + }, this); + + if (preCompute) { + this._preComputing = true; + this._begin(); + Element.Layout.PROPERTIES.each( this._compute, this ); + this._end(); + this._preComputing = false; } - return results; - }, - 'only-child': function(nodes, value, root) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!h.previousElementSibling(node) && !h.nextElementSibling(node)) - results.push(node); - return results; - }, - 'nth-child': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root); - }, - 'nth-last-child': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, true); - }, - 'nth-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, false, true); - }, - 'nth-last-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, true, true); - }, - 'first-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, "1", root, false, true); - }, - 'last-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, "1", root, true, true); - }, - 'only-of-type': function(nodes, formula, root) { - var p = Selector.pseudos; - return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root); }, - // handles the an+b logic - getIndices: function(a, b, total) { - if (a == 0) return b > 0 ? [b] : []; - return $R(1, total).inject([], function(memo, i) { - if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i); - return memo; + _set: function(property, value) { + return Hash.prototype.set.call(this, property, value); + }, + + set: function(property, value) { + throw "Properties of Element.Layout are read-only."; + }, + + get: function($super, property) { + var value = $super(property); + return value === null ? this._compute(property) : value; + }, + + _begin: function() { + if (this._prepared) return; + + var element = this.element; + if (isDisplayed(element)) { + this._prepared = true; + return; + } + + var originalStyles = { + position: element.style.position || '', + width: element.style.width || '', + visibility: element.style.visibility || '', + display: element.style.display || '' + }; + + element.store('prototype_original_styles', originalStyles); + + var position = element.getStyle('position'), + width = element.getStyle('width'); + + element.setStyle({ + position: 'absolute', + visibility: 'hidden', + display: 'block' }); - }, - // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type - nth: function(nodes, formula, root, reverse, ofType) { - if (nodes.length == 0) return []; - if (formula == 'even') formula = '2n+0'; - if (formula == 'odd') formula = '2n+1'; - var h = Selector.handlers, results = [], indexed = [], m; - h.mark(nodes); - for (var i = 0, node; node = nodes[i]; i++) { - if (!node.parentNode._countedByPrototype) { - h.index(node.parentNode, reverse, ofType); - indexed.push(node.parentNode); - } + var positionedWidth = element.getStyle('width'); + + var newWidth; + if (width && (positionedWidth === width)) { + newWidth = getPixelValue(width); + } else if (width && (position === 'absolute' || position === 'fixed')) { + newWidth = getPixelValue(width); + } else { + var parent = element.parentNode, pLayout = $(parent).getLayout(); + + newWidth = pLayout.get('width') - + this.get('margin-left') - + this.get('border-left') - + this.get('padding-left') - + this.get('padding-right') - + this.get('border-right') - + this.get('margin-right'); } - if (formula.match(/^\d+$/)) { // just a number - formula = Number(formula); - for (var i = 0, node; node = nodes[i]; i++) - if (node.nodeIndex == formula) results.push(node); - } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b - if (m[1] == "-") m[1] = -1; - var a = m[1] ? Number(m[1]) : 1; - var b = m[2] ? Number(m[2]) : 0; - var indices = Selector.pseudos.getIndices(a, b, nodes.length); - for (var i = 0, node, l = indices.length; node = nodes[i]; i++) { - for (var j = 0; j < l; j++) - if (node.nodeIndex == indices[j]) results.push(node); - } + + element.setStyle({ width: newWidth + 'px' }); + + this._prepared = true; + }, + + _end: function() { + var element = this.element; + var originalStyles = element.retrieve('prototype_original_styles'); + element.store('prototype_original_styles', null); + element.setStyle(originalStyles); + this._prepared = false; + }, + + _compute: function(property) { + var COMPUTATIONS = Element.Layout.COMPUTATIONS; + if (!(property in COMPUTATIONS)) { + throw "Property not found."; } - h.unmark(nodes); - h.unmark(indexed); - return results; + return this._set(property, COMPUTATIONS[property].call(this, this.element)); }, - 'empty': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - // IE treats comments as element nodes - if (node.tagName == '!' || node.firstChild) continue; - results.push(node); - } - return results; + toObject: function() { + var args = $A(arguments); + var keys = (args.length === 0) ? Element.Layout.PROPERTIES : + args.join(' ').split(' '); + var obj = {}; + keys.each( function(key) { + if (!Element.Layout.PROPERTIES.include(key)) return; + var value = this.get(key); + if (value != null) obj[key] = value; + }, this); + return obj; }, - 'not': function(nodes, selector, root) { - var h = Selector.handlers, selectorType, m; - var exclusions = new Selector(selector).findElements(root); - h.mark(exclusions); - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!node._countedByPrototype) results.push(node); - h.unmark(exclusions); - return results; + toHash: function() { + var obj = this.toObject.apply(this, arguments); + return new Hash(obj); }, - 'enabled': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!node.disabled && (!node.type || node.type !== 'hidden')) - results.push(node); - return results; + toCSS: function() { + var args = $A(arguments); + var keys = (args.length === 0) ? Element.Layout.PROPERTIES : + args.join(' ').split(' '); + var css = {}; + + keys.each( function(key) { + if (!Element.Layout.PROPERTIES.include(key)) return; + if (Element.Layout.COMPOSITE_PROPERTIES.include(key)) return; + + var value = this.get(key); + if (value != null) css[cssNameFor(key)] = value + 'px'; + }, this); + return css; }, - 'disabled': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (node.disabled) results.push(node); - return results; - }, - - 'checked': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (node.checked) results.push(node); - return results; - } - }, - - operators: { - '=': function(nv, v) { return nv == v; }, - '!=': function(nv, v) { return nv != v; }, - '^=': function(nv, v) { return nv == v || nv && nv.startsWith(v); }, - '$=': function(nv, v) { return nv == v || nv && nv.endsWith(v); }, - '*=': function(nv, v) { return nv == v || nv && nv.include(v); }, - '$=': function(nv, v) { return nv.endsWith(v); }, - '*=': function(nv, v) { return nv.include(v); }, - '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); }, - '|=': function(nv, v) { return ('-' + (nv || "").toUpperCase() + - '-').include('-' + (v || "").toUpperCase() + '-'); } - }, - - split: function(expression) { - var expressions = []; - expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) { - expressions.push(m[1].strip()); - }); - return expressions; - }, - - matchElements: function(elements, expression) { - var matches = $$(expression), h = Selector.handlers; - h.mark(matches); - for (var i = 0, results = [], element; element = elements[i]; i++) - if (element._countedByPrototype) results.push(element); - h.unmark(matches); - return results; - }, - - findElement: function(elements, expression, index) { - if (Object.isNumber(expression)) { - index = expression; expression = false; - } - return Selector.matchElements(elements, expression || '*')[index || 0]; - }, - - findChildElements: function(element, expressions) { - expressions = Selector.split(expressions.join(',')); - var results = [], h = Selector.handlers; - for (var i = 0, l = expressions.length, selector; i < l; i++) { - selector = new Selector(expressions[i].strip()); - h.concat(results, selector.findElements(element)); - } - return (l > 1) ? h.unique(results) : results; - } -}); - -if (Prototype.Browser.IE) { - Object.extend(Selector.handlers, { - // IE returns comment nodes on getElementsByTagName("*"). - // Filter them out. - concat: function(a, b) { - for (var i = 0, node; node = b[i]; i++) - if (node.tagName !== "!") a.push(node); - return a; - }, - - // IE improperly serializes _countedByPrototype in (inner|outer)HTML. - unmark: function(nodes) { - for (var i = 0, node; node = nodes[i]; i++) - node.removeAttribute('_countedByPrototype'); - return nodes; + inspect: function() { + return "#"; } }); + + Object.extend(Element.Layout, { + PROPERTIES: $w('height width top left right bottom border-left border-right border-top border-bottom padding-left padding-right padding-top padding-bottom margin-top margin-bottom margin-left margin-right padding-box-width padding-box-height border-box-width border-box-height margin-box-width margin-box-height'), + + COMPOSITE_PROPERTIES: $w('padding-box-width padding-box-height margin-box-width margin-box-height border-box-width border-box-height'), + + COMPUTATIONS: { + 'height': function(element) { + if (!this._preComputing) this._begin(); + + var bHeight = this.get('border-box-height'); + if (bHeight <= 0) return 0; + + var bTop = this.get('border-top'), + bBottom = this.get('border-bottom'); + + var pTop = this.get('padding-top'), + pBottom = this.get('padding-bottom'); + + if (!this._preComputing) this._end(); + + return bHeight - bTop - bBottom - pTop - pBottom; + }, + + 'width': function(element) { + if (!this._preComputing) this._begin(); + + var bWidth = this.get('border-box-width'); + if (bWidth <= 0) return 0; + + var bLeft = this.get('border-left'), + bRight = this.get('border-right'); + + var pLeft = this.get('padding-left'), + pRight = this.get('padding-right'); + + if (!this._preComputing) this._end(); + + return bWidth - bLeft - bRight - pLeft - pRight; + }, + + 'padding-box-height': function(element) { + var height = this.get('height'), + pTop = this.get('padding-top'), + pBottom = this.get('padding-bottom'); + + return height + pTop + pBottom; + }, + + 'padding-box-width': function(element) { + var width = this.get('width'), + pLeft = this.get('padding-left'), + pRight = this.get('padding-right'); + + return width + pLeft + pRight; + }, + + 'border-box-height': function(element) { + return element.offsetHeight; + }, + + 'border-box-width': function(element) { + return element.offsetWidth; + }, + + 'margin-box-height': function(element) { + var bHeight = this.get('border-box-height'), + mTop = this.get('margin-top'), + mBottom = this.get('margin-bottom'); + + if (bHeight <= 0) return 0; + + return bHeight + mTop + mBottom; + }, + + 'margin-box-width': function(element) { + var bWidth = this.get('border-box-width'), + mLeft = this.get('margin-left'), + mRight = this.get('margin-right'); + + if (bWidth <= 0) return 0; + + return bWidth + mLeft + mRight; + }, + + 'top': function(element) { + var offset = element.positionedOffset(); + return offset.top; + }, + + 'bottom': function(element) { + var offset = element.positionedOffset(), + parent = element.getOffsetParent(), + pHeight = parent.measure('height'); + + var mHeight = this.get('border-box-height'); + + return pHeight - mHeight - offset.top; + }, + + 'left': function(element) { + var offset = element.positionedOffset(); + return offset.left; + }, + + 'right': function(element) { + var offset = element.positionedOffset(), + parent = element.getOffsetParent(), + pWidth = parent.measure('width'); + + var mWidth = this.get('border-box-width'); + + return pWidth - mWidth - offset.left; + }, + + 'padding-top': function(element) { + return getPixelValue(element, 'paddingTop'); + }, + + 'padding-bottom': function(element) { + return getPixelValue(element, 'paddingBottom'); + }, + + 'padding-left': function(element) { + return getPixelValue(element, 'paddingLeft'); + }, + + 'padding-right': function(element) { + return getPixelValue(element, 'paddingRight'); + }, + + 'border-top': function(element) { + return Object.isNumber(element.clientTop) ? element.clientTop : + getPixelValue(element, 'borderTopWidth'); + }, + + 'border-bottom': function(element) { + return Object.isNumber(element.clientBottom) ? element.clientBottom : + getPixelValue(element, 'borderBottomWidth'); + }, + + 'border-left': function(element) { + return Object.isNumber(element.clientLeft) ? element.clientLeft : + getPixelValue(element, 'borderLeftWidth'); + }, + + 'border-right': function(element) { + return Object.isNumber(element.clientRight) ? element.clientRight : + getPixelValue(element, 'borderRightWidth'); + }, + + 'margin-top': function(element) { + return getPixelValue(element, 'marginTop'); + }, + + 'margin-bottom': function(element) { + return getPixelValue(element, 'marginBottom'); + }, + + 'margin-left': function(element) { + return getPixelValue(element, 'marginLeft'); + }, + + 'margin-right': function(element) { + return getPixelValue(element, 'marginRight'); + } + } + }); + + if ('getBoundingClientRect' in document.documentElement) { + Object.extend(Element.Layout.COMPUTATIONS, { + 'right': function(element) { + var parent = hasLayout(element.getOffsetParent()); + var rect = element.getBoundingClientRect(), + pRect = parent.getBoundingClientRect(); + + return (pRect.right - rect.right).round(); + }, + + 'bottom': function(element) { + var parent = hasLayout(element.getOffsetParent()); + var rect = element.getBoundingClientRect(), + pRect = parent.getBoundingClientRect(); + + return (pRect.bottom - rect.bottom).round(); + } + }); + } + + Element.Offset = Class.create({ + initialize: function(left, top) { + this.left = left.round(); + this.top = top.round(); + + this[0] = this.left; + this[1] = this.top; + }, + + relativeTo: function(offset) { + return new Element.Offset( + this.left - offset.left, + this.top - offset.top + ); + }, + + inspect: function() { + return "#".interpolate(this); + }, + + toString: function() { + return "[#{left}, #{top}]".interpolate(this); + }, + + toArray: function() { + return [this.left, this.top]; + } + }); + + function getLayout(element, preCompute) { + return new Element.Layout(element, preCompute); + } + + function measure(element, property) { + return $(element).getLayout().get(property); + } + + function getDimensions(element) { + var layout = $(element).getLayout(); + return { + width: layout.get('width'), + height: layout.get('height') + }; + } + + function getOffsetParent(element) { + if (isDetached(element)) return $(document.body); + + var isInline = (Element.getStyle(element, 'display') === 'inline'); + if (!isInline && 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.nodeName === 'HTML') ? $(document.body) : $(element); + } + } + + return $(document.body); + } + + + function cumulativeOffset(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + } while (element); + return new Element.Offset(valueL, valueT); + } + + function positionedOffset(element) { + var layout = element.getLayout(); + + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + if (element) { + if (isBody(element)) break; + var p = Element.getStyle(element, 'position'); + if (p !== 'static') break; + } + } while (element); + + valueL -= layout.get('margin-top'); + valueT -= layout.get('margin-left'); + + return new Element.Offset(valueL, valueT); + } + + function cumulativeScrollOffset(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.scrollTop || 0; + valueL += element.scrollLeft || 0; + element = element.parentNode; + } while (element); + return new Element.Offset(valueL, valueT); + } + + function viewportOffset(forElement) { + var valueT = 0, valueL = 0, docBody = document.body; + + var element = forElement; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + if (element.offsetParent == docBody && + Element.getStyle(element, 'position') == 'absolute') break; + } while (element = element.offsetParent); + + element = forElement; + do { + if (element != docBody) { + valueT -= element.scrollTop || 0; + valueL -= element.scrollLeft || 0; + } + } while (element = element.parentNode); + return new Element.Offset(valueL, valueT); + } + + function absolutize(element) { + element = $(element); + + if (Element.getStyle(element, 'position') === 'absolute') { + return element; + } + + var offsetParent = getOffsetParent(element); + var eOffset = element.viewportOffset(), + pOffset = offsetParent.viewportOffset(); + + var offset = eOffset.relativeTo(pOffset); + var layout = element.getLayout(); + + element.store('prototype_absolutize_original_styles', { + left: element.getStyle('left'), + top: element.getStyle('top'), + width: element.getStyle('width'), + height: element.getStyle('height') + }); + + element.setStyle({ + position: 'absolute', + top: offset.top + 'px', + left: offset.left + 'px', + width: layout.get('width') + 'px', + height: layout.get('height') + 'px' + }); + + return element; + } + + function relativize(element) { + element = $(element); + if (Element.getStyle(element, 'position') === 'relative') { + return element; + } + + var originalStyles = + element.retrieve('prototype_absolutize_original_styles'); + + if (originalStyles) element.setStyle(originalStyles); + return element; + } + + Element.addMethods({ + getLayout: getLayout, + measure: measure, + getDimensions: getDimensions, + getOffsetParent: getOffsetParent, + cumulativeOffset: cumulativeOffset, + positionedOffset: positionedOffset, + cumulativeScrollOffset: cumulativeScrollOffset, + viewportOffset: viewportOffset, + absolutize: absolutize, + relativize: relativize + }); + + function isBody(element) { + return element.nodeName.toUpperCase() === 'BODY'; + } + + function isDetached(element) { + return element !== document.body && + !Element.descendantOf(element, document.body); + } + + if ('getBoundingClientRect' in document.documentElement) { + Element.addMethods({ + viewportOffset: function(element) { + element = $(element); + if (isDetached(element)) return new Element.Offset(0, 0); + + var rect = element.getBoundingClientRect(), + docEl = document.documentElement; + return new Element.Offset(rect.left - docEl.clientLeft, + rect.top - docEl.clientTop); + }, + + positionedOffset: function(element) { + element = $(element); + var parent = element.getOffsetParent(); + if (isDetached(element)) return new Element.Offset(0, 0); + + if (element.offsetParent && + element.offsetParent.nodeName.toUpperCase() === 'HTML') { + return positionedOffset(element); + } + + var eOffset = element.viewportOffset(), + pOffset = isBody(parent) ? viewportOffset(parent) : + parent.viewportOffset(); + var retOffset = eOffset.relativeTo(pOffset); + + var layout = element.getLayout(); + var top = retOffset.top - layout.get('margin-top'); + var left = retOffset.left - layout.get('margin-left'); + + return new Element.Offset(left, top); + } + }); + } +})(); +window.$$ = function() { + var expression = $A(arguments).join(', '); + return Prototype.Selector.select(expression, document); +}; + +Prototype.Selector = (function() { + + function select() { + throw new Error('Method "Prototype.Selector.select" must be defined.'); + } + + function match() { + throw new Error('Method "Prototype.Selector.match" must be defined.'); + } + + function find(elements, expression, index) { + index = index || 0; + var match = Prototype.Selector.match, length = elements.length, matchIndex = 0, i; + + for (i = 0; i < length; i++) { + if (match(elements[i], expression) && index == matchIndex++) { + return Element.extend(elements[i]); + } + } + } + + function extendElements(elements) { + for (var i = 0, length = elements.length; i < length; i++) { + Element.extend(elements[i]); + } + return elements; + } + + + var K = Prototype.K; + + return { + select: select, + match: match, + find: find, + extendElements: (Element.extend === K) ? K : extendElements, + extendElement: Element.extend + }; +})(); +Prototype._original_property = window.Sizzle; +/*! + * Sizzle CSS Selector Engine - v1.0 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true; + +[0, 0].sort(function(){ + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function(selector, context, results, seed) { + results = results || []; + var origContext = context = context || document; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var parts = [], m, set, checkSet, check, mode, extra, prune = true, contextXML = isXML(context), + soFar = selector; + + while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context ); + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) + selector += parts.shift(); + + set = posProcess( selector, set ); + } + } + } else { + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + var ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; + } + + if ( context ) { + var ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray(set); + } else { + prune = false; + } + + while ( parts.length ) { + var cur = parts.pop(), pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + throw "Syntax error, unrecognized expression: " + (cur || selector); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + } else if ( context && context.nodeType === 1 ) { + for ( var i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + } else { + for ( var i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function(results){ + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort(sortOrder); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[i-1] ) { + results.splice(i--, 1); + } + } + } + } + + return results; +}; + +Sizzle.matches = function(expr, set){ + return Sizzle(expr, null, null, set); +}; + +Sizzle.find = function(expr, context, isXML){ + var set, match; + + if ( !expr ) { + return []; + } + + for ( var i = 0, l = Expr.order.length; i < l; i++ ) { + var type = Expr.order[i], match; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + var left = match[1]; + match.splice(1,1); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace(/\\/g, ""); + set = Expr.find[ type ]( match, context, isXML ); + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = context.getElementsByTagName("*"); + } + + return {set: set, expr: expr}; +}; + +Sizzle.filter = function(expr, set, inplace, not){ + var old = expr, result = [], curLoop = set, match, anyFound, + isXMLFilter = set && set[0] && isXML(set[0]); + + while ( expr && set.length ) { + for ( var type in Expr.filter ) { + if ( (match = Expr.match[ type ].exec( expr )) != null ) { + var filter = Expr.filter[ type ], found, item; + anyFound = false; + + if ( curLoop == result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( var i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + var pass = not ^ !!found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + } else { + curLoop[i] = false; + } + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + if ( expr == old ) { + if ( anyFound == null ) { + throw "Syntax error, unrecognized expression: " + expr; + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + match: { + ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/ + }, + leftMatch: {}, + attrMap: { + "class": "className", + "for": "htmlFor" + }, + attrHandle: { + href: function(elem){ + return elem.getAttribute("href"); + } + }, + relative: { + "+": function(checkSet, part, isXML){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !/\W/.test(part), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag && !isXML ) { + part = part.toUpperCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + ">": function(checkSet, part, isXML){ + var isPartStr = typeof part === "string"; + + if ( isPartStr && !/\W/.test(part) ) { + part = isXML ? part : part.toUpperCase(); + + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName === part ? parent : false; + } + } + } else { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + "": function(checkSet, part, isXML){ + var doneName = done++, checkFn = dirCheck; + + if ( !/\W/.test(part) ) { + var nodeCheck = part = isXML ? part : part.toUpperCase(); + checkFn = dirNodeCheck; + } + + checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); + }, + "~": function(checkSet, part, isXML){ + var doneName = done++, checkFn = dirCheck; + + if ( typeof part === "string" && !/\W/.test(part) ) { + var nodeCheck = part = isXML ? part : part.toUpperCase(); + checkFn = dirNodeCheck; + } + + checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); + } + }, + find: { + ID: function(match, context, isXML){ + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + return m ? [m] : []; + } + }, + NAME: function(match, context, isXML){ + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], results = context.getElementsByName(match[1]); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + TAG: function(match, context){ + return context.getElementsByTagName(match[1]); + } + }, + preFilter: { + CLASS: function(match, curLoop, inplace, result, not, isXML){ + match = " " + match[1].replace(/\\/g, "") + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) { + if ( !inplace ) + result.push( elem ); + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + ID: function(match){ + return match[1].replace(/\\/g, ""); + }, + TAG: function(match, curLoop){ + for ( var i = 0; curLoop[i] === false; i++ ){} + return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase(); + }, + CHILD: function(match){ + if ( match[1] == "nth" ) { + var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( + match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + + match[0] = done++; + + return match; + }, + ATTR: function(match, curLoop, inplace, result, not, isXML){ + var name = match[1].replace(/\\/g, ""); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + PSEUDO: function(match, curLoop, inplace, result, not){ + if ( match[1] === "not" ) { + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + if ( !inplace ) { + result.push.apply( result, ret ); + } + return false; + } + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + POS: function(match){ + match.unshift( true ); + return match; + } + }, + filters: { + enabled: function(elem){ + return elem.disabled === false && elem.type !== "hidden"; + }, + disabled: function(elem){ + return elem.disabled === true; + }, + checked: function(elem){ + return elem.checked === true; + }, + selected: function(elem){ + elem.parentNode.selectedIndex; + return elem.selected === true; + }, + parent: function(elem){ + return !!elem.firstChild; + }, + empty: function(elem){ + return !elem.firstChild; + }, + has: function(elem, i, match){ + return !!Sizzle( match[3], elem ).length; + }, + header: function(elem){ + return /h\d/i.test( elem.nodeName ); + }, + text: function(elem){ + return "text" === elem.type; + }, + radio: function(elem){ + return "radio" === elem.type; + }, + checkbox: function(elem){ + return "checkbox" === elem.type; + }, + file: function(elem){ + return "file" === elem.type; + }, + password: function(elem){ + return "password" === elem.type; + }, + submit: function(elem){ + return "submit" === elem.type; + }, + image: function(elem){ + return "image" === elem.type; + }, + reset: function(elem){ + return "reset" === elem.type; + }, + button: function(elem){ + return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON"; + }, + input: function(elem){ + return /input|select|textarea|button/i.test(elem.nodeName); + } + }, + setFilters: { + first: function(elem, i){ + return i === 0; + }, + last: function(elem, i, match, array){ + return i === array.length - 1; + }, + even: function(elem, i){ + return i % 2 === 0; + }, + odd: function(elem, i){ + return i % 2 === 1; + }, + lt: function(elem, i, match){ + return i < match[3] - 0; + }, + gt: function(elem, i, match){ + return i > match[3] - 0; + }, + nth: function(elem, i, match){ + return match[3] - 0 == i; + }, + eq: function(elem, i, match){ + return match[3] - 0 == i; + } + }, + filter: { + PSEUDO: function(elem, match, i, array){ + var name = match[1], filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0; + } else if ( name === "not" ) { + var not = match[3]; + + for ( var i = 0, l = not.length; i < l; i++ ) { + if ( not[i] === elem ) { + return false; + } + } + + return true; + } + }, + CHILD: function(elem, match){ + var type = match[1], node = elem; + switch (type) { + case 'only': + case 'first': + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) return false; + } + if ( type == 'first') return true; + node = elem; + case 'last': + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) return false; + } + return true; + case 'nth': + var first = match[2], last = match[3]; + + if ( first == 1 && last == 0 ) { + return true; + } + + var doneName = match[0], + parent = elem.parentNode; + + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { + var count = 0; + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + parent.sizcache = doneName; + } + + var diff = elem.nodeIndex - last; + if ( first == 0 ) { + return diff == 0; + } else { + return ( diff % first == 0 && diff / first >= 0 ); + } + } + }, + ID: function(elem, match){ + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + TAG: function(elem, match){ + return (match === "*" && elem.nodeType === 1) || elem.nodeName === match; + }, + CLASS: function(elem, match){ + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + ATTR: function(elem, match){ + var name = match[1], + result = Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value != check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + POS: function(elem, match, i, array){ + var name = match[2], filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source ); } -function $$() { - return Selector.findChildElements(document, $A(arguments)); +var makeArray = function(array, results) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 ); + +} catch(e){ + makeArray = function(array, results) { + var ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + } else { + if ( typeof array.length === "number" ) { + for ( var i = 0, l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + } else { + for ( var i = 0; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; } + +var sortOrder; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + if ( a == b ) { + hasDuplicate = true; + } + return 0; + } + + var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} else if ( "sourceIndex" in document.documentElement ) { + sortOrder = function( a, b ) { + if ( !a.sourceIndex || !b.sourceIndex ) { + if ( a == b ) { + hasDuplicate = true; + } + return 0; + } + + var ret = a.sourceIndex - b.sourceIndex; + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} else if ( document.createRange ) { + sortOrder = function( a, b ) { + if ( !a.ownerDocument || !b.ownerDocument ) { + if ( a == b ) { + hasDuplicate = true; + } + return 0; + } + + var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); + aRange.setStart(a, 0); + aRange.setEnd(a, 0); + bRange.setStart(b, 0); + bRange.setEnd(b, 0); + var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} + +(function(){ + var form = document.createElement("div"), + id = "script" + (new Date).getTime(); + form.innerHTML = ""; + + var root = document.documentElement; + root.insertBefore( form, root.firstChild ); + + if ( !!document.getElementById( id ) ) { + Expr.find.ID = function(match, context, isXML){ + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; + } + }; + + Expr.filter.ID = function(elem, match){ + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + root = form = null; // release memory in IE +})(); + +(function(){ + + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function(match, context){ + var results = context.getElementsByTagName(match[1]); + + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + div.innerHTML = ""; + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + Expr.attrHandle.href = function(elem){ + return elem.getAttribute("href", 2); + }; + } + + div = null; // release memory in IE +})(); + +if ( document.querySelectorAll ) (function(){ + var oldSizzle = Sizzle, div = document.createElement("div"); + div.innerHTML = "

"; + + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function(query, context, extra, seed){ + context = context || document; + + if ( !seed && context.nodeType === 9 && !isXML(context) ) { + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(e){} + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + div = null; // release memory in IE +})(); + +if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){ + var div = document.createElement("div"); + div.innerHTML = "
"; + + if ( div.getElementsByClassName("e").length === 0 ) + return; + + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) + return; + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function(match, context, isXML) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + div = null; // release memory in IE +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + var sibDir = dir == "previousSibling" && !isXML; + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + if ( sibDir && elem.nodeType === 1 ){ + elem.sizcache = doneName; + elem.sizset = i; + } + elem = elem[dir]; + var match = false; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( elem.nodeName === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + var sibDir = dir == "previousSibling" && !isXML; + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + if ( sibDir && elem.nodeType === 1 ) { + elem.sizcache = doneName; + elem.sizset = i; + } + elem = elem[dir]; + var match = false; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem.sizcache = doneName; + elem.sizset = i; + } + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +var contains = document.compareDocumentPosition ? function(a, b){ + return a.compareDocumentPosition(b) & 16; +} : function(a, b){ + return a !== b && (a.contains ? a.contains(b) : true); +}; + +var isXML = function(elem){ + return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || + !!elem.ownerDocument && elem.ownerDocument.documentElement.nodeName !== "HTML"; +}; + +var posProcess = function(selector, context){ + var tmpSet = [], later = "", match, + root = context.nodeType ? [context] : context; + + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet ); + } + + return Sizzle.filter( later, tmpSet ); +}; + + +window.Sizzle = Sizzle; + +})(); + +;(function(engine) { + var extendElements = Prototype.Selector.extendElements; + + function select(selector, scope) { + return extendElements(engine(selector, scope || document)); + } + + function match(element, selector) { + return engine.matches(selector, [element]).length == 1; + } + + Prototype.Selector.engine = engine; + Prototype.Selector.select = select; + Prototype.Selector.match = match; +})(Sizzle); + +window.Sizzle = Prototype._original_property; +delete Prototype._original_property; + var Form = { reset: function(form) { - $(form).reset(); + form = $(form); + form.reset(); return form; }, @@ -3460,7 +4970,6 @@ var Form = { if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted && submit !== false && (!submit || key == submit) && (submitted = true)))) { if (key in result) { - // a key is already present; construct an array of values if (!Object.isArray(result[key])) result[key] = [result[key]]; result[key].push(value); } @@ -3480,13 +4989,18 @@ Form.Methods = { }, getElements: function(form) { - return $A($(form).getElementsByTagName('*')).inject([], - function(elements, child) { - if (Form.Element.Serializers[child.tagName.toLowerCase()]) - elements.push(Element.extend(child)); - return elements; - } - ); + var elements = $(form).getElementsByTagName('*'), + element, + arr = [ ], + serializers = Form.Element.Serializers; + for (var i = 0; element = elements[i]; i++) { + arr.push(element); + } + return arr.inject([], function(elements, child) { + if (serializers[child.tagName.toLowerCase()]) + elements.push(Element.extend(child)); + return elements; + }) }, getInputs: function(form, typeName, name) { @@ -3526,7 +5040,7 @@ Form.Methods = { }).sortBy(function(element) { return element.tabIndex }).first(); return firstByIndex ? firstByIndex : elements.find(function(element) { - return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); + return /^(?:input|select|textarea)$/i.test(element.tagName); }); }, @@ -3557,6 +5071,7 @@ Form.Methods = { /*--------------------------------------------------------------------------*/ + Form.Element = { focus: function(element) { $(element).focus(); @@ -3570,6 +5085,7 @@ Form.Element = { }; Form.Element.Methods = { + serialize: function(element) { element = $(element); if (!element.disabled && element.name) { @@ -3610,7 +5126,7 @@ Form.Element.Methods = { try { element.focus(); if (element.select && (element.tagName.toLowerCase() != 'input' || - !['button', 'reset', 'submit'].include(element.type))) + !(/^(?:button|reset|submit)$/i.test(element.type)))) element.select(); } catch (e) { } return element; @@ -3632,6 +5148,7 @@ Form.Element.Methods = { /*--------------------------------------------------------------------------*/ var Field = Form.Element; + var $F = Form.Element.Methods.getValue; /*--------------------------------------------------------------------------*/ @@ -3694,13 +5211,13 @@ Form.Element.Serializers = { }, optionValue: function(opt) { - // extend element because hasAttribute may not be native return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; } }; /*--------------------------------------------------------------------------*/ + Abstract.TimedObserver = Class.create(PeriodicalExecuter, { initialize: function($super, element, frequency, callback) { $super(callback, frequency); @@ -3782,354 +5299,475 @@ Form.EventObserver = Class.create(Abstract.EventObserver, { return Form.serialize(this.element); } }); -if (!window.Event) var Event = { }; +(function() { -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, - KEY_HOME: 36, - KEY_END: 35, - KEY_PAGEUP: 33, - KEY_PAGEDOWN: 34, - KEY_INSERT: 45, + var 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, + KEY_HOME: 36, + KEY_END: 35, + KEY_PAGEUP: 33, + KEY_PAGEDOWN: 34, + KEY_INSERT: 45, - cache: { }, + cache: {} + }; - relatedTarget: function(event) { - var element; - switch(event.type) { - case 'mouseover': element = event.fromElement; break; - case 'mouseout': element = event.toElement; break; - default: return null; - } - return Element.extend(element); - } -}); - -Event.Methods = (function() { - var isButton; + var docEl = document.documentElement; + var MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED = 'onmouseenter' in docEl + && 'onmouseleave' in docEl; + var _isButton; if (Prototype.Browser.IE) { var buttonMap = { 0: 1, 1: 4, 2: 2 }; - isButton = function(event, code) { - return event.button == buttonMap[code]; + _isButton = function(event, code) { + return event.button === buttonMap[code]; }; - } else if (Prototype.Browser.WebKit) { - isButton = function(event, code) { + _isButton = function(event, code) { switch (code) { case 0: return event.which == 1 && !event.metaKey; case 1: return event.which == 1 && event.metaKey; default: return false; } }; - } else { - isButton = function(event, code) { + _isButton = function(event, code) { return event.which ? (event.which === code + 1) : (event.button === code); }; } - return { - isLeftClick: function(event) { return isButton(event, 0) }, - isMiddleClick: function(event) { return isButton(event, 1) }, - isRightClick: function(event) { return isButton(event, 2) }, + function isLeftClick(event) { return _isButton(event, 0) } - element: function(event) { - event = Event.extend(event); + function isMiddleClick(event) { return _isButton(event, 1) } - var node = event.target, - type = event.type, - currentTarget = event.currentTarget; + function isRightClick(event) { return _isButton(event, 2) } - if (currentTarget && currentTarget.tagName) { - // Firefox screws up the "click" event when moving between radio buttons - // via arrow keys. It also screws up the "load" and "error" events on images, - // reporting the document as the target instead of the original image. - if (type === 'load' || type === 'error' || - (type === 'click' && currentTarget.tagName.toLowerCase() === 'input' - && currentTarget.type === 'radio')) - node = currentTarget; - } - if (node.nodeType == Node.TEXT_NODE) node = node.parentNode; - return Element.extend(node); - }, + function element(event) { + event = Event.extend(event); - findElement: function(event, expression) { - var element = Event.element(event); - if (!expression) return element; - var elements = [element].concat(element.ancestors()); - return Selector.findElement(elements, expression, 0); - }, + var node = event.target, type = event.type, + currentTarget = event.currentTarget; - pointer: function(event) { - var docElement = document.documentElement, - body = document.body || { scrollLeft: 0, scrollTop: 0 }; - return { - x: event.pageX || (event.clientX + - (docElement.scrollLeft || body.scrollLeft) - - (docElement.clientLeft || 0)), - y: event.pageY || (event.clientY + - (docElement.scrollTop || body.scrollTop) - - (docElement.clientTop || 0)) - }; - }, - - pointerX: function(event) { return Event.pointer(event).x }, - pointerY: function(event) { return Event.pointer(event).y }, - - stop: function(event) { - Event.extend(event); - event.preventDefault(); - event.stopPropagation(); - event.stopped = true; + if (currentTarget && currentTarget.tagName) { + if (type === 'load' || type === 'error' || + (type === 'click' && currentTarget.tagName.toLowerCase() === 'input' + && currentTarget.type === 'radio')) + node = currentTarget; } - }; -})(); -Event.extend = (function() { + if (node.nodeType == Node.TEXT_NODE) + node = node.parentNode; + + return Element.extend(node); + } + + function findElement(event, expression) { + var element = Event.element(event); + if (!expression) return element; + while (element) { + if (Object.isElement(element) && Prototype.Selector.match(element, expression)) { + return Element.extend(element); + } + element = element.parentNode; + } + } + + function pointer(event) { + return { x: pointerX(event), y: pointerY(event) }; + } + + function pointerX(event) { + var docElement = document.documentElement, + body = document.body || { scrollLeft: 0 }; + + return event.pageX || (event.clientX + + (docElement.scrollLeft || body.scrollLeft) - + (docElement.clientLeft || 0)); + } + + function pointerY(event) { + var docElement = document.documentElement, + body = document.body || { scrollTop: 0 }; + + return event.pageY || (event.clientY + + (docElement.scrollTop || body.scrollTop) - + (docElement.clientTop || 0)); + } + + + function stop(event) { + Event.extend(event); + event.preventDefault(); + event.stopPropagation(); + + event.stopped = true; + } + + Event.Methods = { + isLeftClick: isLeftClick, + isMiddleClick: isMiddleClick, + isRightClick: isRightClick, + + element: element, + findElement: findElement, + + pointer: pointer, + pointerX: pointerX, + pointerY: pointerY, + + stop: stop + }; + + var methods = Object.keys(Event.Methods).inject({ }, function(m, name) { m[name] = Event.Methods[name].methodize(); return m; }); if (Prototype.Browser.IE) { + function _relatedTarget(event) { + var element; + switch (event.type) { + case 'mouseover': element = event.fromElement; break; + case 'mouseout': element = event.toElement; break; + default: return null; + } + return Element.extend(element); + } + Object.extend(methods, { stopPropagation: function() { this.cancelBubble = true }, preventDefault: function() { this.returnValue = false }, - inspect: function() { return "[object Event]" } + inspect: function() { return '[object Event]' } }); - return function(event) { + Event.extend = function(event, element) { if (!event) return false; if (event._extendedByPrototype) return event; event._extendedByPrototype = Prototype.emptyFunction; var pointer = Event.pointer(event); + Object.extend(event, { - target: event.srcElement, - relatedTarget: Event.relatedTarget(event), + target: event.srcElement || element, + relatedTarget: _relatedTarget(event), pageX: pointer.x, pageY: pointer.y }); + return Object.extend(event, methods); }; - } else { - Event.prototype = Event.prototype || document.createEvent("HTMLEvents")['__proto__']; + Event.prototype = window.Event.prototype || document.createEvent('HTMLEvents').__proto__; Object.extend(Event.prototype, methods); - return Prototype.K; - } -})(); - -Object.extend(Event, (function() { - var cache = Event.cache; - - function getEventID(element) { - if (element._prototypeEventID) return element._prototypeEventID[0]; - arguments.callee.id = arguments.callee.id || 1; - return element._prototypeEventID = [++arguments.callee.id]; + Event.extend = Prototype.K; } - function getDOMEventName(eventName) { - if (eventName && eventName.include(':')) return "dataavailable"; - return eventName; - } + function _createResponder(element, eventName, handler) { + var registry = Element.retrieve(element, 'prototype_event_registry'); - function getCacheForID(id) { - return cache[id] = cache[id] || { }; - } + if (Object.isUndefined(registry)) { + CACHE.push(element); + registry = Element.retrieve(element, 'prototype_event_registry', $H()); + } - function getWrappersForEventName(id, eventName) { - var c = getCacheForID(id); - return c[eventName] = c[eventName] || []; - } + var respondersForEvent = registry.get(eventName); + if (Object.isUndefined(respondersForEvent)) { + respondersForEvent = []; + registry.set(eventName, respondersForEvent); + } - function createWrapper(element, eventName, handler) { - var id = getEventID(element); - var c = getWrappersForEventName(id, eventName); - if (c.pluck("handler").include(handler)) return false; + if (respondersForEvent.pluck('handler').include(handler)) return false; - var wrapper = function(event) { - if (!Event || !Event.extend || - (event.eventName && event.eventName != eventName)) + var responder; + if (eventName.include(":")) { + responder = function(event) { + if (Object.isUndefined(event.eventName)) return false; - Event.extend(event); - handler.call(element, event); - }; + if (event.eventName !== eventName) + return false; - wrapper.handler = handler; - c.push(wrapper); - return wrapper; - } + Event.extend(event, element); + handler.call(element, event); + }; + } else { + if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED && + (eventName === "mouseenter" || eventName === "mouseleave")) { + if (eventName === "mouseenter" || eventName === "mouseleave") { + responder = function(event) { + Event.extend(event, element); - function findWrapper(id, eventName, handler) { - var c = getWrappersForEventName(id, eventName); - return c.find(function(wrapper) { return wrapper.handler == handler }); - } + var parent = event.relatedTarget; + while (parent && parent !== element) { + try { parent = parent.parentNode; } + catch(e) { parent = element; } + } - function destroyWrapper(id, eventName, handler) { - var c = getCacheForID(id); - if (!c[eventName]) return false; - c[eventName] = c[eventName].without(findWrapper(id, eventName, handler)); - } + if (parent === element) return; - function destroyCache() { - for (var id in cache) - for (var eventName in cache[id]) - cache[id][eventName] = null; - } - - - // Internet Explorer needs to remove event handlers on page unload - // in order to avoid memory leaks. - if (window.attachEvent) { - window.attachEvent("onunload", destroyCache); - } - - // Safari has a dummy event handler on page unload so that it won't - // use its bfcache. Safari <= 3.1 has an issue with restoring the "document" - // object when page is returned to via the back button using its bfcache. - if (Prototype.Browser.WebKit) { - window.addEventListener('unload', Prototype.emptyFunction, false); - } - - return { - observe: function(element, eventName, handler) { - element = $(element); - var name = getDOMEventName(eventName); - - var wrapper = createWrapper(element, eventName, handler); - if (!wrapper) return element; - - if (element.addEventListener) { - element.addEventListener(name, wrapper, false); + handler.call(element, event); + }; + } } else { - element.attachEvent("on" + name, wrapper); + responder = function(event) { + Event.extend(event, element); + handler.call(element, event); + }; } - - return element; - }, - - stopObserving: function(element, eventName, handler) { - element = $(element); - var id = getEventID(element), name = getDOMEventName(eventName); - - if (!handler && eventName) { - getWrappersForEventName(id, eventName).each(function(wrapper) { - element.stopObserving(eventName, wrapper.handler); - }); - return element; - - } else if (!eventName) { - Object.keys(getCacheForID(id)).each(function(eventName) { - element.stopObserving(eventName); - }); - return element; - } - - var wrapper = findWrapper(id, eventName, handler); - if (!wrapper) return element; - - if (element.removeEventListener) { - element.removeEventListener(name, wrapper, false); - } else { - element.detachEvent("on" + name, wrapper); - } - - destroyWrapper(id, eventName, handler); - - return element; - }, - - fire: function(element, eventName, memo) { - element = $(element); - if (element == document && document.createEvent && !element.dispatchEvent) - element = document.documentElement; - - var event; - if (document.createEvent) { - event = document.createEvent("HTMLEvents"); - event.initEvent("dataavailable", true, true); - } else { - event = document.createEventObject(); - event.eventType = "ondataavailable"; - } - - event.eventName = eventName; - event.memo = memo || { }; - - if (document.createEvent) { - element.dispatchEvent(event); - } else { - element.fireEvent(event.eventType, event); - } - - return Event.extend(event); } - }; -})()); -Object.extend(Event, Event.Methods); + responder.handler = handler; + respondersForEvent.push(responder); + return responder; + } -Element.addMethods({ - fire: Event.fire, - observe: Event.observe, - stopObserving: Event.stopObserving -}); + function _destroyCache() { + for (var i = 0, length = CACHE.length; i < length; i++) { + Event.stopObserving(CACHE[i]); + CACHE[i] = null; + } + } -Object.extend(document, { - fire: Element.Methods.fire.methodize(), - observe: Element.Methods.observe.methodize(), - stopObserving: Element.Methods.stopObserving.methodize(), - loaded: false -}); + var CACHE = []; + + if (Prototype.Browser.IE) + window.attachEvent('onunload', _destroyCache); + + if (Prototype.Browser.WebKit) + window.addEventListener('unload', Prototype.emptyFunction, false); + + + var _getDOMEventName = Prototype.K, + translations = { mouseenter: "mouseover", mouseleave: "mouseout" }; + + if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED) { + _getDOMEventName = function(eventName) { + return (translations[eventName] || eventName); + }; + } + + function observe(element, eventName, handler) { + element = $(element); + + var responder = _createResponder(element, eventName, handler); + + if (!responder) return element; + + if (eventName.include(':')) { + if (element.addEventListener) + element.addEventListener("dataavailable", responder, false); + else { + element.attachEvent("ondataavailable", responder); + element.attachEvent("onfilterchange", responder); + } + } else { + var actualEventName = _getDOMEventName(eventName); + + if (element.addEventListener) + element.addEventListener(actualEventName, responder, false); + else + element.attachEvent("on" + actualEventName, responder); + } + + return element; + } + + function stopObserving(element, eventName, handler) { + element = $(element); + + var registry = Element.retrieve(element, 'prototype_event_registry'); + if (!registry) return element; + + if (!eventName) { + registry.each( function(pair) { + var eventName = pair.key; + stopObserving(element, eventName); + }); + return element; + } + + var responders = registry.get(eventName); + if (!responders) return element; + + if (!handler) { + responders.each(function(r) { + stopObserving(element, eventName, r.handler); + }); + return element; + } + + var responder = responders.find( function(r) { return r.handler === handler; }); + if (!responder) return element; + + if (eventName.include(':')) { + if (element.removeEventListener) + element.removeEventListener("dataavailable", responder, false); + else { + element.detachEvent("ondataavailable", responder); + element.detachEvent("onfilterchange", responder); + } + } else { + var actualEventName = _getDOMEventName(eventName); + if (element.removeEventListener) + element.removeEventListener(actualEventName, responder, false); + else + element.detachEvent('on' + actualEventName, responder); + } + + registry.set(eventName, responders.without(responder)); + + return element; + } + + function fire(element, eventName, memo, bubble) { + element = $(element); + + if (Object.isUndefined(bubble)) + bubble = true; + + if (element == document && document.createEvent && !element.dispatchEvent) + element = document.documentElement; + + var event; + if (document.createEvent) { + event = document.createEvent('HTMLEvents'); + event.initEvent('dataavailable', true, true); + } else { + event = document.createEventObject(); + event.eventType = bubble ? 'ondataavailable' : 'onfilterchange'; + } + + event.eventName = eventName; + event.memo = memo || { }; + + if (document.createEvent) + element.dispatchEvent(event); + else + element.fireEvent(event.eventType, event); + + return Event.extend(event); + } + + Event.Handler = Class.create({ + initialize: function(element, eventName, selector, callback) { + this.element = $(element); + this.eventName = eventName; + this.selector = selector; + this.callback = callback; + this.handler = this.handleEvent.bind(this); + }, + + start: function() { + Event.observe(this.element, this.eventName, this.handler); + return this; + }, + + stop: function() { + Event.stopObserving(this.element, this.eventName, this.handler); + return this; + }, + + handleEvent: function(event) { + var element = event.findElement(this.selector); + if (element) this.callback.call(this.element, event, element); + } + }); + + function on(element, eventName, selector, callback) { + element = $(element); + if (Object.isFunction(selector) && Object.isUndefined(callback)) { + callback = selector, selector = null; + } + + return new Event.Handler(element, eventName, selector, callback).start(); + } + + Object.extend(Event, Event.Methods); + + Object.extend(Event, { + fire: fire, + observe: observe, + stopObserving: stopObserving, + on: on + }); + + Element.addMethods({ + fire: fire, + + observe: observe, + + stopObserving: stopObserving, + + on: on + }); + + Object.extend(document, { + fire: fire.methodize(), + + observe: observe.methodize(), + + stopObserving: stopObserving.methodize(), + + on: on.methodize(), + + loaded: false + }); + + if (window.Event) Object.extend(window.Event, Event); + else window.Event = Event; +})(); (function() { /* Support for the DOMContentLoaded event is based on work by Dan Webb, - Matthias Miller, Dean Edwards and John Resig. */ + Matthias Miller, Dean Edwards, John Resig, and Diego Perini. */ var timer; function fireContentLoadedEvent() { if (document.loaded) return; - if (timer) window.clearInterval(timer); - document.fire("dom:loaded"); + if (timer) window.clearTimeout(timer); document.loaded = true; + document.fire('dom:loaded'); + } + + function checkReadyState() { + if (document.readyState === 'complete') { + document.stopObserving('readystatechange', checkReadyState); + fireContentLoadedEvent(); + } + } + + function pollDoScroll() { + try { document.documentElement.doScroll('left'); } + catch(e) { + timer = pollDoScroll.defer(); + return; + } + fireContentLoadedEvent(); } if (document.addEventListener) { - if (Prototype.Browser.WebKit) { - timer = window.setInterval(function() { - if (/loaded|complete/.test(document.readyState)) - fireContentLoadedEvent(); - }, 0); - - Event.observe(window, "load", fireContentLoadedEvent); - - } else { - document.addEventListener("DOMContentLoaded", - fireContentLoadedEvent, false); - } - + document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false); } else { - document.write(" - - - -

{$lang_template_title}

- -
- - -
- -
- - diff --git a/public/tiny_mce/plugins/_template/readme.txt b/public/tiny_mce/plugins/_template/readme.txt deleted file mode 100644 index 2ee1505..0000000 --- a/public/tiny_mce/plugins/_template/readme.txt +++ /dev/null @@ -1 +0,0 @@ -This is a template/tutorial plugin that where created to help you in the development of own plugins for TinyMCE. \ No newline at end of file diff --git a/public/tiny_mce/plugins/advhr/editor_plugin.js b/public/tiny_mce/plugins/advhr/editor_plugin.js deleted file mode 100644 index ef74430..0000000 --- a/public/tiny_mce/plugins/advhr/editor_plugin.js +++ /dev/null @@ -1,2 +0,0 @@ -/* Import plugin specific language pack */ - tinyMCE.importPluginLanguagePack('advhr','en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl,pt_br');function TinyMCE_advhr_getControlHTML(control_name){switch(control_name){case "advhr":return '';}return "";}function TinyMCE_advhr_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceAdvancedHr":var template=new Array();template['file']='../../plugins/advhr/rule.htm';template['width']=270;template['height']=180;var size="",width="",noshade="";if(tinyMCE.selectedElement!=null&&tinyMCE.selectedElement.nodeName.toLowerCase()=="hr"){tinyMCE.hrElement=tinyMCE.selectedElement;if(tinyMCE.hrElement){size=tinyMCE.hrElement.getAttribute('size')?tinyMCE.hrElement.getAttribute('size'):"";width=tinyMCE.hrElement.getAttribute('width')?tinyMCE.hrElement.getAttribute('width'):"";noshade=tinyMCE.hrElement.getAttribute('noshade')?tinyMCE.hrElement.getAttribute('noshade'):"";}tinyMCE.openWindow(template,{editor_id:editor_id,size:size,width:width,noshade:noshade,mceDo:'update'});}else{if(tinyMCE.isMSIE){tinyMCE.execInstanceCommand(editor_id,'mceInsertContent',false,'
');}else{tinyMCE.openWindow(template,{editor_id:editor_id,size:size,width:width,noshade:noshade,mceDo:'insert'});}}return true;}return false;}function TinyMCE_advhr_handleNodeChange(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){tinyMCE.switchClassSticky(editor_id+'_advhr','mceButtonNormal');if(node==null)return;do{if(node.nodeName.toLowerCase()=="hr")tinyMCE.switchClassSticky(editor_id+'_advhr','mceButtonSelected');}while((node=node.parentNode));return true;} \ No newline at end of file diff --git a/public/tiny_mce/plugins/advhr/editor_plugin_src.js b/public/tiny_mce/plugins/advhr/editor_plugin_src.js deleted file mode 100644 index 44e021c..0000000 --- a/public/tiny_mce/plugins/advhr/editor_plugin_src.js +++ /dev/null @@ -1,58 +0,0 @@ -/* Import plugin specific language pack */ -tinyMCE.importPluginLanguagePack('advhr', 'en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl,pt_br'); - -function TinyMCE_advhr_getControlHTML(control_name) { - switch (control_name) { - case "advhr": - return ''; - } - return ""; -} - -/** - * Executes the mceAdvanceHr command. - */ -function TinyMCE_advhr_execCommand(editor_id, element, command, user_interface, value) { - // Handle commands - switch (command) { - case "mceAdvancedHr": - var template = new Array(); - template['file'] = '../../plugins/advhr/rule.htm'; // Relative to theme - template['width'] = 270; - template['height'] = 180; - var size = "", width = "", noshade = ""; - if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "hr"){ - tinyMCE.hrElement = tinyMCE.selectedElement; - if (tinyMCE.hrElement) { - size = tinyMCE.hrElement.getAttribute('size') ? tinyMCE.hrElement.getAttribute('size') : ""; - width = tinyMCE.hrElement.getAttribute('width') ? tinyMCE.hrElement.getAttribute('width') : ""; - noshade = tinyMCE.hrElement.getAttribute('noshade') ? tinyMCE.hrElement.getAttribute('noshade') : ""; - } - tinyMCE.openWindow(template, {editor_id : editor_id, size : size, width : width, noshade : noshade, mceDo : 'update'}); - } else { - if (tinyMCE.isMSIE) { - tinyMCE.execInstanceCommand(editor_id, 'mceInsertContent', false,'
'); - } else { - tinyMCE.openWindow(template, {editor_id : editor_id, size : size, width : width, noshade : noshade, mceDo : 'insert'}); - } - } - - return true; - } - // Pass to next handler in chain - return false; -} - -function TinyMCE_advhr_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { - tinyMCE.switchClassSticky(editor_id + '_advhr', 'mceButtonNormal'); - - if (node == null) - return; - - do { - if (node.nodeName.toLowerCase() == "hr") - tinyMCE.switchClassSticky(editor_id + '_advhr', 'mceButtonSelected'); - } while ((node = node.parentNode)); - - return true; -} \ No newline at end of file diff --git a/public/tiny_mce/plugins/advhr/images/advhr.gif b/public/tiny_mce/plugins/advhr/images/advhr.gif deleted file mode 100644 index e18bfc2ac9e8360ca15d315c55ff182d846ff83e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmZ?wbhEHb6k!lyI3mn2VaA392R7NcjK%KLZg!@h1x-1A{Pw4oEG?P6k%L2P%Cj zne#GMt;>16Zv!WTGxOaEOWq5)FtM^dTqxkuCwQDm&|?Byi}Qg57cQPg=0pcC76EQ{ fBc%Wvjvl6lDUV+kOgNSxw)*z_AA9WNnHa1Ab_Yw| diff --git a/public/tiny_mce/plugins/advhr/langs/cs.js b/public/tiny_mce/plugins/advhr/langs/cs.js deleted file mode 100644 index 7e000e9..0000000 --- a/public/tiny_mce/plugins/advhr/langs/cs.js +++ /dev/null @@ -1,6 +0,0 @@ -// UK lang variables - -tinyMCELang['lang_insert_advhr_desc'] = 'Vloit/editovat vodorovn oddlova' -tinyMCELang['lang_insert_advhr_width'] = 'ka'; -tinyMCELang['lang_insert_advhr_size'] = 'Vka'; -tinyMCELang['lang_insert_advhr_noshade'] = 'Nestnovat'; \ No newline at end of file diff --git a/public/tiny_mce/plugins/advhr/langs/de.js b/public/tiny_mce/plugins/advhr/langs/de.js deleted file mode 100644 index beefec8..0000000 --- a/public/tiny_mce/plugins/advhr/langs/de.js +++ /dev/null @@ -1,6 +0,0 @@ -// DE lang variables - -tinyMCELang['lang_insert_advhr_desc'] = 'Horizontale Linie einfügen / bearbeiten' -tinyMCELang['lang_insert_advhr_width'] = 'Breite'; -tinyMCELang['lang_insert_advhr_size'] = 'Höhe'; -tinyMCELang['lang_insert_advhr_noshade'] = 'Keinen Schatten'; diff --git a/public/tiny_mce/plugins/advhr/langs/en.js b/public/tiny_mce/plugins/advhr/langs/en.js deleted file mode 100644 index 8daf26e..0000000 --- a/public/tiny_mce/plugins/advhr/langs/en.js +++ /dev/null @@ -1,6 +0,0 @@ -// UK lang variables - -tinyMCELang['lang_insert_advhr_desc'] = 'Insert / edit Horizontale Rule' -tinyMCELang['lang_insert_advhr_width'] = 'Width'; -tinyMCELang['lang_insert_advhr_size'] = 'Height'; -tinyMCELang['lang_insert_advhr_noshade'] = 'No shadow'; diff --git a/public/tiny_mce/plugins/advhr/langs/fa.js b/public/tiny_mce/plugins/advhr/langs/fa.js deleted file mode 100644 index 934c8ba..0000000 --- a/public/tiny_mce/plugins/advhr/langs/fa.js +++ /dev/null @@ -1,11 +0,0 @@ -// IR lang variables -// Persian (Farsi) language pack (for IRAN) -// By: Morteza Zafari -// Lost@LostLord.com -// http://www.LostLord.com - -tinyMCELang['lang_dir'] = 'rtl'; -tinyMCELang['lang_insert_advhr_desc'] = 'درج و ویرایش خط افقی' -tinyMCELang['lang_insert_advhr_width'] = 'عرض'; -tinyMCELang['lang_insert_advhr_size'] = 'ارتفاع'; -tinyMCELang['lang_insert_advhr_noshade'] = 'بدون سایه'; diff --git a/public/tiny_mce/plugins/advhr/langs/fr.js b/public/tiny_mce/plugins/advhr/langs/fr.js deleted file mode 100644 index ae30fe3..0000000 --- a/public/tiny_mce/plugins/advhr/langs/fr.js +++ /dev/null @@ -1,6 +0,0 @@ -// French lang variables by Laurent Dran - -tinyMCELang['lang_insert_advhr_desc'] = 'Insérer / éditer une Rčgle Horizontale' -tinyMCELang['lang_insert_advhr_width'] = 'Largeur'; -tinyMCELang['lang_insert_advhr_size'] = 'Hauteur'; -tinyMCELang['lang_insert_advhr_noshade'] = 'Sans ombre'; diff --git a/public/tiny_mce/plugins/advhr/langs/fr_ca.js b/public/tiny_mce/plugins/advhr/langs/fr_ca.js deleted file mode 100644 index 77e74ad..0000000 --- a/public/tiny_mce/plugins/advhr/langs/fr_ca.js +++ /dev/null @@ -1,6 +0,0 @@ -// CA_FR lang variables - -tinyMCELang['lang_insert_advhr_desc'] = 'Insrer / Modifier Sparateur Horizontal'; -tinyMCELang['lang_insert_advhr_width'] = 'Largeur'; -tinyMCELang['lang_insert_advhr_size'] = 'Hauteur'; -tinyMCELang['lang_insert_advhr_noshade'] = 'Sans ombrage'; diff --git a/public/tiny_mce/plugins/advhr/langs/pl.js b/public/tiny_mce/plugins/advhr/langs/pl.js deleted file mode 100644 index da2d829..0000000 --- a/public/tiny_mce/plugins/advhr/langs/pl.js +++ /dev/null @@ -1,6 +0,0 @@ -// PL lang variables - -tinyMCELang['lang_insert_advhr_desc'] = 'Wstaw/Edytuj poziomą linię' -tinyMCELang['lang_insert_advhr_width'] = 'Szerokość'; -tinyMCELang['lang_insert_advhr_size'] = 'Wysokość'; -tinyMCELang['lang_insert_advhr_noshade'] = 'Brak cienia'; \ No newline at end of file diff --git a/public/tiny_mce/plugins/advhr/langs/pt_br.js b/public/tiny_mce/plugins/advhr/langs/pt_br.js deleted file mode 100644 index e38f3b7..0000000 --- a/public/tiny_mce/plugins/advhr/langs/pt_br.js +++ /dev/null @@ -1,6 +0,0 @@ -// pt_BR lang variables - -tinyMCELang['lang_insert_advhr_desc'] = 'Inserir / editar Linha Horizontal' -tinyMCELang['lang_insert_advhr_width'] = 'Largura'; -tinyMCELang['lang_insert_advhr_size'] = 'Altura'; -tinyMCELang['lang_insert_advhr_noshade'] = 'Sem Sombra'; diff --git a/public/tiny_mce/plugins/advhr/langs/sv.js b/public/tiny_mce/plugins/advhr/langs/sv.js deleted file mode 100644 index 7066716..0000000 --- a/public/tiny_mce/plugins/advhr/langs/sv.js +++ /dev/null @@ -1,6 +0,0 @@ -// SE lang variables - -tinyMCELang['lang_insert_advhr_desc'] = 'Skapa/Redigera horisontell linje' -tinyMCELang['lang_insert_advhr_width'] = 'Bredd'; -tinyMCELang['lang_insert_advhr_size'] = 'Hjd'; -tinyMCELang['lang_insert_advhr_noshade'] = 'Ingen skugga'; diff --git a/public/tiny_mce/plugins/advhr/langs/zh_cn.js b/public/tiny_mce/plugins/advhr/langs/zh_cn.js deleted file mode 100644 index 656ea52..0000000 --- a/public/tiny_mce/plugins/advhr/langs/zh_cn.js +++ /dev/null @@ -1,7 +0,0 @@ -// Simplified Chinese lang variables contributed by cube316 (cube316@gmail.com) -// http://www.cube316.net/ ԻȡTinyMCE֧ - -tinyMCELang['lang_insert_advhr_desc'] = '/༭ ˮƽ' -tinyMCELang['lang_insert_advhr_width'] = ''; -tinyMCELang['lang_insert_advhr_size'] = '߶'; -tinyMCELang['lang_insert_advhr_noshade'] = 'Ӱ'; diff --git a/public/tiny_mce/plugins/advhr/readme.txt b/public/tiny_mce/plugins/advhr/readme.txt deleted file mode 100644 index f39e3b4..0000000 --- a/public/tiny_mce/plugins/advhr/readme.txt +++ /dev/null @@ -1,20 +0,0 @@ - Advhr plugin for TinyMCE ------------------------------ - -About: - This is a more advanced hr dialog contributed by Michael Keck. - This one supports noshade, width and size. - -Installation instructions: - * Copy the advhr directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins). - * Add plugin to TinyMCE plugin option list example: plugins : "advhr". - * Add this "hr[class|width|size|noshade]" to extended_valid_elements option. - -Initialization example: - tinyMCE.init({ - theme : "advanced", - mode : "textareas", - plugins : "advhr", - theme_advanced_buttons1_add : "advhr", - extended_valid_elements : "hr[class|width|size|noshade]" - }); diff --git a/public/tiny_mce/plugins/advhr/rule.htm b/public/tiny_mce/plugins/advhr/rule.htm deleted file mode 100644 index b47d75f..0000000 --- a/public/tiny_mce/plugins/advhr/rule.htm +++ /dev/null @@ -1,107 +0,0 @@ - - -{$lang_insert_link_title} - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - -
{$lang_insert_advhr_desc}
{$lang_insert_advhr_width}: - - -
{$lang_insert_advhr_size}:
-
- - diff --git a/public/tiny_mce/plugins/advimage/editor_plugin.js b/public/tiny_mce/plugins/advimage/editor_plugin.js deleted file mode 100644 index 652a3b8..0000000 --- a/public/tiny_mce/plugins/advimage/editor_plugin.js +++ /dev/null @@ -1,2 +0,0 @@ -/* Import plugin specific language pack */ - tinyMCE.importPluginLanguagePack('advimage','en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl,pt_br');function TinyMCE_advimage_getInsertImageTemplate(){var template=new Array();template['file']='../../plugins/advimage/image.htm';template['width']=430;template['height']=380;template['width']+=tinyMCE.getLang('lang_insert_image_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_image_delta_height',0);return template;}function TinyMCE_advimage_cleanup(type,content){switch(type){case "insert_to_editor_dom":var imgs=content.getElementsByTagName("img");for(var i=0;i - -{$lang_insert_image_title} - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{$lang_insert_image_title}
{$lang_insert_image_src}: - - - - -
{$lang_insert_image_alt}:
{$lang_insert_image_alt2}:
{$lang_insert_image_dimensions}: - x - px -
{$lang_insert_image_border}:
{$lang_insert_image_align}: -
{$lang_insert_image_vspace}:
{$lang_insert_image_hspace}:
{$lang_insert_image_mouseover}: - - - - -
{$lang_insert_image_mouseout}: - - - - -
 
-
- - diff --git a/public/tiny_mce/plugins/advimage/langs/cs.js b/public/tiny_mce/plugins/advimage/langs/cs.js deleted file mode 100644 index dde44c6..0000000 --- a/public/tiny_mce/plugins/advimage/langs/cs.js +++ /dev/null @@ -1,6 +0,0 @@ -// UK lang variables - -tinyMCELang['lang_insert_image_alt2'] = 'Nzev obrzku'; -tinyMCELang['lang_insert_image_onmousemove'] = 'Alternativn obrzek' -tinyMCELang['lang_insert_image_mouseover'] = 'pi najet myi'; -tinyMCELang['lang_insert_image_mouseout'] = 'pi odjet myi'; \ No newline at end of file diff --git a/public/tiny_mce/plugins/advimage/langs/de.js b/public/tiny_mce/plugins/advimage/langs/de.js deleted file mode 100644 index c5a6d22..0000000 --- a/public/tiny_mce/plugins/advimage/langs/de.js +++ /dev/null @@ -1,6 +0,0 @@ -// DE lang variables - -tinyMCELang['lang_insert_image_alt2'] = 'Titel des Bildes'; -tinyMCELang['lang_insert_image_onmousemove'] = 'Alternatives Bild' -tinyMCELang['lang_insert_image_mouseover'] = 'für Maus darüber'; -tinyMCELang['lang_insert_image_mouseout'] = 'für Maus ausserhalb'; diff --git a/public/tiny_mce/plugins/advimage/langs/en.js b/public/tiny_mce/plugins/advimage/langs/en.js deleted file mode 100644 index c4098af..0000000 --- a/public/tiny_mce/plugins/advimage/langs/en.js +++ /dev/null @@ -1,6 +0,0 @@ -// UK lang variables - -tinyMCELang['lang_insert_image_alt2'] = 'Image title'; -tinyMCELang['lang_insert_image_onmousemove'] = 'Alternative image' -tinyMCELang['lang_insert_image_mouseover'] = 'for mouse over'; -tinyMCELang['lang_insert_image_mouseout'] = 'for mouse out'; diff --git a/public/tiny_mce/plugins/advimage/langs/fa.js b/public/tiny_mce/plugins/advimage/langs/fa.js deleted file mode 100644 index 685a49f..0000000 --- a/public/tiny_mce/plugins/advimage/langs/fa.js +++ /dev/null @@ -1,11 +0,0 @@ -// IR lang variables -// Persian (Farsi) language pack (for IRAN) -// By: Morteza Zafari -// Lost@LostLord.com -// http://www.LostLord.com - -tinyMCELang['lang_dir'] = 'rtl'; -tinyMCELang['lang_insert_image_alt2'] = 'عنوان عکس'; -tinyMCELang['lang_insert_image_onmousemove'] = 'عکس جایگزین' -tinyMCELang['lang_insert_image_mouseover'] = 'عکس جایگزین هنگام ورود نشانگر ماوس'; -tinyMCELang['lang_insert_image_mouseout'] = 'عکس جایگزین هنگام خروج نشانگر ماوس'; diff --git a/public/tiny_mce/plugins/advimage/langs/fr.js b/public/tiny_mce/plugins/advimage/langs/fr.js deleted file mode 100644 index 588ab3c..0000000 --- a/public/tiny_mce/plugins/advimage/langs/fr.js +++ /dev/null @@ -1,6 +0,0 @@ -// French lang variables by Laurent Dran - -tinyMCELang['lang_insert_image_alt2'] = 'Titre de l\'image'; -tinyMCELang['lang_insert_image_onmousemove'] = 'Image alternative' -tinyMCELang['lang_insert_image_mouseover'] = 'Pour la souris au dessus'; -tinyMCELang['lang_insert_image_mouseout'] = 'Pour la souris en dehors'; diff --git a/public/tiny_mce/plugins/advimage/langs/fr_ca.js b/public/tiny_mce/plugins/advimage/langs/fr_ca.js deleted file mode 100644 index 32e8af7..0000000 --- a/public/tiny_mce/plugins/advimage/langs/fr_ca.js +++ /dev/null @@ -1,6 +0,0 @@ -// CA_FR lang variables - -tinyMCELang['lang_insert_image_alt2'] = 'Titre de l\'image'; -tinyMCELang['lang_insert_image_onmousemove'] = 'Image alternative'; -tinyMCELang['lang_insert_image_mouseover'] = 'pour le mouse over'; -tinyMCELang['lang_insert_image_mouseout'] = 'pour le mouse out'; diff --git a/public/tiny_mce/plugins/advimage/langs/ko.js b/public/tiny_mce/plugins/advimage/langs/ko.js deleted file mode 100644 index 68fe45a..0000000 --- a/public/tiny_mce/plugins/advimage/langs/ko.js +++ /dev/null @@ -1,6 +0,0 @@ -// KO lang variables - -tinyMCELang['lang_insert_image_alt2'] = '׸ '; -tinyMCELang['lang_insert_image_onmousemove'] = 'ü ̹' -tinyMCELang['lang_insert_image_mouseover'] = '콺 ÷ '; -tinyMCELang['lang_insert_image_mouseout'] = '콺 '; diff --git a/public/tiny_mce/plugins/advimage/langs/pl.js b/public/tiny_mce/plugins/advimage/langs/pl.js deleted file mode 100644 index fffba25..0000000 --- a/public/tiny_mce/plugins/advimage/langs/pl.js +++ /dev/null @@ -1,6 +0,0 @@ -// PL lang variables - -tinyMCELang['lang_insert_image_alt2'] = 'Tytuł obrazka'; -tinyMCELang['lang_insert_image_onmousemove'] = 'Obrazek zastępczy' -tinyMCELang['lang_insert_image_mouseover'] = 'po najechaniu myszy'; -tinyMCELang['lang_insert_image_mouseout'] = 'po odjechaniu myszy'; \ No newline at end of file diff --git a/public/tiny_mce/plugins/advimage/langs/pt_br.js b/public/tiny_mce/plugins/advimage/langs/pt_br.js deleted file mode 100644 index 91f2278..0000000 --- a/public/tiny_mce/plugins/advimage/langs/pt_br.js +++ /dev/null @@ -1,6 +0,0 @@ -// pt_BR lang variables - -tinyMCELang['lang_insert_image_alt2'] = 'Ttulo da Imagem'; -tinyMCELang['lang_insert_image_onmousemove'] = 'Imagem Alternativa' -tinyMCELang['lang_insert_image_mouseover'] = 'para quando mouse sobre'; -tinyMCELang['lang_insert_image_mouseout'] = 'para quando mouse fora'; diff --git a/public/tiny_mce/plugins/advimage/langs/sv.js b/public/tiny_mce/plugins/advimage/langs/sv.js deleted file mode 100644 index f901dbd..0000000 --- a/public/tiny_mce/plugins/advimage/langs/sv.js +++ /dev/null @@ -1,6 +0,0 @@ -// SE lang variables - -tinyMCELang['lang_insert_image_alt2'] = 'Bildentitel'; -tinyMCELang['lang_insert_image_onmousemove'] = 'Alternativ bild' -tinyMCELang['lang_insert_image_mouseover'] = 'när pekaren är över'; -tinyMCELang['lang_insert_image_mouseout'] = 'när pekaren är utanför'; diff --git a/public/tiny_mce/plugins/advimage/langs/zh_cn.js b/public/tiny_mce/plugins/advimage/langs/zh_cn.js deleted file mode 100644 index e418581..0000000 --- a/public/tiny_mce/plugins/advimage/langs/zh_cn.js +++ /dev/null @@ -1,7 +0,0 @@ -// Simplified Chinese lang variables contributed by cube316 (cube316@gmail.com) -// http://www.cube316.net/ ԻȡTinyMCE֧ - -tinyMCELang['lang_insert_image_alt2'] = 'ͼƬ'; -tinyMCELang['lang_insert_image_onmousemove'] = 'ͼ' -tinyMCELang['lang_insert_image_mouseover'] = 'ʱ'; -tinyMCELang['lang_insert_image_mouseout'] = 'ƿʱ'; diff --git a/public/tiny_mce/plugins/advimage/readme.txt b/public/tiny_mce/plugins/advimage/readme.txt deleted file mode 100644 index b88835b..0000000 --- a/public/tiny_mce/plugins/advimage/readme.txt +++ /dev/null @@ -1,19 +0,0 @@ - Advimage plugin for TinyMCE ------------------------------ - -About: - This is a more advanced image dialog mostly based on code contributed by Michael Keck. - This one supports mouseover/out image swapping. - -Installation instructions: - * Copy the advimage directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins). - * Add plugin to TinyMCE plugin option list example: plugins : "advimage". - * Add this "a[name|href|target|title|onclick]" to extended_valid_elements option. - -Initialization example: - tinyMCE.init({ - theme : "advanced", - mode : "textareas", - plugins : "preview", - extended_valid_elements : "a[name|href|target|title|onclick]" - }); diff --git a/public/tiny_mce/plugins/advlink/editor_plugin.js b/public/tiny_mce/plugins/advlink/editor_plugin.js deleted file mode 100644 index 826d7bb..0000000 --- a/public/tiny_mce/plugins/advlink/editor_plugin.js +++ /dev/null @@ -1,2 +0,0 @@ -/* Import plugin specific language pack */ - tinyMCE.importPluginLanguagePack('advlink','en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl,pt_br');function TinyMCE_advlink_getInsertLinkTemplate(){var template=new Array();template['file']='../../plugins/advlink/link.htm';template['width']=400;template['height']=420;template['width']+=tinyMCE.getLang('lang_insert_link_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_link_delta_height',0);return template;} \ No newline at end of file diff --git a/public/tiny_mce/plugins/advlink/editor_plugin_src.js b/public/tiny_mce/plugins/advlink/editor_plugin_src.js deleted file mode 100644 index 6d9daea..0000000 --- a/public/tiny_mce/plugins/advlink/editor_plugin_src.js +++ /dev/null @@ -1,18 +0,0 @@ -/* Import plugin specific language pack */ -tinyMCE.importPluginLanguagePack('advlink', 'en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl,pt_br'); - -/** - * Insert link template function. - */ -function TinyMCE_advlink_getInsertLinkTemplate() { - var template = new Array(); - template['file'] = '../../plugins/advlink/link.htm'; - template['width'] = 400; - template['height'] = 420; - - // Language specific width and height addons - template['width'] += tinyMCE.getLang('lang_insert_link_delta_width', 0); - template['height'] += tinyMCE.getLang('lang_insert_link_delta_height', 0); - - return template; -} \ No newline at end of file diff --git a/public/tiny_mce/plugins/advlink/langs/cs.js b/public/tiny_mce/plugins/advlink/langs/cs.js deleted file mode 100644 index fb758ca..0000000 --- a/public/tiny_mce/plugins/advlink/langs/cs.js +++ /dev/null @@ -1,20 +0,0 @@ -// CZ lang variables - -tinyMCELang['lang_insert_link_target_same'] = 'Otevt ve stejnm okn/rmu'; -tinyMCELang['lang_insert_link_target_parent'] = 'Otevt v rodiovskm okn/rmu'; -tinyMCELang['lang_insert_link_target_top'] = 'Otevt v nejvym rmu (pepe vechny rmy)'; -tinyMCELang['lang_insert_link_target_blank'] = 'Otevt v novm okn'; -tinyMCELang['lang_insert_link_target_named'] = 'Otevt v okn'; -tinyMCELang['lang_insert_link_popup'] = 'JS-Popup'; -tinyMCELang['lang_insert_link_popup_url'] = 'Popup URL'; -tinyMCELang['lang_insert_link_popup_name'] = 'Nzev okna'; -tinyMCELang['lang_insert_link_popup_return'] = 'insert \'return false\''; -tinyMCELang['lang_insert_link_popup_scrollbars'] = 'Ukzat posuvnky'; -tinyMCELang['lang_insert_link_popup_statusbar'] = 'Ukzat stavov dek'; -tinyMCELang['lang_insert_link_popup_toolbar'] = 'Ukzat ovl. litu'; -tinyMCELang['lang_insert_link_popup_menubar'] = 'Ukzat menu'; -tinyMCELang['lang_insert_link_popup_location'] = 'Ukzat litu umstn'; -tinyMCELang['lang_insert_link_popup_resizable'] = 'Promnn velikost okna'; -tinyMCELang['lang_insert_link_popup_size'] = 'Velikost'; -tinyMCELang['lang_insert_link_popup_position'] = 'Umstn (X/Y)'; -tinyMCELang['lang_insert_link_popup_missingtarget'] = 'Vlote nzev cle nebo vyberte jinou volbu.'; \ No newline at end of file diff --git a/public/tiny_mce/plugins/advlink/langs/de.js b/public/tiny_mce/plugins/advlink/langs/de.js deleted file mode 100644 index 14af22a..0000000 --- a/public/tiny_mce/plugins/advlink/langs/de.js +++ /dev/null @@ -1,20 +0,0 @@ -// DE lang variables - -tinyMCELang['lang_insert_link_target_same'] = 'Im selben Frame öffnen'; -tinyMCELang['lang_insert_link_target_parent'] = 'Im darüber liegenden Frame öffnen'; -tinyMCELang['lang_insert_link_target_top']= 'Im obersten Frame öffnen'; -tinyMCELang['lang_insert_link_target_blank']= 'In einem neuen Fenster öffnen'; -tinyMCELang['lang_insert_link_target_named']= 'Öffnen im Fenster/Frame'; -tinyMCELang['lang_insert_link_popup'] = 'JS-Popup'; -tinyMCELang['lang_insert_link_popup_url'] = 'Popup URL'; -tinyMCELang['lang_insert_link_popup_name']= 'Fenstername'; -tinyMCELang['lang_insert_link_popup_return']= 'mit \'return false\''; -tinyMCELang['lang_insert_link_popup_scrollbars']= 'Scrollbars anzeigen'; -tinyMCELang['lang_insert_link_popup_statusbar'] = 'Statusbar anzeigen'; -tinyMCELang['lang_insert_link_popup_toolbar'] = 'Toolbars anzeigen'; -tinyMCELang['lang_insert_link_popup_menubar'] = 'Menu anzeigen'; -tinyMCELang['lang_insert_link_popup_location']= 'Adresszeile anzeigen'; -tinyMCELang['lang_insert_link_popup_resizable'] = 'Größe änderbar'; -tinyMCELang['lang_insert_link_popup_size']= 'Größe'; -tinyMCELang['lang_insert_link_popup_position']= 'Position (X/Y)'; -tinyMCELang['lang_insert_link_popup_missingtarget'] = 'Bitte geben Sie einen Namen für das Ziel an oder wählen Sie eine andere Option.'; diff --git a/public/tiny_mce/plugins/advlink/langs/en.js b/public/tiny_mce/plugins/advlink/langs/en.js deleted file mode 100644 index 9384f39..0000000 --- a/public/tiny_mce/plugins/advlink/langs/en.js +++ /dev/null @@ -1,20 +0,0 @@ -// UK lang variables - -tinyMCELang['lang_insert_link_target_same'] = 'Open in this window / frame'; -tinyMCELang['lang_insert_link_target_parent'] = 'Open in parent window / frame'; -tinyMCELang['lang_insert_link_target_top'] = 'Open in top frame (replaces all frames)'; -tinyMCELang['lang_insert_link_target_blank'] = 'Open in new window'; -tinyMCELang['lang_insert_link_target_named'] = 'Open in the window'; -tinyMCELang['lang_insert_link_popup'] = 'JS-Popup'; -tinyMCELang['lang_insert_link_popup_url'] = 'Popup URL'; -tinyMCELang['lang_insert_link_popup_name'] = 'Window name'; -tinyMCELang['lang_insert_link_popup_return'] = 'insert \'return false\''; -tinyMCELang['lang_insert_link_popup_scrollbars'] = 'Show scrollbars'; -tinyMCELang['lang_insert_link_popup_statusbar'] = 'Show statusbar'; -tinyMCELang['lang_insert_link_popup_toolbar'] = 'Show toolbars'; -tinyMCELang['lang_insert_link_popup_menubar'] = 'Show menubar'; -tinyMCELang['lang_insert_link_popup_location'] = 'Show locationbar'; -tinyMCELang['lang_insert_link_popup_resizable'] = 'Make window resizable'; -tinyMCELang['lang_insert_link_popup_size'] = 'Size'; -tinyMCELang['lang_insert_link_popup_position'] = 'Position (X/Y)'; -tinyMCELang['lang_insert_link_popup_missingtarget'] = 'Please insert a name for the target or choose another option.'; diff --git a/public/tiny_mce/plugins/advlink/langs/fa.js b/public/tiny_mce/plugins/advlink/langs/fa.js deleted file mode 100644 index f126461..0000000 --- a/public/tiny_mce/plugins/advlink/langs/fa.js +++ /dev/null @@ -1,25 +0,0 @@ -// IR lang variables -// Persian (Farsi) language pack (for IRAN) -// By: Morteza Zafari -// Lost@LostLord.com -// http://www.LostLord.com - -tinyMCELang['lang_dir'] = 'rtl'; -tinyMCELang['lang_insert_link_target_same'] = 'در همین صفحه / فریم باز کن'; -tinyMCELang['lang_insert_link_target_parent'] = 'در صفحه / فریم اصلی باز کن'; -tinyMCELang['lang_insert_link_target_top'] = 'در فریم اصلی باز کن (همه فریمها نادیده گرفته میشود)'; -tinyMCELang['lang_insert_link_target_blank'] = 'در صفحه جدید باز کن'; -tinyMCELang['lang_insert_link_target_named'] = 'در پنجره باز کن'; -tinyMCELang['lang_insert_link_popup'] = 'JS-Popup'; -tinyMCELang['lang_insert_link_popup_url'] = 'URL پنجره'; -tinyMCELang['lang_insert_link_popup_name'] = 'نام پنجره'; -tinyMCELang['lang_insert_link_popup_return'] = 'افزودن \'return false\''; -tinyMCELang['lang_insert_link_popup_scrollbars'] = 'نمایش scrollbars'; -tinyMCELang['lang_insert_link_popup_statusbar'] = 'نمایش statusbar'; -tinyMCELang['lang_insert_link_popup_toolbar'] = 'نمایش toolbars'; -tinyMCELang['lang_insert_link_popup_menubar'] = 'نمایش menubar'; -tinyMCELang['lang_insert_link_popup_location'] = 'نمایش locationbar'; -tinyMCELang['lang_insert_link_popup_resizable'] = 'قابل تغییر اندازه باشد'; -tinyMCELang['lang_insert_link_popup_size'] = 'اندازه'; -tinyMCELang['lang_insert_link_popup_position'] = 'موقعیت (X/Y)'; -tinyMCELang['lang_insert_link_popup_missingtarget'] = 'لطفا یک نام برای مقصد انتخاب کنید در غیر این صورت گزینه دیگری را انتخاب نمایید.'; diff --git a/public/tiny_mce/plugins/advlink/langs/fr.js b/public/tiny_mce/plugins/advlink/langs/fr.js deleted file mode 100644 index b0ddca8..0000000 --- a/public/tiny_mce/plugins/advlink/langs/fr.js +++ /dev/null @@ -1,20 +0,0 @@ -// French lang variables by Laurent Dran - -tinyMCELang['lang_insert_link_target_same'] = 'Ouvre dans la fenętre / Cadre(frame)'; -tinyMCELang['lang_insert_link_target_parent'] = 'Ouvre dans fenętre parente / Cadres(frame)'; -tinyMCELang['lang_insert_link_target_top'] = 'Ouvre dans le Top frame (remplace toutes les cadres(frames))'; -tinyMCELang['lang_insert_link_target_blank'] = 'Ouvre dans la fenętre'; -tinyMCELang['lang_insert_link_target_named'] = 'Ouvre dans la fenętre'; -tinyMCELang['lang_insert_link_popup'] = 'JS-Popup'; -tinyMCELang['lang_insert_link_popup_url'] = 'URL de la Popup'; -tinyMCELang['lang_insert_link_popup_name'] = 'Nom de la fenętre'; -tinyMCELang['lang_insert_link_popup_return'] = 'Insert \'return false\''; -tinyMCELang['lang_insert_link_popup_scrollbars'] = 'Montrer la barre de défilement '; -tinyMCELang['lang_insert_link_popup_statusbar'] = 'Montrer la barre d\'état'; -tinyMCELang['lang_insert_link_popup_toolbar'] = 'Montrer la barre d\'outils'; -tinyMCELang['lang_insert_link_popup_menubar'] = 'Montrer la barre du menu'; -tinyMCELang['lang_insert_link_popup_location'] = 'Montre la barre d\'adresse'; -tinyMCELang['lang_insert_link_popup_resizable'] = 'Fabriquer une fenętre redimensionnable'; -tinyMCELang['lang_insert_link_popup_size'] = 'Taille'; -tinyMCELang['lang_insert_link_popup_position'] = 'Position (X/Y)'; -tinyMCELang['lang_insert_link_popup_missingtarget'] = 'Veuillez insérer un nom pour la cible ou choisissez une autre option.'; diff --git a/public/tiny_mce/plugins/advlink/langs/fr_ca.js b/public/tiny_mce/plugins/advlink/langs/fr_ca.js deleted file mode 100644 index b40dfbc..0000000 --- a/public/tiny_mce/plugins/advlink/langs/fr_ca.js +++ /dev/null @@ -1,20 +0,0 @@ -// CA_FR lang variables - -tinyMCELang['lang_insert_link_target_same'] = 'Ouvrir dans la mme fentre'; -tinyMCELang['lang_insert_link_target_parent'] = 'Ouvrir dans la fentre parent'; -tinyMCELang['lang_insert_link_target_top'] = 'Ouvrir dans le cadre suprieur'; -tinyMCELang['lang_insert_link_target_blank'] = 'Ouvrir dans une nouvelle fentre'; -tinyMCELang['lang_insert_link_target_named'] = 'Ouvrir la destination'; -tinyMCELang['lang_insert_link_popup'] = 'JS-Popup'; -tinyMCELang['lang_insert_link_popup_url'] = 'URL du popup'; -tinyMCELang['lang_insert_link_popup_name'] = 'Nom de la fentre'; -tinyMCELang['lang_insert_link_popup_return'] = 'Insrer le script \'return false\''; -tinyMCELang['lang_insert_link_popup_scrollbars'] = 'Barres de dfilement'; -tinyMCELang['lang_insert_link_popup_statusbar'] = 'Barre de statut'; -tinyMCELang['lang_insert_link_popup_toolbar'] = 'Barres d\'outils'; -tinyMCELang['lang_insert_link_popup_menubar'] = 'Barre de menu'; -tinyMCELang['lang_insert_link_popup_location'] = 'Barre d\'adresse'; -tinyMCELang['lang_insert_link_popup_resizable'] = 'Fentre redimensionnable'; -tinyMCELang['lang_insert_link_popup_size'] = 'Dimensions'; -tinyMCELang['lang_insert_link_popup_position'] = 'Position (X/Y)'; -tinyMCELang['lang_insert_link_popup_missingtarget'] = 'S.v.p., entrer un nom de destination ou choisir une autre option.'; diff --git a/public/tiny_mce/plugins/advlink/langs/ko.js b/public/tiny_mce/plugins/advlink/langs/ko.js deleted file mode 100644 index 06a34eb..0000000 --- a/public/tiny_mce/plugins/advlink/langs/ko.js +++ /dev/null @@ -1,19 +0,0 @@ -// KO lang variables - -tinyMCELang['lang_insert_link_target_same'] = ' â ũ/ '; -tinyMCELang['lang_insert_link_target_parent'] = 'θ â ũ/ '; -tinyMCELang['lang_insert_link_target_top'] = 'TOP ӿ ( ü)'; -tinyMCELang['lang_insert_link_target_blank'] = ' â '; -tinyMCELang['lang_insert_link_target_named'] = ' â '; -tinyMCELang['lang_insert_link_popup'] = 'JS-Popup'; -tinyMCELang['lang_insert_link_popup_url'] = '˾ URL'; -tinyMCELang['lang_insert_link_popup_name'] = 'â ̸'; -tinyMCELang['lang_insert_link_popup_return'] = '\'return false\' ֱ'; -tinyMCELang['lang_insert_link_popup_scrollbars'] = 'ũѹٸ '; -tinyMCELang['lang_insert_link_popup_statusbar'] = 'â '; -tinyMCELang['lang_insert_link_popup_toolbar'] = 'ٸ '; -tinyMCELang['lang_insert_link_popup_menubar'] = '޴ٸ '; -tinyMCELang['lang_insert_link_popup_location'] = 'ġ ǥ '; -tinyMCELang['lang_insert_link_popup_resizable'] = 'ũ '; -tinyMCELang['lang_insert_link_popup_size'] = 'ũ'; -tinyMCELang['lang_insert_link_popup_position'] = 'ġ (X/Y)'; diff --git a/public/tiny_mce/plugins/advlink/langs/pl.js b/public/tiny_mce/plugins/advlink/langs/pl.js deleted file mode 100644 index d801bcb..0000000 --- a/public/tiny_mce/plugins/advlink/langs/pl.js +++ /dev/null @@ -1,23 +0,0 @@ -// PL lang variables - -tinyMCELang['lang_insert_link_target_same'] = 'Otwórz w tym samym oknie'; -tinyMCELang['lang_insert_link_target_parent'] = 'Open in parent window / frame'; -tinyMCELang['lang_insert_link_target_top'] = 'Open in top frame (replaces all frames)'; -tinyMCELang['lang_insert_link_target_blank'] = 'Otwórz w nowym oknie'; -tinyMCELang['lang_insert_link_target_named'] = 'Open in the window'; -tinyMCELang['lang_insert_link_popup'] = 'JS-Popup'; -tinyMCELang['lang_insert_link_popup_url'] = 'Popup URL'; -tinyMCELang['lang_insert_link_popup_name'] = 'Window name'; -tinyMCELang['lang_insert_link_popup_return'] = 'insert \'return false\''; -tinyMCELang['lang_insert_link_popup_scrollbars'] = 'Show scrollbars'; -tinyMCELang['lang_insert_link_popup_statusbar'] = 'Show statusbar'; -tinyMCELang['lang_insert_link_popup_toolbar'] = 'Show toolbars'; -tinyMCELang['lang_insert_link_popup_menubar'] = 'Show menubar'; -tinyMCELang['lang_insert_link_popup_location'] = 'Show locationbar'; -tinyMCELang['lang_insert_link_popup_resizable'] = 'Make window resizable'; -tinyMCELang['lang_insert_link_popup_size'] = 'Size'; -tinyMCELang['lang_insert_link_popup_position'] = 'Position (X/Y)'; -tinyMCELang['lang_insert_link_popup_missingtarget'] = 'Please insert a name for the target or choose another option.'; -tinyMCELang['lang_insert_link_url'] = 'Adres URL'; -tinyMCELang['lang_insert_link_target'] = 'Cel'; - diff --git a/public/tiny_mce/plugins/advlink/langs/pt_br.js b/public/tiny_mce/plugins/advlink/langs/pt_br.js deleted file mode 100644 index 7cf01e0..0000000 --- a/public/tiny_mce/plugins/advlink/langs/pt_br.js +++ /dev/null @@ -1,20 +0,0 @@ -// pt_BR lang variables - -tinyMCELang['lang_insert_link_target_same'] = 'Abrir nesta mesma janela / frame'; -tinyMCELang['lang_insert_link_target_parent'] = 'Abrir na janela / frame prvia'; -tinyMCELang['lang_insert_link_target_top'] = 'Abrir no frame superior (substitui todos os frames)'; -tinyMCELang['lang_insert_link_target_blank'] = 'Abrir em nova janela'; -tinyMCELang['lang_insert_link_target_named'] = 'Abrir na janela'; -tinyMCELang['lang_insert_link_popup'] = 'JS-Popup'; -tinyMCELang['lang_insert_link_popup_url'] = 'Popup URL endereo'; -tinyMCELang['lang_insert_link_popup_name'] = 'Nome da janela'; -tinyMCELang['lang_insert_link_popup_return'] = 'inserir \'retorna falso\''; -tinyMCELang['lang_insert_link_popup_scrollbars'] = 'Mostra barras de rolagem'; -tinyMCELang['lang_insert_link_popup_statusbar'] = 'Mostra barra de status'; -tinyMCELang['lang_insert_link_popup_toolbar'] = 'Mostra barras de ferramentas'; -tinyMCELang['lang_insert_link_popup_menubar'] = 'Mostra barra de menu'; -tinyMCELang['lang_insert_link_popup_location'] = 'Mostra barra de endereo'; -tinyMCELang['lang_insert_link_popup_resizable'] = 'Permite redimensionamento da janela'; -tinyMCELang['lang_insert_link_popup_size'] = 'Tamanho'; -tinyMCELang['lang_insert_link_popup_position'] = 'Posio (X/Y)'; -tinyMCELang['lang_insert_link_popup_missingtarget'] = 'Por Favor insira um nome para o alvo ou escolha outra opo.'; diff --git a/public/tiny_mce/plugins/advlink/langs/sv.js b/public/tiny_mce/plugins/advlink/langs/sv.js deleted file mode 100644 index d029a1c..0000000 --- a/public/tiny_mce/plugins/advlink/langs/sv.js +++ /dev/null @@ -1,20 +0,0 @@ -// SE lang variables - -tinyMCELang['lang_insert_link_target_same'] = 'Öppna i samma fönster / ram'; -tinyMCELang['lang_insert_link_target_parent'] = 'Öppna i underliggande fönster / ram'; -tinyMCELang['lang_insert_link_target_top'] = 'Öppna i toppramen (ersätter alla ramar)'; -tinyMCELang['lang_insert_link_target_blank'] = 'Öppna i ett nytt fönster'; -tinyMCELang['lang_insert_link_target_named'] = 'Öppna i ett specifikt fönster'; -tinyMCELang['lang_insert_link_popup'] = 'JS-Popup'; -tinyMCELang['lang_insert_link_popup_url'] = 'Popup URL'; -tinyMCELang['lang_insert_link_popup_name'] = 'Fönstrets namn'; -tinyMCELang['lang_insert_link_popup_return'] = 'Sätt in \'return false\''; -tinyMCELang['lang_insert_link_popup_scrollbars'] = 'Visa scrollbars'; -tinyMCELang['lang_insert_link_popup_statusbar'] = 'Visa statusbar'; -tinyMCELang['lang_insert_link_popup_toolbar'] = 'Visa toolbars'; -tinyMCELang['lang_insert_link_popup_menubar'] = 'Visa menubar'; -tinyMCELang['lang_insert_link_popup_location'] = 'Visa locationbar'; -tinyMCELang['lang_insert_link_popup_resizable'] = 'Gör fönstret skalbart'; -tinyMCELang['lang_insert_link_popup_size'] = 'Storlek'; -tinyMCELang['lang_insert_link_popup_position'] = 'Position (X/Y)'; -tinyMCELang['lang_insert_link_popup_missingtarget'] = 'Var god skriv ett namn fr fnstret eller vlj ett annat val.'; diff --git a/public/tiny_mce/plugins/advlink/langs/zh_cn.js b/public/tiny_mce/plugins/advlink/langs/zh_cn.js deleted file mode 100644 index 4cb524b..0000000 --- a/public/tiny_mce/plugins/advlink/langs/zh_cn.js +++ /dev/null @@ -1,21 +0,0 @@ -// Simplified Chinese lang variables contributed by cube316 (cube316@gmail.com) -// http://www.cube316.net/ ԻȡTinyMCE֧ - -tinyMCELang['lang_insert_link_target_same'] = 'ڱ/д'; -tinyMCELang['lang_insert_link_target_parent'] = 'ڸ/д'; -tinyMCELang['lang_insert_link_target_top'] = 'ڸд򿪣滻пܣ'; -tinyMCELang['lang_insert_link_target_blank'] = '´д'; -tinyMCELang['lang_insert_link_target_named'] = 'ڴ˴д'; -tinyMCELang['lang_insert_link_popup'] = 'JavaScript'; -tinyMCELang['lang_insert_link_popup_url'] = 'ڵַ'; -tinyMCELang['lang_insert_link_popup_name'] = ''; -tinyMCELang['lang_insert_link_popup_return'] = ' \'return false\''; -tinyMCELang['lang_insert_link_popup_scrollbars'] = 'ʾ'; -tinyMCELang['lang_insert_link_popup_statusbar'] = 'ʾ״̬'; -tinyMCELang['lang_insert_link_popup_toolbar'] = 'ʾ'; -tinyMCELang['lang_insert_link_popup_menubar'] = 'ʾ˵'; -tinyMCELang['lang_insert_link_popup_location'] = 'ʾַ'; -tinyMCELang['lang_insert_link_popup_resizable'] = 'ض崰ڴС'; -tinyMCELang['lang_insert_link_popup_size'] = 'ߴ'; -tinyMCELang['lang_insert_link_popup_position'] = 'λ(X/Y)'; -tinyMCELang['lang_insert_link_popup_missingtarget'] = 'Ŀƻѡѡ'; diff --git a/public/tiny_mce/plugins/advlink/link.htm b/public/tiny_mce/plugins/advlink/link.htm deleted file mode 100644 index d04b1d9..0000000 --- a/public/tiny_mce/plugins/advlink/link.htm +++ /dev/null @@ -1,444 +0,0 @@ - - -{$lang_insert_link_title} - - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
{$lang_insert_link_title}
{$lang_insert_link_url}: - - - - -
{$lang_theme_insert_link_titlefield}:
{$lang_insert_link_target}: - - - - - - - - - - - - - - - - - - - - - -
 ({$lang_insert_link_target_same})
 ({$lang_insert_link_target_parent})
 ({$lang_insert_link_target_top})
 ({$lang_insert_link_target_blank})
- - - - - - -
 
-
- - - - - - - - - - - - - - - - - -
{$lang_insert_link_popup_url}:  - - - - -
{$lang_insert_link_popup_name}: 
{$lang_insert_link_popup_size}:  - x - px -
{$lang_insert_link_popup_position}:  - / - (c /c = center) -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  
 
   
 
-
-
- - diff --git a/public/tiny_mce/plugins/advlink/readme.txt b/public/tiny_mce/plugins/advlink/readme.txt deleted file mode 100644 index 6e9ac10..0000000 --- a/public/tiny_mce/plugins/advlink/readme.txt +++ /dev/null @@ -1,19 +0,0 @@ - Advlink plugin for TinyMCE ------------------------------ - -About: - This is a more advanced link dialog mostly based on code contributed by Michael Keck. - This one supports popup windows and targets. - -Installation instructions: - * Copy the advlink directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins). - * Add plugin to TinyMCE plugin option list example: plugins : "advlink". - * Add this "a[name|href|target|title|onclick]" to extended_valid_elements option. - -Initialization example: - tinyMCE.init({ - theme : "advanced", - mode : "textareas", - plugins : "advlink", - extended_valid_elements : "a[name|href|target|title|onclick]" - }); diff --git a/public/tiny_mce/plugins/contextmenu/contextmenu.css b/public/tiny_mce/plugins/contextmenu/contextmenu.css deleted file mode 100644 index 58bb337..0000000 --- a/public/tiny_mce/plugins/contextmenu/contextmenu.css +++ /dev/null @@ -1,60 +0,0 @@ -.contextMenuIEPopup { - padding: 0px; - margin: 0px; - border: 0px; - overflow: hidden; -} - -.contextMenu { - position: absolute; - cursor: default; - z-index: 1000; - border: 1px solid #D4D0C8; - background-color: #FFFFFF; -} - -.contextMenuItem, .contextMenuItemOver { -} - -.contextMenuItemOver { - background-color: #B6BDD2; -} - -.contextMenuSeparator { - width: 100%; - background-color: #D4D0C8; - border: 0px; -} - -.contextMenuImage, .contextMenuItemDisabled { - border: 0px; -} - -.contextMenuIcon { - background-color: #F0F0EE; -} - -.contextMenuItemOver .contextMenuIcon { - background-color: #B6BDD2; -} - -.contextMenuIcon { - background-color: #F0F0EE; -} - -.contextMenuItemDisabled img { - filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); - -moz-opacity:0.3; - opacity: 0.3; -} - -.contextMenuText { - font-family: Tahoma, Verdana, Arial, Helvetica; - font-size: 11px; - margin-left: 5px; - margin-right: 10px; -} - -.contextMenuItemDisabled { - color: #AAAAAA; -} diff --git a/public/tiny_mce/plugins/contextmenu/editor_plugin.js b/public/tiny_mce/plugins/contextmenu/editor_plugin.js deleted file mode 100644 index 899ad2b..0000000 --- a/public/tiny_mce/plugins/contextmenu/editor_plugin.js +++ /dev/null @@ -1,2 +0,0 @@ -/* Import plugin specific language pack */ - if(!tinyMCE.settings['contextmenu_skip_plugin_css'])tinyMCE.loadCSS(tinyMCE.baseURL+"/plugins/contextmenu/contextmenu.css");var TinyMCE_contextmenu_contextMenu=null;function TinyMCE_contextmenu_initInstance(inst){if(tinyMCE.isMSIE5_0)return;tinyMCE.addEvent(inst.getDoc(),"click",TinyMCE_contextmenu_hideContextMenu);tinyMCE.addEvent(inst.getDoc(),"keypress",TinyMCE_contextmenu_hideContextMenu);tinyMCE.addEvent(inst.getDoc(),"keydown",TinyMCE_contextmenu_hideContextMenu);tinyMCE.addEvent(document,"click",TinyMCE_contextmenu_hideContextMenu);tinyMCE.addEvent(document,"keypress",TinyMCE_contextmenu_hideContextMenu);tinyMCE.addEvent(document,"keydown",TinyMCE_contextmenu_hideContextMenu);var contextMenu=new ContextMenu({commandhandler:"TinyMCE_contextmenu_commandHandler",spacer_image:tinyMCE.baseURL+"/plugins/contextmenu/images/spacer.gif"});TinyMCE_contextmenu_contextMenu=contextMenu;if(tinyMCE.isGecko){tinyMCE.addEvent(inst.getDoc(),"contextmenu",function(e){TinyMCE_contextmenu_showContextMenu(tinyMCE.isMSIE?inst.contentWindow.event:e,inst);});}else tinyMCE.addEvent(inst.getDoc(),"contextmenu",TinyMCE_contextmenu_onContextMenu);}function TinyMCE_contextmenu_onContextMenu(e){var elm=tinyMCE.isMSIE?e.srcElement:e.target;var targetInst,body;if((body=tinyMCE.getParentElement(elm,"body"))!=null){for(var n in tinyMCE.instances){var inst=tinyMCE.instances[n];if(body==inst.getBody()){targetInst=inst;break;}}return TinyMCE_contextmenu_showContextMenu(tinyMCE.isMSIE?targetInst.contentWindow.event:e,targetInst);}}function TinyMCE_contextmenu_showContextMenu(e,inst){function getAttrib(elm,name){return elm.getAttribute(name)?elm.getAttribute(name):"";}var x,y,elm,contextMenu;var pos=tinyMCE.getAbsPosition(inst.iframeElement);x=tinyMCE.isMSIE?e.screenX:pos.absLeft+(e.pageX-inst.getBody().scrollLeft);y=tinyMCE.isMSIE?e.screenY:pos.absTop+(e.pageY-inst.getBody().scrollTop);elm=tinyMCE.isMSIE?e.srcElement:e.target;contextMenu=TinyMCE_contextmenu_contextMenu;contextMenu.inst=inst;window.setTimeout(function(){var theme=tinyMCE.getParam("theme");contextMenu.clearAll();var sel=inst.getSelectedText().length!=0||elm.nodeName=="IMG";contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/cut.gif","$lang_cut_desc","Cut","",!sel);contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/copy.gif","$lang_copy_desc","Copy","",!sel);contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/paste.gif","$lang_paste_desc","Paste","",false);elm=tinyMCE.getParentElement(elm,"img,table,td");if(elm){switch(elm.nodeName){case "IMG":contextMenu.addSeparator();if(tinyMCE.getAttrib(elm,'name','').indexOf('mce_plugin_flash')==0)contextMenu.addItem(tinyMCE.baseURL+"/plugins/flash/images/flash.gif","$lang_flash_props","mceFlash");else contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/image.gif","$lang_image_props_desc","mceImage");break;case "TABLE":case "TD":if(typeof(TinyMCE_table_getControlHTML)!="undefined"){var colspan=(elm.nodeName=="TABLE")?"":getAttrib(elm,"colspan");var rowspan=(elm.nodeName=="TABLE")?"":getAttrib(elm,"rowspan");colspan=colspan==""?"1":colspan;rowspan=rowspan==""?"1":rowspan;contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/cut.gif","$lang_table_cut_row_desc","mceTableCutRow");contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/copy.gif","$lang_table_copy_row_desc","mceTableCopyRow");contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/paste.gif","$lang_table_paste_row_before_desc","mceTablePasteRowBefore","",inst.tableRowClipboard==null);contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/paste.gif","$lang_table_paste_row_after_desc","mceTablePasteRowAfter","",inst.tableRowClipboard==null);contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table.gif","$lang_table_insert_desc","mceInsertTable","insert");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table.gif","$lang_table_props_desc","mceInsertTable");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_cell_props.gif","$lang_table_cell_desc","mceTableCellProps");contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_row_props.gif","$lang_table_row_desc","mceTableRowProps");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_insert_row_before.gif","$lang_table_insert_row_before_desc","mceTableInsertRowBefore");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_insert_row_after.gif","$lang_table_insert_row_after_desc","mceTableInsertRowAfter");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_delete_row.gif","$lang_table_delete_row_desc","mceTableDeleteRow");contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_insert_col_before.gif","$lang_table_insert_col_before_desc","mceTableInsertColBefore");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_insert_col_after.gif","$lang_table_insert_col_after_desc","mceTableInsertColAfter");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_delete_col.gif","$lang_table_delete_col_desc","mceTableDeleteCol");contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_split_cells.gif","$lang_table_split_cells_desc","mceTableSplitCells","",(colspan=="1"&&rowspan=="1"));contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_merge_cells.gif","$lang_table_merge_cells_desc","mceTableMergeCells","",false);}break;}}contextMenu.show(x,y);},10);tinyMCE.cancelEvent(e);return false;}function TinyMCE_contextmenu_hideContextMenu(){TinyMCE_contextmenu_contextMenu.hide();return true;}function TinyMCE_contextmenu_commandHandler(command,value){TinyMCE_contextmenu_contextMenu.hide();var ui=false;if(command=="mceInsertTable"||command=="mceTableCellProps"||command=="mceTableRowProps"||command=="mceTableMergeCells")ui=true;TinyMCE_contextmenu_contextMenu.inst.execCommand(command,ui,value);}function ContextMenu(settings){function defParam(key,def_val){settings[key]=typeof(settings[key])!="undefined"?settings[key]:def_val;}var self=this;this.isMSIE=(navigator.appName=="Microsoft Internet Explorer");this.contextMenuDiv=document.createElement("div");this.contextMenuDiv.className="contextMenu";this.contextMenuDiv.setAttribute("class","contextMenu");this.contextMenuDiv.style.display="none";this.contextMenuDiv.style.position='absolute';this.contextMenuDiv.style.zindex=1000;this.contextMenuDiv.style.left='0px';this.contextMenuDiv.style.top='0px';this.contextMenuDiv.unselectable="on";document.body.appendChild(this.contextMenuDiv);defParam("commandhandler","");defParam("spacer_image","images/spacer.gif");this.items=new Array();this.settings=settings;this.html="";if(tinyMCE.isMSIE&&!tinyMCE.isMSIE5_0){this.pop=window.createPopup();doc=this.pop.document;doc.open();doc.write('');doc.close();}};ContextMenu.prototype.clearAll=function(){this.html="";this.contextMenuDiv.innerHTML="";};ContextMenu.prototype.addSeparator=function(){this.html+='';};ContextMenu.prototype.addItem=function(icon,title,command,value,disabled){if(title.charAt(0)=='$')title=tinyMCE.getLang(title.substring(1));var onMouseDown='';var html='';if(tinyMCE.isMSIE&&!tinyMCE.isMSIE5_0)onMouseDown='contextMenu.execCommand(\''+command+'\', \''+value+'\');return false;';else onMouseDown=this.settings['commandhandler']+'(\''+command+'\', \''+value+'\');return false;';if(icon=="")icon=this.settings['spacer_image'];if(!disabled)html+='';else html+='';html+='';html+='
';html+=title;html+='
';html+='';this.html+=html;};ContextMenu.prototype.show=function(x,y){if(this.html=="")return;var html='';html+='';html+=this.html;html+='
';this.contextMenuDiv.innerHTML=html;if(tinyMCE.isMSIE&&!tinyMCE.isMSIE5_0){var width,height;this.contextMenuDiv.style.display="block";width=this.contextMenuDiv.offsetWidth;height=this.contextMenuDiv.offsetHeight;this.contextMenuDiv.style.display="none";this.pop.document.body.innerHTML='
'+html+"
";this.pop.document.tinyMCE=tinyMCE;this.pop.document.contextMenu=this;this.pop.show(x,y,width,height);}else{this.contextMenuDiv.style.left=x+'px';this.contextMenuDiv.style.top=y+'px';this.contextMenuDiv.style.display="block";}};ContextMenu.prototype.hide=function(){if(tinyMCE.isMSIE&&!tinyMCE.isMSIE5_0)this.pop.hide();else this.contextMenuDiv.style.display="none";};ContextMenu.prototype.execCommand=function(command,value){eval(this.settings['commandhandler']+"(command, value);");}; \ No newline at end of file diff --git a/public/tiny_mce/plugins/contextmenu/editor_plugin_src.js b/public/tiny_mce/plugins/contextmenu/editor_plugin_src.js deleted file mode 100644 index 2f07c64..0000000 --- a/public/tiny_mce/plugins/contextmenu/editor_plugin_src.js +++ /dev/null @@ -1,289 +0,0 @@ -/* Import plugin specific language pack */ -//tinyMCE.importPluginLanguagePack('contextmenu', 'en,zh_cn,cs,fa,fr_ca,fr,de'); -if (!tinyMCE.settings['contextmenu_skip_plugin_css']) - tinyMCE.loadCSS(tinyMCE.baseURL + "/plugins/contextmenu/contextmenu.css"); - -// Global contextmenu class instance -var TinyMCE_contextmenu_contextMenu = null; - -function TinyMCE_contextmenu_initInstance(inst) { - // Is not working on MSIE 5.0 - if (tinyMCE.isMSIE5_0) - return; - - // Add hide event handles - tinyMCE.addEvent(inst.getDoc(), "click", TinyMCE_contextmenu_hideContextMenu); - tinyMCE.addEvent(inst.getDoc(), "keypress", TinyMCE_contextmenu_hideContextMenu); - tinyMCE.addEvent(inst.getDoc(), "keydown", TinyMCE_contextmenu_hideContextMenu); - tinyMCE.addEvent(document, "click", TinyMCE_contextmenu_hideContextMenu); - tinyMCE.addEvent(document, "keypress", TinyMCE_contextmenu_hideContextMenu); - tinyMCE.addEvent(document, "keydown", TinyMCE_contextmenu_hideContextMenu); - - var contextMenu = new ContextMenu({ - commandhandler : "TinyMCE_contextmenu_commandHandler", - spacer_image : tinyMCE.baseURL + "/plugins/contextmenu/images/spacer.gif" - }); - - // Register global reference - TinyMCE_contextmenu_contextMenu = contextMenu; - - // Attach contextmenu event - if (tinyMCE.isGecko) { - tinyMCE.addEvent(inst.getDoc(), "contextmenu", function(e) {TinyMCE_contextmenu_showContextMenu(tinyMCE.isMSIE ? inst.contentWindow.event : e, inst);}); - } else - tinyMCE.addEvent(inst.getDoc(), "contextmenu", TinyMCE_contextmenu_onContextMenu); -} - -function TinyMCE_contextmenu_onContextMenu(e) { - var elm = tinyMCE.isMSIE ? e.srcElement : e.target; - var targetInst, body; - - // Find instance - if ((body = tinyMCE.getParentElement(elm, "body")) != null) { - for (var n in tinyMCE.instances) { - var inst = tinyMCE.instances[n]; - - if (body == inst.getBody()) { - targetInst = inst; - break; - } - } - - return TinyMCE_contextmenu_showContextMenu(tinyMCE.isMSIE ? targetInst.contentWindow.event : e, targetInst); - } -} - -function TinyMCE_contextmenu_showContextMenu(e, inst) { - function getAttrib(elm, name) { - return elm.getAttribute(name) ? elm.getAttribute(name) : ""; - } - - var x, y, elm, contextMenu; - var pos = tinyMCE.getAbsPosition(inst.iframeElement); - - x = tinyMCE.isMSIE ? e.screenX : pos.absLeft + (e.pageX - inst.getBody().scrollLeft); - y = tinyMCE.isMSIE ? e.screenY : pos.absTop + (e.pageY - inst.getBody().scrollTop); - elm = tinyMCE.isMSIE ? e.srcElement : e.target; - contextMenu = TinyMCE_contextmenu_contextMenu; - contextMenu.inst = inst; - - // Mozilla needs some time - window.setTimeout(function () { - var theme = tinyMCE.getParam("theme"); - - contextMenu.clearAll(); - var sel = inst.getSelectedText().length != 0 || elm.nodeName == "IMG"; - - // Default items - contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/cut.gif", "$lang_cut_desc", "Cut", "", !sel); - contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/copy.gif", "$lang_copy_desc", "Copy", "", !sel); - contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/paste.gif", "$lang_paste_desc", "Paste", "", false); - - // Get element - elm = tinyMCE.getParentElement(elm, "img,table,td"); - if (elm) { - switch (elm.nodeName) { - case "IMG": - contextMenu.addSeparator(); - - // If flash - if (tinyMCE.getAttrib(elm, 'name', '').indexOf('mce_plugin_flash') == 0) - contextMenu.addItem(tinyMCE.baseURL + "/plugins/flash/images/flash.gif", "$lang_flash_props", "mceFlash"); - else - contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/image.gif", "$lang_image_props_desc", "mceImage"); - break; - - case "TABLE": - case "TD": - // Is table plugin loaded - if (typeof(TinyMCE_table_getControlHTML) != "undefined") { - var colspan = (elm.nodeName == "TABLE") ? "" : getAttrib(elm, "colspan"); - var rowspan = (elm.nodeName == "TABLE") ? "" : getAttrib(elm, "rowspan"); - - colspan = colspan == "" ? "1" : colspan; - rowspan = rowspan == "" ? "1" : rowspan; - - contextMenu.addSeparator(); - contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/cut.gif", "$lang_table_cut_row_desc", "mceTableCutRow"); - contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/copy.gif", "$lang_table_copy_row_desc", "mceTableCopyRow"); - contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/paste.gif", "$lang_table_paste_row_before_desc", "mceTablePasteRowBefore", "", inst.tableRowClipboard == null); - contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/paste.gif", "$lang_table_paste_row_after_desc", "mceTablePasteRowAfter", "", inst.tableRowClipboard == null); - -/* contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/left.gif", "$lang_justifyleft_desc", "JustifyLeft", "", false); - contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/center.gif", "$lang_justifycenter_desc", "JustifyCenter", "", false); - contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/right.gif", "$lang_justifyright_desc", "JustifyRight", "", false); - contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/full.gif", "$lang_justifyfull_desc", "JustifyFull", "", false);*/ - contextMenu.addSeparator(); - contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table.gif", "$lang_table_insert_desc", "mceInsertTable", "insert"); - contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table.gif", "$lang_table_props_desc", "mceInsertTable"); - contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_cell_props.gif", "$lang_table_cell_desc", "mceTableCellProps"); - contextMenu.addSeparator(); - contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_row_props.gif", "$lang_table_row_desc", "mceTableRowProps"); - contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_row_before.gif", "$lang_table_insert_row_before_desc", "mceTableInsertRowBefore"); - contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_row_after.gif", "$lang_table_insert_row_after_desc", "mceTableInsertRowAfter"); - contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_delete_row.gif", "$lang_table_delete_row_desc", "mceTableDeleteRow"); - contextMenu.addSeparator(); - contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_col_before.gif", "$lang_table_insert_col_before_desc", "mceTableInsertColBefore"); - contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_col_after.gif", "$lang_table_insert_col_after_desc", "mceTableInsertColAfter"); - contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_delete_col.gif", "$lang_table_delete_col_desc", "mceTableDeleteCol"); - contextMenu.addSeparator(); - contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_split_cells.gif", "$lang_table_split_cells_desc", "mceTableSplitCells", "", (colspan == "1" && rowspan == "1")); - contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_merge_cells.gif", "$lang_table_merge_cells_desc", "mceTableMergeCells", "", false); - } - break; - } - } - - contextMenu.show(x, y); - }, 10); - - // Cancel default handeling - tinyMCE.cancelEvent(e); - return false; -} - -function TinyMCE_contextmenu_hideContextMenu() { - TinyMCE_contextmenu_contextMenu.hide(); - - return true; -} - -function TinyMCE_contextmenu_commandHandler(command, value) { - TinyMCE_contextmenu_contextMenu.hide(); - - // UI must be true on these - var ui = false; - if (command == "mceInsertTable" || command == "mceTableCellProps" || command == "mceTableRowProps" || command == "mceTableMergeCells") - ui = true; - - TinyMCE_contextmenu_contextMenu.inst.execCommand(command, ui, value); -} - -// Context menu class - -function ContextMenu(settings) { - // Default value function - function defParam(key, def_val) { - settings[key] = typeof(settings[key]) != "undefined" ? settings[key] : def_val; - } - - var self = this; - - this.isMSIE = (navigator.appName == "Microsoft Internet Explorer"); - - // Setup contextmenu div - this.contextMenuDiv = document.createElement("div"); - this.contextMenuDiv.className = "contextMenu"; - this.contextMenuDiv.setAttribute("class", "contextMenu"); - this.contextMenuDiv.style.display = "none"; - this.contextMenuDiv.style.position = 'absolute'; - this.contextMenuDiv.style.zindex = 1000; - this.contextMenuDiv.style.left = '0px'; - this.contextMenuDiv.style.top = '0px'; - this.contextMenuDiv.unselectable = "on"; - - document.body.appendChild(this.contextMenuDiv); - - // Setup default values - defParam("commandhandler", ""); - defParam("spacer_image", "images/spacer.gif"); - - this.items = new Array(); - this.settings = settings; - this.html = ""; - - // IE Popup - if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0) { - this.pop = window.createPopup(); - doc = this.pop.document; - doc.open(); - doc.write(''); - doc.close(); - } -}; - -ContextMenu.prototype.clearAll = function() { - this.html = ""; - this.contextMenuDiv.innerHTML = ""; -}; - -ContextMenu.prototype.addSeparator = function() { - this.html += ''; -}; - -ContextMenu.prototype.addItem = function(icon, title, command, value, disabled) { - if (title.charAt(0) == '$') - title = tinyMCE.getLang(title.substring(1)); - - var onMouseDown = ''; - var html = ''; - - if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0) - onMouseDown = 'contextMenu.execCommand(\'' + command + '\', \'' + value + '\');return false;'; - else - onMouseDown = this.settings['commandhandler'] + '(\'' + command + '\', \'' + value + '\');return false;'; - - if (icon == "") - icon = this.settings['spacer_image']; - - if (!disabled) - html += ''; - else - html += ''; - - html += ''; - html += '
'; - - // Add text - html += title; - - html += '
'; - html += ''; - - // Add to main - this.html += html; -}; - -ContextMenu.prototype.show = function(x, y) { - if (this.html == "") - return; - - var html = ''; - - html += ''; - html += this.html; - html += '
'; - - this.contextMenuDiv.innerHTML = html; - - if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0) { - var width, height; - - // Get dimensions - this.contextMenuDiv.style.display = "block"; - width = this.contextMenuDiv.offsetWidth; - height = this.contextMenuDiv.offsetHeight; - this.contextMenuDiv.style.display = "none"; - - // Setup popup and show - this.pop.document.body.innerHTML = '
' + html + "
"; - this.pop.document.tinyMCE = tinyMCE; - this.pop.document.contextMenu = this; - this.pop.show(x, y, width, height); - } else { - this.contextMenuDiv.style.left = x + 'px'; - this.contextMenuDiv.style.top = y + 'px'; - this.contextMenuDiv.style.display = "block"; - } -}; - -ContextMenu.prototype.hide = function() { - if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0) - this.pop.hide(); - else - this.contextMenuDiv.style.display = "none"; -}; - -ContextMenu.prototype.execCommand = function(command, value) { - eval(this.settings['commandhandler'] + "(command, value);"); -}; diff --git a/public/tiny_mce/plugins/contextmenu/images/spacer.gif b/public/tiny_mce/plugins/contextmenu/images/spacer.gif deleted file mode 100644 index fc2560981ee1caca400e225e48d282106f907f2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43 wcmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE7Df>U1_m7l1_lO@3';case "rtl":return '';}return "";}function TinyMCE_directionality_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceDirectionLTR":var inst=tinyMCE.getInstanceById(editor_id);var elm=tinyMCE.getParentElement(inst.getFocusElement(),"p,div,td,h1,h2,h3,h4,h5,h6,pre,address");if(elm)elm.setAttribute("dir","ltr");tinyMCE.triggerNodeChange(false);return true;case "mceDirectionRTL":var inst=tinyMCE.getInstanceById(editor_id);var elm=tinyMCE.getParentElement(inst.getFocusElement(),"p,div,td,h1,h2,h3,h4,h5,h6,pre,address");if(elm)elm.setAttribute("dir","rtl");tinyMCE.triggerNodeChange(false);return true;}return false;}function TinyMCE_directionality_handleNodeChange(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){function getAttrib(elm,name){return elm.getAttribute(name)?elm.getAttribute(name):"";}tinyMCE.switchClassSticky(editor_id+'_ltr','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_rtl','mceButtonNormal');if(node==null)return;var elm=tinyMCE.getParentElement(node,"p,div,td,h1,h2,h3,h4,h5,h6,pre,address");if(!elm)return;var dir=getAttrib(elm,"dir");if(dir=="ltr"||dir=="")tinyMCE.switchClassSticky(editor_id+'_ltr','mceButtonSelected');else tinyMCE.switchClassSticky(editor_id+'_rtl','mceButtonSelected');return true;} \ No newline at end of file diff --git a/public/tiny_mce/plugins/directionality/editor_plugin_src.js b/public/tiny_mce/plugins/directionality/editor_plugin_src.js deleted file mode 100644 index de183fe..0000000 --- a/public/tiny_mce/plugins/directionality/editor_plugin_src.js +++ /dev/null @@ -1,71 +0,0 @@ -/* Import plugin specific language pack */ -tinyMCE.importPluginLanguagePack('directionality', 'en,sv'); - -function TinyMCE_directionality_getControlHTML(control_name) { - var safariPatch = '" onclick="'; - - if (tinyMCE.isSafari) - safariPatch = ""; - - switch (control_name) { - case "ltr": - return ''; - - case "rtl": - return ''; - } - - return ""; -} - -function TinyMCE_directionality_execCommand(editor_id, element, command, user_interface, value) { - // Handle commands - switch (command) { - case "mceDirectionLTR": - var inst = tinyMCE.getInstanceById(editor_id); - var elm = tinyMCE.getParentElement(inst.getFocusElement(), "p,div,td,h1,h2,h3,h4,h5,h6,pre,address"); - - if (elm) - elm.setAttribute("dir", "ltr"); - - tinyMCE.triggerNodeChange(false); - return true; - - case "mceDirectionRTL": - var inst = tinyMCE.getInstanceById(editor_id); - var elm = tinyMCE.getParentElement(inst.getFocusElement(), "p,div,td,h1,h2,h3,h4,h5,h6,pre,address"); - - if (elm) - elm.setAttribute("dir", "rtl"); - - tinyMCE.triggerNodeChange(false); - return true; - } - - // Pass to next handler in chain - return false; -} - -function TinyMCE_directionality_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { - function getAttrib(elm, name) { - return elm.getAttribute(name) ? elm.getAttribute(name) : ""; - } - - tinyMCE.switchClassSticky(editor_id + '_ltr', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_rtl', 'mceButtonNormal'); - - if (node == null) - return; - - var elm = tinyMCE.getParentElement(node, "p,div,td,h1,h2,h3,h4,h5,h6,pre,address"); - if (!elm) - return; - - var dir = getAttrib(elm, "dir"); - if (dir == "ltr" || dir == "") - tinyMCE.switchClassSticky(editor_id + '_ltr', 'mceButtonSelected'); - else - tinyMCE.switchClassSticky(editor_id + '_rtl', 'mceButtonSelected'); - - return true; -} diff --git a/public/tiny_mce/plugins/directionality/images/ltr.gif b/public/tiny_mce/plugins/directionality/images/ltr.gif deleted file mode 100644 index 1f8e046b781c2307b36c949c8de750bee37213ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 314 zcmZ?wbhEHb6k!lyxXJ(m|NsAYuy6?Q2-vY>cSA#yfyaa^S8o^uEGU@pAfVzxLdSze z8?S6Rcz@f$TRRS3J9_%2L&1fBh6e{vTwAqzt%An{hl~vg9T%2uJbL2HWru>vV$K{ZK;XiB*TSR^EtF5Pu?L5!glmUqk6XWor2FK+ O88c_io-@ml!5RR29d0)O diff --git a/public/tiny_mce/plugins/directionality/images/rtl.gif b/public/tiny_mce/plugins/directionality/images/rtl.gif deleted file mode 100644 index 40ec61303a8d22403d9c9fbe537467d609029e2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 314 zcmZ?wbhEHb6k!lyxXJ(m|NsAYuy6?Q2sm}&(czOf4FVQ8By1>{@L=zW$H&hA*9;O4D0oaTh*%I%aiC$vha=}72Q*wrnDF4hxu^S1-c-;~Ft9MNu(!x6 z$c#&lS+jQe_U)Uxx;jcqiZ7f$y?f`jcW++4ef{FhsS}|gA+9bi4h{|q3JL-O0{{R2 z2f2eRtoW0Kk%2*nK?kH8LxSUbGBoF)8c N%$zlQ&KySuYXHZlZHNE> diff --git a/public/tiny_mce/plugins/directionality/langs/en.js b/public/tiny_mce/plugins/directionality/langs/en.js deleted file mode 100644 index 2f5ad45..0000000 --- a/public/tiny_mce/plugins/directionality/langs/en.js +++ /dev/null @@ -1,4 +0,0 @@ -// UK lang variables - -tinyMCELang['lang_directionality_ltr_desc'] = 'Direction left to right' -tinyMCELang['lang_directionality_rtl_desc'] = 'Direction right to left'; diff --git a/public/tiny_mce/plugins/directionality/langs/sv.js b/public/tiny_mce/plugins/directionality/langs/sv.js deleted file mode 100644 index 7639836..0000000 --- a/public/tiny_mce/plugins/directionality/langs/sv.js +++ /dev/null @@ -1,4 +0,0 @@ -// SV lang variables - -tinyMCELang['lang_directionality_ltr_desc'] = 'Riktning från vänster till höger' -tinyMCELang['lang_directionality_rtl_desc'] = 'Riktning från höger till vänster'; diff --git a/public/tiny_mce/plugins/directionality/langs/zh_cn.js b/public/tiny_mce/plugins/directionality/langs/zh_cn.js deleted file mode 100644 index 9dfe94a..0000000 --- a/public/tiny_mce/plugins/directionality/langs/zh_cn.js +++ /dev/null @@ -1,5 +0,0 @@ -// Simplified Chinese lang variables contributed by cube316 (cube316@gmail.com) -// http://www.cube316.net/ ԻȡTinyMCE֧ - -tinyMCELang['lang_directionality_ltr_desc'] = 'ҵķ' -tinyMCELang['lang_directionality_rtl_desc'] = 'ķ'; diff --git a/public/tiny_mce/plugins/directionality/readme.txt b/public/tiny_mce/plugins/directionality/readme.txt deleted file mode 100644 index c1cae7e..0000000 --- a/public/tiny_mce/plugins/directionality/readme.txt +++ /dev/null @@ -1,16 +0,0 @@ - Directionality plugin for TinyMCE ------------------------------- - -This plugin adds directionality icons to TinyMCE that enables TinyMCE to better handle languages that is written from right to left. - -Installation instructions: - * Add plugin to TinyMCE plugin option list example: plugins : "directionality". - * Add the ltr, rtl button names to button list, example: theme_advanced_buttons3_add : "ltr,rtl". - -Initialization example: - tinyMCE.init({ - theme : "advanced", - mode : "textareas", - plugins : "directionality", - theme_advanced_buttons3_add : "ltr,rtl" - }); diff --git a/public/tiny_mce/plugins/emotions/editor_plugin.js b/public/tiny_mce/plugins/emotions/editor_plugin.js deleted file mode 100644 index 84d0edc..0000000 --- a/public/tiny_mce/plugins/emotions/editor_plugin.js +++ /dev/null @@ -1,2 +0,0 @@ -/* Import plugin specific language pack */ - tinyMCE.importPluginLanguagePack('emotions','en,sv,zh_cn,cs,fa,fr_ca,fr,de,pl,pt_br');function TinyMCE_emotions_getControlHTML(control_name){switch(control_name){case "emotions":return '';}return "";}function TinyMCE_emotions_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceEmotion":var template=new Array();template['file']='../../plugins/emotions/emotions.htm';template['width']=150;template['height']=180;tinyMCE.openWindow(template,{editor_id:editor_id});return true;}return false;} \ No newline at end of file diff --git a/public/tiny_mce/plugins/emotions/editor_plugin_src.js b/public/tiny_mce/plugins/emotions/editor_plugin_src.js deleted file mode 100644 index 69f5129..0000000 --- a/public/tiny_mce/plugins/emotions/editor_plugin_src.js +++ /dev/null @@ -1,36 +0,0 @@ -/* Import plugin specific language pack */ -tinyMCE.importPluginLanguagePack('emotions', 'en,sv,zh_cn,cs,fa,fr_ca,fr,de,pl,pt_br'); - -/** - * Returns the HTML contents of the emotions control. - */ -function TinyMCE_emotions_getControlHTML(control_name) { - switch (control_name) { - case "emotions": - return ''; - } - - return ""; -} - -/** - * Executes the mceEmotion command. - */ -function TinyMCE_emotions_execCommand(editor_id, element, command, user_interface, value) { - // Handle commands - switch (command) { - case "mceEmotion": - var template = new Array(); - - template['file'] = '../../plugins/emotions/emotions.htm'; // Relative to theme - template['width'] = 150; - template['height'] = 180; - - tinyMCE.openWindow(template, {editor_id : editor_id}); - - return true; - } - - // Pass to next handler in chain - return false; -} diff --git a/public/tiny_mce/plugins/emotions/emotions.htm b/public/tiny_mce/plugins/emotions/emotions.htm deleted file mode 100644 index 5466dba..0000000 --- a/public/tiny_mce/plugins/emotions/emotions.htm +++ /dev/null @@ -1,45 +0,0 @@ - - -{$lang_insert_emotions_title} - - - - -
-
{$lang_insert_emotions_title}:

- - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - diff --git a/public/tiny_mce/plugins/emotions/images/emotions.gif b/public/tiny_mce/plugins/emotions/images/emotions.gif deleted file mode 100644 index d34f0e0bf3f630c74260f4e122daed5836f1b4d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1127 zcmZ?wbhEHb6k!ly_}<6x>({TpfB*itE%^7V`M+Og->&n$d-v|oM+;SMhEJb9ef|3N z*L{)S55@oec1aHu{P)-N?-!>>xA*^jBK7?F^Lv+#KYn<9V5R8)Z}t~1T-Y{?>+dVo zBP+$HRdes#K5O%I`Dhouzn?9x?-Bg-$<^I}*u8Ze?w1gk^lI{>)YpmJZm={mbwZ z+p|7@{`~FRx6dD!tjj`BL8>h=2L0ckhDkx4U8o zR{QRlBYo%Umc8@k-ab@)bC&nOYXAMK{r~>W-!WTY+bo`cZ#Dn_GvB-1ecuZA&mW^| zlR1CCRoc7U<=12RkME71pAr1?N%!ux?dSI^f4?JiV2$s-l^(Ay2!FdFcy6E4$%FI% z{Wbq`mG{SwAOHXVXBY+44gtlVEQ|~ceGEDvgF$(Mf#W}eET@deh6M+k7#U2mE-evk zU|{ED>PR?rxKmip$Av-Q;>0FZok<#sj!vFJV%{P$YYrqk_eyF7EC?`Me2h&_l*>%3 zGnyq3LeY#EauvbQkv*~v6$i5}|bX;QGt+QP;;fswhbhe2CRM?j@; zl9ktnqn^x6EFB?@+TwZ4>N!FjCIRW^7P0gH+oM_hOhCac{7TQlWCw*Q`YG=gJak^s z@bq+nK<7!O)b*0KjR)QcIPCh;XHd6eN9LYw{o(@L7E3rbCOCG8$cQy~BzwFMa}`Sw zNo-(kEM%#c5Sf^`u=^H+@TVUe7CJidXa*&DTu3;~K94hMyPeCzi5kaQbpsdO*f}9t zpjSPM-RNM#QdU+OgM;LL8d!{Dfh-ir&4{93Lo45Dsp1Y88PB^+7Z LWm6*p92l$t)j^Bq diff --git a/public/tiny_mce/plugins/emotions/images/readme.txt b/public/tiny_mce/plugins/emotions/images/readme.txt deleted file mode 100644 index a3cea1b..0000000 --- a/public/tiny_mce/plugins/emotions/images/readme.txt +++ /dev/null @@ -1,2 +0,0 @@ -These emotions where taken from Mozilla Thunderbird. -I hope they don't get angry if I use them here after all this is a open source project aswell. diff --git a/public/tiny_mce/plugins/emotions/images/smiley-cool.gif b/public/tiny_mce/plugins/emotions/images/smiley-cool.gif deleted file mode 100644 index 1e2c1d62bb7161241af27cbc4e19784193f1a3e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1135 zcmZ?wbhEHb6k-r!_x9>KeJ?_ND-@a=QJ z&wC=@zJ2@qMC#z0z&*>o-n@D9_m!%&wDio{{{Np)8pWZkB)fCI-r3C}AK!RA zfByW}dyk73&+OYi>)j~`wiK79D^_t;0b_g}bh;r}=L&C}&iY|mQV&3Ny!@xOni z2bLNAerI)fx!TWHHvj*IiVCss+@_(cD{f*Stf(lYt*Ne{pz!Y9ySGoBOG``lEa852 zOZM#9vnLNN;N@nychy!&LFU{(r57(=NK5jbJUIW>egPLJ!TU!9_N{Ptb&-2;g!j== z-dC?)i3zi4YisN4@gxRu?Oo}^&%;`q%(-;QqP@#qn3R}CMM?db-_LJ7(z3HNNQ@QVyWD;2Ov$^q^k2RR->J@`byD2KQS>e;h7!0&z>fpJf^0p%&}*=ubiCR zj~_q&|NqZ0l!4+;7Dfh!0}MJKPk{0S1IK@cMotk6h6DO+Javo`1{)SSFc{0+IM8^w ztyz*mhKr}5`A8d+Rf)(AhevJ}Jq(RZ#}33Na@|dwd_b6Ajx)@5 z;?@<{^%JHqc+y#Xx=Yw_QQFVO#moGs>FtF!W0JeaQT{Q=j+k6)B#Bt1hbfjgv z4Cm~cxeP)}uFMy9yXV2NwY@>fq^u=CY0}ASliYTi_`WnbA}XP|Qtf5aR_;s7%_eGP z-fZ&l6m`zyD^yHl1Tlty-Y?$dyl2b;<%KKK%}dW_CW-h6Zl_F9{8dwl)u#nA9^_7+6?Z1e|#k N1sELNm|0mEtN~#ds0082 diff --git a/public/tiny_mce/plugins/emotions/images/smiley-cry.gif b/public/tiny_mce/plugins/emotions/images/smiley-cry.gif deleted file mode 100644 index e0dcf8a8fcdf4da63a860bc46f02f8b92ea4213a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1127 zcmZ?wbhEHb6k-r!_&$r_@87?A-5-Aa`ZedshfkkA{rzhG?%lhuU%$S2^JeFKy?@W7 z|9rH#d-v|Y-%&S?8lKuB|M#=S|NjYZ-@d(j$yAk#Vc+&y(ThKPer2+Eh1ijm;*AC3 zM{j=EHjC@g?fr+BtL68(0a z@8FuiU|a5=UrcS3n0`MLKYjZ2-&d+n-~L?P&A4Z|*X83n|G(LP{t)%&xzfisUVnb& zynh+KX$t4FJBIIH8qL}B^6=rq-#!PN*q-(OU*X)XSH6Bu`uO4X|G%L>U)da3W;EmQ z|9}5V|NVBk`QqQcl^)w>@!Y+({pDS!Z*LuT&XJtmsZbcsap&rmfA6#otoEP2q~_mW z)32}0w(Uyz{LEs!G?tnjIv=1W*9Ob?c!sS z;j&R^X>XSGp7y5Tfb$8)b~m9EjU**5A(bK@k&_b+oH*cJF2{2*xUFx7UdRI$sZR;# zRec%O6kJej;Jc~KPR+4zVZ6A!}!25qvy|_efs$E|G&Z;M-Bh|D?PYM z>hBlxZx@A6ZIS=`-fHu7`LCao4lh?bxF+z(O7WfZ_5M7K*t6VAgNO0`%kT>qF8qBU zdwHMwzaQp*A4~sP?C|fX_y4c-@uksJ9_C3E} zd3LA5&N(ta7u$S!X;zsc_H(E4p4lS57uo&28TR9?%g5(-F=nE>XA9@JOCFf3v~YsL z_d8Padlj~J$$UNU`|GLF@5K)7B~k}g`+t39_IJ7aj+y-LADKTsY|&XF{qLRD<3nb@ zmfP=|B|NKLVgFLMbNiJ3PmkHR%>B;QExYDO-MzN`)WHSu&Vs8Oq}P?29NDb>=UI4X zip+tza@&@vElkk-b~Wz*w&4BC+&(|E_}dfu@~+dLJK6i!X?=g|{Clax>-)~tDdPXu z`+a-saA1w^zey4Q&Ux-%?SJyX{M~ERfBg9I|Nno6QGgl(ia%Kx85ou@=zxSld4hrC zKZ7Tyhy=rd73}=Be;vr98Wqp^9GlEB#^@ymp zF!h`|)Y#O`QL%4LgrIvci@1oz2}#q$2?8ukEDIJMYHn9FE)?W=XtdBlR%gCdiNlr` zXJ={m?RvwwxWm7ZEnUlz=?Uj#b}=2Bjz$K?b2AKhxeThdWKLp~7oTUd^TFW;MytF_ zA_fnipW|m@abpQwpm2iYj{TPiLqn}8lcfTkw)`x3e5~DBanY56pp1|Pp^0S;4vQAI zvvAs$D0nk&R1V;5TRdyRkI4)k^SDG;F?cR$b(y@F$@q!IqC-s`ywV*Bja=?eCNw%T m`xG|t8tQCt;4zaiIO-|IxPVc_+2Ftdfq;w&7abTG8LR<4W4fCF diff --git a/public/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif b/public/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif deleted file mode 100644 index b3e47cc3f80f4d62bc37dafb892df4671e0dd2cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1120 zcmZ?wbhEHb6k-r!_`Z_i*RNlHzncI1W%l>)UsY~~AGZa+e*OCC)2Dau-rYEA_~)a= ziS1bzE?oHkKjGsWuMj)#j~`xdo5l6!&6~Gx-yU2OcyN`}`2#w4FPTQW@$Ff_bMfMt zKR-kM{WX35{Q2k4pWO{OK7WY%_U+r|>GJ>nmHvKbrOL(d_lwiv!-ub(&^x?b?Z8UW zy(`2vP2tQ47X0_yW#@doQ(NR8-QNH7rqS+I(Rc6O-M4+#ty{PL{L0z0-0Q$HqtmBP zukL2NbWru*@2Ddy#sB{^|9(g4z-s^BZJhWhTBkzs zfBqOXvt51fe7QfLbPL1TZyuJ}HjC%nA^i{U680{4|8_?t#glDzr^fmH%J**s%&6s_ zTqFGGuE&nq0{1TJpFBAK#~q>K2=>wx;aLrQe?MCsSmV2ErN-7J>fde%-o3W{{0`|< zFSajNd3P`1OY#xizuN!bJFOq@%>7K+4{UYbyWC~x9LaCj`F{NP@&EsSh7k`Gf3h$# zFsx+I0fhu8PcU%&X9(sLv0z|WC7>9 z+*~3yQxhM#vG_6vr0%?+?9d=4v8U0ZXe z1BsWW+Ga8ozDm*Hl5*!zi)j4p+$*54T*=#R>dI3yI62;Z_$j=y;W?A!wiFBDb}ngq z4!$W>A(>|Ho=4k!S(@0VPhRe`fLH6o0;vm(ocvac_chGC z)EXq{=3OE3>VUx1Hkq^qH*7gwUHoVJ_X<6|P!O_!oy}OQqVU3k#%4#+G=mQhE->^; jSuELbh)eT905h+8CQAd0*^7choK`m!9Nm~%Ss1JV`4_4B diff --git a/public/tiny_mce/plugins/emotions/images/smiley-frown.gif b/public/tiny_mce/plugins/emotions/images/smiley-frown.gif deleted file mode 100644 index 9335e9945eac8c26129830121ab7e53077c4eeb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1116 zcmZ?wbhEHb6k-r!_};_t>({TpU(Nsi{rm5i+21Ep@7}%p`t|Fdj~1Ukefs@S{Ksv< zZ+FCY&g07n6%4gv`TQa3&6_vRpFiKXeb&F{jO3{lK&-{F4Go^~>&nMTvpDi{`;r#f<>+apV2iFAterL71oAJ^?)q|^~{=QQE z_U+q+3m5h*_xg2TWbX>GU++C0-QItAx!U`e;pg`09a$-!?9LkP!uR)kY-zH{fn`Rg zPoMt(&HnJ=!#n5e{rgw?=U2}Ee}%hOMgMyy{r;B1=IQcZKPUbD;#3vSarKzNty{NF zY|ly$6g<72_uggWKR-i0et5lY7FUQZ&(}|ZZ{NOkH{kg8IpEY5`2%Zw?_S&f{ek%J zw@L?A`<~yg{OyL|z7_5VR{MXyBlP)W)Q>wt=k_Umxyt+dSJwZ3=KtPmK0hP4f3^Si zxqQD~%K!Q1|MzeH@1G&tX7Sv)x@E^~fs+U4|9UKc?}F~XcUrG52!FdHvTvowr&lij z{+i#rsDJX%g0~M+g-7pb0qi7m)g7Bea9T>Z`b*L z{P^+z|9^&2K${Ry{K>+|z|g~>12P_zCm1;XGe~lZXfPaDB&sdOC}6N*p#y`VmxyKI zB9Bf91{p4s4K6HglJ<3H4k#pbGPVcQTrp^3Ze!;+D3DnBkonXB*NAm2j1ybhIE8H; zS#~Z;6I5m_T*P2m)Nrzw*>}DiqmXKMgKLaY28V!ym*~2({S;zs$Z}=X>+!&F2qM zw{G3~`O4YH=w{PFxyKMaJ+qdUuMZbRi`uzFxub-3tzEa)0LhR3T zrQNHd4uh>)~_~`7$eJk8|6iFOw=e}`d z#hez-rziDpZB%}8LVZ^;_p9dyN7lrBd;ffCzSy4mQt#is`1d<%?|ixUkFS1u<#Kf! z_xdTkJ7x=(m(D9)fb9?f1`1Bb=~tbf+eXUkB_Qvn!*|7#eZdy#OaNE z*Dq{Zl)&`i>5bEC6>lG1nH|8sr@_!%o&DYg-2GPC^xQtB|NqQyUD~v7 zrN{l%l7}}+J~^&_aC*XyInv+mifx+Ad3le^-6Ko>z0*2*aQ^Pzz?4wIW7DJ4yxI0l zG0uqxN+pTxrteX5R zkj+nWR*%#cH3tL7+BIKhsHRV1;hgm5%cn{0VsjH%OEeY~E?{0|!2WBIW^qFsQvfU5 zi^kH|LfRThH5!v#)h4V9XxqWVaqxJcn#0^HZyXvPOrIvtp=G*BG>Jh}uJZuLY~R`6 z7V3nvi5!^xn62S{bjZPvU!@Q9TF&NTG2Y79&c(#y!LZYrX&0A_v=S?K!Xpkg4h@!$ z0Qr6aH}LZI5RRbSOWl;hvb<6 diff --git a/public/tiny_mce/plugins/emotions/images/smiley-kiss.gif b/public/tiny_mce/plugins/emotions/images/smiley-kiss.gif deleted file mode 100644 index 242c38c1eecf5f8e9151cabed8cc3cf820f8984d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1129 zcmZ?wbhEHb6k-r!_&%TE*RNmyewqFK`}f;*zE7V%ef|3N_dBb1@812mE%@)R>9@}T zhnK7EoUixj_WrkT-~Rn=g*)2esOyLGJNxN`6DaE_hm_byDhYRF5jO|x;y4b-?_SFe;eN}afy2u_4h7! zKd{<&=N!pE8}9ubd>geyf4!7Hu-gC6H~$^81-@M6J$Z0`X|l-oyOQVjDQ%m@vv;{m zw}{Z+zxgK*E!Z<(>fbx94GH4=R(iZQHNC8=dV8kq_Xpw+=gNQn7`0nm{QQ39KOZ&x z%(!5&KYslG|DRzL;0*!ApDc_F4D%UuK&n7_f`Q{dgFUB+21A27pNtKofWd}^ z4h+0rHj$g2cy_We$Z+X=Xga~E?%ro%>G;Hzv0X>PVWVM6yMUr~+l_`p4M!dPYn^sX zNMLAdoX4iJgTwITWp&0dvlAIbhg{ob z0>jf&eMe-93J#o=)tVp>pjC3zTiuRBAmh}O7YvN1k#bKuwy^Op(vL8cJoWK`zYNp7 zQyB*qE@GDPDbhLHdC8HLk2lwb^TYv7kAA`QHxm>bpI_{dbKH{Rmhi%}h24a!Ymeuo zCqaU&l{Os)S`#??<*hUn92=Q9S!L}%9B6T7y~5zg!@Xw1AtpnIfWw|ri~)=SCR;8r P@j8S|xah#h$Y2cs*%YA@ diff --git a/public/tiny_mce/plugins/emotions/images/smiley-laughing.gif b/public/tiny_mce/plugins/emotions/images/smiley-laughing.gif deleted file mode 100644 index 09a9ec7e4f5dab31b43717366d6236fc760f8610..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1122 zcmZ?wbhEHb6k-r!_&%TE*RNlH|Ni~=%k1x0^KaMrK7IQ1_3PI^A1&U!d-v~m)Pa?v zpFe;8_U+q|mEt#!8Xj0?bnmk9=MPcmPaZjZ`0(4eZ|`0*J+VFO=#j&xw#Z*SX0UA* z*M$og{{43O_t!KdRPgla(?4I?lqQQ@yLkHR=cNDt6GCix(gOwGym@o??%kepuV@#( z=g*)2|5w;io_6u#nOnDR{r?;K@x$xgtD-L*RQ><||F_QpH!hz)w@+`+a<5HOIRE?% z`TITg*L#nTZ@l(xpLKAR)Su6GhnK6Z?q=LPUH<*c@ISwDcFxy(bbJ5bFHU<`i2Z(N zQl1FQY#P3rjZ&V28Dx#wpDKfX8Gzd@lnlV`_V{%P$M3nsTbzajtf zvi!MyO8ZuNe7h@_?!#6T=k?-=;f}>R_ikM~vyOZJ8o58;{I6X+d+(zD+lQ)OuJWGW zuUr}D3^H6M35xB^NAC3k$ zY6@C#2nZZHd}~{_rOS;FhJ&IGbyg(`lb4@b!JX#tANuCcCw8n8e8)oN+Oo)!AQ9ZiD?w#wC4{E>R6v zZhSt_8raBfcH#%)LUv9eTZKOpHYPSYGi&^4a2D`X5oF=BTTn2`jbYA*L+rvn9}aS> LrC>mx-HbPm8vgt3^5bfByXNmj2yKrhmVhA6Y5> z;F`g*DazYsac!P1-&HAfVtdxd53m3KEBy1(;{D6;nccD%FP>@Hmi6ns$KAVk1Fg9K z{L0z4eb&J>fwykm`uWP{-|wiu-(ydoK7C-B(evle0~;(a9aP;kh4b$hr^AO2U$}5V zM1gPpqp4lxQs2IP`}eQ(z)I1#Z{MEUBLC?2{x@&l99ZqYf3^RCHNIWt!soZj|9EGy zcezVuh}p@5^LNaVzI$!EnXAm7Z~h;z3jca3zi)%Z$wLd;ve^216&BA7Slq_(@{(xH z%H&V4T>kwv|NS$>yUetDMe^SHa^LQVeEt}9XpOF=zuvbSg8No_6hxUiX)y1Y%U@q7 zdvKN1_PKm_u5S7N&s^75eAxm`$1t^O%R5?XB6c|+G z?G#uU3^pu0z~CHJk#OLEbGIU+3|9!lBR6It`??7k1?TTs{69kx#c8hByd0a41 zJmTQt-qO)=K(X;Wi;Pl-KoZL&6^1;kH3u#}Zs-zJp0(=0#zlvP876#7XxPYjkex$v zSKV0#W@kYU?mr;~4h;^REaJEJ?R~JIX)-I@uNNZL7sagN4}7@U_?&Tq)&zzN9x2Qd=6I-QU9k{6$tNP+kzvr1lEgO0XktZx>4F2w zmlkOo`$&jpII>SOoyc`UU!ap$QC3Vw%j2NZr2qeQmK02KV-$GU#AEqHp_$ty#U#Li G!5RR#xPA-( diff --git a/public/tiny_mce/plugins/emotions/images/smiley-sealed.gif b/public/tiny_mce/plugins/emotions/images/smiley-sealed.gif deleted file mode 100644 index 76002b2f0142d086e7fa3a6a367554f63d4d946c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1110 zcmZ?wbhEHb6k-r!_&$~4@87@wewqFKYX0ljuXE?mzkB!Y>({TJK7D%g_T7h%pWeQG zw|Tn!=MPbD-@g6#*Yv~3&j;58e*6CY@N%_p-@g6(?Q(Fh^_w?u{(f=#_pkKK8Q-f!wK$ZFq8k9!yO_pkQfK9_GnH|Ok5jfH(Y zAKxYX`)fX7;>4YEB=20^vUj=5;y$i>7jzG-_W%4b`{cp-r76OjHYmM$_wMt@s12*+ zx6R_2FmclP^XCi0+3(*7xO>MSJ&y6Z8aw9l|M-?WzgPXkr%zw5@*Y^@d;Z*o zUoYj?Oym0fD{IeusU35q*DMnM^4#LbkDoO)HS6b#EnBuM)r)OryZX^xu6yUp{r(wp z^3Z~lG{CNKS`Tzg_8AbsGA)xq^g^___DuWKl z3{ak6;P}s=%_+i>a9|0iuo^Fe!G?tg7!?(CE-XxDY!P6V;WGK4G4stg%6Va;@j$&>%u`UMQ%-l*g_$m_d=8q6 z90jJcYJ-pDs#c!-KMME*Mja^hd)1-k_ TrDwxIHsuKkj&97XEDY8F-m;hN diff --git a/public/tiny_mce/plugins/emotions/images/smiley-smile.gif b/public/tiny_mce/plugins/emotions/images/smiley-smile.gif deleted file mode 100644 index 8cf2b5daf3e5e3321fbb9d6eeadd9cf60a575fea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1116 zcmZ?wbhEHb6k-r!_}<6x>({TpfB*itE%^7V`M+Og->&n$d-v|oM+;SMhEJb9ef|3N z*L{)S55@oec1aHu{P)-N?-!>>xA*^jBK7?F^Lv+#KYn<9V5R8)Z}t~1T-Y{?>+dVo zBP+$HRdes#K5O%I`Dhouzn?9x?-Bg-$<^I}*u8Ze?w1gk^lI{>)YpmJZm={mbwZ z+p|7@{`~FRx6dD!tjj`BL8>h=2L0ckhDkx4U8o zR{QRlBYo%Umc8@k-ab@)bC&nOYXAMK{r~>W-!WTY+bo`cZ#Dn_GvB-1ecuZA&mW^| zlR1CCRoc7U<=12RkME71pAr1?N%!ux?dSI^f4?JiV2$s-l^(Ay2!FdFcy6E4$%FI% z{Wbq`mG{SwAOHXVXBY+44gtlVEQ|~ceGEDvgF$(Mf#W}eET@PBgTrDqUnxcogAEHE z7zBMPED8@bcXBYuaD{AWaTQWk@zC%*l+?-8E?SYZ!qAzOOGGQ}%8dhy4;^r8&65%Q zxTr-y(biRFr{eO7iy3l_{xlREIM~kYJKyQYM8|*zx9kZFk_HJUIM&7OWO5W*9@wPo zCnccZu;kROZQ0TmiIWdF%(d*6v-$CP*_oNn4HB_|#%+C!8u2IYI38{fXgogQp@Pt4 z)-FclDyGJpiVHSBmreXrP?)UXD6g*|R^TC+bg)T4(?W+~;<11xw=SI%8iyFTo9=Ub zGtf{v>@?ktQSHgcMCaxfiJ&D%CM-DE#&07mVOHg&9N5PlwaCSCW3l3K1u6d?u9T*O zUff(32?q{1E^HO$@sZJbanZ58TQhja0%vyHIZFf?LL@di2{^7vU=fw%6%k;t1^~B> Bjs*Y! diff --git a/public/tiny_mce/plugins/emotions/images/smiley-surprised.gif b/public/tiny_mce/plugins/emotions/images/smiley-surprised.gif deleted file mode 100644 index ece78a394ea52aae0c7e9802c5de1bee4acb934a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1122 zcmZ?wbhEHb6k-r!_&%TE*RNlH|Ni~=%k0;Ek-uNff7}-Q^y$;@hvM(vz5Dw0>$h*; z&L7bE_t*69CDT72Eu!7{LhQKz{f_!}o$voQ`!{diT)1%I?c2A1KU-Y9c;?ovTbB;1 ze*XOV-eu#>)8!xC-ml8V@b`<;wpm>Jw$Hk8)bRH^tG};QKYn<9V5R86HG$8cKYxCb zcXc=8zuzu*OJQca`j0z8`&N3qI?cOviTeCr^$<(81FL=ST-_37&-(FQf|EM)x4UBZ zF6gFuvF)5Asm0Hb?7@C?m+P137C*k_UOlX2tHfLw&i?6<)%y#4>47}kX7RkeXZh)s z%gI9vKDZ_gkf3FXewdmY?0Jab!8~_PKoj{+jP!?f?Iu z`QGL3r76M(*7)w2EwE#b^q)_<3nys&{hNRH+V&lD`S0Hd@X%#GzhC+L1M!D91NY9C z(-CCcwNgV%fN}3~mvj4+_N{QYlxNyAU+T+M-fuSq?_JdYc1Ps*&ybS`=O5VWynQy$ zpKtze&hq~F@#Fvh{|uu5ZwM&^O%>^Vgw7#h@Bxoj9Y3^puu zV2}$aiP*S^nTwx6hRY}6$x#kxvm6bnkB2;%+SSTr4l*68sR2Mqz)p zT^fms4h$?3x%aoFE@YX&$dbwSH1WU!ekrTYQw0l4Jh_+IbLc!M+?;-Lj=9#klCDKg zO)Xw?xFQ`4IQp6z$aEtAuT7b3l|QkvpV}rG&tD*GEDRlGxAmY--j{GhH7oFKeQcMCI G7_0%%B$XZj diff --git a/public/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif b/public/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif deleted file mode 100644 index 16b13a5a6abef5eeb7e07c3fd074e97f62f7cec4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1112 zcmZ?wbhEHb6k-r!_&$Z)-*@lcef|3N&qs@2_eDN^`lQOu@b9Rpy0MyTz@{f{`+hC=FOYU)8#*Zh`Mm$!qsC2 z-#!QY{cJI#mV5WA=)bR2zkU05>7eQdDXEJW&-{F4^Z#Grzkj8Fe&sBcl>GJH;I zf4`%StQ5}(75wuvXaE|vc!zWj89X@>c(e3?zzc}4HEcpAK)q$0wE0k3}fBt;qsA04V-@!G3rO6^+ zKPUb9=D&cOYmq z*Zkf^{kIQQzdsQF_{Qt^&yXF8in~=*_O0~z6&&*WSJqW4t9>in_bzw;_fG4;YTuo6 zB=@iO-!ot8{C?&C|IF`Q&<$p1xMF4XxUsm3}>z|8_%g#~kTzcg6mE(tUnL z@K+Z^fnf@R4#*f#o?zhk z&!EXEVxe$AMLxMQeo|xWw8e?$rIv$CIUv zuaUj^)Si<;F9MewpP($8wCFiwqgl1c&xuEN7NP{1U9-ERYW8_<>oT#3DEg4;b6yMCewr~CzV%t2&x-gDVXHO7$LySZ2#wg N1CLmWNq_@`H2|>$hIIe{ diff --git a/public/tiny_mce/plugins/emotions/images/smiley-undecided.gif b/public/tiny_mce/plugins/emotions/images/smiley-undecided.gif deleted file mode 100644 index 2aec732fbfdf8df32f6e527f8e61ab91ae0cbbbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1117 zcmZ?wbhEHb6k-r!_&%NC*RNlH|Ni~`&g$DT)1%I&6_uG-@g6x(c;&8kAJ_TZX7lI`Z?*_w{JPILU-@p z{qxE7?-!@NE5r^TKK%b*;lAy&{ymd^|1!M2RO7rYW4CKY#xJKjF`>oPYmHPoF-0aFx{G@3D_=@83CJZ}+O`dzX#3&Eop|N_Fpi zxqBCM|NhP2FCInw9%D|;9+pWCOjw419WS@h30{~vdR zD&jf*{W19T%4P3z_l4~|)|wngR|_0kA-Hpn zYLq>&#`oVlt*x^KB0cz1f(1W+jM}%-LsN|D-(U0huZ#|?_C2vy;P+dlBrn!)Hw3>w z5dZa9e%}iByVtgVc&g^C$I?+I_3f_M$%FG>Ju&=tM`YV9o?kEJ_blLjagyi2YX3d+ zrGEd)x^s1lvjNw=i~9BX;@ju){r_jaf3^SjJ3`;C^Zoeoyf zoR2cKn|7_)VbIdVEiTd)6A`%Nn1gqYM9mF_18!F5q}2nGN}-U3Cw&dEHU>J90L|MDtU7qdy`S9z`RhJ{noX{+eyboSUGtN7cxKX znPT7mt;KWliU|rvzCs=yM?8eYZKh~>&WrK%pQbJ(q|>$7jl1zY%es)0%^eK$^}K{M z3_ibTY`k91aJF;P)9yxg?Sfi11|CsMw57E_}O;y zNW}RVY?<`-52@&&g$K}cb`6e`ug?j z->>HX{+j;zXz}lv^r!z%ru~+q3>WS2}$7@ZZlC zKVRAW`IYnUx697?di%D|+Oyp2|G&aZ2URazxbXgE`2WA5D|@*Aevdu7S>*2ByWc(s z99$)}dsXzNDV(QIpZ@s9>)-FFzpqp;UOaPfP2lQo#y>wpHcyxT^U3www{Lq_i2eU& z|M^4I^XJb$fBw8}7LS2A^S+fHAKw^z8gX7dX0Ug;`=5^*pFc+Z`R2c8qw4;R>LIo~ zJ7x4RIvHah^`L)TMzh25`gbIFtApY{K;QxQ-cdu>VF_-_|1>L`2oc6EwKd{>O+g-8q zhqYhbGd{4!_vIOZ-#sljQfbFoTnmC1rlsm87At}JX|m?&ygl*1w6 zd#g>}ES^KrLx7`)i&@aFz#yUFa61QE$c@HH48anDt^p1Yf)-RTnhOMo2r9A#GpKc? zT;X`c*v`srVZ*Xgv6)M_ZAQxs#|=xIJ(bw`lr%3go@^0V%ryJVgN=(1_4CQrh1@up r>?YjK_2dH+kAliX77l|w6ApVyF&Z$j*)5sS#4ph^;i3a0BZD;n=Khyf diff --git a/public/tiny_mce/plugins/emotions/images/smiley-yell.gif b/public/tiny_mce/plugins/emotions/images/smiley-yell.gif deleted file mode 100644 index 7719bc43d3e92ee5f6024eee94d8dade3df1e6a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1132 zcmZ?wbhEHb6k-r!_`Z+f@87?_e*H2KVSM-Q-KS5VzJC2`D9U)_sNwtdd>1dCIk+b9 z&##;#E5(1`vH1Eq>GOxE!^_p~T{hk}i|f(t{d-r49X@>c*CVS77cRVg`*!nm`ETF8 zy?OKIJ=R*L?*XLa|I>9@0jC$?vu+9Ln&U+Kp;UZ+o=KCsMa=X||yp92oAlG-$d z^Z);ZJ4U}|8MB-RnhNXhJXJ2`PQvl`?k-zd-v|Y-!2I* z{J*bRY;NL7aO9uaUA?nQwWTQY-*=a6H`d?RExsNW{P)vf=N!quFU^15vHJTx_R}uD zU(c<6-BJ4eGvxDT`G3En_N{RL`PAm~exaX_ZMM(l%L%sFJ74bWb(6-t)W6?i&mGcy za9ZK?GJ(sJd3N{n{C;fl^@`x1=St5nE2?oZ{C?y5@3WbKC}Vw^_@DFU2iEu=SnYrB zf^KK2<;<>zKc94e|H}IOF-nb-;r~DL8QnF%uUecrdf@zi<+~S64aFG$|0}$4#^n2T zp}(Ik{(dz7|F`hy5{sCrbNPdfdCHe{P@BuX`f@ zUYgyxx@BjN>c79{N9POdUG8#Wk;2J?^ItC#Kh`O5zMtprwe6?&7=3!>a`Tw}muq6V zA+}$R@m<{_cx8j`pAW8k=1c8g?Z0ETz>Yc6-yWKrIdWjzES|~$j$iLQ{{4>HF_*t6 zTKLD0AOHXVXBhfG@h1x-1H(QB9gtT*d4hrCKSM322#11$KCe_2D}%v?g$EdfMN&Eh zm7AM58D+S11e}gCN-4Wtuvnnv!q_h3XHYOfC47qJv`rQX1x<$!#AUiXY213GiCslb zXTnEir!f6^1}o2q2Cu8r*_>az$td8s$i%sv;mf2ij^Xo-t>P96E?IGWk+Q$tikGej zPBhD;W;sede(65PE8K#$(xLl6Lv({(=EJ8RQ-p(-7H~3dU3GE|qr{3m6N6hiMOb2e z{yHvLA}Zmw+kmHo_4rvifw)x(jEB0|1qFJ8A|)LZLe%VL$M~+gyr^}pSqz75RCA}p z`as!)7R?m5hT`YVdIw)5tPpPy4~RJ-Ak5L<_`Y-73C{w-m#l~5IDIml3fp`8EvI~0 zupwFLU|^%E-Wdp|bR diff --git a/public/tiny_mce/plugins/emotions/langs/cs.js b/public/tiny_mce/plugins/emotions/langs/cs.js deleted file mode 100644 index 90d1c8b..0000000 --- a/public/tiny_mce/plugins/emotions/langs/cs.js +++ /dev/null @@ -1,4 +0,0 @@ -// UK lang variables - -tinyMCELang['lang_insert_emotions_title'] = 'Vloit emotikon'; -tinyMCELang['lang_emotions_desc'] = 'Emotikony'; diff --git a/public/tiny_mce/plugins/emotions/langs/de.js b/public/tiny_mce/plugins/emotions/langs/de.js deleted file mode 100644 index e828c76..0000000 --- a/public/tiny_mce/plugins/emotions/langs/de.js +++ /dev/null @@ -1,6 +0,0 @@ -// DE lang variables - - -tinyMCELang['lang_insert_emotions_title'] = 'Emotion einfügen'; -tinyMCELang['lang_emotions_desc'] = 'Emotion'; - diff --git a/public/tiny_mce/plugins/emotions/langs/el.js b/public/tiny_mce/plugins/emotions/langs/el.js deleted file mode 100644 index 607433f..0000000 --- a/public/tiny_mce/plugins/emotions/langs/el.js +++ /dev/null @@ -1,5 +0,0 @@ -// Greek lang variables by Jacaranda Bill - -tinyMCELang['lang_insert_emotions_title'] = ' emoticon'; -tinyMCELang['lang_emotions_desc'] = ' emoticons'; - diff --git a/public/tiny_mce/plugins/emotions/langs/en.js b/public/tiny_mce/plugins/emotions/langs/en.js deleted file mode 100644 index 37f549f..0000000 --- a/public/tiny_mce/plugins/emotions/langs/en.js +++ /dev/null @@ -1,5 +0,0 @@ -// UK lang variables - -tinyMCELang['lang_insert_emotions_title'] = 'Insert emotion'; -tinyMCELang['lang_emotions_desc'] = 'Emotions'; - diff --git a/public/tiny_mce/plugins/emotions/langs/fa.js b/public/tiny_mce/plugins/emotions/langs/fa.js deleted file mode 100644 index fe7db9e..0000000 --- a/public/tiny_mce/plugins/emotions/langs/fa.js +++ /dev/null @@ -1,10 +0,0 @@ -// IR lang variables -// Persian (Farsi) language pack (for IRAN) -// By: Morteza Zafari -// Lost@LostLord.com -// http://www.LostLord.com - -tinyMCELang['lang_dir'] = 'rtl'; -tinyMCELang['lang_insert_emotions_title'] = 'افزودن شکلک'; -tinyMCELang['lang_emotions_desc'] = 'شکلکها'; - diff --git a/public/tiny_mce/plugins/emotions/langs/fr.js b/public/tiny_mce/plugins/emotions/langs/fr.js deleted file mode 100644 index b2dbedb..0000000 --- a/public/tiny_mce/plugins/emotions/langs/fr.js +++ /dev/null @@ -1,5 +0,0 @@ -// French lang variables by Laurent Dran - -tinyMCELang['lang_insert_emotions_title'] = 'Insèrer un émoticon'; -tinyMCELang['lang_emotions_desc'] = 'Émoticons'; - diff --git a/public/tiny_mce/plugins/emotions/langs/fr_ca.js b/public/tiny_mce/plugins/emotions/langs/fr_ca.js deleted file mode 100644 index 1e8d362..0000000 --- a/public/tiny_mce/plugins/emotions/langs/fr_ca.js +++ /dev/null @@ -1,5 +0,0 @@ -// CAN_FR lang variables - -tinyMCELang['lang_insert_emotions_title'] = 'Insrer un moticon'; -tinyMCELang['lang_emotions_desc'] = 'moticons'; - diff --git a/public/tiny_mce/plugins/emotions/langs/it.js b/public/tiny_mce/plugins/emotions/langs/it.js deleted file mode 100644 index fa93e6b..0000000 --- a/public/tiny_mce/plugins/emotions/langs/it.js +++ /dev/null @@ -1,5 +0,0 @@ -//IT lang variables - -tinyMCELang['lang_insert_emotions_title'] = 'Inserisci una emoticon'; -tinyMCELang['lang_emotions_desc'] = 'Emoticon'; - diff --git a/public/tiny_mce/plugins/emotions/langs/ko.js b/public/tiny_mce/plugins/emotions/langs/ko.js deleted file mode 100644 index 654193f..0000000 --- a/public/tiny_mce/plugins/emotions/langs/ko.js +++ /dev/null @@ -1,5 +0,0 @@ -// KO lang variables - -tinyMCELang['lang_insert_emotions_title'] = '̸Ƽ ֱ'; -tinyMCELang['lang_emotions_desc'] = '̸Ƽ'; - diff --git a/public/tiny_mce/plugins/emotions/langs/pl.js b/public/tiny_mce/plugins/emotions/langs/pl.js deleted file mode 100644 index 63996c9..0000000 --- a/public/tiny_mce/plugins/emotions/langs/pl.js +++ /dev/null @@ -1,4 +0,0 @@ -// PL lang variables - -tinyMCELang['lang_insert_emotions_title'] = 'Wstaw emtoiconę'; -tinyMCELang['lang_emotions_desc'] = 'Emtoicony'; \ No newline at end of file diff --git a/public/tiny_mce/plugins/emotions/langs/pt_br.js b/public/tiny_mce/plugins/emotions/langs/pt_br.js deleted file mode 100644 index a9fc32e..0000000 --- a/public/tiny_mce/plugins/emotions/langs/pt_br.js +++ /dev/null @@ -1,5 +0,0 @@ -// pt_BR lang variables - -tinyMCELang['lang_insert_emotions_title'] = 'Inserir Emoticon'; -tinyMCELang['lang_emotions_desc'] = 'Emoticons'; - diff --git a/public/tiny_mce/plugins/emotions/langs/sv.js b/public/tiny_mce/plugins/emotions/langs/sv.js deleted file mode 100644 index 82e1ba3..0000000 --- a/public/tiny_mce/plugins/emotions/langs/sv.js +++ /dev/null @@ -1,4 +0,0 @@ -// SE lang variables - -tinyMCELang['lang_insert_emotions_title'] = 'Klistra in knsla'; -tinyMCELang['lang_emotions_desc'] = 'Knslor'; diff --git a/public/tiny_mce/plugins/emotions/langs/zh_cn.js b/public/tiny_mce/plugins/emotions/langs/zh_cn.js deleted file mode 100644 index cdd4896..0000000 --- a/public/tiny_mce/plugins/emotions/langs/zh_cn.js +++ /dev/null @@ -1,6 +0,0 @@ -// Simplified Chinese lang variables contributed by cube316 (cube316@gmail.com) -// http://www.cube316.net/ ԻȡTinyMCE֧ - -tinyMCELang['lang_insert_emotions_title'] = ''; -tinyMCELang['lang_emotions_desc'] = ''; - diff --git a/public/tiny_mce/plugins/emotions/readme.txt b/public/tiny_mce/plugins/emotions/readme.txt deleted file mode 100644 index e2fdeb5..0000000 --- a/public/tiny_mce/plugins/emotions/readme.txt +++ /dev/null @@ -1,20 +0,0 @@ - Emotions plugin for TinyMCE ------------------------------- - -Installation instructions: - * Copy the emotions directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins). - * Add plugin to TinyMCE plugin option list example: plugins : "emotions". - * Add the emotions button name to button list, example: theme_advanced_buttons3_add : "emotions". - -Initialization example: - tinyMCE.init({ - theme : "advanced", - mode : "textareas", - plugins : "emotions", - theme_advanced_buttons3_add : "emotions" - }); - -Copyright notice: - These emotions where taken from Mozilla Thunderbird. - I hope they don't get angry if I use them here after all this is a open source project - aswell and I realy love their product. diff --git a/public/tiny_mce/plugins/flash/editor_plugin.js b/public/tiny_mce/plugins/flash/editor_plugin.js deleted file mode 100644 index 82ec648..0000000 --- a/public/tiny_mce/plugins/flash/editor_plugin.js +++ /dev/null @@ -1,2 +0,0 @@ -/* Import plugin specific language pack */ - tinyMCE.importPluginLanguagePack('flash','en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl,pt_br');function TinyMCE_flash_initInstance(inst){if(!tinyMCE.settings['flash_skip_plugin_css'])tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/plugins/flash/flash.css");}function TinyMCE_flash_getControlHTML(control_name){switch(control_name){case "flash":return '';}return "";}function TinyMCE_flash_parseAttributes(attribute_string){var attributeName="";var attributeValue="";var withInName;var withInValue;var attributes=new Array();var whiteSpaceRegExp=new RegExp('^[ \n\r\t]+','g');if(attribute_string==null||attribute_string.length<2)return null;withInName=withInValue=false;for(var i=0;i','gi'),'');content=content.replace(new RegExp('<[ ]*object','gi'),'','gi'),'');while((startPos=content.indexOf('',startPos);var attribs=TinyMCE_flash_parseAttributes(content.substring(startPos+6,endPos));embedList[embedList.length]=attribs;}var index=0;while((startPos=content.indexOf('=embedList.length)break;var attribs=embedList[index];endPos=content.indexOf('',startPos);endPos+=9;var contentAfter=content.substring(endPos);content=content.substring(0,startPos);content+=''+content.substring(endPos);content+=contentAfter;index++;startPos++;}break;case "get_from_editor":var startPos=-1;while((startPos=content.indexOf('',startPos);var attribs=TinyMCE_flash_parseAttributes(content.substring(startPos+4,endPos));if(attribs['name']!="mce_plugin_flash")continue;endPos+=2;var embedHTML='';embedHTML+='';embedHTML+='';embedHTML+='';embedHTML+='';embedHTML+='';chunkBefore=content.substring(0,startPos);chunkAfter=content.substring(endPos);content=chunkBefore+embedHTML+chunkAfter;}break;}return content;}function TinyMCE_flash_handleNodeChange(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){function getAttrib(elm,name){return elm.getAttribute(name)?elm.getAttribute(name):"";}tinyMCE.switchClassSticky(editor_id+'_flash','mceButtonNormal');if(node==null)return;do{if(node.nodeName.toLowerCase()=="img"&&getAttrib(node,'name').indexOf('mce_plugin_flash')==0)tinyMCE.switchClassSticky(editor_id+'_flash','mceButtonSelected');}while((node=node.parentNode));return true;} \ No newline at end of file diff --git a/public/tiny_mce/plugins/flash/editor_plugin_src.js b/public/tiny_mce/plugins/flash/editor_plugin_src.js deleted file mode 100644 index 3de1762..0000000 --- a/public/tiny_mce/plugins/flash/editor_plugin_src.js +++ /dev/null @@ -1,225 +0,0 @@ -/* Import plugin specific language pack */ -tinyMCE.importPluginLanguagePack('flash', 'en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl,pt_br'); - -function TinyMCE_flash_initInstance(inst) { - if (!tinyMCE.settings['flash_skip_plugin_css']) - tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/plugins/flash/flash.css"); -} - -function TinyMCE_flash_getControlHTML(control_name) { - switch (control_name) { - case "flash": - return ''; - } - - return ""; -} - -function TinyMCE_flash_parseAttributes(attribute_string) { - var attributeName = ""; - var attributeValue = ""; - var withInName; - var withInValue; - var attributes = new Array(); - var whiteSpaceRegExp = new RegExp('^[ \n\r\t]+', 'g'); - - if (attribute_string == null || attribute_string.length < 2) - return null; - - withInName = withInValue = false; - - for (var i=0; i','gi'),''); - content = content.replace(new RegExp('<[ ]*object','gi'),'','gi'),''); - - // Parse all embed tags - while ((startPos = content.indexOf('', startPos); - var attribs = TinyMCE_flash_parseAttributes(content.substring(startPos + 6, endPos)); - embedList[embedList.length] = attribs; - } - - // Parse all object tags and replace them with images from the embed data - var index = 0; - while ((startPos = content.indexOf('= embedList.length) - break; - - var attribs = embedList[index]; - - // Find end of object - endPos = content.indexOf('', startPos); - endPos += 9; - - // Insert image - var contentAfter = content.substring(endPos); - content = content.substring(0, startPos); - content += '' + content.substring(endPos); - content += contentAfter; - index++; - - startPos++; - } - break; - - case "get_from_editor": - // Parse all img tags and replace them with object+embed - var startPos = -1; - while ((startPos = content.indexOf('', startPos); - var attribs = TinyMCE_flash_parseAttributes(content.substring(startPos + 4, endPos)); - - // Is not flash, skip it - if (attribs['name'] != "mce_plugin_flash") - continue; - - endPos += 2; - - var embedHTML = ''; - - // Insert object + embed - embedHTML += ''; - embedHTML += ''; - embedHTML += ''; - embedHTML += ''; - embedHTML += ''; - - // Insert embed/object chunk - chunkBefore = content.substring(0, startPos); - chunkAfter = content.substring(endPos); - content = chunkBefore + embedHTML + chunkAfter; - } - break; - } - - // Pass through to next handler in chain - return content; -} - -function TinyMCE_flash_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { - function getAttrib(elm, name) { - return elm.getAttribute(name) ? elm.getAttribute(name) : ""; - } - - tinyMCE.switchClassSticky(editor_id + '_flash', 'mceButtonNormal'); - - if (node == null) - return; - - do { - if (node.nodeName.toLowerCase() == "img" && getAttrib(node, 'name').indexOf('mce_plugin_flash') == 0) - tinyMCE.switchClassSticky(editor_id + '_flash', 'mceButtonSelected'); - } while ((node = node.parentNode)); - - return true; -} diff --git a/public/tiny_mce/plugins/flash/flash.css b/public/tiny_mce/plugins/flash/flash.css deleted file mode 100644 index a05f373..0000000 --- a/public/tiny_mce/plugins/flash/flash.css +++ /dev/null @@ -1,7 +0,0 @@ -.mce_plugin_flash { - border: 1px dotted #cc0000; - background-image: url(images/flash.gif); - background-position: center; - background-repeat: no-repeat; - background-color: #ffffcc; -} diff --git a/public/tiny_mce/plugins/flash/flash.htm b/public/tiny_mce/plugins/flash/flash.htm deleted file mode 100644 index 139c9ca..0000000 --- a/public/tiny_mce/plugins/flash/flash.htm +++ /dev/null @@ -1,182 +0,0 @@ - - -{$lang_insert_flash} - - - - - - -
- - - - - - - - - - - - - - - -
{$lang_insert_flash}

- - - - - - - - - - - -
{$lang_insert_flash_file}: - - - - - -
-
{$lang_insert_flash_size}: - -  x  - -

- -
-
- - diff --git a/public/tiny_mce/plugins/flash/images/flash.gif b/public/tiny_mce/plugins/flash/images/flash.gif deleted file mode 100644 index 4950e673cfe090074b13328ad31d548186b891bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 664 zcmZ?wbhEHb6k!ly_{PBS|NsAg|Ni~``}fDsU*Ep}`1bwh*RNl{eEt6A%a>1|K7IWB z?c=AfA3lBg`0?ZWk6+$@{QUm?`*-i&y?OWX_1h0`-n@D7`rY%_AD_Se@Z!abr!U?- zd-m+{vsaHn;Q75r&mMrlvs({e-hKG&?t`ay9z3~y|H-|3Pww8md-Lw2J9i%4zWwml zty|Y_J-B}3{`KqEFJHZT?%Koimu{cGeCO=to2M?{Id|#ysSDSRU%YkV{Ed@muN*&n z{m7YX$Ie_oe)`g((^n6kxU&1$rJYBw>^gLE+y1kg4_w@~`@n|XM_2ARwQB2;Ra+0P z-MnMPmcxryuAjMV)8u(8I_B@3FmFZYoDChbH*`*4)-ZKV{ggFr6X#TR&dBLrSkgS9 zpm9=ueNSe?S+)JyHJ#~|oyp~$F_rxx8P&ouO$vd9te&|%4#{E`VeD2h%+_&i zmNBem5v=A>tfmnxCSfebAuI+#EQUcW`u;4szRWrvjOtztxPjtN7DfgJHU=G#5>T8l zuzzh}Yie$3ZENr7WE1y^OiqsU5%1zM35*K%@Cc3yG~sIJb4c{I*HBS0_V!J5;A=Ba zv{024;x{WROL0y#Zxsu&Ru*Pu;>k!$Nl~*85^M2_(-CE6U=vy)Fcprf!e)k|)OxcNRQQ@jSuDxx-O$)t4JV?tL';}return "";}function TinyMCE_fullscreen_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceFullScreen":if(tinyMCE.getParam('fullscreen_is_enabled')){window.opener.tinyMCE.execInstanceCommand(tinyMCE.getParam('fullscreen_editor_id'),'mceSetContent',false,tinyMCE.getContent(editor_id));top.close();}else{tinyMCE.setWindowArg('editor_id',editor_id);var win=window.open(tinyMCE.baseURL+"/plugins/fullscreen/fullscreen.htm","mceFullScreenPopup","fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width="+screen.availWidth+",height="+screen.availHeight);}return true;}return false;} \ No newline at end of file diff --git a/public/tiny_mce/plugins/fullscreen/editor_plugin_src.js b/public/tiny_mce/plugins/fullscreen/editor_plugin_src.js deleted file mode 100644 index de9bcba..0000000 --- a/public/tiny_mce/plugins/fullscreen/editor_plugin_src.js +++ /dev/null @@ -1,34 +0,0 @@ -/* Import plugin specific language pack */ -tinyMCE.importPluginLanguagePack('fullscreen', 'en,sv,cs'); - -function TinyMCE_fullscreen_getControlHTML(control_name) { - switch (control_name) { - case "fullscreen": - return ''; - } - - return ""; -} - -function TinyMCE_fullscreen_execCommand(editor_id, element, command, user_interface, value) { - // Handle commands - switch (command) { - case "mceFullScreen": - if (tinyMCE.getParam('fullscreen_is_enabled')) { - // In fullscreen mode - window.opener.tinyMCE.execInstanceCommand(tinyMCE.getParam('fullscreen_editor_id'), 'mceSetContent', false, tinyMCE.getContent(editor_id)); - top.close(); - } else { - tinyMCE.setWindowArg('editor_id', editor_id); - - var win = window.open(tinyMCE.baseURL + "/plugins/fullscreen/fullscreen.htm", "mceFullScreenPopup", "fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width=" + screen.availWidth + ",height=" + screen.availHeight); - } - - return true; - } - - // Pass to next handler in chain - return false; -} - - diff --git a/public/tiny_mce/plugins/fullscreen/fullscreen.htm b/public/tiny_mce/plugins/fullscreen/fullscreen.htm deleted file mode 100644 index 30644e6..0000000 --- a/public/tiny_mce/plugins/fullscreen/fullscreen.htm +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - diff --git a/public/tiny_mce/plugins/fullscreen/images/fullscreen.gif b/public/tiny_mce/plugins/fullscreen/images/fullscreen.gif deleted file mode 100644 index 850ff8d42d926f86c4f9f16e8cbf93d8c1c637fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 391 zcmZ?wbhEHb6k!lyxXJ(m|NsC0@ZtZ38~+<7TnH$*kkIg;pyR@U3;!3aIPl=b|Aqx0 zCT#fcQ1HMZ<3K>gg@ld=1v5T0%($@O#Q%VX2MG-a8Wud5u;Igk1OFFnxNzaYe}{?( z0Tl-lIxaM<_%LC|e}{?-4h07iCOjxu@S$PD{{uJvJ2X5fm~fzB!G#SM{x3N3-@qeb z!Hx?HHXOL{;{SsW|3Ccr|NsAgkh6%xia%Kx85j&1bU?~Meqvx-a$rV*hmKVLi6ufO zlTwY=W|%noN<=p1FdTcz#j^hTst#8{zjnV?;UWu%E<;0Mi%hnqS6G^VPB1HUEh$UT zuaW0bZYXlrHBeXO5Z0=dQx@cHbm>#)(C6aPlPXu@)$4JZqdA2~j$2TPjaO=g;T++G ziz_(zH*cLIAwF#b8$atlS577&G4AO~0wQYCB3n+jE?BT=@#3w9+7BK+dg%T1+4C1K IogEph0V&C)TL1t6 diff --git a/public/tiny_mce/plugins/fullscreen/langs/cs.js b/public/tiny_mce/plugins/fullscreen/langs/cs.js deleted file mode 100644 index 04b8b2d..0000000 --- a/public/tiny_mce/plugins/fullscreen/langs/cs.js +++ /dev/null @@ -1,4 +0,0 @@ -// CS lang variables - -tinyMCELang['lang_fullscreen_title'] = 'Fullscreen'; -tinyMCELang['lang_fullscreen_desc'] = 'Pr(epnout na fullscreen'; diff --git a/public/tiny_mce/plugins/fullscreen/langs/en.js b/public/tiny_mce/plugins/fullscreen/langs/en.js deleted file mode 100644 index 7cfe92d..0000000 --- a/public/tiny_mce/plugins/fullscreen/langs/en.js +++ /dev/null @@ -1,4 +0,0 @@ -// UK lang variables - -tinyMCELang['lang_fullscreen_title'] = 'Fullscreen mode' -tinyMCELang['lang_fullscreen_desc'] = 'Toggle fullscreen mode' diff --git a/public/tiny_mce/plugins/fullscreen/langs/sv.js b/public/tiny_mce/plugins/fullscreen/langs/sv.js deleted file mode 100644 index 9215295..0000000 --- a/public/tiny_mce/plugins/fullscreen/langs/sv.js +++ /dev/null @@ -1,4 +0,0 @@ -// SV lang variables - -tinyMCELang['lang_fullscreen_title'] = 'Fullskärmsläge' -tinyMCELang['lang_fullscreen_desc'] = 'Hoppa från/till fullskärmsläge' diff --git a/public/tiny_mce/plugins/fullscreen/langs/zh_cn.js b/public/tiny_mce/plugins/fullscreen/langs/zh_cn.js deleted file mode 100644 index 6572603..0000000 --- a/public/tiny_mce/plugins/fullscreen/langs/zh_cn.js +++ /dev/null @@ -1,5 +0,0 @@ -// Simplified Chinese lang variables contributed by cube316 (cube316@gmail.com) -// http://www.cube316.net/ ԻȡTinyMCE֧ - -tinyMCELang['lang_fullscreen_title'] = 'ȫģʽ' -tinyMCELang['lang_fullscreen_desc'] = 'лȫģʽ' diff --git a/public/tiny_mce/plugins/fullscreen/readme.txt b/public/tiny_mce/plugins/fullscreen/readme.txt deleted file mode 100644 index 1be5b27..0000000 --- a/public/tiny_mce/plugins/fullscreen/readme.txt +++ /dev/null @@ -1,17 +0,0 @@ - Fullscreen plugin for TinyMCE ------------------------------- - -This plugin adds fullscreen mode to TinyMCE. - -Installation instructions: - * Add plugin to TinyMCE plugin option list example: plugins : "fullscreen". - * Add the fullscreen button name to button list, example: theme_advanced_buttons3_add : "fullscreen". - -Initialization example: - tinyMCE.init({ - theme : "advanced", - mode : "textareas", - plugins : "fullscreen", - theme_advanced_buttons3_add : "fullscreen", - plaintext_create_paragraphs : false - }); diff --git a/public/tiny_mce/plugins/iespell/editor_plugin.js b/public/tiny_mce/plugins/iespell/editor_plugin.js deleted file mode 100644 index 2d6c817..0000000 --- a/public/tiny_mce/plugins/iespell/editor_plugin.js +++ /dev/null @@ -1,2 +0,0 @@ -/* Import plugin specific language pack */ - tinyMCE.importPluginLanguagePack('iespell','cs,el,en,fr_ca,it,ko,sv,zh_cn,fr,de,pl,pt_br');function TinyMCE_iespell_getControlHTML(control_name){if(control_name=="iespell"&&tinyMCE.isMSIE)return '';return "";}function TinyMCE_iespell_execCommand(editor_id,element,command,user_interface,value){if(command=="mceIESpell"){try{var ieSpell=new ActiveXObject("ieSpell.ieSpellExtension");ieSpell.CheckDocumentNode(tinyMCE.getInstanceById(editor_id).contentDocument.documentElement);}catch(e){if(e.number==-2146827859){if(confirm(tinyMCE.getLang("lang_iespell_download","",true)))window.open('http://www.iespell.com/download.php','ieSpellDownload','');}else alert("Error Loading ieSpell: Exception "+e.number);}return true;}return false;} \ No newline at end of file diff --git a/public/tiny_mce/plugins/iespell/editor_plugin_src.js b/public/tiny_mce/plugins/iespell/editor_plugin_src.js deleted file mode 100644 index b85ea9f..0000000 --- a/public/tiny_mce/plugins/iespell/editor_plugin_src.js +++ /dev/null @@ -1,37 +0,0 @@ -/* Import plugin specific language pack */ -tinyMCE.importPluginLanguagePack('iespell', 'cs,el,en,fr_ca,it,ko,sv,zh_cn,fr,de,pl,pt_br'); - -/** - * Returns the HTML contents of the iespell control. - */ -function TinyMCE_iespell_getControlHTML(control_name) { - // Is it the iespell control and is the brower MSIE. - if (control_name == "iespell" && tinyMCE.isMSIE) - return ''; - - return ""; -} - -/** - * Executes the mceIESpell command. - */ -function TinyMCE_iespell_execCommand(editor_id, element, command, user_interface, value) { - // Handle ieSpellCommand - if (command == "mceIESpell") { - try { - var ieSpell = new ActiveXObject("ieSpell.ieSpellExtension"); - ieSpell.CheckDocumentNode(tinyMCE.getInstanceById(editor_id).contentDocument.documentElement); - } catch (e) { - if (e.number == -2146827859) { - if (confirm(tinyMCE.getLang("lang_iespell_download", "", true))) - window.open('http://www.iespell.com/download.php', 'ieSpellDownload', ''); - } else - alert("Error Loading ieSpell: Exception " + e.number); - } - - return true; - } - - // Pass to next handler in chain - return false; -} \ No newline at end of file diff --git a/public/tiny_mce/plugins/iespell/images/iespell.gif b/public/tiny_mce/plugins/iespell/images/iespell.gif deleted file mode 100644 index 46c0c4a66a49c81d695ebc0ffb12aa991489d4db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmZ?wbhEHb6k!ly*vtR||NsB@^<8F=@gSh#!GsMT3<@6HzH!ml*Z2Sb{~&2ptoW0K zk%57eK?fuZGJ}D|#o(mp>b(}P&+1Oe;@2Uoh&Yw=gdJFl-( mmK5rhU2-&lF^y-v=akRC1e^5_g&HY{Y@4KCv8R`T!5RR-v@{d| diff --git a/public/tiny_mce/plugins/iespell/langs/cs.js b/public/tiny_mce/plugins/iespell/langs/cs.js deleted file mode 100644 index c38a480..0000000 --- a/public/tiny_mce/plugins/iespell/langs/cs.js +++ /dev/null @@ -1,4 +0,0 @@ -// UK lang variables - -tinyMCELang['lang_iespell_desc'] = 'Spustit kontrolu pravopisu'; -tinyMCELang['lang_iespell_download'] = "ieSpell nedetekovn. Kliknte na OK a otevete stahovac strnku." \ No newline at end of file diff --git a/public/tiny_mce/plugins/iespell/langs/de.js b/public/tiny_mce/plugins/iespell/langs/de.js deleted file mode 100644 index 80a3b02..0000000 --- a/public/tiny_mce/plugins/iespell/langs/de.js +++ /dev/null @@ -1,4 +0,0 @@ -// DE lang variables by Tobias Heer - -tinyMCELang['lang_iespell_desc'] = 'Rechtschreibprüfung'; -tinyMCELang['lang_iespell_download'] = "ieSpell nicht gefunden. Klicken Sie OK um auf die Download Seite zu gelangen." diff --git a/public/tiny_mce/plugins/iespell/langs/el.js b/public/tiny_mce/plugins/iespell/langs/el.js deleted file mode 100644 index 7925947..0000000 --- a/public/tiny_mce/plugins/iespell/langs/el.js +++ /dev/null @@ -1,4 +0,0 @@ -// Greek lang variables by Jacaranda Bill - -tinyMCELang['lang_iespell_desc'] = ' '; -tinyMCELang['lang_iespell_download'] = " ieSpell . OK ." diff --git a/public/tiny_mce/plugins/iespell/langs/en.js b/public/tiny_mce/plugins/iespell/langs/en.js deleted file mode 100644 index b7cc3a4..0000000 --- a/public/tiny_mce/plugins/iespell/langs/en.js +++ /dev/null @@ -1,4 +0,0 @@ -// UK lang variables - -tinyMCELang['lang_iespell_desc'] = 'Run spell checking'; -tinyMCELang['lang_iespell_download'] = "ieSpell not detected. Click OK to go to download page." diff --git a/public/tiny_mce/plugins/iespell/langs/fr.js b/public/tiny_mce/plugins/iespell/langs/fr.js deleted file mode 100644 index de66fb0..0000000 --- a/public/tiny_mce/plugins/iespell/langs/fr.js +++ /dev/null @@ -1,4 +0,0 @@ -// French lang variables by Laurent Dran - -tinyMCELang['lang_iespell_desc'] = 'Executer le vérificateur d\'orthographe'; -tinyMCELang['lang_iespell_download'] = "ieSpell n\'a pas été trouvé. Cliquez sur OK pour aller au site de téléchargement." diff --git a/public/tiny_mce/plugins/iespell/langs/fr_ca.js b/public/tiny_mce/plugins/iespell/langs/fr_ca.js deleted file mode 100644 index 9c172b0..0000000 --- a/public/tiny_mce/plugins/iespell/langs/fr_ca.js +++ /dev/null @@ -1,4 +0,0 @@ -// CAN_FR lang variables - -tinyMCELang['lang_iespell_desc'] = 'Executer le vrificateur d\'orthographe'; -tinyMCELang['lang_iespell_download'] = "ieSpell n\'a pas t trouv. Cliquez sur OK pour aller au site de tlchargement."; diff --git a/public/tiny_mce/plugins/iespell/langs/it.js b/public/tiny_mce/plugins/iespell/langs/it.js deleted file mode 100644 index 5f6e2f0..0000000 --- a/public/tiny_mce/plugins/iespell/langs/it.js +++ /dev/null @@ -1,4 +0,0 @@ -// IT lang variables - -tinyMCELang['lang_iespell_desc'] = 'Avvia il controllo ortografico'; -tinyMCELang['lang_iespell_download'] = "ieSpell non trovato. Clicca OK per andare alla pagina di download." diff --git a/public/tiny_mce/plugins/iespell/langs/ko.js b/public/tiny_mce/plugins/iespell/langs/ko.js deleted file mode 100644 index a5bbfe4..0000000 --- a/public/tiny_mce/plugins/iespell/langs/ko.js +++ /dev/null @@ -1,4 +0,0 @@ -// KO lang variables - -tinyMCELang['lang_iespell_desc'] = ' ˻ '; -tinyMCELang['lang_iespell_download'] = "ieSpell ã ϴ. OK ٿε ̵մϴ." diff --git a/public/tiny_mce/plugins/iespell/langs/pl.js b/public/tiny_mce/plugins/iespell/langs/pl.js deleted file mode 100644 index 9fcb4e3..0000000 --- a/public/tiny_mce/plugins/iespell/langs/pl.js +++ /dev/null @@ -1,4 +0,0 @@ -// PL lang variables - -tinyMCELang['lang_iespell_desc'] = 'Uruchom sprawdzanie pisowni'; -tinyMCELang['lang_iespell_download'] = "Nie wykryto pluginu, kliknij aby przejść do strony z pluginami." \ No newline at end of file diff --git a/public/tiny_mce/plugins/iespell/langs/pt_br.js b/public/tiny_mce/plugins/iespell/langs/pt_br.js deleted file mode 100644 index dba6e82..0000000 --- a/public/tiny_mce/plugins/iespell/langs/pt_br.js +++ /dev/null @@ -1,4 +0,0 @@ -// pt_BR lang variables - -tinyMCELang['lang_iespell_desc'] = 'Executar verificao ortogrfica'; -tinyMCELang['lang_iespell_download'] = "Verificador ieSpell no detectado. Click OK para ir pgina de download." diff --git a/public/tiny_mce/plugins/iespell/langs/sv.js b/public/tiny_mce/plugins/iespell/langs/sv.js deleted file mode 100644 index 2230c1c..0000000 --- a/public/tiny_mce/plugins/iespell/langs/sv.js +++ /dev/null @@ -1,4 +0,0 @@ -// SE lang variables - -tinyMCELang['lang_iespell_desc'] = 'Kr rttstavningskontroll'; -tinyMCELang['lang_iespell_download'] = "ieSpell verkar inte vara installerad. Klicka OK för att ladda hem." diff --git a/public/tiny_mce/plugins/iespell/langs/zh_cn.js b/public/tiny_mce/plugins/iespell/langs/zh_cn.js deleted file mode 100644 index 35aeba1..0000000 --- a/public/tiny_mce/plugins/iespell/langs/zh_cn.js +++ /dev/null @@ -1,5 +0,0 @@ -// Simplified Chinese lang variables contributed by cube316 (cube316@gmail.com) -// http://www.cube316.net/ ԻȡTinyMCE֧ - -tinyMCELang['lang_iespell_desc'] = 'ƴд'; -tinyMCELang['lang_iespell_download'] = "δ⵽ieSpellƴд飬 OK ǰҳ档" diff --git a/public/tiny_mce/plugins/iespell/readme.txt b/public/tiny_mce/plugins/iespell/readme.txt deleted file mode 100644 index 0371a2a..0000000 --- a/public/tiny_mce/plugins/iespell/readme.txt +++ /dev/null @@ -1,20 +0,0 @@ - ieSpell plugin for TinyMCE ----------------------------- - -Installation instructions: - * Copy the iespell directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins). - * Add plugin to TinyMCE plugin option list example: plugins : "iespell". - * Add the iespell button name to button list, example: theme_advanced_buttons3_add : "iespell". - -Initialization example: - tinyMCE.init({ - theme : "advanced", - mode : "textareas", - plugins : "iespell", - theme_advanced_buttons3_add : "iespell" - }); - -Requirements: - The end user will need MSIE on Windows with the ieSpell installed. This can be downloaded - from http://www.iespell.com/download.php. Notice on other browsers than MSIE the spellchecking - button will not be visible. diff --git a/public/tiny_mce/plugins/insertdatetime/editor_plugin.js b/public/tiny_mce/plugins/insertdatetime/editor_plugin.js deleted file mode 100644 index 0d4b26b..0000000 --- a/public/tiny_mce/plugins/insertdatetime/editor_plugin.js +++ /dev/null @@ -1,2 +0,0 @@ -/* Import plugin specific language pack */ - tinyMCE.importPluginLanguagePack('insertdatetime','cs,el,en,fr_ca,it,ko,sv,zh_cn,fa,fr,de,pl,pt_br');function TinyMCE_insertdatetime_getControlHTML(control_name){var safariPatch='" onclick="';if(tinyMCE.isSafari)safariPatch="";switch(control_name){case "insertdate":return '';case "inserttime":return '';}return "";}function TinyMCE_insertdatetime_execCommand(editor_id,element,command,user_interface,value){function addZeros(value,len){value=""+value;if(value.length'; - - case "inserttime": - return ''; - } - - return ""; -} - -/** - * Executes the mceInsertDate command. - */ -function TinyMCE_insertdatetime_execCommand(editor_id, element, command, user_interface, value) { - /* Adds zeros infront of value */ - function addZeros(value, len) { - value = "" + value; - - if (value.length < len) { - for (var i=0; i<(len-value.length); i++) - value = "0" + value; - } - - return value; - } - - /* Returns the date object in the specified format */ - function getDateTime(date, format) { - format = tinyMCE.regexpReplace(format, "%D", "%m/%d/%y"); - format = tinyMCE.regexpReplace(format, "%r", "%I:%M:%S %p"); - format = tinyMCE.regexpReplace(format, "%Y", "" + date.getFullYear()); - format = tinyMCE.regexpReplace(format, "%y", "" + date.getYear()); - format = tinyMCE.regexpReplace(format, "%m", addZeros(date.getMonth()+1, 2)); - format = tinyMCE.regexpReplace(format, "%d", addZeros(date.getDate(), 2)); - format = tinyMCE.regexpReplace(format, "%H", "" + addZeros(date.getHours(), 2)); - format = tinyMCE.regexpReplace(format, "%M", "" + addZeros(date.getMinutes(), 2)); - format = tinyMCE.regexpReplace(format, "%S", "" + addZeros(date.getSeconds(), 2)); - format = tinyMCE.regexpReplace(format, "%I", "" + (date.getHours() < 12 ? (date.getHours()+1) : 24-date.getHours())); - format = tinyMCE.regexpReplace(format, "%p", "" + (date.getHours() < 12 ? "AM" : "PM")); - format = tinyMCE.regexpReplace(format, "%B", "" + tinyMCE.getLang("lang_inserttime_months_long")[date.getMonth()]); - format = tinyMCE.regexpReplace(format, "%b", "" + tinyMCE.getLang("lang_inserttime_months_short")[date.getMonth()]); - format = tinyMCE.regexpReplace(format, "%A", "" + tinyMCE.getLang("lang_inserttime_day_long")[date.getDay()]); - format = tinyMCE.regexpReplace(format, "%a", "" + tinyMCE.getLang("lang_inserttime_day_short")[date.getDay()]); - format = tinyMCE.regexpReplace(format, "%%", "%"); - - return format; - } - - // Handle commands - switch (command) { - case "mceInsertDate": - tinyMCE.execInstanceCommand(editor_id, 'mceInsertContent', false, getDateTime(new Date(), tinyMCE.getParam("plugin_insertdate_dateFormat", "%Y-%m-%d"))); - return true; - - case "mceInsertTime": - tinyMCE.execInstanceCommand(editor_id, 'mceInsertContent', false, getDateTime(new Date(), tinyMCE.getParam("plugin_insertdate_timeFormat", "%H:%M:%S"))); - return true; - } - - // Pass to next handler in chain - return false; -} diff --git a/public/tiny_mce/plugins/insertdatetime/images/insertdate.gif b/public/tiny_mce/plugins/insertdatetime/images/insertdate.gif deleted file mode 100644 index 5002f8746349bc868efbc06491232dfa97d3c109..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1031 zcmZ?wbhEHb6k!lyXlDQc0S*BL1qB5S0|N^O1CIm;2L}g_fPjdEfCMneNJvO1NGK>M zs3^|NnoGH%9Sj2#_8Eia%MH85o=xbU<1`d4hrC2}3J~jK_ur2b(#BwQM35 zJ>(FS&xFo`5`R&8)(VB}uqIOiKjLGp3VjZC&Im5dAwH}^Q2$vl|&c>Ns(hp--c!fH?!a2 SEZi^mu4>`O$85|@4AuZoY0hr| diff --git a/public/tiny_mce/plugins/insertdatetime/images/inserttime.gif b/public/tiny_mce/plugins/insertdatetime/images/inserttime.gif deleted file mode 100644 index eb76a832d4af92c335a27f1d30094cde8b763cc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 958 zcmZ?wbhEHb6k!lyXlDQc1B(DFrwA+02!ntE2af<(pM;?J?AWB@goK31jJAM^4e9x< z2?Y%qbyJJVnv1G?%UY)-bX+LtI8ZR-Lcxp&4Gj|-yJodbo_a5AS^yr2I7Zx1&zu~}x4JZC@xbXkLjsph|95{UV$mx^k4ji~};KYT~ zXD?j4a_#!{8wYOuzwqGygBKqjy!ij%!~YK;@c+Y)|Nnpd|Ns9#$Zw-~Gz9R5fZ|UU zW(EdN1|5(pP@Z7mn9VSmL&jsnf`iQ*!dfvWHY_}>V(U?Hp`r0GcbjDti(*qtM<0ih z$ghS(md;*fx2`h@0ZI$G`#c<242@ViI5{}&6>erG9v4uw58?4x!N_@vMW^A - -{$lang_insert_attachment_title} - - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
{$lang_insert_attachment_title}
{$lang_insert_attachment_url}: - - - - -
{$lang_theme_insert_link_titlefield}:
{$lang_insert_attachment_target}: - - - - - - - - - - - - - - - - - - - - - -
 ({$lang_insert_attachment_target_same})
 ({$lang_insert_attachment_target_parent})
 ({$lang_insert_attachment_target_top})
 ({$lang_insert_attachment_target_blank})
- - - - - - -
 
-
- - - - - - - - - - - - - - - - - -
{$lang_insert_attachment_popup_url}:  - - - - -
{$lang_insert_attachment_popup_name}: 
{$lang_insert_attachment_popup_size}:  - x - px -
{$lang_insert_attachment_popup_position}:  - / - (c /c = center) -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  
 
   
 
-
-
- - diff --git a/public/tiny_mce/plugins/linkattach/editor_plugin.js b/public/tiny_mce/plugins/linkattach/editor_plugin.js deleted file mode 100644 index 1b2fd17..0000000 --- a/public/tiny_mce/plugins/linkattach/editor_plugin.js +++ /dev/null @@ -1,2 +0,0 @@ -/* Import plugin specific language pack */ - tinyMCE.importPluginLanguagePack('linkattach','en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl');function TinyMCE_linkattach_getInsertAttachmentTemplate(){var template=new Array();template['file']='../../plugins/linkattach/attachment.htm';template['width']=400;template['height']=420;template['width']+=tinyMCE.getLang('lang_insert_attachment_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_attachment_delta_height',0);return template;} \ No newline at end of file diff --git a/public/tiny_mce/plugins/linkattach/editor_plugin_src.js b/public/tiny_mce/plugins/linkattach/editor_plugin_src.js deleted file mode 100644 index 89e2028..0000000 --- a/public/tiny_mce/plugins/linkattach/editor_plugin_src.js +++ /dev/null @@ -1,18 +0,0 @@ -/* Import plugin specific language pack */ -tinyMCE.importPluginLanguagePack('linkattach', 'en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl'); - -/** - * Insert link template function. - */ -function TinyMCE_linkattach_getInsertAttachmentTemplate() { - var template = new Array(); - template['file'] = '../../plugins/linkattach/attachment.htm'; - template['width'] = 400; - template['height'] = 420; - - // Language specific width and height addons - template['width'] += tinyMCE.getLang('lang_insert_attachment_delta_width', 0); - template['height'] += tinyMCE.getLang('lang_insert_attachment_delta_height', 0); - - return template; -} \ No newline at end of file diff --git a/public/tiny_mce/plugins/linkattach/langs/en.js b/public/tiny_mce/plugins/linkattach/langs/en.js deleted file mode 100644 index cc6441c..0000000 --- a/public/tiny_mce/plugins/linkattach/langs/en.js +++ /dev/null @@ -1,20 +0,0 @@ -// UK lang variables - -tinyMCELang['lang_insert_attachment_target_same'] = 'Open in this window / frame'; -tinyMCELang['lang_insert_attachment_target_parent'] = 'Open in parent window / frame'; -tinyMCELang['lang_insert_attachment_target_top'] = 'Open in top frame (replaces all frames)'; -tinyMCELang['lang_insert_attachment_target_blank'] = 'Open in new window'; -tinyMCELang['lang_insert_attachment_target_named'] = 'Open in the window'; -tinyMCELang['lang_insert_attachment_popup'] = 'JS-Popup'; -tinyMCELang['lang_insert_attachment_popup_url'] = 'Popup URL'; -tinyMCELang['lang_insert_attachment_popup_name'] = 'Window name'; -tinyMCELang['lang_insert_attachment_popup_return'] = 'insert \'return false\''; -tinyMCELang['lang_insert_attachment_popup_scrollbars'] = 'Show scrollbars'; -tinyMCELang['lang_insert_attachment_popup_statusbar'] = 'Show statusbar'; -tinyMCELang['lang_insert_attachment_popup_toolbar'] = 'Show toolbars'; -tinyMCELang['lang_insert_attachment_popup_menubar'] = 'Show menubar'; -tinyMCELang['lang_insert_attachment_popup_location'] = 'Show locationbar'; -tinyMCELang['lang_insert_attachment_popup_resizable'] = 'Make window resizable'; -tinyMCELang['lang_insert_attachment_popup_size'] = 'Size'; -tinyMCELang['lang_insert_attachment_popup_position'] = 'Position (X/Y)'; -tinyMCELang['lang_insert_attachment_popup_missingtarget'] = 'Please insert a name for the target or choose another option.'; diff --git a/public/tiny_mce/plugins/paste/blank.htm b/public/tiny_mce/plugins/paste/blank.htm deleted file mode 100644 index 104b550..0000000 --- a/public/tiny_mce/plugins/paste/blank.htm +++ /dev/null @@ -1,15 +0,0 @@ - - - -blank_page - - - - - - - diff --git a/public/tiny_mce/plugins/paste/editor_plugin.js b/public/tiny_mce/plugins/paste/editor_plugin.js deleted file mode 100644 index 5aa44cb..0000000 --- a/public/tiny_mce/plugins/paste/editor_plugin.js +++ /dev/null @@ -1,25 +0,0 @@ -// Tiny MCE Paste Plugin -// Updated by speednet 25 May 2005 - IE converts and pastes without opening popup window - tinyMCE.importPluginLanguagePack('paste','en,sv,cs');function TinyMCE_paste_getControlHTML(control_name){switch(control_name){case "pastetext":return '';case "pasteword":return '';case "selectall":return '';}return '';}function TinyMCE_paste_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mcePasteText":if(tinyMCE.isMSIE&&!tinyMCE.getParam('paste_use_dialog',false))TinyMCE_paste__insertText(clipboardData.getData("Text"),true);else{var template=new Array();template['file']='../../plugins/paste/pastetext.htm';template['width']=450;template['height']=400;var plain_text="";tinyMCE.openWindow(template,{editor_id:editor_id,plain_text:plain_text,resizable:"yes",scrollbars:"no",mceDo:'insert'});}return true;case "mcePasteWord":if(tinyMCE.isMSIE&&!tinyMCE.getParam('paste_use_dialog',false)){var html=TinyMCE_paste__clipboardHTML();if(html&&html.length>0)TinyMCE_paste__insertWordContent(html);}else{var template=new Array();template['file']='../../plugins/paste/pasteword.htm';template['width']=450;template['height']=400;var plain_text="";tinyMCE.openWindow(template,{editor_id:editor_id,plain_text:plain_text,resizable:"yes",scrollbars:"no",mceDo:'insert'});}return true;case "mceSelectAll":tinyMCE.execInstanceCommand(editor_id,'selectall');return true;}return false;}function TinyMCE_paste__insertText(content,bLinebreaks){if(content&&content.length>0){if(bLinebreaks){if(tinyMCE.getParam("plaintext_create_paragraphs",true)){content=tinyMCE.regexpReplace(content,"\r\n\r\n","

","gi");content=tinyMCE.regexpReplace(content,"\r\r","

","gi");content=tinyMCE.regexpReplace(content,"\n\n","

","gi");if((pos=content.indexOf('

'))!=-1){tinyMCE.execCommand("Delete");var node=tinyMCE.selectedInstance.getFocusElement();var breakElms=new Array();do{if(node.nodeType==1){if(node.nodeName=="TD"||node.nodeName=="BODY")break;breakElms[breakElms.length]=node;}}while(node=node.parentNode);var before="",after="

";before+=content.substring(0,pos);for(var i=0;i";after+="<"+breakElms[(breakElms.length-1)-i].nodeName+">";}before+="

";content=before+content.substring(pos+7)+after;}}content=tinyMCE.regexpReplace(content,"\r\n","
","gi");content=tinyMCE.regexpReplace(content,"\r","
","gi");content=tinyMCE.regexpReplace(content,"\n","
","gi");}tinyMCE.execCommand("mceInsertRawHTML",false,content);}}function TinyMCE_paste__insertWordContent(content){if(content&&content.length>0){content=content.replace(new RegExp('<(!--)([^>]*)(--)>','g'),"");content=content.replace(/<\/?span[^>]*>/gi,"");content=content.replace(/<(\w[^>]*)style="([^"]*)"([^>]*)/gi, "<$1$3"); - content = content.replace(/<\/?font[^>]*>/gi, ""); - content = content.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3"); - content = content.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3"); - content = content.replace(/<\\?\?xml[^>]*>/gi, ""); - content = content.replace(/<\/?\w+:[^>]*>/gi, ""); - content = content.replace(/\/? */gi, ""); - content = content.replace('

 

', '' ,'g'); - - if (!tinyMCE.settings['force_p_newlines']) { - content = content.replace('', '' ,'gi'); - content = content.replace('

', '

' ,'gi'); - } - - if (!tinyMCE.isMSIE && !tinyMCE.settings['force_p_newlines']) { - content = content.replace(/<\/?p[^>]*>/gi, ""); - } - - content = content.replace(/<\/?div[^>]*>/gi, ""); - - // Insert cleaned content - tinyMCE.execCommand("mceAddUndoLevel"); - tinyMCE.execCommand("mceInsertContent",false,content);}}function TinyMCE_paste__clipboardHTML(){var div=document.getElementById('_TinyMCE_clipboardHTML');if(!div){var div=document.createElement('DIV');div.id='_TinyMCE_clipboardHTML';with(div.style){visibility='hidden';overflow='hidden';position='absolute';width=1;height=1;}document.body.appendChild(div);}div.innerHTML='';var rng=document.body.createTextRange();rng.moveToElementText(div);rng.execCommand('Paste');var html=div.innerHTML;div.innerHTML='';return html;} \ No newline at end of file diff --git a/public/tiny_mce/plugins/paste/editor_plugin_src.js b/public/tiny_mce/plugins/paste/editor_plugin_src.js deleted file mode 100644 index 96f00bb..0000000 --- a/public/tiny_mce/plugins/paste/editor_plugin_src.js +++ /dev/null @@ -1,174 +0,0 @@ -// Tiny MCE Paste Plugin -// Updated by speednet 25 May 2005 - IE converts and pastes without opening popup window - -/* Import plugin specific language pack */ -tinyMCE.importPluginLanguagePack('paste', 'en,sv,cs'); - -function TinyMCE_paste_getControlHTML(control_name) { - switch (control_name) { - case "pastetext": - return ''; - - case "pasteword": - return ''; - - case "selectall": - return ''; - } - - return ''; -} - -function TinyMCE_paste_execCommand(editor_id, element, command, user_interface, value) { - switch (command) { - case "mcePasteText": - if (tinyMCE.isMSIE && !tinyMCE.getParam('paste_use_dialog', false)) - TinyMCE_paste__insertText(clipboardData.getData("Text"), true); - else { - var template = new Array(); - template['file'] = '../../plugins/paste/pastetext.htm'; // Relative to theme - template['width'] = 450; - template['height'] = 400; - var plain_text = ""; - tinyMCE.openWindow(template, {editor_id : editor_id, plain_text: plain_text, resizable : "yes", scrollbars : "no", mceDo : 'insert'}); - } - - return true; - - case "mcePasteWord": - if (tinyMCE.isMSIE && !tinyMCE.getParam('paste_use_dialog', false)) { - var html = TinyMCE_paste__clipboardHTML(); - - if (html && html.length > 0) - TinyMCE_paste__insertWordContent(html); - } else { - var template = new Array(); - template['file'] = '../../plugins/paste/pasteword.htm'; // Relative to theme - template['width'] = 450; - template['height'] = 400; - var plain_text = ""; - tinyMCE.openWindow(template, {editor_id : editor_id, plain_text: plain_text, resizable : "yes", scrollbars : "no", mceDo : 'insert'}); - } - - return true; - - case "mceSelectAll": - tinyMCE.execInstanceCommand(editor_id, 'selectall'); - return true; - - } - - // Pass to next handler in chain - return false; -} - -function TinyMCE_paste__insertText(content, bLinebreaks) { - - if (content && content.length > 0) { - if (bLinebreaks) { - // Special paragraph treatment - if (tinyMCE.getParam("plaintext_create_paragraphs", true)) { - content = tinyMCE.regexpReplace(content, "\r\n\r\n", "

", "gi"); - content = tinyMCE.regexpReplace(content, "\r\r", "

", "gi"); - content = tinyMCE.regexpReplace(content, "\n\n", "

", "gi"); - - // Has paragraphs - if ((pos = content.indexOf('

')) != -1) { - tinyMCE.execCommand("Delete"); - - var node = tinyMCE.selectedInstance.getFocusElement(); - - // Get list of elements to break - var breakElms = new Array(); - - do { - if (node.nodeType == 1) { - // Don't break tables and break at body - if (node.nodeName == "TD" || node.nodeName == "BODY") - break; - - breakElms[breakElms.length] = node; - } - } while(node = node.parentNode); - - var before = "", after = "

"; - before += content.substring(0, pos); - - for (var i=0; i"; - after += "<" + breakElms[(breakElms.length-1)-i].nodeName + ">"; - } - - before += "

"; - content = before + content.substring(pos+7) + after; - } - } - - content = tinyMCE.regexpReplace(content, "\r\n", "
", "gi"); - content = tinyMCE.regexpReplace(content, "\r", "
", "gi"); - content = tinyMCE.regexpReplace(content, "\n", "
", "gi"); - } - - tinyMCE.execCommand("mceInsertRawHTML", false, content); - } -} - -function TinyMCE_paste__insertWordContent(content) { - - if (content && content.length > 0) { - // Cleanup Word content - content = content.replace(new RegExp('<(!--)([^>]*)(--)>', 'g'), ""); // Word comments - content = content.replace(/<\/?span[^>]*>/gi, ""); - content = content.replace(/<(\w[^>]*) style="([^"]*)"([^>]*)/gi, "<$1$3"); - content = content.replace(/<\/?font[^>]*>/gi, ""); - content = content.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3"); - content = content.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3"); - content = content.replace(/<\\?\?xml[^>]*>/gi, ""); - content = content.replace(/<\/?\w+:[^>]*>/gi, ""); - content = content.replace(/\/? */gi, ""); - content = content.replace('

 

', '' ,'g'); - - if (!tinyMCE.settings['force_p_newlines']) { - content = content.replace('', '' ,'gi'); - content = content.replace('

', '

' ,'gi'); - } - - if (!tinyMCE.isMSIE && !tinyMCE.settings['force_p_newlines']) { - content = content.replace(/<\/?p[^>]*>/gi, ""); - } - - content = content.replace(/<\/?div[^>]*>/gi, ""); - - // Insert cleaned content - tinyMCE.execCommand("mceAddUndoLevel"); - tinyMCE.execCommand("mceInsertContent", false, content); - } -} - -function TinyMCE_paste__clipboardHTML() { - var div = document.getElementById('_TinyMCE_clipboardHTML'); - - if (!div) { - var div = document.createElement('DIV'); - div.id = '_TinyMCE_clipboardHTML'; - - with (div.style) { - visibility = 'hidden'; - overflow = 'hidden'; - position = 'absolute'; - width = 1; - height = 1; - } - - document.body.appendChild(div); - } - - div.innerHTML = ''; - var rng = document.body.createTextRange(); - rng.moveToElementText(div); - rng.execCommand('Paste'); - var html = div.innerHTML; - div.innerHTML = ''; - return html; -} - diff --git a/public/tiny_mce/plugins/paste/images/pastetext.gif b/public/tiny_mce/plugins/paste/images/pastetext.gif deleted file mode 100644 index 6b9f93fb068a118f8b0a6dc51d5f61c4fae0e2f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1023 zcmZ?wbhEHb6k!ly_|Cw*(I{&(3Oy^mML8+PhNc~$#VJgYRQsS zN50%jY3W+BWKznXPg}m+YWZ@?<;bNcB~c+?R3A82)QB{Ac+8gysJ;hW|offeTOm+pzq<&hS5qfuW<2!R{)9 z@f8M!at0l+5fDO~k%56h6wFpw!uaetgOCu2ljO$0d4Zwn21890!-I~(1iP!EV7<3l zSy>qvniv>r7#I%lFx+8b@CQ5X!32f`TLwmBklvgYb`S-|G3Qr5y=*STFcGA~f`Q>V z$juB43>M7{KeZTyzy?V$FuY@6m;h42P{6>z$^cOf_5uTx%+>5>-Oey^5<^W5gBQ>L zZw&t%UjDCP_|LGfo57Aj6l@N||1}K%KS4bIfPobmPQ;q8b2ImkyQw4IANgR-Ym>w zCiCV)@}VY1P7RF-3sl?~rn2$Z#C&+t$RX%i=azBlNE>gHtj?^2NlOyAc`djU6f6!o zGRXuG;K^#1+YXA!@Zm$3U diff --git a/public/tiny_mce/plugins/paste/images/pasteword.gif b/public/tiny_mce/plugins/paste/images/pasteword.gif deleted file mode 100644 index 55c1d2425e26bf7bcab2cd9e91d0fb95f4088444..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 640 zcmZ?wbhEHb6k!lyc*Xz%|NsC0@afn3J@@ZC`ogZ)T{iJ*=hBzWb8byu{cP2~kK0dt zF^t-#ZkrQWb}FRmTzKt8pUma)4QJzO4u|9{i78oKKkr%f^c!ilo4c3Xy>{o7W9||A z)GZ#xXPh&4T1L)D>${z?&0)t^WtK)2T>kiGt?PXna zK73g4;lqXn3no0c(eUBLgbODc9^9Dl;l+XrCnkJ&(D30#LP3VZhX)h>e^@Y~BVoae zf)5u09-K({aHHV=hYcTYG<-PW@c+ev2P+sZ%wYJiL*T*!fe$+rJ{&Mu(4g?)M8Jj_ z0Us_DESQjRU_(Pfgu{f6f(0`g+Um16teEg%0mFw40v}c|T$sS{;Y7iQ0|^ZU0TUV$ zHY{jpNHB0PPzZ1^NCsNSM%2uwX*Nh6NKQbTkx11pNR19~69)Va1;;j0_B! z3_2iVKykvrezzgBskx=Kt-YhOt2@)*Kei_`WU`-$iLpgsdSFM0o`bH9Zm>~wT$D#r zdx(RBwW*gH=p&G$$v!n7D!fpR{(1zJs%+uRAB>rOTI8TY^l?>}|u? zxj2NRgjhr*uQdl*ntOYOiLr19v&gXs>O5~sb#(G{3uR;EsgMv*I@~U($uT$c(t9sa z0Y-z06%I{~%?zCEt|ya@a7|R=XA1bSp@F4Sm@z~^shOqQTSt~jL_o2Dg*{V+t58sw g?Tonal@$vEwk&G7DB=-1K|*Tf%FD}}nHU+Y0g8D3ga7~l diff --git a/public/tiny_mce/plugins/paste/images/selectall.gif b/public/tiny_mce/plugins/paste/images/selectall.gif deleted file mode 100644 index 943f57535ba3000a1eba2dada0e6c3e5a588fbbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 998 zcmZ?wbhEHb6k!ly_|Cv!Vr0_N)UxH!o06=OJFotjSeeAMT?q*bxpV8zmv3Kuf_&!8 zo3rQA7nhOy$(o*(p+tbq5Qd3p)=G~t^|Ng`T#VlF2 zO^L0t1LspwPj} zz&w#btcHQ%|Av774_5zosrk>qklS&VmDyvW*wq?_a?weXxR{xnG&De(c>)+1R*QnP zG9)nEU}kvEz#zoH!0;fUVET!#{r*=O8OnDA1SC9PEh+?3&hVgtVVwqp3y59!fPrBh z1A`000R{#Jh6DzN6A-ukf5Z6y8N+`ehW`u<|7TSEzsmXl3giEBCWdu87?@u(aDvQd zP*}*ouok45fq|hzlYx1gsMr+-hH?d=6VDj-2{E`cFfk-Cc5pH!SDGQ4iOB~(++aG-(V&NBvou#r1V7!sZ{FoM}RYuFjCGBALQWQaMp`YE%y z5W_@J2w5<|yvShD%vo2TlNf4h7`$Zu ze`EOH@bZ5R!+(Z--3)dNqF{3v{;y&9{|Vyx9pFF_1qBWRgG>tJ^A`+4V8`wI$6y!1 z(B#cf!w_!a^6lq~1|d-3dPqb+f0raQ!H=PaVFyD+!uA)UlY~Gq^M4=1e>;Z%O$`5Q z9A&bt8D84I6e?$6DBf4R#qR%=rvK$N^&trlp1pV>1U6sit_*`c14GkGkY2HU4EA>a zo0>M))a+xFnF0!um*or$GYrqQGcaETg*d|`M+W8`28{v+h71Ot#5@LtzYLyk49N_N zKUo+V7!(+EKt2HF33iUd42~Q!9vc=MY~~QwiaD|20f(qum_yBr#z!6enp~?q5(^(4 zk>KYL@o`L8)XpR6Gh>IxrG~@3$_6Pb3Jx;0@F?;YT!;vCZDSQ-bGa~~@j#1+wp)KGG{_VF>8;2lzflD#0L%B9I9L?A3l6-44N-365-*%q}3vz zZMDaSb0I4OYbo=L1zHZu?rf3@3J#q@O^l2QoJAoY8JL)P)MOsi$}BqQJxOBaqgKY9 Qjt|>b1h1Bp5MZzd0Ed%bfdBvi diff --git a/public/tiny_mce/plugins/paste/langs/cs.js b/public/tiny_mce/plugins/paste/langs/cs.js deleted file mode 100644 index bbe0996..0000000 --- a/public/tiny_mce/plugins/paste/langs/cs.js +++ /dev/null @@ -1,8 +0,0 @@ -// CS lang variables - -tinyMCELang['lang_paste_text_desc'] = 'Vloit neformtovan text'; -tinyMCELang['lang_paste_text_title'] = 'Poui CTRL+V na klvesnici pro vloen textu do okna.'; -tinyMCELang['lang_paste_text_linebreaks'] = 'Nechej pr(eruen r(dku*'; -tinyMCELang['lang_paste_word_desc'] = 'Vloit text z aplikace Word'; -tinyMCELang['lang_paste_word_title'] = 'Poui CTRL+V na klvesnici pro vloen textu do okna.'; -tinyMCELang['lang_selectall_desc'] = 'Oznac(it ve'; diff --git a/public/tiny_mce/plugins/paste/langs/en.js b/public/tiny_mce/plugins/paste/langs/en.js deleted file mode 100644 index e575d5f..0000000 --- a/public/tiny_mce/plugins/paste/langs/en.js +++ /dev/null @@ -1,8 +0,0 @@ -// UK lang variables - -tinyMCELang['lang_paste_text_desc'] = 'Paste as Plain Text'; -tinyMCELang['lang_paste_text_title'] = 'Use CTRL+V on your keyboard to paste the text into the window.'; -tinyMCELang['lang_paste_text_linebreaks'] = 'Keep linebreaks'; -tinyMCELang['lang_paste_word_desc'] = 'Paste from Word'; -tinyMCELang['lang_paste_word_title'] = 'Use CTRL+V on your keyboard to paste the text into the window.'; -tinyMCELang['lang_selectall_desc'] = 'Select All'; diff --git a/public/tiny_mce/plugins/paste/langs/sv.js b/public/tiny_mce/plugins/paste/langs/sv.js deleted file mode 100644 index b7a7746..0000000 --- a/public/tiny_mce/plugins/paste/langs/sv.js +++ /dev/null @@ -1,8 +0,0 @@ -// SV lang variables - -tinyMCELang['lang_paste_text_desc'] = 'Klistra in som vanlig text' -tinyMCELang['lang_paste_text_title'] = 'Använd CTRL+V på ditt tangentbord för att klistra in i detta fönster.'; -tinyMCELang['lang_paste_text_linebreaks'] = 'Spara radbrytningar'; -tinyMCELang['lang_paste_word_desc'] = 'Klistra in från Word' -tinyMCELang['lang_paste_word_title'] = 'Använd CTRL+V på ditt tangentbord för att klistra in i detta fönster.'; -tinyMCELang['lang_selectall_desc'] = 'Select All'; diff --git a/public/tiny_mce/plugins/paste/langs/zh_cn.js b/public/tiny_mce/plugins/paste/langs/zh_cn.js deleted file mode 100644 index e4fc2cd..0000000 --- a/public/tiny_mce/plugins/paste/langs/zh_cn.js +++ /dev/null @@ -1,9 +0,0 @@ -// Simplified Chinese lang variables contributed by cube316 (cube316@gmail.com) -// http://www.cube316.net/ ԻȡTinyMCE֧ - -tinyMCELang['lang_paste_text_desc'] = 'Ϊıճ'; -tinyMCELang['lang_paste_text_title'] = 'ʹÿݼ CTRL+V ıճ´.'; -tinyMCELang['lang_paste_text_linebreaks'] = 'з'; -tinyMCELang['lang_paste_word_desc'] = 'Wordճ'; -tinyMCELang['lang_paste_word_title'] = 'ʹÿݼ CTRL+V ıճ´.'; -tinyMCELang['lang_selectall_desc'] = 'ȫѡ'; diff --git a/public/tiny_mce/plugins/paste/pastetext.htm b/public/tiny_mce/plugins/paste/pastetext.htm deleted file mode 100644 index a651b21..0000000 --- a/public/tiny_mce/plugins/paste/pastetext.htm +++ /dev/null @@ -1,76 +0,0 @@ - - -{$lang_paste_text_desc} - - - - - - - - -
- - - - - - - - - - - - - - - -
{$lang_paste_text_desc} - -
{$lang_paste_text_title}
- -
-
- - \ No newline at end of file diff --git a/public/tiny_mce/plugins/paste/pasteword.htm b/public/tiny_mce/plugins/paste/pasteword.htm deleted file mode 100644 index 0e1e811..0000000 --- a/public/tiny_mce/plugins/paste/pasteword.htm +++ /dev/null @@ -1,111 +0,0 @@ - - -{$lang_paste_word_desc} - - - - - - - - - -
- - - - - - - - - - - - - - -
{$lang_paste_word_desc}
{$lang_paste_word_title}
- -
-
- - \ No newline at end of file diff --git a/public/tiny_mce/plugins/paste/readme.txt b/public/tiny_mce/plugins/paste/readme.txt deleted file mode 100644 index d261ff3..0000000 --- a/public/tiny_mce/plugins/paste/readme.txt +++ /dev/null @@ -1,28 +0,0 @@ - Paste plugin for TinyMCE ------------------------------- - -This plugin adds paste as plain text and paste from Word icons to TinyMCE. This plugin was developed by Ryan Demmer and modified by -the TinyMCE crew to be more general and some extra features where added. - -On 25 May 2005, this plugin was modified by speednet: IE now pastes directly into the editor, bypassing the extra steps of opening the Insert box, selecting options, and clicking Insert. Speednet also added the Select All command, which highlights all the content in the editor when the user clicks the toolbar button. (Other miscellaneous cleanup also.) - - -Installation instructions: - * Add plugin to TinyMCE plugin option list example: plugins : "paste". - * Add the plaintext button name to button list, example: theme_advanced_buttons3_add : "pastetext,pasteword,selectall". - -Initialization example: - tinyMCE.init({ - theme : "advanced", - mode : "textareas", - plugins : "paste", - theme_advanced_buttons3_add : "pastetext,pasteword,selectall", - paste_create_paragraphs : false, - paste_use_dialog : true - }); - -Options: - [paste_create_paragraphs] - If enabled double linefeeds are converted to paragraph - elements when using the plain text dialog. This is enabled by default. - [paste_use_dialog] - MSIE specific option, if you set this to true both Mozilla and MSIE will present a paste dialog. - if you set it to false pasting in MSIE will be done directly. This option is set to false by default. diff --git a/public/tiny_mce/plugins/preview/editor_plugin.js b/public/tiny_mce/plugins/preview/editor_plugin.js deleted file mode 100644 index 6815de6..0000000 --- a/public/tiny_mce/plugins/preview/editor_plugin.js +++ /dev/null @@ -1,2 +0,0 @@ -/* Import plugin specific language pack */ - tinyMCE.importPluginLanguagePack('preview','cs,de,el,en,fr_ca,it,ko,pt,sv,zh_cn,fa,fr,pl,pt_br');function TinyMCE_preview_getControlHTML(control_name){switch(control_name){case "preview":return '';}return "";}function TinyMCE_preview_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mcePreview":var previewPage=tinyMCE.getParam("plugin_preview_pageurl",null);var previewWidth=tinyMCE.getParam("plugin_preview_width","550");var previewHeight=tinyMCE.getParam("plugin_preview_height","600");if(previewPage){var template=new Array();template['file']=previewPage;template['width']=previewWidth;template['height']=previewHeight;tinyMCE.openWindow(template,{editor_id:editor_id,resizable:"yes",scrollbars:"yes",content:tinyMCE.getContent(),content_css:tinyMCE.getParam("content_css")});}else{var win=window.open("","mcePreview","menubar=no,toolbar=no,scrollbars=yes,resizable=yes,left=20,top=20,width="+previewWidth+",height="+previewHeight);var html="";html+='';html+='';html+='';html+=''+tinyMCE.getLang('lang_preview_desc')+'';html+='';html+='';html+='';html+='';html+=tinyMCE.getContent();html+='';html+='';win.document.write(html);win.document.close();}return true;}return false;} \ No newline at end of file diff --git a/public/tiny_mce/plugins/preview/editor_plugin_src.js b/public/tiny_mce/plugins/preview/editor_plugin_src.js deleted file mode 100644 index 156a226..0000000 --- a/public/tiny_mce/plugins/preview/editor_plugin_src.js +++ /dev/null @@ -1,61 +0,0 @@ -/* Import plugin specific language pack */ -tinyMCE.importPluginLanguagePack('preview', 'cs,de,el,en,fr_ca,it,ko,pt,sv,zh_cn,fa,fr,pl,pt_br'); - -/** - * Returns the HTML contents of the preview control. - */ -function TinyMCE_preview_getControlHTML(control_name) { - switch (control_name) { - case "preview": - return ''; - } - - return ""; -} - -/** - * Executes the mcePreview command. - */ -function TinyMCE_preview_execCommand(editor_id, element, command, user_interface, value) { - // Handle commands - switch (command) { - case "mcePreview": - var previewPage = tinyMCE.getParam("plugin_preview_pageurl", null); - var previewWidth = tinyMCE.getParam("plugin_preview_width", "550"); - var previewHeight = tinyMCE.getParam("plugin_preview_height", "600"); - - // Use a custom preview page - if (previewPage) { - var template = new Array(); - - template['file'] = previewPage; - template['width'] = previewWidth; - template['height'] = previewHeight; - - tinyMCE.openWindow(template, {editor_id : editor_id, resizable : "yes", scrollbars : "yes", content : tinyMCE.getContent(), content_css : tinyMCE.getParam("content_css")}); - } else { - var win = window.open("", "mcePreview", "menubar=no,toolbar=no,scrollbars=yes,resizable=yes,left=20,top=20,width=" + previewWidth + ",height=" + previewHeight); - var html = ""; - - html += ''; - html += ''; - html += ''; - html += '' + tinyMCE.getLang('lang_preview_desc') + ''; - html += ''; - html += ''; - html += ''; - html += ''; - html += tinyMCE.getContent(); - html += ''; - html += ''; - - win.document.write(html); - win.document.close(); - } - - return true; - } - - // Pass to next handler in chain - return false; -} diff --git a/public/tiny_mce/plugins/preview/example.html b/public/tiny_mce/plugins/preview/example.html deleted file mode 100644 index c6f1dfb..0000000 --- a/public/tiny_mce/plugins/preview/example.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - -Example of a custom preview page - - - - -Editor contents:
-{$content} - - - diff --git a/public/tiny_mce/plugins/preview/images/preview.gif b/public/tiny_mce/plugins/preview/images/preview.gif deleted file mode 100644 index 4e7900c3192d4eecbd603575b813791536928f42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmZ?wbhEHb6k!lyXlDQc1CIm;1BC<+gMAPBbLkxG;XsAMf(Zp1CM0Z_QE;Kb;K2-s2MZiNYzX*&BB7yULR-(I zh6!LWW5TQ{(;H?iXjn0!VMD`&4Gj|(ESRuh!-nOvcCDMgWbwiUD>f|HuwcQ44cj*? z+_`1huC2@WY*;v9#eoGY4lLMkV8Mn93wB)Cu;ajn9TyrdOlWwpV8ek68xB0!aN)y& z9S2Sv*>T{&fdeNF95`^{z=;coPTf9q>dxWQcP^Z`aO=j^12;Zgxbfh^jSmlQJOF_g zA0E8;|KP*_4UFN63!6qIJ(UT23 z7d~DfpeJV(Q1I|5kECJz3=4~j#XJ+)r6VdVf2Vp2vgMrZX?(';}return "";}function TinyMCE_print_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mcePrint":tinyMCE.getInstanceById(editor_id).contentWindow.print();return true;}return false;} \ No newline at end of file diff --git a/public/tiny_mce/plugins/print/editor_plugin_src.js b/public/tiny_mce/plugins/print/editor_plugin_src.js deleted file mode 100644 index 423ba0c..0000000 --- a/public/tiny_mce/plugins/print/editor_plugin_src.js +++ /dev/null @@ -1,26 +0,0 @@ -/* Import theme specific language pack */ -tinyMCE.importPluginLanguagePack('print', 'en,sv,zh_cn,fa,fr_ca,fr,de,pl,pt_br,cs'); - -function TinyMCE_print_getControlHTML(control_name) { - switch (control_name) { - case "print": - return ''; - } - - return ""; -} - -/** - * Executes the search/replace commands. - */ -function TinyMCE_print_execCommand(editor_id, element, command, user_interface, value) { - // Handle commands - switch (command) { - case "mcePrint": - tinyMCE.getInstanceById(editor_id).contentWindow.print(); - return true; - } - - // Pass to next handler in chain - return false; -} diff --git a/public/tiny_mce/plugins/print/images/print.gif b/public/tiny_mce/plugins/print/images/print.gif deleted file mode 100644 index 1172f4db8ba0ed5826f859a9f702b2364b26d2f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1013 zcmZ?wbhEHb6k!lyXlDQc1CIoUfC7hzf`EvEfP{j8goc2OhRBSzgp7uSf`;_+)`Wry z2^A9<7BC3>XDDcxP|&cTpku*?{|pTs3tD>@H%wU2FkwUMluZpYHcXneXu^yQQ|4^y zS-5S&f(RZ`tZqfCr_U^aN@${tM@KnyMO!koxAt%9XRpez=a0~ZhW|K;lag=4=&tzaN)*> z3lBa#c<|xDiw_T8{D1J_!-Eh1KY+mh4?q6@|MCC-|NkIgjpES|AR+`5f3h$$Ft{`5 zfYgHW1OvwueX0*Xo&gxWiT1wPuEaf$~C5Wv7G#27ylP zOe~y%KXyc>$SS9zqbkvK;%K)^8^=e-g$J)SO8U)^c&NzC%E416)G#5z;UKs6exZ*aA2c$v zu`-DqS@8Jv1UYj#pMnC1hJ+>si$4lNPmc46YRY8D2_!fk6cx>>knr7A(jd+jDPxdO XdVqnkkD2AdfeqW<-sWOvVz34P5cJ*= diff --git a/public/tiny_mce/plugins/print/langs/cs.js b/public/tiny_mce/plugins/print/langs/cs.js deleted file mode 100644 index 2c373b4..0000000 --- a/public/tiny_mce/plugins/print/langs/cs.js +++ /dev/null @@ -1,3 +0,0 @@ -// CS lang variables - -tinyMCELang['lang_print_desc'] = 'Tisk'; diff --git a/public/tiny_mce/plugins/print/langs/de.js b/public/tiny_mce/plugins/print/langs/de.js deleted file mode 100644 index b3913d0..0000000 --- a/public/tiny_mce/plugins/print/langs/de.js +++ /dev/null @@ -1,3 +0,0 @@ -// DE lang variables - -tinyMCELang['lang_print_desc'] = 'Drucken'; diff --git a/public/tiny_mce/plugins/print/langs/en.js b/public/tiny_mce/plugins/print/langs/en.js deleted file mode 100644 index fcaa4ef..0000000 --- a/public/tiny_mce/plugins/print/langs/en.js +++ /dev/null @@ -1,3 +0,0 @@ -// UK lang variables - -tinyMCELang['lang_print_desc'] = 'Print'; diff --git a/public/tiny_mce/plugins/print/langs/fa.js b/public/tiny_mce/plugins/print/langs/fa.js deleted file mode 100644 index 3850104..0000000 --- a/public/tiny_mce/plugins/print/langs/fa.js +++ /dev/null @@ -1,8 +0,0 @@ -// IR lang variables -// Persian (Farsi) language pack (for IRAN) -// By: Morteza Zafari -// Lost@LostLord.com -// http://www.LostLord.com - -tinyMCELang['lang_dir'] = 'rtl'; -tinyMCELang['lang_print_desc'] = 'چاپ'; diff --git a/public/tiny_mce/plugins/print/langs/fr.js b/public/tiny_mce/plugins/print/langs/fr.js deleted file mode 100644 index 46e5397..0000000 --- a/public/tiny_mce/plugins/print/langs/fr.js +++ /dev/null @@ -1,3 +0,0 @@ -// French lang variables by Laurent Dran - -tinyMCELang['lang_print_desc'] = 'Imprimer'; diff --git a/public/tiny_mce/plugins/print/langs/fr_ca.js b/public/tiny_mce/plugins/print/langs/fr_ca.js deleted file mode 100644 index 9245867..0000000 --- a/public/tiny_mce/plugins/print/langs/fr_ca.js +++ /dev/null @@ -1,3 +0,0 @@ -// CA_FR lang variables - -tinyMCELang['lang_print_desc'] = 'Imprimer'; diff --git a/public/tiny_mce/plugins/print/langs/pl.js b/public/tiny_mce/plugins/print/langs/pl.js deleted file mode 100644 index e3be100..0000000 --- a/public/tiny_mce/plugins/print/langs/pl.js +++ /dev/null @@ -1,4 +0,0 @@ -// PL lang variables - - -tinyMCELang['lang_print_desc'] = 'Drukuj'; \ No newline at end of file diff --git a/public/tiny_mce/plugins/print/langs/pt_br.js b/public/tiny_mce/plugins/print/langs/pt_br.js deleted file mode 100644 index 0111867..0000000 --- a/public/tiny_mce/plugins/print/langs/pt_br.js +++ /dev/null @@ -1,3 +0,0 @@ -// pt_BR lang variables - -tinyMCELang['lang_print_desc'] = 'Imprimir'; diff --git a/public/tiny_mce/plugins/print/langs/sv.js b/public/tiny_mce/plugins/print/langs/sv.js deleted file mode 100644 index 6ef7982..0000000 --- a/public/tiny_mce/plugins/print/langs/sv.js +++ /dev/null @@ -1,3 +0,0 @@ -// SE lang variables - -tinyMCELang['lang_print_desc'] = 'Skriv ut'; diff --git a/public/tiny_mce/plugins/print/langs/zh_cn.js b/public/tiny_mce/plugins/print/langs/zh_cn.js deleted file mode 100644 index de1c60a..0000000 --- a/public/tiny_mce/plugins/print/langs/zh_cn.js +++ /dev/null @@ -1,4 +0,0 @@ -// Simplified Chinese lang variables contributed by cube316 (cube316@gmail.com) -// http://www.cube316.net/ ԻȡTinyMCE֧ - -tinyMCELang['lang_print_desc'] = 'ӡ'; diff --git a/public/tiny_mce/plugins/print/readme.txt b/public/tiny_mce/plugins/print/readme.txt deleted file mode 100644 index 66d15d1..0000000 --- a/public/tiny_mce/plugins/print/readme.txt +++ /dev/null @@ -1,17 +0,0 @@ - Print plugin for TinyMCE ------------------------------ - -About: - This plugin adds a print button to TinyMCE. - -Installation instructions: - * Copy the print directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins). - * Add plugin to TinyMCE plugin option list example: plugins : "print". - -Initialization example: - tinyMCE.init({ - theme : "advanced", - mode : "textareas", - plugins : "print", - theme_advanced_buttons1_add : "print", - }); diff --git a/public/tiny_mce/plugins/readme.txt b/public/tiny_mce/plugins/readme.txt deleted file mode 100644 index b694fdb..0000000 --- a/public/tiny_mce/plugins/readme.txt +++ /dev/null @@ -1 +0,0 @@ -This is the location you place TinyMCE plugins. diff --git a/public/tiny_mce/plugins/save/editor_plugin.js b/public/tiny_mce/plugins/save/editor_plugin.js deleted file mode 100644 index 0b4da45..0000000 --- a/public/tiny_mce/plugins/save/editor_plugin.js +++ /dev/null @@ -1,2 +0,0 @@ -/* Import plugin specific language pack */ - tinyMCE.importPluginLanguagePack('save','en,zh_cn,cs,fa,fr_ca,fr,de,pl,pt_br');function TinyMCE_save_getControlHTML(control_name){switch(control_name){case "save":return '';}return "";}function TinyMCE_save_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceSave":var formObj=tinyMCE.selectedInstance.formElement.form;if(formObj){tinyMCE.triggerSave();for(var i=0;i'; - } - return ""; -} - -/** - * Executes the save command. - */ -function TinyMCE_save_execCommand(editor_id, element, command, user_interface, value) { - // Handle commands - switch (command) { - case "mceSave": - var formObj = tinyMCE.selectedInstance.formElement.form; - - if (formObj) { - tinyMCE.triggerSave(); - - // Disable all UI form elements that TinyMCE created - for (var i=0; ia@5x3*IY|NQy)=kLFR!2eM&8Uh0o0t^fc zia%MH85sUE=zwwpC{HkO9Ao&;DdVwW!NFz@VJ#PpMGH9u6zmFSoJeeTZRWM!aO1?p zqg|XL8VMo`H!gM;<>m1(;BaDLpR66SKw|?VleeI>)iIaEre$ZFyAdC4FT?GY~4nY+;fg3#s7O?XODRh)= UNN{Yr%)zD;b9R^M>jnmE0Nd^gOaK4? diff --git a/public/tiny_mce/plugins/save/langs/cs.js b/public/tiny_mce/plugins/save/langs/cs.js deleted file mode 100644 index 21823ad..0000000 --- a/public/tiny_mce/plugins/save/langs/cs.js +++ /dev/null @@ -1,3 +0,0 @@ -// UK lang variables - -tinyMCELang['lang_save_desc'] = 'Uloit'; \ No newline at end of file diff --git a/public/tiny_mce/plugins/save/langs/de.js b/public/tiny_mce/plugins/save/langs/de.js deleted file mode 100644 index 0f55a22..0000000 --- a/public/tiny_mce/plugins/save/langs/de.js +++ /dev/null @@ -1,3 +0,0 @@ -// DE lang variables - -tinyMCELang['lang_save_desc'] = 'Speichern'; \ No newline at end of file diff --git a/public/tiny_mce/plugins/save/langs/en.js b/public/tiny_mce/plugins/save/langs/en.js deleted file mode 100644 index 07c7198..0000000 --- a/public/tiny_mce/plugins/save/langs/en.js +++ /dev/null @@ -1,3 +0,0 @@ -// UK lang variables - -tinyMCELang['lang_save_desc'] = 'Save'; \ No newline at end of file diff --git a/public/tiny_mce/plugins/save/langs/fa.js b/public/tiny_mce/plugins/save/langs/fa.js deleted file mode 100644 index 868e179..0000000 --- a/public/tiny_mce/plugins/save/langs/fa.js +++ /dev/null @@ -1,8 +0,0 @@ -// IR lang variables -// Persian (Farsi) language pack (for IRAN) -// By: Morteza Zafari -// Lost@LostLord.com -// http://www.LostLord.com - -tinyMCELang['lang_dir'] = 'rtl'; -tinyMCELang['lang_save_desc'] = 'ضبط'; \ No newline at end of file diff --git a/public/tiny_mce/plugins/save/langs/fr.js b/public/tiny_mce/plugins/save/langs/fr.js deleted file mode 100644 index 3ea29c8..0000000 --- a/public/tiny_mce/plugins/save/langs/fr.js +++ /dev/null @@ -1,3 +0,0 @@ -// French lang variables by Laurent Dran - -tinyMCELang['lang_save_desc'] = 'Sauver'; diff --git a/public/tiny_mce/plugins/save/langs/fr_ca.js b/public/tiny_mce/plugins/save/langs/fr_ca.js deleted file mode 100644 index 95cc778..0000000 --- a/public/tiny_mce/plugins/save/langs/fr_ca.js +++ /dev/null @@ -1,3 +0,0 @@ -// CA_FR lang variables - -tinyMCELang['lang_save_desc'] = 'Enregistrer'; \ No newline at end of file diff --git a/public/tiny_mce/plugins/save/langs/pl.js b/public/tiny_mce/plugins/save/langs/pl.js deleted file mode 100644 index 1fdf446..0000000 --- a/public/tiny_mce/plugins/save/langs/pl.js +++ /dev/null @@ -1,4 +0,0 @@ -// PL lang variables - - -tinyMCELang['lang_save_desc'] = 'Zachowaj'; \ No newline at end of file diff --git a/public/tiny_mce/plugins/save/langs/pt_br.js b/public/tiny_mce/plugins/save/langs/pt_br.js deleted file mode 100644 index b7d6ddc..0000000 --- a/public/tiny_mce/plugins/save/langs/pt_br.js +++ /dev/null @@ -1,3 +0,0 @@ -// pt_BR lang variables - -tinyMCELang['lang_save_desc'] = 'Salvar'; diff --git a/public/tiny_mce/plugins/save/langs/zh_cn.js b/public/tiny_mce/plugins/save/langs/zh_cn.js deleted file mode 100644 index 47d716d..0000000 --- a/public/tiny_mce/plugins/save/langs/zh_cn.js +++ /dev/null @@ -1,4 +0,0 @@ -// Simplified Chinese lang variables contributed by cube316 (cube316@gmail.com) -// http://www.cube316.net/ ԻȡTinyMCE֧ - -tinyMCELang['lang_save_desc'] = ''; \ No newline at end of file diff --git a/public/tiny_mce/plugins/save/readme.txt b/public/tiny_mce/plugins/save/readme.txt deleted file mode 100644 index dbfdb97..0000000 --- a/public/tiny_mce/plugins/save/readme.txt +++ /dev/null @@ -1,19 +0,0 @@ -Save plugin for TinyMCE -(Dec 2004) by SlyD - d.herwald@dsh-elektronik.de --------------------------- - -About: -Adds a "save" button that submits the form. - -Installation instructions: - * Copy the save directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins). - * Add plugin to TinyMCE plugin option list example: plugins : "save". - * Add the save button name to button list, example: theme_advanced_buttons3_add : "save". - -Initialization example: - tinyMCE.init({ - theme : "advanced", - mode : "textareas", - plugins : "save", - theme_advanced_buttons3_add : "save" - }); \ No newline at end of file diff --git a/public/tiny_mce/plugins/searchreplace/editor_plugin.js b/public/tiny_mce/plugins/searchreplace/editor_plugin.js deleted file mode 100644 index 9645f80..0000000 --- a/public/tiny_mce/plugins/searchreplace/editor_plugin.js +++ /dev/null @@ -1,2 +0,0 @@ -/* Import theme specific language pack */ - tinyMCE.importPluginLanguagePack('searchreplace','en,sv,zh_cn,fa,fr_ca,fr,de,pl,pt_br,cs');function TinyMCE_searchreplace_getControlHTML(control_name){switch(control_name){case "search":return '';case "replace":return '';}return "";}function TinyMCE_searchreplace_execCommand(editor_id,element,command,user_interface,value){function defValue(key,default_value){value[key]=typeof(value[key])=="undefined"?default_value:value[key];}function replaceSel(search_str,str){if(!tinyMCE.isMSIE){var sel=instance.contentWindow.getSelection();var rng=sel.getRangeAt(0);}else{var rng=instance.contentWindow.document.selection.createRange();}if(!tinyMCE.isMSIE){var doc=instance.contentWindow.document;if(str.indexOf(search_str)==-1){rng.deleteContents();rng.insertNode(rng.createContextualFragment(str));rng.collapse(false);}else{doc.execCommand("insertimage",false,"#mce_temp_url#");var elm=tinyMCE.getElementByAttributeValue(doc.body,"img","src","#mce_temp_url#");elm.parentNode.replaceChild(doc.createTextNode(str),elm);}}else{if(rng.item)rng.item(0).outerHTML=str;else rng.pasteHTML(str);}}var instance=tinyMCE.getInstanceById(editor_id);if(!value)value=new Array();defValue("editor_id",editor_id);defValue("searchstring","");defValue("replacestring",null);defValue("replacemode","none");defValue("casesensitive",false);defValue("backwards",false);defValue("wrap",false);defValue("wholeword",false);switch(command){case "mceResetSearch":tinyMCE.lastSearchRng=null;return true;case "mceSearch":if(user_interface){var template=new Array();if(value['replacestring']!=null){template['file']='../../plugins/searchreplace/replace.htm';template['width']=310;template['height']=180;}else{template['file']='../../plugins/searchreplace/search.htm';template['width']=280;template['height']=180;}tinyMCE.openWindow(template,value);}else{var win=tinyMCE.getInstanceById(editor_id).contentWindow;var doc=tinyMCE.getInstanceById(editor_id).contentWindow.document;var body=tinyMCE.getInstanceById(editor_id).contentWindow.document.body;if(body.innerHTML==""){alert(tinyMCE.getLang('lang_searchreplace_notfound'));return true;}if(value['replacemode']=="current"){replaceSel(value['string'],value['replacestring']);value['replacemode']="none";tinyMCE.execInstanceCommand(editor_id,'mceSearch',user_interface,value,false);return true;}if(tinyMCE.isMSIE){var rng=tinyMCE.lastSearchRng?tinyMCE.lastSearchRng:doc.selection.createRange();var flags=0;if(value['wholeword'])flags=flags|2;if(value['casesensitive'])flags=flags|4;if(value['replacemode']=="all"){while(rng.findText(value['string'],value['backwards']?-1:1,flags)){rng.scrollIntoView();rng.select();rng.collapse(false);replaceSel(value['string'],value['replacestring']);}alert(tinyMCE.getLang('lang_searchreplace_allreplaced'));return true;}if(rng.findText(value['string'],value['backwards']?-1:1,flags)){rng.scrollIntoView();rng.select();rng.collapse(value['backwards']);tinyMCE.lastSearchRng=rng;}else alert(tinyMCE.getLang('lang_searchreplace_notfound'));}else{if(value['replacemode']=="all"){while(win.find(value['string'],value['casesensitive'],value['backwards'],value['wrap'],value['wholeword'],false,false))replaceSel(value['string'],value['replacestring']);alert(tinyMCE.getLang('lang_searchreplace_allreplaced'));return true;}if(!win.find(value['string'],value['casesensitive'],value['backwards'],value['wrap'],value['wholeword'],false,false))alert(tinyMCE.getLang('lang_searchreplace_notfound'));}}return true;case "mceSearchReplace":value['replacestring']="";tinyMCE.execInstanceCommand(editor_id,'mceSearch',user_interface,value,false);return true;}return false;}function TinyMCE_searchreplace_handleNodeChange(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){return true;} \ No newline at end of file diff --git a/public/tiny_mce/plugins/searchreplace/editor_plugin_src.js b/public/tiny_mce/plugins/searchreplace/editor_plugin_src.js deleted file mode 100644 index b62195b..0000000 --- a/public/tiny_mce/plugins/searchreplace/editor_plugin_src.js +++ /dev/null @@ -1,173 +0,0 @@ -/* Import theme specific language pack */ -tinyMCE.importPluginLanguagePack('searchreplace', 'en,sv,zh_cn,fa,fr_ca,fr,de,pl,pt_br,cs'); - -function TinyMCE_searchreplace_getControlHTML(control_name) { - switch (control_name) { - case "search": - return ''; - - case "replace": - return ''; - } - - return ""; -} - -/** - * Executes the search/replace commands. - */ -function TinyMCE_searchreplace_execCommand(editor_id, element, command, user_interface, value) { - function defValue(key, default_value) { - value[key] = typeof(value[key]) == "undefined" ? default_value : value[key]; - } - - function replaceSel(search_str, str) { - // Get current selection - if (!tinyMCE.isMSIE) { - var sel = instance.contentWindow.getSelection(); - var rng = sel.getRangeAt(0); - } else { - var rng = instance.contentWindow.document.selection.createRange(); - } - - // Replace current one - if (!tinyMCE.isMSIE) { - var doc = instance.contentWindow.document; - - // This way works when the replace doesn't contain the search string - if (str.indexOf(search_str) == -1) { - rng.deleteContents(); - rng.insertNode(rng.createContextualFragment(str)); - rng.collapse(false); - } else { - // Insert content ugly way! Needed to move selection to after replace item - doc.execCommand("insertimage", false, "#mce_temp_url#"); - var elm = tinyMCE.getElementByAttributeValue(doc.body, "img", "src", "#mce_temp_url#"); - elm.parentNode.replaceChild(doc.createTextNode(str), elm); - } - } else { - if (rng.item) - rng.item(0).outerHTML = str; - else - rng.pasteHTML(str); - } - } - - var instance = tinyMCE.getInstanceById(editor_id); - - if (!value) - value = new Array(); - - // Setup defualt values - defValue("editor_id", editor_id); - defValue("searchstring", ""); - defValue("replacestring", null); - defValue("replacemode", "none"); - defValue("casesensitive", false); - defValue("backwards", false); - defValue("wrap", false); - defValue("wholeword", false); - - // Handle commands - switch (command) { - case "mceResetSearch": - tinyMCE.lastSearchRng = null; - return true; - - case "mceSearch": - if (user_interface) { - // Open search dialog - var template = new Array(); - - if (value['replacestring'] != null) { - template['file'] = '../../plugins/searchreplace/replace.htm'; // Relative to theme - template['width'] = 310; - template['height'] = 180; - } else { - template['file'] = '../../plugins/searchreplace/search.htm'; // Relative to theme - template['width'] = 280; - template['height'] = 180; - } - - tinyMCE.openWindow(template, value); - } else { - var win = tinyMCE.getInstanceById(editor_id).contentWindow; - var doc = tinyMCE.getInstanceById(editor_id).contentWindow.document; - var body = tinyMCE.getInstanceById(editor_id).contentWindow.document.body; - - // Whats the point - if (body.innerHTML == "") { - alert(tinyMCE.getLang('lang_searchreplace_notfound')); - return true; - } - - // Handle replace current - if (value['replacemode'] == "current") { - replaceSel(value['string'], value['replacestring']); - - // Search next one - value['replacemode'] = "none"; - tinyMCE.execInstanceCommand(editor_id, 'mceSearch', user_interface, value, false); - - return true; - } - - if (tinyMCE.isMSIE) { - var rng = tinyMCE.lastSearchRng ? tinyMCE.lastSearchRng : doc.selection.createRange(); - var flags = 0; - - if (value['wholeword']) - flags = flags | 2; - - if (value['casesensitive']) - flags = flags | 4; - - // Handle replace all mode - if (value['replacemode'] == "all") { - while (rng.findText(value['string'], value['backwards'] ? -1 : 1, flags)) { - rng.scrollIntoView(); - rng.select(); - rng.collapse(false); - replaceSel(value['string'], value['replacestring']); - } - - alert(tinyMCE.getLang('lang_searchreplace_allreplaced')); - return true; - } - - if (rng.findText(value['string'], value['backwards'] ? -1 : 1, flags)) { - rng.scrollIntoView(); - rng.select(); - rng.collapse(value['backwards']); - tinyMCE.lastSearchRng = rng; - } else - alert(tinyMCE.getLang('lang_searchreplace_notfound')); - } else { - if (value['replacemode'] == "all") { - while (win.find(value['string'], value['casesensitive'], value['backwards'], value['wrap'], value['wholeword'], false, false)) - replaceSel(value['string'], value['replacestring']); - - alert(tinyMCE.getLang('lang_searchreplace_allreplaced')); - return true; - } - - if (!win.find(value['string'], value['casesensitive'], value['backwards'], value['wrap'], value['wholeword'], false, false)) - alert(tinyMCE.getLang('lang_searchreplace_notfound')); - } - } - return true; - - case "mceSearchReplace": - value['replacestring'] = ""; - - tinyMCE.execInstanceCommand(editor_id, 'mceSearch', user_interface, value, false); - return true; - } - - // Pass to next handler in chain - return false; -} - -function TinyMCE_searchreplace_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { - return true; -} diff --git a/public/tiny_mce/plugins/searchreplace/images/replace.gif b/public/tiny_mce/plugins/searchreplace/images/replace.gif deleted file mode 100644 index e62354b0f0154c8cfb0184723ac94fb9a5ddaa94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmZ?wbhEHb6k!ly*vtR||Ns9t$as)2;lqRtA8y~cxNO-nUtiz<|Nn#JFtFlJ7DfgJ z4h9{N49E-y7FU6jo~!pt%-6OuYd^>-i62lmWSo^TB8Xp lg{zbvdF@eOF?z1^|7?Gfn^i diff --git a/public/tiny_mce/plugins/searchreplace/images/search.gif b/public/tiny_mce/plugins/searchreplace/images/search.gif deleted file mode 100644 index 40ae68e08aaa6673c82adc33ea6f9b0828f478a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 990 zcmZ?wbhEHb6k!lyXlDQc0gD0|t5QwZS}nIa0gDC&iv|IQ1_g%(1&;=8&sHtp9s`dC z1CI$-0j*Yntp))T3?e32L`-ssnBb5w!8K#1Tjs2Qj0FJ&3j!)OB$mxgs92Ctu_2*h zLwf6`;^q~lt*fj0))jPYDC^x+-n+SA!iI!~0|gxi3ML$An6RN?!hwbv2O1V!n7ZW9 zgcS#7uRJng!G#GcE-c+}eA(86%Qv4|v-{+R0}nQwcyQqOwF4&}9Juh{z=aP7ZhW|K z+a1fx(qQ2c!d(Cm1+(Gjwyv zcx+g3u$em0+R|mHw&{h!_UOWEX_@tZBH5!nbtY%EP4Cr>gntGf(J_9 o3!T}$J^#)&!)anX8ygR`aB{I#U1&&TVqxTU?v{%+P++hI0DM5Y&;S4c diff --git a/public/tiny_mce/plugins/searchreplace/langs/cs.js b/public/tiny_mce/plugins/searchreplace/langs/cs.js deleted file mode 100644 index 0d2d447..0000000 --- a/public/tiny_mce/plugins/searchreplace/langs/cs.js +++ /dev/null @@ -1,19 +0,0 @@ -// CS lang variables - -tinyMCELang['lang_searchreplace_search_desc'] = 'Najdi'; -tinyMCELang['lang_searchreplace_searchnext_desc'] = 'Najdi znova'; -tinyMCELang['lang_searchreplace_replace_desc'] = 'Najdi/Nahradit'; -tinyMCELang['lang_searchreplace_notfound'] = 'Vyhledvan ukonc(eno. R(etezec nemusel bt nalezen.'; -tinyMCELang['lang_searchreplace_search_title'] = 'Najdi'; -tinyMCELang['lang_searchreplace_replace_title'] = 'Najdi/Nahradit'; -tinyMCELang['lang_searchreplace_allreplaced'] = 'Vechny vskyty r(etezce byli zme(neny.'; -tinyMCELang['lang_searchreplace_findwhat'] = 'Najt'; -tinyMCELang['lang_searchreplace_replacewith'] = 'Nahradit'; -tinyMCELang['lang_searchreplace_direction'] = 'Sme(r'; -tinyMCELang['lang_searchreplace_up'] = 'Nahoru'; -tinyMCELang['lang_searchreplace_down'] = 'Dolu*'; -tinyMCELang['lang_searchreplace_case'] = 'Pr(esn zhoda'; -tinyMCELang['lang_searchreplace_findnext'] = 'Najdi dal'; -tinyMCELang['lang_searchreplace_replace'] = 'Nahradit'; -tinyMCELang['lang_searchreplace_replaceall'] = 'Nahradit ve'; -tinyMCELang['lang_searchreplace_cancel'] = 'Zruit'; diff --git a/public/tiny_mce/plugins/searchreplace/langs/de.js b/public/tiny_mce/plugins/searchreplace/langs/de.js deleted file mode 100644 index b972de7..0000000 --- a/public/tiny_mce/plugins/searchreplace/langs/de.js +++ /dev/null @@ -1,19 +0,0 @@ -// DE lang variables - -tinyMCELang['lang_searchreplace_search_desc'] = 'Suchen'; -tinyMCELang['lang_searchreplace_searchnext_desc'] = 'Erneut suchen'; -tinyMCELang['lang_searchreplace_replace_desc'] = 'Suchen/Ersetzen'; -tinyMCELang['lang_searchreplace_notfound'] = 'Die Suche wurde abgeschlossen. Das Suchwort wurde nicht gefunden.'; -tinyMCELang['lang_searchreplace_search_title'] = 'Suchen'; -tinyMCELang['lang_searchreplace_replace_title'] = 'Suchen/Ersetzen'; -tinyMCELang['lang_searchreplace_allreplaced'] = 'Die Suche wurde abgeschlossen. Alle Vorkommen wurden ersetzt.'; -tinyMCELang['lang_searchreplace_findwhat'] = 'Suchen nach'; -tinyMCELang['lang_searchreplace_replacewith'] = 'Ersetzem durch'; -tinyMCELang['lang_searchreplace_direction'] = 'Suchrichtung'; -tinyMCELang['lang_searchreplace_up'] = 'Rückwärts'; -tinyMCELang['lang_searchreplace_down'] = 'Vorwärts'; -tinyMCELang['lang_searchreplace_case'] = 'Groß-/Kleinschreibung beachten'; -tinyMCELang['lang_searchreplace_findnext'] = 'Weiter suchen'; -tinyMCELang['lang_searchreplace_replace'] = 'Ersetzen'; -tinyMCELang['lang_searchreplace_replaceall'] = 'Alle ersetzen'; -tinyMCELang['lang_searchreplace_cancel'] = 'Abbrechen'; diff --git a/public/tiny_mce/plugins/searchreplace/langs/en.js b/public/tiny_mce/plugins/searchreplace/langs/en.js deleted file mode 100644 index 0626fe9..0000000 --- a/public/tiny_mce/plugins/searchreplace/langs/en.js +++ /dev/null @@ -1,19 +0,0 @@ -// UK lang variables - -tinyMCELang['lang_searchreplace_search_desc'] = 'Find'; -tinyMCELang['lang_searchreplace_searchnext_desc'] = 'Find again'; -tinyMCELang['lang_searchreplace_replace_desc'] = 'Find/Replace'; -tinyMCELang['lang_searchreplace_notfound'] = 'The search has been compleated. The search string could not be found.'; -tinyMCELang['lang_searchreplace_search_title'] = 'Find'; -tinyMCELang['lang_searchreplace_replace_title'] = 'Find/Replace'; -tinyMCELang['lang_searchreplace_allreplaced'] = 'All occurrences of the search string was replaced.'; -tinyMCELang['lang_searchreplace_findwhat'] = 'Find what'; -tinyMCELang['lang_searchreplace_replacewith'] = 'Replace with'; -tinyMCELang['lang_searchreplace_direction'] = 'Direction'; -tinyMCELang['lang_searchreplace_up'] = 'Up'; -tinyMCELang['lang_searchreplace_down'] = 'Down'; -tinyMCELang['lang_searchreplace_case'] = 'Match case'; -tinyMCELang['lang_searchreplace_findnext'] = 'Find next'; -tinyMCELang['lang_searchreplace_replace'] = 'Replace'; -tinyMCELang['lang_searchreplace_replaceall'] = 'Replace all'; -tinyMCELang['lang_searchreplace_cancel'] = 'Cancel'; diff --git a/public/tiny_mce/plugins/searchreplace/langs/fa.js b/public/tiny_mce/plugins/searchreplace/langs/fa.js deleted file mode 100644 index 78f80e6..0000000 --- a/public/tiny_mce/plugins/searchreplace/langs/fa.js +++ /dev/null @@ -1,24 +0,0 @@ -// IR lang variables -// Persian (Farsi) language pack (for IRAN) -// By: Morteza Zafari -// Lost@LostLord.com -// http://www.LostLord.com - -tinyMCELang['lang_dir'] = 'rtl'; -tinyMCELang['lang_searchreplace_search_desc'] = 'جستجو'; -tinyMCELang['lang_searchreplace_searchnext_desc'] = 'جستجوي مجدد'; -tinyMCELang['lang_searchreplace_replace_desc'] = 'جستجو/جايگزيني'; -tinyMCELang['lang_searchreplace_notfound'] = 'جستجو پايان يافت. هيچ موردي يافت نشد.'; -tinyMCELang['lang_searchreplace_search_title'] = 'جستجو'; -tinyMCELang['lang_searchreplace_replace_title'] = 'جستجو/جايگزيني'; -tinyMCELang['lang_searchreplace_allreplaced'] = 'همه موارد جايگزين گرديد.'; -tinyMCELang['lang_searchreplace_findwhat'] = 'جستجو به دنبال'; -tinyMCELang['lang_searchreplace_replacewith'] = 'جايگزيني با'; -tinyMCELang['lang_searchreplace_direction'] = 'جهت جستجو'; -tinyMCELang['lang_searchreplace_up'] = 'به سمت بالا'; -tinyMCELang['lang_searchreplace_down'] = 'به سمت پايين'; -tinyMCELang['lang_searchreplace_case'] = 'تطبيق حروف کوچک و بزرگ'; -tinyMCELang['lang_searchreplace_findnext'] = 'مورد-بعدي'; -tinyMCELang['lang_searchreplace_replace'] = 'جايگزين-کن'; -tinyMCELang['lang_searchreplace_replaceall'] = 'جايگزيني-همه'; -tinyMCELang['lang_searchreplace_cancel'] = 'بيخيال'; diff --git a/public/tiny_mce/plugins/searchreplace/langs/fr.js b/public/tiny_mce/plugins/searchreplace/langs/fr.js deleted file mode 100644 index 1cedfc9..0000000 --- a/public/tiny_mce/plugins/searchreplace/langs/fr.js +++ /dev/null @@ -1,19 +0,0 @@ -// Franch lang variables by Laurent Dran - -tinyMCELang['lang_searchreplace_search_desc'] = 'Trouver'; -tinyMCELang['lang_searchreplace_searchnext_desc'] = 'Trouver encore'; -tinyMCELang['lang_searchreplace_replace_desc'] = 'Trouver/Remplacer'; -tinyMCELang['lang_searchreplace_notfound'] = 'Votre recherche a été compléé. La recherche de la chaine pourra ne pas aboutir.'; -tinyMCELang['lang_searchreplace_search_title'] = 'Trouver'; -tinyMCELang['lang_searchreplace_replace_title'] = 'Trouver/Remplacer'; -tinyMCELang['lang_searchreplace_allreplaced'] = 'Toutes les occurences de la chaine ont été remplcées.'; -tinyMCELang['lang_searchreplace_findwhat'] = 'Trouver le mot'; -tinyMCELang['lang_searchreplace_replacewith'] = 'Remplacer avec'; -tinyMCELang['lang_searchreplace_direction'] = 'Direction'; -tinyMCELang['lang_searchreplace_up'] = 'Haut'; -tinyMCELang['lang_searchreplace_down'] = 'Base'; -tinyMCELang['lang_searchreplace_case'] = 'Respecter la casse'; -tinyMCELang['lang_searchreplace_findnext'] = 'Trouver le prochain'; -tinyMCELang['lang_searchreplace_replace'] = 'Remplacer'; -tinyMCELang['lang_searchreplace_replaceall'] = 'Remplacer tout'; -tinyMCELang['lang_searchreplace_cancel'] = 'Annuler'; diff --git a/public/tiny_mce/plugins/searchreplace/langs/fr_ca.js b/public/tiny_mce/plugins/searchreplace/langs/fr_ca.js deleted file mode 100644 index 04dd1fa..0000000 --- a/public/tiny_mce/plugins/searchreplace/langs/fr_ca.js +++ /dev/null @@ -1,20 +0,0 @@ -// CA_FR lang variables - -tinyMCELang['lang_searchreplace_search_desc'] = 'Chercher'; -tinyMCELang['lang_searchreplace_searchnext_desc'] = 'Chercher suivant'; -tinyMCELang['lang_searchreplace_replace_desc'] = 'Chercher/Remplacer'; -tinyMCELang['lang_searchreplace_notfound'] = 'La recherche est termine. Aucune occurence trouve.'; -tinyMCELang['lang_searchreplace_search_title'] = 'Chercher'; -tinyMCELang['lang_searchreplace_replace_title'] = 'Chercher/Remplacer'; -tinyMCELang['lang_searchreplace_allreplaced'] = 'Toutes les occurences ont t remplaces.'; -tinyMCELang['lang_searchreplace_findwhat'] = 'Chercher quoi'; -tinyMCELang['lang_searchreplace_replacewith'] = 'Remplacer par'; -tinyMCELang['lang_searchreplace_direction'] = 'Direction'; -tinyMCELang['lang_searchreplace_up'] = 'Monter'; -tinyMCELang['lang_searchreplace_down'] = 'Descendre'; -tinyMCELang['lang_searchreplace_case'] = 'Sensible la case'; -tinyMCELang['lang_searchreplace_findnext'] = 'Chercher suivant'; -tinyMCELang['lang_searchreplace_replace'] = 'Remplacer'; -tinyMCELang['lang_searchreplace_replaceall'] = 'Remplacer tous'; -tinyMCELang['lang_searchreplace_cancel'] = 'Annuler'; - diff --git a/public/tiny_mce/plugins/searchreplace/langs/pl.js b/public/tiny_mce/plugins/searchreplace/langs/pl.js deleted file mode 100644 index 9577b6d..0000000 --- a/public/tiny_mce/plugins/searchreplace/langs/pl.js +++ /dev/null @@ -1,20 +0,0 @@ -// PL lang variables - - -tinyMCELang['lang_searchreplace_search_desc'] = 'Znajdź'; -tinyMCELang['lang_searchreplace_searchnext_desc'] = 'Znajdź ponownie'; -tinyMCELang['lang_searchreplace_replace_desc'] = 'Znajdź/Zastąp'; -tinyMCELang['lang_searchreplace_notfound'] = 'Ukończono wyszukiwanie. Poszukiwana fraza nie została odnaleziona.'; -tinyMCELang['lang_searchreplace_search_title'] = 'Znajdź'; -tinyMCELang['lang_searchreplace_replace_title'] = 'Znajdź/Zastąp'; -tinyMCELang['lang_searchreplace_allreplaced'] = 'Wszystkie wystąpienia poszukiwanej frazy zostały zastąpione. '; -tinyMCELang['lang_searchreplace_findwhat'] = 'Znajdź'; -tinyMCELang['lang_searchreplace_replacewith'] = 'Zastąp'; -tinyMCELang['lang_searchreplace_direction'] = 'Kierunek'; -tinyMCELang['lang_searchreplace_up'] = 'Do góry'; -tinyMCELang['lang_searchreplace_down'] = 'Do dołu'; -tinyMCELang['lang_searchreplace_case'] = 'Wielkość liter'; -tinyMCELang['lang_searchreplace_findnext'] = 'Znajdź następny'; -tinyMCELang['lang_searchreplace_replace'] = 'Zastąp'; -tinyMCELang['lang_searchreplace_replaceall'] = 'Zastąp wszystkie'; -tinyMCELang['lang_searchreplace_cancel'] = 'Wyjdź'; diff --git a/public/tiny_mce/plugins/searchreplace/langs/pt_br.js b/public/tiny_mce/plugins/searchreplace/langs/pt_br.js deleted file mode 100644 index 13bd51a..0000000 --- a/public/tiny_mce/plugins/searchreplace/langs/pt_br.js +++ /dev/null @@ -1,19 +0,0 @@ -// pt_BR lang variables - -tinyMCELang['lang_searchreplace_search_desc'] = 'Procurar'; -tinyMCELang['lang_searchreplace_searchnext_desc'] = 'Procurar novamente'; -tinyMCELang['lang_searchreplace_replace_desc'] = 'Procurar/Substituir'; -tinyMCELang['lang_searchreplace_notfound'] = 'A procura foi concluda. A expresso buscada no foi encontrada.'; -tinyMCELang['lang_searchreplace_search_title'] = 'Procurar'; -tinyMCELang['lang_searchreplace_replace_title'] = 'Procurar/Substituir'; -tinyMCELang['lang_searchreplace_allreplaced'] = 'Todas as ocorrncias encontradas foram substitudas.'; -tinyMCELang['lang_searchreplace_findwhat'] = 'Procurar por'; -tinyMCELang['lang_searchreplace_replacewith'] = 'Substituir com'; -tinyMCELang['lang_searchreplace_direction'] = 'Direo'; -tinyMCELang['lang_searchreplace_up'] = 'Acima'; -tinyMCELang['lang_searchreplace_down'] = 'Abaixo'; -tinyMCELang['lang_searchreplace_case'] = 'Procurar exatamente'; -tinyMCELang['lang_searchreplace_findnext'] = 'Procurar prxima'; -tinyMCELang['lang_searchreplace_replace'] = 'Substituir'; -tinyMCELang['lang_searchreplace_replaceall'] = 'Substituir tudo'; -tinyMCELang['lang_searchreplace_cancel'] = 'Cancelar'; diff --git a/public/tiny_mce/plugins/searchreplace/langs/sv.js b/public/tiny_mce/plugins/searchreplace/langs/sv.js deleted file mode 100644 index aac54d3..0000000 --- a/public/tiny_mce/plugins/searchreplace/langs/sv.js +++ /dev/null @@ -1,19 +0,0 @@ -// SE lang variables - -tinyMCELang['lang_searchreplace_search_desc'] = 'Sk'; -tinyMCELang['lang_searchreplace_searchnext_desc'] = 'Sk igen'; -tinyMCELang['lang_searchreplace_replace_desc'] = 'Sk/Erstt'; -tinyMCELang['lang_searchreplace_notfound'] = 'Skningen r slutfrd. Skstrngen kunde inte hittas.'; -tinyMCELang['lang_searchreplace_search_title'] = 'Sk'; -tinyMCELang['lang_searchreplace_replace_title'] = 'Sk/Erstt'; -tinyMCELang['lang_searchreplace_allreplaced'] = 'Alla trffar p skstrngen ersattes'; -tinyMCELang['lang_searchreplace_findwhat'] = 'Sk p'; -tinyMCELang['lang_searchreplace_replacewith'] = 'Erstt med'; -tinyMCELang['lang_searchreplace_direction'] = 'Skriktning'; -tinyMCELang['lang_searchreplace_up'] = 'Uppt'; -tinyMCELang['lang_searchreplace_down'] = 'Nert'; -tinyMCELang['lang_searchreplace_case'] = 'Matcha gemener/VERSALER'; -tinyMCELang['lang_searchreplace_findnext'] = 'Sk nsta'; -tinyMCELang['lang_searchreplace_replace'] = 'Erstt'; -tinyMCELang['lang_searchreplace_replaceall'] = 'Erstt alla'; -tinyMCELang['lang_searchreplace_cancel'] = 'Avbryt'; diff --git a/public/tiny_mce/plugins/searchreplace/langs/zh_cn.js b/public/tiny_mce/plugins/searchreplace/langs/zh_cn.js deleted file mode 100644 index 8ac7159..0000000 --- a/public/tiny_mce/plugins/searchreplace/langs/zh_cn.js +++ /dev/null @@ -1,20 +0,0 @@ -// Simplified Chinese lang variables contributed by cube316 (cube316@gmail.com) -// http://www.cube316.net/ ԻȡTinyMCE֧ - -tinyMCELang['lang_searchreplace_search_desc'] = ''; -tinyMCELang['lang_searchreplace_searchnext_desc'] = 'ٴβ'; -tinyMCELang['lang_searchreplace_replace_desc'] = '/滻'; -tinyMCELang['lang_searchreplace_notfound'] = 'ϣûҵҪҵַ'; -tinyMCELang['lang_searchreplace_search_title'] = ''; -tinyMCELang['lang_searchreplace_replace_title'] = '/滻'; -tinyMCELang['lang_searchreplace_allreplaced'] = 'гֵַ滻ϡ'; -tinyMCELang['lang_searchreplace_findwhat'] = ''; -tinyMCELang['lang_searchreplace_replacewith'] = '滻Ϊ'; -tinyMCELang['lang_searchreplace_direction'] = ''; -tinyMCELang['lang_searchreplace_up'] = ''; -tinyMCELang['lang_searchreplace_down'] = ''; -tinyMCELang['lang_searchreplace_case'] = 'ƥСд'; -tinyMCELang['lang_searchreplace_findnext'] = 'һ'; -tinyMCELang['lang_searchreplace_replace'] = '滻'; -tinyMCELang['lang_searchreplace_replaceall'] = 'ȫ滻'; -tinyMCELang['lang_searchreplace_cancel'] = 'ȡ'; diff --git a/public/tiny_mce/plugins/searchreplace/readme.txt b/public/tiny_mce/plugins/searchreplace/readme.txt deleted file mode 100644 index ca543bf..0000000 --- a/public/tiny_mce/plugins/searchreplace/readme.txt +++ /dev/null @@ -1,18 +0,0 @@ - searchreplace plugin for TinyMCE ------------------------------ - -About: - This plugin adds search/replace dialogs to TinyMCE. - -Installation instructions: - * Copy the searchreplace directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins). - * Add plugin to TinyMCE plugin option list example: plugins : "searchreplace". - * Add buttons "search,replace" to the button list. - -Initialization example: - tinyMCE.init({ - theme : "advanced", - mode : "textareas", - plugins : "searchreplace", - theme_advanced_buttons1_add : "search,replace", - }); diff --git a/public/tiny_mce/plugins/searchreplace/replace.htm b/public/tiny_mce/plugins/searchreplace/replace.htm deleted file mode 100644 index a5b543e..0000000 --- a/public/tiny_mce/plugins/searchreplace/replace.htm +++ /dev/null @@ -1,88 +0,0 @@ - - -{$lang_searchreplace_replace_title} - - - - -
- - - - - - - - - - - - - - - -
{$lang_searchreplace_findwhat}: 
{$lang_searchreplace_replacewith}: 
- - - - - - - -
{$lang_searchreplace_direction}: {$lang_searchreplace_up}{$lang_searchreplace_down}
- - - - -
{$lang_searchreplace_case}
- - - - - - - -
-
- - diff --git a/public/tiny_mce/plugins/searchreplace/search.htm b/public/tiny_mce/plugins/searchreplace/search.htm deleted file mode 100644 index 27c2402..0000000 --- a/public/tiny_mce/plugins/searchreplace/search.htm +++ /dev/null @@ -1,77 +0,0 @@ - - -{$lang_searchreplace_search_title} - - - - -
- - - - - - - - - - -
{$lang_searchreplace_findwhat}: 
- - - - - - - -
{$lang_searchreplace_direction}: {$lang_searchreplace_up}{$lang_searchreplace_down}
- - - - -
{$lang_searchreplace_case}
- - - - - -
-
- - diff --git a/public/tiny_mce/plugins/table/cell.htm b/public/tiny_mce/plugins/table/cell.htm deleted file mode 100644 index f9778b7..0000000 --- a/public/tiny_mce/plugins/table/cell.htm +++ /dev/null @@ -1,137 +0,0 @@ - - -{$lang_table_cell_title} - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{$lang_table_cell_title}
{$lang_insert_table_align}:{$lang_insert_table_class}:
{$lang_insert_table_valign}:  
{$lang_insert_table_width}:{$lang_insert_table_height}:
  
-
- - diff --git a/public/tiny_mce/plugins/table/editor_plugin.js b/public/tiny_mce/plugins/table/editor_plugin.js deleted file mode 100644 index 839a6d9..0000000 --- a/public/tiny_mce/plugins/table/editor_plugin.js +++ /dev/null @@ -1,2 +0,0 @@ -/* Import plugin specific language pack */ - tinyMCE.importPluginLanguagePack('table','en,ar,cs,da,de,el,es,fi,fr_ca,hu,it,ja,ko,nl,no,pl,pt,sv,tw,zh_cn,fr,de');function TinyMCE_table_initInstance(inst){if(tinyMCE.isGecko)tinyMCE.addEvent(inst.getDoc(),"mouseup",TinyMCE_table_mouseDownHandler);inst.tableRowClipboard=null;}function TinyMCE_table_mouseDownHandler(e){var elm=tinyMCE.isMSIE?event.srcElement:e.target;var focusElm=tinyMCE.selectedInstance.getFocusElement();if(elm.nodeName=="BODY"&&(focusElm.nodeName=="TD"||(focusElm.parentNode&&focusElm.parentNode.nodeName=="TD"))){window.setTimeout(function(){var tableElm=tinyMCE.getParentElement(focusElm,"table");tinyMCE.handleVisualAid(tableElm,true,tinyMCE.settings['visual']);},10);}}function TinyMCE_table_getControlHTML(control_name){var controls=new Array(['table','table.gif','{$lang_table_desc}','mceInsertTable',true],['delete_col','table_delete_col.gif','{$lang_table_delete_col_desc}','mceTableDeleteCol'],['delete_row','table_delete_row.gif','{$lang_table_delete_row_desc}','mceTableDeleteRow'],['col_after','table_insert_col_after.gif','{$lang_table_insert_col_after_desc}','mceTableInsertColAfter'],['col_before','table_insert_col_before.gif','{$lang_table_insert_col_before_desc}','mceTableInsertColBefore'],['row_after','table_insert_row_after.gif','{$lang_table_insert_row_after_desc}','mceTableInsertRowAfter'],['row_before','table_insert_row_before.gif','{$lang_table_insert_row_before_desc}','mceTableInsertRowBefore'],['row_props','table_row_props.gif','{$lang_table_row_desc}','mceTableRowProps',true],['cell_props','table_cell_props.gif','{$lang_table_cell_desc}','mceTableCellProps',true],['split_cells','table_split_cells.gif','{$lang_table_split_cells_desc}','mceTableSplitCells',true],['merge_cells','table_merge_cells.gif','{$lang_table_merge_cells_desc}','mceTableMergeCells',true]);for(var i=0;i';else if(but[0]==control_name)return '';}if(control_name=="tablecontrols"){var html="";html+=tinyMCE.getControlHTML("table");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("row_props");html+=tinyMCE.getControlHTML("cell_props");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("row_before");html+=tinyMCE.getControlHTML("row_after");html+=tinyMCE.getControlHTML("delete_row");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("col_before");html+=tinyMCE.getControlHTML("col_after");html+=tinyMCE.getControlHTML("delete_col");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("split_cells");html+=tinyMCE.getControlHTML("merge_cells");return html;}return "";}function TinyMCE_table_execCommand(editor_id,element,command,user_interface,value){var inst=tinyMCE.getInstanceById(editor_id);var focusElm=inst.getFocusElement();var trElm=tinyMCE.getParentElement(focusElm,"tr");var tdElm=tinyMCE.getParentElement(focusElm,"td");var tableElm=tinyMCE.getParentElement(focusElm,"table");var doc=inst.contentWindow.document;var tableBorder=tableElm?tableElm.getAttribute("border"):"";if(trElm&&tdElm==null)tdElm=trElm.cells[0];function inArray(ar,v){for(var i=0;i0&&inArray(ar[i],v))return true;if(ar[i]==v)return true;}return false;}function makeTD(){var newTD=doc.createElement("td");newTD.innerHTML=" ";}function getColRowSpan(td){var colspan=tinyMCE.getAttrib(td,"colspan");var rowspan=tinyMCE.getAttrib(td,"rowspan");colspan=colspan==""?1:parseInt(colspan);rowspan=rowspan==""?1:parseInt(rowspan);return{colspan:colspan,rowspan:rowspan};}function getCellPos(grid,td){for(var y=0;y1){for(var i=x;i1)td.rowSpan=sd.rowspan+1;lastElm=td;}deleteMarked(tableElm);}}function prevElm(node,name){while((node=node.previousSibling)!=null){if(node.nodeName==name)return node;}return null;}function nextElm(node,name){while((node=node.nextSibling)!=null){if(node.nodeName==name)return node;}return null;}function deleteMarked(tbl){if(tbl.rows==0)return;var tr=tbl.rows[0];do{var next=nextElm(tr,"TR");if(tr._delete){tr.parentNode.removeChild(tr);continue;}var td=tr.cells[0];if(td.cells>1){do{var nexttd=nextElm(td,"TD");if(td._delete)td.parentNode.removeChild(td);}while((td=nexttd)!=null);}}while((tr=next)!=null);}function addRows(td_elm,tr_elm,rowspan){td_elm.rowSpan=1;var trNext=nextElm(tr_elm,"TR");for(var i=1;icols)cols=rowsAr[i].cells.length;cols=cols;rows=rowsAr.length;border=tinyMCE.getAttrib(tinyMCE.tableElm,'border',border);cellpadding=tinyMCE.getAttrib(tinyMCE.tableElm,'cellpadding',"");cellspacing=tinyMCE.getAttrib(tinyMCE.tableElm,'cellspacing',"");width=tinyMCE.getAttrib(tinyMCE.tableElm,'width',width);height=tinyMCE.getAttrib(tinyMCE.tableElm,'height',height);bordercolor=tinyMCE.getAttrib(tinyMCE.tableElm,'bordercolor',bordercolor);bgcolor=tinyMCE.getAttrib(tinyMCE.tableElm,'bgcolor',bgcolor);align=tinyMCE.getAttrib(tinyMCE.tableElm,'align',align);className=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(tinyMCE.tableElm,'class'),false);if(tinyMCE.isMSIE){width=tinyMCE.tableElm.style.pixelWidth==0?tinyMCE.tableElm.getAttribute("width"):tinyMCE.tableElm.style.pixelWidth;height=tinyMCE.tableElm.style.pixelHeight==0?tinyMCE.tableElm.getAttribute("height"):tinyMCE.tableElm.style.pixelHeight;}action="update";}var template=new Array();template['file']='../../plugins/table/table.htm';if(tinyMCE.settings['table_color_fields']){template['width']=400;template['height']=240;}else{template['width']=340;template['height']=220;}template['width']+=tinyMCE.getLang('lang_insert_table_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_table_delta_height',0);tinyMCE.openWindow(template,{editor_id:inst.editorId,cols:cols,rows:rows,border:border,cellpadding:cellpadding,cellspacing:cellspacing,align:align,width:width,height:height,bordercolor:bordercolor,bgcolor:bgcolor,action:action,className:className});}else{var html='';var cols=2,rows=2,border=0,cellpadding=-1,cellspacing=-1,align,width,height,className,action;if(typeof(value)=='object'){cols=value['cols'];rows=value['rows'];border=value['border']!=""?value['border']:0;cellpadding=value['cellpadding']!=""?value['cellpadding']:-1;cellspacing=value['cellspacing']!=""?value['cellspacing']:-1;align=value['align'];width=value['width'];height=value['height'];bordercolor=value['bordercolor'];bgcolor=value['bgcolor'];className=value['className'];action=value['action'];}if(tinyMCE.tableElm&&action=="update"){inst.execCommand("mceAddUndoLevel");tinyMCE.setAttrib(tinyMCE.tableElm,'cellPadding',cellpadding,true);tinyMCE.setAttrib(tinyMCE.tableElm,'cellSpacing',cellspacing,true);tinyMCE.setAttrib(tinyMCE.tableElm,'border',border,true);tinyMCE.setAttrib(tinyMCE.tableElm,'width',width,true);tinyMCE.setAttrib(tinyMCE.tableElm,'height',height,true);tinyMCE.setAttrib(tinyMCE.tableElm,'bordercolor',bordercolor);tinyMCE.setAttrib(tinyMCE.tableElm,'bgcolor',bgcolor);tinyMCE.setAttrib(tinyMCE.tableElm,'align',align);tinyMCE.setAttrib(tinyMCE.tableElm,'class',className);if(tinyMCE.isMSIE){tinyMCE.tableElm.style.pixelWidth=(width==null||width=="")?0:width;tinyMCE.tableElm.style.pixelHeight=(height==null||height=="")?0:height;tinyMCE.tableElm.borderColor=bordercolor;tinyMCE.tableElm.bgColor=bgcolor;}tinyMCE.handleVisualAid(tinyMCE.tableElm,false,inst.visualAid);tinyMCE.tableElm.outerHTML=tinyMCE.tableElm.outerHTML;tinyMCE.triggerNodeChange();return true;}html+='";for(var x=0;x ';html+="";}html+="
";inst.execCommand('mceInsertContent',false,html);tinyMCE.handleVisualAid(inst.getBody(),true,tinyMCE.settings['visual']);}return true;case "mceTableSplitCells":case "mceTableMergeCells":case "mceTableInsertRowBefore":case "mceTableInsertRowAfter":case "mceTableDeleteRow":case "mceTableInsertColBefore":case "mceTableInsertColAfter":case "mceTableDeleteCol":case "mceTableCutRow":case "mceTableCopyRow":case "mceTablePasteRowBefore":case "mceTablePasteRowAfter":inst.execCommand("mceAddUndoLevel");if(!tableElm)return true;if(tableElm.firstChild&&tableElm.firstChild.nodeName.toLowerCase()=="tbody")tableElm=tableElm.firstChild;if(tableElm&&trElm){switch(command){case "mceTableInsertRowBefore":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var newTR=doc.createElement("tr");var lastTDElm=null;cpos.rowindex--;if(cpos.rowindex<0)cpos.rowindex=0;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['rowspan']==1){var newTD=doc.createElement("td");newTD.innerHTML=" ";newTD.colSpan=tdElm.colSpan;newTR.appendChild(newTD);}else tdElm.rowSpan=sd['rowspan']+1;lastTDElm=tdElm;}}trElm.parentNode.insertBefore(newTR,trElm);break;case "mceTableCutRow":if(!trElm||!tdElm)return true;inst.tableRowClipboard=copyRow(doc,tableElm,trElm);inst.execCommand("mceTableDeleteRow");break;case "mceTableCopyRow":if(!trElm||!tdElm)return true;inst.tableRowClipboard=copyRow(doc,tableElm,trElm);break;case "mceTablePasteRowBefore":if(!trElm||!tdElm)return true;var newTR=inst.tableRowClipboard.cloneNode(true);var prevTR=prevElm(trElm,"TR");if(prevTR!=null)trimRow(tableElm,prevTR,prevTR.cells[0],newTR);trElm.parentNode.insertBefore(newTR,trElm);break;case "mceTablePasteRowAfter":if(!trElm||!tdElm)return true;var nextTR=nextElm(trElm,"TR");var newTR=inst.tableRowClipboard.cloneNode(true);trimRow(tableElm,trElm,tdElm,newTR);if(nextTR==null)trElm.parentNode.appendChild(newTR);else nextTR.parentNode.insertBefore(newTR,nextTR);break;case "mceTableInsertRowAfter":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var newTR=doc.createElement("tr");var lastTDElm=null;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['rowspan']==1){var newTD=doc.createElement("td");newTD.innerHTML=" ";newTD.colSpan=tdElm.colSpan;newTR.appendChild(newTD);}else tdElm.rowSpan=sd['rowspan']+1;lastTDElm=tdElm;}}if(newTR.hasChildNodes()){var nextTR=nextElm(trElm,"TR");if(nextTR)nextTR.parentNode.insertBefore(newTR,nextTR);else tableElm.appendChild(newTR);}break;case "mceTableDeleteRow":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);if(grid.length==1){tableElm.parentNode.removeChild(tableElm);return true;}var cells=trElm.cells;var nextTR=nextElm(trElm,"TR");for(var x=0;x1){var newTD=cells[x].cloneNode(true);var sd=getColRowSpan(cells[x]);newTD.rowSpan=sd.rowspan-1;var nextTD=nextTR.cells[x];if(nextTD==null)nextTR.appendChild(newTD);else nextTR.insertBefore(newTD,nextTD);}}var lastTDElm=null;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd.rowspan>1){tdElm.rowSpan=sd.rowspan-1;}else{trElm=tdElm.parentNode;if(trElm.parentNode)trElm._delete=true;}lastTDElm=tdElm;}}deleteMarked(tableElm);cpos.rowindex--;if(cpos.rowindex<0)cpos.rowindex=0;inst.selectNode(getCell(grid,cpos.rowindex,0),true,true);break;case "mceTableInsertColBefore":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var lastTDElm=null;for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']==1){var newTD=doc.createElement("td");newTD.innerHTML=" ";newTD.rowSpan=tdElm.rowSpan;tdElm.parentNode.insertBefore(newTD,tdElm);}else tdElm.colSpan++;lastTDElm=tdElm;}}break;case "mceTableInsertColAfter":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var lastTDElm=null;for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']==1){var newTD=doc.createElement("td");newTD.innerHTML=" ";newTD.rowSpan=tdElm.rowSpan;var nextTD=nextElm(tdElm,"TD");if(nextTD==null)tdElm.parentNode.appendChild(newTD);else nextTD.parentNode.insertBefore(newTD,nextTD);}else tdElm.colSpan++;lastTDElm=tdElm;}}break;case "mceTableDeleteCol":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var lastTDElm=null;if(grid.length>1&&grid[0].length<=1){tableElm.parentNode.removeChild(tableElm);return true;}for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']>1)tdElm.colSpan=sd['colspan']-1;else{if(tdElm.parentNode)tdElm.parentNode.removeChild(tdElm);}lastTDElm=tdElm;}}cpos.cellindex--;if(cpos.cellindex<0)cpos.cellindex=0;inst.selectNode(getCell(grid,0,cpos.cellindex),true,true);break;case "mceTableSplitCells":if(!trElm||!tdElm)return true;var spandata=getColRowSpan(tdElm);var colspan=spandata["colspan"];var rowspan=spandata["rowspan"];if(colspan>1||rowspan>1){tdElm.colSpan=1;for(var i=1;i1)addRows(newTD,trElm,rowspan);}addRows(tdElm,trElm,rowspan);}tableElm=tinyMCE.getParentElement(inst.getFocusElement(),"table");break;case "mceTableMergeCells":var rows=new Array();var sel=inst.getSel();var grid=getTableGrid(tableElm);if(tinyMCE.isMSIE||sel.rangeCount==1){if(user_interface){var template=new Array();var sp=getColRowSpan(tdElm);template['file']='../../plugins/table/merge_cells.htm';template['width']=160;template['height']=220;tinyMCE.openWindow(template,{editor_id:inst.editorId,action:"update",numcols:sp.colspan,numrows:sp.rowspan});return true;}else{var numRows=parseInt(value['numrows']);var numCols=parseInt(value['numcols']);var cpos=getCellPos(grid,tdElm);if((""+numRows)=="NaN")numRows=1;if((""+numCols)=="NaN")numCols=1;var tRows=tableElm.rows;for(var y=cpos.rowindex;y0)rows[rows.length]=rowCells;}}}else{var cells=new Array();var sel=inst.getSel();var lastTR=null;var curRow=null;var x1=-1,y1=-1,x2,y2;if(sel.rangeCount<2)return true;for(var i=0;i0)rows[rows.length]=rowCells;}var curRow=new Array();var lastTR=null;for(var y=0;ycolSpan)colSpan=rowColSpan;lastRowSpan=-1;}var lastColSpan=-1;for(var x=0;xrowSpan)rowSpan=colRowSpan;lastColSpan=-1;}tdElm=rows[0][0];tdElm.rowSpan=rowSpan;tdElm.colSpan=colSpan;for(var y=0;y0))tdElm.innerHTML+=html;if(rows[y][x]!=tdElm&&!rows[y][x]._deleted){var cpos=getCellPos(grid,rows[y][x]);var tr=rows[y][x].parentNode;tr.removeChild(rows[y][x]);rows[y][x]._deleted=true;if(!tr.hasChildNodes()){tr.parentNode.removeChild(tr);var lastCell=null;for(var x=0;cellElm=getCell(grid,cpos.rowindex,x);x++){if(cellElm!=lastCell&&cellElm.rowSpan>1)cellElm.rowSpan--;lastCell=cellElm;}if(tdElm.rowSpan>1)tdElm.rowSpan--;}}}}break;}tableElm=tinyMCE.getParentElement(inst.getFocusElement(),"table");tinyMCE.handleVisualAid(tableElm,true,tinyMCE.settings['visual']);tinyMCE.triggerNodeChange();inst.repaint();}return true;}return false;}function TinyMCE_table_handleNodeChange(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){var colspan="1",rowspan="1";var inst=tinyMCE.getInstanceById(editor_id);tinyMCE.switchClassSticky(editor_id+'_table','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_row_props','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_cell_props','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_row_before','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_row_after','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_delete_row','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_col_before','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_col_after','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_delete_col','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_split_cells','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_merge_cells','mceButtonDisabled',true);if(tinyMCE.getParentElement(node,"tr"))tinyMCE.switchClassSticky(editor_id+'_row_props','mceButtonSelected',false);if(tdElm=tinyMCE.getParentElement(node,"td")){tinyMCE.switchClassSticky(editor_id+'_cell_props','mceButtonSelected',false);tinyMCE.switchClassSticky(editor_id+'_row_before','mceButtonNormal',false);tinyMCE.switchClassSticky(editor_id+'_row_after','mceButtonNormal',false);tinyMCE.switchClassSticky(editor_id+'_delete_row','mceButtonNormal',false);tinyMCE.switchClassSticky(editor_id+'_col_before','mceButtonNormal',false);tinyMCE.switchClassSticky(editor_id+'_col_after','mceButtonNormal',false);tinyMCE.switchClassSticky(editor_id+'_delete_col','mceButtonNormal',false);colspan=tinyMCE.getAttrib(tdElm,"colspan");rowspan=tinyMCE.getAttrib(tdElm,"rowspan");colspan=colspan==""?"1":colspan;rowspan=rowspan==""?"1":rowspan;if(colspan!="1"||rowspan!="1")tinyMCE.switchClassSticky(editor_id+'_split_cells','mceButtonNormal',false);}if(tinyMCE.getParentElement(node,"table")){tinyMCE.switchClassSticky(editor_id+'_table','mceButtonSelected');tinyMCE.switchClassSticky(editor_id+'_merge_cells','mceButtonNormal',false);}} \ No newline at end of file diff --git a/public/tiny_mce/plugins/table/editor_plugin_src.js b/public/tiny_mce/plugins/table/editor_plugin_src.js deleted file mode 100644 index dde12a2..0000000 --- a/public/tiny_mce/plugins/table/editor_plugin_src.js +++ /dev/null @@ -1,1142 +0,0 @@ -/* Import plugin specific language pack */ -tinyMCE.importPluginLanguagePack('table', 'en,ar,cs,da,de,el,es,fi,fr_ca,hu,it,ja,ko,nl,no,pl,pt,sv,tw,zh_cn,fr,de'); - -function TinyMCE_table_initInstance(inst) { - if (tinyMCE.isGecko) - tinyMCE.addEvent(inst.getDoc(), "mouseup", TinyMCE_table_mouseDownHandler); - - inst.tableRowClipboard = null; -} - -function TinyMCE_table_mouseDownHandler(e) { - var elm = tinyMCE.isMSIE ? event.srcElement : e.target; - var focusElm = tinyMCE.selectedInstance.getFocusElement(); - - // If press on special Mozilla create TD/TR thingie - if (elm.nodeName == "BODY" && (focusElm.nodeName == "TD" || (focusElm.parentNode && focusElm.parentNode.nodeName == "TD"))) { - window.setTimeout(function() { - var tableElm = tinyMCE.getParentElement(focusElm, "table"); - tinyMCE.handleVisualAid(tableElm, true, tinyMCE.settings['visual']); - }, 10); - } -} - -/** - * Returns the HTML contents of the table control. - */ -function TinyMCE_table_getControlHTML(control_name) { - var controls = new Array( - ['table', 'table.gif', '{$lang_table_desc}', 'mceInsertTable', true], - ['delete_col', 'table_delete_col.gif', '{$lang_table_delete_col_desc}', 'mceTableDeleteCol'], - ['delete_row', 'table_delete_row.gif', '{$lang_table_delete_row_desc}', 'mceTableDeleteRow'], - ['col_after', 'table_insert_col_after.gif', '{$lang_table_insert_col_after_desc}', 'mceTableInsertColAfter'], - ['col_before', 'table_insert_col_before.gif', '{$lang_table_insert_col_before_desc}', 'mceTableInsertColBefore'], - ['row_after', 'table_insert_row_after.gif', '{$lang_table_insert_row_after_desc}', 'mceTableInsertRowAfter'], - ['row_before', 'table_insert_row_before.gif', '{$lang_table_insert_row_before_desc}', 'mceTableInsertRowBefore'], - ['row_props', 'table_row_props.gif', '{$lang_table_row_desc}', 'mceTableRowProps', true], - ['cell_props', 'table_cell_props.gif', '{$lang_table_cell_desc}', 'mceTableCellProps', true], - ['split_cells', 'table_split_cells.gif', '{$lang_table_split_cells_desc}', 'mceTableSplitCells', true], - ['merge_cells', 'table_merge_cells.gif', '{$lang_table_merge_cells_desc}', 'mceTableMergeCells', true]); - - // Render table control - for (var i=0; i'; - else if (but[0] == control_name) - return ''; - } - - // Special tablecontrols - if (control_name == "tablecontrols") { - var html = ""; - - html += tinyMCE.getControlHTML("table"); - html += tinyMCE.getControlHTML("separator"); - html += tinyMCE.getControlHTML("row_props"); - html += tinyMCE.getControlHTML("cell_props"); - html += tinyMCE.getControlHTML("separator"); - html += tinyMCE.getControlHTML("row_before"); - html += tinyMCE.getControlHTML("row_after"); - html += tinyMCE.getControlHTML("delete_row"); - html += tinyMCE.getControlHTML("separator"); - html += tinyMCE.getControlHTML("col_before"); - html += tinyMCE.getControlHTML("col_after"); - html += tinyMCE.getControlHTML("delete_col"); - html += tinyMCE.getControlHTML("separator"); - html += tinyMCE.getControlHTML("split_cells"); - html += tinyMCE.getControlHTML("merge_cells"); - - return html; - } - - return ""; -} - -/** - * Executes the table commands. - */ -function TinyMCE_table_execCommand(editor_id, element, command, user_interface, value) { - var inst = tinyMCE.getInstanceById(editor_id); - var focusElm = inst.getFocusElement(); - var trElm = tinyMCE.getParentElement(focusElm, "tr"); - var tdElm = tinyMCE.getParentElement(focusElm, "td"); - var tableElm = tinyMCE.getParentElement(focusElm, "table"); - var doc = inst.contentWindow.document; - var tableBorder = tableElm ? tableElm.getAttribute("border") : ""; - - // Get first TD if no TD found - if (trElm && tdElm == null) - tdElm = trElm.cells[0]; - - // ------- Inner functions --------- - function inArray(ar, v) { - for (var i=0; i 0 && inArray(ar[i], v)) - return true; - - // Found value - if (ar[i] == v) - return true; - } - - return false; - } - - function makeTD() { - var newTD = doc.createElement("td"); - newTD.innerHTML = " "; - } - - function getColRowSpan(td) { - var colspan = tinyMCE.getAttrib(td, "colspan"); - var rowspan = tinyMCE.getAttrib(td, "rowspan"); - - colspan = colspan == "" ? 1 : parseInt(colspan); - rowspan = rowspan == "" ? 1 : parseInt(rowspan); - - return {colspan : colspan, rowspan : rowspan}; - } - - function getCellPos(grid, td) { - for (var y=0; y 1) { // Remove due to colspan - for (var i=x; i 1) - td.rowSpan = sd.rowspan + 1; - - lastElm = td; - } - - deleteMarked(tableElm); - } - } - - function prevElm(node, name) { - while ((node = node.previousSibling) != null) { - if (node.nodeName == name) - return node; - } - - return null; - } - - function nextElm(node, name) { - while ((node = node.nextSibling) != null) { - if (node.nodeName == name) - return node; - } - - return null; - } - - function deleteMarked(tbl) { - if (tbl.rows == 0) - return; - - var tr = tbl.rows[0]; - do { - var next = nextElm(tr, "TR"); - - // Delete row - if (tr._delete) { - tr.parentNode.removeChild(tr); - continue; - } - - // Delete cells - var td = tr.cells[0]; - if (td.cells > 1) { - do { - var nexttd = nextElm(td, "TD"); - - if (td._delete) - td.parentNode.removeChild(td); - } while ((td = nexttd) != null); - } - } while ((tr = next) != null); - } - - function addRows(td_elm, tr_elm, rowspan) { - // Add rows - td_elm.rowSpan = 1; - var trNext = nextElm(tr_elm, "TR"); - for (var i=1; i cols) - cols = rowsAr[i].cells.length; - - cols = cols; - rows = rowsAr.length; - - border = tinyMCE.getAttrib(tinyMCE.tableElm, 'border', border); - cellpadding = tinyMCE.getAttrib(tinyMCE.tableElm, 'cellpadding', ""); - cellspacing = tinyMCE.getAttrib(tinyMCE.tableElm, 'cellspacing', ""); - width = tinyMCE.getAttrib(tinyMCE.tableElm, 'width', width); - height = tinyMCE.getAttrib(tinyMCE.tableElm, 'height', height); - bordercolor = tinyMCE.getAttrib(tinyMCE.tableElm, 'bordercolor', bordercolor); - bgcolor = tinyMCE.getAttrib(tinyMCE.tableElm, 'bgcolor', bgcolor); - align = tinyMCE.getAttrib(tinyMCE.tableElm, 'align', align); - className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(tinyMCE.tableElm, 'class'), false); - - if (tinyMCE.isMSIE) { - width = tinyMCE.tableElm.style.pixelWidth == 0 ? tinyMCE.tableElm.getAttribute("width") : tinyMCE.tableElm.style.pixelWidth; - height = tinyMCE.tableElm.style.pixelHeight == 0 ? tinyMCE.tableElm.getAttribute("height") : tinyMCE.tableElm.style.pixelHeight; - } - - action = "update"; - } - - // Setup template - var template = new Array(); - - template['file'] = '../../plugins/table/table.htm'; - if (tinyMCE.settings['table_color_fields']) { - template['width'] = 400; - template['height'] = 240; - } else { - template['width'] = 340; - template['height'] = 220; - } - - // Language specific width and height addons - template['width'] += tinyMCE.getLang('lang_insert_table_delta_width', 0); - template['height'] += tinyMCE.getLang('lang_insert_table_delta_height', 0); - - // Open window - tinyMCE.openWindow(template, {editor_id : inst.editorId, cols : cols, rows : rows, border : border, cellpadding : cellpadding, cellspacing : cellspacing, align : align, width : width, height : height, bordercolor : bordercolor, bgcolor : bgcolor, action : action, className : className}); - } else { - var html = ''; - var cols = 2, rows = 2, border = 0, cellpadding = -1, cellspacing = -1, align, width, height, className, action; - - if (typeof(value) == 'object') { - cols = value['cols']; - rows = value['rows']; - border = value['border'] != "" ? value['border'] : 0; - cellpadding = value['cellpadding'] != "" ? value['cellpadding'] : -1; - cellspacing = value['cellspacing'] != "" ? value['cellspacing'] : -1; - align = value['align']; - width = value['width']; - height = value['height']; - bordercolor = value['bordercolor']; - bgcolor = value['bgcolor']; - className = value['className']; - action = value['action']; - } - - // Update table - if (tinyMCE.tableElm && action == "update") { - inst.execCommand("mceAddUndoLevel"); - - tinyMCE.setAttrib(tinyMCE.tableElm, 'cellPadding', cellpadding, true); - tinyMCE.setAttrib(tinyMCE.tableElm, 'cellSpacing', cellspacing, true); - tinyMCE.setAttrib(tinyMCE.tableElm, 'border', border, true); - tinyMCE.setAttrib(tinyMCE.tableElm, 'width', width, true); - tinyMCE.setAttrib(tinyMCE.tableElm, 'height', height, true); - tinyMCE.setAttrib(tinyMCE.tableElm, 'bordercolor', bordercolor); - tinyMCE.setAttrib(tinyMCE.tableElm, 'bgcolor', bgcolor); - tinyMCE.setAttrib(tinyMCE.tableElm, 'align', align); - tinyMCE.setAttrib(tinyMCE.tableElm, 'class', className); - - if (tinyMCE.isMSIE) { - tinyMCE.tableElm.style.pixelWidth = (width == null || width == "") ? 0 : width; - tinyMCE.tableElm.style.pixelHeight = (height == null || height == "") ? 0 : height; - tinyMCE.tableElm.borderColor = bordercolor; - tinyMCE.tableElm.bgColor = bgcolor; - } - - tinyMCE.handleVisualAid(tinyMCE.tableElm, false, inst.visualAid); - - // Fix for stange MSIE align bug - tinyMCE.tableElm.outerHTML = tinyMCE.tableElm.outerHTML; - - //inst.contentWindow.dispatchEvent(createEvent("click")); - - tinyMCE.triggerNodeChange(); - return true; - } - - // Create new table - html += ' 1) { - var newTD = cells[x].cloneNode(true); - var sd = getColRowSpan(cells[x]); - - newTD.rowSpan = sd.rowspan - 1; - - var nextTD = nextTR.cells[x]; - - if (nextTD == null) - nextTR.appendChild(newTD); - else - nextTR.insertBefore(newTD, nextTD); - } - } - - // Delete cells - var lastTDElm = null; - for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) { - if (tdElm != lastTDElm) { - var sd = getColRowSpan(tdElm); - - if (sd.rowspan > 1) { - tdElm.rowSpan = sd.rowspan - 1; - } else { - trElm = tdElm.parentNode; - - if (trElm.parentNode) - trElm._delete = true; - } - - lastTDElm = tdElm; - } - } - - deleteMarked(tableElm); - - cpos.rowindex--; - if (cpos.rowindex < 0) - cpos.rowindex = 0; - - inst.selectNode(getCell(grid, cpos.rowindex, 0), true, true); - break; - - case "mceTableInsertColBefore": - if (!trElm || !tdElm) - return true; - - var grid = getTableGrid(tableElm); - var cpos = getCellPos(grid, tdElm); - var lastTDElm = null; - - for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) { - if (tdElm != lastTDElm) { - var sd = getColRowSpan(tdElm); - - if (sd['colspan'] == 1) { - var newTD = doc.createElement("td"); - - newTD.innerHTML = " "; - newTD.rowSpan = tdElm.rowSpan; - - tdElm.parentNode.insertBefore(newTD, tdElm); - } else - tdElm.colSpan++; - - lastTDElm = tdElm; - } - } - break; - - case "mceTableInsertColAfter": - if (!trElm || !tdElm) - return true; - - var grid = getTableGrid(tableElm); - var cpos = getCellPos(grid, tdElm); - var lastTDElm = null; - - for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) { - if (tdElm != lastTDElm) { - var sd = getColRowSpan(tdElm); - - if (sd['colspan'] == 1) { - var newTD = doc.createElement("td"); - - newTD.innerHTML = " "; - newTD.rowSpan = tdElm.rowSpan; - - var nextTD = nextElm(tdElm, "TD"); - if (nextTD == null) - tdElm.parentNode.appendChild(newTD); - else - nextTD.parentNode.insertBefore(newTD, nextTD); - } else - tdElm.colSpan++; - - lastTDElm = tdElm; - } - } - break; - - case "mceTableDeleteCol": - if (!trElm || !tdElm) - return true; - - var grid = getTableGrid(tableElm); - var cpos = getCellPos(grid, tdElm); - var lastTDElm = null; - - // Only one col, remove whole table - if (grid.length > 1 && grid[0].length <= 1) { - tableElm.parentNode.removeChild(tableElm); - return true; - } - - // Delete cells - for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) { - if (tdElm != lastTDElm) { - var sd = getColRowSpan(tdElm); - - if (sd['colspan'] > 1) - tdElm.colSpan = sd['colspan'] - 1; - else { - if (tdElm.parentNode) - tdElm.parentNode.removeChild(tdElm); - } - - lastTDElm = tdElm; - } - } - - cpos.cellindex--; - if (cpos.cellindex < 0) - cpos.cellindex = 0; - - inst.selectNode(getCell(grid, 0, cpos.cellindex), true, true); - break; - - case "mceTableSplitCells": - if (!trElm || !tdElm) - return true; - - var spandata = getColRowSpan(tdElm); - - var colspan = spandata["colspan"]; - var rowspan = spandata["rowspan"]; - - // Needs splitting - if (colspan > 1 || rowspan > 1) { - // Generate cols - tdElm.colSpan = 1; - for (var i=1; i 1) - addRows(newTD, trElm, rowspan); - } - - addRows(tdElm, trElm, rowspan); - } - - // Apply visual aids - tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table"); - break; - - case "mceTableMergeCells": - var rows = new Array(); - var sel = inst.getSel(); - var grid = getTableGrid(tableElm); - - if (tinyMCE.isMSIE || sel.rangeCount == 1) { - if (user_interface) { - // Setup template - var template = new Array(); - var sp = getColRowSpan(tdElm); - - template['file'] = '../../plugins/table/merge_cells.htm'; - template['width'] = 160; - template['height'] = 220; - - // Open window - tinyMCE.openWindow(template, {editor_id : inst.editorId, action : "update", numcols : sp.colspan, numrows : sp.rowspan}); - - return true; - } else { - var numRows = parseInt(value['numrows']); - var numCols = parseInt(value['numcols']); - var cpos = getCellPos(grid, tdElm); - - if (("" + numRows) == "NaN") - numRows = 1; - - if (("" + numCols) == "NaN") - numCols = 1; - - // Get rows and cells - var tRows = tableElm.rows; - for (var y=cpos.rowindex; y 0) - rows[rows.length] = rowCells; - } - - //return true; - } - } else { - var cells = new Array(); - var sel = inst.getSel(); - var lastTR = null; - var curRow = null; - var x1 = -1, y1 = -1, x2, y2; - - // Only one cell selected, whats the point? - if (sel.rangeCount < 2) - return true; - - // Get all selected cells - for (var i=0; i 0) - rows[rows.length] = rowCells; - } - - // Find selected cells in grid and box - var curRow = new Array(); - var lastTR = null; - for (var y=0; y colSpan) - colSpan = rowColSpan; - - lastRowSpan = -1; - } - - // Validate vertical and get total rowspan - var lastColSpan = -1; - for (var x=0; x rowSpan) - rowSpan = colRowSpan; - - lastColSpan = -1; - } - - // Setup td - tdElm = rows[0][0]; - tdElm.rowSpan = rowSpan; - tdElm.colSpan = colSpan; - - // Merge cells - for (var y=0; y 0)) - tdElm.innerHTML += html; - - // Not current cell - if (rows[y][x] != tdElm && !rows[y][x]._deleted) { - var cpos = getCellPos(grid, rows[y][x]); - var tr = rows[y][x].parentNode; - - tr.removeChild(rows[y][x]); - rows[y][x]._deleted = true; - - // Empty TR, remove it - if (!tr.hasChildNodes()) { - tr.parentNode.removeChild(tr); - - var lastCell = null; - for (var x=0; cellElm = getCell(grid, cpos.rowindex, x); x++) { - if (cellElm != lastCell && cellElm.rowSpan > 1) - cellElm.rowSpan--; - - lastCell = cellElm; - } - - if (tdElm.rowSpan > 1) - tdElm.rowSpan--; - } - } - } - } - - break; - } - - tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table"); - tinyMCE.handleVisualAid(tableElm, true, tinyMCE.settings['visual']); - tinyMCE.triggerNodeChange(); - inst.repaint(); - } - - return true; - } - - // Pass to next handler in chain - return false; -} - -function TinyMCE_table_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { - var colspan = "1", rowspan = "1"; - - var inst = tinyMCE.getInstanceById(editor_id); - - // Reset table controls - tinyMCE.switchClassSticky(editor_id + '_table', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_row_props', 'mceButtonDisabled', true); - tinyMCE.switchClassSticky(editor_id + '_cell_props', 'mceButtonDisabled', true); - tinyMCE.switchClassSticky(editor_id + '_row_before', 'mceButtonDisabled', true); - tinyMCE.switchClassSticky(editor_id + '_row_after', 'mceButtonDisabled', true); - tinyMCE.switchClassSticky(editor_id + '_delete_row', 'mceButtonDisabled', true); - tinyMCE.switchClassSticky(editor_id + '_col_before', 'mceButtonDisabled', true); - tinyMCE.switchClassSticky(editor_id + '_col_after', 'mceButtonDisabled', true); - tinyMCE.switchClassSticky(editor_id + '_delete_col', 'mceButtonDisabled', true); - tinyMCE.switchClassSticky(editor_id + '_split_cells', 'mceButtonDisabled', true); - tinyMCE.switchClassSticky(editor_id + '_merge_cells', 'mceButtonDisabled', true); - - // Within a tr element - if (tinyMCE.getParentElement(node, "tr")) - tinyMCE.switchClassSticky(editor_id + '_row_props', 'mceButtonSelected', false); - - // Within a td element - if (tdElm = tinyMCE.getParentElement(node, "td")) { - tinyMCE.switchClassSticky(editor_id + '_cell_props', 'mceButtonSelected', false); - tinyMCE.switchClassSticky(editor_id + '_row_before', 'mceButtonNormal', false); - tinyMCE.switchClassSticky(editor_id + '_row_after', 'mceButtonNormal', false); - tinyMCE.switchClassSticky(editor_id + '_delete_row', 'mceButtonNormal', false); - tinyMCE.switchClassSticky(editor_id + '_col_before', 'mceButtonNormal', false); - tinyMCE.switchClassSticky(editor_id + '_col_after', 'mceButtonNormal', false); - tinyMCE.switchClassSticky(editor_id + '_delete_col', 'mceButtonNormal', false); - - colspan = tinyMCE.getAttrib(tdElm, "colspan"); - rowspan = tinyMCE.getAttrib(tdElm, "rowspan"); - - colspan = colspan == "" ? "1" : colspan; - rowspan = rowspan == "" ? "1" : rowspan; - - if (colspan != "1" || rowspan != "1") - tinyMCE.switchClassSticky(editor_id + '_split_cells', 'mceButtonNormal', false); - } - - // Within table - if (tinyMCE.getParentElement(node, "table")) { - tinyMCE.switchClassSticky(editor_id + '_table', 'mceButtonSelected'); - tinyMCE.switchClassSticky(editor_id + '_merge_cells', 'mceButtonNormal', false); - } -} diff --git a/public/tiny_mce/plugins/table/images/buttons.gif b/public/tiny_mce/plugins/table/images/buttons.gif deleted file mode 100644 index e5eacbfa7300a63ba2a4d4b2c177131f954f7009..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2113 zcmZ?wbhEHbyu%>E@SOn!{{R2~|HuCc6BaC3uwlc70|yRVxNzaYg9jfzeE5Ii#{UT` zJ}lVrzo22mfeZf&Dkd~^ESNB3!-5qDHte`?;KYLqH$FUg@xNighY1`08)Q6iD0rY? zQBW}BL&J*y0T~MtDmE{{{gQ0vaA9O!(lCupppdLqfxWf(aKI7CdkWD44L} z!-50<0}>h%3MLdZENGapVZwp~3pQN1@Zi5e!2<=42@Vwx0y;h~-upyyh!iEbUCagG+P|&bo$AyB1 z2?uU`Xqd2I!h#J8HXPV+;KG3m4;nfqOqj7?!;S+7PF%QfmCbw|J9m}}* zX|vWby9zaptS21_l8w0>8VZjNs4iT>bb1Qo;jm}o-N_v~4;#$h#cbhbUEj|@FiS9jAaee>==E-{C=(Hhv^~xzZo^3^z^(`m@UJp7t!Dtzr*3E zh(OB*7p~wP0Y|4?`k30ts^7pNDjp*EWr}!;oyf5$W7E)}E{#tf_Zb=g2sTJec%pf% zx9FJr^0^hSPCl=8;z)EAaMWOQ5t5tI&?2mKWkUSIu!xHdi+ZfMRxYV!`=CCVE9g=C zY>r;WLtM5qejHsD@8ZBF8F%Er*D99=#gNr5-e*?{_~a>GpHMgNT4nmY2^|-k91r}n zTr=;u5Q|%lqk-aD0iPBDC!xoV6R&J$^iX`e{TkN}=BSfw3Y@ZqIuSXWISMx(VpX28 z<9b30@54oWOYXgzu#ffQ?Fn%;v4Vl?_!|q`BskP{+*BrZ7#>`(OjhSuDvvc!p{kI> z?_7b0(+(Wqi+Cj#&-|e6^r7R5*4i5-I6Q<7$W1Z%v%x9mheH#a+NJELE3JMMG>hFz z{XU_LU2tuP)Ro8sdd>{rzfNH3b=56RPIxf2ux5iLnk=n|CR zo&Bl7I$;8HRQP?#11i}J8%nRM6vEXn$#<<7})3@@)oG++!ocTRHm&0Mso@QZ*k_M-sh0KP(D&)7XwTfEEp5Ru) zH0R>a=bVKLmp2i~|5Xw{9RGzqS9ss( zUn87w|EI(ziF(S`q;|oz;t`U2WCboMRrSrM*hzywlQ!SvRh~*@m{uY=k{pmjM$<4NQTLhn`BIPpn)miA)BW-Wg%7cHxIE8LwWbDmOP_ zp7NKE?5+$;*x62ce=A7n=q#D9o1D2%=S7gBTk@R`D$51@UZrxy?@T+WRd_aMnPd0V z3r>$Yf=({gW$8O~dtURUmFIXi8P9dANw;Qg@~bSnpeFp_g2j b%&ARMUlwrqu5c1Rb)n7b%R(Ve4hCxg^nPJi diff --git a/public/tiny_mce/plugins/table/images/table.gif b/public/tiny_mce/plugins/table/images/table.gif deleted file mode 100644 index f8a00544a9980d38c44d5fe8e9a8457be8339834..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1018 zcmZ?wbhEHb6k!lyXlDQc0RaI6kA#4T0Ed8rf`Wp8goX(g1{(?zE>t9Jm=LgGM!<#z z0UK5%T<9n`u%Y0=gn|nP5+0l=cyOVhp`)Q;!h#74HY`}MV8V(64GTUrtoSft#fJ$y z{x4W@V8Mn13w9h>u;Idj9TzriIIv;Ig#|l4Y&dXX!GZr9PW<0+;lqIq4F`5iIIw)d z@x$A19Nc;1#J&#?CLB0$;lPOt7fu|wcJb(qOUExyRd;}fkB~?d$YKp7)wH+!4r?kh7u31XdX)FQ1U1i;Z!n7XOI--X>y2i zdC4j&T=H#4;(-P1vgU_=?FevjY>+Z{6EL{Z_^MZlm5t$r;*)lEMmEEM-o_~%eYzc+i=hr~AtgdP74JQ6ls_%LC`fdxA*9Juje!h#J8HXPV+ z;KG3m4-TBTaN)*-2Os`_`0;^04#XL`dd0RdKv#TL(F zT2?UUn8*Ax$g+`ta$ zxwHbSyp;TgWo|1OnK;&Rvu}`>T<$E%Db2wlb#$qiwEFiWmiWAYXJBm BiopN? diff --git a/public/tiny_mce/plugins/table/images/table_delete_col.gif b/public/tiny_mce/plugins/table/images/table_delete_col.gif deleted file mode 100644 index 0b2f0fb61293b95d119f620c15e12cd3a3e3bb0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 929 zcmZ?wbhEHb6k!lyXlDQc1CIoUhysI*2L=TX0x}vB3MM!dJSb?G5YX@-VZwui2_Fg; zd}!#H(9p49!h{7AW-OSnV8en18yXfoXjt%J!io~S3`1SM0@87@v{Qmv_|9_AR zM)7C}3{VIt{$ychV9;jJ0of1A6AT=64B;Fy9vc=MY~~QwiaD`CflX8^z~jS(MrVc& zRVJA|0);FsU6OjUI2K+^Xc19yuz9dyp;LpflHC*?iGvLd418u8GXxGeG|uLhPT8;^ zLCu*(Ohd(BmjGikEBg#Bmjw+67*=u${@`f{RcvTu+ux+BQTB$5A>%BU&gyNthZ`8I E0Xkxe=>Px# diff --git a/public/tiny_mce/plugins/table/images/table_delete_row.gif b/public/tiny_mce/plugins/table/images/table_delete_row.gif deleted file mode 100644 index 1997065fb2b447f498ab7fda4b7e21dcbb25dc81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 942 zcmZ?wbhEHb6k!lyXlDQc1CIoUh=PEGhJcKQgo1{IiU|b`3j#VmBuw~FFylkPf)5Q7 z7Bo!QFk!}m2{SfKSg@gC#fJ$SK1|s0VZn+63pO0su;ajj9Um4P_^{!`hYctGAGq-U zz>WVG9{hjs;{SsW|37^A|KZ2~|3Ci!|NkFk*(e?jfx#34ia%MH85mR;bU=;*d8IKJM4mNWLYsH+Huz;0YR4HfyL*v7aZV6|T4KoCfw6n`NSA2Q!kinTlL(!(- zK|`ZA8>eg4ivx+yY&=3r2Shj)Jn-R@GKe{`lfjXZ!DFJ(lZHg67FI4Hg&9@}3I0ut vo3id|DJUN6R&)x9=?H8&!EY_v#QX7KGdnZS_B2t41q<))u8?G7VXy`O>|lPv diff --git a/public/tiny_mce/plugins/table/images/table_insert_col_after.gif b/public/tiny_mce/plugins/table/images/table_insert_col_after.gif deleted file mode 100644 index c30dafab6f054142f20191d12041c9fc68731380..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 936 zcmZ?wbhEHb6k!lyXlDQc1CNA&goc2OhJ=EKgo+6T6%!mP9uzc82U@(P%;!hT41_l)d9gw3yd4hqX zmBEuk#$&^RgUuYmaw-Lm2OAlkVC^8=DV3sU6vEhM|n-H&6&V&bokD2+Uz1?a) zEMR0}lILXVh%8X^ZDc6Acck)yBQrBIlSxK^L&K>i0jHV|0tzoLEoM<~Vfd)n5V9(O o-A`hn2?Oi8P|-S3K_!P)!IaHhTMU}A8F+F}znk;hP=Uc309ucE`2YX_ diff --git a/public/tiny_mce/plugins/table/images/table_insert_col_before.gif b/public/tiny_mce/plugins/table/images/table_insert_col_before.gif deleted file mode 100644 index 5d1ff37afea7bb2e67952400e00184aa275d6764..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 935 zcmZ?wbhEHb6k!lyXlDQc1CNA&goc2OhJ=EKgo+6T6%!mP9uzc82U@(P%;!hT41_l)d9gw3yd4hqX zg~5|U#$&^RgUuYgLOT{baA;`ZGIjCzAfV*PCS#U@(P%;!hT41_l)d9gw3yd4hqX zmcf%l#$&^RgUuYgQ40(bnON94x%*~FD7iFuu()?{Fg|K#>|xff`|%)=!K0BeXqAm8 zlQV0ZfZn`07K;}7Opvmy(>M^M;>oBJx-Mnrhl9;*JRAZCI2;}@^UGRf><|!a2xZ{4 f$T=b4$QaznVdN1p;Q@m;lM}N*?CEK#4h+@+J92bd diff --git a/public/tiny_mce/plugins/table/images/table_insert_row_before.gif b/public/tiny_mce/plugins/table/images/table_insert_row_before.gif deleted file mode 100644 index c3271e54937cb8dbfb435ee8bc2d02157cff1448..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 928 zcmZ?wbhEHb6k!lyXlDQc1CNA&goc2OhJ=EKgo+6T6%!mP9uzc82U@(P%;!hT41_l)d9gw3yd4hqX zmcf%l#$&^RgUuYmS}_?P4mPv#a0ou>@?09c2d^|UtO#WO5Oexlf&+s!0Gyq90{{R3 diff --git a/public/tiny_mce/plugins/table/images/table_merge_cells.gif b/public/tiny_mce/plugins/table/images/table_merge_cells.gif deleted file mode 100644 index 494887efdd5afe862850a097a6eb079e890d174c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 383 zcmZ?wbhEHb6k!lyxXQp_;E{0u&h-U5E)-1IaO?U7hlB+m-oGiB@nFJ^{|X)x5-Jun ztoZ-`|NjXq4m^8uf5VCY6BcYpXxQ-W>*qJGo+mUMXjt$dp<+Y9gbNM{69O_8JbrL{ z!G;S94*Z|6;s3pB*S>%MUNGZBK*5GrFP^-6^Ri*afe8x^7z9jMu;IXl3;zomHY8LW zNa(om{r&p|JN`Fp_`hJqfq;Sq#XV~cA|^OwEMOo4DE?$&WME)q&;h9h`H6vT&Vhyk z4;`ug6HAIts?1}#a5l55YOhpp5U0}}1BoT;BNYEJbu{Jg;L$cdcbK=+L}G~&SH!Z0 zi8F-?oYdnDHQL(v`DMB}8X5KDHQPJ8WOO-1`zG*+bxf7v;E-kSwEvf JLl;K|YXBX%sT=?R diff --git a/public/tiny_mce/plugins/table/images/table_row_props.gif b/public/tiny_mce/plugins/table/images/table_row_props.gif deleted file mode 100644 index a53cdd8bf6b04c1090d9c545963647ad4b6e37d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 367 zcmZ?wbhEHb6k!lyxXJ(m|NsC0|KtCG0~an_c<|xF{|PHTELd@1!;T9FPCU49~AtgdP74JQ6ls_%LC`fdxA*9Juje!h#J8HXPV+ z;KG3m4-TBTaN)*-2Os`_`0;^04#XL`dd0RdKv#TL(F zT2?UUn8*Ax$g+`XY?4t?k>MzDVGr)<4VDsd6YHD8KG9W@MV485uC$_}6ua1T7s+yI z1y*?})^$tVmNPPOtmbB4$11thS&~zlgG1`@Vlm0x8%0i?K6Bdl{Dq6IjttfSMdFJ- diff --git a/public/tiny_mce/plugins/table/images/table_split_cells.gif b/public/tiny_mce/plugins/table/images/table_split_cells.gif deleted file mode 100644 index b86179aebc54b1d6cf4f97d438b31392901acd5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 396 zcmZ?wbhEHb6k!lyxXQpFpb_xo(cJ|*E(8>8xOM%4g2#jj3pRZI^r2zJ|AGk{0x}j% z*zsS%qM%{Hga7~kzj^h1!-@X|6D|~VY?!d%fPqJXL&AiFiUSHB4fpR{PpDY1V8exH zPwu~a^YYu*&jm9c+`D!yp<=^=6$cjV_&;I8e}jMt4KohBdhz7L`!@+47YqU#HeC4c zkg(wU_xA-eJ_r~jEZA@$pkTp*1OJPA);4VTpU|*j!iob15fdCT7AQCrG^}`#&~ShO z6)65>VPs%nWY7T#gZ#w6w(>wjfrpM%|A{3b1f0$O#nqa%_2dzUD;6?K*IOw6 z3+iaf-@&78ea_i;<&+5?8Im)SLN`w2Dsa+|7t(4|)e;aeFf_DmWK?Wv(-P`3)K=o= zoiK?{p}4%V#!S;Dmw=? - -{$lang_table_merge_cells_title} - - - - -
-
-{$lang_table_merge_cells_title} -
- - - - - - - - - - - - -
{$lang_insert_table_cols}: -
{$lang_insert_table_rows}:
- - - - diff --git a/public/tiny_mce/plugins/table/readme.txt b/public/tiny_mce/plugins/table/readme.txt deleted file mode 100644 index ff2741a..0000000 --- a/public/tiny_mce/plugins/table/readme.txt +++ /dev/null @@ -1,44 +0,0 @@ - Table plugin for TinyMCE ------------------------------- - -Installation instructions: - * Copy the table directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins). - * Add plugin to TinyMCE plugin option list example: plugins : "table". - * Add the table button name to button list, example: theme_advanced_buttons3_add_before : "tablecontrols". - -Initialization example: - tinyMCE.init({ - theme : "advanced", - mode : "textareas", - plugins : "table", - theme_advanced_buttons3_add_before : "tablecontrols" - }); - -Table controls: - tablecontrols All table control below and some separators between them. - table Insert table control. - row_props Edit row properties (tr). - cell_props Edit cell properties (td). - delete_col Delete column control. - delete_row Delete row control. - col_after Column after control. - col_before Column before control. - row_after Row after control. - row_before Row before control. - row_after Row after control. - row_before Row before control. - -Table plugin commands: - mceInsertTable Inserts a new table at cursor location the default size is 2x2. - If the value parameter is specified it should contain a name/value array, - this array has the following options cols, rows, border, cellspacing, cellpadding. - The default border is set to: 0. - mceTableInsertRowBefore Inserts a row before/above the current cursor location. - mceTableInsertRowAfter Inserts a row after/under the current cursor location. - mceTableDeleteRow Deletes the row at the current cursor location. - mceTableInsertColBefore Inserts a column before the current cursor location. - mceTableInsertColAfter Inserts a column after the current cursor location. - mceTableDeleteCol Deletes the column at the current cursor location. - -Options: - table_color_fields If set to true, tables dialogs will have color fields. diff --git a/public/tiny_mce/plugins/table/row.htm b/public/tiny_mce/plugins/table/row.htm deleted file mode 100644 index bb77c2b..0000000 --- a/public/tiny_mce/plugins/table/row.htm +++ /dev/null @@ -1,127 +0,0 @@ - - -{$lang_table_row_title} - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
{$lang_table_row_title}
{$lang_insert_table_align}:{$lang_insert_table_class}:
{$lang_insert_table_valign}:{$lang_insert_table_height}:
  
-
- - diff --git a/public/tiny_mce/plugins/table/table.htm b/public/tiny_mce/plugins/table/table.htm deleted file mode 100644 index 667949e..0000000 --- a/public/tiny_mce/plugins/table/table.htm +++ /dev/null @@ -1,153 +0,0 @@ - - -{$lang_insert_table_title} - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{$lang_insert_table_title}
{$lang_insert_table_cols}:{$lang_insert_table_rows}:
{$lang_insert_table_cellpadding}:{$lang_insert_table_cellspacing}:
{$lang_insert_table_align}:{$lang_insert_table_border}:
{$lang_insert_table_width}:{$lang_insert_table_height}:
{$lang_insert_table_class}: -   
  
-
- - diff --git a/public/tiny_mce/plugins/zoom/editor_plugin.js b/public/tiny_mce/plugins/zoom/editor_plugin.js deleted file mode 100644 index ec349a5..0000000 --- a/public/tiny_mce/plugins/zoom/editor_plugin.js +++ /dev/null @@ -1,7 +0,0 @@ -/* Import plugin specific language pack */ - function TinyMCE_zoom_getControlHTML(control_name){if(!tinyMCE.isMSIE||tinyMCE.isMSIE5_0)return "";switch(control_name){case "zoom":return '';}return "";}function TinyMCE_zoom_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceZoom":tinyMCE.getInstanceById(editor_id).contentDocument.body.style.zoom=value;tinyMCE.getInstanceById(editor_id).contentDocument.body.style.mozZoom=value;return true;}return false;} \ No newline at end of file diff --git a/public/tiny_mce/plugins/zoom/editor_plugin_src.js b/public/tiny_mce/plugins/zoom/editor_plugin_src.js deleted file mode 100644 index e0af5af..0000000 --- a/public/tiny_mce/plugins/zoom/editor_plugin_src.js +++ /dev/null @@ -1,38 +0,0 @@ -/* Import plugin specific language pack */ -//tinyMCE.importPluginLanguagePack('zoom', 'en,sv,pt,fr_ca,fr,de'); - -/** - * Returns the HTML contents of the zoom control. - */ -function TinyMCE_zoom_getControlHTML(control_name) { - if (!tinyMCE.isMSIE || tinyMCE.isMSIE5_0) - return ""; - - switch (control_name) { - case "zoom": - return ''; - } - - return ""; -} - -/** - * Executes the mceZoom command. - */ -function TinyMCE_zoom_execCommand(editor_id, element, command, user_interface, value) { - // Handle commands - switch (command) { - case "mceZoom": - tinyMCE.getInstanceById(editor_id).contentDocument.body.style.zoom = value; - tinyMCE.getInstanceById(editor_id).contentDocument.body.style.mozZoom = value; - return true; - } - - // Pass to next handler in chain - return false; -} diff --git a/public/tiny_mce/plugins/zoom/langs/fa.js b/public/tiny_mce/plugins/zoom/langs/fa.js deleted file mode 100644 index a0414d9..0000000 --- a/public/tiny_mce/plugins/zoom/langs/fa.js +++ /dev/null @@ -1,8 +0,0 @@ -// IR lang variables -// Persian (Farsi) language pack (for IRAN) -// By: Morteza Zafari -// Lost@LostLord.com -// http://www.LostLord.com - -tinyMCELang['lang_dir'] = 'rtl'; -tinyMCELang['lang_zoom_prefix'] = 'بزرگنمایی'; diff --git a/public/tiny_mce/plugins/zoom/langs/fr_ca.js b/public/tiny_mce/plugins/zoom/langs/fr_ca.js deleted file mode 100644 index 11d3604..0000000 --- a/public/tiny_mce/plugins/zoom/langs/fr_ca.js +++ /dev/null @@ -1,3 +0,0 @@ -// CA_FR lang variables - -tinyMCELang['lang_zoom_prefix'] = 'Zoom'; diff --git a/public/tiny_mce/plugins/zoom/langs/pl.js b/public/tiny_mce/plugins/zoom/langs/pl.js deleted file mode 100644 index 1f49adb..0000000 --- a/public/tiny_mce/plugins/zoom/langs/pl.js +++ /dev/null @@ -1,4 +0,0 @@ -// PL lang variables - -tinyMCELang['lang_dir'] = 'ltr'; -tinyMCELang['lang_zoom_prefix'] = 'Powiększenie'; \ No newline at end of file diff --git a/public/tiny_mce/plugins/zoom/langs/pt_br.js b/public/tiny_mce/plugins/zoom/langs/pt_br.js deleted file mode 100644 index 43a10c9..0000000 --- a/public/tiny_mce/plugins/zoom/langs/pt_br.js +++ /dev/null @@ -1,3 +0,0 @@ -// pt_BR lang variables - -tinyMCELang['lang_zoom_prefix'] = 'Zoom'; diff --git a/public/tiny_mce/plugins/zoom/langs/zh_cn.js b/public/tiny_mce/plugins/zoom/langs/zh_cn.js deleted file mode 100644 index 2833632..0000000 --- a/public/tiny_mce/plugins/zoom/langs/zh_cn.js +++ /dev/null @@ -1,5 +0,0 @@ -// Simplified Chinese lang variables contributed by cube316 (cube316@gmail.com) -// http://www.cube316.net/ ԻȡTinyMCE֧ - -tinyMCELang['lang_dir'] = 'ltr'; -tinyMCELang['lang_zoom_prefix'] = ''; \ No newline at end of file diff --git a/public/tiny_mce/plugins/zoom/readme.txt b/public/tiny_mce/plugins/zoom/readme.txt deleted file mode 100644 index bf9e585..0000000 --- a/public/tiny_mce/plugins/zoom/readme.txt +++ /dev/null @@ -1,22 +0,0 @@ - Zoom plugin for TinyMCE --------------------------- - -About: - Adds a zoom drop list in MSIE5.5+, this plugin was mostly created to - show how to add custom droplists as plugins. - -Installation instructions: - * Copy the zoom directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins). - * Add plugin to TinyMCE plugin option list example: plugins : "zoom". - * Add the preview button name to button list, example: theme_advanced_buttons3_add : "zoom". - -Initialization example: - tinyMCE.init({ - theme : "advanced", - mode : "textareas", - plugins : "preview", - theme_advanced_buttons3_add : "zoom" - }); - -Requirement: - This plugin requires MSIE on Mozilla the button will not be visible. diff --git a/public/tiny_mce/themes/advanced/anchor.htm b/public/tiny_mce/themes/advanced/anchor.htm deleted file mode 100644 index 38edd5a..0000000 --- a/public/tiny_mce/themes/advanced/anchor.htm +++ /dev/null @@ -1,45 +0,0 @@ - - -{$lang_insert_anchor_title} - - - - -
- - - - -
- - - - - - - - - - - -
{$lang_insert_anchor_title}
{$lang_insert_anchor_name}:
-
-
- - diff --git a/public/tiny_mce/themes/advanced/charmap.htm b/public/tiny_mce/themes/advanced/charmap.htm deleted file mode 100644 index 71ceb22..0000000 --- a/public/tiny_mce/themes/advanced/charmap.htm +++ /dev/null @@ -1,378 +0,0 @@ - - -{$lang_theme_charmap_title} - - - - - - - - - - - - - - - - -
{$lang_theme_charmap_title}
- - - - - - - - - -
 
 
-
- - - - - - - - - - - - - - - - -
HTML-Code
 
 
NUM-Code
 
-
- - - diff --git a/public/tiny_mce/themes/advanced/color_picker.htm b/public/tiny_mce/themes/advanced/color_picker.htm deleted file mode 100644 index b1dc3aa..0000000 --- a/public/tiny_mce/themes/advanced/color_picker.htm +++ /dev/null @@ -1,271 +0,0 @@ - - -{$lang_theme_colorpicker_title} - - - - -
- -
- - diff --git a/public/tiny_mce/themes/advanced/docs/en/about.htm b/public/tiny_mce/themes/advanced/docs/en/about.htm deleted file mode 100644 index 984a990..0000000 --- a/public/tiny_mce/themes/advanced/docs/en/about.htm +++ /dev/null @@ -1,32 +0,0 @@ - - - -About TinyMCE - - - - - - - - - - - -
-
-TinyMCE is a small WYSIWYG editor control for web browsers such as MSIE or Mozilla -that enables you to edit HTML contents in a more user friendly way. It has common -features that are found in most word processors and should not be difficult to -use.
-
-
- - - - - - -
- - diff --git a/public/tiny_mce/themes/advanced/docs/en/common_buttons.htm b/public/tiny_mce/themes/advanced/docs/en/common_buttons.htm deleted file mode 100644 index c63d7dc..0000000 --- a/public/tiny_mce/themes/advanced/docs/en/common_buttons.htm +++ /dev/null @@ -1,163 +0,0 @@ - - - -Common buttons - - - - - - - - - - - -
-
-Below is a short description about each button. -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Bold text style.
Italic text style.
Underline text style.
Strikethrough text style.
Align left.
Align center.
Align right.
Align full.
Unordered list/bullet list.
Ordered list/numbered list
Outdent/decrease indentation.
Indent/incread indentation.
Undo the last operation.
Redo the last operation.
Insert a new link, read more about this function in the Insert - link section.
Unlinks the current selection/removes all selected links.
Insert a new anchor, read more about this function in the Insert anchor section.
Insert a new image, read more about this function in the Insert - image section.
Cleanup code/Removes unwanted formating. This function is useful when - you copy contents from for example a office product.
Shows this help window.
Opens HTML source code editor.
Inserts a new 2x2 table at the current location.
Adds a row above the current one.
Adds a row under the current one.
Removes the row.
Adds a column before the current one.
Adds a column after the current one.
Removes the current column.
Inserts a new horizontal ruler
Removes formatting from the selection.
Makes the selection to be subscript.
Makes the selection to be superscripted.
-
-
- - - - - - - - diff --git a/public/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif b/public/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif deleted file mode 100644 index 5b5f528dd57cae8e062919a66b0ff7fcf8f3bc42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5189 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 XWUn~cUU7-N;#PabBX=qzBZD;nRjCd| diff --git a/public/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif b/public/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif deleted file mode 100644 index cdc617eab3be256173af047822671023c41d53c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7195 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 diff --git a/public/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif b/public/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif deleted file mode 100644 index 7bad7583ab9a0642467d271ec8a102e87a2ec521..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5658 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 L|DH24GFSru|E)YN diff --git a/public/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif b/public/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif deleted file mode 100644 index 6a032c5ae8dfcf3fad7ed65c814c2b1a1e88d25d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7094 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 s^hWaZ+HcxlH~%fWQ+&O){9g6 - - -Help Index - - - - - - - - - -
-
-Click the links below to go to the different help sections. -
-
- - diff --git a/public/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm b/public/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm deleted file mode 100644 index e1118a2..0000000 --- a/public/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm +++ /dev/null @@ -1,33 +0,0 @@ - - - -Insert anchor button - - - - - - - - - - - -
-
-This button opens a new window with the insert/edit anchor function.
-
-
-
-There are one field in this window, this is where you enter the name of you anchor point. Remember the anchor name needs to be unique.
-
-
- - - - - - -
- - diff --git a/public/tiny_mce/themes/advanced/docs/en/insert_image_button.htm b/public/tiny_mce/themes/advanced/docs/en/insert_image_button.htm deleted file mode 100644 index e101fff..0000000 --- a/public/tiny_mce/themes/advanced/docs/en/insert_image_button.htm +++ /dev/null @@ -1,66 +0,0 @@ - - - -Insert image button - - - - - - - - - - - -
-
-The insert image button opens the window shown below.
-
-
-
-You simply enter a URL to the image you want to link to and enter a image description, -this is then displayed as an alternative text descripton of the image on the page.
-
-Field descriptions:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Image URL URL/path to the image.
Image description Alternative description of image contents.
DimentionsImage width/height.
AlignmentImage alignment, useful when wrapping text around images.
BorderBorder thickness.
VSpaceVertical space, useful when wrapping text around images.
HSpaceHorizontal space, useful when wrapping text around images.
-
-
- - - - - - -
- - diff --git a/public/tiny_mce/themes/advanced/docs/en/insert_link_button.htm b/public/tiny_mce/themes/advanced/docs/en/insert_link_button.htm deleted file mode 100644 index ddfeb3a..0000000 --- a/public/tiny_mce/themes/advanced/docs/en/insert_link_button.htm +++ /dev/null @@ -1,34 +0,0 @@ - - - -Insert link button - - - - - - - - - - - -
-
-This button opens a new window with the insert/edit link function.
-
-
-
-There are two fields in this window the first one "Link URL" is the -URL of the link. The target enables you to select how the link is to be opened.
-
-
- - - - - - -
- - diff --git a/public/tiny_mce/themes/advanced/docs/en/insert_table_button.htm b/public/tiny_mce/themes/advanced/docs/en/insert_table_button.htm deleted file mode 100644 index d3bd196..0000000 --- a/public/tiny_mce/themes/advanced/docs/en/insert_table_button.htm +++ /dev/null @@ -1,72 +0,0 @@ - - - -Insert table button - - - - - - - - - - - -
-
-The insert table button opens the window shown below. This action enables you to create tables.
-
-
-
-Field descriptions:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ColumnsNumber of columns in the table.
RowsNumber of rows in the new table.
CellpaddingCellpadding of the table .
CellspacingCellspacing of the table .
AlignmentTable alignment .
BorderBorder thinkness of table.
WidthWidth in pixels of table .
HeightHeight in pixels of table.
ClassStyle or CSS class of table.
-
-
-
- - - - - - -
- - diff --git a/public/tiny_mce/themes/advanced/docs/en/style.css b/public/tiny_mce/themes/advanced/docs/en/style.css deleted file mode 100644 index 722f537..0000000 --- a/public/tiny_mce/themes/advanced/docs/en/style.css +++ /dev/null @@ -1,28 +0,0 @@ -body { background-color: #FFFFFF; } -body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; } -.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; } -.subtitle { font-size: 12px; font-weight: bold; } - -.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; } -.step_ol, .step_li { margin-left: 11 px; line-height: 16px; } -img { border: #000000 solid 1px; } - -a:visited { color: #666666; text-decoration: underline; } -a:active { color: #666666; text-decoration: underline; } -a:hover { color: #666666; text-decoration: underline; } -a { color: #666666; text-decoration: underline; } - -.pageheader { border: #E0E0E0 solid 1px; } -.pagefooter { border: #E0E0E0 solid 1px; } -.sample { background-color: #FFFFFF; border: #000000 solid 1px; } -.samplecontent { font-size: 10px; } - -.code { background-color: #FFFFFF; border: #000000 solid 1px; } -.codecontent { font-size: 10px; } -.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold } -.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold } -.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold } -.codecontent a { color: #666666; text-decoration: none; font-weight: bold } - -hr { height: 1px; } - diff --git a/public/tiny_mce/themes/advanced/docs/images/table.gif b/public/tiny_mce/themes/advanced/docs/images/table.gif deleted file mode 100644 index f8a00544a9980d38c44d5fe8e9a8457be8339834..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1018 zcmZ?wbhEHb6k!lyXlDQc0RaI6kA#4T0Ed8rf`Wp8goX(g1{(?zE>t9Jm=LgGM!<#z z0UK5%T<9n`u%Y0=gn|nP5+0l=cyOVhp`)Q;!h#74HY`}MV8V(64GTUrtoSft#fJ$y z{x4W@V8Mn13w9h>u;Idj9TzriIIv;Ig#|l4Y&dXX!GZr9PW<0+;lqIq4F`5iIIw)d z@x$A19Nc;1#J&#?CLB0$;lPOt7fu|wcJb(qOUExyRd;}fkB~?d$YKp7)wH+!4r?kh7u31XdX)FQ1U1i;Z!n7XOI--X>y2i zdC4j&T=H#4;(-P1vgU_=?FevjY>+Z{6EL{Z_^MZlm5t$r;*)lEMmEEM-o_~%eYzc+i=hr~S3`1SM0@87@v{Qmv_|9_AR zM)7C}3{VIt{$ychV9;jJ0of1A6AT=64B;Fy9vc=MY~~QwiaD`CflX8^z~jS(MrVc& zRVJA|0);FsU6OjUI2K+^Xc19yuz9dyp;LpflHC*?iGvLd418u8GXxGeG|uLhPT8;^ zLCu*(Ohd(BmjGikEBg#Bmjw+67*=u${@`f{RcvTu+ux+BQTB$5A>%BU&gyNthZ`8I E0Xkxe=>Px# diff --git a/public/tiny_mce/themes/advanced/docs/images/table_delete_row.gif b/public/tiny_mce/themes/advanced/docs/images/table_delete_row.gif deleted file mode 100644 index 1997065fb2b447f498ab7fda4b7e21dcbb25dc81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 942 zcmZ?wbhEHb6k!lyXlDQc1CIoUh=PEGhJcKQgo1{IiU|b`3j#VmBuw~FFylkPf)5Q7 z7Bo!QFk!}m2{SfKSg@gC#fJ$SK1|s0VZn+63pO0su;ajj9Um4P_^{!`hYctGAGq-U zz>WVG9{hjs;{SsW|37^A|KZ2~|3Ci!|NkFk*(e?jfx#34ia%MH85mR;bU=;*d8IKJM4mNWLYsH+Huz;0YR4HfyL*v7aZV6|T4KoCfw6n`NSA2Q!kinTlL(!(- zK|`ZA8>eg4ivx+yY&=3r2Shj)Jn-R@GKe{`lfjXZ!DFJ(lZHg67FI4Hg&9@}3I0ut vo3id|DJUN6R&)x9=?H8&!EY_v#QX7KGdnZS_B2t41q<))u8?G7VXy`O>|lPv diff --git a/public/tiny_mce/themes/advanced/docs/images/table_insert_col_after.gif b/public/tiny_mce/themes/advanced/docs/images/table_insert_col_after.gif deleted file mode 100644 index c30dafab6f054142f20191d12041c9fc68731380..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 936 zcmZ?wbhEHb6k!lyXlDQc1CNA&goc2OhJ=EKgo+6T6%!mP9uzc82U@(P%;!hT41_l)d9gw3yd4hqX zmBEuk#$&^RgUuYmaw-Lm2OAlkVC^8=DV3sU6vEhM|n-H&6&V&bokD2+Uz1?a) zEMR0}lILXVh%8X^ZDc6Acck)yBQrBIlSxK^L&K>i0jHV|0tzoLEoM<~Vfd)n5V9(O o-A`hn2?Oi8P|-S3K_!P)!IaHhTMU}A8F+F}znk;hP=Uc309ucE`2YX_ diff --git a/public/tiny_mce/themes/advanced/docs/images/table_insert_col_before.gif b/public/tiny_mce/themes/advanced/docs/images/table_insert_col_before.gif deleted file mode 100644 index 5d1ff37afea7bb2e67952400e00184aa275d6764..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 935 zcmZ?wbhEHb6k!lyXlDQc1CNA&goc2OhJ=EKgo+6T6%!mP9uzc82U@(P%;!hT41_l)d9gw3yd4hqX zg~5|U#$&^RgUuYgLOT{baA;`ZGIjCzAfV*PCS#U@(P%;!hT41_l)d9gw3yd4hqX zmcf%l#$&^RgUuYgQ40(bnON94x%*~FD7iFuu()?{Fg|K#>|xff`|%)=!K0BeXqAm8 zlQV0ZfZn`07K;}7Opvmy(>M^M;>oBJx-Mnrhl9;*JRAZCI2;}@^UGRf><|!a2xZ{4 f$T=b4$QaznVdN1p;Q@m;lM}N*?CEK#4h+@+J92bd diff --git a/public/tiny_mce/themes/advanced/docs/images/table_insert_row_before.gif b/public/tiny_mce/themes/advanced/docs/images/table_insert_row_before.gif deleted file mode 100644 index c3271e54937cb8dbfb435ee8bc2d02157cff1448..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 928 zcmZ?wbhEHb6k!lyXlDQc1CNA&goc2OhJ=EKgo+6T6%!mP9uzc82U@(P%;!hT41_l)d9gw3yd4hqX zmcf%l#$&^RgUuYmS}_?P4mPv#a0ou>@?09c2d^|UtO#WO5Oexlf&+s!0Gyq90{{R3 diff --git a/public/tiny_mce/themes/advanced/editor_content.css b/public/tiny_mce/themes/advanced/editor_content.css deleted file mode 100644 index 75290ee..0000000 --- a/public/tiny_mce/themes/advanced/editor_content.css +++ /dev/null @@ -1,27 +0,0 @@ -body { - background-color: #FFFFFF; - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 10px; - scrollbar-3dlight-color: #F0F0EE; - scrollbar-arrow-color: #676662; - scrollbar-base-color: #F0F0EE; - scrollbar-darkshadow-color: #DDDDDD; - scrollbar-face-color: #E0E0DD; - scrollbar-highlight-color: #F0F0EE; - scrollbar-shadow-color: #F0F0EE; - scrollbar-track-color: #F5F5F5; -} - -td { - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 10px; -} - -pre { - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 10px; -} - -.mceVisualAid { - border: 1px dashed #BBBBBB; -} diff --git a/public/tiny_mce/themes/advanced/editor_popup.css b/public/tiny_mce/themes/advanced/editor_popup.css deleted file mode 100644 index d51982c..0000000 --- a/public/tiny_mce/themes/advanced/editor_popup.css +++ /dev/null @@ -1,121 +0,0 @@ -body { - background-color: #F0F0EE; - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 11px; - scrollbar-3dlight-color: #F0F0EE; - scrollbar-arrow-color: #676662; - scrollbar-base-color: #F0F0EE; - scrollbar-darkshadow-color: #DDDDDD; - scrollbar-face-color: #E0E0DD; - scrollbar-highlight-color: #F0F0EE; - scrollbar-shadow-color: #F0F0EE; - scrollbar-track-color: #F5F5F5; -} - -td { - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 11px; -} - -input { - background: #FFFFFF; - border: 1px solid #cccccc; -} - -td, input, select, textarea { - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 10px; -} - -input, select, textarea { - border: 1px solid #808080; -} - -.input_noborder { - border: 0px solid #808080; -} - -#insert { - font-weight: bold; -} - -#cancel { - font-weight: bold; -} - -.title { - font-size: 12px; - font-weight: bold; -} - -table.charmap { - border-style: solid; - border-width: 1px; - border-color: #AAAAAA; -} - -td.charmap, td.charmapOver { - color: #000000; - border-color: #AAAAAA; - border-style: solid; - border-width: 1px; - text-align: center; - font-size: 12px; -} - -td.charmapOver { - background-color: #CCCCCC; - cursor: arrow; -} - -a.charmap { - color: #000000; - text-decoration: none -} - -.wordWrapCode { - vertical-align: middle; - border: 1px none #000000; - background-color: transparent; -} - -input.radio { - border: 1px none #000000; - background-color: transparent; - vertical-align: middle; -} - -input.checkbox { - border: 1px none #000000; - background-color: transparent; - vertical-align: middle; -} - -.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected { - margin-left: 1px; -} - -.mceButtonNormal { - border-top: 1px solid; - border-left: 1px solid; - border-bottom: 1px solid; - border-right: 1px solid; - border-color: #F0F0EE; - cursor: arrow; -} - -.mceButtonOver { - border: 1px solid #0A246A; - cursor: arrow; - background-color: #B6BDD2; -} - -.mceButtonDown { - cursor: arrow; - border: 1px solid #0A246A; - background-color: #8592B5; -} - -legend { - font-weight: bold; -} diff --git a/public/tiny_mce/themes/advanced/editor_template.js b/public/tiny_mce/themes/advanced/editor_template.js deleted file mode 100644 index 473e7cc..0000000 --- a/public/tiny_mce/themes/advanced/editor_template.js +++ /dev/null @@ -1,31 +0,0 @@ -/* Import theme specific language pack */ - tinyMCE.importThemeLanguagePack('advanced');var TinyMCE_advanced_autoImportCSSClasses=true;var TinyMCE_advanced_foreColor="#000000";var TinyMCE_advanced_anchorName="";var TinyMCE_advanced_buttons=[['bold','{$lang_bold_img}','{$lang_bold_desc}','Bold'],['italic','{$lang_italic_img}','{$lang_italic_desc}','Italic'],['underline','{$lang_underline_img}','{$lang_underline_desc}','Underline'],['strikethrough','strikethrough.gif','{$lang_striketrough_desc}','Strikethrough'],['justifyleft','left.gif','{$lang_justifyleft_desc}','JustifyLeft'],['justifycenter','center.gif','{$lang_justifycenter_desc}','JustifyCenter'],['justifyright','right.gif','{$lang_justifyright_desc}','JustifyRight'],['justifyfull','full.gif','{$lang_justifyfull_desc}','JustifyFull'],['bullist','bullist.gif','{$lang_bullist_desc}','InsertUnorderedList'],['numlist','numlist.gif','{$lang_numlist_desc}','InsertOrderedList'],['outdent','outdent.gif','{$lang_outdent_desc}','Outdent'],['indent','indent.gif','{$lang_indent_desc}','Indent'],['cut','cut.gif','{$lang_cut_desc}','Cut'],['copy','copy.gif','{$lang_copy_desc}','Copy'],['paste','paste.gif','{$lang_paste_desc}','Paste'],['undo','undo.gif','{$lang_undo_desc}','Undo'],['redo','redo.gif','{$lang_redo_desc}','Redo'],['link','link.gif','{$lang_link_desc}','mceLink',true],['attachment','attachment.gif','{$lang_attachment_desc}','mceAttachment',true],['unlink','unlink.gif','{$lang_unlink_desc}','unlink'],['image','image.gif','{$lang_image_desc}','mceImage',true],['cleanup','cleanup.gif','{$lang_cleanup_desc}','mceCleanup'],['help','help.gif','{$lang_help_desc}','mceHelp'],['code','code.gif','{$lang_theme_code_desc}','mceCodeEditor'],['hr','hr.gif','{$lang_theme_hr_desc}','inserthorizontalrule'],['removeformat','removeformat.gif','{$lang_theme_removeformat_desc}','removeformat'],['sub','sub.gif','{$lang_theme_sub_desc}','subscript'],['sup','sup.gif','{$lang_theme_sup_desc}','superscript'],['forecolor','forecolor.gif','{$lang_theme_forecolor_desc}','mceForeColor',true],['backcolor','backcolor.gif','{$lang_theme_backcolor_desc}','mceBackColor',true],['charmap','charmap.gif','{$lang_theme_charmap_desc}','mceCharMap'],['visualaid','visualaid.gif','{$lang_theme_visualaid_desc}','mceToggleVisualAid'],['anchor','anchor.gif','{$lang_theme_anchor_desc}','mceInsertAnchor']];function TinyMCE_advanced_getControlHTML(button_name){var buttonTileMap=new Array('anchor.gif','backcolor.gif','bullist.gif','center.gif','charmap.gif','cleanup.gif','code.gif','copy.gif','custom_1.gif','cut.gif','forecolor.gif','full.gif','help.gif','hr.gif','image.gif','indent.gif','left.gif','link.gif','attachment.gif','numlist.gif','outdent.gif','paste.gif','redo.gif','removeformat.gif','right.gif','strikethrough.gif','sub.gif','sup.gif','undo.gif','unlink.gif','visualaid.gif');for(var i=0;i';}}}return '';}}switch(button_name){case "formatselect":var html='';return html;case "styleselect":return '';case "fontselect":return '';case "fontsizeselect":return '';case "|":case "separator":return '';case "spacer":return '';case "rowseparator":return '
';}return "";}function TinyMCE_advanced_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceForeColor":var template=new Array();var inputColor=TinyMCE_advanced_foreColor;if(!inputColor){inputColor="#000000";}template['file']='color_picker.htm';template['width']=210;template['height']=200;tinyMCE.openWindow(template,{editor_id:editor_id,command:"forecolor",input_color:inputColor});return true;case "mceBackColor":var template=new Array();var inputColor=TinyMCE_advanced_foreColor;if(!inputColor){inputColor="#000000";}template['file']='color_picker.htm';template['width']=210;template['height']=200;tinyMCE.openWindow(template,{editor_id:editor_id,command:"HiliteColor",input_color:inputColor});return true;case "mceCodeEditor":var template=new Array();template['file']='source_editor.htm';template['width']=tinyMCE.getParam("theme_advanced_source_editor_width",500);template['height']=tinyMCE.getParam("theme_advanced_source_editor_height",400);tinyMCE.openWindow(template,{editor_id:editor_id,resizable:"yes",scrollbars:"no"});return true;case "mceCharMap":var template=new Array();template['file']='charmap.htm';template['width']=550;template['height']=280;tinyMCE.openWindow(template,{editor_id:editor_id});return true;case "mceInsertAnchor":var template=new Array();template['file']='anchor.htm';template['width']=320;template['height']=130;tinyMCE.openWindow(template,{editor_id:editor_id,name:TinyMCE_advanced_anchorName,action:(TinyMCE_advanced_anchorName==""?"insert":"update")});return true;}return false;}function TinyMCE_advanced_getEditorTemplate(settings,editorId){function removeFromArray(in_array,remove_array){var outArray=new Array();for(var i=0;i'+key+'';}TinyMCE_advanced_autoImportCSSClasses=false;}switch(layoutManager){case "SimpleLayout":var toolbarHTML="";var toolbarLocation=tinyMCE.getParam("theme_advanced_toolbar_location","bottom");var toolbarAlign=tinyMCE.getParam("theme_advanced_toolbar_align","center");var pathLocation=tinyMCE.getParam("theme_advanced_path_location","none");var buttonNamesRow1=tinyMCE.getParam("theme_advanced_buttons1","bold,italic,underline,strikethrough,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,styleselect,formatselect",true,',');buttonNamesRow1=removeFromArray(buttonNamesRow1,tinyMCE.getParam("theme_advanced_disable","",true,','));buttonNamesRow1=addToArray(buttonNamesRow1,tinyMCE.getParam("theme_advanced_buttons1_add","",true,','));buttonNamesRow1=addToArray(tinyMCE.getParam("theme_advanced_buttons1_add_before","",true,','),buttonNamesRow1);for(var i=0;i0){toolbarHTML+="
";deltaHeight-=23;}var buttonNamesRow2=tinyMCE.getParam("theme_advanced_buttons2","bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,attachment,anchor,image,cleanup,help,code",true,',');buttonNamesRow2=removeFromArray(buttonNamesRow2,tinyMCE.getParam("theme_advanced_disable","",true,','));buttonNamesRow2=addToArray(buttonNamesRow2,tinyMCE.getParam("theme_advanced_buttons2_add","",true,','));buttonNamesRow2=addToArray(tinyMCE.getParam("theme_advanced_buttons2_add_before","",true,','),buttonNamesRow2);for(var i=0;i0){toolbarHTML+="
";deltaHeight-=23;}var buttonNamesRow3=tinyMCE.getParam("theme_advanced_buttons3","hr,removeformat,visualaid,separator,sub,sup,separator,charmap",true,',');buttonNamesRow3=removeFromArray(buttonNamesRow3,tinyMCE.getParam("theme_advanced_disable","",true,','));buttonNamesRow3=addToArray(buttonNamesRow3,tinyMCE.getParam("theme_advanced_buttons3_add","",true,','));buttonNamesRow3=addToArray(tinyMCE.getParam("theme_advanced_buttons3_add_before","",true,','),buttonNamesRow3);for(var i=0;i0){deltaHeight-=20;}template['html']='';if(toolbarLocation=="top"){template['html']+='';}if(pathLocation=="top"){template['html']+='';deltaHeight-=23;}template['html']+='';if(toolbarLocation=="bottom"){template['html']+='';}if(toolbarLocation=="external"){var bod=document.body;var elm=document.createElement("div");toolbarHTML=tinyMCE.replaceVars(toolbarHTML,tinyMCE.settings);toolbarHTML=tinyMCE.replaceVars(toolbarHTML,tinyMCELang);toolbarHTML=tinyMCE.replaceVar(toolbarHTML,'style_select_options',styleSelectHTML);toolbarHTML=tinyMCE.replaceVar(toolbarHTML,"editor_id",editorId);toolbarHTML=tinyMCE.replaceVar(toolbarHTML,"default_document",tinyMCE.baseURL+"/blank.htm");elm.className="mceToolbarExternal";elm.id="mceExternalToolbar";elm.innerHTML='
'+toolbarHTML+'
'+pathHTML+'
'+toolbarHTML+'
'+toolbarHTML+'
';bod.appendChild(elm);bod.style.marginTop=elm.offsetHeight+"px";tinyMCE.isExternalToolbar=true;}else{tinyMCE.isExternalToolbar=false;}if(pathLocation=="bottom"){template['html']+=''+pathHTML+'';deltaHeight-=23;}template['html']+='';break;case "RowLayout":template['html']='';var containers=tinyMCE.getParam("theme_advanced_containers","",true,",");var defaultContainerCSS=tinyMCE.getParam("theme_advanced_containers_default_class","container");var defaultContainerAlign=tinyMCE.getParam("theme_advanced_containers_default_align","center");for(var i=0;i';}else if(containers[i]=="mceElementpath"){var pathClass="mcePath";if(i==containers.length-1){pathClass="mcePathBottom";}else if(i==0){pathClass="mcePathTop";}else{deltaHeight-=2;}template['html']+='';deltaHeight-=22;}else{var curContainer=tinyMCE.getParam("theme_advanced_container_"+containers[i],"",true,',');var curContainerHTML="";var curAlign=tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_align",defaultContainerAlign);var curCSS=tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_class",defaultContainerCSS);for(var j=0;j0){curContainerHTML+="
";deltaHeight-=23;}template['html']+='
';}}template['html']+='
\ - \ -
'+pathHTML+'
'+curContainerHTML+'
';break;case "BorderLayout":break;case "CustomLayout":var customLayout=tinyMCE.getParam("theme_advanced_custom_layout","");if(customLayout!=""&&eval("typeof("+customLayout+")")!="undefined"){template=eval(customLayout+"(template);");}break;default:alert('UNDEFINED LAYOUT MANAGER! PLEASE CHECK YOUR TINYMCE CONFIG!');break;}template['html']=tinyMCE.replaceVar(template['html'],'style_select_options',styleSelectHTML);template['delta_width']=0;template['delta_height']=deltaHeight;return template;}function TinyMCE_advanced_getInsertLinkTemplate(){var template=new Array();template['file']='link.htm';template['width']=300;template['height']=150;template['width']+=tinyMCE.getLang('lang_insert_link_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_link_delta_height',0);return template;};function TinyMCE_advanced_getInsertAttachmentTemplate(){var template=new Array();template['file']='attachment.htm';template['width']=300;template['height']=150;template['width']+=tinyMCE.getLang('lang_insert_attachment_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_attachment_delta_height',0);return template;}function TinyMCE_advanced_getInsertImageTemplate(){var template=new Array();template['file']='image.htm?src={$src}';template['width']=340;template['height']=280;template['width']+=tinyMCE.getLang('lang_insert_image_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_image_delta_height',0);return template;};function TinyMCE_advanced_handleNodeChange(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){function selectByValue(select_elm,value){if(select_elm){for(var i=0;i=0;i--){var nodeName=path[i].nodeName.toLowerCase();var nodeData="";if(nodeName=="b"){nodeName="strong";}if(nodeName=="i"){nodeName="em";}if(getAttrib(path[i],'id')!=""){nodeData+="id: "+path[i].getAttribute('id')+" ";}if(getAttrib(path[i],'class')!=""){nodeData+="class: "+path[i].getAttribute('class')+" ";}if(getAttrib(path[i],'className')!=""){nodeData+="class: "+path[i].getAttribute('className')+" ";}if(getAttrib(path[i],'src')!=""){nodeData+="src: "+path[i].getAttribute('src')+" ";}if(getAttrib(path[i],'href')!=""){nodeData+="href: "+path[i].getAttribute('href')+" ";}if(nodeName=="img"&&getAttrib(path[i],'name')=="mce_plugin_flash"){nodeName="flash";nodeData="";}if(getAttrib(path[i],'name').indexOf("mce_")!=0){if(getAttrib(path[i],"className")!=""){nodeName+="."+getAttrib(path[i],"className");}else if(getAttrib(path[i],"class")!=""){nodeName+="."+getAttrib(path[i],"class");}}if(tinyMCE.isMSIE){html+=''+nodeName+'';}else{html+=''+nodeName+'';}if(i>0){html+=" » ";}}pathElm.innerHTML=html+" ";}var colorElm=tinyMCE.getParentElement(node,"font","color");if(colorElm){TinyMCE_advanced_foreColor=""+colorElm.color.toUpperCase();}tinyMCE.switchClassSticky(editor_id+'_justifyleft','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_justifyright','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_justifycenter','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_justifyfull','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_bold','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_italic','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_underline','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_strikethrough','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_bullist','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_numlist','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_sub','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_sup','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_anchor','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_link','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_attachment','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_unlink','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_outdent','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_image','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_hr','mceButtonNormal');var anchorName=tinyMCE.getParentElement(node,"a","name");TinyMCE_advanced_anchorName="";if(anchorName){TinyMCE_advanced_anchorName=anchorName.getAttribute("name");tinyMCE.switchClassSticky(editor_id+'_anchor','mceButtonSelected');}var anchorLink=tinyMCE.getParentElement(node,"a","href");if(anchorLink||any_selection){tinyMCE.switchClassSticky(editor_id+'_link',anchorLink?'mceButtonSelected':'mceButtonNormal',false);tinyMCE.switchClassSticky(editor_id+'_attachment',anchorLink?'mceButtonSelected':'mceButtonNormal',false);tinyMCE.switchClassSticky(editor_id+'_unlink',anchorLink?'mceButtonSelected':'mceButtonNormal',false);}tinyMCE.switchClassSticky(editor_id+'_visualaid',visual_aid?'mceButtonSelected':'mceButtonNormal',false);if(undo_levels!=-1){tinyMCE.switchClassSticky(editor_id+'_undo','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_redo','mceButtonDisabled',true);}if(tinyMCE.getParentElement(node,"li,blockquote")){tinyMCE.switchClassSticky(editor_id+'_outdent','mceButtonNormal',false);}if(undo_index!=-1&&(undo_index0)){tinyMCE.switchClassSticky(editor_id+'_redo','mceButtonNormal',false);}if(undo_index!=-1&&(undo_index>0&&undo_levels>0)){tinyMCE.switchClassSticky(editor_id+'_undo','mceButtonNormal',false);}var selectElm=document.getElementById(editor_id+"_styleSelect");if(selectElm){TinyMCE_advanced_setupCSSClasses(editor_id);classNode=node;breakOut=false;var index=0;do{if(classNode&&classNode.className){for(var i=0;i");}else{selectByValue(selectElm,"");}}var selectElm=document.getElementById(editor_id+"_fontNameSelect");if(selectElm){var elm=tinyMCE.getParentElement(node,"font","face");if(elm){selectByValue(selectElm,elm.getAttribute("face"));}else{selectByValue(selectElm,"");}}var selectElm=document.getElementById(editor_id+"_fontSizeSelect");if(selectElm){var elm=tinyMCE.getParentElement(node,"font","size");if(elm&&getAttrib(elm,"size")!=""){selectByValue(selectElm,elm.getAttribute("size"));}else{selectByValue(selectElm,"0");}}alignNode=node;breakOut=false;do{if(!alignNode.getAttribute||!alignNode.getAttribute('align')){continue;}switch(alignNode.getAttribute('align').toLowerCase()){case "left":tinyMCE.switchClassSticky(editor_id+'_justifyleft','mceButtonSelected');breakOut=true;break;case "right":tinyMCE.switchClassSticky(editor_id+'_justifyright','mceButtonSelected');breakOut=true;break;case "middle":case "center":tinyMCE.switchClassSticky(editor_id+'_justifycenter','mceButtonSelected');breakOut=true;break;case "justify":tinyMCE.switchClassSticky(editor_id+'_justifyfull','mceButtonSelected');breakOut=true;break;}}while(!breakOut&&(alignNode=alignNode.parentNode));if(tinyMCE.isGecko&&node.nodeType==3){var inst=tinyMCE.getInstanceById(editor_id);var doc=inst.getDoc();if(doc.queryCommandState("Bold")){tinyMCE.switchClassSticky(editor_id+'_bold','mceButtonSelected');}if(doc.queryCommandState("Italic")){tinyMCE.switchClassSticky(editor_id+'_italic','mceButtonSelected');}if(doc.queryCommandState("Underline")&&(node.parentNode==null||node.parentNode.nodeName!="A")){tinyMCE.switchClassSticky(editor_id+'_underline','mceButtonSelected');}if(doc.queryCommandState("Strikethrough")){tinyMCE.switchClassSticky(editor_id+'_strikethrough','mceButtonSelected');}}do{switch(node.nodeName.toLowerCase()){case "b":case "strong":tinyMCE.switchClassSticky(editor_id+'_bold','mceButtonSelected');break;case "i":case "em":tinyMCE.switchClassSticky(editor_id+'_italic','mceButtonSelected');break;case "u":tinyMCE.switchClassSticky(editor_id+'_underline','mceButtonSelected');break;case "strike":tinyMCE.switchClassSticky(editor_id+'_strikethrough','mceButtonSelected');break;case "ul":tinyMCE.switchClassSticky(editor_id+'_bullist','mceButtonSelected');break;case "ol":tinyMCE.switchClassSticky(editor_id+'_numlist','mceButtonSelected');break;case "sub":tinyMCE.switchClassSticky(editor_id+'_sub','mceButtonSelected');break;case "sup":tinyMCE.switchClassSticky(editor_id+'_sup','mceButtonSelected');break;case "hr":tinyMCE.switchClassSticky(editor_id+'_hr','mceButtonSelected');break;case "img":if(getAttrib(node,'name').indexOf('mce_')!=0){tinyMCE.switchClassSticky(editor_id+'_image','mceButtonSelected');}break;}}while((node=node.parentNode));};function TinyMCE_advanced_setupCSSClasses(editor_id){if(!TinyMCE_advanced_autoImportCSSClasses){return;}var selectElm=document.getElementById(editor_id+'_styleSelect');if(selectElm&&selectElm.getAttribute('cssImported')!='true'){var csses=tinyMCE.getCSSClasses(editor_id);if(csses&&selectElm){for(var i=0;i0){selectElm.setAttribute('cssImported','true');}}}; \ No newline at end of file diff --git a/public/tiny_mce/themes/advanced/editor_template_src.js b/public/tiny_mce/themes/advanced/editor_template_src.js deleted file mode 100644 index d8f8180..0000000 --- a/public/tiny_mce/themes/advanced/editor_template_src.js +++ /dev/null @@ -1,1010 +0,0 @@ -/* Import theme specific language pack */ -tinyMCE.importThemeLanguagePack('advanced'); - -// Variable declarations -var TinyMCE_advanced_autoImportCSSClasses = true; -var TinyMCE_advanced_foreColor = "#000000"; -var TinyMCE_advanced_anchorName = ""; -var TinyMCE_advanced_buttons = [ - // Control id, button img, button title, command, user_interface, value - ['bold', '{$lang_bold_img}', '{$lang_bold_desc}', 'Bold'], - ['italic', '{$lang_italic_img}', '{$lang_italic_desc}', 'Italic'], - ['underline', '{$lang_underline_img}', '{$lang_underline_desc}', 'Underline'], - ['strikethrough', 'strikethrough.gif', '{$lang_striketrough_desc}', 'Strikethrough'], - ['justifyleft', 'left.gif', '{$lang_justifyleft_desc}', 'JustifyLeft'], - ['justifycenter', 'center.gif', '{$lang_justifycenter_desc}', 'JustifyCenter'], - ['justifyright', 'right.gif', '{$lang_justifyright_desc}', 'JustifyRight'], - ['justifyfull', 'full.gif', '{$lang_justifyfull_desc}', 'JustifyFull'], - ['bullist', 'bullist.gif', '{$lang_bullist_desc}', 'InsertUnorderedList'], - ['numlist', 'numlist.gif', '{$lang_numlist_desc}', 'InsertOrderedList'], - ['outdent', 'outdent.gif', '{$lang_outdent_desc}', 'Outdent'], - ['indent', 'indent.gif', '{$lang_indent_desc}', 'Indent'], - ['cut', 'cut.gif', '{$lang_cut_desc}', 'Cut'], - ['copy', 'copy.gif', '{$lang_copy_desc}', 'Copy'], - ['paste', 'paste.gif', '{$lang_paste_desc}', 'Paste'], - ['undo', 'undo.gif', '{$lang_undo_desc}', 'Undo'], - ['redo', 'redo.gif', '{$lang_redo_desc}', 'Redo'], - ['link', 'link.gif', '{$lang_link_desc}', 'mceLink', true], - ['attachment', 'attachment.gif', '{$lang_attachment_desc}', 'mceAttachment', true], - ['unlink', 'unlink.gif', '{$lang_unlink_desc}', 'unlink'], - ['image', 'image.gif', '{$lang_image_desc}', 'mceImage', true], - ['cleanup', 'cleanup.gif', '{$lang_cleanup_desc}', 'mceCleanup'], - ['help', 'help.gif', '{$lang_help_desc}', 'mceHelp'], - ['code', 'code.gif', '{$lang_theme_code_desc}', 'mceCodeEditor'], - ['hr', 'hr.gif', '{$lang_theme_hr_desc}', 'inserthorizontalrule'], - ['removeformat', 'removeformat.gif', '{$lang_theme_removeformat_desc}', 'removeformat'], - ['sub', 'sub.gif', '{$lang_theme_sub_desc}', 'subscript'], - ['sup', 'sup.gif', '{$lang_theme_sup_desc}', 'superscript'], - ['forecolor', 'forecolor.gif', '{$lang_theme_forecolor_desc}', 'mceForeColor', true], - ['backcolor', 'backcolor.gif', '{$lang_theme_backcolor_desc}', 'mceBackColor', true], - ['charmap', 'charmap.gif', '{$lang_theme_charmap_desc}', 'mceCharMap'], - ['visualaid', 'visualaid.gif', '{$lang_theme_visualaid_desc}', 'mceToggleVisualAid'], - ['anchor', 'anchor.gif', '{$lang_theme_anchor_desc}', 'mceInsertAnchor'] -]; - -/** - * Returns HTML code for the specificed control. - */ -function TinyMCE_advanced_getControlHTML(button_name) -{ - var buttonTileMap = new Array('anchor.gif','backcolor.gif','bullist.gif','center.gif', - 'charmap.gif','cleanup.gif','code.gif','copy.gif','custom_1.gif', - 'cut.gif','forecolor.gif','full.gif','help.gif','hr.gif', - 'image.gif','indent.gif','left.gif','link.gif','attachment.gif','numlist.gif', - 'outdent.gif','paste.gif','redo.gif','removeformat.gif', - 'right.gif','strikethrough.gif','sub.gif','sup.gif','undo.gif', - 'unlink.gif','visualaid.gif'); - - // Lookup button in button list - for (var i=0; i'; - } - } - } - - // Old style - return ''; - } - } - - // Custom controlls other than buttons - switch (button_name) - { - case "formatselect": - var html = ''; - //formatselect - return html; - - case "styleselect": - //styleselect - return ''; - - case "fontselect": - //fontselect - return ''; - - case "fontsizeselect": - //fontsizeselect - return ''; - - case "|": - case "separator": - return ''; - - case "spacer": - return ''; - - case "rowseparator": - return '
'; - } - - return ""; -} - -/** - * Theme specific exec command handeling. - */ -function TinyMCE_advanced_execCommand(editor_id, element, command, user_interface, value) -{ - switch (command) - { - case "mceForeColor": - var template = new Array(); - var inputColor = TinyMCE_advanced_foreColor; - - if (!inputColor) - { - inputColor = "#000000"; - } - - template['file'] = 'color_picker.htm'; - template['width'] = 210; - template['height'] = 200; - - tinyMCE.openWindow(template, {editor_id : editor_id, command : "forecolor", input_color : inputColor}); - //mceForeColor - return true; - - case "mceBackColor": - var template = new Array(); - var inputColor = TinyMCE_advanced_foreColor; - - if (!inputColor) - { - inputColor = "#000000"; - } - - template['file'] = 'color_picker.htm'; - template['width'] = 210; - template['height'] = 200; - - tinyMCE.openWindow(template, {editor_id : editor_id, command : "HiliteColor", input_color : inputColor}); - //mceBackColor - return true; - - case "mceCodeEditor": - var template = new Array(); - - template['file'] = 'source_editor.htm'; - template['width'] = tinyMCE.getParam("theme_advanced_source_editor_width", 500); - template['height'] = tinyMCE.getParam("theme_advanced_source_editor_height", 400); - - tinyMCE.openWindow(template, {editor_id : editor_id, resizable : "yes", scrollbars : "no"}); - //mceCodeEditor - return true; - - case "mceCharMap": - var template = new Array(); - - template['file'] = 'charmap.htm'; - template['width'] = 550; - template['height'] = 280; - - tinyMCE.openWindow(template, {editor_id : editor_id}); - //mceCharMap - return true; - - case "mceInsertAnchor": - var template = new Array(); - - template['file'] = 'anchor.htm'; - template['width'] = 320; - template['height'] = 130; - - tinyMCE.openWindow(template, {editor_id : editor_id, name : TinyMCE_advanced_anchorName, action : (TinyMCE_advanced_anchorName == "" ? "insert" : "update")}); - //mceInsertAnchor - return true; - } - - // Default behavior - return false; -} - -/** - * Editor instance template function. - */ -function TinyMCE_advanced_getEditorTemplate(settings, editorId) -{ - function removeFromArray(in_array, remove_array) - { - var outArray = new Array(); - - for (var i=0; i' + key + ''; - } - - TinyMCE_advanced_autoImportCSSClasses = false; - } - - switch(layoutManager) - { - case "SimpleLayout" : //the default TinyMCE Layout (for backwards compatibility)... - var toolbarHTML = ""; - var toolbarLocation = tinyMCE.getParam("theme_advanced_toolbar_location", "bottom"); - var toolbarAlign = tinyMCE.getParam("theme_advanced_toolbar_align", "center"); - var pathLocation = tinyMCE.getParam("theme_advanced_path_location", "none"); - - // Render row 1 - var buttonNamesRow1 = tinyMCE.getParam("theme_advanced_buttons1", "bold,italic,underline,strikethrough,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,styleselect,formatselect", true, ','); - buttonNamesRow1 = removeFromArray(buttonNamesRow1, tinyMCE.getParam("theme_advanced_disable", "", true, ',')); - buttonNamesRow1 = addToArray(buttonNamesRow1, tinyMCE.getParam("theme_advanced_buttons1_add", "", true, ',')); - buttonNamesRow1 = addToArray(tinyMCE.getParam("theme_advanced_buttons1_add_before", "", true, ','), buttonNamesRow1); - - for (var i=0; i 0) - { - toolbarHTML += "
"; - deltaHeight -= 23; - } - - // Render row 2 - var buttonNamesRow2 = tinyMCE.getParam("theme_advanced_buttons2", "bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,attachment,anchor,image,cleanup,help,code", true, ','); - buttonNamesRow2 = removeFromArray(buttonNamesRow2, tinyMCE.getParam("theme_advanced_disable", "", true, ',')); - buttonNamesRow2 = addToArray(buttonNamesRow2, tinyMCE.getParam("theme_advanced_buttons2_add", "", true, ',')); - buttonNamesRow2 = addToArray(tinyMCE.getParam("theme_advanced_buttons2_add_before", "", true, ','), buttonNamesRow2); - - for (var i=0; i 0) - { - toolbarHTML += "
"; - deltaHeight -= 23; - } - - // Render row 3 - var buttonNamesRow3 = tinyMCE.getParam("theme_advanced_buttons3", "hr,removeformat,visualaid,separator,sub,sup,separator,charmap", true, ','); - buttonNamesRow3 = removeFromArray(buttonNamesRow3, tinyMCE.getParam("theme_advanced_disable", "", true, ',')); - buttonNamesRow3 = addToArray(buttonNamesRow3, tinyMCE.getParam("theme_advanced_buttons3_add", "", true, ',')); - buttonNamesRow3 = addToArray(tinyMCE.getParam("theme_advanced_buttons3_add_before", "", true, ','), buttonNamesRow3); - - for (var i=0; i 0) - { - deltaHeight -= 20; - } - - // Setup template html - template['html'] = ''; - - if (toolbarLocation == "top") - { - template['html'] += ''; - } - - if (pathLocation == "top") - { - template['html'] += ''; - deltaHeight -= 23; - } - - template['html'] += ''; - - if (toolbarLocation == "bottom") - { - template['html'] += ''; - } - - // External toolbar changes - if (toolbarLocation == "external") - { - var bod = document.body; - var elm = document.createElement ("div"); - - toolbarHTML = tinyMCE.replaceVars(toolbarHTML, tinyMCE.settings); - toolbarHTML = tinyMCE.replaceVars(toolbarHTML, tinyMCELang); - toolbarHTML = tinyMCE.replaceVar(toolbarHTML, 'style_select_options', styleSelectHTML); - toolbarHTML = tinyMCE.replaceVar(toolbarHTML, "editor_id", editorId); - toolbarHTML = tinyMCE.replaceVar(toolbarHTML, "default_document", tinyMCE.baseURL + "/blank.htm"); - - elm.className = "mceToolbarExternal"; - elm.id = "mceExternalToolbar"; - elm.innerHTML = '
' + toolbarHTML + '
' + pathHTML + '
' + toolbarHTML + '
'+toolbarHTML+'
'; - bod.appendChild (elm); - bod.style.marginTop = elm.offsetHeight + "px"; - - tinyMCE.isExternalToolbar = true; - - //template['html'] = '
'+toolbarHTML+'
' + template["html"]; - } - else - { - tinyMCE.isExternalToolbar = false; - } - - if (pathLocation == "bottom") - { - template['html'] += '' + pathHTML + ''; - deltaHeight -= 23; - } - - template['html'] += ''; - //"SimpleLayout" - break; - - case "RowLayout" : //Container Layout - containers defined in "theme_advanced_containers" are rendered from top to bottom. - template['html'] = ''; - - var containers = tinyMCE.getParam("theme_advanced_containers", "", true, ","); - var defaultContainerCSS = tinyMCE.getParam("theme_advanced_containers_default_class", "container"); - var defaultContainerAlign = tinyMCE.getParam("theme_advanced_containers_default_align", "center"); - - //Render Containers: - for (var i = 0; i < containers.length; i++) - { - if (containers[i] == "mceEditor") //Exceptions for mceEditor and ... - { - template['html'] += ''; - } - else if (containers[i] == "mceElementpath") // ... mceElementpath: - { - var pathClass = "mcePath"; - - if (i == containers.length-1) - { - pathClass = "mcePathBottom"; - } - else if (i == 0) - { - pathClass = "mcePathTop"; - } - else - { - deltaHeight-=2; - } - - template['html'] += ''; - deltaHeight -= 22; - } - else //Render normal Container: - { - var curContainer = tinyMCE.getParam("theme_advanced_container_"+containers[i], "", true, ','); - var curContainerHTML = ""; - var curAlign = tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_align", defaultContainerAlign); - var curCSS = tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_class", defaultContainerCSS); - - for (var j=0; j 0) - { - curContainerHTML += "
"; - deltaHeight -= 23; - } - - template['html'] += '
'; - } - } - - template['html'] += '
\ - \ -
' + pathHTML + '
' + curContainerHTML + '
'; - //RowLayout - break; - - case "BorderLayout" : //will be like java.awt.BorderLayout of SUN Java... - // Not implemented yet... - break; - - case "CustomLayout" : //User defined layout callback... - var customLayout = tinyMCE.getParam("theme_advanced_custom_layout",""); - - if (customLayout != "" && eval("typeof(" + customLayout + ")") != "undefined") - { - template = eval(customLayout + "(template);"); - } - break; - - default: - alert('UNDEFINED LAYOUT MANAGER! PLEASE CHECK YOUR TINYMCE CONFIG!'); - //CustomLayout - break; - } - - template['html'] = tinyMCE.replaceVar(template['html'], 'style_select_options', styleSelectHTML); - template['delta_width'] = 0; - template['delta_height'] = deltaHeight; - - return template; -} - -/** - * Insert link template function. - */ -function TinyMCE_advanced_getInsertLinkTemplate() -{ - var template = new Array(); - - template['file'] = 'link.htm'; - template['width'] = 300; - template['height'] = 150; - - // Language specific width and height addons - template['width'] += tinyMCE.getLang('lang_insert_link_delta_width', 0); - template['height'] += tinyMCE.getLang('lang_insert_link_delta_height', 0); - - return template; -}; - -/** - * Insert attachment template function. - */ -function TinyMCE_advanced_getInsertAttachmentTemplate() { - var template = new Array(); - - template['file'] = 'attachment.htm'; - template['width'] = 300; - template['height'] = 150; - - // Language specific width and height addons - template['width'] += tinyMCE.getLang('lang_insert_attachment_delta_width', 0); - template['height'] += tinyMCE.getLang('lang_insert_attachment_delta_height', 0); - - return template; -} - -/** - * Insert image template function. - */ -function TinyMCE_advanced_getInsertImageTemplate() -{ - var template = new Array(); - - template['file'] = 'image.htm?src={$src}'; - template['width'] = 340; - template['height'] = 280; - - // Language specific width and height addons - template['width'] += tinyMCE.getLang('lang_insert_image_delta_width', 0); - template['height'] += tinyMCE.getLang('lang_insert_image_delta_height', 0); - - return template; -}; - -/** - * Node change handler. - */ -function TinyMCE_advanced_handleNodeChange (editor_id, node, undo_index, - undo_levels, visual_aid, any_selection) -{ - function selectByValue(select_elm, value) - { - if (select_elm) - { - for (var i=0; i=0; i--) - { - var nodeName = path[i].nodeName.toLowerCase(); - var nodeData = ""; - - if (nodeName == "b") - { - nodeName = "strong"; - } - - if (nodeName == "i") - { - nodeName = "em"; - } - - if (getAttrib(path[i], 'id') != "") - { - nodeData += "id: " + path[i].getAttribute('id') + " "; - } - - if (getAttrib(path[i], 'class') != "") - { - nodeData += "class: " + path[i].getAttribute('class') + " "; - } - - if (getAttrib(path[i], 'className') != "") - { - nodeData += "class: " + path[i].getAttribute('className') + " "; - } - - if (getAttrib(path[i], 'src') != "") - { - nodeData += "src: " + path[i].getAttribute('src') + " "; - } - - if (getAttrib(path[i], 'href') != "") - { - nodeData += "href: " + path[i].getAttribute('href') + " "; - } - - if (nodeName == "img" && getAttrib(path[i], 'name') == "mce_plugin_flash") - { - nodeName = "flash"; - nodeData = ""; - } - - if (getAttrib(path[i], 'name').indexOf("mce_") != 0) - { - if (getAttrib(path[i], "className") != "") - { - nodeName += "." + getAttrib(path[i], "className"); - } - else if (getAttrib(path[i], "class") != "") - { - nodeName += "." + getAttrib(path[i], "class"); - } - } - - if (tinyMCE.isMSIE) - { - html += '' + nodeName + ''; - } - else - { - html += '' + nodeName + ''; - } - - if (i > 0) - { - html += " » "; - } - } - - pathElm.innerHTML = html + " "; - } - - // Get element color - var colorElm = tinyMCE.getParentElement(node, "font", "color"); - - if (colorElm) - { - TinyMCE_advanced_foreColor = "" + colorElm.color.toUpperCase(); - } - - // Reset old states - tinyMCE.switchClassSticky(editor_id + '_justifyleft', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_justifyright', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_justifycenter', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_justifyfull', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_bold', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_italic', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_underline', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_strikethrough', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_bullist', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_numlist', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_sub', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_sup', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_anchor', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_link', 'mceButtonDisabled', true); - tinyMCE.switchClassSticky(editor_id + '_attachment', 'mceButtonDisabled', true); - tinyMCE.switchClassSticky(editor_id + '_unlink', 'mceButtonDisabled', true); - tinyMCE.switchClassSticky(editor_id + '_outdent', 'mceButtonDisabled', true); - tinyMCE.switchClassSticky(editor_id + '_image', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_hr', 'mceButtonNormal'); - - // Get anchor name - var anchorName = tinyMCE.getParentElement(node, "a", "name"); - - TinyMCE_advanced_anchorName = ""; - - if (anchorName) - { - TinyMCE_advanced_anchorName = anchorName.getAttribute("name"); - tinyMCE.switchClassSticky(editor_id + '_anchor', 'mceButtonSelected'); - } - - // Get link - var anchorLink = tinyMCE.getParentElement(node, "a", "href"); - - if (anchorLink || any_selection) - { - tinyMCE.switchClassSticky(editor_id + '_link', anchorLink ? 'mceButtonSelected' : 'mceButtonNormal', false); - tinyMCE.switchClassSticky(editor_id + '_attachment', anchorLink ? 'mceButtonSelected' : 'mceButtonNormal', false); - tinyMCE.switchClassSticky(editor_id + '_unlink', anchorLink ? 'mceButtonSelected' : 'mceButtonNormal', false); - } - - // Handle visual aid - tinyMCE.switchClassSticky(editor_id + '_visualaid', visual_aid ? 'mceButtonSelected' : 'mceButtonNormal', false); - - if (undo_levels != -1) - { - tinyMCE.switchClassSticky(editor_id + '_undo', 'mceButtonDisabled', true); - tinyMCE.switchClassSticky(editor_id + '_redo', 'mceButtonDisabled', true); - } - - // Within li, blockquote - if (tinyMCE.getParentElement(node, "li,blockquote")) - { - tinyMCE.switchClassSticky(editor_id + '_outdent', 'mceButtonNormal', false); - } - - // Has redo levels - if (undo_index != -1 && (undo_index < undo_levels-1 && undo_levels > 0)) - { - tinyMCE.switchClassSticky(editor_id + '_redo', 'mceButtonNormal', false); - } - - // Has undo levels - if (undo_index != -1 && (undo_index > 0 && undo_levels > 0)) - { - tinyMCE.switchClassSticky(editor_id + '_undo', 'mceButtonNormal', false); - } - - // Select class in select box - var selectElm = document.getElementById(editor_id + "_styleSelect"); - - if (selectElm) - { - TinyMCE_advanced_setupCSSClasses(editor_id); - - classNode = node; - breakOut = false; - var index = 0; - - do - { - if (classNode && classNode.className) - { - for (var i=0; i"); - } - else - { - selectByValue(selectElm, ""); - } - } - - // Select fontselect - var selectElm = document.getElementById(editor_id + "_fontNameSelect"); - - if (selectElm) - { - var elm = tinyMCE.getParentElement(node, "font", "face"); - - if (elm) - { - selectByValue(selectElm, elm.getAttribute("face")); - } - else - { - selectByValue(selectElm, ""); - } - } - - // Select fontsize - var selectElm = document.getElementById(editor_id + "_fontSizeSelect"); - - if (selectElm) - { - var elm = tinyMCE.getParentElement(node, "font", "size"); - - if (elm && getAttrib(elm, "size") != "") - { - selectByValue(selectElm, elm.getAttribute("size")); - } - else - { - selectByValue(selectElm, "0"); - } - } - - // Handle align attributes - alignNode = node; - breakOut = false; - do - { - if (!alignNode.getAttribute || !alignNode.getAttribute('align')) - { - continue; - } - - switch (alignNode.getAttribute('align').toLowerCase()) - { - case "left": - tinyMCE.switchClassSticky(editor_id + '_justifyleft', 'mceButtonSelected'); - breakOut = true; - break; - - case "right": - tinyMCE.switchClassSticky(editor_id + '_justifyright', 'mceButtonSelected'); - breakOut = true; - break; - - case "middle": - case "center": - tinyMCE.switchClassSticky(editor_id + '_justifycenter', 'mceButtonSelected'); - breakOut = true; - break; - - case "justify": - tinyMCE.switchClassSticky(editor_id + '_justifyfull', 'mceButtonSelected'); - breakOut = true; - break; - } - } while (!breakOut && (alignNode = alignNode.parentNode)); - - // Do special text - if (tinyMCE.isGecko && node.nodeType == 3) - { - var inst = tinyMCE.getInstanceById(editor_id); - var doc = inst.getDoc(); - - if (doc.queryCommandState("Bold")) - { - tinyMCE.switchClassSticky(editor_id + '_bold', 'mceButtonSelected'); - } - - if (doc.queryCommandState("Italic")) - { - tinyMCE.switchClassSticky(editor_id + '_italic', 'mceButtonSelected'); - } - - if (doc.queryCommandState("Underline") && - (node.parentNode == null || node.parentNode.nodeName != "A")) - { - tinyMCE.switchClassSticky(editor_id + '_underline', 'mceButtonSelected'); - } - - if (doc.queryCommandState("Strikethrough")) - { - tinyMCE.switchClassSticky(editor_id + '_strikethrough', 'mceButtonSelected'); - } - } - - // Handle elements - do - { - switch (node.nodeName.toLowerCase()) - { - case "b": - case "strong": - tinyMCE.switchClassSticky(editor_id + '_bold', 'mceButtonSelected'); - break; - - case "i": - case "em": - tinyMCE.switchClassSticky(editor_id + '_italic', 'mceButtonSelected'); - break; - - case "u": - tinyMCE.switchClassSticky(editor_id + '_underline', 'mceButtonSelected'); - break; - - case "strike": - tinyMCE.switchClassSticky(editor_id + '_strikethrough', 'mceButtonSelected'); - break; - - case "ul": - tinyMCE.switchClassSticky(editor_id + '_bullist', 'mceButtonSelected'); - break; - - case "ol": - tinyMCE.switchClassSticky(editor_id + '_numlist', 'mceButtonSelected'); - break; - - case "sub": - tinyMCE.switchClassSticky(editor_id + '_sub', 'mceButtonSelected'); - break; - - case "sup": - tinyMCE.switchClassSticky(editor_id + '_sup', 'mceButtonSelected'); - break; - - case "hr": - tinyMCE.switchClassSticky(editor_id + '_hr', 'mceButtonSelected'); - break; - - case "img": - if (getAttrib(node, 'name').indexOf('mce_') != 0) - { - tinyMCE.switchClassSticky(editor_id + '_image', 'mceButtonSelected'); - } - break; - } - } while ((node = node.parentNode)); -}; - -// This function auto imports CSS classes into the class selection droplist -function TinyMCE_advanced_setupCSSClasses(editor_id) -{ - if (!TinyMCE_advanced_autoImportCSSClasses) - { - return; - } - - var selectElm = document.getElementById(editor_id + '_styleSelect'); - - if (selectElm && selectElm.getAttribute('cssImported') != 'true') - { - var csses = tinyMCE.getCSSClasses(editor_id); - if (csses && selectElm) - { - for (var i=0; i 0) - { - selectElm.setAttribute('cssImported', 'true'); - } - } -}; diff --git a/public/tiny_mce/themes/advanced/editor_ui.css b/public/tiny_mce/themes/advanced/editor_ui.css deleted file mode 100644 index fd0bd76..0000000 --- a/public/tiny_mce/themes/advanced/editor_ui.css +++ /dev/null @@ -1,199 +0,0 @@ -.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected { - margin-top: 1px; - margin-left: 1px; -} - -.mceButtonNormal { - border-top: 1px solid; - border-left: 1px solid; - border-bottom: 1px solid; - border-right: 1px solid; - border-color: #F0F0EE; - cursor: arrow; -} - -.mceButtonOver { -/* border-top: 1px solid buttonhighlight; - border-left: 1px solid buttonhighlight; - border-bottom: 1px solid buttonshadow; - border-right: 1px solid buttonshadow;*/ - border: 1px solid #0A246A; - cursor: arrow; - background-color: #B6BDD2; -} - -.mceButtonDown { -/* border-bottom: 1px solid buttonhighlight; - border-right: 1px solid buttonhighlight; - border-top: 1px solid buttonshadow; - border-left: 1px solid buttonshadow;*/ - cursor: arrow; - border: 1px solid #0A246A; - background-color: #8592B5; -} - -.mceButtonSelected { - border: 1px solid; - border-color: #C0C0BB; - cursor: arrow; -} - -.mceButtonDisabled { - filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); - -moz-opacity:0.3; - opacity: 0.3; - border-top: 1px solid; - border-left: 1px solid; - border-bottom: 1px solid; - border-right: 1px solid; - border-color: #F0F0EE; - cursor: arrow; -} - -.mceSeparator { - border-top: 1px solid buttonhighlight; - border-left: 1px solid buttonhighlight; - border-bottom: 1px solid buttonshadow; - border-right: 1px solid buttonshadow; - margin-right: 2px; - margin-left: 2px; -} - -.mceSeparatorLine { - margin:2px; - margin-left: 4px; - background-color: #F0F0EE; - border-top: 1px solid buttonshadow; - border-left: 1px solid buttonshadow; - border-bottom: 1px solid buttonhighlight; - border-right: 1px solid buttonhighlight; - width: 0px; - height: 15px; -} - -.mceSelectList { - font-family: "MS Sans Serif"; - font-size: 7pt; - font-weight: normal; - margin-top: 3px; - padding: 0px; - display: inline; - vertical-align: top; - background-color: #F0F0EE -} - -.mceLabel, .mceLabelDisabled { - font-family: "MS Sans Serif"; - font-size: 9pt; -} - -.mceLabel { - color: #000000; -} - -.mceLabelDisabled { - cursor: text; - color: #999999; -} - -.mceEditor { - background: #F0F0EE; - border: 1px solid #cccccc; -} - -.mceEditorArea { - font-family: "MS Sans Serif"; - background: #FFFFFF; -} - -.mceToolbarTop, .mceToolbarBottom { - background: #F0F0EE; -} - -.mceToolbarTop { - border-bottom: 1px solid #cccccc; -} - -.mceToolbarBottom { - border-top: 1px solid #cccccc; -} - -.mcePathTop, .mcePathBottom, .mcePath { - font-family: "MS Sans Serif"; - font-size: 9pt; - padding: 2px; - height: 20px; -} - -.mcePathTop { - border-bottom: 1px solid #cccccc; -} - -.mcePathBottom { - border-top: 1px solid #cccccc; -} - -.mcePathItem, .mcePathItem:link, .mcePathItem:visited, .mcePathItem:hover { - text-decoration: none; - font-family: "MS Sans Serif"; - font-size: 9pt; - color: #000000; -} - -.mcePathItem:hover { - text-decoration: underline; -} - -.mcePath { - border-bottom: 1px solid #cccccc; -} - -.mceDialog { - position: absolute; - left: 100px; - top: 100px; - z-index: 1000; -} - -.mceDialogHeader { - background: #F0F0EE; - width: 100%; - height: 16px; - margin: 0px; - padding: 0px; - border: 1px solid black; - border-bottom: 0px; -} - -.mceDialogTitle { - float: left; - font-family: "MS Sans Serif"; - font-size: 9pt; - height: 14px; -} - -.mceDialogClose { - float: right; - width: 16px; - height: 16px; - background-image: url('images/close.gif'); - background-repeat: no-repeat; - background-position: 0px 1px; - margin: 0px; - padding: 0px; -} - -.mceDialogClose a { - width: 16px; - height: 14px; - display: block; - font-family: "MS Sans Serif"; - font-size: 9pt; - margin: 0px; - padding: 0px; -} - -.mceDialogIFrameWrapper { - border: 1px solid black; - clear: both; -} diff --git a/public/tiny_mce/themes/advanced/image.htm b/public/tiny_mce/themes/advanced/image.htm deleted file mode 100644 index 61238e3..0000000 --- a/public/tiny_mce/themes/advanced/image.htm +++ /dev/null @@ -1,186 +0,0 @@ - - -{$lang_insert_image_title} - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{$lang_insert_image_title}
{$lang_insert_image_src}: - - - - -
{$lang_insert_image_alt}:
{$lang_insert_image_align}:
{$lang_insert_image_dimensions}: - x -
{$lang_insert_image_border}:
{$lang_insert_image_vspace}:
{$lang_insert_image_hspace}:
-
-
- - diff --git a/public/tiny_mce/themes/advanced/images/anchor.gif b/public/tiny_mce/themes/advanced/images/anchor.gif deleted file mode 100644 index ae7b2f39599479d0f43adc553d39059498a1d4e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 943 zcmZ?wbhEHb6k!lyXlDQc1%m_yiv$CQ0t1f%E6+0LfHME6S_6*;gMbEufC&x(4Gs|v zo)J?#6Q)F`w#MYN1|&>~%bFOFu^=LUaX`U>gn|tT6&n&N4%GE+uA98MpyNQngaeH| z^SUQ4ZlASn>59$ER_|WAcGs-sN9Ha+J9ovQIV;YuTz_)O`itu}A6l{T{Fa^Pw(Poc z;K=#oCr%taaqi@)Ge?eHK78uV*>g88U%GJN(%s8fZ(q57@8+!sAh(X<(GZ|&2q^w! zVP;^kWY7Vb3d$1<96b!h95Nmo794Em5Y~#ZC}3ujG$ z#bA$Pfm2I|3P)Ik!v>Z^ylQMw9tHwOSz5&PHV9-eHXe`?kC5B4fl1l7QIk#KOhTdy zkFPx# diff --git a/public/tiny_mce/themes/advanced/images/attachment.gif b/public/tiny_mce/themes/advanced/images/attachment.gif deleted file mode 100644 index b3d80423f681122c2b701c6ccee25dd21d8d950b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmZ?wbhEHb6krfw*v!xH|NsB6u&^^{&b)c^CM_+^+1dH?=g%uwuADh@=DvOVo<4p0 z;K761+S;zJuA-u%|Ns9h{$ycfVBlxaVPIfj0GYwSlKkPM=jy!`^X95oHGE1vySTx- z($N2sibA%a?rEORWY+VJ))wpu91}zY8yOkh8FWMfm^prO=ZA%I|HcV(pSTLht!HR$l8v+g-2sm({;K74}2QLafd?;v`uwlW1hK3mjX3jh_ zVZng~8!l`(vEjmvh65)STsX1d!-IzZA2yshbLPN>2L~>E`0(Sv`}gnv|Njqi!6+UL zfdL8u#h)z93=G-~Iw1Q&d4hqXhasFp#$&^RgUuYmS}`X!Japm_P~__9a8z{V5mx59 zGvT45BPSD!#{r3=CtbXJHU$X|ADUcxBpl*iEI8!S#Ky+q$6;x>m_a}*XwHcVlNb2U z5aL@PaBHE4BPTNl#{z**4IIn-IODbiJaq09_7x1;Bhcu=!RjJCP1VrJnW0@kLB}EB Qz{0z`D?Y37a4=W{0Q~)XMgRZ+ diff --git a/public/tiny_mce/themes/advanced/images/bold.gif b/public/tiny_mce/themes/advanced/images/bold.gif deleted file mode 100644 index 31f004b24f5c83aff0497eb04204fa970c9ea2e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 864 zcmZ?wbhEHb6k!lyXlED&qaiS&LqPE-3o`=)BZCeo6hL``fy0)8nM1~7!-9j&9Ku>L zCpIi}W)M(z%8>|6INB<%uXV;kaPg5oImQTew2!5RRUlNxRS diff --git a/public/tiny_mce/themes/advanced/images/bold_fr.gif b/public/tiny_mce/themes/advanced/images/bold_fr.gif deleted file mode 100644 index 7782282838436ab0e31947ec16760295fa0bd6c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78 zcmZ?wbhEHb6k!lyXkcJCaNqy~1B2pE7DfgJ1_m7v0g`cGQf=v9DUr)NeU7kI)taL* e$I2@eKa@V}T(&$+FZX+9#Lup+UC%uj8LR;ni5X4+ diff --git a/public/tiny_mce/themes/advanced/images/bold_ru.gif b/public/tiny_mce/themes/advanced/images/bold_ru.gif deleted file mode 100644 index c9e89b27e548815114e78462553c6e0016aeddc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77 zcmZ?wbhEHb6k!lyXkcXU_4U1dk&B|a605voi?f?J) diff --git a/public/tiny_mce/themes/advanced/images/browse.gif b/public/tiny_mce/themes/advanced/images/browse.gif deleted file mode 100644 index 590f2de43f0db8d6ff7d0be42228f9266b29da8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113 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 aBnM1~7!-9j&9Ku>L uCpIWFv}so=tE$;n5v@(<=#UXg8k zAUpNFdCUF4)=M$HS7LjwxXpSS*ZLrI%KO;WZ-bWo%AInve(tsG+3(AizpGgCv}EI( zhSoEU)6aHIyD_!<duD177meC z|FR7qCZ=!-NEyfdahS2RtxKD=c+LccCky)c9QlqlC_GZ&=W$PQQYf6z#VNq9E#Od8 z;N8XU!=<%Q;1Jg#P2K>J7Q=;|PBKz+czQM^x;Tl4ZgGh)3~*!9apscAdFXJEk)PQz iCP5+Lz(FBSJ{ALm3rtKb+;%21K07u%Y++<%um%A0E7-39 diff --git a/public/tiny_mce/themes/advanced/images/cleanup.gif b/public/tiny_mce/themes/advanced/images/cleanup.gif deleted file mode 100644 index 87b8f87a2f4445bb1ffff657c5b6d5c9b947df24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 977 zcmZ?wbhEHb6k!lyXlDQc2MdJ&2LlI>0EYk&@bXIc^2!K^NJx(lFUSZ;NJywDO)e-X zaIlz=kkC+&(NIv)P>``9A>qP=3WtV*gocWS4HFC&%t%-;q2Ry@hYLFr9$YABXlQ8Y zm@v6>;)IS33ug2!oY}u<*2D!f7HnTTZO^883l=Qcuwuj34U0Bx*syua=51THZQHtI zLdSs#6AnzBdT7Fo0~01(m@whNfej4@b~GH`JmbW!NeA}sxo}{@p%BAZ!9z3}5;Qx;U|NkF&@ZiCR7au@@ zGKxn=2q^w!VP;^6VbB427nCO$IMy-jen&`6M5=ijs*!LcxiCRo~ePoI%Ns?X1jvQYSaEbWd6}t0XY&-1PJ`Gcyx|H2^8t B^g93m diff --git a/public/tiny_mce/themes/advanced/images/close.gif b/public/tiny_mce/themes/advanced/images/close.gif deleted file mode 100644 index 78883bd7f809b7dd3ca2108a9b4e76ce23e4263e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110 zcmZ?wbhEHb6kyM1s^ZFdJL!x?`wv zO7q}iiztcK8S~0K6$6E&pU!>3Q5XDcQxW@o)97oFProfRDjen zFdJv=y7SNAl;`TbJ2^HD46k~V8Me43pPwxaiC$rgN79!8a6zbu;Rgl4Id_K z_&;IChXpGREZA^h!G;SPc3fDng@RgCoY^md*R~cn+HxjIB?;?$tzC}T=;O{#{Ua99$dKb;lhIt4_+2q^w!VP;^kXV3we0m>5$96K25Ib=LGEI8QAA*>a1VnRZf zh>AxG1LNXEE_sRCnuHHcik&@nIy*crBqegln?^iXvB9aeOHkVEjKvSesZU8 z{pLWTvs(|hoqxI~v$Kj?3FbNNfmj W3}a^F5Rgz9^b4AuaFnaTYC diff --git a/public/tiny_mce/themes/advanced/images/custom_1.gif b/public/tiny_mce/themes/advanced/images/custom_1.gif deleted file mode 100644 index 5e385c05490f8d66a4f9c271f0e5af0f6c86b488..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 854 zcmZ?wbhEHb6k!lyXlDR{1_p+P1`uNukA}cV3jxKSEX)iH%nUjpkAw0A1BWpKJBN(N zh6M+kIfS)hPHb3sxLrWmOGd%rz~L@2#iX8yz~p0$jCw*mmJ^q_OcoAa6(T9XU=08X CQ5Nn1 diff --git a/public/tiny_mce/themes/advanced/images/cut.gif b/public/tiny_mce/themes/advanced/images/cut.gif deleted file mode 100644 index 6a969e55bd55d5e878a7ea7c7389f24df84bc924..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmZ?wbhEHb6k!lyxN60a)wD6TV(o-!3(lN6eC5K41*`V%+Ix86($$-{Y-RM>$mqCC zBW^vT({i)44Y4&F8NJr8T(f@Cf?WamtJiKh5L>nW@S*+F=C7CYoK@B^fzfSsYEkEg z?T70+=PX&ZHNB*RF>;?q;G)uoi5jU}Iw#Ic%x_@~-^1v#a{AomlV-1Bv|F5z*D`8Iv8#2$;{X5uGoS*+ zpDc_F3|0&}AYqW77}%N}<`#J9NcEpkVF_}PndIb>kh%*Xi@|me}vhvFt^98V}F$kGh z@h}SUvw5;|u`nuGDKM~cv3d$ia`P})F=%pg3VX7M@G?3x@`|vu9y@;Gq$7hh0B~!E AHvj+t diff --git a/public/tiny_mce/themes/advanced/images/forecolor.gif b/public/tiny_mce/themes/advanced/images/forecolor.gif deleted file mode 100644 index db21e1cbee4f70329d1b62fb7f88a8df8e14c85d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmZ?wbhEHb6k!lyc*Xz%|NsAIU`SvP*ubE%fx%*fLd1rI2^%J?*f3$o28IHVj6w&4 z!32hY9Sj9G6cRQFOt|5Yu!7;khXwE7uXz7{^ZR!v-@iNa;l+gaFJ^ssck#oE1@B)h ze*a?0`xh%dyxQ^Z)$tDx3f?~``|zOQ&65ouZX~?Fk^bSqgm(|;zkRgw)squ%U!47L zA>hM}g8v^jyt=pU;wGyH2R$Af2zYQP;=_f6_ZKrh+-Uf4v+cvhjQ5x8-ap>`=F#B~ zI}{#lP&hC{;lc`o4+k6`?DG6@BH+LRhxaEVu5L?yc%4gujY~0YH@L-4k?fs?i zFSb2BJMrG>IU5=T4o=a!xY+9YhL{^$)30wYxW21;LxaNRHtkCb%(ix$J=h%aCKSTHMQy#*Oe8Wp(iYB z>7>wMHa#UZWy#X0Xzh00MXBkTdYtSWJ_)|DZMq_QX&LDf?5s>mZsFE#P8u_$B_!CG zSrpYgz1vhAHD#`=D=RAMs>KJjYuVX5sHzI`38}io1$XNEJE`(Z>1Y@}=A7oDxCA7fl6W=-rCyq-6Sqc1^HIvA)6)&qS(zBD0U9p} AqW}N^ diff --git a/public/tiny_mce/themes/advanced/images/full.gif b/public/tiny_mce/themes/advanced/images/full.gif deleted file mode 100644 index 5a78c630675cbb1f7027a11cbbb19a6090daba26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 856 zcmZ?wbhEHb6k!lyXlED&qaiS&LqPE-3o`=)BZCeo6hL``fy0!6nM1~7!-9j&9Ku>L wCpIWFvS<$*F5=IYCbgBlgia8mS;J{!F0C7th00000 diff --git a/public/tiny_mce/themes/advanced/images/help.gif b/public/tiny_mce/themes/advanced/images/help.gif deleted file mode 100644 index a5d67714bc9becca85232849b8b3cf24bddba494..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1027 zcmZ?wbhEHb6k!lyXlDQc0gnv=0UOLCyDXx66e2bV1RM|uxF8U5K_TFPLc{@uhzAM@ z9~3e^C}jLM$oOwi@ZUdYYGCH{fYMpcMGFHe4mcG2cc}Q_Q1L&mWqx_@tg4CAvs+ge zPh49+b5+@tODH|I>R9CUjg#o^m8(?#05{ zN6ThjEt_*8VZw)m3I7Wwd?=XlpOxW;$*{-vTc3oVs`|6^-Hx}%8uw?gx z1v@@0*zteOv72j;-P&{L(7t0QHXpsT;K2V4Cmw7#@L|J=4;xPWKXmTOu}inE-MVq$ z#Dg<89-O=N_`rn^2QK_SaO1;+7atyc`0(Jv{|_MW|HF^}|Ns97h21C~;vt~;lZBaq zA(KG|7tt*41l}eqn*7@Uo**TKs3s zVN_;eDDAj7~W!?n&lp*I;jCQQWN3!o;dL pt>b3{^TTN}nyaQL kCpIiR+%BN(HRpst!_jUDW2OZsHZDHiui#w7!@*z;0CG_jN&o-= diff --git a/public/tiny_mce/themes/advanced/images/image.gif b/public/tiny_mce/themes/advanced/images/image.gif deleted file mode 100644 index 36109de73c7e54428c194da374db4f19fec7f61a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194 zcmZ?wbhEHb6k!ly*v!Q+$3pADg9paO#xrNmR83}>b53;5xi1Ve8PaAl{09RDRG|2i zg^_`Qi$Mn@3^Id(B|qS#=jy#bmYv#4Q?pI*p?bZf4}wuZF{77A-PoE+3|-pFfbP)NAju!pljG~x9eYlg<-JldC77_7r5 f{>fl-My`~!@aq@JM znjA778x|aF<`CA3u@GQ5+|J49QDU)ikxK`+q{f5`7akpH5*AX(5NK>V-p?$q;}PKC rz|bSW#-i}xz!KLMb{?A-5rWD`=Bexd>iH4);=*FJiCVD|0u0sw4x~l% diff --git a/public/tiny_mce/themes/advanced/images/italic.gif b/public/tiny_mce/themes/advanced/images/italic.gif deleted file mode 100644 index ec03278f34d453eb73b8acdffce48bc15af1dbed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 860 zcmZ?wbhEHb6k!lyXlDR{>gwv2mKG3e6px0$2nzwlpDfG_49pBVAb*4M1Ota913QO| z$A$$5n>mEFVoq#W=-kAhJ>kH2`FC8g2jp diff --git a/public/tiny_mce/themes/advanced/images/italic_de_se.gif b/public/tiny_mce/themes/advanced/images/italic_de_se.gif deleted file mode 100644 index 6ce0d8d46698477efa2d1d5197559ecab7fe7e0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmZ?wbhEHb6k!lyn8*ME|NsAIU|{(F|G(l-7DfgJW(FOQC`g`xNoh|1%F}Q8XV17C g5aE6-%*D6z{@2E5H+mnbL wCpIWFvpyBZ3(cKF-9?V<3rgqY@;KZ5_@87K3dCt-&=hpQLZ(cqB z_Vsf{S?~Qj*OzQPw(ro%o&{SUy!i0)`I8Sn{%boV9k}sf_R6DY&Yb!G|G#@k!GawZ zo;|t$?#;^$2OeCw@nOP(1Km?s+`D$|`}_CVt@93?crb6xuJ7N!Z`g6+!h`=o$;F$t z?iSDp*m2-^@1kwdSuGDf{LiiITd?86r1`5GW^8Z?%sP4D+SDb7jvT+RWb?(s>i%Wx zwz);;UwH6g<@U>ymhSlQ|NpENTQ6U`KYPQG4JRH~#%{P0cN>ZS5VMUEMvsef`aj?qa&CZj7Gn zVge32ZH~4!62i_b-U}Bm)oNuI6yRWWk}{OFFwt}|v}`q#5D|Bku-DfRH4qmNR&0X1HvvY{w_B*J`S(E~jG5Y9w&)0V{KxxdN-ChZQ6LYe}9L6TW@_@$=X3u0{rH E042uB(f|Me diff --git a/public/tiny_mce/themes/advanced/images/newdocument.gif b/public/tiny_mce/themes/advanced/images/newdocument.gif deleted file mode 100644 index 79a93da5cc9e3e9d82c582c9e89b22f95b250b2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmZ?wbhEHb6k!lyIKlt||NsC0|KtCK3lAPV`0(Mw{{<@!Y}j$(z=;PJZhSa&>dv84 zw-;=Sg_&1h65K4TzGKd!G{AUE?l_r;K7RzAAbA? z8S(!=$Xqa1{K>+|z#zk*1LA?~WMEBJQ1460oR_g`neXi&_Qh*_6Yd||yy8l&^YnJ* z(hoOP`ct%$Y?Oj~mZg1m@$G5yT~=izVJgXVo#msiac80DBkdN$ETP+Gsw!F^FWSuB c$Rkjxlq1yA+QP5t;o04z-Pb>1q9TJe0EQ4S}H<0*XIbm>C$v7<53+ z2jvL{jxYvY4jGRP3l27O2y4Zh*pR@=%FC_iVIa_Ov|F4v$Us2xkpl}eONC5kL1Pn} wimr!-g1}<$W??=Dg_#Ww4O1*cH7q6sH8xMvGnPtGC`viYZZWxvhl9Zy03g>wx&QzG diff --git a/public/tiny_mce/themes/advanced/images/outdent.gif b/public/tiny_mce/themes/advanced/images/outdent.gif deleted file mode 100644 index 53e89a77f471fe02d405d9fa6c0f4f48e67ffffd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 887 zcmZ?wbhEHb6k!lyXlDQcgMbMR5fg%PCOIT5a7fq?P;nuk;X**egMf|)Wql_TIzDtw z+uJq&*p$tWr)+$4>fH5fH|}4%c^{;66px0$5Dx*xpDfG_48jaLAb)`J1OrD1gF1(d z$A$$5n>mEFVk`t04!3hMdX!jfT;$ThFRLMtu`%f&J2#)lgBu?o9bn<$5fKnzNNQnY lVRBG-X{gxDXri9f@?ztXlXE$$tysLKBwt+2&CJAL4FIt^Ko$T1 diff --git a/public/tiny_mce/themes/advanced/images/paste.gif b/public/tiny_mce/themes/advanced/images/paste.gif deleted file mode 100644 index a676604cf68baab73af5ce50cc4a6934c447bd4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1022 zcmZ?wbhEHb6k!lyXlDQc2LlBM3xfa$0|y5O2af=UfP{dEf&>qTgaC(x2!{d?3Mj~M zC`bq>$Os5XXb8w?NGO<)P%)vPVL?NJ!Gr>ZhJt{Gf`qpE>;(-96B-gGbR*-O!NFz@VXc@OOFabTd3H0*1`b{4zQl6qpVk zlnb6`urP3uCZ}KktIU&!DW1LJnk7#T6gD4X;S8R6rr@BGE1zD>wv3ZPj7s!D>^kLG&&r0aFjNAw#cB+Id__N7@vfOL&E}gNv)tc5{{1C_Y|x;UR)4tNN5)g vSm-T;txzw)c^}?*ke>1ay4J z>3x_q`EAD3_X!g|6wLTgu<&j9lJ^A*K1^SIwr$D#p7rl~*T3uC@NV|b_Y-z}Shf4^ z%Dwj%?R~do_xqK5->uyDe#gO!yN_O5dG!67qi;4JdcXD9i|t3>Z$I&D)2X*RPCnUn z;>DrUj}DxEcHrET3L;+cY1{0ACWj8Jnb)O#z9gmN)vhu3bNPKjDz|vx3AyUzx$jBt1RCcAK zA>e2$Ba^p`!h=Q^4i-~=3keHmCQboqE`^ebjf@9H70q-68VuOknVHpH90D918d?-| lPRy{_z{<{*!XEbEfYRCnd{R|AL=Qbac4v2mG#d+pH2?@Ss`mf@ diff --git a/public/tiny_mce/themes/advanced/images/removeformat.gif b/public/tiny_mce/themes/advanced/images/removeformat.gif deleted file mode 100644 index 38a9cdf96cb4944d10424a942f4df38ca73c8608..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340 zcmZ?wbhEHb6k!lyxXJ(m|NsC0|KtCK3lAPV`0(Mw|J(PT-MsT8AfX|lU_wE|f`$nj z+NN%vu;9Rg4Hq^XcyR09vzvFH-njGl`t3)Tuiq=^*w8TJz=RbSZry!!_x>XTkA#8= z8xkre6m%?Tn6V+DprK*Hf(086Y&dY?z=a17UVQlQnM1~7!-9j&9Ku>L uCpIWFvaOo5kkGsR6pzPYmZ>z@A8Mwr4f?DvZn3YBf4AuY|n-yCC diff --git a/public/tiny_mce/themes/advanced/images/spacer.gif b/public/tiny_mce/themes/advanced/images/spacer.gif deleted file mode 100644 index fc2560981ee1caca400e225e48d282106f907f2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43 wcmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE7Df>U1_m7l1_lO@3L zCpIiR+|J6#!Qv43$fb*2mu-W_#Ki}@gq^eg?D)9oc)w`yDi+UxWcP`ZhU;Wb2rW80 O+oJf@ok{}*25SImD8!GVB^3jqxey8AmP^!H4h&^LeHoQ3n}E?h8g;i9>V7tUY4eCe7MD>trP zw_*L7%^Nmu-ne1w#!YRr53bvGeD&^YTMyp_SviVFLtt=(fZ|UUW(Ec|1|5)dKzV|J zBay+EL&jsnf`iQ*!dfvWHY_~c&LXbzK*8WhBLk1Qh{1(}&WsEqQfUSa2@DNf{OU78 zJ_sCfXHb`}Q(#~?%sN9+)kUB&fPsORN%w$=$00@+VO6;v3$BHX&5HvTd(E9?puk`a E0Qw7Ay8r+H diff --git a/public/tiny_mce/themes/advanced/images/sup.gif b/public/tiny_mce/themes/advanced/images/sup.gif deleted file mode 100644 index 03f8efc63d3a1adce2f67375a6c66dfc1c930809..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 906 zcmZ?wbhEHb6k!lyXlDQc0RaI82?YZK0|N^K2M31$j{p#e2uMgsNKHvDC@3%pXmE&F z;E=GuA!9>8!GVB^3jqxey8AmP^!H4h&^LeHoQ3n}E?h8g;i9>V7tUY4eCe7MD>trP zw_*L7%^Nmu-ne1w#!YRr53bvGeD&^YTMyrT@$BKN7f(PIkK)k~80ZjC{K>-1z@WjP z19Au`PcU$#GX!$Tcx+g3u$e<~^>`-82Z&c)CabR4? z$lM~$CGq0HLIwsdUSkOd0|p0HVLtUMAq7n8&H{RjH@>X=z|6=Xp~um>Gk}4Cmr0jn RugBI^S64^qv#~H(0{}0pU)lfw diff --git a/public/tiny_mce/themes/advanced/images/table.gif b/public/tiny_mce/themes/advanced/images/table.gif deleted file mode 100644 index f8a00544a9980d38c44d5fe8e9a8457be8339834..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1018 zcmZ?wbhEHb6k!lyXlDQc0RaI6kA#4T0Ed8rf`Wp8goX(g1{(?zE>t9Jm=LgGM!<#z z0UK5%T<9n`u%Y0=gn|nP5+0l=cyOVhp`)Q;!h#74HY`}MV8V(64GTUrtoSft#fJ$y z{x4W@V8Mn13w9h>u;Idj9TzriIIv;Ig#|l4Y&dXX!GZr9PW<0+;lqIq4F`5iIIw)d z@x$A19Nc;1#J&#?CLB0$;lPOt7fu|wcJb(qOUExyRd;}fkB~?d$YKp7)wH+!4r?kh7u31XdX)FQ1U1i;Z!n7XOI--X>y2i zdC4j&T=H#4;(-P1vgU_=?FevjY>+Z{6EL{Z_^MZlm5t$r;*)lEMmEEM-o_~%eYzc+i=hr~S3`1SM0@87@v{Qmv_|9_AR zM)7C}3{VIt{$ychV9;jJ0of1A6AT=64B;Fy9vc=MY~~QwiaD`CflX8^z~jS(MrVc& zRVJA|0);FsU6OjUI2K+^Xc19yuz9dyp;LpflHC*?iGvLd418u8GXxGeG|uLhPT8;^ zLCu*(Ohd(BmjGikEBg#Bmjw+67*=u${@`f{RcvTu+ux+BQTB$5A>%BU&gyNthZ`8I E0Xkxe=>Px# diff --git a/public/tiny_mce/themes/advanced/images/table_delete_row.gif b/public/tiny_mce/themes/advanced/images/table_delete_row.gif deleted file mode 100644 index 1997065fb2b447f498ab7fda4b7e21dcbb25dc81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 942 zcmZ?wbhEHb6k!lyXlDQc1CIoUh=PEGhJcKQgo1{IiU|b`3j#VmBuw~FFylkPf)5Q7 z7Bo!QFk!}m2{SfKSg@gC#fJ$SK1|s0VZn+63pO0su;ajj9Um4P_^{!`hYctGAGq-U zz>WVG9{hjs;{SsW|37^A|KZ2~|3Ci!|NkFk*(e?jfx#34ia%MH85mR;bU=;*d8IKJM4mNWLYsH+Huz;0YR4HfyL*v7aZV6|T4KoCfw6n`NSA2Q!kinTlL(!(- zK|`ZA8>eg4ivx+yY&=3r2Shj)Jn-R@GKe{`lfjXZ!DFJ(lZHg67FI4Hg&9@}3I0ut vo3id|DJUN6R&)x9=?H8&!EY_v#QX7KGdnZS_B2t41q<))u8?G7VXy`O>|lPv diff --git a/public/tiny_mce/themes/advanced/images/table_insert_col_after.gif b/public/tiny_mce/themes/advanced/images/table_insert_col_after.gif deleted file mode 100644 index c30dafab6f054142f20191d12041c9fc68731380..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 936 zcmZ?wbhEHb6k!lyXlDQc1CNA&goc2OhJ=EKgo+6T6%!mP9uzc82U@(P%;!hT41_l)d9gw3yd4hqX zmBEuk#$&^RgUuYmaw-Lm2OAlkVC^8=DV3sU6vEhM|n-H&6&V&bokD2+Uz1?a) zEMR0}lILXVh%8X^ZDc6Acck)yBQrBIlSxK^L&K>i0jHV|0tzoLEoM<~Vfd)n5V9(O o-A`hn2?Oi8P|-S3K_!P)!IaHhTMU}A8F+F}znk;hP=Uc309ucE`2YX_ diff --git a/public/tiny_mce/themes/advanced/images/table_insert_col_before.gif b/public/tiny_mce/themes/advanced/images/table_insert_col_before.gif deleted file mode 100644 index 5d1ff37afea7bb2e67952400e00184aa275d6764..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 935 zcmZ?wbhEHb6k!lyXlDQc1CNA&goc2OhJ=EKgo+6T6%!mP9uzc82U@(P%;!hT41_l)d9gw3yd4hqX zg~5|U#$&^RgUuYgLOT{baA;`ZGIjCzAfV*PCS#U@(P%;!hT41_l)d9gw3yd4hqX zmcf%l#$&^RgUuYgQ40(bnON94x%*~FD7iFuu()?{Fg|K#>|xff`|%)=!K0BeXqAm8 zlQV0ZfZn`07K;}7Opvmy(>M^M;>oBJx-Mnrhl9;*JRAZCI2;}@^UGRf><|!a2xZ{4 f$T=b4$QaznVdN1p;Q@m;lM}N*?CEK#4h+@+J92bd diff --git a/public/tiny_mce/themes/advanced/images/table_insert_row_before.gif b/public/tiny_mce/themes/advanced/images/table_insert_row_before.gif deleted file mode 100644 index c3271e54937cb8dbfb435ee8bc2d02157cff1448..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 928 zcmZ?wbhEHb6k!lyXlDQc1CNA&goc2OhJ=EKgo+6T6%!mP9uzc82U@(P%;!hT41_l)d9gw3yd4hqX zmcf%l#$&^RgUuYmS}_?P4mPv#a0ou>@?09c2d^|UtO#WO5Oexlf&+s!0Gyq90{{R3 diff --git a/public/tiny_mce/themes/advanced/images/underline.gif b/public/tiny_mce/themes/advanced/images/underline.gif deleted file mode 100644 index d6b8afdabd9b6a8eae84df6c7427d2dc3eba592d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 872 zcmZ?wbhEHb6k!lyXlDR{>gs9`HHt?=VC02>;!hT41_mYu9gx>Sd4hq%m4TH*#$&^R zgUuYmS}`X+C^WP)usHPW`0&u7o5#>=NyNm(Zmm-GYCI|g!J8~K S$0K;z+1VDwuS5g{7_0&GMjopG diff --git a/public/tiny_mce/themes/advanced/images/underline_fr.gif b/public/tiny_mce/themes/advanced/images/underline_fr.gif deleted file mode 100644 index a8e3018a1850251df4ecdf4dc805d4b561ec5f79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125 zcmZ?wbhEHb6k!ly*v!CCU0r?PzySuLf#OdVMg|5(1|5(NkQojvS_UUPSMOEoKE0d& o*0x%O6%#Y22R^<&D@9{@NpAJ(DZ8KN?pt;3oV$*csvv_k063u?^8f$< diff --git a/public/tiny_mce/themes/advanced/images/underline_ru.gif b/public/tiny_mce/themes/advanced/images/underline_ru.gif deleted file mode 100644 index 2a517e8b6bde52f82ebedaace15e43d4c39197f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77 zcmZ?wbhEHb6k!lyXkcXU_4U1d#u+G?QQ1HMZVSz)!28WCdp>^9bD_1#W z9B?Q&;81WOuI^|+#f6Bv3l0?zyy_mrHSG;(co5n4AfVwxK*xuK2@f)+zE7C&p? zf*BtQ7JTSmb$RC6a}6s#^lo@RVa12p+uzUH@pi(7539DGS+@Pgk{vg;?mM$!_nRfV z-!I?)Zu$QAEBC$MbL{%wqqo-|c)0TD`*p|PZ8`F2^P%^fkG z4q>gB69I|>;`&8@G9;F?atbNA?Ab7}pyhzHnu&!+KmrrD42ScD3yDh3%xoeeG6xKp z72EmbOcWd#oE|iAstTm-*l_SLlLWIQgKNaW1Fd|LH7Z*-FfC+Z=i%VsP?*5Z%wwv- n6{48f9MQ;cuteZCGiw`1dU8TT!J{=j{MP4Q-Cb?2z+epkphmC? diff --git a/public/tiny_mce/themes/advanced/images/unlink.gif b/public/tiny_mce/themes/advanced/images/unlink.gif deleted file mode 100644 index dd073a2b44b45fdf49418179a831ade69f68be26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 561 zcmZ?wbhEHb6k!ly_{PAX?U3~3(cLp=&eTp?_Tl}TC0mbqrnfpIG~Bv=;mxb(-@bm{ zaN@zd#cR^*7T>>f{lbk0FP}g8@Z*1AO8JBZ2V4TPjvT)boz>E_VC#h&A2w~>{r~^} zcW+)kdvgEYwQCPveE9zU{iUl{4&3-KZ_Td4>V5-{f`ozz0R(%RPE z#>C#y#BSW%q|n{d+uuEDN=x_bnRD9>?d^<|R44L^J7~8V+E_~os`VS|uIFZ!Y*m*N z*AePxRMQg?GSOFVb(CUYYG)Ex)M;hq7q>N1QJH9Kz$z@(YHp-1p{cS-?TMKcPn)Qg mmFa$VwhtC>=KW~yn=`MEar$Hp*%OSK49jXbgw=Rh7_0&Ay|)_x diff --git a/public/tiny_mce/themes/advanced/images/visualaid.gif b/public/tiny_mce/themes/advanced/images/visualaid.gif deleted file mode 100644 index 188b3487adccadc6bb87790ababd89c3f77ac906..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1006 zcmZ?wbhEHb6k!lyXlDQc1CNA&j0pi53jzujBvdR&Xjo9tu%V!1L&1a%4HGsr%-GN{ zv;lhUlCmtNQ@Zi9O4+n01xNzgag&Q9(Jox|M#)Ahh{y+He|HFs>AAbD* z|NlS89iwq^;})Y>JY!6d-)apFObNos-1Vs1JdWMSu%GD+Cr;K;2%e{pu1kcp4d6J9(X1#Zn(O9OV?^4rzH%@IbR|g|1%Bm6Mm%1DIL41Q@at zb506y1}u0Hu;2&>M}qd2n2#GW+j&{vJyNx3OgTT_@v@MDfdj)0PF2wbUlI - -{$lang_insert_link_title} - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{$lang_insert_link_title}
{$lang_insert_link_url}: - - - - -
{$lang_insert_link_target}:
{$lang_theme_insert_link_titlefield}:
{$lang_class}: -   
-
-
- - diff --git a/public/tiny_mce/themes/advanced/source_editor.htm b/public/tiny_mce/themes/advanced/source_editor.htm deleted file mode 100644 index 235470b..0000000 --- a/public/tiny_mce/themes/advanced/source_editor.htm +++ /dev/null @@ -1,86 +0,0 @@ - - -{$lang_theme_code_title} - - - - - -
- - - - - - - - - - - -
{$lang_theme_code_title}
- -
-
- - diff --git a/public/tiny_mce/themes/default/docs/en/about.htm b/public/tiny_mce/themes/default/docs/en/about.htm deleted file mode 100644 index 984a990..0000000 --- a/public/tiny_mce/themes/default/docs/en/about.htm +++ /dev/null @@ -1,32 +0,0 @@ - - - -About TinyMCE - - - - - - - - - - - -
-
-TinyMCE is a small WYSIWYG editor control for web browsers such as MSIE or Mozilla -that enables you to edit HTML contents in a more user friendly way. It has common -features that are found in most word processors and should not be difficult to -use.
-
-
- - - - - - -
- - diff --git a/public/tiny_mce/themes/default/docs/en/common_buttons.htm b/public/tiny_mce/themes/default/docs/en/common_buttons.htm deleted file mode 100644 index d01f751..0000000 --- a/public/tiny_mce/themes/default/docs/en/common_buttons.htm +++ /dev/null @@ -1,111 +0,0 @@ - - - -Common buttons - - - - - - - - - - - -
-
-Below is a short description about each button. -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Bold text style.
Italic text style.
Underline text style.
Strikethrough text style.
Align left.
Align center.
Align right.
Align full.
Unordered list/bullet list.
Ordered list/numbered list
Outdent/decrease indentation.
Indent/incread indentation.
Undo the last operation.
Redo the last operation.
Insert a new link, read more about this function in the Insert - link section.
Unlinks the current selection/removes all selected links.
Insert a new image, read more about this function in the Insert - image section.
Cleanup code/Removes unwanted formating. This function is useful when - you copy contents from for example a office product.
Shows this help window.
-
-
- - - - - - - - diff --git a/public/tiny_mce/themes/default/docs/en/images/insert_image_window.gif b/public/tiny_mce/themes/default/docs/en/images/insert_image_window.gif deleted file mode 100644 index 37de4431800090424b23904e4532e70474902bef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5680 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 diff --git a/public/tiny_mce/themes/default/docs/en/images/insert_link_window.gif b/public/tiny_mce/themes/default/docs/en/images/insert_link_window.gif deleted file mode 100644 index 7bad7583ab9a0642467d271ec8a102e87a2ec521..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5658 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 L|DH24GFSru|E)YN diff --git a/public/tiny_mce/themes/default/docs/en/index.htm b/public/tiny_mce/themes/default/docs/en/index.htm deleted file mode 100644 index dd547c2..0000000 --- a/public/tiny_mce/themes/default/docs/en/index.htm +++ /dev/null @@ -1,25 +0,0 @@ - - - -Help Index - - - - - - - - - -
-
-Click the links below to go to the different help sections. - -
- - diff --git a/public/tiny_mce/themes/default/docs/en/insert_image_button.htm b/public/tiny_mce/themes/default/docs/en/insert_image_button.htm deleted file mode 100644 index 45255f0..0000000 --- a/public/tiny_mce/themes/default/docs/en/insert_image_button.htm +++ /dev/null @@ -1,34 +0,0 @@ - - - -Insert image button - - - - - - - - - - - -
-
-The insert image button opens the window shown below.
-
-
-
-You simply enter a URL to the image you want to link to and enter a image description, -this is then displayed as an alternative text descripton of the image on the page.
-
-
- - - - - - -
- - diff --git a/public/tiny_mce/themes/default/docs/en/insert_link_button.htm b/public/tiny_mce/themes/default/docs/en/insert_link_button.htm deleted file mode 100644 index ddfeb3a..0000000 --- a/public/tiny_mce/themes/default/docs/en/insert_link_button.htm +++ /dev/null @@ -1,34 +0,0 @@ - - - -Insert link button - - - - - - - - - - - -
-
-This button opens a new window with the insert/edit link function.
-
-
-
-There are two fields in this window the first one "Link URL" is the -URL of the link. The target enables you to select how the link is to be opened.
-
-
- - - - - - -
- - diff --git a/public/tiny_mce/themes/default/docs/en/style.css b/public/tiny_mce/themes/default/docs/en/style.css deleted file mode 100644 index 722f537..0000000 --- a/public/tiny_mce/themes/default/docs/en/style.css +++ /dev/null @@ -1,28 +0,0 @@ -body { background-color: #FFFFFF; } -body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; } -.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; } -.subtitle { font-size: 12px; font-weight: bold; } - -.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; } -.step_ol, .step_li { margin-left: 11 px; line-height: 16px; } -img { border: #000000 solid 1px; } - -a:visited { color: #666666; text-decoration: underline; } -a:active { color: #666666; text-decoration: underline; } -a:hover { color: #666666; text-decoration: underline; } -a { color: #666666; text-decoration: underline; } - -.pageheader { border: #E0E0E0 solid 1px; } -.pagefooter { border: #E0E0E0 solid 1px; } -.sample { background-color: #FFFFFF; border: #000000 solid 1px; } -.samplecontent { font-size: 10px; } - -.code { background-color: #FFFFFF; border: #000000 solid 1px; } -.codecontent { font-size: 10px; } -.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold } -.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold } -.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold } -.codecontent a { color: #666666; text-decoration: none; font-weight: bold } - -hr { height: 1px; } - diff --git a/public/tiny_mce/themes/default/editor_content.css b/public/tiny_mce/themes/default/editor_content.css deleted file mode 100644 index 75290ee..0000000 --- a/public/tiny_mce/themes/default/editor_content.css +++ /dev/null @@ -1,27 +0,0 @@ -body { - background-color: #FFFFFF; - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 10px; - scrollbar-3dlight-color: #F0F0EE; - scrollbar-arrow-color: #676662; - scrollbar-base-color: #F0F0EE; - scrollbar-darkshadow-color: #DDDDDD; - scrollbar-face-color: #E0E0DD; - scrollbar-highlight-color: #F0F0EE; - scrollbar-shadow-color: #F0F0EE; - scrollbar-track-color: #F5F5F5; -} - -td { - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 10px; -} - -pre { - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 10px; -} - -.mceVisualAid { - border: 1px dashed #BBBBBB; -} diff --git a/public/tiny_mce/themes/default/editor_popup.css b/public/tiny_mce/themes/default/editor_popup.css deleted file mode 100644 index 81a58d5..0000000 --- a/public/tiny_mce/themes/default/editor_popup.css +++ /dev/null @@ -1,41 +0,0 @@ -body { - background-color: #F0F0EE; - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 11px; - scrollbar-3dlight-color: #F0F0EE; - scrollbar-arrow-color: #676662; - scrollbar-base-color: #F0F0EE; - scrollbar-darkshadow-color: #DDDDDD; - scrollbar-face-color: #E0E0DD; - scrollbar-highlight-color: #F0F0EE; - scrollbar-shadow-color: #F0F0EE; - scrollbar-track-color: #F5F5F5; -} - -td { - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 11px; -} - -input { - background: #FFFFFF; - border: 1px solid #cccccc; -} - -td, input, select, textarea { - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 10px; -} - -input, select, textarea { - border: 1px solid #808080; -} - -.input_noborder { - border: 0px solid #808080; -} - -.title { - font-size: 12px; - font-weight: bold; -} \ No newline at end of file diff --git a/public/tiny_mce/themes/default/editor_template.js b/public/tiny_mce/themes/default/editor_template.js deleted file mode 100644 index de3b73e..0000000 --- a/public/tiny_mce/themes/default/editor_template.js +++ /dev/null @@ -1,32 +0,0 @@ -function TinyMCE_default_getEditorTemplate(){var template=new Array();template['html']='\ -\ -\ -\ -
\ -IFRAME\ -
\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -
\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -
';template['delta_width']=0;template['delta_height']=-40;return template;}function TinyMCE_default_getInsertLinkTemplate(){var template=new Array();template['file']='link.htm';template['width']=320;template['height']=200;template['width']+=tinyMCE.getLang('lang_insert_link_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_link_delta_height',0);return template;}function TinyMCE_default_getInsertImageTemplate(){var template=new Array();template['file']='image.htm';template['width']=360;template['height']=200;template['width']+=tinyMCE.getLang('lang_insert_image_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_image_delta_height',0);return template;}function TinyMCE_default_handleNodeChange(editor_id,node){tinyMCE.switchClassSticky(editor_id+'_left','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_right','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_center','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_full','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_bold','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_italic','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_underline','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_strikethrough','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_bullist','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_numlist','mceButtonNormal');alignNode=node;breakOut=false;do{if(!alignNode.getAttribute||!alignNode.getAttribute('align'))continue;switch(alignNode.getAttribute('align').toLowerCase()){case "left":tinyMCE.switchClassSticky(editor_id+'_left','mceButtonSelected');breakOut=true;break;case "right":tinyMCE.switchClassSticky(editor_id+'_right','mceButtonSelected');breakOut=true;break;case "middle":case "center":tinyMCE.switchClassSticky(editor_id+'_center','mceButtonSelected');breakOut=true;break;case "justify":tinyMCE.switchClassSticky(editor_id+'_full','mceButtonSelected');breakOut=true;break;}}while(!breakOut&&(alignNode=alignNode.parentNode));do{switch(node.nodeName.toLowerCase()){case "b":case "strong":tinyMCE.switchClassSticky(editor_id+'_bold','mceButtonSelected');break;case "i":case "em":tinyMCE.switchClassSticky(editor_id+'_italic','mceButtonSelected');break;case "u":tinyMCE.switchClassSticky(editor_id+'_underline','mceButtonSelected');break;case "strike":tinyMCE.switchClassSticky(editor_id+'_strikethrough','mceButtonSelected');break;case "ul":tinyMCE.switchClassSticky(editor_id+'_bullist','mceButtonSelected');break;case "ol":tinyMCE.switchClassSticky(editor_id+'_numlist','mceButtonSelected');break;}}while((node=node.parentNode));} \ No newline at end of file diff --git a/public/tiny_mce/themes/default/editor_template_src.js b/public/tiny_mce/themes/default/editor_template_src.js deleted file mode 100644 index 4a317b6..0000000 --- a/public/tiny_mce/themes/default/editor_template_src.js +++ /dev/null @@ -1,151 +0,0 @@ -function TinyMCE_default_getEditorTemplate() { - var template = new Array(); - - template['html'] = '\ -\ -\ -\ -
\ -IFRAME\ -
\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -
\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -
'; - - template['delta_width'] = 0; - template['delta_height'] = -40; - - return template; -} - -/** - * Insert link template function. - */ -function TinyMCE_default_getInsertLinkTemplate() { - var template = new Array(); - - template['file'] = 'link.htm'; - template['width'] = 320; - template['height'] = 200; - - // Language specific width and height addons - template['width'] += tinyMCE.getLang('lang_insert_link_delta_width', 0); - template['height'] += tinyMCE.getLang('lang_insert_link_delta_height', 0); - - return template; -} - -/** - * Insert image template function. - */ -function TinyMCE_default_getInsertImageTemplate() { - var template = new Array(); - - template['file'] = 'image.htm'; - template['width'] = 360; - template['height'] = 200; - - // Language specific width and height addons - template['width'] += tinyMCE.getLang('lang_insert_image_delta_width', 0); - template['height'] += tinyMCE.getLang('lang_insert_image_delta_height', 0); - - return template; -} - -function TinyMCE_default_handleNodeChange(editor_id, node) { - // Reset old states - tinyMCE.switchClassSticky(editor_id + '_left', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_right', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_center', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_full', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_bold', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_italic', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_underline', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_strikethrough', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_bullist', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_numlist', 'mceButtonNormal'); - - // Handle align attributes - alignNode = node; - breakOut = false; - do { - if (!alignNode.getAttribute || !alignNode.getAttribute('align')) - continue; - - switch (alignNode.getAttribute('align').toLowerCase()) { - case "left": - tinyMCE.switchClassSticky(editor_id + '_left', 'mceButtonSelected'); - breakOut = true; - break; - - case "right": - tinyMCE.switchClassSticky(editor_id + '_right', 'mceButtonSelected'); - breakOut = true; - break; - - case "middle": - case "center": - tinyMCE.switchClassSticky(editor_id + '_center', 'mceButtonSelected'); - breakOut = true; - break; - - case "justify": - tinyMCE.switchClassSticky(editor_id + '_full', 'mceButtonSelected'); - breakOut = true; - break; - } - } while (!breakOut && (alignNode = alignNode.parentNode)); - - // Handle elements - do { - switch (node.nodeName.toLowerCase()) { - case "b": - case "strong": - tinyMCE.switchClassSticky(editor_id + '_bold', 'mceButtonSelected'); - break; - - case "i": - case "em": - tinyMCE.switchClassSticky(editor_id + '_italic', 'mceButtonSelected'); - break; - - case "u": - tinyMCE.switchClassSticky(editor_id + '_underline', 'mceButtonSelected'); - break; - - case "strike": - tinyMCE.switchClassSticky(editor_id + '_strikethrough', 'mceButtonSelected'); - break; - - case "ul": - tinyMCE.switchClassSticky(editor_id + '_bullist', 'mceButtonSelected'); - break; - - case "ol": - tinyMCE.switchClassSticky(editor_id + '_numlist', 'mceButtonSelected'); - break; - } - } while ((node = node.parentNode)); -} diff --git a/public/tiny_mce/themes/default/editor_ui.css b/public/tiny_mce/themes/default/editor_ui.css deleted file mode 100644 index 5324fc0..0000000 --- a/public/tiny_mce/themes/default/editor_ui.css +++ /dev/null @@ -1,100 +0,0 @@ -.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected { - margin-top: 1px; - margin-left: 1px; -} - -.mceButtonNormal { - border-top: 1px solid; - border-left: 1px solid; - border-bottom: 1px solid; - border-right: 1px solid; - border-color: #F0F0EE; - cursor: arrow; -} - -.mceButtonOver { -/* border-top: 1px solid buttonhighlight; - border-left: 1px solid buttonhighlight; - border-bottom: 1px solid buttonshadow; - border-right: 1px solid buttonshadow;*/ - border: 1px solid #0A246A; - cursor: arrow; - background-color: #B6BDD2; -} - -.mceButtonDown { -/* border-bottom: 1px solid buttonhighlight; - border-right: 1px solid buttonhighlight; - border-top: 1px solid buttonshadow; - border-left: 1px solid buttonshadow;*/ - cursor: arrow; - border: 1px solid #0A246A; - background-color: #8592B5; -} - -.mceButtonDisabled { - filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); - border-top: 1px solid; - border-left: 1px solid; - border-bottom: 1px solid; - border-right: 1px solid; - border-color: #F0F0EE; - cursor: arrow; -} - -.mceSeparator { - border-top: 1px solid buttonhighlight; - border-left: 1px solid buttonhighlight; - border-bottom: 1px solid buttonshadow; - border-right: 1px solid buttonshadow; - margin-right: 2px; - margin-left: 2px; -} - -.mceSeparatorLine { - margin:2px; - margin-left: 4px; - background-color: #F0F0EE; - border-top: 1px solid buttonshadow; - border-left: 1px solid buttonshadow; - border-bottom: 1px solid buttonhighlight; - border-right: 1px solid buttonhighlight; - width: 0px; - height: 15px; -} - -.mceSelectList { - font-family: "MS Sans Serif"; - font-size: 7pt; - font-weight: normal; - margin-top: 2px; -} - -.mceLabel, .mceLabelDisabled { - font-family: "MS Sans Serif"; - font-size: 9pt; -} - -.mceLabel { - color: #000000; -} - -.mceLabelDisabled { - cursor: text; - color: #999999; -} - -.mceEditor { - background: #F0F0EE; - border: 1px solid #cccccc; -} - -.mceEditorArea { - font-family: "MS Sans Serif"; - background: #FFFFFF; -} - -.mceToolbar { - background: #F0F0EE; - border-top: 1px solid #cccccc; -} \ No newline at end of file diff --git a/public/tiny_mce/themes/default/image.htm b/public/tiny_mce/themes/default/image.htm deleted file mode 100644 index 96de555..0000000 --- a/public/tiny_mce/themes/default/image.htm +++ /dev/null @@ -1,57 +0,0 @@ - - -{$lang_insert_image_title} - - - - -
- - - - -
- - - - - - - - - - - - - - - -
{$lang_insert_image_title}
{$lang_insert_image_src}:
{$lang_insert_image_alt}:
-
-
- - diff --git a/public/tiny_mce/themes/default/images/bold.gif b/public/tiny_mce/themes/default/images/bold.gif deleted file mode 100644 index 31f004b24f5c83aff0497eb04204fa970c9ea2e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 864 zcmZ?wbhEHb6k!lyXlED&qaiS&LqPE-3o`=)BZCeo6hL``fy0)8nM1~7!-9j&9Ku>L zCpIi}W)M(z%8>|6INB<%uXV;kaPg5oImQTew2!5RRUlNxRS diff --git a/public/tiny_mce/themes/default/images/bold_fr.gif b/public/tiny_mce/themes/default/images/bold_fr.gif deleted file mode 100644 index 7782282838436ab0e31947ec16760295fa0bd6c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78 zcmZ?wbhEHb6k!lyXkcJCaNqy~1B2pE7DfgJ1_m7v0g`cGQf=v9DUr)NeU7kI)taL* e$I2@eKa@V}T(&$+FZX+9#Lup+UC%uj8LR;ni5X4+ diff --git a/public/tiny_mce/themes/default/images/bold_ru.gif b/public/tiny_mce/themes/default/images/bold_ru.gif deleted file mode 100644 index c9e89b27e548815114e78462553c6e0016aeddc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77 zcmZ?wbhEHb6k!lyXkcXU_4U1dk&B|a605voi?f?J) diff --git a/public/tiny_mce/themes/default/images/bullist.gif b/public/tiny_mce/themes/default/images/bullist.gif deleted file mode 100644 index 12d0ec2299b415c1f1f8caeccbe6d36469314ebe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 883 zcmZ?wbhEHb6k!lyXlDQc1%mnM1~7!-9j&9Ku>L uCpIWFv0EYk&@bXIc^2!K^NJx(lFUSZ;NJywDO)e-X zaIlz=kkC+&(NIv)P>``9A>qP=3WtV*gocWS4HFC&%t%-;q2Ry@hYLFr9$YABXlQ8Y zm@v6>;)IS33ug2!oY}u<*2D!f7HnTTZO^883l=Qcuwuj34U0Bx*syua=51THZQHtI zLdSs#6AnzBdT7Fo0~01(m@whNfej4@b~GH`JmbW!NeA}sxo}{@p%BAZ!9z3}5;Qx;U|NkF&@ZiCR7au@@ zGKxn=2q^w!VP;^6VbB427nCO$IMy-jen&`6M5=ijs*!LcxiCRo~ePoI%Ns?X1jvQYSaEbWd6}t0XY&-1PJ`Gcyx|H2^8t B^g93m diff --git a/public/tiny_mce/themes/default/images/copy.gif b/public/tiny_mce/themes/default/images/copy.gif deleted file mode 100644 index f0b51871e24fb0b0a427be5a3929549431439a84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 987 zcmZ?wbhEHb6k!lyXlDQc1CIm+hXw_Q2?`z)6g(Cv1S~L!*kF)xAfaG_L&1T7iUSD^ z3j!K0By?OTm~f$B#)X6l4+>^HD46k~V8Me43pPwxaiC$rgN79!8a6zbu;Rgl4Id_K z_&;IChXpGREZA^h!G;SPc3fDng@RgCoY^md*R~cn+HxjIB?;?$tzC}T=;O{#{Ua99$dKb;lhIt4_+2q^w!VP;^kXV3we0m>5$96K25Ib=LGEI8QAA*>a1VnRZf zh>AxG1LNXEE_sRCnuHHcik&@nIy*crBqegln?^iXvB9aeOHkVEjKvSesZU8 z{pLWTvs(|hoqxI~v$Kj?3FbNNfmj W3}a^F5Rgz9^b4AuaFnaTYC diff --git a/public/tiny_mce/themes/default/images/cut.gif b/public/tiny_mce/themes/default/images/cut.gif deleted file mode 100644 index 6a969e55bd55d5e878a7ea7c7389f24df84bc924..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmZ?wbhEHb6k!lyxN60a)wD6TV(o-!3(lN6eC5K41*`V%+Ix86($$-{Y-RM>$mqCC zBW^vT({i)44Y4&F8NJr8T(f@Cf?WamtJiKh5L>nW@S*+F=C7CYoK@B^fzfSsYEkEg z?T70+=PX&ZHNB*RF>;?q;G)uoi5jU}Iw#Ic%x_@~-^1v#a{AomlV-1Bv|F5z*D`8Iv8#2$;{X5uGoS*+ zpDc_F3|0&}AYqW77}%N}<`#J9NcEpkVF_}PndIb>kh%*Xi@|me}vhvFt^98V}F$kGh z@h}SUvw5;|u`nuGDKM~cv3d$ia`P})F=%pg3VX7M@G?3x@`|vu9y@;Gq$7hh0B~!E AHvj+t diff --git a/public/tiny_mce/themes/default/images/full.gif b/public/tiny_mce/themes/default/images/full.gif deleted file mode 100644 index 5a78c630675cbb1f7027a11cbbb19a6090daba26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 856 zcmZ?wbhEHb6k!lyXlED&qaiS&LqPE-3o`=)BZCeo6hL``fy0!6nM1~7!-9j&9Ku>L wCpIWFvS<$*F5=IYCbgBlgia8mS;J{!F0C7th00000 diff --git a/public/tiny_mce/themes/default/images/help.gif b/public/tiny_mce/themes/default/images/help.gif deleted file mode 100644 index a5d67714bc9becca85232849b8b3cf24bddba494..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1027 zcmZ?wbhEHb6k!lyXlDQc0gnv=0UOLCyDXx66e2bV1RM|uxF8U5K_TFPLc{@uhzAM@ z9~3e^C}jLM$oOwi@ZUdYYGCH{fYMpcMGFHe4mcG2cc}Q_Q1L&mWqx_@tg4CAvs+ge zPh49+b5+@tODH|I>R9CUjg#o^m8(?#05{ zN6ThjEt_*8VZw)m3I7Wwd?=XlpOxW;$*{-vTc3oVs`|6^-Hx}%8uw?gx z1v@@0*zteOv72j;-P&{L(7t0QHXpsT;K2V4Cmw7#@L|J=4;xPWKXmTOu}inE-MVq$ z#Dg<89-O=N_`rn^2QK_SaO1;+7atyc`0(Jv{|_MW|HF^}|Ns97h21C~;vt~;lZBaq zA(KG|7tt*41l}eqn*7@Uo**TKs3s zVN_;eDDAj7~W!?n&lp*I;jCQQWN3!o;dL pt>b3{^TTN}nyaQb53;5xi1Ve8PaAl{09RDRG|2i zg^_`Qi$Mn@3^Id(B|qS#=jy#bmYv#4Q?pI*p?bZf4}wuZF{77A-PoE+3|-pFfbP)NAju!pljG~x9eYlg<-JldC77_7r5 f{>fl-My`~!@aq@JM znjA778x|aF<`CA3u@GQ5+|J49QDU)ikxK`+q{f5`7akpH5*AX(5NK>V-p?$q;}PKC rz|bSW#-i}xz!KLMb{?A-5rWD`=Bexd>iH4);=*FJiCVD|0u0sw4x~l% diff --git a/public/tiny_mce/themes/default/images/italic.gif b/public/tiny_mce/themes/default/images/italic.gif deleted file mode 100644 index ec03278f34d453eb73b8acdffce48bc15af1dbed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 860 zcmZ?wbhEHb6k!lyXlDR{>gwv2mKG3e6px0$2nzwlpDfG_49pBVAb*4M1Ota913QO| z$A$$5n>mEFVoq#W=-kAhJ>kH2`FC8g2jp diff --git a/public/tiny_mce/themes/default/images/italic_de_se.gif b/public/tiny_mce/themes/default/images/italic_de_se.gif deleted file mode 100644 index 6ce0d8d46698477efa2d1d5197559ecab7fe7e0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmZ?wbhEHb6k!lyn8*ME|NsAIU|{(F|G(l-7DfgJW(FOQC`g`xNoh|1%F}Q8XV17C g5aE6-%*D6z{@2E5H+mnbL wCpIWFvpyBZ3(cKF-9?V<3rgqY@;KZ5_@87K3dCt-&=hpQLZ(cqB z_Vsf{S?~Qj*OzQPw(ro%o&{SUy!i0)`I8Sn{%boV9k}sf_R6DY&Yb!G|G#@k!GawZ zo;|t$?#;^$2OeCw@nOP(1Km?s+`D$|`}_CVt@93?crb6xuJ7N!Z`g6+!h`=o$;F$t z?iSDp*m2-^@1kwdSuGDf{LiiITd?86r1`5GW^8Z?%sP4D+SDb7jvT+RWb?(s>i%Wx zwz);;UwH6g<@U>ymhSlQ|NpENTQ6U`KYPQG4JRH~#%{P0cN>ZS5VMUEMvsef`aj?qa&CZj7Gn zVge32ZH~4!62i_b-U}Bm)oNuI6yRWWk}{OFFwt}|v}`q#5D|Bku-DfRH4qmNR&0X1HvvY{w_B*J`S(E~jG5Y9w&)0V{KxxdN-ChZQ6LYe}9L6TW@_@$=X3u0{rH E042uB(f|Me diff --git a/public/tiny_mce/themes/default/images/numlist.gif b/public/tiny_mce/themes/default/images/numlist.gif deleted file mode 100644 index 7ff907be758dcd41788aa864749a5f7ce4135d83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 889 zcmZ?wbhEHb6k!lyXlDQcgMbEufC&x}6C5HII3z4^NZ8Q4S}H<0*XIbm>C$v7<53+ z2jvL{jxYvY4jGRP3l27O2y4Zh*pR@=%FC_iVIa_Ov|F4v$Us2xkpl}eONC5kL1Pn} wimr!-g1}<$W??=Dg_#Ww4O1*cH7q6sH8xMvGnPtGC`viYZZWxvhl9Zy03g>wx&QzG diff --git a/public/tiny_mce/themes/default/images/outdent.gif b/public/tiny_mce/themes/default/images/outdent.gif deleted file mode 100644 index 53e89a77f471fe02d405d9fa6c0f4f48e67ffffd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 887 zcmZ?wbhEHb6k!lyXlDQcgMbMR5fg%PCOIT5a7fq?P;nuk;X**egMf|)Wql_TIzDtw z+uJq&*p$tWr)+$4>fH5fH|}4%c^{;66px0$5Dx*xpDfG_48jaLAb)`J1OrD1gF1(d z$A$$5n>mEFVk`t04!3hMdX!jfT;$ThFRLMtu`%f&J2#)lgBu?o9bn<$5fKnzNNQnY lVRBG-X{gxDXri9f@?ztXlXE$$tysLKBwt+2&CJAL4FIt^Ko$T1 diff --git a/public/tiny_mce/themes/default/images/paste.gif b/public/tiny_mce/themes/default/images/paste.gif deleted file mode 100644 index a676604cf68baab73af5ce50cc4a6934c447bd4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1022 zcmZ?wbhEHb6k!lyXlDQc2LlBM3xfa$0|y5O2af=UfP{dEf&>qTgaC(x2!{d?3Mj~M zC`bq>$Os5XXb8w?NGO<)P%)vPVL?NJ!Gr>ZhJt{Gf`qpE>;(-96B-gGbR*-O!NFz@VXc@OOFabTd3H0*1`b{4zQl6qpVk zlnb6`urP3uCZ}KktIU&!DW1LJnk7#T6gD4X;S8R6rr@BGE1zD>wv3ZPj7s!D>^kLG&&r0aFjNAw#cB+Id__N7@vfOL&E}gNv)tc5{{1C_Y|x;UR)4tNN5)g vSm-T;txzw)c^}?*ke>1ay4J z>3x_q`EAD3_X!g|6wLTgu<&j9lJ^A*K1^SIwr$D#p7rl~*T3uC@NV|b_Y-z}Shf4^ z%Dwj%?R~do_xqK5->uyDe#gO!yN_O5dG!67qi;4JdcXD9i|t3>Z$I&D)2X*RPCnUn z;>DrUj}DxEcHrET3L;+cY1{0ACWj8Jnb)O#z9gmN)vhu3bNPKjDz|vx3AyUzx$jBt1RCcAK zA>e2$Ba^p`!h=Q^4i-~=3keHmCQboqE`^ebjf@9H70q-68VuOknVHpH90D918d?-| lPRy{_z{<{*!XEbEfYRCnd{R|AL=Qbac4v2mG#d+pH2?@Ss`mf@ diff --git a/public/tiny_mce/themes/default/images/right.gif b/public/tiny_mce/themes/default/images/right.gif deleted file mode 100644 index 88bfaf2542714e3e477e6accefde445e2e18a860..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 855 zcmZ?wbhEHb6k!lyXlED&qaiS&LqPE-3o`=)BZCeo6hL``fy0D>nM1~7!-9j&9Ku>L uCpIWFvaOo5kkGsR6pzPYmZ>z@A8Mwr4f?DvZn3YBf4AuY|n-yCC diff --git a/public/tiny_mce/themes/default/images/spacer.gif b/public/tiny_mce/themes/default/images/spacer.gif deleted file mode 100644 index fc2560981ee1caca400e225e48d282106f907f2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43 wcmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE7Df>U1_m7l1_lO@3L zCpIiR+|J6#!Qv43$fb*2mu-W_#Ki}@gq^eg?D)9oc)w`yDi+UxWcP`ZhU;Wb2rW80 O+oJf@ok{}*25SImDgs9`HHt?=VC02>;!hT41_mYu9gx>Sd4hq%m4TH*#$&^R zgUuYmS}`X+C^WP)usHPW`0&u7o5#>=NyNm(Zmm-GYCI|g!J8~K S$0K;z+1VDwuS5g{7_0&GMjopG diff --git a/public/tiny_mce/themes/default/images/underline_ru.gif b/public/tiny_mce/themes/default/images/underline_ru.gif deleted file mode 100644 index 2a517e8b6bde52f82ebedaace15e43d4c39197f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77 zcmZ?wbhEHb6k!lyXkcXU_4U1d#u+G?QQ1HMZVSz)!28WCdp>^9bD_1#W z9B?Q&;81WOuI^|+#f6Bv3l0?zyy_mrHSG;(co5n4AfVwxK*xuK2@f)+zE7C&p? zf*BtQ7JTSmb$RC6a}6s#^lo@RVa12p+uzUH@pi(7539DGS+@Pgk{vg;?mM$!_nRfV z-!I?)Zu$QAEBC$MbL{%wqqo-|c)0TD`*p|PZ8`F2^P%^fkG z4q>gB69I|>;`&8@G9;F?atbNA?Ab7}pyhzHnu&!+KmrrD42ScD3yDh3%xoeeG6xKp z72EmbOcWd#oE|iAstTm-*l_SLlLWIQgKNaW1Fd|LH7Z*-FfC+Z=i%VsP?*5Z%wwv- n6{48f9MQ;cuteZCGiw`1dU8TT!J{=j{MP4Q-Cb?2z+epkphmC? diff --git a/public/tiny_mce/themes/default/images/unlink.gif b/public/tiny_mce/themes/default/images/unlink.gif deleted file mode 100644 index dd073a2b44b45fdf49418179a831ade69f68be26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 561 zcmZ?wbhEHb6k!ly_{PAX?U3~3(cLp=&eTp?_Tl}TC0mbqrnfpIG~Bv=;mxb(-@bm{ zaN@zd#cR^*7T>>f{lbk0FP}g8@Z*1AO8JBZ2V4TPjvT)boz>E_VC#h&A2w~>{r~^} zcW+)kdvgEYwQCPveE9zU{iUl{4&3-KZ_Td4>V5-{f`ozz0R(%RPE z#>C#y#BSW%q|n{d+uuEDN=x_bnRD9>?d^<|R44L^J7~8V+E_~os`VS|uIFZ!Y*m*N z*AePxRMQg?GSOFVb(CUYYG)Ex)M;hq7q>N1QJH9Kz$z@(YHp-1p{cS-?TMKcPn)Qg mmFa$VwhtC>=KW~yn=`MEar$Hp*%OSK49jXbgw=Rh7_0&Ay|)_x diff --git a/public/tiny_mce/themes/default/link.htm b/public/tiny_mce/themes/default/link.htm deleted file mode 100644 index 013c9b1..0000000 --- a/public/tiny_mce/themes/default/link.htm +++ /dev/null @@ -1,64 +0,0 @@ - - -{$lang_insert_link_title} - - - - -
- - - - -
- - - - - - - - - - - - - - - -
{$lang_insert_link_title}
{$lang_insert_link_url}:
{$lang_insert_link_target}:
-
-
- - diff --git a/public/tiny_mce/themes/simple/editor_content.css b/public/tiny_mce/themes/simple/editor_content.css deleted file mode 100644 index 75290ee..0000000 --- a/public/tiny_mce/themes/simple/editor_content.css +++ /dev/null @@ -1,27 +0,0 @@ -body { - background-color: #FFFFFF; - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 10px; - scrollbar-3dlight-color: #F0F0EE; - scrollbar-arrow-color: #676662; - scrollbar-base-color: #F0F0EE; - scrollbar-darkshadow-color: #DDDDDD; - scrollbar-face-color: #E0E0DD; - scrollbar-highlight-color: #F0F0EE; - scrollbar-shadow-color: #F0F0EE; - scrollbar-track-color: #F5F5F5; -} - -td { - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 10px; -} - -pre { - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 10px; -} - -.mceVisualAid { - border: 1px dashed #BBBBBB; -} diff --git a/public/tiny_mce/themes/simple/editor_popup.css b/public/tiny_mce/themes/simple/editor_popup.css deleted file mode 100644 index 81a58d5..0000000 --- a/public/tiny_mce/themes/simple/editor_popup.css +++ /dev/null @@ -1,41 +0,0 @@ -body { - background-color: #F0F0EE; - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 11px; - scrollbar-3dlight-color: #F0F0EE; - scrollbar-arrow-color: #676662; - scrollbar-base-color: #F0F0EE; - scrollbar-darkshadow-color: #DDDDDD; - scrollbar-face-color: #E0E0DD; - scrollbar-highlight-color: #F0F0EE; - scrollbar-shadow-color: #F0F0EE; - scrollbar-track-color: #F5F5F5; -} - -td { - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 11px; -} - -input { - background: #FFFFFF; - border: 1px solid #cccccc; -} - -td, input, select, textarea { - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 10px; -} - -input, select, textarea { - border: 1px solid #808080; -} - -.input_noborder { - border: 0px solid #808080; -} - -.title { - font-size: 12px; - font-weight: bold; -} \ No newline at end of file diff --git a/public/tiny_mce/themes/simple/editor_template.js b/public/tiny_mce/themes/simple/editor_template.js deleted file mode 100644 index 8cddcf1..0000000 --- a/public/tiny_mce/themes/simple/editor_template.js +++ /dev/null @@ -1,20 +0,0 @@ -function TinyMCE_simple_getEditorTemplate(){var template=new Array();template['html']='\ -\ -\ -\ -
\ -IFRAME\ -
\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -
';template['delta_width']=0;template['delta_height']=-20;return template;}function TinyMCE_simple_handleNodeChange(editor_id,node){tinyMCE.switchClassSticky(editor_id+'_bold','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_italic','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_underline','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_strikethrough','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_bullist','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_numlist','mceButtonNormal');do{switch(node.nodeName.toLowerCase()){case "b":case "strong":tinyMCE.switchClassSticky(editor_id+'_bold','mceButtonSelected');break;case "i":case "em":tinyMCE.switchClassSticky(editor_id+'_italic','mceButtonSelected');break;case "u":tinyMCE.switchClassSticky(editor_id+'_underline','mceButtonSelected');break;case "strike":tinyMCE.switchClassSticky(editor_id+'_strikethrough','mceButtonSelected');break;case "ul":tinyMCE.switchClassSticky(editor_id+'_bullist','mceButtonSelected');break;case "ol":tinyMCE.switchClassSticky(editor_id+'_numlist','mceButtonSelected');break;}}while((node=node.parentNode));} \ No newline at end of file diff --git a/public/tiny_mce/themes/simple/editor_template_src.js b/public/tiny_mce/themes/simple/editor_template_src.js deleted file mode 100644 index 3dbf187..0000000 --- a/public/tiny_mce/themes/simple/editor_template_src.js +++ /dev/null @@ -1,70 +0,0 @@ -function TinyMCE_simple_getEditorTemplate() { - var template = new Array(); - - template['html'] = '\ -\ -\ -\ -
\ -IFRAME\ -
\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -\ -
'; - - template['delta_width'] = 0; - template['delta_height'] = -20; - - return template; -} - -function TinyMCE_simple_handleNodeChange(editor_id, node) { - // Reset old states - tinyMCE.switchClassSticky(editor_id + '_bold', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_italic', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_underline', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_strikethrough', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_bullist', 'mceButtonNormal'); - tinyMCE.switchClassSticky(editor_id + '_numlist', 'mceButtonNormal'); - - // Handle elements - do { - switch (node.nodeName.toLowerCase()) { - case "b": - case "strong": - tinyMCE.switchClassSticky(editor_id + '_bold', 'mceButtonSelected'); - break; - - case "i": - case "em": - tinyMCE.switchClassSticky(editor_id + '_italic', 'mceButtonSelected'); - break; - - case "u": - tinyMCE.switchClassSticky(editor_id + '_underline', 'mceButtonSelected'); - break; - - case "strike": - tinyMCE.switchClassSticky(editor_id + '_strikethrough', 'mceButtonSelected'); - break; - - case "ul": - tinyMCE.switchClassSticky(editor_id + '_bullist', 'mceButtonSelected'); - break; - - case "ol": - tinyMCE.switchClassSticky(editor_id + '_numlist', 'mceButtonSelected'); - break; - } - } while ((node = node.parentNode)); -} diff --git a/public/tiny_mce/themes/simple/editor_ui.css b/public/tiny_mce/themes/simple/editor_ui.css deleted file mode 100644 index 7f57981..0000000 --- a/public/tiny_mce/themes/simple/editor_ui.css +++ /dev/null @@ -1,100 +0,0 @@ -.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected { - margin-top: 1px; - margin-left: 1px; -} - -.mceButtonNormal { - border-top: 1px solid; - border-left: 1px solid; - border-bottom: 1px solid; - border-right: 1px solid; - border-color: #F0F0EE; - cursor: arrow; -} - -.mceButtonOver { - border: 1px solid #0A246A; - cursor: arrow; - background-color: #B6BDD2; -} - -.mceButtonDown { - cursor: arrow; - border: 1px solid #0A246A; - background-color: #8592B5; -} - -.mceButtonSelected { - border: 1px solid; - border-color: #C0C0BB; - cursor: arrow; -} - -.mceButtonDisabled { - filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); - -moz-opacity:0.3; - opacity: 0.3; - border-top: 1px solid; - border-left: 1px solid; - border-bottom: 1px solid; - border-right: 1px solid; - border-color: #F0F0EE; - cursor: arrow; -} - -.mceSeparator { - border-top: 1px solid buttonhighlight; - border-left: 1px solid buttonhighlight; - border-bottom: 1px solid buttonshadow; - border-right: 1px solid buttonshadow; - margin-right: 2px; - margin-left: 2px; -} - -.mceSeparatorLine { - margin:2px; - margin-left: 4px; - background-color: #F0F0EE; - border-top: 1px solid buttonshadow; - border-left: 1px solid buttonshadow; - border-bottom: 1px solid buttonhighlight; - border-right: 1px solid buttonhighlight; - width: 0px; - height: 15px; -} - -.mceSelectList { - font-family: "MS Sans Serif"; - font-size: 7pt; - font-weight: normal; - margin-top: 2px; -} - -.mceLabel, .mceLabelDisabled { - font-family: "MS Sans Serif"; - font-size: 9pt; -} - -.mceLabel { - color: #000000; -} - -.mceLabelDisabled { - cursor: text; - color: #999999; -} - -.mceEditor { - background: #F0F0EE; - border: 1px solid #cccccc; -} - -.mceEditorArea { - font-family: "MS Sans Serif"; - background: #FFFFFF; -} - -.mceToolbar { - background: #F0F0EE; - border-top: 1px solid #cccccc; -} \ No newline at end of file diff --git a/public/tiny_mce/themes/simple/images/bold.gif b/public/tiny_mce/themes/simple/images/bold.gif deleted file mode 100644 index 31f004b24f5c83aff0497eb04204fa970c9ea2e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 864 zcmZ?wbhEHb6k!lyXlED&qaiS&LqPE-3o`=)BZCeo6hL``fy0)8nM1~7!-9j&9Ku>L zCpIi}W)M(z%8>|6INB<%uXV;kaPg5oImQTew2!5RRUlNxRS diff --git a/public/tiny_mce/themes/simple/images/bold_fr.gif b/public/tiny_mce/themes/simple/images/bold_fr.gif deleted file mode 100644 index 7782282838436ab0e31947ec16760295fa0bd6c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78 zcmZ?wbhEHb6k!lyXkcJCaNqy~1B2pE7DfgJ1_m7v0g`cGQf=v9DUr)NeU7kI)taL* e$I2@eKa@V}T(&$+FZX+9#Lup+UC%uj8LR;ni5X4+ diff --git a/public/tiny_mce/themes/simple/images/bold_ru.gif b/public/tiny_mce/themes/simple/images/bold_ru.gif deleted file mode 100644 index c9e89b27e548815114e78462553c6e0016aeddc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77 zcmZ?wbhEHb6k!lyXkcXU_4U1dk&B|a605voi?f?J) diff --git a/public/tiny_mce/themes/simple/images/bullist.gif b/public/tiny_mce/themes/simple/images/bullist.gif deleted file mode 100644 index 12d0ec2299b415c1f1f8caeccbe6d36469314ebe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 883 zcmZ?wbhEHb6k!lyXlDQc1%m0EYk&@bXIc^2!K^NJx(lFUSZ;NJywDO)e-X zaIlz=kkC+&(NIv)P>``9A>qP=3WtV*gocWS4HFC&%t%-;q2Ry@hYLFr9$YABXlQ8Y zm@v6>;)IS33ug2!oY}u<*2D!f7HnTTZO^883l=Qcuwuj34U0Bx*syua=51THZQHtI zLdSs#6AnzBdT7Fo0~01(m@whNfej4@b~GH`JmbW!NeA}sxo}{@p%BAZ!9z3}5;Qx;U|NkF&@ZiCR7au@@ zGKxn=2q^w!VP;^6VbB427nCO$IMy-jen&`6M5=ijs*!LcxiCRo~ePoI%Ns?X1jvQYSaEbWd6}t0XY&-1PJ`Gcyx|H2^8t B^g93m diff --git a/public/tiny_mce/themes/simple/images/italic.gif b/public/tiny_mce/themes/simple/images/italic.gif deleted file mode 100644 index ec03278f34d453eb73b8acdffce48bc15af1dbed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 860 zcmZ?wbhEHb6k!lyXlDR{>gwv2mKG3e6px0$2nzwlpDfG_49pBVAb*4M1Ota913QO| z$A$$5n>mEFVoq#W=-kAhJ>kH2`FC8g2jp diff --git a/public/tiny_mce/themes/simple/images/italic_de_se.gif b/public/tiny_mce/themes/simple/images/italic_de_se.gif deleted file mode 100644 index 6ce0d8d46698477efa2d1d5197559ecab7fe7e0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmZ?wbhEHb6k!lyn8*ME|NsAIU|{(F|G(l-7DfgJW(FOQC`g`xNoh|1%F}Q8XV17C g5aE6-%*D6z{@2E5H+mnbQ4S}H<0*XIbm>C$v7<53+ z2jvL{jxYvY4jGRP3l27O2y4Zh*pR@=%FC_iVIa_Ov|F4v$Us2xkpl}eONC5kL1Pn} wimr!-g1}<$W??=Dg_#Ww4O1*cH7q6sH8xMvGnPtGC`viYZZWxvhl9Zy03g>wx&QzG diff --git a/public/tiny_mce/themes/simple/images/redo.gif b/public/tiny_mce/themes/simple/images/redo.gif deleted file mode 100644 index 26a146bdaf3bff7c5366806ff64685cb9a9e291f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 942 zcmZ?wbhEHb6k!lyXlDQc1&;{^0TV2vXBh-6Fo;-S5V653VTnP)2CMYV))|`(3Ldye z&vMAv5LB=-T;txzw)c^}?*ke>1ay4J z>3x_q`EAD3_X!g|6wLTgu<&j9lJ^A*K1^SIwr$D#p7rl~*T3uC@NV|b_Y-z}Shf4^ z%Dwj%?R~do_xqK5->uyDe#gO!yN_O5dG!67qi;4JdcXD9i|t3>Z$I&D)2X*RPCnUn z;>DrUj}DxEcHrET3L;+cY1{0ACWj8Jnb)O#z9gmN)vhu3bNPKjDz|vx3AyUzx$jBt1RCcAK zA>e2$Ba^p`!h=Q^4i-~=3keHmCQboqE`^ebjf@9H70q-68VuOknVHpH90D918d?-| lPRy{_z{<{*!XEbEfYRCnd{R|AL=Qbac4v2mG#d+pH2?@Ss`mf@ diff --git a/public/tiny_mce/themes/simple/images/spacer.gif b/public/tiny_mce/themes/simple/images/spacer.gif deleted file mode 100644 index fc2560981ee1caca400e225e48d282106f907f2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43 wcmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE7Df>U1_m7l1_lO@3L zCpIiR+|J6#!Qv43$fb*2mu-W_#Ki}@gq^eg?D)9oc)w`yDi+UxWcP`ZhU;Wb2rW80 O+oJf@ok{}*25SImDk diff --git a/public/tiny_mce/themes/simple/images/underline_ru.gif b/public/tiny_mce/themes/simple/images/underline_ru.gif deleted file mode 100644 index 2a517e8b6bde52f82ebedaace15e43d4c39197f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77 zcmZ?wbhEHb6k!lyXkcXU_4U1d#u+G?QQ1HMZVSz)!28WCdp>^9bD_1#W z9B?Q&;81WOuI^|+#f6Bv3l0?zyy_mrHSG;(co5n4AfVwxK*xuK2@f)+zE7C&p? zf*BtQ7JTSmb$RC6a}6s#^lo@RVa12p+uzUH@pi(7539DGS+@Pgk{vg;?mM$!_nRfV z-!I?)Zu$QAEBC$MbL{%wqqo-|c)0TD`*p|PZ8`F2^P%^fkG z4q>gB69I|>;`&8@G9;F?atbNA?Ab7}pyhzHnu&!+KmrrD42ScD3yDh3%xoeeG6xKp z72EmbOcWd#oE|iAstTm-*l_SLlLWIQgKNaW1Fd|LH7Z*-FfC+Z=i%VsP?*5Z%wwv- n6{48f9MQ;cuteZCGiw`1dU8TT!J{=j{MP4Q-Cb?2z+epkphmC? diff --git a/public/tiny_mce/tiny_mce.js b/public/tiny_mce/tiny_mce.js deleted file mode 100644 index 3124ffb..0000000 --- a/public/tiny_mce/tiny_mce.js +++ /dev/null @@ -1,12 +0,0 @@ -/** - * $RCSfile: tiny_mce_src.js,v $ - * $Revision: 1.210 $ - * $Date: 2005/06/15 09:05:32 $ - * - * @author Moxiecode - * @copyright Copyright 2004, Moxiecode Systems AB, All rights reserved. - */ - function TinyMCE(){this.instances=new Array();this.stickyClassesLookup=new Array();this.windowArgs=new Array();this.loadedFiles=new Array();this.configs=new Array();this.currentConfig=0;this.eventHandlers=new Array();this.isMSIE=(navigator.appName=="Microsoft Internet Explorer");this.isMSIE5=this.isMSIE&&(navigator.userAgent.indexOf('MSIE 5')!=-1);this.isMSIE5_0=this.isMSIE&&(navigator.userAgent.indexOf('MSIE 5.0')!=-1);this.isGecko=navigator.userAgent.indexOf('Gecko')!=-1;this.isSafari=navigator.userAgent.indexOf('Safari')!=-1;this.isMac=navigator.userAgent.indexOf('Mac')!=-1;this.dialogCounter=0;this.idCounter=0;};TinyMCE.prototype.defParam=function(key,def_val){this.settings[key]=tinyMCE.getParam(key,def_val);};TinyMCE.prototype.init=function(settings){var theme;this.settings=settings;if(typeof(document.execCommand)=='undefined')return;if(!tinyMCE.baseURL){var elements=document.getElementsByTagName('script');for(var i=0;i');this.loadedFiles[this.loadedFiles.length]=url;};TinyMCE.prototype.loadCSS=function(url){for(var i=0;i');this.loadedFiles[this.loadedFiles.length]=url;};TinyMCE.prototype.importCSS=function(doc,css_file){if(tinyMCE.isMSIE)var styleSheet=doc.createStyleSheet(css_file);else{var elm=doc.createElement("link");elm.rel="stylesheet";elm.href=css_file;if(headArr=doc.getElementsByTagName("head"))headArr[0].appendChild(elm);}};TinyMCE.prototype.confirmAdd=function(e,settings){var elm=tinyMCE.isMSIE?event.srcElement:e.target;var elementId=elm.name?elm.name:elm.id;tinyMCE.settings=settings;if(!elm.getAttribute('mce_noask')&&confirm(tinyMCELang['lang_edit_confirm']))tinyMCE.addMCEControl(elm,elementId);elm.setAttribute('mce_noask','true');};TinyMCE.prototype.updateContent=function(form_element_name){var formElement=document.getElementById(form_element_name);for(var n in tinyMCE.instances){var inst=tinyMCE.instances[n];if(typeof(inst)=="function")continue;inst.switchSettings();if(inst.formElement==formElement){var doc=inst.getDoc();tinyMCE._setHTML(doc,inst.formElement.value);if(!tinyMCE.isMSIE)doc.body.innerHTML=tinyMCE._cleanupHTML(doc,this.settings,doc.body,inst.visualAid);}}};TinyMCE.prototype.addMCEControl=function(replace_element,form_element_name,target_document){var id="mce_editor_"+tinyMCE.idCounter++;var inst=new TinyMCEControl(tinyMCE.settings);inst.editorId=id;this.instances[id]=inst;inst.onAdd(replace_element,form_element_name,target_document);};TinyMCE.prototype.triggerSave=function(skip_cleanup,skip_callback){for(var n in tinyMCE.instances){var inst=tinyMCE.instances[n];if(typeof(inst)=="function")continue;inst.switchSettings();tinyMCE.settings['preformatted']=false;if(typeof(skip_cleanup)=="undefined")skip_cleanup=false;if(typeof(skip_callback)=="undefined")skip_callback=false;tinyMCE._setHTML(inst.getDoc(),inst.getBody().innerHTML);var htm=skip_cleanup?inst.getBody().innerHTML:tinyMCE._cleanupHTML(inst.getDoc(),this.settings,inst.getBody(),this.visualAid,true);if(tinyMCE.settings["encoding"]=="xml"||tinyMCE.settings["encoding"]=="html")htm=tinyMCE.convertStringToXML(htm);if(!skip_callback&&tinyMCE.settings['save_callback']!="")var content=eval(tinyMCE.settings['save_callback']+"(inst.formTargetElementId,htm,inst.getBody());");if((typeof(content)!="undefined")&&content!=null)htm=content;htm=tinyMCE.regexpReplace(htm,"(","(","gi");htm=tinyMCE.regexpReplace(htm,")",")","gi");htm=tinyMCE.regexpReplace(htm,";",";","gi");htm=tinyMCE.regexpReplace(htm,""",""","gi");htm=tinyMCE.regexpReplace(htm,"^","^","gi");if(inst.formElement)inst.formElement.value=htm;}};TinyMCE.prototype._convertOnClick=function(node){if(tinyMCE.isMSIE5)return;var elms=node.getElementsByTagName("a");for(var i=0;i","gi");content=tinyMCE.regexpReplace(content,"\r","
","gi");content=tinyMCE.regexpReplace(content,"\n","
","gi");}content=tinyMCE._customCleanup("insert_to_editor",content);if(tinyMCE.isMSIE){window.setInterval('try{tinyMCE.getCSSClasses(document.frames["'+editor_id+'"].document, "'+editor_id+'");}catch(e){}',500);if(tinyMCE.settings["force_br_newlines"])document.frames[editor_id].document.styleSheets[0].addRule("p","margin: 0px;");var body=document.frames[editor_id].document.body;tinyMCE.addEvent(body,"beforepaste",TinyMCE.prototype.eventPatch);tinyMCE.addEvent(body,"beforecut",TinyMCE.prototype.eventPatch);tinyMCE.addEvent(body,"paste",TinyMCE.prototype.eventPatch);body.editorId=editor_id;}if(!tinyMCE.isMSIE){var contentElement=inst.getDoc().createElement("body");var doc=inst.getDoc();contentElement.innerHTML=content;if(tinyMCE.settings['force_p_newlines'])content=content.replace(new RegExp('<>','g'),"");if(tinyMCE.settings['cleanup_on_startup'])inst.getBody().innerHTML=tinyMCE._cleanupHTML(doc,this.settings,contentElement);else{content=tinyMCE.regexpReplace(content,"","
","gi");content=tinyMCE.regexpReplace(content,"","
","gi");inst.getBody().innerHTML=content;}inst.convertAllRelativeURLs();}else{if(tinyMCE.settings['cleanup_on_startup']){tinyMCE._setHTML(inst.getDoc(),content);eval('try {inst.getBody().innerHTML = tinyMCE._cleanupHTML(inst.contentDocument, this.settings, inst.getBody());} catch(e) {}');}else inst.getBody().innerHTML=content;}tinyMCE._convertOnClick(inst.getBody());var parentElm=document.getElementById(inst.editorId+'_parent');if(parentElm.lastChild.nodeName.toLowerCase()=="input")inst.formElement=parentElm.lastChild;else inst.formElement=parentElm.nextSibling;tinyMCE.handleVisualAid(inst.getBody(),true,tinyMCE.settings['visual']);tinyMCE.executeCallback('setupcontent_callback','_setupContent',0,editor_id,inst.getBody(),inst.getDoc());if(!tinyMCE.isMSIE)TinyMCE.prototype.addEventHandlers(editor_id);inst.startContent=inst.getBody().innerHTML;tinyMCE.selectedInstance=inst;tinyMCE.selectedElement=inst.contentWindow.document.body;tinyMCE.triggerNodeChange(false,true);tinyMCE._customCleanup("insert_to_editor_dom",inst.contentWindow.document.body);};TinyMCE.prototype.cancelEvent=function(e){if(tinyMCE.isMSIE){e.returnValue=false;e.cancelBubble=true;}else e.preventDefault();};TinyMCE.prototype.removeTinyMCEFormElements=function(form_obj){for(var i=0;i");rng.collapse(false);rng.select();tinyMCE.triggerNodeChange(false);return false;}}if(e.keyCode==8||e.keyCode==46){tinyMCE.selectedElement=e.target;tinyMCE.linkElement=tinyMCE.getParentElement(e.target,"a");tinyMCE.imgElement=tinyMCE.getParentElement(e.target,"img");tinyMCE.triggerNodeChange(false);}return false;break;case "keyup":case "keydown":if(e.target.editorId)tinyMCE.selectedInstance=tinyMCE.instances[e.target.editorId];else return;if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.switchSettings();if(tinyMCE.isGecko&&tinyMCE.settings['force_p_newlines']&&(e.keyCode==8||e.keyCode==46)&&!e.shiftKey){if(tinyMCE.selectedInstance._handleBackSpace(e.type)){e.preventDefault();return false;}}tinyMCE.selectedElement=null;tinyMCE.selectedNode=null;var elm=tinyMCE.selectedInstance.getFocusElement();tinyMCE.linkElement=tinyMCE.getParentElement(elm,"a");tinyMCE.imgElement=tinyMCE.getParentElement(elm,"img");tinyMCE.selectedElement=elm;if(tinyMCE.isGecko&&e.type=="keyup"&&e.keyCode==9)tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(),true,tinyMCE.settings['visual']);if(tinyMCE.isGecko&&tinyMCE.settings['document_base_url']!=""+document.location.href&&e.type=="keyup"&&e.ctrlKey&&e.keyCode==86)tinyMCE.selectedInstance.fixBrokenURLs();if(tinyMCE.isMSIE&&tinyMCE.settings['custom_undo_redo']){var keys=new Array(13,45,36,35,33,34,37,38,39,40);var posKey=false;for(var i=0;i18&&e.keyCode!=255)){tinyMCE.selectedInstance.execCommand("mceAddUndoLevel");tinyMCE.selectedInstance.typing=true;tinyMCE.triggerNodeChange(false);}if(posKey&&e.type=="keyup")tinyMCE.triggerNodeChange(false);var keys=new Array(8,46);for(var i=0;i0){for(var i=0;i"+this.convertStringToXML(String.fromCharCode(160))+"";if(tinyMCE.isMSIE&&elementName=="script")return "<"+elementName+elementAttribs+">"+node.text+"";if(node.hasChildNodes()){if(elementName=="p"&&tinyMCE.cleanup_force_br_newlines)output+="";else output+="<"+elementName+elementAttribs+">";for(var i=0;i
";else output+="";}else{if(openTag)output+="<"+elementName+elementAttribs+">";else{output+="<"+elementName+elementAttribs+" />";}}return output;case 3:if(node.parentNode.nodeName.toLowerCase()=="script")return node.nodeValue;return this.convertStringToXML(node.nodeValue);case 8:return "";default:return "[UNKNOWN NODETYPE "+node.nodeType+"]";}};TinyMCE.prototype.convertStringToXML=function(html_data){var output="";for(var i=0;i127)output+='&#'+chr+";";else output+=String.fromCharCode(chr);continue;}if(tinyMCE.settings['entity_encoding']=="raw"){output+=String.fromCharCode(chr);continue;}if(typeof(tinyMCE.cleanup_entities["c"+chr])!='undefined'&&tinyMCE.cleanup_entities["c"+chr]!='')output+='&'+tinyMCE.cleanup_entities["c"+chr]+';';else output+=''+String.fromCharCode(chr);}return output;};TinyMCE.prototype._getCleanupElementName=function(chunk){var pos;if(chunk.charAt(0)=='+')chunk=chunk.substring(1);if((pos=chunk.indexOf('/'))!=-1)chunk=chunk.substring(0,pos);if((pos=chunk.indexOf('['))!=-1)chunk=chunk.substring(0,pos);return chunk;};TinyMCE.prototype._initCleanup=function(){var validElements=tinyMCE.settings["valid_elements"];validElements=validElements.split(',');var extendedValidElements=tinyMCE.settings["extended_valid_elements"];extendedValidElements=extendedValidElements.split(',');for(var i=0;i[ \n\r]*
[ \n\r]*

','
','gi');element.innerHTML=tinyMCE.regexpReplace(element.innerHTML,'','','gi');}var html=this.cleanupNode(element);if(tinyMCE.settings['debug'])alert("Cleanup process executed in: "+(new Date().getTime()-startTime)+" ms.");html=tinyMCE.regexpReplace(html,'


','
');html=tinyMCE.regexpReplace(html,'

 


 

','
');if(!tinyMCE.isMSIE)html=html.replace(new RegExp('','g'),"");if(tinyMCE.settings['apply_source_formatting']){html=html.replace(new RegExp('<(p|div)([^>]*)>','g'),"\n<$1$2>\n");html=html.replace(new RegExp('<\/(p|div)([^>]*)>','g'),"\n\n");html=html.replace(new RegExp('
','g'),"
\n");}if(tinyMCE.settings['force_br_newlines']){var re=new RegExp('

 

','g');html=html.replace(re,"
");}if(tinyMCE.settings['force_p_newlines']){var re=new RegExp('<>','g');html=html.replace(re,"");}if(tinyMCE.settings['remove_linebreaks'])html=html.replace(new RegExp('\r|\n','g'),' ');html=tinyMCE._customCleanup(on_save?"get_from_editor":"insert_to_editor",html);var chk=tinyMCE.regexpReplace(html,"[ \t\r\n]","");if(chk=="
"||chk=="
"||chk=="

 

"||chk=="

 

"||chk=="

")html="";if(tinyMCE.settings["preformatted"])return "
"+html+"
";return html;};TinyMCE.prototype.setAttrib=function(element,name,value,no_fix_value){if(!no_fix_value&&value!=null){var re=new RegExp('[^0-9%]','g');value=value.replace(re,'');}if(value!=null&&value!="")element.setAttribute(name,value);else element.removeAttribute(name);if(value!=null&&value!="")element.setAttribute(name,value);else element.removeAttribute(name);};TinyMCE.prototype.insertLink=function(href,target,title,onclick,style_class){this.execCommand("mceAddUndoLevel");if(this.selectedInstance&&this.selectedElement&&this.selectedElement.nodeName.toLowerCase()=="img"){var doc=this.selectedInstance.getDoc();var linkElement=tinyMCE.getParentElement(this.selectedElement,"a");var newLink=false;if(!linkElement){linkElement=doc.createElement("a");newLink=true;}href=eval(tinyMCE.settings['urlconverter_callback']+"(href, linkElement);");tinyMCE.setAttrib(linkElement,'href',href);tinyMCE.setAttrib(linkElement,'target',target);tinyMCE.setAttrib(linkElement,'title',title);tinyMCE.setAttrib(linkElement,'mce_onclick',onclick);tinyMCE.setAttrib(linkElement,'class',style_class);if(newLink){linkElement.appendChild(this.selectedElement.cloneNode(true));this.selectedElement.parentNode.replaceChild(linkElement,this.selectedElement);}return;}if(!this.linkElement&&this.selectedInstance){this.selectedInstance.contentDocument.execCommand("createlink",false,"#mce_temp_url#");tinyMCE.linkElement=this.getElementByAttributeValue(this.selectedInstance.contentDocument.body,"a","href","#mce_temp_url#");var elementArray=this.getElementsByAttributeValue(this.selectedInstance.contentDocument.body,"a","href","#mce_temp_url#");for(var i=0;i=strTok2.length){for(var i=0;i=strTok2.length||strTok1[i]!=strTok2[i]){breakPoint=i+1;break;}}}if(strTok1.length=strTok1.length||strTok1[i]!=strTok2[i]){breakPoint=i+1;break;}}}if(breakPoint==1)return url_to_relative;for(var i=0;i<(strTok1.length-(breakPoint-1));i++)outputString+="../";for(var i=breakPoint-1;i=0;i--){if(baseURLParts[i].length==0)continue;newBaseURLParts[newBaseURLParts.length]=baseURLParts[i];}baseURLParts=newBaseURLParts.reverse();var newRelURLParts=new Array();var numBack=0;for(var i=relURLParts.length-1;i>=0;i--){if(relURLParts[i].length==0||relURLParts[i]==".")continue;if(relURLParts[i]=='..'){numBack++;continue;}if(numBack>0){numBack--;continue;}newRelURLParts[newRelURLParts.length]=relURLParts[i];}relURLParts=newRelURLParts.reverse();var len=baseURLParts.length-numBack;var absPath=(len<=0?"":"/")+baseURLParts.slice(0,len).join('/')+"/"+relURLParts.join('/');var start="",end="";if(baseURL['protocol'])start+=baseURL['protocol']+"://";if(baseURL['host'])start+=baseURL['host'];if(baseURL['port'])start+=":"+baseURL['port'];if(relURL['query'])end+="?"+relURL['query'];if(relURL['anchor'])end+="#"+relURL['anchor'];if(relative_url.charAt(relative_url.length-1)=="/")end+="/";return start+absPath+end;};TinyMCE.prototype.getParam=function(name,default_value,strip_whitespace,split_chr){var value=(typeof(this.settings[name])=="undefined")?default_value:this.settings[name];if(value=="true"||value=="false")return(value=="true");if(strip_whitespace)value=tinyMCE.regexpReplace(value,"[ \t\r\n]","");if(typeof(split_chr)!="undefined"&&split_chr!=null){value=value.split(split_chr);var outArray=new Array();for(var i=0;i0);if(tinyMCE.settings['custom_undo_redo']){undoIndex=inst.undoIndex;undoLevels=inst.undoLevels.length;}tinyMCE.executeCallback('handleNodeChangeCallback','_handleNodeChange',0,editorId,elm,undoIndex,undoLevels,inst.visualAid,anySelection);}}if(this.selectedInstance&&(typeof(focus)=="undefined"||focus))this.selectedInstance.contentWindow.focus();};TinyMCE.prototype._customCleanup=function(type,content){var customCleanup=tinyMCE.settings['cleanup_callback'];if(customCleanup!=""&&eval("typeof("+customCleanup+")")!="undefined")content=eval(customCleanup+"(type, content);");var plugins=tinyMCE.getParam('plugins','',true,',');for(var i=0;i
';div.innerHTML=html;document.body.appendChild(div);tinyMCE._currentDialog=id;}}};TinyMCE.prototype.closeDialog=function(){if(tinyMCE.settings["dialog_type"]=="div"){var div=document.getElementById(tinyMCE._currentDialog);if(div)div.parentNode.removeChild(div);}else window.close();};TinyMCE.prototype.getVisualAidClass=function(class_name,state){var aidClass=tinyMCE.settings['visual_table_class'];if(typeof(state)=="undefined")state=tinyMCE.settings['visual'];var classNames=new Array();var ar=class_name.split(' ');for(var i=0;i0)className+=" ";className+=classNames[i];}return className;};TinyMCE.prototype.handleVisualAid=function(element,deep,state){if(!element)return;var tableElement=null;switch(element.nodeName.toLowerCase()){case "table":var oldW=element.style.width;var oldH=element.style.height;element.className=tinyMCE.getVisualAidClass(element.className,state&&element.getAttribute("border")==0);element.style.width=oldW;element.style.height=oldH;for(var y=0;y

','g');html_content=html_content.replace(re,"
");}doc.body.innerHTML=html_content;if(tinyMCE.isMSIE&&tinyMCE.settings['fix_content_duplication']){var paras=doc.getElementsByTagName("P");for(var i=0;i<\/o:p>","
");html=tinyMCE.regexpReplace(html," <\/o:p>","");html=tinyMCE.regexpReplace(html,"","");html=tinyMCE.regexpReplace(html,"

<\/p>","");html=tinyMCE.regexpReplace(html,"

<\/p>\r\n

<\/p>","");html=tinyMCE.regexpReplace(html,"

 <\/p>","
");html=tinyMCE.regexpReplace(html,"

\s*(

\s*)?","

");html=tinyMCE.regexpReplace(html,"<\/p>\s*(<\/p>\s*)?","

");}doc.body.innerHTML=html;}};TinyMCE.prototype.getImageSrc=function(str){var pos=-1;if(!str)return "";if((pos=str.indexOf('this.src='))!=-1){var src=str.substring(pos+10);src=src.substring(0,src.indexOf('\''));return src;}return "";};TinyMCE.prototype._getElementById=function(element_id){var elm=document.getElementById(element_id);if(!elm){for(var j=0;j0){var csses=null;eval("try {var csses = tinyMCE.isMSIE ? doc.styleSheets(0).rules : doc.styleSheets[0].cssRules;} catch(e) {}");if(!csses)return new Array();for(var i=0;i0)tinyMCE.cssClasses=output;return output;};TinyMCE.prototype.regexpReplace=function(in_str,reg_exp,replace_str,opts){if(typeof(opts)=="undefined")opts='g';var re=new RegExp(reg_exp,opts);return in_str.replace(re,replace_str);};TinyMCE.prototype.cleanupEventStr=function(str){str=""+str;str=str.replace('function anonymous()\n{\n','');str=str.replace('\n}','');return str;};TinyMCE.prototype.getAbsPosition=function(node){var pos=new Object();pos.absLeft=pos.absTop=0;var parentNode=node;while(parentNode){pos.absLeft+=parentNode.offsetLeft;pos.absTop+=parentNode.offsetTop;parentNode=parentNode.offsetParent;}return pos;};TinyMCE.prototype.openFileBrowser=function(field_name,url,type,win){var cb=tinyMCE.getParam("file_browser_callback");this.setWindowArg("window",win);if(eval('typeof('+cb+')')=="undefined")alert("Callback function: "+cb+" could not be found.");else eval(cb+"(field_name, url, type, win);");};TinyMCE.prototype.getControlHTML=function(control_name){var themePlugins=tinyMCE.getParam('plugins','',true,',');var templateFunction;for(var i=themePlugins.length;i>=0;i--){templateFunction='TinyMCE_'+themePlugins[i]+"_getControlHTML";if(eval("typeof("+templateFunction+")")!='undefined'){var html=eval(templateFunction+"('"+control_name+"');");if(html!="")return tinyMCE.replaceVar(html,"pluginurl",tinyMCE.baseURL+"/plugins/"+themePlugins[i]);}}return eval('TinyMCE_'+tinyMCE.settings['theme']+"_getControlHTML"+"('"+control_name+"');");};TinyMCE.prototype._themeExecCommand=function(editor_id,element,command,user_interface,value){var themePlugins=tinyMCE.getParam('plugins','',true,',');var templateFunction;for(var i=themePlugins.length;i>=0;i--){templateFunction='TinyMCE_'+themePlugins[i]+"_execCommand";if(eval("typeof("+templateFunction+")")!='undefined'){if(eval(templateFunction+"(editor_id, element, command, user_interface, value);"))return true;}}templateFunction='TinyMCE_'+tinyMCE.settings['theme']+"_execCommand";if(eval("typeof("+templateFunction+")")!='undefined')return eval(templateFunction+"(editor_id, element, command, user_interface, value);");return false;};TinyMCE.prototype._getThemeFunction=function(suffix,skip_plugins){if(skip_plugins)return 'TinyMCE_'+tinyMCE.settings['theme']+suffix;var themePlugins=tinyMCE.getParam('plugins','',true,',');var templateFunction;for(var i=themePlugins.length;i>=0;i--){templateFunction='TinyMCE_'+themePlugins[i]+suffix;if(eval("typeof("+templateFunction+")")!='undefined')return templateFunction;}return 'TinyMCE_'+tinyMCE.settings['theme']+suffix;};TinyMCE.prototype.isFunc=function(func_name){if(func_name==null||func_name=="")return false;return eval("typeof("+func_name+")")!="undefined";};TinyMCE.prototype.exec=function(func_name,args){var str=func_name+'(';for(var i=3;i1&&tinyMCE.currentConfig!=this.settings['index']){tinyMCE.settings=this.settings;tinyMCE.currentConfig=this.settings['index'];}};TinyMCEControl.prototype.fixBrokenURLs=function(){var body=this.getBody();var elms=body.getElementsByTagName("img");for(var i=0;i0)rng.selectNodeContents(nodes[0]);else rng.selectNodeContents(node);}else rng.selectNode(node);if(collapse){if(!to_start&&node.nodeType==3){rng.setStart(node,node.nodeValue.length);rng.setEnd(node,node.nodeValue.length);}else rng.collapse(to_start);}sel.removeAllRanges();sel.addRange(rng);}this.scrollToNode(node);tinyMCE.selectedElement=null;if(node.nodeType==1)tinyMCE.selectedElement=node;};TinyMCEControl.prototype.scrollToNode=function(node){var pos=tinyMCE.getAbsPosition(node);var doc=this.getDoc();var scrollX=doc.body.scrollLeft+doc.documentElement.scrollLeft;var scrollY=doc.body.scrollTop+doc.documentElement.scrollTop;var height=tinyMCE.isMSIE?document.getElementById(this.editorId).style.pixelHeight:this.targetElement.clientHeight;if(!tinyMCE.settings['auto_resize']&&!(node.absTop>scrollY&&node.absTop<(scrollY-25+height)))this.contentWindow.scrollTo(pos.absLeft,pos.absTop-height+25);};TinyMCEControl.prototype.getBody=function(){return this.getDoc().body;};TinyMCEControl.prototype.getDoc=function(){return this.contentWindow.document;};TinyMCEControl.prototype.getWin=function(){return this.contentWindow;};TinyMCEControl.prototype.getSel=function(){if(tinyMCE.isMSIE)return this.getDoc().selection;var sel=this.contentWindow.getSelection();if(tinyMCE.isSafari&&!sel.getRangeAt){var newSel=new Object();var doc=this.getDoc();function getRangeAt(idx){var rng=new Object();rng.startContainer=this.focusNode;rng.endContainer=this.anchorNode;rng.commonAncestorContainer=this.focusNode;rng.createContextualFragment=function(html){if(html.charAt(0)=='<'){var elm=doc.createElement("div");elm.innerHTML=html;return elm.firstChild;}return doc.createTextNode("UNSUPPORTED, DUE TO LIMITATIONS IN SAFARI!");};rng.deleteContents=function(){doc.execCommand("Delete",false,"");};return rng;}newSel.focusNode=sel.baseNode;newSel.focusOffset=sel.baseOffset;newSel.anchorNode=sel.extentNode;newSel.anchorOffset=sel.extentOffset;newSel.getRangeAt=getRangeAt;newSel.text=""+sel;newSel.realSelection=sel;newSel.toString=function(){return this.text;};return newSel;}return sel;};TinyMCEControl.prototype.getRng=function(){var sel=this.getSel();if(sel==null)return null;if(tinyMCE.isMSIE)return sel.createRange();return this.getSel().getRangeAt(0);};TinyMCEControl.prototype._insertPara=function(e){function isEmpty(para){function isEmptyHTML(html){return html.replace(new RegExp('[ \t\r\n]+','g'),'').toLowerCase()=="";}if(para.getElementsByTagName("img").length>0)return false;if(para.getElementsByTagName("table").length>0)return false;if(para.getElementsByTagName("hr").length>0)return false;var nodes=tinyMCE.getNodeTree(para,new Array(),3);for(var i=0;i <"+blockName+"> ";paraAfter=body.childNodes[1];}this.selectNode(paraAfter,true,true);return true;}if(startChop.nodeName==blockName)rngBefore.setStart(startChop,0);else rngBefore.setStartBefore(startChop);rngBefore.setEnd(startNode,startOffset);paraBefore.appendChild(rngBefore.cloneContents());rngAfter.setEndAfter(endChop);rngAfter.setStart(endNode,endOffset);var contents=rngAfter.cloneContents();if(contents.firstChild&&contents.firstChild.nodeName==blockName){var nodes=contents.firstChild.childNodes;for(var i=0;i0)rng.pasteHTML('
'+rng.htmlText+"
");tinyMCE.triggerNodeChange();return;}}}switch(command){case "mceSelectNode":this.selectNode(value);tinyMCE.triggerNodeChange();tinyMCE.selectedNode=value;break;case "FormatBlock":if(value==null||value==""){var elm=tinyMCE.getParentElement(this.getFocusElement(),"p,div,h1,h2,h3,h4,h5,h6,pre,address");if(elm)this.execCommand("mceRemoveNode",false,elm);}else this.getDoc().execCommand("FormatBlock",false,value);tinyMCE.triggerNodeChange();break;case "mceRemoveNode":if(!value)value=tinyMCE.getParentElement(this.getFocusElement());if(tinyMCE.isMSIE){value.outerHTML=value.innerHTML;}else{var rng=value.ownerDocument.createRange();rng.setStartBefore(value);rng.setEndAfter(value);rng.deleteContents();rng.insertNode(rng.createContextualFragment(value.innerHTML));}tinyMCE.triggerNodeChange();break;case "mceSelectNodeDepth":var parentNode=this.getFocusElement();for(var i=0;parentNode;i++){if(parentNode.nodeName.toLowerCase()=="body")break;if(parentNode.nodeName.toLowerCase()=="#text"){i--;parentNode=parentNode.parentNode;continue;}if(i==value){this.selectNode(parentNode,false);tinyMCE.triggerNodeChange();tinyMCE.selectedNode=parentNode;return;}parentNode=parentNode.parentNode;}break;case "HiliteColor":if(tinyMCE.isGecko){this.getDoc().execCommand("useCSS",false,false);this.getDoc().execCommand('hilitecolor',false,value);this.getDoc().execCommand("useCSS",false,true);}else this.getDoc().execCommand('BackColor',false,value);break;case "Cut":case "Copy":case "Paste":var cmdFailed=false;eval('try {this.getDoc().execCommand(command, user_interface, value);} catch (e) {cmdFailed = true;}');if(tinyMCE.isGecko&&cmdFailed){if(confirm(tinyMCE.getLang('lang_clipboard_msg')))window.open('http://www.mozilla.org/editor/midasdemo/securityprefs.html','mceExternal');return;}else tinyMCE.triggerNodeChange();break;case "mceSetContent":if(!value)value="";value=tinyMCE._customCleanup("insert_to_editor",value);tinyMCE._setHTML(doc,value);doc.body.innerHTML=tinyMCE._cleanupHTML(doc,tinyMCE.settings,doc.body);tinyMCE.handleVisualAid(doc.body,true,this.visualAid);return true;case "mceLink":var selectedText="";if(tinyMCE.isMSIE){var rng=doc.selection.createRange();selectedText=rng.text;}else selectedText=this.getSel().toString();if(!tinyMCE.linkElement){if((tinyMCE.selectedElement.nodeName.toLowerCase()!="img")&&(selectedText.length<=0))return;}var href="",target="",title="",onclick="",action="insert",style_class="";if(tinyMCE.selectedElement.nodeName.toLowerCase()=="a")tinyMCE.linkElement=tinyMCE.selectedElement;if(tinyMCE.linkElement!=null&&tinyMCE.getAttrib(tinyMCE.linkElement,'href')=="")tinyMCE.linkElement=null;if(tinyMCE.linkElement){href=tinyMCE.getAttrib(tinyMCE.linkElement,'href');target=tinyMCE.getAttrib(tinyMCE.linkElement,'target');title=tinyMCE.getAttrib(tinyMCE.linkElement,'title');onclick=tinyMCE.getAttrib(tinyMCE.linkElement,'mce_onclick');style_class=tinyMCE.getAttrib(tinyMCE.linkElement,'class');if(onclick=="")onclick=tinyMCE.getAttrib(tinyMCE.linkElement,'onclick');onclick=tinyMCE.cleanupEventStr(onclick);mceRealHref=tinyMCE.getAttrib(tinyMCE.linkElement,'mce_real_href');if(mceRealHref!="")href=mceRealHref;href=eval(tinyMCE.settings['urlconverter_callback']+"(href, tinyMCE.linkElement, true);");action="update";}if(this.settings['insertlink_callback']){var returnVal=eval(this.settings['insertlink_callback']+"(href, target, title, onclick, action, style_class);");if(returnVal&&returnVal['href'])tinyMCE.insertLink(returnVal['href'],returnVal['target'],returnVal['title'],returnVal['onclick'],returnVal['style_class']);}else{tinyMCE.openWindow(this.insertLinkTemplate,{href:href,target:target,title:title,onclick:onclick,action:action,className:style_class});}break;case "mceAttachment":var selectedText="";if(tinyMCE.isMSIE){var rng=doc.selection.createRange();selectedText=rng.text;}else selectedText=this.getSel().toString();if(!tinyMCE.linkElement){if((tinyMCE.selectedElement.nodeName.toLowerCase()!="img")&&(selectedText.length<=0))return;}var href="",target="",title="",onclick="",action="insert";if(tinyMCE.selectedElement.nodeName.toLowerCase()=="a")tinyMCE.linkElement=tinyMCE.selectedElement;if(tinyMCE.linkElement!=null&&tinyMCE.getAttrib(tinyMCE.linkElement,'href')=="")tinyMCE.linkElement=null;if(tinyMCE.linkElement){href=tinyMCE.getAttrib(tinyMCE.linkElement,'href');target=tinyMCE.getAttrib(tinyMCE.linkElement,'target');title=tinyMCE.getAttrib(tinyMCE.linkElement,'title');onclick=tinyMCE.getAttrib(tinyMCE.linkElement,'mce_onclick');if(onclick=="")onclick=tinyMCE.getAttrib(tinyMCE.linkElement,'onclick');onclick=tinyMCE.cleanupEventStr(onclick);mceRealHref=tinyMCE.getAttrib(tinyMCE.linkElement,'mce_real_href');if(mceRealHref!="")href=mceRealHref;href=eval(tinyMCE.settings['urlconverter_callback']+"(href, tinyMCE.linkElement, true);");action="update";}if(this.settings['insertlink_callback']){var returnVal=eval(this.settings['insertlink_callback']+"(href, target, title, onclick, action);");if(returnVal&&returnVal['href'])tinyMCE.insertLink(returnVal['href'],returnVal['target'],returnVal['title'],returnVal['onclick']);}else{tinyMCE.openWindow(this.insertAttachmentTemplate,{href:href,target:target,title:title,onclick:onclick,action:action});}break;case "mceImage":var src="",alt="",border="",hspace="",vspace="",width="",height="",align="";var title="",onmouseover="",onmouseout="",action="insert";var img=tinyMCE.imgElement;if(tinyMCE.selectedElement!=null&&tinyMCE.selectedElement.nodeName.toLowerCase()=="img"){img=tinyMCE.selectedElement;tinyMCE.imgElement=img;}if(img){if(tinyMCE.getAttrib(img,'name').indexOf('mce_')==0)return;src=tinyMCE.getAttrib(img,'src');alt=tinyMCE.getAttrib(img,'alt');if(alt=="")alt=tinyMCE.getAttrib(img,'title');if(tinyMCE.isGecko){var w=img.style.width;if(w!=null&&w!="")img.setAttribute("width",w);var h=img.style.height;if(h!=null&&h!="")img.setAttribute("height",h);}border=tinyMCE.getAttrib(img,'border');hspace=tinyMCE.getAttrib(img,'hspace');vspace=tinyMCE.getAttrib(img,'vspace');width=tinyMCE.getAttrib(img,'width');height=tinyMCE.getAttrib(img,'height');align=tinyMCE.getAttrib(img,'align');onmouseover=tinyMCE.getAttrib(img,'onmouseover');onmouseout=tinyMCE.getAttrib(img,'onmouseout');title=tinyMCE.getAttrib(img,'title');if(tinyMCE.isMSIE){width=img.attributes['width'].specified?width:"";height=img.attributes['height'].specified?height:"";}onmouseover=tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseover));onmouseout=tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseout));mceRealSrc=tinyMCE.getAttrib(img,'mce_real_src');if(mceRealSrc!="")src=mceRealSrc;src=eval(tinyMCE.settings['urlconverter_callback']+"(src, img, true);");if(onmouseover!="")onmouseover=eval(tinyMCE.settings['urlconverter_callback']+"(onmouseover, img, true);");if(onmouseout!="")onmouseout=eval(tinyMCE.settings['urlconverter_callback']+"(onmouseout, img, true);");action="update";}if(this.settings['insertimage_callback']){var returnVal=eval(this.settings['insertimage_callback']+"(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout, action);");if(returnVal&&returnVal['src'])tinyMCE.insertImage(returnVal['src'],returnVal['alt'],returnVal['border'],returnVal['hspace'],returnVal['vspace'],returnVal['width'],returnVal['height'],returnVal['align'],returnVal['title'],returnVal['onmouseover'],returnVal['onmouseout']);}else tinyMCE.openWindow(this.insertImageTemplate,{src:src,alt:alt,border:border,hspace:hspace,vspace:vspace,width:width,height:height,align:align,title:title,onmouseover:onmouseover,onmouseout:onmouseout,action:action});break;case "mceCleanupWord":if(tinyMCE.isMSIE){var html=this.getBody().createTextRange().htmlText;if(html.indexOf('="mso')!=-1){tinyMCE._setHTML(this.contentDocument,this.getBody().innerHTML);html=tinyMCE._cleanupHTML(this.contentDocument,this.settings,this.getBody(),this.visualAid);}this.getBody().innerHTML=html;}break;case "mceCleanup":tinyMCE._setHTML(this.contentDocument,this.getBody().innerHTML);this.getBody().innerHTML=tinyMCE._cleanupHTML(this.contentDocument,this.settings,this.getBody(),this.visualAid);tinyMCE.handleVisualAid(this.getBody(),true,this.visualAid);this.repaint();tinyMCE.triggerNodeChange();break;case "mceAnchor":if(!user_interface){var aElm=tinyMCE.getParentElement(this.getFocusElement(),"a","name");if(aElm){if(value==null||value==""){if(tinyMCE.isMSIE){aElm.outerHTML=aElm.innerHTML;}else{var rng=aElm.ownerDocument.createRange();rng.setStartBefore(aElm);rng.setEndAfter(aElm);rng.deleteContents();rng.insertNode(rng.createContextualFragment(aElm.innerHTML));}}else aElm.setAttribute('name',value);}else{this.getDoc().execCommand("fontname",false,"#mce_temp_font#");var elementArray=tinyMCE.getElementsByAttributeValue(this.getBody(),"font","face","#mce_temp_font#");for(var x=0;x0){value=tinyMCE.replaceVar(value,"selection",selectedText);tinyMCE.execCommand('mceInsertContent',false,value);}tinyMCE.triggerNodeChange();break;case "mceSetAttribute":if(typeof(value)=='object'){var targetElms=(typeof(value['targets'])=="undefined")?"p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address":value['targets'];var targetNode=tinyMCE.getParentElement(this.getFocusElement(),targetElms);if(targetNode){targetNode.setAttribute(value['name'],value['value']);tinyMCE.triggerNodeChange();}}break;case "mceSetCSSClass":var selectedText=false;if(tinyMCE.isMSIE){var rng=doc.selection.createRange();selectedText=(rng.text&&rng.text.length>0);}else selectedText=(this.getSel().toString().length>0);if(tinyMCE.selectedNode)tinyMCE.selectedElement=tinyMCE.selectedNode;if(selectedText&&!tinyMCE.selectedNode){this.getDoc().execCommand("RemoveFormat",false,null);if(value==null)return this.execCommand("RemoveFormat",false,null);this.getDoc().execCommand("fontname",false,"#mce_temp_font#");var elementArray=tinyMCE.getElementsByAttributeValue(this.getBody(),"font","face","#mce_temp_font#");for(var x=0;xcustomUndoLevels){for(var i=0;i0){this.undoIndex--;this.getBody().innerHTML=this.undoLevels[this.undoIndex];}tinyMCE.triggerNodeChange();}else this.getDoc().execCommand(command,user_interface,value);break;case "Redo":if(tinyMCE.settings['custom_undo_redo']){if(this.undoIndex<(this.undoLevels.length-1)){this.undoIndex++;this.getBody().innerHTML=this.undoLevels[this.undoIndex];}tinyMCE.triggerNodeChange();}else this.getDoc().execCommand(command,user_interface,value);break;case "mceToggleVisualAid":this.visualAid=!this.visualAid;tinyMCE.handleVisualAid(this.getBody(),true,this.visualAid);tinyMCE.triggerNodeChange();break;case "removeformat":var text=this.getSelectedText();if(tinyMCE.isMSIE){try{win.focus();var rng=doc.selection.createRange();rng.execCommand("RemoveFormat",false,null);rng.pasteHTML(rng.text);}catch(e){}}else this.getDoc().execCommand(command,user_interface,value);if(text.length==0)this.execCommand("mceSetCSSClass",false,"");tinyMCE.triggerNodeChange();break;default:this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();}};TinyMCEControl.prototype.queryCommandValue=function(command){return this.getDoc().queryCommandValue(command);};TinyMCEControl.prototype.queryCommandState=function(command){return this.getDoc().queryCommandState(command);};TinyMCEControl.prototype.onAdd=function(replace_element,form_element_name,target_document){var targetDoc=target_document?target_document:document;this.targetDoc=targetDoc;tinyMCE.themeURL=tinyMCE.baseURL+"/themes/"+this.settings['theme'];this.settings['themeurl']=tinyMCE.themeURL;if(!replace_element){alert("Error: Could not find the target element.");return false;}var templateFunction=tinyMCE._getThemeFunction('_getInsertLinkTemplate');if(eval("typeof("+templateFunction+")")!='undefined')this.insertLinkTemplate=eval(templateFunction+'(this.settings);');var templateFunction=tinyMCE._getThemeFunction('_getInsertAttachmentTemplate');if(eval("typeof("+templateFunction+")")!='undefined')this.insertAttachmentTemplate=eval(templateFunction+'(this.settings);');var templateFunction=tinyMCE._getThemeFunction('_getInsertImageTemplate');if(eval("typeof("+templateFunction+")")!='undefined')this.insertImageTemplate=eval(templateFunction+'(this.settings);');var templateFunction=tinyMCE._getThemeFunction('_getEditorTemplate');if(eval("typeof("+templateFunction+")")=='undefined'){alert("Error: Could not find the template function: "+templateFunction);return false;}var editorTemplate=eval(templateFunction+'(this.settings, this.editorId);');var deltaWidth=editorTemplate['delta_width']?editorTemplate['delta_width']:0;var deltaHeight=editorTemplate['delta_height']?editorTemplate['delta_height']:0;var html=''+editorTemplate['html'];var templateFunction=tinyMCE._getThemeFunction('_handleNodeChange',true);if(eval("typeof("+templateFunction+")")!='undefined')this.settings['handleNodeChangeCallback']=templateFunction;html=tinyMCE.replaceVar(html,"editor_id",this.editorId);html=tinyMCE.replaceVar(html,"default_document",tinyMCE.baseURL+"/blank.htm");this.settings['default_document']=tinyMCE.baseURL+"/blank.htm";this.settings['old_width']=this.settings['width'];this.settings['old_height']=this.settings['height'];if(this.settings['width']==-1)this.settings['width']=replace_element.offsetWidth;if(this.settings['height']==-1)this.settings['height']=replace_element.offsetHeight;if(this.settings['width']==0)this.settings['width']=replace_element.style.width;if(this.settings['height']==0)this.settings['height']=replace_element.style.height;if(this.settings['width']==0)this.settings['width']=320;if(this.settings['height']==0)this.settings['height']=240;this.settings['area_width']=parseInt(this.settings['width']);this.settings['area_height']=parseInt(this.settings['height']);this.settings['area_width']+=deltaWidth;this.settings['area_height']+=deltaHeight;if((""+this.settings['width']).indexOf('%')!=-1)this.settings['area_width']="100%";if((""+this.settings['height']).indexOf('%')!=-1)this.settings['area_height']="100%";if((""+replace_element.style.width).indexOf('%')!=-1){this.settings['width']=replace_element.style.width;this.settings['area_width']="100%";}if((""+replace_element.style.height).indexOf('%')!=-1){this.settings['height']=replace_element.style.height;this.settings['area_height']="100%";}html=tinyMCE.applyTemplate(html);this.settings['width']=this.settings['old_width'];this.settings['height']=this.settings['old_height'];this.visualAid=this.settings['visual'];this.formTargetElementId=form_element_name;if(replace_element.nodeName.toLowerCase()=="textarea")this.startContent=replace_element.value;else this.startContent=replace_element.innerHTML;if(replace_element.nodeName.toLowerCase()!="textarea"){this.oldTargetElement=replace_element.cloneNode(true);if(tinyMCE.settings['debug'])html+='';else html+='';html+='';if(!tinyMCE.isMSIE){var rng=replace_element.ownerDocument.createRange();rng.setStartBefore(replace_element);var fragment=rng.createContextualFragment(html);replace_element.parentNode.replaceChild(fragment,replace_element);}else replace_element.outerHTML=html;}else{html+='';this.oldTargetElement=replace_element;if(!tinyMCE.settings['debug'])this.oldTargetElement.style.display="none";if(!tinyMCE.isMSIE){var rng=replace_element.ownerDocument.createRange();rng.setStartBefore(replace_element);var fragment=rng.createContextualFragment(html);replace_element.parentNode.insertBefore(fragment,replace_element);}else replace_element.insertAdjacentHTML("beforeBegin",html);}var dynamicIFrame=false;var tElm=targetDoc.getElementById(this.editorId);if(!tinyMCE.isMSIE){if(tElm&&tElm.nodeName.toLowerCase()=="span"){tElm=tinyMCE._createIFrame(tElm);dynamicIFrame=true;}this.targetElement=tElm;this.iframeElement=tElm;this.contentDocument=tElm.contentDocument;this.contentWindow=tElm.contentWindow;}else{if(tElm&&tElm.nodeName.toLowerCase()=="span")tElm=tinyMCE._createIFrame(tElm);else tElm=targetDoc.frames[this.editorId];this.targetElement=tElm;this.iframeElement=targetDoc.getElementById(this.editorId);this.contentDocument=tElm.window.document;this.contentWindow=tElm.window;this.getDoc().designMode="on";}var doc=this.contentDocument;if(dynamicIFrame){var html=""+''+''+''+''+'blank_page'+''+''+''+''+'';try{this.getDoc().designMode="on";doc.open();doc.write(html);doc.close();}catch(e){this.getDoc().location.href=tinyMCE.baseURL+"/blank.htm";}}if(tinyMCE.isMSIE)window.setTimeout("TinyMCE.prototype.addEventHandlers('"+this.editorId+"');",1);tinyMCE.setupContent(this.editorId,true);return true;};TinyMCEControl.prototype.getFocusElement=function(){if(tinyMCE.isMSIE){var doc=this.getDoc();var rng=doc.selection.createRange();if(rng.collapse)rng.collapse(true);var elm=rng.item?rng.item(0):rng.parentElement();}else{var sel=this.getSel();var elm=(sel&&sel.anchorNode)?sel.anchorNode:null;if(tinyMCE.selectedElement!=null&&tinyMCE.selectedElement.nodeName.toLowerCase()=="img")elm=tinyMCE.selectedElement;}return elm;};var tinyMCE=new TinyMCE();var tinyMCELang=new Array();function debug(){var msg="";var elm=document.getElementById("tinymce_debug");if(!elm){var debugDiv=document.createElement("div");debugDiv.setAttribute("className","debugger");debugDiv.className="debugger";debugDiv.innerHTML='\ - Debug output:\ - ';document.body.appendChild(debugDiv);elm=document.getElementById("tinymce_debug");}var args=this.debug.arguments;for(var i=0;i - -var TinyMCECompressed_settings = null; - -function TinyMCECompressed() { -} - -TinyMCECompressed.prototype.init = function(settings) { - var elements = document.getElementsByTagName('script'); - var scriptURL = ""; - - for (var i=0; i'); - - TinyMCECompressed_settings = settings; -} - -var tinyMCE = new TinyMCECompressed(); diff --git a/public/tiny_mce/tiny_mce_popup.js b/public/tiny_mce/tiny_mce_popup.js deleted file mode 100644 index 8b03e50..0000000 --- a/public/tiny_mce/tiny_mce_popup.js +++ /dev/null @@ -1,96 +0,0 @@ -// Get tinyMCE window -var win = window.opener ? window.opener : window.dialogArguments; - -var tinyMCE = null; -var tinyMCELang = null; - -// Use top window if not defined -if (!win) - win = top; - -var tinyMCE = win.tinyMCE; -var tinyMCELang = win.tinyMCELang; - -if (!tinyMCE) - alert("tinyMCE object reference not found from popup."); - -// Setup window openerer -window.opener = win; - -// Setup title -var re = new RegExp('{|\\\$|}', 'g'); -var title = document.title.replace(re, ""); -if (typeof tinyMCELang[title] != "undefined") { - var divElm = document.createElement("div"); - divElm.innerHTML = tinyMCELang[title]; - document.title = divElm.innerHTML; -} - -// Setup dir -if (tinyMCELang['lang_dir']) - document.dir = tinyMCELang['lang_dir']; - -function TinyMCEPlugin_onLoad() { - if (tinyMCE.getWindowArg('mce_replacevariables', true)) - document.body.innerHTML = tinyMCE.applyTemplate(document.body.innerHTML, tinyMCE.windowArgs); - - // Auto resize window - if (tinyMCE.getWindowArg('mce_windowresize', true)) - TinyMCEPopup_autoResize(); - - if (tinyMCE.settings["dialog_type"] == "window") - window.focus(); -} - -function TinyMCEPopup_autoResize() { - // Div mode, skip resize - if (tinyMCE.settings["dialog_type"] == "div") - return; - - var isMSIE = (navigator.appName == "Microsoft Internet Explorer"); - var isOpera = (navigator.userAgent.indexOf("Opera") != -1); - - if (isOpera) - return; - - if (isMSIE) { - try { window.resizeTo(10, 10); } catch (e) {} - - var elm = document.body; - var width = elm.offsetWidth; - var height = elm.offsetHeight; - var dx = (elm.scrollWidth - width) + 4; - var dy = elm.scrollHeight - height; - - try { window.resizeBy(dx, dy); } catch (e) {} - } else { - window.scrollBy(1000, 1000); - if (window.scrollX > 0 || window.scrollY > 0) { - window.resizeBy(window.innerWidth * 2, window.innerHeight * 2); - window.sizeToContent(); - window.scrollTo(0, 0); - var x = parseInt(screen.width / 2.0) - (window.outerWidth / 2.0); - var y = parseInt(screen.height / 2.0) - (window.outerHeight / 2.0); - window.moveTo(x, y); - } - } -} - -// Re-patch it -if (tinyMCE.settings["dialog_type"] == "window") { - tinyMCE.closeDialog = function() { - // Remove div or close window - if (tinyMCE.settings["dialog_type"] == "div") { - var div = document.getElementById(tinyMCE._currentDialog); - if (div) - div.parentNode.removeChild(div); - } else - window.close(); - }; -} - -// Add onload trigger -tinyMCE.addEvent(window, "load", TinyMCEPlugin_onLoad); - -// Output Popup CSS class -document.write(''); diff --git a/public/tiny_mce/tiny_mce_src.js b/public/tiny_mce/tiny_mce_src.js deleted file mode 100644 index 25fa0d3..0000000 --- a/public/tiny_mce/tiny_mce_src.js +++ /dev/null @@ -1,4884 +0,0 @@ -/** - * $RCSfile: tiny_mce_src.js,v $ - * $Revision: 1.210 $ - * $Date: 2005/06/15 09:05:32 $ - * - * @author Moxiecode - * @copyright Copyright 2004, Moxiecode Systems AB, All rights reserved. - */ - -function TinyMCE() { - this.instances = new Array(); - this.stickyClassesLookup = new Array(); - this.windowArgs = new Array(); - this.loadedFiles = new Array(); - this.configs = new Array(); - this.currentConfig = 0; - this.eventHandlers = new Array(); - - // Browser check - this.isMSIE = (navigator.appName == "Microsoft Internet Explorer"); - this.isMSIE5 = this.isMSIE && (navigator.userAgent.indexOf('MSIE 5') != -1); - this.isMSIE5_0 = this.isMSIE && (navigator.userAgent.indexOf('MSIE 5.0') != -1); - this.isGecko = navigator.userAgent.indexOf('Gecko') != -1; - this.isSafari = navigator.userAgent.indexOf('Safari') != -1; - this.isMac = navigator.userAgent.indexOf('Mac') != -1; - this.dialogCounter = 0; - - // TinyMCE editor id instance counter - this.idCounter = 0; -}; - -TinyMCE.prototype.defParam = function(key, def_val) { - this.settings[key] = tinyMCE.getParam(key, def_val); -}; - -TinyMCE.prototype.init = function(settings) { - var theme; - - this.settings = settings; - - // Check if valid browser has execcommand support - if (typeof(document.execCommand) == 'undefined') - return; - - // Get script base path - if (!tinyMCE.baseURL) { - var elements = document.getElementsByTagName('script'); - - for (var i=0; i'); - - this.loadedFiles[this.loadedFiles.length] = url; -}; - -TinyMCE.prototype.loadCSS = function(url) { - for (var i=0; i'); - - this.loadedFiles[this.loadedFiles.length] = url; -}; - -TinyMCE.prototype.importCSS = function(doc, css_file) { - if (tinyMCE.isMSIE) - var styleSheet = doc.createStyleSheet(css_file); - else { - var elm = doc.createElement("link"); - - elm.rel = "stylesheet"; - elm.href = css_file; - - if (headArr = doc.getElementsByTagName("head")) - headArr[0].appendChild(elm); - } -}; - -TinyMCE.prototype.confirmAdd = function(e, settings) { - var elm = tinyMCE.isMSIE ? event.srcElement : e.target; - var elementId = elm.name ? elm.name : elm.id; - - tinyMCE.settings = settings; - - if (!elm.getAttribute('mce_noask') && confirm(tinyMCELang['lang_edit_confirm'])) - tinyMCE.addMCEControl(elm, elementId); - - elm.setAttribute('mce_noask', 'true'); -}; - -TinyMCE.prototype.updateContent = function(form_element_name) { - // Find MCE instance linked to given form element and copy it's value - var formElement = document.getElementById(form_element_name); - for (var n in tinyMCE.instances) { - var inst = tinyMCE.instances[n]; - if (typeof(inst) == "function") continue; - inst.switchSettings(); - - if (inst.formElement == formElement) { - var doc = inst.getDoc(); - - tinyMCE._setHTML(doc, inst.formElement.value); - - if (!tinyMCE.isMSIE) - doc.body.innerHTML = tinyMCE._cleanupHTML(doc, this.settings, doc.body, inst.visualAid); - } - } -}; - -TinyMCE.prototype.addMCEControl = function(replace_element, form_element_name, target_document) { - var id = "mce_editor_" + tinyMCE.idCounter++; - var inst = new TinyMCEControl(tinyMCE.settings); - - inst.editorId = id; - this.instances[id] = inst; - - inst.onAdd(replace_element, form_element_name, target_document); -}; - -TinyMCE.prototype.triggerSave = function(skip_cleanup, skip_callback) { - // Cleanup and set all form fields - for (var n in tinyMCE.instances) { - var inst = tinyMCE.instances[n]; - if (typeof(inst) == "function") continue; - inst.switchSettings(); - - tinyMCE.settings['preformatted'] = false; - - // Default to false - if (typeof(skip_cleanup) == "undefined") - skip_cleanup = false; - - // Default to false - if (typeof(skip_callback) == "undefined") - skip_callback = false; - - tinyMCE._setHTML(inst.getDoc(), inst.getBody().innerHTML); - - var htm = skip_cleanup ? inst.getBody().innerHTML : tinyMCE._cleanupHTML(inst.getDoc(), this.settings, inst.getBody(), this.visualAid, true); - - //var htm = tinyMCE._cleanupHTML(inst.getDoc(), tinyMCE.settings, inst.getBody(), false, true); - - if (tinyMCE.settings["encoding"] == "xml" || tinyMCE.settings["encoding"] == "html") - htm = tinyMCE.convertStringToXML(htm); - - if (!skip_callback && tinyMCE.settings['save_callback'] != "") - var content = eval(tinyMCE.settings['save_callback'] + "(inst.formTargetElementId,htm,inst.getBody());"); - - // Use callback content if available - if ((typeof(content) != "undefined") && content != null) - htm = content; - - // Replace some weird entities (Bug: #1056343) - htm = tinyMCE.regexpReplace(htm, "(", "(", "gi"); - htm = tinyMCE.regexpReplace(htm, ")", ")", "gi"); - htm = tinyMCE.regexpReplace(htm, ";", ";", "gi"); - htm = tinyMCE.regexpReplace(htm, """, """, "gi"); - htm = tinyMCE.regexpReplace(htm, "^", "^", "gi"); - - if (inst.formElement) - inst.formElement.value = htm; - } -}; - -TinyMCE.prototype._convertOnClick = function(node) { - // Skip on MSIE < 6+ - if (tinyMCE.isMSIE5) - return; - - // Convert all onclick to mce_onclick - var elms = node.getElementsByTagName("a"); - for (var i=0; i", "gi"); - content = tinyMCE.regexpReplace(content, "\r", "
", "gi"); - content = tinyMCE.regexpReplace(content, "\n", "
", "gi"); - } - - // Call custom cleanup code - content = tinyMCE._customCleanup("insert_to_editor", content); - - if (tinyMCE.isMSIE) { - // Ugly!!! - window.setInterval('try{tinyMCE.getCSSClasses(document.frames["' + editor_id + '"].document, "' + editor_id + '");}catch(e){}', 500); - - if (tinyMCE.settings["force_br_newlines"]) - document.frames[editor_id].document.styleSheets[0].addRule("p", "margin: 0px;"); - - var body = document.frames[editor_id].document.body; - - tinyMCE.addEvent(body, "beforepaste", TinyMCE.prototype.eventPatch); - tinyMCE.addEvent(body, "beforecut", TinyMCE.prototype.eventPatch); - tinyMCE.addEvent(body, "paste", TinyMCE.prototype.eventPatch); - - body.editorId = editor_id; - } - - // Fix for bug #958637 - if (!tinyMCE.isMSIE) { - var contentElement = inst.getDoc().createElement("body"); - var doc = inst.getDoc(); - - contentElement.innerHTML = content; - - // Remove weridness! - if (tinyMCE.settings['force_p_newlines']) - content = content.replace(new RegExp('<>', 'g'), ""); - - if (tinyMCE.settings['cleanup_on_startup']) - inst.getBody().innerHTML = tinyMCE._cleanupHTML(doc, this.settings, contentElement); - else { - // Convert all strong/em to b/i - content = tinyMCE.regexpReplace(content, "", "
", "gi"); - content = tinyMCE.regexpReplace(content, "", "", "gi"); - inst.getBody().innerHTML = content; - } - - inst.convertAllRelativeURLs(); - } else { - if (tinyMCE.settings['cleanup_on_startup']) { - tinyMCE._setHTML(inst.getDoc(), content); - // Produces permission denied error in MSIE 5.5 - eval('try {inst.getBody().innerHTML = tinyMCE._cleanupHTML(inst.contentDocument, this.settings, inst.getBody());} catch(e) {}'); - } else - inst.getBody().innerHTML = content; - } - - tinyMCE._convertOnClick(inst.getBody()); - - // Fix for bug #957681 - //inst.getDoc().designMode = inst.getDoc().designMode; - - // Setup element references - var parentElm = document.getElementById(inst.editorId + '_parent'); - if (parentElm.lastChild.nodeName.toLowerCase() == "input") - inst.formElement = parentElm.lastChild; - else - inst.formElement = parentElm.nextSibling; - - tinyMCE.handleVisualAid(inst.getBody(), true, tinyMCE.settings['visual']); - tinyMCE.executeCallback('setupcontent_callback', '_setupContent', 0, editor_id, inst.getBody(), inst.getDoc()); - - // Re-add design mode on mozilla - if (!tinyMCE.isMSIE) - TinyMCE.prototype.addEventHandlers(editor_id); - - inst.startContent = inst.getBody().innerHTML; - - // Trigger node change, this call locks buttons for tables and so forth - tinyMCE.selectedInstance = inst; - tinyMCE.selectedElement = inst.contentWindow.document.body; - tinyMCE.triggerNodeChange(false, true); - - // Call custom DOM cleanup - tinyMCE._customCleanup("insert_to_editor_dom", inst.contentWindow.document.body); -}; - -TinyMCE.prototype.cancelEvent = function(e) { - if (tinyMCE.isMSIE) { - e.returnValue = false; - e.cancelBubble = true; - } else - e.preventDefault(); -}; - -TinyMCE.prototype.removeTinyMCEFormElements = function(form_obj) { - // Disable all UI form elements that TinyMCE created - for (var i=0; i"); - rng.collapse(false); - rng.select(); - - tinyMCE.triggerNodeChange(false); - return false; - } - } - - // Backspace or delete - if (e.keyCode == 8 || e.keyCode == 46) { - tinyMCE.selectedElement = e.target; - tinyMCE.linkElement = tinyMCE.getParentElement(e.target, "a"); - tinyMCE.imgElement = tinyMCE.getParentElement(e.target, "img"); - tinyMCE.triggerNodeChange(false); - } - - return false; - break; - - case "keyup": - case "keydown": - if (e.target.editorId) - tinyMCE.selectedInstance = tinyMCE.instances[e.target.editorId]; - else - return; - - if (tinyMCE.selectedInstance) - tinyMCE.selectedInstance.switchSettings(); - - // Handle backspace - if (tinyMCE.isGecko && tinyMCE.settings['force_p_newlines'] && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) { - // Insert P element instead of BR - if (tinyMCE.selectedInstance._handleBackSpace(e.type)) { - // Cancel event - e.preventDefault(); - return false; - } - } - - tinyMCE.selectedElement = null; - tinyMCE.selectedNode = null; - var elm = tinyMCE.selectedInstance.getFocusElement(); - tinyMCE.linkElement = tinyMCE.getParentElement(elm, "a"); - tinyMCE.imgElement = tinyMCE.getParentElement(elm, "img"); - tinyMCE.selectedElement = elm; - - // Update visualaids on tabs - if (tinyMCE.isGecko && e.type == "keyup" && e.keyCode == 9) - tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(), true, tinyMCE.settings['visual']); - - // Run image/link fix on Gecko if diffrent document base on paste - if (tinyMCE.isGecko && tinyMCE.settings['document_base_url'] != "" + document.location.href && e.type == "keyup" && e.ctrlKey && e.keyCode == 86) - tinyMCE.selectedInstance.fixBrokenURLs(); - - // Insert space instead of   -/* if (e.type == "keydown" && e.keyCode == 32) { - if (tinyMCE.selectedInstance._insertSpace()) { - // Cancel event - e.returnValue = false; - e.cancelBubble = true; - return false; - } - }*/ - - // MSIE custom key handling - if (tinyMCE.isMSIE && tinyMCE.settings['custom_undo_redo']) { - // Check if it's a position key press - var keys = new Array(13,45,36,35,33,34,37,38,39,40); - var posKey = false; - for (var i=0; i 18 && e.keyCode != 255)) { - tinyMCE.selectedInstance.execCommand("mceAddUndoLevel"); - tinyMCE.selectedInstance.typing = true; - tinyMCE.triggerNodeChange(false); - } - - if (posKey && e.type == "keyup") - tinyMCE.triggerNodeChange(false); - - var keys = new Array(8,46); // Backspace,Delete - for (var i=0; i 0) { - for (var i=0; i" + this.convertStringToXML(String.fromCharCode(160)) + ""; - - // Is MSIE script element - if (tinyMCE.isMSIE && elementName == "script") - return "<" + elementName + elementAttribs + ">" + node.text + ""; - - // Clean up children - if (node.hasChildNodes()) { - // Force BR - if (elementName == "p" && tinyMCE.cleanup_force_br_newlines) - output += ""; - else - output += "<" + elementName + elementAttribs + ">"; - - for (var i=0; i"; - } else { - // Allways leave anchor elements open - if (openTag) - output += "<" + elementName + elementAttribs + ">"; - else { - // No children - output += "<" + elementName + elementAttribs + " />"; - } - } - - return output; - - case 3: // Text - // Do not convert script elements - if (node.parentNode.nodeName.toLowerCase() == "script") - return node.nodeValue; - - return this.convertStringToXML(node.nodeValue); - - case 8: // Comment - return ""; - - default: // Unknown - return "[UNKNOWN NODETYPE " + node.nodeType + "]"; - } -}; - -TinyMCE.prototype.convertStringToXML = function(html_data) { - var output = ""; - - for (var i=0; i 127) - output += '&#' + chr + ";"; - else - output += String.fromCharCode(chr); - - continue; - } - - // Raw entities - if (tinyMCE.settings['entity_encoding'] == "raw") { - output += String.fromCharCode(chr); - continue; - } - - // Named entities - if (typeof(tinyMCE.cleanup_entities["c" + chr]) != 'undefined' && tinyMCE.cleanup_entities["c" + chr] != '') - output += '&' + tinyMCE.cleanup_entities["c" + chr] + ';'; - else - output += '' + String.fromCharCode(chr); - } - - return output; -}; - -TinyMCE.prototype._getCleanupElementName = function(chunk) { - var pos; - - if (chunk.charAt(0) == '+') - chunk = chunk.substring(1); - - if ((pos = chunk.indexOf('/')) != -1) - chunk = chunk.substring(0, pos); - - if ((pos = chunk.indexOf('[')) != -1) - chunk = chunk.substring(0, pos); - - return chunk; -}; - -TinyMCE.prototype._initCleanup = function() { - // Parse valid elements and attributes - var validElements = tinyMCE.settings["valid_elements"]; - validElements = validElements.split(','); - - // Handle extended valid elements - var extendedValidElements = tinyMCE.settings["extended_valid_elements"]; - extendedValidElements = extendedValidElements.split(','); - for (var i=0; i[ \n\r]*
[ \n\r]*

', '
', 'gi'); - element.innerHTML = tinyMCE.regexpReplace(element.innerHTML, '', '', 'gi'); - } - - var html = this.cleanupNode(element); - - if (tinyMCE.settings['debug']) - alert("Cleanup process executed in: " + (new Date().getTime()-startTime) + " ms."); - - // Remove pesky HR paragraphs - html = tinyMCE.regexpReplace(html, '


', '
'); - html = tinyMCE.regexpReplace(html, '

 


 

', '
'); - - // Remove some mozilla crap - if (!tinyMCE.isMSIE) - html = html.replace(new RegExp('', 'g'), ""); - - if (tinyMCE.settings['apply_source_formatting']) { - html = html.replace(new RegExp('<(p|div)([^>]*)>', 'g'), "\n<$1$2>\n"); - html = html.replace(new RegExp('<\/(p|div)([^>]*)>', 'g'), "\n\n"); - html = html.replace(new RegExp('
', 'g'), "
\n"); - } - - if (tinyMCE.settings['force_br_newlines']) { - var re = new RegExp('

 

', 'g'); - html = html.replace(re, "
"); - } - - if (tinyMCE.settings['force_p_newlines']) { - // Remove weridness! - var re = new RegExp('<>', 'g'); - html = html.replace(re, ""); - } - - if (tinyMCE.settings['remove_linebreaks']) - html = html.replace(new RegExp('\r|\n', 'g'), ' '); - - // Call custom cleanup code - html = tinyMCE._customCleanup(on_save ? "get_from_editor" : "insert_to_editor", html); - - // Emtpy node, return empty - var chk = tinyMCE.regexpReplace(html, "[ \t\r\n]", ""); - if (chk == "
" || chk == "
" || chk == "

 

" || chk == "

 

" || chk == "

") - html = ""; - - if (tinyMCE.settings["preformatted"]) - return "
" + html + "
"; - - return html; -}; - -TinyMCE.prototype.setAttrib = function(element, name, value, no_fix_value) { - if (!no_fix_value && value != null) { - var re = new RegExp('[^0-9%]', 'g'); - value = value.replace(re, ''); - } - - if (value != null && value != "") - element.setAttribute(name, value); - else - element.removeAttribute(name); - - if (value != null && value != "") - element.setAttribute(name, value); - else - element.removeAttribute(name); -}; - -TinyMCE.prototype.insertLink = function(href, target, title, onclick, style_class) { - this.execCommand("mceAddUndoLevel"); - - if (this.selectedInstance && this.selectedElement && this.selectedElement.nodeName.toLowerCase() == "img") { - var doc = this.selectedInstance.getDoc(); - var linkElement = tinyMCE.getParentElement(this.selectedElement, "a"); - var newLink = false; - - if (!linkElement) { - linkElement = doc.createElement("a"); - newLink = true; - } - - href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, linkElement);"); - tinyMCE.setAttrib(linkElement, 'href', href); - tinyMCE.setAttrib(linkElement, 'target', target); - tinyMCE.setAttrib(linkElement, 'title', title); - tinyMCE.setAttrib(linkElement, 'mce_onclick', onclick); - tinyMCE.setAttrib(linkElement, 'class', style_class); - - if (newLink) { - linkElement.appendChild(this.selectedElement.cloneNode(true)); - this.selectedElement.parentNode.replaceChild(linkElement, this.selectedElement); - } - - return; - } - - if (!this.linkElement && this.selectedInstance) { - this.selectedInstance.contentDocument.execCommand("createlink", false, "#mce_temp_url#"); - tinyMCE.linkElement = this.getElementByAttributeValue(this.selectedInstance.contentDocument.body, "a", "href", "#mce_temp_url#"); - - var elementArray = this.getElementsByAttributeValue(this.selectedInstance.contentDocument.body, "a", "href", "#mce_temp_url#"); - - for (var i=0; i= strTok2.length) { - for (var i=0; i= strTok2.length || strTok1[i] != strTok2[i]) { - breakPoint = i + 1; - break; - } - } - } - - if (strTok1.length < strTok2.length) { - for (var i=0; i= strTok1.length || strTok1[i] != strTok2[i]) { - breakPoint = i + 1; - break; - } - } - } - - if (breakPoint == 1) - return url_to_relative; - - for (var i=0; i<(strTok1.length-(breakPoint-1)); i++) - outputString += "../"; - - for (var i=breakPoint-1; i=0; i--) { - if (baseURLParts[i].length == 0) - continue; - - newBaseURLParts[newBaseURLParts.length] = baseURLParts[i]; - } - baseURLParts = newBaseURLParts.reverse(); - - // Merge relURLParts chunks - var newRelURLParts = new Array(); - var numBack = 0; - for (var i=relURLParts.length-1; i>=0; i--) { - if (relURLParts[i].length == 0 || relURLParts[i] == ".") - continue; - - if (relURLParts[i] == '..') { - numBack++; - continue; - } - - if (numBack > 0) { - numBack--; - continue; - } - - newRelURLParts[newRelURLParts.length] = relURLParts[i]; - } - - relURLParts = newRelURLParts.reverse(); - - // Remove end from absolute path - var len = baseURLParts.length-numBack; - var absPath = (len <= 0 ? "" : "/") + baseURLParts.slice(0, len).join('/') + "/" + relURLParts.join('/'); - var start = "", end = ""; - - // Build start part - if (baseURL['protocol']) - start += baseURL['protocol'] + "://"; - - if (baseURL['host']) - start += baseURL['host']; - - if (baseURL['port']) - start += ":" + baseURL['port']; - - // Build end part - if (relURL['query']) - end += "?" + relURL['query']; - - if (relURL['anchor']) - end += "#" + relURL['anchor']; - - // Re-add trailing slash if it's removed - if (relative_url.charAt(relative_url.length-1) == "/") - end += "/"; - - return start + absPath + end; -}; - -TinyMCE.prototype.getParam = function(name, default_value, strip_whitespace, split_chr) { - var value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name]; - - // Fix bool values - if (value == "true" || value == "false") - return (value == "true"); - - if (strip_whitespace) - value = tinyMCE.regexpReplace(value, "[ \t\r\n]", ""); - - if (typeof(split_chr) != "undefined" && split_chr != null) { - value = value.split(split_chr); - var outArray = new Array(); - - for (var i=0; i 0); - - if (tinyMCE.settings['custom_undo_redo']) { - undoIndex = inst.undoIndex; - undoLevels = inst.undoLevels.length; - } - - tinyMCE.executeCallback('handleNodeChangeCallback', '_handleNodeChange', 0, editorId, elm, undoIndex, undoLevels, inst.visualAid, anySelection); - } - } - - if (this.selectedInstance && (typeof(focus) == "undefined" || focus)) - this.selectedInstance.contentWindow.focus(); -}; - -TinyMCE.prototype._customCleanup = function(type, content) { - // Call custom cleanup - var customCleanup = tinyMCE.settings['cleanup_callback']; - if (customCleanup != "" && eval("typeof(" + customCleanup + ")") != "undefined") - content = eval(customCleanup + "(type, content);"); - - // Trigger plugin cleanups - var plugins = tinyMCE.getParam('plugins', '', true, ','); - for (var i=0; i
'; - - div.innerHTML = html; - - document.body.appendChild(div); - - tinyMCE._currentDialog = id; - } - /*}*/ - } -}; - -TinyMCE.prototype.closeDialog = function() { - // Remove div or close window - if (tinyMCE.settings["dialog_type"] == "div") { - var div = document.getElementById(tinyMCE._currentDialog); - if (div) - div.parentNode.removeChild(div); - } else - window.close(); -}; - -TinyMCE.prototype.getVisualAidClass = function(class_name, state) { - var aidClass = tinyMCE.settings['visual_table_class']; - - if (typeof(state) == "undefined") - state = tinyMCE.settings['visual']; - - // Split - var classNames = new Array(); - var ar = class_name.split(' '); - for (var i=0; i 0) - className += " "; - - className += classNames[i]; - } - - return className; -}; - -TinyMCE.prototype.handleVisualAid = function(element, deep, state) { - if (!element) - return; - - var tableElement = null; - - switch (element.nodeName.toLowerCase()) { - case "table": - var oldW = element.style.width; - var oldH = element.style.height; - - element.className = tinyMCE.getVisualAidClass(element.className, state && element.getAttribute("border") == 0); - - element.style.width = oldW; - element.style.height = oldH; - - for (var y=0; y'; - return; - } - - break;*/ - } - - if (deep && element.hasChildNodes()) { - for (var i=0; i

breaks runtime? - if (tinyMCE.isMSIE) { - var re = new RegExp('


', 'g'); - html_content = html_content.replace(re, "
"); - } - - doc.body.innerHTML = html_content; - - // Content duplication bug fix - if (tinyMCE.isMSIE && tinyMCE.settings['fix_content_duplication']) { - // Remove P elements in P elements - var paras = doc.getElementsByTagName("P"); - for (var i=0; i<\/o:p>", "
"); - html = tinyMCE.regexpReplace(html, " <\/o:p>", ""); - html = tinyMCE.regexpReplace(html, "", ""); - html = tinyMCE.regexpReplace(html, "

<\/p>", ""); - html = tinyMCE.regexpReplace(html, "

<\/p>\r\n

<\/p>", ""); - html = tinyMCE.regexpReplace(html, "

 <\/p>", "
"); - html = tinyMCE.regexpReplace(html, "

\s*(

\s*)?", "

"); - html = tinyMCE.regexpReplace(html, "<\/p>\s*(<\/p>\s*)?", "

"); - } - - // Always set the htmlText output - doc.body.innerHTML = html; - } -}; - -TinyMCE.prototype.getImageSrc = function(str) { - var pos = -1; - - if (!str) - return ""; - - if ((pos = str.indexOf('this.src=')) != -1) { - var src = str.substring(pos + 10); - - src = src.substring(0, src.indexOf('\'')); - - return src; - } - - return ""; -}; - -TinyMCE.prototype._getElementById = function(element_id) { - var elm = document.getElementById(element_id); - if (!elm) { - // Check for element in forms - for (var j=0; j 0) { - var csses = null; - - // Just ignore any errors - eval("try {var csses = tinyMCE.isMSIE ? doc.styleSheets(0).rules : doc.styleSheets[0].cssRules;} catch(e) {}"); - if (!csses) - return new Array(); - - for (var i=0; i 0) - tinyMCE.cssClasses = output; - - return output; -}; - -TinyMCE.prototype.regexpReplace = function(in_str, reg_exp, replace_str, opts) { - if (typeof(opts) == "undefined") - opts = 'g'; - - var re = new RegExp(reg_exp, opts); - return in_str.replace(re, replace_str); -}; - -TinyMCE.prototype.cleanupEventStr = function(str) { - str = "" + str; - str = str.replace('function anonymous()\n{\n', ''); - str = str.replace('\n}', ''); - - return str; -}; - -TinyMCE.prototype.getAbsPosition = function(node) { - var pos = new Object(); - - pos.absLeft = pos.absTop = 0; - - var parentNode = node; - while (parentNode) { - pos.absLeft += parentNode.offsetLeft; - pos.absTop += parentNode.offsetTop; - - parentNode = parentNode.offsetParent; - } - - return pos; -}; - -TinyMCE.prototype.openFileBrowser = function(field_name, url, type, win) { - var cb = tinyMCE.getParam("file_browser_callback"); - - this.setWindowArg("window", win); - - // Call to external callback - if(eval('typeof('+cb+')') == "undefined") - alert("Callback function: " + cb + " could not be found."); - else - eval(cb + "(field_name, url, type, win);"); -}; - -TinyMCE.prototype.getControlHTML = function(control_name) { - var themePlugins = tinyMCE.getParam('plugins', '', true, ','); - var templateFunction; - - // Is it defined in any plugins - for (var i=themePlugins.length; i>=0; i--) { - templateFunction = 'TinyMCE_' + themePlugins[i] + "_getControlHTML"; - if (eval("typeof(" + templateFunction + ")") != 'undefined') { - var html = eval(templateFunction + "('" + control_name + "');"); - if (html != "") - return tinyMCE.replaceVar(html, "pluginurl", tinyMCE.baseURL + "/plugins/" + themePlugins[i]); - } - } - - return eval('TinyMCE_' + tinyMCE.settings['theme'] + "_getControlHTML" + "('" + control_name + "');"); -}; - -TinyMCE.prototype._themeExecCommand = function(editor_id, element, command, user_interface, value) { - var themePlugins = tinyMCE.getParam('plugins', '', true, ','); - var templateFunction; - - // Is it defined in any plugins - for (var i=themePlugins.length; i>=0; i--) { - templateFunction = 'TinyMCE_' + themePlugins[i] + "_execCommand"; - if (eval("typeof(" + templateFunction + ")") != 'undefined') { - if (eval(templateFunction + "(editor_id, element, command, user_interface, value);")) - return true; - } - } - - // Theme funtion - templateFunction = 'TinyMCE_' + tinyMCE.settings['theme'] + "_execCommand"; - if (eval("typeof(" + templateFunction + ")") != 'undefined') - return eval(templateFunction + "(editor_id, element, command, user_interface, value);"); - - // Pass to normal - return false; -}; - -TinyMCE.prototype._getThemeFunction = function(suffix, skip_plugins) { - if (skip_plugins) - return 'TinyMCE_' + tinyMCE.settings['theme'] + suffix; - - var themePlugins = tinyMCE.getParam('plugins', '', true, ','); - var templateFunction; - - // Is it defined in any plugins - for (var i=themePlugins.length; i>=0; i--) { - templateFunction = 'TinyMCE_' + themePlugins[i] + suffix; - if (eval("typeof(" + templateFunction + ")") != 'undefined') - return templateFunction; - } - - return 'TinyMCE_' + tinyMCE.settings['theme'] + suffix; -}; - - -TinyMCE.prototype.isFunc = function(func_name) { - if (func_name == null || func_name == "") - return false; - - return eval("typeof(" + func_name + ")") != "undefined"; -}; - -TinyMCE.prototype.exec = function(func_name, args) { - var str = func_name + '('; - - // Add all arguments - for (var i=3; i 1 && tinyMCE.currentConfig != this.settings['index']) { - tinyMCE.settings = this.settings; - tinyMCE.currentConfig = this.settings['index']; - } -}; - -TinyMCEControl.prototype.fixBrokenURLs = function() { - var body = this.getBody(); - - var elms = body.getElementsByTagName("img"); - for (var i=0; i 0) - rng.selectNodeContents(nodes[0]); - else - rng.selectNodeContents(node); - } else - rng.selectNode(node); - - if (collapse) { - // Special treatment of textnode collapse - if (!to_start && node.nodeType == 3) { - rng.setStart(node, node.nodeValue.length); - rng.setEnd(node, node.nodeValue.length); - } else - rng.collapse(to_start); - } - - sel.removeAllRanges(); - sel.addRange(rng); - } - - this.scrollToNode(node); - - // Set selected element - tinyMCE.selectedElement = null; - if (node.nodeType == 1) - tinyMCE.selectedElement = node; -}; - -TinyMCEControl.prototype.scrollToNode = function(node) { - // Scroll to node position - var pos = tinyMCE.getAbsPosition(node); - var doc = this.getDoc(); - var scrollX = doc.body.scrollLeft + doc.documentElement.scrollLeft; - var scrollY = doc.body.scrollTop + doc.documentElement.scrollTop; - var height = tinyMCE.isMSIE ? document.getElementById(this.editorId).style.pixelHeight : this.targetElement.clientHeight; - - // Only scroll if out of visible area - if (!tinyMCE.settings['auto_resize'] && !(node.absTop > scrollY && node.absTop < (scrollY - 25 + height))) - this.contentWindow.scrollTo(pos.absLeft, pos.absTop - height + 25); -}; - -TinyMCEControl.prototype.getBody = function() { - return this.getDoc().body; -}; - -TinyMCEControl.prototype.getDoc = function() { - return this.contentWindow.document; -}; - -TinyMCEControl.prototype.getWin = function() { - return this.contentWindow; -}; - -TinyMCEControl.prototype.getSel = function() { - if (tinyMCE.isMSIE) - return this.getDoc().selection; - - var sel = this.contentWindow.getSelection(); - - // Fake getRangeAt - if (tinyMCE.isSafari && !sel.getRangeAt) { - var newSel = new Object(); - var doc = this.getDoc(); - - function getRangeAt(idx) { - var rng = new Object(); - - rng.startContainer = this.focusNode; - rng.endContainer = this.anchorNode; - rng.commonAncestorContainer = this.focusNode; - rng.createContextualFragment = function (html) { - // Seems to be a tag - if (html.charAt(0) == '<') { - var elm = doc.createElement("div"); - - elm.innerHTML = html; - - return elm.firstChild; - } - - return doc.createTextNode("UNSUPPORTED, DUE TO LIMITATIONS IN SAFARI!"); - }; - - rng.deleteContents = function () { - doc.execCommand("Delete", false, ""); - }; - - return rng; - } - - // Patch selection - - newSel.focusNode = sel.baseNode; - newSel.focusOffset = sel.baseOffset; - newSel.anchorNode = sel.extentNode; - newSel.anchorOffset = sel.extentOffset; - newSel.getRangeAt = getRangeAt; - newSel.text = "" + sel; - newSel.realSelection = sel; - - newSel.toString = function () {return this.text;}; - - return newSel; - } - - return sel; -}; - -TinyMCEControl.prototype.getRng = function() { - var sel = this.getSel(); - if (sel == null) - return null; - - if (tinyMCE.isMSIE) - return sel.createRange(); - - return this.getSel().getRangeAt(0); -}; - -TinyMCEControl.prototype._insertPara = function(e) { - function isEmpty(para) { - function isEmptyHTML(html) { - return html.replace(new RegExp('[ \t\r\n]+', 'g'), '').toLowerCase() == ""; - } - - // Check for images - if (para.getElementsByTagName("img").length > 0) - return false; - - // Check for tables - if (para.getElementsByTagName("table").length > 0) - return false; - - // Check for HRs - if (para.getElementsByTagName("hr").length > 0) - return false; - - // Check all textnodes - var nodes = tinyMCE.getNodeTree(para, new Array(), 3); - for (var i=0; i <" + blockName + "> "; - paraAfter = body.childNodes[1]; - } - - this.selectNode(paraAfter, true, true); - - return true; - } - - // Place first part within new paragraph - if (startChop.nodeName == blockName) - rngBefore.setStart(startChop, 0); - else - rngBefore.setStartBefore(startChop); - rngBefore.setEnd(startNode, startOffset); - paraBefore.appendChild(rngBefore.cloneContents()); - - // Place secound part within new paragraph - rngAfter.setEndAfter(endChop); - rngAfter.setStart(endNode, endOffset); - var contents = rngAfter.cloneContents(); - if (contents.firstChild && contents.firstChild.nodeName == blockName) { - var nodes = contents.firstChild.childNodes; - for (var i=0; i 0) - rng.pasteHTML('
' + rng.htmlText + "
"); - - tinyMCE.triggerNodeChange(); - return; - } - } - } - - switch (command) { - case "mceSelectNode": - this.selectNode(value); - tinyMCE.triggerNodeChange(); - tinyMCE.selectedNode = value; - break; - - case "FormatBlock": - if (value == null || value == "") { - var elm = tinyMCE.getParentElement(this.getFocusElement(), "p,div,h1,h2,h3,h4,h5,h6,pre,address"); - - if (elm) - this.execCommand("mceRemoveNode", false, elm); - } else - this.getDoc().execCommand("FormatBlock", false, value); - - tinyMCE.triggerNodeChange(); - - break; - - case "mceRemoveNode": - if (!value) - value = tinyMCE.getParentElement(this.getFocusElement()); - - if (tinyMCE.isMSIE) { - value.outerHTML = value.innerHTML; - } else { - var rng = value.ownerDocument.createRange(); - rng.setStartBefore(value); - rng.setEndAfter(value); - rng.deleteContents(); - rng.insertNode(rng.createContextualFragment(value.innerHTML)); - } - - tinyMCE.triggerNodeChange(); - - break; - - case "mceSelectNodeDepth": - var parentNode = this.getFocusElement(); - for (var i=0; parentNode; i++) { - if (parentNode.nodeName.toLowerCase() == "body") - break; - - if (parentNode.nodeName.toLowerCase() == "#text") { - i--; - parentNode = parentNode.parentNode; - continue; - } - - if (i == value) { - this.selectNode(parentNode, false); - tinyMCE.triggerNodeChange(); - tinyMCE.selectedNode = parentNode; - return; - } - - parentNode = parentNode.parentNode; - } - - break; - - case "HiliteColor": - if (tinyMCE.isGecko) { - this.getDoc().execCommand("useCSS", false, false); - this.getDoc().execCommand('hilitecolor', false, value); - this.getDoc().execCommand("useCSS", false, true); - } else - this.getDoc().execCommand('BackColor', false, value); - - break; - - case "Cut": - case "Copy": - case "Paste": - var cmdFailed = false; - - // Try executing command - eval('try {this.getDoc().execCommand(command, user_interface, value);} catch (e) {cmdFailed = true;}'); - - // Alert error in gecko if command failed - if (tinyMCE.isGecko && cmdFailed) { - // Confirm more info - if (confirm(tinyMCE.getLang('lang_clipboard_msg'))) - window.open('http://www.mozilla.org/editor/midasdemo/securityprefs.html', 'mceExternal'); - - return; - } else - tinyMCE.triggerNodeChange(); - break; - - case "mceSetContent": - if (!value) - value = ""; - - // Call custom cleanup code - value = tinyMCE._customCleanup("insert_to_editor", value); - tinyMCE._setHTML(doc, value); - doc.body.innerHTML = tinyMCE._cleanupHTML(doc, tinyMCE.settings, doc.body); - tinyMCE.handleVisualAid(doc.body, true, this.visualAid); - return true; - - case "mceLink": - var selectedText = ""; - - if (tinyMCE.isMSIE) { - var rng = doc.selection.createRange(); - selectedText = rng.text; - } else - selectedText = this.getSel().toString(); - - if (!tinyMCE.linkElement) { - if ((tinyMCE.selectedElement.nodeName.toLowerCase() != "img") && (selectedText.length <= 0)) - return; - } - - var href = "", target = "", title = "", onclick = "", action = "insert", style_class = ""; - - if (tinyMCE.selectedElement.nodeName.toLowerCase() == "a") - tinyMCE.linkElement = tinyMCE.selectedElement; - - // Is anchor not a link - if (tinyMCE.linkElement != null && tinyMCE.getAttrib(tinyMCE.linkElement, 'href') == "") - tinyMCE.linkElement = null; - - if (tinyMCE.linkElement) { - href = tinyMCE.getAttrib(tinyMCE.linkElement, 'href'); - target = tinyMCE.getAttrib(tinyMCE.linkElement, 'target'); - title = tinyMCE.getAttrib(tinyMCE.linkElement, 'title'); - onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'mce_onclick'); - style_class = tinyMCE.getAttrib(tinyMCE.linkElement, 'class'); - - // Try old onclick to if copy/pasted content - if (onclick == "") - onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick'); - - onclick = tinyMCE.cleanupEventStr(onclick); - - // Fix for drag-drop/copy paste bug in Mozilla - mceRealHref = tinyMCE.getAttrib(tinyMCE.linkElement, 'mce_real_href'); - if (mceRealHref != "") - href = mceRealHref; - - href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);"); - action = "update"; - } - - if (this.settings['insertlink_callback']) { - var returnVal = eval(this.settings['insertlink_callback'] + "(href, target, title, onclick, action, style_class);"); - if (returnVal && returnVal['href']) - tinyMCE.insertLink(returnVal['href'], returnVal['target'], returnVal['title'], returnVal['onclick'], returnVal['style_class']); - } else { - tinyMCE.openWindow(this.insertLinkTemplate, {href : href, target : target, title : title, onclick : onclick, action : action, className : style_class}); - } - break; - - case "mceAttachment": - var selectedText = ""; - - if (tinyMCE.isMSIE) { - var rng = doc.selection.createRange(); - selectedText = rng.text; - } else - selectedText = this.getSel().toString(); - - if (!tinyMCE.linkElement) { - if ((tinyMCE.selectedElement.nodeName.toLowerCase() != "img") && (selectedText.length <= 0)) - return; - } - - var href = "", target = "", title = "", onclick = "", action = "insert"; - - if (tinyMCE.selectedElement.nodeName.toLowerCase() == "a") - tinyMCE.linkElement = tinyMCE.selectedElement; - - // Is anchor not a link - if (tinyMCE.linkElement != null && tinyMCE.getAttrib(tinyMCE.linkElement, 'href') == "") - tinyMCE.linkElement = null; - - if (tinyMCE.linkElement) { - href = tinyMCE.getAttrib(tinyMCE.linkElement, 'href'); - target = tinyMCE.getAttrib(tinyMCE.linkElement, 'target'); - title = tinyMCE.getAttrib(tinyMCE.linkElement, 'title'); - onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'mce_onclick'); - - // Try old onclick to if copy/pasted content - if (onclick == "") - onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick'); - - onclick = tinyMCE.cleanupEventStr(onclick); - - // Fix for drag-drop/copy paste bug in Mozilla - mceRealHref = tinyMCE.getAttrib(tinyMCE.linkElement, 'mce_real_href'); - if (mceRealHref != "") - href = mceRealHref; - - href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);"); - action = "update"; - } - - if (this.settings['insertlink_callback']) { - var returnVal = eval(this.settings['insertlink_callback'] + "(href, target, title, onclick, action);"); - if (returnVal && returnVal['href']) - tinyMCE.insertLink(returnVal['href'], returnVal['target'], returnVal['title'], returnVal['onclick']); - } else { - tinyMCE.openWindow(this.insertAttachmentTemplate, {href : href, target : target, title : title, onclick : onclick, action : action}); - } - break; - - case "mceImage": - var src = "", alt = "", border = "", hspace = "", vspace = "", width = "", height = "", align = ""; - var title = "", onmouseover = "", onmouseout = "", action = "insert"; - var img = tinyMCE.imgElement; - - if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") { - img = tinyMCE.selectedElement; - tinyMCE.imgElement = img; - } - - if (img) { - // Is it a internal MCE visual aid image, then skip this one. - if (tinyMCE.getAttrib(img, 'name').indexOf('mce_') == 0) - return; - - src = tinyMCE.getAttrib(img, 'src'); - alt = tinyMCE.getAttrib(img, 'alt'); - - // Try polling out the title - if (alt == "") - alt = tinyMCE.getAttrib(img, 'title'); - - // Fix width/height attributes if the styles is specified - if (tinyMCE.isGecko) { - var w = img.style.width; - if (w != null && w != "") - img.setAttribute("width", w); - - var h = img.style.height; - if (h != null && h != "") - img.setAttribute("height", h); - } - - border = tinyMCE.getAttrib(img, 'border'); - hspace = tinyMCE.getAttrib(img, 'hspace'); - vspace = tinyMCE.getAttrib(img, 'vspace'); - width = tinyMCE.getAttrib(img, 'width'); - height = tinyMCE.getAttrib(img, 'height'); - align = tinyMCE.getAttrib(img, 'align'); - onmouseover = tinyMCE.getAttrib(img, 'onmouseover'); - onmouseout = tinyMCE.getAttrib(img, 'onmouseout'); - title = tinyMCE.getAttrib(img, 'title'); - - // Is realy specified? - if (tinyMCE.isMSIE) { - width = img.attributes['width'].specified ? width : ""; - height = img.attributes['height'].specified ? height : ""; - } - - onmouseover = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseover)); - onmouseout = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseout)); - - // Fix for drag-drop/copy paste bug in Mozilla - mceRealSrc = tinyMCE.getAttrib(img, 'mce_real_src'); - if (mceRealSrc != "") - src = mceRealSrc; - - src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);"); - - if (onmouseover != "") - onmouseover = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseover, img, true);"); - - if (onmouseout != "") - onmouseout = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseout, img, true);"); - - action = "update"; - } - - if (this.settings['insertimage_callback']) { - var returnVal = eval(this.settings['insertimage_callback'] + "(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout, action);"); - if (returnVal && returnVal['src']) - tinyMCE.insertImage(returnVal['src'], returnVal['alt'], returnVal['border'], returnVal['hspace'], returnVal['vspace'], returnVal['width'], returnVal['height'], returnVal['align'], returnVal['title'], returnVal['onmouseover'], returnVal['onmouseout']); - } else - tinyMCE.openWindow(this.insertImageTemplate, {src : src, alt : alt, border : border, hspace : hspace, vspace : vspace, width : width, height : height, align : align, title : title, onmouseover : onmouseover, onmouseout : onmouseout, action : action}); - break; - - case "mceCleanupWord": - if (tinyMCE.isMSIE) { - var html = this.getBody().createTextRange().htmlText; - - if (html.indexOf('="mso') != -1) { - tinyMCE._setHTML(this.contentDocument, this.getBody().innerHTML); - html = tinyMCE._cleanupHTML(this.contentDocument, this.settings, this.getBody(), this.visualAid); - } - - this.getBody().innerHTML = html; - } - break; - - case "mceCleanup": - tinyMCE._setHTML(this.contentDocument, this.getBody().innerHTML); - this.getBody().innerHTML = tinyMCE._cleanupHTML(this.contentDocument, this.settings, this.getBody(), this.visualAid); - tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid); - this.repaint(); - tinyMCE.triggerNodeChange(); - break; - - case "mceAnchor": - if (!user_interface) { - var aElm = tinyMCE.getParentElement(this.getFocusElement(), "a", "name"); - if (aElm) { - if (value == null || value == "") { - if (tinyMCE.isMSIE) { - aElm.outerHTML = aElm.innerHTML; - } else { - var rng = aElm.ownerDocument.createRange(); - rng.setStartBefore(aElm); - rng.setEndAfter(aElm); - rng.deleteContents(); - rng.insertNode(rng.createContextualFragment(aElm.innerHTML)); - } - } else - aElm.setAttribute('name', value); - } else { - this.getDoc().execCommand("fontname", false, "#mce_temp_font#"); - var elementArray = tinyMCE.getElementsByAttributeValue(this.getBody(), "font", "face", "#mce_temp_font#"); - for (var x=0; x 0) { - value = tinyMCE.replaceVar(value, "selection", selectedText); - tinyMCE.execCommand('mceInsertContent', false, value); - } - - tinyMCE.triggerNodeChange(); - break; - - case "mceSetAttribute": - if (typeof(value) == 'object') { - var targetElms = (typeof(value['targets']) == "undefined") ? "p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address" : value['targets']; - var targetNode = tinyMCE.getParentElement(this.getFocusElement(), targetElms); - - if (targetNode) { - targetNode.setAttribute(value['name'], value['value']); - tinyMCE.triggerNodeChange(); - } - } - break; - - case "mceSetCSSClass": - var selectedText = false; - - if (tinyMCE.isMSIE) { - var rng = doc.selection.createRange(); - selectedText = (rng.text && rng.text.length > 0); - } else - selectedText = (this.getSel().toString().length > 0); - - // Use selectedNode instead if defined - if (tinyMCE.selectedNode) - tinyMCE.selectedElement = tinyMCE.selectedNode; - - if (selectedText && !tinyMCE.selectedNode) { - this.getDoc().execCommand("RemoveFormat", false, null); - if (value == null) - return this.execCommand("RemoveFormat", false, null); - - this.getDoc().execCommand("fontname", false, "#mce_temp_font#"); - var elementArray = tinyMCE.getElementsByAttributeValue(this.getBody(), "font", "face", "#mce_temp_font#"); - - // Change them all - for (var x=0; x customUndoLevels) { - for (var i=0; i 0) { - this.undoIndex--; - this.getBody().innerHTML = this.undoLevels[this.undoIndex]; - } - - // debug("Undo - undo levels:" + this.undoLevels.length + ", undo index: " + this.undoIndex); - tinyMCE.triggerNodeChange(); - } else - this.getDoc().execCommand(command, user_interface, value); - break; - - case "Redo": - if (tinyMCE.settings['custom_undo_redo']) { - if (this.undoIndex < (this.undoLevels.length-1)) { - this.undoIndex++; - this.getBody().innerHTML = this.undoLevels[this.undoIndex]; - // debug("Redo - undo levels:" + this.undoLevels.length + ", undo index: " + this.undoIndex); - } - - tinyMCE.triggerNodeChange(); - } else - this.getDoc().execCommand(command, user_interface, value); - break; - - case "mceToggleVisualAid": - this.visualAid = !this.visualAid; - tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid); - tinyMCE.triggerNodeChange(); - break; - - case "removeformat": - var text = this.getSelectedText(); - - if (tinyMCE.isMSIE) { - try { - win.focus(); - var rng = doc.selection.createRange(); - rng.execCommand("RemoveFormat", false, null); - rng.pasteHTML(rng.text); - } catch (e) { - // Do nothing - } - } else - this.getDoc().execCommand(command, user_interface, value); - - // Remove class - if (text.length == 0) - this.execCommand("mceSetCSSClass", false, ""); - - tinyMCE.triggerNodeChange(); - break; - - default: - this.getDoc().execCommand(command, user_interface, value); - tinyMCE.triggerNodeChange(); - } -}; - -TinyMCEControl.prototype.queryCommandValue = function(command) { - return this.getDoc().queryCommandValue(command); -}; - -TinyMCEControl.prototype.queryCommandState = function(command) { - return this.getDoc().queryCommandState(command); -}; - -TinyMCEControl.prototype.onAdd = function(replace_element, form_element_name, target_document) { - var targetDoc = target_document ? target_document : document; - - this.targetDoc = targetDoc; - - tinyMCE.themeURL = tinyMCE.baseURL + "/themes/" + this.settings['theme']; - this.settings['themeurl'] = tinyMCE.themeURL; - - if (!replace_element) { - alert("Error: Could not find the target element."); - return false; - } - - var templateFunction = tinyMCE._getThemeFunction('_getInsertLinkTemplate'); - if (eval("typeof(" + templateFunction + ")") != 'undefined') - this.insertLinkTemplate = eval(templateFunction + '(this.settings);'); - - var templateFunction = tinyMCE._getThemeFunction('_getInsertAttachmentTemplate'); - if (eval("typeof(" + templateFunction + ")") != 'undefined') - this.insertAttachmentTemplate = eval(templateFunction + '(this.settings);'); - - var templateFunction = tinyMCE._getThemeFunction('_getInsertImageTemplate'); - if (eval("typeof(" + templateFunction + ")") != 'undefined') - this.insertImageTemplate = eval(templateFunction + '(this.settings);'); - - var templateFunction = tinyMCE._getThemeFunction('_getEditorTemplate'); - if (eval("typeof(" + templateFunction + ")") == 'undefined') { - alert("Error: Could not find the template function: " + templateFunction); - return false; - } - - var editorTemplate = eval(templateFunction + '(this.settings, this.editorId);'); - - var deltaWidth = editorTemplate['delta_width'] ? editorTemplate['delta_width'] : 0; - var deltaHeight = editorTemplate['delta_height'] ? editorTemplate['delta_height'] : 0; - var html = '' + editorTemplate['html']; - - var templateFunction = tinyMCE._getThemeFunction('_handleNodeChange', true); - if (eval("typeof(" + templateFunction + ")") != 'undefined') - this.settings['handleNodeChangeCallback'] = templateFunction; - - html = tinyMCE.replaceVar(html, "editor_id", this.editorId); - html = tinyMCE.replaceVar(html, "default_document", tinyMCE.baseURL + "/blank.htm"); - this.settings['default_document'] = tinyMCE.baseURL + "/blank.htm"; - - this.settings['old_width'] = this.settings['width']; - this.settings['old_height'] = this.settings['height']; - - // Set default width, height - if (this.settings['width'] == -1) - this.settings['width'] = replace_element.offsetWidth; - - if (this.settings['height'] == -1) - this.settings['height'] = replace_element.offsetHeight; - - // Try the style width - if (this.settings['width'] == 0) - this.settings['width'] = replace_element.style.width; - - // Try the style height - if (this.settings['height'] == 0) - this.settings['height'] = replace_element.style.height; - - // If no width/height then default to 320x240, better than nothing - if (this.settings['width'] == 0) - this.settings['width'] = 320; - - if (this.settings['height'] == 0) - this.settings['height'] = 240; - - this.settings['area_width'] = parseInt(this.settings['width']); - this.settings['area_height'] = parseInt(this.settings['height']); - this.settings['area_width'] += deltaWidth; - this.settings['area_height'] += deltaHeight; - - // Special % handling - if (("" + this.settings['width']).indexOf('%') != -1) - this.settings['area_width'] = "100%"; - - if (("" + this.settings['height']).indexOf('%') != -1) - this.settings['area_height'] = "100%"; - - if (("" + replace_element.style.width).indexOf('%') != -1) { - this.settings['width'] = replace_element.style.width; - this.settings['area_width'] = "100%"; - } - - if (("" + replace_element.style.height).indexOf('%') != -1) { - this.settings['height'] = replace_element.style.height; - this.settings['area_height'] = "100%"; - } - - html = tinyMCE.applyTemplate(html); - - this.settings['width'] = this.settings['old_width']; - this.settings['height'] = this.settings['old_height']; - - this.visualAid = this.settings['visual']; - this.formTargetElementId = form_element_name; - - // Get replace_element contents - if (replace_element.nodeName.toLowerCase() == "textarea") - this.startContent = replace_element.value; - else - this.startContent = replace_element.innerHTML; - - // If not text area - if (replace_element.nodeName.toLowerCase() != "textarea") { - this.oldTargetElement = replace_element.cloneNode(true); - - // Debug mode - if (tinyMCE.settings['debug']) - html += ''; - else - html += ''; - - html += ''; - - // Output HTML and set editable - if (!tinyMCE.isMSIE) { - var rng = replace_element.ownerDocument.createRange(); - rng.setStartBefore(replace_element); - - var fragment = rng.createContextualFragment(html); - replace_element.parentNode.replaceChild(fragment, replace_element); - } else - replace_element.outerHTML = html; - } else { - html += ''; - - // Just hide the textarea element - this.oldTargetElement = replace_element; - - if (!tinyMCE.settings['debug']) - this.oldTargetElement.style.display = "none"; - - // Output HTML and set editable - if (!tinyMCE.isMSIE) { - var rng = replace_element.ownerDocument.createRange(); - rng.setStartBefore(replace_element); - - var fragment = rng.createContextualFragment(html); - replace_element.parentNode.insertBefore(fragment, replace_element); - } else - replace_element.insertAdjacentHTML("beforeBegin", html); - } - - // Setup iframe - var dynamicIFrame = false; - var tElm = targetDoc.getElementById(this.editorId); - - if (!tinyMCE.isMSIE) { - if (tElm && tElm.nodeName.toLowerCase() == "span") { - tElm = tinyMCE._createIFrame(tElm); - dynamicIFrame = true; - } - - this.targetElement = tElm; - this.iframeElement = tElm; - this.contentDocument = tElm.contentDocument; - this.contentWindow = tElm.contentWindow; - - //this.getDoc().designMode = "on"; - } else { - if (tElm && tElm.nodeName.toLowerCase() == "span") - tElm = tinyMCE._createIFrame(tElm); - else - tElm = targetDoc.frames[this.editorId]; - - this.targetElement = tElm; - this.iframeElement = targetDoc.getElementById(this.editorId); - this.contentDocument = tElm.window.document; - this.contentWindow = tElm.window; - this.getDoc().designMode = "on"; - } - - // Setup base HTML - var doc = this.contentDocument; - if (dynamicIFrame) { - var html = "" - + '' - + '' - + '' - + '' - + 'blank_page' - + '' - + '' - + '' - + '' - + ''; - - try { - this.getDoc().designMode = "on"; - doc.open(); - doc.write(html); - doc.close(); - } catch (e) { - // Failed Mozilla 1.3 - this.getDoc().location.href = tinyMCE.baseURL + "/blank.htm"; - } - } - - // This timeout is needed in MSIE 5.5 for some odd reason - // it seems that the document.frames isn't initialized yet? - if (tinyMCE.isMSIE) - window.setTimeout("TinyMCE.prototype.addEventHandlers('" + this.editorId + "');", 1); - - tinyMCE.setupContent(this.editorId, true); - - return true; -}; - -TinyMCEControl.prototype.getFocusElement = function() { - if (tinyMCE.isMSIE) { - var doc = this.getDoc(); - var rng = doc.selection.createRange(); - - if (rng.collapse) - rng.collapse(true); - - var elm = rng.item ? rng.item(0) : rng.parentElement(); - } else { - var sel = this.getSel(); - var elm = (sel && sel.anchorNode) ? sel.anchorNode : null; - - if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") - elm = tinyMCE.selectedElement; - } - - return elm; -}; - -// Global instances -var tinyMCE = new TinyMCE(); -var tinyMCELang = new Array(); - -function debug() { - var msg = ""; - - var elm = document.getElementById("tinymce_debug"); - if (!elm) { - var debugDiv = document.createElement("div"); - debugDiv.setAttribute("className", "debugger"); - debugDiv.className = "debugger"; - debugDiv.innerHTML = '\ - Debug output:\ - '; - - document.body.appendChild(debugDiv); - elm = document.getElementById("tinymce_debug"); - } - - var args = this.debug.arguments; - for (var i=0; i 0 -end - -puts "Done - #{total_replacements} total replacements made." diff --git a/script/localize b/script/localize deleted file mode 100755 index 1757ecf..0000000 --- a/script/localize +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env ruby - -# we need fileutils for easy file access -require 'fileutils' -require 'rubygems' -include FileUtils -# we will need the modified rgettext.rb that can read erb templates -require File.dirname(__FILE__) + '/rgettext' - - -# RAILS_ROOT is just one up -RAILS_ROOT = File.expand_path(File.dirname(__FILE__) + '/..') -# $DEBUG = true -# goto RAILS_ROOT so we can address all files relatively from there -Dir.chdir(RAILS_ROOT) - -# the potfile will hold the temporary data before it is merged; note the -# filename .messages.pot (if you don't prepend a dot to the filename Dir.glob -# will get confused later on) -potfile = "#{RAILS_ROOT}/locale/.messages.pot" - -# if the potfile exists from the previous run, delete it -rm_f potfile - -# directories and extensions to harvest -dirpattern = '{app,components,config,custom,lib}' -extpattern = 'r{b,html,xml}' -files = Dir.glob("#{dirpattern}/**/*.#{extpattern}") - -# run the harvester on the collected filenames and output to potfile -RGettext.new.start files, potfile - -# now iterate through all locale dirs and update/merge -Dir.glob('locale/*').each do |dir| - # check if every dir has a pofile to begin with, else msmerge will fail - # if not, use the potfile and don't merge - pofile = "#{RAILS_ROOT}/#{dir}/LC_MESSAGES/messages.po" - if File.exists?(pofile) - print "Updating pofile #{pofile} " - system "msgmerge --force-po --no-location --update #{pofile} #{potfile}" - else - print "The pofile '#{pofile}' does not exist. I will create it for you " - path_to_pofile = File.dirname(pofile) - mkdir path_to_pofile unless File.exists?(path_to_pofile) - cp potfile, pofile - puts ' .... done.' - end -end diff --git a/script/performance/benchmarker b/script/performance/benchmarker deleted file mode 100755 index 462cae1..0000000 --- a/script/performance/benchmarker +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/ruby18 -require File.dirname(__FILE__) + '/../../config/boot' -require 'commands/performance/benchmarker' diff --git a/script/performance/profiler b/script/performance/profiler deleted file mode 100755 index 8b3a633..0000000 --- a/script/performance/profiler +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/ruby18 -require File.dirname(__FILE__) + '/../../config/boot' -require 'commands/performance/profiler' diff --git a/script/performance/request b/script/performance/request deleted file mode 100755 index ae3f38c..0000000 --- a/script/performance/request +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../../config/boot' -require 'commands/performance/request' diff --git a/script/plugin b/script/plugin deleted file mode 100755 index 87cd207..0000000 --- a/script/plugin +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../config/boot' -require 'commands/plugin' diff --git a/script/process/inspector b/script/process/inspector deleted file mode 100755 index bf25ad8..0000000 --- a/script/process/inspector +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../../config/boot' -require 'commands/process/inspector' diff --git a/script/process/reaper b/script/process/reaper deleted file mode 100755 index af0b34d..0000000 --- a/script/process/reaper +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/ruby18 -require File.dirname(__FILE__) + '/../../config/boot' -require 'commands/process/reaper' diff --git a/script/process/spawner b/script/process/spawner deleted file mode 100755 index ffb55ae..0000000 --- a/script/process/spawner +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/ruby18 -require File.dirname(__FILE__) + '/../../config/boot' -require 'commands/process/spawner' diff --git a/script/process/spinner b/script/process/spinner deleted file mode 100755 index c1ce730..0000000 --- a/script/process/spinner +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/ruby18 -require File.dirname(__FILE__) + '/../../config/boot' -require 'commands/process/spinner' diff --git a/script/profiler b/script/profiler deleted file mode 100755 index 77c9fbe..0000000 --- a/script/profiler +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env ruby -if ARGV.empty? - $stderr.puts "Usage: profiler 'Person.expensive_method(10)' [times]" - exit(1) -end - -# Keep the expensive require out of the profile. -$stderr.puts 'Loading Rails...' -require File.dirname(__FILE__) + '/../config/environment' - -# Define a method to profile. -if ARGV[1] and ARGV[1].to_i > 1 - eval "def profile_me() #{ARGV[1]}.times { #{ARGV[0]} } end" -else - eval "def profile_me() #{ARGV[0]} end" -end - -# Use the ruby-prof extension if available. Fall back to stdlib profiler. -begin - require 'prof' - $stderr.puts 'Using the ruby-prof extension.' - Prof.clock_mode = Prof::GETTIMEOFDAY - Prof.start - profile_me - results = Prof.stop - require 'rubyprof_ext' - Prof.print_profile(results, $stderr) -rescue LoadError - $stderr.puts 'Using the standard Ruby profiler.' - Profiler__.start_profile - profile_me - Profiler__.stop_profile - Profiler__.print_profile($stderr) -end diff --git a/script/rails b/script/rails new file mode 100755 index 0000000..b97de07 --- /dev/null +++ b/script/rails @@ -0,0 +1,6 @@ +#!/usr/bin/env ruby18 +# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application. + +APP_PATH = File.expand_path('../../config/application', __FILE__) +require File.expand_path('../../config/boot', __FILE__) +require 'rails/commands' diff --git a/script/rgettext.rb b/script/rgettext.rb deleted file mode 100755 index 3702f47..0000000 --- a/script/rgettext.rb +++ /dev/null @@ -1,215 +0,0 @@ -#!/usr/bin/env ruby -=begin - rgettext - ruby version of xgettext - Copyright (C) 2005 Sascha Ebach - Copyright (C) 2003,2004 Masao Mutoh - Copyright (C) 2001,2002 Yasushi Shoji, Masao Mutoh - - Yasushi Shoji - Masao Mutoh - Sascha Ebach - - You may redistribute it and/or modify it under the same - license terms as Ruby. - - 2005-03-12: Added support for eruby templates (Sascha Ebach) - 2005-03-20: Added second parameter to RGetext.start to allow different - output when not called from the command line. Pulled out - RGetext.set_output(). - -=end - -require 'gettext/parser/ruby' -require 'gettext/parser/glade' - -require 'getoptlong' -require 'gettext' - -require 'tempfile' -require 'erb' - -class RGettext - include GetText - - # constant values - VERSION = %w($Revision: 1.15 $)[1].scan(/\d+/).collect {|s| s.to_i} - DATE = %w($Date: 2004/11/05 18:19:08 $)[1] - MAX_LINE_LEN = 70 - - def start(files=ARGV, output = nil) - opt = check_options - opt['output'] = output unless output.nil? - set_output(opt) - - - if files.empty? - print_help - exit - end - - ary = [] - files.each do |file| - begin - $stderr.puts "Processing #{file}" - if glade_file?(file) - ary = GladeParser.parse(file, ary) - elsif erb_file?(file) - content = File.open(file, 'r') {|f| f.read } - tf = Tempfile.new('erb-gettext') - tf.puts ERB.new(content).src - tf.close - old_index = ary.size - 1 - ary = GetText::RubyParser.parse(tf.path, ary) - #replace tokens with /tmp/... with real file names - for i in old_index..ary.size-1 - for j in 0..ary[i].size-1 - ary[i][j] = ary[i][j].gsub("#{tf.path}", file) - end - end - tf.close true - else - ary = RubyParser.parse(file, ary) - end - rescue - puts $! - exit 1 - end - end - generate_pot_header - generate_pot(ary) - @out.close - end - - # following methods are - private - XML_RE = /<\?xml/ - GLADE_RE = /glade-2.0.dtd/ - - def erb_file?(file) - File.extname(file) == '.rhtml' - end - - def glade_file?(file) - data = IO.readlines(file) - if XML_RE =~ data[0] - if GLADE_RE =~ data[1] - return true - else - raise _("%s is not glade-2.0 format.") % [file] - end - else - return false - end - end - - def initialize - bindtextdomain("rgettext") - end - - def generate_pot_header - time = Time.now.strftime("%Y-%m-%d %H:%M%z") - @out << "# SOME DESCRIPTIVE TITLE.\n" - @out << "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n" - @out << "# This file is distributed under the same license as the PACKAGE package.\n" - @out << "# FIRST AUTHOR , YEAR.\n" - @out << "#\n" - @out << "#, fuzzy\n" - @out << "msgid \"\"\n" - @out << "msgstr \"\"\n" - @out << "\"Project-Id-Version: PACKAGE VERSION\\n\"\n" - @out << "\"POT-Creation-Date: #{time}\\n\"\n" - @out << "\"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n" - @out << "\"Last-Translator: FULL NAME \\n\"\n" - @out << "\"Language-Team: LANGUAGE \\n\"\n" - @out << "\"MIME-Version: 1.0\\n\"\n" - @out << "\"Content-Type: text/plain; charset=UTF-8\\n\"\n" - @out << "\"Content-Transfer-Encoding: 8bit\\n\"\n" - @out << "\"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n\"\n" - end - - def generate_pot(ary) - result = Array.new - ary.each do |key| - msgid = key.shift - curr_pos = MAX_LINE_LEN - key.each do |e| - if curr_pos + e.size > MAX_LINE_LEN - @out << "\n#:" - curr_pos = 3 - else - curr_pos += (e.size + 1) - end - @out << " " << e - end - msgid.gsub!(/"/, '\"') - msgid.gsub!(/\r/, '') - if msgid.include?("\000") - ids = msgid.split(/\000/) - @out << "\nmsgid \"" << ids[0] << "\"\n" - @out << "msgid_plural \"" << ids[1] << "\"\n" - @out << "msgstr[0] \"\"\n" - @out << "msgstr[1] \"\"\n" - else - @out << "\nmsgid \"" << msgid << "\"\n" - @out << "msgstr \"\"\n" - end - end - end - - def print_help - printf _("Usage: %s input.rb -o output.pot\n"), $0 - print _("Extract translatable strings from given input files.\n\n") - end - - def check_options - command_options = [ - ['--help', '-h', GetoptLong::NO_ARGUMENT], #'print this help and exit'], - ['--version', '-v', GetoptLong::NO_ARGUMENT], #'print version info and exit'], - ['--output', '-o', GetoptLong::REQUIRED_ARGUMENT]#, ['FILE', 'write output to specified file']] - ] - - parser = GetoptLong.new - parser.set_options(*command_options) - - opt = Hash.new - parser.each do |name, arg| - opt.store(name.sub(/^--/, ""), arg || true) - end - - if opt['version'] - print "#{$0} #{VERSION.join('.')} \(#{DATE}\)\n\n" - exit - end - - if opt['help'] - print_help - exit - end - - opt - end - - def set_output(opt) - if opt['output'] - unless FileTest.exist? opt['output'] - @out = File.new(File.expand_path(opt['output']), "w+") - else - if $>.tty? - # FIXME - printf $stderr, "File '#{opt['output']}' already exists\n" - exit 1 - else - printf $stderr, "File '#{opt['output']}' already exists" - exit 1 - end - end - else - @out = STDOUT - end - end -end # class RGettext - -if __FILE__ == $0 # in case we want to start it from somewhere else - rgettext = RGettext.new - rgettext.start -end diff --git a/script/runner b/script/runner deleted file mode 100755 index 57211c6..0000000 --- a/script/runner +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/ruby18 -require File.dirname(__FILE__) + '/../config/boot' -require 'commands/runner' \ No newline at end of file diff --git a/script/scgi_rails b/script/scgi_rails deleted file mode 100755 index dc470d8..0000000 --- a/script/scgi_rails +++ /dev/null @@ -1,339 +0,0 @@ -#!/usr/bin/env ruby - -require 'stringio' -require 'yaml' -require 'digest/sha1' -require 'logger' -require 'fileutils' -require 'socket' -require 'cgi' -require 'rubygems' -require 'cmdparse' -require 'monitor' - -def log(msg) - $stderr.print msg,"\n" -end - -def error(msg, exc=nil) - if exc - $stderr.print "ERROR: #{msg}: #{exc}\n" - $stderr.puts exc.backtrace - else - $stderr.print "ERROR: #{msg}\n" - end -end - - -# Modifies CGI so that we can use it. -class SCGIFixed < ::CGI - public :env_table - - def initialize(params, data, out, *args) - @env_table = params - @args = *args - @input = StringIO.new(data) - @out = out - super(*args) - end - def args - @args - end - def env_table - @env_table - end - def stdinput - @input - end - def stdoutput - @out - end -end - - -class SCGIProcessor < Monitor - - def initialize(settings) - @env = settings[:env] || "development" - @debug = settings[:debug] || false - @host = settings[:host] || "127.0.0.1" - @port = settings[:port] || "9999" - @children = settings[:children] || 1 - @pid_file = settings[:pid_file] || "children.yaml" - @status_dir = settings[:status_dir] || "/tmp" - @log_file = settings[:logfile] || "log/scgi.log" - @maxconns = settings[:maxconns] - @busy_msg = settings[:busy_msg] || "BUSY" - @settings = settings - @started = Time.now - @conns = 0 - @total_conns = 0 - @errors = 0 - - if @maxconns - @maxconns = @maxconns.to_i - else - @maxconns = 2**30-1 - end - - if settings[:conns_second] - @throttle_sleep = 1.0/settings[:conns_second].to_i - end - - super() - end - - def run - ENV['RAILS_ENV'] = @env - - begin - require_gem 'rails' - require "config/environment" - rescue Object - error("loading rails environment", $!) - end - - server = TCPServer.new(@host, @port) - - if @debug - log("Listening for connections on #@host:#@port") - listen(server) - else - childpids = [] - @children.to_i.times do - # fork each child listening to the same port. very simple yet effective way to spread the load - # to multiple processes without using threads and still using high performance libevent - begin - pid = fork do - $stderr = open(@log_file,"w") - $stderr.sync = false - listen(server) - end - childpids << pid - Process.detach(pid) - rescue Object - error("Could not fork child processes. Your system might not support fork. Use -D instead.", $!) - end - end - - # tell the user what the sha1 is so they can check for modification later - log("#@pid_file will have SHA1 #{Digest::SHA1.hexdigest(YAML.dump(childpids))}") - log("Record this somewhere so you know if it was modified later by someone else.") - # all children forked and the pids are now ready to write to the pid file - open(@pid_file,"w") { |f| f.write(YAML.dump(childpids)) } - end - end - - - def listen(socket) - thread = Thread.new do - while true - handle_client(socket.accept) - sleep @throttle_sleep if @throttle_sleep - - @total_conns += 1 - end - end - - begin - thread.join - rescue Interrupt - log("Shutting down from SIGINT.") - rescue Object - error("while listening for connections on #@host:#@port", $!) - end - end - - - def handle_client(socket) - Thread.new do - begin - synchronize { @conns += 1} - - len = "" - # we only read 10 bytes of the length. any request longer than this is invalid - while len.length <= 10 - c = socket.read(1) - if c == ':' - # found the terminal, len now has a length in it so read the payload - break - else - len << c - end - end - - # we should now either have a payload length to get - payload = socket.read(len.to_i) - if (c = socket.read(1)) != ',' - error("Malformed request, does not end with ','") - else - read_header(socket, payload, @conns) - end - rescue IOError - error("received IOError #$! when handling client. Your web server doesn't like me.") - rescue Object - @errors += 1 - error("after accepting client #@host:#@port -- #{$!.class}", $!) - ensure - synchronize { @conns -= 1} - socket.close if not socket.closed? - end - end - - end - - - def read_header(socket, payload, conns) - return if socket.closed? - request = split_body(payload) - if request and request["CONTENT_LENGTH"] - length = request["CONTENT_LENGTH"].to_i - if length > 0 - body = socket.read(length) - else - body = "" - end - - if @conns > @maxconns - socket.write("Content-type: text/plain\r\n\r\n") - socket.write(@busy_msg) - else - process_request(request, body, socket) - end - end - end - - - def process_request(request, body, socket) - return if socket.closed? - cgi = SCGIFixed.new(request, body, socket) - begin - synchronize do - # unfortuneatly, the dependencies.rb file is not thread safe and will throw exceptions - # claiming that Dispatcher is not defined, or that other classes are missing. We have - # to sync the dispatch call to get around this. - Dispatcher.dispatch(cgi, ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS, cgi.stdoutput) - end - rescue IOError - error("received IOError #$! when handling client. Your web server doesn't like me.") - rescue Object => rails_error - error("calling Dispatcher.dispatch", rails_error) - end - end - - - def split_body(data) - result = {} - el = data.split("\0") - i = 0 - len = el.length - while i < len - result[el[i]] = el[i+1] - i += 1 - end - - return result - end - - def status - pid = Process.pid - open("#@status_dir/scgi_rails-status.#{pid}","w") do |f| - status = { - 'time' => Time.now, 'pid' => pid, 'settings' => @settings, - 'env' => @env, 'status_dir' => @status_dir, 'started' => @started, - 'max_conns' => @maxconns, 'total_conns' => @total_conns, - 'conns' => @conns, 'errors' => @errors, 'systimes' => Process.times - } - f.write(YAML.dump(status)) - end - end -end - - -def signal_children(pidfile, signal) - if not File.exists? pidfile - log("No #{pidfile} as specified. Probably nothing running or wrong path.") - exit 1 - end - - childpids = YAML.load_file(pidfile) - childpids.each do |pid| - begin - log("Signaling pid #{pid}") - Process.kill(signal, pid) - rescue Object - log("Couldn't send #{signal} signal to #{pid} pid.") - end - end -end - - -def make_command(parent, name, desc, options) - cmd = CmdParse::Command.new(name, false ) - cmd.short_desc = desc - settings = {} - cmd.options = CmdParse::OptionParserWrapper.new do |opt| - options.each do |short, long, info, symbol| - opt.on(short, long, info) {|val| settings[symbol] = val} - end - end - cmd.set_execution_block do |args| - yield(settings, args) - end - parent.add_command(cmd) -end - - -cmd = CmdParse::CommandParser.new( true ) -cmd.program_name = "scgi_rails" -cmd.program_version = [0, 2, 1] -cmd.options = CmdParse::OptionParserWrapper.new do |opt| - opt.separator "Global options:" - opt.on("--verbose", "Be verbose when outputting info") {|t| $verbose = true } -end - -cmd.add_command( CmdParse::HelpCommand.new ) -cmd.add_command( CmdParse::VersionCommand.new ) - -make_command(cmd, 'start', "Start Rails Application", -[['-e','--env STRING','Rails environment', :env], -['-D','--[no-]debug', 'Do not fork children, stay in foreground.', :debug], -['-h','--host STRING', 'IP address to bind as server', :host], -['-p','--port NUMBER', 'Port to bind to', :port], -['-c','--children NUMBER', 'Number of children to start (not win32)', :children], -['-f','--pid-file PATH', 'Where to read the list of running children', :pid_file], -['-l','--log-file PATH', 'Use a different log from from log/scgi.log', :logfile], -['-t','--throttle NUMBER', 'Max conn/second to allow.', :conns_second], -['-m','--max-conns NUMBER', 'Max simultaneous connections before the busy message', :maxconns], -['-b','--busy-msg', 'Busy message given to clients over the max connections ("busy")', :busy_msg], -['-s','--status-dir PATH', 'Where to put the status files', :status_dir]]) do |settings, args| - scgi = SCGIProcessor.new(settings) - begin - trap("HUP") { scgi.status } - rescue Object - error("Could not setup a SIGHUP handler. You won't be able to get status.") - end - - scgi.run -end - - -make_command(cmd, 'status', "Get status from all running children", -[['-s','--status-dir PATH', 'Where to put the status files', :status_dir], -['-f','--pid-file PATH', 'Where to read the list of running children', :pid_file]]) do |settings, args| - signal_children(settings[:pid_file] || 'children.yaml', "HUP") - log("Status files for each child should show up in the configured status directory (/tmp by default).") -end - -make_command(cmd, 'stop', "Stop all running children", -[['-s','--sig SIGNAL', 'Where to put the status files', :signal], -['-n','--[no-]delete', 'Keep the children.yaml file rather than delete', :nodelete], -['-f','--pid-file PATH', 'Where to read the list of running children', :pid_file]]) do |settings, args| - pid_file = settings[:pid_file] || "children.yaml" - signal_children(pid_file, settings[:signal] || "INT") - if not settings[:nodelete] and File.exist?(pid_file) - File.unlink(pid_file) - end -end - -cmd.parse \ No newline at end of file diff --git a/script/server b/script/server deleted file mode 100755 index 9436fde..0000000 --- a/script/server +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/ruby18 -require File.dirname(__FILE__) + '/../config/boot' -require 'commands/server' \ No newline at end of file diff --git a/test/fixtures/expressions.yml b/test/fixtures/expressions.yml deleted file mode 100644 index e3fa03c..0000000 --- a/test/fixtures/expressions.yml +++ /dev/null @@ -1,5 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first_expression: - id: 1 -another_expression: - id: 2 diff --git a/test/fixtures/filters.yml b/test/fixtures/filters.yml deleted file mode 100644 index b36dd3b..0000000 --- a/test/fixtures/filters.yml +++ /dev/null @@ -1,5 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first_filter: - id: 1 -another_filter: - id: 2 diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml deleted file mode 100644 index c884985..0000000 --- a/test/fixtures/users.yml +++ /dev/null @@ -1,5 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first_user: - id: 1 -another_user: - id: 2 diff --git a/test/performance/browsing_test.rb b/test/performance/browsing_test.rb new file mode 100755 index 0000000..867fc8c --- /dev/null +++ b/test/performance/browsing_test.rb @@ -0,0 +1,9 @@ +require 'test_helper' +require 'rails/performance_test_help' + +# Profiling results for each test method are written to tmp/performance. +class BrowsingTest < ActionDispatch::PerformanceTest + def test_homepage + get '/' + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb old mode 100644 new mode 100755 index 0a4be59..8bf1192 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,13 +1,13 @@ ENV["RAILS_ENV"] = "test" -require File.expand_path(File.dirname(__FILE__) + "/../config/environment") -require 'test_help' +require File.expand_path('../../config/environment', __FILE__) +require 'rails/test_help' -class Test::Unit::TestCase - # Turn off transactional fixtures if you're working with MyISAM tables in MySQL - self.use_transactional_fixtures = true - - # Instantiated fixtures are slow, but give you @david where you otherwise would need people(:david) - self.use_instantiated_fixtures = false +class ActiveSupport::TestCase + # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order. + # + # Note: You'll currently still have to declare fixtures explicitly in integration tests + # -- they do not yet inherit this setting + fixtures :all # Add more helper methods to be used by all tests here... -end \ No newline at end of file +end diff --git a/test/unit/expression_test.rb b/test/unit/expression_test.rb deleted file mode 100644 index 94ff355..0000000 --- a/test/unit/expression_test.rb +++ /dev/null @@ -1,14 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class ExpressionTest < Test::Unit::TestCase - fixtures :expressions - - def setup - @expression = Expression.find(1) - end - - # Replace this with your real tests. - def test_truth - assert_kind_of Expression, @expression - end -end diff --git a/test/unit/filter_test.rb b/test/unit/filter_test.rb deleted file mode 100644 index 019aec9..0000000 --- a/test/unit/filter_test.rb +++ /dev/null @@ -1,14 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class FilterTest < Test::Unit::TestCase - fixtures :filters - - def setup - @filter = Filter.find(1) - end - - # Replace this with your real tests. - def test_truth - assert_kind_of Filter, @filter - end -end diff --git a/test/unit/user_test.rb b/test/unit/user_test.rb deleted file mode 100644 index 24c6258..0000000 --- a/test/unit/user_test.rb +++ /dev/null @@ -1,14 +0,0 @@ -require File.dirname(__FILE__) + '/../test_helper' - -class UserTest < Test::Unit::TestCase - fixtures :users - - def setup - @user = User.find(1) - end - - # Replace this with your real tests. - def test_truth - assert_kind_of User, @user - end -end diff --git a/vendor/ezcrypto-0.1.1/._README b/vendor/ezcrypto-0.1.1/._README old mode 100644 new mode 100755 diff --git a/vendor/ezcrypto-0.1.1/._rakefile b/vendor/ezcrypto-0.1.1/._rakefile old mode 100644 new mode 100755 diff --git a/vendor/ezcrypto-0.1.1/MIT-LICENSE b/vendor/ezcrypto-0.1.1/MIT-LICENSE old mode 100644 new mode 100755 diff --git a/vendor/ezcrypto-0.1.1/README b/vendor/ezcrypto-0.1.1/README old mode 100644 new mode 100755 diff --git a/vendor/ezcrypto-0.1.1/lib/ezcrypto.rb b/vendor/ezcrypto-0.1.1/lib/ezcrypto.rb old mode 100644 new mode 100755 diff --git a/vendor/ezcrypto-0.1.1/rakefile b/vendor/ezcrypto-0.1.1/rakefile old mode 100644 new mode 100755 diff --git a/vendor/ezcrypto-0.1.1/test/ezcrypto_test.rb b/vendor/ezcrypto-0.1.1/test/ezcrypto_test.rb old mode 100644 new mode 100755 diff --git a/vendor/plugins/.gitkeep b/vendor/plugins/.gitkeep new file mode 100755 index 0000000..e69de29 diff --git a/vendor/plugins/auto_complete/README b/vendor/plugins/auto_complete/README old mode 100644 new mode 100755 diff --git a/vendor/plugins/auto_complete/Rakefile b/vendor/plugins/auto_complete/Rakefile old mode 100644 new mode 100755 diff --git a/vendor/plugins/auto_complete/init.rb b/vendor/plugins/auto_complete/init.rb old mode 100644 new mode 100755 diff --git a/vendor/plugins/auto_complete/lib/auto_complete.rb b/vendor/plugins/auto_complete/lib/auto_complete.rb old mode 100644 new mode 100755 diff --git a/vendor/plugins/auto_complete/lib/auto_complete_macros_helper.rb b/vendor/plugins/auto_complete/lib/auto_complete_macros_helper.rb old mode 100644 new mode 100755 diff --git a/vendor/plugins/auto_complete/test/auto_complete_test.rb b/vendor/plugins/auto_complete/test/auto_complete_test.rb old mode 100644 new mode 100755 diff --git a/vendor/plugins/classic_pagination/CHANGELOG b/vendor/plugins/classic_pagination/CHANGELOG old mode 100644 new mode 100755 diff --git a/vendor/plugins/classic_pagination/README b/vendor/plugins/classic_pagination/README old mode 100644 new mode 100755 diff --git a/vendor/plugins/classic_pagination/Rakefile b/vendor/plugins/classic_pagination/Rakefile old mode 100644 new mode 100755 diff --git a/vendor/plugins/classic_pagination/init.rb b/vendor/plugins/classic_pagination/init.rb old mode 100644 new mode 100755 diff --git a/vendor/plugins/classic_pagination/install.rb b/vendor/plugins/classic_pagination/install.rb old mode 100644 new mode 100755 diff --git a/vendor/plugins/classic_pagination/lib/pagination.rb b/vendor/plugins/classic_pagination/lib/pagination.rb old mode 100644 new mode 100755 diff --git a/vendor/plugins/classic_pagination/lib/pagination_helper.rb b/vendor/plugins/classic_pagination/lib/pagination_helper.rb old mode 100644 new mode 100755 diff --git a/vendor/plugins/classic_pagination/test/fixtures/companies.yml b/vendor/plugins/classic_pagination/test/fixtures/companies.yml old mode 100644 new mode 100755 diff --git a/vendor/plugins/classic_pagination/test/fixtures/company.rb b/vendor/plugins/classic_pagination/test/fixtures/company.rb old mode 100644 new mode 100755 diff --git a/vendor/plugins/classic_pagination/test/fixtures/developer.rb b/vendor/plugins/classic_pagination/test/fixtures/developer.rb old mode 100644 new mode 100755 diff --git a/vendor/plugins/classic_pagination/test/fixtures/developers.yml b/vendor/plugins/classic_pagination/test/fixtures/developers.yml old mode 100644 new mode 100755 diff --git a/vendor/plugins/classic_pagination/test/fixtures/developers_projects.yml b/vendor/plugins/classic_pagination/test/fixtures/developers_projects.yml old mode 100644 new mode 100755 diff --git a/vendor/plugins/classic_pagination/test/fixtures/project.rb b/vendor/plugins/classic_pagination/test/fixtures/project.rb old mode 100644 new mode 100755 diff --git a/vendor/plugins/classic_pagination/test/fixtures/projects.yml b/vendor/plugins/classic_pagination/test/fixtures/projects.yml old mode 100644 new mode 100755 diff --git a/vendor/plugins/classic_pagination/test/fixtures/replies.yml b/vendor/plugins/classic_pagination/test/fixtures/replies.yml old mode 100644 new mode 100755 diff --git a/vendor/plugins/classic_pagination/test/fixtures/reply.rb b/vendor/plugins/classic_pagination/test/fixtures/reply.rb old mode 100644 new mode 100755 diff --git a/vendor/plugins/classic_pagination/test/fixtures/schema.sql b/vendor/plugins/classic_pagination/test/fixtures/schema.sql old mode 100644 new mode 100755 diff --git a/vendor/plugins/classic_pagination/test/fixtures/topic.rb b/vendor/plugins/classic_pagination/test/fixtures/topic.rb old mode 100644 new mode 100755 diff --git a/vendor/plugins/classic_pagination/test/fixtures/topics.yml b/vendor/plugins/classic_pagination/test/fixtures/topics.yml old mode 100644 new mode 100755 diff --git a/vendor/plugins/classic_pagination/test/helper.rb b/vendor/plugins/classic_pagination/test/helper.rb old mode 100644 new mode 100755 diff --git a/vendor/plugins/classic_pagination/test/pagination_helper_test.rb b/vendor/plugins/classic_pagination/test/pagination_helper_test.rb old mode 100644 new mode 100755 diff --git a/vendor/plugins/classic_pagination/test/pagination_test.rb b/vendor/plugins/classic_pagination/test/pagination_test.rb old mode 100644 new mode 100755 diff --git a/vendor/plugins/will_paginate/.autotest b/vendor/plugins/will_paginate/.autotest deleted file mode 100644 index ade45eb..0000000 --- a/vendor/plugins/will_paginate/.autotest +++ /dev/null @@ -1,54 +0,0 @@ -Autotest.add_hook :initialize do |at| - - at.libs = 'lib:spec' - - at.clear_mappings - - at.add_mapping(%r{^lib/will_paginate/(.+)\.rb$}) { |_, match| - "spec/#{match[1]}_spec.rb" - } - at.add_mapping(%r{^spec/.+_spec\.rb$}) { |f, _| f } - at.add_mapping(%r{^spec/(finders/activerecord_test_connector.rb|database.yml|fixtures/.+)$}) { - 'spec/finders/active_record_spec.rb' - } - at.add_mapping(%r{^spec/((spec_helper|shared/.+)\.rb|spec.opts)$}) { - # simply re-run all specs - at.files_matching %r{^spec/.+_spec\.rb$} - } - - # add these to ignore list - %w{ .git test/ rails/ Rakefile README.rdoc init.rb .autotest - doc/ coverage/ LICENSE CHANGELOG .manifest will_paginate.gemspec examples/ - spec/tasks.rake spec/console spec/rcov.opts - }.each { |path| at.add_exception path } - -end - -Autotest::Rspec.class_eval do - # RSpec guys forgot about `libs` in make_test_cmd - def make_test_cmd_with_libs(files_to_test) - make_test_cmd_without_libs(files_to_test).sub(' -S ', " -S -I#{libs} ") - end - - alias :make_test_cmd_without_libs :make_test_cmd - alias :make_test_cmd :make_test_cmd_with_libs - - # ugh, we have to monkeypatch Autotest ... - # the regexp it generates for the exception list just matches too much - # - # SOLUTION: wrap it up in another regexp that anchors the whole expression to - # the beginning of the path - def exceptions - unless defined? @exceptions then - if @exception_list.empty? then - @exceptions = nil - else - # old (BAD): - # @exceptions = Regexp.union(*@exception_list) - @exceptions = /^\.\/#{Regexp.union(*@exception_list)}/ - end - end - - @exceptions - end -end diff --git a/vendor/plugins/will_paginate/.gitignore b/vendor/plugins/will_paginate/.gitignore deleted file mode 100644 index 2b437b9..0000000 --- a/vendor/plugins/will_paginate/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/doc -/rails -*.gem -/coverage diff --git a/vendor/plugins/will_paginate/.manifest b/vendor/plugins/will_paginate/.manifest deleted file mode 100644 index aca08ee..0000000 --- a/vendor/plugins/will_paginate/.manifest +++ /dev/null @@ -1,66 +0,0 @@ -CHANGELOG.rdoc -LICENSE -README.rdoc -Rakefile -examples -examples/apple-circle.gif -examples/index.haml -examples/index.html -examples/pagination.css -examples/pagination.sass -init.rb -lib -lib/will_paginate -lib/will_paginate.rb -lib/will_paginate/array.rb -lib/will_paginate/collection.rb -lib/will_paginate/core_ext.rb -lib/will_paginate/deprecation.rb -lib/will_paginate/finders -lib/will_paginate/finders.rb -lib/will_paginate/finders/active_record -lib/will_paginate/finders/active_record.rb -lib/will_paginate/finders/active_record/named_scope.rb -lib/will_paginate/finders/active_record/named_scope_patch.rb -lib/will_paginate/finders/active_resource.rb -lib/will_paginate/finders/base.rb -lib/will_paginate/finders/data_mapper.rb -lib/will_paginate/version.rb -lib/will_paginate/view_helpers -lib/will_paginate/view_helpers.rb -lib/will_paginate/view_helpers/action_view.rb -lib/will_paginate/view_helpers/base.rb -lib/will_paginate/view_helpers/link_renderer.rb -lib/will_paginate/view_helpers/link_renderer_base.rb -spec -spec/collection_spec.rb -spec/console -spec/console_fixtures.rb -spec/database.yml -spec/finders -spec/finders/active_record_spec.rb -spec/finders/active_resource_spec.rb -spec/finders/activerecord_test_connector.rb -spec/finders_spec.rb -spec/fixtures -spec/fixtures/admin.rb -spec/fixtures/developer.rb -spec/fixtures/developers_projects.yml -spec/fixtures/project.rb -spec/fixtures/projects.yml -spec/fixtures/replies.yml -spec/fixtures/reply.rb -spec/fixtures/schema.rb -spec/fixtures/topic.rb -spec/fixtures/topics.yml -spec/fixtures/user.rb -spec/fixtures/users.yml -spec/rcov.opts -spec/spec.opts -spec/spec_helper.rb -spec/tasks.rake -spec/view_helpers -spec/view_helpers/action_view_spec.rb -spec/view_helpers/base_spec.rb -spec/view_helpers/link_renderer_base_spec.rb -spec/view_helpers/view_example_group.rb \ No newline at end of file diff --git a/vendor/plugins/will_paginate/CHANGELOG.rdoc b/vendor/plugins/will_paginate/CHANGELOG.rdoc deleted file mode 100644 index 829c0bb..0000000 --- a/vendor/plugins/will_paginate/CHANGELOG.rdoc +++ /dev/null @@ -1,104 +0,0 @@ -== "agnostic" branch - -* setup Autotest -* added per_page=(limit) attribute writer to set default per_page -* Remove :include option from count_all query when possible (Rails 2.1) -* added WP::ViewHelpers::ActionView and LinkRenderer -* specs for ViewHelpers::Base and LinkRendererBase -* created LinkRendererBase that implements windowed visible page numbers logic -* created WP::ViewHelpers::Base abstract module that implements generic view helpers -* converted finder tests to specs -* added WP::Finders::DataMapper -* added WP::Finders::ActiveRecord mixin for ActiveRecord::Base -* created WP::Finders::Base abstract module that implements generic pagination logic -* removed dependency to ActiveSupport - -=== TODO: - -* Make a concrete implementation of LinkRendererBase that will generate HTML for both ActionView and Merb -* ActionView and Merb integration tests for view helpers -* 3c4725 Oops, I used return in an iterator block. I obviously write too much JavaScript -* 537f22 ensure that 'href' values in pagination links are escaped URLs - -== 2.3.1, released 2008-05-04 - -* Fixed page numbers not showing with custom routes and implicit first page -* Try to use Hanna for documentation (falls back to default RDoc template if not) - -== 2.3.0, released 2008-04-29 - -* Changed LinkRenderer to receive collection, options and reference to view template NOT in - constructor, but with the #prepare method. This is a step towards supporting passing of - LinkRenderer (or subclass) instances that may be preconfigured in some way -* LinkRenderer now has #page_link and #page_span methods for easier customization of output in - subclasses -* Changed page_entries_info() method to adjust its output according to humanized class name of - collection items. Override this with :entry_name parameter (singular). - - page_entries_info(@posts) - #-> "Displaying all 12 posts" - page_entries_info(@posts, :entry_name => 'item') - #-> "Displaying all 12 items" - -== 2.2.3, released 2008-04-26 - -* will_paginate gem is no longer published on RubyForge, but on - gems.github.com: - - gem sources -a http://gems.github.com/ (you only need to do this once) - gem install mislav-will_paginate - -* extract reusable pagination testing stuff into WillPaginate::View -* rethink the page URL construction mechanizm to be more bulletproof when - combined with custom routing for page parameter -* test that anchor parameter can be used in pagination links - -== 2.2.2, released 2008-04-21 - -* Add support for page parameter in custom routes like "/foo/page/2" -* Change output of "page_entries_info" on single-page collection and erraneous - output with empty collection as reported by Tim Chater - -== 2.2.1, released 2008-04-08 - -* take less risky path when monkeypatching named_scope; fix that it no longer - requires ActiveRecord::VERSION -* use strings in "respond_to?" calls to work around a bug in acts_as_ferret - stable (ugh) -* add rake release task - - -== 2.2.0, released 2008-04-07 - -=== API changes -* Rename WillPaginate::Collection#page_count to "total_pages" for consistency. - If you implemented this interface, change your implementation accordingly. -* Remove old, deprecated style of calling Array#paginate as "paginate(page, - per_page)". If you want to specify :page, :per_page or :total_entries, use a - parameter hash. -* Rename LinkRenderer#url_options to "url_for" and drastically optimize it - -=== View changes -* Added "prev_page" and "next_page" CSS classes on previous/next page buttons -* Add examples of pagination links styling in "examples/index.html" -* Change gap in pagination links from "..." to - "". -* Add "paginated_section", a block helper that renders pagination both above and - below content in the block -* Add rel="prev|next|start" to page links - -=== Other - -* Add ability to opt-in for Rails 2.1 feature "named_scope" by calling - WillPaginate.enable_named_scope (tested in Rails 1.2.6 and 2.0.2) -* Support complex page parameters like "developers[page]" -* Move Array#paginate definition to will_paginate/array.rb. You can now easily - use pagination on arrays outside of Rails: - - gem 'will_paginate' - require 'will_paginate/array' - -* Add "paginated_each" method for iterating through every record by loading only - one page of records at the time -* Rails 2: Rescue from WillPaginate::InvalidPage error with 404 Not Found by - default diff --git a/vendor/plugins/will_paginate/LICENSE b/vendor/plugins/will_paginate/LICENSE deleted file mode 100644 index 96a48cb..0000000 --- a/vendor/plugins/will_paginate/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -Copyright (c) 2007 PJ Hyett and Mislav Marohnić - -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/will_paginate/README.rdoc b/vendor/plugins/will_paginate/README.rdoc deleted file mode 100644 index a402a7b..0000000 --- a/vendor/plugins/will_paginate/README.rdoc +++ /dev/null @@ -1,123 +0,0 @@ -= WillPaginate - -Pagination is just limiting the number of records displayed. Why should you let it get in your way -while developing? - -This is how you paginate on an ActiveRecord model: - - Post.paginate :page => 1, :order => 'created_at DESC' - -Most of the time it's as simple as replacing "find" with "paginate" and specifying the page you want. - -Some resources to get you started: - -* The {will_paginate project page}[http://github.com/mislav/will_paginate]; -* Your mind reels with questions? Join our {Google group}[http://groups.google.com/group/will_paginate]; -* {How to report bugs}[http://github.com/mislav/will_paginate/wikis/report-bugs]; -* {Watch the will_paginate screencast}[http://railscasts.com/episodes/51] by Ryan Bates. - - -== Installation - -The recommended way is that you get the gem: - - gem install --source=http://gems.github.com/ mislav-will_paginate - -After that you don't need the will_paginate plugin in your Rails application anymore. In -Rails 2.1, add a gem dependency: - - config.gem 'mislav-will_paginate', :lib => 'will_paginate', :version => '~> 2.5' - -If you're using Rails 2.0 or older, just add a simple require to the end of your -"config/environment.rb" instead: - - gem 'mislav-will_paginate', '~> 2.5' - require 'will_paginate' - -That's it. Remember to install the gem on all machines that you are deploying to. - -There are extensive {installation -instructions}[http://github.com/mislav/will_paginate/wikis/installation] on {the -wiki}[http://github.com/mislav/will_paginate/wikis]. - - -== Example usage - -Use a paginate finder in the controller: - - @posts = Post.paginate_by_board_id( - @board.id, - :page => params[:page], - :order => 'updated_at DESC' - ) - -Yeah, +paginate+ works just like +find+ -- it just doesn't fetch all the records. Don't forget to -tell it which page you want, or it will complain! Read more about WillPaginate::Finders. - -Render the posts in your view like you would normally do. When you need to render pagination, just -stick this in: - - <%= will_paginate @posts %> - -You're done. (Copy and paste the example fancy CSS styles from the bottom.) You can find the option -list at WillPaginate::ViewHelpers. - -How does it know how much items to fetch per page? It asks your model by calling its -per_page class method. You can define it like this: - - class Post < ActiveRecord::Base - def self.per_page() 50 end - end - -... or don't worry about it at all. WillPaginate defines it to be 30 by default. You can -always specify the count explicitly when calling +paginate+: - - @posts = Post.paginate :page => params[:page], :per_page => 50 - -The +paginate+ finder wraps the original finder and returns your result set that now has some new -properties. You can use the collection as you would use any other array. WillPaginate view helpers -also need that object to be able to render pagination: - -
    - <% for post in @posts -%> -
  1. Render `post` in some nice way.
  2. - <% end -%> -
- -

Now let's render us some pagination!

- <%= will_paginate @posts %> - -More detailed documentation: - -* WillPaginate::Finders for pagination on your models; -* WillPaginate::ViewHelpers for your views. - - -== Authors and credits - -Authors:: Mislav Marohnić, PJ Hyett -Original announcement:: http://errtheblog.com/post/929 -Original PHP source:: http://www.strangerstudios.com/sandbox/pagination/diggstyle.php - -All these people helped making will_paginate what it is now with their code contributions or just -simply awesome ideas: - -Chris Wanstrath, Dr. Nic Williams, K. Adam Christensen, Mike Garey, Bence Golda, Matt Aimonetti, -Charles Brian Quinn, Desi McAdam, James Coglan, Matijs van Zuijlen, Maria, Brendan Ribera, Todd -Willey, Bryan Helmkamp, Jan Berkel, Lourens Naudé, Rick Olson, Russell Norris, Piotr Usewicz, Chris -Eppstein. - - -== Usable pagination in the UI - -There are some CSS styles to get you started in the "examples/" directory. They are showcased in the -"examples/index.html" file. - -More reading about pagination as design pattern: - -* {Pagination 101}[http://kurafire.net/log/archive/2007/06/22/pagination-101]; -* {Pagination gallery}[http://www.smashingmagazine.com/2007/11/16/pagination-gallery-examples-and-good-practices/] featured on Smashing Magazine; -* {Pagination design pattern}[http://developer.yahoo.com/ypatterns/parent.php?pattern=pagination] on Yahoo Design Pattern Library. - -Want to discuss, request features, ask questions? Join the {Google -group}[http://groups.google.com/group/will_paginate]. \ No newline at end of file diff --git a/vendor/plugins/will_paginate/Rakefile b/vendor/plugins/will_paginate/Rakefile deleted file mode 100644 index 81672f6..0000000 --- a/vendor/plugins/will_paginate/Rakefile +++ /dev/null @@ -1,62 +0,0 @@ -require 'rubygems' -begin - hanna_dir = '/Users/mislav/Projects/Hanna/lib' - $:.unshift hanna_dir if File.exists? hanna_dir - require 'hanna/rdoctask' -rescue LoadError - require 'rake' - require 'rake/rdoctask' -end -load 'spec/tasks.rake' - -desc 'Default: run specs.' -task :default => :spec - -desc 'Generate RDoc documentation for the will_paginate plugin.' -Rake::RDocTask.new(:rdoc) do |rdoc| - rdoc.rdoc_files.include('README.rdoc', 'LICENSE', 'CHANGELOG'). - include('lib/**/*.rb'). - exclude('lib/will_paginate/named_scope*'). - exclude('lib/will_paginate/deprecation.rb'). - exclude('lib/will_paginate/version.rb') - - rdoc.main = "README.rdoc" # page to start on - rdoc.title = "will_paginate documentation" - - rdoc.rdoc_dir = 'doc' # rdoc output folder - rdoc.options << '--inline-source' << '--charset=UTF-8' - rdoc.options << '--webcvs=http://github.com/mislav/will_paginate/tree/master/' -end - -desc %{Update ".manifest" with the latest list of project filenames. Respect\ -.gitignore by excluding everything that git ignores. Update `files` and\ -`test_files` arrays in "*.gemspec" file if it's present.} -task :manifest do - list = Dir['**/*'].sort - spec_file = Dir['*.gemspec'].first - list -= [spec_file] if spec_file - - File.read('.gitignore').each_line do |glob| - glob = glob.chomp.sub(/^\//, '') - list -= Dir[glob] - list -= Dir["#{glob}/**/*"] if File.directory?(glob) and !File.symlink?(glob) - puts "excluding #{glob}" - end - - if spec_file - spec = File.read spec_file - spec.gsub! /^(\s* s.(test_)?files \s* = \s* )( \[ [^\]]* \] | %w\( [^)]* \) )/mx do - assignment = $1 - bunch = $2 ? list.grep(/^(test|spec)\//) : list - '%s%%w(%s)' % [assignment, bunch.join(' ')] - end - - File.open(spec_file, 'w') {|f| f << spec } - end - File.open('.manifest', 'w') {|f| f << list.join("\n") } -end - -task :examples do - %x(haml examples/index.haml examples/index.html) - %x(sass examples/pagination.sass examples/pagination.css) -end \ No newline at end of file diff --git a/vendor/plugins/will_paginate/examples/apple-circle.gif b/vendor/plugins/will_paginate/examples/apple-circle.gif deleted file mode 100644 index df8cbf7c8d47a7b93f2c7729c5d16851bbf3c6d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmZ?wbhEHb6l4%&*v!Ci|Ni}l4m|8C-HDr=l Yl-uT7r^S~vw@wPtla!Vf7G$sn0I}Ch00000 diff --git a/vendor/plugins/will_paginate/examples/index.haml b/vendor/plugins/will_paginate/examples/index.haml deleted file mode 100644 index fb41ac8..0000000 --- a/vendor/plugins/will_paginate/examples/index.haml +++ /dev/null @@ -1,69 +0,0 @@ -!!! -%html -%head - %title Samples of pagination styling for will_paginate - %link{ :rel => 'stylesheet', :type => 'text/css', :href => 'pagination.css' } - %style{ :type => 'text/css' } - :sass - html - :margin 0 - :padding 0 - :background #999 - :font normal 76% "Lucida Grande", Verdana, Helvetica, sans-serif - body - :margin 2em - :padding 2em - :border 2px solid gray - :background white - :color #222 - h1 - :font-size 2em - :font-weight normal - :margin 0 0 1em 0 - h2 - :font-size 1.4em - :margin 1em 0 .5em 0 - pre - :font-size 13px - :font-family Monaco, "DejaVu Sans Mono", "Bitstream Vera Mono", "Courier New", monospace - -- pagination = '« Previous 1 3 4 5 6 7 8 9 29 30 ' -- pagination_no_page_links = '« Previous ' - -%body - %h1 Samples of pagination styling for will_paginate - %p - Find these styles in "examples/pagination.css" of will_paginate library. - There is a Sass version of it for all you sassy people. - %p - Read about good rules for pagination: - %a{ :href => 'http://kurafire.net/log/archive/2007/06/22/pagination-101' } Pagination 101 - %p - %em Warning: - page links below don't lead anywhere (so don't click on them). - - %h2 Unstyled pagination (ewww!) - %div= pagination - - %h2 Digg.com - .digg_pagination= pagination - - %h2 Digg-style, no page links - .digg_pagination= pagination_no_page_links - %p Code that renders this: - %pre= '%s' % %[<%= will_paginate @posts, :page_links => false %>].gsub('<', '<').gsub('>', '>') - - %h2 Digg-style, extra content - .digg_pagination - .page_info Displaying entries 1 - 6 of 180 in total - = pagination - %p Code that renders this: - %pre= '%s' % %[
\n
\n <%= page_entries_info @posts %>\n
\n <%= will_paginate @posts, :container => false %>\n
].gsub('<', '<').gsub('>', '>') - - %h2 Apple.com store - .apple_pagination= pagination - - %h2 Flickr.com - .flickr_pagination - = pagination - .page_info (118 photos) diff --git a/vendor/plugins/will_paginate/examples/index.html b/vendor/plugins/will_paginate/examples/index.html deleted file mode 100644 index 858f7c6..0000000 --- a/vendor/plugins/will_paginate/examples/index.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - Samples of pagination styling for will_paginate - - - - -

Samples of pagination styling for will_paginate

-

- Find these styles in "examples/pagination.css" of will_paginate library. - There is a Sass version of it for all you sassy people. -

-

- Read about good rules for pagination: - Pagination 101 -

-

- Warning: - page links below don't lead anywhere (so don't click on them). -

-

- Unstyled pagination (ewww!) -

-
- « Previous 1 3 4 5 6 7 8 9 29 30 -
-

Digg.com

-
- « Previous 1 3 4 5 6 7 8 9 29 30 -
-

Digg-style, no page links

-
- « Previous -
-

Code that renders this:

-
-    <%= will_paginate @posts, :page_links => false %>
-  
-

Digg-style, extra content

-
-
- Displaying entries 1 - 6 of 180 in total -
- « Previous 1 3 4 5 6 7 8 9 29 30 -
-

Code that renders this:

-
-    <div class="digg_pagination">
-      <div clas="page_info">
-        <%= page_entries_info @posts %>
-      </div>
-      <%= will_paginate @posts, :container => false %>
-    </div>
-  
-

Apple.com store

-
- « Previous 1 3 4 5 6 7 8 9 29 30 -
-

Flickr.com

-
- « Previous 1 3 4 5 6 7 8 9 29 30 -
(118 photos)
-
- diff --git a/vendor/plugins/will_paginate/examples/pagination.css b/vendor/plugins/will_paginate/examples/pagination.css deleted file mode 100644 index b55e977..0000000 --- a/vendor/plugins/will_paginate/examples/pagination.css +++ /dev/null @@ -1,90 +0,0 @@ -.digg_pagination { - background: white; - /* self-clearing method: */ } - .digg_pagination a, .digg_pagination span { - padding: .2em .5em; - display: block; - float: left; - margin-right: 1px; } - .digg_pagination span.disabled { - color: #999; - border: 1px solid #DDD; } - .digg_pagination span.current { - font-weight: bold; - background: #2E6AB1; - color: white; - border: 1px solid #2E6AB1; } - .digg_pagination a { - text-decoration: none; - color: #105CB6; - border: 1px solid #9AAFE5; } - .digg_pagination a:hover, .digg_pagination a:focus { - color: #003; - border-color: #003; } - .digg_pagination .page_info { - background: #2E6AB1; - color: white; - padding: .4em .6em; - width: 22em; - margin-bottom: .3em; - text-align: center; } - .digg_pagination .page_info b { - color: #003; - background: #6aa6ed; - padding: .1em .25em; } - .digg_pagination:after { - content: "."; - display: block; - height: 0; - clear: both; - visibility: hidden; } - * html .digg_pagination { - height: 1%; } - *:first-child+html .digg_pagination { - overflow: hidden; } - -.apple_pagination { - background: #F1F1F1; - border: 1px solid #E5E5E5; - text-align: center; - padding: 1em; } - .apple_pagination a, .apple_pagination span { - padding: .2em .3em; } - .apple_pagination span.disabled { - color: #AAA; } - .apple_pagination span.current { - font-weight: bold; - background: transparent url(apple-circle.gif) no-repeat 50% 50%; } - .apple_pagination a { - text-decoration: none; - color: black; } - .apple_pagination a:hover, .apple_pagination a:focus { - text-decoration: underline; } - -.flickr_pagination { - text-align: center; - padding: .3em; } - .flickr_pagination a, .flickr_pagination span { - padding: .2em .5em; } - .flickr_pagination span.disabled { - color: #AAA; } - .flickr_pagination span.current { - font-weight: bold; - color: #FF0084; } - .flickr_pagination a { - border: 1px solid #DDDDDD; - color: #0063DC; - text-decoration: none; } - .flickr_pagination a:hover, .flickr_pagination a:focus { - border-color: #003366; - background: #0063DC; - color: white; } - .flickr_pagination .page_info { - color: #aaa; - padding-top: .8em; } - .flickr_pagination .prev_page, .flickr_pagination .next_page { - border-width: 2px; } - .flickr_pagination .prev_page { - margin-right: 1em; } - .flickr_pagination .next_page { - margin-left: 1em; } diff --git a/vendor/plugins/will_paginate/examples/pagination.sass b/vendor/plugins/will_paginate/examples/pagination.sass deleted file mode 100644 index 737a97b..0000000 --- a/vendor/plugins/will_paginate/examples/pagination.sass +++ /dev/null @@ -1,91 +0,0 @@ -.digg_pagination - :background white - a, span - :padding .2em .5em - :display block - :float left - :margin-right 1px - span.disabled - :color #999 - :border 1px solid #DDD - span.current - :font-weight bold - :background #2E6AB1 - :color white - :border 1px solid #2E6AB1 - a - :text-decoration none - :color #105CB6 - :border 1px solid #9AAFE5 - &:hover, &:focus - :color #003 - :border-color #003 - .page_info - :background #2E6AB1 - :color white - :padding .4em .6em - :width 22em - :margin-bottom .3em - :text-align center - b - :color #003 - :background = #2E6AB1 + 60 - :padding .1em .25em - - /* self-clearing method: - &:after - :content "." - :display block - :height 0 - :clear both - :visibility hidden - * html & - :height 1% - *:first-child+html & - :overflow hidden - -.apple_pagination - :background #F1F1F1 - :border 1px solid #E5E5E5 - :text-align center - :padding 1em - a, span - :padding .2em .3em - span.disabled - :color #AAA - span.current - :font-weight bold - :background transparent url(apple-circle.gif) no-repeat 50% 50% - a - :text-decoration none - :color black - &:hover, &:focus - :text-decoration underline - -.flickr_pagination - :text-align center - :padding .3em - a, span - :padding .2em .5em - span.disabled - :color #AAA - span.current - :font-weight bold - :color #FF0084 - a - :border 1px solid #DDDDDD - :color #0063DC - :text-decoration none - &:hover, &:focus - :border-color #003366 - :background #0063DC - :color white - .page_info - :color #aaa - :padding-top .8em - .prev_page, .next_page - :border-width 2px - .prev_page - :margin-right 1em - .next_page - :margin-left 1em diff --git a/vendor/plugins/will_paginate/init.rb b/vendor/plugins/will_paginate/init.rb deleted file mode 100644 index 838d30e..0000000 --- a/vendor/plugins/will_paginate/init.rb +++ /dev/null @@ -1 +0,0 @@ -require 'will_paginate' diff --git a/vendor/plugins/will_paginate/lib/will_paginate.rb b/vendor/plugins/will_paginate/lib/will_paginate.rb deleted file mode 100644 index ee81c5d..0000000 --- a/vendor/plugins/will_paginate/lib/will_paginate.rb +++ /dev/null @@ -1,43 +0,0 @@ -require 'will_paginate/deprecation' - -# = You *will* paginate! -# -# First read about WillPaginate::Finder::ClassMethods, then see -# WillPaginate::ViewHelpers. The magical array you're handling in-between is -# WillPaginate::Collection. -# -# Happy paginating! -module WillPaginate - def self.enable - Deprecation.warn "WillPaginate::enable() doesn't do anything anymore" - end - - # Enable named_scope, a feature of Rails 2.1, even if you have older Rails - # (tested on Rails 2.0.2 and 1.2.6). - # - # You can pass +false+ for +patch+ parameter to skip monkeypatching - # *associations*. Use this if you feel that named_scope broke - # has_many, has_many :through or has_and_belongs_to_many associations in - # your app. By passing +false+, you can still use named_scope in - # your models, but not through associations. - def self.enable_named_scope(patch = true) - return if defined? ActiveRecord::NamedScope - require 'will_paginate/finders/active_record/named_scope' - require 'will_paginate/finders/active_record/named_scope_patch' if patch - - ActiveRecord::Base.send :include, WillPaginate::NamedScope - end -end - -if defined?(Rails) - require 'will_paginate/view_helpers/action_view' if defined?(ActionController) - require 'will_paginate/finders/active_record' if defined?(ActiveRecord) -end - -if defined?(Merb::Plugins) - require 'will_paginate/collection' - require 'will_paginate/view_helpers/base' - require 'will_paginate/view_helpers/link_renderer' - # this only includes will_paginate view stuff in Merb (not finder adapters) - Merb::AbstractController.send(:include, WillPaginate::ViewHelpers::Base) -end diff --git a/vendor/plugins/will_paginate/lib/will_paginate/array.rb b/vendor/plugins/will_paginate/lib/will_paginate/array.rb deleted file mode 100644 index 1076760..0000000 --- a/vendor/plugins/will_paginate/lib/will_paginate/array.rb +++ /dev/null @@ -1,33 +0,0 @@ -require 'will_paginate/collection' - -class Array - # Paginates a static array (extracting a subset of it). The result is a - # WillPaginate::Collection instance, which is an array with few more - # properties about its paginated state. - # - # Parameters: - # * :page - current page, defaults to 1 - # * :per_page - limit of items per page, defaults to 30 - # * :total_entries - total number of items in the array, defaults to - # array.length (obviously) - # - # Example: - # arr = ['a', 'b', 'c', 'd', 'e'] - # paged = arr.paginate(:per_page => 2) #-> ['a', 'b'] - # paged.total_entries #-> 5 - # arr.paginate(:page => 2, :per_page => 2) #-> ['c', 'd'] - # arr.paginate(:page => 3, :per_page => 2) #-> ['e'] - # - # This method was originally {suggested by Desi - # McAdam}[http://www.desimcadam.com/archives/8] and later proved to be the - # most useful method of will_paginate library. - def paginate(options = {}) - raise ArgumentError, "parameter hash expected (got #{options.inspect})" unless Hash === options - - WillPaginate::Collection.create options[:page] || 1, - options[:per_page] || 30, - options[:total_entries] || self.length do |pager| - pager.replace self[pager.offset, pager.per_page].to_a - end - end -end diff --git a/vendor/plugins/will_paginate/lib/will_paginate/collection.rb b/vendor/plugins/will_paginate/lib/will_paginate/collection.rb deleted file mode 100644 index 89d992f..0000000 --- a/vendor/plugins/will_paginate/lib/will_paginate/collection.rb +++ /dev/null @@ -1,145 +0,0 @@ -module WillPaginate - # = Invalid page number error - # This is an ArgumentError raised in case a page was requested that is either - # zero or negative number. You should decide how do deal with such errors in - # the controller. - # - # If you're using Rails 2, then this error will automatically get handled like - # 404 Not Found. The hook is in "will_paginate.rb": - # - # ActionController::Base.rescue_responses['WillPaginate::InvalidPage'] = :not_found - # - # If you don't like this, use your preffered method of rescuing exceptions in - # public from your controllers to handle this differently. The +rescue_from+ - # method is a nice addition to Rails 2. - # - # This error is *not* raised when a page further than the last page is - # requested. Use WillPaginate::Collection#out_of_bounds? method to - # check for those cases and manually deal with them as you see fit. - class InvalidPage < ArgumentError - def initialize(page, page_num) - super "#{page.inspect} given as value, which translates to '#{page_num}' as page number" - end - end - - # = The key to pagination - # Arrays returned from paginating finds are, in fact, instances of this little - # class. You may think of WillPaginate::Collection as an ordinary array with - # some extra properties. Those properties are used by view helpers to generate - # correct page links. - # - # WillPaginate::Collection also assists in rolling out your own pagination - # solutions: see +create+. - # - # If you are writing a library that provides a collection which you would like - # to conform to this API, you don't have to copy these methods over; simply - # make your plugin/gem dependant on the "will_paginate" gem: - # - # gem 'will_paginate' - # require 'will_paginate/collection' - # - # # now use WillPaginate::Collection directly or subclass it - class Collection < Array - attr_reader :current_page, :per_page, :total_entries, :total_pages - - # Arguments to the constructor are the current page number, per-page limit - # and the total number of entries. The last argument is optional because it - # is best to do lazy counting; in other words, count *conditionally* after - # populating the collection using the +replace+ method. - def initialize(page, per_page, total = nil) - @current_page = page.to_i - raise InvalidPage.new(page, @current_page) if @current_page < 1 - @per_page = per_page.to_i - raise ArgumentError, "`per_page` setting cannot be less than 1 (#{@per_page} given)" if @per_page < 1 - - self.total_entries = total if total - end - - # Just like +new+, but yields the object after instantiation and returns it - # afterwards. This is very useful for manual pagination: - # - # @entries = WillPaginate::Collection.create(1, 10) do |pager| - # result = Post.find(:all, :limit => pager.per_page, :offset => pager.offset) - # # inject the result array into the paginated collection: - # pager.replace(result) - # - # unless pager.total_entries - # # the pager didn't manage to guess the total count, do it manually - # pager.total_entries = Post.count - # end - # end - # - # The possibilities with this are endless. For another example, here is how - # WillPaginate used to define pagination for Array instances: - # - # Array.class_eval do - # def paginate(page = 1, per_page = 15) - # WillPaginate::Collection.create(page, per_page, size) do |pager| - # pager.replace self[pager.offset, pager.per_page].to_a - # end - # end - # end - # - # The Array#paginate API has since then changed, but this still serves as a - # fine example of WillPaginate::Collection usage. - def self.create(page, per_page, total = nil, &block) - pager = new(page, per_page, total) - yield pager - pager - end - - # Helper method that is true when someone tries to fetch a page with a - # larger number than the last page. Can be used in combination with flashes - # and redirecting. - def out_of_bounds? - current_page > total_pages - end - - # Current offset of the paginated collection. If we're on the first page, - # it is always 0. If we're on the 2nd page and there are 30 entries per page, - # the offset is 30. This property is useful if you want to render ordinals - # besides your records: simply start with offset + 1. - def offset - (current_page - 1) * per_page - end - - # current_page - 1 or nil if there is no previous page - def previous_page - current_page > 1 ? (current_page - 1) : nil - end - - # current_page + 1 or nil if there is no next page - def next_page - current_page < total_pages ? (current_page + 1) : nil - end - - def total_entries=(number) - @total_entries = number.to_i - @total_pages = (@total_entries / per_page.to_f).ceil - end - - # This is a magic wrapper for the original Array#replace method. It serves - # for populating the paginated collection after initialization. - # - # Why magic? Because it tries to guess the total number of entries judging - # by the size of given array. If it is shorter than +per_page+ limit, then we - # know we're on the last page. This trick is very useful for avoiding - # unnecessary hits to the database to do the counting after we fetched the - # data for the current page. - # - # However, after using +replace+ you should always test the value of - # +total_entries+ and set it to a proper value if it's +nil+. See the example - # in +create+. - def replace(array) - result = super - - # The collection is shorter then page limit? Rejoice, because - # then we know that we are on the last page! - if total_entries.nil? and length < per_page and (current_page == 1 or length > 0) - self.total_entries = offset + length - end - - result - end - end -end diff --git a/vendor/plugins/will_paginate/lib/will_paginate/core_ext.rb b/vendor/plugins/will_paginate/lib/will_paginate/core_ext.rb deleted file mode 100644 index 4601f00..0000000 --- a/vendor/plugins/will_paginate/lib/will_paginate/core_ext.rb +++ /dev/null @@ -1,58 +0,0 @@ -require 'set' -require 'will_paginate/array' - -## Everything below blatantly stolen from ActiveSupport :o - -unless Hash.instance_methods.include? 'except' - Hash.class_eval do - # Returns a new hash without the given keys. - def except(*keys) - rejected = Set.new(respond_to?(:convert_key) ? keys.map { |key| convert_key(key) } : keys) - reject { |key,| rejected.include?(key) } - end - - # Replaces the hash without only the given keys. - def except!(*keys) - replace(except(*keys)) - end - end -end - -unless Hash.instance_methods.include? 'slice' - Hash.class_eval do - # Returns a new hash with only the given keys. - def slice(*keys) - allowed = Set.new(respond_to?(:convert_key) ? keys.map { |key| convert_key(key) } : keys) - reject { |key,| !allowed.include?(key) } - end - - # Replaces the hash with only the given keys. - def slice!(*keys) - replace(slice(*keys)) - end - end -end - -unless String.instance_methods.include? 'constantize' - String.class_eval do - def constantize - unless /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/ =~ self - raise NameError, "#{self.inspect} is not a valid constant name!" - end - - Object.module_eval("::#{$1}", __FILE__, __LINE__) - end - end -end - -unless String.instance_methods.include? 'underscore' - String.class_eval do - def underscore - self.to_s.gsub(/::/, '/'). - gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). - gsub(/([a-z\d])([A-Z])/,'\1_\2'). - tr("-", "_"). - downcase - end - end -end diff --git a/vendor/plugins/will_paginate/lib/will_paginate/deprecation.rb b/vendor/plugins/will_paginate/lib/will_paginate/deprecation.rb deleted file mode 100644 index 2c44d1e..0000000 --- a/vendor/plugins/will_paginate/lib/will_paginate/deprecation.rb +++ /dev/null @@ -1,50 +0,0 @@ -# borrowed from ActiveSupport::Deprecation -module WillPaginate - module Deprecation - def self.debug() @debug; end - def self.debug=(value) @debug = value; end - self.debug = false - - # Choose the default warn behavior according to RAILS_ENV. - # Ignore deprecation warnings in production. - BEHAVIORS = { - 'test' => Proc.new { |message, callstack| - $stderr.puts(message) - $stderr.puts callstack.join("\n ") if debug - }, - 'development' => Proc.new { |message, callstack| - logger = defined?(::RAILS_DEFAULT_LOGGER) ? ::RAILS_DEFAULT_LOGGER : Logger.new($stderr) - logger.warn message - logger.debug callstack.join("\n ") if debug - } - } - - def self.warn(message, callstack = caller) - if behavior - message = 'WillPaginate: ' + message.strip.gsub(/\s+/, ' ') - behavior.call(message, callstack) - end - end - - def self.default_behavior - if defined?(RAILS_ENV) - BEHAVIORS[RAILS_ENV.to_s] - else - BEHAVIORS['test'] - end - end - - # Behavior is a block that takes a message argument. - def self.behavior() @behavior; end - def self.behavior=(value) @behavior = value; end - self.behavior = default_behavior - - def self.silence - old_behavior = self.behavior - self.behavior = nil - yield - ensure - self.behavior = old_behavior - end - end -end diff --git a/vendor/plugins/will_paginate/lib/will_paginate/finders.rb b/vendor/plugins/will_paginate/lib/will_paginate/finders.rb deleted file mode 100644 index ca41f5b..0000000 --- a/vendor/plugins/will_paginate/lib/will_paginate/finders.rb +++ /dev/null @@ -1,9 +0,0 @@ -require 'will_paginate/core_ext' - -module WillPaginate - # Database logic for different ORMs - # - # See WillPaginate::Finders::Base - module Finders - end -end diff --git a/vendor/plugins/will_paginate/lib/will_paginate/finders/active_record.rb b/vendor/plugins/will_paginate/lib/will_paginate/finders/active_record.rb deleted file mode 100644 index 84c99ff..0000000 --- a/vendor/plugins/will_paginate/lib/will_paginate/finders/active_record.rb +++ /dev/null @@ -1,204 +0,0 @@ -require 'will_paginate/finders/base' -require 'active_record' - -module WillPaginate::Finders - # = Paginating finders for ActiveRecord models - # - # WillPaginate adds +paginate+, +per_page+ and other methods to - # ActiveRecord::Base class methods and associations. It also hooks into - # +method_missing+ to intercept pagination calls to dynamic finders such as - # +paginate_by_user_id+ and translate them to ordinary finders - # (+find_all_by_user_id+ in this case). - # - # In short, paginating finders are equivalent to ActiveRecord finders; the - # only difference is that we start with "paginate" instead of "find" and - # that :page is required parameter: - # - # @posts = Post.paginate :all, :page => params[:page], :order => 'created_at DESC' - # - # In paginating finders, "all" is implicit. There is no sense in paginating - # a single record, right? So, you can drop the :all argument: - # - # Post.paginate(...) => Post.find :all - # Post.paginate_all_by_something => Post.find_all_by_something - # Post.paginate_by_something => Post.find_all_by_something - # - # == The importance of the :order parameter - # - # In ActiveRecord finders, :order parameter specifies columns for - # the ORDER BY clause in SQL. It is important to have it, since - # pagination only makes sense with ordered sets. Without the ORDER - # BY clause, databases aren't required to do consistent ordering when - # performing SELECT queries; this is especially true for - # PostgreSQL. - # - # Therefore, make sure you are doing ordering on a column that makes the - # most sense in the current context. Make that obvious to the user, also. - # For perfomance reasons you will also want to add an index to that column. - module ActiveRecord - include WillPaginate::Finders::Base - - # Wraps +find_by_sql+ by simply adding LIMIT and OFFSET to your SQL string - # based on the params otherwise used by paginating finds: +page+ and - # +per_page+. - # - # Example: - # - # @developers = Developer.paginate_by_sql ['select * from developers where salary > ?', 80000], - # :page => params[:page], :per_page => 3 - # - # A query for counting rows will automatically be generated if you don't - # supply :total_entries. If you experience problems with this - # generated SQL, you might want to perform the count manually in your - # application. - # - def paginate_by_sql(sql, options) - WillPaginate::Collection.create(*wp_parse_options(options)) do |pager| - query = sanitize_sql(sql.dup) - original_query = query.dup - # add limit, offset - add_limit! query, :offset => pager.offset, :limit => pager.per_page - # perfom the find - pager.replace find_by_sql(query) - - unless pager.total_entries - count_query = original_query.sub /\bORDER\s+BY\s+[\w`,\s]+$/mi, '' - count_query = "SELECT COUNT(*) FROM (#{count_query})" - - unless ['oracle', 'oci'].include?(self.connection.adapter_name.downcase) - count_query << ' AS count_table' - end - # perform the count query - pager.total_entries = count_by_sql(count_query) - end - end - end - - def respond_to?(method, include_priv = false) #:nodoc: - super(method.to_s.sub(/^paginate/, 'find'), include_priv) - end - - protected - - def method_missing_with_paginate(method, *args, &block) #:nodoc: - # did somebody tried to paginate? if not, let them be - unless method.to_s.index('paginate') == 0 - return method_missing_without_paginate(method, *args, &block) - end - - # paginate finders are really just find_* with limit and offset - finder = method.to_s.sub('paginate', 'find') - finder.sub!('find', 'find_all') if finder.index('find_by_') == 0 - - options = args.pop - raise ArgumentError, 'parameter hash expected' unless options.respond_to? :symbolize_keys - options = options.dup - options[:finder] = finder - args << options - - paginate(*args, &block) - end - - def wp_query(options, pager, args, &block) - finder = (options.delete(:finder) || 'find').to_s - find_options = options.except(:count).update(:offset => pager.offset, :limit => pager.per_page) - - if finder == 'find' - if Array === args.first and !pager.total_entries - pager.total_entries = args.first.size - end - args << :all if args.empty? - end - - args << find_options - pager.replace send(finder, *args, &block) - - unless pager.total_entries - # magic counting - pager.total_entries = wp_count(options, args, finder) - end - end - - # Does the not-so-trivial job of finding out the total number of entries - # in the database. It relies on the ActiveRecord +count+ method. - def wp_count(options, args, finder) - # find out if we are in a model or an association proxy - klass = (@owner and @reflection) ? @reflection.klass : self - count_options = wp_parse_count_options(options, klass) - - # we may have to scope ... - counter = Proc.new { count(count_options) } - - count = if finder.index('find_') == 0 and klass.respond_to?(scoper = finder.sub('find', 'with')) - # scope_out adds a 'with_finder' method which acts like with_scope, if it's present - # then execute the count with the scoping provided by the with_finder - send(scoper, &counter) - elsif finder =~ /^find_(all_by|by)_([_a-zA-Z]\w*)$/ - # extract conditions from calls like "paginate_by_foo_and_bar" - attribute_names = $2.split('_and_') - conditions = construct_attributes_from_arguments(attribute_names, args) - with_scope(:find => { :conditions => conditions }, &counter) - else - counter.call - end - - count.respond_to?(:length) ? count.length : count - end - - def wp_parse_count_options(options, klass) - excludees = [:count, :order, :limit, :offset, :readonly] - - unless ::ActiveRecord::Calculations::CALCULATIONS_OPTIONS.include?(:from) - # :from parameter wasn't supported in count() before this change - excludees << :from - end - - # Use :select from scope if it isn't already present. - options[:select] = scope(:find, :select) unless options[:select] - - if options[:select] and options[:select] =~ /^\s*DISTINCT\b/i - # Remove quoting and check for table_name.*-like statement. - if options[:select].gsub('`', '') =~ /\w+\.\*/ - options[:select] = "DISTINCT #{klass.table_name}.#{klass.primary_key}" - end - else - excludees << :select - end - - # count expects (almost) the same options as find - count_options = options.except *excludees - - # merge the hash found in :count - # this allows you to specify :select, :order, or anything else just for the count query - count_options.update options[:count] if options[:count] - - # forget about includes if they are irrelevant (Rails 2.1) - if count_options[:include] and - klass.private_methods.include?('references_eager_loaded_tables?') and - !klass.send(:references_eager_loaded_tables?, count_options) - count_options.delete :include - end - - count_options - end - end -end - -ActiveRecord::Base.class_eval do - extend WillPaginate::Finders::ActiveRecord - class << self - alias_method_chain :method_missing, :paginate - end -end - -# support pagination on associations -a = ActiveRecord::Associations -returning([ a::AssociationCollection ]) { |classes| - # detect http://dev.rubyonrails.org/changeset/9230 - unless a::HasManyThroughAssociation.superclass == a::HasManyAssociation - classes << a::HasManyThroughAssociation - end -}.each do |klass| - klass.send :include, WillPaginate::Finders::ActiveRecord - klass.class_eval { alias_method_chain :method_missing, :paginate } -end diff --git a/vendor/plugins/will_paginate/lib/will_paginate/finders/active_record/named_scope.rb b/vendor/plugins/will_paginate/lib/will_paginate/finders/active_record/named_scope.rb deleted file mode 100644 index 21fc168..0000000 --- a/vendor/plugins/will_paginate/lib/will_paginate/finders/active_record/named_scope.rb +++ /dev/null @@ -1,170 +0,0 @@ -module WillPaginate - # This is a feature backported from Rails 2.1 because of its usefullness not only with will_paginate, - # but in other aspects when managing complex conditions that you want to be reusable. - module NamedScope - # All subclasses of ActiveRecord::Base have two named_scopes: - # * all, which is similar to a find(:all) query, and - # * scoped, which allows for the creation of anonymous scopes, on the fly: Shirt.scoped(:conditions => {:color => 'red'}).scoped(:include => :washing_instructions) - # - # These anonymous scopes tend to be useful when procedurally generating complex queries, where passing - # intermediate values (scopes) around as first-class objects is convenient. - def self.included(base) - base.class_eval do - extend ClassMethods - named_scope :scoped, lambda { |scope| scope } - end - end - - module ClassMethods - def scopes - read_inheritable_attribute(:scopes) || write_inheritable_attribute(:scopes, {}) - end - - # Adds a class method for retrieving and querying objects. A scope represents a narrowing of a database query, - # such as :conditions => {:color => :red}, :select => 'shirts.*', :include => :washing_instructions. - # - # class Shirt < ActiveRecord::Base - # named_scope :red, :conditions => {:color => 'red'} - # named_scope :dry_clean_only, :joins => :washing_instructions, :conditions => ['washing_instructions.dry_clean_only = ?', true] - # end - # - # The above calls to named_scope define class methods Shirt.red and Shirt.dry_clean_only. Shirt.red, - # in effect, represents the query Shirt.find(:all, :conditions => {:color => 'red'}). - # - # Unlike Shirt.find(...), however, the object returned by Shirt.red is not an Array; it resembles the association object - # constructed by a has_many declaration. For instance, you can invoke Shirt.red.find(:first), Shirt.red.count, - # Shirt.red.find(:all, :conditions => {:size => 'small'}). Also, just - # as with the association objects, name scopes acts like an Array, implementing Enumerable; Shirt.red.each(&block), - # Shirt.red.first, and Shirt.red.inject(memo, &block) all behave as if Shirt.red really were an Array. - # - # These named scopes are composable. For instance, Shirt.red.dry_clean_only will produce all shirts that are both red and dry clean only. - # Nested finds and calculations also work with these compositions: Shirt.red.dry_clean_only.count returns the number of garments - # for which these criteria obtain. Similarly with Shirt.red.dry_clean_only.average(:thread_count). - # - # All scopes are available as class methods on the ActiveRecord::Base descendent upon which the scopes were defined. But they are also available to - # has_many associations. If, - # - # class Person < ActiveRecord::Base - # has_many :shirts - # end - # - # then elton.shirts.red.dry_clean_only will return all of Elton's red, dry clean - # only shirts. - # - # Named scopes can also be procedural. - # - # class Shirt < ActiveRecord::Base - # named_scope :colored, lambda { |color| - # { :conditions => { :color => color } } - # } - # end - # - # In this example, Shirt.colored('puce') finds all puce shirts. - # - # Named scopes can also have extensions, just as with has_many declarations: - # - # class Shirt < ActiveRecord::Base - # named_scope :red, :conditions => {:color => 'red'} do - # def dom_id - # 'red_shirts' - # end - # end - # end - # - # - # For testing complex named scopes, you can examine the scoping options using the - # proxy_options method on the proxy itself. - # - # class Shirt < ActiveRecord::Base - # named_scope :colored, lambda { |color| - # { :conditions => { :color => color } } - # } - # end - # - # expected_options = { :conditions => { :colored => 'red' } } - # assert_equal expected_options, Shirt.colored('red').proxy_options - def named_scope(name, options = {}, &block) - name = name.to_sym - scopes[name] = lambda do |parent_scope, *args| - Scope.new(parent_scope, case options - when Hash - options - when Proc - options.call(*args) - end, &block) - end - (class << self; self end).instance_eval do - define_method name do |*args| - scopes[name].call(self, *args) - end - end - end - end - - class Scope - attr_reader :proxy_scope, :proxy_options - - [].methods.each do |m| - unless m =~ /(^__|^nil\?|^send|^object_id$|class|extend|^find$|count|sum|average|maximum|minimum|paginate|first|last|empty\?|respond_to\?)/ - delegate m, :to => :proxy_found - end - end - - delegate :scopes, :with_scope, :to => :proxy_scope - - def initialize(proxy_scope, options, &block) - [options[:extend]].flatten.each { |extension| extend extension } if options[:extend] - extend Module.new(&block) if block_given? - @proxy_scope, @proxy_options = proxy_scope, options.except(:extend) - end - - def reload - load_found; self - end - - def first(*args) - if args.first.kind_of?(Integer) || (@found && !args.first.kind_of?(Hash)) - proxy_found.first(*args) - else - find(:first, *args) - end - end - - def last(*args) - if args.first.kind_of?(Integer) || (@found && !args.first.kind_of?(Hash)) - proxy_found.last(*args) - else - find(:last, *args) - end - end - - def empty? - @found ? @found.empty? : count.zero? - end - - def respond_to?(method, include_private = false) - super || @proxy_scope.respond_to?(method, include_private) - end - - protected - def proxy_found - @found || load_found - end - - private - def method_missing(method, *args, &block) - if scopes.include?(method) - scopes[method].call(self, *args) - else - with_scope :find => proxy_options do - proxy_scope.send(method, *args, &block) - end - end - end - - def load_found - @found = find(:all) - end - end - end -end diff --git a/vendor/plugins/will_paginate/lib/will_paginate/finders/active_record/named_scope_patch.rb b/vendor/plugins/will_paginate/lib/will_paginate/finders/active_record/named_scope_patch.rb deleted file mode 100644 index bdc1997..0000000 --- a/vendor/plugins/will_paginate/lib/will_paginate/finders/active_record/named_scope_patch.rb +++ /dev/null @@ -1,39 +0,0 @@ -## based on http://dev.rubyonrails.org/changeset/9084 - -ActiveRecord::Associations::AssociationProxy.class_eval do - protected - def with_scope(*args, &block) - @reflection.klass.send :with_scope, *args, &block - end -end - -[ ActiveRecord::Associations::AssociationCollection, - ActiveRecord::Associations::HasManyThroughAssociation ].each do |klass| - klass.class_eval do - protected - alias :method_missing_without_scopes :method_missing_without_paginate - def method_missing_without_paginate(method, *args, &block) - if @reflection.klass.scopes.include?(method) - @reflection.klass.scopes[method].call(self, *args, &block) - else - method_missing_without_scopes(method, *args, &block) - end - end - end -end - -# Rails 1.2.6 -ActiveRecord::Associations::HasAndBelongsToManyAssociation.class_eval do - protected - def method_missing(method, *args, &block) - if @target.respond_to?(method) || (!@reflection.klass.respond_to?(method) && Class.respond_to?(method)) - super - elsif @reflection.klass.scopes.include?(method) - @reflection.klass.scopes[method].call(self, *args) - else - @reflection.klass.with_scope(:find => { :conditions => @finder_sql, :joins => @join_sql, :readonly => false }) do - @reflection.klass.send(method, *args, &block) - end - end - end -end if ActiveRecord::Base.respond_to? :find_first diff --git a/vendor/plugins/will_paginate/lib/will_paginate/finders/active_resource.rb b/vendor/plugins/will_paginate/lib/will_paginate/finders/active_resource.rb deleted file mode 100644 index 9ba0236..0000000 --- a/vendor/plugins/will_paginate/lib/will_paginate/finders/active_resource.rb +++ /dev/null @@ -1,48 +0,0 @@ -require 'will_paginate/finders/base' -require 'active_resource' - -module WillPaginate::Finders - # Paginate your ActiveResource models. - # - # @posts = Post.paginate :all, :params => { :page => params[:page], :order => 'created_at DESC' } - module ActiveResource - include WillPaginate::Finders::Base - - protected - - def wp_query(options, pager, args, &block) - unless args.empty? or args.first == :all - raise ArgumentError, "finder arguments other than :all are not supported for pagination (#{args.inspect} given)" - end - params = (options[:params] ||= {}) - params[:page] = pager.current_page - params[:per_page] = pager.per_page - - pager.replace find_every(options, &block) - end - - # Takes the format that Hash.from_xml produces out of an unknown type - # (produced by WillPaginate::Collection#to_xml_with_collection_type), - # parses it into a WillPaginate::Collection, - # and forwards the result to the former +instantiate_collection+ method. - # It only does this for hashes that have a :type => "collection". - def instantiate_collection_with_collection(collection, prefix_options = {}) - if collection.is_a?(Hash) && collection["type"] == "collection" - collectables = collection.values.find{ |c| c.is_a?(Hash) || c.is_a?(Array) } - collectables = [collectables].compact unless collectables.kind_of?(Array) - instantiated_collection = WillPaginate::Collection.create(collection["current_page"], collection["per_page"], collection["total_entries"]) do |pager| - pager.replace instantiate_collection_without_collection(collectables, prefix_options) - end - else - instantiate_collection_without_collection(collection, prefix_options) - end - end - end -end - -ActiveResource::Base.class_eval do - extend WillPaginate::Finders::ActiveResource - class << self - # alias_method_chain :instantiate_collection, :collection - end -end \ No newline at end of file diff --git a/vendor/plugins/will_paginate/lib/will_paginate/finders/base.rb b/vendor/plugins/will_paginate/lib/will_paginate/finders/base.rb deleted file mode 100644 index f643244..0000000 --- a/vendor/plugins/will_paginate/lib/will_paginate/finders/base.rb +++ /dev/null @@ -1,80 +0,0 @@ -require 'will_paginate/core_ext' - -module WillPaginate - module Finders - # Database-agnostic finder logic - module Base - def per_page - @per_page ||= 30 - end - - def per_page=(limit) - @per_page = limit.to_i - end - - # This is the main paginating finder. - # - # == Special parameters for paginating finders - # * :page -- REQUIRED, but defaults to 1 if false or nil - # * :per_page -- defaults to CurrentModel.per_page (which is 30 if not overridden) - # * :total_entries -- use only if you manually count total entries - # * :count -- additional options that are passed on to +count+ - # * :finder -- name of the finder method to use (default: "find") - # - # All other options (+conditions+, +order+, ...) are forwarded to +find+ - # and +count+ calls. - def paginate(*args, &block) - options = args.pop - page, per_page, total_entries = wp_parse_options(options) - - WillPaginate::Collection.create(page, per_page, total_entries) do |pager| - query_options = options.except :page, :per_page, :total_entries - wp_query(query_options, pager, args, &block) - end - end - - # Iterates through all records by loading one page at a time. This is useful - # for migrations or any other use case where you don't want to load all the - # records in memory at once. - # - # It uses +paginate+ internally; therefore it accepts all of its options. - # You can specify a starting page with :page (default is 1). Default - # :order is "id", override if necessary. - # - # {Jamis Buck describes this}[http://weblog.jamisbuck.org/2007/4/6/faking-cursors-in-activerecord] - # and also uses a more efficient way for MySQL. - def paginated_each(options = {}, &block) - options = { :order => 'id', :page => 1 }.merge options - options[:page] = options[:page].to_i - options[:total_entries] = 0 # skip the individual count queries - total = 0 - - begin - collection = paginate(options) - total += collection.each(&block).size - options[:page] += 1 - end until collection.size < collection.per_page - - total - end - - protected - - def wp_parse_options(options) #:nodoc: - raise ArgumentError, 'parameter hash expected' unless Hash === options - raise ArgumentError, ':page parameter required' unless options.key? :page - - if options[:count] and options[:total_entries] - raise ArgumentError, ':count and :total_entries are mutually exclusive' - end - - page = options[:page] || 1 - per_page = options[:per_page] || self.per_page - total = options[:total_entries] - - return [page, per_page, total] - end - - end - end -end diff --git a/vendor/plugins/will_paginate/lib/will_paginate/finders/data_mapper.rb b/vendor/plugins/will_paginate/lib/will_paginate/finders/data_mapper.rb deleted file mode 100644 index c31c5fb..0000000 --- a/vendor/plugins/will_paginate/lib/will_paginate/finders/data_mapper.rb +++ /dev/null @@ -1,30 +0,0 @@ -require 'will_paginate/finders/base' -require 'dm-core' - -module WillPaginate::Finders - module DataMapper - include WillPaginate::Finders::Base - - protected - - def wp_query(options, pager, args, &block) - find_options = options.except(:count).update(:offset => pager.offset, :limit => pager.per_page) - - pager.replace all(find_options, &block) - - unless pager.total_entries - pager.total_entries = wp_count(options) - end - end - - def wp_count(options) - count_options = options.except(:count, :order) - # merge the hash found in :count - count_options.update options[:count] if options[:count] - - count_options.empty?? count() : count(count_options) - end - end -end - -DataMapper::Model.send(:include, WillPaginate::Finders::DataMapper) diff --git a/vendor/plugins/will_paginate/lib/will_paginate/version.rb b/vendor/plugins/will_paginate/lib/will_paginate/version.rb deleted file mode 100644 index ba92b54..0000000 --- a/vendor/plugins/will_paginate/lib/will_paginate/version.rb +++ /dev/null @@ -1,9 +0,0 @@ -module WillPaginate #:nodoc: - module VERSION #:nodoc: - MAJOR = 2 - MINOR = 5 - TINY = 0 - - STRING = [MAJOR, MINOR, TINY].join('.') - end -end diff --git a/vendor/plugins/will_paginate/lib/will_paginate/view_helpers.rb b/vendor/plugins/will_paginate/lib/will_paginate/view_helpers.rb deleted file mode 100644 index 9917cc5..0000000 --- a/vendor/plugins/will_paginate/lib/will_paginate/view_helpers.rb +++ /dev/null @@ -1,39 +0,0 @@ -require 'will_paginate/deprecation' - -module WillPaginate - # = Will Paginate view helpers - # - # Currently there is only one view helper: +will_paginate+. It renders the - # pagination links for the given collection. The helper itself is lightweight - # and serves only as a wrapper around link renderer instantiation; the - # renderer then does all the hard work of generating the HTML. - # - # == Global options for helpers - # - # Options for pagination helpers are optional and get their default values from the - # WillPaginate::ViewHelpers.pagination_options hash. You can write to this hash to - # override default options on the global level: - # - # WillPaginate::ViewHelpers.pagination_options[:previous_label] = 'Previous page' - # - # By putting this into your environment.rb you can easily translate link texts to previous - # and next pages, as well as override some other defaults to your liking. - module ViewHelpers - def self.pagination_options() @pagination_options; end - def self.pagination_options=(value) @pagination_options = value; end - - self.pagination_options = { - :class => 'pagination', - :previous_label => '« Previous', - :next_label => 'Next »', - :inner_window => 4, # links around the current page - :outer_window => 1, # links around beginning and end - :separator => ' ', # single space is friendly to spiders and non-graphic browsers - :param_name => :page, - :params => nil, - :renderer => 'WillPaginate::ViewHelpers::LinkRenderer', - :page_links => true, - :container => true - } - end -end diff --git a/vendor/plugins/will_paginate/lib/will_paginate/view_helpers/action_view.rb b/vendor/plugins/will_paginate/lib/will_paginate/view_helpers/action_view.rb deleted file mode 100644 index 51e8525..0000000 --- a/vendor/plugins/will_paginate/lib/will_paginate/view_helpers/action_view.rb +++ /dev/null @@ -1,82 +0,0 @@ -require 'will_paginate/view_helpers/base' -require 'action_view' -require 'will_paginate/view_helpers/link_renderer' - -module WillPaginate - module ViewHelpers - # ActionView helpers for Rails integration - module ActionView - include WillPaginate::ViewHelpers::Base - - def will_paginate(collection = nil, options = {}) - options, collection = collection, nil if collection.is_a? Hash - collection ||= infer_collection_from_controller - - super(collection, options.symbolize_keys) - end - - def page_entries_info(collection = nil, options = {}) - options, collection = collection, nil if collection.is_a? Hash - collection ||= infer_collection_from_controller - - super(collection, options.symbolize_keys) - end - - # Wrapper for rendering pagination links at both top and bottom of a block - # of content. - # - # <% paginated_section @posts do %> - #
    - # <% for post in @posts %> - #
  1. ...
  2. - # <% end %> - #
- # <% end %> - # - # will result in: - # - # - #
    - # ... - #
- # - # - # Arguments are passed to a will_paginate call, so the same options - # apply. Don't use the :id option; otherwise you'll finish with two - # blocks of pagination links sharing the same ID (which is invalid HTML). - def paginated_section(*args, &block) - pagination = will_paginate(*args).to_s - content = pagination + capture(&block) + pagination - concat content, block.binding - end - - protected - - def infer_collection_from_controller - collection_name = "@#{controller.controller_name}" - collection = instance_variable_get(collection_name) - raise ArgumentError, "The #{collection_name} variable appears to be empty. Did you " + - "forget to pass the collection object for will_paginate?" if collection.nil? - collection - end - end - end -end - -ActionView::Base.send :include, WillPaginate::ViewHelpers::ActionView - -if defined?(ActionController::Base) and ActionController::Base.respond_to? :rescue_responses - ActionController::Base.rescue_responses['WillPaginate::InvalidPage'] = :not_found -end - -WillPaginate::ViewHelpers::LinkRenderer.class_eval do - protected - - def default_url_params - { :escape => false } - end - - def generate_url(params) - @template.url_for(params) - end -end \ No newline at end of file diff --git a/vendor/plugins/will_paginate/lib/will_paginate/view_helpers/base.rb b/vendor/plugins/will_paginate/lib/will_paginate/view_helpers/base.rb deleted file mode 100644 index c5a0ecb..0000000 --- a/vendor/plugins/will_paginate/lib/will_paginate/view_helpers/base.rb +++ /dev/null @@ -1,137 +0,0 @@ -require 'will_paginate/core_ext' -require 'will_paginate/view_helpers' - -module WillPaginate - module ViewHelpers - module Base - # Renders Digg/Flickr-style pagination for a WillPaginate::Collection - # object. Nil is returned if there is only one page in total; no point in - # rendering the pagination in that case... - # - # ==== Options - # * :class -- CSS class name for the generated DIV (default: "pagination") - # * :previous_label -- default: "« Previous" - # * :next_label -- default: "Next »" - # * :inner_window -- how many links are shown around the current page (default: 4) - # * :outer_window -- how many links are around the first and the last page (default: 1) - # * :separator -- string separator for page HTML elements (default: single space) - # * :param_name -- parameter name for page number in URLs (default: :page) - # * :params -- additional parameters when generating pagination links - # (eg. :controller => "foo", :action => nil) - # * :renderer -- class name, class or instance of a link renderer (default: - # WillPaginate::LinkRenderer) - # * :page_links -- when false, only previous/next links are rendered (default: true) - # * :container -- toggles rendering of the DIV container for pagination links, set to - # false only when you are rendering your own pagination markup (default: true) - # * :id -- HTML ID for the container (default: nil). Pass +true+ to have the ID - # automatically generated from the class name of objects in collection: for example, paginating - # ArticleComment models would yield an ID of "article_comments_pagination". - # - # All options beside listed ones are passed as HTML attributes to the container - # element for pagination links (the DIV). For example: - # - # <%= will_paginate @posts, :id => 'wp_posts' %> - # - # ... will result in: - # - # - # - # ==== Using the helper without arguments - # If the helper is called without passing in the collection object, it will - # try to read from the instance variable inferred by the controller name. - # For example, calling +will_paginate+ while the current controller is - # PostsController will result in trying to read from the @posts - # variable. Example: - # - # <%= will_paginate :id => true %> - # - # ... will result in @post collection getting paginated: - # - # - # - def will_paginate(collection, options = {}) - # early exit if there is nothing to render - return nil unless collection.total_pages > 1 - - options = WillPaginate::ViewHelpers.pagination_options.merge(options) - - if options[:prev_label] - WillPaginate::Deprecation::warn(":prev_label view parameter is now :previous_label; the old name has been deprecated.") - options[:previous_label] = options.delete(:prev_label) - end - - # get the renderer instance - renderer = case options[:renderer] - when String - options[:renderer].constantize.new - when Class - options[:renderer].new - else - options[:renderer] - end - # render HTML for pagination - renderer.prepare collection, options, self - renderer.to_html - end - - # Renders a helpful message with numbers of displayed vs. total entries. - # You can use this as a blueprint for your own, similar helpers. - # - # <%= page_entries_info @posts %> - # #-> Displaying posts 6 - 10 of 26 in total - # - # By default, the message will use the humanized class name of objects - # in collection: for instance, "project types" for ProjectType models. - # Override this to your liking with the :entry_name parameter: - # - # <%= page_entries_info @posts, :entry_name => 'item' %> - # #-> Displaying items 6 - 10 of 26 in total - # - # Entry name is entered in singular and pluralized with - # String#pluralize method from ActiveSupport. If it isn't - # loaded, specify plural with :plural_name parameter: - # - # <%= page_entries_info @posts, :entry_name => 'item', :plural_name => 'items' %> - # - # By default, this method produces HTML output. You can trigger plain - # text output by passing :html => false in options. - def page_entries_info(collection, options = {}) - entry_name = options[:entry_name] || (collection.empty?? 'entry' : - collection.first.class.name.underscore.gsub('_', ' ')) - - plural_name = if options[:plural_name] - options[:plural_name] - elsif entry_name == 'entry' - plural_name = 'entries' - elsif entry_name.respond_to? :pluralize - plural_name = entry_name.pluralize - else - entry_name + 's' - end - - unless options[:html] == false - b = '' - eb = '' - sp = ' ' - else - b = eb = '' - sp = ' ' - end - - if collection.total_pages < 2 - case collection.size - when 0; "No #{plural_name} found" - when 1; "Displaying #{b}1#{eb} #{entry_name}" - else; "Displaying #{b}all #{collection.size}#{eb} #{plural_name}" - end - else - %{Displaying #{plural_name} #{b}%d#{sp}-#{sp}%d#{eb} of #{b}%d#{eb} in total} % [ - collection.offset + 1, - collection.offset + collection.length, - collection.total_entries - ] - end - end - end - end -end diff --git a/vendor/plugins/will_paginate/lib/will_paginate/view_helpers/link_renderer.rb b/vendor/plugins/will_paginate/lib/will_paginate/view_helpers/link_renderer.rb deleted file mode 100644 index 305155d..0000000 --- a/vendor/plugins/will_paginate/lib/will_paginate/view_helpers/link_renderer.rb +++ /dev/null @@ -1,177 +0,0 @@ -require 'cgi' -require 'will_paginate/core_ext' -require 'will_paginate/view_helpers/link_renderer_base' - -module WillPaginate - module ViewHelpers - # This class does the heavy lifting of actually building the pagination - # links. It is used by +will_paginate+ helper internally. - class LinkRenderer < LinkRendererBase - - # * +collection+ is a WillPaginate::Collection instance or any other object - # that conforms to that API - # * +options+ are forwarded from +will_paginate+ view helper - # * +template+ is the reference to the template being rendered - def prepare(collection, options, template) - super(collection, options) - @template = template - @container_attributes = @base_url_params = nil - end - - # Process it! This method returns the complete HTML string which contains - # pagination links. Feel free to subclass LinkRenderer and change this - # method as you see fit. - def to_html - html = pagination.map do |item| - item.is_a?(Fixnum) ? - page_number(item) : - send(item) - end.join(@options[:separator]) - - @options[:container] ? html_container(html) : html - end - - # Returns the subset of +options+ this instance was initialized with that - # represent HTML attributes for the container element of pagination links. - def container_attributes - @container_attributes ||= begin - attributes = @options.except *(WillPaginate::ViewHelpers.pagination_options.keys - [:class]) - # pagination of Post models will have the ID of "posts_pagination" - if @options[:container] and @options[:id] === true - attributes[:id] = @collection.first.class.name.underscore.pluralize + '_pagination' - end - attributes - end - end - - protected - - def page_number(page) - unless page == current_page - link(page, page, :rel => rel_value(page)) - else - tag(:em, page) - end - end - - def gap - '' - end - - def previous_page - previous_or_next_page(@collection.previous_page, @options[:previous_label], 'previous_page') - end - - def next_page - previous_or_next_page(@collection.next_page, @options[:next_label], 'next_page') - end - - def previous_or_next_page(page, text, classname) - if page - link(text, page, :class => classname) - else - tag(:span, text, :class => classname + ' disabled') - end - end - - def html_container(html) - tag(:div, html, container_attributes) - end - - # Returns URL params for +page_link_or_span+, taking the current GET params - # and :params option into account. - def url(page) - @base_url_params ||= begin - url_params = base_url_params - merge_optional_params(url_params) - url_params - end - - url_params = @base_url_params.dup - add_current_page_param(url_params, page) - - generate_url(url_params) - end - - def default_url_params - { } - end - - def base_url_params - url_params = default_url_params - # page links should preserve GET parameters - symbolized_update(url_params, @template.params) if get_request? - url_params - end - - def merge_optional_params(url_params) - symbolized_update(url_params, @options[:params]) if @options[:params] - end - - def add_current_page_param(url_params, page) - unless param_name.index(/[^\w-]/) - url_params[param_name.to_sym] = page - else - page_param = (defined?(CGIMethods) ? CGIMethods : ActionController::AbstractRequest). - parse_query_parameters(param_name + '=' + page.to_s) - - symbolized_update(url_params, page_param) - end - end - - def get_request? - @template.request.get? - end - - def generate_url(params) - @template.url(params) - end - - private - - def link(text, target, attributes = {}) - if target.is_a? Fixnum - attributes[:rel] = rel_value(target) - target = url(target) - end - attributes[:href] = target - tag(:a, text, attributes) - end - - def tag(name, value, attributes = {}) - string_attributes = attributes.inject('') do |attrs, pair| - unless pair.last.nil? - attrs << %( #{pair.first}="#{CGI::escapeHTML(pair.last.to_s)}") - end - attrs - end - "<#{name}#{string_attributes}>#{value}" - end - - def rel_value(page) - case page - when @collection.previous_page; 'prev' + (page == 1 ? ' start' : '') - when @collection.next_page; 'next' - when 1; 'start' - end - end - - def symbolized_update(target, other) - other.each do |key, value| - key = key.to_sym - existing = target[key] - - if value.is_a?(Hash) - target[key] = existing = {} if existing.nil? - if existing.is_a?(Hash) - symbolized_update(existing, value) - return - end - end - - target[key] = value - end - end - end - end -end diff --git a/vendor/plugins/will_paginate/lib/will_paginate/view_helpers/link_renderer_base.rb b/vendor/plugins/will_paginate/lib/will_paginate/view_helpers/link_renderer_base.rb deleted file mode 100644 index 26f0f72..0000000 --- a/vendor/plugins/will_paginate/lib/will_paginate/view_helpers/link_renderer_base.rb +++ /dev/null @@ -1,76 +0,0 @@ -require 'will_paginate/view_helpers' - -module WillPaginate - module ViewHelpers - # This class does the heavy lifting of actually building the pagination - # links. It is used by +will_paginate+ helper internally. - class LinkRendererBase - - # * +collection+ is a WillPaginate::Collection instance or any other object - # that conforms to that API - # * +options+ are forwarded from +will_paginate+ view helper - def prepare(collection, options) - @collection = collection - @options = options - - # reset values in case we're re-using this instance - @total_pages = @param_name = nil - end - - def pagination - items = @options[:page_links] ? windowed_page_numbers : [] - items.unshift :previous_page - items.push :next_page - end - - protected - - # Calculates visible page numbers using the :inner_window and - # :outer_window options. - def windowed_page_numbers - inner_window, outer_window = @options[:inner_window].to_i, @options[:outer_window].to_i - window_from = current_page - inner_window - window_to = current_page + inner_window - - # adjust lower or upper limit if other is out of bounds - if window_to > total_pages - window_from -= window_to - total_pages - window_to = total_pages - end - if window_from < 1 - window_to += 1 - window_from - window_from = 1 - window_to = total_pages if window_to > total_pages - end - - visible = (1..total_pages).to_a - left_gap = (2 + outer_window)...window_from - right_gap = (window_to + 1)...(total_pages - outer_window) - - # replace page numbers that shouldn't be visible with `:gap` - [right_gap, left_gap].each do |gap| - if (gap.last - gap.first) > 1 - visible -= gap.to_a - visible.insert(gap.first - 1, :gap) - end - end - - visible - end - - private - - def current_page - @collection.current_page - end - - def total_pages - @collection.total_pages - end - - def param_name - @param_name ||= @options[:param_name].to_s - end - end - end -end diff --git a/vendor/plugins/will_paginate/spec/collection_spec.rb b/vendor/plugins/will_paginate/spec/collection_spec.rb deleted file mode 100644 index 4d71dc9..0000000 --- a/vendor/plugins/will_paginate/spec/collection_spec.rb +++ /dev/null @@ -1,147 +0,0 @@ -require 'will_paginate/array' -require 'spec_helper' - -describe WillPaginate::Collection do - - before :all do - @simple = ('a'..'e').to_a - end - - it "should be a subset of original collection" do - @simple.paginate(:page => 1, :per_page => 3).should == %w( a b c ) - end - - it "can be shorter than per_page if on last page" do - @simple.paginate(:page => 2, :per_page => 3).should == %w( d e ) - end - - it "should include whole collection if per_page permits" do - @simple.paginate(:page => 1, :per_page => 5).should == @simple - end - - it "should be empty if out of bounds" do - @simple.paginate(:page => 2, :per_page => 5).should be_empty - end - - it "should default to 1 as current page and 30 per-page" do - result = (1..50).to_a.paginate - result.current_page.should == 1 - result.size.should == 30 - end - - describe "old API" do - it "should fail with numeric params" do - Proc.new { [].paginate(2) }.should raise_error(ArgumentError) - Proc.new { [].paginate(2, 10) }.should raise_error(ArgumentError) - end - - it "should fail with both options and numeric param" do - Proc.new { [].paginate({}, 5) }.should raise_error(ArgumentError) - end - end - - it "should give total_entries precedence over actual size" do - %w(a b c).paginate(:total_entries => 5).total_entries.should == 5 - end - - it "should be an augmented Array" do - entries = %w(a b c) - collection = create(2, 3, 10) do |pager| - pager.replace(entries).should == entries - end - - collection.should == entries - for method in %w(total_pages each offset size current_page per_page total_entries) - collection.should respond_to(method) - end - collection.should be_kind_of(Array) - collection.entries.should be_instance_of(Array) - # TODO: move to another expectation: - collection.offset.should == 3 - collection.total_pages.should == 4 - collection.should_not be_out_of_bounds - end - - describe "previous/next pages" do - it "should have previous_page nil when on first page" do - collection = create(1, 1, 3) - collection.previous_page.should be_nil - collection.next_page.should == 2 - end - - it "should have both prev/next pages" do - collection = create(2, 1, 3) - collection.previous_page.should == 1 - collection.next_page.should == 3 - end - - it "should have next_page nil when on last page" do - collection = create(3, 1, 3) - collection.previous_page.should == 2 - collection.next_page.should be_nil - end - end - - it "should show out of bounds when page number is too high" do - create(2, 3, 2).should be_out_of_bounds - end - - it "should not show out of bounds when inside collection" do - create(1, 3, 2).should_not be_out_of_bounds - end - - describe "guessing total count" do - it "can guess when collection is shorter than limit" do - collection = create { |p| p.replace array } - collection.total_entries.should == 8 - end - - it "should allow explicit total count to override guessed" do - collection = create(2, 5, 10) { |p| p.replace array } - collection.total_entries.should == 10 - end - - it "should not be able to guess when collection is same as limit" do - collection = create { |p| p.replace array(5) } - collection.total_entries.should be_nil - end - - it "should not be able to guess when collection is empty" do - collection = create { |p| p.replace array(0) } - collection.total_entries.should be_nil - end - - it "should be able to guess when collection is empty and this is the first page" do - collection = create(1) { |p| p.replace array(0) } - collection.total_entries.should == 0 - end - end - - it "should raise WillPaginate::InvalidPage on invalid input" do - for bad_input in [0, -1, nil, '', 'Schnitzel'] - Proc.new { create bad_input }.should raise_error(WillPaginate::InvalidPage) - end - end - - it "should raise Argument error on invalid per_page setting" do - Proc.new { create(1, -1) }.should raise_error(ArgumentError) - end - - it "should not respond to page_count anymore" do - Proc.new { create.page_count }.should raise_error(NoMethodError) - end - - private - - def create(page = 2, limit = 5, total = nil, &block) - if block_given? - WillPaginate::Collection.create(page, limit, total, &block) - else - WillPaginate::Collection.new(page, limit, total) - end - end - - def array(size = 3) - Array.new(size) - end -end diff --git a/vendor/plugins/will_paginate/spec/console b/vendor/plugins/will_paginate/spec/console deleted file mode 100755 index 0d3a360..0000000 --- a/vendor/plugins/will_paginate/spec/console +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env ruby -irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb' -libs = [] - -libs << 'irb/completion' -libs << 'console_fixtures' - -exec "#{irb} -Ilib:spec#{libs.map{ |l| " -r #{l}" }.join} --simple-prompt" diff --git a/vendor/plugins/will_paginate/spec/console_fixtures.rb b/vendor/plugins/will_paginate/spec/console_fixtures.rb deleted file mode 100644 index 1f0853f..0000000 --- a/vendor/plugins/will_paginate/spec/console_fixtures.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'will_paginate/finders/active_record' -require 'finders/activerecord_test_connector' -ActiverecordTestConnector.setup - -# load all fixtures -Fixtures.create_fixtures(ActiverecordTestConnector::FIXTURES_PATH, ActiveRecord::Base.connection.tables) - - diff --git a/vendor/plugins/will_paginate/spec/database.yml b/vendor/plugins/will_paginate/spec/database.yml deleted file mode 100644 index 7ef1e73..0000000 --- a/vendor/plugins/will_paginate/spec/database.yml +++ /dev/null @@ -1,22 +0,0 @@ -sqlite3: - database: ":memory:" - adapter: sqlite3 - timeout: 500 - -sqlite2: - database: ":memory:" - adapter: sqlite2 - -mysql: - adapter: mysql - username: rails - password: mislav - encoding: utf8 - database: will_paginate_unittest - -postgres: - adapter: postgresql - username: mislav - password: mislav - database: will_paginate_unittest - min_messages: warning diff --git a/vendor/plugins/will_paginate/spec/finders/active_record_spec.rb b/vendor/plugins/will_paginate/spec/finders/active_record_spec.rb deleted file mode 100644 index 48866e1..0000000 --- a/vendor/plugins/will_paginate/spec/finders/active_record_spec.rb +++ /dev/null @@ -1,460 +0,0 @@ -require 'spec_helper' -require 'will_paginate/finders/active_record' -require File.dirname(__FILE__) + '/activerecord_test_connector' - -require 'will_paginate' -WillPaginate::enable_named_scope - -class ArProject < ActiveRecord::Base - def self.column_names - ["id"] - end - - named_scope :distinct, :select => "DISTINCT #{table_name}.*" -end - -ActiverecordTestConnector.setup - -describe WillPaginate::Finders::ActiveRecord do - - extend ActiverecordTestConnector::FixtureSetup - - it "should integrate with ActiveRecord::Base" do - ActiveRecord::Base.should respond_to(:paginate) - end - - it "should paginate" do - ArProject.expects(:find).with(:all, { :limit => 5, :offset => 0 }).returns([]) - ArProject.paginate(:page => 1, :per_page => 5) - end - - it "should respond to paginate_by_sql" do - ArProject.should respond_to(:paginate_by_sql) - end - - it "should support explicit :all argument" do - ArProject.expects(:find).with(:all, instance_of(Hash)).returns([]) - ArProject.paginate(:all, :page => nil) - end - - it "should put implicit all in dynamic finders" do - ArProject.expects(:find_all_by_foo).returns([]) - ArProject.expects(:count).returns(0) - ArProject.paginate_by_foo :page => 2 - end - - it "should leave extra parameters intact" do - ArProject.expects(:find).with(:all, {:foo => 'bar', :limit => 4, :offset => 0 }).returns(Array.new(5)) - ArProject.expects(:count).with({:foo => 'bar'}).returns(1) - - ArProject.paginate :foo => 'bar', :page => 1, :per_page => 4 - end - - describe "counting" do - it "should ignore nil in :count parameter" do - ArProject.expects(:find).returns([]) - lambda { ArProject.paginate :page => nil, :count => nil }.should_not raise_error - end - - it "should guess the total count" do - ArProject.expects(:find).returns(Array.new(2)) - ArProject.expects(:count).never - - result = ArProject.paginate :page => 2, :per_page => 4 - result.total_entries.should == 6 - end - - it "should guess that there are no records" do - ArProject.expects(:find).returns([]) - ArProject.expects(:count).never - - result = ArProject.paginate :page => 1, :per_page => 4 - result.total_entries.should == 0 - end - end - - it "should not ignore :select parameter when it says DISTINCT" do - ArProject.stubs(:find).returns([]) - ArProject.expects(:count).with(:select => 'DISTINCT salary').returns(0) - ArProject.paginate :select => 'DISTINCT salary', :page => 2 - end - - it "should count with scoped select when :select => DISTINCT" do - ArProject.stubs(:find).returns([]) - ArProject.expects(:count).with(:select => 'DISTINCT ar_projects.id').returns(0) - ArProject.distinct.paginate :page => 2 - end - - it "should use :with_foo for scope-out compatibility" do - ArProject.expects(:find_best).returns(Array.new(5)) - ArProject.expects(:with_best).returns(1) - - ArProject.paginate_best :page => 1, :per_page => 4 - end - - describe "paginate_by_sql" do - it "should paginate" do - ArProject.expects(:find_by_sql).with(regexp_matches(/sql LIMIT 3(,| OFFSET) 3/)).returns([]) - ArProject.expects(:count_by_sql).with('SELECT COUNT(*) FROM (sql) AS count_table').returns(0) - - ArProject.paginate_by_sql 'sql', :page => 2, :per_page => 3 - end - - it "should respect total_entrier setting" do - ArProject.expects(:find_by_sql).returns([]) - ArProject.expects(:count_by_sql).never - - entries = ArProject.paginate_by_sql 'sql', :page => 1, :total_entries => 999 - entries.total_entries.should == 999 - end - - it "should strip the order when counting" do - ArProject.expects(:find_by_sql).returns([]) - ArProject.expects(:count_by_sql).with("SELECT COUNT(*) FROM (sql\n ) AS count_table").returns(0) - - ArProject.paginate_by_sql "sql\n ORDER\nby foo, bar, `baz` ASC", :page => 2 - end - - it "shouldn't change the original query string" do - query = 'SQL QUERY' - original_query = query.dup - ArProject.expects(:find_by_sql).returns([]) - - ArProject.paginate_by_sql(query, :page => 1) - query.should == original_query - end - end - - # TODO: counts would still be wrong! - it "should be able to paginate custom finders" do - # acts_as_taggable defines find_tagged_with(tag, options) - ArProject.expects(:find_tagged_with).with('will_paginate', :offset => 5, :limit => 5).returns([]) - ArProject.expects(:count).with({}).returns(0) - - ArProject.paginate_tagged_with 'will_paginate', :page => 2, :per_page => 5 - end - - it "should not skip count when given an array argument to a finder" do - ids = (1..8).to_a - ArProject.expects(:find_all_by_id).returns([]) - ArProject.expects(:count).returns(0) - - ArProject.paginate_by_id(ids, :per_page => 3, :page => 2, :order => 'id') - end - - # Is this Rails 2.0? Find out by testing find_all which was removed in [6998] - unless ActiveRecord::Base.respond_to? :find_all - it "should paginate array of IDs" do - # AR finders also accept arrays of IDs - # (this was broken in Rails before [6912]) - lambda { - result = Developer.paginate((1..8).to_a, :per_page => 3, :page => 2, :order => 'id') - result.map(&:id).should == (4..6).to_a - result.total_entries.should == 8 - }.should run_queries(1) - end - end - - it "doesn't mangle options" do - ArProject.expects(:find).returns([]) - options = { :page => 1 } - options.expects(:delete).never - options_before = options.dup - - ArProject.paginate(options) - options.should == options_before - end - - if ::ActiveRecord::Calculations::CALCULATIONS_OPTIONS.include?(:from) - # for ActiveRecord 2.1 and newer - it "keeps the :from parameter in count" do - ArProject.expects(:find).returns([1]) - ArProject.expects(:count).with {|options| options.key?(:from) }.returns(0) - ArProject.paginate(:page => 2, :per_page => 1, :from => 'projects') - end - else - it "excludes :from parameter from count" do - ArProject.expects(:find).returns([1]) - ArProject.expects(:count).with {|options| !options.key?(:from) }.returns(0) - ArProject.paginate(:page => 2, :per_page => 1, :from => 'projects') - end - end - - if ActiverecordTestConnector.able_to_connect - fixtures :topics, :replies, :users, :projects, :developers_projects - - it "should get first page of Topics with a single query" do - lambda { - result = Topic.paginate :page => nil - result.current_page.should == 1 - result.total_pages.should == 1 - result.size.should == 4 - }.should run_queries(1) - end - - it "should get second (inexistent) page of Topics, requiring 2 queries" do - lambda { - result = Topic.paginate :page => 2 - result.total_pages.should == 1 - result.should be_empty - }.should run_queries(2) - end - - it "should paginate with :order" do - result = Topic.paginate :page => 1, :order => 'created_at DESC' - result.should == topics(:futurama, :harvey_birdman, :rails, :ar).reverse - result.total_pages.should == 1 - end - - it "should paginate with :conditions" do - result = Topic.paginate :page => 1, :conditions => ["created_at > ?", 30.minutes.ago] - result.should == topics(:rails, :ar) - result.total_pages.should == 1 - end - - it "should paginate with :include and :conditions" do - result = Topic.paginate \ - :page => 1, - :include => :replies, - :conditions => "replies.content LIKE 'Bird%' ", - :per_page => 10 - - expected = Topic.find :all, - :include => 'replies', - :conditions => "replies.content LIKE 'Bird%' ", - :limit => 10 - - result.should == expected - result.total_entries.should == 1 - end - - it "should paginate with :include and :order" do - result = nil - lambda { - result = Topic.paginate \ - :page => 1, - :include => :replies, - :order => 'replies.created_at asc, topics.created_at asc', - :per_page => 10 - }.should run_queries(2) - - expected = Topic.find :all, - :include => 'replies', - :order => 'replies.created_at asc, topics.created_at asc', - :limit => 10 - - result.should == expected - result.total_entries.should == 4 - end - - # detect ActiveRecord 2.1 - if ActiveRecord::Base.private_methods.include?('references_eager_loaded_tables?') - it "should remove :include for count" do - Developer.expects(:find).returns([1]) - Developer.expects(:count).with({}).returns(0) - - Developer.paginate :page => 1, :per_page => 1, :include => :projects - end - - it "should keep :include for count when they are referenced in :conditions" do - Developer.expects(:find).returns([1]) - Developer.expects(:count).with({ :include => :projects, :conditions => 'projects.id > 2' }).returns(0) - - Developer.paginate :page => 1, :per_page => 1, - :include => :projects, :conditions => 'projects.id > 2' - end - end - - describe "associations" do - it "should paginate with include" do - project = projects(:active_record) - - result = project.topics.paginate \ - :page => 1, - :include => :replies, - :conditions => ["replies.content LIKE ?", 'Nice%'], - :per_page => 10 - - expected = Topic.find :all, - :include => 'replies', - :conditions => ["project_id = #{project.id} AND replies.content LIKE ?", 'Nice%'], - :limit => 10 - - result.should == expected - end - - it "should paginate" do - dhh = users(:david) - expected_name_ordered = projects(:action_controller, :active_record) - expected_id_ordered = projects(:active_record, :action_controller) - - lambda { - # with association-specified order - result = dhh.projects.paginate(:page => 1) - result.should == expected_name_ordered - result.total_entries.should == 2 - }.should run_queries(2) - - # with explicit order - result = dhh.projects.paginate(:page => 1, :order => 'projects.id') - result.should == expected_id_ordered - result.total_entries.should == 2 - - lambda { - dhh.projects.find(:all, :order => 'projects.id', :limit => 4) - }.should_not raise_error - - result = dhh.projects.paginate(:page => 1, :order => 'projects.id', :per_page => 4) - result.should == expected_id_ordered - - # has_many with implicit order - topic = Topic.find(1) - expected = replies(:spam, :witty_retort) - # FIXME: wow, this is ugly - topic.replies.paginate(:page => 1).map(&:id).sort.should == expected.map(&:id).sort - topic.replies.paginate(:page => 1, :order => 'replies.id ASC').should == expected.reverse - end - - it "should paginate through association extension" do - project = Project.find(:first) - expected = [replies(:brave)] - - lambda { - result = project.replies.paginate_recent :page => 1 - result.should == expected - }.should run_queries(1) - end - end - - it "should paginate with joins" do - result = nil - join_sql = 'LEFT JOIN developers_projects ON users.id = developers_projects.developer_id' - - lambda { - result = Developer.paginate :page => 1, :joins => join_sql, :conditions => 'project_id = 1' - result.size.should == 2 - developer_names = result.map(&:name) - developer_names.should include('David') - developer_names.should include('Jamis') - }.should run_queries(1) - - lambda { - expected = result.to_a - result = Developer.paginate :page => 1, :joins => join_sql, - :conditions => 'project_id = 1', :count => { :select => "users.id" } - result.should == expected - result.total_entries.should == 2 - }.should run_queries(1) - end - - it "should paginate with group" do - result = nil - lambda { - result = Developer.paginate :page => 1, :per_page => 10, - :group => 'salary', :select => 'salary', :order => 'salary' - }.should run_queries(1) - - expected = users(:david, :jamis, :dev_10, :poor_jamis).map(&:salary).sort - result.map(&:salary).should == expected - end - - it "should paginate with dynamic finder" do - expected = replies(:witty_retort, :spam) - Reply.paginate_by_topic_id(1, :page => 1).should == expected - - result = Developer.paginate :conditions => { :salary => 100000 }, :page => 1, :per_page => 5 - result.total_entries.should == 8 - Developer.paginate_by_salary(100000, :page => 1, :per_page => 5).should == result - end - - it "should paginate with dynamic finder and conditions" do - result = Developer.paginate_by_salary(100000, :page => 1, :conditions => ['id > ?', 6]) - result.total_entries.should == 4 - result.map(&:id).should == (7..10).to_a - end - - it "should raise error when dynamic finder is not recognized" do - lambda { - Developer.paginate_by_inexistent_attribute 100000, :page => 1 - }.should raise_error(NoMethodError) - end - - it "should paginate with_scope" do - result = Developer.with_poor_ones { Developer.paginate :page => 1 } - result.size.should == 2 - result.total_entries.should == 2 - end - - describe "named_scope" do - it "should paginate" do - result = Developer.poor.paginate :page => 1, :per_page => 1 - result.size.should == 1 - result.total_entries.should == 2 - end - - it "should paginate on habtm association" do - project = projects(:active_record) - lambda { - result = project.developers.poor.paginate :page => 1, :per_page => 1 - result.size.should == 1 - result.total_entries.should == 1 - }.should run_queries(2) - end - - it "should paginate on hmt association" do - project = projects(:active_record) - expected = [replies(:brave)] - - lambda { - result = project.replies.recent.paginate :page => 1, :per_page => 1 - result.should == expected - result.total_entries.should == 1 - }.should run_queries(2) - end - - it "should paginate on has_many association" do - project = projects(:active_record) - expected = [topics(:ar)] - - lambda { - result = project.topics.mentions_activerecord.paginate :page => 1, :per_page => 1 - result.should == expected - result.total_entries.should == 1 - }.should run_queries(2) - end - end - - it "should paginate with :readonly option" do - lambda { Developer.paginate :readonly => true, :page => 1 }.should_not raise_error - end - - end - - protected - - def run_queries(num) - QueryCountMatcher.new(num) - end - -end - -class QueryCountMatcher - def initialize(num) - @queries = num - @old_query_count = $query_count - end - - def matches?(block) - block.call - @queries_run = $query_count - @old_query_count - @queries == @queries_run - end - - def failure_message - "expected #{@queries} queries, got #{@queries_run}" - end - - def negative_failure_message - "expected query count not to be #{$queries}" - end -end \ No newline at end of file diff --git a/vendor/plugins/will_paginate/spec/finders/active_resource_spec.rb b/vendor/plugins/will_paginate/spec/finders/active_resource_spec.rb deleted file mode 100644 index e00bb12..0000000 --- a/vendor/plugins/will_paginate/spec/finders/active_resource_spec.rb +++ /dev/null @@ -1,52 +0,0 @@ -require 'spec_helper' -require 'will_paginate/finders/active_resource' -require 'active_resource/http_mock' - -class AresProject < ActiveResource::Base - self.site = 'http://localhost:4000' -end - -describe WillPaginate::Finders::ActiveResource do - - before :all do - # ActiveResource::HttpMock.respond_to do |mock| - # mock.get "/ares_projects.xml?page=1&per_page=5", {}, [].to_xml - # end - end - - it "should integrate with ActiveResource::Base" do - ActiveResource::Base.should respond_to(:paginate) - end - - it "should error when no parameters for #paginate" do - lambda { AresProject.paginate }.should raise_error(ArgumentError) - end - - it "should paginate" do - AresProject.expects(:find_every).with(:params => { :page => 1, :per_page => 5 }).returns([]) - AresProject.paginate(:page => 1, :per_page => 5) - end - - it "should have 30 per_page as default" do - AresProject.expects(:find_every).with(:params => { :page => 1, :per_page => 30 }).returns([]) - AresProject.paginate(:page => 1) - end - - it "should support #paginate(:all)" do - lambda { AresProject.paginate(:all) }.should raise_error(ArgumentError) - end - - it "should error #paginate(:other)" do - lambda { AresProject.paginate(:first) }.should raise_error(ArgumentError) - end - - protected - - def create(page = 2, limit = 5, total = nil, &block) - if block_given? - WillPaginate::Collection.create(page, limit, total, &block) - else - WillPaginate::Collection.new(page, limit, total) - end - end -end diff --git a/vendor/plugins/will_paginate/spec/finders/activerecord_test_connector.rb b/vendor/plugins/will_paginate/spec/finders/activerecord_test_connector.rb deleted file mode 100644 index fdbb233..0000000 --- a/vendor/plugins/will_paginate/spec/finders/activerecord_test_connector.rb +++ /dev/null @@ -1,107 +0,0 @@ -require 'active_record' -require 'active_record/version' -require 'active_record/fixtures' - -class ActiverecordTestConnector - cattr_accessor :able_to_connect - cattr_accessor :connected - - FIXTURES_PATH = File.join(File.dirname(__FILE__), '..', 'fixtures') - - # Set our defaults - self.connected = false - self.able_to_connect = true - - def self.setup - unless self.connected || !self.able_to_connect - setup_connection - load_schema - add_load_path FIXTURES_PATH - self.connected = true - end - rescue Exception => e # errors from ActiveRecord setup - $stderr.puts "\nSkipping ActiveRecord tests: #{e}\n\n" - self.able_to_connect = false - end - - private - - def self.add_load_path(path) - dep = defined?(ActiveSupport::Dependencies) ? ActiveSupport::Dependencies : ::Dependencies - dep.load_paths.unshift path - end - - def self.setup_connection - db = ENV['DB'].blank?? 'sqlite3' : ENV['DB'] - - configurations = YAML.load_file(File.join(File.dirname(__FILE__), '..', 'database.yml')) - raise "no configuration for '#{db}'" unless configurations.key? db - configuration = configurations[db] - - ActiveRecord::Base.logger = Logger.new(STDOUT) if $0 == 'irb' - puts "using #{configuration['adapter']} adapter" unless ENV['DB'].blank? - - ActiveRecord::Base.establish_connection(configuration) - ActiveRecord::Base.configurations = { db => configuration } - prepare ActiveRecord::Base.connection - - unless Object.const_defined?(:QUOTED_TYPE) - Object.send :const_set, :QUOTED_TYPE, ActiveRecord::Base.connection.quote_column_name('type') - end - end - - def self.load_schema - ActiveRecord::Base.silence do - ActiveRecord::Migration.verbose = false - load File.join(FIXTURES_PATH, 'schema.rb') - end - end - - def self.prepare(conn) - class << conn - IGNORED_SQL = [/^PRAGMA/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/, /^SELECT @@ROWCOUNT/, /^SHOW FIELDS /] - - def execute_with_counting(sql, name = nil, &block) - $query_count ||= 0 - $query_count += 1 unless IGNORED_SQL.any? { |r| sql =~ r } - execute_without_counting(sql, name, &block) - end - - alias_method_chain :execute, :counting - end - end - - module FixtureSetup - def fixtures(*tables) - table_names = tables.map { |t| t.to_s } - - fixtures = Fixtures.create_fixtures ActiverecordTestConnector::FIXTURES_PATH, table_names - @@loaded_fixtures = {} - @@fixture_cache = {} - - unless fixtures.nil? - if fixtures.instance_of?(Fixtures) - @@loaded_fixtures[fixtures.table_name] = fixtures - else - fixtures.each { |f| @@loaded_fixtures[f.table_name] = f } - end - end - - table_names.each do |table_name| - define_method(table_name) do |*fixtures| - @@fixture_cache[table_name] ||= {} - - instances = fixtures.map do |fixture| - if @@loaded_fixtures[table_name][fixture.to_s] - @@fixture_cache[table_name][fixture] ||= @@loaded_fixtures[table_name][fixture.to_s].find - else - raise StandardError, "No fixture with name '#{fixture}' found for table '#{table_name}'" - end - end - - instances.size == 1 ? instances.first : instances - end - end - end - end -end diff --git a/vendor/plugins/will_paginate/spec/finders_spec.rb b/vendor/plugins/will_paginate/spec/finders_spec.rb deleted file mode 100644 index 0782fbe..0000000 --- a/vendor/plugins/will_paginate/spec/finders_spec.rb +++ /dev/null @@ -1,76 +0,0 @@ -require 'spec_helper' -require 'will_paginate/finders/base' - -class Model - extend WillPaginate::Finders::Base -end - -describe WillPaginate::Finders::Base do - it "should define default per_page of 30" do - Model.per_page.should == 30 - end - - it "should allow to set custom per_page" do - begin - Model.per_page = 25 - Model.per_page.should == 25 - ensure - Model.per_page = 30 - end - end - - it "should result with WillPaginate::Collection" do - Model.expects(:wp_query) - Model.paginate(:page => nil).should be_instance_of(WillPaginate::Collection) - end - - it "should delegate pagination to wp_query" do - Model.expects(:wp_query).with({}, instance_of(WillPaginate::Collection), []) - Model.paginate :page => nil - end - - it "should complain when no hash parameters given" do - lambda { - Model.paginate - }.should raise_error(ArgumentError, 'parameter hash expected') - end - - it "should complain when no :page parameter present" do - lambda { - Model.paginate :per_page => 6 - }.should raise_error(ArgumentError, ':page parameter required') - end - - it "should complain when both :count and :total_entries are given" do - lambda { - Model.paginate :page => 1, :count => {}, :total_entries => 1 - }.should raise_error(ArgumentError, ':count and :total_entries are mutually exclusive') - end - - it "should never mangle options" do - options = { :page => 1 } - options.expects(:delete).never - options_before = options.dup - - Model.expects(:wp_query) - Model.paginate(options) - - options.should == options_before - end - - it "should provide paginated_each functionality" do - collection = stub('collection', :size => 5, :empty? => false, :per_page => 5) - collection.expects(:each).times(2).returns(collection) - last_collection = stub('collection', :size => 4, :empty? => false, :per_page => 5) - last_collection.expects(:each).returns(last_collection) - - params = { :order => 'id', :total_entries => 0 } - - Model.expects(:paginate).with(params.merge(:page => 2)).returns(collection) - Model.expects(:paginate).with(params.merge(:page => 3)).returns(collection) - Model.expects(:paginate).with(params.merge(:page => 4)).returns(last_collection) - - total = Model.paginated_each(:page => '2') { } - total.should == 14 - end -end diff --git a/vendor/plugins/will_paginate/spec/fixtures/admin.rb b/vendor/plugins/will_paginate/spec/fixtures/admin.rb deleted file mode 100644 index 1d5e7f3..0000000 --- a/vendor/plugins/will_paginate/spec/fixtures/admin.rb +++ /dev/null @@ -1,3 +0,0 @@ -class Admin < User - has_many :companies, :finder_sql => 'SELECT * FROM companies' -end diff --git a/vendor/plugins/will_paginate/spec/fixtures/developer.rb b/vendor/plugins/will_paginate/spec/fixtures/developer.rb deleted file mode 100644 index 7105355..0000000 --- a/vendor/plugins/will_paginate/spec/fixtures/developer.rb +++ /dev/null @@ -1,13 +0,0 @@ -class Developer < User - has_and_belongs_to_many :projects, :include => :topics, :order => 'projects.name' - - def self.with_poor_ones(&block) - with_scope :find => { :conditions => ['salary <= ?', 80000], :order => 'salary' } do - yield - end - end - - named_scope :poor, :conditions => ['salary <= ?', 80000], :order => 'salary' - - def self.per_page() 10 end -end diff --git a/vendor/plugins/will_paginate/spec/fixtures/developers_projects.yml b/vendor/plugins/will_paginate/spec/fixtures/developers_projects.yml deleted file mode 100644 index cee359c..0000000 --- a/vendor/plugins/will_paginate/spec/fixtures/developers_projects.yml +++ /dev/null @@ -1,13 +0,0 @@ -david_action_controller: - developer_id: 1 - project_id: 2 - joined_on: 2004-10-10 - -david_active_record: - developer_id: 1 - project_id: 1 - joined_on: 2004-10-10 - -jamis_active_record: - developer_id: 2 - project_id: 1 \ No newline at end of file diff --git a/vendor/plugins/will_paginate/spec/fixtures/project.rb b/vendor/plugins/will_paginate/spec/fixtures/project.rb deleted file mode 100644 index 0f85ef5..0000000 --- a/vendor/plugins/will_paginate/spec/fixtures/project.rb +++ /dev/null @@ -1,15 +0,0 @@ -class Project < ActiveRecord::Base - has_and_belongs_to_many :developers, :uniq => true - - has_many :topics - # :finder_sql => 'SELECT * FROM topics WHERE (topics.project_id = #{id})', - # :counter_sql => 'SELECT COUNT(*) FROM topics WHERE (topics.project_id = #{id})' - - has_many :replies, :through => :topics do - def find_recent(params = {}) - with_scope :find => { :conditions => ['replies.created_at > ?', 15.minutes.ago] } do - find :all, params - end - end - end -end diff --git a/vendor/plugins/will_paginate/spec/fixtures/projects.yml b/vendor/plugins/will_paginate/spec/fixtures/projects.yml deleted file mode 100644 index 74f3c32..0000000 --- a/vendor/plugins/will_paginate/spec/fixtures/projects.yml +++ /dev/null @@ -1,6 +0,0 @@ -active_record: - id: 1 - name: Active Record -action_controller: - id: 2 - name: Active Controller diff --git a/vendor/plugins/will_paginate/spec/fixtures/replies.yml b/vendor/plugins/will_paginate/spec/fixtures/replies.yml deleted file mode 100644 index 9a83c00..0000000 --- a/vendor/plugins/will_paginate/spec/fixtures/replies.yml +++ /dev/null @@ -1,29 +0,0 @@ -witty_retort: - id: 1 - topic_id: 1 - content: Birdman is better! - created_at: <%= 6.hours.ago.to_s(:db) %> - -another: - id: 2 - topic_id: 2 - content: Nuh uh! - created_at: <%= 1.hour.ago.to_s(:db) %> - -spam: - id: 3 - topic_id: 1 - content: Nice site! - created_at: <%= 1.hour.ago.to_s(:db) %> - -decisive: - id: 4 - topic_id: 4 - content: "I'm getting to the bottom of this" - created_at: <%= 30.minutes.ago.to_s(:db) %> - -brave: - id: 5 - topic_id: 4 - content: "AR doesn't scare me a bit" - created_at: <%= 10.minutes.ago.to_s(:db) %> diff --git a/vendor/plugins/will_paginate/spec/fixtures/reply.rb b/vendor/plugins/will_paginate/spec/fixtures/reply.rb deleted file mode 100644 index ecaf3c1..0000000 --- a/vendor/plugins/will_paginate/spec/fixtures/reply.rb +++ /dev/null @@ -1,7 +0,0 @@ -class Reply < ActiveRecord::Base - belongs_to :topic, :include => [:replies] - - named_scope :recent, :conditions => ['replies.created_at > ?', 15.minutes.ago] - - validates_presence_of :content -end diff --git a/vendor/plugins/will_paginate/spec/fixtures/schema.rb b/vendor/plugins/will_paginate/spec/fixtures/schema.rb deleted file mode 100644 index 8831aad..0000000 --- a/vendor/plugins/will_paginate/spec/fixtures/schema.rb +++ /dev/null @@ -1,38 +0,0 @@ -ActiveRecord::Schema.define do - - create_table "users", :force => true do |t| - t.column "name", :text - t.column "salary", :integer, :default => 70000 - t.column "created_at", :datetime - t.column "updated_at", :datetime - t.column "type", :text - end - - create_table "projects", :force => true do |t| - t.column "name", :text - end - - create_table "developers_projects", :id => false, :force => true do |t| - t.column "developer_id", :integer, :null => false - t.column "project_id", :integer, :null => false - t.column "joined_on", :date - t.column "access_level", :integer, :default => 1 - end - - create_table "topics", :force => true do |t| - t.column "project_id", :integer - t.column "title", :string - t.column "subtitle", :string - t.column "content", :text - t.column "created_at", :datetime - t.column "updated_at", :datetime - end - - create_table "replies", :force => true do |t| - t.column "content", :text - t.column "created_at", :datetime - t.column "updated_at", :datetime - t.column "topic_id", :integer - end - -end diff --git a/vendor/plugins/will_paginate/spec/fixtures/topic.rb b/vendor/plugins/will_paginate/spec/fixtures/topic.rb deleted file mode 100644 index 77be0dd..0000000 --- a/vendor/plugins/will_paginate/spec/fixtures/topic.rb +++ /dev/null @@ -1,6 +0,0 @@ -class Topic < ActiveRecord::Base - has_many :replies, :dependent => :destroy, :order => 'replies.created_at DESC' - belongs_to :project - - named_scope :mentions_activerecord, :conditions => ['topics.title LIKE ?', '%ActiveRecord%'] -end diff --git a/vendor/plugins/will_paginate/spec/fixtures/topics.yml b/vendor/plugins/will_paginate/spec/fixtures/topics.yml deleted file mode 100644 index 0a26904..0000000 --- a/vendor/plugins/will_paginate/spec/fixtures/topics.yml +++ /dev/null @@ -1,30 +0,0 @@ -futurama: - id: 1 - title: Isnt futurama awesome? - subtitle: It really is, isnt it. - content: I like futurama - created_at: <%= 1.day.ago.to_s(:db) %> - updated_at: - -harvey_birdman: - id: 2 - title: Harvey Birdman is the king of all men - subtitle: yup - content: He really is - created_at: <%= 2.hours.ago.to_s(:db) %> - updated_at: - -rails: - id: 3 - project_id: 1 - title: Rails is nice - subtitle: It makes me happy - content: except when I have to hack internals to fix pagination. even then really. - created_at: <%= 20.minutes.ago.to_s(:db) %> - -ar: - id: 4 - project_id: 1 - title: ActiveRecord sometimes freaks me out - content: "I mean, what's the deal with eager loading?" - created_at: <%= 15.minutes.ago.to_s(:db) %> diff --git a/vendor/plugins/will_paginate/spec/fixtures/user.rb b/vendor/plugins/will_paginate/spec/fixtures/user.rb deleted file mode 100644 index 4a57cf0..0000000 --- a/vendor/plugins/will_paginate/spec/fixtures/user.rb +++ /dev/null @@ -1,2 +0,0 @@ -class User < ActiveRecord::Base -end diff --git a/vendor/plugins/will_paginate/spec/fixtures/users.yml b/vendor/plugins/will_paginate/spec/fixtures/users.yml deleted file mode 100644 index ed2c03a..0000000 --- a/vendor/plugins/will_paginate/spec/fixtures/users.yml +++ /dev/null @@ -1,35 +0,0 @@ -david: - id: 1 - name: David - salary: 80000 - type: Developer - -jamis: - id: 2 - name: Jamis - salary: 150000 - type: Developer - -<% for digit in 3..10 %> -dev_<%= digit %>: - id: <%= digit %> - name: fixture_<%= digit %> - salary: 100000 - type: Developer -<% end %> - -poor_jamis: - id: 11 - name: Jamis - salary: 9000 - type: Developer - -admin: - id: 12 - name: admin - type: Admin - -goofy: - id: 13 - name: Goofy - type: Admin diff --git a/vendor/plugins/will_paginate/spec/rcov.opts b/vendor/plugins/will_paginate/spec/rcov.opts deleted file mode 100644 index 6b17c32..0000000 --- a/vendor/plugins/will_paginate/spec/rcov.opts +++ /dev/null @@ -1,2 +0,0 @@ ---exclude ^\/,^spec\/,core_ext.rb,deprecation.rb ---no-validator-links \ No newline at end of file diff --git a/vendor/plugins/will_paginate/spec/spec.opts b/vendor/plugins/will_paginate/spec/spec.opts deleted file mode 100644 index 14f5f13..0000000 --- a/vendor/plugins/will_paginate/spec/spec.opts +++ /dev/null @@ -1,2 +0,0 @@ ---colour ---reverse diff --git a/vendor/plugins/will_paginate/spec/spec_helper.rb b/vendor/plugins/will_paginate/spec/spec_helper.rb deleted file mode 100644 index 46a26e5..0000000 --- a/vendor/plugins/will_paginate/spec/spec_helper.rb +++ /dev/null @@ -1,76 +0,0 @@ -require 'rubygems' -gem 'rspec', '~> 1.1.4' -require 'spec' - -module MyExtras - protected - - def include_phrase(string) - PhraseMatcher.new(string) - end - - def collection(params = {}) - if params[:total_pages] - params[:per_page] = 1 - params[:total_entries] = params[:total_pages] - end - WillPaginate::Collection.new(params[:page] || 1, params[:per_page] || 30, params[:total_entries]) - end - - def have_deprecation - DeprecationMatcher.new - end -end - -Spec::Runner.configure do |config| - # config.include My::Pony, My::Horse, :type => :farm - config.include MyExtras - # config.predicate_matchers[:swim] = :can_swim? - - config.mock_with :mocha -end - -class PhraseMatcher - def initialize(string) - @string = string - @pattern = /\b#{string}\b/ - end - - def matches?(actual) - @actual = actual.to_s - @actual =~ @pattern - end - - def failure_message - "expected #{@actual.inspect} to contain phrase #{@string.inspect}" - end - - def negative_failure_message - "expected #{@actual.inspect} not to contain phrase #{@string.inspect}" - end -end - -class DeprecationMatcher - def initialize - @old_behavior = WillPaginate::Deprecation.behavior - @messages = [] - WillPaginate::Deprecation.behavior = lambda { |message, callstack| - @messages << message - } - end - - def matches?(block) - block.call - !@messages.empty? - ensure - WillPaginate::Deprecation.behavior = @old_behavior - end - - def failure_message - "expected block to raise a deprecation warning" - end - - def negative_failure_message - "expected block not to raise deprecation warnings, #{@messages.size} raised" - end -end diff --git a/vendor/plugins/will_paginate/spec/tasks.rake b/vendor/plugins/will_paginate/spec/tasks.rake deleted file mode 100644 index cb04366..0000000 --- a/vendor/plugins/will_paginate/spec/tasks.rake +++ /dev/null @@ -1,34 +0,0 @@ -require 'spec/rake/spectask' - -spec_opts = 'spec/spec.opts' - -desc 'Run all specs' -Spec::Rake::SpecTask.new(:spec) do |t| - t.libs << 'lib' << 'spec' - t.spec_opts = ['--options', spec_opts] -end - -namespace :spec do - desc 'Analyze spec coverage with RCov' - Spec::Rake::SpecTask.new(:rcov) do |t| - t.libs << 'lib' << 'spec' - t.spec_opts = ['--options', spec_opts] - t.rcov = true - t.rcov_opts = lambda do - IO.readlines('spec/rcov.opts').map { |l| l.chomp.split(" ") }.flatten - end - end - - desc 'Print Specdoc for all specs' - Spec::Rake::SpecTask.new(:doc) do |t| - t.libs << 'lib' << 'spec' - t.spec_opts = ['--format', 'specdoc', '--dry-run'] - end - - desc 'Generate HTML report' - Spec::Rake::SpecTask.new(:html) do |t| - t.libs << 'lib' << 'spec' - t.spec_opts = ['--format', 'html:doc/spec_results.html', '--diff'] - t.fail_on_error = false - end -end diff --git a/vendor/plugins/will_paginate/spec/view_helpers/action_view_spec.rb b/vendor/plugins/will_paginate/spec/view_helpers/action_view_spec.rb deleted file mode 100644 index 8b34a1b..0000000 --- a/vendor/plugins/will_paginate/spec/view_helpers/action_view_spec.rb +++ /dev/null @@ -1,343 +0,0 @@ -require 'spec_helper' -require 'action_controller' -require 'view_helpers/view_example_group' -require 'will_paginate/view_helpers/action_view' -require 'will_paginate/collection' - -ActionController::Routing::Routes.draw do |map| - map.connect 'dummy/page/:page', :controller => 'dummy' - map.connect 'dummy/dots/page.:page', :controller => 'dummy', :action => 'dots' - map.connect 'ibocorp/:page', :controller => 'ibocorp', - :requirements => { :page => /\d+/ }, - :defaults => { :page => 1 } - - map.connect ':controller/:action/:id' -end - -describe WillPaginate::ViewHelpers::ActionView do - before(:each) do - @view = ActionView::Base.new - @view.controller = DummyController.new - @view.request = @view.controller.request - @template = '<%= will_paginate collection, options %>' - end - - def request - @view.request - end - - def render(locals) - @view.render(:inline => @template, :locals => locals) - end - - ## basic pagination ## - - it "should render" do - paginate do |pagination| - assert_select 'a[href]', 3 do |elements| - validate_page_numbers [2,3,2], elements - assert_select elements.last, ':last-child', "Next »" - end - assert_select 'span', 1 - assert_select 'span.disabled:first-child', '« Previous' - assert_select 'em', '1' - pagination.first.inner_text.should == '« Previous 1 2 3 Next »' - end - end - - it "should render nothing when there is only 1 page" do - paginate(:per_page => 30).should be_empty - end - - it "should paginate with options" do - paginate({ :page => 2 }, :class => 'will_paginate', :previous_label => 'Prev', :next_label => 'Next') do - assert_select 'a[href]', 4 do |elements| - validate_page_numbers [1,1,3,3], elements - # test rel attribute values: - assert_select elements[1], 'a', '1' do |link| - link.first['rel'].should == 'prev start' - end - assert_select elements.first, 'a', "Prev" do |link| - link.first['rel'].should == 'prev start' - end - assert_select elements.last, 'a', "Next" do |link| - link.first['rel'].should == 'next' - end - end - assert_select 'em', '2' - end - end - - it "should paginate using a custom renderer class" do - paginate({}, :renderer => AdditionalLinkAttributesRenderer) do - assert_select 'a[default=true]', 3 - end - end - - it "should paginate using a custom renderer instance" do - renderer = WillPaginate::ViewHelpers::LinkRenderer.new - def renderer.gap() '~~' end - - paginate({ :per_page => 2 }, :inner_window => 0, :outer_window => 0, :renderer => renderer) do - assert_select 'span.my-gap', '~~' - end - - renderer = AdditionalLinkAttributesRenderer.new(:title => 'rendered') - paginate({}, :renderer => renderer) do - assert_select 'a[title=rendered]', 3 - end - end - - it "should have classnames on previous/next links" do - paginate do |pagination| - assert_select 'span.disabled.previous_page:first-child' - assert_select 'a.next_page[href]:last-child' - end - end - - it "should warn about :prev_label being deprecated" do - lambda { - paginate({ :page => 2 }, :prev_label => 'Deprecated') do - assert_select 'a[href]:first-child', 'Deprecated' - end - }.should have_deprecation - end - - it "should match expected markup" do - paginate - expected = <<-HTML - - HTML - expected.strip!.gsub!(/\s{2,}/, ' ') - expected_dom = HTML::Document.new(expected).root - - html_document.root.should == expected_dom - end - - it "should output escaped URLs" do - paginate({:page => 1, :per_page => 1, :total_entries => 2}, - :page_links => false, :params => { :tag => '
' }) - - assert_select 'a[href]', 1 do |links| - query = links.first['href'].split('?', 2)[1] - query.split('&').sort.should == %w(page=2 tag=%3Cbr%3E) - end - end - - ## advanced options for pagination ## - - it "should be able to render without container" do - paginate({}, :container => false) - assert_select 'div.pagination', 0, 'main DIV present when it shouldn\'t' - assert_select 'a[href]', 3 - end - - it "should be able to render without page links" do - paginate({ :page => 2 }, :page_links => false) do - assert_select 'a[href]', 2 do |elements| - validate_page_numbers [1,3], elements - end - end - end - - it "should have magic HTML ID for the container" do - paginate do |div| - div.first['id'].should be_nil - end - - # magic ID - paginate({}, :id => true) do |div| - div.first['id'].should == 'fixnums_pagination' - end - - # explicit ID - paginate({}, :id => 'custom_id') do |div| - div.first['id'].should == 'custom_id' - end - end - - ## other helpers ## - - it "should render a paginated section" do - @template = <<-ERB - <% paginated_section collection, options do %> - <%= content_tag :div, '', :id => "developers" %> - <% end %> - ERB - - paginate - assert_select 'div.pagination', 2 - assert_select 'div.pagination + div#developers', 1 - end - - ## parameter handling in page links ## - - it "should preserve parameters on GET" do - request.params :foo => { :bar => 'baz' } - paginate - assert_links_match /foo%5Bbar%5D=baz/ - end - - it "should not preserve parameters on POST" do - request.post - request.params :foo => 'bar' - paginate - assert_no_links_match /foo=bar/ - end - - it "should add additional parameters to links" do - paginate({}, :params => { :foo => 'bar' }) - assert_links_match /foo=bar/ - end - - it "should add anchor parameter" do - paginate({}, :params => { :anchor => 'anchor' }) - assert_links_match /#anchor$/ - end - - it "should remove arbitrary parameters" do - request.params :foo => 'bar' - paginate({}, :params => { :foo => nil }) - assert_no_links_match /foo=bar/ - end - - it "should override default route parameters" do - paginate({}, :params => { :controller => 'baz', :action => 'list' }) - assert_links_match %r{\Wbaz/list\W} - end - - it "should paginate with custom page parameter" do - paginate({ :page => 2 }, :param_name => :developers_page) do - assert_select 'a[href]', 4 do |elements| - validate_page_numbers [1,1,3,3], elements, :developers_page - end - end - end - - it "should paginate with complex custom page parameter" do - request.params :developers => { :page => 2 } - - paginate({ :page => 2 }, :param_name => 'developers[page]') do - assert_select 'a[href]', 4 do |links| - assert_links_match /\?developers%5Bpage%5D=\d+$/, links - validate_page_numbers [1,1,3,3], links, 'developers[page]' - end - end - end - - it "should paginate with custom route page parameter" do - request.symbolized_path_parameters.update :controller => 'dummy', :action => nil - paginate :per_page => 2 do - assert_select 'a[href]', 6 do |links| - assert_links_match %r{/page/(\d+)$}, links, [2, 3, 4, 5, 6, 2] - end - end - end - - it "should paginate with custom route with dot separator page parameter" do - request.symbolized_path_parameters.update :controller => 'dummy', :action => 'dots' - paginate :per_page => 2 do - assert_select 'a[href]', 6 do |links| - assert_links_match %r{/page\.(\d+)$}, links, [2, 3, 4, 5, 6, 2] - end - end - end - - it "should paginate with custom route and first page number implicit" do - request.symbolized_path_parameters.update :controller => 'ibocorp', :action => nil - paginate :page => 2, :per_page => 2 do - assert_select 'a[href]', 7 do |links| - assert_links_match %r{/ibocorp(?:/(\d+))?$}, links, [nil, nil, 3, 4, 5, 6, 3] - end - end - end - - ## internal hardcore stuff ## - - it "should be able to guess the collection name" do - collection = mock - collection.expects(:total_pages).returns(1) - - @template = '<%= will_paginate options %>' - @view.controller.controller_name = 'developers' - @view.assigns['developers'] = collection - - paginate(nil) - end - - it "should fail if the inferred collection is nil" do - @template = '<%= will_paginate options %>' - @view.controller.controller_name = 'developers' - - lambda { - paginate(nil) - }.should raise_error(ArgumentError, /@developers/) - end - - if ActionController::Base.respond_to? :rescue_responses - # only on Rails 2 - it "should set rescue response hook" do - ActionController::Base.rescue_responses['WillPaginate::InvalidPage'].should == :not_found - end - end -end - -class AdditionalLinkAttributesRenderer < WillPaginate::ViewHelpers::LinkRenderer - def initialize(link_attributes = nil) - super() - @additional_link_attributes = link_attributes || { :default => 'true' } - end - - def link(text, target, attributes = {}) - super(text, target, attributes.merge(@additional_link_attributes)) - end -end - -class DummyController - attr_reader :request - attr_accessor :controller_name - - def initialize - @request = DummyRequest.new - @url = ActionController::UrlRewriter.new(@request, @request.params) - end - - def params - @request.params - end - - def url_for(params) - @url.rewrite(params) - end -end - -class DummyRequest - attr_accessor :symbolized_path_parameters - - def initialize - @get = true - @params = {} - @symbolized_path_parameters = { :controller => 'foo', :action => 'bar' } - end - - def get? - @get - end - - def post - @get = false - end - - def relative_url_root - '' - end - - def params(more = nil) - @params.update(more) if more - @params - end -end diff --git a/vendor/plugins/will_paginate/spec/view_helpers/base_spec.rb b/vendor/plugins/will_paginate/spec/view_helpers/base_spec.rb deleted file mode 100644 index ed91a9f..0000000 --- a/vendor/plugins/will_paginate/spec/view_helpers/base_spec.rb +++ /dev/null @@ -1,64 +0,0 @@ -require 'spec_helper' -require 'will_paginate/view_helpers/base' -require 'will_paginate/array' - -describe WillPaginate::ViewHelpers::Base do - - include WillPaginate::ViewHelpers::Base - - describe "will_paginate" do - it "should render" do - collection = WillPaginate::Collection.new(1, 2, 4) - renderer = mock 'Renderer' - renderer.expects(:prepare).with(collection, instance_of(Hash), self) - renderer.expects(:to_html).returns('') - - will_paginate(collection, :renderer => renderer).should == '' - end - - it "should return nil for single-page collections" do - collection = mock 'Collection', :total_pages => 1 - will_paginate(collection).should be_nil - end - end - - describe "page_entries_info" do - before :all do - @array = ('a'..'z').to_a - end - - def info(params, options = {}) - options[:html] ||= false unless options.key?(:html) and options[:html].nil? - collection = Hash === params ? @array.paginate(params) : params - page_entries_info collection, options - end - - it "should display middle results and total count" do - info(:page => 2, :per_page => 5).should == "Displaying strings 6 - 10 of 26 in total" - end - - it "should output HTML by default" do - info({ :page => 2, :per_page => 5 }, :html => nil).should == - "Displaying strings 6 - 10 of 26 in total" - end - - it "should display shortened end results" do - info(:page => 7, :per_page => 4).should include_phrase('strings 25 - 26') - end - - it "should handle longer class names" do - collection = @array.paginate(:page => 2, :per_page => 5) - collection.first.stubs(:class).returns(mock('Class', :name => 'ProjectType')) - info(collection).should include_phrase('project types') - end - - it "should adjust output for single-page collections" do - info(('a'..'d').to_a.paginate(:page => 1, :per_page => 5)).should == "Displaying all 4 strings" - info(['a'].paginate(:page => 1, :per_page => 5)).should == "Displaying 1 string" - end - - it "should display 'no entries found' for empty collections" do - info([].paginate(:page => 1, :per_page => 5)).should == "No entries found" - end - end -end diff --git a/vendor/plugins/will_paginate/spec/view_helpers/link_renderer_base_spec.rb b/vendor/plugins/will_paginate/spec/view_helpers/link_renderer_base_spec.rb deleted file mode 100644 index a240f3f..0000000 --- a/vendor/plugins/will_paginate/spec/view_helpers/link_renderer_base_spec.rb +++ /dev/null @@ -1,84 +0,0 @@ -require 'spec_helper' -require 'will_paginate/view_helpers/link_renderer_base' -require 'will_paginate/collection' - -describe WillPaginate::ViewHelpers::LinkRendererBase do - - before do - @renderer = WillPaginate::ViewHelpers::LinkRendererBase.new - end - - it "should raise error when unprepared" do - lambda { - @renderer.send :param_name - }.should raise_error - end - - it "should prepare with collection and options" do - prepare({}, :param_name => 'mypage') - @renderer.send(:current_page).should == 1 - @renderer.send(:param_name).should == 'mypage' - end - - it "should have total_pages accessor" do - prepare :total_pages => 42 - lambda { - @renderer.send(:total_pages).should == 42 - }.should_not have_deprecation - end - - it "should clear old cached values when prepared" do - prepare({ :total_pages => 1 }, :param_name => 'foo') - @renderer.send(:total_pages).should == 1 - @renderer.send(:param_name).should == 'foo' - # prepare with different object and options: - prepare({ :total_pages => 2 }, :param_name => 'bar') - @renderer.send(:total_pages).should == 2 - @renderer.send(:param_name).should == 'bar' - end - - it "should have pagination definition" do - prepare({ :total_pages => 1 }, :page_links => true) - @renderer.pagination.should == [:previous_page, 1, :next_page] - end - - describe "visible page numbers" do - it "should calculate windowed visible links" do - prepare({ :page => 6, :total_pages => 11 }, :inner_window => 1, :outer_window => 1) - showing_pages 1, 2, :gap, 5, 6, 7, :gap, 10, 11 - end - - it "should eliminate small gaps" do - prepare({ :page => 6, :total_pages => 11 }, :inner_window => 2, :outer_window => 1) - # pages 4 and 8 appear instead of the gap - showing_pages 1..11 - end - - it "should support having no windows at all" do - prepare({ :page => 4, :total_pages => 7 }, :inner_window => 0, :outer_window => 0) - showing_pages 1, :gap, 4, :gap, 7 - end - - it "should adjust upper limit if lower is out of bounds" do - prepare({ :page => 1, :total_pages => 10 }, :inner_window => 2, :outer_window => 1) - showing_pages 1, 2, 3, 4, 5, :gap, 9, 10 - end - - it "should adjust lower limit if upper is out of bounds" do - prepare({ :page => 10, :total_pages => 10 }, :inner_window => 2, :outer_window => 1) - showing_pages 1, 2, :gap, 6, 7, 8, 9, 10 - end - - def showing_pages(*pages) - pages = pages.first.to_a if Array === pages.first or Range === pages.first - @renderer.send(:windowed_page_numbers).should == pages - end - end - - protected - - def prepare(collection_options, options = {}) - @renderer.prepare(collection(collection_options), options) - end - -end diff --git a/vendor/plugins/will_paginate/spec/view_helpers/view_example_group.rb b/vendor/plugins/will_paginate/spec/view_helpers/view_example_group.rb deleted file mode 100644 index cdeb0b1..0000000 --- a/vendor/plugins/will_paginate/spec/view_helpers/view_example_group.rb +++ /dev/null @@ -1,111 +0,0 @@ -unless $:.find { |p| p =~ %r{/html-scanner$} } - unless actionpack_path = $:.find { |p| p =~ %r{/actionpack(-[\d.]+)?/lib$} } - raise "cannot find ActionPack in load paths" - end - html_scanner_path = "#{actionpack_path}/action_controller/vendor/html-scanner" - $:.unshift(html_scanner_path) -end - -require 'action_controller/assertions/selector_assertions' - -class ViewExampleGroup < Spec::Example::ExampleGroup - - include ActionController::Assertions::SelectorAssertions - - def assert(value, message) - raise message unless value - end - - def paginate(collection = {}, options = {}, &block) - if collection.instance_of? Hash - page_options = { :page => 1, :total_entries => 11, :per_page => 4 }.merge(collection) - collection = [1].paginate(page_options) - end - - locals = { :collection => collection, :options => options } - - @render_output = render(locals) - @html_document = nil - - if block_given? - classname = options[:class] || WillPaginate::ViewHelpers.pagination_options[:class] - assert_select("div.#{classname}", 1, 'no main DIV', &block) - end - - @render_output - end - - def html_document - @html_document ||= HTML::Document.new(@render_output, true, false) - end - - def response_from_page_or_rjs - html_document.root - end - - def validate_page_numbers(expected, links, param_name = :page) - param_pattern = /\W#{CGI.escape(param_name.to_s)}=([^&]*)/ - - links.map { |e| - e['href'] =~ param_pattern - $1 ? $1.to_i : $1 - }.should == expected - end - - def assert_links_match(pattern, links = nil, numbers = nil) - links ||= assert_select 'div.pagination a[href]' do |elements| - elements - end - - pages = [] if numbers - - links.each do |el| - el['href'].should =~ pattern - if numbers - el['href'] =~ pattern - pages << ($1.nil?? nil : $1.to_i) - end - end - - pages.should == numbers if numbers - end - - def assert_no_links_match(pattern) - assert_select 'div.pagination a[href]' do |elements| - elements.each do |el| - el['href'] !~ pattern - end - end - end - - def build_message(message, pattern, *args) - built_message = pattern.dup - for value in args - built_message.sub! '?', value.inspect - end - built_message - end - -end - -Spec::Example::ExampleGroupFactory.register(:view_helpers, ViewExampleGroup) - -module HTML - Node.class_eval do - def inner_text - children.map(&:inner_text).join('') - end - end - - Text.class_eval do - def inner_text - self.to_s - end - end - - Tag.class_eval do - def inner_text - childless?? '' : super - end - end -end diff --git a/vendor/plugins/will_paginate/will_paginate.gemspec b/vendor/plugins/will_paginate/will_paginate.gemspec deleted file mode 100644 index ef5f4df..0000000 --- a/vendor/plugins/will_paginate/will_paginate.gemspec +++ /dev/null @@ -1,20 +0,0 @@ -Gem::Specification.new do |s| - s.name = 'will_paginate' - s.version = '2.5.0' - # s.date = '2008-10-27' - - s.summary = "Most awesome pagination solution for every web app" - s.description = "The will_paginate library provides a simple, yet powerful and extensible API for pagination and rendering of page links in templates." - - s.authors = ['Mislav Marohnić', 'PJ Hyett'] - s.email = 'mislav.marohnic@gmail.com' - s.homepage = 'http://github.com/mislav/will_paginate/wikis' - - s.has_rdoc = true - s.rdoc_options = ['--main', 'README.rdoc'] - s.rdoc_options << '--inline-source' << '--charset=UTF-8' - s.extra_rdoc_files = ['README.rdoc', 'LICENSE', 'CHANGELOG.rdoc'] - - s.files = %w(CHANGELOG.rdoc LICENSE README.rdoc Rakefile examples examples/apple-circle.gif examples/index.haml examples/index.html examples/pagination.css examples/pagination.sass init.rb lib lib/will_paginate lib/will_paginate.rb lib/will_paginate/array.rb lib/will_paginate/collection.rb lib/will_paginate/core_ext.rb lib/will_paginate/deprecation.rb lib/will_paginate/finders lib/will_paginate/finders.rb lib/will_paginate/finders/active_record lib/will_paginate/finders/active_record.rb lib/will_paginate/finders/active_record/named_scope.rb lib/will_paginate/finders/active_record/named_scope_patch.rb lib/will_paginate/finders/active_resource.rb lib/will_paginate/finders/base.rb lib/will_paginate/finders/data_mapper.rb lib/will_paginate/version.rb lib/will_paginate/view_helpers lib/will_paginate/view_helpers.rb lib/will_paginate/view_helpers/action_view.rb lib/will_paginate/view_helpers/base.rb lib/will_paginate/view_helpers/link_renderer.rb lib/will_paginate/view_helpers/link_renderer_base.rb spec spec/collection_spec.rb spec/console spec/console_fixtures.rb spec/database.yml spec/finders spec/finders/active_record_spec.rb spec/finders/active_resource_spec.rb spec/finders/activerecord_test_connector.rb spec/finders_spec.rb spec/fixtures spec/fixtures/admin.rb spec/fixtures/developer.rb spec/fixtures/developers_projects.yml spec/fixtures/project.rb spec/fixtures/projects.yml spec/fixtures/replies.yml spec/fixtures/reply.rb spec/fixtures/schema.rb spec/fixtures/topic.rb spec/fixtures/topics.yml spec/fixtures/user.rb spec/fixtures/users.yml spec/rcov.opts spec/spec.opts spec/spec_helper.rb spec/tasks.rake spec/view_helpers spec/view_helpers/action_view_spec.rb spec/view_helpers/base_spec.rb spec/view_helpers/link_renderer_base_spec.rb spec/view_helpers/view_example_group.rb) - s.test_files = %w(spec/collection_spec.rb spec/console spec/console_fixtures.rb spec/database.yml spec/finders spec/finders/active_record_spec.rb spec/finders/active_resource_spec.rb spec/finders/activerecord_test_connector.rb spec/finders_spec.rb spec/fixtures spec/fixtures/admin.rb spec/fixtures/developer.rb spec/fixtures/developers_projects.yml spec/fixtures/project.rb spec/fixtures/projects.yml spec/fixtures/replies.yml spec/fixtures/reply.rb spec/fixtures/schema.rb spec/fixtures/topic.rb spec/fixtures/topics.yml spec/fixtures/user.rb spec/fixtures/users.yml spec/rcov.opts spec/spec.opts spec/spec_helper.rb spec/tasks.rake spec/view_helpers spec/view_helpers/action_view_spec.rb spec/view_helpers/base_spec.rb spec/view_helpers/link_renderer_base_spec.rb spec/view_helpers/view_example_group.rb) -end \ No newline at end of file From c96e351ee8409629f84447b6377be6df07a4309c Mon Sep 17 00:00:00 2001 From: Wojciech Todryk Date: Fri, 24 Jun 2011 23:53:55 +0200 Subject: [PATCH 08/88] README fixed --- README.markdown | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/README.markdown b/README.markdown index 887f305..6d213e1 100755 --- a/README.markdown +++ b/README.markdown @@ -13,23 +13,23 @@ In _Rails 3_ all dependencies should be defined in file _.Gemfile_. 2. If you need to override some of the default constants used in the application take a look at config/default_site.rb. Then create config/site.rb that contains only the keys which you want to override. Example content of config/site.rb is: - module CDF +`module CDF - LOCALCONFIG = { - :imap_server => 'your.imap.server' - } - end +LOCALCONFIG = { + :imap_server => 'your.imap.server' +} +end` 3. Configure SMTP settings - # initializers/smtp_settings.rb - ActionMailer::Base.smtp_settings = { - :address => "mail.example.com.py", - :port => 26, - :authentication => :plain, - :enable_starttls_auto => true, - :user_name => "emilio@example.com.py", - :password => "yourpass" - } +`# initializers/smtp_settings.rb + ActionMailer::Base.smtp_settings = { + :address => "mail.example.com.py", + :port => 26, + :authentication => :plain, + :enable_starttls_auto => true, + :user_name => "emilio@example.com.py", + :password => "yourpass" +}` 4. Prepare config/database.yml file (see config/database.yml.example). Check if proper gems (sqlite3/mysql/postgresql) are defined in _Gemfile_ and installed. From 3b553b5e15d422605a7a5648daba0e95293fe284 Mon Sep 17 00:00:00 2001 From: Wojciech Todryk Date: Fri, 24 Jun 2011 14:46:11 -0700 Subject: [PATCH 09/88] Edited README.markdown via GitHub --- README.markdown | 1 + 1 file changed, 1 insertion(+) mode change 100755 => 100644 README.markdown diff --git a/README.markdown b/README.markdown old mode 100755 new mode 100644 index 6d213e1..a7f4f4b --- a/README.markdown +++ b/README.markdown @@ -21,6 +21,7 @@ LOCALCONFIG = { end` 3. Configure SMTP settings + `# initializers/smtp_settings.rb ActionMailer::Base.smtp_settings = { :address => "mail.example.com.py", From 1ea0781ddb2a91213125d2ab2806daf25cf3fc48 Mon Sep 17 00:00:00 2001 From: Wojciech Todryk Date: Sat, 25 Jun 2011 00:05:54 +0200 Subject: [PATCH 10/88] README fixed --- README.markdown | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/README.markdown b/README.markdown index a7f4f4b..385a781 100644 --- a/README.markdown +++ b/README.markdown @@ -13,16 +13,19 @@ In _Rails 3_ all dependencies should be defined in file _.Gemfile_. 2. If you need to override some of the default constants used in the application take a look at config/default_site.rb. Then create config/site.rb that contains only the keys which you want to override. Example content of config/site.rb is: -`module CDF +```ruby +module CDF LOCALCONFIG = { :imap_server => 'your.imap.server' } -end` +end +``` 3. Configure SMTP settings -`# initializers/smtp_settings.rb +```ruby +# initializers/smtp_settings.rb ActionMailer::Base.smtp_settings = { :address => "mail.example.com.py", :port => 26, @@ -30,7 +33,8 @@ end` :enable_starttls_auto => true, :user_name => "emilio@example.com.py", :password => "yourpass" -}` +} +``` 4. Prepare config/database.yml file (see config/database.yml.example). Check if proper gems (sqlite3/mysql/postgresql) are defined in _Gemfile_ and installed. From 12726a2c3c437bd00f3f2f3f867a41093e39479d Mon Sep 17 00:00:00 2001 From: Wojciech Todryk Date: Sat, 25 Jun 2011 00:12:21 +0200 Subject: [PATCH 11/88] README fixed --- README.markdown | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/README.markdown b/README.markdown index 385a781..4865c89 100644 --- a/README.markdown +++ b/README.markdown @@ -6,12 +6,14 @@ _Mailr_ is a IMAP mail client based on _Ruby on Rails_ platform. **NOTE** All path and filenames are based on _Rails.root_ directory. ### Requirements + In _Rails 3_ all dependencies should be defined in file _.Gemfile_. All needed gems can be installed using bundler. ### Installation procedure -1. Checkout the source code. -2. If you need to override some of the default constants used in the application take a look at config/default_site.rb. Then create config/site.rb that contains only the keys which you want to override. Example content of config/site.rb is: +* Checkout the source code. + +* If you need to override some of the default constants used in the application take a look at config/default_site.rb. Then create config/site.rb that contains only the keys which you want to override. Example content of config/site.rb is: ```ruby module CDF @@ -22,7 +24,7 @@ LOCALCONFIG = { end ``` -3. Configure SMTP settings +* Configure SMTP settings ```ruby # initializers/smtp_settings.rb @@ -36,10 +38,10 @@ end } ``` -4. Prepare config/database.yml file (see config/database.yml.example). +* Prepare config/database.yml file (see config/database.yml.example). Check if proper gems (sqlite3/mysql/postgresql) are defined in _Gemfile_ and installed. -5. Migrate database (rake db:migrate) +* Migrate database (rake db:migrate) -6. Use it. +* Use it. From a43b1bed3c1ab161284e55a6a1feea47b6bad8fa Mon Sep 17 00:00:00 2001 From: Wojciech Todryk Date: Sat, 25 Jun 2011 00:15:19 +0200 Subject: [PATCH 12/88] README fixed --- README.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.markdown b/README.markdown index 4865c89..751285c 100644 --- a/README.markdown +++ b/README.markdown @@ -7,13 +7,13 @@ _Mailr_ is a IMAP mail client based on _Ruby on Rails_ platform. ### Requirements -In _Rails 3_ all dependencies should be defined in file _.Gemfile_. All needed gems can be installed using bundler. +In _Rails 3_ all dependencies should be defined in file _Gemfile_. All needed gems can be installed using bundler. ### Installation procedure * Checkout the source code. -* If you need to override some of the default constants used in the application take a look at config/default_site.rb. Then create config/site.rb that contains only the keys which you want to override. Example content of config/site.rb is: +* If you need to override some of the default constants used in the application take a look at _config/default_site.rb_. Then create config/site.rb that contains only the keys which you want to override. Example content of _config/site.rb_ is: ```ruby module CDF @@ -38,7 +38,7 @@ end } ``` -* Prepare config/database.yml file (see config/database.yml.example). +* Prepare config/database.yml file (see _config/database.yml.example_). Check if proper gems (sqlite3/mysql/postgresql) are defined in _Gemfile_ and installed. * Migrate database (rake db:migrate) From 573356a3a4d7cda8f12ff936718f6b670fc37781 Mon Sep 17 00:00:00 2001 From: Wojciech Todryk Date: Sat, 25 Jun 2011 00:16:10 +0200 Subject: [PATCH 13/88] README fixed --- README.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.markdown b/README.markdown index 751285c..e63e407 100644 --- a/README.markdown +++ b/README.markdown @@ -13,7 +13,7 @@ In _Rails 3_ all dependencies should be defined in file _Gemfile_. All needed ge * Checkout the source code. -* If you need to override some of the default constants used in the application take a look at _config/default_site.rb_. Then create config/site.rb that contains only the keys which you want to override. Example content of _config/site.rb_ is: +* If you need to override some of the default constants used in the application take a look at _config/default_site.rb_. Then create _config/site.rb_ that contains only the keys which you want to override. Example content of _config/site.rb_ is: ```ruby module CDF From 921de13cc04bdc0304e077e3f41560ab8e5228be Mon Sep 17 00:00:00 2001 From: Wojciech Todryk Date: Sat, 25 Jun 2011 18:19:07 +0200 Subject: [PATCH 14/88] themes_for_rails integrated with original theme --- Gemfile | 2 +- Gemfile.lock | 6 +- Rakefile | 2 +- app/controllers/application_controller.rb | 5 + app/controllers/contact_groups_controller.rb | 20 +- app/controllers/contacts_controller.rb | 145 ++++++------ app/controllers/folders_controller.rb | 2 + app/controllers/login_controller.rb | 2 + app/controllers/webmail_controller.rb | 2 + app/helpers/application_helper.rb | 22 +- ...contents_moved_to_original_theme_directory | 0 config.ru | 2 +- config/application.rb | 2 +- config/default_site.rb | 9 +- config/environment.rb | 2 +- config/environments/development.rb | 2 +- config/environments/production.rb | 2 +- config/environments/test.rb | 2 +- config/initializers/secret_token.rb | 2 +- config/initializers/session_store.rb | 2 +- config/routes.rb | 4 +- public/javascripts/.gitkeep | 0 public/javascripts/application.js | 0 public/javascripts/controls.js | 0 public/javascripts/dragdrop.js | 0 public/javascripts/effects.js | 0 public/javascripts/global.js | 1 - public/javascripts/prototype.js | 0 public/javascripts/rails.js | 0 themes/empty/images/.gitkeep | 0 themes/empty/javascripts/.gitkeep | 0 themes/empty/stylesheets/.gitkeep | 0 themes/empty/views/layouts/.gitkeep | 0 .../empty}/views/layouts/chooser.html.erb | 0 .../empty}/views/layouts/login.html.erb | 0 .../empty/views/layouts/xapplication.html.erb | 0 themes/original/images/.gitkeep | 0 .../original}/images/attachment.png | Bin {public => themes/original}/images/d6deec.gif | Bin .../original}/images/deselect.png | Bin .../original}/images/list_closed.gif | Bin .../original}/images/list_opened.gif | Bin themes/original/images/logo.png | Bin 0 -> 13132 bytes .../original}/images/noprogress.gif | Bin {public => themes/original}/images/rails.png | Bin {public => themes/original}/images/select.png | Bin {public => themes/original}/images/white.gif | Bin {public => themes/original}/images/white.png | Bin themes/original/javascripts/.gitkeep | 0 .../original}/javascripts/contact_choose.js | 0 .../original}/javascripts/effects2.js | 0 themes/original/javascripts/global.js | 216 ++++++++++++++++++ .../original}/javascripts/global_src.js | 38 +-- .../original}/javascripts/htmlstyle.js | 0 .../original}/javascripts/jstrim.pl | 0 .../original}/javascripts/prototype_src.js | 0 .../original}/javascripts/scriptaculous.js | 0 .../original}/javascripts/slider.js | 0 .../original}/javascripts/webmail.js | 0 themes/original/stylesheets/.gitkeep | 0 .../original}/stylesheets/admin.css | 136 +++++------ .../original}/stylesheets/mailr.css | 8 +- .../original}/stylesheets/tabs.css | 8 +- .../stylesheets/webmail/icon-folder-open.gif | Bin .../original}/stylesheets/webmail/webmail.css | 0 .../views/contact_groups/edit.html.erb | 0 .../views/contact_groups/index.html.erb | 0 .../views/contacts/add_multiple.html.erb | 0 .../original}/views/contacts/choose.html.erb | 0 .../views/contacts/import_preview.html.erb | 0 .../original}/views/contacts/index.html.erb | 0 .../original}/views/contacts/new.html.erb | 0 .../original}/views/folders/index.html.erb | 0 themes/original/views/layouts/.gitkeep | 0 .../original/views/layouts/chooser.html.erb | 19 ++ themes/original/views/layouts/login.html.erb | 15 ++ themes/original/views/layouts/public.html.erb | 31 +++ .../original}/views/login/index.rhtml | 0 .../original}/views/shared/_folders.html.erb | 0 .../views/webmail/_contacts.html.erb | 0 .../original}/views/webmail/_expr.html.erb | 0 .../original}/views/webmail/_filter.html.erb | 0 .../views/webmail/_message_row.html.erb | 2 +- .../original}/views/webmail/_search.html.erb | 6 +- .../original}/views/webmail/compose.html.erb | 0 .../views/webmail/error_connection.html.erb | 0 .../original}/views/webmail/filter.html.erb | 0 .../original}/views/webmail/filters.html.erb | 0 .../original}/views/webmail/folders.html.erb | 0 .../original}/views/webmail/mailsent.html.erb | 0 .../original}/views/webmail/message.html.erb | 0 .../original}/views/webmail/messages.html.erb | 2 +- .../views/webmail/noattachment.html.erb | 0 .../original}/views/webmail/prefs.html.erb | 0 .../views/webmail/view_source.html.erb | 0 95 files changed, 511 insertions(+), 208 deletions(-) rename public/stylesheets/.gitkeep => app/views/contents_moved_to_original_theme_directory (100%) mode change 100755 => 100644 create mode 100644 public/javascripts/.gitkeep mode change 100755 => 100644 public/javascripts/application.js mode change 100755 => 100644 public/javascripts/controls.js mode change 100755 => 100644 public/javascripts/dragdrop.js mode change 100755 => 100644 public/javascripts/effects.js delete mode 100755 public/javascripts/global.js mode change 100755 => 100644 public/javascripts/prototype.js mode change 100755 => 100644 public/javascripts/rails.js create mode 100644 themes/empty/images/.gitkeep create mode 100644 themes/empty/javascripts/.gitkeep create mode 100644 themes/empty/stylesheets/.gitkeep create mode 100644 themes/empty/views/layouts/.gitkeep rename {app => themes/empty}/views/layouts/chooser.html.erb (100%) rename {app => themes/empty}/views/layouts/login.html.erb (100%) rename app/views/layouts/public.html.erb => themes/empty/views/layouts/xapplication.html.erb (100%) create mode 100644 themes/original/images/.gitkeep rename {public => themes/original}/images/attachment.png (100%) rename {public => themes/original}/images/d6deec.gif (100%) rename {public => themes/original}/images/deselect.png (100%) rename {public => themes/original}/images/list_closed.gif (100%) rename {public => themes/original}/images/list_opened.gif (100%) create mode 100644 themes/original/images/logo.png rename {public => themes/original}/images/noprogress.gif (100%) rename {public => themes/original}/images/rails.png (100%) rename {public => themes/original}/images/select.png (100%) rename {public => themes/original}/images/white.gif (100%) rename {public => themes/original}/images/white.png (100%) create mode 100644 themes/original/javascripts/.gitkeep rename {public => themes/original}/javascripts/contact_choose.js (100%) rename {public => themes/original}/javascripts/effects2.js (100%) create mode 100755 themes/original/javascripts/global.js rename {public => themes/original}/javascripts/global_src.js (92%) rename {public => themes/original}/javascripts/htmlstyle.js (100%) rename {public => themes/original}/javascripts/jstrim.pl (100%) rename {public => themes/original}/javascripts/prototype_src.js (100%) rename {public => themes/original}/javascripts/scriptaculous.js (100%) rename {public => themes/original}/javascripts/slider.js (100%) rename {public => themes/original}/javascripts/webmail.js (100%) create mode 100755 themes/original/stylesheets/.gitkeep rename {public => themes/original}/stylesheets/admin.css (73%) rename {public => themes/original}/stylesheets/mailr.css (84%) rename {public => themes/original}/stylesheets/tabs.css (89%) rename {public => themes/original}/stylesheets/webmail/icon-folder-open.gif (100%) rename {public => themes/original}/stylesheets/webmail/webmail.css (100%) rename {app => themes/original}/views/contact_groups/edit.html.erb (100%) rename {app => themes/original}/views/contact_groups/index.html.erb (100%) rename {app => themes/original}/views/contacts/add_multiple.html.erb (100%) rename {app => themes/original}/views/contacts/choose.html.erb (100%) rename {app => themes/original}/views/contacts/import_preview.html.erb (100%) rename {app => themes/original}/views/contacts/index.html.erb (100%) rename {app => themes/original}/views/contacts/new.html.erb (100%) rename {app => themes/original}/views/folders/index.html.erb (100%) create mode 100644 themes/original/views/layouts/.gitkeep create mode 100755 themes/original/views/layouts/chooser.html.erb create mode 100755 themes/original/views/layouts/login.html.erb create mode 100755 themes/original/views/layouts/public.html.erb rename {app => themes/original}/views/login/index.rhtml (100%) rename {app => themes/original}/views/shared/_folders.html.erb (100%) rename {app => themes/original}/views/webmail/_contacts.html.erb (100%) rename {app => themes/original}/views/webmail/_expr.html.erb (100%) rename {app => themes/original}/views/webmail/_filter.html.erb (100%) rename {app => themes/original}/views/webmail/_message_row.html.erb (90%) rename {app => themes/original}/views/webmail/_search.html.erb (73%) rename {app => themes/original}/views/webmail/compose.html.erb (100%) rename {app => themes/original}/views/webmail/error_connection.html.erb (100%) rename {app => themes/original}/views/webmail/filter.html.erb (100%) rename {app => themes/original}/views/webmail/filters.html.erb (100%) rename {app => themes/original}/views/webmail/folders.html.erb (100%) rename {app => themes/original}/views/webmail/mailsent.html.erb (100%) rename {app => themes/original}/views/webmail/message.html.erb (100%) rename {app => themes/original}/views/webmail/messages.html.erb (96%) rename {app => themes/original}/views/webmail/noattachment.html.erb (100%) rename {app => themes/original}/views/webmail/prefs.html.erb (100%) rename {app => themes/original}/views/webmail/view_source.html.erb (100%) diff --git a/Gemfile b/Gemfile index d910b4b..79bbe16 100755 --- a/Gemfile +++ b/Gemfile @@ -9,7 +9,7 @@ gem 'sqlite3-ruby',:require => 'sqlite3' gem 'arel' gem 'mysql2' gem 'will_paginate' -gem 'web-app-theme' +gem 'themes_for_rails' gem 'tmail' # Use unicorn as the web server diff --git a/Gemfile.lock b/Gemfile.lock index eb08281..1f3e0d8 100755 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -60,12 +60,14 @@ GEM sqlite3 (1.3.3) sqlite3-ruby (1.3.3) sqlite3 (>= 1.3.3) + themes_for_rails (0.4.2) + rails (~> 3.0.0) + themes_for_rails thor (0.14.6) tmail (1.2.7.1) treetop (1.4.9) polyglot (>= 0.3.1) tzinfo (0.3.24) - web-app-theme (0.6.3) will_paginate (2.3.15) PLATFORMS @@ -76,6 +78,6 @@ DEPENDENCIES mysql2 rails (= 3.0.7) sqlite3-ruby + themes_for_rails tmail - web-app-theme will_paginate diff --git a/Rakefile b/Rakefile index f7fac98..29283be 100755 --- a/Rakefile +++ b/Rakefile @@ -4,4 +4,4 @@ require File.expand_path('../config/application', __FILE__) require 'rake' -Rails3::Application.load_tasks +Mailr::Application.load_tasks diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 7882e6f..279d8db 100755 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -12,6 +12,11 @@ class ApplicationController < ActionController::Base #filter_parameter_logging :password #upgrade to Rails3 protected + + def theme_resolver + CDF::CONFIG[:theme] || CDF::CONFIG[:default_theme] + end + def secure_user?() true end def secure_cust?() false end def additional_scripts() "" end diff --git a/app/controllers/contact_groups_controller.rb b/app/controllers/contact_groups_controller.rb index 4bdb75d..b09a1b6 100755 --- a/app/controllers/contact_groups_controller.rb +++ b/app/controllers/contact_groups_controller.rb @@ -1,28 +1,32 @@ class ContactGroupsController < ApplicationController + + theme :theme_resolver + layout 'public' - + + def index @contact_group = ContactGroup.new @contact_group.customer_id = logged_user @contactgroups = ContactGroup.find_by_user(logged_user) end - + def add @contactgroup = ContactGroup.new @contactgroup.customer_id = logged_user render("/contact_group/edit") end - + def delete contactgroup = ContactGroup.find(@params["id"]) contactgroup.destroy redirect_to(:action=>"list") end - + def edit @contactgroup = ContactGroup.find(@params["id"]) end - + def save begin if @params["contactgroup"]["id"].nil? or @params["contactgroup"]["id"] == "" @@ -33,7 +37,7 @@ class ContactGroupsController < ApplicationController @contactgroup = ContactGroup.find(@params["contactgroup"]["id"]) @contactgroup.attributes = @params["contactgroup"] end - + if @contactgroup.save redirect_to(:action=>"list") else @@ -45,8 +49,8 @@ class ContactGroupsController < ApplicationController render("/contact_group/edit") end end - + protected def secure_user?() true end - + end diff --git a/app/controllers/contacts_controller.rb b/app/controllers/contacts_controller.rb index 7e530aa..ace89c3 100755 --- a/app/controllers/contacts_controller.rb +++ b/app/controllers/contacts_controller.rb @@ -1,6 +1,9 @@ class ContactsController < ApplicationController + + theme :theme_resolver + layout :select_layout - + def index if params[:letter] && params[:letter].any? @contacts = Contact.for_customer(logged_user).letter(params[:letter]).paginate :page => params[:page], @@ -9,14 +12,14 @@ class ContactsController < ApplicationController @contacts = Contact.for_customer(logged_user).paginate :page => params[:page], :per_page => CDF::CONFIG[:contacts_per_page] end end - + def listLetter letters = CDF::CONFIG[:contact_letters] @contact_pages = Paginator.new(self, Contact.count( ["customer_id = %s and substr(UPPER(fname),1,1) = '%s'", logged_user, letters[params['id'].to_i]]), CDF::CONFIG[:contacts_per_page], params['page']) - @contacts = Contact.find(:all, :conditions=>["customer_id = %s and substr(UPPER(fname),1,1) = '%s'", logged_user, letters[params['id'].to_i]], + @contacts = Contact.find(:all, :conditions=>["customer_id = %s and substr(UPPER(fname),1,1) = '%s'", logged_user, letters[params['id'].to_i]], :order=>['fname'], :limit=>CDF::CONFIG[:contacts_per_page], :offset=>@contact_pages.current.offset) - + if params["mode"] == "groups" if params["group_id"] and not params["group_id"].nil? and not params["group_id"] == '' @group_id = params["group_id"].to_i @@ -31,17 +34,17 @@ class ContactsController < ApplicationController end end end - + render :action => "list" end - + def new @contact = Contact.new @contact.customer_id = logged_user - + # load related lists loadLists - + # Init groups: because of checkbox # Set all to 0 => unchecked @groups = Hash.new @@ -49,12 +52,12 @@ class ContactsController < ApplicationController @groups[g.id] = 0 } end - + def add_multiple @contact = Contact.new @contact["file_type"] = "1" end - + def add_from_mail cstr = params['cstr'] retmsg = params['retmsg'] @@ -69,13 +72,13 @@ class ContactsController < ApplicationController else fname, lname, email = "", "", cstr end - + if @contact = Contact.find_by_user_email(logged_user, email) # load related lists loadLists - + @contact.fname, @contact.lname = fname, lname - + # groups = @contact.groups @groups = Hash.new @contactgroups.each {|g| @@ -95,82 +98,82 @@ class ContactsController < ApplicationController else @contact = Contact.new("fname"=>fname, "lname" => lname, "email" => email) @contact.customer_id = logged_user - + # load related lists loadLists - + # Init groups: because of checkbox # Set all to 0 => unchecked @groups = Hash.new @contactgroups.each {|g| @groups[g.id] = 0 } - end + end render :action => "new" end - + def import_preview file = params["contact"]["data"] - + flash["errors"] = Array.new - + if file.size == 0 flash["errors"] << _('You haven\'t selected file or the file is empty') @contact = Contact.new @contact["file_type"] = params["contact"]["file_type"] render :action => "add_multiple" end - + file_type = params["contact"]["file_type"] if file_type.nil? or file_type == '1' separator = ',' else separator = /\t/ - + end - + @contacts = Array.new emails = Array.new - - file.each {|line| + + file.each {|line| cdata = line.strip.chomp.split(separator) cont = Contact.new cont.fname = cdata[0].to_s.strip.chomp cont.lname = cdata[1].to_s.strip.chomp cont.email = cdata[2].to_s.strip.chomp - + # Check for duplicate emails in the file if emails.include?(cont.email) flash["errors"] << sprintf(_('Contact %'), file.lineno.to_s) + ": " + _('The e-mail duplicates the e-mail of another record!') - else + else emails << cont.email end - + @contacts << cont } - + end - + def import contacts_count = params["contact"].length contacts_to_import = params["contact"] @contacts = Array.new emails = Array.new - + flash["errors"] = Array.new - + for i in 0...contacts_count contact = Contact.new contact.customer_id = logged_user contact.fname = contacts_to_import[i.to_s]["fname"] contact.lname = contacts_to_import[i.to_s]["lname"] contact.email = contacts_to_import[i.to_s]["email"] - + begin # Check for duplicate emails in the submitted data if emails.include?(contact.email) flash["errors"] << sprintf(_('Contact %'), (i+1).to_s) + ": " + _('The e-mail duplicates the e-mail of another record!') - else + else emails << contact.email end # Check if contact is valid @@ -180,7 +183,7 @@ class ContactsController < ApplicationController ["fname", "lname", "email"].each do |attr| attr_errors = contact.errors.on(attr) attr_errors = [attr_errors] unless attr_errors.nil? or attr_errors.is_a? Array - + if not attr_errors.nil? attr_errors.each do |msg| flash["errors"] << l(:contact_addmultiple_errorforcontact, (i+1).to_s) + ": " + l(msg) @@ -189,10 +192,10 @@ class ContactsController < ApplicationController end end end # rescue - + @contacts << contact end # for - + # If there are validation errors - display them if not flash["errors"].nil? and not flash["errors"].empty? render :action => "import_preview" @@ -214,49 +217,49 @@ class ContactsController < ApplicationController end end - + def choose if params["mode"] == "groups" save_groups end - + @tos, @ccs, @bccs = Array.new, Array.new, Array.new - + params["contacts_to"].each{ |id,value| @tos << Contact.find(id) if value == "1" } if params["contacts_to"] params["contacts_cc"].each{ |id,value| @ccs << Contact.find(id) if value == "1" } if params["contacts_cc"] params["contacts_bcc"].each{ |id,value| @bccs << Contact.find(id) if value == "1" } if params["contacts_bcc"] - - params["groups_to"].each{ |id,value| + + params["groups_to"].each{ |id,value| ContactGroup.find(id).contacts.each {|c| @tos << c} if value == "1" } if params["groups_to"] - params["groups_cc"].each{ |id,value| + params["groups_cc"].each{ |id,value| ContactGroup.find(id).contacts.each {|c| @ccs << c} if value == "1" } if params["groups_cc"] - params["groups_bcc"].each{ |id,value| + params["groups_bcc"].each{ |id,value| ContactGroup.find(id).contacts.each {|c| @bccs << c} if value == "1" } if params["groups_bcc"] end - + def save_groups contacts_for_group = params["contacts_for_group"] group_id = params["group_id"] contact_group = ContactGroup.find(group_id) - - - contacts_for_group.each { |contact_id,value| + + + contacts_for_group.each { |contact_id,value| contact = Contact.find(contact_id) - if value == "1" and not contact_group.contacts.include?(contact) - contact_group.contacts << contact + if value == "1" and not contact_group.contacts.include?(contact) + contact_group.contacts << contact end - if value == "0" and contact_group.contacts.include?(contact) - contact_group.contacts.delete(contact) + if value == "0" and contact_group.contacts.include?(contact) + contact_group.contacts.delete(contact) end } redirect_to(:action=>"index", :id=>group_id, :params=>{"mode"=>params["mode"]}) end - + def edit @contact = Contact.find(params["id"]) # load related lists loadLists - + # groups = @contact.groups @groups = Hash.new @contactgroups.each {|g| @@ -272,10 +275,10 @@ class ContactsController < ApplicationController else @groups[g.id] = 0 # unchecked end - } + } render :action => "new" end - + # Insert or update def create if params["contact"]["id"] == "" @@ -286,14 +289,14 @@ class ContactsController < ApplicationController @contact = Contact.find(params["contact"]["id"]) @contact.attributes = params["contact"] end - + @contactgroups = ContactGroup.find_by_user(logged_user) # Groups displayed groups = params['groups'] tempGroups = Array.new tempGroups.concat(@contact.groups) - - @contactgroups.each { |cgroup| + + @contactgroups.each { |cgroup| includesCGroup = false tempGroups.each {|gr| if gr.contact_group_id.to_i == cgroup.id.to_i @@ -304,7 +307,7 @@ class ContactsController < ApplicationController if groups["#{cgroup.id}"] == "1" and not includesCGroup @contact.groups << cgroup end - + if groups["#{cgroup.id}"] == "0" and includesCGroup @contact.groups.delete(cgroup) end @@ -323,34 +326,34 @@ class ContactsController < ApplicationController @groups[g.id] = 1 else @groups[g.id] = 0 - end + end } render :action => :new end end - + def delete Contact.destroy(params['id']) redirect_to(:action=>'index') end - + protected def secure_user?() true end - def additional_scripts() + def additional_scripts() add_s = '' if action_name == "choose" - add_s<<'' - add_s<<'' + add_s<<'' + add_s<<'' end - add_s - end - + add_s + end + def onload_function() if action_name == "choose" - "javascript:respondToCaller();" + "javascript:respondToCaller();" else "" - end + end end private def select_layout @@ -366,7 +369,7 @@ class ContactsController < ApplicationController 'public' end end - + def loadLists if @contactgroups.nil? @contactgroups = ContactGroup.find_by_user(logged_user) diff --git a/app/controllers/folders_controller.rb b/app/controllers/folders_controller.rb index 88afe98..5a542fa 100755 --- a/app/controllers/folders_controller.rb +++ b/app/controllers/folders_controller.rb @@ -6,6 +6,8 @@ class FoldersController < ApplicationController before_filter :load_imap_session after_filter :close_imap_session + theme :theme_resolver + layout 'public' def index diff --git a/app/controllers/login_controller.rb b/app/controllers/login_controller.rb index 462a634..fc0f2a6 100755 --- a/app/controllers/login_controller.rb +++ b/app/controllers/login_controller.rb @@ -3,6 +3,8 @@ require 'imapmailbox' class LoginController < ApplicationController + theme :theme_resolver + def index if not(logged_user.nil?) redirect_to :controller =>"webmail", :action=>"index" diff --git a/app/controllers/webmail_controller.rb b/app/controllers/webmail_controller.rb index 12c6a1e..e780276 100755 --- a/app/controllers/webmail_controller.rb +++ b/app/controllers/webmail_controller.rb @@ -10,6 +10,8 @@ require 'imap_utils' class WebmailController < ApplicationController include ImapUtils + theme :theme_resolver + logger.info "*** WebmailController #{logger.inspect}" # Administrative functions diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index f800b5a..108ec48 100755 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,8 +1,8 @@ # The methods added to this helper will be available to all templates in the application. module ApplicationHelper include NavigationHelper - - protected + + protected def format_datetime(datetime) datetime.strftime "%d.%m.%Y %H:%M" @@ -70,7 +70,7 @@ module ApplicationHelper end end - # Helper method that has the same signature as real input field helpers, but simply displays + # Helper method that has the same signature as real input field helpers, but simply displays # the value of a given field enclosed within

tags. # Usage: # <%= form_input :read_only_field, 'new_user', 'name', _('user_name')) %> @@ -88,22 +88,22 @@ module ApplicationHelper def attributes(hash) hash.keys.inject("") { |attrs, key| attrs + %{#{key}="#{hash[key]}" } } end - + def initListClass @itClass = 1 end - + def popListClass ret = getListClass @itClass = @itClass + 1 return ret end - + def getListClass return "even" if @itClass%2 == 0 return "odd" if @itClass%2 == 1 end - + def get_meta_info '' '' @@ -111,13 +111,13 @@ module ApplicationHelper '' '' end - + def user @user = Customer.find(@session["user"]) if @user.nil? @user end - def link_main + def link_main link_to( t(:contacts), contacts_path) end @@ -125,9 +125,9 @@ module ApplicationHelper if @alternator.nil? @alternator = 1 end - + @alternator = -@alternator - + if @alternator == -1 return "even" else diff --git a/public/stylesheets/.gitkeep b/app/views/contents_moved_to_original_theme_directory old mode 100755 new mode 100644 similarity index 100% rename from public/stylesheets/.gitkeep rename to app/views/contents_moved_to_original_theme_directory diff --git a/config.ru b/config.ru index 8476511..de888a9 100755 --- a/config.ru +++ b/config.ru @@ -1,4 +1,4 @@ # This file is used by Rack-based servers to start the application. require ::File.expand_path('../config/environment', __FILE__) -run Rails3::Application +run Mailr::Application diff --git a/config/application.rb b/config/application.rb index 6e5c572..16387c7 100755 --- a/config/application.rb +++ b/config/application.rb @@ -6,7 +6,7 @@ require 'rails/all' # you've limited to :test, :development, or :production. Bundler.require(:default, Rails.env) if defined?(Bundler) -module Rails3 +module Mailr class Application < Rails::Application # Settings in config/environments/* take precedence over those specified here. # Application configuration should go into files in config/initializers diff --git a/config/default_site.rb b/config/default_site.rb index 6ab509c..c76969d 100755 --- a/config/default_site.rb +++ b/config/default_site.rb @@ -3,7 +3,7 @@ # some of them - create file config/site.rb # containing new constants in LOCALCONFIG module variable - they # will overwrite default values. Example site.rb: -# +# # module CDF # LOCALCONFIG = { # :mysql_version => '4.1', @@ -42,10 +42,11 @@ module CDF :encryption_salt => 'EnCr1p10n$@lt', :encryption_password => '$0MeEncr1pt10nP@a$sw0rd', :debug_imap => false, - :crypt_session_pass => true, # Set it to false (in site.rb) if you get any error messages like + :crypt_session_pass => true, # Set it to false (in site.rb) if you get any error messages like # "Unsupported cipher algorithm (aes-128-cbc)." - meaning that OpenSSL modules for crypt algo is not loaded. Setting it to false will store password in session in plain format! - :send_from_domain => nil, # Set this variable to your domain name in site.rb if you make login to imap only with username (without '@domain') - :imap_bye_timeout_retry_seconds => 2 + :send_from_domain => nil, # Set this variable to your domain name in site.rb if you make login to imap only with username (without '@domain') + :imap_bye_timeout_retry_seconds => 2, + :default_theme => 'original' } end diff --git a/config/environment.rb b/config/environment.rb index 4317a43..0d0a345 100755 --- a/config/environment.rb +++ b/config/environment.rb @@ -2,4 +2,4 @@ require File.expand_path('../application', __FILE__) # Initialize the rails application -Rails3::Application.initialize! +Mailr::Application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb index 787a9e7..d598c9d 100755 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -1,4 +1,4 @@ -Rails3::Application.configure do +Mailr::Application.configure do # Settings specified here will take precedence over those in config/application.rb # In the development environment your application's code is reloaded on diff --git a/config/environments/production.rb b/config/environments/production.rb index baa574b..41aeea9 100755 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -1,4 +1,4 @@ -Rails3::Application.configure do +Mailr::Application.configure do # Settings specified here will take precedence over those in config/application.rb # The production environment is meant for finished, "live" apps. diff --git a/config/environments/test.rb b/config/environments/test.rb index 8065328..1dafbaa 100755 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -1,4 +1,4 @@ -Rails3::Application.configure do +Mailr::Application.configure do # Settings specified here will take precedence over those in config/application.rb # The test environment is used exclusively to run your application's diff --git a/config/initializers/secret_token.rb b/config/initializers/secret_token.rb index 4beb550..d168e04 100755 --- a/config/initializers/secret_token.rb +++ b/config/initializers/secret_token.rb @@ -4,4 +4,4 @@ # If you change this key, all old signed cookies will become invalid! # Make sure the secret is at least 30 characters and all random, # no regular words or you'll be exposed to dictionary attacks. -Rails3::Application.config.secret_token = 'ade84d567b0c637fd3547fd18b97d1677fd6ca3c5331e6ed1a1b13bb6a7823cc367cbe317caf102f29f8c35eb487ff3ca33e6321d037c14ebb055eb530841ff6' +Mailr::Application.config.secret_token = 'ade84d567b0c637fd3547fd18b97d1677fd6ca3c5331e6ed1a1b13bb6a7823cc367cbe317caf102f29f8c35eb487ff3ca33e6321d037c14ebb055eb530841ff6' diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb index a3c4157..b5dbc5b 100755 --- a/config/initializers/session_store.rb +++ b/config/initializers/session_store.rb @@ -1,6 +1,6 @@ # Be sure to restart your server when you modify this file. -Rails3::Application.config.session_store :cookie_store, :key => '_rails3_session' +Mailr::Application.config.session_store :cookie_store, :key => '_mailr_session' # Use the database for sessions instead of the cookie-based default, # which shouldn't be used to store highly confidential information diff --git a/config/routes.rb b/config/routes.rb index 289e679..80ae421 100755 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,6 @@ -Rails3::Application.routes.draw do +Mailr::Application.routes.draw do + themes_for_rails + resources :folders resources :contacts do collection do diff --git a/public/javascripts/.gitkeep b/public/javascripts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/public/javascripts/application.js b/public/javascripts/application.js old mode 100755 new mode 100644 diff --git a/public/javascripts/controls.js b/public/javascripts/controls.js old mode 100755 new mode 100644 diff --git a/public/javascripts/dragdrop.js b/public/javascripts/dragdrop.js old mode 100755 new mode 100644 diff --git a/public/javascripts/effects.js b/public/javascripts/effects.js old mode 100755 new mode 100644 diff --git a/public/javascripts/global.js b/public/javascripts/global.js deleted file mode 100755 index a1367b9..0000000 --- a/public/javascripts/global.js +++ /dev/null @@ -1 +0,0 @@ -function changeLoc(loc){window.location=loc}function getCookie(name){var prefix=name+"=";var cStr=document.cookie;var start=cStr.indexOf(prefix);if(start==-1){return null;}var end=cStr.indexOf(";",start+prefix.length);if(end==-1){end=cStr.length;}var value=cStr.substring(start+prefix.length,end);return unescape(value);}function setCookie(name,value,expiration){document.cookie=name+"="+value+"; expires="+expiration;}function toggleCheckbox(checkBox){var element=document.getElementById(checkBox.id);if(element.value=="1"||element.checked){element.checked=false;element.value="0";}else{element.checked=true;element.value="1";}}function toggleChkbox(checkBox){if(checkBox.checked){checkBox.checked=true;}else{checkBox.checked=false;}}function toggle_list(id){ul="ul_"+id;img="img_"+id;hid="h_"+id;ulElement=document.getElementById(ul);imgElement=document.getElementById(img);hiddenElement=document.getElementById(hid);if(ulElement){if(ulElement.className=='closed'){ulElement.className="open";imgElement.src="/images/list_opened.gif";hiddenElement.value="1"}else{ulElement.className="closed";imgElement.src="/images/list_closed.gif";hiddenElement.value="0"}}}function toggle_layer(id){lElement=document.getElementById(id);imgElement=document.getElementById("img_"+id);if(lElement){if(lElement.className=='closed'){lElement.className="open";imgElement.src="/images/list_opened.gif";return true;}else{lElement.className="closed";imgElement.src="/images/list_closed.gif";return false;}}return true;}function toggle_layer_status(id){lElement=document.getElementById(id);if(lElement){if(lElement.className=='closed'){return false;}else{return true;}}return true;}function toggle_text(id){if(document.getElementById)elem=document.getElementById(id);else if(document.all)elem=eval("document.all."+id);else return false;if(!elem)return true;elemStyle=elem.style;if(elemStyle.display!="block"){elemStyle.display="block"}else{elemStyle.display="none"}return true;}function getFF(id){if(document.getElementById)elem=document.getElementById(id);else if(document.all)elem=document.eval("document.all."+id);return elem}function setFF(id,value){if(getFF(id))getFF(id).value=value;}function setCFF(id){if(getFF(id))getFF(id).checked=true;}function updateSUFromC(btnName){var suem=getCookie('_cdf_em');var sueg=getCookie('_cdf_gr');if(suem!=""&&suem!=null&&suem!="undefined"){setFF('sup_email',suem);setFF('signup_submit_button',btnName);}if(sueg&&sueg!=""){if(sueg.indexOf(",")<0&&sueg!=""){gr_id=sueg;setCFF('supgr_'+gr_id);}else while((i=sueg.indexOf(","))>=0){gr_id=sueg.substring(0,i);sueg=sueg.substring(i+1);setCFF('supgr_'+gr_id);}if(sueg.indexOf(",")<0&&sueg!=""){gr_id=sueg;setCFF('supgr_'+gr_id);}}}function updateLUEfC(){var suem=getCookie('_cdf_em');if(suem!=""&&suem!=null&&suem!="undefined"){setFF('login_user_email',suem);}}function replaceHRFST(ifrm){var o=ifrm;var w=null;if(o.contentWindow){w=o.contentWindow;}else if(window.frames&&window.frames[o.id].window){w=window.frames[o.id];}else return;var doc=w.document;if(!doc.getElementsByTagName)return;var anchors=doc.getElementsByTagName("a");for(var i=0;i=12){adds=' PM';h=system_date.getHours()-12;}else{adds=' AM';h=system_date.getHours();}spans[i].innerHTML=h+":"+(system_date.getMinutes()+"").replace(/\b(\d)\b/g,'0$1')+adds;}}function PopupPic(sPicURL,sWidth,sHeight){window.open("/popup.htm?"+sPicURL,"","resizable=1,HEIGHT="+sHeight+",WIDTH="+sWidth+",scrollbars=yes");}function open_link(target,location){if(target=='blank'){window.open(location);}else{window.top.location=location;}} \ No newline at end of file diff --git a/public/javascripts/prototype.js b/public/javascripts/prototype.js old mode 100755 new mode 100644 diff --git a/public/javascripts/rails.js b/public/javascripts/rails.js old mode 100755 new mode 100644 diff --git a/themes/empty/images/.gitkeep b/themes/empty/images/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/themes/empty/javascripts/.gitkeep b/themes/empty/javascripts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/themes/empty/stylesheets/.gitkeep b/themes/empty/stylesheets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/themes/empty/views/layouts/.gitkeep b/themes/empty/views/layouts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/app/views/layouts/chooser.html.erb b/themes/empty/views/layouts/chooser.html.erb similarity index 100% rename from app/views/layouts/chooser.html.erb rename to themes/empty/views/layouts/chooser.html.erb diff --git a/app/views/layouts/login.html.erb b/themes/empty/views/layouts/login.html.erb similarity index 100% rename from app/views/layouts/login.html.erb rename to themes/empty/views/layouts/login.html.erb diff --git a/app/views/layouts/public.html.erb b/themes/empty/views/layouts/xapplication.html.erb similarity index 100% rename from app/views/layouts/public.html.erb rename to themes/empty/views/layouts/xapplication.html.erb diff --git a/themes/original/images/.gitkeep b/themes/original/images/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/public/images/attachment.png b/themes/original/images/attachment.png similarity index 100% rename from public/images/attachment.png rename to themes/original/images/attachment.png diff --git a/public/images/d6deec.gif b/themes/original/images/d6deec.gif similarity index 100% rename from public/images/d6deec.gif rename to themes/original/images/d6deec.gif diff --git a/public/images/deselect.png b/themes/original/images/deselect.png similarity index 100% rename from public/images/deselect.png rename to themes/original/images/deselect.png diff --git a/public/images/list_closed.gif b/themes/original/images/list_closed.gif similarity index 100% rename from public/images/list_closed.gif rename to themes/original/images/list_closed.gif diff --git a/public/images/list_opened.gif b/themes/original/images/list_opened.gif similarity index 100% rename from public/images/list_opened.gif rename to themes/original/images/list_opened.gif diff --git a/themes/original/images/logo.png b/themes/original/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cb82345e9617cdfb0e25533aa76c7429395d2c3f GIT binary patch literal 13132 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%0D=drBKmkZAAf34-JUMR+W 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 0) { + gr_id = sueg.substring(0, i); + sueg = sueg.substring(i + 1); + setCFF('supgr_' + gr_id); + } + if (sueg.indexOf(",") < 0 && sueg != "") { + gr_id = sueg; + setCFF('supgr_' + gr_id); + } + } +} +function updateLUEfC() { + var suem = getCookie('_cdf_em'); + if (suem != "" && suem != null && suem != "undefined") { + setFF('login_user_email', suem); + } +} +function replaceHRFST(ifrm) { + var o = ifrm; + var w = null; + if (o.contentWindow) { + w = o.contentWindow; + } else if (window.frames && window.frames[o.id].window) { + w = window.frames[o.id]; + } else return; + var doc = w.document; + if (!doc.getElementsByTagName) return; + var anchors = doc.getElementsByTagName("a"); + for (var i = 0; i < anchors.length; i++) { + var anchor = anchors[i]; + if (anchor.getAttribute("href")) anchor.target = "_top"; + } + iHeight = doc.body.scrollHeight; + ifrm.style.height = iHeight + "px" +} +function rs(n, u, w, h, x) { + args = "width=" + w + ",height=" + h + ",resizable=yes,scrollbars=yes,status=0"; + remote = window.open(u, n, args); + if (remote != null && remote.opener == null) remote.opener = self; + if (x == 1) return remote; +} +function wizard_step_onclick(direction, alt_url) { + if (document.forms[0]) { + direction_elem = ''; + if (document.getElementById) { + direction_elem = document.getElementById('wiz_dir'); + } else if (document.all) { + direction_elem = document.eval("document.all.wiz_dir"); + } + if (direction_elem) { + direction_elem.value = direction; + } + if (document.forms[0].onsubmit) { + document.forms[0].onsubmit(); + } + document.forms[0].submit(); + } else { + window.location = alt_url; + } +} +function toggle_adtype(ad_type) { + toggle_text('upload_banner_label'); + toggle_text('upload_banner'); + toggle_text('radio1_label'); + toggle_text('radio1'); + toggle_text('radio2_label'); + toggle_text('radio2'); + toggle_text('adtitle_label'); + toggle_text('adtitle'); + toggle_text('adtext_label'); + toggle_text('adtext'); + toggle_text('banner_size_label'); + toggle_text('banner_size'); +} +function show_date_as_local_time() { + var spans = document.getElementsByTagName('span'); + for (var i = 0; i < spans.length; i++) if (spans[i].className.match(/\bLOCAL_TIME\b/i)) { + system_date = new Date(Date.parse(spans[i].innerHTML)); + if (system_date.getHours() >= 12) { + adds = ' PM'; + h = system_date.getHours() - 12; + } else { + adds = ' AM'; + h = system_date.getHours(); + } + spans[i].innerHTML = h + ":" + (system_date.getMinutes() + "").replace(/\b(\d)\b/g, '0$1') + adds; + } +} +function PopupPic(sPicURL, sWidth, sHeight) { + window.open("/popup.htm?" + sPicURL, "", "resizable=1,HEIGHT=" + sHeight + ",WIDTH=" + sWidth + ",scrollbars=yes"); +} +function open_link(target, location) { + if (target == 'blank') { + window.open(location); + } else { + window.top.location = location; + } +} diff --git a/public/javascripts/global_src.js b/themes/original/javascripts/global_src.js similarity index 92% rename from public/javascripts/global_src.js rename to themes/original/javascripts/global_src.js index 94e387a..76b3fb7 100755 --- a/public/javascripts/global_src.js +++ b/themes/original/javascripts/global_src.js @@ -1,19 +1,19 @@ function changeLoc(loc) { window.location = loc } function getCookie(name) { - var prefix = name + "="; + var prefix = name + "="; var cStr = document.cookie; var start = cStr.indexOf(prefix); if (start==-1) { return null; } - + var end = cStr.indexOf(";", start+prefix.length); if (end==-1) { end=cStr.length; } var value=cStr.substring(start+prefix.length, end); return unescape(value); } -function setCookie(name, value, expiration) { +function setCookie(name, value, expiration) { document.cookie = name+"="+value+"; expires="+expiration; } function toggleCheckbox(checkBox) { @@ -43,11 +43,11 @@ function toggle_list(id){ if (ulElement){ if (ulElement.className == 'closed'){ ulElement.className = "open"; - imgElement.src = "/images/list_opened.gif"; + imgElement.src = "/themes/original/images/list_opened.gif"; hiddenElement.value = "1" }else{ ulElement.className = "closed"; - imgElement.src = "/images/list_closed.gif"; + imgElement.src = "/themes/original/images/list_closed.gif"; hiddenElement.value = "0" } } @@ -58,11 +58,11 @@ function toggle_layer(id) { if (lElement){ if (lElement.className == 'closed'){ lElement.className = "open"; - imgElement.src = "/images/list_opened.gif"; + imgElement.src = "/themes/original/images/list_opened.gif"; return true; }else{ lElement.className = "closed"; - imgElement.src = "/images/list_closed.gif"; + imgElement.src = "/themes/original/images/list_closed.gif"; return false; } } @@ -86,9 +86,9 @@ function toggle_text(id){ elem = eval( "document.all." + id ); else return false; - + if(!elem) return true; - + elemStyle = elem.style; if ( elemStyle.display != "block" ) { elemStyle.display = "block" @@ -107,7 +107,7 @@ function setCFF(id) {if(getFF(id))getFF(id).checked=true;} function updateSUFromC(btnName) { var suem = getCookie('_cdf_em');var sueg = getCookie('_cdf_gr'); if (suem != "" && suem != null && suem != "undefined") { setFF('sup_email', suem); setFF('signup_submit_button',btnName); } - + if (sueg && sueg != "") { if (sueg.indexOf(",") < 0 && sueg != "") { gr_id = sueg; setCFF('supgr_'+gr_id); } else while ((i = sueg.indexOf(",")) >= 0) { gr_id = sueg.substring(0,i); sueg = sueg.substring(i+1); setCFF('supgr_'+gr_id); } @@ -133,7 +133,7 @@ function replaceHRFST(ifrm) { for (var i=0; i= 12) { adds = ' PM'; h = system_date.getHours() - 12; } + if (system_date.getHours() >= 12) { adds = ' PM'; h = system_date.getHours() - 12; } else { adds = ' AM'; h = system_date.getHours(); } - spans[i].innerHTML = h + ":" + (system_date.getMinutes()+"").replace(/\b(\d)\b/g, '0$1') + adds; + spans[i].innerHTML = h + ":" + (system_date.getMinutes()+"").replace(/\b(\d)\b/g, '0$1') + adds; } } function PopupPic(sPicURL,sWidth,sHeight) { @@ -198,4 +198,4 @@ function open_link(target, location){ } else { window.top.location = location; } -} \ No newline at end of file +} diff --git a/public/javascripts/htmlstyle.js b/themes/original/javascripts/htmlstyle.js similarity index 100% rename from public/javascripts/htmlstyle.js rename to themes/original/javascripts/htmlstyle.js diff --git a/public/javascripts/jstrim.pl b/themes/original/javascripts/jstrim.pl similarity index 100% rename from public/javascripts/jstrim.pl rename to themes/original/javascripts/jstrim.pl diff --git a/public/javascripts/prototype_src.js b/themes/original/javascripts/prototype_src.js similarity index 100% rename from public/javascripts/prototype_src.js rename to themes/original/javascripts/prototype_src.js diff --git a/public/javascripts/scriptaculous.js b/themes/original/javascripts/scriptaculous.js similarity index 100% rename from public/javascripts/scriptaculous.js rename to themes/original/javascripts/scriptaculous.js diff --git a/public/javascripts/slider.js b/themes/original/javascripts/slider.js similarity index 100% rename from public/javascripts/slider.js rename to themes/original/javascripts/slider.js diff --git a/public/javascripts/webmail.js b/themes/original/javascripts/webmail.js similarity index 100% rename from public/javascripts/webmail.js rename to themes/original/javascripts/webmail.js diff --git a/themes/original/stylesheets/.gitkeep b/themes/original/stylesheets/.gitkeep new file mode 100755 index 0000000..e69de29 diff --git a/public/stylesheets/admin.css b/themes/original/stylesheets/admin.css similarity index 73% rename from public/stylesheets/admin.css rename to themes/original/stylesheets/admin.css index 5d426b8..789496a 100755 --- a/public/stylesheets/admin.css +++ b/themes/original/stylesheets/admin.css @@ -28,11 +28,11 @@ a { text-decoration: none; background-color: transparent; } - + a:hover { color: #444; } - + a:active { color: #000; background-color: transparent; @@ -45,7 +45,7 @@ a { margin: 1em auto; text-align: left; background-color: #fff; - color: #858585; + color: #858585; } @@ -68,7 +68,7 @@ a { height: 240px; margin: 15px 30px; padding: 0; - border: 0; + border: 0; } #advert img { @@ -158,7 +158,7 @@ table.list th { font-size: 12px; font-weight: bold; color: #e70; - text-align: left; + text-align: left; padding-left: 1em; } @@ -181,9 +181,9 @@ div.gal img {border: 1px solid; border-color: #444 #AAA #AAA #444;} div.lc img {height: 96px; width: 128px; margin: 40px 0 0 0;} div.pt img {height: 128px; width: 96px; margin: 8px 16px 0 0; margin-left:10px;} div.gal ul {margin: 0.25em 0 0 0; padding: 0; font: bold small Arial, Verdana, sans-serif;} -div.gal ul li {padding: 0; list-style-type:none; } -div.gal ul li.galcaption {display: block; text-align: left; padding: 0 15px; margin: 0;} -div.gal ul li.galedit {display: block; text-align: left; padding: 0 15px; margin: 0;} +div.gal ul li {padding: 0; list-style-type:none; } +div.gal ul li.galcaption {display: block; text-align: left; padding: 0 15px; margin: 0;} +div.gal ul li.galedit {display: block; text-align: left; padding: 0 15px; margin: 0;} div.gal ul li.galdel {display: block; text-align: left; padding: 0 15px; margin: 0;} #iconmenu { @@ -213,7 +213,7 @@ div.gal ul li.galdel {display: block; text-align: left; padding: 0 15px; margin: color: gray; display: block; width: 110px; - margin: 0; + margin: 0; padding: 64px 0 0 0; background-position: center top; background-repeat: no-repeat; @@ -222,40 +222,40 @@ div.gal ul li.galdel {display: block; text-align: left; padding: 0 15px; margin: text-decoration: none; } -#iconmenu li a:hover { +#iconmenu li a:hover { color: black; text-decoration: none; background-position: center top; - border: 1px dashed #DCDCDC; + border: 1px dashed #DCDCDC; } -#mmhomepage, #mmhomepage a { background-image: url(/images/homepage.gif); } -#mmlogo, #mmlogo a { background-image: url(/images/logo.gif); } -#mmwebmail, #mmwebmail a { background-image: url(/images/webmail.gif); } -#mmcontacts, #mmcontacts a { background-image: url(/images/contacts.gif); } -#mmcontactgroups, #mmcontactgroups a { background-image: url(/images/contact_groups.gif); } -#mmcontactscales, #mmcontactscales a { background-image: url(/images/contact_scales.gif); } -#mmarticletypes, #mmarticletypes a { background-image: url(/images/article_types.gif); } -#mmarticles, #mmarticles a { background-image: url(/images/articles.gif); } -#mmgallery, #mmgallery a { background-image: url(/images/image.gif); } -#mmcategories, #mmcategories a { background-image: url(/images/categories.gif); } -#mmregion, #mmregion a { background-image: url(/images/region.gif); } -#mmlogout, #mmlogout a { background-image: url(/images/logout.gif); } -#mmwizard, #mmwizard a { background-image: url(/images/wizard_mirr.gif); } -#mmpages, #mmpages a { background-image: url(/images/pages.gif); } -#mmmenueditor, #mmmenueditor a { background-image: url(/images/menueditor.gif); } -#mmforumcats, #mmforumcats a { background-image: url(/images/forum.gif); } -#mmforums, #mmforums a { background-image: url(/images/forum.gif); } -#mmchnagepassword, #mmchnagepassword a { background-image: url(/images/password.gif); } -#mmblog, #mmblog a { background-image: url(/images/blog.gif); } -#mmcar, #mmcar a { background-image: url(/images/car.gif); } -#mmpathstatpath, #mmpathstatpath a { background-image: url(/images/stats.gif); } -#mmnewsletters, #mmnewsletters a { background-image: url(/images/newsletters.gif); } -#mmadvert, #mmadvert a { background-image: url(/images/advert.gif); } -#mmforms, #mmforms a { background-image: url(/images/formbuilder.gif); } -#mmattachments, #mmattachments a { background-image: url(/images/attachment.gif); } -#mmphoto, #mmphoto a { background-image: url(/images/photo.gif); } -#mmtypo, #mmtypo a { background-image: url(/images/typo.gif); } +#mmhomepage, #mmhomepage a { background-image: url("/themes/original/images/homepage.gif"); } +#mmlogo, #mmlogo a { background-image: url("/themes/original/images/logo.gif"); } +#mmwebmail, #mmwebmail a { background-image: url("/themes/original/images/webmail.gif"); } +#mmcontacts, #mmcontacts a { background-image: url("/themes/original/images/contacts.gif"); } +#mmcontactgroups, #mmcontactgroups a { background-image: url("/themes/original/images/contact_groups.gif"); } +#mmcontactscales, #mmcontactscales a { background-image: url("/themes/original/images/contact_scales.gif"); } +#mmarticletypes, #mmarticletypes a { background-image: url("/themes/original/images/article_types.gif"); } +#mmarticles, #mmarticles a { background-image: url("/themes/original/images/articles.gif"); } +#mmgallery, #mmgallery a { background-image: url("/themes/original/images/image.gif"); } +#mmcategories, #mmcategories a { background-image: url("/themes/original/images/categories.gif"); } +#mmregion, #mmregion a { background-image: url("/themes/original/images/region.gif"); } +#mmlogout, #mmlogout a { background-image: url("/themes/original/images/logout.gif"); } +#mmwizard, #mmwizard a { background-image: url("/themes/original/images/wizard_mirr.gif"); } +#mmpages, #mmpages a { background-image: url("/themes/original/images/pages.gif"); } +#mmmenueditor, #mmmenueditor a { background-image: url("/themes/original/images/menueditor.gif"); } +#mmforumcats, #mmforumcats a { background-image: url("/themes/original/images/forum.gif"); } +#mmforums, #mmforums a { background-image: url("/themes/original/images/forum.gif"); } +#mmchnagepassword, #mmchnagepassword a { background-image: url("/themes/original/images/password.gif"); } +#mmblog, #mmblog a { background-image: url("/themes/original/images/blog.gif"); } +#mmcar, #mmcar a { background-image: url("/themes/original/images/car.gif"); } +#mmpathstatpath, #mmpathstatpath a { background-image: url("/themes/original/images/stats.gif"); } +#mmnewsletters, #mmnewsletters a { background-image: url("/themes/original/images/newsletters.gif"); } +#mmadvert, #mmadvert a { background-image: url("/themes/original/images/advert.gif"); } +#mmforms, #mmforms a { background-image: url("/themes/original/images/formbuilder.gif"); } +#mmattachments, #mmattachments a { background-image: url("/themes/original/images/attachment.gif"); } +#mmphoto, #mmphoto a { background-image: url("/themes/original/images/photo.gif"); } +#mmtypo, #mmtypo a { background-image: url("/themes/original/images/typo.gif"); } /* Wizard */ @@ -390,20 +390,20 @@ td.htmlarea { border: 1px solid; } -#suggest { - padding: 10px; - margin: 10px; +#suggest { + padding: 10px; + margin: 10px; border: 1px dotted; width: 362px; - voice-family: "\"}\""; - voice-family: inherit; + voice-family: "\"}\""; + voice-family: inherit; width: 383px; } -#suggest p { - padding: 0; - margin-left: 0; - margin-top:0; +#suggest p { + padding: 0; + margin-left: 0; + margin-top:0; font-size: 10px; } @@ -466,22 +466,22 @@ li.error { color: red; } .cpointer { cursor: pointer; cursor: hand; } -.partactive { - padding-top: 10px; - width: 150px; - height: 25px; +.partactive { + padding-top: 10px; + width: 150px; + height: 25px; text-align: center; - background-color: rgb(220,220,220); - border: #555 solid 0.5px; + background-color: rgb(220,220,220); + border: #555 solid 0.5px; } -.partsel { - padding-top: 10px; - width: 150px; +.partsel { + padding-top: 10px; + width: 150px; height: 25px; - text-align: center; - background-color: rgb(190,190,190); - border: #555 solid 0.5px; + text-align: center; + background-color: rgb(190,190,190); + border: #555 solid 0.5px; } div#parts a img { border: 0; align: right } @@ -496,7 +496,7 @@ div#parts a img { border: 0; align: right } } .part-editor h2 { padding: 0; margin: 0; color: #00F; margin-bottom: 20px } -.part-editor label { font-size: 10px; color: #00F } +.part-editor label { font-size: 10px; color: #00F } div#parts { width: 150px; @@ -513,11 +513,11 @@ div#compose-choose { } div#compose-radios { - padding-top: 10px; - width: 150px; + padding-top: 10px; + width: 150px; height: 25px; - float: left; - background-color: rgb(220,220,220); + float: left; + background-color: rgb(220,220,220); } div#compose-radios a img { border: 0px; } @@ -538,11 +538,11 @@ div#tab_content table tr td.cpointer a img { border: 0; } div#choose-urls { font-size: 0.75em; text-align: left; padding: 5px; } div#choose-urls h4 { margin: 0; padding: 0; } div#choose-urls ul { margin: 0; padding: 0; } -div#choose-urls li { list-style-type:none; background: #EDF4F5; border: 1px solid #AAA; margin: 1px; } +div#choose-urls li { list-style-type:none; background: #EDF4F5; border: 1px solid #AAA; margin: 1px; } div#left-menu-items ul { margin: 0; padding: 0; } -div#left-menu-items li { list-style-type:none; background: #EDF4F5; border: 1px solid #AAA; margin: 1px;} -div#left-menu-items a img { border: 0;} +div#left-menu-items li { list-style-type:none; background: #EDF4F5; border: 1px solid #AAA; margin: 1px;} +div#left-menu-items a img { border: 0;} div#left-menu-items ul li ul li { list-style-type:none; background: #F4F5ED; border: 1px solid #AAA; margin: 1px; } div#left-menu-items ul li ul { margin: 2px; padding: 2px; } @@ -551,4 +551,4 @@ div.lm-subitems { margin: 5px; } .comboarrow {} .combodivshow {position:absolute; display: inline;z-index:10000 } .combodiv { position:abcoslute; display:none; z-index:10000 } -.combosel { width: 220px; border-style: none; } \ No newline at end of file +.combosel { width: 220px; border-style: none; } diff --git a/public/stylesheets/mailr.css b/themes/original/stylesheets/mailr.css similarity index 84% rename from public/stylesheets/mailr.css rename to themes/original/stylesheets/mailr.css index e659984..8657423 100755 --- a/public/stylesheets/mailr.css +++ b/themes/original/stylesheets/mailr.css @@ -3,7 +3,7 @@ .closed { display: none; } #logo { - background-image: url("/images/logo.png"); + background-image: url("/themes/original/images/logo.png"); background-repeat: no-repeat; height: 125px; } @@ -46,7 +46,7 @@ table.form_layout td.form_actions { text-align: right; } /* Rounded Box Corners ---------------------------------------------------------------------- */ .box {margin: 0 0 0.75em 0; clear: both; position: relative;} -b.cn { position: absolute; height: 10px; width: 10px; margin: 0; padding: 0; background: url(../images/white.png) no-repeat; line-height: 1px; font-size: 1px; } +b.cn { position: absolute; height: 10px; width: 10px; margin: 0; padding: 0; background: url("/themes/original/images/white.png") no-repeat; line-height: 1px; font-size: 1px; } b.tl {top: -1px; left: -1px; background-position: top left;} b.tr {top: -1px; right: -1px; background-position: top right;} b.bl {bottom: -1px; left: -1px; background-position: bottom left;} @@ -55,9 +55,9 @@ b.br {bottom: -1px; right: -1px; background-position: bottom right;} /* IE Filters */ * html b.bl {bottom:-2px} * html b.br {bottom:-2px} -* html b.cn {background-image: url(../images/white.gif);} +* html b.cn {background-image: url("/themes/original/images/white.gif");} -#container { background: url("../images/d6deec.gif") top left repeat-y; } +#container { background: url("/themes/original/images/d6deec.gif") top left repeat-y; } #tab_content { width: 100%; } diff --git a/public/stylesheets/tabs.css b/themes/original/stylesheets/tabs.css similarity index 89% rename from public/stylesheets/tabs.css rename to themes/original/stylesheets/tabs.css index 3f9219e..5396fed 100755 --- a/public/stylesheets/tabs.css +++ b/themes/original/stylesheets/tabs.css @@ -2,7 +2,7 @@ background: #789A9F; padding-top: 1.8em; width: 98%; - background-image: url(../images/select.png); + background-image: url("/themes/original/images/select.png"); } #tab_content { @@ -49,7 +49,7 @@ border: 1px solid #666; border-bottom: none; background: #789A9F; - background-image: url(../images/select.png); + background-image: url("/themes/original/images/select.png"); padding-bottom: 4px; margin-top: 0; color: #000; @@ -59,7 +59,7 @@ background: #EDF4F5; border: 1px solid #AAA; border-bottom: none; - background-image: url(../images/deselect.png); + background-image: url("/themes/original/images/deselect.png"); } #header ul#primary a:hover { @@ -108,4 +108,4 @@ background: transparent; } -#header ul#secondary li:last-child a { border: none; } \ No newline at end of file +#header ul#secondary li:last-child a { border: none; } diff --git a/public/stylesheets/webmail/icon-folder-open.gif b/themes/original/stylesheets/webmail/icon-folder-open.gif similarity index 100% rename from public/stylesheets/webmail/icon-folder-open.gif rename to themes/original/stylesheets/webmail/icon-folder-open.gif diff --git a/public/stylesheets/webmail/webmail.css b/themes/original/stylesheets/webmail/webmail.css similarity index 100% rename from public/stylesheets/webmail/webmail.css rename to themes/original/stylesheets/webmail/webmail.css diff --git a/app/views/contact_groups/edit.html.erb b/themes/original/views/contact_groups/edit.html.erb similarity index 100% rename from app/views/contact_groups/edit.html.erb rename to themes/original/views/contact_groups/edit.html.erb diff --git a/app/views/contact_groups/index.html.erb b/themes/original/views/contact_groups/index.html.erb similarity index 100% rename from app/views/contact_groups/index.html.erb rename to themes/original/views/contact_groups/index.html.erb diff --git a/app/views/contacts/add_multiple.html.erb b/themes/original/views/contacts/add_multiple.html.erb similarity index 100% rename from app/views/contacts/add_multiple.html.erb rename to themes/original/views/contacts/add_multiple.html.erb diff --git a/app/views/contacts/choose.html.erb b/themes/original/views/contacts/choose.html.erb similarity index 100% rename from app/views/contacts/choose.html.erb rename to themes/original/views/contacts/choose.html.erb diff --git a/app/views/contacts/import_preview.html.erb b/themes/original/views/contacts/import_preview.html.erb similarity index 100% rename from app/views/contacts/import_preview.html.erb rename to themes/original/views/contacts/import_preview.html.erb diff --git a/app/views/contacts/index.html.erb b/themes/original/views/contacts/index.html.erb similarity index 100% rename from app/views/contacts/index.html.erb rename to themes/original/views/contacts/index.html.erb diff --git a/app/views/contacts/new.html.erb b/themes/original/views/contacts/new.html.erb similarity index 100% rename from app/views/contacts/new.html.erb rename to themes/original/views/contacts/new.html.erb diff --git a/app/views/folders/index.html.erb b/themes/original/views/folders/index.html.erb similarity index 100% rename from app/views/folders/index.html.erb rename to themes/original/views/folders/index.html.erb diff --git a/themes/original/views/layouts/.gitkeep b/themes/original/views/layouts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/themes/original/views/layouts/chooser.html.erb b/themes/original/views/layouts/chooser.html.erb new file mode 100755 index 0000000..7c3b872 --- /dev/null +++ b/themes/original/views/layouts/chooser.html.erb @@ -0,0 +1,19 @@ + + + + <%=@title%> + + + <%=stylesheet_link_tag current_theme_stylesheet_path('admin') %> + <%=stylesheet_link_tag current_theme_stylesheet_path('tabs') %> + <%=stylesheet_link_tag current_theme_stylesheet_path('mailr') %> + <%=javascript_include_tag current_theme_javascript_path('global') %> + + + + <%= @content_for_layout %> + + + + diff --git a/themes/original/views/layouts/login.html.erb b/themes/original/views/layouts/login.html.erb new file mode 100755 index 0000000..ef95149 --- /dev/null +++ b/themes/original/views/layouts/login.html.erb @@ -0,0 +1,15 @@ + + + + <%=t(:mailr) %> » <%= t(:please_login)%> + + <%=stylesheet_link_tag current_theme_stylesheet_path('admin') %> + <%=stylesheet_link_tag current_theme_stylesheet_path('mailr') %> + + + + <%= yield %> + + diff --git a/themes/original/views/layouts/public.html.erb b/themes/original/views/layouts/public.html.erb new file mode 100755 index 0000000..2eced03 --- /dev/null +++ b/themes/original/views/layouts/public.html.erb @@ -0,0 +1,31 @@ + + + + <%= t :mailr %> + + + <%=stylesheet_link_tag current_theme_stylesheet_path('admin') %> + <%=stylesheet_link_tag current_theme_stylesheet_path('tabs') %> + <%=stylesheet_link_tag current_theme_stylesheet_path('mailr') %> + <%=javascript_include_tag current_theme_javascript_path('global') %> + <%=javascript_include_tag current_theme_javascript_path('webmail') %> + + <%=javascript_include_tag :defaults %> + + + +
+
+ +
<%= yield %>
+
+
+
+ + diff --git a/app/views/login/index.rhtml b/themes/original/views/login/index.rhtml similarity index 100% rename from app/views/login/index.rhtml rename to themes/original/views/login/index.rhtml diff --git a/app/views/shared/_folders.html.erb b/themes/original/views/shared/_folders.html.erb similarity index 100% rename from app/views/shared/_folders.html.erb rename to themes/original/views/shared/_folders.html.erb diff --git a/app/views/webmail/_contacts.html.erb b/themes/original/views/webmail/_contacts.html.erb similarity index 100% rename from app/views/webmail/_contacts.html.erb rename to themes/original/views/webmail/_contacts.html.erb diff --git a/app/views/webmail/_expr.html.erb b/themes/original/views/webmail/_expr.html.erb similarity index 100% rename from app/views/webmail/_expr.html.erb rename to themes/original/views/webmail/_expr.html.erb diff --git a/app/views/webmail/_filter.html.erb b/themes/original/views/webmail/_filter.html.erb similarity index 100% rename from app/views/webmail/_filter.html.erb rename to themes/original/views/webmail/_filter.html.erb diff --git a/app/views/webmail/_message_row.html.erb b/themes/original/views/webmail/_message_row.html.erb similarity index 90% rename from app/views/webmail/_message_row.html.erb rename to themes/original/views/webmail/_message_row.html.erb index e5f003c..9509d13 100755 --- a/app/views/webmail/_message_row.html.erb +++ b/themes/original/views/webmail/_message_row.html.erb @@ -10,5 +10,5 @@ <%= message_date(message_row.date) %> <%= message_size(message_row.size) %> - <%= message_row.content_type == 'multipart' ? image_tag('attachment.png') : ' ' %> + <%= message_row.content_type == 'multipart' ? image_tag(current_theme_image_path('attachment.png')) : ' ' %> diff --git a/app/views/webmail/_search.html.erb b/themes/original/views/webmail/_search.html.erb similarity index 73% rename from app/views/webmail/_search.html.erb rename to themes/original/views/webmail/_search.html.erb index 851964a..e967c1d 100755 --- a/app/views/webmail/_search.html.erb +++ b/themes/original/views/webmail/_search.html.erb @@ -1,7 +1,7 @@ - <%= t :search%>open + <%= t :search%>open - diff --git a/app/views/webmail/compose.html.erb b/themes/original/views/webmail/compose.html.erb similarity index 100% rename from app/views/webmail/compose.html.erb rename to themes/original/views/webmail/compose.html.erb diff --git a/app/views/webmail/error_connection.html.erb b/themes/original/views/webmail/error_connection.html.erb similarity index 100% rename from app/views/webmail/error_connection.html.erb rename to themes/original/views/webmail/error_connection.html.erb diff --git a/app/views/webmail/filter.html.erb b/themes/original/views/webmail/filter.html.erb similarity index 100% rename from app/views/webmail/filter.html.erb rename to themes/original/views/webmail/filter.html.erb diff --git a/app/views/webmail/filters.html.erb b/themes/original/views/webmail/filters.html.erb similarity index 100% rename from app/views/webmail/filters.html.erb rename to themes/original/views/webmail/filters.html.erb diff --git a/app/views/webmail/folders.html.erb b/themes/original/views/webmail/folders.html.erb similarity index 100% rename from app/views/webmail/folders.html.erb rename to themes/original/views/webmail/folders.html.erb diff --git a/app/views/webmail/mailsent.html.erb b/themes/original/views/webmail/mailsent.html.erb similarity index 100% rename from app/views/webmail/mailsent.html.erb rename to themes/original/views/webmail/mailsent.html.erb diff --git a/app/views/webmail/message.html.erb b/themes/original/views/webmail/message.html.erb similarity index 100% rename from app/views/webmail/message.html.erb rename to themes/original/views/webmail/message.html.erb diff --git a/app/views/webmail/messages.html.erb b/themes/original/views/webmail/messages.html.erb similarity index 96% rename from app/views/webmail/messages.html.erb rename to themes/original/views/webmail/messages.html.erb index b4b0314..b1652e5 100755 --- a/app/views/webmail/messages.html.erb +++ b/themes/original/views/webmail/messages.html.erb @@ -27,7 +27,7 @@ - <%=t :operations%>open + <%=t :operations%>open
diff --git a/app/views/webmail/noattachment.html.erb b/themes/original/views/webmail/noattachment.html.erb similarity index 100% rename from app/views/webmail/noattachment.html.erb rename to themes/original/views/webmail/noattachment.html.erb diff --git a/app/views/webmail/prefs.html.erb b/themes/original/views/webmail/prefs.html.erb similarity index 100% rename from app/views/webmail/prefs.html.erb rename to themes/original/views/webmail/prefs.html.erb diff --git a/app/views/webmail/view_source.html.erb b/themes/original/views/webmail/view_source.html.erb similarity index 100% rename from app/views/webmail/view_source.html.erb rename to themes/original/views/webmail/view_source.html.erb From aca4f8a3c6a663453c8d3d5bd15561c2fad5a90b Mon Sep 17 00:00:00 2001 From: Wojciech Todryk Date: Sun, 26 Jun 2011 13:05:56 +0200 Subject: [PATCH 15/88] logo project --- arts/logo2.xcf | Bin 0 -> 255261 bytes arts/logo3.xcf | Bin 0 -> 338334 bytes public/images/logo3.png | Bin 0 -> 63579 bytes public/images/logo3_dark.png | Bin 0 -> 77962 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 arts/logo2.xcf create mode 100644 arts/logo3.xcf create mode 100644 public/images/logo3.png create mode 100644 public/images/logo3_dark.png diff --git a/arts/logo2.xcf b/arts/logo2.xcf new file mode 100644 index 0000000000000000000000000000000000000000..85fd2cd98b10c4a766b7127039a7a8fda70837c1 GIT binary patch literal 255261 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

hg&b`i_7sKLsj+{$4nLf$hS- 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


2^=kC3G_a8jCfB)XS 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 E0J(35u>b%7 literal 0 HcmV?d00001 diff --git a/arts/logo3.xcf b/arts/logo3.xcf new file mode 100644 index 0000000000000000000000000000000000000000..53103569843a38cca93b900ec28bb91212998c72 GIT binary patch literal 338334 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ℜ8=e`364>2D4aQMiv6K5{n0G(k4nl$;( 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 - - diff --git a/themes/olive/README.olive b/themes/olive/README.olive new file mode 100644 index 0000000..bf812cf --- /dev/null +++ b/themes/olive/README.olive @@ -0,0 +1,3 @@ +Theme based on Web App Theme Olive theme. + +http://pilu.github.com/web-app-theme/#themes/olive diff --git a/themes/empty/images/.gitkeep b/themes/olive/images/.gitkeep similarity index 100% rename from themes/empty/images/.gitkeep rename to themes/olive/images/.gitkeep diff --git a/themes/olive/images/key.png b/themes/olive/images/key.png new file mode 100644 index 0000000000000000000000000000000000000000..4ec1a928140311ff30a0a9120e958096c77f446e GIT binary patch literal 612 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^zbpD<_bdda}R zAX(xXQ4*Y=R#Ki=l*-_klAn~S;F+74o*I;zm{M7IGS!BGf$^KCi(`nz>E6lS{=$J0 zZJqm<`9?k{m^jhf>0$$SXZ?Yt+~MzTC~TjU^pYh=D8qwg>JBB7wh0ovssbDnf)=nf zU1mENq$d?MBhz~B%xTm1%`0BT!Ii6CX>MFO?|sp^DGVAXrypL)?kDu8@ALilt_Np6 zDW5i5r8V(td&m>sOCK#iS)Eon==nJ#?qI0J&&~2HFMqVZ>Nx*_1^;;i`}zI{qLyu_ zyVCgNq`=7>zeh&OvnOsaKV*1vEz>Qd*2uoyGgV|~w{B8)xLe)Q{e-DZCUwVN=D*r6 z7rbBJ(y7zY?c4Ed)yWEZg?%RXIPNdB=Fs1(;2@qfyEI_GZL3%f-_idppWIk4Z4ymd zE@-@0wDJG>>R*b7POr6?9cUv(5NzYcXeqyIZCEt$7XilMd|(`1$mc#QJ+%LMnv37PN*KISRgB(EjGb zEz6h1{y*2<$a6Um)z#X#YHPN*X1JwS)I2Ap3mhkt9S+@R_`85Vo2lF^cXi$T_uGOT z|HPC{PW?Dx8t;X&XpWrL@CQr!nf~v(uz!;E=ObK6Ny?EC##bh=%H6*EVtHNN5`i-; ziqk8d`*j?-OP&6I6kA>9H?Q!HybfC$)BA|p+sih;s<;~{x6oLh@A@7sv1LD5@2>do V(t4&Xn}LCW!PC{xWt~$(69A8^6#4)F literal 0 HcmV?d00001 diff --git a/themes/olive/images/logo_small.png b/themes/olive/images/logo_small.png new file mode 100644 index 0000000000000000000000000000000000000000..3263e4c0744a2454e595fb5dfd210677ee9f7044 GIT binary patch literal 18309 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 this.finishOn) { + this.render(this.options.to); + if(this.finish) this.finish(); + if(this.options.afterFinish) this.options.afterFinish(this); + return; + } + pos = (timePos - this.startOn) / (this.finishOn - this.startOn); + frame = Math.round(pos * this.options.fps * this.options.duration); + if(frame > this.currentFrame) { + this.render(pos); + this.currentFrame = frame; + } + this.timeout = setTimeout(this.loop.bind(this), 10); + }, + render: function(pos) { + if(this.options.transition) pos = this.options.transition(pos); + pos = pos * (this.options.to-this.options.from); + pos += this.options.from; + if(this.options.beforeUpdate) this.options.beforeUpdate(this); + if(this.update) this.update(pos); + if(this.options.afterUpdate) this.options.afterUpdate(this); + }, + cancel: function() { + if(this.timeout) clearTimeout(this.timeout); + } + } + + Effect2.Parallel = Class.create(); + Effect2.Parallel.prototype = (new Effect2.Base()).extend({ + initialize: function(effects) { + this.effects = effects || []; + this.start(arguments[1]); + }, + update: function(position) { + for (var i = 0; i < this.effects.length; i++) + this.effects[i].render(position); + }, + finish: function(position) { + for (var i = 0; i < this.effects.length; i++) + if(this.effects[i].finish) this.effects[i].finish(position); + } + }); + + Effect2.Opacity = Class.create(); + Effect2.Opacity.prototype = (new Effect2.Base()).extend({ + initialize: function() { + this.element = $(arguments[0] || document.rootElement); + options = { + from: 0.0, + to: 1.0 + }.extend(arguments[1] || {}); + this.start(options); + }, + update: function(position) { + this.setOpacity(position); + }, + setOpacity: function(opacity) { + opacity = (opacity == 1) ? 0.99999 : opacity; + this.element.style.opacity = opacity; + this.element.style.filter = "alpha(opacity:"+opacity*100+")"; + } + }); + + Effect2.MoveBy = Class.create(); + Effect2.MoveBy.prototype = (new Effect2.Base()).extend({ + initialize: function(element, toTop, toLeft) { + this.element = $(element); + this.originalTop = + this.element.style.top ? parseFloat(this.element.style.top) : 0; + this.originalLeft = + this.element.style.left ? parseFloat(this.element.style.left) : 0; + this.toTop = toTop; + this.toLeft = toLeft; + if(this.element.style.position == "") + this.element.style.position = "relative"; + this.start(arguments[3]); + }, + update: function(position) { + topd = this.toTop * position + this.originalTop; + leftd = this.toLeft * position + this.originalLeft; + this.setPosition(topd, leftd); + }, + setPosition: function(topd, leftd) { + this.element.style.top = topd + "px"; + this.element.style.left = leftd + "px"; + } + }); + + Effect2.Scale = Class.create(); + Effect2.Scale.prototype = (new Effect2.Base()).extend({ + initialize: function(element, percent) { + this.element = $(element) + options = { + scaleX: true, + scaleY: true, + scaleContent: true, + scaleFromCenter: false, + scaleMode: 'box', // 'box' or 'contents' + scaleFrom: 100.0 + }.extend(arguments[2] || {}); + this.originalTop = this.element.offsetTop; + this.originalLeft = this.element.offsetLeft; + if (this.element.style.fontSize=="") this.sizeEm = 1.0; + if (this.element.style.fontSize && this.element.style.fontSize.indexOf("em")>0) + this.sizeEm = parseFloat(this.element.style.fontSize); + this.factor = (percent/100.0) - (options.scaleFrom/100.0); + if(options.scaleMode=='box') { + this.originalHeight = this.element.clientHeight; + this.originalWidth = this.element.clientWidth; + } else + if(options.scaleMode=='contents') { + this.originalHeight = this.element.scrollHeight; + this.originalWidth = this.element.scrollWidth; + } + this.start(options); + }, + + update: function(position) { + currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); + if(this.options.scaleContent && this.sizeEm) + this.element.style.fontSize = this.sizeEm*currentScale + "em"; + this.setDimensions( + this.originalWidth * currentScale, + this.originalHeight * currentScale); + }, + + setDimensions: function(width, height) { + if(this.options.scaleX) this.element.style.width = width + 'px'; + if(this.options.scaleY) this.element.style.height = height + 'px'; + if(this.options.scaleFromCenter) { + topd = (height - this.originalHeight)/2; + leftd = (width - this.originalWidth)/2; + if(this.element.style.position=='absolute') { + if(this.options.scaleY) this.element.style.top = this.originalTop-topd + "px"; + if(this.options.scaleX) this.element.style.left = this.originalLeft-leftd + "px"; + } else { + if(this.options.scaleY) this.element.style.top = -topd + "px"; + if(this.options.scaleX) this.element.style.left = -leftd + "px"; + } + } + } + }); + + /* ------------- prepackaged effects ------------- */ + + Effect2.Fade = function(element) { + options = { + from: 1.0, + to: 0.0, + afterFinish: function(effect) + { Element.hide(effect.element); + effect.setOpacity(1); } + }.extend(arguments[1] || {}); + new Effect2.Opacity(element,options); + } + +Effect2.Appear = function(element) { + options = { + from: 0.0, + to: 1.0, + beforeStart: function(effect) + { effect.setOpacity(0); + Element.show(effect.element); }, + afterUpdate: function(effect) + { Element.show(effect.element); } + }.extend(arguments[1] || {}); + new Effect2.Opacity(element,options); +} + + Effect2.Puff = function(element) { + new Effect2.Parallel( + [ new Effect2.Scale(element, 200, { sync: true, scaleFromCenter: true }), + new Effect2.Opacity(element, { sync: true, to: 0.0, from: 1.0 } ) ], + { duration: 1.0, + afterUpdate: function(effect) + { effect.effects[0].element.style.position = 'absolute'; }, + afterFinish: function(effect) + { Element.hide(effect.effects[0].element); } + } + ); + } + + Effect2.BlindUp = function(element) { + $(element).style.overflow = 'hidden'; + new Effect2.Scale(element, 0, + { scaleContent: false, + scaleX: false, + afterFinish: function(effect) + { Element.hide(effect.element) } + }.extend(arguments[1] || {}) + ); + } + + Effect2.BlindDown = function(element) { + $(element).style.height = '0px'; + $(element).style.overflow = 'hidden'; + Element.show(element); + new Effect2.Scale(element, 100, + { scaleContent: false, + scaleX: false, + scaleMode: 'contents', + scaleFrom: 0 + }.extend(arguments[1] || {}) + ); + } + + Effect2.SwitchOff = function(element) { + new Effect2.Appear(element, + { duration: 0.4, + transition: Effect2.Transitions.flicker, + afterFinish: function(effect) + { effect.element.style.overflow = 'hidden'; + new Effect2.Scale(effect.element, 1, + { duration: 0.3, scaleFromCenter: true, + scaleX: false, scaleContent: false, + afterUpdate: function(effect) { + if(effect.element.style.position=="") + effect.element.style.position = 'relative'; }, + afterFinish: function(effect) { Element.hide(effect.element); } + } ) + } + } ) + } + + Effect2.DropOut = function(element) { + new Effect2.Parallel( + [ new Effect2.MoveBy(element, 100, 0, { sync: true }), + new Effect2.Opacity(element, { sync: true, to: 0.0, from: 1.0 } ) ], + { duration: 0.5, + afterFinish: function(effect) + { Element.hide(effect.effects[0].element); } + }); + } + + Effect2.Shake = function(element) { + new Effect2.MoveBy(element, 0, 20, + { duration: 0.05, afterFinish: function(effect) { + new Effect2.MoveBy(effect.element, 0, -40, + { duration: 0.1, afterFinish: function(effect) { + new Effect2.MoveBy(effect.element, 0, 40, + { duration: 0.1, afterFinish: function(effect) { + new Effect2.MoveBy(effect.element, 0, -40, + { duration: 0.1, afterFinish: function(effect) { + new Effect2.MoveBy(effect.element, 0, 40, + { duration: 0.1, afterFinish: function(effect) { + new Effect2.MoveBy(effect.element, 0, -20, + { duration: 0.05, afterFinish: function(effect) { + }}) }}) }}) }}) }}) }}); + } + + Effect2.SlideDown = function(element) { + $(element).style.height = '0px'; + $(element).style.overflow = 'hidden'; + $(element).firstChild.style.position = 'relative'; + Element.show(element); + new Effect2.Scale(element, 100, + { scaleContent: false, + scaleX: false, + scaleMode: 'contents', + scaleFrom: 0, + afterUpdate: function(effect) + { effect.element.firstChild.style.bottom = + (effect.originalHeight - effect.element.clientHeight) + 'px'; } + }.extend(arguments[1] || {}) + ); + } + + Effect2.SlideUp = function(element) { + $(element).style.overflow = 'hidden'; + $(element).firstChild.style.position = 'relative'; + Element.show(element); + new Effect2.Scale(element, 0, + { scaleContent: false, + scaleX: false, + afterUpdate: function(effect) + { effect.element.firstChild.style.bottom = + (effect.originalHeight - effect.element.clientHeight) + 'px'; }, + afterFinish: function(effect) + { Element.hide(effect.element); } + }.extend(arguments[1] || {}) + ); + } \ No newline at end of file diff --git a/themes/olive/javascripts/global.js b/themes/olive/javascripts/global.js new file mode 100755 index 0000000..1176552 --- /dev/null +++ b/themes/olive/javascripts/global.js @@ -0,0 +1,216 @@ +function changeLoc(loc) { + window.location = loc +} +function getCookie(name) { + var prefix = name + "="; + var cStr = document.cookie; + var start = cStr.indexOf(prefix); + if (start == -1) { + return null; + } + var end = cStr.indexOf(";", start + prefix.length); + if (end == -1) { + end = cStr.length; + } + var value = cStr.substring(start + prefix.length, end); + return unescape(value); +} +function setCookie(name, value, expiration) { + document.cookie = name + "=" + value + "; expires=" + expiration; +} +function toggleCheckbox(checkBox) { + var element = document.getElementById(checkBox.id); + if (element.value == "1" || element.checked) { + element.checked = false; + element.value = "0"; + } else { + element.checked = true; + element.value = "1"; + } +} +function toggleChkbox(checkBox) { + if (checkBox.checked) { + checkBox.checked = true; + } else { + checkBox.checked = false; + } +} +function toggle_list(id) { + ul = "ul_" + id; + img = "img_" + id; + hid = "h_" + id; + ulElement = document.getElementById(ul); + imgElement = document.getElementById(img); + hiddenElement = document.getElementById(hid); + if (ulElement) { + if (ulElement.className == 'closed') { + ulElement.className = "open"; + imgElement.src = "/themes/original/images/list_opened.gif"; + hiddenElement.value = "1" + } else { + ulElement.className = "closed"; + imgElement.src = "/themes/original/images/list_closed.gif"; + hiddenElement.value = "0" + } + } +} +function toggle_layer(id) { + lElement = document.getElementById(id); + imgElement = document.getElementById("img_" + id); + if (lElement) { + if (lElement.className == 'closed') { + lElement.className = "open"; + imgElement.src = "/themes/original/images/list_opened.gif"; + return true; + } else { + lElement.className = "closed"; + imgElement.src = "/themes/original/images/list_closed.gif"; + return false; + } + } + return true; +} +function toggle_layer_status(id) { + lElement = document.getElementById(id); + if (lElement) { + if (lElement.className == 'closed') { + return false; + } else { + return true; + } + } + return true; +} +function toggle_text(id) { + if (document.getElementById) elem = document.getElementById(id); + else if (document.all) elem = eval("document.all." + id); + else return false; + if (!elem) return true; + elemStyle = elem.style; + if (elemStyle.display != "block") { + elemStyle.display = "block" + } else { + elemStyle.display = "none" + } + return true; +} +function getFF(id) { + if (document.getElementById) elem = document.getElementById(id); + else if (document.all) elem = document.eval("document.all." + id); + return elem +} +function setFF(id, value) { + if (getFF(id)) getFF(id).value = value; +} +function setCFF(id) { + if (getFF(id)) getFF(id).checked = true; +} +function updateSUFromC(btnName) { + var suem = getCookie('_cdf_em'); + var sueg = getCookie('_cdf_gr'); + if (suem != "" && suem != null && suem != "undefined") { + setFF('sup_email', suem); + setFF('signup_submit_button', btnName); + } + if (sueg && sueg != "") { + if (sueg.indexOf(",") < 0 && sueg != "") { + gr_id = sueg; + setCFF('supgr_' + gr_id); + } else while ((i = sueg.indexOf(",")) >= 0) { + gr_id = sueg.substring(0, i); + sueg = sueg.substring(i + 1); + setCFF('supgr_' + gr_id); + } + if (sueg.indexOf(",") < 0 && sueg != "") { + gr_id = sueg; + setCFF('supgr_' + gr_id); + } + } +} +function updateLUEfC() { + var suem = getCookie('_cdf_em'); + if (suem != "" && suem != null && suem != "undefined") { + setFF('login_user_email', suem); + } +} +function replaceHRFST(ifrm) { + var o = ifrm; + var w = null; + if (o.contentWindow) { + w = o.contentWindow; + } else if (window.frames && window.frames[o.id].window) { + w = window.frames[o.id]; + } else return; + var doc = w.document; + if (!doc.getElementsByTagName) return; + var anchors = doc.getElementsByTagName("a"); + for (var i = 0; i < anchors.length; i++) { + var anchor = anchors[i]; + if (anchor.getAttribute("href")) anchor.target = "_top"; + } + iHeight = doc.body.scrollHeight; + ifrm.style.height = iHeight + "px" +} +function rs(n, u, w, h, x) { + args = "width=" + w + ",height=" + h + ",resizable=yes,scrollbars=yes,status=0"; + remote = window.open(u, n, args); + if (remote != null && remote.opener == null) remote.opener = self; + if (x == 1) return remote; +} +function wizard_step_onclick(direction, alt_url) { + if (document.forms[0]) { + direction_elem = ''; + if (document.getElementById) { + direction_elem = document.getElementById('wiz_dir'); + } else if (document.all) { + direction_elem = document.eval("document.all.wiz_dir"); + } + if (direction_elem) { + direction_elem.value = direction; + } + if (document.forms[0].onsubmit) { + document.forms[0].onsubmit(); + } + document.forms[0].submit(); + } else { + window.location = alt_url; + } +} +function toggle_adtype(ad_type) { + toggle_text('upload_banner_label'); + toggle_text('upload_banner'); + toggle_text('radio1_label'); + toggle_text('radio1'); + toggle_text('radio2_label'); + toggle_text('radio2'); + toggle_text('adtitle_label'); + toggle_text('adtitle'); + toggle_text('adtext_label'); + toggle_text('adtext'); + toggle_text('banner_size_label'); + toggle_text('banner_size'); +} +function show_date_as_local_time() { + var spans = document.getElementsByTagName('span'); + for (var i = 0; i < spans.length; i++) if (spans[i].className.match(/\bLOCAL_TIME\b/i)) { + system_date = new Date(Date.parse(spans[i].innerHTML)); + if (system_date.getHours() >= 12) { + adds = ' PM'; + h = system_date.getHours() - 12; + } else { + adds = ' AM'; + h = system_date.getHours(); + } + spans[i].innerHTML = h + ":" + (system_date.getMinutes() + "").replace(/\b(\d)\b/g, '0$1') + adds; + } +} +function PopupPic(sPicURL, sWidth, sHeight) { + window.open("/popup.htm?" + sPicURL, "", "resizable=1,HEIGHT=" + sHeight + ",WIDTH=" + sWidth + ",scrollbars=yes"); +} +function open_link(target, location) { + if (target == 'blank') { + window.open(location); + } else { + window.top.location = location; + } +} diff --git a/themes/olive/javascripts/global_src.js b/themes/olive/javascripts/global_src.js new file mode 100755 index 0000000..76b3fb7 --- /dev/null +++ b/themes/olive/javascripts/global_src.js @@ -0,0 +1,201 @@ +function changeLoc(loc) { window.location = loc } +function getCookie(name) { + var prefix = name + "="; + var cStr = document.cookie; + var start = cStr.indexOf(prefix); + if (start==-1) { + return null; + } + + var end = cStr.indexOf(";", start+prefix.length); + if (end==-1) { end=cStr.length; } + + var value=cStr.substring(start+prefix.length, end); + return unescape(value); +} +function setCookie(name, value, expiration) { + document.cookie = name+"="+value+"; expires="+expiration; +} +function toggleCheckbox(checkBox) { + var element = document.getElementById(checkBox.id); + if (element.value == "1" || element.checked) { + element.checked = false; + element.value = "0"; + } else { + element.checked = true; + element.value = "1"; + } +} +function toggleChkbox(checkBox) { + if (checkBox.checked) { + checkBox.checked = true; + } else { + checkBox.checked = false; + } +} +function toggle_list(id){ + ul = "ul_" + id; + img = "img_" + id; + hid = "h_" + id; + ulElement = document.getElementById(ul); + imgElement = document.getElementById(img); + hiddenElement = document.getElementById(hid); + if (ulElement){ + if (ulElement.className == 'closed'){ + ulElement.className = "open"; + imgElement.src = "/themes/original/images/list_opened.gif"; + hiddenElement.value = "1" + }else{ + ulElement.className = "closed"; + imgElement.src = "/themes/original/images/list_closed.gif"; + hiddenElement.value = "0" + } + } +} +function toggle_layer(id) { + lElement = document.getElementById(id); + imgElement = document.getElementById("img_" + id); + if (lElement){ + if (lElement.className == 'closed'){ + lElement.className = "open"; + imgElement.src = "/themes/original/images/list_opened.gif"; + return true; + }else{ + lElement.className = "closed"; + imgElement.src = "/themes/original/images/list_closed.gif"; + return false; + } + } + return true; +} +function toggle_layer_status(id) { + lElement = document.getElementById(id); + if (lElement){ + if (lElement.className == 'closed'){ + return false; + }else{ + return true; + } + } + return true; +} +function toggle_text(id){ + if ( document.getElementById ) + elem = document.getElementById( id ); + else if ( document.all ) + elem = eval( "document.all." + id ); + else + return false; + + if(!elem) return true; + + elemStyle = elem.style; + if ( elemStyle.display != "block" ) { + elemStyle.display = "block" + } else { + elemStyle.display = "none" + } + return true; +} +function getFF(id) { + if ( document.getElementById ) elem = document.getElementById( id ); + else if ( document.all ) elem = document.eval( "document.all." + id ); + return elem +} +function setFF(id, value) {if(getFF(id))getFF(id).value=value;} +function setCFF(id) {if(getFF(id))getFF(id).checked=true;} +function updateSUFromC(btnName) { + var suem = getCookie('_cdf_em');var sueg = getCookie('_cdf_gr'); + if (suem != "" && suem != null && suem != "undefined") { setFF('sup_email', suem); setFF('signup_submit_button',btnName); } + + if (sueg && sueg != "") { + if (sueg.indexOf(",") < 0 && sueg != "") { gr_id = sueg; setCFF('supgr_'+gr_id); + } else while ((i = sueg.indexOf(",")) >= 0) { gr_id = sueg.substring(0,i); sueg = sueg.substring(i+1); setCFF('supgr_'+gr_id); } + if (sueg.indexOf(",") < 0 && sueg != "") { gr_id = sueg; setCFF('supgr_'+gr_id);} + } +} +function updateLUEfC() { + var suem = getCookie('_cdf_em'); + if (suem != "" && suem != null && suem != "undefined") { setFF('login_user_email', suem); } +} +function replaceHRFST(ifrm) { + var o = ifrm; + var w = null; + if (o.contentWindow) { + // For IE5.5 and IE6 + w = o.contentWindow; + } else if (window.frames && window.frames[o.id].window) { + w = window.frames[o.id]; + } else return; + var doc = w.document; + if (!doc.getElementsByTagName) return; + var anchors = doc.getElementsByTagName("a"); + for (var i=0; i= 12) { adds = ' PM'; h = system_date.getHours() - 12; } + else { adds = ' AM'; h = system_date.getHours(); } + spans[i].innerHTML = h + ":" + (system_date.getMinutes()+"").replace(/\b(\d)\b/g, '0$1') + adds; + } +} +function PopupPic(sPicURL,sWidth,sHeight) { + window.open( "/popup.htm?"+sPicURL, "", "resizable=1,HEIGHT="+sHeight+",WIDTH="+sWidth+",scrollbars=yes"); +} + +function open_link(target, location){ + if (target == 'blank'){ + window.open(location); + } else { + window.top.location = location; + } +} diff --git a/themes/olive/javascripts/htmlstyle.js b/themes/olive/javascripts/htmlstyle.js new file mode 100755 index 0000000..ece3392 --- /dev/null +++ b/themes/olive/javascripts/htmlstyle.js @@ -0,0 +1,21 @@ +var config = new HTMLArea.Config(); // create a new configuration object + // having all the default values +config.width = '520px'; +config.pageStyle = + 'body { font-family: verdana,sans-serif; font-size: 12px } '; + +config.toolbar = [ +[ "fontname", "fontsize","formatblock","bold", "italic", "underline", "separator", "insertimage", "createlink"], +["justifyleft", "justifycenter", "justifyright", "justifyfull", "separator", "forecolor", "hilitecolor", "separator", "popupeditor", "htmlmode"] +]; +config.statusBar = false; + +var configView = new HTMLArea.Config(); // create a new configuration object + // having all the default values +configView.width = '670px'; +configView.pageStyle = + 'body { font-family: verdana,sans-serif; font-size: 12px } '; + +configView.toolbar = []; +configView.statusBar = false; +configView.readonly = true; \ No newline at end of file diff --git a/themes/olive/javascripts/jstrim.pl b/themes/olive/javascripts/jstrim.pl new file mode 100755 index 0000000..7829efc --- /dev/null +++ b/themes/olive/javascripts/jstrim.pl @@ -0,0 +1,76 @@ +#! /usr/bin/perl -w + +jsTrim("prototype_src.js", "prototype.js"); +jsTrim("global_src.js", "global.js"); +#jsTrim("jscripts/tiny_mce/themes/simple/editor_template_src.js", "jscripts/tiny_mce/themes/simple/editor_template.js"); +#jsTrim("jscripts/tiny_mce/themes/default/editor_template_src.js", "jscripts/tiny_mce/themes/default/editor_template.js"); +#jsTrim("jscripts/tiny_mce/themes/advanced/editor_template_src.js", "jscripts/tiny_mce/themes/advanced/editor_template.js"); +#jsTrim("jscripts/tiny_mce/plugins/advhr/editor_plugin_src.js", "jscripts/tiny_mce/plugins/advhr/editor_plugin.js"); +#jsTrim("jscripts/tiny_mce/plugins/advimage/editor_plugin_src.js", "jscripts/tiny_mce/plugins/advimage/editor_plugin.js"); +#jsTrim("jscripts/tiny_mce/plugins/advlink/editor_plugin_src.js", "jscripts/tiny_mce/plugins/advlink/editor_plugin.js"); +#jsTrim("jscripts/tiny_mce/plugins/emotions/editor_plugin_src.js", "jscripts/tiny_mce/plugins/emotions/editor_plugin.js"); +#jsTrim("jscripts/tiny_mce/plugins/flash/editor_plugin_src.js", "jscripts/tiny_mce/plugins/flash/editor_plugin.js"); +#jsTrim("jscripts/tiny_mce/plugins/iespell/editor_plugin_src.js", "jscripts/tiny_mce/plugins/iespell/editor_plugin.js"); +#jsTrim("jscripts/tiny_mce/plugins/insertdatetime/editor_plugin_src.js", "jscripts/tiny_mce/plugins/insertdatetime/editor_plugin.js"); +#jsTrim("jscripts/tiny_mce/plugins/preview/editor_plugin_src.js", "jscripts/tiny_mce/plugins/preview/editor_plugin.js"); +#jsTrim("jscripts/tiny_mce/plugins/print/editor_plugin_src.js", "jscripts/tiny_mce/plugins/print/editor_plugin.js"); +#jsTrim("jscripts/tiny_mce/plugins/save/editor_plugin_src.js", "jscripts/tiny_mce/plugins/save/editor_plugin.js"); +#jsTrim("jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js", "jscripts/tiny_mce/plugins/searchreplace/editor_plugin.js"); +#jsTrim("jscripts/tiny_mce/plugins/zoom/editor_plugin_src.js", "jscripts/tiny_mce/plugins/zoom/editor_plugin.js"); +#jsTrim("jscripts/tiny_mce/plugins/table/editor_plugin_src.js", "jscripts/tiny_mce/plugins/table/editor_plugin.js"); +#jsTrim("jscripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js", "jscripts/tiny_mce/plugins/contextmenu/editor_plugin.js"); +#jsTrim("jscripts/tiny_mce/plugins/paste/editor_plugin_src.js", "jscripts/tiny_mce/plugins/paste/editor_plugin.js"); +#jsTrim("jscripts/tiny_mce/plugins/fullscreen/editor_plugin_src.js", "jscripts/tiny_mce/plugins/fullscreen/editor_plugin.js"); +#jsTrim("jscripts/tiny_mce/plugins/directionality/editor_plugin_src.js", "jscripts/tiny_mce/plugins/directionality/editor_plugin.js"); + +sub jsTrim { + my $inFile = $_[0]; + my $outFile = $_[1]; + my $comment = ''; + my $content = ''; + + # Load input file + open(FILE, "<$inFile"); + undef $/; + $content = ; + close(FILE); + + if ($content =~ s#^\s*(/\*.*?\*/)##s or $content =~ s#^\s*(//.*?)\n\s*[^/]##s) { + $comment = "$1\n"; + } + + local $^W; + + # removing C/C++ - style comments: + $content =~ s#/\*[^*]*\*+([^/*][^*]*\*+)*/|//[^\n]*|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#$2#gs; + + # save string literals + my @strings = (); + $content =~ s/("(\\.|[^"\\])*"|'(\\.|[^'\\])*')/push(@strings, "$1");'__CMPRSTR_'.$#strings.'__';/egs; + + # remove C-style comments + $content =~ s#/\*.*?\*/##gs; + # remove C++-style comments + $content =~ s#//.*?\n##gs; + # removing leading/trailing whitespace: + #$content =~ s#(?:(?:^|\n)\s+|\s+(?:$|\n))##gs; + # removing newlines: + #$content =~ s#\r?\n##gs; + + # removing other whitespace (between operators, etc.) (regexp-s stolen from Mike Hall's JS Crunchinator) + $content =~ s/\s+/ /gs; # condensing whitespace + #$content =~ s/^\s(.*)/$1/gs; # condensing whitespace + #$content =~ s/(.*)\s$/$1/gs; # condensing whitespace + $content =~ s/\s([\x21\x25\x26\x28\x29\x2a\x2b\x2c\x2d\x2f\x3a\x3b\x3c\x3d\x3e\x3f\x5b\x5d\x5c\x7b\x7c\x7d\x7e])/$1/gs; + $content =~ s/([\x21\x25\x26\x28\x29\x2a\x2b\x2c\x2d\x2f\x3a\x3b\x3c\x3d\x3e\x3f\x5b\x5d\x5c\x7b\x7c\x7d\x7e])\s/$1/gs; + + # restore string literals + $content =~ s/__CMPRSTR_([0-9]+)__/$strings[$1]/egs; + + # Write to ouput file + open(FILE, ">$outFile"); + flock(FILE, 2); + seek(FILE, 0, 2); + print FILE $comment, $content; + close(FILE); +} diff --git a/themes/olive/javascripts/prototype_src.js b/themes/olive/javascripts/prototype_src.js new file mode 100755 index 0000000..87aa729 --- /dev/null +++ b/themes/olive/javascripts/prototype_src.js @@ -0,0 +1,521 @@ +var Prototype = { + Version: '1.2.1' +}; + +var Class = { + create: function() { + return function() { + this.initialize.apply(this, arguments); + } + } +}; + +var Abstract = new Object(); +Object.prototype.extend = function(object) { + for (property in object) { + this[property] = object[property]; + } + return this; +}; +Function.prototype.bind = function(object) { + var method = this; + return function() { + method.apply(object, arguments); + } +}; + +Function.prototype.bindAsEventListener = function(object) { + var method = this; + return function(event) { + method.call(object, event || window.event); + } +}; + +Number.prototype.toColorPart = function() { + var digits = this.toString(16); + if (this < 16) return '0' + digits; + return digits; +}; + +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() { + setTimeout(this.onTimerEvent.bind(this), this.frequency * 1000); + }, + + onTimerEvent: function() { + if (!this.currentlyExecuting) { + try { + this.currentlyExecuting = true; + this.callback(); + } finally { + this.currentlyExecuting = false; + } + } + + this.registerCallback(); + } +}; +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; +}; +if (!Array.prototype.push) { + Array.prototype.push = function() { + var startLength = this.length; + for (var i = 0; i < arguments.length; i++) + this[startLength + i] = arguments[i]; + return this.length; + }; +}; + +if (!Function.prototype.apply) { + // Based on code from http://www.youngpup.net/ + Function.prototype.apply = function(object, parameters) { + var parameterStrings = new Array(); + if (!object) object = window; + if (!parameters) parameters = new Array(); + + for (var i = 0; i < parameters.length; i++) + parameterStrings[i] = 'x[' + i + ']'; + + object.__apply__ = this; + var result = eval('obj.__apply__(' + + parameterStrings[i].join(', ') + ')'); + object.__apply__ = null; + + return result; + }; +}; + +var Ajax = { + getTransport: function() { + return Try.these( + function() {return new ActiveXObject('Msxml2.XMLHTTP')}, + function() {return new ActiveXObject('Microsoft.XMLHTTP')}, + function() {return new XMLHttpRequest()} + ) || false; + }, + + emptyFunction: function() {} +}; + +Ajax.Base = function() {}; +Ajax.Base.prototype = { + setOptions: function(options) { + this.options = { + method: 'post', + asynchronous: true, + parameters: '' + }.extend(options || {}); + } +}; + +Ajax.Request = Class.create(); +Ajax.Request.Events = + ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; + +Ajax.Request.prototype = (new Ajax.Base()).extend({ + initialize: function(url, options) { + this.transport = Ajax.getTransport(); + this.setOptions(options); + + try { + if (this.options.method == 'get') + url += '?' + this.options.parameters + '&_='; + + this.transport.open(this.options.method, url, + this.options.asynchronous); + + if (this.options.asynchronous) { + this.transport.onreadystatechange = this.onStateChange.bind(this); + setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10); + } + + this.transport.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); + this.transport.setRequestHeader('X-Prototype-Version', Prototype.Version); + + if (this.options.method == 'post') { + this.transport.setRequestHeader('Connection', 'close'); + this.transport.setRequestHeader('Content-type', + 'application/x-www-form-urlencoded'); + } + + this.transport.send(this.options.method == 'post' ? + this.options.parameters + '&_=' : null); + + } catch (e) { + } + }, + + onStateChange: function() { + var readyState = this.transport.readyState; + if (readyState != 1) + this.respondToReadyState(this.transport.readyState); + }, + + respondToReadyState: function(readyState) { + var event = Ajax.Request.Events[readyState]; + (this.options['on' + event] || Ajax.emptyFunction)(this.transport); + } +}); + +Ajax.Updater = Class.create(); +Ajax.Updater.prototype = (new Ajax.Base()).extend({ + initialize: function(container, url, options) { + this.container = $(container); + this.setOptions(options); + + if (this.options.asynchronous) { + this.onComplete = this.options.onComplete; + this.options.onComplete = this.updateContent.bind(this); + } + + this.request = new Ajax.Request(url, this.options); + + if (!this.options.asynchronous) + this.updateContent(); + }, + + updateContent: function() { + if (this.options.insertion) { + new this.options.insertion(this.container, + this.request.transport.responseText); + } else { + this.container.innerHTML = this.request.transport.responseText; + } + + if (this.onComplete) { + setTimeout((function() {this.onComplete(this.request)}).bind(this), 10); + } + } +}); +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).focus(); + $(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; + }, + + disable: function(form) { + var elements = Form.getElements(form); + for (var i = 0; i < elements.length; i++) { + var element = elements[i]; + element.blur(); + element.disable = 'true'; + } + }, + + focusFirstElement: function(form) { + form = $(form); + var elements = Form.getElements(form); + for (var i = 0; i < elements.length; i++) { + var element = elements[i]; + if (element.type != 'hidden' && !element.disabled) { + Field.activate(element); + break; + } + } + }, + + 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) + return encodeURIComponent(parameter[0]) + '=' + + encodeURIComponent(parameter[1]); + }, + + 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 '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) { + var index = element.selectedIndex; + var value = element.options[index].value || element.options[index].text; + return [element.name, (index >= 0) ? 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() { + setTimeout(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; + } + + this.registerCallback(); + } +}; + +Form.Element.Observer = Class.create(); +Form.Element.Observer.prototype = (new Abstract.TimedObserver()).extend({ + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.Observer = Class.create(); +Form.Observer.prototype = (new Abstract.TimedObserver()).extend({ + getValue: function() { + return Form.serialize(this.element); + } +}); + +document.getElementsByClassName = function(className) { + var children = document.getElementsByTagName('*') || document.all; + var elements = new Array(); + + for (var i = 0; i < children.length; i++) { + var child = children[i]; + var classNames = child.className.split(' '); + for (var j = 0; j < classNames.length; j++) { + if (classNames[j] == className) { + elements.push(child); + break; + } + } + } + + return elements; +}; + +var Element = { + toggle: function() { + for (var i = 0; i < arguments.length; i++) { + var element = $(arguments[i]); + element.style.display = + (element.style.display == 'none' ? '' : 'none'); + } + }, + + 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); + }, + + getHeight: function(element) { + element = $(element); + return element.offsetHeight; + } +}; + +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; + + if (this.adjacency && this.element.insertAdjacentHTML) { + this.element.insertAdjacentHTML(this.adjacency, this.content); + } else { + this.range = this.element.ownerDocument.createRange(); + if (this.initializeRange) this.initializeRange(); + this.fragment = this.range.createContextualFragment(this.content); + this.insertContent(); + } + } +}; + +var Insertion = new Object(); + +Insertion.Before = Class.create(); +Insertion.Before.prototype = (new Abstract.Insertion('beforeBegin')).extend({ + initializeRange: function() { + this.range.setStartBefore(this.element); + }, + + insertContent: function() { + this.element.parentNode.insertBefore(this.fragment, this.element); + } +}); + +Insertion.Top = Class.create(); +Insertion.Top.prototype = (new Abstract.Insertion('afterBegin')).extend({ + initializeRange: function() { + this.range.selectNodeContents(this.element); + this.range.collapse(true); + }, + + insertContent: function() { + this.element.insertBefore(this.fragment, this.element.firstChild); + } +}); + +Insertion.Bottom = Class.create(); +Insertion.Bottom.prototype = (new Abstract.Insertion('beforeEnd')).extend({ + initializeRange: function() { + this.range.selectNodeContents(this.element); + this.range.collapse(this.element); + }, + + insertContent: function() { + this.element.appendChild(this.fragment); + } +}); + +Insertion.After = Class.create(); +Insertion.After.prototype = (new Abstract.Insertion('afterEnd')).extend({ + initializeRange: function() { + this.range.setStartAfter(this.element); + }, + + insertContent: function() { + this.element.parentNode.insertBefore(this.fragment, + this.element.nextSibling); + } +}); \ No newline at end of file diff --git a/themes/olive/javascripts/scriptaculous.js b/themes/olive/javascripts/scriptaculous.js new file mode 100755 index 0000000..cd0e341 --- /dev/null +++ b/themes/olive/javascripts/scriptaculous.js @@ -0,0 +1,47 @@ +// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// +// 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. + +var Scriptaculous = { + Version: '1.5_rc3', + require: function(libraryName) { + // inserting via DOM fails in Safari 2.0, so brute force approach + document.write(''); + }, + load: function() { + if((typeof Prototype=='undefined') || + parseFloat(Prototype.Version.split(".")[0] + "." + + Prototype.Version.split(".")[1]) < 1.4) + throw("script.aculo.us requires the Prototype JavaScript framework >= 1.4.0"); + var scriptTags = document.getElementsByTagName("script"); + for(var i=0;i this.maximum) sliderValue = this.maximum; + if(sliderValue < this.minimum) sliderValue = this.minimum; + var offsetDiff = (sliderValue - (this.value||this.minimum)) * this.increment; + + if(this.isVertical()){ + this.setCurrentTop(offsetDiff + this.currentTop()); + } else { + this.setCurrentLeft(offsetDiff + this.currentLeft()); + } + this.value = sliderValue; + this.updateFinished(); + }, + minimumOffset: function(){ + return(this.isVertical() ? + this.trackTop() + this.alignY : + this.trackLeft() + this.alignX); + }, + maximumOffset: function(){ + return(this.isVertical() ? + this.trackTop() + this.alignY + (this.maximum - this.minimum) * this.increment : + this.trackLeft() + this.alignX + (this.maximum - this.minimum) * this.increment); + }, + isVertical: function(){ + return (this.axis == 'vertical'); + }, + startDrag: function(event) { + if(Event.isLeftClick(event)) { + if(!this.disabled){ + this.active = true; + var pointer = [Event.pointerX(event), Event.pointerY(event)]; + var offsets = Position.cumulativeOffset(this.handle); + this.offsetX = (pointer[0] - offsets[0]); + this.offsetY = (pointer[1] - offsets[1]); + this.originalLeft = this.currentLeft(); + this.originalTop = this.currentTop(); + } + Event.stop(event); + } + }, + update: function(event) { + if(this.active) { + if(!this.dragging) { + var style = this.handle.style; + this.dragging = true; + if(style.position=="") style.position = "relative"; + style.zIndex = this.options.zindex; + } + this.draw(event); + // fix AppleWebKit rendering + if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); + Event.stop(event); + } + }, + draw: function(event) { + var pointer = [Event.pointerX(event), Event.pointerY(event)]; + var offsets = Position.cumulativeOffset(this.handle); + + offsets[0] -= this.currentLeft(); + offsets[1] -= this.currentTop(); + + // Adjust for the pointer's position on the handle + pointer[0] -= this.offsetX; + pointer[1] -= this.offsetY; + var style = this.handle.style; + + if(this.isVertical()){ + if(pointer[1] > this.maximumOffset()) + pointer[1] = this.maximumOffset(); + if(pointer[1] < this.minimumOffset()) + pointer[1] = this.minimumOffset(); + + // Increment by values + if(this.values){ + this.value = this.getNearestValue(Math.round((pointer[1] - this.minimumOffset()) / this.increment) + this.minimum); + pointer[1] = this.trackTop() + this.alignY + (this.value - this.minimum) * this.increment; + } else { + this.value = Math.round((pointer[1] - this.minimumOffset()) / this.increment) + this.minimum; + } + style.top = pointer[1] - offsets[1] + "px"; + } else { + if(pointer[0] > this.maximumOffset()) pointer[0] = this.maximumOffset(); + if(pointer[0] < this.minimumOffset()) pointer[0] = this.minimumOffset(); + // Increment by values + if(this.values){ + this.value = this.getNearestValue(Math.round((pointer[0] - this.minimumOffset()) / this.increment) + this.minimum); + pointer[0] = this.trackLeft() + this.alignX + (this.value - this.minimum) * this.increment; + } else { + this.value = Math.round((pointer[0] - this.minimumOffset()) / this.increment) + this.minimum; + } + style.left = (pointer[0] - offsets[0]) + "px"; + } + if(this.options.onSlide) this.options.onSlide(this.value); + }, + endDrag: function(event) { + if(this.active && this.dragging) { + this.finishDrag(event, true); + Event.stop(event); + } + this.active = false; + this.dragging = false; + }, + finishDrag: function(event, success) { + this.active = false; + this.dragging = false; + this.handle.style.zIndex = this.originalZ; + this.originalLeft = this.currentLeft(); + this.originalTop = this.currentTop(); + this.updateFinished(); + }, + updateFinished: function() { + if(this.options.onChange) this.options.onChange(this.value); + }, + keyPress: function(event) { + if(this.active && !this.disabled) { + switch(event.keyCode) { + case Event.KEY_ESC: + this.finishDrag(event, false); + Event.stop(event); + break; + } + if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event); + } + } +} diff --git a/themes/olive/javascripts/webmail.js b/themes/olive/javascripts/webmail.js new file mode 100755 index 0000000..3abc2dd --- /dev/null +++ b/themes/olive/javascripts/webmail.js @@ -0,0 +1,35 @@ +function chooseContacts(url) { + rs('', url + '?mode=choose',550,480,0); +} + +function setBulk() { + if (getFormField("mail_bulk").checked) getFormField("set_bulk").value = "set_bulk" + document.forms['composeMail'].submit(); +} + +function getFormField(id) { + if ( document.getElementById ) elem = document.getElementById( id ); + else if ( document.all ) elem = document.eval( "document.all." + id ); + return elem; +} + +function toggle_msg_operations(setc) { + var isOpened = toggle_layer('msgops'); + if (setc) setCookie("_wmlmo", ( isOpened ? "opened" : "closed"), 1000000); +} + +function toggle_msg_search(setc) { + var isOpened = toggle_layer('msg_search'); + if (setc) setCookie("_wmlms", (isOpened ? "opened" : "closed"), 1000000); +} + +function checkAll(theForm) { // check all the checkboxes in the list + for (var i=0;i+|^dH=ll`}>yf-@pII4HSQ}FfuT(Gw3id zFff43U|{k1aKcktG=inNQ(dZ@<%=_('Edit/Create Contact Group')%> + <%= + form_tag( + link_save, + 'method' => 'post', + 'class' => 'two_columns' + ) + %> +<%= form_input(:hidden_field, 'contactgroup', 'id') %> +<%= form_input(:hidden_field, 'contactgroup', 'customer_id') %> + + + <%= form_input(:text_field, 'contactgroup', 'name', _('Name'), 'class'=>'two_columns') %> +
+ + + + +
+ + +
+ + <%= end_form_tag %> diff --git a/themes/olive/views/contact_groups/index.html.erb b/themes/olive/views/contact_groups/index.html.erb new file mode 100755 index 0000000..a3dc585 --- /dev/null +++ b/themes/olive/views/contact_groups/index.html.erb @@ -0,0 +1,26 @@ +

<%=_('Contact Groups')%>

+ +<%- form_for @contact_group do |f| %> +<%= hidden_field "contactgroup", "user_id" %> + + + + + +<% + for contactgroup in @contactgroups %> + + + + + + +<% end %> + + + +
<%=_('Name')%> 
<%= contactgroup.name %><%= link_to(_('members'), :controller=>'contact', :action=>'list', :id=>contactgroup.id, :params=>{"mode"=>"groups"}) %><%= link_to(_('edit'), :controller=>'/contacts/contact_group', :action=>'edit', :id=>contactgroup.id) %><%= link_to(_('delete'), {:controller=>'/contacts/contact_group', :action=>'delete', :id=>contactgroup.id}, {:confirm=>sprintf(_('DELETE CONTACT GROUP \'%s\'?'), contactgroup.name)})%>
+ + +
+<%- end %> diff --git a/themes/olive/views/contacts/add_multiple.html.erb b/themes/olive/views/contacts/add_multiple.html.erb new file mode 100755 index 0000000..8ab1494 --- /dev/null +++ b/themes/olive/views/contacts/add_multiple.html.erb @@ -0,0 +1,26 @@ +

<%=t :add_multiple_contacts %>

+<% if flash["errors"] and not flash["errors"].empty?%> + <%= t(:errors)%> +
    + <% flash["errors"].each do |message| %> +
  • <%= message %> + <% end %> +
+<% end %> +
+ <%= radio_button("contact", "file_type", "1")%> <%= t(:csv_file)%> + <%= radio_button("contact", "file_type", "2")%> <%= t(:tab_file)%> + + + + + + + + +
+ + + +
+
diff --git a/themes/olive/views/contacts/choose.html.erb b/themes/olive/views/contacts/choose.html.erb new file mode 100755 index 0000000..65fb2ac --- /dev/null +++ b/themes/olive/views/contacts/choose.html.erb @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/themes/olive/views/contacts/import_preview.html.erb b/themes/olive/views/contacts/import_preview.html.erb new file mode 100755 index 0000000..b972081 --- /dev/null +++ b/themes/olive/views/contacts/import_preview.html.erb @@ -0,0 +1,43 @@ +

<%= _('Contacts You Are About To Import')%>

+ +<% if flash["errors"] and not flash["errors"].empty?%> + <%= _('Errors')%> +
    + <% flash["errors"].each do |message| %> +
  • <%= message %> + <% end %> +
+<% end %> + +
+ + + + + + + + + <% + for i in 0...@contacts.length + contact = @contacts[i] + %> + + + + + + + + <% end %> + + + + +
 <%= _('First name')%><%= _('Last name')%><%= _('E-mail')%>
<%=i+1%>
+ + + + +
+
diff --git a/themes/olive/views/contacts/index.html.erb b/themes/olive/views/contacts/index.html.erb new file mode 100755 index 0000000..87e5217 --- /dev/null +++ b/themes/olive/views/contacts/index.html.erb @@ -0,0 +1,115 @@ +

<%= t :contacts %>

+<% unless @mode == "choose" %> + +<% end -%> +
+
+ + <% if flash["alert"] %>
  • <%= flash["alert"] %>
<% end %> +
+ + <% if @group_id and not @group_id.nil? %> + + <% end %> + + + + + + + + <% if @mode == "choose" %> + + + + + + <% for contact in @contacts %> + + + + + + <% end %> + + <% for group in @contactgroups %> + + + + + + <% end %> + + + + <% elsif @mode == "groups"%> + + + + + + <% for contact in @contacts %> + + + + + + + <% end %> + + + + <% else %> + + + + + + <% for contact in @contacts %> + + + + + + <% end %> + <% end %> +
+ <% CDF::CONFIG[:contact_letters].each do |letter| %> + <%= link_to letter, contacts_path(:letter => letter) %> + <% end %> +       + <%= link_to t(:show_all), contacts_path %> +
<%= will_paginate @contacts %>
<%= "#{t :to} #{t :cc} #{t :bcc}" %><%= t :name %><%= t :email %>
+ + <%=contact.full_name%><%=contact.email%>
<%=t(:groups)%>:
+ + <%=group.name%> 
+ + +
<%= t(:name)%><%= t(:email)%>
><%=contact.full_name%><%=contact.email%>
+ + +
<%= t(:name)%><%= t(:email)%> 
<%= link_to(contact.full_name, :controller=>:contacts, :action => "edit", :id => contact.id ) %><%= link_to( contact.email, :controller => :webmail, :action => "compose", :params => { "mail[to]" => contact.email } ) %><%= link_to(t(:delete), {:controller=>:contacts, :action=>'delete', :id=>contact.id}, + {:confirm=>t(:delete_contact_question, :name => contact.show_name, :email => contact.email)})%> +
+
+
+
diff --git a/themes/olive/views/contacts/new.html.erb b/themes/olive/views/contacts/new.html.erb new file mode 100755 index 0000000..dd19e45 --- /dev/null +++ b/themes/olive/views/contacts/new.html.erb @@ -0,0 +1,73 @@ +

<%=t(:edit_create_contact)%>

+ + +
+
+ + + <%= form_tag( contacts_path, 'method' => 'post', 'class' => 'two_columns') do %> + <%= form_input(:hidden_field, 'contact', 'id') %> + <%= form_input(:hidden_field, 'contact', 'customer_id') %> + + + <%= form_input(:text_field, 'contact', 'fname', t(:first_name), 'class'=>'two_columns') %> + <%= form_input(:text_field, 'contact', 'lname', t(:last_name), 'class'=>'two_columns') %> + <%= form_input((@contact.new_record? ? :text_field : :read_only_field), 'contact', 'email', t(:email), 'class'=>'two_columns')%> +
+ + <% for group in @contactgroups %> + + <% end %> + <% if not(@contactgroups.empty?) %> + <%=_('Contact belong to these groups')%>: + + + <% + end + col = 1 + for group in @contactgroups %> + + <% if col%2 == 0 %> + + + <% end + col = col + 1 %> + <% end %> + <% if col%2 == 0 and not(@contactgroups.empty?) %> + + <% end %> + <% if not(@contactgroups.empty?) %> + +
+ > +  <%=group.name %> +
 
+ <% end %> + + + + + +
+ + +
+ <% end %> +
+
diff --git a/themes/olive/views/folders/index.html.erb b/themes/olive/views/folders/index.html.erb new file mode 100755 index 0000000..530e2ab --- /dev/null +++ b/themes/olive/views/folders/index.html.erb @@ -0,0 +1,48 @@ +

<%=t :mailbox %>

+ +
+
+ +<% content_for('sidebar') { %> +
+

<%= t :add_folder %>

+
+ <%= form_tag folders_path, :id => 'new_folder' do %> +
    +
  • +
  • <%= text_field_tag 'folder', '', :size => 18 %>
  • +
  • <%= submit_tag t(:add_folder) %>
  • +
+ <% end %> +
+<% } %> + +
+
+ + + + <% for folder in @folders %> + + + + + <% end %> + +
<%= t :folder %><%= t :total_messages %><%= t :unseen%>
<%=folder_manage_link(folder)%><%= folder.total %><%= folder.unseen > 0 ? "#{folder.unseen}" : "#{folder.unseen}" %>
+
+
+
+
diff --git a/themes/empty/views/layouts/.gitkeep b/themes/olive/views/layouts/.gitkeep similarity index 100% rename from themes/empty/views/layouts/.gitkeep rename to themes/olive/views/layouts/.gitkeep diff --git a/themes/empty/views/layouts/chooser.html.erb b/themes/olive/views/layouts/chooser.html.erb similarity index 100% rename from themes/empty/views/layouts/chooser.html.erb rename to themes/olive/views/layouts/chooser.html.erb diff --git a/themes/olive/views/layouts/login.html.erb b/themes/olive/views/layouts/login.html.erb new file mode 100755 index 0000000..638396d --- /dev/null +++ b/themes/olive/views/layouts/login.html.erb @@ -0,0 +1,13 @@ + + + + <%=t(:mailr) %> - <%= t(:please_login)%> + <%=stylesheet_link_tag current_theme_stylesheet_path('base') %> + <%=stylesheet_link_tag current_theme_stylesheet_path('style') %> + + + <%= yield %> + + diff --git a/themes/olive/views/layouts/public.html.erb b/themes/olive/views/layouts/public.html.erb new file mode 100755 index 0000000..c9c94a1 --- /dev/null +++ b/themes/olive/views/layouts/public.html.erb @@ -0,0 +1,29 @@ + + + + <%= t(:mailr) %> + + + <%=stylesheet_link_tag current_theme_stylesheet_path('base') %> + <%=stylesheet_link_tag current_theme_stylesheet_path('style') %> + <%=javascript_include_tag current_theme_javascript_path('global') %> + <%=javascript_include_tag current_theme_javascript_path('webmail') %> + + <%=javascript_include_tag :defaults %> + + + +
+
+ +
<%= yield %>
+
+
+
+ + diff --git a/themes/olive/views/login/index.html.erb b/themes/olive/views/login/index.html.erb new file mode 100644 index 0000000..6240f03 --- /dev/null +++ b/themes/olive/views/login/index.html.erb @@ -0,0 +1,41 @@ +
diff --git a/themes/olive/views/shared/_folders.html.erb b/themes/olive/views/shared/_folders.html.erb new file mode 100755 index 0000000..f06e12c --- /dev/null +++ b/themes/olive/views/shared/_folders.html.erb @@ -0,0 +1,9 @@ +
+

<%=t :folders %> <%= link_to t(:add_edit_folder), folders_path %>

+ +
+ diff --git a/themes/olive/views/webmail/_contacts.html.erb b/themes/olive/views/webmail/_contacts.html.erb new file mode 100755 index 0000000..f1b2a63 --- /dev/null +++ b/themes/olive/views/webmail/_contacts.html.erb @@ -0,0 +1,12 @@ +
    + <% for contact in @contacts do -%> +
  • + <%=h contact.fname %> <%= h contact.lname %> + +
  • + <% end -%> +
diff --git a/themes/olive/views/webmail/_expr.html.erb b/themes/olive/views/webmail/_expr.html.erb new file mode 100755 index 0000000..f7fa44c --- /dev/null +++ b/themes/olive/views/webmail/_expr.html.erb @@ -0,0 +1,18 @@ + <% @expression = @expressions[expr_counter] %> + + + + + + + <%= text_field 'expression', 'expr_value', 'index'=>expr_counter %> + + + <%= hidden_field "expression", 'case_sensitive', 'index'=>expr_counter %> + <%= check_box "expression", 'case_sensitive', {'onclick'=>'toggleCheckbox(this)', "index"=>expr_counter } %>  <%= _('case sensitive') %> + + \ No newline at end of file diff --git a/themes/olive/views/webmail/_filter.html.erb b/themes/olive/views/webmail/_filter.html.erb new file mode 100755 index 0000000..f4fbe10 --- /dev/null +++ b/themes/olive/views/webmail/_filter.html.erb @@ -0,0 +1,19 @@ + + <%=h @user.filters[filter_counter].name%> + + <% if filter_counter > 0 %> + <%=link_filter_up(@user.filters[filter_counter].id)%> + <% else %> +   + <% end %> + + + <% if filter_counter < @user.filters.size - 1 %> + <%=link_filter_down(@user.filters[filter_counter].id)%> + <% else %> +   + <% end %> + + <%=link_filter_edit(@user.filters[filter_counter].id)%> + <%=link_filter_delete(@user.filters[filter_counter].id)%> + \ No newline at end of file diff --git a/themes/olive/views/webmail/_message_row.html.erb b/themes/olive/views/webmail/_message_row.html.erb new file mode 100755 index 0000000..9509d13 --- /dev/null +++ b/themes/olive/views/webmail/_message_row.html.erb @@ -0,0 +1,14 @@ + + + <% if @folder_name == CDF::CONFIG[:mail_sent] %> + <%= short_address(message_row.to_addr) %> +<% else %> + <%= short_address(message_row.from_addr) %> +<% end %> +
+ <%= link_to(parse_subject(message_row.subject) << " " , :controller=>'webmail', :action=>'message', :msg_id=>message_row.uid)%> + + <%= message_date(message_row.date) %> + <%= message_size(message_row.size) %> + <%= message_row.content_type == 'multipart' ? image_tag(current_theme_image_path('attachment.png')) : ' ' %> + diff --git a/themes/olive/views/webmail/_search.html.erb b/themes/olive/views/webmail/_search.html.erb new file mode 100755 index 0000000..e967c1d --- /dev/null +++ b/themes/olive/views/webmail/_search.html.erb @@ -0,0 +1,13 @@ + + <%= t :search%>open + + diff --git a/themes/olive/views/webmail/compose.html.erb b/themes/olive/views/webmail/compose.html.erb new file mode 100755 index 0000000..43ea2c9 --- /dev/null +++ b/themes/olive/views/webmail/compose.html.erb @@ -0,0 +1,67 @@ +<% content_for('sidebar') { %> + <%= render :partial => 'shared/folders' %> +<% } %> + +

<%= t :mailbox %>

+
+ +
+
+ +
+ + +
+ + + + + +
<%= text_field_with_auto_complete(:mail, :to, {"size"=>65}, :skip_style => true, :tokens=> ",") %>
<%= text_field_with_auto_complete(:mail, :cc, {"size"=>65}, :skip_style => true, :tokens=> ",") %>
<%= text_field_with_auto_complete(:mail, :bcc, {"size"=>65}, :skip_style => true, :tokens=> ",") %>
<%= text_field('mail', 'subject', {"size"=>65}) %>
+ <%= hidden_field('mail', 'from') %> + <%= hidden_field('mail', 'content_type') %> +
+ +
+ <%= text_area "mail", "body", "rows"=>20, "cols"=>75 %> +
+ +
+ <% if @mail.attachments and @mail.attachments.size > 0%> + + <% i = 0 + @mail.attachments.each { |att| %> + + <% i = i + 1 + }%> +
<%=attachment(att, i)%>
+ <% end %> +
+ <%=%> + +
+
+
+
+ +<% content_for("scripts") { %> +<%= @additional_scripts %> +<% if ['text/html', 'multipart'].include?(@mail.content_type) %> +<%= include_tinymce %> +<% end %> +<% } %> diff --git a/themes/olive/views/webmail/error_connection.html.erb b/themes/olive/views/webmail/error_connection.html.erb new file mode 100755 index 0000000..ee08a7b --- /dev/null +++ b/themes/olive/views/webmail/error_connection.html.erb @@ -0,0 +1,26 @@ +

<%=_('Mailbox')%>

+ +
+
+ +<% content_for('sidebar') { %> +
+ <%=_('Error occured obtaining connection to mail server. Please excuse us!')%> +
+<% } %> +
+
+ +
diff --git a/themes/olive/views/webmail/filter.html.erb b/themes/olive/views/webmail/filter.html.erb new file mode 100755 index 0000000..4bb728c --- /dev/null +++ b/themes/olive/views/webmail/filter.html.erb @@ -0,0 +1,41 @@ +

<%=_('Mailbox')%>

+ +
+
+ +
+
+ <%=hidden_field 'filter', 'id' %> + + + + + + + <%= render_partial_collection "expr", @expressions %> + + + + + + +
<%=text_field 'filter', 'name' %>
<%=_('Messages matching')%>
+ +
+ + +
+ +
+
+
diff --git a/themes/olive/views/webmail/filters.html.erb b/themes/olive/views/webmail/filters.html.erb new file mode 100755 index 0000000..24fbb24 --- /dev/null +++ b/themes/olive/views/webmail/filters.html.erb @@ -0,0 +1,42 @@ +<% content_for('sidebar') { %> + <%= render :partial => 'shared/folders' %> +<% } %> +

<%=_('Mailbox')%>

+ +
+
+ +
+
+<% if @user.filters and @user.filters.size > 0 %> + + + + + + + + + <%= render_partial_collection "filter", @user.filters %> +
<%=_('Filter name')%>    
+<% end %> +
+ <% if flash['error'] %> +
<%= flash['error'] %>
+ <% elsif flash['status'] %> +
<%= flash['status'] %>
+ <% end %> +
+
diff --git a/themes/olive/views/webmail/folders.html.erb b/themes/olive/views/webmail/folders.html.erb new file mode 100755 index 0000000..1b579ea --- /dev/null +++ b/themes/olive/views/webmail/folders.html.erb @@ -0,0 +1,29 @@ +

<%=_('Mailbox')%>

+ +
+
+ + <% content_for('sidebar') { %> + <%= render :partial => 'shared' %> + <% } %> +
+ <% if not(request['msg_id'] == '') %> + <%= render_component(:controller => "webmail/webmail", :action => "message", :params => { 'msg_id' => request['msg_id']})%> + <% else %> + <%= render_component(:controller => "webmail/webmail", :action => "messages") %> + <% end %> +
+ +
diff --git a/themes/olive/views/webmail/mailsent.html.erb b/themes/olive/views/webmail/mailsent.html.erb new file mode 100755 index 0000000..d991b0c --- /dev/null +++ b/themes/olive/views/webmail/mailsent.html.erb @@ -0,0 +1,31 @@ +

<%=t(:mailbox)%>

+ +
+
+ +
+
+
<%=t(:to)%>
<%= CGI.escapeHTML(@mail.to) %>
+ <% if @mail.cc %> +
<%=t(:cc)%>
<%= CGI.escapeHTML(@mail.cc) %>
+ <% end + if @mail.bcc %> +
<%=t(:bcc)%>
<%= CGI.escapeHTML(@mail.bcc) %>
+ <% end %> +
<%=t(:subject)%>
<%= CGI.escapeHTML(@mail.subject) %>
+
+
+
+
diff --git a/themes/olive/views/webmail/message.html.erb b/themes/olive/views/webmail/message.html.erb new file mode 100755 index 0000000..772bc11 --- /dev/null +++ b/themes/olive/views/webmail/message.html.erb @@ -0,0 +1,42 @@ +

<%=t :mailbox %>

+ +
+
+ +<% content_for('sidebar') { %> + <%= render :partial => 'shared/folders' %> +<% } %> +
+ +
+
+
    +
  • + <%= link_to("« #{t :back_to_list}", :controller=>"webmail", :action=>"messages") %> +
  • +
  • <%=link_reply_to_sender(@msg_id)%>
  • +
  • <%=link_forward_message(@msg_id)%>
  • +
  • <%=link_flag_for_deletion(@msg_id)%>
  • +
  • <%=link_view_source(@msg_id)%>
  • +
+
+ + <%= mail2html(@mail, @msg_id) %> +
+ +
+ +
+ diff --git a/themes/olive/views/webmail/messages.html.erb b/themes/olive/views/webmail/messages.html.erb new file mode 100755 index 0000000..b1652e5 --- /dev/null +++ b/themes/olive/views/webmail/messages.html.erb @@ -0,0 +1,80 @@ +

<%= t :mailbox %>

+ +
+
+ +<% content_for :sidebar do %> +<%= render :partial => 'shared/folders' %> +<% end %> + +
+
+

<%= @folder_name %>

+ <%= form_tag({:controller=>'webmail', :action=>'messages'})%> +
+ + + + <%=t :operations%>open + + +
+

<%= t :operations_txt %>

+ + <%= submit_tag(t(:delete), :name=>'op')%> + <%= submit_tag(t(:copy), :name=> 'op')%> + <%= submit_tag(t(:move), :name=>'op')%> + <%= submit_tag(t(:mark_read), :name=>'op')%> + <%= submit_tag(t(:mark_unread), :name=>'op')%> +
+ + <%= t :destination_txt %>  + + +
+ <%= render :partial => "search" %> + <%= page_navigation_webmail @pages if @pages.page_count > 1 %> + + + + + <% if @folder_name == CDF::CONFIG[:mail_sent] %> + + <% else %> + + <% end%> + + + + + + + + <% for message in @messages %> + <%= render :partial => 'message_row', :object => message %> + <% end %> + +
<%= link_to(t(:to), :controller=>:webmail, :action=>:messages, :op=>'SORT', :page=>@page, :scc=>'to_flat')%><%= link_to(t(:from), :controller=>:webmail, :action=>:messages, :op=>'SORT', :page=>@page, :scc=>'from_flat')%><%= link_to(t(:subject), :controller=>:webmail, :action=>:messages, :op=>'SORT', :page=>@page, :scc=>'subject')%><%= link_to(t(:date), :controller=>:webmail, :action=>:messages, :op=>'SORT', :page=>@page, :scc=>'date')%><%= link_to(t(:size), :controller=>:webmail, :action=>:messages, :op=>'SORT', :page=>@page, :scc=>'size')%> 
+ <%= page_navigation_webmail @pages if @pages.page_count > 1 %> + +
+
+ +
+
diff --git a/themes/olive/views/webmail/noattachment.html.erb b/themes/olive/views/webmail/noattachment.html.erb new file mode 100755 index 0000000..3599892 --- /dev/null +++ b/themes/olive/views/webmail/noattachment.html.erb @@ -0,0 +1 @@ +No attachment found! \ No newline at end of file diff --git a/themes/olive/views/webmail/prefs.html.erb b/themes/olive/views/webmail/prefs.html.erb new file mode 100755 index 0000000..a759c42 --- /dev/null +++ b/themes/olive/views/webmail/prefs.html.erb @@ -0,0 +1,55 @@ +<% content_for('sidebar') { %> + <%= render :partial => 'shared/folders' %> +<% } %> +

<%= t :mailbox %>

+ +
+
+
+
+ <%= hidden_field "mailpref", "id" %> + <%= hidden_field "mailpref", "customer_id" %> + + <%= form_input(:text_field, 'customer', 'fname', t(:first_name), 'class'=>'two_columns') %> + <%= form_input(:text_field, 'customer', 'lname', t(:last_name), 'class'=>'two_columns') %> + + + + + + + + + + + + + + + + + + +
+ <%=check_box('mailpref', 'check_external_mail')%> + <%= t :check_external_mail_txt %> +
+ + +
+
+
+
+
diff --git a/themes/olive/views/webmail/view_source.html.erb b/themes/olive/views/webmail/view_source.html.erb new file mode 100755 index 0000000..44e2f6a --- /dev/null +++ b/themes/olive/views/webmail/view_source.html.erb @@ -0,0 +1,13 @@ + + + + <%=_('Mailr')%> + + + +
+ <%=@msg_source%> +
+ + diff --git a/themes/original/views/layouts/public.html.erb b/themes/original/views/layouts/public.html.erb old mode 100755 new mode 100644 From a7dd8c90c9c87bf1771d30cf5288b43864ee74b3 Mon Sep 17 00:00:00 2001 From: Wojciech Todryk Date: Thu, 21 Jul 2011 11:14:07 +0200 Subject: [PATCH 17/88] devel --- app/models/imap_message.rb | 43 ++++++++++++++++++++ themes/olive/views/shared/_logo.html.erb | 1 + themes/olive/views/shared/_messages.html.erb | 31 ++++++++++++++ themes/olive/views/shared/_msg_ops.html.erb | 21 ++++++++++ 4 files changed, 96 insertions(+) create mode 100755 app/models/imap_message.rb create mode 100755 themes/olive/views/shared/_logo.html.erb create mode 100755 themes/olive/views/shared/_messages.html.erb create mode 100755 themes/olive/views/shared/_msg_ops.html.erb diff --git a/app/models/imap_message.rb b/app/models/imap_message.rb new file mode 100755 index 0000000..9231c07 --- /dev/null +++ b/app/models/imap_message.rb @@ -0,0 +1,43 @@ +require 'mail2screen' +class ImapMessage < ActiveRecord::Base + include Mail2Screen + + def set_folder(folder) + @folder = folder + end + + def full_body + @folder.mailbox.imap.uid_fetch(uid, "BODY[]").first.attr["BODY[]"] + end + + def from_addr=(fa) + self.from = fa.to_yaml + self.from_flat = short_address(fa) + end + + def from_addr + begin + YAML::load(from) + rescue Object + from + end + end + + def to_addr=(ta) + self.to = ta.to_yaml + self.to_flat = short_address(ta) + end + + def to_addr + begin + YAML::load(to) + rescue Object + to + end + end + + def self.getAll(userName,folderName,sortOrder='date desc') + self.all(:conditions => ["username = ? and folder_name = ?", userName, folderName],:order => sortOrder) + end + +end diff --git a/themes/olive/views/shared/_logo.html.erb b/themes/olive/views/shared/_logo.html.erb new file mode 100755 index 0000000..e8a8e32 --- /dev/null +++ b/themes/olive/views/shared/_logo.html.erb @@ -0,0 +1 @@ +Mailr diff --git a/themes/olive/views/shared/_messages.html.erb b/themes/olive/views/shared/_messages.html.erb new file mode 100755 index 0000000..d378864 --- /dev/null +++ b/themes/olive/views/shared/_messages.html.erb @@ -0,0 +1,31 @@ +

<%= @folder_name %>

+<% if @messages.size.zero? %> +

<%= t :no_messages_found %>

+<% else %> +
+ + + + + <% if @folder_name == CDF::CONFIG[:mail_sent] %> + + <% else %> + + <% end%> + + + + + + <% for message in @messages %> + <%= render :partial => 'message_row', :object => message %> + <% end %> + +
<%= link_to(t(:to), :controller=>:webmail, :action=>:messages, :op=>'SORT', :page=>@page, :scc=>'to_flat')%><%= link_to(t(:from), :controller=>:webmail, :action=>:messages, :op=>'SORT', :page=>@page, :scc=>'from_flat')%><%= link_to(t(:subject), :controller=>:webmail, :action=>:messages, :op=>'SORT', :page=>@page, :scc=>'subject')%><%= link_to(t(:date), :controller=>:webmail, :action=>:messages, :op=>'SORT', :page=>@page, :scc=>'date')%><%= link_to(t(:size), :controller=>:webmail, :action=>:messages, :op=>'SORT', :page=>@page, :scc=>'size')%> 
+
+ +
+<% end %> +
diff --git a/themes/olive/views/shared/_msg_ops.html.erb b/themes/olive/views/shared/_msg_ops.html.erb new file mode 100755 index 0000000..e480f04 --- /dev/null +++ b/themes/olive/views/shared/_msg_ops.html.erb @@ -0,0 +1,21 @@ +
+

+ <%= submit_tag(t(:copy), :name=> 'op')%> + <%= submit_tag(t(:move), :name=>'op')%> + <%= t :marked_messages %> + <%= t :to_folder %> + + + +

+

+ <%= t :marked_messages %> + <%= submit_tag(t(:delete), :name=>'op')%> + <%= submit_tag(t(:mark_read), :name=>'op')%> + <%= submit_tag(t(:mark_unread), :name=>'op')%> +

+
From 08dc7ecdd3775c54bd531b1a287f72079887b2b4 Mon Sep 17 00:00:00 2001 From: Wojciech Todryk Date: Thu, 21 Jul 2011 20:20:15 +0200 Subject: [PATCH 18/88] form scratch --- .gitignore | 10 +- AUTHORS | 0 Gemfile | 6 +- Gemfile.lock | 25 +- README.markdown | 36 +- Rakefile | 0 UNLICENSE | 0 app/controllers/application_controller.rb | 195 +- app/controllers/contact_groups_controller.rb | 56 - app/controllers/contacts_controller.rb | 378 -- app/controllers/core_controller.rb | 18 + app/controllers/folders_controller.rb | 26 - app/controllers/login_controller.rb | 73 - app/controllers/webmail_controller.rb | 424 -- app/helpers/application_helper.rb | 136 - app/helpers/contact_group_helper.rb | 4 - app/helpers/contacts_helper.rb | 3 - app/helpers/core_helper.rb | 2 + app/helpers/folders_helper.rb | 2 - app/helpers/navigation_helper.rb | 60 - app/helpers/webmail_helper.rb | 167 - app/models/contact.rb | 76 - app/models/contact_group.rb | 30 - app/models/customer.rb | 32 - app/models/imap_message.rb | 43 - app/models/mail_pref.rb | 9 - ...> contents_moved_to_olive_theme_directory} | 0 arts/logo2.xcf | Bin arts/logo3.xcf | Bin config.ru | 0 config/application.rb | 25 +- config/boot.rb | 0 config/database.yml.example | 0 config/default_site.rb | 52 - config/defaults.yml | 2 + config/environment.rb | 0 config/environments/development.rb | 0 config/environments/production.rb | 0 config/environments/test.rb | 0 config/initializers/backtrace_silencers.rb | 0 config/initializers/inflections.rb | 0 config/initializers/mime_types.rb | 0 config/initializers/pluralization.rb | 36 - config/initializers/secret_token.rb | 2 +- config/initializers/session_store.rb | 2 +- config/locales/en.yml | 3 + config/locales/pl.yml | 7 +- config/routes.rb | 24 +- db/migrate/20090107193228_init.rb | 66 - db/schema.rb | 96 - db/seeds.rb | 0 doc/README_FOR_APP | 0 lib/cdfutils.rb | 183 - lib/imap_utils.rb | 69 - lib/tasks/.gitkeep | 0 lib/tmail_patch.rb | 38 - lib/webmail/bounced_mail.rb | 8 - lib/webmail/cdfmail.rb | 306 - lib/webmail/environment.rb | 5 - lib/webmail/expression.rb | 2 - lib/webmail/filter.rb | 3 - lib/webmail/imap_message.rb | 38 - lib/webmail/imapmailbox.rb | 526 -- lib/webmail/mail2screen.rb | 171 - lib/webmail/mail_transform.rb | 75 - lib/webmail/maildropserializator.rb | 51 - lib/webmail/routes.rb | 4 - lib/webmail/virtual_email.rb | 3 - public/404.html | 0 public/422.html | 0 public/500.html | 0 public/favicon.ico | 0 public/images/logo3.png | Bin 63579 -> 0 bytes public/images/logo3_dark.png | Bin 77962 -> 0 bytes {themes/original => public}/images/rails.png | Bin public/robots.txt | 0 public/{javascripts => stylesheets}/.gitkeep | 0 test/functional/core_controller_test.rb | 14 + test/performance/browsing_test.rb | 0 test/test_helper.rb | 0 test/unit/helpers/core_helper_test.rb | 4 + themes/olive/README.olive | 0 themes/olive/images/.gitkeep | 0 themes/olive/images/key.png | Bin themes/olive/images/logo_small.png | Bin themes/olive/javascripts/.gitkeep | 0 themes/olive/javascripts/application.js | 2 + themes/olive/javascripts/contact_choose.js | 52 - themes/olive/javascripts/controls.js | 965 +++ themes/olive/javascripts/dragdrop.js | 974 +++ themes/olive/javascripts/effects.js | 1123 +++ themes/olive/javascripts/effects2.js | 349 - themes/olive/javascripts/global.js | 216 - themes/olive/javascripts/global_src.js | 201 - themes/olive/javascripts/htmlstyle.js | 21 - themes/olive/javascripts/jstrim.pl | 76 - themes/olive/javascripts/prototype.js | 6001 +++++++++++++++++ themes/olive/javascripts/prototype_src.js | 521 -- themes/olive/javascripts/rails.js | 191 + themes/olive/javascripts/scriptaculous.js | 47 - themes/olive/javascripts/slider.js | 258 - themes/olive/javascripts/webmail.js | 35 - themes/olive/stylesheets/.gitkeep | 0 themes/olive/stylesheets/admin.css | 554 -- themes/olive/stylesheets/base.css | 24 +- themes/olive/stylesheets/mailr.css | 68 - themes/olive/stylesheets/style.css | 19 +- themes/olive/stylesheets/tabs.css | 111 - .../stylesheets/webmail/icon-folder-open.gif | Bin 155 -> 0 bytes themes/olive/stylesheets/webmail/webmail.css | 161 - .../olive/views/contact_groups/edit.html.erb | 24 - .../olive/views/contact_groups/index.html.erb | 26 - .../views/contacts/add_multiple.html.erb | 26 - themes/olive/views/contacts/choose.html.erb | 11 - .../views/contacts/import_preview.html.erb | 43 - themes/olive/views/contacts/index.html.erb | 115 - themes/olive/views/contacts/new.html.erb | 73 - .../index.html.erb => core/login.html.erb} | 10 +- themes/olive/views/core/logout.html.erb | 2 + themes/olive/views/folders/index.html.erb | 48 - themes/olive/views/layouts/.gitkeep | 0 .../{public.html.erb => application.html.erb} | 0 themes/olive/views/layouts/chooser.html.erb | 16 - .../{login.html.erb => simple.html.erb} | 0 themes/olive/views/shared/_folders.html.erb | 9 - themes/olive/views/shared/_logo.html.erb | 1 - themes/olive/views/shared/_messages.html.erb | 31 - themes/olive/views/shared/_msg_ops.html.erb | 21 - themes/olive/views/webmail/_contacts.html.erb | 12 - themes/olive/views/webmail/_expr.html.erb | 18 - themes/olive/views/webmail/_filter.html.erb | 19 - .../olive/views/webmail/_message_row.html.erb | 14 - themes/olive/views/webmail/_search.html.erb | 13 - themes/olive/views/webmail/compose.html.erb | 67 - .../views/webmail/error_connection.html.erb | 26 - themes/olive/views/webmail/filter.html.erb | 41 - themes/olive/views/webmail/filters.html.erb | 42 - themes/olive/views/webmail/folders.html.erb | 29 - themes/olive/views/webmail/mailsent.html.erb | 31 - themes/olive/views/webmail/message.html.erb | 42 - themes/olive/views/webmail/messages.html.erb | 80 - .../olive/views/webmail/noattachment.html.erb | 1 - themes/olive/views/webmail/prefs.html.erb | 55 - .../olive/views/webmail/view_source.html.erb | 13 - themes/original/images/.gitkeep | 0 themes/original/images/attachment.png | Bin 657 -> 0 bytes themes/original/images/d6deec.gif | Bin 97 -> 0 bytes themes/original/images/deselect.png | Bin 180 -> 0 bytes themes/original/images/list_closed.gif | Bin 84 -> 0 bytes themes/original/images/list_opened.gif | Bin 95 -> 0 bytes themes/original/images/logo.png | Bin 13132 -> 0 bytes themes/original/images/noprogress.gif | Bin 109 -> 0 bytes themes/original/images/select.png | Bin 199 -> 0 bytes themes/original/images/white.gif | Bin 84 -> 0 bytes themes/original/images/white.png | Bin 295 -> 0 bytes themes/original/javascripts/.gitkeep | 0 themes/original/javascripts/contact_choose.js | 52 - themes/original/javascripts/effects2.js | 349 - themes/original/javascripts/global.js | 216 - themes/original/javascripts/global_src.js | 201 - themes/original/javascripts/htmlstyle.js | 21 - themes/original/javascripts/jstrim.pl | 76 - themes/original/javascripts/prototype_src.js | 521 -- themes/original/javascripts/scriptaculous.js | 47 - themes/original/javascripts/slider.js | 258 - themes/original/javascripts/webmail.js | 35 - themes/original/stylesheets/.gitkeep | 0 themes/original/stylesheets/admin.css | 554 -- themes/original/stylesheets/mailr.css | 68 - themes/original/stylesheets/tabs.css | 111 - .../stylesheets/webmail/icon-folder-open.gif | Bin 155 -> 0 bytes .../original/stylesheets/webmail/webmail.css | 161 - .../views/contact_groups/edit.html.erb | 24 - .../views/contact_groups/index.html.erb | 26 - .../views/contacts/add_multiple.html.erb | 26 - .../original/views/contacts/choose.html.erb | 11 - .../views/contacts/import_preview.html.erb | 43 - themes/original/views/contacts/index.html.erb | 115 - themes/original/views/contacts/new.html.erb | 73 - themes/original/views/folders/index.html.erb | 48 - themes/original/views/layouts/.gitkeep | 0 .../original/views/layouts/chooser.html.erb | 19 - themes/original/views/layouts/login.html.erb | 15 - themes/original/views/layouts/public.html.erb | 31 - themes/original/views/login/index.rhtml | 29 - .../original/views/shared/_folders.html.erb | 12 - .../original/views/webmail/_contacts.html.erb | 12 - themes/original/views/webmail/_expr.html.erb | 18 - .../original/views/webmail/_filter.html.erb | 19 - .../views/webmail/_message_row.html.erb | 14 - .../original/views/webmail/_search.html.erb | 13 - .../original/views/webmail/compose.html.erb | 67 - .../views/webmail/error_connection.html.erb | 26 - themes/original/views/webmail/filter.html.erb | 41 - .../original/views/webmail/filters.html.erb | 42 - .../original/views/webmail/folders.html.erb | 29 - .../original/views/webmail/mailsent.html.erb | 31 - .../original/views/webmail/message.html.erb | 42 - .../original/views/webmail/messages.html.erb | 80 - .../views/webmail/noattachment.html.erb | 1 - themes/original/views/webmail/prefs.html.erb | 55 - .../views/webmail/view_source.html.erb | 13 - vendor/ezcrypto-0.1.1/._README | Bin 178 -> 0 bytes vendor/ezcrypto-0.1.1/._rakefile | Bin 178 -> 0 bytes vendor/ezcrypto-0.1.1/MIT-LICENSE | 21 - vendor/ezcrypto-0.1.1/README | 130 - vendor/ezcrypto-0.1.1/lib/ezcrypto.rb | 357 - vendor/ezcrypto-0.1.1/rakefile | 195 - vendor/ezcrypto-0.1.1/test/ezcrypto_test.rb | 112 - vendor/plugins/.gitkeep | 0 vendor/plugins/auto_complete/README | 23 - vendor/plugins/auto_complete/Rakefile | 22 - vendor/plugins/auto_complete/init.rb | 2 - .../auto_complete/lib/auto_complete.rb | 47 - .../lib/auto_complete_macros_helper.rb | 143 - .../auto_complete/test/auto_complete_test.rb | 67 - vendor/plugins/classic_pagination/CHANGELOG | 152 - vendor/plugins/classic_pagination/README | 18 - vendor/plugins/classic_pagination/Rakefile | 22 - vendor/plugins/classic_pagination/init.rb | 33 - vendor/plugins/classic_pagination/install.rb | 1 - .../classic_pagination/lib/pagination.rb | 405 -- .../lib/pagination_helper.rb | 135 - .../test/fixtures/companies.yml | 24 - .../test/fixtures/company.rb | 9 - .../test/fixtures/developer.rb | 7 - .../test/fixtures/developers.yml | 21 - .../test/fixtures/developers_projects.yml | 13 - .../test/fixtures/project.rb | 3 - .../test/fixtures/projects.yml | 7 - .../test/fixtures/replies.yml | 13 - .../classic_pagination/test/fixtures/reply.rb | 5 - .../test/fixtures/schema.sql | 42 - .../classic_pagination/test/fixtures/topic.rb | 3 - .../test/fixtures/topics.yml | 22 - .../plugins/classic_pagination/test/helper.rb | 117 - .../test/pagination_helper_test.rb | 38 - .../test/pagination_test.rb | 177 - 238 files changed, 9393 insertions(+), 13192 deletions(-) mode change 100644 => 100755 AUTHORS mode change 100755 => 100644 Gemfile.lock mode change 100644 => 100755 README.markdown mode change 100755 => 100644 Rakefile mode change 100644 => 100755 UNLICENSE mode change 100755 => 100644 app/controllers/application_controller.rb delete mode 100755 app/controllers/contact_groups_controller.rb delete mode 100755 app/controllers/contacts_controller.rb create mode 100644 app/controllers/core_controller.rb delete mode 100755 app/controllers/folders_controller.rb delete mode 100755 app/controllers/login_controller.rb delete mode 100755 app/controllers/webmail_controller.rb mode change 100755 => 100644 app/helpers/application_helper.rb delete mode 100755 app/helpers/contact_group_helper.rb delete mode 100755 app/helpers/contacts_helper.rb create mode 100644 app/helpers/core_helper.rb delete mode 100755 app/helpers/folders_helper.rb delete mode 100755 app/helpers/navigation_helper.rb delete mode 100755 app/helpers/webmail_helper.rb delete mode 100755 app/models/contact.rb delete mode 100755 app/models/contact_group.rb delete mode 100755 app/models/customer.rb delete mode 100755 app/models/imap_message.rb delete mode 100755 app/models/mail_pref.rb rename app/views/{contents_moved_to_original_theme_directory => contents_moved_to_olive_theme_directory} (100%) mode change 100644 => 100755 mode change 100644 => 100755 arts/logo2.xcf mode change 100644 => 100755 arts/logo3.xcf mode change 100755 => 100644 config.ru mode change 100755 => 100644 config/application.rb mode change 100755 => 100644 config/boot.rb mode change 100644 => 100755 config/database.yml.example delete mode 100755 config/default_site.rb create mode 100644 config/defaults.yml mode change 100755 => 100644 config/environment.rb mode change 100755 => 100644 config/environments/development.rb mode change 100755 => 100644 config/environments/production.rb mode change 100755 => 100644 config/environments/test.rb mode change 100755 => 100644 config/initializers/backtrace_silencers.rb mode change 100755 => 100644 config/initializers/inflections.rb mode change 100755 => 100644 config/initializers/mime_types.rb delete mode 100755 config/initializers/pluralization.rb mode change 100755 => 100644 config/initializers/secret_token.rb mode change 100755 => 100644 config/initializers/session_store.rb mode change 100755 => 100644 config/routes.rb delete mode 100755 db/migrate/20090107193228_init.rb delete mode 100755 db/schema.rb mode change 100755 => 100644 db/seeds.rb mode change 100755 => 100644 doc/README_FOR_APP delete mode 100755 lib/cdfutils.rb delete mode 100755 lib/imap_utils.rb mode change 100755 => 100644 lib/tasks/.gitkeep delete mode 100755 lib/tmail_patch.rb delete mode 100755 lib/webmail/bounced_mail.rb delete mode 100755 lib/webmail/cdfmail.rb delete mode 100755 lib/webmail/environment.rb delete mode 100755 lib/webmail/expression.rb delete mode 100755 lib/webmail/filter.rb delete mode 100755 lib/webmail/imap_message.rb delete mode 100755 lib/webmail/imapmailbox.rb delete mode 100755 lib/webmail/mail2screen.rb delete mode 100755 lib/webmail/mail_transform.rb delete mode 100755 lib/webmail/maildropserializator.rb delete mode 100755 lib/webmail/routes.rb delete mode 100755 lib/webmail/virtual_email.rb mode change 100755 => 100644 public/404.html mode change 100755 => 100644 public/422.html mode change 100755 => 100644 public/500.html mode change 100755 => 100644 public/favicon.ico delete mode 100644 public/images/logo3.png delete mode 100644 public/images/logo3_dark.png rename {themes/original => public}/images/rails.png (100%) mode change 100755 => 100644 mode change 100755 => 100644 public/robots.txt rename public/{javascripts => stylesheets}/.gitkeep (100%) create mode 100644 test/functional/core_controller_test.rb mode change 100755 => 100644 test/performance/browsing_test.rb mode change 100755 => 100644 test/test_helper.rb create mode 100644 test/unit/helpers/core_helper_test.rb mode change 100644 => 100755 themes/olive/README.olive mode change 100644 => 100755 themes/olive/images/.gitkeep mode change 100644 => 100755 themes/olive/images/key.png mode change 100644 => 100755 themes/olive/images/logo_small.png mode change 100644 => 100755 themes/olive/javascripts/.gitkeep create mode 100755 themes/olive/javascripts/application.js delete mode 100755 themes/olive/javascripts/contact_choose.js create mode 100755 themes/olive/javascripts/controls.js create mode 100755 themes/olive/javascripts/dragdrop.js create mode 100755 themes/olive/javascripts/effects.js delete mode 100755 themes/olive/javascripts/effects2.js delete mode 100755 themes/olive/javascripts/global.js delete mode 100755 themes/olive/javascripts/global_src.js delete mode 100755 themes/olive/javascripts/htmlstyle.js delete mode 100755 themes/olive/javascripts/jstrim.pl create mode 100755 themes/olive/javascripts/prototype.js delete mode 100755 themes/olive/javascripts/prototype_src.js create mode 100755 themes/olive/javascripts/rails.js delete mode 100755 themes/olive/javascripts/scriptaculous.js delete mode 100755 themes/olive/javascripts/slider.js delete mode 100755 themes/olive/javascripts/webmail.js mode change 100644 => 100755 themes/olive/stylesheets/.gitkeep delete mode 100755 themes/olive/stylesheets/admin.css mode change 100644 => 100755 themes/olive/stylesheets/base.css delete mode 100755 themes/olive/stylesheets/mailr.css mode change 100644 => 100755 themes/olive/stylesheets/style.css delete mode 100755 themes/olive/stylesheets/tabs.css delete mode 100755 themes/olive/stylesheets/webmail/icon-folder-open.gif delete mode 100755 themes/olive/stylesheets/webmail/webmail.css delete mode 100755 themes/olive/views/contact_groups/edit.html.erb delete mode 100755 themes/olive/views/contact_groups/index.html.erb delete mode 100755 themes/olive/views/contacts/add_multiple.html.erb delete mode 100755 themes/olive/views/contacts/choose.html.erb delete mode 100755 themes/olive/views/contacts/import_preview.html.erb delete mode 100755 themes/olive/views/contacts/index.html.erb delete mode 100755 themes/olive/views/contacts/new.html.erb rename themes/olive/views/{login/index.html.erb => core/login.html.erb} (76%) mode change 100644 => 100755 create mode 100644 themes/olive/views/core/logout.html.erb delete mode 100755 themes/olive/views/folders/index.html.erb mode change 100644 => 100755 themes/olive/views/layouts/.gitkeep rename themes/olive/views/layouts/{public.html.erb => application.html.erb} (100%) delete mode 100755 themes/olive/views/layouts/chooser.html.erb rename themes/olive/views/layouts/{login.html.erb => simple.html.erb} (100%) delete mode 100755 themes/olive/views/shared/_folders.html.erb delete mode 100755 themes/olive/views/shared/_logo.html.erb delete mode 100755 themes/olive/views/shared/_messages.html.erb delete mode 100755 themes/olive/views/shared/_msg_ops.html.erb delete mode 100755 themes/olive/views/webmail/_contacts.html.erb delete mode 100755 themes/olive/views/webmail/_expr.html.erb delete mode 100755 themes/olive/views/webmail/_filter.html.erb delete mode 100755 themes/olive/views/webmail/_message_row.html.erb delete mode 100755 themes/olive/views/webmail/_search.html.erb delete mode 100755 themes/olive/views/webmail/compose.html.erb delete mode 100755 themes/olive/views/webmail/error_connection.html.erb delete mode 100755 themes/olive/views/webmail/filter.html.erb delete mode 100755 themes/olive/views/webmail/filters.html.erb delete mode 100755 themes/olive/views/webmail/folders.html.erb delete mode 100755 themes/olive/views/webmail/mailsent.html.erb delete mode 100755 themes/olive/views/webmail/message.html.erb delete mode 100755 themes/olive/views/webmail/messages.html.erb delete mode 100755 themes/olive/views/webmail/noattachment.html.erb delete mode 100755 themes/olive/views/webmail/prefs.html.erb delete mode 100755 themes/olive/views/webmail/view_source.html.erb delete mode 100644 themes/original/images/.gitkeep delete mode 100755 themes/original/images/attachment.png delete mode 100755 themes/original/images/d6deec.gif delete mode 100755 themes/original/images/deselect.png delete mode 100755 themes/original/images/list_closed.gif delete mode 100755 themes/original/images/list_opened.gif delete mode 100644 themes/original/images/logo.png delete mode 100755 themes/original/images/noprogress.gif delete mode 100755 themes/original/images/select.png delete mode 100755 themes/original/images/white.gif delete mode 100755 themes/original/images/white.png delete mode 100644 themes/original/javascripts/.gitkeep delete mode 100755 themes/original/javascripts/contact_choose.js delete mode 100755 themes/original/javascripts/effects2.js delete mode 100755 themes/original/javascripts/global.js delete mode 100755 themes/original/javascripts/global_src.js delete mode 100755 themes/original/javascripts/htmlstyle.js delete mode 100755 themes/original/javascripts/jstrim.pl delete mode 100755 themes/original/javascripts/prototype_src.js delete mode 100755 themes/original/javascripts/scriptaculous.js delete mode 100755 themes/original/javascripts/slider.js delete mode 100755 themes/original/javascripts/webmail.js delete mode 100755 themes/original/stylesheets/.gitkeep delete mode 100755 themes/original/stylesheets/admin.css delete mode 100755 themes/original/stylesheets/mailr.css delete mode 100755 themes/original/stylesheets/tabs.css delete mode 100755 themes/original/stylesheets/webmail/icon-folder-open.gif delete mode 100755 themes/original/stylesheets/webmail/webmail.css delete mode 100755 themes/original/views/contact_groups/edit.html.erb delete mode 100755 themes/original/views/contact_groups/index.html.erb delete mode 100755 themes/original/views/contacts/add_multiple.html.erb delete mode 100755 themes/original/views/contacts/choose.html.erb delete mode 100755 themes/original/views/contacts/import_preview.html.erb delete mode 100755 themes/original/views/contacts/index.html.erb delete mode 100755 themes/original/views/contacts/new.html.erb delete mode 100755 themes/original/views/folders/index.html.erb delete mode 100644 themes/original/views/layouts/.gitkeep delete mode 100755 themes/original/views/layouts/chooser.html.erb delete mode 100755 themes/original/views/layouts/login.html.erb delete mode 100644 themes/original/views/layouts/public.html.erb delete mode 100755 themes/original/views/login/index.rhtml delete mode 100755 themes/original/views/shared/_folders.html.erb delete mode 100755 themes/original/views/webmail/_contacts.html.erb delete mode 100755 themes/original/views/webmail/_expr.html.erb delete mode 100755 themes/original/views/webmail/_filter.html.erb delete mode 100755 themes/original/views/webmail/_message_row.html.erb delete mode 100755 themes/original/views/webmail/_search.html.erb delete mode 100755 themes/original/views/webmail/compose.html.erb delete mode 100755 themes/original/views/webmail/error_connection.html.erb delete mode 100755 themes/original/views/webmail/filter.html.erb delete mode 100755 themes/original/views/webmail/filters.html.erb delete mode 100755 themes/original/views/webmail/folders.html.erb delete mode 100755 themes/original/views/webmail/mailsent.html.erb delete mode 100755 themes/original/views/webmail/message.html.erb delete mode 100755 themes/original/views/webmail/messages.html.erb delete mode 100755 themes/original/views/webmail/noattachment.html.erb delete mode 100755 themes/original/views/webmail/prefs.html.erb delete mode 100755 themes/original/views/webmail/view_source.html.erb delete mode 100755 vendor/ezcrypto-0.1.1/._README delete mode 100755 vendor/ezcrypto-0.1.1/._rakefile delete mode 100755 vendor/ezcrypto-0.1.1/MIT-LICENSE delete mode 100755 vendor/ezcrypto-0.1.1/README delete mode 100755 vendor/ezcrypto-0.1.1/lib/ezcrypto.rb delete mode 100755 vendor/ezcrypto-0.1.1/rakefile delete mode 100755 vendor/ezcrypto-0.1.1/test/ezcrypto_test.rb mode change 100755 => 100644 vendor/plugins/.gitkeep delete mode 100755 vendor/plugins/auto_complete/README delete mode 100755 vendor/plugins/auto_complete/Rakefile delete mode 100755 vendor/plugins/auto_complete/init.rb delete mode 100755 vendor/plugins/auto_complete/lib/auto_complete.rb delete mode 100755 vendor/plugins/auto_complete/lib/auto_complete_macros_helper.rb delete mode 100755 vendor/plugins/auto_complete/test/auto_complete_test.rb delete mode 100755 vendor/plugins/classic_pagination/CHANGELOG delete mode 100755 vendor/plugins/classic_pagination/README delete mode 100755 vendor/plugins/classic_pagination/Rakefile delete mode 100755 vendor/plugins/classic_pagination/init.rb delete mode 100755 vendor/plugins/classic_pagination/install.rb delete mode 100755 vendor/plugins/classic_pagination/lib/pagination.rb delete mode 100755 vendor/plugins/classic_pagination/lib/pagination_helper.rb delete mode 100755 vendor/plugins/classic_pagination/test/fixtures/companies.yml delete mode 100755 vendor/plugins/classic_pagination/test/fixtures/company.rb delete mode 100755 vendor/plugins/classic_pagination/test/fixtures/developer.rb delete mode 100755 vendor/plugins/classic_pagination/test/fixtures/developers.yml delete mode 100755 vendor/plugins/classic_pagination/test/fixtures/developers_projects.yml delete mode 100755 vendor/plugins/classic_pagination/test/fixtures/project.rb delete mode 100755 vendor/plugins/classic_pagination/test/fixtures/projects.yml delete mode 100755 vendor/plugins/classic_pagination/test/fixtures/replies.yml delete mode 100755 vendor/plugins/classic_pagination/test/fixtures/reply.rb delete mode 100755 vendor/plugins/classic_pagination/test/fixtures/schema.sql delete mode 100755 vendor/plugins/classic_pagination/test/fixtures/topic.rb delete mode 100755 vendor/plugins/classic_pagination/test/fixtures/topics.yml delete mode 100755 vendor/plugins/classic_pagination/test/helper.rb delete mode 100755 vendor/plugins/classic_pagination/test/pagination_helper_test.rb delete mode 100755 vendor/plugins/classic_pagination/test/pagination_test.rb diff --git a/.gitignore b/.gitignore index d6ea040..9a3eba8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,5 @@ -log +.bundle +db/*.sqlite3 +log/*.log +tmp/ config/database.yml -.*.sw? -config/site.rb -tmp -mail_temp -.svn diff --git a/AUTHORS b/AUTHORS old mode 100644 new mode 100755 diff --git a/Gemfile b/Gemfile index 79bbe16..a61cdfc 100755 --- a/Gemfile +++ b/Gemfile @@ -5,12 +5,12 @@ gem 'rails', '3.0.7' # Bundle edge Rails instead: # gem 'rails', :git => 'git://github.com/rails/rails.git' -gem 'sqlite3-ruby',:require => 'sqlite3' +#gem 'sqlite3-ruby',:require => 'sqlite3' gem 'arel' -gem 'mysql2' +gem 'mysql2' , '0.2.7' gem 'will_paginate' gem 'themes_for_rails' -gem 'tmail' +#gem 'tmail' # Use unicorn as the web server # gem 'unicorn' diff --git a/Gemfile.lock b/Gemfile.lock old mode 100755 new mode 100644 index 1f3e0d8..5c1753f --- a/Gemfile.lock +++ b/Gemfile.lock @@ -27,20 +27,21 @@ GEM activemodel (= 3.0.7) activesupport (= 3.0.7) activesupport (3.0.7) - arel (2.0.4) + arel (2.0.10) builder (2.1.2) erubis (2.7.0) i18n (0.5.0) - mail (2.2.18) + mail (2.2.19) activesupport (>= 2.3.6) i18n (>= 0.4.0) - mime-types (>= 1.16) - treetop (>= 1.4.8) + mime-types (~> 1.16) + treetop (~> 1.4.8) mime-types (1.16) mysql2 (0.2.7) polyglot (0.3.1) - rack (1.2.2) - rack-mount (0.7.3) + rack (1.2.3) + rack-mount (0.8.1) + rack (>= 1.0.0) rack-test (0.5.7) rack (>= 1.0) rails (3.0.7) @@ -56,18 +57,14 @@ GEM activesupport (= 3.0.7) rake (>= 0.8.7) thor (~> 0.14.4) - rake (0.8.7) - sqlite3 (1.3.3) - sqlite3-ruby (1.3.3) - sqlite3 (>= 1.3.3) + rake (0.9.2) themes_for_rails (0.4.2) rails (~> 3.0.0) themes_for_rails thor (0.14.6) - tmail (1.2.7.1) treetop (1.4.9) polyglot (>= 0.3.1) - tzinfo (0.3.24) + tzinfo (0.3.29) will_paginate (2.3.15) PLATFORMS @@ -75,9 +72,7 @@ PLATFORMS DEPENDENCIES arel - mysql2 + mysql2 (= 0.2.7) rails (= 3.0.7) - sqlite3-ruby themes_for_rails - tmail will_paginate diff --git a/README.markdown b/README.markdown old mode 100644 new mode 100755 index e63e407..4cb73d5 --- a/README.markdown +++ b/README.markdown @@ -1,8 +1,6 @@ ## Introduction _Mailr_ is a IMAP mail client based on _Ruby on Rails_ platform. -## Installation guide - **NOTE** All path and filenames are based on _Rails.root_ directory. ### Requirements @@ -13,35 +11,17 @@ In _Rails 3_ all dependencies should be defined in file _Gemfile_. All needed ge * Checkout the source code. -* If you need to override some of the default constants used in the application take a look at _config/default_site.rb_. Then create _config/site.rb_ that contains only the keys which you want to override. Example content of _config/site.rb_ is: - -```ruby -module CDF - -LOCALCONFIG = { - :imap_server => 'your.imap.server' -} -end -``` - -* Configure SMTP settings - -```ruby -# initializers/smtp_settings.rb - ActionMailer::Base.smtp_settings = { - :address => "mail.example.com.py", - :port => 26, - :authentication => :plain, - :enable_starttls_auto => true, - :user_name => "emilio@example.com.py", - :password => "yourpass" -} -``` +* Install all dependiences. Use _bundler_ for that. * Prepare config/database.yml file (see _config/database.yml.example_). - Check if proper gems (sqlite3/mysql/postgresql) are defined in _Gemfile_ and installed. + Check if proper gems (sqlite3/mysql/postgresql) are defined in _Gemfile_ and installed. * Migrate database (rake db:migrate) -* Use it. +* Start rails server if applicable +* Point Your browser to application URL: + For local access: http://localhost:3000 + For remote access: http://some_url/mailr + +* Use it. diff --git a/Rakefile b/Rakefile old mode 100755 new mode 100644 diff --git a/UNLICENSE b/UNLICENSE old mode 100644 new mode 100755 diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb old mode 100755 new mode 100644 index 279d8db..0ad5869 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,189 +1,24 @@ -# The filters added to this controller will be run for all controllers in the application. -# Likewise will all the methods added be available for all controllers. +require 'yaml' + class ApplicationController < ActionController::Base - protect_from_forgery + protect_from_forgery - before_filter :user_login_filter - before_filter :add_scripts - #before_filter :localize + before_filter :load_defaults + before_filter :set_locale + protected - #filter_parameter_logging :password #upgrade to Rails3 + def load_defaults + @defaults = YAML::load(File.open(Rails.root.join('config','defaults.yml'))) + end - protected - - def theme_resolver - CDF::CONFIG[:theme] || CDF::CONFIG[:default_theme] - end - - def secure_user?() true end - def secure_cust?() false end - def additional_scripts() "" end - def onload_function() "" end - - private - def add_scripts - @additional_scripts = additional_scripts() - @onload_function = onload_function() - end - - def user_login_filter - if (secure_user? or secure_cust? )and logged_user.nil? - - #upgrade Rails 3 - #session["return_to"] = request.request_uri - logger.debug "*** return_to => #{request.fullpath}" - session["return_to"] = request.fullpath - - redirect_to :controller=>"/login", :action => "index" - return false - end - end - - alias login_required user_login_filter - - def logged_user # returns customer id - session['user'] - end - - def logged_customer - session['user'] - end - - def localize - # We will use instance vars for the locale so we can make use of them in - # the templates. - @charset = 'utf-8' - headers['Content-Type'] = "text/html; charset=#{@charset}" - # Here is a very simplified approach to extract the prefered language - # from the request. If all fails, just use 'en_EN' as the default. - temp = if request.env['HTTP_ACCEPT_LANGUAGE'].nil? - [] - else - request.env['HTTP_ACCEPT_LANGUAGE'].split(',').first.split('-') rescue [] - end - language = temp.slice(0) - dialect = temp.slice(1) - @language = language.nil? ? 'en' : language.downcase # default is en - # If there is no dialect use the language code ('en' becomes 'en_EN'). - @dialect = dialect.nil? ? @language.upcase : dialect - # The complete locale string consists of - # language_DIALECT (en_EN, en_GB, de_DE, ...) - @locale = "#{@language}_#{@dialect.upcase}" - @htmllang = @language == @dialect ? @language : "#{@language}-#{@dialect}" - # Finally, bind the textdomain to the locale. From now on every used - # _('String') will get translated into the right language. (Provided - # that we have a corresponding mo file in the right place). - bindtextdomain('messages', "#{RAILS_ROOT}/locale", @locale, @charset) - end - - public - - def include_tinymce(mode="textareas",elements="") - tinymce='' - tinymce << ' - - ' - tinymce - end - - helper_method :include_tinymce - - def include_simple_tinymce(mode="textareas",elements="") - tinymce = '' - tinymce << ' - ' - tinymce - end - - def _(text) - t text - end - - helper_method :include_simple_tinymce, :_ + def theme_resolver + @defaults['theme'] + end + def set_locale + I18n.locale = @defaults['locale'] || I18n.default_locale + end end diff --git a/app/controllers/contact_groups_controller.rb b/app/controllers/contact_groups_controller.rb deleted file mode 100755 index b09a1b6..0000000 --- a/app/controllers/contact_groups_controller.rb +++ /dev/null @@ -1,56 +0,0 @@ -class ContactGroupsController < ApplicationController - - theme :theme_resolver - - layout 'public' - - - def index - @contact_group = ContactGroup.new - @contact_group.customer_id = logged_user - @contactgroups = ContactGroup.find_by_user(logged_user) - end - - def add - @contactgroup = ContactGroup.new - @contactgroup.customer_id = logged_user - render("/contact_group/edit") - end - - def delete - contactgroup = ContactGroup.find(@params["id"]) - contactgroup.destroy - redirect_to(:action=>"list") - end - - def edit - @contactgroup = ContactGroup.find(@params["id"]) - end - - def save - begin - if @params["contactgroup"]["id"].nil? or @params["contactgroup"]["id"] == "" - # New contactgroup - @contactgroup = ContactGroup.create(@params["contactgroup"]) - else - # Edit existing - @contactgroup = ContactGroup.find(@params["contactgroup"]["id"]) - @contactgroup.attributes = @params["contactgroup"] - end - - if @contactgroup.save - redirect_to(:action=>"list") - else - render "/contact_group/edit" - end - rescue CDF::ValidationError => e - logger.info("RESCUE") - @contactgroup = e.entity - render("/contact_group/edit") - end - end - - protected - def secure_user?() true end - -end diff --git a/app/controllers/contacts_controller.rb b/app/controllers/contacts_controller.rb deleted file mode 100755 index ace89c3..0000000 --- a/app/controllers/contacts_controller.rb +++ /dev/null @@ -1,378 +0,0 @@ -class ContactsController < ApplicationController - - theme :theme_resolver - - layout :select_layout - - def index - if params[:letter] && params[:letter].any? - @contacts = Contact.for_customer(logged_user).letter(params[:letter]).paginate :page => params[:page], - :per_page => CDF::CONFIG[:contacts_per_page] - else - @contacts = Contact.for_customer(logged_user).paginate :page => params[:page], :per_page => CDF::CONFIG[:contacts_per_page] - end - end - - def listLetter - letters = CDF::CONFIG[:contact_letters] - @contact_pages = Paginator.new(self, Contact.count( - ["customer_id = %s and substr(UPPER(fname),1,1) = '%s'", logged_user, letters[params['id'].to_i]]), CDF::CONFIG[:contacts_per_page], params['page']) - @contacts = Contact.find(:all, :conditions=>["customer_id = %s and substr(UPPER(fname),1,1) = '%s'", logged_user, letters[params['id'].to_i]], - :order=>['fname'], :limit=>CDF::CONFIG[:contacts_per_page], :offset=>@contact_pages.current.offset) - - if params["mode"] == "groups" - if params["group_id"] and not params["group_id"].nil? and not params["group_id"] == '' - @group_id = params["group_id"].to_i - @contacts_for_group = Hash.new - for contact in @contacts - @contacts_for_group[contact.id] = 0 # initialize - for gr in contact.groups - if gr.contact_group_id.to_i == @group_id - @contacts_for_group[contact.id] = 1 # checked - end - end - end - end - end - - render :action => "list" - end - - def new - @contact = Contact.new - @contact.customer_id = logged_user - - # load related lists - loadLists - - # Init groups: because of checkbox - # Set all to 0 => unchecked - @groups = Hash.new - @contactgroups.each {|g| - @groups[g.id] = 0 - } - end - - def add_multiple - @contact = Contact.new - @contact["file_type"] = "1" - end - - def add_from_mail - cstr = params['cstr'] - retmsg = params['retmsg'] - session["return_to"] = url_for(:controller=>'/webmail/webmail', - :action=>'folders', - :msg_id=>retmsg) - # parse string - if i = cstr.index("<") - name, email = cstr.slice(0, i), cstr.slice((i+1)..(cstr.strip().index(">")-1)) - fname = name.split().first - lname = name.split().last if name.split().size() > 1 - else - fname, lname, email = "", "", cstr - end - - if @contact = Contact.find_by_user_email(logged_user, email) - # load related lists - loadLists - - @contact.fname, @contact.lname = fname, lname - - # groups = @contact.groups - @groups = Hash.new - @contactgroups.each {|g| - groupSelected = false - @contact.groups.each {|gr| - if gr.contact_group_id.to_i == g.id.to_i - groupSelected = true - break - end - } - if groupSelected - @groups[g.id] = 1 # checked - else - @groups[g.id] = 0 # unchecked - end - } - else - @contact = Contact.new("fname"=>fname, "lname" => lname, "email" => email) - @contact.customer_id = logged_user - - # load related lists - loadLists - - # Init groups: because of checkbox - # Set all to 0 => unchecked - @groups = Hash.new - @contactgroups.each {|g| - @groups[g.id] = 0 - } - end - render :action => "new" - end - - def import_preview - file = params["contact"]["data"] - - flash["errors"] = Array.new - - if file.size == 0 - flash["errors"] << _('You haven\'t selected file or the file is empty') - @contact = Contact.new - @contact["file_type"] = params["contact"]["file_type"] - render :action => "add_multiple" - end - - file_type = params["contact"]["file_type"] - if file_type.nil? or file_type == '1' - separator = ',' - else - separator = /\t/ - - end - - @contacts = Array.new - emails = Array.new - - file.each {|line| - cdata = line.strip.chomp.split(separator) - cont = Contact.new - cont.fname = cdata[0].to_s.strip.chomp - cont.lname = cdata[1].to_s.strip.chomp - cont.email = cdata[2].to_s.strip.chomp - - # Check for duplicate emails in the file - if emails.include?(cont.email) - flash["errors"] << sprintf(_('Contact %'), file.lineno.to_s) + ": " + _('The e-mail duplicates the e-mail of another record!') - else - emails << cont.email - end - - @contacts << cont - } - - end - - def import - contacts_count = params["contact"].length - contacts_to_import = params["contact"] - @contacts = Array.new - emails = Array.new - - flash["errors"] = Array.new - - for i in 0...contacts_count - contact = Contact.new - contact.customer_id = logged_user - contact.fname = contacts_to_import[i.to_s]["fname"] - contact.lname = contacts_to_import[i.to_s]["lname"] - contact.email = contacts_to_import[i.to_s]["email"] - - begin - # Check for duplicate emails in the submitted data - if emails.include?(contact.email) - flash["errors"] << sprintf(_('Contact %'), (i+1).to_s) + ": " + _('The e-mail duplicates the e-mail of another record!') - else - emails << contact.email - end - # Check if contact is valid - contact.valid? - rescue CDF::ValidationError => e - if not contact.errors.empty? - ["fname", "lname", "email"].each do |attr| - attr_errors = contact.errors.on(attr) - attr_errors = [attr_errors] unless attr_errors.nil? or attr_errors.is_a? Array - - if not attr_errors.nil? - attr_errors.each do |msg| - flash["errors"] << l(:contact_addmultiple_errorforcontact, (i+1).to_s) + ": " + l(msg) - end - end - end - end - end # rescue - - @contacts << contact - end # for - - # If there are validation errors - display them - if not flash["errors"].nil? and not flash["errors"].empty? - render :action => "import_preview" - else - # save - begin - for contact in @contacts - Contact.create(contact.attributes) - end - # Set message for successful import - flash["alert"] = Array.new - flash["alert"] << l(:contact_addmultiple_success, @contacts.length.to_s) - keep_flash() - redirect_to(:action=>"list") - rescue Exception => exc - flash["errors"] << exc - render :action => "import_preview" - end - end - end - - - def choose - if params["mode"] == "groups" - save_groups - end - - @tos, @ccs, @bccs = Array.new, Array.new, Array.new - - params["contacts_to"].each{ |id,value| @tos << Contact.find(id) if value == "1" } if params["contacts_to"] - params["contacts_cc"].each{ |id,value| @ccs << Contact.find(id) if value == "1" } if params["contacts_cc"] - params["contacts_bcc"].each{ |id,value| @bccs << Contact.find(id) if value == "1" } if params["contacts_bcc"] - - params["groups_to"].each{ |id,value| - ContactGroup.find(id).contacts.each {|c| @tos << c} if value == "1" } if params["groups_to"] - params["groups_cc"].each{ |id,value| - ContactGroup.find(id).contacts.each {|c| @ccs << c} if value == "1" } if params["groups_cc"] - params["groups_bcc"].each{ |id,value| - ContactGroup.find(id).contacts.each {|c| @bccs << c} if value == "1" } if params["groups_bcc"] - end - - def save_groups - contacts_for_group = params["contacts_for_group"] - group_id = params["group_id"] - contact_group = ContactGroup.find(group_id) - - - contacts_for_group.each { |contact_id,value| - contact = Contact.find(contact_id) - if value == "1" and not contact_group.contacts.include?(contact) - contact_group.contacts << contact - end - if value == "0" and contact_group.contacts.include?(contact) - contact_group.contacts.delete(contact) - end - } - redirect_to(:action=>"index", :id=>group_id, :params=>{"mode"=>params["mode"]}) - end - - def edit - @contact = Contact.find(params["id"]) - # load related lists - loadLists - - # groups = @contact.groups - @groups = Hash.new - @contactgroups.each {|g| - groupSelected = false - @contact.groups.each {|gr| - if gr.contact_group_id.to_i == g.id.to_i - groupSelected = true - break - end - } - if groupSelected - @groups[g.id] = 1 # checked - else - @groups[g.id] = 0 # unchecked - end - } - render :action => "new" - end - - # Insert or update - def create - if params["contact"]["id"] == "" - # New contact - @contact = Contact.create(params["contact"]) - else - # Edit existing - @contact = Contact.find(params["contact"]["id"]) - @contact.attributes = params["contact"] - end - - @contactgroups = ContactGroup.find_by_user(logged_user) - # Groups displayed - groups = params['groups'] - tempGroups = Array.new - tempGroups.concat(@contact.groups) - - @contactgroups.each { |cgroup| - includesCGroup = false - tempGroups.each {|gr| - if gr.contact_group_id.to_i == cgroup.id.to_i - includesCGroup = true - break - end - } - if groups["#{cgroup.id}"] == "1" and not includesCGroup - @contact.groups << cgroup - end - - if groups["#{cgroup.id}"] == "0" and includesCGroup - @contact.groups.delete(cgroup) - end - } - if @contact.save - if params["paction"] == t(:save) - redirect_to :action =>:index - else - redirect_to :action => :new - end - else - loadLists - @groups = Hash.new - @contactgroups.each {|g| - if @contact.groups.include?(g) - @groups[g.id] = 1 - else - @groups[g.id] = 0 - end - } - render :action => :new - end - end - - def delete - Contact.destroy(params['id']) - redirect_to(:action=>'index') - end - - protected - def secure_user?() true end - def additional_scripts() - add_s = '' - if action_name == "choose" - add_s<<'' - add_s<<'' - end - add_s - end - - def onload_function() - if action_name == "choose" - "javascript:respondToCaller();" - else - "" - end - end - private - def select_layout - if params["mode"] == "choose" - @mode = "choose" - @contactgroups = ContactGroup.find_by_user(logged_user) - 'chooser' - elsif params["mode"] == "groups" - @mode = "groups" - 'public' - else - @mode = "normal" - 'public' - end - end - - def loadLists - if @contactgroups.nil? - @contactgroups = ContactGroup.find_by_user(logged_user) - end - end -end diff --git a/app/controllers/core_controller.rb b/app/controllers/core_controller.rb new file mode 100644 index 0000000..5b51e6e --- /dev/null +++ b/app/controllers/core_controller.rb @@ -0,0 +1,18 @@ +class CoreController < ApplicationController + + theme :theme_resolver + layout "simple" + + def login + end + + def logout + reset_session + flash[:notice] = t(:user_logged_out) + redirect_to :action => "login" + end + + def authenticate + end + +end diff --git a/app/controllers/folders_controller.rb b/app/controllers/folders_controller.rb deleted file mode 100755 index 5a542fa..0000000 --- a/app/controllers/folders_controller.rb +++ /dev/null @@ -1,26 +0,0 @@ -require 'ezcrypto' -class FoldersController < ApplicationController - include ImapUtils - - before_filter :login_required - before_filter :load_imap_session - after_filter :close_imap_session - - theme :theme_resolver - - layout 'public' - - def index - @folders = @mailbox.folders - end - - def create - @mailbox.create_folder(CDF::CONFIG[:mail_inbox] + '.' + params[:folder]) - redirect_to folders_path - end - - def destroy - @mailbox.delete_folder params[:id] - redirect_to folders_path - end -end diff --git a/app/controllers/login_controller.rb b/app/controllers/login_controller.rb deleted file mode 100755 index fc0f2a6..0000000 --- a/app/controllers/login_controller.rb +++ /dev/null @@ -1,73 +0,0 @@ -require 'ezcrypto' -require 'imapmailbox' - -class LoginController < ApplicationController - - theme :theme_resolver - - def index - if not(logged_user.nil?) - redirect_to :controller =>"webmail", :action=>"index" - else - @login_user = Customer.new - end - end - - def authenticate - if user = auth(params['login_user']["email"], params['login_user']["password"]) - session["user"] = user.id - if CDF::CONFIG[:crypt_session_pass] - session["wmp"] = EzCrypto::Key.encrypt_with_password(CDF::CONFIG[:encryption_password], CDF::CONFIG[:encryption_salt], params['login_user']["password"]) - else - # dont use crypt - session["wmp"] = params['login_user']["password"] - end - if session["return_to"] - redirect_to(session["return_to"]) - session["return_to"] = nil - else - redirect_to :action=>"index" - end - else - logger.debug "*** Not logged" - @login_user = Customer.new - flash["error"] = t :wrong_email_or_password - redirect_to :action => "index" - end - end - - def logout - reset_session - flash["status"] = t(:user_logged_out) - redirect_to :action => "index" - end - - protected - - def need_subdomain?() true end - def secure_user?() false end - - private - - def auth(email, password) - mailbox = IMAPMailbox.new(Rails.logger) - logger.info "*** mailbox #{mailbox.inspect}" - begin - mailbox.connect(email, password) - rescue Exception => exc - logger.debug "*** auth/Mailbox Object => #{exc.message}" - return nil - end - - mailbox.disconnect - mailbox = nil - if user = Customer.find_by_email(email) - return user - else - # create record in database - user = Customer.create("email"=>email) - MailPref.create('customer_id' => user.id) - return user - end - end -end diff --git a/app/controllers/webmail_controller.rb b/app/controllers/webmail_controller.rb deleted file mode 100755 index e780276..0000000 --- a/app/controllers/webmail_controller.rb +++ /dev/null @@ -1,424 +0,0 @@ -require 'cdfmail' -require 'net/smtp' -require 'net/imap' -require 'mail2screen' -require 'ezcrypto' -require 'imapmailbox' -require 'imap_utils' - - -class WebmailController < ApplicationController - include ImapUtils - - theme :theme_resolver - - logger.info "*** WebmailController #{logger.inspect}" - - # Administrative functions - before_filter :login_required - before_filter :obtain_cookies_for_search_and_nav, :only=>[:messages] - before_filter :load_imap_session - after_filter :close_imap_session - - layout "public", :except => [:view_source, :download] - -# model :filter, :expression, :mail_pref, :customer - - BOOL_ON = "on" - - def index - redirect_to(:action=>"messages") - end - - def error_connection - end - - def refresh - @mailbox.reload - @folders = @mailbox.folders - redirect_to(:action=>'messages') - end - - def messages - session["return_to"] = nil - @search_field = params['search_field'] - @search_value = params['search_value'] - - # handle sorting - tsort session field contains last reverse or no for field - # and lsort - last sort field - if session['tsort'].nil? or session['lsort'].nil? - session['lsort'] = "DATE" - session['tsort'] = {"DATE" => true, "FROM" => true, "SUBJECT" => true, "TO" => false} - end - - case operation_param - when t(:copy) # copy - msg_ids = [] - messages_param.each { |msg_id, bool| - msg_ids << msg_id.to_i if bool == BOOL_ON and dst_folder != @folder_name } if messages_param - folder.copy_multiple(msg_ids, dst_folder) if msg_ids.size > 0 - when t(:move) # move - msg_ids = [] - messages_param.each { |msg_id, bool| - msg_ids << msg_id.to_i if bool == BOOL_ON and dst_folder != @folder_name } if messages_param - folder.move_multiple(msg_ids, dst_folder) if msg_ids.size > 0 - when t(:delete) # delete - msg_ids = [] - messages_param.each { |msg_id, bool| msg_ids << msg_id.to_i if bool == BOOL_ON } if messages_param - folder.delete_multiple(msg_ids) if msg_ids.size > 0 - when t(:mark_read) # mark as read - messages_param.each { |msg_id, bool| msg = folder.mark_read(msg_id.to_i) if bool == BOOL_ON } if messages_param - when t(:mark_unread) # mark as unread - messages_param.each { |msg_id, bool| msg = folder.mark_unread(msg_id.to_i) if bool == BOOL_ON } if messages_param - when "SORT" - session['lsort'] = sort_query = params["scc"] - session['tsort'][sort_query] = (session['tsort'][sort_query]? false : true) - @search_field, @search_value = session['search_field'], session['search_value'] - when t(:search) # search - session['search_field'] = @search_field - session['search_value'] = @search_value - when t(:show_all) # search - session['search_field'] = @search_field = nil - session['search_value'] = @search_value = nil - else - # get search criteria from session - @search_field = session['search_field'] - @search_value = session['search_value'] - end - - sort_query = session['lsort'] - reverse_sort = session['tsort'][sort_query] - query = ["ALL"] - @page = params["page"] - @page ||= session['page'] - session['page'] = @page - if @search_field and @search_value and not(@search_field.strip() == "") and not(@search_value.strip() == "") - @pages = Paginator.new self, 0, get_mail_prefs.wm_rows, @page - @messages = folder.messages_search([@search_field, @search_value], sort_query + (reverse_sort ? ' desc' : ' asc')) - else - @pages = Paginator.new self, folder.total, get_mail_prefs.wm_rows, @page - @messages = folder.messages(@pages.current.first_item - 1, get_mail_prefs.wm_rows, sort_query + (reverse_sort ? ' desc' : ' asc')) - end - - end - - def delete - @msg_id = msg_id_param.to_i - folder.delete(@msg_id) - redirect_to(:action=>"messages") - end - - def reply # not ready at all - @msg_id = msg_id_param.to_i - @imapmail = folder.message(@msg_id) - fb = @imapmail.full_body - @tmail = TMail::Mail.parse(fb) - - @mail = prepare_mail - @mail.reply(@tmail, fb, get_mail_prefs.mail_type) - - render :action => 'compose' - end - - def forward - @msg_id = msg_id_param.to_i - @imapmail = folder.message(@msg_id) - fb = @imapmail.full_body - @tmail = TMail::Mail.parse(fb) - - @mail = prepare_mail - @mail.forward(@tmail, fb) - - render :action => 'compose' - end - - def compose - if @mail.nil? - operation = operation_param - if operation == t(:send) - @mail = create_mail - encmail = @mail.send_mail - get_imap_session - @mailbox.message_sent(encmail) - - # delete temporary files (attachments) - @mail.delete_attachments() - render :action => :mailsent - elsif operation == t(:add) - @mail = create_mail - if params['attachment'] - attachment = CDF::Attachment.new(@mail) - attachment.file = params['attachment'] - end - else - # default - new email create - @mail = create_mail - end - end - end - - def empty # empty trash folder (works for any one else :-)) - folder.messages(0, -1).each{ |message| - folder.delete(message) - } - folder.expunge - redirect_to(:action=>"messages") - end - - def message - @msg_id = msg_id_param - @imapmail = folder.message(@msg_id) - folder.mark_read(@imapmail.uid) if @imapmail.unread - @mail = TMail::Mail.parse(@imapmail.full_body) - end - - def download - msg_id = msg_id_param - imapmail = folder.message(msg_id) - mail = TMail::Mail.parse(imapmail.full_body) - - if mail.multipart? - get_parts(mail).each { |part| - return send_part(part) if part.header and part.header['content-type']['name'] == params['ctype'] - } - render("webmail/noattachment") - else - render("webmail/noattachment") - end - end - - def prefs - @customer = Customer.find(logged_customer) - @mailpref = MailPref.find_or_create_by_customer_id logged_customer - - if params['op'] == _('Save') - if params['customer'] - @customer.fname = params['customer']['fname'] - @customer.lname = params['customer']['lname'] - @customer.save - end - @mailpref.attributes = params["mailpref"] - @mailpref.save - session["wmimapseskey"] = nil - redirect_to(:action=>"messages") - end - end - - # Message filters management - def filters - end - - def filter - if params['op'] - @filter = Filter.new(params['filter']) - @filter.customer_id = logged_customer - params['expression'].each { |index, expr| @filter.expressions << Expression.new(expr) unless expr["expr_value"].nil? or expr["expr_value"].strip == "" } - case params['op'] - when _('Add') - @filter.expressions << Expression.new - when _('Save') - if params['filter']['id'] and params['filter']['id'] != "" - @sf = Filter.find(params['filter']['id']) - @sf.name, @sf.destination_folder = @filter.name, @filter.destination_folder - @sf.expressions.each{|expr| Expression.delete(expr.id) } - @filter.expressions.each {|expr| @sf.expressions << Expression.create(expr.attributes) } - else - @sf = Filter.create(@filter.attributes) - @sf.order_num = @user.filters.size - @filter.expressions.each {|expr| @sf.expressions << Expression.create(expr.attributes) } - end - # may be some validation will be needed - @sf.save - @user.serialize_to_file - return redirect_to(:action=>"filters") - end - @expressions = @filter.expressions - else - @filter = Filter.find(params["id"]) if params["id"] - @expressions = @filter.expressions - end - @destfolders = get_to_folders - end - - def filter_delete - Filter.delete(params["id"]) - # reindex other filters - @user = Customer.find(logged_customer) - findex = 0 - @user.filters.each { |filter| - findex = findex + 1 - filter.order_num = findex - filter.save - } - @user.serialize_to_file - redirect_to :action=>"filters" - end - - def filter_up - filt = @user.filters.find(params['id']) - ufilt = @user.filters.find_all("order_num = #{filt.order_num - 1}").first - ufilt.order_num = ufilt.order_num + 1 - filt.order_num = filt.order_num - 1 - ufilt.save - filt.save - @user.serialize_to_file - redirect_to :action=>"filters" - end - - def filter_down - filt = Filter.find(params["id"]) - dfilt = @user.filters[filt.order_num] - dfilt.order_num = dfilt.order_num - 1 - filt.order_num = filt.order_num + 1 - dfilt.save - filt.save - @user.serialize_to_file - redirect_to :action=>"filters" - end - - def filter_add - @filter = Filter.new - @filter.expressions << Expression.new - @expressions = @filter.expressions - @destfolders = get_to_folders - render "filter" - end - # end of filters - - def view_source - @msg_id = msg_id_param.to_i - @imapmail = folder.message(@msg_id) - @msg_source = CGI.escapeHTML(@imapmail.full_body).gsub("\n", "
") - end - - def auto_complete_for_mail_to - auto_complete_responder_for_contacts params[:mail][:to] - end - - def auto_complete_for_mail_cc - auto_complete_responder_for_contacts params[:mail][:cc] - end - - def auto_complete_for_mail_bcc - auto_complete_responder_for_contacts params[:mail][:bcc] - end - - private - - def auto_complete_responder_for_contacts(value) - # first split by "," and take last name - searchName = value.split(',').last.strip - - # if there are 2 names search by them - if searchName.split.size > 1 - fname, lname = searchName.split.first, searchName.split.last - conditions = ['customer_id = ? and LOWER(fname) LIKE ? and LOWER(lname) like ?', logged_customer, fname.downcase + '%', lname.downcase + '%'] - else - conditions = ['customer_id = ? and LOWER(fname) LIKE ?', logged_customer, searchName.downcase + '%'] - end - @contacts = Contact.find(:all, :conditions => conditions, :order => 'fname ASC',:limit => 8) - render :partial => 'contacts' - end - - protected - - def additional_scripts() - @additional_css = ["webmail/webmail"] - @additional_js = ["webmail"] - end - - private - - def get_to_folders - res = Array.new - @folders.each{|f| res << f unless f.name == CDF::CONFIG[:mail_sent] or f.name == CDF::CONFIG[:mail_inbox] } - res - end - - - def create_mail - m = CDF::Mail.new(user.mail_temporary_path) - if params["mail"] - ma = params["mail"] - m.body, m.content_type, m.from, m.to, m.cc, m.bcc, m.subject = ma["body"], ma["content_type"], ma["from"], ma["to"], ma["cc"], ma["bcc"], ma["subject"] - if params["att_files"] - att_files, att_tfiles, att_ctypes = params["att_files"], params["att_tfiles"], params["att_ctypes"] - att_files.each {|i, value| - att = CDF::Attachment.new(m) - att.filename, att.temp_filename, att.content_type = value, att_tfiles[i], att_ctypes[i] - } - end - else - m.from, m.content_type = user.friendlly_local_email, get_mail_prefs.mail_type - end - m.customer_id = logged_customer - m - end - - def prepare_mail - m = CDF::Mail.new(user.mail_temporary_path) - m.from, m.content_type = user.friendlly_local_email, get_mail_prefs.mail_type - m - end - - - def send_part(part) - if part.content_type == "text/html" - disposition = "inline" - elsif part.content_type.include?("image/") - disposition = "inline" - else - disposition = "attachment" - end - headers['Content-Length'] = part.body.size - response.headers['Accept-Ranges'] = 'bytes' - headers['Content-type'] = part.content_type.strip - headers['Content-Disposition'] = disposition << %(; filename="#{part.header['content-type']['name']}") - render :text => part.body - end - - def get_parts(mail) - parts = Array.new - parts << mail - mail.parts.each { |part| - if part.multipart? - parts = parts.concat(get_parts(part)) - elsif part.content_type and part.content_type.include?("rfc822") - parts = parts.concat(get_parts(TMail::Mail.parse(part.body))) << part - else - parts << part - end - } - parts - end - - def obtain_cookies_for_search_and_nav - @srch_class = ((cookies['_wmlms'] and cookies['_wmlms'] == 'closed') ? 'closed' : 'open') - @srch_img_src = ((cookies['_wmlms'] and cookies['_wmlms'] == 'closed') ? 'closed' : 'opened') - @ops_class = ((cookies['_wmlmo'] and cookies['_wmlmo'] == 'closed') ? 'closed' : 'open') - @ops_img_src = ((cookies['_wmlmo'] and cookies['_wmlmo'] == 'closed') ? 'closed' : 'opened') - end - - ################################################################### - ### Some fixed parameters and session variables - ################################################################### - def folder - @folders[@folder_name] - end - - def msg_id_param - params["msg_id"] - end - - def messages_param - params["messages"] - end - - def dst_folder - params["cpdest"] - end - - def operation_param - params["op"] - end -end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb old mode 100755 new mode 100644 index 108ec48..de6be79 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,138 +1,2 @@ -# The methods added to this helper will be available to all templates in the application. module ApplicationHelper - include NavigationHelper - - protected - - def format_datetime(datetime) - datetime.strftime "%d.%m.%Y %H:%M" - end - - def errors_base(form_name) - errors = instance_variable_get("@#{form_name}").errors.on_base() - errors_out = "" - if errors - errors = [errors] unless errors.is_a? Array - errors.each do |e| - errors_out << "#{e}" - end - end - errors_out - end - - # Useful abstraction for form input fields - combines an input field with error message (if any) - # and writes an appropriate style (for errors) - # Usage: - # form_input :text_field, 'postform', 'subject' - # form_input :text_area, 'postform', 'text', 'Please enter text:', 'cols' => 80 - # form_input :hidden_field, 'postform', 'topic_id' - def form_input(helper_method, form_name, field_name, prompt = field_name.capitalize, options = {}) - case helper_method.to_s - when 'hidden_field' - self.hidden_field(form_name, field_name) - when /^.*button$/ - <<-EOL - - #{self.send(helper_method, form_name, prompt, options)} - - EOL - else - field = ( - if :select == helper_method - self.send(helper_method, form_name, field_name, options.delete('values'), options) - elsif :collection_select == helper_method - self.send(helper_method, form_name, field_name, options.delete('collection'), options.delete('value_method'), options.delete('text_method'), options) - else - self.send(helper_method, form_name, field_name, options) - end) - errors = instance_variable_get("@#{form_name}").errors[field_name] unless instance_variable_get("@#{form_name}").nil? - errors = Array.new if errors.nil? - errors_out = "" - if errors - errors = [errors] unless errors.is_a? Array - errors.each do |e| - errors_out << "#{e}" - end - end - if options['class'] == 'two_columns' - <<-EOL - - - #{field}#{errors_out} - - EOL - else - <<-EOL - #{prompt}: - #{field}#{errors_out} - EOL - end - end - end - - # Helper method that has the same signature as real input field helpers, but simply displays - # the value of a given field enclosed within

tags. - # Usage: - # <%= form_input :read_only_field, 'new_user', 'name', _('user_name')) %> - def read_only_field(form_name, field_name, html_options) - "#{instance_variable_get('@' + form_name)[field_name]}" - end - - def submit_button(form_name, prompt, html_options) - %{} - end - - # Converts a hash to XML attributes string. E.g.: - # to_attributes('a' => 'aaa', 'b' => 1) - # => 'a="aaa" b="1" ' - def attributes(hash) - hash.keys.inject("") { |attrs, key| attrs + %{#{key}="#{hash[key]}" } } - end - - def initListClass - @itClass = 1 - end - - def popListClass - ret = getListClass - @itClass = @itClass + 1 - return ret - end - - def getListClass - return "even" if @itClass%2 == 0 - return "odd" if @itClass%2 == 1 - end - - def get_meta_info - '' - '' - '' - '' - '' - end - - def user - @user = Customer.find(@session["user"]) if @user.nil? - @user - end - - def link_main - link_to( t(:contacts), contacts_path) - end - - def alternator - if @alternator.nil? - @alternator = 1 - end - - @alternator = -@alternator - - if @alternator == -1 - return "even" - else - return "odd" - end - end - end diff --git a/app/helpers/contact_group_helper.rb b/app/helpers/contact_group_helper.rb deleted file mode 100755 index a4f14e8..0000000 --- a/app/helpers/contact_group_helper.rb +++ /dev/null @@ -1,4 +0,0 @@ -module ContactGroupHelper - def link_save() "/contact_group/save" end - def link_list() "/contact_group/list" end -end diff --git a/app/helpers/contacts_helper.rb b/app/helpers/contacts_helper.rb deleted file mode 100755 index 6eb7d9a..0000000 --- a/app/helpers/contacts_helper.rb +++ /dev/null @@ -1,3 +0,0 @@ -module ContactsHelper - -end diff --git a/app/helpers/core_helper.rb b/app/helpers/core_helper.rb new file mode 100644 index 0000000..1e2635d --- /dev/null +++ b/app/helpers/core_helper.rb @@ -0,0 +1,2 @@ +module CoreHelper +end diff --git a/app/helpers/folders_helper.rb b/app/helpers/folders_helper.rb deleted file mode 100755 index d27e7b4..0000000 --- a/app/helpers/folders_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -module FoldersHelper -end diff --git a/app/helpers/navigation_helper.rb b/app/helpers/navigation_helper.rb deleted file mode 100755 index 59ca17b..0000000 --- a/app/helpers/navigation_helper.rb +++ /dev/null @@ -1,60 +0,0 @@ -module NavigationHelper - def link_back_to_messages - link_to("«" << t(:back_to_message), :controller=>"webmail", :action=>"messages") - end - - def link_send_mail - link_to( t(:compose), :controller=>"webmail", :action=>"compose") - end - - def link_mail_prefs - link_to( t(:preferences), :controller=>"webmail", :action=>"prefs") - end - - def link_mail_filters - link_to( t(:filters), :controller=>"webmail", :action=>"filters") - end - - def folder_manage_link(folder) - if folder.name == CDF::CONFIG[:mail_trash] or folder.name == CDF::CONFIG[:mail_inbox] or folder.name == CDF::CONFIG[:mail_sent] - short_fn(folder) - else - short_fn(folder) + ' ' + link_to(t(:delete), folder_path(folder.name), :method => :delete) - end - end - - def link_import_preview() "/contacts/import_preview" end - def link_main_index() root_url end - def link_contact_import() url_for(:controller => :contacts, :action => :import) end - def link_contact_choose() url_for(:controller => :contacts, :action => :choose) end - - def link_contact_list - link_to(t(:list), :controller => :contacts, :action => :index) - end - - def link_contact_add_one - link_to(t(:add_one_contact), new_contact_path) - end - - def link_contact_add_multiple - link_to(t(:add_multiple), :controller => :contacts, :action => "add_multiple") - end - - def link_contact_group_list - link_to(t(:groups), :controller => :contact_group, :action => :index) - end - - def link_folders - link_to( t(:folders), :controller=>:webmail, :action=>:messages) - end - - private - - def short_fn(folder) - if folder.name.include? folder.delim - folder.name.split(folder.delim).last - else - folder.name - end - end -end diff --git a/app/helpers/webmail_helper.rb b/app/helpers/webmail_helper.rb deleted file mode 100755 index 4204fbe..0000000 --- a/app/helpers/webmail_helper.rb +++ /dev/null @@ -1,167 +0,0 @@ -require 'cdfutils' -require 'mail2screen' - -module WebmailHelper - include Mail2Screen - def link_compose_new - link_to(t(:compose_txt), :controller=>"webmail", :action=>"compose") - end - - def link_refresh - link_to(t(:refresh), :controller=>"webmail", :action=>"refresh") - end - - def link_message_list - link_to(_('Message list'), :controller=>"webmail", :action=>"messages") - end - - def link_reply_to_sender(msg_id) - link_to(t(:reply), :controller=>"webmail", :action=>"reply", :params=>{"msg_id"=>msg_id}) - end - - def link_forward_message(msg_id) - link_to(t(:forward), :controller=>"webmail", :action=>"forward", :params=>{"msg_id"=>msg_id}) - end - - def link_flag_for_deletion(msg_id) - link_to(t(:delete), :controller=>"webmail", :action=>"delete", :params=>{"msg_id"=>msg_id}) - end - - def link_view_source(msg_id) - link_to(t(:view_source), {:controller=>"webmail", :action=>"view_source", :params=>{"msg_id"=>msg_id}}, {'target'=>"_blank"}) - end - - def link_filter_add - link_to(t(:add_filter), :controller=>'webmail', :action=>'filter_add') - end - - def folder_link(folder) - return folder.name if folder.attribs.include?(:Noselect) - folder_name = short_fn(folder) - folder_name = t(folder_name.downcase.to_sym, :default => folder_name) - title = folder.unseen > 0 ? "#{folder_name} (#{folder.unseen})" : "#{folder_name}" - link = link_to title, :controller => 'webmail', :action => 'messages', :folder_name => folder.name - link = content_tag('b', link) if folder.name == @folder_name - link += raw(' ' + empty_trash_link(folder.name)) if folder.trash? - logger.info link - link - end - - def message_date(datestr) - t = Time.now - begin - if datestr.kind_of?(String) - d = (Time.rfc2822(datestr) rescue Time.parse(value)).localtime - else - d = datestr - end - if d.day == t.day and d.month == t.month and d.year == t.year - d.strftime("%H:%M") - else - d.strftime("%Y-%m-%d") - end - rescue - begin - d = imap2time(datestr) - if d.day == t.day and d.month == t.month and d.year == t.year - d.strftime("%H:%M") - else - d.strftime("%Y-%m-%d") - end - rescue - datestr - end - end - end - - def attachment(att, index) - ret = "#{att.filename}" - # todo: add link to delete attachment - #ret << - ret << "" - ret << "" - ret << "" - end - - def link_filter_up(filter_id) - link_to(_('Up'), :controller=>"webmail", :action=>"filter_up", :id=>filter_id) - end - - def link_filter_down(filter_id) - link_to(_('Down'), :controller=>"webmail", :action=>"filter_down", :id=>filter_id) - end - - def link_filter_edit(filter_id) - link_to(_('Edit'), :controller=>"webmail", :action=>"filter", :id=>filter_id) - end - - def link_filter_delete(filter_id) - link_to(_('Delete'), :controller=>"webmail", :action=>"filter_delete", :id=>filter_id) - end - - def page_navigation_webmail(pages) - nav = "

" - - nav << "(#{pages.length} #{t :pages})   " - - window_pages = pages.current.window.pages - nav << "..." unless window_pages[0].first? - for page in window_pages - if pages.current == page - nav << page.number.to_s << " " - else - nav << link_to(page.number, :controller=>"webmail", :action=>'messages', :page=>page.number) << " " - end - end - nav << "..." unless window_pages[-1].last? - nav << "   " - - nav << link_to(t(:first), :controller=>"webmail", :action=>'messages', :page=>@pages.first.number) << " | " unless @pages.current.first? - nav << link_to(t(:prev), :controller=>"webmail", :action=>'messages', :page=>@pages.current.previous.number) << " | " if @pages.current.previous - nav << link_to(t(:next), :controller=>"webmail", :action=>'messages', :page=>@pages.current.next.number) << " | " if @pages.current.next - nav << link_to(t(:last), :controller=>"webmail", :action=>'messages', :page=>@pages.last.number) << " | " unless @pages.current.last? - - nav << "

" - - return nav - end - - def parse_subject(subject) - begin - if mime_encoded?(subject) - if mime_decode(subject) == '' - _('(No subject)') - else - mime_decode(subject) - end - else - if from_qp(subject) == '' - _('(No subject)') - else - from_qp(subject) - end - end - rescue Exception => ex - RAILS_DEFAULT_LOGGER.debug('Exception occured - #{ex}') - return "" - end - end - - def message_size(size) - if size / (1024*1024) > 0 - return "#{(size / (1024*1024)).round} MB" - elsif size / 1024 > 0 - return "#{(size / (1024)).round} KB" - else - return "#{size} B" - end - end - - private - - def empty_trash_link(folder_name) - link_to( "(#{t :empty})", - { :controller => "webmail", :action => "empty", :params=>{"folder_name"=>folder_name}}, - :confirm => t(:want_to_empty_trash_message)) - end -end diff --git a/app/models/contact.rb b/app/models/contact.rb deleted file mode 100755 index 97ffac8..0000000 --- a/app/models/contact.rb +++ /dev/null @@ -1,76 +0,0 @@ -require 'cdfutils' -require_association 'contact_group' - -class Contact < ActiveRecord::Base - - validate :check_fname_and_lname, :check_mail_cannot_be_changed - validate :check_email, :on => :create - - has_and_belongs_to_many :groups, :class_name => "ContactGroup", :join_table => "contact_contact_groups", :association_foreign_key => "contact_group_id", :foreign_key => "contact_id" - - # Finder methods follow - def Contact.find_by_user(user_id) - find(:all, :conditions => ["customer_id = ?", user_id], :order => "fname asc", :limit => 10) - end - - def Contact.find_by_user_email(user_id, email) - find(:first, :conditions => ["customer_id = #{user_id} and email = ?", email]) - end - - def Contact.find_by_group_user(user_id, grp_id) - result = Array.new - find(:all, :conditions => ["customer_id = ?", user_id], :order => "fname asc").each { |c| - begin - c.groups.find(grp_id) - result << c - rescue ActiveRecord::RecordNotFound - end - } - result - end - - scope :for_customer, lambda{ |customer_id| {:conditions => {:customer_id => customer_id}} } - scope :letter, lambda{ |letter| {:conditions => ["contacts.fname LIKE ?", "#{letter}%"]} } - - def Contact.find_by_user_letter(user_id, letter) - find_by_sql("select * from contacts where customer_id=#{user_id} and substr(UPPER(fname),1,1) = '#{letter}' order by fname") - end - - def full_name - "#{fname} #{lname}" - end - - def show_name - "#{fname} #{lname}" - end - - def full_address - "#{fname} #{lname}<#{email}>" - end - - protected - def check_fname_and_lname - errors.add 'fname', t(:validate_fname_error) unless self.fname =~ /^.{2,20}$/i - errors.add 'lname', t(:validate_lname_error) unless self.lname =~ /^.{2,20}$/i - end - - def check_mail_cannot_be_changed - # Contact e-mail cannot be changed - unless self.new_record? - old_record = Contact.find(self.id) - errors.add 'email', t(:contact_cannot_be_changed) unless old_record.email == self.email - end - end - - def check_mail - # Contact e-mail cannot be changed, so we only need to validate it on create - errors.add 'email', t(:validate_email_error) unless valid_email?(self.email) - # Already existing e-mail in contacts for this user is not allowed - if self.new_record? - if Contact.find :first, :conditions => {:email => email, :customer_id => customer_id} - errors.add('email', I18n.t(:email_exists)) - end - end - end - -end diff --git a/app/models/contact_group.rb b/app/models/contact_group.rb deleted file mode 100755 index 63da4c1..0000000 --- a/app/models/contact_group.rb +++ /dev/null @@ -1,30 +0,0 @@ -class ContactGroup < ActiveRecord::Base - has_and_belongs_to_many :contacts, :class_name => "Contact", :join_table => "contact_contact_groups", :association_foreign_key => "contact_id", :foreign_key => "contact_group_id" - - validate :check_group_name - validate :check_group_id, :on => :create - validate :check_group_uniqness, :on => :update - - def ContactGroup.find_by_user(user_id) - find_by_sql("select * from contact_groups where customer_id = #{user_id} order by name asc") - end - - protected - - def check_group_name - errors.add('name', t(:contactgroup_name_invalid)) unless self.name =~ /^.{1,50}$/i - end - - def check_group_id - if ContactGroup.find_first(["name = '#{name}' and customer_id = #{user_id}"]) - errors.add("name", _('Please enter group name (1 to 50 characters)')) - end - end - - def check_group_uniqness - if ContactGroup.find_first(["name = '#{name}' and customer_id = #{user_id} and id <> #{id}"]) - errors.add("name", _('You already have contact group with this name')) - end - end - -end diff --git a/app/models/customer.rb b/app/models/customer.rb deleted file mode 100755 index a9787a3..0000000 --- a/app/models/customer.rb +++ /dev/null @@ -1,32 +0,0 @@ -require_dependency 'maildropserializator' -class Customer < ActiveRecord::Base - include MaildropSerializator - - has_many :filters, :order => "order_num" - has_one :mail_pref - attr_accessor :password - - def mail_temporary_path - "#{CDF::CONFIG[:mail_temp_path]}/#{self.email}" - end - - def friendlly_local_email - encode_email("#{self.fname} #{self.lname}", check_for_domain(email)) - end - - def mail_filter_path - "#{CDF::CONFIG[:mail_filters_path]}/#{self.email}" - end - - def local_email - self.email - end - - def check_for_domain(email) - if email && !email.nil? && !email.include?("@") && CDF::CONFIG[:send_from_domain] - email + "@" + CDF::CONFIG[:send_from_domain] - else - email - end - end -end diff --git a/app/models/imap_message.rb b/app/models/imap_message.rb deleted file mode 100755 index 9231c07..0000000 --- a/app/models/imap_message.rb +++ /dev/null @@ -1,43 +0,0 @@ -require 'mail2screen' -class ImapMessage < ActiveRecord::Base - include Mail2Screen - - def set_folder(folder) - @folder = folder - end - - def full_body - @folder.mailbox.imap.uid_fetch(uid, "BODY[]").first.attr["BODY[]"] - end - - def from_addr=(fa) - self.from = fa.to_yaml - self.from_flat = short_address(fa) - end - - def from_addr - begin - YAML::load(from) - rescue Object - from - end - end - - def to_addr=(ta) - self.to = ta.to_yaml - self.to_flat = short_address(ta) - end - - def to_addr - begin - YAML::load(to) - rescue Object - to - end - end - - def self.getAll(userName,folderName,sortOrder='date desc') - self.all(:conditions => ["username = ? and folder_name = ?", userName, folderName],:order => sortOrder) - end - -end diff --git a/app/models/mail_pref.rb b/app/models/mail_pref.rb deleted file mode 100755 index 4eeca28..0000000 --- a/app/models/mail_pref.rb +++ /dev/null @@ -1,9 +0,0 @@ -# require_association 'customer' - -class MailPref < ActiveRecord::Base - belongs_to :customer - -# def MailPref.find_by_customer(customer_id) -# find :first, :conditions => (["customer_id = #{customer_id}"]) -# end -end diff --git a/app/views/contents_moved_to_original_theme_directory b/app/views/contents_moved_to_olive_theme_directory old mode 100644 new mode 100755 similarity index 100% rename from app/views/contents_moved_to_original_theme_directory rename to app/views/contents_moved_to_olive_theme_directory diff --git a/arts/logo2.xcf b/arts/logo2.xcf old mode 100644 new mode 100755 diff --git a/arts/logo3.xcf b/arts/logo3.xcf old mode 100644 new mode 100755 diff --git a/config.ru b/config.ru old mode 100755 new mode 100644 diff --git a/config/application.rb b/config/application.rb old mode 100755 new mode 100644 index 16387c7..2f9048c --- a/config/application.rb +++ b/config/application.rb @@ -15,9 +15,6 @@ module Mailr # Custom directories with classes and modules you want to be autoloadable. # config.autoload_paths += %W(#{config.root}/extras) - config.autoload_paths << Rails.root.join("vendor/ezcrypto-0.1.1/lib") - config.autoload_paths << Rails.root.join("lib/webmail") - # Only load the plugins named here, in the order given (default is alphabetical). # :all can be used as a placeholder for all plugins not explicitly named. # config.plugins = [ :exception_notification, :ssl_requirement, :all ] @@ -30,8 +27,8 @@ module Mailr # config.time_zone = 'Central Time (US & Canada)' # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. - #config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] - #config.i18n.default_locale = :en + # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] + # config.i18n.default_locale = :de # JavaScript files you want as :defaults (application.js is always included). # config.action_view.javascript_expansions[:defaults] = %w(jquery rails) @@ -41,23 +38,5 @@ module Mailr # Configure sensitive parameters which will be filtered from the log file. config.filter_parameters += [:password] - - default_config_path = 'config/default_site' - default_config = Rails.root.join(default_config_path) - require default_config - begin - require Rails.root.join("config/site") - CDF::CONFIG.update(CDF::LOCALCONFIG) if CDF::LOCALCONFIG - rescue LoadError - STDERR.puts 'WARNING: config/site.rb not found, using default settings from ' + default_config_path - end - - #if CONFIG[:locale] is nil then I18n.default_locale will be used - config.i18n.default_locale = CDF::CONFIG[:locale] - - require 'tmail_patch' - $KCODE = 'u' - require 'jcode' - end end diff --git a/config/boot.rb b/config/boot.rb old mode 100755 new mode 100644 diff --git a/config/database.yml.example b/config/database.yml.example old mode 100644 new mode 100755 diff --git a/config/default_site.rb b/config/default_site.rb deleted file mode 100755 index c76969d..0000000 --- a/config/default_site.rb +++ /dev/null @@ -1,52 +0,0 @@ -# Site-specific parameters -# These are Mailr constants. If you want to overwrite -# some of them - create file config/site.rb -# containing new constants in LOCALCONFIG module variable - they -# will overwrite default values. Example site.rb: -# -# module CDF -# LOCALCONFIG = { -# :mysql_version => '4.1', -# :default_encoding => 'utf-8', -# :imap_server => 'your.imap.server', -# :imap_auth => 'LOGIN' -# } -# end - -module CDF - CONFIG = { - :mysql_version => '4.0', - :default_language => 'en', - :default_encoding => 'ISO-8859-1', - :mail_charset => 'ISO-8859-1', - :mail_inbox => 'INBOX', - :mail_trash => 'INBOX.Trash', - :mail_sent => 'INBOX.Sent', - :mail_bulk_sent => "INBOX.SentBulk", - :mail_spam => "INBOX.Spam", - :mail_temp_path => 'mail_temp', - :mail_filters_path => '/home/vmail/mailfilters', - :mail_send_types => {"Plain text" => "text/plain", "HTML"=>"text/html", "HTML and PlainText" => "multipart"}, - :mail_message_rows => [5, 10, 15, 20, 25, 30, 50], - :mail_filters_fields => {'From' => '^From', 'To' => '^To', 'CC' => '^CC', 'Subject' => '^Subject', 'Body' => '^Body'}, - :mail_filters_expressions => ['contains', 'starts with'], - :mail_search_fields => ['FROM', 'TO', 'CC', 'SUBJECT', 'BODY'], - :temp_file_location => ".", - :contacts_per_page => 15, - :contact_letters => ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'], - :upload_file_temp_path => "/tmp", - :imap_server => 'localhost', - :imap_use_ssl => false, - :imap_port => 143, - :imap_auth => 'PLAIN', # 'LOGIN', 'NOAUTH' - :encryption_salt => 'EnCr1p10n$@lt', - :encryption_password => '$0MeEncr1pt10nP@a$sw0rd', - :debug_imap => false, - :crypt_session_pass => true, # Set it to false (in site.rb) if you get any error messages like - # "Unsupported cipher algorithm (aes-128-cbc)." - meaning that OpenSSL modules for crypt algo is not loaded. Setting it to false will store password in session in plain format! - :send_from_domain => nil, # Set this variable to your domain name in site.rb if you make login to imap only with username (without '@domain') - :imap_bye_timeout_retry_seconds => 2, - :default_theme => 'original' - } -end - diff --git a/config/defaults.yml b/config/defaults.yml new file mode 100644 index 0000000..99b94e0 --- /dev/null +++ b/config/defaults.yml @@ -0,0 +1,2 @@ +theme: olive +locale: en diff --git a/config/environment.rb b/config/environment.rb old mode 100755 new mode 100644 diff --git a/config/environments/development.rb b/config/environments/development.rb old mode 100755 new mode 100644 diff --git a/config/environments/production.rb b/config/environments/production.rb old mode 100755 new mode 100644 diff --git a/config/environments/test.rb b/config/environments/test.rb old mode 100755 new mode 100644 diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb old mode 100755 new mode 100644 diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb old mode 100755 new mode 100644 diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb old mode 100755 new mode 100644 diff --git a/config/initializers/pluralization.rb b/config/initializers/pluralization.rb deleted file mode 100755 index a119797..0000000 --- a/config/initializers/pluralization.rb +++ /dev/null @@ -1,36 +0,0 @@ -# config/initializers/pluralization.rb -module I18n::Backend::Pluralization - # rules taken from : http://www.gnu.org/software/hello/manual/gettext/Plural-forms.html - def pluralize(locale, entry, n) - return entry unless entry.is_a?(Hash) && n - if n == 0 && entry.has_key?(:zero) - key = :zero - else - key = case locale - when :pl # Polish - n==1 ? :one : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? :few : :other - when :cs, :sk # Czech, Slovak - n==1 ? :one : (n>=2 && n<=4) ? :few : :other - when lt # Lithuanian - n%10==1 && n%100!=11 ? :one : n%10>=2 && (n%100<10 || n%100>=20) ? :few : :other - when :lv # Latvian - n%10==1 && n%100!=11 ? :one : n != 0 ? :few : :other - when :ru, :uk, :sr, :hr # Russian, Ukrainian, Serbian, Croatian - n%10==1 && n%100!=11 ? :one : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? :few : :other - when :sl # Slovenian - n%100==1 ? :one : n%100==2 ? :few : n%100==3 || n%100==4 ? :many : :other - when :ro # Romanian - n==1 ? :one : (n==0 || (n%100 > 0 && n%100 < 20)) ? :few : :other - when :gd # Gaeilge - n==1 ? :one : n==2 ? :two : :other; - # add another language if you like... - else - n==1 ? :one : :other # default :en - end - end - raise InvalidPluralizationData.new(entry, n) unless entry.has_key?(key) - entry[key] - end -end - -I18n::Backend::Simple.send(:include, I18n::Backend::Pluralization) diff --git a/config/initializers/secret_token.rb b/config/initializers/secret_token.rb old mode 100755 new mode 100644 index d168e04..dbec6e1 --- a/config/initializers/secret_token.rb +++ b/config/initializers/secret_token.rb @@ -4,4 +4,4 @@ # If you change this key, all old signed cookies will become invalid! # Make sure the secret is at least 30 characters and all random, # no regular words or you'll be exposed to dictionary attacks. -Mailr::Application.config.secret_token = 'ade84d567b0c637fd3547fd18b97d1677fd6ca3c5331e6ed1a1b13bb6a7823cc367cbe317caf102f29f8c35eb487ff3ca33e6321d037c14ebb055eb530841ff6' +Mailr::Application.config.secret_token = 'f07b5830035b1471d3c008debde5c152077eaff97f0dfcebaf265fe96db24dc5af46eb27e149e3077df89d7dbe2eb088ab7ef7b0e8b496d7ca005e31f6dc3017' diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb old mode 100755 new mode 100644 index b5dbc5b..89479f4 --- a/config/initializers/session_store.rb +++ b/config/initializers/session_store.rb @@ -5,4 +5,4 @@ Mailr::Application.config.session_store :cookie_store, :key => '_mailr_session' # Use the database for sessions instead of the cookie-based default, # which shouldn't be used to store highly confidential information # (create the session table with "rails generate session_migration") -# Rails3::Application.config.session_store :active_record_store +# Mailr::Application.config.session_store :active_record_store diff --git a/config/locales/en.yml b/config/locales/en.yml index 0411e8b..7110637 100755 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -65,3 +65,6 @@ en: total_messages: Total messages unseen: Unseen please_login: Log in + site_link: https://github.com/lmanolov/mailr + user_logged_out: User was logged out + diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 857b72d..145ae75 100755 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -14,7 +14,7 @@ pl: filters: Filtry contacts: Kontakty search: Szukaj - search_txt: Szukaj w polu wiadomości + search_txt: ciąg znaków refresh: Odśwież operations: Akcje operations_txt: Akcje na zaznaczonych wiadomościach @@ -70,3 +70,8 @@ pl: add_to_contacts: Dodaj do kontaktów want_to_empty_trash_message: Czy chcesz opróznic kosz? site_link: https://github.com/lmanolov/mailr + marked_messages: zaznaczone wiadomości + to_folder: do folderu + message_field: Pole wiadomości + no_messages_found: Nie znaleziono żadnych wiadomości + diff --git a/config/routes.rb b/config/routes.rb old mode 100755 new mode 100644 index 80ae421..aa8dc28 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,26 +1,11 @@ Mailr::Application.routes.draw do - themes_for_rails - resources :folders - resources :contacts do - collection do - get :add_multiple - end - member do - get :add_from_mail - end - end + themes_for_rails - resources :contact_groups - match '/' => 'webmail#index' - match 'webmail' => 'webmail#index' - match 'webmail/:action' => 'webmail#index' - match '/contact/:action' => 'contacts#index' - match 'admin/main' => 'login#logout' - match ':controller/service.wsdl' => '#wsdl' - match '/:controller(/:action(/:id))' + get "core/login" + get "core/logout" + post "core/authenticate" -end # The priority is based upon order of creation: # first created -> highest priority. @@ -78,3 +63,4 @@ end # This is a legacy wild controller route that's not recommended for RESTful applications. # Note: This route will make all actions in every controller accessible via GET requests. # match ':controller(/:action(/:id(.:format)))' +end diff --git a/db/migrate/20090107193228_init.rb b/db/migrate/20090107193228_init.rb deleted file mode 100755 index 24d739c..0000000 --- a/db/migrate/20090107193228_init.rb +++ /dev/null @@ -1,66 +0,0 @@ -class Init < ActiveRecord::Migration - def self.up - create_table :customers do |t| - t.string :fname, :lname, :email - t.integer :customer_id - t.timestamps - end - - create_table :filters do |t| - t.string :name, :destination_folder - t.integer :customer_id, :order_num - t.timestamps - end - - create_table :expressions do |t| - t.string :field_name, :operator, :expr_value - t.integer :filter_id - t.boolean :case_sensitive - t.timestamps - end - - create_table :mail_prefs do |t| - t.string :mail_type - t.integer :wm_rows, :default => 20 - t.integer :customer_id - t.boolean :check_external_mail - t.timestamps - end - - create_table :contacts do |t| - t.string :fname, :lname, :email, :hphone, :wphone, :mobile, :fax - t.text :notes - t.integer :customer_id - t.timestamps - end - - create_table :contact_groups do |t| - t.string :name - t.integer :customer_id - t.timestamps - end - - create_table :contact_contact_groups do |t| - t.integer :contact_id, :contact_group_id - t.timestamps - end - - create_table :imap_messages do |t| - t.string :folder_name, :username, :msg_id, :from, :from_flat, :to, :to_flat, :subject, :content_type - t.integer :uid, :size - t.boolean :unread - t.datetime :date - end - end - - def self.down - drop_table :imap_messages - drop_table :contact_contact_groups - drop_table :contact_groups - drop_table :contacts - drop_table :mail_prefs - drop_table :expressions - drop_table :filters - drop_table :customers - end -end diff --git a/db/schema.rb b/db/schema.rb deleted file mode 100755 index 16e407a..0000000 --- a/db/schema.rb +++ /dev/null @@ -1,96 +0,0 @@ -# This file is auto-generated from the current state of the database. Instead -# of editing this file, please use the migrations feature of Active Record to -# incrementally modify your database, and then regenerate this schema definition. -# -# Note that this schema.rb definition is the authoritative source for your -# database schema. If you need to create the application database on another -# system, you should be using db:schema:load, not running all the migrations -# from scratch. The latter is a flawed and unsustainable approach (the more migrations -# you'll amass, the slower it'll run and the greater likelihood for issues). -# -# It's strongly recommended to check this file into your version control system. - -ActiveRecord::Schema.define(:version => 20090107193228) do - - create_table "contact_contact_groups", :force => true do |t| - t.integer "contact_id" - t.integer "contact_group_id" - t.datetime "created_at" - t.datetime "updated_at" - end - - create_table "contact_groups", :force => true do |t| - t.string "name" - t.integer "customer_id" - t.datetime "created_at" - t.datetime "updated_at" - end - - create_table "contacts", :force => true do |t| - t.string "fname" - t.string "lname" - t.string "email" - t.string "hphone" - t.string "wphone" - t.string "mobile" - t.string "fax" - t.text "notes" - t.integer "customer_id" - t.datetime "created_at" - t.datetime "updated_at" - end - - create_table "customers", :force => true do |t| - t.string "fname" - t.string "lname" - t.string "email" - t.integer "customer_id" - t.datetime "created_at" - t.datetime "updated_at" - end - - create_table "expressions", :force => true do |t| - t.string "field_name" - t.string "operator" - t.string "expr_value" - t.integer "filter_id" - t.boolean "case_sensitive" - t.datetime "created_at" - t.datetime "updated_at" - end - - create_table "filters", :force => true do |t| - t.string "name" - t.string "destination_folder" - t.integer "customer_id" - t.integer "order_num" - t.datetime "created_at" - t.datetime "updated_at" - end - - create_table "imap_messages", :force => true do |t| - t.string "folder_name" - t.string "username" - t.string "msg_id" - t.string "from" - t.string "from_flat" - t.string "to" - t.string "to_flat" - t.string "subject" - t.string "content_type" - t.integer "uid" - t.integer "size" - t.boolean "unread" - t.datetime "date" - end - - create_table "mail_prefs", :force => true do |t| - t.string "mail_type" - t.integer "wm_rows", :default => 20 - t.integer "customer_id" - t.boolean "check_external_mail" - t.datetime "created_at" - t.datetime "updated_at" - end - -end diff --git a/db/seeds.rb b/db/seeds.rb old mode 100755 new mode 100644 diff --git a/doc/README_FOR_APP b/doc/README_FOR_APP old mode 100755 new mode 100644 diff --git a/lib/cdfutils.rb b/lib/cdfutils.rb deleted file mode 100755 index e780a01..0000000 --- a/lib/cdfutils.rb +++ /dev/null @@ -1,183 +0,0 @@ -MIME_ENCODED = /=\?([a-z\-0-9]*)\?[QB]\?([a-zA-Z0-9+\/=\_\-]+)\?=/i -IMAP_EMAIL_ENVELOPE_FORMAT = /([a-zA-Z\-\.\_]*@[a-zA-Z\-\.\_]*)/ -IMAP_EMAIL_ENVELOPE_FORMAT2 = /(.*)<([a-zA-Z\-\.\_]*@[a-zA-Z\-\.\_]*)>/ - -require 'iconv' - -def valid_email?(email) - email.size < 100 && email =~ /.@.+\../ && email.count('@') == 1 -end - -def mime_encoded?( str ) - return false if str.nil? - not (MIME_ENCODED =~ str).nil? -end - -def from_qp(str, remove_underscore = true) - return '' if str.nil? - result = str.gsub(/=\r\n/, "") - result = result.gsub(/_/, " ") if remove_underscore - result.gsub!(/\r\n/m, $/) - result.gsub!(/=([\da-fA-F]{2})/) { $1.hex.chr } - result -end - -def mime_decode(str, remove_underscore = true) - return '' if str.nil? - str.gsub(MIME_ENCODED) {|s| - enc = s.scan(MIME_ENCODED).flatten - if /\?Q\?/i =~ s - begin - Iconv.conv("UTF-8", enc[0], from_qp(enc[1], remove_underscore)) - rescue - from_qp(enc[1], remove_underscore) - end - else - begin - Iconv.conv("UTF-8", enc[0], enc[1].unpack("m*").to_s) - rescue - enc[1].unpack("m*").to_s - end - end - } -end - -def imap2friendlly_email(str) - begin - if str === IMAP_EMAIL_ENVELOPE_FORMAT - email = str.scan(IMAP_EMAIL_ENVELOPE_FORMAT)[0][0] - else - email = str.scan(IMAP_EMAIL_ENVELOPE_FORMAT2)[0][0] - end - name = str.slice(0, str.rindex(email)-1) - name = decode(name).to_s if mime_encoded?(name) - return "#{name.nil? ? '' : name.strip}<#{email}>" - rescue - "Error parsing str - #{str.scan(IMAP_EMAIL_ENVELOPE_FORMAT)} - #{str.scan(IMAP_EMAIL_ENVELOPE_FORMAT2)}" - end -end - -def imap2friendlly_name(str) - begin - email = str.scan(IMAP_EMAIL_ENVELOPE_FORMAT)[0][0] - name = str.slice(0, str.rindex(email)) - if name.nil? or name.strip == "" - return email - else - return name - end - rescue - str - end -end - -def imap2friendlly_full_name(str) - begin - email = str.scan(IMAP_EMAIL_ENVELOPE_FORMAT)[0][0] - name = str.slice(0, str.rindex(email)) - if name.nil? or name.strip == "" - return email - else - return "#{name}<#{email}>" - end - rescue - str - end -end - -def imap2name_only(str) - email = str.scan(IMAP_EMAIL_ENVELOPE_FORMAT)[0][0] - name = str.slice(0, str.rindex(email)) - return "#{name.nil? ? '' : name.strip}" -end - -def imap2time(str) - begin - vals = str.scan(/(...), (.?.) (...) (....) (..):(..):(..) (.*)/)[0] - Time.local(vals[3],vals[2],vals[1],vals[4],vals[5],vals[6]) - rescue - Time.now - end -end - -def encode_email(names, email) - nameen = "" - names.each_byte { | ch | nameen = nameen +"=" + sprintf("%X",ch) } - return "=?#{CDF::CONFIG[:mail_charset]}?Q?#{nameen}?= <#{email}>" -end - -# ############################# -# HTML utils -# ############################# -def replace_tag(tag, attrs) - replacements = {"body" => "", - "/body" => "", - "meta" => "", - "/meta" => "", - "head" => "", - "/head" => "", - "html" => "", - "/html" => "", - "title" => "
", - "/title" => "
", - "div" => "", - "/div" => "", - "span" => "", - "/span" => "", - "layer" => "", - "/layer" => "", - "br" => "
", - "/br" => "
", - "iframe" => "", - "/iframe" => "", - "link" => "", - "/link" => "", - "style" => "
", - "/style" => "
", - "script" => "
", - "/script" => "
" } - replacements.fetch(tag.downcase, ("<" << tag.downcase << replace_attr(attrs) << ">")) -end - -def replace_attr(attrs) - if attrs - attrs.downcase.gsub("onload", "onfilter"). - gsub("onclick", "onfilter"). - gsub("onkeypress", "onfilter"). - gsub("javascript", "_javascript"). - gsub("JavaScript", "_javascript") - else - "" - end -end - -def clear_html(text) - attribute_key = /[\w:_-]+/ - attribute_value = /(?:[A-Za-z0-9\-_#\%\.,\/\:]+|(?:'[^']*?'|"[^"]*?"))/ - attribute = /(?:#{attribute_key}(?:\s*=\s*#{attribute_value})?)/ - attributes = /(?:#{attribute}(?:\s+#{attribute})*)/ - tag_key = attribute_key - tag = %r{<([!/?\[]?(?:#{tag_key}|--))((?:\s+#{attributes})?\s*(?:[!/?\]]+|--)?)>} - text.gsub(tag, '').gsub(/\s+/, ' ').strip - CGI::escape(text) -end - -def strip_html(text) - attribute_key = /[\w:_-]+/ - attribute_value = /(?:[A-Za-z0-9\-_#\%\.,\/\:]+|(?:'[^']*?'|"[^"]*?"))/ - attribute = /(?:#{attribute_key}(?:\s*=\s*#{attribute_value})?)/ - attributes = /(?:#{attribute}(?:\s+#{attribute})*)/ - tag_key = attribute_key - tag = %r{<([!/?\[]?(?:#{tag_key}|--))((?:\s+#{attributes})?\s*(?:[!/?\]]+|--)?)>} - res = text.gsub(tag) { |match| - ret = "" - match.scan(tag) { |token| - ret << replace_tag(token[0], token[1]) - } - ret - } - # remove doctype tags - xattributes = /(?:#{attribute_value}(?:\s+#{attribute_value})*)/ - xtag = %r{} - res.gsub(xtag, '') -end diff --git a/lib/imap_utils.rb b/lib/imap_utils.rb deleted file mode 100755 index d38fb20..0000000 --- a/lib/imap_utils.rb +++ /dev/null @@ -1,69 +0,0 @@ -module ImapUtils - private - - def load_imap_session - return if ['error_connection'].include?(action_name) - get_imap_session - end - - def get_imap_session - begin - @mailbox = IMAPMailbox.new(self.logger) - uname = (get_mail_prefs.check_external_mail == 1 ? user.email : user.local_email) - upass = get_upass - @mailbox.connect(uname, upass) - load_folders - rescue Exception => ex -# logger.error("Exception on loggin webmail session - #{ex} - #{ex.backtrace.join("\t\n")}") -# render :action => "error_connection" - render :text => ex.inspect, :content_type => 'text/plain' - end - end - - def close_imap_session - return if @mailbox.nil? or not(@mailbox.connected) - @mailbox.disconnect - @mailbox = nil - end - - def get_mail_prefs - if not(@mailprefs) - if not(@mailprefs = MailPref.find_by_customer_id(logged_customer)) - @mailprefs = MailPref.create("customer_id"=>logged_customer) - end - end - @mailprefs - end - - def get_upass - if CDF::CONFIG[:crypt_session_pass] - EzCrypto::Key.decrypt_with_password(CDF::CONFIG[:encryption_password], CDF::CONFIG[:encryption_salt], session["wmp"]) - else - # retrun it plain - session["wmp"] - end - end - - def load_folders - if have_to_load_folders?() - if params["folder_name"] - @folder_name = params["folder_name"] - else - @folder_name = session["folder_name"] ? session["folder_name"] : CDF::CONFIG[:mail_inbox] - end - session["folder_name"] = @folder_name - @folders = @mailbox.folders if @folders.nil? - end - end - - def user - @user = Customer.find(logged_customer) if @user.nil? - @user - end - - def have_to_load_folders? - return true if ['messages', 'delete', 'reply', 'forward', 'empty', 'message', 'download', - 'filter', 'filter_add', 'view_source', 'compose', 'prefs', 'filters'].include?(action_name) - return false - end -end diff --git a/lib/tasks/.gitkeep b/lib/tasks/.gitkeep old mode 100755 new mode 100644 diff --git a/lib/tmail_patch.rb b/lib/tmail_patch.rb deleted file mode 100755 index bb86dd7..0000000 --- a/lib/tmail_patch.rb +++ /dev/null @@ -1,38 +0,0 @@ -module TMail - class Mail - def parse_header( f ) - name = field = nil - unixfrom = nil - - while line = f.gets - case line - when /\A[ \t]/ # continue from prev line - raise SyntaxError, 'mail is began by space' unless field - field << ' ' << line.strip - - when /\A([^\: \t]+):\s*/ # new header line - add_hf name, field if field - name = $1 - field = $' #.strip - - when /\A\-*\s*\z/ # end of header - add_hf name, field if field - name = field = nil - break - - when /\AFrom (\S+)/ - unixfrom = $1 - else - # treat as continue from previos - raise SyntaxError, 'mail is began by space' unless field - field << ' ' << line.strip - end - end - add_hf name, field if name - - if unixfrom - add_hf 'Return-Path', "<#{unixfrom}>" unless @header['return-path'] - end - end - end -end diff --git a/lib/webmail/bounced_mail.rb b/lib/webmail/bounced_mail.rb deleted file mode 100755 index 3b30562..0000000 --- a/lib/webmail/bounced_mail.rb +++ /dev/null @@ -1,8 +0,0 @@ -class BouncedMail < ActiveRecord::Base - belongs_to :customer - belongs_to :contact - - def BouncedMail.find_by_customer_contact(cust_id, contact_id) - find_all(["customer_id = ? and contact_id = ?", cust_id, cotact_id], ["msg_date desc"]) - end -end diff --git a/lib/webmail/cdfmail.rb b/lib/webmail/cdfmail.rb deleted file mode 100755 index 28ad051..0000000 --- a/lib/webmail/cdfmail.rb +++ /dev/null @@ -1,306 +0,0 @@ -require 'tmail' -require 'net/smtp' -require 'mail_transform' - -module CDF -end - -class CDF::Mail - #include ActionMailer::Quoting #upgrade to Rails3 - - def initialize(senderTempLocation) - @attachments = Array.new - @sender_temp_location = senderTempLocation - @to_contacts = Array.new - end - - def customer_id() @customer_id end - - def customer_id=(arg) @customer_id = arg end - - def from() @from end - - def from=(arg) @from = arg end - - def to() @to end - - def to=(arg) @to = arg end - - def to_contacts() @to_contacts end - - def to_contacts=(arg) @to_contacts = arg end - - def toc=(arg) - @to_contacts = Array.new - arg.split(",").each { |token| @to_contacts << token.to_i unless token == "" or token.strip() == "undefined"} unless arg.nil? or arg == "undefined" - end - - def toc - ret = String.new - @to_contacts.each { |contact| - ret << "," unless ret == "" - if contact.kind_of?(Integer) - ret << contact.to_s unless contact.nil? or contact == 0 - else - ret << contact.id.to_s unless contact.nil? or contact.id.nil? - end - } - ret - end - - def bcc() @bcc end - - def bcc=(arg) @bcc = arg end - - def cc() @cc end - - def cc=(arg) @cc = arg end - - def subject() @subject end - - def subject=(arg) @subject = arg end - - def attachments - @attachments - end - - def add_attachment(attachment) - @attachments << attachment - end - - def multipart? - @attachments && @attachments.size > 0 - end - - def delete_attachment(att_filename) - @attachments.each { |att| att.delete_temp_data() if arr.filename == att_filename } - @attachments.delete_if() { |att| att.filename == att_filename } - end - - def delete_attachments() - @attachments.each { |att| att.delete_temp_data() } - @attachments = Array.new - end - - def body() @body end - - def body=(arg) @body = arg end - - def content_type() @content_type end - - def content_type=(arg) @content_type = arg end - - def temp_location() @sender_temp_location end - - def send_mail(db_msg_id = 0) - m = TMail::Mail.new - m.from, m.body = self.from, self.body - m.date = Time.now - m.subject, = quote_any_if_necessary("UTF-8", self.subject) - m.to = decode_addresses(self.to) - - m.cc, m.bcc = decode_addresses(self.cc), decode_addresses(self.bcc) - - if multipart? - m.set_content_type("multipart/mixed") - p = TMail::Mail.new(TMail::StringPort.new("")) - if @content_type.include?("text/plain") # here maybe we should encode in 7bit??!! - prepare_text(p, self.content_type, self.body) - elsif self.content_type.include?("text/html") - prepare_html(p, self.content_type, self.body) - elsif self.content_type.include?("multipart") - prepare_alternative(p, self.body) - end - m.parts << p - else - if @content_type.include?("text/plain") # here maybe we should encode in 7bit??!! - prepare_text(m, self.content_type, self.body) - elsif self.content_type.include?("text/html") - prepare_html(m, self.content_type, self.body) - elsif self.content_type.include?("multipart") - prepare_alternative(m, self.body) - end - end - # attachments - @attachments.each { |a| - m.parts << a.encoded - } - encmail = m.encoded - RAILS_DEFAULT_LOGGER.debug("Sending message \n #{encmail}") - Net::SMTP.start(ActionMailer::Base.smtp_settings[:address], ActionMailer::Base.smtp_settings[:port], - ActionMailer::Base.smtp_settings[:domain], ActionMailer::Base.smtp_settings[:user_name], - ActionMailer::Base.smtp_settings[:password], ActionMailer::Base.smtp_settings[:authentication]) do |smtp| - smtp.sendmail(encmail, m.from, m.destinations) - end - return encmail - end - - def forward(tmail, fb) - decoded_subject = mime_encoded?(tmail.subject) ? mime_decode(tmail.subject) : tmail.subject - self.subject = "[Fwd: #{decoded_subject}]" - attachment = CDF::Attachment.new(self) - attachment.body(tmail, fb) - end - - def reply(tmail, fb, type) - decoded_subject = mime_encoded?(tmail.subject) ? mime_decode(tmail.subject) : tmail.subject - self.subject = "Re: #{decoded_subject}" - tm = tmail.create_reply - self.to = tm.to - footer = "" - msg_id = "" - mt = MailTransform.new - self.body = mt.get_body(tmail, type) - end - - private - - def delimeter - if self.content_type == "text/plain" - "\n" - else - "
" - end - end - - def text2html(str) CGI.escapeHTML(str).gsub("\n", "
") end - - def html2text(txt) - clear_html(txt) - end - - def prepare_text(msg, ctype, bdy) - msg.set_content_type(ctype, nil, {"charset"=>"utf-8"}) - msg.transfer_encoding = "8bit" - msg.body = bdy - end - - def prepare_html(msg, ctype, bdy) - msg.set_content_type(ctype, nil, {"charset"=>"utf8"}) - msg.transfer_encoding = "8bit" - msg.body = bdy - end - - def prepare_alternative(msg, bdy) - bound = ::TMail.new_boundary - - msg.set_content_type("multipart/alternative", nil, {"charset"=>"utf8", "boundary"=>bound}) - msg.transfer_encoding = "8bit" - - ptext = TMail::Mail.new(TMail::StringPort.new("")) - phtml = TMail::Mail.new(TMail::StringPort.new("")) - - prepare_text(ptext, "text/plain", html2text(bdy)) - prepare_html(phtml, "text/html", bdy) - - msg.parts << ptext - msg.parts << phtml - end - - def decode_addresses(str) - ret = String.new - str.split(",").each { |addr| - if addr.slice(0,4) == "Grp+" - grp_id = addr.scan(/Grp\+([0-9]*):(.*)/)[0][0] - ContactGroup.find(:first, :conditions=>['customer_id = ? and id = ?', @customer_id, grp_id]).contacts.each { |contact| - ret << "," if not(ret == "") - @to_contacts << contact unless contact.nil? - ret << contact.full_address - ad, = quote_any_address_if_necessary(CDF::CONFIG[:mail_charset], contact.full_address) - ret << ad - } - else - ret << "," if not(ret == "") - ad, = quote_any_address_if_necessary(CDF::CONFIG[:mail_charset], addr) if not(addr.nil? or addr == "") - ret << ad if not(addr.nil? or addr == "") - end - } unless str.nil? or str.strip() == "" - ret - end -end - -class CDF::Attachment - - def initialize(arg) - @mail = arg - @mail.add_attachment(self) - @index = @mail.attachments.size - 1 - end - - def filename=(arg) - @filename = arg.tr('\\/:*?"\'<>|', '__________') - end - - def filename() @filename end - - def temp_filename=(arg) @temp_filename = arg end - - def temp_filename() @temp_filename end - - def content_type=(arg) @content_type = arg end - - def content_type() @content_type end - - def delete_temp_data() - File.delete(self.temp_filename) - end - - def file - File.open(self.temp_filename, "rb") { |fp| fp.read } - end - - def file=(data) - return if data.size == 0 - @content_type = data.content_type - self.filename = data.original_filename.scan(/[^\\]*$/).first - self.temp_filename = "#{@mail.temp_location}/#{@filename}" - check_store_path - data.rewind - File.open(@temp_filename, "wb") { |f| f.write(data.read) } - end - - def body(data, fb) - @content_type = "message/rfc822" - filename = data.content_type['filename'] - self.filename = filename.nil? ? (mime_encoded?(data.subject) ? mime_decode(data.subject) : data.subject) : filename - self.temp_filename = "#{@mail.temp_location}/#{@filename}" - check_store_path - File.open(@temp_filename, "wb") { |f| f.write(fb) } - end - - def check_store_path() - path = "" - "#{@mail.temp_location}".split(File::SEPARATOR).each { |p| - path << p - begin - Dir.mkdir(path) - rescue - end - path << File::SEPARATOR - } - end - - def encoded - p = TMail::Mail.new(TMail::StringPort.new("")) - data = self.file - p.body = data - if @content_type.include?("text/plain") # here maybe we should encode in 7bit??!! - p.set_content_type(@content_type, nil, {"charset"=>"utf-8"}) - p.transfer_encoding = "8bit" - elsif @content_type.include?("text/html") - p.set_content_type(@content_type, nil, {"charset"=>"utf8"}) - p.transfer_encoding = "8bit" - elsif @content_type.include?("rfc822") - p.set_content_type(@content_type, nil, {"charset"=>"utf8"}) - p.set_disposition("inline;") - p.transfer_encoding = "8bit" - else - p.set_content_type(@content_type, nil, {"name"=>@filename}) - p.set_disposition("inline; filename=#{@filename}") unless @filename.nil? - p.set_disposition("inline;") if @filename.nil? - p.transfer_encoding='Base64' - p.body = TMail::Base64.folding_encode(data) - end - return p - end -end diff --git a/lib/webmail/environment.rb b/lib/webmail/environment.rb deleted file mode 100755 index 46ce795..0000000 --- a/lib/webmail/environment.rb +++ /dev/null @@ -1,5 +0,0 @@ -require 'maildropserializator' -Customer.class_eval do - include MaildropSerializator - has_many :filters, :order => "order_num", :dependent => true -end \ No newline at end of file diff --git a/lib/webmail/expression.rb b/lib/webmail/expression.rb deleted file mode 100755 index 868588b..0000000 --- a/lib/webmail/expression.rb +++ /dev/null @@ -1,2 +0,0 @@ -class Expression < ActiveRecord::Base -end diff --git a/lib/webmail/filter.rb b/lib/webmail/filter.rb deleted file mode 100755 index 22dd703..0000000 --- a/lib/webmail/filter.rb +++ /dev/null @@ -1,3 +0,0 @@ -class Filter < ActiveRecord::Base - has_many :expressions -end diff --git a/lib/webmail/imap_message.rb b/lib/webmail/imap_message.rb deleted file mode 100755 index da0b989..0000000 --- a/lib/webmail/imap_message.rb +++ /dev/null @@ -1,38 +0,0 @@ -require 'mail2screen' -class ImapMessage < ActiveRecord::Base - include Mail2Screen - - def set_folder(folder) - @folder = folder - end - - def full_body - @folder.mailbox.imap.uid_fetch(uid, "BODY[]").first.attr["BODY[]"] - end - - def from_addr=(fa) - self.from = fa.to_yaml - self.from_flat = short_address(fa) - end - - def from_addr - begin - YAML::load(from) - rescue Object - from - end - end - - def to_addr=(ta) - self.to = ta.to_yaml - self.to_flat = short_address(ta) - end - - def to_addr - begin - YAML::load(to) - rescue Object - to - end - end -end \ No newline at end of file diff --git a/lib/webmail/imapmailbox.rb b/lib/webmail/imapmailbox.rb deleted file mode 100755 index 24d7345..0000000 --- a/lib/webmail/imapmailbox.rb +++ /dev/null @@ -1,526 +0,0 @@ -# Copyright (c) 2005, Benjamin Stiglitz -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -# Modifications (c) 2005 by littlegreen -# -require 'net/imap' - -Net::IMAP.debug = true if CDF::CONFIG[:debug_imap] - -class Net::IMAP - class PlainAuthenticator - def process(data) - return "\0#{@user}\0#{@password}" - end - - private - def initialize(user, password) - @user = user - @password = password - end - end - add_authenticator('PLAIN', PlainAuthenticator) - - class Address - def to_s - if(name) - "#{name} #{mailbox}@#{host}" - else - "#{mailbox}@#{host}" - end - end - end -end - -class AuthenticationError < RuntimeError -end - -class IMAPMailbox - attr_reader :connected - attr_accessor :selected_mailbox - cattr_accessor :logger - - def initialize(logger) - @selected_mailbox = '' - @folders = {} - @connected = false - @logger = logger - end - - def connect(username, password) - #logger.debug "*** connect: @connected" - unless @connected - use_ssl = CDF::CONFIG[:imap_use_ssl] ? true : false - port = CDF::CONFIG[:imap_port] || (use_ssl ? 993 : 143) - # logger.debug "*** IMAP params: use_ssl => #{use_ssl}, port => #{port}" - begin - @imap = Net::IMAP.new(CDF::CONFIG[:imap_server], port, use_ssl) - rescue Net::IMAP::ByeResponseError => bye - # make a timeout and retry - begin - System.sleep(CDF::CONFIG[:imap_bye_timeout_retry_seconds]) - @imap = Net::IMAP.new(CDF::CONFIG[:imap_server], port, use_ssl) - rescue Error => ex - # logger.error "Error on authentication!" - # logger.error bye.backtrace.join("\n") - raise AuthenticationError.new - end - rescue Net::IMAP::NoResponseError => noresp - # logger.error "Error on authentication!" - # logger.error noresp.backtrace.join("\n") - raise AuthenticationError.new - rescue Net::IMAP::BadResponseError => bad - # logger.error "Error on authentication!" - # logger.error bad.backtrace.join("\n") - raise AuthenticationError.new - rescue Net::IMAP::ResponseError => resp - # logger.error "Error on authentication!" - # logger.error resp.backtrace.join("\n") - raise AuthenticationError.new - end - @username = username - begin - # logger.error "IMAP authentication - #{CDF::CONFIG[:imap_auth]}." - if CDF::CONFIG[:imap_auth] == 'NOAUTH' - @imap.login(username, password) - else - @imap.authenticate(CDF::CONFIG[:imap_auth], username, password) - end - @connected = true - rescue Exception => ex - # logger.error "Error on authentication!" - # logger.error ex.backtrace.join("\n") - raise AuthenticationError.new - end - end - end - - def imap - @imap - end - - # Function chnage password works only if root has run imap_backend - # and users courier-authlib utility authtest - from courier-imap version 4.0.1 - def change_password(username, password, new_password) - ret = "" - cin, cout, cerr = Open3.popen3("/usr/sbin/authtest #{username} #{password} #{new_password}") - ret << cerr.gets - if ret.include?("Password change succeeded.") - return true - else - logger.error "[!] Error on change password! - #{ret}" - return false - end - end - - def disconnect - if @connected - @imap.logout - #@imap.disconnect - @imap = nil - @connected = false - end - end - - def [](mailboxname) - @last_folder = IMAPFolderList.new(self, @username)[mailboxname] - end - - def folders - # reference just to stop GC - @folder_list ||= IMAPFolderList.new(self, @username) - @folder_list - end - - def reload - @folder_list.reload if @folder_list - end - - def create_folder(name) -# begin - @imap.create(Net::IMAP.encode_utf7(name)) - reload -# rescue Exception=>e -# end - end - - def delete_folder(name) - begin - @imap.delete(folders[name].utf7_name) - reload - rescue Exception=>e - logger.error("Exception on delete #{name} folder #{e}") - end - end - - def message_sent(message) - # ensure we have sent folder - begin - @imap.create(CDF::CONFIG[:mail_sent]) - rescue Exception=>e - end - begin - @imap.append(CDF::CONFIG[:mail_sent], message) - folders[CDF::CONFIG[:mail_sent]].cached = false if folders[CDF::CONFIG[:mail_sent]] - rescue Exception=>e - logger.error("Error on append - #{e}") - end - - end - - def message_bulk(message) - # ensure we have sent folder - begin - @imap.create(CDF::CONFIG[:mail_bulk_sent]) - rescue Exception=>e - end - begin - @imap.append(CDF::CONFIG[:mail_bulk_sent], message) - folders[CDF::CONFIG[:mail_sent]].cached = false if folders[CDF::CONFIG[:mail_bulk_sent]] - rescue Exception=>e - logger.error("Error on bulk - #{e}") - end - end -end - -class IMAPFolderList - include Enumerable - cattr_accessor :logger - - def initialize(mailbox, username) - @mailbox = mailbox - @folders = Hash.new - @username = username - end - - def each - refresh if @folders.empty? - #@folders.each_value { |folder| yield folder } - # We want to allow sorted access; for now only (FIXME) - - @folders.sort.each { |pair| yield pair.last } - end - - def reload - refresh - end - - def [](name) - refresh if @folders.empty? - @folders[name] - end - - private - def refresh - @folders = {} - result = @mailbox.imap.list('', '*') - if result - result.each do |info| - folder = IMAPFolder.new(@mailbox, info.name, @username, info.attr, info.delim) - @folders[folder.name] = folder - end - else - # if there are no folders subscribe to INBOX - this is on first use - @mailbox.imap.subscribe(CDF::CONFIG[:mail_inbox]) - # try again to list them - we should find INBOX - @mailbox.imap.list('', '*').each do |info| - @folders[info.name] = IMAPFolder.new(@mailbox, info.name, @username, info.attr, info.delim) - end - end - @folders - end -end - -class IMAPFolder - attr_reader :mailbox - attr_reader :name - attr_reader :utf7_name - attr_reader :username - attr_reader :delim - attr_reader :attribs - - attr_writer :cached - attr_writer :mcached - - cattr_accessor :logger - - @@fetch_attr = ['ENVELOPE','BODYSTRUCTURE', 'FLAGS', 'UID', 'RFC822.SIZE'] - - def initialize(mailbox, utf7_name, username, attribs, delim) - @mailbox = mailbox - @utf7_name = utf7_name - @name = Net::IMAP.decode_utf7 utf7_name - @username = username - @messages = Array.new - @delim = delim - @attribs = attribs - @cached = false - @mcached = false - end - - def activate - if(@mailbox.selected_mailbox != @name) - @mailbox.selected_mailbox = @name - @mailbox.imap.select(@utf7_name) - load_total_unseen if !@cached - end - end - - # Just delete message without interaction with Trash folder - def delete(message) - activate - uid = (message.kind_of?(Integer) ? message : message.uid) - @mailbox.imap.uid_store(uid, "+FLAGS", :Deleted) - @mailbox.imap.expunge - # Sync with trash cannot be made - new uid generated - so just delete message from current folder - ImapMessage.delete_all(["username = ? and folder_name = ? and uid = ?", @username, @name, uid]) - @cached = false - end - - # Deleted messages - move to trash folder - def delete_multiple(uids) - # ensure we have trash folder - begin - @mailbox.imap.create(CDF::CONFIG[:mail_trash]) - rescue - end - move_multiple(uids, CDF::CONFIG[:mail_trash]) - end - - def copy(message, dst_folder) - uid = (message.kind_of?(Integer) ? message : message.uid) - activate - @mailbox.imap.uid_copy(uid, dst_folder) - @mailbox.folders[dst_folder].cached = false if @mailbox.folders[dst_folder] - @mailbox.folders[dst_folder].mcached = false if @mailbox.folders[dst_folder] - end - - def copy_multiple(message_uids, dst_folder) - activate - @mailbox.imap.uid_copy(message_uids, dst_folder) - @mailbox.folders[dst_folder].cached = false if @mailbox.folders[dst_folder] - @mailbox.folders[dst_folder].mcached = false if @mailbox.folders[dst_folder] - end - - def move(message, dst_folder) - uid = (message.kind_of?(Integer) ? message : message.uid) - activate - @mailbox.imap.uid_copy(uid, dst_folder) - @mailbox.imap.uid_store(uid, "+FLAGS", :Deleted) - @mailbox.folders[dst_folder].cached = false if @mailbox.folders[dst_folder] - @mailbox.folders[dst_folder].mcached = false if @mailbox.folders[dst_folder] - @mailbox.imap.expunge - ImapMessage.delete_all(["username = ? and folder_name = ? and uid = ? ", @username, @name, uid]) - @cached = false - @mcached = false - end - - def move_multiple(message_uids, dst_folder) - activate - @mailbox.imap.uid_copy(message_uids, @mailbox.folders[dst_folder].utf7_name) - @mailbox.imap.uid_store(message_uids, "+FLAGS", :Deleted) - @mailbox.folders[dst_folder].cached = false if @mailbox.folders[dst_folder] - @mailbox.folders[dst_folder].mcached = false if @mailbox.folders[dst_folder] - @mailbox.imap.expunge - ImapMessage.delete_all(["username = ? and folder_name = ? and uid in ( ? )", @username, @name, message_uids]) - @cached = false - @mcached = false - end - - def mark_read(message_uid) - activate - cached = ImapMessage.find(:first, :conditions => ["username = ? and folder_name = ? and uid = ?", @username, @name, message_uid]) - if cached.unread - cached.unread = false - cached.save - @mailbox.imap.select(@name) - @mailbox.imap.uid_store(message_uid, "+FLAGS", :Seen) - @unseen_messages = @unseen_messages - 1 - end - end - - def mark_unread(message_uid) - activate - cached = ImapMessage.find(:first, :conditions => ["username = ? and folder_name = ? and uid = ?", @username, @name, message_uid]) - if !cached.unread - cached.unread = true - cached.save - @mailbox.imap.select(@name) - @mailbox.imap.uid_store(message_uid, "-FLAGS", :Seen) - @unseen_messages = @unseen_messages + 1 - end - end - - def expunge - activate - @mailbox.imap.expunge - end - - def synchronize_cache(offset=0, limit = 10) - to = limit+offset - startSync = Time.now - activate - startUidFetch = Time.now - - #Count all messages - count = @mailbox.imap.fetch(1..-1, "UID") - to = count.size if count.size < to - - - range = (offset..to) - #logger.info range.inspect - - server_messages = @mailbox.imap.fetch(range, "(UID FLAGS)") - #server_messages = @mailbox.imap.uid_fetch(sequence_uids, ["UID", "FLAGS"]) - - startDbFetch = Time.now - cached_messages = ImapMessage.find(:all, :conditions => ["username = ? and folder_name = ?", @username, @name]) - - cached_unread_uids = Array.new - cached_read_uids = Array.new - uids_to_be_deleted = Array.new - - cached_messages.each { |msg| - cached_unread_uids << msg.uid if msg.unread - cached_read_uids << msg.uid unless msg.unread - uids_to_be_deleted << msg.uid - } - - uids_to_be_fetched = Array.new - server_msg_uids = Array.new - - uids_unread = Array.new - uids_read = Array.new - - server_messages.each { |server_msg| - uid, flags = server_msg.attr['UID'], server_msg.attr['FLAGS'] - server_msg_uids << uid - unless uids_to_be_deleted.include?(uid) - uids_to_be_fetched << uid - else - if flags.member?(:Seen) && cached_unread_uids.include?(uid) - uids_read << uid - elsif !flags.member?(:Seen) && cached_read_uids.include?(uid) - uids_unread << uid - end - end - uids_to_be_deleted.delete(uid) - } unless server_messages.nil? - - ImapMessage.delete_all(["username = ? and folder_name = ? and uid in ( ? )", @username, @name, uids_to_be_deleted]) unless uids_to_be_deleted.empty? - ImapMessage.update_all('unread = 0', ["username = ? and folder_name = ? and uid in ( ? )", @username, @name, uids_read]) unless uids_read.empty? - ImapMessage.update_all('unread = 1', ["username = ? and folder_name = ? and uid in ( ? )", @username, @name, uids_unread]) unless uids_unread.empty? - - - # fetch and store not cached messages - unless uids_to_be_fetched.empty? - # logger.debug("About to fetch #{uids_to_be_fetched.join(",")}") - uids_to_be_fetched.each_slice(20) do |slice| - fetch_uids(slice) - end - end - #FIX: @mcached = true - # logger.debug("Synchonization done for folder #{@name} in #{Time.now - startSync} ms.") - end - - def fetch_uids(uids) - imapres = @mailbox.imap.uid_fetch(uids, @@fetch_attr) - imapres.each { |cache| - envelope = cache.attr['ENVELOPE']; - message = ImapMessage.create( :folder_name => @name, - :username => @username, - :msg_id => envelope.message_id, - :uid => cache.attr['UID'], - :from_addr => envelope.from, - :to_addr => envelope.to, - :subject => envelope.subject, - :content_type => cache.attr['BODYSTRUCTURE'].multipart? ? 'multipart' : 'text', - :date => envelope.date, - :unread => !(cache.attr['FLAGS'].member? :Seen), - :size => cache.attr['RFC822.SIZE']) - } - end - - def messages(offset = 0, limit = 10, sort = 'date desc') - # Synchronize first retrieval time - synchronize_cache(offset+1, limit) #unless @mcached - - if limit == -1 - @messages = ImapMessage.find(:all, :conditions => ["username = ? and folder_name = ?", @username, @name], :order => sort) - else - @messages = ImapMessage.find(:all, :conditions => ["username = ? and folder_name = ?", @username, @name], :order => sort ) - end - end - - def messages_search(query = ["ALL"], sort = 'date desc') - activate - uids = @mailbox.imap.uid_search(query) - if uids.size > 1 - ImapMessage.find(:all, :conditions => ["username = ? and folder_name = ? and uid in ( ? )", @username, @name, uids], :order => sort ) - elsif uids.size == 1 - ImapMessage.find(:all, :conditions => ["username = ? and folder_name = ? and uid = ? ", @username, @name, uids.first], :order => sort ) - else - return Array.new - end - - end - - def message(uid) - activate - message = ImapMessage.find(:first, :conditions => ["username = ? and folder_name = ? and uid = ?", @username, @name, uid]) - message.set_folder(self) - message - end - - def unseen - activate - load_total_unseen if !@cached - @unseen_messages - end - - def total - activate - load_total_unseen if !@cached - @total_messages - end - - def load_total_unseen - stat = @mailbox.imap.status(@utf7_name, ["MESSAGES", "UNSEEN"]) - @total_messages, @unseen_messages = stat["MESSAGES"], stat['UNSEEN'] - @cached = true - end - - def update_status - @status ||= @mailbox.imap.status(@utf7_name, ["MESSAGES"]) - end - - def subscribe - @mailbox.imap.subscribe(@utf7_name) - end - - def trash? - self.name == CDF::CONFIG[:mail_trash] - end -end diff --git a/lib/webmail/mail2screen.rb b/lib/webmail/mail2screen.rb deleted file mode 100755 index 5504cc0..0000000 --- a/lib/webmail/mail2screen.rb +++ /dev/null @@ -1,171 +0,0 @@ -require 'cdfutils' -module Mail2Screen - def mail2html(mail, msg_id) - footer = "" - parsed_body = create_body(mail, msg_id, footer) - - ret = "\n" - ret << "\n" - ret << " \n" - ret << " \n" - if @mail.cc_addrs - ret << " \n" - end - if @mail.bcc_addrs - ret << " \n" - end - ret << " \n" - if footer != '' - ret << " \n" - end - ret << " \n" - ret << "
#{t :from}:#{address(mail.from_addrs, @msg_id)}
#{t :to}:#{address(mail.to_addrs, @msg_id)}
#{t :cc}:#{address(mail.cc_addrs, @msg_id)}
#{t :bcc}:#{address(mail.bcc_addrs, @msg_id)}
#{t :subject}:#{h(mime_encoded?(mail.subject) ? mime_decode(mail.subject) : mail.subject)}\n" - ret << "
#{t :date}:#{h message_date(mail.date)}
#{image_tag('attachment.png')}#{footer}
\n" - - ret << "
\n" - ret << parsed_body - ret << "
\n" - end - - def create_body(mail, msg_id, footer) - charset = (mail.charset.nil? ? 'iso-8859-1' : mail.charset) - if mail.multipart? - ret = "" - if mail.content_type == 'multipart/alternative' - # take only HTML part - mail.parts.each { |part| - if part.content_type == "text/html" or part.multipart? - ret << create_body(part, msg_id, footer) - end - } - return ret - else - mail.parts.each { |part| - if part.multipart? - ret << create_body(part, msg_id, footer) - else - footer << ", " if footer != '' - footer << add_attachment(part.header['content-type'], msg_id) - if part.content_type == "text/plain" or part.content_type.nil? - charset = (part.charset.nil? ? charset : mail.charset) - ret << add_text(part, part.transfer_encoding, charset) - elsif part.content_type == "text/html" - charset = (part.charset.nil? ? charset : mail.charset) - ret << add_html(part, part.transfer_encoding, charset) - elsif part.content_type.include?("image/") - ctype = part.header['content-type'] - ret << add_image(ctype, msg_id) - elsif part.content_type.include?("message/rfc822") - ret << "
#{_('Follows attached message')}:
" << mail2html(TMail::Mail.parse(part.body), msg_id) - end - end - } - return ret - end - else - ret = "" - if mail.content_type == "text/plain" or mail.content_type.nil? - ret << add_text(mail, mail.transfer_encoding, charset) - elsif mail.content_type == "text/html" - ret << add_html(mail, mail.transfer_encoding, charset) - end - return ret - end - end - - def add_text(part, encoding, charset) - CGI.escapeHTML(decode_part_text("#{part}", encoding, charset)).gsub(/\r\n/,"
").gsub(/\r/, "
").gsub(/\n/,"
") - end - - def add_html(part, encoding, charset) - strip_html(decode_part_text("#{part}", encoding, charset)) - end - - def decode_part_text(part_str, encoding, charset) - # Parse mail - header, text = "", "" - - # Get header and body - #Content-type: text/plain; charset="ISO-8859-1" - #Content-transfer-encoding: quoted-printable - isBody = false - part_str.each_line { |line| - if isBody - text << line - else - if line.strip == "" - isBody = true - else - header << line - end - end - } - # Manage encoding - if not(encoding.nil?) and encoding.downcase == "quoted-printable" - ret = from_qp(text) - elsif not(encoding.nil?) and encoding.downcase == "base64" - ret = "#{text.unpack("m")}" - else - ret = text - end - # manage charset - if ret.nil? or charset.nil? or charset.downcase == "utf-8" - return ret - else - begin - return Iconv.conv("UTF-8",charset.downcase, ret) - rescue Exception => ex - RAILS_DEFAULT_LOGGER.debug("Exception occured #{ex}\n#{ex.backtrace.join('\n')}") - return ret - end - end - end - - def add_attachment(content_type, msg_id) - filename = (content_type.nil? or content_type['name'].nil? ? "" : content_type['name']) - if filename == "" - "" - else - " #{filename}" - end - end - - def add_image(content_type, msg_id) - filename = (content_type.nil? or content_type['name'].nil? ? "" : content_type['name']) - "

#{filename}
" - end - - def friendly_address(addr) - addr.kind_of?(Net::IMAP::Address) ? ((addr.name.nil? or addr.name.strip == "") ? "#{addr.mailbox}@#{addr.host}" : "#{(mime_encoded?(addr.name.strip) ? mime_decode(addr.name.to_s): addr.name.to_s)}<#{addr.mailbox}@#{addr.host}>") : ((addr.name.nil? or addr.name.strip == "") ? "#{addr.spec}" : "#{(mime_encoded?(addr.name.strip) ? mime_decode(addr.name.to_s): addr.name.to_s)}<#{addr.spec}>") - end - - def friendly_address_or_name(addr) - if addr.kind_of?(Net::IMAP::Address) - ((addr.name.nil? or addr.name.to_s == "") ? "#{addr.mailbox}@#{addr.host}" : (mime_encoded?(addr.name.to_s) ? mime_decode(addr.name.to_s): addr.name.to_s)) - else - ((addr.nil? or addr.to_s == "") ? "#{addr.to_s}" : (mime_encoded?(addr.to_s) ? mime_decode(addr.to_s): addr.to_s)) - end - end - - def add_to_contact(addr, msg_id) - " "+t(:add_to_contacts) - end - - def short_address(addresses) - ret = "" - addresses.each { |addr| #split(/,\s*/) - ret << "," unless ret == "" - ret << CGI.escapeHTML(friendly_address_or_name(addr)) - } unless addresses.nil? - ret - end - - def address(addresses, msg_id) - ret = "" - addresses.each { |addr| #split(/,\s*/) - ret << "," unless ret == "" - ret << CGI.escapeHTML(friendly_address_or_name(addr)) << add_to_contact(addr, msg_id) - } unless addresses.nil? - return ret - end -end diff --git a/lib/webmail/mail_transform.rb b/lib/webmail/mail_transform.rb deleted file mode 100755 index 30fe03c..0000000 --- a/lib/webmail/mail_transform.rb +++ /dev/null @@ -1,75 +0,0 @@ -require 'mail2screen' - -class MailTransform - include Mail2Screen - - def get_body(tmail, type) - @mail = tmail - footer = "" - msg_id = "" - ret = mail2html(tmail, msg_id) - ret = ret.gsub(//,"\n").gsub(/ /, " ").gsub(/</, "<").gsub(/>/, ">").gsub(/&/, "&").gsub(//, "\n").gsub(/\n/, "\n> ") if type == 'text/plain' - ret = ret.gsub(/\r\n/,"
").gsub(/\r/, "
").gsub(/\n/,"
").gsub(//, "
> ") unless type == 'text/plain' - return ret - end - - def mail2html(mail, msg_id) - footer = "" - parsed_body = create_body(mail, msg_id, footer) - - ret = "-----Original Message-----\n#{_('From')}:#{address(mail.from_addrs, @msg_id)}\n" - ret << "#{_('To')}:#{address(mail.to_addrs, @msg_id)}\n" - if @mail.cc_addrs - ret << " #{_('CC')}:#{address(mail.cc_addrs, @msg_id)}\n" - end - if @mail.bcc_addrs - ret << "#{_('BCC')}:#{address(mail.bcc_addrs, @msg_id)}\n" - end - ret << "#{_('Subject')}:#{mime_encoded?(mail.subject) ? mime_decode(mail.subject) : mail.subject}\n" - ret << "#{_('Date')}:#{message_date(mail.date)}\n" - ret << "\n" - ret << "\n" - ret << parsed_body - ret << "\n" - end - - def message_date(datestr) - t = Time.now - begin - if datestr.kind_of?(String) - d = (Time.rfc2822(datestr) rescue Time.parse(value)).localtime - else - d = datestr - end - if d.day == t.day and d.month == t.month and d.year == t.year - d.strftime("%H:%M") - else - d.strftime("%Y-%m-%d") - end - rescue - begin - d = imap2time(datestr) - if d.day == t.day and d.month == t.month and d.year == t.year - d.strftime("%H:%M") - else - d.strftime("%Y-%m-%d") - end - rescue - datestr - end - end - end - - # Overwrite some staff - def add_to_contact(addr, msg_id) - "" - end - def add_attachment(content_type, msg_id) - "" - end - - def add_image(content_type, msg_id) - "" - end - -end \ No newline at end of file diff --git a/lib/webmail/maildropserializator.rb b/lib/webmail/maildropserializator.rb deleted file mode 100755 index cc5424a..0000000 --- a/lib/webmail/maildropserializator.rb +++ /dev/null @@ -1,51 +0,0 @@ -module MaildropSerializator - def serialize_to_file - mail_drop_filter = File.new(self.mail_filter_path, "w") - for filter in filters - mail_drop_filter << "# filter '#{filter.name}'\n" - mail_drop_filter << "if (#{filter_expressions(filter)})\n" - mail_drop_filter << "{\n" - mail_drop_filter << " exception {\n" - mail_drop_filter << " to #{dest_folder(filter)}\n" - mail_drop_filter << " }\n" - mail_drop_filter << "}\n" - end - mail_drop_filter.close() - end - - private - def dest_folder(filter) - '$DEFAULT/'< 'webmail/webmail', :action => 'messages' - - diff --git a/lib/webmail/virtual_email.rb b/lib/webmail/virtual_email.rb deleted file mode 100755 index 8547cf9..0000000 --- a/lib/webmail/virtual_email.rb +++ /dev/null @@ -1,3 +0,0 @@ -class VirtualEmail < ActiveRecord::Base - def self.table_name() "cdf.wm_virtual" end -end diff --git a/public/404.html b/public/404.html old mode 100755 new mode 100644 diff --git a/public/422.html b/public/422.html old mode 100755 new mode 100644 diff --git a/public/500.html b/public/500.html old mode 100755 new mode 100644 diff --git a/public/favicon.ico b/public/favicon.ico old mode 100755 new mode 100644 diff --git a/public/images/logo3.png b/public/images/logo3.png deleted file mode 100644 index 5bd6f502a4cf4fdf3933afc67272d25f10299656..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63579 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
  • " + elem.substr(0, entry.length) + "" + + elem.substr(entry.length) + "
  • "); + break; + } else if (entry.length >= instance.options.partialChars && + instance.options.partialSearch && foundPos != -1) { + if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) { + partial.push("
  • " + elem.substr(0, foundPos) + "" + + elem.substr(foundPos, entry.length) + "" + elem.substr( + foundPos + entry.length) + "
  • "); + break; + } + } + + foundPos = instance.options.ignoreCase ? + elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : + elem.indexOf(entry, foundPos + 1); + + } + } + if (partial.length) + ret = ret.concat(partial.slice(0, instance.options.choices - ret.length)); + return "
      " + ret.join('') + "
    "; + } + }, options || { }); + } +}); + +// AJAX in-place editor and collection editor +// Full rewrite by Christophe Porteneuve (April 2007). + +// Use this if you notice weird scrolling problems on some browsers, +// the DOM might be a bit confused when this gets called so do this +// waits 1 ms (with setTimeout) until it does the activation +Field.scrollFreeActivate = function(field) { + setTimeout(function() { + Field.activate(field); + }, 1); +}; + +Ajax.InPlaceEditor = Class.create({ + initialize: function(element, url, options) { + this.url = url; + this.element = element = $(element); + this.prepareOptions(); + this._controls = { }; + arguments.callee.dealWithDeprecatedOptions(options); // DEPRECATION LAYER!!! + Object.extend(this.options, options || { }); + if (!this.options.formId && this.element.id) { + this.options.formId = this.element.id + '-inplaceeditor'; + if ($(this.options.formId)) + this.options.formId = ''; + } + if (this.options.externalControl) + this.options.externalControl = $(this.options.externalControl); + if (!this.options.externalControl) + this.options.externalControlOnly = false; + this._originalBackground = this.element.getStyle('background-color') || 'transparent'; + this.element.title = this.options.clickToEditText; + this._boundCancelHandler = this.handleFormCancellation.bind(this); + this._boundComplete = (this.options.onComplete || Prototype.emptyFunction).bind(this); + this._boundFailureHandler = this.handleAJAXFailure.bind(this); + this._boundSubmitHandler = this.handleFormSubmission.bind(this); + this._boundWrapperHandler = this.wrapUp.bind(this); + this.registerListeners(); + }, + checkForEscapeOrReturn: function(e) { + if (!this._editing || e.ctrlKey || e.altKey || e.shiftKey) return; + if (Event.KEY_ESC == e.keyCode) + this.handleFormCancellation(e); + else if (Event.KEY_RETURN == e.keyCode) + this.handleFormSubmission(e); + }, + createControl: function(mode, handler, extraClasses) { + var control = this.options[mode + 'Control']; + var text = this.options[mode + 'Text']; + if ('button' == control) { + var btn = document.createElement('input'); + btn.type = 'submit'; + btn.value = text; + btn.className = 'editor_' + mode + '_button'; + if ('cancel' == mode) + btn.onclick = this._boundCancelHandler; + this._form.appendChild(btn); + this._controls[mode] = btn; + } else if ('link' == control) { + var link = document.createElement('a'); + link.href = '#'; + link.appendChild(document.createTextNode(text)); + link.onclick = 'cancel' == mode ? this._boundCancelHandler : this._boundSubmitHandler; + link.className = 'editor_' + mode + '_link'; + if (extraClasses) + link.className += ' ' + extraClasses; + this._form.appendChild(link); + this._controls[mode] = link; + } + }, + createEditField: function() { + var text = (this.options.loadTextURL ? this.options.loadingText : this.getText()); + var fld; + if (1 >= this.options.rows && !/\r|\n/.test(this.getText())) { + fld = document.createElement('input'); + fld.type = 'text'; + var size = this.options.size || this.options.cols || 0; + if (0 < size) fld.size = size; + } else { + fld = document.createElement('textarea'); + fld.rows = (1 >= this.options.rows ? this.options.autoRows : this.options.rows); + fld.cols = this.options.cols || 40; + } + fld.name = this.options.paramName; + fld.value = text; // No HTML breaks conversion anymore + fld.className = 'editor_field'; + if (this.options.submitOnBlur) + fld.onblur = this._boundSubmitHandler; + this._controls.editor = fld; + if (this.options.loadTextURL) + this.loadExternalText(); + this._form.appendChild(this._controls.editor); + }, + createForm: function() { + var ipe = this; + function addText(mode, condition) { + var text = ipe.options['text' + mode + 'Controls']; + if (!text || condition === false) return; + ipe._form.appendChild(document.createTextNode(text)); + }; + this._form = $(document.createElement('form')); + this._form.id = this.options.formId; + this._form.addClassName(this.options.formClassName); + this._form.onsubmit = this._boundSubmitHandler; + this.createEditField(); + if ('textarea' == this._controls.editor.tagName.toLowerCase()) + this._form.appendChild(document.createElement('br')); + if (this.options.onFormCustomization) + this.options.onFormCustomization(this, this._form); + addText('Before', this.options.okControl || this.options.cancelControl); + this.createControl('ok', this._boundSubmitHandler); + addText('Between', this.options.okControl && this.options.cancelControl); + this.createControl('cancel', this._boundCancelHandler, 'editor_cancel'); + addText('After', this.options.okControl || this.options.cancelControl); + }, + destroy: function() { + if (this._oldInnerHTML) + this.element.innerHTML = this._oldInnerHTML; + this.leaveEditMode(); + this.unregisterListeners(); + }, + enterEditMode: function(e) { + if (this._saving || this._editing) return; + this._editing = true; + this.triggerCallback('onEnterEditMode'); + if (this.options.externalControl) + this.options.externalControl.hide(); + this.element.hide(); + this.createForm(); + this.element.parentNode.insertBefore(this._form, this.element); + if (!this.options.loadTextURL) + this.postProcessEditField(); + if (e) Event.stop(e); + }, + enterHover: function(e) { + if (this.options.hoverClassName) + this.element.addClassName(this.options.hoverClassName); + if (this._saving) return; + this.triggerCallback('onEnterHover'); + }, + getText: function() { + return this.element.innerHTML.unescapeHTML(); + }, + handleAJAXFailure: function(transport) { + this.triggerCallback('onFailure', transport); + if (this._oldInnerHTML) { + this.element.innerHTML = this._oldInnerHTML; + this._oldInnerHTML = null; + } + }, + handleFormCancellation: function(e) { + this.wrapUp(); + if (e) Event.stop(e); + }, + handleFormSubmission: function(e) { + var form = this._form; + var value = $F(this._controls.editor); + this.prepareSubmission(); + var params = this.options.callback(form, value) || ''; + if (Object.isString(params)) + params = params.toQueryParams(); + params.editorId = this.element.id; + if (this.options.htmlResponse) { + var options = Object.extend({ evalScripts: true }, this.options.ajaxOptions); + Object.extend(options, { + parameters: params, + onComplete: this._boundWrapperHandler, + onFailure: this._boundFailureHandler + }); + new Ajax.Updater({ success: this.element }, this.url, options); + } else { + var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); + Object.extend(options, { + parameters: params, + onComplete: this._boundWrapperHandler, + onFailure: this._boundFailureHandler + }); + new Ajax.Request(this.url, options); + } + if (e) Event.stop(e); + }, + leaveEditMode: function() { + this.element.removeClassName(this.options.savingClassName); + this.removeForm(); + this.leaveHover(); + this.element.style.backgroundColor = this._originalBackground; + this.element.show(); + if (this.options.externalControl) + this.options.externalControl.show(); + this._saving = false; + this._editing = false; + this._oldInnerHTML = null; + this.triggerCallback('onLeaveEditMode'); + }, + leaveHover: function(e) { + if (this.options.hoverClassName) + this.element.removeClassName(this.options.hoverClassName); + if (this._saving) return; + this.triggerCallback('onLeaveHover'); + }, + loadExternalText: function() { + this._form.addClassName(this.options.loadingClassName); + this._controls.editor.disabled = true; + var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); + Object.extend(options, { + parameters: 'editorId=' + encodeURIComponent(this.element.id), + onComplete: Prototype.emptyFunction, + onSuccess: function(transport) { + this._form.removeClassName(this.options.loadingClassName); + var text = transport.responseText; + if (this.options.stripLoadedTextTags) + text = text.stripTags(); + this._controls.editor.value = text; + this._controls.editor.disabled = false; + this.postProcessEditField(); + }.bind(this), + onFailure: this._boundFailureHandler + }); + new Ajax.Request(this.options.loadTextURL, options); + }, + postProcessEditField: function() { + var fpc = this.options.fieldPostCreation; + if (fpc) + $(this._controls.editor)['focus' == fpc ? 'focus' : 'activate'](); + }, + prepareOptions: function() { + this.options = Object.clone(Ajax.InPlaceEditor.DefaultOptions); + Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks); + [this._extraDefaultOptions].flatten().compact().each(function(defs) { + Object.extend(this.options, defs); + }.bind(this)); + }, + prepareSubmission: function() { + this._saving = true; + this.removeForm(); + this.leaveHover(); + this.showSaving(); + }, + registerListeners: function() { + this._listeners = { }; + var listener; + $H(Ajax.InPlaceEditor.Listeners).each(function(pair) { + listener = this[pair.value].bind(this); + this._listeners[pair.key] = listener; + if (!this.options.externalControlOnly) + this.element.observe(pair.key, listener); + if (this.options.externalControl) + this.options.externalControl.observe(pair.key, listener); + }.bind(this)); + }, + removeForm: function() { + if (!this._form) return; + this._form.remove(); + this._form = null; + this._controls = { }; + }, + showSaving: function() { + this._oldInnerHTML = this.element.innerHTML; + this.element.innerHTML = this.options.savingText; + this.element.addClassName(this.options.savingClassName); + this.element.style.backgroundColor = this._originalBackground; + this.element.show(); + }, + triggerCallback: function(cbName, arg) { + if ('function' == typeof this.options[cbName]) { + this.options[cbName](this, arg); + } + }, + unregisterListeners: function() { + $H(this._listeners).each(function(pair) { + if (!this.options.externalControlOnly) + this.element.stopObserving(pair.key, pair.value); + if (this.options.externalControl) + this.options.externalControl.stopObserving(pair.key, pair.value); + }.bind(this)); + }, + wrapUp: function(transport) { + this.leaveEditMode(); + // Can't use triggerCallback due to backward compatibility: requires + // binding + direct element + this._boundComplete(transport, this.element); + } +}); + +Object.extend(Ajax.InPlaceEditor.prototype, { + dispose: Ajax.InPlaceEditor.prototype.destroy +}); + +Ajax.InPlaceCollectionEditor = Class.create(Ajax.InPlaceEditor, { + initialize: function($super, element, url, options) { + this._extraDefaultOptions = Ajax.InPlaceCollectionEditor.DefaultOptions; + $super(element, url, options); + }, + + createEditField: function() { + var list = document.createElement('select'); + list.name = this.options.paramName; + list.size = 1; + this._controls.editor = list; + this._collection = this.options.collection || []; + if (this.options.loadCollectionURL) + this.loadCollection(); + else + this.checkForExternalText(); + this._form.appendChild(this._controls.editor); + }, + + loadCollection: function() { + this._form.addClassName(this.options.loadingClassName); + this.showLoadingText(this.options.loadingCollectionText); + var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); + Object.extend(options, { + parameters: 'editorId=' + encodeURIComponent(this.element.id), + onComplete: Prototype.emptyFunction, + onSuccess: function(transport) { + var js = transport.responseText.strip(); + if (!/^\[.*\]$/.test(js)) // TODO: improve sanity check + throw('Server returned an invalid collection representation.'); + this._collection = eval(js); + this.checkForExternalText(); + }.bind(this), + onFailure: this.onFailure + }); + new Ajax.Request(this.options.loadCollectionURL, options); + }, + + showLoadingText: function(text) { + this._controls.editor.disabled = true; + var tempOption = this._controls.editor.firstChild; + if (!tempOption) { + tempOption = document.createElement('option'); + tempOption.value = ''; + this._controls.editor.appendChild(tempOption); + tempOption.selected = true; + } + tempOption.update((text || '').stripScripts().stripTags()); + }, + + checkForExternalText: function() { + this._text = this.getText(); + if (this.options.loadTextURL) + this.loadExternalText(); + else + this.buildOptionList(); + }, + + loadExternalText: function() { + this.showLoadingText(this.options.loadingText); + var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); + Object.extend(options, { + parameters: 'editorId=' + encodeURIComponent(this.element.id), + onComplete: Prototype.emptyFunction, + onSuccess: function(transport) { + this._text = transport.responseText.strip(); + this.buildOptionList(); + }.bind(this), + onFailure: this.onFailure + }); + new Ajax.Request(this.options.loadTextURL, options); + }, + + buildOptionList: function() { + this._form.removeClassName(this.options.loadingClassName); + this._collection = this._collection.map(function(entry) { + return 2 === entry.length ? entry : [entry, entry].flatten(); + }); + var marker = ('value' in this.options) ? this.options.value : this._text; + var textFound = this._collection.any(function(entry) { + return entry[0] == marker; + }.bind(this)); + this._controls.editor.update(''); + var option; + this._collection.each(function(entry, index) { + option = document.createElement('option'); + option.value = entry[0]; + option.selected = textFound ? entry[0] == marker : 0 == index; + option.appendChild(document.createTextNode(entry[1])); + this._controls.editor.appendChild(option); + }.bind(this)); + this._controls.editor.disabled = false; + Field.scrollFreeActivate(this._controls.editor); + } +}); + +//**** DEPRECATION LAYER FOR InPlace[Collection]Editor! **** +//**** This only exists for a while, in order to let **** +//**** users adapt to the new API. Read up on the new **** +//**** API and convert your code to it ASAP! **** + +Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions = function(options) { + if (!options) return; + function fallback(name, expr) { + if (name in options || expr === undefined) return; + options[name] = expr; + }; + fallback('cancelControl', (options.cancelLink ? 'link' : (options.cancelButton ? 'button' : + options.cancelLink == options.cancelButton == false ? false : undefined))); + fallback('okControl', (options.okLink ? 'link' : (options.okButton ? 'button' : + options.okLink == options.okButton == false ? false : undefined))); + fallback('highlightColor', options.highlightcolor); + fallback('highlightEndColor', options.highlightendcolor); +}; + +Object.extend(Ajax.InPlaceEditor, { + DefaultOptions: { + ajaxOptions: { }, + autoRows: 3, // Use when multi-line w/ rows == 1 + cancelControl: 'link', // 'link'|'button'|false + cancelText: 'cancel', + clickToEditText: 'Click to edit', + externalControl: null, // id|elt + externalControlOnly: false, + fieldPostCreation: 'activate', // 'activate'|'focus'|false + formClassName: 'inplaceeditor-form', + formId: null, // id|elt + highlightColor: '#ffff99', + highlightEndColor: '#ffffff', + hoverClassName: '', + htmlResponse: true, + loadingClassName: 'inplaceeditor-loading', + loadingText: 'Loading...', + okControl: 'button', // 'link'|'button'|false + okText: 'ok', + paramName: 'value', + rows: 1, // If 1 and multi-line, uses autoRows + savingClassName: 'inplaceeditor-saving', + savingText: 'Saving...', + size: 0, + stripLoadedTextTags: false, + submitOnBlur: false, + textAfterControls: '', + textBeforeControls: '', + textBetweenControls: '' + }, + DefaultCallbacks: { + callback: function(form) { + return Form.serialize(form); + }, + onComplete: function(transport, element) { + // For backward compatibility, this one is bound to the IPE, and passes + // the element directly. It was too often customized, so we don't break it. + new Effect.Highlight(element, { + startcolor: this.options.highlightColor, keepBackgroundImage: true }); + }, + onEnterEditMode: null, + onEnterHover: function(ipe) { + ipe.element.style.backgroundColor = ipe.options.highlightColor; + if (ipe._effect) + ipe._effect.cancel(); + }, + onFailure: function(transport, ipe) { + alert('Error communication with the server: ' + transport.responseText.stripTags()); + }, + onFormCustomization: null, // Takes the IPE and its generated form, after editor, before controls. + onLeaveEditMode: null, + onLeaveHover: function(ipe) { + ipe._effect = new Effect.Highlight(ipe.element, { + startcolor: ipe.options.highlightColor, endcolor: ipe.options.highlightEndColor, + restorecolor: ipe._originalBackground, keepBackgroundImage: true + }); + } + }, + Listeners: { + click: 'enterEditMode', + keydown: 'checkForEscapeOrReturn', + mouseover: 'enterHover', + mouseout: 'leaveHover' + } +}); + +Ajax.InPlaceCollectionEditor.DefaultOptions = { + loadingCollectionText: 'Loading options...' +}; + +// Delayed observer, like Form.Element.Observer, +// but waits for delay after last key input +// Ideal for live-search fields + +Form.Element.DelayedObserver = Class.create({ + initialize: function(element, delay, callback) { + this.delay = delay || 0.5; + this.element = $(element); + this.callback = callback; + this.timer = null; + this.lastValue = $F(this.element); + Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this)); + }, + delayedListener: function(event) { + if(this.lastValue == $F(this.element)) return; + if(this.timer) clearTimeout(this.timer); + this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000); + this.lastValue = $F(this.element); + }, + onTimerEvent: function() { + this.timer = null; + this.callback(this.element, $F(this.element)); + } +}); \ No newline at end of file diff --git a/themes/olive/javascripts/dragdrop.js b/themes/olive/javascripts/dragdrop.js new file mode 100755 index 0000000..15c6dbc --- /dev/null +++ b/themes/olive/javascripts/dragdrop.js @@ -0,0 +1,974 @@ +// script.aculo.us dragdrop.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 + +// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// +// script.aculo.us is freely distributable under the terms of an MIT-style license. +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +if(Object.isUndefined(Effect)) + throw("dragdrop.js requires including script.aculo.us' effects.js library"); + +var Droppables = { + drops: [], + + remove: function(element) { + this.drops = this.drops.reject(function(d) { return d.element==$(element) }); + }, + + add: function(element) { + element = $(element); + var options = Object.extend({ + greedy: true, + hoverclass: null, + tree: false + }, arguments[1] || { }); + + // cache containers + if(options.containment) { + options._containers = []; + var containment = options.containment; + if(Object.isArray(containment)) { + containment.each( function(c) { options._containers.push($(c)) }); + } else { + options._containers.push($(containment)); + } + } + + if(options.accept) options.accept = [options.accept].flatten(); + + Element.makePositioned(element); // fix IE + options.element = element; + + this.drops.push(options); + }, + + findDeepestChild: function(drops) { + deepest = drops[0]; + + for (i = 1; i < drops.length; ++i) + if (Element.isParent(drops[i].element, deepest.element)) + deepest = drops[i]; + + return deepest; + }, + + isContained: function(element, drop) { + var containmentNode; + if(drop.tree) { + containmentNode = element.treeNode; + } else { + containmentNode = element.parentNode; + } + return drop._containers.detect(function(c) { return containmentNode == c }); + }, + + isAffected: function(point, element, drop) { + return ( + (drop.element!=element) && + ((!drop._containers) || + this.isContained(element, drop)) && + ((!drop.accept) || + (Element.classNames(element).detect( + function(v) { return drop.accept.include(v) } ) )) && + Position.within(drop.element, point[0], point[1]) ); + }, + + deactivate: function(drop) { + if(drop.hoverclass) + Element.removeClassName(drop.element, drop.hoverclass); + this.last_active = null; + }, + + activate: function(drop) { + if(drop.hoverclass) + Element.addClassName(drop.element, drop.hoverclass); + this.last_active = drop; + }, + + show: function(point, element) { + if(!this.drops.length) return; + var drop, affected = []; + + this.drops.each( function(drop) { + if(Droppables.isAffected(point, element, drop)) + affected.push(drop); + }); + + if(affected.length>0) + drop = Droppables.findDeepestChild(affected); + + if(this.last_active && this.last_active != drop) this.deactivate(this.last_active); + if (drop) { + Position.within(drop.element, point[0], point[1]); + if(drop.onHover) + drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element)); + + if (drop != this.last_active) Droppables.activate(drop); + } + }, + + fire: function(event, element) { + if(!this.last_active) return; + Position.prepare(); + + if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active)) + if (this.last_active.onDrop) { + this.last_active.onDrop(element, this.last_active.element, event); + return true; + } + }, + + reset: function() { + if(this.last_active) + this.deactivate(this.last_active); + } +}; + +var Draggables = { + drags: [], + observers: [], + + register: function(draggable) { + if(this.drags.length == 0) { + this.eventMouseUp = this.endDrag.bindAsEventListener(this); + this.eventMouseMove = this.updateDrag.bindAsEventListener(this); + this.eventKeypress = this.keyPress.bindAsEventListener(this); + + Event.observe(document, "mouseup", this.eventMouseUp); + Event.observe(document, "mousemove", this.eventMouseMove); + Event.observe(document, "keypress", this.eventKeypress); + } + this.drags.push(draggable); + }, + + unregister: function(draggable) { + this.drags = this.drags.reject(function(d) { return d==draggable }); + if(this.drags.length == 0) { + Event.stopObserving(document, "mouseup", this.eventMouseUp); + Event.stopObserving(document, "mousemove", this.eventMouseMove); + Event.stopObserving(document, "keypress", this.eventKeypress); + } + }, + + activate: function(draggable) { + if(draggable.options.delay) { + this._timeout = setTimeout(function() { + Draggables._timeout = null; + window.focus(); + Draggables.activeDraggable = draggable; + }.bind(this), draggable.options.delay); + } else { + window.focus(); // allows keypress events if window isn't currently focused, fails for Safari + this.activeDraggable = draggable; + } + }, + + deactivate: function() { + this.activeDraggable = null; + }, + + updateDrag: function(event) { + if(!this.activeDraggable) return; + var pointer = [Event.pointerX(event), Event.pointerY(event)]; + // Mozilla-based browsers fire successive mousemove events with + // the same coordinates, prevent needless redrawing (moz bug?) + if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return; + this._lastPointer = pointer; + + this.activeDraggable.updateDrag(event, pointer); + }, + + endDrag: function(event) { + if(this._timeout) { + clearTimeout(this._timeout); + this._timeout = null; + } + if(!this.activeDraggable) return; + this._lastPointer = null; + this.activeDraggable.endDrag(event); + this.activeDraggable = null; + }, + + keyPress: function(event) { + if(this.activeDraggable) + this.activeDraggable.keyPress(event); + }, + + addObserver: function(observer) { + this.observers.push(observer); + this._cacheObserverCallbacks(); + }, + + removeObserver: function(element) { // element instead of observer fixes mem leaks + this.observers = this.observers.reject( function(o) { return o.element==element }); + this._cacheObserverCallbacks(); + }, + + notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag' + if(this[eventName+'Count'] > 0) + this.observers.each( function(o) { + if(o[eventName]) o[eventName](eventName, draggable, event); + }); + if(draggable.options[eventName]) draggable.options[eventName](draggable, event); + }, + + _cacheObserverCallbacks: function() { + ['onStart','onEnd','onDrag'].each( function(eventName) { + Draggables[eventName+'Count'] = Draggables.observers.select( + function(o) { return o[eventName]; } + ).length; + }); + } +}; + +/*--------------------------------------------------------------------------*/ + +var Draggable = Class.create({ + initialize: function(element) { + var defaults = { + handle: false, + reverteffect: function(element, top_offset, left_offset) { + var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02; + new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur, + queue: {scope:'_draggable', position:'end'} + }); + }, + endeffect: function(element) { + var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0; + new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, + queue: {scope:'_draggable', position:'end'}, + afterFinish: function(){ + Draggable._dragging[element] = false + } + }); + }, + zindex: 1000, + revert: false, + quiet: false, + scroll: false, + scrollSensitivity: 20, + scrollSpeed: 15, + snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] } + delay: 0 + }; + + if(!arguments[1] || Object.isUndefined(arguments[1].endeffect)) + Object.extend(defaults, { + starteffect: function(element) { + element._opacity = Element.getOpacity(element); + Draggable._dragging[element] = true; + new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); + } + }); + + var options = Object.extend(defaults, arguments[1] || { }); + + this.element = $(element); + + if(options.handle && Object.isString(options.handle)) + this.handle = this.element.down('.'+options.handle, 0); + + if(!this.handle) this.handle = $(options.handle); + if(!this.handle) this.handle = this.element; + + if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) { + options.scroll = $(options.scroll); + this._isScrollChild = Element.childOf(this.element, options.scroll); + } + + Element.makePositioned(this.element); // fix IE + + this.options = options; + this.dragging = false; + + this.eventMouseDown = this.initDrag.bindAsEventListener(this); + Event.observe(this.handle, "mousedown", this.eventMouseDown); + + Draggables.register(this); + }, + + destroy: function() { + Event.stopObserving(this.handle, "mousedown", this.eventMouseDown); + Draggables.unregister(this); + }, + + currentDelta: function() { + return([ + parseInt(Element.getStyle(this.element,'left') || '0'), + parseInt(Element.getStyle(this.element,'top') || '0')]); + }, + + initDrag: function(event) { + if(!Object.isUndefined(Draggable._dragging[this.element]) && + Draggable._dragging[this.element]) return; + if(Event.isLeftClick(event)) { + // abort on form elements, fixes a Firefox issue + var src = Event.element(event); + if((tag_name = src.tagName.toUpperCase()) && ( + tag_name=='INPUT' || + tag_name=='SELECT' || + tag_name=='OPTION' || + tag_name=='BUTTON' || + tag_name=='TEXTAREA')) return; + + var pointer = [Event.pointerX(event), Event.pointerY(event)]; + var pos = this.element.cumulativeOffset(); + this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) }); + + Draggables.activate(this); + Event.stop(event); + } + }, + + startDrag: function(event) { + this.dragging = true; + if(!this.delta) + this.delta = this.currentDelta(); + + if(this.options.zindex) { + this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0); + this.element.style.zIndex = this.options.zindex; + } + + if(this.options.ghosting) { + this._clone = this.element.cloneNode(true); + this._originallyAbsolute = (this.element.getStyle('position') == 'absolute'); + if (!this._originallyAbsolute) + Position.absolutize(this.element); + this.element.parentNode.insertBefore(this._clone, this.element); + } + + if(this.options.scroll) { + if (this.options.scroll == window) { + var where = this._getWindowScroll(this.options.scroll); + this.originalScrollLeft = where.left; + this.originalScrollTop = where.top; + } else { + this.originalScrollLeft = this.options.scroll.scrollLeft; + this.originalScrollTop = this.options.scroll.scrollTop; + } + } + + Draggables.notify('onStart', this, event); + + if(this.options.starteffect) this.options.starteffect(this.element); + }, + + updateDrag: function(event, pointer) { + if(!this.dragging) this.startDrag(event); + + if(!this.options.quiet){ + Position.prepare(); + Droppables.show(pointer, this.element); + } + + Draggables.notify('onDrag', this, event); + + this.draw(pointer); + if(this.options.change) this.options.change(this); + + if(this.options.scroll) { + this.stopScrolling(); + + var p; + if (this.options.scroll == window) { + with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; } + } else { + p = Position.page(this.options.scroll); + p[0] += this.options.scroll.scrollLeft + Position.deltaX; + p[1] += this.options.scroll.scrollTop + Position.deltaY; + p.push(p[0]+this.options.scroll.offsetWidth); + p.push(p[1]+this.options.scroll.offsetHeight); + } + var speed = [0,0]; + if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity); + if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity); + if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity); + if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity); + this.startScrolling(speed); + } + + // fix AppleWebKit rendering + if(Prototype.Browser.WebKit) window.scrollBy(0,0); + + Event.stop(event); + }, + + finishDrag: function(event, success) { + this.dragging = false; + + if(this.options.quiet){ + Position.prepare(); + var pointer = [Event.pointerX(event), Event.pointerY(event)]; + Droppables.show(pointer, this.element); + } + + if(this.options.ghosting) { + if (!this._originallyAbsolute) + Position.relativize(this.element); + delete this._originallyAbsolute; + Element.remove(this._clone); + this._clone = null; + } + + var dropped = false; + if(success) { + dropped = Droppables.fire(event, this.element); + if (!dropped) dropped = false; + } + if(dropped && this.options.onDropped) this.options.onDropped(this.element); + Draggables.notify('onEnd', this, event); + + var revert = this.options.revert; + if(revert && Object.isFunction(revert)) revert = revert(this.element); + + var d = this.currentDelta(); + if(revert && this.options.reverteffect) { + if (dropped == 0 || revert != 'failure') + this.options.reverteffect(this.element, + d[1]-this.delta[1], d[0]-this.delta[0]); + } else { + this.delta = d; + } + + if(this.options.zindex) + this.element.style.zIndex = this.originalZ; + + if(this.options.endeffect) + this.options.endeffect(this.element); + + Draggables.deactivate(this); + Droppables.reset(); + }, + + keyPress: function(event) { + if(event.keyCode!=Event.KEY_ESC) return; + this.finishDrag(event, false); + Event.stop(event); + }, + + endDrag: function(event) { + if(!this.dragging) return; + this.stopScrolling(); + this.finishDrag(event, true); + Event.stop(event); + }, + + draw: function(point) { + var pos = this.element.cumulativeOffset(); + if(this.options.ghosting) { + var r = Position.realOffset(this.element); + pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY; + } + + var d = this.currentDelta(); + pos[0] -= d[0]; pos[1] -= d[1]; + + if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) { + pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft; + pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop; + } + + var p = [0,1].map(function(i){ + return (point[i]-pos[i]-this.offset[i]) + }.bind(this)); + + if(this.options.snap) { + if(Object.isFunction(this.options.snap)) { + p = this.options.snap(p[0],p[1],this); + } else { + if(Object.isArray(this.options.snap)) { + p = p.map( function(v, i) { + return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this)); + } else { + p = p.map( function(v) { + return (v/this.options.snap).round()*this.options.snap }.bind(this)); + } + }} + + var style = this.element.style; + if((!this.options.constraint) || (this.options.constraint=='horizontal')) + style.left = p[0] + "px"; + if((!this.options.constraint) || (this.options.constraint=='vertical')) + style.top = p[1] + "px"; + + if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering + }, + + stopScrolling: function() { + if(this.scrollInterval) { + clearInterval(this.scrollInterval); + this.scrollInterval = null; + Draggables._lastScrollPointer = null; + } + }, + + startScrolling: function(speed) { + if(!(speed[0] || speed[1])) return; + this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed]; + this.lastScrolled = new Date(); + this.scrollInterval = setInterval(this.scroll.bind(this), 10); + }, + + scroll: function() { + var current = new Date(); + var delta = current - this.lastScrolled; + this.lastScrolled = current; + if(this.options.scroll == window) { + with (this._getWindowScroll(this.options.scroll)) { + if (this.scrollSpeed[0] || this.scrollSpeed[1]) { + var d = delta / 1000; + this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] ); + } + } + } else { + this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; + this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000; + } + + Position.prepare(); + Droppables.show(Draggables._lastPointer, this.element); + Draggables.notify('onDrag', this); + if (this._isScrollChild) { + Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer); + Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000; + Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000; + if (Draggables._lastScrollPointer[0] < 0) + Draggables._lastScrollPointer[0] = 0; + if (Draggables._lastScrollPointer[1] < 0) + Draggables._lastScrollPointer[1] = 0; + this.draw(Draggables._lastScrollPointer); + } + + if(this.options.change) this.options.change(this); + }, + + _getWindowScroll: function(w) { + var T, L, W, H; + with (w.document) { + if (w.document.documentElement && documentElement.scrollTop) { + T = documentElement.scrollTop; + L = documentElement.scrollLeft; + } else if (w.document.body) { + T = body.scrollTop; + L = body.scrollLeft; + } + if (w.innerWidth) { + W = w.innerWidth; + H = w.innerHeight; + } else if (w.document.documentElement && documentElement.clientWidth) { + W = documentElement.clientWidth; + H = documentElement.clientHeight; + } else { + W = body.offsetWidth; + H = body.offsetHeight; + } + } + return { top: T, left: L, width: W, height: H }; + } +}); + +Draggable._dragging = { }; + +/*--------------------------------------------------------------------------*/ + +var SortableObserver = Class.create({ + initialize: function(element, observer) { + this.element = $(element); + this.observer = observer; + this.lastValue = Sortable.serialize(this.element); + }, + + onStart: function() { + this.lastValue = Sortable.serialize(this.element); + }, + + onEnd: function() { + Sortable.unmark(); + if(this.lastValue != Sortable.serialize(this.element)) + this.observer(this.element) + } +}); + +var Sortable = { + SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/, + + sortables: { }, + + _findRootElement: function(element) { + while (element.tagName.toUpperCase() != "BODY") { + if(element.id && Sortable.sortables[element.id]) return element; + element = element.parentNode; + } + }, + + options: function(element) { + element = Sortable._findRootElement($(element)); + if(!element) return; + return Sortable.sortables[element.id]; + }, + + destroy: function(element){ + element = $(element); + var s = Sortable.sortables[element.id]; + + if(s) { + Draggables.removeObserver(s.element); + s.droppables.each(function(d){ Droppables.remove(d) }); + s.draggables.invoke('destroy'); + + delete Sortable.sortables[s.element.id]; + } + }, + + create: function(element) { + element = $(element); + var options = Object.extend({ + element: element, + tag: 'li', // assumes li children, override with tag: 'tagname' + dropOnEmpty: false, + tree: false, + treeTag: 'ul', + overlap: 'vertical', // one of 'vertical', 'horizontal' + constraint: 'vertical', // one of 'vertical', 'horizontal', false + containment: element, // also takes array of elements (or id's); or false + handle: false, // or a CSS class + only: false, + delay: 0, + hoverclass: null, + ghosting: false, + quiet: false, + scroll: false, + scrollSensitivity: 20, + scrollSpeed: 15, + format: this.SERIALIZE_RULE, + + // these take arrays of elements or ids and can be + // used for better initialization performance + elements: false, + handles: false, + + onChange: Prototype.emptyFunction, + onUpdate: Prototype.emptyFunction + }, arguments[1] || { }); + + // clear any old sortable with same element + this.destroy(element); + + // build options for the draggables + var options_for_draggable = { + revert: true, + quiet: options.quiet, + scroll: options.scroll, + scrollSpeed: options.scrollSpeed, + scrollSensitivity: options.scrollSensitivity, + delay: options.delay, + ghosting: options.ghosting, + constraint: options.constraint, + handle: options.handle }; + + if(options.starteffect) + options_for_draggable.starteffect = options.starteffect; + + if(options.reverteffect) + options_for_draggable.reverteffect = options.reverteffect; + else + if(options.ghosting) options_for_draggable.reverteffect = function(element) { + element.style.top = 0; + element.style.left = 0; + }; + + if(options.endeffect) + options_for_draggable.endeffect = options.endeffect; + + if(options.zindex) + options_for_draggable.zindex = options.zindex; + + // build options for the droppables + var options_for_droppable = { + overlap: options.overlap, + containment: options.containment, + tree: options.tree, + hoverclass: options.hoverclass, + onHover: Sortable.onHover + }; + + var options_for_tree = { + onHover: Sortable.onEmptyHover, + overlap: options.overlap, + containment: options.containment, + hoverclass: options.hoverclass + }; + + // fix for gecko engine + Element.cleanWhitespace(element); + + options.draggables = []; + options.droppables = []; + + // drop on empty handling + if(options.dropOnEmpty || options.tree) { + Droppables.add(element, options_for_tree); + options.droppables.push(element); + } + + (options.elements || this.findElements(element, options) || []).each( function(e,i) { + var handle = options.handles ? $(options.handles[i]) : + (options.handle ? $(e).select('.' + options.handle)[0] : e); + options.draggables.push( + new Draggable(e, Object.extend(options_for_draggable, { handle: handle }))); + Droppables.add(e, options_for_droppable); + if(options.tree) e.treeNode = element; + options.droppables.push(e); + }); + + if(options.tree) { + (Sortable.findTreeElements(element, options) || []).each( function(e) { + Droppables.add(e, options_for_tree); + e.treeNode = element; + options.droppables.push(e); + }); + } + + // keep reference + this.sortables[element.identify()] = options; + + // for onupdate + Draggables.addObserver(new SortableObserver(element, options.onUpdate)); + + }, + + // return all suitable-for-sortable elements in a guaranteed order + findElements: function(element, options) { + return Element.findChildren( + element, options.only, options.tree ? true : false, options.tag); + }, + + findTreeElements: function(element, options) { + return Element.findChildren( + element, options.only, options.tree ? true : false, options.treeTag); + }, + + onHover: function(element, dropon, overlap) { + if(Element.isParent(dropon, element)) return; + + if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) { + return; + } else if(overlap>0.5) { + Sortable.mark(dropon, 'before'); + if(dropon.previousSibling != element) { + var oldParentNode = element.parentNode; + element.style.visibility = "hidden"; // fix gecko rendering + dropon.parentNode.insertBefore(element, dropon); + if(dropon.parentNode!=oldParentNode) + Sortable.options(oldParentNode).onChange(element); + Sortable.options(dropon.parentNode).onChange(element); + } + } else { + Sortable.mark(dropon, 'after'); + var nextElement = dropon.nextSibling || null; + if(nextElement != element) { + var oldParentNode = element.parentNode; + element.style.visibility = "hidden"; // fix gecko rendering + dropon.parentNode.insertBefore(element, nextElement); + if(dropon.parentNode!=oldParentNode) + Sortable.options(oldParentNode).onChange(element); + Sortable.options(dropon.parentNode).onChange(element); + } + } + }, + + onEmptyHover: function(element, dropon, overlap) { + var oldParentNode = element.parentNode; + var droponOptions = Sortable.options(dropon); + + if(!Element.isParent(dropon, element)) { + var index; + + var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only}); + var child = null; + + if(children) { + var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap); + + for (index = 0; index < children.length; index += 1) { + if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) { + offset -= Element.offsetSize (children[index], droponOptions.overlap); + } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) { + child = index + 1 < children.length ? children[index + 1] : null; + break; + } else { + child = children[index]; + break; + } + } + } + + dropon.insertBefore(element, child); + + Sortable.options(oldParentNode).onChange(element); + droponOptions.onChange(element); + } + }, + + unmark: function() { + if(Sortable._marker) Sortable._marker.hide(); + }, + + mark: function(dropon, position) { + // mark on ghosting only + var sortable = Sortable.options(dropon.parentNode); + if(sortable && !sortable.ghosting) return; + + if(!Sortable._marker) { + Sortable._marker = + ($('dropmarker') || Element.extend(document.createElement('DIV'))). + hide().addClassName('dropmarker').setStyle({position:'absolute'}); + document.getElementsByTagName("body").item(0).appendChild(Sortable._marker); + } + var offsets = dropon.cumulativeOffset(); + Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'}); + + if(position=='after') + if(sortable.overlap == 'horizontal') + Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'}); + else + Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'}); + + Sortable._marker.show(); + }, + + _tree: function(element, options, parent) { + var children = Sortable.findElements(element, options) || []; + + for (var i = 0; i < children.length; ++i) { + var match = children[i].id.match(options.format); + + if (!match) continue; + + var child = { + id: encodeURIComponent(match ? match[1] : null), + element: element, + parent: parent, + children: [], + position: parent.children.length, + container: $(children[i]).down(options.treeTag) + }; + + /* Get the element containing the children and recurse over it */ + if (child.container) + this._tree(child.container, options, child); + + parent.children.push (child); + } + + return parent; + }, + + tree: function(element) { + element = $(element); + var sortableOptions = this.options(element); + var options = Object.extend({ + tag: sortableOptions.tag, + treeTag: sortableOptions.treeTag, + only: sortableOptions.only, + name: element.id, + format: sortableOptions.format + }, arguments[1] || { }); + + var root = { + id: null, + parent: null, + children: [], + container: element, + position: 0 + }; + + return Sortable._tree(element, options, root); + }, + + /* Construct a [i] index for a particular node */ + _constructIndex: function(node) { + var index = ''; + do { + if (node.id) index = '[' + node.position + ']' + index; + } while ((node = node.parent) != null); + return index; + }, + + sequence: function(element) { + element = $(element); + var options = Object.extend(this.options(element), arguments[1] || { }); + + return $(this.findElements(element, options) || []).map( function(item) { + return item.id.match(options.format) ? item.id.match(options.format)[1] : ''; + }); + }, + + setSequence: function(element, new_sequence) { + element = $(element); + var options = Object.extend(this.options(element), arguments[2] || { }); + + var nodeMap = { }; + this.findElements(element, options).each( function(n) { + if (n.id.match(options.format)) + nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode]; + n.parentNode.removeChild(n); + }); + + new_sequence.each(function(ident) { + var n = nodeMap[ident]; + if (n) { + n[1].appendChild(n[0]); + delete nodeMap[ident]; + } + }); + }, + + serialize: function(element) { + element = $(element); + var options = Object.extend(Sortable.options(element), arguments[1] || { }); + var name = encodeURIComponent( + (arguments[1] && arguments[1].name) ? arguments[1].name : element.id); + + if (options.tree) { + return Sortable.tree(element, arguments[1]).children.map( function (item) { + return [name + Sortable._constructIndex(item) + "[id]=" + + encodeURIComponent(item.id)].concat(item.children.map(arguments.callee)); + }).flatten().join('&'); + } else { + return Sortable.sequence(element, arguments[1]).map( function(item) { + return name + "[]=" + encodeURIComponent(item); + }).join('&'); + } + } +}; + +// Returns true if child is contained within element +Element.isParent = function(child, element) { + if (!child.parentNode || child == element) return false; + if (child.parentNode == element) return true; + return Element.isParent(child.parentNode, element); +}; + +Element.findChildren = function(element, only, recursive, tagName) { + if(!element.hasChildNodes()) return null; + tagName = tagName.toUpperCase(); + if(only) only = [only].flatten(); + var elements = []; + $A(element.childNodes).each( function(e) { + if(e.tagName && e.tagName.toUpperCase()==tagName && + (!only || (Element.classNames(e).detect(function(v) { return only.include(v) })))) + elements.push(e); + if(recursive) { + var grandchildren = Element.findChildren(e, only, recursive, tagName); + if(grandchildren) elements.push(grandchildren); + } + }); + + return (elements.length>0 ? elements.flatten() : []); +}; + +Element.offsetSize = function (element, type) { + return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')]; +}; \ No newline at end of file diff --git a/themes/olive/javascripts/effects.js b/themes/olive/javascripts/effects.js new file mode 100755 index 0000000..c81e6c7 --- /dev/null +++ b/themes/olive/javascripts/effects.js @@ -0,0 +1,1123 @@ +// script.aculo.us effects.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 + +// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// Contributors: +// Justin Palmer (http://encytemedia.com/) +// Mark Pilgrim (http://diveintomark.org/) +// Martin Bialasinki +// +// script.aculo.us is freely distributable under the terms of an MIT-style license. +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +// converts rgb() and #xxx to #xxxxxx format, +// returns self (or first argument) if not convertable +String.prototype.parseColor = function() { + var color = '#'; + if (this.slice(0,4) == 'rgb(') { + var cols = this.slice(4,this.length-1).split(','); + var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); + } else { + if (this.slice(0,1) == '#') { + if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); + if (this.length==7) color = this.toLowerCase(); + } + } + return (color.length==7 ? color : (arguments[0] || this)); +}; + +/*--------------------------------------------------------------------------*/ + +Element.collectTextNodes = function(element) { + return $A($(element).childNodes).collect( function(node) { + return (node.nodeType==3 ? node.nodeValue : + (node.hasChildNodes() ? Element.collectTextNodes(node) : '')); + }).flatten().join(''); +}; + +Element.collectTextNodesIgnoreClass = function(element, className) { + return $A($(element).childNodes).collect( function(node) { + return (node.nodeType==3 ? node.nodeValue : + ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? + Element.collectTextNodesIgnoreClass(node, className) : '')); + }).flatten().join(''); +}; + +Element.setContentZoom = function(element, percent) { + element = $(element); + element.setStyle({fontSize: (percent/100) + 'em'}); + if (Prototype.Browser.WebKit) window.scrollBy(0,0); + return element; +}; + +Element.getInlineOpacity = function(element){ + return $(element).style.opacity || ''; +}; + +Element.forceRerendering = function(element) { + try { + element = $(element); + var n = document.createTextNode(' '); + element.appendChild(n); + element.removeChild(n); + } catch(e) { } +}; + +/*--------------------------------------------------------------------------*/ + +var Effect = { + _elementDoesNotExistError: { + name: 'ElementDoesNotExistError', + message: 'The specified DOM element does not exist, but is required for this effect to operate' + }, + Transitions: { + linear: Prototype.K, + sinoidal: function(pos) { + return (-Math.cos(pos*Math.PI)/2) + .5; + }, + reverse: function(pos) { + return 1-pos; + }, + flicker: function(pos) { + var pos = ((-Math.cos(pos*Math.PI)/4) + .75) + Math.random()/4; + return pos > 1 ? 1 : pos; + }, + wobble: function(pos) { + return (-Math.cos(pos*Math.PI*(9*pos))/2) + .5; + }, + pulse: function(pos, pulses) { + return (-Math.cos((pos*((pulses||5)-.5)*2)*Math.PI)/2) + .5; + }, + spring: function(pos) { + return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6)); + }, + none: function(pos) { + return 0; + }, + full: function(pos) { + return 1; + } + }, + DefaultOptions: { + duration: 1.0, // seconds + fps: 100, // 100= assume 66fps max. + sync: false, // true for combining + from: 0.0, + to: 1.0, + delay: 0.0, + queue: 'parallel' + }, + tagifyText: function(element) { + var tagifyStyle = 'position:relative'; + if (Prototype.Browser.IE) tagifyStyle += ';zoom:1'; + + element = $(element); + $A(element.childNodes).each( function(child) { + if (child.nodeType==3) { + child.nodeValue.toArray().each( function(character) { + element.insertBefore( + new Element('span', {style: tagifyStyle}).update( + character == ' ' ? String.fromCharCode(160) : character), + child); + }); + Element.remove(child); + } + }); + }, + multiple: function(element, effect) { + var elements; + if (((typeof element == 'object') || + Object.isFunction(element)) && + (element.length)) + elements = element; + else + elements = $(element).childNodes; + + var options = Object.extend({ + speed: 0.1, + delay: 0.0 + }, arguments[2] || { }); + var masterDelay = options.delay; + + $A(elements).each( function(element, index) { + new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay })); + }); + }, + PAIRS: { + 'slide': ['SlideDown','SlideUp'], + 'blind': ['BlindDown','BlindUp'], + 'appear': ['Appear','Fade'] + }, + toggle: function(element, effect, options) { + element = $(element); + effect = (effect || 'appear').toLowerCase(); + + return Effect[ Effect.PAIRS[ effect ][ element.visible() ? 1 : 0 ] ](element, Object.extend({ + queue: { position:'end', scope:(element.id || 'global'), limit: 1 } + }, options || {})); + } +}; + +Effect.DefaultOptions.transition = Effect.Transitions.sinoidal; + +/* ------------- core effects ------------- */ + +Effect.ScopedQueue = Class.create(Enumerable, { + initialize: function() { + this.effects = []; + this.interval = null; + }, + _each: function(iterator) { + this.effects._each(iterator); + }, + add: function(effect) { + var timestamp = new Date().getTime(); + + var position = Object.isString(effect.options.queue) ? + effect.options.queue : effect.options.queue.position; + + switch(position) { + case 'front': + // move unstarted effects after this effect + this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) { + e.startOn += effect.finishOn; + e.finishOn += effect.finishOn; + }); + break; + case 'with-last': + timestamp = this.effects.pluck('startOn').max() || timestamp; + break; + case 'end': + // start effect after last queued effect has finished + timestamp = this.effects.pluck('finishOn').max() || timestamp; + break; + } + + effect.startOn += timestamp; + effect.finishOn += timestamp; + + if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit)) + this.effects.push(effect); + + if (!this.interval) + this.interval = setInterval(this.loop.bind(this), 15); + }, + remove: function(effect) { + this.effects = this.effects.reject(function(e) { return e==effect }); + if (this.effects.length == 0) { + clearInterval(this.interval); + this.interval = null; + } + }, + loop: function() { + var timePos = new Date().getTime(); + for(var i=0, len=this.effects.length;i= this.startOn) { + if (timePos >= this.finishOn) { + this.render(1.0); + this.cancel(); + this.event('beforeFinish'); + if (this.finish) this.finish(); + this.event('afterFinish'); + return; + } + var pos = (timePos - this.startOn) / this.totalTime, + frame = (pos * this.totalFrames).round(); + if (frame > this.currentFrame) { + this.render(pos); + this.currentFrame = frame; + } + } + }, + cancel: function() { + if (!this.options.sync) + Effect.Queues.get(Object.isString(this.options.queue) ? + 'global' : this.options.queue.scope).remove(this); + this.state = 'finished'; + }, + event: function(eventName) { + if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this); + if (this.options[eventName]) this.options[eventName](this); + }, + inspect: function() { + var data = $H(); + for(property in this) + if (!Object.isFunction(this[property])) data.set(property, this[property]); + return '#'; + } +}); + +Effect.Parallel = Class.create(Effect.Base, { + initialize: function(effects) { + this.effects = effects || []; + this.start(arguments[1]); + }, + update: function(position) { + this.effects.invoke('render', position); + }, + finish: function(position) { + this.effects.each( function(effect) { + effect.render(1.0); + effect.cancel(); + effect.event('beforeFinish'); + if (effect.finish) effect.finish(position); + effect.event('afterFinish'); + }); + } +}); + +Effect.Tween = Class.create(Effect.Base, { + initialize: function(object, from, to) { + object = Object.isString(object) ? $(object) : object; + var args = $A(arguments), method = args.last(), + options = args.length == 5 ? args[3] : null; + this.method = Object.isFunction(method) ? method.bind(object) : + Object.isFunction(object[method]) ? object[method].bind(object) : + function(value) { object[method] = value }; + this.start(Object.extend({ from: from, to: to }, options || { })); + }, + update: function(position) { + this.method(position); + } +}); + +Effect.Event = Class.create(Effect.Base, { + initialize: function() { + this.start(Object.extend({ duration: 0 }, arguments[0] || { })); + }, + update: Prototype.emptyFunction +}); + +Effect.Opacity = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + // make this work on IE on elements without 'layout' + if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) + this.element.setStyle({zoom: 1}); + var options = Object.extend({ + from: this.element.getOpacity() || 0.0, + to: 1.0 + }, arguments[1] || { }); + this.start(options); + }, + update: function(position) { + this.element.setOpacity(position); + } +}); + +Effect.Move = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ + x: 0, + y: 0, + mode: 'relative' + }, arguments[1] || { }); + this.start(options); + }, + setup: function() { + this.element.makePositioned(); + this.originalLeft = parseFloat(this.element.getStyle('left') || '0'); + this.originalTop = parseFloat(this.element.getStyle('top') || '0'); + if (this.options.mode == 'absolute') { + this.options.x = this.options.x - this.originalLeft; + this.options.y = this.options.y - this.originalTop; + } + }, + update: function(position) { + this.element.setStyle({ + left: (this.options.x * position + this.originalLeft).round() + 'px', + top: (this.options.y * position + this.originalTop).round() + 'px' + }); + } +}); + +// for backwards compatibility +Effect.MoveBy = function(element, toTop, toLeft) { + return new Effect.Move(element, + Object.extend({ x: toLeft, y: toTop }, arguments[3] || { })); +}; + +Effect.Scale = Class.create(Effect.Base, { + initialize: function(element, percent) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ + scaleX: true, + scaleY: true, + scaleContent: true, + scaleFromCenter: false, + scaleMode: 'box', // 'box' or 'contents' or { } with provided values + scaleFrom: 100.0, + scaleTo: percent + }, arguments[2] || { }); + this.start(options); + }, + setup: function() { + this.restoreAfterFinish = this.options.restoreAfterFinish || false; + this.elementPositioning = this.element.getStyle('position'); + + this.originalStyle = { }; + ['top','left','width','height','fontSize'].each( function(k) { + this.originalStyle[k] = this.element.style[k]; + }.bind(this)); + + this.originalTop = this.element.offsetTop; + this.originalLeft = this.element.offsetLeft; + + var fontSize = this.element.getStyle('font-size') || '100%'; + ['em','px','%','pt'].each( function(fontSizeType) { + if (fontSize.indexOf(fontSizeType)>0) { + this.fontSize = parseFloat(fontSize); + this.fontSizeType = fontSizeType; + } + }.bind(this)); + + this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; + + this.dims = null; + if (this.options.scaleMode=='box') + this.dims = [this.element.offsetHeight, this.element.offsetWidth]; + if (/^content/.test(this.options.scaleMode)) + this.dims = [this.element.scrollHeight, this.element.scrollWidth]; + if (!this.dims) + this.dims = [this.options.scaleMode.originalHeight, + this.options.scaleMode.originalWidth]; + }, + update: function(position) { + var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); + if (this.options.scaleContent && this.fontSize) + this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType }); + this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale); + }, + finish: function(position) { + if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle); + }, + setDimensions: function(height, width) { + var d = { }; + if (this.options.scaleX) d.width = width.round() + 'px'; + if (this.options.scaleY) d.height = height.round() + 'px'; + if (this.options.scaleFromCenter) { + var topd = (height - this.dims[0])/2; + var leftd = (width - this.dims[1])/2; + if (this.elementPositioning == 'absolute') { + if (this.options.scaleY) d.top = this.originalTop-topd + 'px'; + if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px'; + } else { + if (this.options.scaleY) d.top = -topd + 'px'; + if (this.options.scaleX) d.left = -leftd + 'px'; + } + } + this.element.setStyle(d); + } +}); + +Effect.Highlight = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { }); + this.start(options); + }, + setup: function() { + // Prevent executing on elements not in the layout flow + if (this.element.getStyle('display')=='none') { this.cancel(); return; } + // Disable background image during the effect + this.oldStyle = { }; + if (!this.options.keepBackgroundImage) { + this.oldStyle.backgroundImage = this.element.getStyle('background-image'); + this.element.setStyle({backgroundImage: 'none'}); + } + if (!this.options.endcolor) + this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff'); + if (!this.options.restorecolor) + this.options.restorecolor = this.element.getStyle('background-color'); + // init color calculations + this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this)); + this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this)); + }, + update: function(position) { + this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){ + return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) }); + }, + finish: function() { + this.element.setStyle(Object.extend(this.oldStyle, { + backgroundColor: this.options.restorecolor + })); + } +}); + +Effect.ScrollTo = function(element) { + var options = arguments[1] || { }, + scrollOffsets = document.viewport.getScrollOffsets(), + elementOffsets = $(element).cumulativeOffset(); + + if (options.offset) elementOffsets[1] += options.offset; + + return new Effect.Tween(null, + scrollOffsets.top, + elementOffsets[1], + options, + function(p){ scrollTo(scrollOffsets.left, p.round()); } + ); +}; + +/* ------------- combination effects ------------- */ + +Effect.Fade = function(element) { + element = $(element); + var oldOpacity = element.getInlineOpacity(); + var options = Object.extend({ + from: element.getOpacity() || 1.0, + to: 0.0, + afterFinishInternal: function(effect) { + if (effect.options.to!=0) return; + effect.element.hide().setStyle({opacity: oldOpacity}); + } + }, arguments[1] || { }); + return new Effect.Opacity(element,options); +}; + +Effect.Appear = function(element) { + element = $(element); + var options = Object.extend({ + from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0), + to: 1.0, + // force Safari to render floated elements properly + afterFinishInternal: function(effect) { + effect.element.forceRerendering(); + }, + beforeSetup: function(effect) { + effect.element.setOpacity(effect.options.from).show(); + }}, arguments[1] || { }); + return new Effect.Opacity(element,options); +}; + +Effect.Puff = function(element) { + element = $(element); + var oldStyle = { + opacity: element.getInlineOpacity(), + position: element.getStyle('position'), + top: element.style.top, + left: element.style.left, + width: element.style.width, + height: element.style.height + }; + return new Effect.Parallel( + [ new Effect.Scale(element, 200, + { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), + new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], + Object.extend({ duration: 1.0, + beforeSetupInternal: function(effect) { + Position.absolutize(effect.effects[0].element); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.hide().setStyle(oldStyle); } + }, arguments[1] || { }) + ); +}; + +Effect.BlindUp = function(element) { + element = $(element); + element.makeClipping(); + return new Effect.Scale(element, 0, + Object.extend({ scaleContent: false, + scaleX: false, + restoreAfterFinish: true, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping(); + } + }, arguments[1] || { }) + ); +}; + +Effect.BlindDown = function(element) { + element = $(element); + var elementDimensions = element.getDimensions(); + return new Effect.Scale(element, 100, Object.extend({ + scaleContent: false, + scaleX: false, + scaleFrom: 0, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { + effect.element.makeClipping().setStyle({height: '0px'}).show(); + }, + afterFinishInternal: function(effect) { + effect.element.undoClipping(); + } + }, arguments[1] || { })); +}; + +Effect.SwitchOff = function(element) { + element = $(element); + var oldOpacity = element.getInlineOpacity(); + return new Effect.Appear(element, Object.extend({ + duration: 0.4, + from: 0, + transition: Effect.Transitions.flicker, + afterFinishInternal: function(effect) { + new Effect.Scale(effect.element, 1, { + duration: 0.3, scaleFromCenter: true, + scaleX: false, scaleContent: false, restoreAfterFinish: true, + beforeSetup: function(effect) { + effect.element.makePositioned().makeClipping(); + }, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity}); + } + }); + } + }, arguments[1] || { })); +}; + +Effect.DropOut = function(element) { + element = $(element); + var oldStyle = { + top: element.getStyle('top'), + left: element.getStyle('left'), + opacity: element.getInlineOpacity() }; + return new Effect.Parallel( + [ new Effect.Move(element, {x: 0, y: 100, sync: true }), + new Effect.Opacity(element, { sync: true, to: 0.0 }) ], + Object.extend( + { duration: 0.5, + beforeSetup: function(effect) { + effect.effects[0].element.makePositioned(); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle); + } + }, arguments[1] || { })); +}; + +Effect.Shake = function(element) { + element = $(element); + var options = Object.extend({ + distance: 20, + duration: 0.5 + }, arguments[1] || {}); + var distance = parseFloat(options.distance); + var split = parseFloat(options.duration) / 10.0; + var oldStyle = { + top: element.getStyle('top'), + left: element.getStyle('left') }; + return new Effect.Move(element, + { x: distance, y: 0, duration: split, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) { + effect.element.undoPositioned().setStyle(oldStyle); + }}); }}); }}); }}); }}); }}); +}; + +Effect.SlideDown = function(element) { + element = $(element).cleanWhitespace(); + // SlideDown need to have the content of the element wrapped in a container element with fixed height! + var oldInnerBottom = element.down().getStyle('bottom'); + var elementDimensions = element.getDimensions(); + return new Effect.Scale(element, 100, Object.extend({ + scaleContent: false, + scaleX: false, + scaleFrom: window.opera ? 0 : 1, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { + effect.element.makePositioned(); + effect.element.down().makePositioned(); + if (window.opera) effect.element.setStyle({top: ''}); + effect.element.makeClipping().setStyle({height: '0px'}).show(); + }, + afterUpdateInternal: function(effect) { + effect.element.down().setStyle({bottom: + (effect.dims[0] - effect.element.clientHeight) + 'px' }); + }, + afterFinishInternal: function(effect) { + effect.element.undoClipping().undoPositioned(); + effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); } + }, arguments[1] || { }) + ); +}; + +Effect.SlideUp = function(element) { + element = $(element).cleanWhitespace(); + var oldInnerBottom = element.down().getStyle('bottom'); + var elementDimensions = element.getDimensions(); + return new Effect.Scale(element, window.opera ? 0 : 1, + Object.extend({ scaleContent: false, + scaleX: false, + scaleMode: 'box', + scaleFrom: 100, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { + effect.element.makePositioned(); + effect.element.down().makePositioned(); + if (window.opera) effect.element.setStyle({top: ''}); + effect.element.makeClipping().show(); + }, + afterUpdateInternal: function(effect) { + effect.element.down().setStyle({bottom: + (effect.dims[0] - effect.element.clientHeight) + 'px' }); + }, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping().undoPositioned(); + effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); + } + }, arguments[1] || { }) + ); +}; + +// Bug in opera makes the TD containing this element expand for a instance after finish +Effect.Squish = function(element) { + return new Effect.Scale(element, window.opera ? 1 : 0, { + restoreAfterFinish: true, + beforeSetup: function(effect) { + effect.element.makeClipping(); + }, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping(); + } + }); +}; + +Effect.Grow = function(element) { + element = $(element); + var options = Object.extend({ + direction: 'center', + moveTransition: Effect.Transitions.sinoidal, + scaleTransition: Effect.Transitions.sinoidal, + opacityTransition: Effect.Transitions.full + }, arguments[1] || { }); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: element.getInlineOpacity() }; + + var dims = element.getDimensions(); + var initialMoveX, initialMoveY; + var moveX, moveY; + + switch (options.direction) { + case 'top-left': + initialMoveX = initialMoveY = moveX = moveY = 0; + break; + case 'top-right': + initialMoveX = dims.width; + initialMoveY = moveY = 0; + moveX = -dims.width; + break; + case 'bottom-left': + initialMoveX = moveX = 0; + initialMoveY = dims.height; + moveY = -dims.height; + break; + case 'bottom-right': + initialMoveX = dims.width; + initialMoveY = dims.height; + moveX = -dims.width; + moveY = -dims.height; + break; + case 'center': + initialMoveX = dims.width / 2; + initialMoveY = dims.height / 2; + moveX = -dims.width / 2; + moveY = -dims.height / 2; + break; + } + + return new Effect.Move(element, { + x: initialMoveX, + y: initialMoveY, + duration: 0.01, + beforeSetup: function(effect) { + effect.element.hide().makeClipping().makePositioned(); + }, + afterFinishInternal: function(effect) { + new Effect.Parallel( + [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }), + new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }), + new Effect.Scale(effect.element, 100, { + scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, + sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true}) + ], Object.extend({ + beforeSetup: function(effect) { + effect.effects[0].element.setStyle({height: '0px'}).show(); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); + } + }, options) + ); + } + }); +}; + +Effect.Shrink = function(element) { + element = $(element); + var options = Object.extend({ + direction: 'center', + moveTransition: Effect.Transitions.sinoidal, + scaleTransition: Effect.Transitions.sinoidal, + opacityTransition: Effect.Transitions.none + }, arguments[1] || { }); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: element.getInlineOpacity() }; + + var dims = element.getDimensions(); + var moveX, moveY; + + switch (options.direction) { + case 'top-left': + moveX = moveY = 0; + break; + case 'top-right': + moveX = dims.width; + moveY = 0; + break; + case 'bottom-left': + moveX = 0; + moveY = dims.height; + break; + case 'bottom-right': + moveX = dims.width; + moveY = dims.height; + break; + case 'center': + moveX = dims.width / 2; + moveY = dims.height / 2; + break; + } + + return new Effect.Parallel( + [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }), + new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}), + new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }) + ], Object.extend({ + beforeStartInternal: function(effect) { + effect.effects[0].element.makePositioned().makeClipping(); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); } + }, options) + ); +}; + +Effect.Pulsate = function(element) { + element = $(element); + var options = arguments[1] || { }, + oldOpacity = element.getInlineOpacity(), + transition = options.transition || Effect.Transitions.linear, + reverser = function(pos){ + return 1 - transition((-Math.cos((pos*(options.pulses||5)*2)*Math.PI)/2) + .5); + }; + + return new Effect.Opacity(element, + Object.extend(Object.extend({ duration: 2.0, from: 0, + afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); } + }, options), {transition: reverser})); +}; + +Effect.Fold = function(element) { + element = $(element); + var oldStyle = { + top: element.style.top, + left: element.style.left, + width: element.style.width, + height: element.style.height }; + element.makeClipping(); + return new Effect.Scale(element, 5, Object.extend({ + scaleContent: false, + scaleX: false, + afterFinishInternal: function(effect) { + new Effect.Scale(element, 1, { + scaleContent: false, + scaleY: false, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping().setStyle(oldStyle); + } }); + }}, arguments[1] || { })); +}; + +Effect.Morph = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ + style: { } + }, arguments[1] || { }); + + if (!Object.isString(options.style)) this.style = $H(options.style); + else { + if (options.style.include(':')) + this.style = options.style.parseStyle(); + else { + this.element.addClassName(options.style); + this.style = $H(this.element.getStyles()); + this.element.removeClassName(options.style); + var css = this.element.getStyles(); + this.style = this.style.reject(function(style) { + return style.value == css[style.key]; + }); + options.afterFinishInternal = function(effect) { + effect.element.addClassName(effect.options.style); + effect.transforms.each(function(transform) { + effect.element.style[transform.style] = ''; + }); + }; + } + } + this.start(options); + }, + + setup: function(){ + function parseColor(color){ + if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff'; + color = color.parseColor(); + return $R(0,2).map(function(i){ + return parseInt( color.slice(i*2+1,i*2+3), 16 ); + }); + } + this.transforms = this.style.map(function(pair){ + var property = pair[0], value = pair[1], unit = null; + + if (value.parseColor('#zzzzzz') != '#zzzzzz') { + value = value.parseColor(); + unit = 'color'; + } else if (property == 'opacity') { + value = parseFloat(value); + if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) + this.element.setStyle({zoom: 1}); + } else if (Element.CSS_LENGTH.test(value)) { + var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/); + value = parseFloat(components[1]); + unit = (components.length == 3) ? components[2] : null; + } + + var originalValue = this.element.getStyle(property); + return { + style: property.camelize(), + originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), + targetValue: unit=='color' ? parseColor(value) : value, + unit: unit + }; + }.bind(this)).reject(function(transform){ + return ( + (transform.originalValue == transform.targetValue) || + ( + transform.unit != 'color' && + (isNaN(transform.originalValue) || isNaN(transform.targetValue)) + ) + ); + }); + }, + update: function(position) { + var style = { }, transform, i = this.transforms.length; + while(i--) + style[(transform = this.transforms[i]).style] = + transform.unit=='color' ? '#'+ + (Math.round(transform.originalValue[0]+ + (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() + + (Math.round(transform.originalValue[1]+ + (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() + + (Math.round(transform.originalValue[2]+ + (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() : + (transform.originalValue + + (transform.targetValue - transform.originalValue) * position).toFixed(3) + + (transform.unit === null ? '' : transform.unit); + this.element.setStyle(style, true); + } +}); + +Effect.Transform = Class.create({ + initialize: function(tracks){ + this.tracks = []; + this.options = arguments[1] || { }; + this.addTracks(tracks); + }, + addTracks: function(tracks){ + tracks.each(function(track){ + track = $H(track); + var data = track.values().first(); + this.tracks.push($H({ + ids: track.keys().first(), + effect: Effect.Morph, + options: { style: data } + })); + }.bind(this)); + return this; + }, + play: function(){ + return new Effect.Parallel( + this.tracks.map(function(track){ + var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options'); + var elements = [$(ids) || $$(ids)].flatten(); + return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)) }); + }).flatten(), + this.options + ); + } +}); + +Element.CSS_PROPERTIES = $w( + 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + + 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' + + 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' + + 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' + + 'fontSize fontWeight height left letterSpacing lineHeight ' + + 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+ + 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' + + 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' + + 'right textIndent top width wordSpacing zIndex'); + +Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; + +String.__parseStyleElement = document.createElement('div'); +String.prototype.parseStyle = function(){ + var style, styleRules = $H(); + if (Prototype.Browser.WebKit) + style = new Element('div',{style:this}).style; + else { + String.__parseStyleElement.innerHTML = '
    '; + style = String.__parseStyleElement.childNodes[0].style; + } + + Element.CSS_PROPERTIES.each(function(property){ + if (style[property]) styleRules.set(property, style[property]); + }); + + if (Prototype.Browser.IE && this.include('opacity')) + styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]); + + return styleRules; +}; + +if (document.defaultView && document.defaultView.getComputedStyle) { + Element.getStyles = function(element) { + var css = document.defaultView.getComputedStyle($(element), null); + return Element.CSS_PROPERTIES.inject({ }, function(styles, property) { + styles[property] = css[property]; + return styles; + }); + }; +} else { + Element.getStyles = function(element) { + element = $(element); + var css = element.currentStyle, styles; + styles = Element.CSS_PROPERTIES.inject({ }, function(results, property) { + results[property] = css[property]; + return results; + }); + if (!styles.opacity) styles.opacity = element.getOpacity(); + return styles; + }; +} + +Effect.Methods = { + morph: function(element, style) { + element = $(element); + new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { })); + return element; + }, + visualEffect: function(element, effect, options) { + element = $(element); + var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1); + new Effect[klass](element, options); + return element; + }, + highlight: function(element, options) { + element = $(element); + new Effect.Highlight(element, options); + return element; + } +}; + +$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+ + 'pulsate shake puff squish switchOff dropOut').each( + function(effect) { + Effect.Methods[effect] = function(element, options){ + element = $(element); + Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options); + return element; + }; + } +); + +$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each( + function(f) { Effect.Methods[f] = Element[f]; } +); + +Element.addMethods(Effect.Methods); \ No newline at end of file diff --git a/themes/olive/javascripts/effects2.js b/themes/olive/javascripts/effects2.js deleted file mode 100755 index 6b73620..0000000 --- a/themes/olive/javascripts/effects2.js +++ /dev/null @@ -1,349 +0,0 @@ -// Copyright (c) 2005 Thomas Fuchs (http://mir.aculo.us) -// -// 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. - - - Effect2 = {} - - /* ------------- transitions ------------- */ - - Effect2.Transitions = {} - Effect2.Transitions.linear = function(pos) { - return pos; - } - Effect2.Transitions.sinoidal = function(pos) { - return (-Math.cos(pos*Math.PI)/2) + 0.5; - } - Effect2.Transitions.reverse = function(pos) { - return 1-pos; - } - Effect2.Transitions.flicker = function(pos) { - return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random(0.25); - } - Effect2.Transitions.wobble = function(pos) { - return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5; - } - - /* ------------- core effects ------------- */ - - Effect2.Base = function() {}; - Effect2.Base.prototype = { - setOptions: function(options) { - this.options = { - transition: Effect2.Transitions.sinoidal, - duration: 1.0, // seconds - fps: 25.0, // max. 100fps - sync: false, // true for combining - from: 0.0, - to: 1.0 - }.extend(options || {}); - }, - start: function(options) { - this.setOptions(options || {}); - this.currentFrame = 0; - this.startOn = new Date().getTime(); - this.finishOn = this.startOn + (this.options.duration*1000); - if(this.options.beforeStart) this.options.beforeStart(this); - if(!this.options.sync) this.loop(); - }, - loop: function() { - timePos = new Date().getTime(); - if(timePos >= this.finishOn) { - this.render(this.options.to); - if(this.finish) this.finish(); - if(this.options.afterFinish) this.options.afterFinish(this); - return; - } - pos = (timePos - this.startOn) / (this.finishOn - this.startOn); - frame = Math.round(pos * this.options.fps * this.options.duration); - if(frame > this.currentFrame) { - this.render(pos); - this.currentFrame = frame; - } - this.timeout = setTimeout(this.loop.bind(this), 10); - }, - render: function(pos) { - if(this.options.transition) pos = this.options.transition(pos); - pos = pos * (this.options.to-this.options.from); - pos += this.options.from; - if(this.options.beforeUpdate) this.options.beforeUpdate(this); - if(this.update) this.update(pos); - if(this.options.afterUpdate) this.options.afterUpdate(this); - }, - cancel: function() { - if(this.timeout) clearTimeout(this.timeout); - } - } - - Effect2.Parallel = Class.create(); - Effect2.Parallel.prototype = (new Effect2.Base()).extend({ - initialize: function(effects) { - this.effects = effects || []; - this.start(arguments[1]); - }, - update: function(position) { - for (var i = 0; i < this.effects.length; i++) - this.effects[i].render(position); - }, - finish: function(position) { - for (var i = 0; i < this.effects.length; i++) - if(this.effects[i].finish) this.effects[i].finish(position); - } - }); - - Effect2.Opacity = Class.create(); - Effect2.Opacity.prototype = (new Effect2.Base()).extend({ - initialize: function() { - this.element = $(arguments[0] || document.rootElement); - options = { - from: 0.0, - to: 1.0 - }.extend(arguments[1] || {}); - this.start(options); - }, - update: function(position) { - this.setOpacity(position); - }, - setOpacity: function(opacity) { - opacity = (opacity == 1) ? 0.99999 : opacity; - this.element.style.opacity = opacity; - this.element.style.filter = "alpha(opacity:"+opacity*100+")"; - } - }); - - Effect2.MoveBy = Class.create(); - Effect2.MoveBy.prototype = (new Effect2.Base()).extend({ - initialize: function(element, toTop, toLeft) { - this.element = $(element); - this.originalTop = - this.element.style.top ? parseFloat(this.element.style.top) : 0; - this.originalLeft = - this.element.style.left ? parseFloat(this.element.style.left) : 0; - this.toTop = toTop; - this.toLeft = toLeft; - if(this.element.style.position == "") - this.element.style.position = "relative"; - this.start(arguments[3]); - }, - update: function(position) { - topd = this.toTop * position + this.originalTop; - leftd = this.toLeft * position + this.originalLeft; - this.setPosition(topd, leftd); - }, - setPosition: function(topd, leftd) { - this.element.style.top = topd + "px"; - this.element.style.left = leftd + "px"; - } - }); - - Effect2.Scale = Class.create(); - Effect2.Scale.prototype = (new Effect2.Base()).extend({ - initialize: function(element, percent) { - this.element = $(element) - options = { - scaleX: true, - scaleY: true, - scaleContent: true, - scaleFromCenter: false, - scaleMode: 'box', // 'box' or 'contents' - scaleFrom: 100.0 - }.extend(arguments[2] || {}); - this.originalTop = this.element.offsetTop; - this.originalLeft = this.element.offsetLeft; - if (this.element.style.fontSize=="") this.sizeEm = 1.0; - if (this.element.style.fontSize && this.element.style.fontSize.indexOf("em")>0) - this.sizeEm = parseFloat(this.element.style.fontSize); - this.factor = (percent/100.0) - (options.scaleFrom/100.0); - if(options.scaleMode=='box') { - this.originalHeight = this.element.clientHeight; - this.originalWidth = this.element.clientWidth; - } else - if(options.scaleMode=='contents') { - this.originalHeight = this.element.scrollHeight; - this.originalWidth = this.element.scrollWidth; - } - this.start(options); - }, - - update: function(position) { - currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); - if(this.options.scaleContent && this.sizeEm) - this.element.style.fontSize = this.sizeEm*currentScale + "em"; - this.setDimensions( - this.originalWidth * currentScale, - this.originalHeight * currentScale); - }, - - setDimensions: function(width, height) { - if(this.options.scaleX) this.element.style.width = width + 'px'; - if(this.options.scaleY) this.element.style.height = height + 'px'; - if(this.options.scaleFromCenter) { - topd = (height - this.originalHeight)/2; - leftd = (width - this.originalWidth)/2; - if(this.element.style.position=='absolute') { - if(this.options.scaleY) this.element.style.top = this.originalTop-topd + "px"; - if(this.options.scaleX) this.element.style.left = this.originalLeft-leftd + "px"; - } else { - if(this.options.scaleY) this.element.style.top = -topd + "px"; - if(this.options.scaleX) this.element.style.left = -leftd + "px"; - } - } - } - }); - - /* ------------- prepackaged effects ------------- */ - - Effect2.Fade = function(element) { - options = { - from: 1.0, - to: 0.0, - afterFinish: function(effect) - { Element.hide(effect.element); - effect.setOpacity(1); } - }.extend(arguments[1] || {}); - new Effect2.Opacity(element,options); - } - -Effect2.Appear = function(element) { - options = { - from: 0.0, - to: 1.0, - beforeStart: function(effect) - { effect.setOpacity(0); - Element.show(effect.element); }, - afterUpdate: function(effect) - { Element.show(effect.element); } - }.extend(arguments[1] || {}); - new Effect2.Opacity(element,options); -} - - Effect2.Puff = function(element) { - new Effect2.Parallel( - [ new Effect2.Scale(element, 200, { sync: true, scaleFromCenter: true }), - new Effect2.Opacity(element, { sync: true, to: 0.0, from: 1.0 } ) ], - { duration: 1.0, - afterUpdate: function(effect) - { effect.effects[0].element.style.position = 'absolute'; }, - afterFinish: function(effect) - { Element.hide(effect.effects[0].element); } - } - ); - } - - Effect2.BlindUp = function(element) { - $(element).style.overflow = 'hidden'; - new Effect2.Scale(element, 0, - { scaleContent: false, - scaleX: false, - afterFinish: function(effect) - { Element.hide(effect.element) } - }.extend(arguments[1] || {}) - ); - } - - Effect2.BlindDown = function(element) { - $(element).style.height = '0px'; - $(element).style.overflow = 'hidden'; - Element.show(element); - new Effect2.Scale(element, 100, - { scaleContent: false, - scaleX: false, - scaleMode: 'contents', - scaleFrom: 0 - }.extend(arguments[1] || {}) - ); - } - - Effect2.SwitchOff = function(element) { - new Effect2.Appear(element, - { duration: 0.4, - transition: Effect2.Transitions.flicker, - afterFinish: function(effect) - { effect.element.style.overflow = 'hidden'; - new Effect2.Scale(effect.element, 1, - { duration: 0.3, scaleFromCenter: true, - scaleX: false, scaleContent: false, - afterUpdate: function(effect) { - if(effect.element.style.position=="") - effect.element.style.position = 'relative'; }, - afterFinish: function(effect) { Element.hide(effect.element); } - } ) - } - } ) - } - - Effect2.DropOut = function(element) { - new Effect2.Parallel( - [ new Effect2.MoveBy(element, 100, 0, { sync: true }), - new Effect2.Opacity(element, { sync: true, to: 0.0, from: 1.0 } ) ], - { duration: 0.5, - afterFinish: function(effect) - { Element.hide(effect.effects[0].element); } - }); - } - - Effect2.Shake = function(element) { - new Effect2.MoveBy(element, 0, 20, - { duration: 0.05, afterFinish: function(effect) { - new Effect2.MoveBy(effect.element, 0, -40, - { duration: 0.1, afterFinish: function(effect) { - new Effect2.MoveBy(effect.element, 0, 40, - { duration: 0.1, afterFinish: function(effect) { - new Effect2.MoveBy(effect.element, 0, -40, - { duration: 0.1, afterFinish: function(effect) { - new Effect2.MoveBy(effect.element, 0, 40, - { duration: 0.1, afterFinish: function(effect) { - new Effect2.MoveBy(effect.element, 0, -20, - { duration: 0.05, afterFinish: function(effect) { - }}) }}) }}) }}) }}) }}); - } - - Effect2.SlideDown = function(element) { - $(element).style.height = '0px'; - $(element).style.overflow = 'hidden'; - $(element).firstChild.style.position = 'relative'; - Element.show(element); - new Effect2.Scale(element, 100, - { scaleContent: false, - scaleX: false, - scaleMode: 'contents', - scaleFrom: 0, - afterUpdate: function(effect) - { effect.element.firstChild.style.bottom = - (effect.originalHeight - effect.element.clientHeight) + 'px'; } - }.extend(arguments[1] || {}) - ); - } - - Effect2.SlideUp = function(element) { - $(element).style.overflow = 'hidden'; - $(element).firstChild.style.position = 'relative'; - Element.show(element); - new Effect2.Scale(element, 0, - { scaleContent: false, - scaleX: false, - afterUpdate: function(effect) - { effect.element.firstChild.style.bottom = - (effect.originalHeight - effect.element.clientHeight) + 'px'; }, - afterFinish: function(effect) - { Element.hide(effect.element); } - }.extend(arguments[1] || {}) - ); - } \ No newline at end of file diff --git a/themes/olive/javascripts/global.js b/themes/olive/javascripts/global.js deleted file mode 100755 index 1176552..0000000 --- a/themes/olive/javascripts/global.js +++ /dev/null @@ -1,216 +0,0 @@ -function changeLoc(loc) { - window.location = loc -} -function getCookie(name) { - var prefix = name + "="; - var cStr = document.cookie; - var start = cStr.indexOf(prefix); - if (start == -1) { - return null; - } - var end = cStr.indexOf(";", start + prefix.length); - if (end == -1) { - end = cStr.length; - } - var value = cStr.substring(start + prefix.length, end); - return unescape(value); -} -function setCookie(name, value, expiration) { - document.cookie = name + "=" + value + "; expires=" + expiration; -} -function toggleCheckbox(checkBox) { - var element = document.getElementById(checkBox.id); - if (element.value == "1" || element.checked) { - element.checked = false; - element.value = "0"; - } else { - element.checked = true; - element.value = "1"; - } -} -function toggleChkbox(checkBox) { - if (checkBox.checked) { - checkBox.checked = true; - } else { - checkBox.checked = false; - } -} -function toggle_list(id) { - ul = "ul_" + id; - img = "img_" + id; - hid = "h_" + id; - ulElement = document.getElementById(ul); - imgElement = document.getElementById(img); - hiddenElement = document.getElementById(hid); - if (ulElement) { - if (ulElement.className == 'closed') { - ulElement.className = "open"; - imgElement.src = "/themes/original/images/list_opened.gif"; - hiddenElement.value = "1" - } else { - ulElement.className = "closed"; - imgElement.src = "/themes/original/images/list_closed.gif"; - hiddenElement.value = "0" - } - } -} -function toggle_layer(id) { - lElement = document.getElementById(id); - imgElement = document.getElementById("img_" + id); - if (lElement) { - if (lElement.className == 'closed') { - lElement.className = "open"; - imgElement.src = "/themes/original/images/list_opened.gif"; - return true; - } else { - lElement.className = "closed"; - imgElement.src = "/themes/original/images/list_closed.gif"; - return false; - } - } - return true; -} -function toggle_layer_status(id) { - lElement = document.getElementById(id); - if (lElement) { - if (lElement.className == 'closed') { - return false; - } else { - return true; - } - } - return true; -} -function toggle_text(id) { - if (document.getElementById) elem = document.getElementById(id); - else if (document.all) elem = eval("document.all." + id); - else return false; - if (!elem) return true; - elemStyle = elem.style; - if (elemStyle.display != "block") { - elemStyle.display = "block" - } else { - elemStyle.display = "none" - } - return true; -} -function getFF(id) { - if (document.getElementById) elem = document.getElementById(id); - else if (document.all) elem = document.eval("document.all." + id); - return elem -} -function setFF(id, value) { - if (getFF(id)) getFF(id).value = value; -} -function setCFF(id) { - if (getFF(id)) getFF(id).checked = true; -} -function updateSUFromC(btnName) { - var suem = getCookie('_cdf_em'); - var sueg = getCookie('_cdf_gr'); - if (suem != "" && suem != null && suem != "undefined") { - setFF('sup_email', suem); - setFF('signup_submit_button', btnName); - } - if (sueg && sueg != "") { - if (sueg.indexOf(",") < 0 && sueg != "") { - gr_id = sueg; - setCFF('supgr_' + gr_id); - } else while ((i = sueg.indexOf(",")) >= 0) { - gr_id = sueg.substring(0, i); - sueg = sueg.substring(i + 1); - setCFF('supgr_' + gr_id); - } - if (sueg.indexOf(",") < 0 && sueg != "") { - gr_id = sueg; - setCFF('supgr_' + gr_id); - } - } -} -function updateLUEfC() { - var suem = getCookie('_cdf_em'); - if (suem != "" && suem != null && suem != "undefined") { - setFF('login_user_email', suem); - } -} -function replaceHRFST(ifrm) { - var o = ifrm; - var w = null; - if (o.contentWindow) { - w = o.contentWindow; - } else if (window.frames && window.frames[o.id].window) { - w = window.frames[o.id]; - } else return; - var doc = w.document; - if (!doc.getElementsByTagName) return; - var anchors = doc.getElementsByTagName("a"); - for (var i = 0; i < anchors.length; i++) { - var anchor = anchors[i]; - if (anchor.getAttribute("href")) anchor.target = "_top"; - } - iHeight = doc.body.scrollHeight; - ifrm.style.height = iHeight + "px" -} -function rs(n, u, w, h, x) { - args = "width=" + w + ",height=" + h + ",resizable=yes,scrollbars=yes,status=0"; - remote = window.open(u, n, args); - if (remote != null && remote.opener == null) remote.opener = self; - if (x == 1) return remote; -} -function wizard_step_onclick(direction, alt_url) { - if (document.forms[0]) { - direction_elem = ''; - if (document.getElementById) { - direction_elem = document.getElementById('wiz_dir'); - } else if (document.all) { - direction_elem = document.eval("document.all.wiz_dir"); - } - if (direction_elem) { - direction_elem.value = direction; - } - if (document.forms[0].onsubmit) { - document.forms[0].onsubmit(); - } - document.forms[0].submit(); - } else { - window.location = alt_url; - } -} -function toggle_adtype(ad_type) { - toggle_text('upload_banner_label'); - toggle_text('upload_banner'); - toggle_text('radio1_label'); - toggle_text('radio1'); - toggle_text('radio2_label'); - toggle_text('radio2'); - toggle_text('adtitle_label'); - toggle_text('adtitle'); - toggle_text('adtext_label'); - toggle_text('adtext'); - toggle_text('banner_size_label'); - toggle_text('banner_size'); -} -function show_date_as_local_time() { - var spans = document.getElementsByTagName('span'); - for (var i = 0; i < spans.length; i++) if (spans[i].className.match(/\bLOCAL_TIME\b/i)) { - system_date = new Date(Date.parse(spans[i].innerHTML)); - if (system_date.getHours() >= 12) { - adds = ' PM'; - h = system_date.getHours() - 12; - } else { - adds = ' AM'; - h = system_date.getHours(); - } - spans[i].innerHTML = h + ":" + (system_date.getMinutes() + "").replace(/\b(\d)\b/g, '0$1') + adds; - } -} -function PopupPic(sPicURL, sWidth, sHeight) { - window.open("/popup.htm?" + sPicURL, "", "resizable=1,HEIGHT=" + sHeight + ",WIDTH=" + sWidth + ",scrollbars=yes"); -} -function open_link(target, location) { - if (target == 'blank') { - window.open(location); - } else { - window.top.location = location; - } -} diff --git a/themes/olive/javascripts/global_src.js b/themes/olive/javascripts/global_src.js deleted file mode 100755 index 76b3fb7..0000000 --- a/themes/olive/javascripts/global_src.js +++ /dev/null @@ -1,201 +0,0 @@ -function changeLoc(loc) { window.location = loc } -function getCookie(name) { - var prefix = name + "="; - var cStr = document.cookie; - var start = cStr.indexOf(prefix); - if (start==-1) { - return null; - } - - var end = cStr.indexOf(";", start+prefix.length); - if (end==-1) { end=cStr.length; } - - var value=cStr.substring(start+prefix.length, end); - return unescape(value); -} -function setCookie(name, value, expiration) { - document.cookie = name+"="+value+"; expires="+expiration; -} -function toggleCheckbox(checkBox) { - var element = document.getElementById(checkBox.id); - if (element.value == "1" || element.checked) { - element.checked = false; - element.value = "0"; - } else { - element.checked = true; - element.value = "1"; - } -} -function toggleChkbox(checkBox) { - if (checkBox.checked) { - checkBox.checked = true; - } else { - checkBox.checked = false; - } -} -function toggle_list(id){ - ul = "ul_" + id; - img = "img_" + id; - hid = "h_" + id; - ulElement = document.getElementById(ul); - imgElement = document.getElementById(img); - hiddenElement = document.getElementById(hid); - if (ulElement){ - if (ulElement.className == 'closed'){ - ulElement.className = "open"; - imgElement.src = "/themes/original/images/list_opened.gif"; - hiddenElement.value = "1" - }else{ - ulElement.className = "closed"; - imgElement.src = "/themes/original/images/list_closed.gif"; - hiddenElement.value = "0" - } - } -} -function toggle_layer(id) { - lElement = document.getElementById(id); - imgElement = document.getElementById("img_" + id); - if (lElement){ - if (lElement.className == 'closed'){ - lElement.className = "open"; - imgElement.src = "/themes/original/images/list_opened.gif"; - return true; - }else{ - lElement.className = "closed"; - imgElement.src = "/themes/original/images/list_closed.gif"; - return false; - } - } - return true; -} -function toggle_layer_status(id) { - lElement = document.getElementById(id); - if (lElement){ - if (lElement.className == 'closed'){ - return false; - }else{ - return true; - } - } - return true; -} -function toggle_text(id){ - if ( document.getElementById ) - elem = document.getElementById( id ); - else if ( document.all ) - elem = eval( "document.all." + id ); - else - return false; - - if(!elem) return true; - - elemStyle = elem.style; - if ( elemStyle.display != "block" ) { - elemStyle.display = "block" - } else { - elemStyle.display = "none" - } - return true; -} -function getFF(id) { - if ( document.getElementById ) elem = document.getElementById( id ); - else if ( document.all ) elem = document.eval( "document.all." + id ); - return elem -} -function setFF(id, value) {if(getFF(id))getFF(id).value=value;} -function setCFF(id) {if(getFF(id))getFF(id).checked=true;} -function updateSUFromC(btnName) { - var suem = getCookie('_cdf_em');var sueg = getCookie('_cdf_gr'); - if (suem != "" && suem != null && suem != "undefined") { setFF('sup_email', suem); setFF('signup_submit_button',btnName); } - - if (sueg && sueg != "") { - if (sueg.indexOf(",") < 0 && sueg != "") { gr_id = sueg; setCFF('supgr_'+gr_id); - } else while ((i = sueg.indexOf(",")) >= 0) { gr_id = sueg.substring(0,i); sueg = sueg.substring(i+1); setCFF('supgr_'+gr_id); } - if (sueg.indexOf(",") < 0 && sueg != "") { gr_id = sueg; setCFF('supgr_'+gr_id);} - } -} -function updateLUEfC() { - var suem = getCookie('_cdf_em'); - if (suem != "" && suem != null && suem != "undefined") { setFF('login_user_email', suem); } -} -function replaceHRFST(ifrm) { - var o = ifrm; - var w = null; - if (o.contentWindow) { - // For IE5.5 and IE6 - w = o.contentWindow; - } else if (window.frames && window.frames[o.id].window) { - w = window.frames[o.id]; - } else return; - var doc = w.document; - if (!doc.getElementsByTagName) return; - var anchors = doc.getElementsByTagName("a"); - for (var i=0; i= 12) { adds = ' PM'; h = system_date.getHours() - 12; } - else { adds = ' AM'; h = system_date.getHours(); } - spans[i].innerHTML = h + ":" + (system_date.getMinutes()+"").replace(/\b(\d)\b/g, '0$1') + adds; - } -} -function PopupPic(sPicURL,sWidth,sHeight) { - window.open( "/popup.htm?"+sPicURL, "", "resizable=1,HEIGHT="+sHeight+",WIDTH="+sWidth+",scrollbars=yes"); -} - -function open_link(target, location){ - if (target == 'blank'){ - window.open(location); - } else { - window.top.location = location; - } -} diff --git a/themes/olive/javascripts/htmlstyle.js b/themes/olive/javascripts/htmlstyle.js deleted file mode 100755 index ece3392..0000000 --- a/themes/olive/javascripts/htmlstyle.js +++ /dev/null @@ -1,21 +0,0 @@ -var config = new HTMLArea.Config(); // create a new configuration object - // having all the default values -config.width = '520px'; -config.pageStyle = - 'body { font-family: verdana,sans-serif; font-size: 12px } '; - -config.toolbar = [ -[ "fontname", "fontsize","formatblock","bold", "italic", "underline", "separator", "insertimage", "createlink"], -["justifyleft", "justifycenter", "justifyright", "justifyfull", "separator", "forecolor", "hilitecolor", "separator", "popupeditor", "htmlmode"] -]; -config.statusBar = false; - -var configView = new HTMLArea.Config(); // create a new configuration object - // having all the default values -configView.width = '670px'; -configView.pageStyle = - 'body { font-family: verdana,sans-serif; font-size: 12px } '; - -configView.toolbar = []; -configView.statusBar = false; -configView.readonly = true; \ No newline at end of file diff --git a/themes/olive/javascripts/jstrim.pl b/themes/olive/javascripts/jstrim.pl deleted file mode 100755 index 7829efc..0000000 --- a/themes/olive/javascripts/jstrim.pl +++ /dev/null @@ -1,76 +0,0 @@ -#! /usr/bin/perl -w - -jsTrim("prototype_src.js", "prototype.js"); -jsTrim("global_src.js", "global.js"); -#jsTrim("jscripts/tiny_mce/themes/simple/editor_template_src.js", "jscripts/tiny_mce/themes/simple/editor_template.js"); -#jsTrim("jscripts/tiny_mce/themes/default/editor_template_src.js", "jscripts/tiny_mce/themes/default/editor_template.js"); -#jsTrim("jscripts/tiny_mce/themes/advanced/editor_template_src.js", "jscripts/tiny_mce/themes/advanced/editor_template.js"); -#jsTrim("jscripts/tiny_mce/plugins/advhr/editor_plugin_src.js", "jscripts/tiny_mce/plugins/advhr/editor_plugin.js"); -#jsTrim("jscripts/tiny_mce/plugins/advimage/editor_plugin_src.js", "jscripts/tiny_mce/plugins/advimage/editor_plugin.js"); -#jsTrim("jscripts/tiny_mce/plugins/advlink/editor_plugin_src.js", "jscripts/tiny_mce/plugins/advlink/editor_plugin.js"); -#jsTrim("jscripts/tiny_mce/plugins/emotions/editor_plugin_src.js", "jscripts/tiny_mce/plugins/emotions/editor_plugin.js"); -#jsTrim("jscripts/tiny_mce/plugins/flash/editor_plugin_src.js", "jscripts/tiny_mce/plugins/flash/editor_plugin.js"); -#jsTrim("jscripts/tiny_mce/plugins/iespell/editor_plugin_src.js", "jscripts/tiny_mce/plugins/iespell/editor_plugin.js"); -#jsTrim("jscripts/tiny_mce/plugins/insertdatetime/editor_plugin_src.js", "jscripts/tiny_mce/plugins/insertdatetime/editor_plugin.js"); -#jsTrim("jscripts/tiny_mce/plugins/preview/editor_plugin_src.js", "jscripts/tiny_mce/plugins/preview/editor_plugin.js"); -#jsTrim("jscripts/tiny_mce/plugins/print/editor_plugin_src.js", "jscripts/tiny_mce/plugins/print/editor_plugin.js"); -#jsTrim("jscripts/tiny_mce/plugins/save/editor_plugin_src.js", "jscripts/tiny_mce/plugins/save/editor_plugin.js"); -#jsTrim("jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js", "jscripts/tiny_mce/plugins/searchreplace/editor_plugin.js"); -#jsTrim("jscripts/tiny_mce/plugins/zoom/editor_plugin_src.js", "jscripts/tiny_mce/plugins/zoom/editor_plugin.js"); -#jsTrim("jscripts/tiny_mce/plugins/table/editor_plugin_src.js", "jscripts/tiny_mce/plugins/table/editor_plugin.js"); -#jsTrim("jscripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js", "jscripts/tiny_mce/plugins/contextmenu/editor_plugin.js"); -#jsTrim("jscripts/tiny_mce/plugins/paste/editor_plugin_src.js", "jscripts/tiny_mce/plugins/paste/editor_plugin.js"); -#jsTrim("jscripts/tiny_mce/plugins/fullscreen/editor_plugin_src.js", "jscripts/tiny_mce/plugins/fullscreen/editor_plugin.js"); -#jsTrim("jscripts/tiny_mce/plugins/directionality/editor_plugin_src.js", "jscripts/tiny_mce/plugins/directionality/editor_plugin.js"); - -sub jsTrim { - my $inFile = $_[0]; - my $outFile = $_[1]; - my $comment = ''; - my $content = ''; - - # Load input file - open(FILE, "<$inFile"); - undef $/; - $content = ; - close(FILE); - - if ($content =~ s#^\s*(/\*.*?\*/)##s or $content =~ s#^\s*(//.*?)\n\s*[^/]##s) { - $comment = "$1\n"; - } - - local $^W; - - # removing C/C++ - style comments: - $content =~ s#/\*[^*]*\*+([^/*][^*]*\*+)*/|//[^\n]*|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#$2#gs; - - # save string literals - my @strings = (); - $content =~ s/("(\\.|[^"\\])*"|'(\\.|[^'\\])*')/push(@strings, "$1");'__CMPRSTR_'.$#strings.'__';/egs; - - # remove C-style comments - $content =~ s#/\*.*?\*/##gs; - # remove C++-style comments - $content =~ s#//.*?\n##gs; - # removing leading/trailing whitespace: - #$content =~ s#(?:(?:^|\n)\s+|\s+(?:$|\n))##gs; - # removing newlines: - #$content =~ s#\r?\n##gs; - - # removing other whitespace (between operators, etc.) (regexp-s stolen from Mike Hall's JS Crunchinator) - $content =~ s/\s+/ /gs; # condensing whitespace - #$content =~ s/^\s(.*)/$1/gs; # condensing whitespace - #$content =~ s/(.*)\s$/$1/gs; # condensing whitespace - $content =~ s/\s([\x21\x25\x26\x28\x29\x2a\x2b\x2c\x2d\x2f\x3a\x3b\x3c\x3d\x3e\x3f\x5b\x5d\x5c\x7b\x7c\x7d\x7e])/$1/gs; - $content =~ s/([\x21\x25\x26\x28\x29\x2a\x2b\x2c\x2d\x2f\x3a\x3b\x3c\x3d\x3e\x3f\x5b\x5d\x5c\x7b\x7c\x7d\x7e])\s/$1/gs; - - # restore string literals - $content =~ s/__CMPRSTR_([0-9]+)__/$strings[$1]/egs; - - # Write to ouput file - open(FILE, ">$outFile"); - flock(FILE, 2); - seek(FILE, 0, 2); - print FILE $comment, $content; - close(FILE); -} diff --git a/themes/olive/javascripts/prototype.js b/themes/olive/javascripts/prototype.js new file mode 100755 index 0000000..06249a6 --- /dev/null +++ b/themes/olive/javascripts/prototype.js @@ -0,0 +1,6001 @@ +/* Prototype JavaScript framework, version 1.7_rc2 + * (c) 2005-2010 Sam Stephenson + * + * Prototype is freely distributable under the terms of an MIT-style license. + * For details, see the Prototype web site: http://www.prototypejs.org/ + * + *--------------------------------------------------------------------------*/ + +var Prototype = { + + Version: '1.7_rc2', + + Browser: (function(){ + var ua = navigator.userAgent; + var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]'; + return { + IE: !!window.attachEvent && !isOpera, + Opera: isOpera, + WebKit: ua.indexOf('AppleWebKit/') > -1, + Gecko: ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1, + MobileSafari: /Apple.*Mobile/.test(ua) + } + })(), + + BrowserFeatures: { + XPath: !!document.evaluate, + + SelectorsAPI: !!document.querySelector, + + ElementExtensions: (function() { + var constructor = window.Element || window.HTMLElement; + return !!(constructor && constructor.prototype); + })(), + SpecificElementExtensions: (function() { + if (typeof window.HTMLDivElement !== 'undefined') + return true; + + var div = document.createElement('div'), + form = document.createElement('form'), + isSupported = false; + + if (div['__proto__'] && (div['__proto__'] !== form['__proto__'])) { + isSupported = true; + } + + div = form = null; + + return isSupported; + })() + }, + + ScriptFragment: ']*>([\\S\\s]*?)<\/script>', + JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, + + emptyFunction: function() { }, + + K: function(x) { return x } +}; + +if (Prototype.Browser.MobileSafari) + Prototype.BrowserFeatures.SpecificElementExtensions = false; + + +var Abstract = { }; + + +var Try = { + these: function() { + var returnValue; + + for (var i = 0, length = arguments.length; i < length; i++) { + var lambda = arguments[i]; + try { + returnValue = lambda(); + break; + } catch (e) { } + } + + return returnValue; + } +}; + +/* Based on Alex Arnell's inheritance implementation. */ + +var Class = (function() { + + var IS_DONTENUM_BUGGY = (function(){ + for (var p in { toString: 1 }) { + if (p === 'toString') return false; + } + return true; + })(); + + function subclass() {}; + function create() { + var parent = null, properties = $A(arguments); + if (Object.isFunction(properties[0])) + parent = properties.shift(); + + function klass() { + this.initialize.apply(this, arguments); + } + + Object.extend(klass, Class.Methods); + klass.superclass = parent; + klass.subclasses = []; + + if (parent) { + subclass.prototype = parent.prototype; + klass.prototype = new subclass; + parent.subclasses.push(klass); + } + + for (var i = 0, length = properties.length; i < length; i++) + klass.addMethods(properties[i]); + + if (!klass.prototype.initialize) + klass.prototype.initialize = Prototype.emptyFunction; + + klass.prototype.constructor = klass; + return klass; + } + + function addMethods(source) { + var ancestor = this.superclass && this.superclass.prototype, + properties = Object.keys(source); + + if (IS_DONTENUM_BUGGY) { + if (source.toString != Object.prototype.toString) + properties.push("toString"); + if (source.valueOf != Object.prototype.valueOf) + properties.push("valueOf"); + } + + for (var i = 0, length = properties.length; i < length; i++) { + var property = properties[i], value = source[property]; + if (ancestor && Object.isFunction(value) && + value.argumentNames()[0] == "$super") { + var method = value; + value = (function(m) { + return function() { return ancestor[m].apply(this, arguments); }; + })(property).wrap(method); + + value.valueOf = method.valueOf.bind(method); + value.toString = method.toString.bind(method); + } + this.prototype[property] = value; + } + + return this; + } + + return { + create: create, + Methods: { + addMethods: addMethods + } + }; +})(); +(function() { + + var _toString = Object.prototype.toString, + NULL_TYPE = 'Null', + UNDEFINED_TYPE = 'Undefined', + BOOLEAN_TYPE = 'Boolean', + NUMBER_TYPE = 'Number', + STRING_TYPE = 'String', + OBJECT_TYPE = 'Object', + BOOLEAN_CLASS = '[object Boolean]', + NUMBER_CLASS = '[object Number]', + STRING_CLASS = '[object String]', + ARRAY_CLASS = '[object Array]', + NATIVE_JSON_STRINGIFY_SUPPORT = window.JSON && + typeof JSON.stringify === 'function' && + JSON.stringify(0) === '0' && + typeof JSON.stringify(Prototype.K) === 'undefined'; + + function Type(o) { + switch(o) { + case null: return NULL_TYPE; + case (void 0): return UNDEFINED_TYPE; + } + var type = typeof o; + switch(type) { + case 'boolean': return BOOLEAN_TYPE; + case 'number': return NUMBER_TYPE; + case 'string': return STRING_TYPE; + } + return OBJECT_TYPE; + } + + function extend(destination, source) { + for (var property in source) + destination[property] = source[property]; + return destination; + } + + function inspect(object) { + try { + if (isUndefined(object)) return 'undefined'; + if (object === null) return 'null'; + return object.inspect ? object.inspect() : String(object); + } catch (e) { + if (e instanceof RangeError) return '...'; + throw e; + } + } + + function toJSON(value) { + return Str('', { '': value }, []); + } + + function Str(key, holder, stack) { + var value = holder[key], + type = typeof value; + + if (Type(value) === OBJECT_TYPE && typeof value.toJSON === 'function') { + value = value.toJSON(key); + } + + var _class = _toString.call(value); + + switch (_class) { + case NUMBER_CLASS: + case BOOLEAN_CLASS: + case STRING_CLASS: + value = value.valueOf(); + } + + switch (value) { + case null: return 'null'; + case true: return 'true'; + case false: return 'false'; + } + + type = typeof value; + switch (type) { + case 'string': + return value.inspect(true); + case 'number': + return isFinite(value) ? String(value) : 'null'; + case 'object': + + for (var i = 0, length = stack.length; i < length; i++) { + if (stack[i] === value) { throw new TypeError(); } + } + stack.push(value); + + var partial = []; + if (_class === ARRAY_CLASS) { + for (var i = 0, length = value.length; i < length; i++) { + var str = Str(i, value, stack); + partial.push(typeof str === 'undefined' ? 'null' : str); + } + partial = '[' + partial.join(',') + ']'; + } else { + var keys = Object.keys(value); + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i], str = Str(key, value, stack); + if (typeof str !== "undefined") { + partial.push(key.inspect(true)+ ':' + str); + } + } + partial = '{' + partial.join(',') + '}'; + } + stack.pop(); + return partial; + } + } + + function stringify(object) { + return JSON.stringify(object); + } + + function toQueryString(object) { + return $H(object).toQueryString(); + } + + function toHTML(object) { + return object && object.toHTML ? object.toHTML() : String.interpret(object); + } + + function keys(object) { + if (Type(object) !== OBJECT_TYPE) { throw new TypeError(); } + var results = []; + for (var property in object) { + if (object.hasOwnProperty(property)) { + results.push(property); + } + } + return results; + } + + function values(object) { + var results = []; + for (var property in object) + results.push(object[property]); + return results; + } + + function clone(object) { + return extend({ }, object); + } + + function isElement(object) { + return !!(object && object.nodeType == 1); + } + + function isArray(object) { + return _toString.call(object) === ARRAY_CLASS; + } + + var hasNativeIsArray = (typeof Array.isArray == 'function') + && Array.isArray([]) && !Array.isArray({}); + + if (hasNativeIsArray) { + isArray = Array.isArray; + } + + function isHash(object) { + return object instanceof Hash; + } + + function isFunction(object) { + return typeof object === "function"; + } + + function isString(object) { + return _toString.call(object) === STRING_CLASS; + } + + function isNumber(object) { + return _toString.call(object) === NUMBER_CLASS; + } + + function isUndefined(object) { + return typeof object === "undefined"; + } + + extend(Object, { + extend: extend, + inspect: inspect, + toJSON: NATIVE_JSON_STRINGIFY_SUPPORT ? stringify : toJSON, + toQueryString: toQueryString, + toHTML: toHTML, + keys: Object.keys || keys, + values: values, + clone: clone, + isElement: isElement, + isArray: isArray, + isHash: isHash, + isFunction: isFunction, + isString: isString, + isNumber: isNumber, + isUndefined: isUndefined + }); +})(); +Object.extend(Function.prototype, (function() { + var slice = Array.prototype.slice; + + function update(array, args) { + var arrayLength = array.length, length = args.length; + while (length--) array[arrayLength + length] = args[length]; + return array; + } + + function merge(array, args) { + array = slice.call(array, 0); + return update(array, args); + } + + function argumentNames() { + var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1] + .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '') + .replace(/\s+/g, '').split(','); + return names.length == 1 && !names[0] ? [] : names; + } + + function bind(context) { + if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this; + var __method = this, args = slice.call(arguments, 1); + return function() { + var a = merge(args, arguments); + return __method.apply(context, a); + } + } + + function bindAsEventListener(context) { + var __method = this, args = slice.call(arguments, 1); + return function(event) { + var a = update([event || window.event], args); + return __method.apply(context, a); + } + } + + function curry() { + if (!arguments.length) return this; + var __method = this, args = slice.call(arguments, 0); + return function() { + var a = merge(args, arguments); + return __method.apply(this, a); + } + } + + function delay(timeout) { + var __method = this, args = slice.call(arguments, 1); + timeout = timeout * 1000; + return window.setTimeout(function() { + return __method.apply(__method, args); + }, timeout); + } + + function defer() { + var args = update([0.01], arguments); + return this.delay.apply(this, args); + } + + function wrap(wrapper) { + var __method = this; + return function() { + var a = update([__method.bind(this)], arguments); + return wrapper.apply(this, a); + } + } + + function methodize() { + if (this._methodized) return this._methodized; + var __method = this; + return this._methodized = function() { + var a = update([this], arguments); + return __method.apply(null, a); + }; + } + + return { + argumentNames: argumentNames, + bind: bind, + bindAsEventListener: bindAsEventListener, + curry: curry, + delay: delay, + defer: defer, + wrap: wrap, + methodize: methodize + } +})()); + + + +(function(proto) { + + + function toISOString() { + return this.getUTCFullYear() + '-' + + (this.getUTCMonth() + 1).toPaddedString(2) + '-' + + this.getUTCDate().toPaddedString(2) + 'T' + + this.getUTCHours().toPaddedString(2) + ':' + + this.getUTCMinutes().toPaddedString(2) + ':' + + this.getUTCSeconds().toPaddedString(2) + 'Z'; + } + + + function toJSON() { + return this.toISOString(); + } + + if (!proto.toISOString) proto.toISOString = toISOString; + if (!proto.toJSON) proto.toJSON = toJSON; + +})(Date.prototype); + + +RegExp.prototype.match = RegExp.prototype.test; + +RegExp.escape = function(str) { + return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); +}; +var PeriodicalExecuter = Class.create({ + initialize: function(callback, frequency) { + this.callback = callback; + this.frequency = frequency; + this.currentlyExecuting = false; + + this.registerCallback(); + }, + + registerCallback: function() { + this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); + }, + + execute: function() { + this.callback(this); + }, + + stop: function() { + if (!this.timer) return; + clearInterval(this.timer); + this.timer = null; + }, + + onTimerEvent: function() { + if (!this.currentlyExecuting) { + try { + this.currentlyExecuting = true; + this.execute(); + this.currentlyExecuting = false; + } catch(e) { + this.currentlyExecuting = false; + throw e; + } + } + } +}); +Object.extend(String, { + interpret: function(value) { + return value == null ? '' : String(value); + }, + specialChar: { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '\\': '\\\\' + } +}); + +Object.extend(String.prototype, (function() { + var NATIVE_JSON_PARSE_SUPPORT = window.JSON && + typeof JSON.parse === 'function' && + JSON.parse('{"test": true}').test; + + function prepareReplacement(replacement) { + if (Object.isFunction(replacement)) return replacement; + var template = new Template(replacement); + return function(match) { return template.evaluate(match) }; + } + + function gsub(pattern, replacement) { + var result = '', source = this, match; + replacement = prepareReplacement(replacement); + + if (Object.isString(pattern)) + pattern = RegExp.escape(pattern); + + if (!(pattern.length || pattern.source)) { + replacement = replacement(''); + return replacement + source.split('').join(replacement) + replacement; + } + + while (source.length > 0) { + if (match = source.match(pattern)) { + result += source.slice(0, match.index); + result += String.interpret(replacement(match)); + source = source.slice(match.index + match[0].length); + } else { + result += source, source = ''; + } + } + return result; + } + + function sub(pattern, replacement, count) { + replacement = prepareReplacement(replacement); + count = Object.isUndefined(count) ? 1 : count; + + return this.gsub(pattern, function(match) { + if (--count < 0) return match[0]; + return replacement(match); + }); + } + + function scan(pattern, iterator) { + this.gsub(pattern, iterator); + return String(this); + } + + function truncate(length, truncation) { + length = length || 30; + truncation = Object.isUndefined(truncation) ? '...' : truncation; + return this.length > length ? + this.slice(0, length - truncation.length) + truncation : String(this); + } + + function strip() { + return this.replace(/^\s+/, '').replace(/\s+$/, ''); + } + + function stripTags() { + return this.replace(/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi, ''); + } + + function stripScripts() { + return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); + } + + function extractScripts() { + var matchAll = new RegExp(Prototype.ScriptFragment, 'img'), + matchOne = new RegExp(Prototype.ScriptFragment, 'im'); + return (this.match(matchAll) || []).map(function(scriptTag) { + return (scriptTag.match(matchOne) || ['', ''])[1]; + }); + } + + function evalScripts() { + return this.extractScripts().map(function(script) { return eval(script) }); + } + + function escapeHTML() { + return this.replace(/&/g,'&').replace(//g,'>'); + } + + function unescapeHTML() { + return this.stripTags().replace(/</g,'<').replace(/>/g,'>').replace(/&/g,'&'); + } + + + function toQueryParams(separator) { + var match = this.strip().match(/([^?#]*)(#.*)?$/); + if (!match) return { }; + + return match[1].split(separator || '&').inject({ }, function(hash, pair) { + if ((pair = pair.split('='))[0]) { + var key = decodeURIComponent(pair.shift()), + value = pair.length > 1 ? pair.join('=') : pair[0]; + + if (value != undefined) value = decodeURIComponent(value); + + if (key in hash) { + if (!Object.isArray(hash[key])) hash[key] = [hash[key]]; + hash[key].push(value); + } + else hash[key] = value; + } + return hash; + }); + } + + function toArray() { + return this.split(''); + } + + function succ() { + return this.slice(0, this.length - 1) + + String.fromCharCode(this.charCodeAt(this.length - 1) + 1); + } + + function times(count) { + return count < 1 ? '' : new Array(count + 1).join(this); + } + + function camelize() { + return this.replace(/-+(.)?/g, function(match, chr) { + return chr ? chr.toUpperCase() : ''; + }); + } + + function capitalize() { + return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); + } + + function underscore() { + return this.replace(/::/g, '/') + .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2') + .replace(/([a-z\d])([A-Z])/g, '$1_$2') + .replace(/-/g, '_') + .toLowerCase(); + } + + function dasherize() { + return this.replace(/_/g, '-'); + } + + function inspect(useDoubleQuotes) { + var escapedString = this.replace(/[\x00-\x1f\\]/g, function(character) { + if (character in String.specialChar) { + return String.specialChar[character]; + } + return '\\u00' + character.charCodeAt().toPaddedString(2, 16); + }); + if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; + return "'" + escapedString.replace(/'/g, '\\\'') + "'"; + } + + function unfilterJSON(filter) { + return this.replace(filter || Prototype.JSONFilter, '$1'); + } + + function isJSON() { + var str = this; + if (str.blank()) return false; + str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@'); + str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'); + str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, ''); + return (/^[\],:{}\s]*$/).test(str); + } + + function evalJSON(sanitize) { + var json = this.unfilterJSON(), + cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; + if (cx.test(json)) { + json = json.replace(cx, function (a) { + return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + try { + if (!sanitize || json.isJSON()) return eval('(' + json + ')'); + } catch (e) { } + throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); + } + + function parseJSON() { + var json = this.unfilterJSON(); + return JSON.parse(json); + } + + function include(pattern) { + return this.indexOf(pattern) > -1; + } + + function startsWith(pattern) { + return this.lastIndexOf(pattern, 0) === 0; + } + + function endsWith(pattern) { + var d = this.length - pattern.length; + return d >= 0 && this.indexOf(pattern, d) === d; + } + + function empty() { + return this == ''; + } + + function blank() { + return /^\s*$/.test(this); + } + + function interpolate(object, pattern) { + return new Template(this, pattern).evaluate(object); + } + + return { + gsub: gsub, + sub: sub, + scan: scan, + truncate: truncate, + strip: String.prototype.trim || strip, + stripTags: stripTags, + stripScripts: stripScripts, + extractScripts: extractScripts, + evalScripts: evalScripts, + escapeHTML: escapeHTML, + unescapeHTML: unescapeHTML, + toQueryParams: toQueryParams, + parseQuery: toQueryParams, + toArray: toArray, + succ: succ, + times: times, + camelize: camelize, + capitalize: capitalize, + underscore: underscore, + dasherize: dasherize, + inspect: inspect, + unfilterJSON: unfilterJSON, + isJSON: isJSON, + evalJSON: NATIVE_JSON_PARSE_SUPPORT ? parseJSON : evalJSON, + include: include, + startsWith: startsWith, + endsWith: endsWith, + empty: empty, + blank: blank, + interpolate: interpolate + }; +})()); + +var Template = Class.create({ + initialize: function(template, pattern) { + this.template = template.toString(); + this.pattern = pattern || Template.Pattern; + }, + + evaluate: function(object) { + if (object && Object.isFunction(object.toTemplateReplacements)) + object = object.toTemplateReplacements(); + + return this.template.gsub(this.pattern, function(match) { + if (object == null) return (match[1] + ''); + + var before = match[1] || ''; + if (before == '\\') return match[2]; + + var ctx = object, expr = match[3], + pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; + + match = pattern.exec(expr); + if (match == null) return before; + + while (match != null) { + var comp = match[1].startsWith('[') ? match[2].replace(/\\\\]/g, ']') : match[1]; + ctx = ctx[comp]; + if (null == ctx || '' == match[3]) break; + expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); + match = pattern.exec(expr); + } + + return before + String.interpret(ctx); + }); + } +}); +Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; + +var $break = { }; + +var Enumerable = (function() { + function each(iterator, context) { + var index = 0; + try { + this._each(function(value) { + iterator.call(context, value, index++); + }); + } catch (e) { + if (e != $break) throw e; + } + return this; + } + + function eachSlice(number, iterator, context) { + var index = -number, slices = [], array = this.toArray(); + if (number < 1) return array; + while ((index += number) < array.length) + slices.push(array.slice(index, index+number)); + return slices.collect(iterator, context); + } + + function all(iterator, context) { + iterator = iterator || Prototype.K; + var result = true; + this.each(function(value, index) { + result = result && !!iterator.call(context, value, index); + if (!result) throw $break; + }); + return result; + } + + function any(iterator, context) { + iterator = iterator || Prototype.K; + var result = false; + this.each(function(value, index) { + if (result = !!iterator.call(context, value, index)) + throw $break; + }); + return result; + } + + function collect(iterator, context) { + iterator = iterator || Prototype.K; + var results = []; + this.each(function(value, index) { + results.push(iterator.call(context, value, index)); + }); + return results; + } + + function detect(iterator, context) { + var result; + this.each(function(value, index) { + if (iterator.call(context, value, index)) { + result = value; + throw $break; + } + }); + return result; + } + + function findAll(iterator, context) { + var results = []; + this.each(function(value, index) { + if (iterator.call(context, value, index)) + results.push(value); + }); + return results; + } + + function grep(filter, iterator, context) { + iterator = iterator || Prototype.K; + var results = []; + + if (Object.isString(filter)) + filter = new RegExp(RegExp.escape(filter)); + + this.each(function(value, index) { + if (filter.match(value)) + results.push(iterator.call(context, value, index)); + }); + return results; + } + + function include(object) { + if (Object.isFunction(this.indexOf)) + if (this.indexOf(object) != -1) return true; + + var found = false; + this.each(function(value) { + if (value == object) { + found = true; + throw $break; + } + }); + return found; + } + + function inGroupsOf(number, fillWith) { + fillWith = Object.isUndefined(fillWith) ? null : fillWith; + return this.eachSlice(number, function(slice) { + while(slice.length < number) slice.push(fillWith); + return slice; + }); + } + + function inject(memo, iterator, context) { + this.each(function(value, index) { + memo = iterator.call(context, memo, value, index); + }); + return memo; + } + + function invoke(method) { + var args = $A(arguments).slice(1); + return this.map(function(value) { + return value[method].apply(value, args); + }); + } + + function max(iterator, context) { + iterator = iterator || Prototype.K; + var result; + this.each(function(value, index) { + value = iterator.call(context, value, index); + if (result == null || value >= result) + result = value; + }); + return result; + } + + function min(iterator, context) { + iterator = iterator || Prototype.K; + var result; + this.each(function(value, index) { + value = iterator.call(context, value, index); + if (result == null || value < result) + result = value; + }); + return result; + } + + function partition(iterator, context) { + iterator = iterator || Prototype.K; + var trues = [], falses = []; + this.each(function(value, index) { + (iterator.call(context, value, index) ? + trues : falses).push(value); + }); + return [trues, falses]; + } + + function pluck(property) { + var results = []; + this.each(function(value) { + results.push(value[property]); + }); + return results; + } + + function reject(iterator, context) { + var results = []; + this.each(function(value, index) { + if (!iterator.call(context, value, index)) + results.push(value); + }); + return results; + } + + function sortBy(iterator, context) { + return this.map(function(value, index) { + return { + value: value, + criteria: iterator.call(context, value, index) + }; + }).sort(function(left, right) { + var a = left.criteria, b = right.criteria; + return a < b ? -1 : a > b ? 1 : 0; + }).pluck('value'); + } + + function toArray() { + return this.map(); + } + + function zip() { + var iterator = Prototype.K, args = $A(arguments); + if (Object.isFunction(args.last())) + iterator = args.pop(); + + var collections = [this].concat(args).map($A); + return this.map(function(value, index) { + return iterator(collections.pluck(index)); + }); + } + + function size() { + return this.toArray().length; + } + + function inspect() { + return '#'; + } + + + + + + + + + + return { + each: each, + eachSlice: eachSlice, + all: all, + every: all, + any: any, + some: any, + collect: collect, + map: collect, + detect: detect, + findAll: findAll, + select: findAll, + filter: findAll, + grep: grep, + include: include, + member: include, + inGroupsOf: inGroupsOf, + inject: inject, + invoke: invoke, + max: max, + min: min, + partition: partition, + pluck: pluck, + reject: reject, + sortBy: sortBy, + toArray: toArray, + entries: toArray, + zip: zip, + size: size, + inspect: inspect, + find: detect + }; +})(); + +function $A(iterable) { + if (!iterable) return []; + if ('toArray' in Object(iterable)) return iterable.toArray(); + var length = iterable.length || 0, results = new Array(length); + while (length--) results[length] = iterable[length]; + return results; +} + + +function $w(string) { + if (!Object.isString(string)) return []; + string = string.strip(); + return string ? string.split(/\s+/) : []; +} + +Array.from = $A; + + +(function() { + var arrayProto = Array.prototype, + slice = arrayProto.slice, + _each = arrayProto.forEach; // use native browser JS 1.6 implementation if available + + function each(iterator) { + for (var i = 0, length = this.length; i < length; i++) + iterator(this[i]); + } + if (!_each) _each = each; + + function clear() { + this.length = 0; + return this; + } + + function first() { + return this[0]; + } + + function last() { + return this[this.length - 1]; + } + + function compact() { + return this.select(function(value) { + return value != null; + }); + } + + function flatten() { + return this.inject([], function(array, value) { + if (Object.isArray(value)) + return array.concat(value.flatten()); + array.push(value); + return array; + }); + } + + function without() { + var values = slice.call(arguments, 0); + return this.select(function(value) { + return !values.include(value); + }); + } + + function reverse(inline) { + return (inline === false ? this.toArray() : this)._reverse(); + } + + function uniq(sorted) { + return this.inject([], function(array, value, index) { + if (0 == index || (sorted ? array.last() != value : !array.include(value))) + array.push(value); + return array; + }); + } + + function intersect(array) { + return this.uniq().findAll(function(item) { + return array.detect(function(value) { return item === value }); + }); + } + + + function clone() { + return slice.call(this, 0); + } + + function size() { + return this.length; + } + + function inspect() { + return '[' + this.map(Object.inspect).join(', ') + ']'; + } + + function indexOf(item, i) { + i || (i = 0); + var length = this.length; + if (i < 0) i = length + i; + for (; i < length; i++) + if (this[i] === item) return i; + return -1; + } + + function lastIndexOf(item, i) { + i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; + var n = this.slice(0, i).reverse().indexOf(item); + return (n < 0) ? n : i - n - 1; + } + + function concat() { + var array = slice.call(this, 0), item; + for (var i = 0, length = arguments.length; i < length; i++) { + item = arguments[i]; + if (Object.isArray(item) && !('callee' in item)) { + for (var j = 0, arrayLength = item.length; j < arrayLength; j++) + array.push(item[j]); + } else { + array.push(item); + } + } + return array; + } + + Object.extend(arrayProto, Enumerable); + + if (!arrayProto._reverse) + arrayProto._reverse = arrayProto.reverse; + + Object.extend(arrayProto, { + _each: _each, + clear: clear, + first: first, + last: last, + compact: compact, + flatten: flatten, + without: without, + reverse: reverse, + uniq: uniq, + intersect: intersect, + clone: clone, + toArray: clone, + size: size, + inspect: inspect + }); + + var CONCAT_ARGUMENTS_BUGGY = (function() { + return [].concat(arguments)[0][0] !== 1; + })(1,2) + + if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat; + + if (!arrayProto.indexOf) arrayProto.indexOf = indexOf; + if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf = lastIndexOf; +})(); +function $H(object) { + return new Hash(object); +}; + +var Hash = Class.create(Enumerable, (function() { + function initialize(object) { + this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); + } + + + function _each(iterator) { + for (var key in this._object) { + var value = this._object[key], pair = [key, value]; + pair.key = key; + pair.value = value; + iterator(pair); + } + } + + function set(key, value) { + return this._object[key] = value; + } + + function get(key) { + if (this._object[key] !== Object.prototype[key]) + return this._object[key]; + } + + function unset(key) { + var value = this._object[key]; + delete this._object[key]; + return value; + } + + function toObject() { + return Object.clone(this._object); + } + + + + function keys() { + return this.pluck('key'); + } + + function values() { + return this.pluck('value'); + } + + function index(value) { + var match = this.detect(function(pair) { + return pair.value === value; + }); + return match && match.key; + } + + function merge(object) { + return this.clone().update(object); + } + + function update(object) { + return new Hash(object).inject(this, function(result, pair) { + result.set(pair.key, pair.value); + return result; + }); + } + + function toQueryPair(key, value) { + if (Object.isUndefined(value)) return key; + return key + '=' + encodeURIComponent(String.interpret(value)); + } + + function toQueryString() { + return this.inject([], function(results, pair) { + var key = encodeURIComponent(pair.key), values = pair.value; + + if (values && typeof values == 'object') { + if (Object.isArray(values)) + return results.concat(values.map(toQueryPair.curry(key))); + } else results.push(toQueryPair(key, values)); + return results; + }).join('&'); + } + + function inspect() { + return '#'; + } + + function clone() { + return new Hash(this); + } + + return { + initialize: initialize, + _each: _each, + set: set, + get: get, + unset: unset, + toObject: toObject, + toTemplateReplacements: toObject, + keys: keys, + values: values, + index: index, + merge: merge, + update: update, + toQueryString: toQueryString, + inspect: inspect, + toJSON: toObject, + clone: clone + }; +})()); + +Hash.from = $H; +Object.extend(Number.prototype, (function() { + function toColorPart() { + return this.toPaddedString(2, 16); + } + + function succ() { + return this + 1; + } + + function times(iterator, context) { + $R(0, this, true).each(iterator, context); + return this; + } + + function toPaddedString(length, radix) { + var string = this.toString(radix || 10); + return '0'.times(length - string.length) + string; + } + + function abs() { + return Math.abs(this); + } + + function round() { + return Math.round(this); + } + + function ceil() { + return Math.ceil(this); + } + + function floor() { + return Math.floor(this); + } + + return { + toColorPart: toColorPart, + succ: succ, + times: times, + toPaddedString: toPaddedString, + abs: abs, + round: round, + ceil: ceil, + floor: floor + }; +})()); + +function $R(start, end, exclusive) { + return new ObjectRange(start, end, exclusive); +} + +var ObjectRange = Class.create(Enumerable, (function() { + function initialize(start, end, exclusive) { + this.start = start; + this.end = end; + this.exclusive = exclusive; + } + + function _each(iterator) { + var value = this.start; + while (this.include(value)) { + iterator(value); + value = value.succ(); + } + } + + function include(value) { + if (value < this.start) + return false; + if (this.exclusive) + return value < this.end; + return value <= this.end; + } + + return { + initialize: initialize, + _each: _each, + include: include + }; +})()); + + + +var Ajax = { + getTransport: function() { + return Try.these( + function() {return new XMLHttpRequest()}, + function() {return new ActiveXObject('Msxml2.XMLHTTP')}, + function() {return new ActiveXObject('Microsoft.XMLHTTP')} + ) || false; + }, + + activeRequestCount: 0 +}; + +Ajax.Responders = { + responders: [], + + _each: function(iterator) { + this.responders._each(iterator); + }, + + register: function(responder) { + if (!this.include(responder)) + this.responders.push(responder); + }, + + unregister: function(responder) { + this.responders = this.responders.without(responder); + }, + + dispatch: function(callback, request, transport, json) { + this.each(function(responder) { + if (Object.isFunction(responder[callback])) { + 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 = Class.create({ + initialize: function(options) { + this.options = { + method: 'post', + asynchronous: true, + contentType: 'application/x-www-form-urlencoded', + encoding: 'UTF-8', + parameters: '', + evalJSON: true, + evalJS: true + }; + Object.extend(this.options, options || { }); + + this.options.method = this.options.method.toLowerCase(); + + if (Object.isString(this.options.parameters)) + this.options.parameters = this.options.parameters.toQueryParams(); + else if (Object.isHash(this.options.parameters)) + this.options.parameters = this.options.parameters.toObject(); + } +}); +Ajax.Request = Class.create(Ajax.Base, { + _complete: false, + + initialize: function($super, url, options) { + $super(options); + this.transport = Ajax.getTransport(); + this.request(url); + }, + + request: function(url) { + this.url = url; + this.method = this.options.method; + var params = Object.clone(this.options.parameters); + + if (!['get', 'post'].include(this.method)) { + params['_method'] = this.method; + this.method = 'post'; + } + + this.parameters = params; + + if (params = Object.toQueryString(params)) { + if (this.method == 'get') + this.url += (this.url.include('?') ? '&' : '?') + params; + else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) + params += '&_='; + } + + try { + var response = new Ajax.Response(this); + if (this.options.onCreate) this.options.onCreate(response); + Ajax.Responders.dispatch('onCreate', this, response); + + this.transport.open(this.method.toUpperCase(), this.url, + this.options.asynchronous); + + if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1); + + this.transport.onreadystatechange = this.onStateChange.bind(this); + this.setRequestHeaders(); + + this.body = this.method == 'post' ? (this.options.postBody || params) : null; + this.transport.send(this.body); + + /* Force Firefox to handle ready state 4 for synchronous requests */ + if (!this.options.asynchronous && this.transport.overrideMimeType) + this.onStateChange(); + + } + catch (e) { + this.dispatchException(e); + } + }, + + onStateChange: function() { + var readyState = this.transport.readyState; + if (readyState > 1 && !((readyState == 4) && this._complete)) + this.respondToReadyState(this.transport.readyState); + }, + + setRequestHeaders: function() { + var headers = { + 'X-Requested-With': 'XMLHttpRequest', + 'X-Prototype-Version': Prototype.Version, + 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' + }; + + if (this.method == 'post') { + headers['Content-type'] = this.options.contentType + + (this.options.encoding ? '; charset=' + this.options.encoding : ''); + + /* Force "Connection: close" for older Mozilla browsers to work + * around a bug where XMLHttpRequest sends an incorrect + * Content-length header. See Mozilla Bugzilla #246651. + */ + if (this.transport.overrideMimeType && + (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) + headers['Connection'] = 'close'; + } + + if (typeof this.options.requestHeaders == 'object') { + var extras = this.options.requestHeaders; + + if (Object.isFunction(extras.push)) + for (var i = 0, length = extras.length; i < length; i += 2) + headers[extras[i]] = extras[i+1]; + else + $H(extras).each(function(pair) { headers[pair.key] = pair.value }); + } + + for (var name in headers) + this.transport.setRequestHeader(name, headers[name]); + }, + + success: function() { + var status = this.getStatus(); + return !status || (status >= 200 && status < 300); + }, + + getStatus: function() { + try { + return this.transport.status || 0; + } catch (e) { return 0 } + }, + + respondToReadyState: function(readyState) { + var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this); + + if (state == 'Complete') { + try { + this._complete = true; + (this.options['on' + response.status] + || this.options['on' + (this.success() ? 'Success' : 'Failure')] + || Prototype.emptyFunction)(response, response.headerJSON); + } catch (e) { + this.dispatchException(e); + } + + var contentType = response.getHeader('Content-type'); + if (this.options.evalJS == 'force' + || (this.options.evalJS && this.isSameOrigin() && contentType + && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) + this.evalResponse(); + } + + try { + (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON); + Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON); + } catch (e) { + this.dispatchException(e); + } + + if (state == 'Complete') { + this.transport.onreadystatechange = Prototype.emptyFunction; + } + }, + + isSameOrigin: function() { + var m = this.url.match(/^\s*https?:\/\/[^\/]*/); + return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({ + protocol: location.protocol, + domain: document.domain, + port: location.port ? ':' + location.port : '' + })); + }, + + getHeader: function(name) { + try { + return this.transport.getResponseHeader(name) || null; + } catch (e) { return null; } + }, + + evalResponse: function() { + try { + return eval((this.transport.responseText || '').unfilterJSON()); + } catch (e) { + this.dispatchException(e); + } + }, + + dispatchException: function(exception) { + (this.options.onException || Prototype.emptyFunction)(this, exception); + Ajax.Responders.dispatch('onException', this, exception); + } +}); + +Ajax.Request.Events = + ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; + + + + + + + + +Ajax.Response = Class.create({ + initialize: function(request){ + this.request = request; + var transport = this.transport = request.transport, + readyState = this.readyState = transport.readyState; + + if ((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { + this.status = this.getStatus(); + this.statusText = this.getStatusText(); + this.responseText = String.interpret(transport.responseText); + this.headerJSON = this._getHeaderJSON(); + } + + if (readyState == 4) { + var xml = transport.responseXML; + this.responseXML = Object.isUndefined(xml) ? null : xml; + this.responseJSON = this._getResponseJSON(); + } + }, + + status: 0, + + statusText: '', + + getStatus: Ajax.Request.prototype.getStatus, + + getStatusText: function() { + try { + return this.transport.statusText || ''; + } catch (e) { return '' } + }, + + getHeader: Ajax.Request.prototype.getHeader, + + getAllHeaders: function() { + try { + return this.getAllResponseHeaders(); + } catch (e) { return null } + }, + + getResponseHeader: function(name) { + return this.transport.getResponseHeader(name); + }, + + getAllResponseHeaders: function() { + return this.transport.getAllResponseHeaders(); + }, + + _getHeaderJSON: function() { + var json = this.getHeader('X-JSON'); + if (!json) return null; + json = decodeURIComponent(escape(json)); + try { + return json.evalJSON(this.request.options.sanitizeJSON || + !this.request.isSameOrigin()); + } catch (e) { + this.request.dispatchException(e); + } + }, + + _getResponseJSON: function() { + var options = this.request.options; + if (!options.evalJSON || (options.evalJSON != 'force' && + !(this.getHeader('Content-type') || '').include('application/json')) || + this.responseText.blank()) + return null; + try { + return this.responseText.evalJSON(options.sanitizeJSON || + !this.request.isSameOrigin()); + } catch (e) { + this.request.dispatchException(e); + } + } +}); + +Ajax.Updater = Class.create(Ajax.Request, { + initialize: function($super, container, url, options) { + this.container = { + success: (container.success || container), + failure: (container.failure || (container.success ? null : container)) + }; + + options = Object.clone(options); + var onComplete = options.onComplete; + options.onComplete = (function(response, json) { + this.updateContent(response.responseText); + if (Object.isFunction(onComplete)) onComplete(response, json); + }).bind(this); + + $super(url, options); + }, + + updateContent: function(responseText) { + var receiver = this.container[this.success() ? 'success' : 'failure'], + options = this.options; + + if (!options.evalScripts) responseText = responseText.stripScripts(); + + if (receiver = $(receiver)) { + if (options.insertion) { + if (Object.isString(options.insertion)) { + var insertion = { }; insertion[options.insertion] = responseText; + receiver.insert(insertion); + } + else options.insertion(receiver, responseText); + } + else receiver.update(responseText); + } + } +}); + +Ajax.PeriodicalUpdater = Class.create(Ajax.Base, { + initialize: function($super, container, url, options) { + $super(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.options.onComplete = undefined; + clearTimeout(this.timer); + (this.onComplete || Prototype.emptyFunction).apply(this, arguments); + }, + + updateComplete: function(response) { + if (this.options.decay) { + this.decay = (response.responseText == this.lastText ? + this.decay * this.options.decay : 1); + + this.lastText = response.responseText; + } + this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency); + }, + + onTimerEvent: function() { + this.updater = new Ajax.Updater(this.container, this.url, this.options); + } +}); + + +function $(element) { + if (arguments.length > 1) { + for (var i = 0, elements = [], length = arguments.length; i < length; i++) + elements.push($(arguments[i])); + return elements; + } + if (Object.isString(element)) + element = document.getElementById(element); + return Element.extend(element); +} + +if (Prototype.BrowserFeatures.XPath) { + document._getElementsByXPath = function(expression, parentElement) { + var results = []; + var query = document.evaluate(expression, $(parentElement) || document, + null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + for (var i = 0, length = query.snapshotLength; i < length; i++) + results.push(Element.extend(query.snapshotItem(i))); + return results; + }; +} + +/*--------------------------------------------------------------------------*/ + +if (!Node) var Node = { }; + +if (!Node.ELEMENT_NODE) { + Object.extend(Node, { + ELEMENT_NODE: 1, + ATTRIBUTE_NODE: 2, + TEXT_NODE: 3, + CDATA_SECTION_NODE: 4, + ENTITY_REFERENCE_NODE: 5, + ENTITY_NODE: 6, + PROCESSING_INSTRUCTION_NODE: 7, + COMMENT_NODE: 8, + DOCUMENT_NODE: 9, + DOCUMENT_TYPE_NODE: 10, + DOCUMENT_FRAGMENT_NODE: 11, + NOTATION_NODE: 12 + }); +} + + + +(function(global) { + + var HAS_EXTENDED_CREATE_ELEMENT_SYNTAX = (function(){ + try { + var el = document.createElement(''); + return el.tagName.toLowerCase() === 'input' && el.name === 'x'; + } + catch(err) { + return false; + } + })(); + + var element = global.Element; + + global.Element = function(tagName, attributes) { + attributes = attributes || { }; + tagName = tagName.toLowerCase(); + var cache = Element.cache; + if (HAS_EXTENDED_CREATE_ELEMENT_SYNTAX && attributes.name) { + tagName = '<' + tagName + ' name="' + attributes.name + '">'; + delete attributes.name; + return Element.writeAttribute(document.createElement(tagName), attributes); + } + if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName)); + return Element.writeAttribute(cache[tagName].cloneNode(false), attributes); + }; + + Object.extend(global.Element, element || { }); + if (element) global.Element.prototype = element.prototype; + +})(this); + +Element.idCounter = 1; +Element.cache = { }; + +function purgeElement(element) { + var uid = element._prototypeUID; + if (uid) { + Element.stopObserving(element); + element._prototypeUID = void 0; + delete Element.Storage[uid]; + } +} + +Element.Methods = { + visible: function(element) { + return $(element).style.display != 'none'; + }, + + toggle: function(element) { + element = $(element); + Element[Element.visible(element) ? 'hide' : 'show'](element); + return element; + }, + + hide: function(element) { + element = $(element); + element.style.display = 'none'; + return element; + }, + + show: function(element) { + element = $(element); + element.style.display = ''; + return element; + }, + + remove: function(element) { + element = $(element); + element.parentNode.removeChild(element); + return element; + }, + + update: (function(){ + + var SELECT_ELEMENT_INNERHTML_BUGGY = (function(){ + var el = document.createElement("select"), + isBuggy = true; + el.innerHTML = ""; + if (el.options && el.options[0]) { + isBuggy = el.options[0].nodeName.toUpperCase() !== "OPTION"; + } + el = null; + return isBuggy; + })(); + + var TABLE_ELEMENT_INNERHTML_BUGGY = (function(){ + try { + var el = document.createElement("table"); + if (el && el.tBodies) { + el.innerHTML = "test"; + var isBuggy = typeof el.tBodies[0] == "undefined"; + el = null; + return isBuggy; + } + } catch (e) { + return true; + } + })(); + + var SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING = (function () { + var s = document.createElement("script"), + isBuggy = false; + try { + s.appendChild(document.createTextNode("")); + isBuggy = !s.firstChild || + s.firstChild && s.firstChild.nodeType !== 3; + } catch (e) { + isBuggy = true; + } + s = null; + return isBuggy; + })(); + + function update(element, content) { + element = $(element); + + var descendants = element.getElementsByTagName('*'), + i = descendants.length; + while (i--) purgeElement(descendants[i]); + + if (content && content.toElement) + content = content.toElement(); + + if (Object.isElement(content)) + return element.update().insert(content); + + content = Object.toHTML(content); + + var tagName = element.tagName.toUpperCase(); + + if (tagName === 'SCRIPT' && SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING) { + element.text = content; + return element; + } + + if (SELECT_ELEMENT_INNERHTML_BUGGY || TABLE_ELEMENT_INNERHTML_BUGGY) { + if (tagName in Element._insertionTranslations.tags) { + while (element.firstChild) { + element.removeChild(element.firstChild); + } + Element._getContentFromAnonymousElement(tagName, content.stripScripts()) + .each(function(node) { + element.appendChild(node) + }); + } + else { + element.innerHTML = content.stripScripts(); + } + } + else { + element.innerHTML = content.stripScripts(); + } + + content.evalScripts.bind(content).defer(); + return element; + } + + return update; + })(), + + replace: function(element, content) { + element = $(element); + if (content && content.toElement) content = content.toElement(); + else if (!Object.isElement(content)) { + content = Object.toHTML(content); + var range = element.ownerDocument.createRange(); + range.selectNode(element); + content.evalScripts.bind(content).defer(); + content = range.createContextualFragment(content.stripScripts()); + } + element.parentNode.replaceChild(content, element); + return element; + }, + + insert: function(element, insertions) { + element = $(element); + + if (Object.isString(insertions) || Object.isNumber(insertions) || + Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) + insertions = {bottom:insertions}; + + var content, insert, tagName, childNodes; + + for (var position in insertions) { + content = insertions[position]; + position = position.toLowerCase(); + insert = Element._insertionTranslations[position]; + + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) { + insert(element, content); + continue; + } + + content = Object.toHTML(content); + + tagName = ((position == 'before' || position == 'after') + ? element.parentNode : element).tagName.toUpperCase(); + + childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); + + if (position == 'top' || position == 'after') childNodes.reverse(); + childNodes.each(insert.curry(element)); + + content.evalScripts.bind(content).defer(); + } + + return element; + }, + + wrap: function(element, wrapper, attributes) { + element = $(element); + if (Object.isElement(wrapper)) + $(wrapper).writeAttribute(attributes || { }); + else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes); + else wrapper = new Element('div', wrapper); + if (element.parentNode) + element.parentNode.replaceChild(wrapper, element); + wrapper.appendChild(element); + return wrapper; + }, + + inspect: function(element) { + element = $(element); + var result = '<' + element.tagName.toLowerCase(); + $H({'id': 'id', 'className': 'class'}).each(function(pair) { + var property = pair.first(), + attribute = pair.last(), + value = (element[property] || '').toString(); + if (value) result += ' ' + attribute + '=' + value.inspect(true); + }); + return result + '>'; + }, + + recursivelyCollect: function(element, property, maximumLength) { + element = $(element); + maximumLength = maximumLength || -1; + var elements = []; + + while (element = element[property]) { + if (element.nodeType == 1) + elements.push(Element.extend(element)); + if (elements.length == maximumLength) + break; + } + + return elements; + }, + + ancestors: function(element) { + return Element.recursivelyCollect(element, 'parentNode'); + }, + + descendants: function(element) { + return Element.select(element, "*"); + }, + + firstDescendant: function(element) { + element = $(element).firstChild; + while (element && element.nodeType != 1) element = element.nextSibling; + return $(element); + }, + + immediateDescendants: function(element) { + var results = [], child = $(element).firstChild; + while (child) { + if (child.nodeType === 1) { + results.push(Element.extend(child)); + } + child = child.nextSibling; + } + return results; + }, + + previousSiblings: function(element, maximumLength) { + return Element.recursivelyCollect(element, 'previousSibling'); + }, + + nextSiblings: function(element) { + return Element.recursivelyCollect(element, 'nextSibling'); + }, + + siblings: function(element) { + element = $(element); + return Element.previousSiblings(element).reverse() + .concat(Element.nextSiblings(element)); + }, + + match: function(element, selector) { + element = $(element); + if (Object.isString(selector)) + return Prototype.Selector.match(element, selector); + return selector.match(element); + }, + + up: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return $(element.parentNode); + var ancestors = Element.ancestors(element); + return Object.isNumber(expression) ? ancestors[expression] : + Prototype.Selector.find(ancestors, expression, index); + }, + + down: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return Element.firstDescendant(element); + return Object.isNumber(expression) ? Element.descendants(element)[expression] : + Element.select(element, expression)[index || 0]; + }, + + previous: function(element, expression, index) { + element = $(element); + if (Object.isNumber(expression)) index = expression, expression = false; + if (!Object.isNumber(index)) index = 0; + + if (expression) { + return Prototype.Selector.find(element.previousSiblings(), expression, index); + } else { + return element.recursivelyCollect("previousSibling", index + 1)[index]; + } + }, + + next: function(element, expression, index) { + element = $(element); + if (Object.isNumber(expression)) index = expression, expression = false; + if (!Object.isNumber(index)) index = 0; + + if (expression) { + return Prototype.Selector.find(element.nextSiblings(), expression, index); + } else { + var maximumLength = Object.isNumber(index) ? index + 1 : 1; + return element.recursivelyCollect("nextSibling", index + 1)[index]; + } + }, + + + select: function(element) { + element = $(element); + var expressions = Array.prototype.slice.call(arguments, 1).join(', '); + return Prototype.Selector.select(expressions, element); + }, + + adjacent: function(element) { + element = $(element); + var expressions = Array.prototype.slice.call(arguments, 1).join(', '); + return Prototype.Selector.select(expressions, element.parentNode).without(element); + }, + + identify: function(element) { + element = $(element); + var id = Element.readAttribute(element, 'id'); + if (id) return id; + do { id = 'anonymous_element_' + Element.idCounter++ } while ($(id)); + Element.writeAttribute(element, 'id', id); + return id; + }, + + readAttribute: function(element, name) { + element = $(element); + if (Prototype.Browser.IE) { + var t = Element._attributeTranslations.read; + if (t.values[name]) return t.values[name](element, name); + if (t.names[name]) name = t.names[name]; + if (name.include(':')) { + return (!element.attributes || !element.attributes[name]) ? null : + element.attributes[name].value; + } + } + return element.getAttribute(name); + }, + + writeAttribute: function(element, name, value) { + element = $(element); + var attributes = { }, t = Element._attributeTranslations.write; + + if (typeof name == 'object') attributes = name; + else attributes[name] = Object.isUndefined(value) ? true : value; + + for (var attr in attributes) { + name = t.names[attr] || attr; + value = attributes[attr]; + if (t.values[attr]) name = t.values[attr](element, value); + if (value === false || value === null) + element.removeAttribute(name); + else if (value === true) + element.setAttribute(name, name); + else element.setAttribute(name, value); + } + return element; + }, + + getHeight: function(element) { + return Element.getDimensions(element).height; + }, + + getWidth: function(element) { + return Element.getDimensions(element).width; + }, + + classNames: function(element) { + return new Element.ClassNames(element); + }, + + hasClassName: function(element, className) { + if (!(element = $(element))) return; + var elementClassName = element.className; + return (elementClassName.length > 0 && (elementClassName == className || + new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))); + }, + + addClassName: function(element, className) { + if (!(element = $(element))) return; + if (!Element.hasClassName(element, className)) + element.className += (element.className ? ' ' : '') + className; + return element; + }, + + removeClassName: function(element, className) { + if (!(element = $(element))) return; + element.className = element.className.replace( + new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip(); + return element; + }, + + toggleClassName: function(element, className) { + if (!(element = $(element))) return; + return Element[Element.hasClassName(element, className) ? + 'removeClassName' : 'addClassName'](element, className); + }, + + cleanWhitespace: function(element) { + element = $(element); + var node = element.firstChild; + while (node) { + var nextNode = node.nextSibling; + if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) + element.removeChild(node); + node = nextNode; + } + return element; + }, + + empty: function(element) { + return $(element).innerHTML.blank(); + }, + + descendantOf: function(element, ancestor) { + element = $(element), ancestor = $(ancestor); + + if (element.compareDocumentPosition) + return (element.compareDocumentPosition(ancestor) & 8) === 8; + + if (ancestor.contains) + return ancestor.contains(element) && ancestor !== element; + + while (element = element.parentNode) + if (element == ancestor) return true; + + return false; + }, + + scrollTo: function(element) { + element = $(element); + var pos = Element.cumulativeOffset(element); + window.scrollTo(pos[0], pos[1]); + return element; + }, + + getStyle: function(element, style) { + element = $(element); + style = style == 'float' ? 'cssFloat' : style.camelize(); + var value = element.style[style]; + if (!value || value == 'auto') { + var css = document.defaultView.getComputedStyle(element, null); + value = css ? css[style] : null; + } + if (style == 'opacity') return value ? parseFloat(value) : 1.0; + return value == 'auto' ? null : value; + }, + + getOpacity: function(element) { + return $(element).getStyle('opacity'); + }, + + setStyle: function(element, styles) { + element = $(element); + var elementStyle = element.style, match; + if (Object.isString(styles)) { + element.style.cssText += ';' + styles; + return styles.include('opacity') ? + element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element; + } + for (var property in styles) + if (property == 'opacity') element.setOpacity(styles[property]); + else + elementStyle[(property == 'float' || property == 'cssFloat') ? + (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') : + property] = styles[property]; + + return element; + }, + + setOpacity: function(element, value) { + element = $(element); + element.style.opacity = (value == 1 || value === '') ? '' : + (value < 0.00001) ? 0 : value; + return element; + }, + + makePositioned: function(element) { + element = $(element); + var pos = Element.getStyle(element, 'position'); + if (pos == 'static' || !pos) { + element._madePositioned = true; + element.style.position = 'relative'; + if (Prototype.Browser.Opera) { + element.style.top = 0; + element.style.left = 0; + } + } + return element; + }, + + 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 = ''; + } + return element; + }, + + makeClipping: function(element) { + element = $(element); + if (element._overflow) return element; + element._overflow = Element.getStyle(element, 'overflow') || 'auto'; + if (element._overflow !== 'hidden') + element.style.overflow = 'hidden'; + return element; + }, + + undoClipping: function(element) { + element = $(element); + if (!element._overflow) return element; + element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; + element._overflow = null; + return element; + }, + + cumulativeOffset: function(element) { + var valueT = 0, valueL = 0; + if (element.parentNode) { + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + } while (element); + } + return Element._returnOffset(valueL, valueT); + }, + + positionedOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + if (element) { + if (element.tagName.toUpperCase() == 'BODY') break; + var p = Element.getStyle(element, 'position'); + if (p !== 'static') break; + } + } while (element); + return Element._returnOffset(valueL, valueT); + }, + + absolutize: function(element) { + element = $(element); + if (Element.getStyle(element, 'position') == 'absolute') return element; + + var offsets = Element.positionedOffset(element), + top = offsets[1], + left = offsets[0], + width = element.clientWidth, + 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'; + return element; + }, + + relativize: function(element) { + element = $(element); + if (Element.getStyle(element, 'position') == 'relative') return element; + + element.style.position = 'relative'; + var top = parseFloat(element.style.top || 0) - (element._originalTop || 0), + 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; + return element; + }, + + cumulativeScrollOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.scrollTop || 0; + valueL += element.scrollLeft || 0; + element = element.parentNode; + } while (element); + return Element._returnOffset(valueL, valueT); + }, + + getOffsetParent: 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); + }, + + viewportOffset: function(forElement) { + var valueT = 0, + valueL = 0, + element = forElement; + + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + + if (element.offsetParent == document.body && + Element.getStyle(element, 'position') == 'absolute') break; + + } while (element = element.offsetParent); + + element = forElement; + do { + if (!Prototype.Browser.Opera || (element.tagName && (element.tagName.toUpperCase() == 'BODY'))) { + valueT -= element.scrollTop || 0; + valueL -= element.scrollLeft || 0; + } + } while (element = element.parentNode); + + return Element._returnOffset(valueL, valueT); + }, + + clonePosition: function(element, source) { + var options = Object.extend({ + setLeft: true, + setTop: true, + setWidth: true, + setHeight: true, + offsetTop: 0, + offsetLeft: 0 + }, arguments[2] || { }); + + source = $(source); + var p = Element.viewportOffset(source), delta = [0, 0], parent = null; + + element = $(element); + + if (Element.getStyle(element, 'position') == 'absolute') { + parent = Element.getOffsetParent(element); + delta = Element.viewportOffset(parent); + } + + if (parent == document.body) { + delta[0] -= document.body.offsetLeft; + delta[1] -= document.body.offsetTop; + } + + if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; + if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; + if (options.setWidth) element.style.width = source.offsetWidth + 'px'; + if (options.setHeight) element.style.height = source.offsetHeight + 'px'; + return element; + } +}; + +Object.extend(Element.Methods, { + getElementsBySelector: Element.Methods.select, + + childElements: Element.Methods.immediateDescendants +}); + +Element._attributeTranslations = { + write: { + names: { + className: 'class', + htmlFor: 'for' + }, + values: { } + } +}; + +if (Prototype.Browser.Opera) { + Element.Methods.getStyle = Element.Methods.getStyle.wrap( + function(proceed, element, style) { + switch (style) { + case 'left': case 'top': case 'right': case 'bottom': + if (proceed(element, 'position') === 'static') return null; + case 'height': case 'width': + if (!Element.visible(element)) return null; + + var dim = parseInt(proceed(element, style), 10); + + if (dim !== element['offset' + style.capitalize()]) + return dim + 'px'; + + var properties; + if (style === 'height') { + properties = ['border-top-width', 'padding-top', + 'padding-bottom', 'border-bottom-width']; + } + else { + properties = ['border-left-width', 'padding-left', + 'padding-right', 'border-right-width']; + } + return properties.inject(dim, function(memo, property) { + var val = proceed(element, property); + return val === null ? memo : memo - parseInt(val, 10); + }) + 'px'; + default: return proceed(element, style); + } + } + ); + + Element.Methods.readAttribute = Element.Methods.readAttribute.wrap( + function(proceed, element, attribute) { + if (attribute === 'title') return element.title; + return proceed(element, attribute); + } + ); +} + +else if (Prototype.Browser.IE) { + Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap( + function(proceed, element) { + element = $(element); + if (!element.parentNode) return $(document.body); + var position = element.getStyle('position'); + if (position !== 'static') return proceed(element); + element.setStyle({ position: 'relative' }); + var value = proceed(element); + element.setStyle({ position: position }); + return value; + } + ); + + $w('positionedOffset viewportOffset').each(function(method) { + Element.Methods[method] = Element.Methods[method].wrap( + function(proceed, element) { + element = $(element); + if (!element.parentNode) return Element._returnOffset(0, 0); + var position = element.getStyle('position'); + if (position !== 'static') return proceed(element); + var offsetParent = element.getOffsetParent(); + if (offsetParent && offsetParent.getStyle('position') === 'fixed') + offsetParent.setStyle({ zoom: 1 }); + element.setStyle({ position: 'relative' }); + var value = proceed(element); + element.setStyle({ position: position }); + return value; + } + ); + }); + + Element.Methods.getStyle = function(element, style) { + element = $(element); + style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); + var value = element.style[style]; + if (!value && element.currentStyle) value = element.currentStyle[style]; + + if (style == 'opacity') { + if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) + if (value[1]) return parseFloat(value[1]) / 100; + return 1.0; + } + + if (value == 'auto') { + if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none')) + return element['offset' + style.capitalize()] + 'px'; + return null; + } + return value; + }; + + Element.Methods.setOpacity = function(element, value) { + function stripAlpha(filter){ + return filter.replace(/alpha\([^\)]*\)/gi,''); + } + element = $(element); + var currentStyle = element.currentStyle; + if ((currentStyle && !currentStyle.hasLayout) || + (!currentStyle && element.style.zoom == 'normal')) + element.style.zoom = 1; + + var filter = element.getStyle('filter'), style = element.style; + if (value == 1 || value === '') { + (filter = stripAlpha(filter)) ? + style.filter = filter : style.removeAttribute('filter'); + return element; + } else if (value < 0.00001) value = 0; + style.filter = stripAlpha(filter) + + 'alpha(opacity=' + (value * 100) + ')'; + return element; + }; + + Element._attributeTranslations = (function(){ + + var classProp = 'className', + forProp = 'for', + el = document.createElement('div'); + + el.setAttribute(classProp, 'x'); + + if (el.className !== 'x') { + el.setAttribute('class', 'x'); + if (el.className === 'x') { + classProp = 'class'; + } + } + el = null; + + el = document.createElement('label'); + el.setAttribute(forProp, 'x'); + if (el.htmlFor !== 'x') { + el.setAttribute('htmlFor', 'x'); + if (el.htmlFor === 'x') { + forProp = 'htmlFor'; + } + } + el = null; + + return { + read: { + names: { + 'class': classProp, + 'className': classProp, + 'for': forProp, + 'htmlFor': forProp + }, + values: { + _getAttr: function(element, attribute) { + return element.getAttribute(attribute); + }, + _getAttr2: function(element, attribute) { + return element.getAttribute(attribute, 2); + }, + _getAttrNode: function(element, attribute) { + var node = element.getAttributeNode(attribute); + return node ? node.value : ""; + }, + _getEv: (function(){ + + var el = document.createElement('div'), f; + el.onclick = Prototype.emptyFunction; + var value = el.getAttribute('onclick'); + + if (String(value).indexOf('{') > -1) { + f = function(element, attribute) { + attribute = element.getAttribute(attribute); + if (!attribute) return null; + attribute = attribute.toString(); + attribute = attribute.split('{')[1]; + attribute = attribute.split('}')[0]; + return attribute.strip(); + }; + } + else if (value === '') { + f = function(element, attribute) { + attribute = element.getAttribute(attribute); + if (!attribute) return null; + return attribute.strip(); + }; + } + el = null; + return f; + })(), + _flag: function(element, attribute) { + return $(element).hasAttribute(attribute) ? attribute : null; + }, + style: function(element) { + return element.style.cssText.toLowerCase(); + }, + title: function(element) { + return element.title; + } + } + } + } + })(); + + Element._attributeTranslations.write = { + names: Object.extend({ + cellpadding: 'cellPadding', + cellspacing: 'cellSpacing' + }, Element._attributeTranslations.read.names), + values: { + checked: function(element, value) { + element.checked = !!value; + }, + + style: function(element, value) { + element.style.cssText = value ? value : ''; + } + } + }; + + Element._attributeTranslations.has = {}; + + $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' + + 'encType maxLength readOnly longDesc frameBorder').each(function(attr) { + Element._attributeTranslations.write.names[attr.toLowerCase()] = attr; + Element._attributeTranslations.has[attr.toLowerCase()] = attr; + }); + + (function(v) { + Object.extend(v, { + href: v._getAttr2, + src: v._getAttr2, + type: v._getAttr, + action: v._getAttrNode, + disabled: v._flag, + checked: v._flag, + readonly: v._flag, + multiple: v._flag, + onload: v._getEv, + onunload: v._getEv, + onclick: v._getEv, + ondblclick: v._getEv, + onmousedown: v._getEv, + onmouseup: v._getEv, + onmouseover: v._getEv, + onmousemove: v._getEv, + onmouseout: v._getEv, + onfocus: v._getEv, + onblur: v._getEv, + onkeypress: v._getEv, + onkeydown: v._getEv, + onkeyup: v._getEv, + onsubmit: v._getEv, + onreset: v._getEv, + onselect: v._getEv, + onchange: v._getEv + }); + })(Element._attributeTranslations.read.values); + + if (Prototype.BrowserFeatures.ElementExtensions) { + (function() { + function _descendants(element) { + var nodes = element.getElementsByTagName('*'), results = []; + for (var i = 0, node; node = nodes[i]; i++) + if (node.tagName !== "!") // Filter out comment nodes. + results.push(node); + return results; + } + + Element.Methods.down = function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return element.firstDescendant(); + return Object.isNumber(expression) ? _descendants(element)[expression] : + Element.select(element, expression)[index || 0]; + } + })(); + } + +} + +else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) { + Element.Methods.setOpacity = function(element, value) { + element = $(element); + element.style.opacity = (value == 1) ? 0.999999 : + (value === '') ? '' : (value < 0.00001) ? 0 : value; + return element; + }; +} + +else if (Prototype.Browser.WebKit) { + Element.Methods.setOpacity = function(element, value) { + element = $(element); + element.style.opacity = (value == 1 || value === '') ? '' : + (value < 0.00001) ? 0 : value; + + if (value == 1) + if (element.tagName.toUpperCase() == 'IMG' && element.width) { + element.width++; element.width--; + } else try { + var n = document.createTextNode(' '); + element.appendChild(n); + element.removeChild(n); + } catch (e) { } + + return element; + }; + + Element.Methods.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 Element._returnOffset(valueL, valueT); + }; +} + +if ('outerHTML' in document.documentElement) { + Element.Methods.replace = function(element, content) { + element = $(element); + + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) { + element.parentNode.replaceChild(content, element); + return element; + } + + content = Object.toHTML(content); + var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); + + if (Element._insertionTranslations.tags[tagName]) { + var nextSibling = element.next(), + fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); + parent.removeChild(element); + if (nextSibling) + fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); + else + fragments.each(function(node) { parent.appendChild(node) }); + } + else element.outerHTML = content.stripScripts(); + + content.evalScripts.bind(content).defer(); + return element; + }; +} + +Element._returnOffset = function(l, t) { + var result = [l, t]; + result.left = l; + result.top = t; + return result; +}; + +Element._getContentFromAnonymousElement = function(tagName, html) { + var div = new Element('div'), + t = Element._insertionTranslations.tags[tagName]; + if (t) { + div.innerHTML = t[0] + html + t[1]; + for (var i = t[2]; i--; ) { + div = div.firstChild; + } + } + else { + div.innerHTML = html; + } + return $A(div.childNodes); +}; + +Element._insertionTranslations = { + before: function(element, node) { + element.parentNode.insertBefore(node, element); + }, + top: function(element, node) { + element.insertBefore(node, element.firstChild); + }, + bottom: function(element, node) { + element.appendChild(node); + }, + after: function(element, node) { + element.parentNode.insertBefore(node, element.nextSibling); + }, + tags: { + TABLE: ['', '
    ', 1], + TBODY: ['', '
    ', 2], + TR: ['', '
    ', 3], + TD: ['
    ', '
    ', 4], + SELECT: ['', 1] + } +}; + +(function() { + var tags = Element._insertionTranslations.tags; + Object.extend(tags, { + THEAD: tags.TBODY, + TFOOT: tags.TBODY, + TH: tags.TD + }); +})(); + +Element.Methods.Simulated = { + hasAttribute: function(element, attribute) { + attribute = Element._attributeTranslations.has[attribute] || attribute; + var node = $(element).getAttributeNode(attribute); + return !!(node && node.specified); + } +}; + +Element.Methods.ByTag = { }; + +Object.extend(Element, Element.Methods); + +(function(div) { + + if (!Prototype.BrowserFeatures.ElementExtensions && div['__proto__']) { + window.HTMLElement = { }; + window.HTMLElement.prototype = div['__proto__']; + Prototype.BrowserFeatures.ElementExtensions = true; + } + + div = null; + +})(document.createElement('div')); + +Element.extend = (function() { + + function checkDeficiency(tagName) { + if (typeof window.Element != 'undefined') { + var proto = window.Element.prototype; + if (proto) { + var id = '_' + (Math.random()+'').slice(2), + el = document.createElement(tagName); + proto[id] = 'x'; + var isBuggy = (el[id] !== 'x'); + delete proto[id]; + el = null; + return isBuggy; + } + } + return false; + } + + function extendElementWith(element, methods) { + for (var property in methods) { + var value = methods[property]; + if (Object.isFunction(value) && !(property in element)) + element[property] = value.methodize(); + } + } + + var HTMLOBJECTELEMENT_PROTOTYPE_BUGGY = checkDeficiency('object'); + + if (Prototype.BrowserFeatures.SpecificElementExtensions) { + if (HTMLOBJECTELEMENT_PROTOTYPE_BUGGY) { + return function(element) { + if (element && typeof element._extendedByPrototype == 'undefined') { + var t = element.tagName; + if (t && (/^(?:object|applet|embed)$/i.test(t))) { + extendElementWith(element, Element.Methods); + extendElementWith(element, Element.Methods.Simulated); + extendElementWith(element, Element.Methods.ByTag[t.toUpperCase()]); + } + } + return element; + } + } + return Prototype.K; + } + + var Methods = { }, ByTag = Element.Methods.ByTag; + + var extend = Object.extend(function(element) { + if (!element || typeof element._extendedByPrototype != 'undefined' || + element.nodeType != 1 || element == window) return element; + + var methods = Object.clone(Methods), + tagName = element.tagName.toUpperCase(); + + if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); + + extendElementWith(element, methods); + + element._extendedByPrototype = Prototype.emptyFunction; + return element; + + }, { + refresh: function() { + if (!Prototype.BrowserFeatures.ElementExtensions) { + Object.extend(Methods, Element.Methods); + Object.extend(Methods, Element.Methods.Simulated); + } + } + }); + + extend.refresh(); + return extend; +})(); + +if (document.documentElement.hasAttribute) { + Element.hasAttribute = function(element, attribute) { + return element.hasAttribute(attribute); + }; +} +else { + Element.hasAttribute = Element.Methods.Simulated.hasAttribute; +} + +Element.addMethods = function(methods) { + var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; + + if (!methods) { + Object.extend(Form, Form.Methods); + Object.extend(Form.Element, Form.Element.Methods); + Object.extend(Element.Methods.ByTag, { + "FORM": Object.clone(Form.Methods), + "INPUT": Object.clone(Form.Element.Methods), + "SELECT": Object.clone(Form.Element.Methods), + "TEXTAREA": Object.clone(Form.Element.Methods) + }); + } + + if (arguments.length == 2) { + var tagName = methods; + methods = arguments[1]; + } + + if (!tagName) Object.extend(Element.Methods, methods || { }); + else { + if (Object.isArray(tagName)) tagName.each(extend); + else extend(tagName); + } + + function extend(tagName) { + tagName = tagName.toUpperCase(); + if (!Element.Methods.ByTag[tagName]) + Element.Methods.ByTag[tagName] = { }; + Object.extend(Element.Methods.ByTag[tagName], methods); + } + + function copy(methods, destination, onlyIfAbsent) { + onlyIfAbsent = onlyIfAbsent || false; + for (var property in methods) { + var value = methods[property]; + if (!Object.isFunction(value)) continue; + if (!onlyIfAbsent || !(property in destination)) + destination[property] = value.methodize(); + } + } + + function findDOMClass(tagName) { + var klass; + var trans = { + "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph", + "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList", + "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading", + "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote", + "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION": + "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD": + "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR": + "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET": + "FrameSet", "IFRAME": "IFrame" + }; + if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element'; + if (window[klass]) return window[klass]; + klass = 'HTML' + tagName + 'Element'; + if (window[klass]) return window[klass]; + klass = 'HTML' + tagName.capitalize() + 'Element'; + if (window[klass]) return window[klass]; + + var element = document.createElement(tagName), + proto = element['__proto__'] || element.constructor.prototype; + + element = null; + return proto; + } + + var elementPrototype = window.HTMLElement ? HTMLElement.prototype : + Element.prototype; + + if (F.ElementExtensions) { + copy(Element.Methods, elementPrototype); + copy(Element.Methods.Simulated, elementPrototype, true); + } + + if (F.SpecificElementExtensions) { + for (var tag in Element.Methods.ByTag) { + var klass = findDOMClass(tag); + if (Object.isUndefined(klass)) continue; + copy(T[tag], klass.prototype); + } + } + + Object.extend(Element, Element.Methods); + delete Element.ByTag; + + if (Element.extend.refresh) Element.extend.refresh(); + Element.cache = { }; +}; + + +document.viewport = { + + getDimensions: function() { + return { width: this.getWidth(), height: this.getHeight() }; + }, + + getScrollOffsets: function() { + return Element._returnOffset( + window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, + window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop); + } +}; + +(function(viewport) { + var B = Prototype.Browser, doc = document, element, property = {}; + + function getRootElement() { + if (B.WebKit && !doc.evaluate) + return document; + + if (B.Opera && window.parseFloat(window.opera.version()) < 9.5) + return document.body; + + return document.documentElement; + } + + function define(D) { + if (!element) element = getRootElement(); + + property[D] = 'client' + D; + + viewport['get' + D] = function() { return element[property[D]] }; + return viewport['get' + D](); + } + + viewport.getWidth = define.curry('Width'); + + viewport.getHeight = define.curry('Height'); +})(document.viewport); + + +Element.Storage = { + UID: 1 +}; + +Element.addMethods({ + getStorage: function(element) { + if (!(element = $(element))) return; + + var uid; + if (element === window) { + uid = 0; + } else { + if (typeof element._prototypeUID === "undefined") + element._prototypeUID = Element.Storage.UID++; + uid = element._prototypeUID; + } + + if (!Element.Storage[uid]) + Element.Storage[uid] = $H(); + + return Element.Storage[uid]; + }, + + store: function(element, key, value) { + if (!(element = $(element))) return; + + if (arguments.length === 2) { + Element.getStorage(element).update(key); + } else { + Element.getStorage(element).set(key, value); + } + + return element; + }, + + retrieve: function(element, key, defaultValue) { + if (!(element = $(element))) return; + var hash = Element.getStorage(element), value = hash.get(key); + + if (Object.isUndefined(value)) { + hash.set(key, defaultValue); + value = defaultValue; + } + + return value; + }, + + clone: function(element, deep) { + if (!(element = $(element))) return; + var clone = element.cloneNode(deep); + clone._prototypeUID = void 0; + if (deep) { + var descendants = Element.select(clone, '*'), + i = descendants.length; + while (i--) { + descendants[i]._prototypeUID = void 0; + } + } + return Element.extend(clone); + }, + + purge: function(element) { + if (!(element = $(element))) return; + purgeElement(element); + + var descendants = element.getElementsByTagName('*'), + i = descendants.length; + + while (i--) purgeElement(descendants[i]); + + return null; + } +}); + +(function() { + + function toDecimal(pctString) { + var match = pctString.match(/^(\d+)%?$/i); + if (!match) return null; + return (Number(match[1]) / 100); + } + + function getPixelValue(value, property) { + if (Object.isElement(value)) { + element = value; + value = element.getStyle(property); + } + if (value === null) { + return null; + } + + if ((/^(?:-)?\d+(\.\d+)?(px)?$/i).test(value)) { + return window.parseFloat(value); + } + + if (/\d/.test(value) && element.runtimeStyle) { + var style = element.style.left, rStyle = element.runtimeStyle.left; + element.runtimeStyle.left = element.currentStyle.left; + element.style.left = value || 0; + value = element.style.pixelLeft; + element.style.left = style; + element.runtimeStyle.left = rStyle; + + return value; + } + + if (value.include('%')) { + var decimal = toDecimal(value); + var whole; + if (property.include('left') || property.include('right') || + property.include('width')) { + whole = $(element.parentNode).measure('width'); + } else if (property.include('top') || property.include('bottom') || + property.include('height')) { + whole = $(element.parentNode).measure('height'); + } + + return whole * decimal; + } + + return 0; + } + + function toCSSPixels(number) { + if (Object.isString(number) && number.endsWith('px')) { + return number; + } + return number + 'px'; + } + + function isDisplayed(element) { + var originalElement = element; + while (element && element.parentNode) { + var display = element.getStyle('display'); + if (display === 'none') { + return false; + } + element = $(element.parentNode); + } + return true; + } + + var hasLayout = Prototype.K; + if ('currentStyle' in document.documentElement) { + hasLayout = function(element) { + if (!element.currentStyle.hasLayout) { + element.style.zoom = 1; + } + return element; + }; + } + + function cssNameFor(key) { + if (key.include('border')) key = key + '-width'; + return key.camelize(); + } + + Element.Layout = Class.create(Hash, { + initialize: function($super, element, preCompute) { + $super(); + this.element = $(element); + + Element.Layout.PROPERTIES.each( function(property) { + this._set(property, null); + }, this); + + if (preCompute) { + this._preComputing = true; + this._begin(); + Element.Layout.PROPERTIES.each( this._compute, this ); + this._end(); + this._preComputing = false; + } + }, + + _set: function(property, value) { + return Hash.prototype.set.call(this, property, value); + }, + + set: function(property, value) { + throw "Properties of Element.Layout are read-only."; + }, + + get: function($super, property) { + var value = $super(property); + return value === null ? this._compute(property) : value; + }, + + _begin: function() { + if (this._prepared) return; + + var element = this.element; + if (isDisplayed(element)) { + this._prepared = true; + return; + } + + var originalStyles = { + position: element.style.position || '', + width: element.style.width || '', + visibility: element.style.visibility || '', + display: element.style.display || '' + }; + + element.store('prototype_original_styles', originalStyles); + + var position = element.getStyle('position'), + width = element.getStyle('width'); + + element.setStyle({ + position: 'absolute', + visibility: 'hidden', + display: 'block' + }); + + var positionedWidth = element.getStyle('width'); + + var newWidth; + if (width && (positionedWidth === width)) { + newWidth = getPixelValue(width); + } else if (width && (position === 'absolute' || position === 'fixed')) { + newWidth = getPixelValue(width); + } else { + var parent = element.parentNode, pLayout = $(parent).getLayout(); + + newWidth = pLayout.get('width') - + this.get('margin-left') - + this.get('border-left') - + this.get('padding-left') - + this.get('padding-right') - + this.get('border-right') - + this.get('margin-right'); + } + + element.setStyle({ width: newWidth + 'px' }); + + this._prepared = true; + }, + + _end: function() { + var element = this.element; + var originalStyles = element.retrieve('prototype_original_styles'); + element.store('prototype_original_styles', null); + element.setStyle(originalStyles); + this._prepared = false; + }, + + _compute: function(property) { + var COMPUTATIONS = Element.Layout.COMPUTATIONS; + if (!(property in COMPUTATIONS)) { + throw "Property not found."; + } + return this._set(property, COMPUTATIONS[property].call(this, this.element)); + }, + + toObject: function() { + var args = $A(arguments); + var keys = (args.length === 0) ? Element.Layout.PROPERTIES : + args.join(' ').split(' '); + var obj = {}; + keys.each( function(key) { + if (!Element.Layout.PROPERTIES.include(key)) return; + var value = this.get(key); + if (value != null) obj[key] = value; + }, this); + return obj; + }, + + toHash: function() { + var obj = this.toObject.apply(this, arguments); + return new Hash(obj); + }, + + toCSS: function() { + var args = $A(arguments); + var keys = (args.length === 0) ? Element.Layout.PROPERTIES : + args.join(' ').split(' '); + var css = {}; + + keys.each( function(key) { + if (!Element.Layout.PROPERTIES.include(key)) return; + if (Element.Layout.COMPOSITE_PROPERTIES.include(key)) return; + + var value = this.get(key); + if (value != null) css[cssNameFor(key)] = value + 'px'; + }, this); + return css; + }, + + inspect: function() { + return "#"; + } + }); + + Object.extend(Element.Layout, { + PROPERTIES: $w('height width top left right bottom border-left border-right border-top border-bottom padding-left padding-right padding-top padding-bottom margin-top margin-bottom margin-left margin-right padding-box-width padding-box-height border-box-width border-box-height margin-box-width margin-box-height'), + + COMPOSITE_PROPERTIES: $w('padding-box-width padding-box-height margin-box-width margin-box-height border-box-width border-box-height'), + + COMPUTATIONS: { + 'height': function(element) { + if (!this._preComputing) this._begin(); + + var bHeight = this.get('border-box-height'); + if (bHeight <= 0) return 0; + + var bTop = this.get('border-top'), + bBottom = this.get('border-bottom'); + + var pTop = this.get('padding-top'), + pBottom = this.get('padding-bottom'); + + if (!this._preComputing) this._end(); + + return bHeight - bTop - bBottom - pTop - pBottom; + }, + + 'width': function(element) { + if (!this._preComputing) this._begin(); + + var bWidth = this.get('border-box-width'); + if (bWidth <= 0) return 0; + + var bLeft = this.get('border-left'), + bRight = this.get('border-right'); + + var pLeft = this.get('padding-left'), + pRight = this.get('padding-right'); + + if (!this._preComputing) this._end(); + + return bWidth - bLeft - bRight - pLeft - pRight; + }, + + 'padding-box-height': function(element) { + var height = this.get('height'), + pTop = this.get('padding-top'), + pBottom = this.get('padding-bottom'); + + return height + pTop + pBottom; + }, + + 'padding-box-width': function(element) { + var width = this.get('width'), + pLeft = this.get('padding-left'), + pRight = this.get('padding-right'); + + return width + pLeft + pRight; + }, + + 'border-box-height': function(element) { + return element.offsetHeight; + }, + + 'border-box-width': function(element) { + return element.offsetWidth; + }, + + 'margin-box-height': function(element) { + var bHeight = this.get('border-box-height'), + mTop = this.get('margin-top'), + mBottom = this.get('margin-bottom'); + + if (bHeight <= 0) return 0; + + return bHeight + mTop + mBottom; + }, + + 'margin-box-width': function(element) { + var bWidth = this.get('border-box-width'), + mLeft = this.get('margin-left'), + mRight = this.get('margin-right'); + + if (bWidth <= 0) return 0; + + return bWidth + mLeft + mRight; + }, + + 'top': function(element) { + var offset = element.positionedOffset(); + return offset.top; + }, + + 'bottom': function(element) { + var offset = element.positionedOffset(), + parent = element.getOffsetParent(), + pHeight = parent.measure('height'); + + var mHeight = this.get('border-box-height'); + + return pHeight - mHeight - offset.top; + }, + + 'left': function(element) { + var offset = element.positionedOffset(); + return offset.left; + }, + + 'right': function(element) { + var offset = element.positionedOffset(), + parent = element.getOffsetParent(), + pWidth = parent.measure('width'); + + var mWidth = this.get('border-box-width'); + + return pWidth - mWidth - offset.left; + }, + + 'padding-top': function(element) { + return getPixelValue(element, 'paddingTop'); + }, + + 'padding-bottom': function(element) { + return getPixelValue(element, 'paddingBottom'); + }, + + 'padding-left': function(element) { + return getPixelValue(element, 'paddingLeft'); + }, + + 'padding-right': function(element) { + return getPixelValue(element, 'paddingRight'); + }, + + 'border-top': function(element) { + return Object.isNumber(element.clientTop) ? element.clientTop : + getPixelValue(element, 'borderTopWidth'); + }, + + 'border-bottom': function(element) { + return Object.isNumber(element.clientBottom) ? element.clientBottom : + getPixelValue(element, 'borderBottomWidth'); + }, + + 'border-left': function(element) { + return Object.isNumber(element.clientLeft) ? element.clientLeft : + getPixelValue(element, 'borderLeftWidth'); + }, + + 'border-right': function(element) { + return Object.isNumber(element.clientRight) ? element.clientRight : + getPixelValue(element, 'borderRightWidth'); + }, + + 'margin-top': function(element) { + return getPixelValue(element, 'marginTop'); + }, + + 'margin-bottom': function(element) { + return getPixelValue(element, 'marginBottom'); + }, + + 'margin-left': function(element) { + return getPixelValue(element, 'marginLeft'); + }, + + 'margin-right': function(element) { + return getPixelValue(element, 'marginRight'); + } + } + }); + + if ('getBoundingClientRect' in document.documentElement) { + Object.extend(Element.Layout.COMPUTATIONS, { + 'right': function(element) { + var parent = hasLayout(element.getOffsetParent()); + var rect = element.getBoundingClientRect(), + pRect = parent.getBoundingClientRect(); + + return (pRect.right - rect.right).round(); + }, + + 'bottom': function(element) { + var parent = hasLayout(element.getOffsetParent()); + var rect = element.getBoundingClientRect(), + pRect = parent.getBoundingClientRect(); + + return (pRect.bottom - rect.bottom).round(); + } + }); + } + + Element.Offset = Class.create({ + initialize: function(left, top) { + this.left = left.round(); + this.top = top.round(); + + this[0] = this.left; + this[1] = this.top; + }, + + relativeTo: function(offset) { + return new Element.Offset( + this.left - offset.left, + this.top - offset.top + ); + }, + + inspect: function() { + return "#".interpolate(this); + }, + + toString: function() { + return "[#{left}, #{top}]".interpolate(this); + }, + + toArray: function() { + return [this.left, this.top]; + } + }); + + function getLayout(element, preCompute) { + return new Element.Layout(element, preCompute); + } + + function measure(element, property) { + return $(element).getLayout().get(property); + } + + function getDimensions(element) { + var layout = $(element).getLayout(); + return { + width: layout.get('width'), + height: layout.get('height') + }; + } + + function getOffsetParent(element) { + if (isDetached(element)) return $(document.body); + + var isInline = (Element.getStyle(element, 'display') === 'inline'); + if (!isInline && 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.nodeName === 'HTML') ? $(document.body) : $(element); + } + } + + return $(document.body); + } + + + function cumulativeOffset(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + } while (element); + return new Element.Offset(valueL, valueT); + } + + function positionedOffset(element) { + var layout = element.getLayout(); + + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + if (element) { + if (isBody(element)) break; + var p = Element.getStyle(element, 'position'); + if (p !== 'static') break; + } + } while (element); + + valueL -= layout.get('margin-top'); + valueT -= layout.get('margin-left'); + + return new Element.Offset(valueL, valueT); + } + + function cumulativeScrollOffset(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.scrollTop || 0; + valueL += element.scrollLeft || 0; + element = element.parentNode; + } while (element); + return new Element.Offset(valueL, valueT); + } + + function viewportOffset(forElement) { + var valueT = 0, valueL = 0, docBody = document.body; + + var element = forElement; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + if (element.offsetParent == docBody && + Element.getStyle(element, 'position') == 'absolute') break; + } while (element = element.offsetParent); + + element = forElement; + do { + if (element != docBody) { + valueT -= element.scrollTop || 0; + valueL -= element.scrollLeft || 0; + } + } while (element = element.parentNode); + return new Element.Offset(valueL, valueT); + } + + function absolutize(element) { + element = $(element); + + if (Element.getStyle(element, 'position') === 'absolute') { + return element; + } + + var offsetParent = getOffsetParent(element); + var eOffset = element.viewportOffset(), + pOffset = offsetParent.viewportOffset(); + + var offset = eOffset.relativeTo(pOffset); + var layout = element.getLayout(); + + element.store('prototype_absolutize_original_styles', { + left: element.getStyle('left'), + top: element.getStyle('top'), + width: element.getStyle('width'), + height: element.getStyle('height') + }); + + element.setStyle({ + position: 'absolute', + top: offset.top + 'px', + left: offset.left + 'px', + width: layout.get('width') + 'px', + height: layout.get('height') + 'px' + }); + + return element; + } + + function relativize(element) { + element = $(element); + if (Element.getStyle(element, 'position') === 'relative') { + return element; + } + + var originalStyles = + element.retrieve('prototype_absolutize_original_styles'); + + if (originalStyles) element.setStyle(originalStyles); + return element; + } + + Element.addMethods({ + getLayout: getLayout, + measure: measure, + getDimensions: getDimensions, + getOffsetParent: getOffsetParent, + cumulativeOffset: cumulativeOffset, + positionedOffset: positionedOffset, + cumulativeScrollOffset: cumulativeScrollOffset, + viewportOffset: viewportOffset, + absolutize: absolutize, + relativize: relativize + }); + + function isBody(element) { + return element.nodeName.toUpperCase() === 'BODY'; + } + + function isDetached(element) { + return element !== document.body && + !Element.descendantOf(element, document.body); + } + + if ('getBoundingClientRect' in document.documentElement) { + Element.addMethods({ + viewportOffset: function(element) { + element = $(element); + if (isDetached(element)) return new Element.Offset(0, 0); + + var rect = element.getBoundingClientRect(), + docEl = document.documentElement; + return new Element.Offset(rect.left - docEl.clientLeft, + rect.top - docEl.clientTop); + }, + + positionedOffset: function(element) { + element = $(element); + var parent = element.getOffsetParent(); + if (isDetached(element)) return new Element.Offset(0, 0); + + if (element.offsetParent && + element.offsetParent.nodeName.toUpperCase() === 'HTML') { + return positionedOffset(element); + } + + var eOffset = element.viewportOffset(), + pOffset = isBody(parent) ? viewportOffset(parent) : + parent.viewportOffset(); + var retOffset = eOffset.relativeTo(pOffset); + + var layout = element.getLayout(); + var top = retOffset.top - layout.get('margin-top'); + var left = retOffset.left - layout.get('margin-left'); + + return new Element.Offset(left, top); + } + }); + } +})(); +window.$$ = function() { + var expression = $A(arguments).join(', '); + return Prototype.Selector.select(expression, document); +}; + +Prototype.Selector = (function() { + + function select() { + throw new Error('Method "Prototype.Selector.select" must be defined.'); + } + + function match() { + throw new Error('Method "Prototype.Selector.match" must be defined.'); + } + + function find(elements, expression, index) { + index = index || 0; + var match = Prototype.Selector.match, length = elements.length, matchIndex = 0, i; + + for (i = 0; i < length; i++) { + if (match(elements[i], expression) && index == matchIndex++) { + return Element.extend(elements[i]); + } + } + } + + function extendElements(elements) { + for (var i = 0, length = elements.length; i < length; i++) { + Element.extend(elements[i]); + } + return elements; + } + + + var K = Prototype.K; + + return { + select: select, + match: match, + find: find, + extendElements: (Element.extend === K) ? K : extendElements, + extendElement: Element.extend + }; +})(); +Prototype._original_property = window.Sizzle; +/*! + * Sizzle CSS Selector Engine - v1.0 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true; + +[0, 0].sort(function(){ + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function(selector, context, results, seed) { + results = results || []; + var origContext = context = context || document; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var parts = [], m, set, checkSet, check, mode, extra, prune = true, contextXML = isXML(context), + soFar = selector; + + while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context ); + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) + selector += parts.shift(); + + set = posProcess( selector, set ); + } + } + } else { + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + var ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; + } + + if ( context ) { + var ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray(set); + } else { + prune = false; + } + + while ( parts.length ) { + var cur = parts.pop(), pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + throw "Syntax error, unrecognized expression: " + (cur || selector); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + } else if ( context && context.nodeType === 1 ) { + for ( var i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + } else { + for ( var i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function(results){ + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort(sortOrder); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[i-1] ) { + results.splice(i--, 1); + } + } + } + } + + return results; +}; + +Sizzle.matches = function(expr, set){ + return Sizzle(expr, null, null, set); +}; + +Sizzle.find = function(expr, context, isXML){ + var set, match; + + if ( !expr ) { + return []; + } + + for ( var i = 0, l = Expr.order.length; i < l; i++ ) { + var type = Expr.order[i], match; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + var left = match[1]; + match.splice(1,1); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace(/\\/g, ""); + set = Expr.find[ type ]( match, context, isXML ); + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = context.getElementsByTagName("*"); + } + + return {set: set, expr: expr}; +}; + +Sizzle.filter = function(expr, set, inplace, not){ + var old = expr, result = [], curLoop = set, match, anyFound, + isXMLFilter = set && set[0] && isXML(set[0]); + + while ( expr && set.length ) { + for ( var type in Expr.filter ) { + if ( (match = Expr.match[ type ].exec( expr )) != null ) { + var filter = Expr.filter[ type ], found, item; + anyFound = false; + + if ( curLoop == result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( var i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + var pass = not ^ !!found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + } else { + curLoop[i] = false; + } + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + if ( expr == old ) { + if ( anyFound == null ) { + throw "Syntax error, unrecognized expression: " + expr; + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + match: { + ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/ + }, + leftMatch: {}, + attrMap: { + "class": "className", + "for": "htmlFor" + }, + attrHandle: { + href: function(elem){ + return elem.getAttribute("href"); + } + }, + relative: { + "+": function(checkSet, part, isXML){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !/\W/.test(part), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag && !isXML ) { + part = part.toUpperCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + ">": function(checkSet, part, isXML){ + var isPartStr = typeof part === "string"; + + if ( isPartStr && !/\W/.test(part) ) { + part = isXML ? part : part.toUpperCase(); + + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName === part ? parent : false; + } + } + } else { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + "": function(checkSet, part, isXML){ + var doneName = done++, checkFn = dirCheck; + + if ( !/\W/.test(part) ) { + var nodeCheck = part = isXML ? part : part.toUpperCase(); + checkFn = dirNodeCheck; + } + + checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); + }, + "~": function(checkSet, part, isXML){ + var doneName = done++, checkFn = dirCheck; + + if ( typeof part === "string" && !/\W/.test(part) ) { + var nodeCheck = part = isXML ? part : part.toUpperCase(); + checkFn = dirNodeCheck; + } + + checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); + } + }, + find: { + ID: function(match, context, isXML){ + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + return m ? [m] : []; + } + }, + NAME: function(match, context, isXML){ + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], results = context.getElementsByName(match[1]); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + TAG: function(match, context){ + return context.getElementsByTagName(match[1]); + } + }, + preFilter: { + CLASS: function(match, curLoop, inplace, result, not, isXML){ + match = " " + match[1].replace(/\\/g, "") + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) { + if ( !inplace ) + result.push( elem ); + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + ID: function(match){ + return match[1].replace(/\\/g, ""); + }, + TAG: function(match, curLoop){ + for ( var i = 0; curLoop[i] === false; i++ ){} + return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase(); + }, + CHILD: function(match){ + if ( match[1] == "nth" ) { + var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( + match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + + match[0] = done++; + + return match; + }, + ATTR: function(match, curLoop, inplace, result, not, isXML){ + var name = match[1].replace(/\\/g, ""); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + PSEUDO: function(match, curLoop, inplace, result, not){ + if ( match[1] === "not" ) { + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + if ( !inplace ) { + result.push.apply( result, ret ); + } + return false; + } + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + POS: function(match){ + match.unshift( true ); + return match; + } + }, + filters: { + enabled: function(elem){ + return elem.disabled === false && elem.type !== "hidden"; + }, + disabled: function(elem){ + return elem.disabled === true; + }, + checked: function(elem){ + return elem.checked === true; + }, + selected: function(elem){ + elem.parentNode.selectedIndex; + return elem.selected === true; + }, + parent: function(elem){ + return !!elem.firstChild; + }, + empty: function(elem){ + return !elem.firstChild; + }, + has: function(elem, i, match){ + return !!Sizzle( match[3], elem ).length; + }, + header: function(elem){ + return /h\d/i.test( elem.nodeName ); + }, + text: function(elem){ + return "text" === elem.type; + }, + radio: function(elem){ + return "radio" === elem.type; + }, + checkbox: function(elem){ + return "checkbox" === elem.type; + }, + file: function(elem){ + return "file" === elem.type; + }, + password: function(elem){ + return "password" === elem.type; + }, + submit: function(elem){ + return "submit" === elem.type; + }, + image: function(elem){ + return "image" === elem.type; + }, + reset: function(elem){ + return "reset" === elem.type; + }, + button: function(elem){ + return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON"; + }, + input: function(elem){ + return /input|select|textarea|button/i.test(elem.nodeName); + } + }, + setFilters: { + first: function(elem, i){ + return i === 0; + }, + last: function(elem, i, match, array){ + return i === array.length - 1; + }, + even: function(elem, i){ + return i % 2 === 0; + }, + odd: function(elem, i){ + return i % 2 === 1; + }, + lt: function(elem, i, match){ + return i < match[3] - 0; + }, + gt: function(elem, i, match){ + return i > match[3] - 0; + }, + nth: function(elem, i, match){ + return match[3] - 0 == i; + }, + eq: function(elem, i, match){ + return match[3] - 0 == i; + } + }, + filter: { + PSEUDO: function(elem, match, i, array){ + var name = match[1], filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0; + } else if ( name === "not" ) { + var not = match[3]; + + for ( var i = 0, l = not.length; i < l; i++ ) { + if ( not[i] === elem ) { + return false; + } + } + + return true; + } + }, + CHILD: function(elem, match){ + var type = match[1], node = elem; + switch (type) { + case 'only': + case 'first': + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) return false; + } + if ( type == 'first') return true; + node = elem; + case 'last': + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) return false; + } + return true; + case 'nth': + var first = match[2], last = match[3]; + + if ( first == 1 && last == 0 ) { + return true; + } + + var doneName = match[0], + parent = elem.parentNode; + + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { + var count = 0; + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + parent.sizcache = doneName; + } + + var diff = elem.nodeIndex - last; + if ( first == 0 ) { + return diff == 0; + } else { + return ( diff % first == 0 && diff / first >= 0 ); + } + } + }, + ID: function(elem, match){ + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + TAG: function(elem, match){ + return (match === "*" && elem.nodeType === 1) || elem.nodeName === match; + }, + CLASS: function(elem, match){ + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + ATTR: function(elem, match){ + var name = match[1], + result = Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value != check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + POS: function(elem, match, i, array){ + var name = match[2], filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source ); +} + +var makeArray = function(array, results) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 ); + +} catch(e){ + makeArray = function(array, results) { + var ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + } else { + if ( typeof array.length === "number" ) { + for ( var i = 0, l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + } else { + for ( var i = 0; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + if ( a == b ) { + hasDuplicate = true; + } + return 0; + } + + var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} else if ( "sourceIndex" in document.documentElement ) { + sortOrder = function( a, b ) { + if ( !a.sourceIndex || !b.sourceIndex ) { + if ( a == b ) { + hasDuplicate = true; + } + return 0; + } + + var ret = a.sourceIndex - b.sourceIndex; + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} else if ( document.createRange ) { + sortOrder = function( a, b ) { + if ( !a.ownerDocument || !b.ownerDocument ) { + if ( a == b ) { + hasDuplicate = true; + } + return 0; + } + + var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); + aRange.setStart(a, 0); + aRange.setEnd(a, 0); + bRange.setStart(b, 0); + bRange.setEnd(b, 0); + var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} + +(function(){ + var form = document.createElement("div"), + id = "script" + (new Date).getTime(); + form.innerHTML = "
    "; + + var root = document.documentElement; + root.insertBefore( form, root.firstChild ); + + if ( !!document.getElementById( id ) ) { + Expr.find.ID = function(match, context, isXML){ + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; + } + }; + + Expr.filter.ID = function(elem, match){ + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + root = form = null; // release memory in IE +})(); + +(function(){ + + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function(match, context){ + var results = context.getElementsByTagName(match[1]); + + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + div.innerHTML = ""; + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + Expr.attrHandle.href = function(elem){ + return elem.getAttribute("href", 2); + }; + } + + div = null; // release memory in IE +})(); + +if ( document.querySelectorAll ) (function(){ + var oldSizzle = Sizzle, div = document.createElement("div"); + div.innerHTML = "

    "; + + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function(query, context, extra, seed){ + context = context || document; + + if ( !seed && context.nodeType === 9 && !isXML(context) ) { + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(e){} + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + div = null; // release memory in IE +})(); + +if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){ + var div = document.createElement("div"); + div.innerHTML = "
    "; + + if ( div.getElementsByClassName("e").length === 0 ) + return; + + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) + return; + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function(match, context, isXML) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + div = null; // release memory in IE +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + var sibDir = dir == "previousSibling" && !isXML; + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + if ( sibDir && elem.nodeType === 1 ){ + elem.sizcache = doneName; + elem.sizset = i; + } + elem = elem[dir]; + var match = false; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( elem.nodeName === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + var sibDir = dir == "previousSibling" && !isXML; + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + if ( sibDir && elem.nodeType === 1 ) { + elem.sizcache = doneName; + elem.sizset = i; + } + elem = elem[dir]; + var match = false; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem.sizcache = doneName; + elem.sizset = i; + } + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +var contains = document.compareDocumentPosition ? function(a, b){ + return a.compareDocumentPosition(b) & 16; +} : function(a, b){ + return a !== b && (a.contains ? a.contains(b) : true); +}; + +var isXML = function(elem){ + return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || + !!elem.ownerDocument && elem.ownerDocument.documentElement.nodeName !== "HTML"; +}; + +var posProcess = function(selector, context){ + var tmpSet = [], later = "", match, + root = context.nodeType ? [context] : context; + + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet ); + } + + return Sizzle.filter( later, tmpSet ); +}; + + +window.Sizzle = Sizzle; + +})(); + +;(function(engine) { + var extendElements = Prototype.Selector.extendElements; + + function select(selector, scope) { + return extendElements(engine(selector, scope || document)); + } + + function match(element, selector) { + return engine.matches(selector, [element]).length == 1; + } + + Prototype.Selector.engine = engine; + Prototype.Selector.select = select; + Prototype.Selector.match = match; +})(Sizzle); + +window.Sizzle = Prototype._original_property; +delete Prototype._original_property; + +var Form = { + reset: function(form) { + form = $(form); + form.reset(); + return form; + }, + + serializeElements: function(elements, options) { + if (typeof options != 'object') options = { hash: !!options }; + else if (Object.isUndefined(options.hash)) options.hash = true; + var key, value, submitted = false, submit = options.submit; + + var data = elements.inject({ }, function(result, element) { + if (!element.disabled && element.name) { + key = element.name; value = $(element).getValue(); + if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted && + submit !== false && (!submit || key == submit) && (submitted = true)))) { + if (key in result) { + if (!Object.isArray(result[key])) result[key] = [result[key]]; + result[key].push(value); + } + else result[key] = value; + } + } + return result; + }); + + return options.hash ? data : Object.toQueryString(data); + } +}; + +Form.Methods = { + serialize: function(form, options) { + return Form.serializeElements(Form.getElements(form), options); + }, + + getElements: function(form) { + var elements = $(form).getElementsByTagName('*'), + element, + arr = [ ], + serializers = Form.Element.Serializers; + for (var i = 0; element = elements[i]; i++) { + arr.push(element); + } + return arr.inject([], function(elements, child) { + if (serializers[child.tagName.toLowerCase()]) + elements.push(Element.extend(child)); + return elements; + }) + }, + + getInputs: function(form, typeName, name) { + form = $(form); + var inputs = form.getElementsByTagName('input'); + + if (!typeName && !name) return $A(inputs).map(Element.extend); + + for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { + var input = inputs[i]; + if ((typeName && input.type != typeName) || (name && input.name != name)) + continue; + matchingInputs.push(Element.extend(input)); + } + + return matchingInputs; + }, + + disable: function(form) { + form = $(form); + Form.getElements(form).invoke('disable'); + return form; + }, + + enable: function(form) { + form = $(form); + Form.getElements(form).invoke('enable'); + return form; + }, + + findFirstElement: function(form) { + var elements = $(form).getElements().findAll(function(element) { + return 'hidden' != element.type && !element.disabled; + }); + var firstByIndex = elements.findAll(function(element) { + return element.hasAttribute('tabIndex') && element.tabIndex >= 0; + }).sortBy(function(element) { return element.tabIndex }).first(); + + return firstByIndex ? firstByIndex : elements.find(function(element) { + return /^(?:input|select|textarea)$/i.test(element.tagName); + }); + }, + + focusFirstElement: function(form) { + form = $(form); + form.findFirstElement().activate(); + return form; + }, + + request: function(form, options) { + form = $(form), options = Object.clone(options || { }); + + var params = options.parameters, action = form.readAttribute('action') || ''; + if (action.blank()) action = window.location.href; + options.parameters = form.serialize(true); + + if (params) { + if (Object.isString(params)) params = params.toQueryParams(); + Object.extend(options.parameters, params); + } + + if (form.hasAttribute('method') && !options.method) + options.method = form.method; + + return new Ajax.Request(action, options); + } +}; + +/*--------------------------------------------------------------------------*/ + + +Form.Element = { + focus: function(element) { + $(element).focus(); + return element; + }, + + select: function(element) { + $(element).select(); + return element; + } +}; + +Form.Element.Methods = { + + serialize: function(element) { + element = $(element); + if (!element.disabled && element.name) { + var value = element.getValue(); + if (value != undefined) { + var pair = { }; + pair[element.name] = value; + return Object.toQueryString(pair); + } + } + return ''; + }, + + getValue: function(element) { + element = $(element); + var method = element.tagName.toLowerCase(); + return Form.Element.Serializers[method](element); + }, + + setValue: function(element, value) { + element = $(element); + var method = element.tagName.toLowerCase(); + Form.Element.Serializers[method](element, value); + return element; + }, + + clear: function(element) { + $(element).value = ''; + return element; + }, + + present: function(element) { + return $(element).value != ''; + }, + + activate: function(element) { + element = $(element); + try { + element.focus(); + if (element.select && (element.tagName.toLowerCase() != 'input' || + !(/^(?:button|reset|submit)$/i.test(element.type)))) + element.select(); + } catch (e) { } + return element; + }, + + disable: function(element) { + element = $(element); + element.disabled = true; + return element; + }, + + enable: function(element) { + element = $(element); + element.disabled = false; + return element; + } +}; + +/*--------------------------------------------------------------------------*/ + +var Field = Form.Element; + +var $F = Form.Element.Methods.getValue; + +/*--------------------------------------------------------------------------*/ + +Form.Element.Serializers = { + input: function(element, value) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + return Form.Element.Serializers.inputSelector(element, value); + default: + return Form.Element.Serializers.textarea(element, value); + } + }, + + inputSelector: function(element, value) { + if (Object.isUndefined(value)) return element.checked ? element.value : null; + else element.checked = !!value; + }, + + textarea: function(element, value) { + if (Object.isUndefined(value)) return element.value; + else element.value = value; + }, + + select: function(element, value) { + if (Object.isUndefined(value)) + return this[element.type == 'select-one' ? + 'selectOne' : 'selectMany'](element); + else { + var opt, currentValue, single = !Object.isArray(value); + for (var i = 0, length = element.length; i < length; i++) { + opt = element.options[i]; + currentValue = this.optionValue(opt); + if (single) { + if (currentValue == value) { + opt.selected = true; + return; + } + } + else opt.selected = value.include(currentValue); + } + } + }, + + selectOne: function(element) { + var index = element.selectedIndex; + return index >= 0 ? this.optionValue(element.options[index]) : null; + }, + + selectMany: function(element) { + var values, length = element.length; + if (!length) return null; + + for (var i = 0, values = []; i < length; i++) { + var opt = element.options[i]; + if (opt.selected) values.push(this.optionValue(opt)); + } + return values; + }, + + optionValue: function(opt) { + return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; + } +}; + +/*--------------------------------------------------------------------------*/ + + +Abstract.TimedObserver = Class.create(PeriodicalExecuter, { + initialize: function($super, element, frequency, callback) { + $super(callback, frequency); + this.element = $(element); + this.lastValue = this.getValue(); + }, + + execute: function() { + var value = this.getValue(); + if (Object.isString(this.lastValue) && Object.isString(value) ? + this.lastValue != value : String(this.lastValue) != String(value)) { + this.callback(this.element, value); + this.lastValue = value; + } + } +}); + +Form.Element.Observer = Class.create(Abstract.TimedObserver, { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.Observer = Class.create(Abstract.TimedObserver, { + getValue: function() { + return Form.serialize(this.element); + } +}); + +/*--------------------------------------------------------------------------*/ + +Abstract.EventObserver = Class.create({ + 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() { + Form.getElements(this.element).each(this.registerCallback, this); + }, + + registerCallback: function(element) { + if (element.type) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + Event.observe(element, 'click', this.onElementEvent.bind(this)); + break; + default: + Event.observe(element, 'change', this.onElementEvent.bind(this)); + break; + } + } + } +}); + +Form.Element.EventObserver = Class.create(Abstract.EventObserver, { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.EventObserver = Class.create(Abstract.EventObserver, { + getValue: function() { + return Form.serialize(this.element); + } +}); +(function() { + + var 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, + KEY_HOME: 36, + KEY_END: 35, + KEY_PAGEUP: 33, + KEY_PAGEDOWN: 34, + KEY_INSERT: 45, + + cache: {} + }; + + var docEl = document.documentElement; + var MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED = 'onmouseenter' in docEl + && 'onmouseleave' in docEl; + + var _isButton; + if (Prototype.Browser.IE) { + var buttonMap = { 0: 1, 1: 4, 2: 2 }; + _isButton = function(event, code) { + return event.button === buttonMap[code]; + }; + } else if (Prototype.Browser.WebKit) { + _isButton = function(event, code) { + switch (code) { + case 0: return event.which == 1 && !event.metaKey; + case 1: return event.which == 1 && event.metaKey; + default: return false; + } + }; + } else { + _isButton = function(event, code) { + return event.which ? (event.which === code + 1) : (event.button === code); + }; + } + + function isLeftClick(event) { return _isButton(event, 0) } + + function isMiddleClick(event) { return _isButton(event, 1) } + + function isRightClick(event) { return _isButton(event, 2) } + + function element(event) { + event = Event.extend(event); + + var node = event.target, type = event.type, + currentTarget = event.currentTarget; + + if (currentTarget && currentTarget.tagName) { + if (type === 'load' || type === 'error' || + (type === 'click' && currentTarget.tagName.toLowerCase() === 'input' + && currentTarget.type === 'radio')) + node = currentTarget; + } + + if (node.nodeType == Node.TEXT_NODE) + node = node.parentNode; + + return Element.extend(node); + } + + function findElement(event, expression) { + var element = Event.element(event); + if (!expression) return element; + while (element) { + if (Object.isElement(element) && Prototype.Selector.match(element, expression)) { + return Element.extend(element); + } + element = element.parentNode; + } + } + + function pointer(event) { + return { x: pointerX(event), y: pointerY(event) }; + } + + function pointerX(event) { + var docElement = document.documentElement, + body = document.body || { scrollLeft: 0 }; + + return event.pageX || (event.clientX + + (docElement.scrollLeft || body.scrollLeft) - + (docElement.clientLeft || 0)); + } + + function pointerY(event) { + var docElement = document.documentElement, + body = document.body || { scrollTop: 0 }; + + return event.pageY || (event.clientY + + (docElement.scrollTop || body.scrollTop) - + (docElement.clientTop || 0)); + } + + + function stop(event) { + Event.extend(event); + event.preventDefault(); + event.stopPropagation(); + + event.stopped = true; + } + + Event.Methods = { + isLeftClick: isLeftClick, + isMiddleClick: isMiddleClick, + isRightClick: isRightClick, + + element: element, + findElement: findElement, + + pointer: pointer, + pointerX: pointerX, + pointerY: pointerY, + + stop: stop + }; + + + var methods = Object.keys(Event.Methods).inject({ }, function(m, name) { + m[name] = Event.Methods[name].methodize(); + return m; + }); + + if (Prototype.Browser.IE) { + function _relatedTarget(event) { + var element; + switch (event.type) { + case 'mouseover': element = event.fromElement; break; + case 'mouseout': element = event.toElement; break; + default: return null; + } + return Element.extend(element); + } + + Object.extend(methods, { + stopPropagation: function() { this.cancelBubble = true }, + preventDefault: function() { this.returnValue = false }, + inspect: function() { return '[object Event]' } + }); + + Event.extend = function(event, element) { + if (!event) return false; + if (event._extendedByPrototype) return event; + + event._extendedByPrototype = Prototype.emptyFunction; + var pointer = Event.pointer(event); + + Object.extend(event, { + target: event.srcElement || element, + relatedTarget: _relatedTarget(event), + pageX: pointer.x, + pageY: pointer.y + }); + + return Object.extend(event, methods); + }; + } else { + Event.prototype = window.Event.prototype || document.createEvent('HTMLEvents').__proto__; + Object.extend(Event.prototype, methods); + Event.extend = Prototype.K; + } + + function _createResponder(element, eventName, handler) { + var registry = Element.retrieve(element, 'prototype_event_registry'); + + if (Object.isUndefined(registry)) { + CACHE.push(element); + registry = Element.retrieve(element, 'prototype_event_registry', $H()); + } + + var respondersForEvent = registry.get(eventName); + if (Object.isUndefined(respondersForEvent)) { + respondersForEvent = []; + registry.set(eventName, respondersForEvent); + } + + if (respondersForEvent.pluck('handler').include(handler)) return false; + + var responder; + if (eventName.include(":")) { + responder = function(event) { + if (Object.isUndefined(event.eventName)) + return false; + + if (event.eventName !== eventName) + return false; + + Event.extend(event, element); + handler.call(element, event); + }; + } else { + if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED && + (eventName === "mouseenter" || eventName === "mouseleave")) { + if (eventName === "mouseenter" || eventName === "mouseleave") { + responder = function(event) { + Event.extend(event, element); + + var parent = event.relatedTarget; + while (parent && parent !== element) { + try { parent = parent.parentNode; } + catch(e) { parent = element; } + } + + if (parent === element) return; + + handler.call(element, event); + }; + } + } else { + responder = function(event) { + Event.extend(event, element); + handler.call(element, event); + }; + } + } + + responder.handler = handler; + respondersForEvent.push(responder); + return responder; + } + + function _destroyCache() { + for (var i = 0, length = CACHE.length; i < length; i++) { + Event.stopObserving(CACHE[i]); + CACHE[i] = null; + } + } + + var CACHE = []; + + if (Prototype.Browser.IE) + window.attachEvent('onunload', _destroyCache); + + if (Prototype.Browser.WebKit) + window.addEventListener('unload', Prototype.emptyFunction, false); + + + var _getDOMEventName = Prototype.K, + translations = { mouseenter: "mouseover", mouseleave: "mouseout" }; + + if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED) { + _getDOMEventName = function(eventName) { + return (translations[eventName] || eventName); + }; + } + + function observe(element, eventName, handler) { + element = $(element); + + var responder = _createResponder(element, eventName, handler); + + if (!responder) return element; + + if (eventName.include(':')) { + if (element.addEventListener) + element.addEventListener("dataavailable", responder, false); + else { + element.attachEvent("ondataavailable", responder); + element.attachEvent("onfilterchange", responder); + } + } else { + var actualEventName = _getDOMEventName(eventName); + + if (element.addEventListener) + element.addEventListener(actualEventName, responder, false); + else + element.attachEvent("on" + actualEventName, responder); + } + + return element; + } + + function stopObserving(element, eventName, handler) { + element = $(element); + + var registry = Element.retrieve(element, 'prototype_event_registry'); + if (!registry) return element; + + if (!eventName) { + registry.each( function(pair) { + var eventName = pair.key; + stopObserving(element, eventName); + }); + return element; + } + + var responders = registry.get(eventName); + if (!responders) return element; + + if (!handler) { + responders.each(function(r) { + stopObserving(element, eventName, r.handler); + }); + return element; + } + + var responder = responders.find( function(r) { return r.handler === handler; }); + if (!responder) return element; + + if (eventName.include(':')) { + if (element.removeEventListener) + element.removeEventListener("dataavailable", responder, false); + else { + element.detachEvent("ondataavailable", responder); + element.detachEvent("onfilterchange", responder); + } + } else { + var actualEventName = _getDOMEventName(eventName); + if (element.removeEventListener) + element.removeEventListener(actualEventName, responder, false); + else + element.detachEvent('on' + actualEventName, responder); + } + + registry.set(eventName, responders.without(responder)); + + return element; + } + + function fire(element, eventName, memo, bubble) { + element = $(element); + + if (Object.isUndefined(bubble)) + bubble = true; + + if (element == document && document.createEvent && !element.dispatchEvent) + element = document.documentElement; + + var event; + if (document.createEvent) { + event = document.createEvent('HTMLEvents'); + event.initEvent('dataavailable', true, true); + } else { + event = document.createEventObject(); + event.eventType = bubble ? 'ondataavailable' : 'onfilterchange'; + } + + event.eventName = eventName; + event.memo = memo || { }; + + if (document.createEvent) + element.dispatchEvent(event); + else + element.fireEvent(event.eventType, event); + + return Event.extend(event); + } + + Event.Handler = Class.create({ + initialize: function(element, eventName, selector, callback) { + this.element = $(element); + this.eventName = eventName; + this.selector = selector; + this.callback = callback; + this.handler = this.handleEvent.bind(this); + }, + + start: function() { + Event.observe(this.element, this.eventName, this.handler); + return this; + }, + + stop: function() { + Event.stopObserving(this.element, this.eventName, this.handler); + return this; + }, + + handleEvent: function(event) { + var element = event.findElement(this.selector); + if (element) this.callback.call(this.element, event, element); + } + }); + + function on(element, eventName, selector, callback) { + element = $(element); + if (Object.isFunction(selector) && Object.isUndefined(callback)) { + callback = selector, selector = null; + } + + return new Event.Handler(element, eventName, selector, callback).start(); + } + + Object.extend(Event, Event.Methods); + + Object.extend(Event, { + fire: fire, + observe: observe, + stopObserving: stopObserving, + on: on + }); + + Element.addMethods({ + fire: fire, + + observe: observe, + + stopObserving: stopObserving, + + on: on + }); + + Object.extend(document, { + fire: fire.methodize(), + + observe: observe.methodize(), + + stopObserving: stopObserving.methodize(), + + on: on.methodize(), + + loaded: false + }); + + if (window.Event) Object.extend(window.Event, Event); + else window.Event = Event; +})(); + +(function() { + /* Support for the DOMContentLoaded event is based on work by Dan Webb, + Matthias Miller, Dean Edwards, John Resig, and Diego Perini. */ + + var timer; + + function fireContentLoadedEvent() { + if (document.loaded) return; + if (timer) window.clearTimeout(timer); + document.loaded = true; + document.fire('dom:loaded'); + } + + function checkReadyState() { + if (document.readyState === 'complete') { + document.stopObserving('readystatechange', checkReadyState); + fireContentLoadedEvent(); + } + } + + function pollDoScroll() { + try { document.documentElement.doScroll('left'); } + catch(e) { + timer = pollDoScroll.defer(); + return; + } + fireContentLoadedEvent(); + } + + if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false); + } else { + document.observe('readystatechange', checkReadyState); + if (window == top) + timer = pollDoScroll.defer(); + } + + Event.observe(window, 'load', fireContentLoadedEvent); +})(); + +Element.addMethods(); + +/*------------------------------- DEPRECATED -------------------------------*/ + +Hash.toQueryString = Object.toQueryString; + +var Toggle = { display: Element.toggle }; + +Element.Methods.childOf = Element.Methods.descendantOf; + +var Insertion = { + Before: function(element, content) { + return Element.insert(element, {before:content}); + }, + + Top: function(element, content) { + return Element.insert(element, {top:content}); + }, + + Bottom: function(element, content) { + return Element.insert(element, {bottom:content}); + }, + + After: function(element, content) { + return Element.insert(element, {after:content}); + } +}; + +var $continue = new Error('"throw $continue" is deprecated, use "return" instead'); + +var Position = { + includeScrollOffsets: false, + + prepare: function() { + this.deltaX = window.pageXOffset + || document.documentElement.scrollLeft + || document.body.scrollLeft + || 0; + this.deltaY = window.pageYOffset + || document.documentElement.scrollTop + || document.body.scrollTop + || 0; + }, + + within: function(element, x, y) { + if (this.includeScrollOffsets) + return this.withinIncludingScrolloffsets(element, x, y); + this.xcomp = x; + this.ycomp = y; + this.offset = Element.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 = Element.cumulativeScrollOffset(element); + + this.xcomp = x + offsetcache[0] - this.deltaX; + this.ycomp = y + offsetcache[1] - this.deltaY; + this.offset = Element.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); + }, + + 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; + }, + + + cumulativeOffset: Element.Methods.cumulativeOffset, + + positionedOffset: Element.Methods.positionedOffset, + + absolutize: function(element) { + Position.prepare(); + return Element.absolutize(element); + }, + + relativize: function(element) { + Position.prepare(); + return Element.relativize(element); + }, + + realOffset: Element.Methods.cumulativeScrollOffset, + + offsetParent: Element.Methods.getOffsetParent, + + page: Element.Methods.viewportOffset, + + clone: function(source, target, options) { + options = options || { }; + return Element.clonePosition(target, source, options); + } +}; + +/*--------------------------------------------------------------------------*/ + +if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){ + function iter(name) { + return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]"; + } + + instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ? + function(element, className) { + className = className.toString().strip(); + var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className); + return cond ? document._getElementsByXPath('.//*' + cond, element) : []; + } : function(element, className) { + className = className.toString().strip(); + var elements = [], classNames = (/\s/.test(className) ? $w(className) : null); + if (!classNames && !className) return elements; + + var nodes = $(element).getElementsByTagName('*'); + className = ' ' + className + ' '; + + for (var i = 0, child, cn; child = nodes[i]; i++) { + if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) || + (classNames && classNames.all(function(name) { + return !name.toString().blank() && cn.include(' ' + name + ' '); + })))) + elements.push(Element.extend(child)); + } + return elements; + }; + + return function(className, parentElement) { + return $(parentElement || document.body).getElementsByClassName(className); + }; +}(Element.Methods); + +/*--------------------------------------------------------------------------*/ + +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($A(this).concat(classNameToAdd).join(' ')); + }, + + remove: function(classNameToRemove) { + if (!this.include(classNameToRemove)) return; + this.set($A(this).without(classNameToRemove).join(' ')); + }, + + toString: function() { + return $A(this).join(' '); + } +}; + +Object.extend(Element.ClassNames.prototype, Enumerable); + +/*--------------------------------------------------------------------------*/ + +(function() { + window.Selector = Class.create({ + initialize: function(expression) { + this.expression = expression.strip(); + }, + + findElements: function(rootElement) { + return Prototype.Selector.select(this.expression, rootElement); + }, + + match: function(element) { + return Prototype.Selector.match(element, this.expression); + }, + + toString: function() { + return this.expression; + }, + + inspect: function() { + return "#"; + } + }); + + Object.extend(Selector, { + matchElements: function(elements, expression) { + var match = Prototype.Selector.match, + results = []; + + for (var i = 0, length = elements.length; i < length; i++) { + var element = elements[i]; + if (match(element, expression)) { + results.push(Element.extend(element)); + } + } + return results; + }, + + findElement: function(elements, expression, index) { + index = index || 0; + var matchIndex = 0, element; + for (var i = 0, length = elements.length; i < length; i++) { + element = elements[i]; + if (Prototype.Selector.match(element, expression) && index === matchIndex++) { + return Element.extend(element); + } + } + }, + + findChildElements: function(element, expressions) { + var selector = expressions.toArray().join(', '); + return Prototype.Selector.select(selector, element || document); + } + }); +})(); diff --git a/themes/olive/javascripts/prototype_src.js b/themes/olive/javascripts/prototype_src.js deleted file mode 100755 index 87aa729..0000000 --- a/themes/olive/javascripts/prototype_src.js +++ /dev/null @@ -1,521 +0,0 @@ -var Prototype = { - Version: '1.2.1' -}; - -var Class = { - create: function() { - return function() { - this.initialize.apply(this, arguments); - } - } -}; - -var Abstract = new Object(); -Object.prototype.extend = function(object) { - for (property in object) { - this[property] = object[property]; - } - return this; -}; -Function.prototype.bind = function(object) { - var method = this; - return function() { - method.apply(object, arguments); - } -}; - -Function.prototype.bindAsEventListener = function(object) { - var method = this; - return function(event) { - method.call(object, event || window.event); - } -}; - -Number.prototype.toColorPart = function() { - var digits = this.toString(16); - if (this < 16) return '0' + digits; - return digits; -}; - -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() { - setTimeout(this.onTimerEvent.bind(this), this.frequency * 1000); - }, - - onTimerEvent: function() { - if (!this.currentlyExecuting) { - try { - this.currentlyExecuting = true; - this.callback(); - } finally { - this.currentlyExecuting = false; - } - } - - this.registerCallback(); - } -}; -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; -}; -if (!Array.prototype.push) { - Array.prototype.push = function() { - var startLength = this.length; - for (var i = 0; i < arguments.length; i++) - this[startLength + i] = arguments[i]; - return this.length; - }; -}; - -if (!Function.prototype.apply) { - // Based on code from http://www.youngpup.net/ - Function.prototype.apply = function(object, parameters) { - var parameterStrings = new Array(); - if (!object) object = window; - if (!parameters) parameters = new Array(); - - for (var i = 0; i < parameters.length; i++) - parameterStrings[i] = 'x[' + i + ']'; - - object.__apply__ = this; - var result = eval('obj.__apply__(' + - parameterStrings[i].join(', ') + ')'); - object.__apply__ = null; - - return result; - }; -}; - -var Ajax = { - getTransport: function() { - return Try.these( - function() {return new ActiveXObject('Msxml2.XMLHTTP')}, - function() {return new ActiveXObject('Microsoft.XMLHTTP')}, - function() {return new XMLHttpRequest()} - ) || false; - }, - - emptyFunction: function() {} -}; - -Ajax.Base = function() {}; -Ajax.Base.prototype = { - setOptions: function(options) { - this.options = { - method: 'post', - asynchronous: true, - parameters: '' - }.extend(options || {}); - } -}; - -Ajax.Request = Class.create(); -Ajax.Request.Events = - ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; - -Ajax.Request.prototype = (new Ajax.Base()).extend({ - initialize: function(url, options) { - this.transport = Ajax.getTransport(); - this.setOptions(options); - - try { - if (this.options.method == 'get') - url += '?' + this.options.parameters + '&_='; - - this.transport.open(this.options.method, url, - this.options.asynchronous); - - if (this.options.asynchronous) { - this.transport.onreadystatechange = this.onStateChange.bind(this); - setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10); - } - - this.transport.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); - this.transport.setRequestHeader('X-Prototype-Version', Prototype.Version); - - if (this.options.method == 'post') { - this.transport.setRequestHeader('Connection', 'close'); - this.transport.setRequestHeader('Content-type', - 'application/x-www-form-urlencoded'); - } - - this.transport.send(this.options.method == 'post' ? - this.options.parameters + '&_=' : null); - - } catch (e) { - } - }, - - onStateChange: function() { - var readyState = this.transport.readyState; - if (readyState != 1) - this.respondToReadyState(this.transport.readyState); - }, - - respondToReadyState: function(readyState) { - var event = Ajax.Request.Events[readyState]; - (this.options['on' + event] || Ajax.emptyFunction)(this.transport); - } -}); - -Ajax.Updater = Class.create(); -Ajax.Updater.prototype = (new Ajax.Base()).extend({ - initialize: function(container, url, options) { - this.container = $(container); - this.setOptions(options); - - if (this.options.asynchronous) { - this.onComplete = this.options.onComplete; - this.options.onComplete = this.updateContent.bind(this); - } - - this.request = new Ajax.Request(url, this.options); - - if (!this.options.asynchronous) - this.updateContent(); - }, - - updateContent: function() { - if (this.options.insertion) { - new this.options.insertion(this.container, - this.request.transport.responseText); - } else { - this.container.innerHTML = this.request.transport.responseText; - } - - if (this.onComplete) { - setTimeout((function() {this.onComplete(this.request)}).bind(this), 10); - } - } -}); -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).focus(); - $(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; - }, - - disable: function(form) { - var elements = Form.getElements(form); - for (var i = 0; i < elements.length; i++) { - var element = elements[i]; - element.blur(); - element.disable = 'true'; - } - }, - - focusFirstElement: function(form) { - form = $(form); - var elements = Form.getElements(form); - for (var i = 0; i < elements.length; i++) { - var element = elements[i]; - if (element.type != 'hidden' && !element.disabled) { - Field.activate(element); - break; - } - } - }, - - 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) - return encodeURIComponent(parameter[0]) + '=' + - encodeURIComponent(parameter[1]); - }, - - 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 '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) { - var index = element.selectedIndex; - var value = element.options[index].value || element.options[index].text; - return [element.name, (index >= 0) ? 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() { - setTimeout(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; - } - - this.registerCallback(); - } -}; - -Form.Element.Observer = Class.create(); -Form.Element.Observer.prototype = (new Abstract.TimedObserver()).extend({ - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.Observer = Class.create(); -Form.Observer.prototype = (new Abstract.TimedObserver()).extend({ - getValue: function() { - return Form.serialize(this.element); - } -}); - -document.getElementsByClassName = function(className) { - var children = document.getElementsByTagName('*') || document.all; - var elements = new Array(); - - for (var i = 0; i < children.length; i++) { - var child = children[i]; - var classNames = child.className.split(' '); - for (var j = 0; j < classNames.length; j++) { - if (classNames[j] == className) { - elements.push(child); - break; - } - } - } - - return elements; -}; - -var Element = { - toggle: function() { - for (var i = 0; i < arguments.length; i++) { - var element = $(arguments[i]); - element.style.display = - (element.style.display == 'none' ? '' : 'none'); - } - }, - - 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); - }, - - getHeight: function(element) { - element = $(element); - return element.offsetHeight; - } -}; - -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; - - if (this.adjacency && this.element.insertAdjacentHTML) { - this.element.insertAdjacentHTML(this.adjacency, this.content); - } else { - this.range = this.element.ownerDocument.createRange(); - if (this.initializeRange) this.initializeRange(); - this.fragment = this.range.createContextualFragment(this.content); - this.insertContent(); - } - } -}; - -var Insertion = new Object(); - -Insertion.Before = Class.create(); -Insertion.Before.prototype = (new Abstract.Insertion('beforeBegin')).extend({ - initializeRange: function() { - this.range.setStartBefore(this.element); - }, - - insertContent: function() { - this.element.parentNode.insertBefore(this.fragment, this.element); - } -}); - -Insertion.Top = Class.create(); -Insertion.Top.prototype = (new Abstract.Insertion('afterBegin')).extend({ - initializeRange: function() { - this.range.selectNodeContents(this.element); - this.range.collapse(true); - }, - - insertContent: function() { - this.element.insertBefore(this.fragment, this.element.firstChild); - } -}); - -Insertion.Bottom = Class.create(); -Insertion.Bottom.prototype = (new Abstract.Insertion('beforeEnd')).extend({ - initializeRange: function() { - this.range.selectNodeContents(this.element); - this.range.collapse(this.element); - }, - - insertContent: function() { - this.element.appendChild(this.fragment); - } -}); - -Insertion.After = Class.create(); -Insertion.After.prototype = (new Abstract.Insertion('afterEnd')).extend({ - initializeRange: function() { - this.range.setStartAfter(this.element); - }, - - insertContent: function() { - this.element.parentNode.insertBefore(this.fragment, - this.element.nextSibling); - } -}); \ No newline at end of file diff --git a/themes/olive/javascripts/rails.js b/themes/olive/javascripts/rails.js new file mode 100755 index 0000000..aed6aed --- /dev/null +++ b/themes/olive/javascripts/rails.js @@ -0,0 +1,191 @@ +(function() { + // Technique from Juriy Zaytsev + // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ + function isEventSupported(eventName) { + var el = document.createElement('div'); + eventName = 'on' + eventName; + var isSupported = (eventName in el); + if (!isSupported) { + el.setAttribute(eventName, 'return;'); + isSupported = typeof el[eventName] == 'function'; + } + el = null; + return isSupported; + } + + function isForm(element) { + return Object.isElement(element) && element.nodeName.toUpperCase() == 'FORM' + } + + function isInput(element) { + if (Object.isElement(element)) { + var name = element.nodeName.toUpperCase() + return name == 'INPUT' || name == 'SELECT' || name == 'TEXTAREA' + } + else return false + } + + var submitBubbles = isEventSupported('submit'), + changeBubbles = isEventSupported('change') + + if (!submitBubbles || !changeBubbles) { + // augment the Event.Handler class to observe custom events when needed + Event.Handler.prototype.initialize = Event.Handler.prototype.initialize.wrap( + function(init, element, eventName, selector, callback) { + init(element, eventName, selector, callback) + // is the handler being attached to an element that doesn't support this event? + if ( (!submitBubbles && this.eventName == 'submit' && !isForm(this.element)) || + (!changeBubbles && this.eventName == 'change' && !isInput(this.element)) ) { + // "submit" => "emulated:submit" + this.eventName = 'emulated:' + this.eventName + } + } + ) + } + + if (!submitBubbles) { + // discover forms on the page by observing focus events which always bubble + document.on('focusin', 'form', function(focusEvent, form) { + // special handler for the real "submit" event (one-time operation) + if (!form.retrieve('emulated:submit')) { + form.on('submit', function(submitEvent) { + var emulated = form.fire('emulated:submit', submitEvent, true) + // if custom event received preventDefault, cancel the real one too + if (emulated.returnValue === false) submitEvent.preventDefault() + }) + form.store('emulated:submit', true) + } + }) + } + + if (!changeBubbles) { + // discover form inputs on the page + document.on('focusin', 'input, select, texarea', function(focusEvent, input) { + // special handler for real "change" events + if (!input.retrieve('emulated:change')) { + input.on('change', function(changeEvent) { + input.fire('emulated:change', changeEvent, true) + }) + input.store('emulated:change', true) + } + }) + } + + function handleRemote(element) { + var method, url, params; + + var event = element.fire("ajax:before"); + if (event.stopped) return false; + + if (element.tagName.toLowerCase() === 'form') { + method = element.readAttribute('method') || 'post'; + url = element.readAttribute('action'); + params = element.serialize(); + } else { + method = element.readAttribute('data-method') || 'get'; + url = element.readAttribute('href'); + params = {}; + } + + new Ajax.Request(url, { + method: method, + parameters: params, + evalScripts: true, + + onComplete: function(request) { element.fire("ajax:complete", request); }, + onSuccess: function(request) { element.fire("ajax:success", request); }, + onFailure: function(request) { element.fire("ajax:failure", request); } + }); + + element.fire("ajax:after"); + } + + function handleMethod(element) { + var method = element.readAttribute('data-method'), + url = element.readAttribute('href'), + csrf_param = $$('meta[name=csrf-param]')[0], + csrf_token = $$('meta[name=csrf-token]')[0]; + + var form = new Element('form', { method: "POST", action: url, style: "display: none;" }); + element.parentNode.insert(form); + + if (method !== 'post') { + var field = new Element('input', { type: 'hidden', name: '_method', value: method }); + form.insert(field); + } + + if (csrf_param) { + var param = csrf_param.readAttribute('content'), + token = csrf_token.readAttribute('content'), + field = new Element('input', { type: 'hidden', name: param, value: token }); + form.insert(field); + } + + form.submit(); + } + + + document.on("click", "*[data-confirm]", function(event, element) { + var message = element.readAttribute('data-confirm'); + if (!confirm(message)) event.stop(); + }); + + document.on("click", "a[data-remote]", function(event, element) { + if (event.stopped) return; + handleRemote(element); + event.stop(); + }); + + document.on("click", "a[data-method]", function(event, element) { + if (event.stopped) return; + handleMethod(element); + event.stop(); + }); + + document.on("submit", function(event) { + var element = event.findElement(), + message = element.readAttribute('data-confirm'); + if (message && !confirm(message)) { + event.stop(); + return false; + } + + var inputs = element.select("input[type=submit][data-disable-with]"); + inputs.each(function(input) { + input.disabled = true; + input.writeAttribute('data-original-value', input.value); + input.value = input.readAttribute('data-disable-with'); + }); + + var element = event.findElement("form[data-remote]"); + if (element) { + handleRemote(element); + event.stop(); + } + }); + + document.on("ajax:after", "form", function(event, element) { + var inputs = element.select("input[type=submit][disabled=true][data-disable-with]"); + inputs.each(function(input) { + input.value = input.readAttribute('data-original-value'); + input.removeAttribute('data-original-value'); + input.disabled = false; + }); + }); + + Ajax.Responders.register({ + onCreate: function(request) { + var csrf_meta_tag = $$('meta[name=csrf-token]')[0]; + + if (csrf_meta_tag) { + var header = 'X-CSRF-Token', + token = csrf_meta_tag.readAttribute('content'); + + if (!request.options.requestHeaders) { + request.options.requestHeaders = {}; + } + request.options.requestHeaders[header] = token; + } + } + }); +})(); diff --git a/themes/olive/javascripts/scriptaculous.js b/themes/olive/javascripts/scriptaculous.js deleted file mode 100755 index cd0e341..0000000 --- a/themes/olive/javascripts/scriptaculous.js +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// -// 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. - -var Scriptaculous = { - Version: '1.5_rc3', - require: function(libraryName) { - // inserting via DOM fails in Safari 2.0, so brute force approach - document.write(''); - }, - load: function() { - if((typeof Prototype=='undefined') || - parseFloat(Prototype.Version.split(".")[0] + "." + - Prototype.Version.split(".")[1]) < 1.4) - throw("script.aculo.us requires the Prototype JavaScript framework >= 1.4.0"); - var scriptTags = document.getElementsByTagName("script"); - for(var i=0;i this.maximum) sliderValue = this.maximum; - if(sliderValue < this.minimum) sliderValue = this.minimum; - var offsetDiff = (sliderValue - (this.value||this.minimum)) * this.increment; - - if(this.isVertical()){ - this.setCurrentTop(offsetDiff + this.currentTop()); - } else { - this.setCurrentLeft(offsetDiff + this.currentLeft()); - } - this.value = sliderValue; - this.updateFinished(); - }, - minimumOffset: function(){ - return(this.isVertical() ? - this.trackTop() + this.alignY : - this.trackLeft() + this.alignX); - }, - maximumOffset: function(){ - return(this.isVertical() ? - this.trackTop() + this.alignY + (this.maximum - this.minimum) * this.increment : - this.trackLeft() + this.alignX + (this.maximum - this.minimum) * this.increment); - }, - isVertical: function(){ - return (this.axis == 'vertical'); - }, - startDrag: function(event) { - if(Event.isLeftClick(event)) { - if(!this.disabled){ - this.active = true; - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - var offsets = Position.cumulativeOffset(this.handle); - this.offsetX = (pointer[0] - offsets[0]); - this.offsetY = (pointer[1] - offsets[1]); - this.originalLeft = this.currentLeft(); - this.originalTop = this.currentTop(); - } - Event.stop(event); - } - }, - update: function(event) { - if(this.active) { - if(!this.dragging) { - var style = this.handle.style; - this.dragging = true; - if(style.position=="") style.position = "relative"; - style.zIndex = this.options.zindex; - } - this.draw(event); - // fix AppleWebKit rendering - if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); - Event.stop(event); - } - }, - draw: function(event) { - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - var offsets = Position.cumulativeOffset(this.handle); - - offsets[0] -= this.currentLeft(); - offsets[1] -= this.currentTop(); - - // Adjust for the pointer's position on the handle - pointer[0] -= this.offsetX; - pointer[1] -= this.offsetY; - var style = this.handle.style; - - if(this.isVertical()){ - if(pointer[1] > this.maximumOffset()) - pointer[1] = this.maximumOffset(); - if(pointer[1] < this.minimumOffset()) - pointer[1] = this.minimumOffset(); - - // Increment by values - if(this.values){ - this.value = this.getNearestValue(Math.round((pointer[1] - this.minimumOffset()) / this.increment) + this.minimum); - pointer[1] = this.trackTop() + this.alignY + (this.value - this.minimum) * this.increment; - } else { - this.value = Math.round((pointer[1] - this.minimumOffset()) / this.increment) + this.minimum; - } - style.top = pointer[1] - offsets[1] + "px"; - } else { - if(pointer[0] > this.maximumOffset()) pointer[0] = this.maximumOffset(); - if(pointer[0] < this.minimumOffset()) pointer[0] = this.minimumOffset(); - // Increment by values - if(this.values){ - this.value = this.getNearestValue(Math.round((pointer[0] - this.minimumOffset()) / this.increment) + this.minimum); - pointer[0] = this.trackLeft() + this.alignX + (this.value - this.minimum) * this.increment; - } else { - this.value = Math.round((pointer[0] - this.minimumOffset()) / this.increment) + this.minimum; - } - style.left = (pointer[0] - offsets[0]) + "px"; - } - if(this.options.onSlide) this.options.onSlide(this.value); - }, - endDrag: function(event) { - if(this.active && this.dragging) { - this.finishDrag(event, true); - Event.stop(event); - } - this.active = false; - this.dragging = false; - }, - finishDrag: function(event, success) { - this.active = false; - this.dragging = false; - this.handle.style.zIndex = this.originalZ; - this.originalLeft = this.currentLeft(); - this.originalTop = this.currentTop(); - this.updateFinished(); - }, - updateFinished: function() { - if(this.options.onChange) this.options.onChange(this.value); - }, - keyPress: function(event) { - if(this.active && !this.disabled) { - switch(event.keyCode) { - case Event.KEY_ESC: - this.finishDrag(event, false); - Event.stop(event); - break; - } - if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event); - } - } -} diff --git a/themes/olive/javascripts/webmail.js b/themes/olive/javascripts/webmail.js deleted file mode 100755 index 3abc2dd..0000000 --- a/themes/olive/javascripts/webmail.js +++ /dev/null @@ -1,35 +0,0 @@ -function chooseContacts(url) { - rs('', url + '?mode=choose',550,480,0); -} - -function setBulk() { - if (getFormField("mail_bulk").checked) getFormField("set_bulk").value = "set_bulk" - document.forms['composeMail'].submit(); -} - -function getFormField(id) { - if ( document.getElementById ) elem = document.getElementById( id ); - else if ( document.all ) elem = document.eval( "document.all." + id ); - return elem; -} - -function toggle_msg_operations(setc) { - var isOpened = toggle_layer('msgops'); - if (setc) setCookie("_wmlmo", ( isOpened ? "opened" : "closed"), 1000000); -} - -function toggle_msg_search(setc) { - var isOpened = toggle_layer('msg_search'); - if (setc) setCookie("_wmlms", (isOpened ? "opened" : "closed"), 1000000); -} - -function checkAll(theForm) { // check all the checkboxes in the list - for (var i=0;i+|^dH=ll`}>yf-@pII4HSQ}FfuT(Gw3id zFff43U|{k1aKcktG=inNQ(dZ@<%=_('Edit/Create Contact Group')%> - <%= - form_tag( - link_save, - 'method' => 'post', - 'class' => 'two_columns' - ) - %> -<%= form_input(:hidden_field, 'contactgroup', 'id') %> -<%= form_input(:hidden_field, 'contactgroup', 'customer_id') %> - - - <%= form_input(:text_field, 'contactgroup', 'name', _('Name'), 'class'=>'two_columns') %> -
    - - - - -
    - - -
    - - <%= end_form_tag %> diff --git a/themes/olive/views/contact_groups/index.html.erb b/themes/olive/views/contact_groups/index.html.erb deleted file mode 100755 index a3dc585..0000000 --- a/themes/olive/views/contact_groups/index.html.erb +++ /dev/null @@ -1,26 +0,0 @@ -

    <%=_('Contact Groups')%>

    - -<%- form_for @contact_group do |f| %> -<%= hidden_field "contactgroup", "user_id" %> - - - - - -<% - for contactgroup in @contactgroups %> - - - - - - -<% end %> - - - -
    <%=_('Name')%> 
    <%= contactgroup.name %><%= link_to(_('members'), :controller=>'contact', :action=>'list', :id=>contactgroup.id, :params=>{"mode"=>"groups"}) %><%= link_to(_('edit'), :controller=>'/contacts/contact_group', :action=>'edit', :id=>contactgroup.id) %><%= link_to(_('delete'), {:controller=>'/contacts/contact_group', :action=>'delete', :id=>contactgroup.id}, {:confirm=>sprintf(_('DELETE CONTACT GROUP \'%s\'?'), contactgroup.name)})%>
    - - -
    -<%- end %> diff --git a/themes/olive/views/contacts/add_multiple.html.erb b/themes/olive/views/contacts/add_multiple.html.erb deleted file mode 100755 index 8ab1494..0000000 --- a/themes/olive/views/contacts/add_multiple.html.erb +++ /dev/null @@ -1,26 +0,0 @@ -

    <%=t :add_multiple_contacts %>

    -<% if flash["errors"] and not flash["errors"].empty?%> - <%= t(:errors)%> -
      - <% flash["errors"].each do |message| %> -
    • <%= message %> - <% end %> -
    -<% end %> -
    - <%= radio_button("contact", "file_type", "1")%> <%= t(:csv_file)%> - <%= radio_button("contact", "file_type", "2")%> <%= t(:tab_file)%> - - - - - - - - -
    - - - -
    -
    diff --git a/themes/olive/views/contacts/choose.html.erb b/themes/olive/views/contacts/choose.html.erb deleted file mode 100755 index 65fb2ac..0000000 --- a/themes/olive/views/contacts/choose.html.erb +++ /dev/null @@ -1,11 +0,0 @@ - \ No newline at end of file diff --git a/themes/olive/views/contacts/import_preview.html.erb b/themes/olive/views/contacts/import_preview.html.erb deleted file mode 100755 index b972081..0000000 --- a/themes/olive/views/contacts/import_preview.html.erb +++ /dev/null @@ -1,43 +0,0 @@ -

    <%= _('Contacts You Are About To Import')%>

    - -<% if flash["errors"] and not flash["errors"].empty?%> - <%= _('Errors')%> -
      - <% flash["errors"].each do |message| %> -
    • <%= message %> - <% end %> -
    -<% end %> - -
    - - - - - - - - - <% - for i in 0...@contacts.length - contact = @contacts[i] - %> - - - - - - - - <% end %> - - - - -
     <%= _('First name')%><%= _('Last name')%><%= _('E-mail')%>
    <%=i+1%>
    - - - - -
    -
    diff --git a/themes/olive/views/contacts/index.html.erb b/themes/olive/views/contacts/index.html.erb deleted file mode 100755 index 87e5217..0000000 --- a/themes/olive/views/contacts/index.html.erb +++ /dev/null @@ -1,115 +0,0 @@ -

    <%= t :contacts %>

    -<% unless @mode == "choose" %> - -<% end -%> -
    -
    - - <% if flash["alert"] %>
    • <%= flash["alert"] %>
    <% end %> -
    - - <% if @group_id and not @group_id.nil? %> - - <% end %> - - - - - - - - <% if @mode == "choose" %> - - - - - - <% for contact in @contacts %> - - - - - - <% end %> - - <% for group in @contactgroups %> - - - - - - <% end %> - - - - <% elsif @mode == "groups"%> - - - - - - <% for contact in @contacts %> - - - - - - - <% end %> - - - - <% else %> - - - - - - <% for contact in @contacts %> - - - - - - <% end %> - <% end %> -
    - <% CDF::CONFIG[:contact_letters].each do |letter| %> - <%= link_to letter, contacts_path(:letter => letter) %> - <% end %> -       - <%= link_to t(:show_all), contacts_path %> -
    <%= will_paginate @contacts %>
    <%= "#{t :to} #{t :cc} #{t :bcc}" %><%= t :name %><%= t :email %>
    - - <%=contact.full_name%><%=contact.email%>
    <%=t(:groups)%>:
    - - <%=group.name%> 
    - - -
    <%= t(:name)%><%= t(:email)%>
    ><%=contact.full_name%><%=contact.email%>
    - - -
    <%= t(:name)%><%= t(:email)%> 
    <%= link_to(contact.full_name, :controller=>:contacts, :action => "edit", :id => contact.id ) %><%= link_to( contact.email, :controller => :webmail, :action => "compose", :params => { "mail[to]" => contact.email } ) %><%= link_to(t(:delete), {:controller=>:contacts, :action=>'delete', :id=>contact.id}, - {:confirm=>t(:delete_contact_question, :name => contact.show_name, :email => contact.email)})%> -
    -
    -
    -
    diff --git a/themes/olive/views/contacts/new.html.erb b/themes/olive/views/contacts/new.html.erb deleted file mode 100755 index dd19e45..0000000 --- a/themes/olive/views/contacts/new.html.erb +++ /dev/null @@ -1,73 +0,0 @@ -

    <%=t(:edit_create_contact)%>

    - - -
    -
    - - - <%= form_tag( contacts_path, 'method' => 'post', 'class' => 'two_columns') do %> - <%= form_input(:hidden_field, 'contact', 'id') %> - <%= form_input(:hidden_field, 'contact', 'customer_id') %> - - - <%= form_input(:text_field, 'contact', 'fname', t(:first_name), 'class'=>'two_columns') %> - <%= form_input(:text_field, 'contact', 'lname', t(:last_name), 'class'=>'two_columns') %> - <%= form_input((@contact.new_record? ? :text_field : :read_only_field), 'contact', 'email', t(:email), 'class'=>'two_columns')%> -
    - - <% for group in @contactgroups %> - - <% end %> - <% if not(@contactgroups.empty?) %> - <%=_('Contact belong to these groups')%>: - - - <% - end - col = 1 - for group in @contactgroups %> - - <% if col%2 == 0 %> - - - <% end - col = col + 1 %> - <% end %> - <% if col%2 == 0 and not(@contactgroups.empty?) %> - - <% end %> - <% if not(@contactgroups.empty?) %> - -
    - > -  <%=group.name %> -
     
    - <% end %> - - - - - -
    - - -
    - <% end %> -
    -
    diff --git a/themes/olive/views/login/index.html.erb b/themes/olive/views/core/login.html.erb old mode 100644 new mode 100755 similarity index 76% rename from themes/olive/views/login/index.html.erb rename to themes/olive/views/core/login.html.erb index 6240f03..51b027b --- a/themes/olive/views/login/index.html.erb +++ b/themes/olive/views/core/login.html.erb @@ -5,13 +5,13 @@

    <%= t(:please_login) %>

    ").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(b.range==="min"||b.range==="max"?" ui-slider-range-"+b.range:""))}for(var j=c.length;j"); -this.handles=c.add(d(e.join("")).appendTo(a.element));this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(g){g.preventDefault()}).hover(function(){b.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(b.disabled)d(this).blur();else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(g){d(this).data("index.ui-slider-handle", -g)});this.handles.keydown(function(g){var k=true,l=d(this).data("index.ui-slider-handle"),i,h,m;if(!a.options.disabled){switch(g.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:k=false;if(!a._keySliding){a._keySliding=true;d(this).addClass("ui-state-active");i=a._start(g,l);if(i===false)return}break}m=a.options.step;i=a.options.values&&a.options.values.length? -(h=a.values(l)):(h=a.value());switch(g.keyCode){case d.ui.keyCode.HOME:h=a._valueMin();break;case d.ui.keyCode.END:h=a._valueMax();break;case d.ui.keyCode.PAGE_UP:h=a._trimAlignValue(i+(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:h=a._trimAlignValue(i-(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(i===a._valueMax())return;h=a._trimAlignValue(i+m);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(i===a._valueMin())return;h=a._trimAlignValue(i- -m);break}a._slide(g,l,h);return k}}).keyup(function(g){var k=d(this).data("index.ui-slider-handle");if(a._keySliding){a._keySliding=false;a._stop(g,k);a._change(g,k);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");this._mouseDestroy(); -return this},_mouseCapture:function(a){var b=this.options,c,f,e,j,g;if(b.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:a.pageX,y:a.pageY});f=this._valueMax()-this._valueMin()+1;j=this;this.handles.each(function(k){var l=Math.abs(c-j.values(k));if(f>l){f=l;e=d(this);g=k}});if(b.range===true&&this.values(1)===b.min){g+=1;e=d(this.handles[g])}if(this._start(a,g)===false)return false; -this._mouseSliding=true;j._handleIndex=g;e.addClass("ui-state-active").focus();b=e.offset();this._clickOffset=!d(a.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:a.pageX-b.left-e.width()/2,top:a.pageY-b.top-e.height()/2-(parseInt(e.css("borderTopWidth"),10)||0)-(parseInt(e.css("borderBottomWidth"),10)||0)+(parseInt(e.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(a,g,c);return this._animateOff=true},_mouseStart:function(){return true},_mouseDrag:function(a){var b= -this._normValueFromMouse({x:a.pageX,y:a.pageY});this._slide(a,this._handleIndex,b);return false},_mouseStop:function(a){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(a,this._handleIndex);this._change(a,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b;if(this.orientation==="horizontal"){b= -this.elementSize.width;a=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{b=this.elementSize.height;a=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}b=a/b;if(b>1)b=1;if(b<0)b=0;if(this.orientation==="vertical")b=1-b;a=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+b*a)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b); -c.values=this.values()}return this._trigger("start",a,c)},_slide:function(a,b,c){var f;if(this.options.values&&this.options.values.length){f=this.values(b?0:1);if(this.options.values.length===2&&this.options.range===true&&(b===0&&c>f||b===1&&c1){this.options.values[a]=this._trimAlignValue(b);this._refreshValue();this._change(null,a)}else if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;f=arguments[0];for(e=0;e=this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b;a=a-c;if(Math.abs(c)*2>=b)a+=c>0?b:-b;return parseFloat(a.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var a= -this.options.range,b=this.options,c=this,f=!this._animateOff?b.animate:false,e,j={},g,k,l,i;if(this.options.values&&this.options.values.length)this.handles.each(function(h){e=(c.values(h)-c._valueMin())/(c._valueMax()-c._valueMin())*100;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";d(this).stop(1,1)[f?"animate":"css"](j,b.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(h===0)c.range.stop(1,1)[f?"animate":"css"]({left:e+"%"},b.animate);if(h===1)c.range[f?"animate":"css"]({width:e- -g+"%"},{queue:false,duration:b.animate})}else{if(h===0)c.range.stop(1,1)[f?"animate":"css"]({bottom:e+"%"},b.animate);if(h===1)c.range[f?"animate":"css"]({height:e-g+"%"},{queue:false,duration:b.animate})}g=e});else{k=this.value();l=this._valueMin();i=this._valueMax();e=i!==l?(k-l)/(i-l)*100:0;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";this.handle.stop(1,1)[f?"animate":"css"](j,b.animate);if(a==="min"&&this.orientation==="horizontal")this.range.stop(1,1)[f?"animate":"css"]({width:e+"%"}, -b.animate);if(a==="max"&&this.orientation==="horizontal")this.range[f?"animate":"css"]({width:100-e+"%"},{queue:false,duration:b.animate});if(a==="min"&&this.orientation==="vertical")this.range.stop(1,1)[f?"animate":"css"]({height:e+"%"},b.animate);if(a==="max"&&this.orientation==="vertical")this.range[f?"animate":"css"]({height:100-e+"%"},{queue:false,duration:b.animate})}}});d.extend(d.ui.slider,{version:"1.8.15"})})(jQuery); -;/* - * jQuery UI Tabs 1.8.15 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Tabs - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - */ -(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"
    ",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
  • #{label}
  • "},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&& -e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b= -d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]|| -(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"); -this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected= -this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active"); -if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")); -this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+ -g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal", -function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")}; -this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected= --1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier."; -d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e= -d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b, -e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]); -j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove(); -if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null, -this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this}, -load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c, -"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this}, -url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.15"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k

    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 b{fwTLc@F(+7YQ;jFfe$!`njxgN@xNAeZs4s diff --git a/public/images/logo3_dark.png b/public/images/logo3_dark.png deleted file mode 100644 index 966187dc71a09eb0ea2c28a1198fada656f4f014..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77962 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 c;Ya'); + this.iefix = $(this.update.id+'_iefix'); + } + if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50); + }, + + fixIEOverlapping: function() { + Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)}); + this.iefix.style.zIndex = 1; + this.update.style.zIndex = 2; + Element.show(this.iefix); + }, + + hide: function() { + this.stopIndicator(); + if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update); + if(this.iefix) Element.hide(this.iefix); + }, + + startIndicator: function() { + if(this.options.indicator) Element.show(this.options.indicator); + }, + + stopIndicator: function() { + if(this.options.indicator) Element.hide(this.options.indicator); + }, + + onKeyPress: function(event) { + if(this.active) + switch(event.keyCode) { + case Event.KEY_TAB: + case Event.KEY_RETURN: + this.selectEntry(); + Event.stop(event); + case Event.KEY_ESC: + this.hide(); + this.active = false; + Event.stop(event); + return; + case Event.KEY_LEFT: + case Event.KEY_RIGHT: + return; + case Event.KEY_UP: + this.markPrevious(); + this.render(); + Event.stop(event); + return; + case Event.KEY_DOWN: + this.markNext(); + this.render(); + Event.stop(event); + return; + } + else + if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || + (Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return; + + this.changed = true; + this.hasFocus = true; + + if(this.observer) clearTimeout(this.observer); + this.observer = + setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000); + }, + + activate: function() { + this.changed = false; + this.hasFocus = true; + this.getUpdatedChoices(); + }, + + onHover: function(event) { + var element = Event.findElement(event, 'LI'); + if(this.index != element.autocompleteIndex) + { + this.index = element.autocompleteIndex; + this.render(); + } + Event.stop(event); + }, + + onClick: function(event) { + var element = Event.findElement(event, 'LI'); + this.index = element.autocompleteIndex; + this.selectEntry(); + this.hide(); + }, + + onBlur: function(event) { + // needed to make click events working + setTimeout(this.hide.bind(this), 250); + this.hasFocus = false; + this.active = false; + }, + + render: function() { + if(this.entryCount > 0) { + for (var i = 0; i < this.entryCount; i++) + this.index==i ? + Element.addClassName(this.getEntry(i),"selected") : + Element.removeClassName(this.getEntry(i),"selected"); + if(this.hasFocus) { + this.show(); + this.active = true; + } + } else { + this.active = false; + this.hide(); + } + }, + + markPrevious: function() { + if(this.index > 0) this.index--; + else this.index = this.entryCount-1; + this.getEntry(this.index).scrollIntoView(true); + }, + + markNext: function() { + if(this.index < this.entryCount-1) this.index++; + else this.index = 0; + this.getEntry(this.index).scrollIntoView(false); + }, + + getEntry: function(index) { + return this.update.firstChild.childNodes[index]; + }, + + getCurrentEntry: function() { + return this.getEntry(this.index); + }, + + selectEntry: function() { + this.active = false; + this.updateElement(this.getCurrentEntry()); + }, + + updateElement: function(selectedElement) { + if (this.options.updateElement) { + this.options.updateElement(selectedElement); + return; + } + var value = ''; + if (this.options.select) { + var nodes = $(selectedElement).select('.' + this.options.select) || []; + if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select); + } else + value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal'); + + var bounds = this.getTokenBounds(); + if (bounds[0] != -1) { + var newValue = this.element.value.substr(0, bounds[0]); + var whitespace = this.element.value.substr(bounds[0]).match(/^\s+/); + if (whitespace) + newValue += whitespace[0]; + this.element.value = newValue + value + this.element.value.substr(bounds[1]); + } else { + this.element.value = value; + } + this.oldElementValue = this.element.value; + this.element.focus(); + + if (this.options.afterUpdateElement) + this.options.afterUpdateElement(this.element, selectedElement); + }, + + updateChoices: function(choices) { + if(!this.changed && this.hasFocus) { + this.update.innerHTML = choices; + Element.cleanWhitespace(this.update); + Element.cleanWhitespace(this.update.down()); + + if(this.update.firstChild && this.update.down().childNodes) { + this.entryCount = + this.update.down().childNodes.length; + for (var i = 0; i < this.entryCount; i++) { + var entry = this.getEntry(i); + entry.autocompleteIndex = i; + this.addObservers(entry); + } + } else { + this.entryCount = 0; + } + + this.stopIndicator(); + this.index = 0; + + if(this.entryCount==1 && this.options.autoSelect) { + this.selectEntry(); + this.hide(); + } else { + this.render(); + } + } + }, + + addObservers: function(element) { + Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this)); + Event.observe(element, "click", this.onClick.bindAsEventListener(this)); + }, + + onObserverEvent: function() { + this.changed = false; + this.tokenBounds = null; + if(this.getToken().length>=this.options.minChars) { + this.getUpdatedChoices(); + } else { + this.active = false; + this.hide(); + } + this.oldElementValue = this.element.value; + }, + + getToken: function() { + var bounds = this.getTokenBounds(); + return this.element.value.substring(bounds[0], bounds[1]).strip(); + }, + + getTokenBounds: function() { + if (null != this.tokenBounds) return this.tokenBounds; + var value = this.element.value; + if (value.strip().empty()) return [-1, 0]; + var diff = arguments.callee.getFirstDifferencePos(value, this.oldElementValue); + var offset = (diff == this.oldElementValue.length ? 1 : 0); + var prevTokenPos = -1, nextTokenPos = value.length; + var tp; + for (var index = 0, l = this.options.tokens.length; index < l; ++index) { + tp = value.lastIndexOf(this.options.tokens[index], diff + offset - 1); + if (tp > prevTokenPos) prevTokenPos = tp; + tp = value.indexOf(this.options.tokens[index], diff + offset); + if (-1 != tp && tp < nextTokenPos) nextTokenPos = tp; + } + return (this.tokenBounds = [prevTokenPos + 1, nextTokenPos]); + } +}); + +Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function(newS, oldS) { + var boundary = Math.min(newS.length, oldS.length); + for (var index = 0; index < boundary; ++index) + if (newS[index] != oldS[index]) + return index; + return boundary; +}; + +Ajax.Autocompleter = Class.create(Autocompleter.Base, { + initialize: function(element, update, url, options) { + this.baseInitialize(element, update, options); + this.options.asynchronous = true; + this.options.onComplete = this.onComplete.bind(this); + this.options.defaultParams = this.options.parameters || null; + this.url = url; + }, + + getUpdatedChoices: function() { + this.startIndicator(); + + var entry = encodeURIComponent(this.options.paramName) + '=' + + encodeURIComponent(this.getToken()); + + this.options.parameters = this.options.callback ? + this.options.callback(this.element, entry) : entry; + + if(this.options.defaultParams) + this.options.parameters += '&' + this.options.defaultParams; + + new Ajax.Request(this.url, this.options); + }, + + onComplete: function(request) { + this.updateChoices(request.responseText); + } +}); + +// The local array autocompleter. Used when you'd prefer to +// inject an array of autocompletion options into the page, rather +// than sending out Ajax queries, which can be quite slow sometimes. +// +// The constructor takes four parameters. The first two are, as usual, +// the id of the monitored textbox, and id of the autocompletion menu. +// The third is the array you want to autocomplete from, and the fourth +// is the options block. +// +// Extra local autocompletion options: +// - choices - How many autocompletion choices to offer +// +// - partialSearch - If false, the autocompleter will match entered +// text only at the beginning of strings in the +// autocomplete array. Defaults to true, which will +// match text at the beginning of any *word* in the +// strings in the autocomplete array. If you want to +// search anywhere in the string, additionally set +// the option fullSearch to true (default: off). +// +// - fullSsearch - Search anywhere in autocomplete array strings. +// +// - partialChars - How many characters to enter before triggering +// a partial match (unlike minChars, which defines +// how many characters are required to do any match +// at all). Defaults to 2. +// +// - ignoreCase - Whether to ignore case when autocompleting. +// Defaults to true. +// +// It's possible to pass in a custom function as the 'selector' +// option, if you prefer to write your own autocompletion logic. +// In that case, the other options above will not apply unless +// you support them. + +Autocompleter.Local = Class.create(Autocompleter.Base, { + initialize: function(element, update, array, options) { + this.baseInitialize(element, update, options); + this.options.array = array; + }, + + getUpdatedChoices: function() { + this.updateChoices(this.options.selector(this)); + }, + + setOptions: function(options) { + this.options = Object.extend({ + choices: 10, + partialSearch: true, + partialChars: 2, + ignoreCase: true, + fullSearch: false, + selector: function(instance) { + var ret = []; // Beginning matches + var partial = []; // Inside matches + var entry = instance.getToken(); + var count = 0; + + for (var i = 0; i < instance.options.array.length && + ret.length < instance.options.choices ; i++) { + + var elem = instance.options.array[i]; + var foundPos = instance.options.ignoreCase ? + elem.toLowerCase().indexOf(entry.toLowerCase()) : + elem.indexOf(entry); + + while (foundPos != -1) { + if (foundPos == 0 && elem.length != entry.length) { + ret.push("

    '))}function N(a){return a.bind("mouseout", -function(b){b=d(b.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");b.length&&b.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(b){b=d(b.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");if(!(d.datepicker._isDisabledDatepicker(J.inline?a.parent()[0]:J.input[0])||!b.length)){b.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"); -b.addClass("ui-state-hover");b.hasClass("ui-datepicker-prev")&&b.addClass("ui-datepicker-prev-hover");b.hasClass("ui-datepicker-next")&&b.addClass("ui-datepicker-next-hover")}})}function H(a,b){d.extend(a,b);for(var c in b)if(b[c]==null||b[c]==C)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.15"}});var B=(new Date).getTime(),J;d.extend(M.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv}, -setDefaults:function(a){H(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g, -"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:N(d('
    '))}},_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker", -function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b);b.settings.disabled&&this._disableDatepicker(a)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&b.append.remove();if(c){b.append=d(''+c+"");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c== -"focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('').addClass(this._triggerClass).html(f==""?c:d("").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker(): -d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;gh){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a, -b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),true);this._updateDatepicker(b);this._updateAlternate(b);b.settings.disabled&&this._disableDatepicker(a);b.dpDiv.css("display","block")}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+= -1;this._dialogInput=d('');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}H(a.settings,e||{});b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/ -2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b= -d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e= -a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().removeClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a, -"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().addClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f== -a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var b=0;b-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input", -a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);if(d.datepicker._curInst&&d.datepicker._curInst!=b){d.datepicker._datepickerShowing&&d.datepicker._triggerOnClose(d.datepicker._curInst);d.datepicker._curInst.dpDiv.stop(true,true)}var c=d.datepicker._get(b,"beforeShow");H(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos= -d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b, -c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){var i=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0],top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.datepicker._datepickerShowing=true;d.effects&& -d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){this.maxRows=4;var b=d.datepicker._getBorders(a.dpDiv);J=a;a.dpDiv.empty().append(this._generateHTML(a));var c=a.dpDiv.find("iframe.ui-datepicker-cover");c.length&&c.css({left:-b[0],top:-b[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.find("."+ -this._dayOverClass+" a").mouseover();b=this._getNumberOfMonths(a);c=b[1];a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");c>1&&a.dpDiv.addClass("ui-datepicker-multi-"+c).css("width",17*c+"em");a.dpDiv[(b[0]!=1||b[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&& -a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var e=a.yearshtml;setTimeout(function(){e===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);e=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth(): -0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a), -"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_triggerOnClose:function(a){var b=this._get(a,"onClose");if(b)b.apply(a.input?a.input[0]:null,[a.input?a.input.val():"",a])},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst= -null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();d.datepicker._triggerOnClose(b);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")}, -_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"): -0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e["selected"+(c=="M"? -"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a); -this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a, -"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b== -"")return null;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%100+parseInt(e,10);for(var f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=A+1-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,j-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=j||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y", -RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=k+112?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear; -b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a));if(c=this._get(a,"onSelect")){e=this._formatDate(a);c.apply(a.input?a.input[0]:null,[e,a])}},_getDate:function(a){return!a.currentYear||a.input&&a.input.val()== -""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?new Date(9999, -9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&nn;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a)); -n=this._canAdjustMonth(a,-1,m,g)?''+n+"":f?"":''+n+"";var s=this._get(a,"nextText");s=!h?s:this.formatDate(s,this._daylightSavingAdjust(new Date(m, -g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?''+s+"":f?"":''+s+"";j=this._get(a,"currentText");s=this._get(a,"gotoCurrent")&& -a.currentDay?u:b;j=!h?j:this.formatDate(j,s,this._getFormatConfig(a));h=!a.inline?'":"";e=e?'
    '+(c?h:"")+(this._isInRange(a,s)?'":"")+(c?"":h)+"
    ":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");s=this._get(a,"dayNames");this._get(a,"dayNamesShort");var q=this._get(a,"dayNamesMin"),A=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),D=this._get(a,"showOtherMonths"),K=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var E=this._getDefaultDate(a),w="",x=0;x1)switch(G){case 0:y+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:y+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:y+=" ui-datepicker-group-middle";t="";break}y+='">'}y+='
    '+(/all|left/.test(t)&& -x==0?c?f:n:"")+(/all|right/.test(t)&&x==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,x>0||G>0,A,v)+'
    ';var z=j?'":"";for(t=0;t<7;t++){var r=(t+h)%7;z+="=5?' class="ui-datepicker-week-end"':"")+'>'+q[r]+""}y+=z+"";z=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay, -z);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;z=Math.ceil((t+z)/7);this.maxRows=z=l?this.maxRows>z?this.maxRows:z:z;r=this._daylightSavingAdjust(new Date(m,g,1-t));for(var Q=0;Q";var R=!j?"":'";for(t=0;t<7;t++){var I=p?p.apply(a.input?a.input[0]:null,[r]):[true,""],F=r.getMonth()!=g,L=F&&!K||!I[0]||k&&ro;R+='";r.setDate(r.getDate()+1);r=this._daylightSavingAdjust(r)}y+=R+""}g++;if(g>11){g=0;m++}y+="
    '+this._get(a,"weekHeader")+"
    '+this._get(a,"calculateWeek")(r)+""+(F&&!D?" ":L?''+ -r.getDate()+"":''+r.getDate()+"")+"
    "+(l?"
    +
    + +

    <%= t(:please_login) %>

    + +
    +

    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 b{fwTLc@F(+7YQ;jFfe$!`njxgN@xNAeZs4s literal 0 HcmV?d00001 diff --git a/public/images/logo3_dark.png b/public/images/logo3_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..966187dc71a09eb0ea2c28a1198fada656f4f014 GIT binary patch literal 77962 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 c;Ya Date: Sun, 26 Jun 2011 21:37:50 +0200 Subject: [PATCH 16/88] new olive theme --- arts/logo3.xcf | Bin 338334 -> 334574 bytes config/locales/pl.yml | 6 +- themes/empty/views/layouts/login.html.erb | 12 - .../empty/views/layouts/xapplication.html.erb | 27 - themes/olive/README.olive | 3 + themes/{empty => olive}/images/.gitkeep | 0 themes/olive/images/key.png | Bin 0 -> 612 bytes themes/olive/images/logo_small.png | Bin 0 -> 18309 bytes themes/{empty => olive}/javascripts/.gitkeep | 0 themes/olive/javascripts/contact_choose.js | 52 ++ themes/olive/javascripts/effects2.js | 349 +++++++++++ themes/olive/javascripts/global.js | 216 +++++++ themes/olive/javascripts/global_src.js | 201 +++++++ themes/olive/javascripts/htmlstyle.js | 21 + themes/olive/javascripts/jstrim.pl | 76 +++ themes/olive/javascripts/prototype_src.js | 521 ++++++++++++++++ themes/olive/javascripts/scriptaculous.js | 47 ++ themes/olive/javascripts/slider.js | 258 ++++++++ themes/olive/javascripts/webmail.js | 35 ++ themes/{empty => olive}/stylesheets/.gitkeep | 0 themes/olive/stylesheets/admin.css | 554 ++++++++++++++++++ themes/olive/stylesheets/base.css | 397 +++++++++++++ themes/olive/stylesheets/mailr.css | 68 +++ themes/olive/stylesheets/style.css | 346 +++++++++++ themes/olive/stylesheets/tabs.css | 111 ++++ .../stylesheets/webmail/icon-folder-open.gif | Bin 0 -> 155 bytes themes/olive/stylesheets/webmail/webmail.css | 161 +++++ .../olive/views/contact_groups/edit.html.erb | 24 + .../olive/views/contact_groups/index.html.erb | 26 + .../views/contacts/add_multiple.html.erb | 26 + themes/olive/views/contacts/choose.html.erb | 11 + .../views/contacts/import_preview.html.erb | 43 ++ themes/olive/views/contacts/index.html.erb | 115 ++++ themes/olive/views/contacts/new.html.erb | 73 +++ themes/olive/views/folders/index.html.erb | 48 ++ .../{empty => olive}/views/layouts/.gitkeep | 0 .../views/layouts/chooser.html.erb | 0 themes/olive/views/layouts/login.html.erb | 13 + themes/olive/views/layouts/public.html.erb | 29 + themes/olive/views/login/index.html.erb | 41 ++ themes/olive/views/shared/_folders.html.erb | 9 + themes/olive/views/webmail/_contacts.html.erb | 12 + themes/olive/views/webmail/_expr.html.erb | 18 + themes/olive/views/webmail/_filter.html.erb | 19 + .../olive/views/webmail/_message_row.html.erb | 14 + themes/olive/views/webmail/_search.html.erb | 13 + themes/olive/views/webmail/compose.html.erb | 67 +++ .../views/webmail/error_connection.html.erb | 26 + themes/olive/views/webmail/filter.html.erb | 41 ++ themes/olive/views/webmail/filters.html.erb | 42 ++ themes/olive/views/webmail/folders.html.erb | 29 + themes/olive/views/webmail/mailsent.html.erb | 31 + themes/olive/views/webmail/message.html.erb | 42 ++ themes/olive/views/webmail/messages.html.erb | 80 +++ .../olive/views/webmail/noattachment.html.erb | 1 + themes/olive/views/webmail/prefs.html.erb | 55 ++ .../olive/views/webmail/view_source.html.erb | 13 + themes/original/views/layouts/public.html.erb | 0 58 files changed, 4380 insertions(+), 42 deletions(-) delete mode 100755 themes/empty/views/layouts/login.html.erb delete mode 100755 themes/empty/views/layouts/xapplication.html.erb create mode 100644 themes/olive/README.olive rename themes/{empty => olive}/images/.gitkeep (100%) create mode 100644 themes/olive/images/key.png create mode 100644 themes/olive/images/logo_small.png rename themes/{empty => olive}/javascripts/.gitkeep (100%) create mode 100755 themes/olive/javascripts/contact_choose.js create mode 100755 themes/olive/javascripts/effects2.js create mode 100755 themes/olive/javascripts/global.js create mode 100755 themes/olive/javascripts/global_src.js create mode 100755 themes/olive/javascripts/htmlstyle.js create mode 100755 themes/olive/javascripts/jstrim.pl create mode 100755 themes/olive/javascripts/prototype_src.js create mode 100755 themes/olive/javascripts/scriptaculous.js create mode 100755 themes/olive/javascripts/slider.js create mode 100755 themes/olive/javascripts/webmail.js rename themes/{empty => olive}/stylesheets/.gitkeep (100%) create mode 100755 themes/olive/stylesheets/admin.css create mode 100644 themes/olive/stylesheets/base.css create mode 100755 themes/olive/stylesheets/mailr.css create mode 100644 themes/olive/stylesheets/style.css create mode 100755 themes/olive/stylesheets/tabs.css create mode 100755 themes/olive/stylesheets/webmail/icon-folder-open.gif create mode 100755 themes/olive/stylesheets/webmail/webmail.css create mode 100755 themes/olive/views/contact_groups/edit.html.erb create mode 100755 themes/olive/views/contact_groups/index.html.erb create mode 100755 themes/olive/views/contacts/add_multiple.html.erb create mode 100755 themes/olive/views/contacts/choose.html.erb create mode 100755 themes/olive/views/contacts/import_preview.html.erb create mode 100755 themes/olive/views/contacts/index.html.erb create mode 100755 themes/olive/views/contacts/new.html.erb create mode 100755 themes/olive/views/folders/index.html.erb rename themes/{empty => olive}/views/layouts/.gitkeep (100%) rename themes/{empty => olive}/views/layouts/chooser.html.erb (100%) create mode 100755 themes/olive/views/layouts/login.html.erb create mode 100755 themes/olive/views/layouts/public.html.erb create mode 100644 themes/olive/views/login/index.html.erb create mode 100755 themes/olive/views/shared/_folders.html.erb create mode 100755 themes/olive/views/webmail/_contacts.html.erb create mode 100755 themes/olive/views/webmail/_expr.html.erb create mode 100755 themes/olive/views/webmail/_filter.html.erb create mode 100755 themes/olive/views/webmail/_message_row.html.erb create mode 100755 themes/olive/views/webmail/_search.html.erb create mode 100755 themes/olive/views/webmail/compose.html.erb create mode 100755 themes/olive/views/webmail/error_connection.html.erb create mode 100755 themes/olive/views/webmail/filter.html.erb create mode 100755 themes/olive/views/webmail/filters.html.erb create mode 100755 themes/olive/views/webmail/folders.html.erb create mode 100755 themes/olive/views/webmail/mailsent.html.erb create mode 100755 themes/olive/views/webmail/message.html.erb create mode 100755 themes/olive/views/webmail/messages.html.erb create mode 100755 themes/olive/views/webmail/noattachment.html.erb create mode 100755 themes/olive/views/webmail/prefs.html.erb create mode 100755 themes/olive/views/webmail/view_source.html.erb mode change 100755 => 100644 themes/original/views/layouts/public.html.erb diff --git a/arts/logo3.xcf b/arts/logo3.xcf index 53103569843a38cca93b900ec28bb91212998c72..a941cac454d8c729e6225062ad66d1b7af422d61 100644 GIT binary patch delta 5104 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 - - - <%=t(:mailr) %> » <%= t(:please_login)%> - <%=stylesheet_link_tag "admin", "mailr" %> - - - <%= yield %> - - diff --git a/themes/empty/views/layouts/xapplication.html.erb b/themes/empty/views/layouts/xapplication.html.erb deleted file mode 100755 index 9aa6bbe..0000000 --- a/themes/empty/views/layouts/xapplication.html.erb +++ /dev/null @@ -1,27 +0,0 @@ - - - - <%= t :mailr %> - - <% @additional_css ||= [] %> - <% @additional_js ||= [] %> - <%=stylesheet_link_tag "admin", "tabs", "mailr", @additional_css %> - <%=javascript_include_tag :defaults, "global", "webmail", @additional_js %> - <%#=(@content_for_scripts ? @content_for_scripts : @additional_scripts )%> - - -

    "+(i[0]>0&&G==i[1]-1?'
    ':""):"");O+=y}w+=O}w+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'': -"");a._keyEvent=false;return w},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='
    ',o="";if(h||!j)o+=''+i[b]+"";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='"}u||(k+=o+(h||!(j&&l)?" ":""));if(!a.yearshtml){a.yearshtml="";if(h||!l)k+=''+c+"";else{g=this._get(a,"yearRange").split(":");var s=(new Date).getFullYear();i=function(q){q=q.match(/c[+-].*/)?c+parseInt(q.substring(1),10):q.match(/[+-].*/)?s+parseInt(q,10):parseInt(q,10);return isNaN(q)?s:q};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b, -e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='";k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?" ":"")+o;k+="
    ";return k},_adjustInstDate:function(a,b,c){var e=a.drawYear+(c=="Y"?b:0),f=a.drawMonth+ -(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&ba?a:b},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");if(b)b.apply(a.input? -a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);c=this._daylightSavingAdjust(new Date(c, -e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a, -"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=function(a){if(!this.length)return this; -if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));return this.each(function(){typeof a== -"string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new M;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.15";window["DP_jQuery_"+B]=d})(jQuery); -;/* - * jQuery UI Progressbar 1.8.15 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Progressbar - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - */ -(function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("
    ").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); -this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100* -this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.15"})})(jQuery); -;/* - * jQuery UI Effects 1.8.15 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/ - */ -jQuery.effects||function(f,j){function m(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1], -16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return n.transparent;return n[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return m(b)}function o(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle, -a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function p(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d= -a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function l(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor", -"borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=m(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var n={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0, -0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211, -211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},q=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b, -d){if(f.isFunction(b)){d=b;b=null}return this.queue(function(){var e=f(this),g=e.attr("style")||" ",h=p(o.call(this)),r,v=e.attr("class");f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});r=p(o.call(this));e.attr("class",v);e.animate(u(h,r),{queue:false,duration:a,easing:b,complete:function(){f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments);f.dequeue(this)}})})}; -f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this, -[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.15",save:function(c,a){for(var b=0;b
    ").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}); -c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c);return c},setTransition:function(c, -a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});return d.call(this,b)},_show:f.fn.show,show:function(c){if(l(c))return this._show.apply(this,arguments);else{var a=k.apply(this,arguments); -a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(l(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(l(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%", -"pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d* -((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/= -e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/= -e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h
    ").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+ -e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery); -;/* - * jQuery UI Effects Fade 1.8.15 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/Fade - * - * Depends: - * jquery.effects.core.js - */ -(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery); -;/* - * jQuery UI Effects Fold 1.8.15 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/Fold - * - * Depends: - * jquery.effects.core.js - */ -(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","bottom","left","right"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1], -10)/100*f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery); -;/* - * jQuery UI Effects Highlight 1.8.15 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/Highlight - * - * Depends: - * jquery.effects.core.js - */ -(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&& -this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); -;/* - * jQuery UI Effects Pulsate 1.8.15 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/Pulsate - * - * Depends: - * jquery.effects.core.js - */ -(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c
    ').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments); -b.dequeue()})})}})(jQuery); -; \ No newline at end of file diff --git a/themes/olive/javascripts/jquery.js b/themes/olive/javascripts/jquery.js deleted file mode 100755 index 48590ec..0000000 --- a/themes/olive/javascripts/jquery.js +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * jQuery JavaScript Library v1.6.2 - * http://jquery.com/ - * - * Copyright 2011, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Thu Jun 30 14:16:56 2011 -0400 - */ -(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
    a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
    ",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
    t
    ",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i. -shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

    ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
    ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div
    ","
    "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j -)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
    ").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
    ";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/themes/olive/javascripts/rails.js b/themes/olive/javascripts/rails.js deleted file mode 100755 index b17d5e7..0000000 --- a/themes/olive/javascripts/rails.js +++ /dev/null @@ -1,331 +0,0 @@ -/** - * Unobtrusive scripting adapter for jQuery - * - * Requires jQuery 1.6.0 or later. - * https://github.com/rails/jquery-ujs - - * Uploading file using rails.js - * ============================= - * - * By default, browsers do not allow files to be uploaded via AJAX. As a result, if there are any non-blank file fields - * in the remote form, this adapter aborts the AJAX submission and allows the form to submit through standard means. - * - * The `ajax:aborted:file` event allows you to bind your own handler to process the form submission however you wish. - * - * Ex: - * $('form').live('ajax:aborted:file', function(event, elements){ - * // Implement own remote file-transfer handler here for non-blank file inputs passed in `elements`. - * // Returning false in this handler tells rails.js to disallow standard form submission - * return false; - * }); - * - * The `ajax:aborted:file` event is fired when a file-type input is detected with a non-blank value. - * - * Third-party tools can use this hook to detect when an AJAX file upload is attempted, and then use - * techniques like the iframe method to upload the file instead. - * - * Required fields in rails.js - * =========================== - * - * If any blank required inputs (required="required") are detected in the remote form, the whole form submission - * is canceled. Note that this is unlike file inputs, which still allow standard (non-AJAX) form submission. - * - * The `ajax:aborted:required` event allows you to bind your own handler to inform the user of blank required inputs. - * - * !! Note that Opera does not fire the form's submit event if there are blank required inputs, so this event may never - * get fired in Opera. This event is what causes other browsers to exhibit the same submit-aborting behavior. - * - * Ex: - * $('form').live('ajax:aborted:required', function(event, elements){ - * // Returning false in this handler tells rails.js to submit the form anyway. - * // The blank required inputs are passed to this function in `elements`. - * return ! confirm("Would you like to submit the form with missing info?"); - * }); - */ - -(function($, undefined) { - // Shorthand to make it a little easier to call public rails functions from within rails.js - var rails; - - $.rails = rails = { - // Link elements bound by jquery-ujs - linkClickSelector: 'a[data-confirm], a[data-method], a[data-remote]', - - // Select elements bound by jquery-ujs - selectChangeSelector: 'select[data-remote]', - - // Form elements bound by jquery-ujs - formSubmitSelector: 'form', - - // Form input elements bound by jquery-ujs - formInputClickSelector: 'form input[type=submit], form input[type=image], form button[type=submit], form button:not([type])', - - // Form input elements disabled during form submission - disableSelector: 'input[data-disable-with], button[data-disable-with], textarea[data-disable-with]', - - // Form input elements re-enabled after form submission - enableSelector: 'input[data-disable-with]:disabled, button[data-disable-with]:disabled, textarea[data-disable-with]:disabled', - - // Form required input elements - requiredInputSelector: 'input[name][required]:not([disabled]),textarea[name][required]:not([disabled])', - - // Form file input elements - fileInputSelector: 'input:file', - - // Make sure that every Ajax request sends the CSRF token - CSRFProtection: function(xhr) { - var token = $('meta[name="csrf-token"]').attr('content'); - if (token) xhr.setRequestHeader('X-CSRF-Token', token); - }, - - // Triggers an event on an element and returns false if the event result is false - fire: function(obj, name, data) { - var event = $.Event(name); - obj.trigger(event, data); - return event.result !== false; - }, - - // Default confirm dialog, may be overridden with custom confirm dialog in $.rails.confirm - confirm: function(message) { - return confirm(message); - }, - - // Default ajax function, may be overridden with custom function in $.rails.ajax - ajax: function(options) { - return $.ajax(options); - }, - - // Submits "remote" forms and links with ajax - handleRemote: function(element) { - var method, url, data, - crossDomain = element.data('cross-domain') || null, - dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType); - - if (rails.fire(element, 'ajax:before')) { - - if (element.is('form')) { - method = element.attr('method'); - url = element.attr('action'); - data = element.serializeArray(); - // memoized value from clicked submit button - var button = element.data('ujs:submit-button'); - if (button) { - data.push(button); - element.data('ujs:submit-button', null); - } - } else if (element.is('select')) { - method = element.data('method'); - url = element.data('url'); - data = element.serialize(); - if (element.data('params')) data = data + "&" + element.data('params'); - } else { - method = element.data('method'); - url = element.attr('href'); - data = element.data('params') || null; - } - - options = { - type: method || 'GET', data: data, dataType: dataType, crossDomain: crossDomain, - // stopping the "ajax:beforeSend" event will cancel the ajax request - beforeSend: function(xhr, settings) { - if (settings.dataType === undefined) { - xhr.setRequestHeader('accept', '*/*;q=0.5, ' + settings.accepts.script); - } - return rails.fire(element, 'ajax:beforeSend', [xhr, settings]); - }, - success: function(data, status, xhr) { - element.trigger('ajax:success', [data, status, xhr]); - }, - complete: function(xhr, status) { - element.trigger('ajax:complete', [xhr, status]); - }, - error: function(xhr, status, error) { - element.trigger('ajax:error', [xhr, status, error]); - } - }; - // Do not pass url to `ajax` options if blank - if (url) { $.extend(options, { url: url }); } - - rails.ajax(options); - } - }, - - // Handles "data-method" on links such as: - // Delete - handleMethod: function(link) { - var href = link.attr('href'), - method = link.data('method'), - csrf_token = $('meta[name=csrf-token]').attr('content'), - csrf_param = $('meta[name=csrf-param]').attr('content'), - form = $('
    '), - metadata_input = ''; - - if (csrf_param !== undefined && csrf_token !== undefined) { - metadata_input += ''; - } - - form.hide().append(metadata_input).appendTo('body'); - form.submit(); - }, - - /* Disables form elements: - - Caches element value in 'ujs:enable-with' data store - - Replaces element text with value of 'data-disable-with' attribute - - Adds disabled=disabled attribute - */ - disableFormElements: function(form) { - form.find(rails.disableSelector).each(function() { - var element = $(this), method = element.is('button') ? 'html' : 'val'; - element.data('ujs:enable-with', element[method]()); - element[method](element.data('disable-with')); - element.attr('disabled', 'disabled'); - }); - }, - - /* Re-enables disabled form elements: - - Replaces element text with cached value from 'ujs:enable-with' data store (created in `disableFormElements`) - - Removes disabled attribute - */ - enableFormElements: function(form) { - form.find(rails.enableSelector).each(function() { - var element = $(this), method = element.is('button') ? 'html' : 'val'; - if (element.data('ujs:enable-with')) element[method](element.data('ujs:enable-with')); - element.removeAttr('disabled'); - }); - }, - - /* For 'data-confirm' attribute: - - Fires `confirm` event - - Shows the confirmation dialog - - Fires the `confirm:complete` event - - Returns `true` if no function stops the chain and user chose yes; `false` otherwise. - Attaching a handler to the element's `confirm` event that returns a `falsy` value cancels the confirmation dialog. - Attaching a handler to the element's `confirm:complete` event that returns a `falsy` value makes this function - return false. The `confirm:complete` event is fired whether or not the user answered true or false to the dialog. - */ - allowAction: function(element) { - var message = element.data('confirm'), - answer = false, callback; - if (!message) { return true; } - - if (rails.fire(element, 'confirm')) { - answer = rails.confirm(message); - callback = rails.fire(element, 'confirm:complete', [answer]); - } - return answer && callback; - }, - - // Helper function which checks for blank inputs in a form that match the specified CSS selector - blankInputs: function(form, specifiedSelector, nonBlank) { - var inputs = $(), input, - selector = specifiedSelector || 'input,textarea'; - form.find(selector).each(function() { - input = $(this); - // Collect non-blank inputs if nonBlank option is true, otherwise, collect blank inputs - if (nonBlank ? input.val() : !input.val()) { - inputs = inputs.add(input); - } - }); - return inputs.length ? inputs : false; - }, - - // Helper function which checks for non-blank inputs in a form that match the specified CSS selector - nonBlankInputs: function(form, specifiedSelector) { - return rails.blankInputs(form, specifiedSelector, true); // true specifies nonBlank - }, - - // Helper function, needed to provide consistent behavior in IE - stopEverything: function(e) { - $(e.target).trigger('ujs:everythingStopped'); - e.stopImmediatePropagation(); - return false; - }, - - // find all the submit events directly bound to the form and - // manually invoke them. If anyone returns false then stop the loop - callFormSubmitBindings: function(form) { - var events = form.data('events'), continuePropagation = true; - if (events !== undefined && events['submit'] !== undefined) { - $.each(events['submit'], function(i, obj){ - if (typeof obj.handler === 'function') return continuePropagation = obj.handler(obj.data); - }); - } - return continuePropagation; - } - }; - - $.ajaxPrefilter(function(options, originalOptions, xhr){ if ( !options.crossDomain ) { rails.CSRFProtection(xhr); }}); - - $(rails.linkClickSelector).live('click.rails', function(e) { - var link = $(this); - if (!rails.allowAction(link)) return rails.stopEverything(e); - - if (link.data('remote') !== undefined) { - rails.handleRemote(link); - return false; - } else if (link.data('method')) { - rails.handleMethod(link); - return false; - } - }); - - $(rails.selectChangeSelector).live('change.rails', function(e) { - var link = $(this); - if (!rails.allowAction(link)) return rails.stopEverything(e); - - rails.handleRemote(link); - return false; - }); - - $(rails.formSubmitSelector).live('submit.rails', function(e) { - var form = $(this), - remote = form.data('remote') !== undefined, - blankRequiredInputs = rails.blankInputs(form, rails.requiredInputSelector), - nonBlankFileInputs = rails.nonBlankInputs(form, rails.fileInputSelector); - - if (!rails.allowAction(form)) return rails.stopEverything(e); - - // skip other logic when required values are missing or file upload is present - if (blankRequiredInputs && form.attr("novalidate") == undefined && rails.fire(form, 'ajax:aborted:required', [blankRequiredInputs])) { - return rails.stopEverything(e); - } - - if (remote) { - if (nonBlankFileInputs) { - return rails.fire(form, 'ajax:aborted:file', [nonBlankFileInputs]); - } - - // If browser does not support submit bubbling, then this live-binding will be called before direct - // bindings. Therefore, we should directly call any direct bindings before remotely submitting form. - if (!$.support.submitBubbles && rails.callFormSubmitBindings(form) === false) return rails.stopEverything(e); - - rails.handleRemote(form); - return false; - } else { - // slight timeout so that the submit button gets properly serialized - setTimeout(function(){ rails.disableFormElements(form); }, 13); - } - }); - - $(rails.formInputClickSelector).live('click.rails', function(event) { - var button = $(this); - - if (!rails.allowAction(button)) return rails.stopEverything(event); - - // register the pressed submit button - var name = button.attr('name'), - data = name ? {name:name, value:button.val()} : null; - - button.closest('form').data('ujs:submit-button', data); - }); - - $(rails.formSubmitSelector).live('ajax:beforeSend.rails', function(event) { - if (this == event.target) rails.disableFormElements($(this)); - }); - - $(rails.formSubmitSelector).live('ajax:complete.rails', function(event) { - if (this == event.target) rails.enableFormElements($(this)); - }); - -})( jQuery ); diff --git a/themes/olive/stylesheets/jquery-ui-custom.css b/themes/olive/stylesheets/jquery-ui-custom.css deleted file mode 100755 index 0f1a7e7..0000000 --- a/themes/olive/stylesheets/jquery-ui-custom.css +++ /dev/null @@ -1,568 +0,0 @@ -/* - * jQuery UI CSS Framework 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Theming/API - */ - -/* Layout helpers -----------------------------------*/ -.ui-helper-hidden { display: none; } -.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } -.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } -.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } -.ui-helper-clearfix { display: inline-block; } -/* required comment for clearfix to work in Opera \*/ -* html .ui-helper-clearfix { height:1%; } -.ui-helper-clearfix { display:block; } -/* end clearfix */ -.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } - - -/* Interaction Cues -----------------------------------*/ -.ui-state-disabled { cursor: default !important; } - - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } - - -/* Misc visuals -----------------------------------*/ - -/* Overlays */ -.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } - - -/* - * jQuery UI CSS Framework 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Theming/API - * - * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px - */ - - -/* Component containers -----------------------------------*/ -.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; } -.ui-widget .ui-widget { font-size: 1em; } -.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; } -.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; } -.ui-widget-content a { color: #222222; } -.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; } -.ui-widget-header a { color: #222222; } - -/* Interaction states -----------------------------------*/ -.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; } -.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; } -.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } -.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; } -.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } -.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } -.ui-widget :active { outline: none; } - -/* Interaction Cues -----------------------------------*/ -.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; } -.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } -.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; } -.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } -.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } -.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } -.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } -.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } -.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } -.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } -.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } -.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } -.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } -.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } -.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); } - -/* positioning */ -.ui-icon-carat-1-n { background-position: 0 0; } -.ui-icon-carat-1-ne { background-position: -16px 0; } -.ui-icon-carat-1-e { background-position: -32px 0; } -.ui-icon-carat-1-se { background-position: -48px 0; } -.ui-icon-carat-1-s { background-position: -64px 0; } -.ui-icon-carat-1-sw { background-position: -80px 0; } -.ui-icon-carat-1-w { background-position: -96px 0; } -.ui-icon-carat-1-nw { background-position: -112px 0; } -.ui-icon-carat-2-n-s { background-position: -128px 0; } -.ui-icon-carat-2-e-w { background-position: -144px 0; } -.ui-icon-triangle-1-n { background-position: 0 -16px; } -.ui-icon-triangle-1-ne { background-position: -16px -16px; } -.ui-icon-triangle-1-e { background-position: -32px -16px; } -.ui-icon-triangle-1-se { background-position: -48px -16px; } -.ui-icon-triangle-1-s { background-position: -64px -16px; } -.ui-icon-triangle-1-sw { background-position: -80px -16px; } -.ui-icon-triangle-1-w { background-position: -96px -16px; } -.ui-icon-triangle-1-nw { background-position: -112px -16px; } -.ui-icon-triangle-2-n-s { background-position: -128px -16px; } -.ui-icon-triangle-2-e-w { background-position: -144px -16px; } -.ui-icon-arrow-1-n { background-position: 0 -32px; } -.ui-icon-arrow-1-ne { background-position: -16px -32px; } -.ui-icon-arrow-1-e { background-position: -32px -32px; } -.ui-icon-arrow-1-se { background-position: -48px -32px; } -.ui-icon-arrow-1-s { background-position: -64px -32px; } -.ui-icon-arrow-1-sw { background-position: -80px -32px; } -.ui-icon-arrow-1-w { background-position: -96px -32px; } -.ui-icon-arrow-1-nw { background-position: -112px -32px; } -.ui-icon-arrow-2-n-s { background-position: -128px -32px; } -.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } -.ui-icon-arrow-2-e-w { background-position: -160px -32px; } -.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } -.ui-icon-arrowstop-1-n { background-position: -192px -32px; } -.ui-icon-arrowstop-1-e { background-position: -208px -32px; } -.ui-icon-arrowstop-1-s { background-position: -224px -32px; } -.ui-icon-arrowstop-1-w { background-position: -240px -32px; } -.ui-icon-arrowthick-1-n { background-position: 0 -48px; } -.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } -.ui-icon-arrowthick-1-e { background-position: -32px -48px; } -.ui-icon-arrowthick-1-se { background-position: -48px -48px; } -.ui-icon-arrowthick-1-s { background-position: -64px -48px; } -.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } -.ui-icon-arrowthick-1-w { background-position: -96px -48px; } -.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } -.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } -.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } -.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } -.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } -.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } -.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } -.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } -.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } -.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } -.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } -.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } -.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } -.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } -.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } -.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } -.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } -.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } -.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } -.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } -.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } -.ui-icon-arrow-4 { background-position: 0 -80px; } -.ui-icon-arrow-4-diag { background-position: -16px -80px; } -.ui-icon-extlink { background-position: -32px -80px; } -.ui-icon-newwin { background-position: -48px -80px; } -.ui-icon-refresh { background-position: -64px -80px; } -.ui-icon-shuffle { background-position: -80px -80px; } -.ui-icon-transfer-e-w { background-position: -96px -80px; } -.ui-icon-transferthick-e-w { background-position: -112px -80px; } -.ui-icon-folder-collapsed { background-position: 0 -96px; } -.ui-icon-folder-open { background-position: -16px -96px; } -.ui-icon-document { background-position: -32px -96px; } -.ui-icon-document-b { background-position: -48px -96px; } -.ui-icon-note { background-position: -64px -96px; } -.ui-icon-mail-closed { background-position: -80px -96px; } -.ui-icon-mail-open { background-position: -96px -96px; } -.ui-icon-suitcase { background-position: -112px -96px; } -.ui-icon-comment { background-position: -128px -96px; } -.ui-icon-person { background-position: -144px -96px; } -.ui-icon-print { background-position: -160px -96px; } -.ui-icon-trash { background-position: -176px -96px; } -.ui-icon-locked { background-position: -192px -96px; } -.ui-icon-unlocked { background-position: -208px -96px; } -.ui-icon-bookmark { background-position: -224px -96px; } -.ui-icon-tag { background-position: -240px -96px; } -.ui-icon-home { background-position: 0 -112px; } -.ui-icon-flag { background-position: -16px -112px; } -.ui-icon-calendar { background-position: -32px -112px; } -.ui-icon-cart { background-position: -48px -112px; } -.ui-icon-pencil { background-position: -64px -112px; } -.ui-icon-clock { background-position: -80px -112px; } -.ui-icon-disk { background-position: -96px -112px; } -.ui-icon-calculator { background-position: -112px -112px; } -.ui-icon-zoomin { background-position: -128px -112px; } -.ui-icon-zoomout { background-position: -144px -112px; } -.ui-icon-search { background-position: -160px -112px; } -.ui-icon-wrench { background-position: -176px -112px; } -.ui-icon-gear { background-position: -192px -112px; } -.ui-icon-heart { background-position: -208px -112px; } -.ui-icon-star { background-position: -224px -112px; } -.ui-icon-link { background-position: -240px -112px; } -.ui-icon-cancel { background-position: 0 -128px; } -.ui-icon-plus { background-position: -16px -128px; } -.ui-icon-plusthick { background-position: -32px -128px; } -.ui-icon-minus { background-position: -48px -128px; } -.ui-icon-minusthick { background-position: -64px -128px; } -.ui-icon-close { background-position: -80px -128px; } -.ui-icon-closethick { background-position: -96px -128px; } -.ui-icon-key { background-position: -112px -128px; } -.ui-icon-lightbulb { background-position: -128px -128px; } -.ui-icon-scissors { background-position: -144px -128px; } -.ui-icon-clipboard { background-position: -160px -128px; } -.ui-icon-copy { background-position: -176px -128px; } -.ui-icon-contact { background-position: -192px -128px; } -.ui-icon-image { background-position: -208px -128px; } -.ui-icon-video { background-position: -224px -128px; } -.ui-icon-script { background-position: -240px -128px; } -.ui-icon-alert { background-position: 0 -144px; } -.ui-icon-info { background-position: -16px -144px; } -.ui-icon-notice { background-position: -32px -144px; } -.ui-icon-help { background-position: -48px -144px; } -.ui-icon-check { background-position: -64px -144px; } -.ui-icon-bullet { background-position: -80px -144px; } -.ui-icon-radio-off { background-position: -96px -144px; } -.ui-icon-radio-on { background-position: -112px -144px; } -.ui-icon-pin-w { background-position: -128px -144px; } -.ui-icon-pin-s { background-position: -144px -144px; } -.ui-icon-play { background-position: 0 -160px; } -.ui-icon-pause { background-position: -16px -160px; } -.ui-icon-seek-next { background-position: -32px -160px; } -.ui-icon-seek-prev { background-position: -48px -160px; } -.ui-icon-seek-end { background-position: -64px -160px; } -.ui-icon-seek-start { background-position: -80px -160px; } -/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ -.ui-icon-seek-first { background-position: -80px -160px; } -.ui-icon-stop { background-position: -96px -160px; } -.ui-icon-eject { background-position: -112px -160px; } -.ui-icon-volume-off { background-position: -128px -160px; } -.ui-icon-volume-on { background-position: -144px -160px; } -.ui-icon-power { background-position: 0 -176px; } -.ui-icon-signal-diag { background-position: -16px -176px; } -.ui-icon-signal { background-position: -32px -176px; } -.ui-icon-battery-0 { background-position: -48px -176px; } -.ui-icon-battery-1 { background-position: -64px -176px; } -.ui-icon-battery-2 { background-position: -80px -176px; } -.ui-icon-battery-3 { background-position: -96px -176px; } -.ui-icon-circle-plus { background-position: 0 -192px; } -.ui-icon-circle-minus { background-position: -16px -192px; } -.ui-icon-circle-close { background-position: -32px -192px; } -.ui-icon-circle-triangle-e { background-position: -48px -192px; } -.ui-icon-circle-triangle-s { background-position: -64px -192px; } -.ui-icon-circle-triangle-w { background-position: -80px -192px; } -.ui-icon-circle-triangle-n { background-position: -96px -192px; } -.ui-icon-circle-arrow-e { background-position: -112px -192px; } -.ui-icon-circle-arrow-s { background-position: -128px -192px; } -.ui-icon-circle-arrow-w { background-position: -144px -192px; } -.ui-icon-circle-arrow-n { background-position: -160px -192px; } -.ui-icon-circle-zoomin { background-position: -176px -192px; } -.ui-icon-circle-zoomout { background-position: -192px -192px; } -.ui-icon-circle-check { background-position: -208px -192px; } -.ui-icon-circlesmall-plus { background-position: 0 -208px; } -.ui-icon-circlesmall-minus { background-position: -16px -208px; } -.ui-icon-circlesmall-close { background-position: -32px -208px; } -.ui-icon-squaresmall-plus { background-position: -48px -208px; } -.ui-icon-squaresmall-minus { background-position: -64px -208px; } -.ui-icon-squaresmall-close { background-position: -80px -208px; } -.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } -.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } -.ui-icon-grip-solid-vertical { background-position: -32px -224px; } -.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } -.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } -.ui-icon-grip-diagonal-se { background-position: -80px -224px; } - - -/* Misc visuals -----------------------------------*/ - -/* Corner radius */ -.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; } -.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; } -.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } -.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } - -/* Overlays */ -.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } -.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* - * jQuery UI Resizable 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Resizable#theming - */ -.ui-resizable { position: relative;} -.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; } -.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } -.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } -.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } -.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } -.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } -.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } -.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } -.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } -.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* - * jQuery UI Selectable 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Selectable#theming - */ -.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } -/* - * jQuery UI Accordion 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Accordion#theming - */ -/* IE/Win - Fix animation bug - #4615 */ -.ui-accordion { width: 100%; } -.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } -.ui-accordion .ui-accordion-li-fix { display: inline; } -.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } -.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } -.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } -.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } -.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } -.ui-accordion .ui-accordion-content-active { display: block; } -/* - * jQuery UI Autocomplete 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Autocomplete#theming - */ -.ui-autocomplete { position: absolute; cursor: default; } - -/* workarounds */ -* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ - -/* - * jQuery UI Menu 1.8.16 - * - * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Menu#theming - */ -.ui-menu { - list-style:none; - padding: 2px; - margin: 0; - display:block; - float: left; -} -.ui-menu .ui-menu { - margin-top: -3px; -} -.ui-menu .ui-menu-item { - margin:0; - padding: 0; - zoom: 1; - float: left; - clear: left; - width: 100%; -} -.ui-menu .ui-menu-item a { - text-decoration:none; - display:block; - padding:.2em .4em; - line-height:1.5; - zoom:1; -} -.ui-menu .ui-menu-item a.ui-state-hover, -.ui-menu .ui-menu-item a.ui-state-active { - font-weight: normal; - margin: -1px; -} -/* - * jQuery UI Button 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Button#theming - */ -.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ -.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ -button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ -.ui-button-icons-only { width: 3.4em; } -button.ui-button-icons-only { width: 3.7em; } - -/*button text element */ -.ui-button .ui-button-text { display: block; line-height: 1.4; } -.ui-button-text-only .ui-button-text { padding: .4em 1em; } -.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } -.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } -.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } -.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } -/* no icon support for input elements, provide padding by default */ -input.ui-button { padding: .4em 1em; } - -/*button icon element(s) */ -.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } -.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } -.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } -.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } -.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } - -/*button sets*/ -.ui-buttonset { margin-right: 7px; } -.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } - -/* workarounds */ -button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ -/* - * jQuery UI Dialog 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Dialog#theming - */ -.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } -.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } -.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } -.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } -.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } -.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } -.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } -.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } -.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } -.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } -.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } -.ui-draggable .ui-dialog-titlebar { cursor: move; } -/* - * jQuery UI Slider 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Slider#theming - */ -.ui-slider { position: relative; text-align: left; } -.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } -.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } - -.ui-slider-horizontal { height: .8em; } -.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } -.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } -.ui-slider-horizontal .ui-slider-range-min { left: 0; } -.ui-slider-horizontal .ui-slider-range-max { right: 0; } - -.ui-slider-vertical { width: .8em; height: 100px; } -.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } -.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } -.ui-slider-vertical .ui-slider-range-min { bottom: 0; } -.ui-slider-vertical .ui-slider-range-max { top: 0; }/* - * jQuery UI Tabs 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Tabs#theming - */ -.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ -.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } -.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } -.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } -.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } -.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } -.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ -.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } -.ui-tabs .ui-tabs-hide { display: none !important; } -/* - * jQuery UI Datepicker 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Datepicker#theming - */ -.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } -.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } -.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } -.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } -.ui-datepicker .ui-datepicker-prev { left:2px; } -.ui-datepicker .ui-datepicker-next { right:2px; } -.ui-datepicker .ui-datepicker-prev-hover { left:1px; } -.ui-datepicker .ui-datepicker-next-hover { right:1px; } -.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } -.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } -.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } -.ui-datepicker select.ui-datepicker-month-year {width: 100%;} -.ui-datepicker select.ui-datepicker-month, -.ui-datepicker select.ui-datepicker-year { width: 49%;} -.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } -.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } -.ui-datepicker td { border: 0; padding: 1px; } -.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } -.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } -.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } -.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } - -/* with multiple calendars */ -.ui-datepicker.ui-datepicker-multi { width:auto; } -.ui-datepicker-multi .ui-datepicker-group { float:left; } -.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } -.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } -.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } -.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } -.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } -.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } -.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } -.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; } - -/* RTL support */ -.ui-datepicker-rtl { direction: rtl; } -.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } -.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } -.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } -.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } -.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } -.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } -.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } -.ui-datepicker-rtl .ui-datepicker-group { float:right; } -.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } -.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } - -/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ -.ui-datepicker-cover { - display: none; /*sorry for IE5*/ - display/**/: block; /*sorry for IE5*/ - position: absolute; /*must have*/ - z-index: -1; /*must have*/ - filter: mask(); /*must have*/ - top: -4px; /*must have*/ - left: -4px; /*must have*/ - width: 200px; /*must have*/ - height: 200px; /*must have*/ -}/* - * jQuery UI Progressbar 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Progressbar#theming - */ -.ui-progressbar { height:2em; text-align: left; } -.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } \ No newline at end of file diff --git a/themes/olive/stylesheets/jquery-ui-dialog.css b/themes/olive/stylesheets/jquery-ui-dialog.css deleted file mode 100755 index 1b95d7f..0000000 --- a/themes/olive/stylesheets/jquery-ui-dialog.css +++ /dev/null @@ -1,21 +0,0 @@ -/* - * jQuery UI Dialog 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Dialog#theming - */ -.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } -.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } -.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } -.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } -.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } -.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } -.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } -.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } -.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } -.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } -.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } -.ui-draggable .ui-dialog-titlebar { cursor: move; } diff --git a/themes/olive/stylesheets/olive.css b/themes/olive/stylesheets/olive.css deleted file mode 100755 index 833e4bf..0000000 --- a/themes/olive/stylesheets/olive.css +++ /dev/null @@ -1,560 +0,0 @@ -* { - margin:0; - padding:0; -} - -body { - font-size: 12px; - color: #222; - background: #EFF3E4; - font-family: sans-serif; -} - -h1 { margin: 15px 0; font-size: 10px; font-weight: normal; } -h3 { font-size: 14px; font-weight: normal;} -h4 { font-size: 16px; margin: 5px 0; font-weight: normal;} -hr {height: 1px; border: 0; } -p { margin: 15px 0;} -a img { border: none; } - -.clear { - clear: both; - height: 0; -} - -#container { - min-width: 960px; -} - -#sidebar { - width: 250px; - float: left; - margin-left: 5px; - padding: 0 5px; - margin-right: 5px; -} - -#main { - width: 960px; - float: left; - margin-top: 10px; -} - -.width100 { - width: 100%; -} - -div.logo { - text-align: center; - margin: 10px; -} - -p.version { - color: #5E634E; - text-align: center; - font-size: 14px; -} - -.block { - margin: 0 0 10px 0; - padding-bottom: 1px; -} - -.block .content { - padding-left: 5px; - padding-right: 5px; - background-color: white; - border-bottom-left-radius: 5px; - border-bottom-right-radius: 5px; -} - -.block h3 { - background: #5E634E; - color: #FFF; - border-bottom: 6px solid #DACF77; - padding: 6px 10px; - -moz-border-radius-topleft: 5px; - -webkit-border-top-left-radius: 5px; - -moz-border-radius-topright: 5px; - -webkit-border-top-right-radius: 5px; -} - -#user-navigation ul, #navigation-tabs ul, .navigation-tabs ul, #sidebar ul.navigation { - list-style-type: none; - margin: 0; - padding: 0; -} - -ul.folders { - font-size: 14px; -} - -ul.navigation { - color: #A3AB74; -} - -#sidebar ul.navigation li { - padding: 3px; -} - -#sidebar ul li { - border-bottom: 1px solid #F0F0EE; -} - -ul li a:link, ul li a:visited { - background: none repeat scroll 0 0 #FFFFFF; - text-decoration: none; -} -a:link, a:visited, a:hover, a:active, h1, h2, h3 { - color: #A3AB74; - text-decoration: none; -} - -li.selected { - color: #5E634E; - font-weight: bold; -} - -.navigation-tabs { - border-top-left-radius: 4px; - border-top-right-radius: 4px; - background: none repeat scroll 0 0 #5E634E; - border-bottom: 6px solid #DACF77; - font-size: 14px; -} - -.navigation-tabs ul { - list-style-type: none; - margin: 0; - padding: 0; - display: block; -} - -.navigation-tabs ul li.first { - border-top-left-radius: 4px; -} - -.navigation-tabs li.first a, .navigation-tabs ul li.first, .table th.first, .table th.first { - border-top-left-radius: 4px; -} - - -.navigation-tabs ul li { - float: left; -} - -.navigation-tabs ul li a:link, .navigation-tabs ul li a:visited, .navigation-tabs ul li a:hover, .navigation-tabs ul li a:active { - color: #FFFFFF; - text-decoration: none; - background: none repeat scroll 0 0 #5E634E; -} - -.navigation-tabs ul li.active a:link, .navigation-tabs ul li.active a:visited, .navigation-tabs ul li.active a:hover, .navigation-tabs ul li.active a:active{ - background-color: #DACF77; -} - -.navigation-tabs ul li a { - padding: 8px 12px; - display: block; - padding: 10px 15px; -} - -.secondary { - padding-top: 15px; -} - -div.actiongroup { - display: block; - margin: 5px 0; - padding: 2px 0; -} - -button.button[type] { - line-height: 17px; - padding: 2px 5px 2px 3px; -} - -button.button { - overflow: visible; - padding: 2px 5px 1px 3px; - width: auto; -} - -a.button:link, a.button:visited, a.button:hover, a.button:active, button.button { - background-color: #EEEEEE; - border: 1px solid #BFBFBF; - color: #222222; - cursor: pointer; - display: block; - float: left; - font-size: 1em; - font-weight: bold; - line-height: 1.3em; - margin: 0 7px 0 0; - padding: 2px 5px 3px 3px; - text-decoration: none; -} - -button.button img, a.button img { - border: medium none; - height: 18px; - margin: 0 6px -4px 0 !important; - padding: 0; - width: 18px; -} - -.box { - margin: 20px auto; - width: 500px; -} - -#footer { - color: grey; - text-align: center; -} - -#footer { - padding-bottom: 20px; -} - -.box .box2 h2 { - background: none repeat scroll 0 0 #869453; - color: #FFFFFF; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - margin: 0; - padding: 10px 15px; -} - -.box .box2 .content { - padding: 10px 20px 30px 20px; - background-color: white; -} - -.box .box2 .group { - padding: 15px; -} - -.box .left { - float: left; - width: 20%; -} - -.box .right { - float: right; - width: 70%; -} - -.box label.label { - display: block; - font-weight: bold; - padding-bottom: 2px; -} - -.box label.right { - text-align: right; -} - -.box label.label, .box input.text_field, .box textarea.text_area { - font-size: 1.2em; - margin: 0; - padding: 1px 0; -} - -.flash .message { - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - text-align:center; - margin: 0 auto 15px; - -} - -.flash .message p { - margin:8px; -} -.flash .error { - border: 1px solid #fbb; - background-color: #fdd; -} -.flash .warning { - border: 1px solid #fffaaa; - background-color: #ffffcc; -} -.flash .notice { - border: 1px solid #1FDF00; - background-color: #BBFFB6; -} - -.box div.logo { - margin: 10px; - text-align: left; -} - -.ops { - padding: 5px; - margin-bottom: 5px; -} - -div.actions-bar div.header_info { - color: #5E634E; - float: left; - font-size: 14px; - font-weight: normal; - margin: 0 10px; -} - -div.block div.actions-bar { - margin: 5px; -} - -.actions-bar { - padding: 5px 1px; -} - - -.clearfix:after { - content: "."; - display: block; - height: 0; - clear: both; - visibility: hidden; - } - -.actions-bar .pagination { - float: right; - padding: 1px 0; -} - -.pagination span.disabled { - color: #bbb; - border-color: #bbb; -} - -.pagination em { - background: #869453; - color: #FFF; - border-color: #869453; -} - -.pagination a, .pagination span { - color: #869453; - border-color: #869453; -} - -.pagination a:hover { - color: #FFF; - background: #869453; -} - -.pagination a, .pagination span, .pagination em { - padding: 2px 5px; - margin-right: 5px; - display: block; - float: left; - border-style: solid; - border-width: 1px; -} - -.pagination em { - font-weight: bold; -} - -.pagination a { - text-decoration: none; -} - -input, select, textarea { - background-color: #EFF3E4; - border: 1px solid #5E634E; - margin: 3px 0; -} - -.table { - border-collapse: collapse; - margin: 5px; - width: 99%; -} - -.table th.first { - width: 30px; -} - -.table th { - background: none repeat scroll 0 0 #5E634E; - color: #FFFFFF; -} - -.table th { - font-weight: bold; - padding: 5px; - text-align: left; -} - -th a.header { - color: white; -} - -.table th.last { - border-top-right-radius: 4px; -} - -.table th.last { - width: 30px; -} - -.table tr.even { - background: none repeat scroll 0 0 #EFF3E4; -} - -.table tr.unseen { - font-weight: bold; -} - -.table td { - border-bottom: 1px solid #F0F0EE; -} - -.table td { - color: #5E634E; - padding: 2px 10px; -} - -div.msg_header { - font-size: 14px; - padding: 5px; -} - -div.msg_header div.group { - margin: 5px 0; -} - -div.msg_header label { - display: inline; - float: left; - font-weight: bold; - margin-right: 10px; - text-align: right; - width: 100px; -} - -div.render_text { - font-size: 14px; - margin: 5px; -} - -div.render_text pre { - background-color: #EFF3E4; - border: 1px solid #5E634E; - font-size: 12px; - margin: 5px 0; - padding: 5px; - white-space: pre-wrap; - word-wrap: break-word; -} - -div.attachments { - margin: 10px 0 5px; -} - -div.attachments span.title { - padding: 0 0 10px 5px; - font-size: 14px; - font-weight: bold; -} - -iframe { - height: 800px; - margin-top: 10px; - width: 937px; -} - -.block .content h2 { - font-size: 22px; - font-style: normal; - font-weight: bold; - letter-spacing: -1px; - line-height: 1.2em; - margin-left: 15px; - padding: 5px; -} - -.block .content .inner { - padding: 0 5px 5px 5px; -} - -div.param_group { - font-size: 14px; - margin: 5px 0; - padding: 3px 0; -} - -div.param_group label.label { - font-weight: bold; - margin-right: 5px; -} - -div.params input, div.params select, div.params textarea { - width: 100%; -} -style.css (wiersz 529) -div.params input, div.params textarea, div.params select { - border: 1px solid #CFCFCF; -} - -div.params div.group .description, div.params div.param_group .description { - color: #8C8C8C; - font-size: 10px; - font-style: italic; -} - -div.params div.group { - margin-bottom: 10px; -} - -div.params div.group div.fieldWithErrors label.label, div.params div.group label.label { - font-size: 14px; - font-weight: bold; -} - -div.fileselect { - margin-top: 5px; - padding: 5px 0; -} - -.columns .right { - float: right; -} - -.columns .left { - float: left; -} - -.columns .column { - width: 48%; -} - -.clearfix:after { - content: "."; - display: block; - height: 0; - clear: both; - visibility: hidden; -} - -.content ul { - margin-left: 20px; -} - -.md { - margin-bottom:10px; -} - - - - diff --git a/themes/olive/views/contacts/_contact.html.erb b/themes/olive/views/contacts/_contact.html.erb deleted file mode 100755 index 1a85802..0000000 --- a/themes/olive/views/contacts/_contact.html.erb +++ /dev/null @@ -1,7 +0,0 @@ -<%= check_box_tag "cids[]", contact.id %> -<%= link_to contact.nick,edit_contact_path(contact) %> -<%= contact.first_name %> -<%= contact.last_name %> -<%= link_to contact.email, compose_contact_path(contact.id) %> -<%= contact.info %> - diff --git a/themes/olive/views/contacts/_external.html.erb b/themes/olive/views/contacts/_external.html.erb deleted file mode 100755 index f945a6a..0000000 --- a/themes/olive/views/contacts/_external.html.erb +++ /dev/null @@ -1,11 +0,0 @@ -
    -<%= form_tag(contacts_external_path, :multipart => true) %> -:  -<%= file_field 'upload', 'datafile' %> -<% if @contacts.size.zero? %> -<%= raw single_action('import','contact','right.png') %> -<% else %> -<%= raw group_action(@ei_buttons) %> -<% end %> - -
    diff --git a/themes/olive/views/contacts/_left.html.erb b/themes/olive/views/contacts/_left.html.erb deleted file mode 100755 index bfe4c88..0000000 --- a/themes/olive/views/contacts/_left.html.erb +++ /dev/null @@ -1,9 +0,0 @@ - -
    -<%= raw form_field(@contact,"nick",nil,"joe"+', '+t(:must_be_unique,:scope=>:common),@contact.nick) %> -<%= raw form_field(@contact,"first_name",nil,"Joe",@contact.first_name) %> -<%= raw form_field(@contact,"last_name",nil,"Doe",@contact.last_name) %> -<%= raw form_field(@contact,"email",nil,"joe.doe@domain.com",@contact.email) %> -<%= raw form_field(@contact,"info",nil,t(:some_add_info,:scope=>:common),@contact.info) %> -
    -<%= raw single_action('save','common','save.png') %> diff --git a/themes/olive/views/contacts/_list.html.erb b/themes/olive/views/contacts/_list.html.erb deleted file mode 100755 index 6444064..0000000 --- a/themes/olive/views/contacts/_list.html.erb +++ /dev/null @@ -1,25 +0,0 @@ -
    -
    - <%= t(:total_entries,:scope=>:contact) %>: <%= @contacts.total_entries %> -<%= will_paginate @contacts %> -
    - - - - -<%= raw contacts_table_header %> - - -<% trclass = :even %> -<% @contacts.each do |c| %> - -<%= render :partial => 'contacts/contact', :object => c %> - -<% trclass == :even ? trclass = :odd : trclass = :even %> -<% end %> - -
    -
    -<%= will_paginate @contacts %> -
    -
    diff --git a/themes/olive/views/contacts/_ops.html.erb b/themes/olive/views/contacts/_ops.html.erb deleted file mode 100755 index eba864f..0000000 --- a/themes/olive/views/contacts/_ops.html.erb +++ /dev/null @@ -1,3 +0,0 @@ -
    -<%= raw group_action(@buttons) %> -
    diff --git a/themes/olive/views/contacts/_right.html.erb b/themes/olive/views/contacts/_right.html.erb deleted file mode 100755 index 8b13789..0000000 --- a/themes/olive/views/contacts/_right.html.erb +++ /dev/null @@ -1 +0,0 @@ - diff --git a/themes/olive/views/contacts/edit.html.erb b/themes/olive/views/contacts/edit.html.erb deleted file mode 100755 index 4bd6d0d..0000000 --- a/themes/olive/views/contacts/edit.html.erb +++ /dev/null @@ -1,30 +0,0 @@ -<% content_for :sidebar do %> -<%= content_for_sidebar %> -<% end %> - -<% content_for :title do %> -- <%= t(:contacts,:scope=>:contact) %> -<% end %> - -
    -
    - <%= raw main_navigation(:contacts) %> -
    -
    -
    -
    -
    <%= t(:modifying,:scope=>:contact) %>
    -
    - <%= form_for(@contact) do |f| %> -
    -
    - <%= render :partial => 'left' %> -
    -
    - <%= render :partial => 'right' %> -
    -
    - <% end %> -
    -
    -
    diff --git a/themes/olive/views/contacts/index.html.erb b/themes/olive/views/contacts/index.html.erb deleted file mode 100755 index a6c5f2a..0000000 --- a/themes/olive/views/contacts/index.html.erb +++ /dev/null @@ -1,27 +0,0 @@ -<% content_for :sidebar do %> -<%= content_for_sidebar %> -<% end %> - -<% content_for :title do %> -- <%= t(:contacts,:scope=>:contact) %> -<% end %> - -
    - -
    -<%= form_tag(contacts_ops_path,{:name=>'contacts'})%> -<% if @contacts.size.zero? %> -

    <%= t(:no_entries,:scope=>:contact) %>

    -<%= raw single_action('create_new','contact','plus.png') %> - -<% else %> -<%= render :partial => 'ops' %> -<%= render :partial => 'list' %> - -<% end %> -<%= render :partial => 'external' %> -
    -
    - diff --git a/themes/olive/views/contacts/new.html.erb b/themes/olive/views/contacts/new.html.erb deleted file mode 100755 index 2c02fa6..0000000 --- a/themes/olive/views/contacts/new.html.erb +++ /dev/null @@ -1,30 +0,0 @@ -<% content_for :sidebar do %> -<%= content_for_sidebar %> -<% end %> - -<% content_for :title do %> -- <%= t(:contacts,:scope=>:contact) %> -<% end %> - -
    -
    - <%= raw main_navigation(:contacts) %> -
    -
    -
    -
    -
    <%= t(:creating_new,:scope=>:contact) %>
    -
    - <%= form_for(@contact) do |f| %> -
    -
    - <%= render :partial => 'left' %> -
    -
    - <%= render :partial => 'right' %> -
    -
    - <% end %> -
    -
    -
    diff --git a/themes/olive/views/folders/_create.html.erb b/themes/olive/views/folders/_create.html.erb deleted file mode 100755 index dc9009c..0000000 --- a/themes/olive/views/folders/_create.html.erb +++ /dev/null @@ -1,7 +0,0 @@ -<%= form_tag(folders_create_path) %> -
    -<%= raw select_for_folders("folder","parent",@folders,t(:parent,:scope=>:folder),"",true) %> -<%= raw simple_input_field("folder","target",t(:to_create,:scope=>:folder),"") %> -
    -<%= raw single_action('create','common','plus.png') %> - diff --git a/themes/olive/views/folders/_delete.html.erb b/themes/olive/views/folders/_delete.html.erb deleted file mode 100755 index 85b5c32..0000000 --- a/themes/olive/views/folders/_delete.html.erb +++ /dev/null @@ -1,6 +0,0 @@ -<%= form_tag(folders_delete_path) %> -
    -<%= raw select_for_folders("folder","delete",@folders,t(:to_delete,:scope=>:folder),"",true) %> -<%= raw single_action('delete','common','minus.png') %> -
    - diff --git a/themes/olive/views/folders/_list.html.erb b/themes/olive/views/folders/_list.html.erb deleted file mode 100755 index 5c723c6..0000000 --- a/themes/olive/views/folders/_list.html.erb +++ /dev/null @@ -1,19 +0,0 @@ -
    -

    <%=t(:folders,:scope=>:folder) %>

    -
    - <% if @folders_shown.nil? or @folders_shown.size.zero? %> -

    <%= t(:no_shown,:scope=>:folder) %> <%= link_to t(:folders,:scope=>:folder), folders_path %>

    - <% else %> - - <% end %> - <%= raw single_action_onclick('logout','user','power.png',user_logout_path) %> -
    -
    diff --git a/themes/olive/views/folders/_refresh.html.erb b/themes/olive/views/folders/_refresh.html.erb deleted file mode 100755 index e3952a7..0000000 --- a/themes/olive/views/folders/_refresh.html.erb +++ /dev/null @@ -1,7 +0,0 @@ -<%= form_tag(folders_refresh_path) %> -
    -<%= raw multi_select("", 'folders_to_show[]', @folders, @folders_shown,t(:shown,:scope=>:folder),:id,"",{:text => [:parent,:delim,:name]}) %> -
    -<%= raw group_action(@buttons) %> - - diff --git a/themes/olive/views/folders/_system.html.erb b/themes/olive/views/folders/_system.html.erb deleted file mode 100755 index e8e9e18..0000000 --- a/themes/olive/views/folders/_system.html.erb +++ /dev/null @@ -1,9 +0,0 @@ -<%= form_tag(folders_system_path) %> -
    -<%= raw select_for_folders("folder","mailbox_inbox",@folders,t(:folder,:scope => :folder) + " " + t(:inbox_name,:scope=>:folder),@folder_inbox,true) %> -<%= raw select_for_folders("folder","mailbox_trash",@folders,t(:folder,:scope => :folder) + " " + t(:trash_name,:scope=>:folder),@folder_trash,true) %> -<%= raw select_for_folders("folder","mailbox_sent",@folders,t(:folder,:scope => :folder) + " " + t(:sent_name,:scope=>:folder),@folder_sent,true) %> -<%= raw select_for_folders("folder","mailbox_drafts",@folders,t(:folder,:scope => :folder) + " " + t(:drafts_name,:scope=>:folder),@folder_drafts,true) %> -<%= raw single_action('set','common','save.png') %> -
    - diff --git a/themes/olive/views/folders/index.html.erb b/themes/olive/views/folders/index.html.erb deleted file mode 100755 index 807a07b..0000000 --- a/themes/olive/views/folders/index.html.erb +++ /dev/null @@ -1,27 +0,0 @@ -<% content_for :sidebar do %> -<%= content_for_sidebar %> -<% end %> - -<% content_for :title do %> -- <%= t(:folders,:scope=>:folder) %> -<% end %> - -
    - -
    -
    -
    -
    - <%= render :partial => 'create' %> - <%= render :partial => 'delete' %> - <%= render :partial => 'system' %> -
    -
    - <%= render :partial => 'refresh' %> -
    -
    -
    -
    - diff --git a/themes/olive/views/internal/_version.html.erb b/themes/olive/views/internal/_version.html.erb deleted file mode 100755 index 881c09d..0000000 --- a/themes/olive/views/internal/_version.html.erb +++ /dev/null @@ -1,4 +0,0 @@ -

    -<%= link_to (t(:version,:scope=>:common) + " " + $defaults["version"]),about_path %> -

    - diff --git a/themes/olive/views/internal/about.html.erb b/themes/olive/views/internal/about.html.erb deleted file mode 100755 index 4698b30..0000000 --- a/themes/olive/views/internal/about.html.erb +++ /dev/null @@ -1,33 +0,0 @@ -<% content_for :title do %> -- <%= t(:about,:scope=>:internal) %> -<% end %> - -<% content_for :sidebar do %> -<%= content_for_sidebar %> -<% end %> - -
    - -
    - -

    -<%= t(:current_version,:scope=>:internal) + ": " + $defaults["version"] %> -

    - -
    -<%= raw BlueCloth::new(render :file => 'README.markdown').to_html %> -
    - -
    -<%= raw BlueCloth::new(render :file => 'CHANGES').to_html %> -
    - -
    -<%= raw BlueCloth::new(render :file => 'TODO').to_html %> -
    - - -
    - diff --git a/themes/olive/views/internal/error.html.erb b/themes/olive/views/internal/error.html.erb deleted file mode 100755 index 604b808..0000000 --- a/themes/olive/views/internal/error.html.erb +++ /dev/null @@ -1,14 +0,0 @@ -<% content_for :title do %> - <%= @title %> -<% end %> - -
    -
    - -
    diff --git a/themes/olive/views/layouts/_flash.html.erb b/themes/olive/views/layouts/_flash.html.erb deleted file mode 100755 index 24c1562..0000000 --- a/themes/olive/views/layouts/_flash.html.erb +++ /dev/null @@ -1,16 +0,0 @@ -<% if not flash.size.zero? %> -
    -<% flash.each do |key, msg| %> -<% unless msg.blank? %> -<% if msg.class.eql?(Hash) %> -<% f = content_tag :p, msg[:title] %> -<% f += content_tag :p, msg[:info], :class=> "info" %> -<% else %> -<% f = content_tag :p, msg %> -<% end %> -<%= content_tag(:div,f, :class => "message #{key.to_s}" )%> -<%= flash[key.to_sym]='' %> -<% end %> -<% end %> -
    -<% end %> diff --git a/themes/olive/views/layouts/application.html.erb b/themes/olive/views/layouts/application.html.erb deleted file mode 100755 index adcc493..0000000 --- a/themes/olive/views/layouts/application.html.erb +++ /dev/null @@ -1,36 +0,0 @@ - - - - - <%= t(:mailr,:scope=>:common) %> - <%= yield :title %> - - - - <%=stylesheet_link_tag current_theme_stylesheet_path('olive') %> - <%=stylesheet_link_tag current_theme_stylesheet_path('calendar_olive') %> - <%=stylesheet_link_tag current_theme_stylesheet_path('jquery-ui-dialog') %> - <%=stylesheet_link_tag current_theme_stylesheet_path('jquery-ui-custom') %> - - <%=javascript_include_tag current_theme_javascript_path('jquery') %> - <%=javascript_include_tag current_theme_javascript_path('jquery-ui') %> - <%=javascript_include_tag current_theme_javascript_path('rails') %> - <%=javascript_include_tag current_theme_javascript_path('application') %> - - - - -
    - -
    - <%= render :partial=>'layouts/flash', :object => flash %> - <%= calendar_window(:title=>t(:calendar,:scope=>:common)) %> - <%= yield %> -
    -
    - - diff --git a/themes/olive/views/layouts/html_body.erb b/themes/olive/views/layouts/html_body.erb deleted file mode 100755 index 37f0bdd..0000000 --- a/themes/olive/views/layouts/html_body.erb +++ /dev/null @@ -1 +0,0 @@ -<%= yield %> diff --git a/themes/olive/views/layouts/simple.html.erb b/themes/olive/views/layouts/simple.html.erb deleted file mode 100755 index 6486195..0000000 --- a/themes/olive/views/layouts/simple.html.erb +++ /dev/null @@ -1,15 +0,0 @@ - - - - <%=t(:mailr,:scope=>:common) %> - - <%= yield :title %> - - <%=stylesheet_link_tag current_theme_stylesheet_path('olive') %> - - - <%= yield %> - - - diff --git a/themes/olive/views/links/_left.html.erb b/themes/olive/views/links/_left.html.erb deleted file mode 100755 index 0984760..0000000 --- a/themes/olive/views/links/_left.html.erb +++ /dev/null @@ -1,7 +0,0 @@ - -
    -<%= raw form_field(@link,"name",nil,"Fajny sznurek",@link.name) %> -<%= raw form_field(@link,"url",nil,"http://aaa.com",@link.url) %> -<%= raw form_field(@link,"info",nil,t(:some_add_info,:scope=>:link),@link.info) %> -
    -<%= raw single_action('save','common','save.png') %> diff --git a/themes/olive/views/links/_link.html.erb b/themes/olive/views/links/_link.html.erb deleted file mode 100755 index 3fc981a..0000000 --- a/themes/olive/views/links/_link.html.erb +++ /dev/null @@ -1,5 +0,0 @@ -<%= check_box_tag "ids[]", link.id %> -<%= link_to link.name,edit_link_path(link) %> -<%= link_to link.url,"http://"+link.url %> -<%= link.info %> - diff --git a/themes/olive/views/links/_list.html.erb b/themes/olive/views/links/_list.html.erb deleted file mode 100755 index 6c2cd1c..0000000 --- a/themes/olive/views/links/_list.html.erb +++ /dev/null @@ -1,25 +0,0 @@ -
    -
    - <%= t(:total_entries,:scope=>:link) %>: <%= @links.total_entries %> -<%= will_paginate @links %> -
    - - - - -<%= raw links_table_header %> - - -<% trclass = :even %> -<% @links.each do |c| %> - -<%= render :partial => 'link', :object => c %> - -<% trclass == :even ? trclass = :odd : trclass = :even %> -<% end %> - -
    -
    -<%= will_paginate @links %> -
    -
    diff --git a/themes/olive/views/links/_ops.html.erb b/themes/olive/views/links/_ops.html.erb deleted file mode 100755 index eba864f..0000000 --- a/themes/olive/views/links/_ops.html.erb +++ /dev/null @@ -1,3 +0,0 @@ -
    -<%= raw group_action(@buttons) %> -
    diff --git a/themes/olive/views/links/_right.html.erb b/themes/olive/views/links/_right.html.erb deleted file mode 100755 index 8b13789..0000000 --- a/themes/olive/views/links/_right.html.erb +++ /dev/null @@ -1 +0,0 @@ - diff --git a/themes/olive/views/links/edit.html.erb b/themes/olive/views/links/edit.html.erb deleted file mode 100755 index cbfc587..0000000 --- a/themes/olive/views/links/edit.html.erb +++ /dev/null @@ -1,30 +0,0 @@ -<% content_for :sidebar do %> -<%= content_for_sidebar %> -<% end %> - -<% content_for :title do %> -- <%= t(:links,:scope=>:link) %> -<% end %> - -
    -
    - <%= raw main_navigation(:links) %> -
    -
    -
    -
    -
    <%= t(:modifying,:scope=>:link) %>
    -
    - <%= form_for(@link) do |f| %> -
    -
    - <%= render :partial => 'left' %> -
    -
    - <%= render :partial => 'right' %> -
    -
    - <% end %> -
    -
    -
    diff --git a/themes/olive/views/links/index.html.erb b/themes/olive/views/links/index.html.erb deleted file mode 100755 index 3b4cb7a..0000000 --- a/themes/olive/views/links/index.html.erb +++ /dev/null @@ -1,26 +0,0 @@ -<% content_for :sidebar do %> -<%= content_for_sidebar %> -<% end %> - -<% content_for :title do %> -- <%= t(:links,:scope=>:link) %> -<% end %> - -
    - -
    -<%= form_tag(links_ops_path,{:name=>'links'})%> -<% if @links.size.zero? %> -

    <%= t(:no_entries,:scope=>:link) %>

    -<%= raw single_action('create_new','link','plus.png') %> - -<% else %> -<%= render :partial => 'ops' %> -<%= render :partial => 'list' %> - -<% end %> -
    -
    - diff --git a/themes/olive/views/links/new.html.erb b/themes/olive/views/links/new.html.erb deleted file mode 100755 index 974529c..0000000 --- a/themes/olive/views/links/new.html.erb +++ /dev/null @@ -1,30 +0,0 @@ -<% content_for :sidebar do %> -<%= content_for_sidebar %> -<% end %> - -<% content_for :title do %> -- <%= t(:links,:scope=>:link) %> -<% end %> - -
    -
    - <%= raw main_navigation(:links) %> -
    -
    -
    -
    -
    <%= t(:creating_new,:scope=>:link) %>
    -
    - <%= form_for(@link) do |f| %> -
    -
    - <%= render :partial => 'links/left' %> -
    -
    - <%= render :partial => 'links/right' %> -
    -
    - <% end %> -
    -
    -
    diff --git a/themes/olive/views/messages/_attachment.html.erb b/themes/olive/views/messages/_attachment.html.erb deleted file mode 100755 index 0ff539b..0000000 --- a/themes/olive/views/messages/_attachment.html.erb +++ /dev/null @@ -1,19 +0,0 @@ - -<%= link_to attachment.filename_charseted, attachment_download_path(attachment.parent_id,attachment.idx) %> - - -<%= attachment.main_type %>/<%= attachment.sub_type %> - - -<%= attachment.charset %> - - -<%= attachment.content_transfer_encoding %> - - -<%= size_formatter(attachment.getSize) %> - - -<%= link_to image_tag(current_theme_image_path('download.png')), attachment_download_path(attachment.parent_id,attachment.idx) %> - - diff --git a/themes/olive/views/messages/_attachments.html.erb b/themes/olive/views/messages/_attachments.html.erb deleted file mode 100755 index 5d051a7..0000000 --- a/themes/olive/views/messages/_attachments.html.erb +++ /dev/null @@ -1,13 +0,0 @@ -
    -<%= t(:attachments,:scope=>:message) %> - - -<% trclass = :even %> -<% for idx in 0..@attachments.size-1 %> - - <%= render :partial => 'attachment', :object => @attachments[idx] %> - -<% trclass == :even ? trclass = :odd : trclass = :even %> -<% end %> -
    -
    diff --git a/themes/olive/views/messages/_file_attach.html.erb b/themes/olive/views/messages/_file_attach.html.erb deleted file mode 100755 index a809654..0000000 --- a/themes/olive/views/messages/_file_attach.html.erb +++ /dev/null @@ -1,4 +0,0 @@ -<%= check_box_tag "files[]", file_attach[:name] %> -<%= file_attach[:name] %> -<%= size_formatter(file_attach[:size]) %> -  diff --git a/themes/olive/views/messages/_file_attachs.html.erb b/themes/olive/views/messages/_file_attachs.html.erb deleted file mode 100755 index 683b1f8..0000000 --- a/themes/olive/views/messages/_file_attachs.html.erb +++ /dev/null @@ -1,16 +0,0 @@ -
    -<%= t(:attachments,:scope=>:message) %> -<% if not @attachments.size.zero? %> -<% trclass = :even %> - -<% @attachments.each do |a| %> - -<%= render :partial => 'messages/file_attach', :object => a %> - -<% trclass == :even ? trclass = :odd : trclass = :even %> -<% end %> -
    -<%= raw single_action('delete_marked','compose','minus.png') %> -<% end %> -
    - diff --git a/themes/olive/views/messages/_file_select.html.erb b/themes/olive/views/messages/_file_select.html.erb deleted file mode 100755 index 3279115..0000000 --- a/themes/olive/views/messages/_file_select.html.erb +++ /dev/null @@ -1,9 +0,0 @@ -
    -:  -<%= file_field 'file', 'data' %> -<%= raw single_action('upload','compose','up.png') %> -
    - - - - diff --git a/themes/olive/views/messages/_header.html.erb b/themes/olive/views/messages/_header.html.erb deleted file mode 100755 index 1017ea1..0000000 --- a/themes/olive/views/messages/_header.html.erb +++ /dev/null @@ -1,14 +0,0 @@ -
    - <%= raw show_param_view(@message,"from_addr",address_formatter(@from,:show)) %> - <%= raw show_param_view(@message,"to_addr",address_formatter(@to,:show)) %> - <% if not @cc.nil? %> - <%= raw show_param_view(@message,"cc_addr","CC jest") %> - <% end %> - <% if not @bcc.nil? %> - <%= raw show_param_view(@message,"bcc_addr","BCC jest ") %> - <% end %> - <%= raw show_param_view(@message,"subject",subject_formatter(@message,:show)) %> - <%= raw show_param_view(@message,"date",date_formatter(@date)) %> - <%= hidden_field_tag 'uids[]', @message.uid %> - <%= hidden_field_tag 'source', 'show' %> -
    diff --git a/themes/olive/views/messages/_html_part.html.erb b/themes/olive/views/messages/_html_part.html.erb deleted file mode 100755 index 7beb3d0..0000000 --- a/themes/olive/views/messages/_html_part.html.erb +++ /dev/null @@ -1,3 +0,0 @@ - - diff --git a/themes/olive/views/messages/_image.html.erb b/themes/olive/views/messages/_image.html.erb deleted file mode 100755 index f9cc663..0000000 --- a/themes/olive/views/messages/_image.html.erb +++ /dev/null @@ -1,8 +0,0 @@ -
    -<%= image_tag(attachment_download_path(image.parent_id,image.idx), :size => @current_user.prefs.msg_image_thumbnail_size, :alt=>image.filename, :title=>image.filename) %> -
    -<%= link_to (image.filename,attachment_download_path(image.parent_id,image.idx)) %> -<%= size_formatter(image.getSize) %> -
    -
    - diff --git a/themes/olive/views/messages/_images.html.erb b/themes/olive/views/messages/_images.html.erb deleted file mode 100755 index afeea6d..0000000 --- a/themes/olive/views/messages/_images.html.erb +++ /dev/null @@ -1,8 +0,0 @@ -
    - -<% for idx in 0..@images.size-1 %> -<%= render :partial => 'image', :object => @images[idx] %> -<% end %> - -
    -
    diff --git a/themes/olive/views/messages/_message.html.erb b/themes/olive/views/messages/_message.html.erb deleted file mode 100755 index 6e81fa9..0000000 --- a/themes/olive/views/messages/_message.html.erb +++ /dev/null @@ -1,17 +0,0 @@ -<%= check_box_tag "uids[]", message.uid %> -<%= attachment_formatter(message) %> - -<% if @current_folder == @sent_folder || @current_folder == @drafts_folder %> - <%= address_formatter(message.to_addr,:index) %> -<% else %> - <%= address_formatter(message.from_addr,:index) %> -<% end %> - -<%= subject_formatter(message,:index) %> -<%= date_formatter(message.date) %> -<%= size_formatter(message.size) %> -<% if @current_folder == @drafts_folder %> -<%= link_to(t(:edit,:scope=>:message),edit_path(message.uid)) %> -<% else %> -<%= raw(' ') %> -<% end %> diff --git a/themes/olive/views/messages/_messages.html.erb b/themes/olive/views/messages/_messages.html.erb deleted file mode 100755 index d5cbe93..0000000 --- a/themes/olive/views/messages/_messages.html.erb +++ /dev/null @@ -1,33 +0,0 @@ -
    - -
    -
    <%= t(:current,:scope=>:folder) %>: <%= pretty_folder_name(@current_folder) %> - (<%= t(:total,:scope=>:message) %>: <%= @messages.total_entries %>) -
    - <%= will_paginate @messages %> -
    - - - - - - - <%= raw headers_links %> - - - <% trclass = :even %> - <% @messages.each do |m| %> - <% m.unseen == true ? unseen = "unseen" : unseen = "" %> - - <%= render :partial => 'messages/message', :object => m %> - - <% trclass == :even ? trclass = :odd : trclass = :even %> - <% end %> - -
    <%= raw(' ') %>
    - -
    - <%= will_paginate @messages %> -
    - -
    diff --git a/themes/olive/views/messages/_multi_ops.html.erb b/themes/olive/views/messages/_multi_ops.html.erb deleted file mode 100755 index fdc7804..0000000 --- a/themes/olive/views/messages/_multi_ops.html.erb +++ /dev/null @@ -1,5 +0,0 @@ -
    - <%= raw group_action_text(@multi1_buttons,t(:checked,:scope=>:message) + " " + t(:to_folder,:scope=>:folder)+ " " + simple_select_for_folders("folder","target",@folders_shown,'',true)) %> - <%= raw group_action(@multi2_buttons) %> -
    - diff --git a/themes/olive/views/messages/_new.html.erb b/themes/olive/views/messages/_new.html.erb deleted file mode 100755 index 8ec1896..0000000 --- a/themes/olive/views/messages/_new.html.erb +++ /dev/null @@ -1,27 +0,0 @@ -
    -<%= raw form_field( @message, - "to_addr", - nil, - "joe@domain.com"+', '+ t(:not_contain_at,:scope=>:compose), - address_formatter(@message.to_addr,@operation) - ) %> -<%= raw form_field( @message, - "subject", - nil, - t(:subject_of_the_message,:scope=>:compose), - subject_formatter(@message.subject,@operation) - ) %> -<%= raw area_field( @message, - "body", - nil, - t(:write_your_message_here,:scope=>:compose), - body_formatter(@message.body,@operation), - 80, - 20 - ) %> -
    -<% if !@olduid.nil? %> -<%= hidden_field_tag 'olduid', @olduid %> -<% end %> -<%= raw group_action(@buttons) %> - diff --git a/themes/olive/views/messages/_search.html.erb b/themes/olive/views/messages/_search.html.erb deleted file mode 100755 index cee5c10..0000000 --- a/themes/olive/views/messages/_search.html.erb +++ /dev/null @@ -1,10 +0,0 @@ - diff --git a/themes/olive/views/messages/_single_ops.html.erb b/themes/olive/views/messages/_single_ops.html.erb deleted file mode 100755 index d38a73a..0000000 --- a/themes/olive/views/messages/_single_ops.html.erb +++ /dev/null @@ -1,10 +0,0 @@ -
    -<%= raw group_action_text(@multi1_buttons,t(:to_folder,:scope=>:folder)+ " " + simple_select_for_folders("folder","target",@folders_shown,'',true)) %> -<%= raw group_action(@multi3_buttons) %> - -
    -
    -        <%= @plain_header %>
    -    
    -
    -
    diff --git a/themes/olive/views/messages/compose.html.erb b/themes/olive/views/messages/compose.html.erb deleted file mode 100755 index 510cbbe..0000000 --- a/themes/olive/views/messages/compose.html.erb +++ /dev/null @@ -1,23 +0,0 @@ -<% content_for :sidebar do %> -<%= content_for_sidebar %> -<% end %> - -<% content_for :title do %> -- <%= t(:compose,:scope=>:compose) %> -<% end %> - -
    - -
    -

    <%= t(:new_message,:scope=>:compose) %>

    -
    - <%= form_tag(composed_path, :multipart => true) %> - <%= render :partial => 'messages/new' %> - <%= render :partial=> 'messages/file_attachs' %> - <%= render :partial => 'messages/file_select' %> - -
    -
    - diff --git a/themes/olive/views/messages/html_body.html.erb b/themes/olive/views/messages/html_body.html.erb deleted file mode 100755 index b1f0d7c..0000000 --- a/themes/olive/views/messages/html_body.html.erb +++ /dev/null @@ -1,2 +0,0 @@ -<%= raw @body -%> - diff --git a/themes/olive/views/messages/index.html.erb b/themes/olive/views/messages/index.html.erb deleted file mode 100755 index d93e092..0000000 --- a/themes/olive/views/messages/index.html.erb +++ /dev/null @@ -1,33 +0,0 @@ -<% content_for :sidebar do %> -<%= content_for_sidebar %> -<% end %> - -<% content_for :title do %> -- <%= t(:messages,:scope=>:message) %> -<% end %> - -
    - -
    - <%= form_tag({:controller=>'messages_ops', :action=>'multi'},{:name=>'messages'})%> - - <% if @current_folder.nil? %> -

    <%= t(:no_selected,:scope=>:folder) %>

    - <% end %> - - <% if @messages.size.zero? %> -
    -
    <%= t(:no_in,:scope=>:message) %>
    -
    - <% else %> - <%= render :partial => 'multi_ops' %> - <%= render :partial => 'messages' %> - <% end %> - - -
    -
    - - diff --git a/themes/olive/views/messages/old_html_view.html.erb b/themes/olive/views/messages/old_html_view.html.erb deleted file mode 100755 index cfce449..0000000 --- a/themes/olive/views/messages/old_html_view.html.erb +++ /dev/null @@ -1,18 +0,0 @@ -<% content_for :preambule do %> -<% if @preambule.nil? %> - - -<% else %> -<%= @preambule -%> -<% end %> -<% end %> - -<% content_for :title do %> -<%= @title -%> -<% end %> - -<% content_for :body do %> -<%= raw @body -%> -<% end %> diff --git a/themes/olive/views/messages/show.html.erb b/themes/olive/views/messages/show.html.erb deleted file mode 100755 index 1718862..0000000 --- a/themes/olive/views/messages/show.html.erb +++ /dev/null @@ -1,43 +0,0 @@ -<% content_for :sidebar do %> -<%= content_for_sidebar %> -<% end %> - -<% content_for :title do %> -- <%= subject_formatter(@message,:show) %> -<% end %> - -
    - -
    - <%= form_tag(messages_ops_single_path)%> - <%= render :partial => 'header' %> - <%= render :partial => 'single_ops' %> - - <% if not @attachments.size.zero? %> - <%= render :partial => 'attachments' %> - <% end %> - - <% if not @images.size.zero? %> - <%= render :partial => 'images' %> - <% end %> - - <% if not @html_part.nil? %> - <%= render :partial => 'html_part' %> - <% else %> -
    - <% if @text_part.nil? %> -

    - <%= t(:no_content,:scope => :message) %> -

    - <% else %> - <%= raw content_text_plain_for_render(@text_part) %> - <% end %> -
    - <% end %> - -
    -
    - - diff --git a/themes/olive/views/prefs/_identity_left.html.erb b/themes/olive/views/prefs/_identity_left.html.erb deleted file mode 100755 index 1857e07..0000000 --- a/themes/olive/views/prefs/_identity_left.html.erb +++ /dev/null @@ -1,21 +0,0 @@ -
    -<%= raw form_field(@current_user, - "first_name", - nil, - "Joe", - @current_user.first_name - ) %> -<%= raw form_field(@current_user, - "last_name", - nil, - "Doe", - @current_user.last_name - ) %> -<%= raw form_field(@current_user, - "domain", - nil, - "domain.com", - @current_user.domain - ) %> -
    -<%= raw single_action('save','common','save.png') %> diff --git a/themes/olive/views/prefs/_identity_right.html.erb b/themes/olive/views/prefs/_identity_right.html.erb deleted file mode 100755 index 8b13789..0000000 --- a/themes/olive/views/prefs/_identity_right.html.erb +++ /dev/null @@ -1 +0,0 @@ - diff --git a/themes/olive/views/prefs/_look_left.html.erb b/themes/olive/views/prefs/_look_left.html.erb deleted file mode 100755 index dabe4c1..0000000 --- a/themes/olive/views/prefs/_look_left.html.erb +++ /dev/null @@ -1,7 +0,0 @@ -
    -<%= raw select_field_table(@prefs, "msgs_per_page", $defaults["msgs_per_page_table"],@prefs.msgs_per_page,false) %> -<%= raw select_field_table(@prefs, "theme", $defaults["themes"],@prefs.theme,false) %> -<%= raw select_field_table(@prefs, "locale", $defaults["locales"],@prefs.locale,false) %> -<%= raw select_field_table(@prefs, "msg_send_type", $defaults["msg_send_type"],@prefs.msg_send_type,false) %> -
    -<%= raw single_action('save','common','save.png') %> diff --git a/themes/olive/views/prefs/_look_right.html.erb b/themes/olive/views/prefs/_look_right.html.erb deleted file mode 100755 index e541699..0000000 --- a/themes/olive/views/prefs/_look_right.html.erb +++ /dev/null @@ -1,5 +0,0 @@ -
    -<%= raw select_field_table_t(@prefs, "msg_image_view_as", $defaults["msg_image_view_as"],@prefs.msg_image_view_as,false) %> -<%= raw select_field_table(@prefs, "msg_image_thumbnail_size", $defaults["msg_image_thumbnail_size"],@prefs.msg_image_thumbnail_size,false) %> -
    - diff --git a/themes/olive/views/prefs/_server.html.erb b/themes/olive/views/prefs/_server.html.erb deleted file mode 100755 index ca8b0f8..0000000 --- a/themes/olive/views/prefs/_server.html.erb +++ /dev/null @@ -1,9 +0,0 @@ -<%= check_box_tag "cids[]", server.id %> -<%= server.name %> -<%= server.port %> -<%= boolean_answer(server.use_ssl) %> -<%= boolean_answer(server.use_tls) %> -<%= boolean_answer(server.for_imap) %> -<%= boolean_answer(server.for_smtp) %> -<%= server.auth %> -  diff --git a/themes/olive/views/prefs/_servers_left.html.erb b/themes/olive/views/prefs/_servers_left.html.erb deleted file mode 100755 index fee7ab7..0000000 --- a/themes/olive/views/prefs/_servers_left.html.erb +++ /dev/null @@ -1,5 +0,0 @@ - -
    -<%= h @servers.inspect %> -
    -<%= raw single_action('save','common','save.png') %> diff --git a/themes/olive/views/prefs/_servers_list.html.erb b/themes/olive/views/prefs/_servers_list.html.erb deleted file mode 100755 index 10aec53..0000000 --- a/themes/olive/views/prefs/_servers_list.html.erb +++ /dev/null @@ -1,16 +0,0 @@ - - - - -<%= raw servers_table_header %> - - -<% trclass = :even %> -<% @servers.each do |s| %> - -<%= render :partial => 'prefs/server', :object => s %> - -<% trclass == :even ? trclass = :odd : trclass = :even %> -<% end %> - -
    diff --git a/themes/olive/views/prefs/_servers_right.html.erb b/themes/olive/views/prefs/_servers_right.html.erb deleted file mode 100755 index 8b13789..0000000 --- a/themes/olive/views/prefs/_servers_right.html.erb +++ /dev/null @@ -1 +0,0 @@ - diff --git a/themes/olive/views/prefs/identity.html.erb b/themes/olive/views/prefs/identity.html.erb deleted file mode 100755 index 9ccd679..0000000 --- a/themes/olive/views/prefs/identity.html.erb +++ /dev/null @@ -1,27 +0,0 @@ -<% content_for :sidebar do %> -<%= content_for_sidebar %> -<% end %> - -<% content_for :title do %> -- <%= t(:prefs,:scope=>:prefs) %> -<% end %> - -
    - -
    -
    <%= form_tag(prefs_update_identity_path,:name=>'prefs') %> -
    -
    - <%= render :partial => 'prefs/identity_left' %> -
    -
    - <%= render :partial => 'prefs/identity_right' %> -
    -
    -
    -
    -
    diff --git a/themes/olive/views/prefs/look.html.erb b/themes/olive/views/prefs/look.html.erb deleted file mode 100755 index 5d24aa6..0000000 --- a/themes/olive/views/prefs/look.html.erb +++ /dev/null @@ -1,27 +0,0 @@ -<% content_for :sidebar do %> -<%= content_for_sidebar %> -<% end %> - -<% content_for :title do %> -- <%= t(:prefs,:scope=>:prefs) %> -<% end %> - -
    - -
    -
    <%= form_tag(prefs_update_look_path,:name=>'prefs') %> -
    -
    - <%= render :partial => 'prefs/look_left' %> -
    -
    - <%= render :partial => 'prefs/look_right' %> -
    -
    -
    -
    -
    diff --git a/themes/olive/views/prefs/servers.html.erb b/themes/olive/views/prefs/servers.html.erb deleted file mode 100755 index 1735b4a..0000000 --- a/themes/olive/views/prefs/servers.html.erb +++ /dev/null @@ -1,22 +0,0 @@ -<% content_for :sidebar do %> -<%= content_for_sidebar %> -<% end %> - -<% content_for :title do %> -- <%= t(:prefs,:scope=>:prefs) %> -<% end %> - -
    - -
    -
    - <%= form_tag(prefs_update_servers_path,:name=>'prefs') %> - <%= render :partial => 'prefs/servers_list' %> - -
    -
    -
    diff --git a/themes/olive/views/sidebar/_calendar_view.html.erb b/themes/olive/views/sidebar/_calendar_view.html.erb deleted file mode 100755 index 3a5f5db..0000000 --- a/themes/olive/views/sidebar/_calendar_view.html.erb +++ /dev/null @@ -1,4 +0,0 @@ -<%= calendar_square(:month_delta=>-1) %> -<%= calendar_square() %> -<%= calendar_square(:month_delta=>1) %> - diff --git a/themes/olive/views/sidebar/_logo.html.erb b/themes/olive/views/sidebar/_logo.html.erb deleted file mode 100755 index 1116476..0000000 --- a/themes/olive/views/sidebar/_logo.html.erb +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/themes/olive/views/user/login.html.erb b/themes/olive/views/user/login.html.erb deleted file mode 100755 index 0671a2f..0000000 --- a/themes/olive/views/user/login.html.erb +++ /dev/null @@ -1,46 +0,0 @@ -<% content_for :title do %> - <%= t(:login,:scope=>:user) %> -<% end %> - -
    -
    - -

    <%= t(:login,:scope=>:user) %>

    - -
    -
    diff --git a/themes/olive/views/user/setup.html.erb b/themes/olive/views/user/setup.html.erb deleted file mode 100755 index d3a6c35..0000000 --- a/themes/olive/views/user/setup.html.erb +++ /dev/null @@ -1,20 +0,0 @@ -<% content_for :title do %> - <%= t(:setup,:scope=>:user) %> -<% end %> - -
    -
    - -

    <%= t(:setup,:scope=>:user) %>

    -
    -
    - <%= raw form_field(@user,"login",nil,"joe.doe",params[:user].nil? ? params[:login] : params[:user][:login]) %> - <%= raw form_field(@user,"first_name",nil,"Joe","") %> - <%= raw form_field(@user,"last_name",nil,"Doe","") %> - <%= raw form_field(@server,"name",nil,"server.domain","") %> - <%= raw single_action('send','compose',"up.png") %> -
    -
    -
    -
    diff --git a/themes/olive/views/user/unknown.html.erb b/themes/olive/views/user/unknown.html.erb deleted file mode 100755 index 306f958..0000000 --- a/themes/olive/views/user/unknown.html.erb +++ /dev/null @@ -1,16 +0,0 @@ -<% content_for :title do %> - <%= t(:unknown_title,:scope=>:user) %> -<% end %> - -
    -
    - -

    <%= t(:unknown_title,:scope=>:user) %>

    -
    -

    <%= t(:unknown_flash,:scope=>:user) %>

    -

    <%= t(:unknown_login,:scope=>:user) %> -> <%= link_to t(:login,:scope=>:user),user_login_path %>

    -

    <%= t(:unknown_setup,:scope=>:user) %> -> <%= link_to t(:setup,:scope=>:user),:controller => "user",:action => "setup",:login => params[:login] %>

    -
    -
    -
    diff --git a/vendor/assets/javascripts/.gitkeep b/vendor/assets/javascripts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/vendor/assets/stylesheets/.gitkeep b/vendor/assets/stylesheets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/vendor/plugins/.gitkeep b/vendor/plugins/.gitkeep old mode 100755 new mode 100644 From cacd9575d03ccfa13246df90af70a318296a2465 Mon Sep 17 00:00:00 2001 From: Wojciech Todryk Date: Sat, 10 Mar 2012 18:08:39 +0100 Subject: [PATCH 67/88] rails 3.2.2 added tweeter bootstrap --- AUTHORS | 5 + CHANGES.markdown | 19 + Gemfile | 7 + Gemfile.lock | 12 + TODO.markdown | 20 + UNLICENSE.markdown | 24 + .../images/glyphicons-halflings-white.png | Bin 0 -> 4352 bytes app/assets/images/glyphicons-halflings.png | Bin 0 -> 4352 bytes app/assets/images/logo.png | Bin 0 -> 17995 bytes app/assets/javascripts/bootstrap.min.js | 1 + .../stylesheets/bootstrap-responsive.min.css | 4 + app/assets/stylesheets/bootstrap.min.css | 632 ++++++++++++++++++ app/assets/stylesheets/mailr.css.sass | 7 + app/controllers/application_controller.rb | 98 ++- app/controllers/contacts_controller.rb | 135 ++++ app/controllers/folders_controller.rb | 172 +++++ app/controllers/internal_controller.rb | 53 ++ app/controllers/links_controller.rb | 133 ++++ app/controllers/messages_controller.rb | 210 ++++++ app/controllers/messages_ops_controller.rb | 354 ++++++++++ app/controllers/prefs_controller.rb | 55 ++ app/controllers/user_controller.rb | 75 +++ app/helpers/application_helper.rb | 332 +++++++++ app/models/contact.rb | 54 ++ app/models/folder.rb | 146 ++++ app/models/link.rb | 19 + app/models/message.rb | 73 ++ app/models/prefs.rb | 19 + app/models/server.rb | 41 ++ app/models/user.rb | 64 ++ app/views/layouts/application.html.erb | 44 +- app/views/layouts/html_body.erb | 1 + app/views/layouts/simple.html.haml | 32 + app/views/user/login.html.haml | 18 + app/views/user/setup.html.erb | 20 + app/views/user/unknown.html.erb | 16 + arts/favicon.png | Bin 0 -> 16596 bytes arts/favicon.xcf | Bin 0 -> 44489 bytes arts/logo.png | Bin 0 -> 61554 bytes arts/logo.xcf | Bin 0 -> 254283 bytes arts/logo2.xcf | Bin 0 -> 255261 bytes arts/logo3.xcf | Bin 0 -> 334574 bytes config/application.rb | 13 + config/database.yml | 42 -- config/database.yml.example | 46 +- config/locales/en.yml | 66 +- config/locales/es-ES.yml | 91 +++ config/locales/pl.yml | 227 +++++++ config/routes.rb | 113 ++-- config/settings.yml.example | 53 ++ .../20120303202800_create_all_tables.rb | 111 +++ db/schema.rb | 111 +++ lib/imap_folder.rb | 23 + lib/imap_mailbox.rb | 207 ++++++ lib/imap_message.rb | 91 +++ lib/imap_session.rb | 25 + lib/mail_plugin_extension.rb | 114 ++++ public/index.html | 241 ------- 58 files changed, 4112 insertions(+), 357 deletions(-) create mode 100755 AUTHORS create mode 100755 CHANGES.markdown create mode 100755 TODO.markdown create mode 100755 UNLICENSE.markdown create mode 100644 app/assets/images/glyphicons-halflings-white.png create mode 100644 app/assets/images/glyphicons-halflings.png create mode 100755 app/assets/images/logo.png create mode 100644 app/assets/javascripts/bootstrap.min.js create mode 100644 app/assets/stylesheets/bootstrap-responsive.min.css create mode 100644 app/assets/stylesheets/bootstrap.min.css create mode 100644 app/assets/stylesheets/mailr.css.sass mode change 100644 => 100755 app/controllers/application_controller.rb create mode 100755 app/controllers/contacts_controller.rb create mode 100755 app/controllers/folders_controller.rb create mode 100755 app/controllers/internal_controller.rb create mode 100755 app/controllers/links_controller.rb create mode 100755 app/controllers/messages_controller.rb create mode 100755 app/controllers/messages_ops_controller.rb create mode 100755 app/controllers/prefs_controller.rb create mode 100755 app/controllers/user_controller.rb mode change 100644 => 100755 app/helpers/application_helper.rb create mode 100755 app/models/contact.rb create mode 100755 app/models/folder.rb create mode 100644 app/models/link.rb create mode 100755 app/models/message.rb create mode 100755 app/models/prefs.rb create mode 100755 app/models/server.rb create mode 100755 app/models/user.rb mode change 100644 => 100755 app/views/layouts/application.html.erb create mode 100755 app/views/layouts/html_body.erb create mode 100755 app/views/layouts/simple.html.haml create mode 100644 app/views/user/login.html.haml create mode 100755 app/views/user/setup.html.erb create mode 100755 app/views/user/unknown.html.erb create mode 100755 arts/favicon.png create mode 100755 arts/favicon.xcf create mode 100755 arts/logo.png create mode 100755 arts/logo.xcf create mode 100755 arts/logo2.xcf create mode 100755 arts/logo3.xcf delete mode 100644 config/database.yml mode change 100644 => 100755 config/locales/en.yml create mode 100755 config/locales/es-ES.yml create mode 100755 config/locales/pl.yml mode change 100644 => 100755 config/routes.rb create mode 100644 config/settings.yml.example create mode 100644 db/migrate/20120303202800_create_all_tables.rb create mode 100644 db/schema.rb create mode 100755 lib/imap_folder.rb create mode 100755 lib/imap_mailbox.rb create mode 100755 lib/imap_message.rb create mode 100755 lib/imap_session.rb create mode 100755 lib/mail_plugin_extension.rb delete mode 100644 public/index.html diff --git a/AUTHORS b/AUTHORS new file mode 100755 index 0000000..79766f5 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,5 @@ +* Luben Manolov +* Nick Penkov +* Eugene Korbut +* Emilio Blanco +* Wojciech Todryk diff --git a/CHANGES.markdown b/CHANGES.markdown new file mode 100755 index 0000000..f15945b --- /dev/null +++ b/CHANGES.markdown @@ -0,0 +1,19 @@ +## Changes + +#### 0.8.6 + + * new calendar view + +#### 0.8.5 + + * servers view + * identity modification + +#### 0.8.4 + + * calendar view as separate gem + * adding bluecloth for rendering markdown text + +#### 0.8.3 + + * export, imports of contact diff --git a/Gemfile b/Gemfile index 021ea69..2039c7d 100644 --- a/Gemfile +++ b/Gemfile @@ -37,3 +37,10 @@ gem 'jquery-rails' # To use debugger # gem 'ruby-debug' + +gem 'will_paginate' +gem "ezcrypto" +gem "calendar_view" +gem 'bluecloth' +gem 'sass' +gem 'haml' diff --git a/Gemfile.lock b/Gemfile.lock index 793cc35..c3b2bc4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -29,7 +29,10 @@ GEM i18n (~> 0.6) multi_json (~> 1.0) arel (3.0.2) + bluecloth (2.2.0) builder (3.0.0) + calendar_view (0.0.6) + rails (>= 3.0.0) coffee-rails (3.2.2) coffee-script (>= 2.2.0) railties (~> 3.2.0) @@ -40,6 +43,8 @@ GEM erubis (2.7.0) execjs (1.3.0) multi_json (~> 1.0) + ezcrypto (0.7.2) + haml (3.1.4) hike (1.2.1) i18n (0.6.0) journey (1.0.3) @@ -98,15 +103,22 @@ GEM uglifier (1.2.3) execjs (>= 0.3.0) multi_json (>= 1.0.2) + will_paginate (3.0.3) PLATFORMS ruby DEPENDENCIES + bluecloth + calendar_view coffee-rails (~> 3.2.1) + ezcrypto + haml jquery-rails json mysql2 rails (= 3.2.2) + sass sass-rails (~> 3.2.3) uglifier (>= 1.0.3) + will_paginate diff --git a/TODO.markdown b/TODO.markdown new file mode 100755 index 0000000..2979b2d --- /dev/null +++ b/TODO.markdown @@ -0,0 +1,20 @@ +## Todo + +app/controllers/folders_controller.rb: + + * [ 30] [TODO] recreate local copy of folders + * [ 99] [TODO] save system folders + +app/controllers/messages_controller.rb: + + * [101] [FIXME] missing fields and support arrays + +app/controllers/messages_ops_controller.rb: + + * [249] [FIXME] edit does not support attachments + * [304] [TODO] check if email address is valid if not get address from contacts + +app/models/prefs.rb: + + * [ 19] [TODO] move refresh to prefs and make refresh page with messages + diff --git a/UNLICENSE.markdown b/UNLICENSE.markdown new file mode 100755 index 0000000..68a49da --- /dev/null +++ b/UNLICENSE.markdown @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +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 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. + +For more information, please refer to diff --git a/app/assets/images/glyphicons-halflings-white.png b/app/assets/images/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..a20760bfde58d1c92cee95116059fba03c68d689 GIT binary patch literal 4352 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 Qz`(%Z>FVdQ&MBb@07lpDS^xk5 literal 0 HcmV?d00001 diff --git a/app/assets/images/glyphicons-halflings.png b/app/assets/images/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..92d4445dfd0af414835467132cf50c7c38a303af GIT binary patch literal 4352 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 THzS>afq}u()z4*}Q$iB}W9x^B literal 0 HcmV?d00001 diff --git a/app/assets/images/logo.png b/app/assets/images/logo.png new file mode 100755 index 0000000000000000000000000000000000000000..28b9079872cc7fbcdc8faf3815d3b2f0c8f29d27 GIT binary patch literal 17995 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 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/bootstrap.min.js b/app/assets/javascripts/bootstrap.min.js new file mode 100644 index 0000000..97dc88e --- /dev/null +++ b/app/assets/javascripts/bootstrap.min.js @@ -0,0 +1 @@ +!function(a){a(function(){"use strict",a.support.transition=function(){var b=document.body||document.documentElement,c=b.style,d=c.transition!==undefined||c.WebkitTransition!==undefined||c.MozTransition!==undefined||c.MsTransition!==undefined||c.OTransition!==undefined;return d&&{end:function(){var b="TransitionEnd";return a.browser.webkit?b="webkitTransitionEnd":a.browser.mozilla?b="transitionend":a.browser.opera&&(b="oTransitionEnd"),b}()}}()})}(window.jQuery),!function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype={constructor:c,close:function(b){function f(){e.trigger("closed").remove()}var c=a(this),d=c.attr("data-target"),e;d||(d=c.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),e=a(d),e.trigger("close"),b&&b.preventDefault(),e.length||(e=c.hasClass("alert")?c:c.parent()),e.trigger("close").removeClass("in"),a.support.transition&&e.hasClass("fade")?e.on(a.support.transition.end,f):f()}},a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("alert");e||d.data("alert",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.alert.Constructor=c,a(function(){a("body").on("click.alert.data-api",b,c.prototype.close)})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.button.defaults,c)};b.prototype={constructor:b,setState:function(a){var b="disabled",c=this.$element,d=c.data(),e=c.is("input")?"val":"html";a+="Text",d.resetText||c.data("resetText",c[e]()),c[e](d[a]||this.options[a]),setTimeout(function(){a=="loadingText"?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},toggle:function(){var a=this.$element.parent('[data-toggle="buttons-radio"]');a&&a.find(".active").removeClass("active"),this.$element.toggleClass("active")}},a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("button"),f=typeof c=="object"&&c;e||d.data("button",e=new b(this,f)),c=="toggle"?e.toggle():c&&e.setState(c)})},a.fn.button.defaults={loadingText:"loading..."},a.fn.button.Constructor=b,a(function(){a("body").on("click.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle")})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.carousel.defaults,c),this.options.slide&&this.slide(this.options.slide)};b.prototype={cycle:function(){return this.interval=setInterval(a.proxy(this.next,this),this.options.interval),this},to:function(b){var c=this.$element.find(".active"),d=c.parent().children(),e=d.index(c),f=this;if(b>d.length-1||b<0)return;return this.sliding?this.$element.one("slid",function(){f.to(b)}):e==b?this.pause().cycle():this.slide(b>e?"next":"prev",a(d[b]))},pause:function(){return clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(b,c){var d=this.$element.find(".active"),e=c||d[b](),f=this.interval,g=b=="next"?"left":"right",h=b=="next"?"first":"last",i=this;if(!e.length)return;return this.sliding=!0,f&&this.pause(),e=e.length?e:this.$element.find(".item")[h](),!a.support.transition&&this.$element.hasClass("slide")?(this.$element.trigger("slide"),d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")):(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),this.$element.trigger("slide"),this.$element.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)})),f&&this.cycle(),this}},a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("carousel"),f=typeof c=="object"&&c;e||d.data("carousel",e=new b(this,f)),typeof c=="number"?e.to(c):typeof c=="string"||(c=f.slide)?e[c]():e.cycle()})},a.fn.carousel.defaults={interval:5e3},a.fn.carousel.Constructor=b,a(function(){a("body").on("click.carousel.data-api","[data-slide]",function(b){var c=a(this),d,e=a(c.attr("data-target")||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,"")),f=!e.data("modal")&&a.extend({},e.data(),c.data());e.carousel(f),b.preventDefault()})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.collapse.defaults,c),this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.prototype={constructor:b,dimension:function(){var a=this.$element.hasClass("width");return a?"width":"height"},show:function(){var b=this.dimension(),c=a.camelCase(["scroll",b].join("-")),d=this.$parent&&this.$parent.find(".in"),e;d&&d.length&&(e=d.data("collapse"),d.collapse("hide"),e||d.data("collapse",null)),this.$element[b](0),this.transition("addClass","show","shown"),this.$element[b](this.$element[0][c])},hide:function(){var a=this.dimension();this.reset(this.$element[a]()),this.transition("removeClass","hide","hidden"),this.$element[a](0)},reset:function(a){var b=this.dimension();this.$element.removeClass("collapse")[b](a||"auto")[0].offsetWidth,this.$element.addClass("collapse")},transition:function(b,c,d){var e=this,f=function(){c=="show"&&e.reset(),e.$element.trigger(d)};this.$element.trigger(c)[b]("in"),a.support.transition&&this.$element.hasClass("collapse")?this.$element.one(a.support.transition.end,f):f()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("collapse"),f=typeof c=="object"&&c;e||d.data("collapse",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.collapse.defaults={toggle:!0},a.fn.collapse.Constructor=b,a(function(){a("body").on("click.collapse.data-api","[data-toggle=collapse]",function(b){var c=a(this),d,e=c.attr("data-target")||b.preventDefault()||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),f=a(e).data("collapse")?"toggle":c.data();a(e).collapse(f)})})}(window.jQuery),!function(a){function d(){a(b).parent().removeClass("open")}"use strict";var b='[data-toggle="dropdown"]',c=function(b){var c=a(b).on("click.dropdown.data-api",this.toggle);a("html").on("click.dropdown.data-api",function(){c.parent().removeClass("open")})};c.prototype={constructor:c,toggle:function(b){var c=a(this),e=c.attr("data-target"),f,g;return e||(e=c.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,"")),f=a(e),f.length||(f=c.parent()),g=f.hasClass("open"),d(),!g&&f.toggleClass("open"),!1}},a.fn.dropdown=function(b){return this.each(function(){var d=a(this),e=d.data("dropdown");e||d.data("dropdown",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.dropdown.Constructor=c,a(function(){a("html").on("click.dropdown.data-api",d),a("body").on("click.dropdown.data-api",b,c.prototype.toggle)})}(window.jQuery),!function(a){function c(){var b=this,c=setTimeout(function(){b.$element.off(a.support.transition.end),d.call(b)},500);this.$element.one(a.support.transition.end,function(){clearTimeout(c),d.call(b)})}function d(a){this.$element.hide().trigger("hidden"),e.call(this)}function e(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;this.$backdrop=a('