Archive: ComponentOwl Rails app, DB backups, go redirect script
This commit is contained in:
12
app/controllers/about_controller.rb
Normal file
12
app/controllers/about_controller.rb
Normal file
@@ -0,0 +1,12 @@
|
||||
class AboutController < ApplicationController
|
||||
|
||||
caches_page :index, :press_resources
|
||||
|
||||
def index
|
||||
@static_page = StaticPage['about']
|
||||
end
|
||||
|
||||
def press_resources
|
||||
@static_page = StaticPage['press-resources']
|
||||
end
|
||||
end
|
||||
40
app/controllers/activations_controller.rb
Normal file
40
app/controllers/activations_controller.rb
Normal file
@@ -0,0 +1,40 @@
|
||||
class ActivationsController < ApplicationController
|
||||
|
||||
skip_before_filter :verify_authenticity_token
|
||||
|
||||
before_filter :authenticate
|
||||
before_filter :init_params, :only => :create
|
||||
|
||||
def create
|
||||
@activation = Activation.new(params[:activation])
|
||||
|
||||
if @activation.save
|
||||
respond_to do |format|
|
||||
format.xml { render_activation_xml }
|
||||
end
|
||||
else
|
||||
FailedActivation.create_from_activation(@activation)
|
||||
respond_to do |format|
|
||||
format.xml { render_activation_xml }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def render_activation_xml
|
||||
render :xml => @activation.to_xml(:buy_url => order_url(featured_product), :support_url => support_contact_url)
|
||||
end
|
||||
|
||||
def init_params
|
||||
params[:activation] ||= {}
|
||||
params[:activation][:ip] = request.remote_ip
|
||||
end
|
||||
|
||||
def authenticate
|
||||
authenticate_or_request_with_http_basic do |login, password|
|
||||
login == Settings.activation_auth.login && password == Settings.activation_auth.password
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
101
app/controllers/application_controller.rb
Normal file
101
app/controllers/application_controller.rb
Normal file
@@ -0,0 +1,101 @@
|
||||
# Filters added to this controller apply to all controllers in the application.
|
||||
# Likewise, all the methods added will be available for all controllers.
|
||||
|
||||
class ApplicationController < ActionController::Base
|
||||
filter_parameter_logging :password
|
||||
helper_method :locales, :newsletter_subscription, :crypted_subscriptions_path, :featured_product, :blog_url, :upgrade_url,
|
||||
:dropdown_products, :order_products, :all_products, :blog_posts, :latest_news, :latest_comic,
|
||||
:dropdown_categorized_products, :have_articles?
|
||||
|
||||
#include ExceptionNotifiable
|
||||
include ExceptionNotification::Notifiable
|
||||
|
||||
# kvuli super_exception_notifier
|
||||
# bez tohoto se vypisuje chybova stranka do layoutu prislusejiciho ke controlleru
|
||||
@@error_layout = "application"
|
||||
|
||||
protect_from_forgery # See ActionController::RequestForgeryProtection for details
|
||||
|
||||
before_filter :enable_or_disable_cdn
|
||||
|
||||
helper :rails_wordpress
|
||||
|
||||
# disable cnd for certain parts of the application (/admin) and re-enable it if needed
|
||||
def enable_or_disable_cdn
|
||||
if defined?(CloudfrontAssetHost) && CloudfrontAssetHost.enabled
|
||||
if request.path.starts_with?('/admin') && ActionController::Base.asset_host.present?
|
||||
CloudfrontAssetHost.disable!
|
||||
elsif !request.path.starts_with?('/admin') && ActionController::Base.asset_host.blank?
|
||||
CloudfrontAssetHost.enable!
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def upgrade_url(code)
|
||||
root_url + "upgrade/#{StaticPage[code].url_param}"
|
||||
end
|
||||
|
||||
# do newsletter engine
|
||||
def crypted_subscriptions_path(contact)
|
||||
subscriptions_url + "?contact=" + UrlParamCrypt.encrypt(contact.id)
|
||||
end
|
||||
|
||||
def newsletter_subscription(location_code = nil)
|
||||
subscription = Subscription.new
|
||||
subscription.subscription_location = SubscriptionLocation[location_code] if location_code
|
||||
subscription
|
||||
end
|
||||
|
||||
def latest_comic
|
||||
@latest_comic ||= Comic.latest
|
||||
end
|
||||
|
||||
def blog_url
|
||||
@blog_url ||= WpOption["siteurl"].value
|
||||
end
|
||||
|
||||
def dropdown_products
|
||||
@dropdown_products ||= [featured_product] + Promotion['dropdown'].products.all_ordered
|
||||
end
|
||||
|
||||
def order_products
|
||||
@order_products ||= ProductCategory.non_free_products
|
||||
end
|
||||
|
||||
def featured_product
|
||||
@featured_product ||= Product[Settings.featured_product]
|
||||
end
|
||||
|
||||
def all_products
|
||||
@all_products ||= Product.all_ordered
|
||||
end
|
||||
|
||||
def blog_posts
|
||||
@blog_posts ||= WpBlogPost.find(:all, :limit => Settings.home.blog_posts)
|
||||
end
|
||||
|
||||
def latest_news
|
||||
@latest_news ||= begin
|
||||
latests = (Latest.find_latest + Release.find_latest).sort {|x, y| x.date <=> y.date }
|
||||
latests.reverse.slice(0, Settings.home.latest)
|
||||
end
|
||||
end
|
||||
|
||||
def dropdown_categorized_products
|
||||
@dropdown_categorized_products ||= [].tap do |a|
|
||||
ProductCategory.all.each do |product_category|
|
||||
products = []
|
||||
dropdown_products.each do |dropdown_product|
|
||||
products << dropdown_product if dropdown_product.product_category == product_category
|
||||
end
|
||||
#products.unshift(featured_product) if featured_product.product_category == product_category
|
||||
a << { :category => product_category.name, :products => products } unless products.empty?
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def have_articles?
|
||||
!Article.published.empty?
|
||||
end
|
||||
|
||||
end
|
||||
33
app/controllers/articles_controller.rb
Normal file
33
app/controllers/articles_controller.rb
Normal file
@@ -0,0 +1,33 @@
|
||||
class ArticlesController < ApplicationController
|
||||
|
||||
caches_page :index, :show
|
||||
|
||||
def index
|
||||
@featured_articles = Article.published.featured(Settings.resources.featured_articles)
|
||||
@articles = Article.cute_ordered.published - @featured_articles
|
||||
end
|
||||
|
||||
def show
|
||||
@article = Article.find_by_slug(params[:id])
|
||||
|
||||
if @article
|
||||
if @article.keyword1.present?
|
||||
@meta_title = I18n.t('txt.articles.meta_title_with_keyword', :title => @article.title, :keyword => @article.keyword1)
|
||||
else
|
||||
@meta_title = I18n.t('txt.articles.meta_title', :title => @article.title)
|
||||
end
|
||||
if @article.custom_subtemplate.blank?
|
||||
@subtemplate = SubtemplateType.with_keywords('article-sidebar', @article)
|
||||
else
|
||||
@subtemplate = @article.custom_subtemplate
|
||||
end
|
||||
respond_to do |format|
|
||||
format.html
|
||||
end
|
||||
else
|
||||
respond_to do |format|
|
||||
format.html { render_404 }
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
22
app/controllers/bmt/orders_controller.rb
Normal file
22
app/controllers/bmt/orders_controller.rb
Normal file
@@ -0,0 +1,22 @@
|
||||
class Bmt::OrdersController < ApplicationController
|
||||
|
||||
before_filter :verify_api_token
|
||||
|
||||
def create
|
||||
@bmt_order = BmtOrder.new(params[:request])
|
||||
|
||||
if @bmt_order.save
|
||||
#@trackable_number = @bmt_order.customer_ref
|
||||
#track_visitor(@bmt_order.orderable, :source => @bmt_order.track_from_other_source, :url => "BMT-Checkout", :checkout => true, :created_at => 1.minute.ago) if @bmt_order.track_checkout?
|
||||
#track_visitor(@bmt_order.orderable, :source => "BMT-Checkout", :order => true)
|
||||
respond_to do |format|
|
||||
format.xml { render :xml => @bmt_order.xml_response }
|
||||
end
|
||||
else
|
||||
respond_to do |format|
|
||||
format.xml { render :xml => @bmt_order.xml_response }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
28
app/controllers/comics_controller.rb
Normal file
28
app/controllers/comics_controller.rb
Normal file
@@ -0,0 +1,28 @@
|
||||
class ComicsController < ApplicationController
|
||||
|
||||
caches_page :show
|
||||
|
||||
def index
|
||||
@comics = Comic.find_latest.published
|
||||
respond_to do |format|
|
||||
format.html { redirect_to latest_comic }
|
||||
format.rss
|
||||
end
|
||||
end
|
||||
|
||||
def show
|
||||
@comic = Comic.published.find_by_number(params[:id])
|
||||
if @comic
|
||||
@previous_comic = @comic.previous
|
||||
@next_comic = @comic.next
|
||||
else
|
||||
@comic = Comic.published.find_by_id(params[:id])
|
||||
if @comic
|
||||
redirect_to @comic, :status => 301
|
||||
else
|
||||
render_404
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
6
app/controllers/cron_controller.rb
Normal file
6
app/controllers/cron_controller.rb
Normal file
@@ -0,0 +1,6 @@
|
||||
class CronController < ApplicationController
|
||||
def resend_support_requests
|
||||
Cron.resend_support_requests
|
||||
render :nothing => true
|
||||
end
|
||||
end
|
||||
15
app/controllers/download_controller.rb
Normal file
15
app/controllers/download_controller.rb
Normal file
@@ -0,0 +1,15 @@
|
||||
class DownloadController < ApplicationController
|
||||
|
||||
before_filter(:only => [:show]){ |c| c.find_product("download_url", UrlDestination['product-download']) }
|
||||
before_filter :init_objects, :only => [:show]
|
||||
|
||||
private
|
||||
|
||||
def init_objects
|
||||
@download_url = direct_download_url(:filename => @product.file_url)
|
||||
@testimonial = @product.testimonial_by_location('download')
|
||||
@meta_title = I18n.t('txt.download_page.meta_title', :product => @product.name.strip_version, :version => @product.current_version)
|
||||
@meta_description = I18n.t('txt.download_page.meta_description', :product => @product.name.strip_version)
|
||||
@meta_keywords = I18n.t('txt.download_page.meta_keywords', :product => @product.name.strip_version)
|
||||
end
|
||||
end
|
||||
53
app/controllers/faqs_controller.rb
Normal file
53
app/controllers/faqs_controller.rb
Normal file
@@ -0,0 +1,53 @@
|
||||
class FaqsController < ApplicationController
|
||||
|
||||
before_filter :init_objects, :except => [:search]
|
||||
before_filter :init_params, :only => [:search]
|
||||
|
||||
caches_page :index, :show
|
||||
|
||||
def index
|
||||
render :action => "show"
|
||||
end
|
||||
|
||||
def show
|
||||
end
|
||||
|
||||
def search
|
||||
#buga> uz budou mit dalsi produkty faqs, tohle se musi predelat
|
||||
@product = featured_product
|
||||
|
||||
respond_to do |format|
|
||||
format.html # index.html.erb
|
||||
format.xml { render :xml => @faqs }
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def init_params
|
||||
params[:search] ||= {}
|
||||
params[:search] ||= {}
|
||||
params[:search][:order] ||= "ascend_by_position"
|
||||
|
||||
@search = Faq.search(params[:search])
|
||||
@faqs = @search.all
|
||||
end
|
||||
|
||||
def init_objects
|
||||
if params[:product]
|
||||
@product = Product[params[:product]]
|
||||
@categories = @product.faq_categories.all_ordered
|
||||
else
|
||||
@categories = FaqCategory.common
|
||||
end
|
||||
|
||||
if params[:id]
|
||||
@categories.each {|category| @category = category if category.url_param == params[:id] }
|
||||
else
|
||||
@category = @categories.first
|
||||
end
|
||||
|
||||
@faqs = @category.faqs
|
||||
@products = Product.all_ordered
|
||||
end
|
||||
end
|
||||
15
app/controllers/feeds_controller.rb
Normal file
15
app/controllers/feeds_controller.rb
Normal file
@@ -0,0 +1,15 @@
|
||||
class FeedsController < ApplicationController
|
||||
layout false
|
||||
|
||||
def index
|
||||
posts = WpBlogPost.find(:all, :limit => Settings.rss.posts)
|
||||
releases = Release.find_latest_for_rss
|
||||
|
||||
p = (posts + releases).sort {|x, y| x.date.to_datetime <=> y.date.to_datetime }
|
||||
@posts = p.reverse.slice(0, Settings.rss.posts)
|
||||
|
||||
respond_to do |format|
|
||||
format.rss
|
||||
end
|
||||
end
|
||||
end
|
||||
9
app/controllers/home_controller.rb
Normal file
9
app/controllers/home_controller.rb
Normal file
@@ -0,0 +1,9 @@
|
||||
class HomeController < ApplicationController
|
||||
|
||||
caches_page :index
|
||||
|
||||
def index
|
||||
@static_page = StaticPage['home-blv20']
|
||||
end
|
||||
|
||||
end
|
||||
21
app/controllers/landing_pages_controller.rb
Normal file
21
app/controllers/landing_pages_controller.rb
Normal file
@@ -0,0 +1,21 @@
|
||||
class LandingPagesController < ApplicationController
|
||||
|
||||
before_filter :init_product
|
||||
|
||||
layout "simple"
|
||||
|
||||
caches_page :show
|
||||
|
||||
def show
|
||||
@support_request = SupportRequest.new
|
||||
@support_request.support_request_origin = SupportRequestOrigin['landing-page']
|
||||
@support_request.product = @product
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def init_product
|
||||
@product = Product.find_by_code(params[:id])
|
||||
end
|
||||
|
||||
end
|
||||
33
app/controllers/orders_controller.rb
Normal file
33
app/controllers/orders_controller.rb
Normal file
@@ -0,0 +1,33 @@
|
||||
class OrdersController < ApplicationController
|
||||
|
||||
before_filter(:only => [:show]){ |c| c.find_product("order_url", UrlDestination['order']) }
|
||||
before_filter :check_product, :only => :show
|
||||
before_filter :init_objects
|
||||
|
||||
caches_page :index, :show
|
||||
|
||||
def index
|
||||
redirect_to order_url(featured_product)
|
||||
end
|
||||
|
||||
def show
|
||||
@product = Product[params[:id]]
|
||||
unless @product
|
||||
render_404
|
||||
else
|
||||
@page = @product.product_pages.find_by_code(Settings.pricing_code)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def check_product
|
||||
redirect_to Settings.better_splitbutton_buy_url if @product.code == 'better-splitbutton'
|
||||
end
|
||||
|
||||
def init_objects
|
||||
@support_request = SupportRequest.new
|
||||
@support_request.support_request_origin = SupportRequestOrigin['order']
|
||||
@support_request.product = @product
|
||||
end
|
||||
end
|
||||
17
app/controllers/pad_controller.rb
Normal file
17
app/controllers/pad_controller.rb
Normal file
@@ -0,0 +1,17 @@
|
||||
class PadController < ApplicationController
|
||||
|
||||
caches_page :show
|
||||
|
||||
def show
|
||||
# blba vyjimka
|
||||
params[:id] = "mp3-speed-accelerator" if params[:id] == "mp3speedaccelerator"
|
||||
@product = Product.find_by_file(params[:id])
|
||||
if @product
|
||||
respond_to do |format|
|
||||
format.xml
|
||||
end
|
||||
else
|
||||
render :nothing => true, :status => 404
|
||||
end
|
||||
end
|
||||
end
|
||||
9
app/controllers/product_pages_controller.rb
Normal file
9
app/controllers/product_pages_controller.rb
Normal file
@@ -0,0 +1,9 @@
|
||||
class ProductPagesController < ApplicationController
|
||||
|
||||
def show
|
||||
@product_page = ProductPage.find(params[:id])
|
||||
#sleep(2)
|
||||
render :inline => @product_page.html
|
||||
end
|
||||
|
||||
end
|
||||
93
app/controllers/products_controller.rb
Normal file
93
app/controllers/products_controller.rb
Normal file
@@ -0,0 +1,93 @@
|
||||
class ProductsController < ApplicationController
|
||||
|
||||
skip_before_filter :verify_authenticity_token, :only => [:generate_license, :download]
|
||||
before_filter :verify_api_token, :only => :generate_license
|
||||
|
||||
before_filter(:only => [:show]){ |c| c.find_product("product_url", UrlDestination['product-detail']) }
|
||||
before_filter :init_objects, :only => [:show]
|
||||
|
||||
caches_page :index, :show, :if => Proc.new { |c| c.params[:detail] != Settings.releases_code }
|
||||
|
||||
def index
|
||||
@categories = ProductCategory.all_but_featured
|
||||
@all_categories = ProductCategory.find :all
|
||||
@testimonials = Testimonial.for_products_page
|
||||
end
|
||||
|
||||
def show
|
||||
@special_menu_hl = true if @product.code == Settings.featured_product
|
||||
@release = @product.current_release
|
||||
@screenshots = @product.screenshots.featured
|
||||
# future? pro ajaxove taby
|
||||
#if params[:ajax]
|
||||
# render :text => @detail.html
|
||||
#end
|
||||
end
|
||||
|
||||
def download
|
||||
params[:filename] = featured_product.setup_file.original_filename.split(".").first if params[:filename] == "swifttodolist7-beta12"
|
||||
@product = Product.find_by_file(params[:filename])
|
||||
if @product
|
||||
DownloadLog.log(@product, request)
|
||||
if Rails.env.preproduction? || Rails.env.production?
|
||||
redirect_to "http://#{Settings.download_host}/#{@product.setup_file.path}"
|
||||
else
|
||||
send_file @product.setup_file.path, :type => 'application/binary'
|
||||
end
|
||||
else
|
||||
render_404
|
||||
end
|
||||
end
|
||||
|
||||
def detail
|
||||
render :text => @detail.html
|
||||
end
|
||||
|
||||
def generate_license
|
||||
@license_key = BmtLicenseKey.new
|
||||
@license_key.generate!
|
||||
|
||||
respond_to do |format|
|
||||
format.xml { render :xml => @license_key }
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def verify_generate_license_token
|
||||
if !params[:t] || params[:t] != Settings.generate_license_token
|
||||
render :nothing => true
|
||||
end
|
||||
end
|
||||
|
||||
def init_objects
|
||||
if params[:detail]
|
||||
case params[:detail]
|
||||
when "features"
|
||||
redirect_to(@product, :status => 301)
|
||||
when "thumbnails"
|
||||
redirect_to(Product['better-thumbnail-browser'], :status => 301)
|
||||
when Settings.documentation_code
|
||||
#redirect_to(product_page_url(@product, @product.product_pages.find_by_code("resources")))
|
||||
redirect_to("/documentation/#{@product.code}/index.html")
|
||||
when Settings.class_reference_code
|
||||
redirect_to("/class-reference/#{@product.code}/index.html")
|
||||
when Settings.quick_start_guide_code
|
||||
redirect_to("/documentation/#{@product.code}/data/chapter-quickstart.html")
|
||||
when Settings.releases_code
|
||||
@since_release = @product.releases.find_by_version(params[:since]) if params[:since].present?
|
||||
@since_release = @product.current_release unless @since_release
|
||||
@releases = @product.releases.find_since(@since_release.version)
|
||||
else
|
||||
@detail = @product.product_pages.find_by_code(params[:detail])
|
||||
render_404 unless @detail
|
||||
end
|
||||
else
|
||||
@detail = @product.default_page
|
||||
end
|
||||
|
||||
@support_request = SupportRequest.new
|
||||
@support_request.support_request_origin = SupportRequestOrigin['product']
|
||||
@support_request.product = @product
|
||||
end
|
||||
end
|
||||
51
app/controllers/releases_controller.rb
Normal file
51
app/controllers/releases_controller.rb
Normal file
@@ -0,0 +1,51 @@
|
||||
class ReleasesController < ApplicationController
|
||||
|
||||
caches_page :show
|
||||
|
||||
def show
|
||||
@release = Release.find(params[:id])
|
||||
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.js {
|
||||
render :partial => "whatsnew", :layout => false
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
def check
|
||||
edition = ProductEdition.find_by_internal_code(params[:product])
|
||||
product = edition ? edition.product : Product.find_by_internal_code(params[:product])
|
||||
release = product.current_release
|
||||
new_version = release.newer_than(params[:build].to_i)
|
||||
|
||||
@response = ["### update check response ###"]
|
||||
if new_version
|
||||
releases = product.releases.find_newer_than(params[:build])
|
||||
@response << release.version
|
||||
@response << release.build
|
||||
@response << I18n.l(release.date, :format => :iso)
|
||||
@response << download_url(product)
|
||||
@response << direct_download_url(:filename => product.file_url)
|
||||
@response << "### changelog begin ###"
|
||||
if releases.size == 1
|
||||
@response << release.changelog
|
||||
else
|
||||
@response << "This cumulative update contains #{releases.size} previous updates that you have not installed."
|
||||
@response << ""
|
||||
releases.each do |release|
|
||||
@response << "===================================================="
|
||||
@response << "Changes in version #{release.version} (#{I18n.l(release.date, :format => :cute)})"
|
||||
@response << "===================================================="
|
||||
@response << release.changelog
|
||||
@response << "" unless releases.last == release
|
||||
end
|
||||
end
|
||||
@response << "### changelog end ###"
|
||||
else
|
||||
@response << "### no new version ###"
|
||||
end
|
||||
|
||||
render :layout => false
|
||||
end
|
||||
end
|
||||
11
app/controllers/resources_controller.rb
Normal file
11
app/controllers/resources_controller.rb
Normal file
@@ -0,0 +1,11 @@
|
||||
class ResourcesController < ApplicationController
|
||||
|
||||
caches_page :index
|
||||
|
||||
def index
|
||||
@posts = WpBlogPost.find(:all, :limit => Settings.resources.blog_posts)
|
||||
@featured_articles = Article.published.featured(Settings.resources.featured_articles)
|
||||
@articles = Article.cute_ordered.published - @featured_articles
|
||||
end
|
||||
|
||||
end
|
||||
15
app/controllers/sitemap_controller.rb
Normal file
15
app/controllers/sitemap_controller.rb
Normal file
@@ -0,0 +1,15 @@
|
||||
class SitemapController < ApplicationController
|
||||
|
||||
caches_page :index, :if => Proc.new { |c| c.request.format.html? }
|
||||
|
||||
def index
|
||||
@products = Product.all_ordered
|
||||
@custom_titles = SitemapTitle.all
|
||||
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.xml
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
42
app/controllers/subscriptions_controller.rb
Normal file
42
app/controllers/subscriptions_controller.rb
Normal file
@@ -0,0 +1,42 @@
|
||||
class SubscriptionsController < ApplicationController
|
||||
|
||||
skip_before_filter :verify_authenticity_token
|
||||
|
||||
def index
|
||||
@contact = Contact.find(UrlParamCrypt.decrypt(params[:contact]))
|
||||
|
||||
#prozatim takhle super primitivne
|
||||
@contact.remove_trialwalkthrough_subscription(featured_product)
|
||||
end
|
||||
|
||||
def from_download
|
||||
@product = Product[params[:product]]
|
||||
render :layout => "iframe"
|
||||
end
|
||||
|
||||
def create
|
||||
@subscription = Subscription.new(params[:subscription])
|
||||
|
||||
@callback = params[:callback] || "subscription_saved"
|
||||
|
||||
if @subscription.save_many
|
||||
respond_to do |format|
|
||||
format.html { render :text => "OK" }
|
||||
format.js {
|
||||
render :update do |page|
|
||||
page.call @callback, params[:form_id]
|
||||
end
|
||||
}
|
||||
end
|
||||
else
|
||||
respond_to do |format|
|
||||
format.html { render :text => "ERROR" }
|
||||
format.js {
|
||||
render :update do |page|
|
||||
page.call "subscription_not_saved", t('txt.support.unsaved_subscription')
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
44
app/controllers/support_controller.rb
Normal file
44
app/controllers/support_controller.rb
Normal file
@@ -0,0 +1,44 @@
|
||||
class SupportController < ApplicationController
|
||||
|
||||
before_filter(:only => [:show]){ |c| c.find_product("support_url", UrlDestination['support']) }
|
||||
before_filter :init_objects
|
||||
|
||||
#layout "legal", :only => [:disclaimer, :privacy_policy]
|
||||
|
||||
# index a show nejde kesovat kvuli get parametru subject
|
||||
caches_page :disclaimer, :privacy_policy, :eula, :customer_service
|
||||
|
||||
def index
|
||||
end
|
||||
|
||||
def show
|
||||
render :action => "index"
|
||||
end
|
||||
|
||||
def disclaimer
|
||||
@static_page = StaticPage['disclaimer']
|
||||
end
|
||||
|
||||
def privacy_policy
|
||||
@static_page = StaticPage['privacy-policy']
|
||||
end
|
||||
|
||||
def eula
|
||||
@static_page = StaticPage['eula']
|
||||
end
|
||||
|
||||
def customer_service
|
||||
@static_page = StaticPage['customer-service']
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def init_objects
|
||||
@dextronet_faqs = FaqCategory.top_dextronet_faqs
|
||||
@products = Product.all_ordered.delete_if { |r| r.code == 'better-listview-express' }
|
||||
@support_request = SupportRequest.new
|
||||
@support_request.support_request_origin = SupportRequestOrigin['support']
|
||||
@support_request.product = @product
|
||||
end
|
||||
|
||||
end
|
||||
25
app/controllers/uninstall_controller.rb
Normal file
25
app/controllers/uninstall_controller.rb
Normal file
@@ -0,0 +1,25 @@
|
||||
class UninstallController < ApplicationController
|
||||
|
||||
before_filter :init_objects
|
||||
|
||||
caches_page :index, :show
|
||||
|
||||
#layout "simple"
|
||||
|
||||
def index
|
||||
|
||||
end
|
||||
|
||||
def show
|
||||
render :action => "index"
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def init_objects
|
||||
@product = Product.find_by_code(params[:id])
|
||||
@support_request = SupportRequest.new
|
||||
@support_request.support_request_origin = SupportRequestOrigin['why-uninstall']
|
||||
@support_request.product = @product
|
||||
end
|
||||
end
|
||||
15
app/controllers/upgrade_controller.rb
Normal file
15
app/controllers/upgrade_controller.rb
Normal file
@@ -0,0 +1,15 @@
|
||||
class UpgradeController < ApplicationController
|
||||
|
||||
caches_page :index
|
||||
|
||||
def index
|
||||
@product = featured_product
|
||||
@static_page = StaticPage.find_by_url_param(params[:upgrade])
|
||||
|
||||
@survey = Survey.new
|
||||
@survey.product = @product
|
||||
|
||||
render_404 unless @static_page
|
||||
end
|
||||
|
||||
end
|
||||
39
app/controllers/wp_controller.rb
Normal file
39
app/controllers/wp_controller.rb
Normal file
@@ -0,0 +1,39 @@
|
||||
class WpController < ApplicationController
|
||||
layout false
|
||||
|
||||
caches_page :header, :footer, :get_meta_tags, :get_page_include, :post_ad_stdl, :sidebar_ad,
|
||||
:blv_sidebar_ad, :post_ad_blv
|
||||
|
||||
def sweep
|
||||
SiteSweeper.sweep
|
||||
render :nothing => true
|
||||
end
|
||||
|
||||
def header
|
||||
@blog = true
|
||||
end
|
||||
|
||||
def footer
|
||||
end
|
||||
|
||||
def get_meta_tags
|
||||
end
|
||||
|
||||
def get_page_include
|
||||
end
|
||||
|
||||
def get_tracker
|
||||
end
|
||||
|
||||
def post_ad_stdl
|
||||
end
|
||||
|
||||
def post_ad_blv
|
||||
end
|
||||
|
||||
def sidebar_ad
|
||||
end
|
||||
|
||||
def blv_sidebar_ad
|
||||
end
|
||||
end
|
||||
11
app/helpers/about_helper.rb
Normal file
11
app/helpers/about_helper.rb
Normal file
@@ -0,0 +1,11 @@
|
||||
module AboutHelper
|
||||
|
||||
def years_since_founded
|
||||
Date.today.year - 2004
|
||||
end
|
||||
|
||||
def years_since_asp_member
|
||||
Date.today.year - 2006
|
||||
end
|
||||
|
||||
end
|
||||
2
app/helpers/activations_helper.rb
Normal file
2
app/helpers/activations_helper.rb
Normal file
@@ -0,0 +1,2 @@
|
||||
module ActivationsHelper
|
||||
end
|
||||
160
app/helpers/application_helper.rb
Normal file
160
app/helpers/application_helper.rb
Normal file
@@ -0,0 +1,160 @@
|
||||
# Methods added to this helper will be available to all templates in the application.
|
||||
module ApplicationHelper
|
||||
|
||||
def blv_version
|
||||
featured_product.current_version
|
||||
end
|
||||
|
||||
# ========== DEXTRONET_CORE_HELPER ===========
|
||||
|
||||
def antispam_field
|
||||
hidden_field_tag :magicwand, "you-shall-not-pass", :id => nil
|
||||
end
|
||||
|
||||
def link_to_new_window(name, options, html_options = {})
|
||||
html_options[:onclick] = [html_options[:onclick], "window.open(this.href); return false"].compact.join("; ")
|
||||
link_to(name, options, html_options);
|
||||
end
|
||||
|
||||
def back_button
|
||||
link_to t('txt.common.back'), root_path, :class => "back-header-button history-back"
|
||||
end
|
||||
|
||||
def releases_page_path(product, version = nil)
|
||||
p = product_path(product)+"/#{Settings.releases_code}"
|
||||
p << "?since=#{version}" if version
|
||||
p
|
||||
end
|
||||
|
||||
def submit_button(value, options = {})
|
||||
options[:class] = ["dbtn", options[:class]].compact.join(" ")
|
||||
btn_id = options.delete(:btn_id) || "send"
|
||||
btn_class = ["dbtn-c", options.delete(:btn_class)].compact.join(" ")
|
||||
content_tag(:span, content_tag(:span, submit_tag(value, options), :class => "dbtn-w"), :class => btn_class, :id => btn_id)
|
||||
end
|
||||
|
||||
# tady tyhle paths k product pages by mely byt generovane automaticky
|
||||
def story_path(product)
|
||||
product_path(product)+"/#{Settings.story_code}"
|
||||
end
|
||||
|
||||
def submit_image(*args)
|
||||
options = args.extract_options!
|
||||
|
||||
case args.first
|
||||
when Symbol, String
|
||||
options[:class] = [args.first, options[:class]].compact.join(" ")
|
||||
end
|
||||
|
||||
image_submit_tag("blank.gif", options)
|
||||
end
|
||||
|
||||
def screenshot_path(id)
|
||||
ss = Screenshot.find_by_id(id)
|
||||
ss ? ss.image.url : "/images/blank.gif"
|
||||
end
|
||||
|
||||
# ========== /DEXTRONET_CORE_HELPER ===========
|
||||
|
||||
def more_link_button(product_or_edition, klass = "standard", text = nil)
|
||||
text = t('txt.products.learn_more') unless text
|
||||
|
||||
case product_or_edition
|
||||
when ProductEdition
|
||||
path = product_path(product_or_edition.product)
|
||||
else
|
||||
path = product_path(product_or_edition)
|
||||
end
|
||||
|
||||
link_to text, path, :class => "#{klass}-more image-link"
|
||||
end
|
||||
|
||||
def documentation_path(product)
|
||||
"#{product_path(product)}/#{Settings.documentation_code}"
|
||||
end
|
||||
|
||||
def quick_start_guide_path(product)
|
||||
"#{product_path(product)}/#{Settings.quick_start_guide_code}"
|
||||
end
|
||||
|
||||
def class_reference_path(product)
|
||||
"#{product_path(product)}/#{Settings.class_reference_code}"
|
||||
end
|
||||
|
||||
|
||||
def pricing_path(product)
|
||||
"#{product_path(product)}/#{Settings.pricing_code}"
|
||||
end
|
||||
|
||||
def twitter_url
|
||||
"http://twitter.com/ComponentOwl"
|
||||
end
|
||||
|
||||
def upgrade_path(static_page_code)
|
||||
"/upgrade/#{StaticPage[static_page_code].url_param}"
|
||||
end
|
||||
|
||||
def buy_professional(product)
|
||||
edition = product.edition('professional')
|
||||
buy_link(edition, "buy_professional", t('txt.products.buy_professional', :price => number_to_currency(edition.price)))
|
||||
end
|
||||
|
||||
def buy_standard(product)
|
||||
edition = product.edition('standard')
|
||||
buy_link(edition, "buy_standard", t('txt.products.buy_standard', :price => number_to_currency(edition.price)))
|
||||
end
|
||||
|
||||
def subscription_lists(location_code, product = nil)
|
||||
product_id = product ? product.id : nil
|
||||
lists = SubscriptionLocation[location_code].lists(product_id)
|
||||
product_list = lists.detect {|l| l.product == product }
|
||||
can_deselect = false
|
||||
content = []
|
||||
lists.each do |list|
|
||||
# zatim bude vsecko hidden
|
||||
#if !product || (product && list.product == product) || (product && product_list.nil?)
|
||||
content << hidden_field_tag("subscription[subscription_list_ids][]", list.id, :id => nil)
|
||||
#else
|
||||
# content << check_box_tag("subscription[subscription_list_ids][]", list.id, true, :id => "subscription_subscription_list_ids_#{list.id}")
|
||||
# content << label_tag("subscription_subscription_list_ids_#{list.id}", t('txt.product.send_also', :newsletter => list.name))
|
||||
# can_deselect = true
|
||||
#end
|
||||
end
|
||||
if can_deselect
|
||||
content.insert(0, '<div class="subscription-lists">')
|
||||
content << "</div>"
|
||||
end
|
||||
content.join("\n")
|
||||
end
|
||||
|
||||
def subscribe(type = nil, text = t('txt.common.subscribe'), options = {})
|
||||
btn_class = "subscribe"
|
||||
btn_class << " dbtn-#{type}" if type
|
||||
submit_button(text, options.merge(:btn_class => btn_class))
|
||||
end
|
||||
|
||||
def pricing_licensing?(product_page)
|
||||
product_page.code == "pricing-licensing"
|
||||
end
|
||||
|
||||
def cached_javascripts_base
|
||||
javascript_include_merged :base
|
||||
end
|
||||
|
||||
def cached_javascripts_app
|
||||
javascript_include_merged :app
|
||||
end
|
||||
|
||||
def cached_javascripts_simple
|
||||
javascript_include_merged :simple
|
||||
end
|
||||
|
||||
def cached_stylesheets_base
|
||||
stylesheet_link_merged :base
|
||||
end
|
||||
|
||||
def cached_stylesheets_simple
|
||||
stylesheet_link_merged :simple
|
||||
end
|
||||
|
||||
end
|
||||
2
app/helpers/articles_helper.rb
Normal file
2
app/helpers/articles_helper.rb
Normal file
@@ -0,0 +1,2 @@
|
||||
module ArticlesHelper
|
||||
end
|
||||
17
app/helpers/comics_helper.rb
Normal file
17
app/helpers/comics_helper.rb
Normal file
@@ -0,0 +1,17 @@
|
||||
module ComicsHelper
|
||||
|
||||
def title(comic = nil)
|
||||
comic ||= @comic
|
||||
t('txt.comics.title', :name => comic.name_or_date)
|
||||
end
|
||||
|
||||
def description(comic = nil)
|
||||
comic ||= @comic
|
||||
comic.story.present? ? comic.story : meta_tags.description
|
||||
end
|
||||
|
||||
def sitename
|
||||
t('txt.componentowl_long')
|
||||
end
|
||||
|
||||
end
|
||||
12
app/helpers/download_helper.rb
Normal file
12
app/helpers/download_helper.rb
Normal file
@@ -0,0 +1,12 @@
|
||||
module DownloadHelper
|
||||
|
||||
def quote(testimonial)
|
||||
text = @testimonial ? @testimonial.text : t('txt.download_page.quote_text')
|
||||
author = @testimonial ? @testimonial.author : t('txt.download_page.quote_author')
|
||||
content = ['<div class="quote">']
|
||||
content << "<blockquote>#{text}</blockquote>"
|
||||
content << "<em>#{author}</em>"
|
||||
content << "</div>"
|
||||
content.join("\n")
|
||||
end
|
||||
end
|
||||
12
app/helpers/faqs_helper.rb
Normal file
12
app/helpers/faqs_helper.rb
Normal file
@@ -0,0 +1,12 @@
|
||||
module FaqsHelper
|
||||
|
||||
def faqs_links(products, current_product = nil)
|
||||
content = []
|
||||
content << content_tag(:li, link_to(t("txt.faqs.general_faqs"), general_faqs_path)) if current_product
|
||||
for product in products
|
||||
content << content_tag(:li, link_to("#{product.name} #{t("txt.faqs.faqs")}", product_faqs_path(product))) if product.has_faqs? && product != current_product
|
||||
end
|
||||
return content.join
|
||||
end
|
||||
|
||||
end
|
||||
2
app/helpers/feeds_helper.rb
Normal file
2
app/helpers/feeds_helper.rb
Normal file
@@ -0,0 +1,2 @@
|
||||
module FeedsHelper
|
||||
end
|
||||
2
app/helpers/home_helper.rb
Normal file
2
app/helpers/home_helper.rb
Normal file
@@ -0,0 +1,2 @@
|
||||
module HomeHelper
|
||||
end
|
||||
2
app/helpers/landing_pages_helper.rb
Normal file
2
app/helpers/landing_pages_helper.rb
Normal file
@@ -0,0 +1,2 @@
|
||||
module LandingPagesHelper
|
||||
end
|
||||
21
app/helpers/notifier_helper.rb
Normal file
21
app/helpers/notifier_helper.rb
Normal file
@@ -0,0 +1,21 @@
|
||||
module NotifierHelper
|
||||
|
||||
def survey(survey)
|
||||
keys = survey.keys.sort {|x, y| x.to_i <=> y.to_i }
|
||||
questions = []
|
||||
|
||||
keys.each do |key|
|
||||
item = survey[key]
|
||||
str = "#{key}. #{item[:question]}\n"
|
||||
if item[:answer].is_a? Array
|
||||
str += item[:answer].join(", ")
|
||||
else
|
||||
str += item[:answer] || ""
|
||||
end
|
||||
questions << str
|
||||
end
|
||||
|
||||
questions.join("\n\n")
|
||||
end
|
||||
|
||||
end
|
||||
12
app/helpers/orders_helper.rb
Normal file
12
app/helpers/orders_helper.rb
Normal file
@@ -0,0 +1,12 @@
|
||||
module OrdersHelper
|
||||
|
||||
def buy(bmtid)
|
||||
#submit_image("buy", :name => "PRODUCTID", :value => bmtid, :onclick => "bmtForm(this)")
|
||||
submit_tag("", :name => "PRODUCTID", :"data-value" => bmtid, :onclick => "bmtForm(this)", :class => "buy")
|
||||
end
|
||||
|
||||
def renew(bmtid)
|
||||
#submit_image("renew", :name => "PRODUCTID", :value => bmtid, :onclick => "bmtForm(this)")
|
||||
submit_tag("", :name => "PRODUCTID", :"data-value" => bmtid, :onclick => "bmtForm(this)", :class => "renew")
|
||||
end
|
||||
end
|
||||
58
app/helpers/pad_helper.rb
Normal file
58
app/helpers/pad_helper.rb
Normal file
@@ -0,0 +1,58 @@
|
||||
module PadHelper
|
||||
|
||||
def val(key)
|
||||
@product.pad_value_for_key(key) || Settings.pad[key] || ""
|
||||
end
|
||||
|
||||
def product_link
|
||||
product_url(@product)
|
||||
end
|
||||
|
||||
def buy_link
|
||||
@product.free? ? product_url(@product) : order_url(@product)
|
||||
end
|
||||
|
||||
def pad_link
|
||||
pad_url(@product)
|
||||
end
|
||||
|
||||
def setup_file_link
|
||||
direct_download_url(:filename => @product.file_url)
|
||||
end
|
||||
|
||||
def name
|
||||
@product.name.strip_version
|
||||
end
|
||||
|
||||
def version
|
||||
@product.current_version
|
||||
end
|
||||
|
||||
def release_month
|
||||
@product.current_release.date.strftime("%m")
|
||||
end
|
||||
|
||||
def release_day
|
||||
@product.current_release.date.strftime("%d")
|
||||
end
|
||||
|
||||
def release_year
|
||||
@product.current_release.date.year
|
||||
end
|
||||
|
||||
def price
|
||||
@product.price || 0
|
||||
end
|
||||
|
||||
def size_b
|
||||
@product.setup_file.size
|
||||
end
|
||||
|
||||
def size_kb
|
||||
number_with_precision(@product.setup_file.size.to_f / 1024, :precision => 0)
|
||||
end
|
||||
|
||||
def size_mb
|
||||
number_with_precision(@product.setup_file.size.to_f / 1024 / 1024, :precision => 2)
|
||||
end
|
||||
end
|
||||
2
app/helpers/press_helper.rb
Normal file
2
app/helpers/press_helper.rb
Normal file
@@ -0,0 +1,2 @@
|
||||
module PressHelper
|
||||
end
|
||||
2
app/helpers/product_pages_helper.rb
Normal file
2
app/helpers/product_pages_helper.rb
Normal file
@@ -0,0 +1,2 @@
|
||||
module ProductPagesHelper
|
||||
end
|
||||
35
app/helpers/products_helper.rb
Normal file
35
app/helpers/products_helper.rb
Normal file
@@ -0,0 +1,35 @@
|
||||
module ProductsHelper
|
||||
|
||||
def product_ad(product, options = {}, &block)
|
||||
icon_size = options.delete(:icon) || 24
|
||||
|
||||
options[:class] = ["product-ad", "icon-#{icon_size}", options[:class]].compact.join(" ")
|
||||
options[:onclick] = "location.href = '#{product_path(product)}'"
|
||||
|
||||
content = capture(&block)
|
||||
content = "#{icon(product, icon_size)}#{content}"
|
||||
|
||||
concat content_tag(:div, content, options)
|
||||
end
|
||||
|
||||
def versions_for_select(releases, since = nil)
|
||||
options_for_select(releases.map{|r| r.version if r.has_changelog? && !r.version.include?('Beta') }.compact, since)
|
||||
end
|
||||
|
||||
def download_link_trial_or_free(product)
|
||||
if product.free? || better_splitbutton?
|
||||
download_link(product, "standard-free")
|
||||
else
|
||||
download_link(product, "standard", t('txt.home.free_download'))
|
||||
end
|
||||
end
|
||||
|
||||
def better_slitbutton_buy_link
|
||||
link_to "Buy commercial license with source code from $67", Settings.better_splitbutton_buy_url, :class => "commercial-buy image-link"
|
||||
end
|
||||
|
||||
def better_splitbutton?
|
||||
@product && @product.code == 'better-splitbutton'
|
||||
end
|
||||
|
||||
end
|
||||
2
app/helpers/releases_helper.rb
Normal file
2
app/helpers/releases_helper.rb
Normal file
@@ -0,0 +1,2 @@
|
||||
module ReleasesHelper
|
||||
end
|
||||
2
app/helpers/resources_helper.rb
Normal file
2
app/helpers/resources_helper.rb
Normal file
@@ -0,0 +1,2 @@
|
||||
module ResourcesHelper
|
||||
end
|
||||
11
app/helpers/sitemap_helper.rb
Normal file
11
app/helpers/sitemap_helper.rb
Normal file
@@ -0,0 +1,11 @@
|
||||
module SitemapHelper
|
||||
|
||||
def link(path, default_title)
|
||||
custom_title = @custom_titles.select {|a| a.path == path }.last
|
||||
if custom_title
|
||||
link_to(custom_title.title, path)
|
||||
else
|
||||
link_to(default_title, path)
|
||||
end
|
||||
end
|
||||
end
|
||||
2
app/helpers/subscriptions_helper.rb
Normal file
2
app/helpers/subscriptions_helper.rb
Normal file
@@ -0,0 +1,2 @@
|
||||
module SubscriptionsHelper
|
||||
end
|
||||
2
app/helpers/support_helper.rb
Normal file
2
app/helpers/support_helper.rb
Normal file
@@ -0,0 +1,2 @@
|
||||
module SupportHelper
|
||||
end
|
||||
2
app/helpers/support_requests_helper.rb
Normal file
2
app/helpers/support_requests_helper.rb
Normal file
@@ -0,0 +1,2 @@
|
||||
module SupportRequestsHelper
|
||||
end
|
||||
10
app/helpers/uninstall_helper.rb
Normal file
10
app/helpers/uninstall_helper.rb
Normal file
@@ -0,0 +1,10 @@
|
||||
module UninstallHelper
|
||||
|
||||
#buga> tohle by melo byt jen docasne reseni (vysoce nekonzistentni)
|
||||
def uninstall_issues(product)
|
||||
stdl_issues = ['no-phone-sync', 'no-outlook-sync']
|
||||
issues = UninstallIssue.all
|
||||
issues = issues.delete_if {|r| stdl_issues.include?(r.code) } unless product.is_featured?
|
||||
issues.map {|r| [r.display_name, r.id] }
|
||||
end
|
||||
end
|
||||
78
app/helpers/upgrade_helper.rb
Normal file
78
app/helpers/upgrade_helper.rb
Normal file
@@ -0,0 +1,78 @@
|
||||
module UpgradeHelper
|
||||
|
||||
def pro?
|
||||
!params[:pro].nil?
|
||||
end
|
||||
|
||||
class SurveyFormBuilder < ActionView::Helpers::FormBuilder
|
||||
|
||||
def question(text)
|
||||
inc_questions
|
||||
@template.content_tag(:label, text) + @template.hidden_field_tag(tag_name("question"), text)
|
||||
end
|
||||
|
||||
def answer(type, *args)
|
||||
options = args.extract_options!
|
||||
value = options.delete(:value) || ""
|
||||
|
||||
content = []
|
||||
|
||||
case type
|
||||
when :text_field
|
||||
add_default_name_and_id(options)
|
||||
content << @template.text_field_tag(options.delete(:name), value, options)
|
||||
when :text_area
|
||||
add_default_name_and_id(options)
|
||||
content << @template.text_area_tag(options.delete(:name), value, options)
|
||||
when :check_box
|
||||
[args.first].flatten.each do |value|
|
||||
add_default_name_and_id_for_value(value, options)
|
||||
content << [@template.check_box_tag(options.delete(:name), value, false, options), @template.label_tag(options[:id], value)].join(" ")
|
||||
end
|
||||
when :radio_button
|
||||
[args.first].flatten.each do |value|
|
||||
add_default_name_and_id_for_value(value, options)
|
||||
content << [@template.radio_button_tag(options.delete(:name), value, false, options), @template.label_tag(options[:id], value)].join(" ")
|
||||
end
|
||||
when :select, :combo
|
||||
add_default_name_and_id(options)
|
||||
options[:class] = [options[:class], "combo"].compact.join(" ") if type == :combo
|
||||
content << @template.select_tag(options.delete(:name), @template.options_for_select(args.first, options.delete(:selected)), options)
|
||||
when :combo
|
||||
|
||||
end
|
||||
|
||||
content.join("")
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def add_default_name_and_id(options)
|
||||
options[:name] = tag_name("answer", :multiple => true)
|
||||
options[:id] = tag_id("answer")
|
||||
end
|
||||
|
||||
def add_default_name_and_id_for_value(value, options)
|
||||
pretty_tag_value = value.to_s.gsub(/\s/, "_").gsub(/\W/, "").downcase
|
||||
add_default_name_and_id(options)
|
||||
options[:id] += "_#{pretty_tag_value}"
|
||||
end
|
||||
|
||||
def tag_name(type, options = {})
|
||||
"#{@object_name}[survey][#{@questions}][#{type}]" + (options.has_key?(:multiple) ? '[]' : '')
|
||||
end
|
||||
|
||||
def tag_id(type, value = nil)
|
||||
"#{@object_name}_survey_#{@questions}_#{type}"
|
||||
end
|
||||
|
||||
def inc_questions
|
||||
if @questions
|
||||
@questions = @questions + 1
|
||||
else
|
||||
@questions = 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
2
app/helpers/wp_helper.rb
Normal file
2
app/helpers/wp_helper.rb
Normal file
@@ -0,0 +1,2 @@
|
||||
module WpHelper
|
||||
end
|
||||
146
app/models/activation.rb
Normal file
146
app/models/activation.rb
Normal file
@@ -0,0 +1,146 @@
|
||||
class Activation < ActiveRecord::Base
|
||||
|
||||
belongs_to :order
|
||||
|
||||
attr_accessor :result
|
||||
|
||||
validate :validate_serial_key, :validate_attributes, :validate_limit
|
||||
|
||||
after_create :generate_final_judgement
|
||||
|
||||
named_scope :by_computer_id, lambda { |computer_id| { :conditions => { :computer_id => computer_id } } }
|
||||
named_scope :group_computer_id_except, lambda { |computer_id| { :group => "computer_id", :conditions => ["computer_id != ?", computer_id] } }
|
||||
|
||||
GENERATOR_DIR = "#{Rails.root}/#{Settings.private_dir}"
|
||||
GENERATOR = "BLVLicenseGenerator.exe"
|
||||
|
||||
RESULTS = {
|
||||
"success" => {
|
||||
:response => 0,
|
||||
:message => :success
|
||||
},
|
||||
"invalid_serial_key" => {
|
||||
:response => 1,
|
||||
:message => :invalid_serial_key,
|
||||
:message_url => :support_url
|
||||
},
|
||||
"limit_reached" => {
|
||||
:response => 2,
|
||||
:message => :limit_reached,
|
||||
:message_url => :buy_url
|
||||
},
|
||||
"missing_attributes" => {
|
||||
:response => 3,
|
||||
:message => :other_error_missing_attributes,
|
||||
:message_url => :support_url
|
||||
},
|
||||
"generator_error" => {
|
||||
:response => 3,
|
||||
:message => :other_error_generator_error,
|
||||
:message_url => :support_url
|
||||
}
|
||||
}
|
||||
|
||||
def before_validation
|
||||
self.result = "success"
|
||||
self.order = Order.find_by_license_key(serial_key)
|
||||
end
|
||||
|
||||
def validate_attributes
|
||||
missing_attributes! if missing_attributes?
|
||||
end
|
||||
|
||||
def validate_serial_key
|
||||
@valid_serial_key = order.present?
|
||||
invalid_serial_key! unless @valid_serial_key
|
||||
end
|
||||
|
||||
def validate_limit
|
||||
unless invalid_serial_key?
|
||||
@within_limit = within_limit?
|
||||
limit_reached! unless @within_limit
|
||||
end
|
||||
end
|
||||
|
||||
def computer_ids_within_limit?
|
||||
computer_ids_limit = Settings.activation_limits["activations_#{BmtOrder.find(order.id).bmtID}"].to_i
|
||||
order.activations.group_computer_id_except(computer_id).count("DISTINCT computer_id") < computer_ids_limit
|
||||
end
|
||||
|
||||
def within_limit?
|
||||
!new_record? || (!invalid_serial_key? && computer_ids_within_limit?)
|
||||
end
|
||||
|
||||
def missing_attributes?
|
||||
serial_key.nil? || build.blank? || product.blank? || computer_id.blank?
|
||||
end
|
||||
|
||||
def missing_attributes!
|
||||
self.result = "missing_attributes"
|
||||
errors.add_to_base "Missing attributes"
|
||||
end
|
||||
|
||||
def limit_reached!
|
||||
self.result = "limit_reached"
|
||||
errors.add_to_base "Limit reached."
|
||||
end
|
||||
|
||||
def invalid_serial_key!
|
||||
self.result = "invalid_serial_key"
|
||||
errors.add_to_base "Invalid serial key."
|
||||
end
|
||||
|
||||
def invalid_serial_key?
|
||||
@valid_serial_key == false
|
||||
end
|
||||
|
||||
def to_xml(options = {})
|
||||
h = RESULTS[result]
|
||||
h = h.merge({
|
||||
:message => I18n.t("txt.activation.#{h[:message]}"),
|
||||
:message_url => (options.delete(h[:message_url]) || ""),
|
||||
:final_judgement => (final_judgement || "")
|
||||
})
|
||||
|
||||
h.to_xml(:root => "activation", :dasherize => false)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def generate_final_judgement
|
||||
#Format:
|
||||
# ### license generator source file ###
|
||||
# [1] Serial key , eg. "ABCDEF123456"
|
||||
# [2] Computer ID , eg. "f54f1525a456ad867b65ee9ec8b0c83de44b3dc7"
|
||||
# [3] IP Address , eg. "127.0.0.1"
|
||||
# [4] Activation ID , eg. "5"
|
||||
# [5] Product , eg. "BLV"
|
||||
# [6] Build , eg. "1"
|
||||
source_file_data = ["### license generator source file ###"]
|
||||
source_file_data << serial_key
|
||||
source_file_data << computer_id
|
||||
source_file_data << ip
|
||||
source_file_data << id
|
||||
source_file_data << product
|
||||
source_file_data << build
|
||||
|
||||
@source_file_name = "license_source_file_#{id}.txt"
|
||||
@source_file_path = File.join(GENERATOR_DIR, @source_file_name)
|
||||
File.open(@source_file_path, 'a') {|f| f.write(source_file_data.join("\n")) }
|
||||
|
||||
generator_path = File.join(GENERATOR_DIR, GENERATOR)
|
||||
key = `mono #{generator_path} #{@source_file_path}`
|
||||
FileUtils.rm_r(@source_file_path)
|
||||
|
||||
match = key.match /^(ok:\s*)(.+)/i
|
||||
if match
|
||||
update_attribute(:final_judgement, match[2].strip)
|
||||
else
|
||||
self.final_judgement = key.strip
|
||||
self.result = "generator_error"
|
||||
destroy
|
||||
FailedActivation.create_from_activation(self)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
47
app/models/bmt_license_key.rb
Normal file
47
app/models/bmt_license_key.rb
Normal file
@@ -0,0 +1,47 @@
|
||||
class BmtLicenseKey
|
||||
|
||||
attr_accessor :license_key, :error
|
||||
|
||||
ATTEMPTS = 5
|
||||
|
||||
def initialize
|
||||
@attempt = 0
|
||||
end
|
||||
|
||||
def generate!
|
||||
@attempt += 1
|
||||
self.license_key = Array.new(16) { rand(2) == 0 ? (rand(90-65) + 65).chr : (rand(7) + 50).chr }.join.gsub(/[IO]/, "X")
|
||||
existing_license_key = Order.find_by_license_key(license_key)
|
||||
if existing_license_key && @attempt < ATTEMPTS
|
||||
generate!
|
||||
elsif existing_license_key && @attempt == ATTEMPTS
|
||||
attempts_failed!
|
||||
end
|
||||
license_key
|
||||
end
|
||||
|
||||
def attempts_failed!
|
||||
self.license_key = nil
|
||||
@attempts_failed = true
|
||||
end
|
||||
|
||||
def attempts_failed?
|
||||
@attempts_failed == true
|
||||
end
|
||||
|
||||
def to_xml(options = {})
|
||||
xml = Builder::XmlMarkup.new
|
||||
xml.instruct!
|
||||
xml.response do
|
||||
xml.registrationkey do
|
||||
if attempts_failed?
|
||||
xml.errorcode 1
|
||||
xml.errormessage "The attempts to generate unique license key failed (#{ATTEMPTS} times)."
|
||||
else
|
||||
xml.keydata license_key
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
82
app/models/bmt_order.rb
Normal file
82
app/models/bmt_order.rb
Normal file
@@ -0,0 +1,82 @@
|
||||
class BmtOrder < Order
|
||||
|
||||
require 'cgi'
|
||||
|
||||
attr_accessor :ordernotification
|
||||
attr_writer :product_id, :customer_email, :customer_first_name, :customer_last_name, :customer_company
|
||||
|
||||
def before_validation
|
||||
self.order_attributes ||= ordernotification
|
||||
self.orderable = BmtProduct.find(product_id)
|
||||
self.license_key = license_key_from_attributes
|
||||
|
||||
customer = Customer.find_by_email(customer_email)
|
||||
if customer
|
||||
self.customer = customer
|
||||
else
|
||||
self.customer_attributes = {
|
||||
:first_name => customer_first_name,
|
||||
:last_name => customer_last_name,
|
||||
:email => customer_email,
|
||||
:company => customer_company,
|
||||
:customer_attributes => customer_attributes,
|
||||
:customer_ref => customer_ref
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
def xml_response
|
||||
if errors.any?
|
||||
{ :ordernotification => { :errorcode => 1, :errormessage => errors.full_messages.join("\n") } }.to_xml(:root => "response")
|
||||
else
|
||||
{ :ordernotification => "" }.to_xml(:root => "response")
|
||||
end
|
||||
end
|
||||
|
||||
def license_key_from_attributes
|
||||
if order_attributes[:orderitem][:registrationkeys].is_a?(Hash)
|
||||
order_attributes[:orderitem][:registrationkeys][:keydata]
|
||||
else
|
||||
order_attributes[:orderitem][:registrationkeys]
|
||||
end
|
||||
end
|
||||
|
||||
def customer_ref
|
||||
if order_attributes
|
||||
@customer_ref ||= order_attributes[:orderparameters]
|
||||
else
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
def product_id
|
||||
@product_id ||= orderable ? orderable.bmtID : order_attributes[:orderitem][:productid]
|
||||
end
|
||||
|
||||
alias :bmtID :product_id
|
||||
|
||||
def customer_email
|
||||
@customer_email ||= order_attributes[:customer][:billing][:email]
|
||||
end
|
||||
|
||||
def customer_first_name
|
||||
@customer_first_name ||= order_attributes[:customer][:billing][:firstname]
|
||||
end
|
||||
|
||||
def customer_last_name
|
||||
@customer_last_name ||= order_attributes[:customer][:billing][:lastname]
|
||||
end
|
||||
|
||||
def customer_company
|
||||
@customer_company ||= order_attributes[:customer][:billing][:company]
|
||||
end
|
||||
|
||||
def customer_attributes
|
||||
if order_attributes
|
||||
@customer_attributes ||= order_attributes[:customer]
|
||||
else
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
17
app/models/bmt_product.rb
Normal file
17
app/models/bmt_product.rb
Normal file
@@ -0,0 +1,17 @@
|
||||
class BmtProduct
|
||||
|
||||
def self.find(bmtID)
|
||||
product_edition = ProductEdition.find_by_bmtID(bmtID)
|
||||
return product_edition if product_edition
|
||||
|
||||
product = Product.find_by_bmtID(bmtID)
|
||||
return product if product
|
||||
|
||||
product_offer = ProductOffer.find_by_bmtID(bmtID)
|
||||
return product_offer if product_offer
|
||||
|
||||
product_upgrade = ProductUpgrade.find_by_bmtID(bmtID)
|
||||
return product_upgrade if product_upgrade
|
||||
end
|
||||
|
||||
end
|
||||
64
app/models/comic.rb
Normal file
64
app/models/comic.rb
Normal file
@@ -0,0 +1,64 @@
|
||||
class Comic < ActiveRecord::Base
|
||||
|
||||
acts_as_cute_admin :display_name => :number, :order_scope => :publish_on
|
||||
|
||||
before_validation_on_create :assign_number
|
||||
|
||||
validates_presence_of :number
|
||||
validates_uniqueness_of :number
|
||||
|
||||
if Rails.env.production? || Rails.env.preproduction?
|
||||
|
||||
has_attached_file :image,
|
||||
:storage => :s3,
|
||||
:s3_credentials => "#{Rails.root}/config/s3.yml",
|
||||
:s3_headers => { 'Expires' => 1.year.from_now.httpdate },
|
||||
:url => ':s3_url',
|
||||
:path => "comics/:id/:basename_:style_:timestamp.:extension",
|
||||
:styles => { :web => "930x930>" }
|
||||
|
||||
else
|
||||
|
||||
has_attached_file :image, :path => ":rails_root/public/system/comics/:id/:basename_:style.:extension",
|
||||
:url => "/system/comics/:id/:basename_:style.:extension", :styles => { :web => "930x930>" }
|
||||
|
||||
end
|
||||
|
||||
named_scope :published, lambda { { :conditions => ["publish_on <= ?", Date.today] } }
|
||||
named_scope :find_latest, :order => "publish_on DESC", :limit => 10
|
||||
named_scope :find_previous, lambda { |comic| { :conditions => ["publish_on < ?", comic.publish_on],
|
||||
:order => "publish_on DESC", :limit => 1 } }
|
||||
named_scope :find_next, lambda { |comic| { :conditions => ["publish_on > ?", comic.publish_on],
|
||||
:order => "publish_on ASC", :limit => 1 } }
|
||||
named_scope :ordered, :order => "publish_on"
|
||||
named_scope :reverse_ordered, :order => "publish_on DESC"
|
||||
|
||||
def self.latest
|
||||
find_latest.published.first
|
||||
end
|
||||
|
||||
def to_param
|
||||
number.to_s
|
||||
end
|
||||
|
||||
def assign_number
|
||||
self.number = get_new_number unless number.present? && number > 0
|
||||
end
|
||||
|
||||
def get_new_number
|
||||
self.class.find_latest.any? ? self.class.find_latest.first.number + 1 : 1
|
||||
end
|
||||
|
||||
def previous
|
||||
self.class.find_previous(self).published.first
|
||||
end
|
||||
|
||||
def next
|
||||
self.class.find_next(self).published.first
|
||||
end
|
||||
|
||||
def name_or_date
|
||||
name.present? ? name : I18n.l(publish_on, :format => :cute_with_dayname)
|
||||
end
|
||||
|
||||
end
|
||||
9
app/models/failed_activation.rb
Normal file
9
app/models/failed_activation.rb
Normal file
@@ -0,0 +1,9 @@
|
||||
class FailedActivation < ActiveRecord::Base
|
||||
|
||||
attr_accessor :order_id
|
||||
|
||||
def self.create_from_activation(activation)
|
||||
create(activation.attributes.merge(:result => activation.result))
|
||||
end
|
||||
|
||||
end
|
||||
161
app/models/multiple_license_generator.rb
Normal file
161
app/models/multiple_license_generator.rb
Normal file
@@ -0,0 +1,161 @@
|
||||
class MultipleLicenseGenerator
|
||||
|
||||
#require 'net/http'
|
||||
#require 'uri'
|
||||
|
||||
attr_accessor :license_key, :generated_licenses
|
||||
|
||||
LICENSE_KEY_XML = <<eos
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<request>
|
||||
<registrationkey>
|
||||
<keycount>1</keycount>
|
||||
<orderid>%{time}</orderid>
|
||||
<ordernumber>%{time}</ordernumber>
|
||||
<customer>
|
||||
<billing>
|
||||
<company>Component Owl</company>
|
||||
<lastname>Component</lastname>
|
||||
<firstname>Owl</firstname>
|
||||
<email>support@componentowl.com</email>
|
||||
</billing>
|
||||
<shipping>
|
||||
<company>Component Owl</company>
|
||||
<lastname>Component</lastname>
|
||||
<firstname>Owl</firstname>
|
||||
<email>support@componentowl.com</email>
|
||||
</shipping>
|
||||
<registername>Component Owl</registername>
|
||||
</customer>
|
||||
<orderitem>
|
||||
<productid>%{bmt_id}</productid>
|
||||
<quantity>1</quantity>
|
||||
</orderitem>
|
||||
<ipaddress>127.0.0.1</ipaddress>
|
||||
<source>Internal Generator</source>
|
||||
</registrationkey>
|
||||
</request>
|
||||
eos
|
||||
|
||||
ORDER_XML = <<eos
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<request>
|
||||
<ordernotification>
|
||||
<orderid>%{time}</orderid>
|
||||
<ordernumber>%{time}</ordernumber>
|
||||
<customer>
|
||||
<billing>
|
||||
<company>Component Owl</company>
|
||||
<lastname>Component</lastname>
|
||||
<firstname>Owl</firstname>
|
||||
<email>support@componentowl.com</email>
|
||||
</billing>
|
||||
<shipping>
|
||||
<company>Component Owl</company>
|
||||
<lastname>Component</lastname>
|
||||
<firstname>Owl</firstname>
|
||||
<email>support@componentowl.com</email>
|
||||
</shipping>
|
||||
<registername>Component Owl</registername>
|
||||
</customer>
|
||||
<orderitem>
|
||||
<itemnumber>%{time}</itemnumber>
|
||||
<productid>%{bmt_id}</productid>
|
||||
<productname>%{product_name}</productname>
|
||||
<quantity>1</quantity>
|
||||
<registrationkeys>
|
||||
<keydata keynumber="1" keypart="1">%{license_key}</keydata>
|
||||
</registrationkeys>
|
||||
</orderitem>
|
||||
<orderdate>%{today}</orderdate>
|
||||
<ipaddress>127.0.0.1</ipaddress>
|
||||
</ordernotification>
|
||||
</request>
|
||||
eos
|
||||
|
||||
def initialize(*args)
|
||||
@licenses_per_product = args.first
|
||||
self.generated_licenses = []
|
||||
end
|
||||
|
||||
def self.generate(licenses_per_product = 51)
|
||||
inst = new(licenses_per_product)
|
||||
inst.generate_and_deliver
|
||||
end
|
||||
|
||||
def generate_and_deliver
|
||||
ProductEdition.ordered.each do |product_edition|
|
||||
@product = product_edition
|
||||
license = { :product => @product, :license_keys => [] }
|
||||
@licenses_per_product.times { license[:license_keys] << request_key }
|
||||
generated_licenses << license
|
||||
end
|
||||
|
||||
deliver_licenses!
|
||||
end
|
||||
|
||||
def request_key
|
||||
bmt_license_key = BmtLicenseKey.new
|
||||
self.license_key = bmt_license_key.generate!
|
||||
|
||||
params = Hash.from_xml(format(ORDER_XML)).with_indifferent_access
|
||||
bmt_order = BmtOrder.new(params[:request])
|
||||
bmt_order.save
|
||||
|
||||
license_key
|
||||
end
|
||||
|
||||
=begin
|
||||
def request_key
|
||||
url = URI.parse('http://localhost:3000/products/generate_license?t=' + Settings.api_token)
|
||||
request = Net::HTTP::Post.new(url.path + '?' + url.query)
|
||||
request.content_type = "application/xml"
|
||||
request.body = format(LICENSE_KEY_XML)
|
||||
response = Net::HTTP.start(url.host, url.port) { |http| http.request(request) }
|
||||
doc = Nokogiri::XML(response.body)
|
||||
error_node = doc.search("//errormessage").first
|
||||
if error_node
|
||||
raise "Multiple license generator failed with message (#{@product.id}): #{error_node.content}"
|
||||
else
|
||||
keydata_node = doc.search("//keydata").first
|
||||
if keydata_node
|
||||
return keydata_node.content
|
||||
else
|
||||
raise "License key is missing (#{@product.id})"
|
||||
end
|
||||
end
|
||||
end
|
||||
=end
|
||||
|
||||
def format(text)
|
||||
formatted_text = "#{text}"
|
||||
text.scan(/%\{([^\}]+)\}/).each do |interpolation|
|
||||
method = interpolation.first
|
||||
formatted_text.gsub!("%{#{method}}", send(method)) if respond_to?(method)
|
||||
end
|
||||
formatted_text
|
||||
end
|
||||
|
||||
def time
|
||||
(rand(1<<64) + Time.now.to_i).to_s
|
||||
end
|
||||
|
||||
def today
|
||||
Date.today.to_s
|
||||
end
|
||||
|
||||
def bmt_id
|
||||
@product.bmtID.to_s
|
||||
end
|
||||
|
||||
def product_name
|
||||
@product.name
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def deliver_licenses!
|
||||
Notifier.deliver_licenses!(generated_licenses)
|
||||
end
|
||||
|
||||
end
|
||||
50
app/models/notifier.rb
Normal file
50
app/models/notifier.rb
Normal file
@@ -0,0 +1,50 @@
|
||||
class Notifier < ActionMailer::Base
|
||||
|
||||
helper :application, :notifier
|
||||
default_url_options[:host] = Settings.host
|
||||
|
||||
def licenses(licenses)
|
||||
subject "ComponentOwl.com - Generated Licenses"
|
||||
from Settings.no_email
|
||||
recipients Settings.feedback_email
|
||||
sent_on Time.now
|
||||
content_type "text/plain"
|
||||
body :licenses => licenses
|
||||
end
|
||||
|
||||
def survey(survey)
|
||||
subject I18n.t('txt.survey.email_subject')
|
||||
from "#{survey.full_name} <#{survey.current_email}>"
|
||||
recipients Settings.feedback_email
|
||||
sent_on Time.now
|
||||
content_type "text/plain"
|
||||
body :survey => survey
|
||||
end
|
||||
|
||||
def recommend(email, survey)
|
||||
subject I18n.t('txt.survey.recommend_email_subject', :name => survey.full_name)
|
||||
from "#{survey.full_name} <#{survey.current_email}>"
|
||||
recipients email
|
||||
sent_on Time.now
|
||||
content_type "text/plain"
|
||||
body :survey => survey
|
||||
end
|
||||
|
||||
def claim_upgrade(survey)
|
||||
subject I18n.t('txt.survey.free_upgrade_email_subject')
|
||||
from "#{survey.full_name} <#{survey.current_email}>"
|
||||
recipients Settings.feedback_email
|
||||
sent_on Time.now
|
||||
content_type "text/plain"
|
||||
body :survey => survey
|
||||
end
|
||||
|
||||
def license_key_error(license_key)
|
||||
subject "Generate license for order #{license_key.order_id} failed!"
|
||||
from "Dextronet - License Key Error <error@dextronet.com>"
|
||||
recipients Settings.license_key_error_email
|
||||
sent_on Time.now
|
||||
content_type "text/plain"
|
||||
body :license_key => license_key
|
||||
end
|
||||
end
|
||||
113
app/stylesheets/base.less
Normal file
113
app/stylesheets/base.less
Normal file
@@ -0,0 +1,113 @@
|
||||
@standard_fonts: 'trebuchet ms', sans-serif;
|
||||
|
||||
* { margin: 0; padding: 0; }
|
||||
html { height: 100%; }
|
||||
body { height: 100%; font-size: 14px; color: #000; text-align: center; }
|
||||
|
||||
a img { border: none; }
|
||||
|
||||
a {
|
||||
color: #825900; outline: none;
|
||||
:hover { color: #000; }
|
||||
:active { color: #ab7500; }
|
||||
}
|
||||
|
||||
ul, li { list-style: none; }
|
||||
|
||||
.left, .subleft { float: left; }
|
||||
.right, .subright { float: right; }
|
||||
.clear { clear: both; }
|
||||
.nowrap { white-space: nowrap; }
|
||||
|
||||
.underline { text-decoration: underline; }
|
||||
|
||||
input[type=text], input[type=password], textarea, select { padding: 2px; border: 1px solid; -moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px;
|
||||
background-color: #fff; border-color: #abadb3 #dbdfe6 #e3e9ef #e2e3ea; }
|
||||
input[type=text]:focus, input[type=password]:hover, input[type=password]:focus, input[type=text]:hover, textarea:focus, textarea:hover, select:focus, select:hover {
|
||||
border-color: #d6a140 #efd9b2 #f3e3c6 #f2e1c1;
|
||||
}
|
||||
input { border-width: 1px; } // IE6
|
||||
input { font-size: 13px; }
|
||||
|
||||
input.stressed { border-color: #e0ad50; }
|
||||
input.stressed:focus, input.stressed:hover { border-color: #cd8d19; }
|
||||
|
||||
.latest_from_blog, .image-link { text-indent: -9999em; }
|
||||
|
||||
.image-link { display: block; }
|
||||
|
||||
.inline-label-focus { color: #000 !important; }
|
||||
.inline-label { color: #85878d; }
|
||||
|
||||
ul.common, .answer ul {
|
||||
li { padding: 2px 0 3px 23px; background: url(/images/arrow-bullet.gif) 4px 5px no-repeat; }
|
||||
ul li { background-image: url(/images/arrow2.gif); }
|
||||
}
|
||||
ul.checklist li { background: url(/images/icons/tick.gif) 0 0 no-repeat !important; padding: 0 0 10px 23px; }
|
||||
ol.common {
|
||||
margin-left: 22px;
|
||||
li { list-style-type: decimal; padding-bottom: 6px; }
|
||||
}
|
||||
|
||||
.testimonial {
|
||||
margin: 20px 15px 0; padding: 10px 0 0; background: url(/images/testimonial.gif) no-repeat; font-size: 12px;
|
||||
blockquote { margin: 0; padding: 0 12px 2px; text-align: justify; font-style: italic; background: #f9f0da; }
|
||||
em { display: block; padding: 15px 20px 0 100px; font-size: .9em; color: #825900; font-weight: bold; font-style: normal;
|
||||
background: url(/images/testimonial.gif) 100% 0 no-repeat; }
|
||||
}
|
||||
|
||||
input.name, input.email { background-position: 4px 50%; background-repeat: no-repeat; padding-left: 24px; }
|
||||
input.name { width: 150px; background-image: url(/images/icons/user.gif); }
|
||||
input.email { width: 150px; background-image: url(/images/icons/mail.gif); }
|
||||
textarea.message { width: 330px; height: 72px; padding-left: 24px;
|
||||
background-image: url(/images/icons/pencil.gif); background-position: 4px 2px; background-repeat: no-repeat; }
|
||||
|
||||
input.required, textarea.required { border-color: #dea110 #f1c354 #f2d58f #f2d58f !important; background-color: #fff8e9; }
|
||||
|
||||
input { font-size: 13px; }
|
||||
textarea { font-family: 'trebuchet ms', sans-serif; font-size: 12px; }
|
||||
|
||||
.popup-link {
|
||||
padding-right: 13px; background: url(/images/icons/arrow-popup.gif) 100% 50% no-repeat;
|
||||
}
|
||||
|
||||
.sharethis {
|
||||
a { color: #1c6e35; }
|
||||
a:hover { color: #000; }
|
||||
}
|
||||
|
||||
|
||||
hr { border: 0; height: 1px; color: #a8906b; background-color: #a8906b; }
|
||||
|
||||
.contact-form {
|
||||
text-align: left;
|
||||
fieldset { padding: 0; border-width: 0; }
|
||||
legend { padding: 0 5px; text-align: center; }
|
||||
label { display: block; }
|
||||
input, textarea { margin-bottom: 15px; }
|
||||
select { width: 172px; }
|
||||
.ufd { margin-bottom: 15px !important; }
|
||||
.message { width: 360px; height: 140px; }
|
||||
.submit { text-align: center; margin-top: 5px; }
|
||||
.sent-notice { padding: 5px; background: #fdf8a3; font-weight: bold; font-size: 12px; }
|
||||
}
|
||||
|
||||
.dbtn-c { border-bottom: 1px solid #ecdfb9; border-right: 1px solid #ecdfb9; display: inline-block; }
|
||||
.dbtn-w { background: #efe5c6; border-color: #ac995e #9f8d55 #9f8d55 #ac995e; border-style: solid; border-width: 1px; display: block; height: 30px; }
|
||||
.dbtn { background: url(/images/dbtn.png) repeat-x; border: none; color: #000000; cursor: pointer; font: 15px arial, sans-serif; height: 30px; margin: 0; outline: none;
|
||||
vertical-align: top; padding-left: 5px; padding-right: 5px; }
|
||||
.dbtn:active { background: #decd9b; }
|
||||
|
||||
.dbtn-hilight { border-color: #cfe3a6; }
|
||||
.dbtn-hilight .dbtn-w { background: #e8f2d3; border-color: #9bc842 #84b12a #84b12a #9bc842; }
|
||||
.dbtn-hilight .dbtn { background-image: url(/images/dbtn-hilight.png); }
|
||||
.dbtn-hilight .dbtn:active { background: #bad782; }
|
||||
|
||||
.dbtn-small .dbtn-w { height: 23px; }
|
||||
.dbtn-small .dbtn { font-size: 12px; height: 23px; }
|
||||
|
||||
a.dbtn { display: block; height: 30px; line-height: 30px; text-decoration: none; padding-left: 15px; padding-right: 15px; }
|
||||
|
||||
.small-button { padding: 4px 7px; background: #efe5c6; }
|
||||
|
||||
|
||||
26
app/stylesheets/headings.less
Normal file
26
app/stylesheets/headings.less
Normal file
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* CSS classes with heading meaning + h1, h2 and h3
|
||||
* Headings below h3 are considered a part of standard fonts (main.less)
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
@heading_fonts: 'arial', sans-serif;
|
||||
|
||||
h1, h2, h3, .heading { font-family: @heading_fonts; font-weight: bold; }
|
||||
|
||||
.section-info { font-weight: bold; font-family: @heading_fonts; }
|
||||
|
||||
.sitemap-content { h2 { font-size: 20px; } }
|
||||
|
||||
.pr-content {
|
||||
h2 { font-size: 22px; }
|
||||
}
|
||||
|
||||
.static-content {
|
||||
h2 { font-size: 23px; }
|
||||
h3 { font-size: 18px; }
|
||||
}
|
||||
|
||||
.subscribe-content {
|
||||
h2 { font-size: 34px; }
|
||||
}
|
||||
601
app/stylesheets/main.less
Normal file
601
app/stylesheets/main.less
Normal file
@@ -0,0 +1,601 @@
|
||||
@page_width: 930px;
|
||||
@standard_fonts: 'arial', sans-serif;
|
||||
|
||||
body { font-family: @standard_fonts; background: #fefefe url(/images/bg.png) 0 0 repeat-x; }
|
||||
|
||||
.standard-buy {
|
||||
float: left; width: 193px; height: 44px; margin-top: 9px; background: url(/images/button-pricing.gif) no-repeat;
|
||||
:hover { background-position: 0 -44px; }
|
||||
}
|
||||
|
||||
.commercial-buy {
|
||||
float: left; width: 214px; height: 62px; background: url(/images/button-buy-commercial-license.gif) no-repeat;
|
||||
:hover { background-position: 0 -62px; }
|
||||
}
|
||||
|
||||
.standard-more {
|
||||
float: left; width: 195px; height: 62px; margin-right: 12px; background: url(/images/button-more.gif) no-repeat;
|
||||
:hover { background-position: 0 -62px; }
|
||||
}
|
||||
|
||||
.standard-download {
|
||||
float: left; width: 214px; height: 62px; margin-right: 12px; background: url(/images/button-download.gif) no-repeat;
|
||||
:hover { background-position: 0 -62px; }
|
||||
}
|
||||
|
||||
.standard-free-download {
|
||||
float: left; width: 214px; height: 62px; margin-right: 12px; background: url(/images/button-free-download.gif) no-repeat;
|
||||
:hover { background-position: 0 -62px; }
|
||||
}
|
||||
|
||||
input.buy, input.renew {
|
||||
width: 65px; height: 31px; margin: 5px 1px 5px 5px; border: 0; background: url(/images/button-buy-small.gif) 0 0 no-repeat;
|
||||
}
|
||||
input.renew { margin-right: 5px; background-image: url(/images/button-renew.gif); }
|
||||
|
||||
.home-static {
|
||||
h3 { font-family: georgia, serif; margin: 35px 0 15px; font-size: 26px; font-weight: normal; }
|
||||
h3 strong { padding: 0 5px 0 3px; font-weight: normal;
|
||||
background-image: url(/images/subhd-lb.gif), url(/images/subhd-rb.gif), url(/images/subhd-bg.gif);
|
||||
background-position: 0 6px, 100% 6px, 0 6px; background-repeat: no-repeat, no-repeat, repeat-x; }
|
||||
p { margin: 15px 0; }
|
||||
.sharethis { margin-top: 40px; }
|
||||
.lists { overflow: hidden; width: 100%; }
|
||||
.list-l { float: left; width: 440px; }
|
||||
.list-r { float: right; width: 450px; }
|
||||
.buttons-hp { margin-top: 0 !important; }
|
||||
}
|
||||
|
||||
.compatiblehd { font-size: 20px !important; }
|
||||
.compatiblelists { overflow: hidden; width: 100%; }
|
||||
.compatiblelist li { padding-bottom: 8px; }
|
||||
.compatiblelist .logo { float: left; padding-right: 15px; height: 65px; }
|
||||
.compatiblelist .dotnet { padding-top: 11px; }
|
||||
.compatiblelist .vs { padding-top: 2px; }
|
||||
|
||||
.tellinghd { font-style: italic; margin-top: 0 !important; }
|
||||
.tellingct { width: 100%; overflow: hidden; }
|
||||
.tellingcnt { width: 635px; float: left; }
|
||||
.tellingct .testimonial { float: right; width: 240px; }
|
||||
|
||||
.testimonial-wide { padding: 8px 0 8px 15px; border: 1px solid #a8906b; border-left: none; border-right: none;
|
||||
font-family: georgia, serif; font-size: 16px; margin: 30px 0 35px; background: #fffbf4; }
|
||||
|
||||
.buttons-hp { overflow: hidden; width: 100%; border: 1px solid #b4e9fd; border-left: none; border-right: none;
|
||||
padding: 12px; background: #f6fcff; position: relative; margin-top: 15px; }
|
||||
.logos {
|
||||
margin-top: 5px;
|
||||
img { margin-left: 30px; vertical-align: middle; }
|
||||
}
|
||||
.buttons-hp .logos { float: left; padding-left: 5px; margin-top: 14px; }
|
||||
.hp-wrap {
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
margin-top: 15px;
|
||||
iframe { float: right; margin-right: 25px; }
|
||||
}
|
||||
.buttons-hp-vertical {
|
||||
float: left; text-align: center; width: 250px; margin-left: 25px; margin-top: 20px;
|
||||
padding: 15px;
|
||||
a { float: none; margin: 0 auto 15px; }
|
||||
.logos {
|
||||
float: none; padding: 0; margin: 0 auto;
|
||||
}
|
||||
img { margin: 0 10px; }
|
||||
}
|
||||
|
||||
.hpline { padding: 0; border: none; height: 1px; margin: 35px 0 0; background-color: #b4e9fd; }
|
||||
.sshd { font-size: 20px !important; padding-left: 8px; margin: 0; }
|
||||
|
||||
.ending { margin-bottom: 7px !important; }
|
||||
.darrows { position: relative; width: 175px; height: 54px; z-index: 2;
|
||||
background: url(/images/arrows.png) no-repeat; margin: 0 0 -7px 30px; }
|
||||
|
||||
.homehd { font-family: georgia, serif; font-size: 34px; text-align: center; font-weight: normal;
|
||||
margin: 14px 0 10px; line-height: 39px; }
|
||||
.homehd span { padding: 0 29px 0 23px;
|
||||
background-image: url(/images/homehd-lb.gif), url(/images/homehd-rb.gif), url(/images/homehd-bg.gif);
|
||||
background-position: 0 0, 100% 0, 0 0; background-repeat: no-repeat, no-repeat, repeat-x; }
|
||||
.homeph { text-align: center; font-size: 16px; }
|
||||
.ss-overview { margin: 0 0 10px; }
|
||||
|
||||
.nav {
|
||||
height: 30px; width: 100%; border-bottom: 1px solid #a8906b; margin-bottom: 20px;
|
||||
a { color: #825900; text-decoration: none; padding: 6px 20px 7px; }
|
||||
a:hover, a.current { color: #000; }
|
||||
li { float: left; text-transform: uppercase; line-height: 31px; font-size: 12px; font-weight: bold; }
|
||||
.current { border: 1px solid #a8906b; border-bottom: none; background: #fbf1e0; }
|
||||
}
|
||||
|
||||
.product-content {
|
||||
overflow: hidden; height: 100%;
|
||||
h1 {
|
||||
font-size: 36px; font-weight: normal; letter-spacing: -1px; margin: 15px 0 0;
|
||||
.subheading { font-size: 28px; margin-bottom: 7px; }
|
||||
}
|
||||
.section-info { margin: 0 0 30px; font-size: 14px; }
|
||||
.sides { overflow: hidden; width: 100%; margin-bottom: 30px; }
|
||||
.right { width: 686px; }
|
||||
.left { width: 214px; font-size: 12px; }
|
||||
.compatibility, .newsletter, .sharethis-ct, div.screenshot {
|
||||
margin-top: 12px; padding-top: 12px; border-top: 1px dotted #a8906b;
|
||||
img { margin: 5px; }
|
||||
}
|
||||
.documentation p { font-weight: bold; padding-top: 6px; }
|
||||
.screenshot { text-align: center; }
|
||||
.fb-like {
|
||||
position: relative; margin-top: 10px; height: 75px; overflow: hidden; background-color: #ECEFF6; border: 1px solid #9DA1C4;
|
||||
iframe { border: none !important; margin: -1px 0 0 -1px !important; }
|
||||
}
|
||||
.newsletter form {
|
||||
div { padding: 3px 0; }
|
||||
.email { width: 135px; margin: 5px 0; }
|
||||
}
|
||||
.sharethis { padding-top: 5px; }
|
||||
.buttons-box {
|
||||
text-align: center;
|
||||
.standard-download, .standard-free-download { margin-bottom: 10px; }
|
||||
.standard-buy { margin: 0 0 10px 10px; display: inline; }
|
||||
.commercial-buy { margin: 0 0 10px; }
|
||||
}
|
||||
.small-button-ct { margin: 15px; text-align: center; }
|
||||
.screenshots {
|
||||
overflow: hidden; padding-top: 23px; width: 100%;
|
||||
.odd { float: left; margin-left: 23px; }
|
||||
.even { float: right; margin-right: 23px; }
|
||||
strong { display: block; padding: 5px 0 30px 5px; }
|
||||
img { border: 3px solid #efe5c6; border-radius: 6px; -moz-border-radius: 6px; -webkit-border-radius: 6px; }
|
||||
}
|
||||
.screenshot-row { overflow: hidden; }
|
||||
.buttons-wrap { margin-top: 40px; margin-bottom: 0; }
|
||||
}
|
||||
|
||||
.product-detail {
|
||||
.bigtext { font-size: 16px; line-height: 25px; margin-bottom: 30px; }
|
||||
h2 { margin: 20px 0 15px; font-size: 22px; }
|
||||
h2.first { margin-top: 0; }
|
||||
p, h3 { margin: 15px 0; }
|
||||
.box { float: right; margin: 5px 30px 20px 40px; }
|
||||
.bigbig { font-size: 16px; }
|
||||
.hilight { background-color: #FFFF99; }
|
||||
h3, .big { font-size: 15px; font-family: @standard_fonts; color: #000 !important; }
|
||||
.tick { padding-left: 40px; background: url(/images/tick.gif) 0 50% no-repeat; }
|
||||
.buttons-wrap { text-align: center; }
|
||||
.buttons, .edition-buttons { overflow: hidden; padding-top: 5px; margin: auto; width: 280px; }
|
||||
.edition-buttons { width: 350px; }
|
||||
.big-download, .stdl7-download { margin: 0 auto 15px auto; }
|
||||
.long blockquote { font-size: 12px; }
|
||||
.comparison-pair {
|
||||
border-spacing: 0px; border: 1px solid #000; border-collapse: collapse;
|
||||
td, th { border: 1px solid #000; padding: 4px 6px; width: 50%; }
|
||||
th { background: #332618; color: #fff; }
|
||||
}
|
||||
}
|
||||
.releases h3 { margin-top: 25px; }
|
||||
.releases hr { margin: 15px 0; }
|
||||
.changes-since { font-style: italic; }
|
||||
|
||||
.features-page {
|
||||
h3 { font-size: 16px; color: #456b12 !important; padding-top: 10px; margin-top: 35px; border-top: 1px solid #d0efa6; }
|
||||
img { margin: 12px auto 0; }
|
||||
.image { text-align: center; }
|
||||
}
|
||||
|
||||
.order-content {
|
||||
h1 { font-size: 36px; font-weight: normal; letter-spacing: -1px; margin: 15px 0 0; }
|
||||
.section-info { margin: 0 0 30px; font-size: 14px; }
|
||||
.licenses-info {
|
||||
width: 100%; overflow: hidden; padding: 20px 0 0; margin: 25px 0; border-top: 1px dotted #a8906b;
|
||||
.block { float: left; width: (@page_width - 60) / 3; margin-right: 30px; }
|
||||
.last { margin-right: 0; }
|
||||
h3 { margin-bottom: 5px; font-size: 14px; }
|
||||
}
|
||||
.panel { background: #fff; border: 2px solid #ecf7fe; }
|
||||
table {
|
||||
width: 100%; border-spacing: 0; border: 1px solid #9bc8e8; border-collapse: collapse; margin: 0;
|
||||
td, th { border: 1px solid #9bc8e8; }
|
||||
th { background: #ecf7fe; padding: 4px 6px; }
|
||||
td { padding: 12px 8px; }
|
||||
.price { width: 80px; text-align: right; font-weight: bold; }
|
||||
.addon { width: 240px; }
|
||||
.buy { width: 70px; padding: 0; }
|
||||
}
|
||||
.componentsource .block { margin-top: 5px; }
|
||||
}
|
||||
|
||||
.support-content {
|
||||
overflow: hidden; width: 100%;
|
||||
h1 { margin: 15px 0; font-size: 36px; }
|
||||
.contact-form-ct { position: relative; width: 452px; left: 50%; margin-top: 30px; margin-left: -230px; background: #fff; border: 2px solid #ecdfb9; }
|
||||
.contact-form-wrap { padding: 20px 30px; border: 1px solid #ac995e; }
|
||||
p { margin: 20px 0; }
|
||||
hr { margin: 30px 0; }
|
||||
.note { font-size: 12px; }
|
||||
.left { width: 596px; }
|
||||
.right { width: 274px; padding-top: 10px; }
|
||||
.reference a, .guide a, .documentation a, .stackoverflow a { padding-left: 30px; margin: 0; padding: 6px 0 6px 30px; background: 0 50% no-repeat; }
|
||||
.reference a { background-image: url(/images/icons/book.gif);}
|
||||
.guide a { background-image: url(/images/icons/info.gif); }
|
||||
.documentation a { background-image: url(/images/icons/documentation.gif); }
|
||||
.stackoverflow a { background-image: url(/images/icons/stackoverflow.gif); }
|
||||
}
|
||||
|
||||
.uninstall-content {
|
||||
.contact-form-ct { width: 460px !important; }
|
||||
.emailsafe { margin-top: 12px; }
|
||||
}
|
||||
|
||||
.download-content {
|
||||
padding-bottom: 60px;
|
||||
h2 { margin: 15px 0; font-size: 36px; font-weight: normal; }
|
||||
.section-info { font-size: 16px; margin: 30px 0; }
|
||||
p { margin: 15px 0; }
|
||||
hr { margin: 60px 0; }
|
||||
.newsletter-ct { background: #fff; border: 2px solid #ecdfb9; }
|
||||
.newsletter {
|
||||
padding: 15px 0 20px 35px; border: 1px solid #ac995e; height: 80px; overflow: hidden;
|
||||
h3 { margin-bottom: 15px; font-size: 20px; }
|
||||
.field { float: left; margin-right: 30px; }
|
||||
label { display: block; }
|
||||
.email, .name { font-size: 13px; padding: 4px 5px; }
|
||||
.email { padding-left: 24px; width: 166px; }
|
||||
.name { background-image: none; width: 186px; }
|
||||
.subscribe, .subscribing { margin-top: 10px; }
|
||||
.subscribing { float: left; }
|
||||
}
|
||||
}
|
||||
|
||||
.about-content {
|
||||
h1 { font-size: 40px; font-weight: normal; letter-spacing: -1px; margin: 15px 0 10px; }
|
||||
h2 { font-size: 34px; font-weight: normal; letter-spacing: -1px; margin: 40px 0 15px; }
|
||||
h3 { font-size: 28px; font-weight: normal; letter-spacing: -1px; margin: 60px 0 15px; }
|
||||
.team, .customers, .csauthor { margin-top: 40px; }
|
||||
.placing { padding-left: 58px; }
|
||||
.about-ct { background: url(/images/blv-users.gif) no-repeat 98% 50%; }
|
||||
.dextronet { background: url(/images/icons/dextronet-bird-gray.jpg) no-repeat 0 0; }
|
||||
.dextronet h2 { padding-top: 5px; }
|
||||
.cowl { background: url(/images/icons/component-owl-gray.jpg) no-repeat 0 0; }
|
||||
.cowl h2 { padding-top: 10px; margin-top: 45px; }
|
||||
.quote { font-family: georgia, serif; font-size: 21px; margin: 22px 0 28px; }
|
||||
.quote b { font-weight: normal; font-size: 120px; display: block; float: left; line-height: 95px;
|
||||
color: #d3cccc; margin: 0 7px 0 0; }
|
||||
p { margin: 15px 0 15px 0; width: 630px; text-align: justify; }
|
||||
.with-image {
|
||||
overflow: auto;
|
||||
img { float: left; display: block; margin: 0 10px 0 0; }
|
||||
}
|
||||
.libor, .cs, .hq { overflow: hidden; }
|
||||
.libor img, .cs img, .hq img { float: left; margin: 0 15px 5px 0; }
|
||||
.libor { margin: 30px 0 30px 60px; width: 500px; }
|
||||
.libor em { display: block; padding-top: 14px; }
|
||||
.libor img { margin-right: 10px; }
|
||||
.hq {
|
||||
margin: 60px 0 0 -7px; padding: 7px 0 7px 7px; width: 410px; text-align: left;
|
||||
img { -moz-box-shadow: 0 0 7px #aaa; -webkit-box-shadow: 0 0 7px #aaa;
|
||||
box-shadow: 0 0 7px #aaa; border: 2px solid #fff; }
|
||||
}
|
||||
.logo-inset { vertical-align: middle; margin: 0 3px; margin-top: -3px; }
|
||||
.testimonial-wide-ct { width: 630px; margin: 50px 0; border: 2px solid #ffeecf; border-left: none; border-right: none; }
|
||||
.testimonial-wide { margin: 0; }
|
||||
.contact-info-ct { background: url(/images/europe.jpg) right 150px no-repeat; width: 650px; padding-bottom: 20px; }
|
||||
.contact { border-left: 2px solid #a8906b; padding: 5px 0 5px 10px; line-height: 20px; background: #fff3de; }
|
||||
}
|
||||
#cscontact-ct { width: 630px; margin: 30px 0 0; }
|
||||
#cscontact {
|
||||
border: 1px solid #c1c1c1; background: #fafafa; padding: 10px; font-size: 12px;
|
||||
border-top: none; clear: both;
|
||||
table { width: 100%; }
|
||||
tr { vertical-align: top; }
|
||||
.address { width: 33%; }
|
||||
.hours { width: 33%; }
|
||||
}
|
||||
#cscontact-nav {
|
||||
border-bottom: 1px solid #c1c1c1; padding-bottom: 30px;
|
||||
li { display: inline; }
|
||||
a { float: left; padding: 8px 10px 6px; text-transform: uppercase; text-decoration: none;
|
||||
font-weight: bold; font-size: 12px; color: #545454; line-height: 15px; }
|
||||
.current { border: 1px solid #c1c1c1; border-bottom: 1px solid #fafafa; background: #fafafa; color: #000; }
|
||||
}
|
||||
|
||||
.subscribe-content {
|
||||
padding: 0 5px; overflow: hidden;
|
||||
p { font-size: 13px; }
|
||||
h2 { margin-bottom: 0 !important; }
|
||||
fieldset { padding: 5px 10px 10px; margin-top: 5px; }
|
||||
legend { font-weight: bold; text-transform: uppercase; padding: 0 5px; }
|
||||
.newsletter-box {
|
||||
padding: 10px 0 15px 15px; margin-top: 10px; background: #fff; border: 1px solid #e7c483;
|
||||
.field { float: left; margin-right: 20px; }
|
||||
label { display: block; }
|
||||
.email, .name { font-size: 13px; padding: 4px 5px; }
|
||||
.email { padding-left: 24px; width: 136px; }
|
||||
.name { background-image: none; width: 156px; }
|
||||
.subscribe { margin-top: 10px; }
|
||||
.subscribing { float: left; margin-top: 15px; }
|
||||
}
|
||||
.trouble { margin-top: 10px; }
|
||||
}
|
||||
|
||||
.fancybox-highlight { }
|
||||
|
||||
.sitemap-content {
|
||||
h1 { margin: 15px 0; }
|
||||
h2 { margin: 25px 0 5px; }
|
||||
.top { margin: 0 0 30px 15px; }
|
||||
ul ul { margin-top: 3px; }
|
||||
}
|
||||
|
||||
.legal-content {
|
||||
font-size: 14px;
|
||||
h1 { margin: 15px 0; }
|
||||
h2 { margin: 15px 0 10px; }
|
||||
p { padding: 0 0 20px; }
|
||||
ul.common { padding-bottom: 20px; }
|
||||
}
|
||||
|
||||
.service-content {
|
||||
h1 { margin: 15px 0; }
|
||||
h2 { margin: 15px 0 10px; }
|
||||
h3 { margin: 0 0 5px; }
|
||||
p { padding: 0 0 20px; }
|
||||
table {
|
||||
border-spacing: 0; border: none; margin-top: 20px;
|
||||
th { text-align: left; }
|
||||
th, td { padding: 5px 50px 5px 0; border-bottom: 1px solid #eadbc4; }
|
||||
.country { font-weight: bold; }
|
||||
.flag { padding-right: 5px; }
|
||||
}
|
||||
.blocks { overflow: hidden; width: 100%; margin: 40px 0 0; }
|
||||
.block { width: 250px; margin-right: 40px; float: left; }
|
||||
}
|
||||
|
||||
.comics-wrap { text-align: center; }
|
||||
.comics { display: inline-block; position: relative; margin: 0 auto; }
|
||||
|
||||
.comicshd { text-indent: -9999em; background: url(/images/web-comics.gif) 50% 0 no-repeat;
|
||||
margin: 28px 0 10px; height: 27px; }
|
||||
.comics-bubble-ct { height: 66px; background: url(/images/owl-small.gif) 0 0 no-repeat;
|
||||
padding: 24px 0 0 52px; margin: 10px 0 0 30px; }
|
||||
.comics-bubble { line-height: 32px; height: 32px; font-size: 16px; padding-left: 30px;
|
||||
background: url(/images/bubble-small.gif) 0 0 no-repeat; width: 745px; white-space: nowrap; }
|
||||
.comics-bubble p { background: #e0f6ff url(/images/bubble-small.gif) 100% -32px no-repeat;
|
||||
padding-right: 10px; }
|
||||
|
||||
.comics-navigation { margin: 0 auto; border: 2px solid #1a1a1a; border-radius: 14px; width: 400px; overflow: hidden;
|
||||
padding: 5px; margin-bottom: 28px; }
|
||||
.comics-day { float: left; width: 324px; text-align: center; font-size: 20px; }
|
||||
.comics-np { padding-left: 38px; }
|
||||
.comics-nn { padding-right: 38px; }
|
||||
|
||||
.comics-next, .comics-prev { display: block; width: 38px; height: 25px; text-indent: -9999em; }
|
||||
.comics-next { background: url(/images/comics-next.gif) 0 0 no-repeat; float: right; }
|
||||
.comics-prev { background: url(/images/comics-prev.gif) 0 0 no-repeat; float: left; }
|
||||
.comics-next:hover, .comics-prev:hover { background-position: 0 -25px; }
|
||||
|
||||
.comics-social-ct { text-align: center; margin: 28px 0; }
|
||||
.comics-social { border: 2px solid #1a1a1a; border-radius: 14px;
|
||||
padding: 8px; overflow: hidden; display: inline-block; text-align: left; }
|
||||
|
||||
.comics-rss { margin: 28px 0; text-align: center; }
|
||||
.comics-rss a { padding: 6px 0 10px 40px; background: url(/images/RSS_32.png) 0 50% no-repeat;
|
||||
font-weight: bold; }
|
||||
|
||||
.comics-info { margin: 28px auto 20px; width: 700px; font-style: italic; font-size: 16px;
|
||||
text-align: center; }
|
||||
|
||||
.owl-flag { position: absolute; top: 0; left: 50%; margin-left: @page_width / 2 + 20; _display: none; }
|
||||
|
||||
/* PAGE LAYOUT */
|
||||
|
||||
.d-iframe { background: none; text-align: left; }
|
||||
|
||||
.d-page { position: relative; min-height: 100%; }
|
||||
.d-placing { margin: 0 auto; text-align: left; width: @page_width; }
|
||||
|
||||
.d-header { height: 47px; }
|
||||
.d-logo { float: right; margin-top: 10px; }
|
||||
.logoimg { margin-right: 5px; display: inline-block; }
|
||||
.d-menu {
|
||||
float: left;
|
||||
li { float: left; position: relative; padding-right: 35px; }
|
||||
.menu-item { display: block; position: relative; z-index: 99; padding: 12px 0 1px; color: #fff; text-decoration: none; }
|
||||
.active .menu-item { border-bottom: 1px solid #bb983b; padding-bottom: 2px; }
|
||||
.menu-item:hover { border-bottom: 2px solid #bb983b; padding-bottom: 1px; color: #fff; }
|
||||
.featured { color: #fecb33 !important; }
|
||||
.dropdown {
|
||||
position: absolute; top: 30px; left: -20px; width: 250px;
|
||||
.outer { position: relative; z-index: 97; padding-left: 6px; background: url(/images/dropdown-o.png) 0 100% no-repeat; }
|
||||
.shadowbox { position: relative; z-index: 98; padding: 0 8px 8px 0; background: url(/images/dropdown-s.png) 100% 100% no-repeat; }
|
||||
.inner { position: relative; overflow: auto; height: 100%; z-index: 99; padding: 12px 14px; background: #362919; border: 1px solid #1c1410; border-top: none; }
|
||||
a, a:hover { color: #fff; }
|
||||
}
|
||||
}
|
||||
|
||||
.dropdown-submenu {
|
||||
.inner { padding: 10px 0 0 !important; }
|
||||
a { padding: 10px 14px; display: block; text-decoration: none; }
|
||||
a:hover { background-color: #bb983b; }
|
||||
li { padding: 0; margin: 0; }
|
||||
img { display: block; float: left; margin: 4px 10px 0 0; }
|
||||
}
|
||||
|
||||
.dropdown {
|
||||
.featured-item { font-size: 16px; font-weight: bold; }
|
||||
.subline { display: block; font-size: 12px; color: #fff; padding-top: 3px; }
|
||||
.dropdown-category {
|
||||
background-color: #876234; color: #fff; font-weight: bold; padding: 5px 8px;
|
||||
}
|
||||
}
|
||||
|
||||
.d-content-wrap { padding-bottom: 400px; }
|
||||
|
||||
.d-footer {
|
||||
position: absolute; bottom: 0; right: 0; width: 100%; padding-top: 25px; color: #fff; background: #3a2c18 url(/images/footer-bg.png) repeat-x;
|
||||
font-size: 12px;
|
||||
a { color: #fff; }
|
||||
a:hover { color: #f5b458; }
|
||||
.d-placing { overflow: hidden; }
|
||||
.left { width: 540px; }
|
||||
.right { width: 325px; }
|
||||
hr { background-color: #fff; margin-top: 10px; }
|
||||
.copy { font-size: 11px; padding: 0 0 13px 140px; background: url(/images/dextronet.gif) 0 12px no-repeat; }
|
||||
.social {
|
||||
padding: 10px 0 4px;
|
||||
span { padding: 0 3px; }
|
||||
}
|
||||
}
|
||||
|
||||
div.testimonial-intext {
|
||||
text-align: center;
|
||||
.testimonial-wrap { width: 500px; margin: 30px auto 0; padding-top: 10px; background: url(/images/testimonial-intext.gif) 0 0 no-repeat; }
|
||||
blockquote { width: 475px; margin: 0 auto; padding: 0 10px 4px 15px; text-align: left; text-indent: -5px; font-size: 13px; font-family: georgia, serif;
|
||||
background: #f7eee8; }
|
||||
strong { width: 150px; display: block; font-weight: normal; margin: 0 auto; text-align: left; padding: 20px 0 0 350px; color: #825900; font-size: 11px;
|
||||
background: url(/images/testimonial-intext.gif) -500px 0 no-repeat; }
|
||||
.featured {
|
||||
blockquote { font-size: 16px; }
|
||||
strong { font-size: 12px; }
|
||||
}
|
||||
}
|
||||
div.testimonial-intext {
|
||||
margin: 20px 0 0;
|
||||
.testimonial-wrap { margin-top: 0; }
|
||||
strong { margin-bottom: 6px; }
|
||||
}
|
||||
|
||||
.latest-posts {
|
||||
height: 255px; overflow: hidden;
|
||||
.latest_from_blog a { display: block; width: 279px; height: 18px; background: url(/images/heading-latest_from_blog.gif) no-repeat; }
|
||||
h4 { margin: 13px 0 0; padding: 0 0 3px; font-size: 13px; color: #ffd191; }
|
||||
h4 a { color: #ffd191; }
|
||||
h4 a:hover { color: #fcead0; }
|
||||
.post-info { font-size: 11px; color: #a38952; text-transform: uppercase; font-weight: bold; }
|
||||
}
|
||||
.other-posts {
|
||||
text-align: right;
|
||||
a { color: #fcead0; }
|
||||
a:hover { color: #f5b458; }
|
||||
}
|
||||
|
||||
.section-heading { margin: 15px 0; font-size: 36px; }
|
||||
|
||||
.resources-content {
|
||||
padding-bottom: 30px;
|
||||
h1 { margin-top: 30px; }
|
||||
h2 { margin: 10px 0 0 !important; font-weight: normal; }
|
||||
h1 { font-size: 23px; }
|
||||
h2 { font-size: 17px; }
|
||||
.post-info { margin-bottom: 0; color: #a38952; font-size: 11px; }
|
||||
.small-button-ct { overflow: hidden; width: 100%; margin: 13px 0 0; }
|
||||
.small-button { display: block; float: left; }
|
||||
.featured-articles {
|
||||
h2 { font-weight: bold; }
|
||||
}
|
||||
}
|
||||
|
||||
.article-content {
|
||||
overflow: hidden; height: 100%; padding-bottom: 30px;
|
||||
.left { width: 650px; }
|
||||
.right { width: 228px; margin-top: 15px; }
|
||||
.title { margin-top: 25px; font-size: 23px; }
|
||||
.sidebar {
|
||||
padding: 15px 0 0; background: url(/images/lower-side-bg.jpg) 0 0 no-repeat;
|
||||
h4 { font-size: 18px; color: #4783bf; margin: 0 0 10px; }
|
||||
.text {
|
||||
margin: 10px 0;
|
||||
p { margin: 0 0 8px; }
|
||||
h1, h2, h3, h4 { margin: 8px 0 3px; font-size: 12px; font-family: 'trebuchet ms', sans-serif; }
|
||||
}
|
||||
.buttonz { text-align: center; margin-top: 10px; }
|
||||
.buttonz a { margin: 0 auto 10px; float: none; }
|
||||
.download {
|
||||
text-align: center; font-size: 14px; font-weight: bold; margin-top: 10px;
|
||||
a { background: url(/images/icons/arrow-270-medium.gif) 0 2px no-repeat; padding-left: 16px; }
|
||||
}
|
||||
}
|
||||
.content {
|
||||
margin-top: 20px; font-size: 14px; color: #222;
|
||||
p { margin: 0 0 20px; }
|
||||
h1, h2, h3 { color: #000; font-family: 'trebuchet ms', sans-serif; padding: 0 0 5px; margin-top: 30px; }
|
||||
h1 { font-size: 18px; }
|
||||
h2 { font-size: 16px; margin-top: 20px; }
|
||||
h3 { font-size: 14px; margin-top: 20px; }
|
||||
}
|
||||
}
|
||||
|
||||
.dextronet-feeds { margin: 15px 0 0; padding-bottom: 12px; border-bottom: 1px dotted #a8906b; }
|
||||
.dextronet-feeds .links { margin: 0 !important; list-style: none; padding: 0 !important; }
|
||||
.dextronet-feeds .links li { margin: 0 !important; }
|
||||
.dextronet-feeds .links a { padding: 7px 0 10px 37px; display: block; }
|
||||
.dextronet-feeds .links .rss { background: url(/images/icons/rss-32.png) 0 50% no-repeat; }
|
||||
.dextronet-feeds .links .twitter { background: url(/images/icons/twitter-32.png) 0 50% no-repeat; }
|
||||
.dextronet-feeds .links .facebook { background: url(/images/icons/facebook-32.png) 0 50% no-repeat; }
|
||||
|
||||
.news {
|
||||
.links {
|
||||
width: 100%; overflow: hidden; margin-bottom: 10px;
|
||||
li { float: left; margin-right: 10px; }
|
||||
a { display: block; padding: 6px 8px 6px 26px; text-decoration: none; background: #49371e 7px 50% no-repeat; }
|
||||
.rss { background-image: url(/images/rss.gif); }
|
||||
.twitter { background-image: url(/images/twitter.gif); }
|
||||
}
|
||||
h4, h4 a { color: #e4b16a; font-size: 13px; }
|
||||
h4 a:hover { color: #fcead0; }
|
||||
.news-item { width: 100%; overflow: hidden; margin-bottom: 3px; padding-bottom: 3px; border-bottom: 1px dotted #644c2a; }
|
||||
.last-item { border-bottom: none; }
|
||||
.date { float: left; width: 20px; text-align: right; padding: 3px 6px; color: #a38952; }
|
||||
.date span { display: block; }
|
||||
.message { padding: 3px 0; color: #fcead0; }
|
||||
}
|
||||
|
||||
.comics-blv-wrap { text-align: center; }
|
||||
.comics-blv { margin: 60px auto 30px; padding: 7px 0; border: 1px solid #ecdfb9; border-left: none; border-right: none; width: 100%; overflow: hidden; font-size: 20px;
|
||||
background: #fffcf3; font-family: "trebuchet ms", arial, sans-serif; width: 800px; text-align: left; }
|
||||
.comics-blv .ss { float: left; margin: 0 8px 0 8px; border: none; }
|
||||
.comics-blv .inside { padding-top: 8px; }
|
||||
.comics-blv .text { padding-bottom: 8px; }
|
||||
|
||||
|
||||
.comparison
|
||||
{
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
font-size: small;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
margin-bottom: 50px;
|
||||
}
|
||||
.comparison td, .comparison th { padding: 4px 6px; border: 1px solid #000; }
|
||||
.comparison-blank { border-top: none !important; border-left: none !important; text-align: left; padding-left: 0 !important; }
|
||||
.comparison-blank h2 { margin: 0; padding: 0; }
|
||||
|
||||
.comparison-line-even
|
||||
{
|
||||
background-color: #F0F0F0;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.comparison-line-odd
|
||||
{
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.comparison-yes
|
||||
{
|
||||
background-color: #CCFFCC;
|
||||
color: #008000;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.comparison-no
|
||||
{
|
||||
background-color: #FFCCCC;
|
||||
color: #800000;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.comparison-other
|
||||
{
|
||||
width: 90px;
|
||||
background: #332618; color: #fff;
|
||||
}
|
||||
74
app/stylesheets/simple.less
Normal file
74
app/stylesheets/simple.less
Normal file
@@ -0,0 +1,74 @@
|
||||
@standard_fonts: arial, sans-serif;
|
||||
|
||||
body { font-family: @standard_fonts; background: #fefefe; }
|
||||
.placed { width: 800px; margin: auto; }
|
||||
|
||||
h1 { text-align: center; margin: 25px 0 0; line-height: 1; font-size: 38px; }
|
||||
h2 { font-size: 22px; margin: 40px 0 17px; }
|
||||
h3 { font-size: 18px; font-weight: normal !important; margin-top: 5px; }
|
||||
h4 { font-size: 16px; margin-bottom: 5px; font-weight: normal !important; }
|
||||
|
||||
p { text-align: left; margin: 20px 0; }
|
||||
|
||||
.owl { position: absolute; top: 5px; left: 50%; margin-left: -455px; }
|
||||
|
||||
.quote {
|
||||
margin-top: 30px; background: url(/images/simple/lquote.gif) 0 0 no-repeat; text-align: left;
|
||||
blockquote { padding: 5px 0 0 25px; font-size: 16px; font-family: georgia, serif; color: #074463; font-style: italic;
|
||||
background: url(/images/simple/rquote.gif) 100% 70% no-repeat; }
|
||||
em { display: block; text-align: right; color: #000; font-family: @standard_fonts; padding: 10px 60px 0 0; font-size: 12px; }
|
||||
}
|
||||
|
||||
.buttons { padding: 20px 0; margin-top: 30px; overflow: hidden; width: 100%; border: 1px solid #b4e9fd; border-left: none; border-right: none; background: #f6fcff; }
|
||||
.logos { display: block; float: left; margin: 13px 0 0 28px; }
|
||||
|
||||
.standard-download {
|
||||
float: left; width: 214px; height: 62px; margin: 0 15px 0 58px; background: url(/images/button-download.gif) no-repeat;
|
||||
:hover { background-position: 0 -62px; }
|
||||
}
|
||||
.pricing-buy {
|
||||
float: left; width: 193px; height: 44px; margin-top: 10px; background: url(/images/button-pricing.gif) no-repeat;
|
||||
:hover { background-position: 0 -44px; }
|
||||
}
|
||||
|
||||
.moreinfo {
|
||||
margin-top: 25px;
|
||||
input { vertical-align: middle; }
|
||||
.email { margin-right: 5px; }
|
||||
}
|
||||
.subscribing { display: inline; }
|
||||
|
||||
.features { overflow: hidden; }
|
||||
.list {
|
||||
margin-top: 8px;
|
||||
li { text-align: left; padding: 5px 0 5px 23px; background: url(/images/icons/tick.gif) 0 5px no-repeat; }
|
||||
}
|
||||
.floated { float: left; width: 540px; }
|
||||
.screenshots {
|
||||
a { display: block; float: right; margin-bottom: 7px; }
|
||||
}
|
||||
|
||||
.contact-form-ct {
|
||||
margin: 40px 0 0; text-align: center;
|
||||
.airmail { margin: auto; width: 100%; font-size: 16px; text-align: center; background: url(/images/airmail.gif) 0 50% repeat-x; }
|
||||
.airmail strong { padding: 0 5px; background: #fff; }
|
||||
}
|
||||
.contact-form {
|
||||
margin: 10px auto 0; width: 560px;
|
||||
ul { float: left; margin-right: 20px; }
|
||||
.rside { margin-right: 0 !important; }
|
||||
fieldset { padding: 10px 0 0 0; }
|
||||
legend { padding: 0 5px; text-align: center; }
|
||||
.message { width: 330px; height: 72px; }
|
||||
.submit { margin-right: 24px; }
|
||||
}
|
||||
|
||||
.d-page { position: relative; min-height: 100%; }
|
||||
.d-border { position: relative; z-index: 2; height: 12px; background: url(/images/simple/bg.gif) repeat-x; }
|
||||
.d-content-wrap { padding-bottom: 70px; }
|
||||
.d-footer {
|
||||
position: absolute; bottom: 0; right: 0; width: 100%; font-size: 11px; height: 39px; color: #d3bc91; background: url(/images/simple/footer-bg.gif) repeat-x;
|
||||
a { color: #d3bc91; }
|
||||
a:hover { color: #fff; }
|
||||
.d-placing { overflow: hidden; text-align: left; margin: auto; width: 800px; padding-top: 15px; }
|
||||
}
|
||||
250
app/views/about/_draft.html.erb
Normal file
250
app/views/about/_draft.html.erb
Normal file
@@ -0,0 +1,250 @@
|
||||
<h1>About Us</h1>
|
||||
|
||||
<blockquote class="quote"><b>“</b>Have you ever wondered why some software immediately strikes you<br />
|
||||
as polished and professional, and looks and feels just great?<br />
|
||||
So did we. Component Owl is the result of our journey.</blockquote>
|
||||
|
||||
<p class="placing">Component Owl is part of the <%= link_to image_tag('dextronet-small.gif', :alt => "Dextronet.com", :class => "logo-inset"), Settings.dextronet_url %> network.</p>
|
||||
|
||||
<div class="about-ct">
|
||||
<div class="placing dextronet">
|
||||
<h2>About Dextronet</h2>
|
||||
|
||||
<p>Dextronet has been founded in 2004 with the intention to develop, sell and support software
|
||||
with great design that makes your life better. To put it simply: <strong>We love creating software
|
||||
that you will love to use.</strong></p>
|
||||
|
||||
<p>In the <%= years_since_founded %> years that Dextronet has existed, we have been growing
|
||||
and expanding our business organically and responsibly, and attained substantial steady growth
|
||||
each year. We are here to stay.</p>
|
||||
|
||||
<p>Our flagship and most popular product is <%= link_to "Swift To-Do List", Settings.stdl_url %>
|
||||
(developed in .NET). With over 500.000 downloads and paying customers in 93 countries,
|
||||
it is the number one task and notes organizer for Windows.</p>
|
||||
|
||||
<p><strong>Better ListView component is the core part of Swift To-Do List, and as such, tens
|
||||
of thousands users work with it every day.</strong></p>
|
||||
</div>
|
||||
|
||||
<div class="placing cowl">
|
||||
<h2>About Component Owl</h2>
|
||||
|
||||
<p>ComponentOwl.com was founded as a Dextronet.com spinoff to commercially release Better ListView
|
||||
and other software components originally developed for our in-house purposes.</p>
|
||||
|
||||
<p>Our goal is to provide complete, light-weight, flexible, intuitive to use and reliable
|
||||
components and controls for Microsoft .NET with native look and feel.</p>
|
||||
|
||||
<p>Soon after release, Better ListView has started to receive favorable reviews and praise
|
||||
from developers. All our <%= link_to "development effort", "http://www.componentowl.com/better-listview/releases?since=1.40" %>
|
||||
is based on the feedback of our customers.</p>
|
||||
|
||||
<div class="testimonial-wide-ct">
|
||||
<div class="testimonial-wide">
|
||||
<blockquote>“The [Better ListView] control is very easy and intuitive to use and
|
||||
is well documented.”
|
||||
– <%= link_to "DevProConnections.com Review", "http://www.devproconnections.com/article/product-review/review-componentowl-s-better-listview" %></blockquote>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="placing">
|
||||
<h3 class="team">Our Team</h3>
|
||||
|
||||
<p>Our growing team has over 50+ years of combined experience with development of rich-client
|
||||
desktop Windows software and components.</p>
|
||||
|
||||
<p class="libor">
|
||||
<%= image_tag('libor.jpg', :alt => 'Libor Tinka - lead developer') %>
|
||||
<em>Libor Tinka, Better ListView lead developer, has been programming since 7 years old on ZX Spectrum,
|
||||
and has enormous attention for detail. His interests include programming, quantum physics, advanced
|
||||
mathematics, digital imaging (algorithms, HDR and panoramic photography), and green Japanese tea.</em>
|
||||
</p>
|
||||
|
||||
<h3 class="customers">Our Customers</h3>
|
||||
|
||||
<p>Since releasing Better ListView, numerous developers and companies have started utilizing
|
||||
Better ListView in their projects, to save money, development time, and to impress their customers.</p>
|
||||
|
||||
<p>Our customers represent a rich spectrum of businesses and organizations, including:</p>
|
||||
<ul class="common">
|
||||
<li><%= link_to "Kingston Technology", "http://www.kingston.com/" %></li>
|
||||
<li><%= link_to "DevScope", "http://www.devscope.net/" %></li>
|
||||
<li><%= link_to "Digi Link Limited", "http://www.digi-link.com/" %></li>
|
||||
<li><%= link_to "KingBill GmbH", "http://www.kingbill.net/" %></li>
|
||||
<li><%= link_to "Hydro-Québec", "http://www.hydroquebec.com" %></li>
|
||||
<li><%= link_to "LCRA Energy Water Community Services", "http://www.lcra.org/" %></li>
|
||||
<li><%= link_to "K-Software", "http://www.ksoftware.net/" %></li>
|
||||
<li><%= link_to "ImageWare Systems, Inc.", "http://www.iwsinc.com/" %></li>
|
||||
<li><%= link_to "Interdata srl", "http://www.interdata.it" %></li>
|
||||
<li><%= link_to "OfficeDoxs Software, Inc.", "http://www.officedoxs.com/" %></li>
|
||||
<li><%= link_to "Magnet Forensics Inc.", "http://www.magnetforensics.com/" %></li>
|
||||
<li>Qextron Inc.</li>
|
||||
<li>Telephone Directory of Texas, Inc.</li>
|
||||
<li>Industriinformation Sverige AB</li>
|
||||
<li>Five O’Clock Software</li>
|
||||
<li>Renegade Minds</li>
|
||||
<li>Vastgoed24, Netherlands</li>
|
||||
<li>... and others, as well as individual developers all over the world.</li>
|
||||
</ul>
|
||||
|
||||
<div class="testimonial-wide-ct">
|
||||
<div class="testimonial-wide">
|
||||
<blockquote>“<strong>It's an odd thing when you're inspired by a form component</strong>, but
|
||||
Component Owl with their Better ListView has done it. Love its native feel.”
|
||||
<br />– <%= link_to "Daniel Nolan", "http://sweetfancymuses.wordpress.com/" %></blockquote>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="testimonial-wide-ct">
|
||||
<div class="testimonial-wide">
|
||||
<blockquote>“I greatly appreciate all of the help you have provided over the past week. The knowledge of your product and Support response time far exceeds that of the other software vendors I have worked with. <strong>I could not be more happy with the product and will be recommending Component Owl to any/all future development teams I am part of</strong>. Thank you again for being so attentive to our needs and <strong>providing excellent support</strong>!
|
||||
|
||||
”
|
||||
<br />– Brian S.</blockquote>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3 class="csauthor">ComponentSource Professional Partner</h3>
|
||||
|
||||
<p class="cs">
|
||||
<%= image_tag('component-source-professional-partner.gif', :alt => 'ComponentSource Professional Partner') %>
|
||||
We are certified ComponentSource Professional Partner. ComponentSource is the world’s largest software component marketplace, and acts as our authorized value added reseller (VAR).
|
||||
<br /><br />
|
||||
You can <%= link_to "call ComponentSource", "http://www.componentowl.com/customer-service" %>
|
||||
customer service free of charge from 49 countries.
|
||||
</p>
|
||||
|
||||
<p><strong>US and Canada</strong>: Toll Free: 888 850 9911 (Non-stop)</p>
|
||||
<p><strong>United Kingdom</strong>: Toll Free: 0800 581111 (Non-stop)</p>
|
||||
|
||||
<div id="cscontact-ct">
|
||||
<div id="cscontact-nav">
|
||||
<ul>
|
||||
<li><a href="" class="current">European Headquarters</a></li>
|
||||
<li><a href="">US Headquarters</a></li>
|
||||
<li><a href="">Asia-Pacific Headquarters</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div id="cscontact">
|
||||
<div id="cscontact-1" class="panel">
|
||||
<table border="0" cellspacing="0">
|
||||
<tr>
|
||||
<td class="address">
|
||||
<b>ComponentSource</b><br />
|
||||
30 Greyfriars Road<br />
|
||||
Reading<br />
|
||||
Berkshire<br />
|
||||
RG1 1PE<br />
|
||||
United Kingdom<br />
|
||||
</td>
|
||||
<td class="hours">
|
||||
<b>Office hours:</b><br />
|
||||
9:00am - 5:30pm BST & CEST<br />
|
||||
<br />
|
||||
Tel: +44 118 958 1111<br />
|
||||
Fax: +44 118 958 9999<br />
|
||||
</td>
|
||||
<td>
|
||||
<b>Languages:</b><br />
|
||||
English / French / German / Spanish / Italian
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div id="cscontact-2" class="panel" style="display: none">
|
||||
<table border="0" cellspacing="0">
|
||||
<tr>
|
||||
<td class="address">
|
||||
<b>ComponentSource</b><br />
|
||||
650 Claremore Professional Way<br />
|
||||
Suite 100<br />
|
||||
Woodstock<br />
|
||||
GA 30188-5188<br />
|
||||
USA<br />
|
||||
</td>
|
||||
<td class="hours">
|
||||
<b>Office hours:</b><br />
|
||||
9:00am - 7:00pm EDT<br />
|
||||
<br />
|
||||
Tel: +1 770 250 6100<br />
|
||||
Fax: +1 770 250 6199<br />
|
||||
</td>
|
||||
<td>
|
||||
<b>Languages:</b><br />
|
||||
English / Spanish
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div id="cscontact-3" class="panel" style="display: none">
|
||||
<table border="0" cellspacing="0">
|
||||
<tr>
|
||||
<td class="address">
|
||||
<b>ComponentSource</b><br />
|
||||
3F Kojimachi Square Bldg<br />
|
||||
3-3 Kojimachi Chiyoda-ku<br />
|
||||
Tokyo<br />
|
||||
Japan<br />
|
||||
102-0083<br />
|
||||
</td>
|
||||
<td class="hours">
|
||||
<b>Office hours:</b><br />
|
||||
10:00am - 6:00pm JST<br />
|
||||
<br />
|
||||
Tel: +81 3 3237 0281<br />
|
||||
Fax: +81 3 3237 0282<br />
|
||||
</td>
|
||||
<td>
|
||||
<b>Languages:</b><br />
|
||||
English / Japanese / Korean / Mandarin / Cantonese
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>Association of Software Professionals Member</h3>
|
||||
|
||||
<p>We’ve been proud members of Association of Software Professionals for over
|
||||
<%= years_since_asp_member %> years now.</p>
|
||||
|
||||
<p>We also contribute to ASPects, the monthly magazine of Association of Software Professionals.</p>
|
||||
|
||||
<p><%= image_tag('asp_logo-member.png', :alt => 'Association of Software Professionals') %></p>
|
||||
|
||||
<div class="testimonial-wide-ct">
|
||||
<div class="testimonial-wide">
|
||||
<blockquote>“Component Owl created <strong>the one and only tool I don’t want to be without when it comes to software developing in Visual Studio</strong>. Also, I’ve been working as software user/developer for the last 26 years, and <strong>I have never before experienced</strong> a support that really goes the needed extra mile to make things work, like the guys at Component Owl do.”
|
||||
– Göran Alfvén, Sweden</blockquote>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>Microsoft Partner</h3>
|
||||
|
||||
<p class="with-image"><%= image_tag 'microsoft-partner.png', :alt => "Component Owl is a Microsoft Partner" %> We are part of the Microsoft Partner Network, which helps us strengthen our capabilities in delivering the best components for Microsoft Windows.</p>
|
||||
|
||||
<div class="contact-info-ct">
|
||||
<h3>Our Contact Info</h3>
|
||||
|
||||
<p class="contact"><strong>Contact us today directly with any of your questions, suggestions or comments:</strong>
|
||||
<br /><span class="emil">support (at) componentowl (dot) com</span></p>
|
||||
|
||||
<p>You can also use the <%= link_to "contact form", support_index_path %> in Support section.
|
||||
We usually reply within 24 hours or sooner.</p>
|
||||
|
||||
<p>You can <%= link_to "follow us on twitter", "http://twitter.com/ComponentOwl" %> and subscribe
|
||||
to our <%= link_to "RSS news feed", feeds_url(:format => :rss) %>.</p>
|
||||
|
||||
<p class="hq">
|
||||
<%= image_tag('brno.jpg', :alt => 'The City of Brno') %>
|
||||
Our offices are based in Brno,<br />Czech Republic, European Union.
|
||||
<br /><br />
|
||||
<em>Brno is the second largest city in Czech Republic, after the capital city Prague.
|
||||
<br />It is a technological hub and home of two computer science universities and influential
|
||||
software enterprises, including AVG and Red Hat.</em>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
7
app/views/about/index.html.erb
Normal file
7
app/views/about/index.html.erb
Normal file
@@ -0,0 +1,7 @@
|
||||
<div class="owl-flag"><%= image_tag('owl-flag.gif', :alt => "Component Owl") %></div>
|
||||
<div class="about-content">
|
||||
|
||||
<%= render :inline => @static_page.html %>
|
||||
<%#= render :partial => "draft" %>
|
||||
|
||||
</div>
|
||||
18
app/views/articles/index.html.erb
Normal file
18
app/views/articles/index.html.erb
Normal file
@@ -0,0 +1,18 @@
|
||||
<div class="subpage resources-content">
|
||||
|
||||
<div class="section-heading">Articles for .NET developers</div>
|
||||
|
||||
<div class="featured-articles">
|
||||
<% for article in @featured_articles %>
|
||||
<h2><%= link_to article.title, article %></h2>
|
||||
<div class="post-info"><%= t('txt.resources.published_on', :date => l(article.date.to_time, :format => :cute_long)) %></div>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
<div class="articles">
|
||||
<% for article in @articles %>
|
||||
<h2><%= link_to article.title, article %></h2>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
46
app/views/articles/show.html.erb
Normal file
46
app/views/articles/show.html.erb
Normal file
@@ -0,0 +1,46 @@
|
||||
<div class="subpage article-content">
|
||||
|
||||
<div class="left">
|
||||
|
||||
<div class="section-heading">Articles for .NET developers</div>
|
||||
|
||||
<h1 class="title"><%= @article.title %></h1>
|
||||
|
||||
<div class="content">
|
||||
<%= render :inline => @article.content %>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="right">
|
||||
|
||||
<div class="dextronet-feeds">
|
||||
<ul class="links">
|
||||
<li><%= link_to t('txt.home.subscribe_to_rss'), feeds_url(:format => :rss), :class => "rss" %></li>
|
||||
<li><%= link_to t('txt.home.follow_on_twitter'), twitter_url, :class => "twitter" %></li>
|
||||
<li><%= link_to t('txt.home.follow_on_facebook'), Settings.facebook_url, :class => "facebook" %></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="sidebar">
|
||||
<h4><%= featured_product.name %></h4>
|
||||
<%= screenshot_link(featured_product.screenshot) %>
|
||||
<div class="buttonz">
|
||||
<%= download_link(featured_product) %>
|
||||
</div>
|
||||
<div class="text">
|
||||
<%= render :inline => @subtemplate %>
|
||||
</div>
|
||||
<%= screenshot_link(@article.screenshot) if @article.screenshot %>
|
||||
<% if @subtemplate.present? %>
|
||||
<div class="download">
|
||||
<%= download_link_to("Download Now", featured_product) %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<%= render :partial => "shared/screenshot_buttons", :object => featured_product %>
|
||||
17
app/views/comics/index.rss.builder
Normal file
17
app/views/comics/index.rss.builder
Normal file
@@ -0,0 +1,17 @@
|
||||
xml.instruct! :xml, :version => "1.0"
|
||||
xml.rss :version => "2.0" do
|
||||
xml.channel do
|
||||
xml.title t('txt.rss.comics_title')
|
||||
xml.description t('txt.rss.comics_description')
|
||||
xml.link comics_url
|
||||
|
||||
for comic in @comics
|
||||
xml.item do
|
||||
xml.title title(comic)
|
||||
xml.description description(comic)
|
||||
xml.pubDate comic.publish_on.to_s(:rfc822)
|
||||
xml.link comic_url(comic)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
72
app/views/comics/show.html.erb
Normal file
72
app/views/comics/show.html.erb
Normal file
@@ -0,0 +1,72 @@
|
||||
<% @meta_title = title %>
|
||||
<% @meta_description = description %>
|
||||
<% content_for :header do %>
|
||||
<meta property="og:title" content="<%= @meta_title %>" />
|
||||
<meta property="og:site_name" content="<%= sitename %>" />
|
||||
<meta property="og:description" content="<%= @meta_description %>" />
|
||||
<meta property="og:type" content="article" />
|
||||
<meta property="og:url" content="<%= comic_url(@comic) %>" />
|
||||
<meta property="og:image" content="<%= @comic.image.url(:web) %>" />
|
||||
<meta property="fb:admins" content="1658456436" />
|
||||
<% end %>
|
||||
<div class="comics-content">
|
||||
|
||||
<div class="comics-bubble-ct">
|
||||
<div class="comics-bubble"><p>Component Owl cares about fun too. Behold, the truth-inspired web
|
||||
comics for puny human developers!</p></div>
|
||||
</div>
|
||||
|
||||
<div class="comics-navigation">
|
||||
<%= link_to "Previous", @previous_comic, :class => "comics-prev" if @previous_comic %>
|
||||
<h2 class="comics-day <%= "comics-np" unless @previous_comic %> <%= "comics-nn" unless @next_comic %>">
|
||||
<%= l(@comic.publish_on, :format => :cute_with_dayname) %></h2>
|
||||
<%= link_to "Next", @next_comic, :class => "comics-next" if @next_comic %>
|
||||
</div>
|
||||
|
||||
<div class="comics-wrap">
|
||||
<div class="comics">
|
||||
<%= image_tag(@comic.image.url(:web)) %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="fb-root"></div><script src="http://connect.facebook.net/en_US/all.js#appId=181510968582844&xfbml=1"></script>
|
||||
<div class="comics-social-ct">
|
||||
<div class="comics-social">
|
||||
<g:plusone size="tall"></g:plusone>
|
||||
<span class='st_twitter_vcount' displayText='Tweet'></span>
|
||||
<span class='st_dzone_vcount' displayText='DZone'></span>
|
||||
<span class='st_linkedin_vcount' displayText='LinkedIn'></span>
|
||||
<fb:like href="" send="false" layout="box_count" width="50" show_faces="false" font=""></fb:like>
|
||||
<span class='st_stumbleupon_vcount' displayText='Share'></span>
|
||||
<span class='st_email_vcount' displayText='Email'></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="comics-rss"><%= link_to "Subscribe to Comics RSS", comics_path(:format => :rss) %></div>
|
||||
|
||||
<p class="comics-info">
|
||||
All these comics strips are drawn by our lead Better ListView developer
|
||||
Libor Tinka. He is either restlessly crafting the perfect code, drinking
|
||||
green Japanese tea, or drawing hilarious comics.
|
||||
<br /><br />
|
||||
If you like this comics, please share it with your friends!
|
||||
</p>
|
||||
|
||||
<div class="comics-blv-wrap">
|
||||
<div class="comics-blv">
|
||||
<%= link_to(image_tag('overview.gif', :alt => "Better ListView", :class => "ss"), featured_product) %>
|
||||
<div class="inside">
|
||||
<div class="text">Better ListView: .NET ListView control for WinForms (C#, VB.NET)</div>
|
||||
<span class="dbtn-c dbtn-hilight"><span class="dbtn-w"><%= download_link_to "Download", featured_product, :class => "dbtn" %></span></span>
|
||||
<span class="dbtn-c"><span class="dbtn-w"><%= link_to("More Info", featured_product, :class => "dbtn") %></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">var switchTo5x=true;</script>
|
||||
<script type="text/javascript" src="http://w.sharethis.com/button/buttons.js"></script>
|
||||
<script type="text/javascript">stLight.options({publisher:'db6a9d0e-5d07-4036-8bed-4959941491f3'});</script>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
37
app/views/download/show.html.erb
Normal file
37
app/views/download/show.html.erb
Normal file
@@ -0,0 +1,37 @@
|
||||
<div class="download-content" id="download-page">
|
||||
|
||||
<h2><%= t('txt.download_page.thanks', :product => strip_version(@product.name), :version => @product.current_version) %></h2>
|
||||
|
||||
<%= hidden_field_tag "download_url", @download_url %>
|
||||
|
||||
<div class="section-info"><%= t('txt.download_page.start') %></div>
|
||||
|
||||
<p><%= t('txt.download_page.info') %></p>
|
||||
<% form_tag @download_url do -%>
|
||||
<%= submit_button t('txt.common.start_download'), :btn_class => "dbtn-hilight" %>
|
||||
<% end -%>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="newsletter-ct"><div class="newsletter">
|
||||
<% if @product.has_newsletter? %>
|
||||
<h3><%= t('txt.download_page.newsletter_product', :product => @product.name) %></h3>
|
||||
<% else %>
|
||||
<h3><%= t('txt.download_page.newsletter_general') %></h3>
|
||||
<% end %>
|
||||
<% remote_form_for newsletter_subscription, :html => { :onsubmit => "if (!validate_newsletter_form(this)) return false" } do |f| -%>
|
||||
<%= hidden_field_tag "form_id", "#new_subscription" %>
|
||||
<div class="field">
|
||||
<%= f.label :first_name, t("txt.common.first_name") %>
|
||||
<%= f.text_field :first_name, :class => "name stressed" %>
|
||||
</div>
|
||||
<div class="field">
|
||||
<%= f.label :email, t("txt.common.your_email") %>
|
||||
<%= f.text_field :email, :class => "email stressed" %>
|
||||
</div>
|
||||
<%= subscription_lists('download-page', @product) %>
|
||||
<%= subscribe %>
|
||||
<% end -%>
|
||||
</div></div>
|
||||
|
||||
</div>
|
||||
1
app/views/error/404.html.erb
Normal file
1
app/views/error/404.html.erb
Normal file
@@ -0,0 +1 @@
|
||||
<%= render :partial => "error/not_found" %>
|
||||
1
app/views/error/501.html.erb
Normal file
1
app/views/error/501.html.erb
Normal file
@@ -0,0 +1 @@
|
||||
<%= render :partial => "error/not_found" %>
|
||||
15
app/views/error/_not_found.html.erb
Normal file
15
app/views/error/_not_found.html.erb
Normal file
@@ -0,0 +1,15 @@
|
||||
<div class="subpage not_found-content">
|
||||
|
||||
<div class="section-heading"><%= image_tag("heading-404.gif", :alt => t("txt.alt.not_found")) %></div>
|
||||
|
||||
<p><%= t('txt.not_found.not_found') %></p>
|
||||
|
||||
<p><%= t('txt.not_found.visit_instead', :url => root_url) %></p>
|
||||
|
||||
<ul class="common">
|
||||
<% for product in all_products %>
|
||||
<li><%= link_to(product.name, product) %></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
34
app/views/faqs/search.html.erb
Normal file
34
app/views/faqs/search.html.erb
Normal file
@@ -0,0 +1,34 @@
|
||||
<div class="subpage faqs-content">
|
||||
|
||||
<div class="section-heading"><%= image_tag("heading-support.gif", :alt => t("txt.alt.support")) %></div>
|
||||
|
||||
<%= breadcrumb(link_to(t('txt.support.help_support'), "/support"), t('txt.faqs.search_breadcrumb')) %>
|
||||
|
||||
<h1><%= t("txt.faqs.search_results") %></h1>
|
||||
|
||||
<div class="search">
|
||||
|
||||
<% unless @faqs.blank? %>
|
||||
<% for faq in @faqs %>
|
||||
<% if faq.product %>
|
||||
<h2><%= link_to faq.question, product_faq_path(faq.product, faq) %></h2>
|
||||
<div class="path"><%= t('txt.faqs.faq_in', :link => link_to("#{faq.product.name} » #{faq.faq_category.name}", product_faq_path(faq.product, faq.faq_category))) %></div>
|
||||
<% else %>
|
||||
<h2><%= link_to faq.question, general_faq_path(faq) %></h2>
|
||||
<div class="path"><%= t('txt.faqs.faq_in', :link => link_to("#{t("txt.faqs.general_faqs")} » #{faq.faq_category.name}", general_faq_path(faq.faq_category))) %></div>
|
||||
<% end %>
|
||||
<div class="answer"><%= render :inline => faq.answer %></div>
|
||||
<% end %>
|
||||
|
||||
<% else %>
|
||||
|
||||
<p><%= t('txt.faqs.no_search_results') %></p>
|
||||
<br />
|
||||
<h2 class="different-search"><%= t('txt.faqs.try_different_search') %></h2>
|
||||
<%= render :partial => "support/search" %>
|
||||
|
||||
<% end %>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
70
app/views/faqs/show.html.erb
Normal file
70
app/views/faqs/show.html.erb
Normal file
@@ -0,0 +1,70 @@
|
||||
<div class="subpage faqs-content">
|
||||
|
||||
<div class="section-heading"><%= image_tag("heading-support.gif", :alt => t("txt.alt.support")) %></div>
|
||||
|
||||
<%= breadcrumb(link_to(t('txt.support.help_support'), "/support"), (@product ? "#{@product.name} #{t('txt.faqs.faqs')}" : t("txt.faqs.general_faqs"))) %>
|
||||
|
||||
<% if @product %>
|
||||
<h1><%= @product.name %> <%= t("txt.faqs.faqs") %></h1>
|
||||
<% else %>
|
||||
<h1><%= t("txt.faqs.general_faqs") %></h1>
|
||||
<% end %>
|
||||
|
||||
<div class="left">
|
||||
|
||||
<ul class="nav">
|
||||
<% for category in @categories %>
|
||||
<% current = category == @category%>
|
||||
<% url = @product ? product_faq_path(@product, category) : general_faq_path(category) %>
|
||||
<li><%= link_to(category.name, url, :class => "#{"current" if current}") %></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
|
||||
<div class="nav-panel">
|
||||
<div class="content">
|
||||
<div class="faqs">
|
||||
<h3><%= @category.description %></h3>
|
||||
<ul class="common">
|
||||
<% for faq in @faqs %>
|
||||
<% url = @product ? product_faq_path(@product, @category) : general_faq_path(@category) %>
|
||||
<li><%= link_to faq.question, "##{faq.url_param}" %></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<% for faq in @faqs %>
|
||||
<h2><a name="<%= faq.url_param %>"><%= faq.question %></a></h2>
|
||||
<div class="answer"><%= render :inline => faq.answer %></div>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="right">
|
||||
<h4><%= t("txt.faqs.other_faqs") %></h4>
|
||||
<ul class="faqs-links">
|
||||
<% if @product %>
|
||||
<%= faqs_links(@products, @product) %>
|
||||
<% else %>
|
||||
<%= faqs_links(@products) %>
|
||||
<% end %>
|
||||
</ul>
|
||||
|
||||
<h4><%= t("txt.faqs.cant_find") %></h4>
|
||||
<p><%= t("txt.faqs.try_search") %></p>
|
||||
<p><%= t("txt.faqs.contact_us") %></p>
|
||||
|
||||
<div class="fpbox">
|
||||
<h2><%= featured_product.name %></h2>
|
||||
<%= screenshot_link(featured_product.screenshot) %>
|
||||
<p><%= featured_product.short_description %></p>
|
||||
<div class="buttonz">
|
||||
<%= download_link(featured_product) %>
|
||||
<%= buy_professional(featured_product) %>
|
||||
<%= buy_standard(featured_product) %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
29
app/views/feeds/index.rss.builder
Normal file
29
app/views/feeds/index.rss.builder
Normal file
@@ -0,0 +1,29 @@
|
||||
xml.instruct! :xml, :version => "1.0"
|
||||
xml.rss :version => "2.0" do
|
||||
xml.channel do
|
||||
xml.title t('txt.rss.title')
|
||||
xml.description t('txt.rss.description')
|
||||
xml.link feeds_url
|
||||
|
||||
for post in @posts
|
||||
xml.item do
|
||||
if post.is_a? Release
|
||||
link = releases_page_url(post.product, post.version)
|
||||
xml.title t('txt.home.new_release', :product => strip_version(post.product.name), :version => post.version)
|
||||
if post.has_changelog?
|
||||
xml.description t('txt.rss.release_description', :whats_new_url => link, :download_url => download_url(post.product))
|
||||
else
|
||||
xml.description link_to(t('txt.rss.download_latest_release'), download_url(post.product))
|
||||
end
|
||||
xml.pubDate post.date.to_datetime.to_s(:rfc822)
|
||||
xml.link link
|
||||
else
|
||||
xml.title post.title
|
||||
xml.description post.intro
|
||||
xml.pubDate post.date.to_s(:rfc822)
|
||||
xml.link post.url
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
10
app/views/home/_buttons_logos.html.erb
Normal file
10
app/views/home/_buttons_logos.html.erb
Normal file
@@ -0,0 +1,10 @@
|
||||
<div class="buttons-hp buttons-hp-<%= layout_type %>">
|
||||
<%= download_link(featured_product, "standard", t('txt.home.free_download')) %>
|
||||
<%= more_link_button(featured_product) %>
|
||||
<%= buy_link(featured_product) %>
|
||||
<div class="logos">
|
||||
<%= image_tag('logo-dotnet.gif', :alt => "Microsoft .NET") %>
|
||||
<%= image_tag('logo-vs.gif', :alt => "Microsoft Visual Studio") %>
|
||||
<%= image_tag('logo-win.gif', :alt => "Microsoft Windows") %>
|
||||
</div>
|
||||
</div>
|
||||
125
app/views/home/_draft.html.erb
Normal file
125
app/views/home/_draft.html.erb
Normal file
@@ -0,0 +1,125 @@
|
||||
<h3 class="compatiblehd">Better ListView is compatible with:</h3>
|
||||
|
||||
<div class="compatiblelists">
|
||||
<ul class="compatiblelist list-l">
|
||||
<li class="logo vs"><%= image_tag('logo-vs-big.gif') %></li>
|
||||
<li>Visual Studio 2005, 2008, 2010, and newer.</li>
|
||||
<li>C#, Visual Basic .NET (VB.NET), managed C++, and other CLI languages.</li>
|
||||
</ul>
|
||||
|
||||
<ul class="compatiblelist list-r">
|
||||
<li class="logo dotnet"><%= image_tag('logo-dotnet-big.gif') %></li>
|
||||
<li>.NET 2, .NET 3, .NET 3.5, .NET 4, and newer.</li>
|
||||
<li>Windows 2000, XP, 2003, Vista, 7, and newer, both 32-bit and 64-bit.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="lists">
|
||||
|
||||
<div class="list-l">
|
||||
<h3>Better ListView<strong> advantages:</strong></h3>
|
||||
|
||||
<ul class="common checklist">
|
||||
<li>Single small DLL file (less than 250kB when compressed).</li>
|
||||
<li>Easy deployment (xcopy). No dependencies. No installation.</li>
|
||||
<li>Royalty-free distribution. No runtime licensing.</li>
|
||||
<li>Written from scratch in pure managed code.</li>
|
||||
<li>Lightning fast, optimized for 100.000+ items.</li>
|
||||
<li>Minimum learning needed. Very similar to regular .NET ListView control.</li>
|
||||
<li>User-friendly and developer-friendly.</li>
|
||||
<li>No limits of the regular Microsoft .NET ListView control bundled with Visual Studio!</li>
|
||||
<li>Tested by thousands of users world-wide.</li>
|
||||
<li>Guaranteed continued support and development. We use Better ListView ourselves in our
|
||||
popular and successful desktop products, like
|
||||
<%= link_to 'Swift To-Do List', 'http://www.dextronet.com/swift-to-do-list-software', :class => "nowrap" %>.</li>
|
||||
<li>Well documented, intuitive method/properties names.</li>
|
||||
<li>Always looks great. Always fully uses the current Windows theme, including Aero support.</li>
|
||||
<li>Enterprise source code licenses available.</li>
|
||||
<li>Well documented.</li>
|
||||
<li>Fast 24-hour or faster support.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="list-r">
|
||||
<h3>BetterListView<strong> extra features:</strong></h3>
|
||||
|
||||
<p>Better ListView has hundreds of extra features, compared to the regular .NET ListView control.
|
||||
Plus, it removes all its limitations and bugs. Some of the most notable extra features include:</p>
|
||||
|
||||
<ul class="common checklist">
|
||||
<li>Hierarchical items. Supports sub-items like in the tree view control.</li>
|
||||
<li>Thumbnails view.</li>
|
||||
<li>Serialization – XML and Binary</li>
|
||||
<li>Save/load Better ListView content into XML or binary, string or file, in just 1 line of code.</li>
|
||||
<li>Inbuilt drag & drop reordering (with insertion mark indicator).</li>
|
||||
<li>Sub-item images</li>
|
||||
<li>Double-buffered and flicker-free.</li>
|
||||
<li>Highly customizable and flexible.</li>
|
||||
<li>Multi-column sorting.</li>
|
||||
<li>Inbuilt sorting (zero code needed).</li>
|
||||
<li>Checkboxes in all views, 3-state support</li>
|
||||
<li>Better grouping – preserves item order, customizable group headers look and behavior,
|
||||
collapsible, image support, context menu support, focusable, etc.</li>
|
||||
<li>Embedded editing controls, support for custom controls.</li>
|
||||
<li>Many other useful features - <%= link_to 'see more Better ListView features', featured_product %>.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="testimonial-wide">
|
||||
<blockquote>“Better List View is <b>awesome</b>.” – Daniel N.</blockquote>
|
||||
</div>
|
||||
|
||||
<div class="tellingct">
|
||||
<div class="tellingcnt">
|
||||
<h3 class="tellinghd">Why is Better ListView the best ListView<br />replacement component for .NET (C#, VB)?</h3>
|
||||
|
||||
<p>To put it simply, there is nothing like Better ListView out there. Nothing.</p>
|
||||
|
||||
<p>Better ListView has been designed as a component that can easily replace the original
|
||||
ListView control supplied with .NET.</p>
|
||||
|
||||
<p>There is virtually no learning needed. It’s just intuitive.</p>
|
||||
|
||||
<p>Better ListView looks native and always fully utilizes the current system theme (so there is
|
||||
no weird inconsistent look), and it also behaves exactly like it should. We’ve modeled it after
|
||||
the original list view component and the list view used in Windows Explorer – everyone already
|
||||
knows how to use it. It fully leverages the previous user knowledge.</p>
|
||||
|
||||
<p>We put extreme attention to details. All the little quirks and nuances that drive us crazy when
|
||||
it comes to components of many smaller vendors are resolved in Better ListView. You will be
|
||||
amazed how flexible and customizable it is, and how great it feels to use it. The users of your
|
||||
application will feel right at home.</p>
|
||||
|
||||
<p>And most importantly, Better ListView is packed full of great features.</p>
|
||||
|
||||
<p>If you are wondering why we created Better ListView, you can read
|
||||
<%= link_to 'our story', story_path(featured_product) %>.</p>
|
||||
|
||||
<p class="ending">And by the way, Better ListView comes with awesome samples gallery. Download and install
|
||||
the trial package right now and see for yourself what Better ListView can do:</p>
|
||||
</div>
|
||||
|
||||
<div class="testimonial ">
|
||||
<blockquote>Better ListView really is better - it kills the standard!</blockquote>
|
||||
<em>Mitchell V.</em>
|
||||
</div>
|
||||
|
||||
<div class="testimonial">
|
||||
<blockquote>Better ListView really is better - it kills the standard .NET ListView in both
|
||||
performance and flexibility. I'll never use anything else!</blockquote>
|
||||
<em>Mitchell V.</em>
|
||||
</div>
|
||||
|
||||
<div class="testimonial">
|
||||
<blockquote>I'll never use anything else!</blockquote>
|
||||
<em>Mitchell V.</em>
|
||||
</div>
|
||||
|
||||
<div class="testimonial">
|
||||
<blockquote>Better ListView really is better - it kills the standard .NET ListView in both
|
||||
performance and flexibility. I'll never use anything else!</blockquote>
|
||||
<em>Mitchell V.</em>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
23
app/views/home/index.html.erb
Normal file
23
app/views/home/index.html.erb
Normal file
@@ -0,0 +1,23 @@
|
||||
<div class="d-placing">
|
||||
|
||||
<h1 class="homehd"><span><%= featured_product.featured_phrase.title %></span></h1>
|
||||
<h2 class="homeph"><%= render :inline => featured_product.featured_phrase %></h2>
|
||||
<h2 class="homeph"><%= featured_product.description('featured-subphrase') %></h2>
|
||||
|
||||
<div class="hp-wrap">
|
||||
<%= render :partial => "buttons_logos", :locals => { :layout_type => "vertical" } %>
|
||||
<iframe width="560" height="315" src="http://www.youtube.com/embed/hsY5OLRwNYw" frameborder="0" allowfullscreen></iframe>
|
||||
</div>
|
||||
|
||||
<div class="home-static">
|
||||
|
||||
<%= render :inline => @static_page.html %>
|
||||
<%#= render :partial => "draft" %>
|
||||
|
||||
<div class="darrows"></div>
|
||||
<%= render :partial => "buttons_logos", :locals => { :layout_type => "horizontal" } %>
|
||||
|
||||
<%= render :partial => "shared/sharethis" %>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
16
app/views/landing_pages/_actions.html.erb
Normal file
16
app/views/landing_pages/_actions.html.erb
Normal file
@@ -0,0 +1,16 @@
|
||||
<div class="buttons">
|
||||
<%= download_link(featured_product, "standard", t('txt.home.free_download')) %>
|
||||
<%= buy_link(featured_product, "pricing", t('txt.home.pricing')) %>
|
||||
<%= image_tag("simple/logos.gif", :alt => ".NET, Visual Studio, Windows", :class => "logos") %>
|
||||
</div>
|
||||
|
||||
<div class="moreinfo">
|
||||
<h4><strong>Send me more info please</strong> (Comparison table and more):</h4>
|
||||
<% remote_form_for newsletter_subscription("landing-page"), :html => { :"data-progress" => "Sending...", :id => newsletter_form_id,
|
||||
:onsubmit => "if (!validate_newsletter_form(this)) return false" } do |f| -%>
|
||||
<%= f.hidden_field :subscription_location_id %>
|
||||
<%= hidden_field_tag "form_id", "##{newsletter_form_id}" %>
|
||||
<%= f.text_field :email, :value => t("txt.common.your_email"), :class => "email inline-label" %><%= subscribe :small, "Send", :btn_id => "send-info" %>
|
||||
<%= subscription_lists('landing-page', @product) %>
|
||||
<% end -%>
|
||||
</div>
|
||||
72
app/views/landing_pages/show.html.erb
Normal file
72
app/views/landing_pages/show.html.erb
Normal file
@@ -0,0 +1,72 @@
|
||||
<div class="placed">
|
||||
|
||||
<h1>Better ListView .NET control</h1>
|
||||
<h3>The perfect alternative to the regular .NET List View control with <strong>more features</strong>.</h3>
|
||||
|
||||
<div class="quote">
|
||||
<blockquote>You’ve might already discovered that the regular list view control included with .NET is far from perfect and other alternatives are either insufficient
|
||||
or inflexible overkills. <strong>Better ListView is just what you are looking for. It is the ideal alternative to regular .NET list view control.
|
||||
Learn why now.</strong><br /><em>– Jiri Novotny, Better ListView Project Leader</em></blockquote>
|
||||
</div>
|
||||
|
||||
<%= render :partial => "actions", :locals => { :newsletter_form_id => "new_subscription_a" } %>
|
||||
|
||||
<h2>Why is Better ListView the number one List View control for .NET?</h2>
|
||||
|
||||
<ul class="list">
|
||||
<li>Written from scratch in pure managed C# code, does <strong>not</strong> inherit from regular list view</li>
|
||||
<li>Easy to deploy, single tiny .DLL file (< 200kB when compressed), no dependencies</li>
|
||||
<li>Very light-weight and lightning fast, optimized even for 100 000+ items</li>
|
||||
<li>Developer friendly, minimal learning needed</li>
|
||||
<li>Can easily replace regular list view control in your projects, only very small code changes are needed</li>
|
||||
<li>Fixed all known issues related to regular .NET list view control</li>
|
||||
<li>Double-buffered and flicker free</li>
|
||||
<li>Customizable and flexible</li>
|
||||
<li>Source code licenses available</li>
|
||||
<li><strong>Much</strong> more features (see below)</li>
|
||||
</ul>
|
||||
|
||||
<p><strong>The unique thing about Better ListView</strong> is that we use it in our own consumer desktop applications (for example,
|
||||
<%= link_to "Swift To-Do List", "http://www.dextronet.com/swift-to-do-list-software" %>). Better ListView is therefore thoroughly <strong>tested in the
|
||||
real world by thousands of users</strong>. Also, this <strong>guarantees its continued development and support in the future</strong>. It is not uncommon to find
|
||||
abandoned components by many small component vendors, but that will never happen with Better ListView.</p>
|
||||
|
||||
<h2>The extra features of Better ListView include:</h2>
|
||||
|
||||
<div class="features">
|
||||
|
||||
<ul class="list floated">
|
||||
<li>Better Drag and Drop support (including insertion marker and auto-scroll)</li>
|
||||
<li>3 types of context menus supported (items, column headers, and empty area)</li>
|
||||
<li>Inbuilt sorting (this can save you a lot of time)</li>
|
||||
<li>Inbuilt multi-column sort support</li>
|
||||
<li>Excellent images support, smooth resizing, column-headers images supported</li>
|
||||
<li>Each sub-item can have its own image</li>
|
||||
<li>Better checkboxes, can be used in all layouts, 3-state, improved behavior</li>
|
||||
<li>XML Serialization</li>
|
||||
<li>Embedded controls support</li>
|
||||
<li>Sub-item label editing</li>
|
||||
<li>More user friendly behavior similar to Windows Explorer list view</li>
|
||||
<li>Advanced hit-test</li>
|
||||
<li>Excellent layout, images and text formatting logic</li>
|
||||
<li>And <strong>much</strong> more</li>
|
||||
</ul>
|
||||
|
||||
<div class="screenshots">
|
||||
<%= link_to(image_tag("simple/lp-ss1.png", :alt => "Better ListView"), screenshot_path(13), :class => "screenshot") %>
|
||||
<%= link_to(image_tag("simple/lp-ss2.png", :alt => "Better ListView"), screenshot_path(2), :class => "screenshot") %>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<p>Don't hesitate and <strong><%= download_link_to "download", @product %></strong> the free Better ListView trial package <strong>now</strong>.</p>
|
||||
|
||||
<%= render :partial => "actions", :locals => { :newsletter_form_id => "new_subscription_b" } %>
|
||||
|
||||
<div class="contact-form-ct">
|
||||
<p class="airmail"><strong><%= t("txt.product.any_questions") %></strong></p>
|
||||
<%= contact_form(:show_product_select => false, :split_layout => true) %>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="owl"><%= image_tag "simple/owl.gif", :alt => "Component Owl" %></div>
|
||||
48
app/views/layouts/application.html.erb
Normal file
48
app/views/layouts/application.html.erb
Normal file
@@ -0,0 +1,48 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:fb="http://www.facebook.com/2008/fbml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<%= render :partial => "shared/meta" %>
|
||||
<%= cached_stylesheets_base %>
|
||||
<%= yield :header %>
|
||||
</head>
|
||||
<body<%= ' class="d-homepage"' if @controller.controller_name == "home" %>>
|
||||
|
||||
<div class="d-page">
|
||||
|
||||
<%= render :partial => "shared/header" %>
|
||||
|
||||
<% if @controller.controller_name == "home" %>
|
||||
|
||||
<div class="d-content-wrap">
|
||||
<%= yield %>
|
||||
</div>
|
||||
|
||||
<% else %>
|
||||
|
||||
<div class="d-placing">
|
||||
<div class="d-content-wrap">
|
||||
<%= yield %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<% end %>
|
||||
|
||||
<%= render :partial => "shared/footer" %>
|
||||
|
||||
</div>
|
||||
|
||||
<%= cached_javascripts_app %>
|
||||
<%= page_include %>
|
||||
|
||||
<!-- Place this tag after the last plusone tag -->
|
||||
<script type="text/javascript">
|
||||
(function() {
|
||||
var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
|
||||
po.src = 'https://apis.google.com/js/plusone.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
|
||||
})();
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
15
app/views/layouts/cute_admin.html.erb
Normal file
15
app/views/layouts/cute_admin.html.erb
Normal file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
|
||||
<title><%= controller.controller_name.singularize.camelize.constantize.human_name(:count => 2) %></title>
|
||||
<%= stylesheet_link_tag 'cute_admin' %>
|
||||
</head>
|
||||
<body>
|
||||
<% if flash[:notice] -%><p class="flash-notice"><%= flash[:notice] %></p><% end -%>
|
||||
|
||||
<%= yield %>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
17
app/views/layouts/iframe.html.erb
Normal file
17
app/views/layouts/iframe.html.erb
Normal file
@@ -0,0 +1,17 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<%= cached_stylesheets_base %>
|
||||
</head>
|
||||
<body class="d-iframe">
|
||||
|
||||
<%= javascript_tag "var t = #{locales['txt']['javascript'].to_json}" %>
|
||||
|
||||
<%= yield %>
|
||||
|
||||
<%= cached_javascripts_base %>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
18
app/views/layouts/login.html.erb
Normal file
18
app/views/layouts/login.html.erb
Normal file
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cz" lang="cz">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
|
||||
<title>Login</title>
|
||||
<%= stylesheet_link_tag 'login' %>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="d-login">
|
||||
<div class="pad">
|
||||
<%= yield %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
30
app/views/layouts/simple.html.erb
Normal file
30
app/views/layouts/simple.html.erb
Normal file
@@ -0,0 +1,30 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<%= render :partial => "shared/meta" %>
|
||||
<%= cached_stylesheets_simple %>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<%= javascript_tag "var t = #{locales['txt']['javascript'].to_json}" %>
|
||||
|
||||
<div class="d-page">
|
||||
|
||||
<div class="d-border"></div>
|
||||
|
||||
<div class="d-content-wrap">
|
||||
<%= yield %>
|
||||
</div>
|
||||
|
||||
<div class="d-footer">
|
||||
<div class="d-placing">© 2011 Dextronet.com, ComponentOwl.com. All rights reserved. <%= link_to "Go to Component Owl Homepage", root_path %></div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<%= page_include %>
|
||||
<%= cached_javascripts_simple %>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
4
app/views/notifier/claim_upgrade.erb
Normal file
4
app/views/notifier/claim_upgrade.erb
Normal file
@@ -0,0 +1,4 @@
|
||||
Full name: <%= @survey.full_name %>
|
||||
Company name: <%= @survey.company_name %>
|
||||
Purchase email: <%= [[@survey.purchase_email1, @survey.purchase_email2, @survey.purchase_email3] - [""]].flatten.compact.join(", ") %>
|
||||
Current email: <%= @survey.current_email %>
|
||||
1
app/views/notifier/feedback.erb
Normal file
1
app/views/notifier/feedback.erb
Normal file
@@ -0,0 +1 @@
|
||||
<%= @message %>
|
||||
10
app/views/notifier/license_key_error.erb
Normal file
10
app/views/notifier/license_key_error.erb
Normal file
@@ -0,0 +1,10 @@
|
||||
<%= @license_key.error %>
|
||||
|
||||
Source file:
|
||||
---------------------------------------------
|
||||
<%= @license_key.source_file_data.join("\n") %>
|
||||
|
||||
|
||||
XML Request:
|
||||
---------------------------------------------
|
||||
<%= @license_key.raw_post_data %>
|
||||
6
app/views/notifier/licenses.erb
Normal file
6
app/views/notifier/licenses.erb
Normal file
@@ -0,0 +1,6 @@
|
||||
<% @licenses.each do |license| %>
|
||||
<%= license[:product].name %>:
|
||||
---------------------------------------------
|
||||
<%= license[:license_keys].join("\n") %>
|
||||
|
||||
<% end %>
|
||||
14
app/views/notifier/recommend.erb
Normal file
14
app/views/notifier/recommend.erb
Normal file
@@ -0,0 +1,14 @@
|
||||
Hi,
|
||||
|
||||
Your friend <%= @survey.full_name %> wants you to check out Swift To-Do List, the number one task management software for Windows. Have all your tasks and notes in one place - get organized in no time and be more productive.
|
||||
|
||||
More info, screenshots, free 30-day trial at:
|
||||
http://www.dextronet.com/swift-to-do-list-software
|
||||
|
||||
<%= @survey.full_name %> uses Swift To-Do List and is quite happy with it. Why store all your worries, tasks and all that stuff in your head, when you can store it in your computer?
|
||||
|
||||
Snap! It's like an instant brain upgrade.
|
||||
|
||||
With the best regards,
|
||||
Jiri Novotny
|
||||
Dextronet.com
|
||||
6
app/views/notifier/survey.erb
Normal file
6
app/views/notifier/survey.erb
Normal file
@@ -0,0 +1,6 @@
|
||||
Full name: <%= @survey.full_name %>
|
||||
Company name: <%= @survey.company_name %>
|
||||
Purchase email: <%= [[@survey.purchase_email1, @survey.purchase_email2, @survey.purchase_email3] - [""]].flatten.compact.join(", ") %>
|
||||
Email address: <%= @survey.current_email %>
|
||||
|
||||
<%= survey(@survey.survey) %>
|
||||
205
app/views/orders/_draft.html.erb
Normal file
205
app/views/orders/_draft.html.erb
Normal file
@@ -0,0 +1,205 @@
|
||||
<h1>Licensing & pricing for Better ListView</h1>
|
||||
<p class="section-info">Purchase the ideal replacement component for .NET ListView.</p>
|
||||
|
||||
<ul id="buy-nav" class="nav">
|
||||
<li><%= link_to("Buy new licenses", {}, :class => "current") %></li>
|
||||
<li><%= link_to("Renew subscription", {}) %></li>
|
||||
</ul>
|
||||
|
||||
<div id="buy-panels">
|
||||
<div class="panel">
|
||||
|
||||
<% form_tag "https://secure.bmtmicro.com/servlets/Orders.ShoppingCart", :method => :get do -%>
|
||||
<%= hidden_field_tag "CID", Settings.order.cid %>
|
||||
<%= hidden_field_tag "CLR", Settings.order.clr %>
|
||||
<%= hidden_field_tag "PRODUCTID", "", :class => "product-id" %>
|
||||
|
||||
<table cellspacing="0">
|
||||
<tr>
|
||||
<th colspan="4">Single developer licenses</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Single developer license with 1 year subscription</td>
|
||||
<td class="price">$345</td>
|
||||
<td class="addon">
|
||||
<%= check_box_tag "PRODUCTID", "18300056", false, :id => "support-single" %>
|
||||
<%= label_tag "support-single", "Add 1 year priority support ($99)" %>
|
||||
</td>
|
||||
<td class="buy"><%= buy "18300042" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="4">5 developers licenses</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>5 developer license with 1 year subscription</td>
|
||||
<td class="price">$995</td>
|
||||
<td class="addon">
|
||||
<%= check_box_tag "PRODUCTID", "18300057", false, :id => "support-5" %>
|
||||
<%= label_tag "support-5", "Add 1 year priority support ($295)" %>
|
||||
</td>
|
||||
<td class="buy"><%= buy "18300044" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="4">Site licenses - use at 1 site (office or building)</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Site license with 1 year subscription</td>
|
||||
<td class="price">$1995</td>
|
||||
<td class="addon" rowspan="2">
|
||||
<%= check_box_tag "PRODUCTID", "18300058", false, :id => "support-site" %>
|
||||
<%= label_tag "support-site", "Add 1 year priority support ($495)" %>
|
||||
</td>
|
||||
<td class="buy"><%= buy "18300046" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Site license with source code and 1 year subscription</td>
|
||||
<td class="price">$3995</td>
|
||||
<td class="buy"><%= buy "18300047" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="4">Enterprise license - use world-wide at unlimited sites</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Enterprise license with source code and 1 year subscription</td>
|
||||
<td class="price">$8995</td>
|
||||
<td class="addon">
|
||||
<%= check_box_tag "PRODUCTID", "18300059", false, :id => "support-enterprise" %>
|
||||
<%= label_tag "support-enterprise", "Add 1 year priority support ($995)" %>
|
||||
</td>
|
||||
<td class="buy"><%= buy "18300048" %></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<% end -%>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
|
||||
<% form_tag "https://secure.bmtmicro.com/servlets/Orders.ShoppingCart", :method => :get do -%>
|
||||
<%= hidden_field_tag "CID", Settings.order.cid %>
|
||||
<%= hidden_field_tag "CLR", Settings.order.clr %>
|
||||
<%= hidden_field_tag "PRODUCTID", "", :class => "product-id" %>
|
||||
|
||||
<table cellspacing="0">
|
||||
<tr>
|
||||
<th colspan="4">Single developer licenses</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Renew single developer 1 year subscription</td>
|
||||
<td class="price">$138</td>
|
||||
<td class="addon">
|
||||
<%= check_box_tag "PRODUCTID", "18300056", false, :id => "renew-support-single" %>
|
||||
<%= label_tag "renew-support-single", "Add 1 year priority support ($99)" %>
|
||||
</td>
|
||||
<td class="buy"><%= renew "18300049" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="4">5 developers licenses</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Renew 5 developer 1 year subscription</td>
|
||||
<td class="price">$398</td>
|
||||
<td class="addon">
|
||||
<%= check_box_tag "PRODUCTID", "18300057", false, :id => "renew-support-5" %>
|
||||
<%= label_tag "renew-support-5", "Add 1 year priority support ($295)" %>
|
||||
</td>
|
||||
<td class="buy"><%= renew "18300051" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="4">Site licenses - use at 1 site (office or building)</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Renew site license 1 year subscription</td>
|
||||
<td class="price">$798</td>
|
||||
<td class="addon" rowspan="2">
|
||||
<%= check_box_tag "PRODUCTID", "18300058", false, :id => "renew-support-site" %>
|
||||
<%= label_tag "renew-support-site", "Add 1 year priority support ($495)" %>
|
||||
</td>
|
||||
<td class="buy"><%= renew "18300053" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Renews site license 1 year subscription with source code</td>
|
||||
<td class="price">$1598</td>
|
||||
<td class="buy"><%= renew "18300054" %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="4">Enterprise license - use world-wide at unlimited sites</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Renew enterprise license 1 year subscription with source code</td>
|
||||
<td class="price">$3598</td>
|
||||
<td class="addon">
|
||||
<%= check_box_tag "PRODUCTID", "18300059", false, :id => "renew-support-enterprise" %>
|
||||
<%= label_tag "renew-support-enterprise", "Add 1 year priority support ($995)" %>
|
||||
</td>
|
||||
<td class="buy"><%= renew "18300055" %></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<% end -%>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="licenses-info">
|
||||
|
||||
<div class="block">
|
||||
<h3>All licenses are:</h3>
|
||||
<ul class="common">
|
||||
<li>Life-time (non-expiring)</li>
|
||||
<li>Royalty free</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="block">
|
||||
<h3>Subscription gets you:</h3>
|
||||
<ul class="common">
|
||||
<li>Support</li>
|
||||
<li>Updates</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="block last">
|
||||
<h3>Priority support gets you:</h3>
|
||||
<ul class="common">
|
||||
<li>Guaranteed 24 hour reply</li>
|
||||
<li>Help with implementing new features and extending Better ListView</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="licenses-info">
|
||||
|
||||
<h3>What license do I need?</h3>
|
||||
<ul class="common">
|
||||
<li>If only 1 developer works on your current and future projects, then the "Single developer license" is for you.</li>
|
||||
<li>If 2-5 developers works on your current and future projects, then the "5 developer license" is for you.</li>
|
||||
<li>If more than 5 developers work on your current and future projects, then the "Site license" is for you.</li>
|
||||
<li>If you have multiple teams in different locations, then the "Enterprise license" is for you.</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="licenses-info componentsource">
|
||||
|
||||
<h3>Resellers and Customer Service, Contact Sales</h3>
|
||||
|
||||
<div class="block">
|
||||
<p><strong>US and Canada</strong><br />Toll Free: 888 850 9911 (24 hour)</p>
|
||||
</div>
|
||||
|
||||
<div class="block">
|
||||
<p><strong>United Kingdom</strong><br />Toll Free: 0800 581111 (24 hour)</p>
|
||||
</div>
|
||||
|
||||
<div class="block last">
|
||||
<p>Or call us free of charge from <%= link_to "these countries", customer_service_path %>.</p>
|
||||
</div>
|
||||
|
||||
<br /><br /><br />
|
||||
|
||||
<%= image_tag "CSLogo.gif", :alt => "ComponentSource.com" %>
|
||||
|
||||
</div>
|
||||
7
app/views/orders/show.html.erb
Normal file
7
app/views/orders/show.html.erb
Normal file
@@ -0,0 +1,7 @@
|
||||
<div class="order-content">
|
||||
|
||||
<%= render :inline => @page.html %>
|
||||
|
||||
<%#= render :partial => "draft" %>
|
||||
|
||||
</div>
|
||||
145
app/views/pad/show.xml.builder
Normal file
145
app/views/pad/show.xml.builder
Normal file
@@ -0,0 +1,145 @@
|
||||
xml.instruct! :xml, :version => "1.0"
|
||||
xml.XML_DIZ_INFO do
|
||||
xml.MASTER_PAD_VERSION_INFO do
|
||||
xml.MASTER_PAD_VERSION val('MASTER_PAD_VERSION')
|
||||
xml.MASTER_PAD_EDITOR val('MASTER_PAD_EDITOR')
|
||||
xml.MASTER_PAD_INFO val('MASTER_PAD_INFO')
|
||||
end
|
||||
xml.Company_Info do
|
||||
xml.Company_Name val('Company_Name')
|
||||
xml.Address_1 val('Address_1')
|
||||
xml.Address_2 val('Address_2')
|
||||
xml.City_Town val('City_Town')
|
||||
xml.State_Province val('State_Province')
|
||||
xml.Zip_Postal_Code val('Zip_Postal_Code')
|
||||
xml.Country val('Country')
|
||||
xml.Company_WebSite_URL val('Company_WebSite_URL')
|
||||
xml.Contact_Info do
|
||||
xml.Contact_First_Name val('Contact_First_Name')
|
||||
xml.Contact_Last_Name val('Contact_Last_Name')
|
||||
xml.Contact_Email val('Contact_Email')
|
||||
xml.Author_First_Name val('Author_First_Name')
|
||||
xml.Author_Last_Name val('Author_Last_Name')
|
||||
xml.Author_Email val('Author_Email')
|
||||
end
|
||||
xml.Support_Info do
|
||||
xml.Sales_Email val('Sales_Email')
|
||||
xml.Support_Email val('Support_Email')
|
||||
xml.General_Email val('General_Email')
|
||||
xml.Sales_Phone val('Sales_Phone')
|
||||
xml.Support_Phone val('Support_Phone')
|
||||
xml.General_Phone val('General_Phone')
|
||||
xml.Fax_Phone val('Fax_Phone')
|
||||
end
|
||||
end
|
||||
xml.ASP do
|
||||
xml.ASP_FORM val('ASP_FORM')
|
||||
xml.ASP_Member val('ASP_Member')
|
||||
xml.ASP_Member_Number val('ASP_Member_Number')
|
||||
end
|
||||
xml.NewsFeed do
|
||||
xml.NewsFeed_FORM val('NewsFeed_FORM')
|
||||
xml.NewsFeed_VERSION val('NewsFeed_VERSION')
|
||||
xml.NewsFeed_URL val('NewsFeed_URL')
|
||||
xml.NewsFeed_Type val('NewsFeed_Type')
|
||||
xml.NewsFeed_Language val('NewsFeed_Language')
|
||||
xml.NewsFeed_Purpose val('NewsFeed_Purpose')
|
||||
xml.NewsFeed_Author_Email val('NewsFeed_Author_Email')
|
||||
xml.NewsFeed_Author_First_Name val('NewsFeed_Author_First_Name')
|
||||
xml.NewsFeed_Author_Last_Name val('NewsFeed_Author_Last_Name')
|
||||
xml.NewsFeed_DESCRIPTION val('NewsFeed_DESCRIPTION')
|
||||
xml.NewsFeed_Feed_URL val('NewsFeed_Feed_URL')
|
||||
xml.NewsFeed_Site_Name val('NewsFeed_Site_Name')
|
||||
xml.NewsFeed_Site_URL val('NewsFeed_Site_URL')
|
||||
xml.NewsFeed_Title val('NewsFeed_Title')
|
||||
xml.NewsFeed_Description_70 val('NewsFeed_Description_70')
|
||||
xml.NewsFeed_Description_250 val('NewsFeed_Description_250')
|
||||
end
|
||||
xml.Site do
|
||||
xml.Site_FORM val('Site_FORM')
|
||||
xml.Site_VERSION val('Site_VERSION')
|
||||
xml.Site_URL val('Site_URL')
|
||||
xml.Site_DESCRIPTION val('Site_DESCRIPTION')
|
||||
xml.Site_Contact_Email val('Site_Contact_Email')
|
||||
xml.Site_Contact_First_Name val('Site_Contact_First_Name')
|
||||
xml.Site_Contact_Last_Name val('Site_Contact_Last_Name')
|
||||
xml.Site_Site_Title val('Site_Site_Title')
|
||||
xml.Site_Site_URL product_link
|
||||
xml.Site_Description_100 val('Site_Description_100')
|
||||
xml.Site_Description_250 val('Site_Description_250')
|
||||
xml.Site_Description_450 val('Site_Description_450')
|
||||
xml.Site_Keywords val('Site_Keywords')
|
||||
end
|
||||
xml.Program_Info do
|
||||
xml.Program_Name name
|
||||
xml.Program_Version version
|
||||
xml.Program_Release_Month release_month
|
||||
xml.Program_Release_Day release_day
|
||||
xml.Program_Release_Year release_year
|
||||
xml.Program_Cost_Dollars price
|
||||
xml.Program_Type val('Program_Type')
|
||||
xml.Program_Release_Status val('Program_Release_Status')
|
||||
xml.Program_Install_Support val('Program_Install_Support')
|
||||
xml.Program_OS_Support val('Program_OS_Support')
|
||||
xml.Program_Language val('Program_Language')
|
||||
xml.Program_Change_Info val('Program_Change_Info')
|
||||
xml.Program_System_Requirements val('Program_System_Requirements')
|
||||
xml.Program_Category_Class val('Program_Category_Class')
|
||||
xml.File_Info do
|
||||
xml.File_Size_Bytes size_b
|
||||
xml.File_Size_K size_kb
|
||||
xml.File_Size_MB size_mb
|
||||
xml.Filename_Versioned ""
|
||||
xml.Filename_Previous ""
|
||||
xml.Filename_Generic ""
|
||||
xml.Filename_Long ""
|
||||
end
|
||||
xml.Expire_Info do
|
||||
xml.Has_Expire_Info val('Has_Expire_Info')
|
||||
xml.Expire_Count val('Expire_Count')
|
||||
xml.Expire_Based_On val('Expire_Based_On')
|
||||
xml.Expire_Other_Info val('Expire_Other_Info')
|
||||
xml.Expire_Month val('Expire_Month')
|
||||
xml.Expire_Day val('Expire_Day')
|
||||
xml.Expire_Year val('Expire_Year')
|
||||
end
|
||||
xml.Limitations val('Limitations')
|
||||
xml.Program_Categories val('Program_Categories')
|
||||
xml.Program_Cost_Other_Code ""
|
||||
xml.Program_Cost_Other ""
|
||||
xml.Awards val('Awards')
|
||||
xml.Program_Specific_Category val('Program_Specific_Category')
|
||||
xml.Includes_JAVA_VM val('Includes_JAVA_VM')
|
||||
xml.Includes_VB_Runtime val('Includes_VB_Runtime')
|
||||
xml.Includes_DirectX val('Includes_DirectX')
|
||||
end
|
||||
xml.Web_Info do
|
||||
xml.Application_URLs do
|
||||
xml.Application_Info_URL product_link
|
||||
xml.Application_Order_URL (val('Application_Order_URL').present? ? val('Application_Order_URL') : buy_link)
|
||||
xml.Application_Screenshot_URL val('Application_Screenshot_URL')
|
||||
xml.Application_Icon_URL val('Application_Icon_URL')
|
||||
xml.Application_XML_File_URL pad_link
|
||||
end
|
||||
xml.Download_URLs do
|
||||
xml.Primary_Download_URL setup_file_link
|
||||
xml.Secondary_Download_URL ""
|
||||
xml.Additional_Download_URL_1 ""
|
||||
xml.Additional_Download_URL_2 ""
|
||||
end
|
||||
end
|
||||
xml.Permissions do
|
||||
xml.Distribution_Permissions val('Distribution_Permissions')
|
||||
xml.EULA val('EULA')
|
||||
end
|
||||
xml.Program_Descriptions do
|
||||
xml.English do
|
||||
xml.Keywords val('Keywords')
|
||||
xml.Char_Desc_45 val('Char_Desc_45')
|
||||
xml.Char_Desc_80 val('Char_Desc_80')
|
||||
xml.Char_Desc_250 val('Char_Desc_250')
|
||||
xml.Char_Desc_450 val('Char_Desc_450')
|
||||
xml.Char_Desc_2000 val('Char_Desc_2000')
|
||||
end
|
||||
end
|
||||
end
|
||||
4
app/views/product_editions/_edition.html.erb
Normal file
4
app/views/product_editions/_edition.html.erb
Normal file
@@ -0,0 +1,4 @@
|
||||
<div class="edition-popup-content">
|
||||
<div class="heading"><%= t('txt.order.stdl_editions_difference') %></div>
|
||||
<%= @edition.description %>
|
||||
</div>
|
||||
1
app/views/product_editions/show.html.erb
Normal file
1
app/views/product_editions/show.html.erb
Normal file
@@ -0,0 +1 @@
|
||||
<p>The Professional edition has all the features the Standard edition has and many extra.</p><p>It allows you to easily <strong>email tasks</strong> to others or to yourself. Set <strong>Start Date</strong> and <strong>Completion Date</strong> for your tasks. <strong>Assign</strong> tasks using <strong>Assigned To</strong> field. Track your progress more precisely using <strong>Percent Done</strong> field and <strong>Status</strong> field. Use <strong>Time Estimate</strong> and <strong>Time Spent</strong> fields for instant clarity about time needed and time spent for each task. <strong>Context</strong> field helps you to better categorize your tasks.</p><p>The best part is: <strong>You decide</strong> which fields you want to use, and which to <strong>completely</strong> hide (this is a unique feature).</p>
|
||||
132
app/views/products/_draft.html.erb
Normal file
132
app/views/products/_draft.html.erb
Normal file
@@ -0,0 +1,132 @@
|
||||
<div class="features-page">
|
||||
<ul class="common">
|
||||
<li>Better ListView is a <strong>list view control for .NET Windows Forms</strong> (C#, VB.net) with full Visual Studio support.</li>
|
||||
<li>Designed as a replacement for the regular .NET list view control.</li>
|
||||
<li>Better ListView has <strong>more features and flexibility</strong>, always uses the <strong>current system theme</strong> (including <strong>Aero</strong> support), and <strong>removes limitations</strong> of the regular .NET list view control.</li>
|
||||
<li><strong>Minimum learning needed</strong>. Better ListView can be used just like the regular list view.</li>
|
||||
<li>Written in <strong>pure managed C# code</strong>. It is fast, <strong>light-weight</strong> and optimized for 100k+ items.</li>
|
||||
<li>Easy royalty-free deployment. Single DLL file that has just 180kB when compressed.</li>
|
||||
<li>Tested in the real world by thousands of users</li>
|
||||
</ul>
|
||||
|
||||
<div class="image"><img src="http://assets.componentowl.com/images/7/Overview Collage_original_1298555587.png?1298555587" alt="" /></div>
|
||||
|
||||
<h2>Extra features summary</h2>
|
||||
Better ListView is fast and flicker-free, has better drag & drop and item reordering support, better column headers, inbuilt sorting, multi-column sorting, better images support, context menus for column headers and items, embedded controls for editing support, automatic and custom sizing of items and images, thumbnails view, richer event data, item text formatting, XML serialization, data-binding, owner-drawing options, better tooltips, powerful hit-test, improved usability, and more.
|
||||
|
||||
<% testimonial :author => "DevProConnections.com Review" do -%>
|
||||
The control is <b>very easy and intuitive to use and is well documented</b>.
|
||||
<% end -%>
|
||||
<h3>Double-buffered and flicker free</h3>
|
||||
Simply put, Better ListView is smooth. Regular listview requires multiple anti-flicker techniques, but you do not have to worry about that with Better ListView. Better ListView is optimized for 100k+ items.
|
||||
<h3>Column header images</h3>
|
||||
You can use images in column headers. Custom image sizes are supported.
|
||||
|
||||
<div class="image"><img src="http://assets.componentowl.com/images/8/Column Header Images_original_1298624101.png?1298624101" alt="" /></div>
|
||||
|
||||
<h3>Sub-item images</h3>
|
||||
You can set images to list view sub-items. Regular list view allows you to set only one image per list view item, but Better ListView can show image for every sub-item (in every column).
|
||||
<h3>Image-List and Image Support</h3>
|
||||
Better ListView supports both image list, or individual image objects (System.Drawing.Image). Regular list view forces you to use ImageList object.
|
||||
<h3>Custom list view Image size</h3>
|
||||
You can use any image size in the list view. Better ListView can also automatically resize images with preserving aspect ratio.
|
||||
<h3>Drag & drop with insertion mark</h3>
|
||||
Highly customizable drag-drop for both internal and external drag-drop. You can use drop highlight or insertion mark drag drop modes.
|
||||
|
||||
<div class="image"><img src="http://assets.componentowl.com/images/21/List View Item Reordering Mark Preview_original_1298635398.png?1298635398" alt="" /></div>
|
||||
|
||||
<h3>List view item reordering</h3>
|
||||
Better ListView has inbuilt item reordering and item drag & drop inserting at the position specified by user. Drag & drop preview is shown using an insertion mark.
|
||||
<h3>Column-header reordering</h3>
|
||||
Better ListView has inbuilt easy drag & drop column header reordering that is much easier to use than in the regular list view. Insertion mark is shown, auto-scrolling is supported.
|
||||
|
||||
<div class="image"><img src="http://assets.componentowl.com/images/9/Column Header Reordering With Insertion Mark_original_1298624931.png?1298624931" alt="" /></div>
|
||||
|
||||
<h3>Auto-scroll for column header reordering and item reordering</h3>
|
||||
Better ListView has inbuilt auto-scrolling for column header and item reordering.
|
||||
<h3>Column headers can be shown in all views</h3>
|
||||
Better ListView can display column headers in all views - Details, SmallIcons, LargeIcons, List, Tile, Thumbnails. This allows users to sort items in all views. Additionally, you can also hide the column headers even in the details view.
|
||||
|
||||
<div class="image"><img src="http://assets.componentowl.com/images/10/Column Headers In LargeIcons View_original_1298625638.png?1298625638" alt="" /></div>
|
||||
|
||||
<h3>Thumbnails view mode</h3>
|
||||
Better ListView supports additional "thumbnails" view mode that allows you to view images of large sizes. The images are automatically and smoothly resized with preserved aspect ratio. You can define the maximum/minimum desired image sizes.
|
||||
<h3>Image shadows, borders and padding</h3>
|
||||
All images in Better ListView can have border or shadow specified. You can also specify padding that gives you space for owner drawing (eg. overlay images). This can be used in all views.
|
||||
|
||||
Image shadows like in Windows 7 theme are supported. Windows Explorer uses very similar shadows for image thumbnails.
|
||||
|
||||
<div class="image"><img src="http://assets.componentowl.com/images/11/ListView Image Shadows and Image Borders_original_1298626278.png?1298626278" alt="" /></div>
|
||||
|
||||
<h3>Multi-column sorting</h3>
|
||||
You can sort by multiple columns in Better ListView. Simply shift+click a secondary (or third, etc) column to add it to the current sort. Zero code needed. Additionally, the background of the primary (first) sort column can be highlighted.
|
||||
|
||||
<div class="image"><img src="http://assets.componentowl.com/images/12/Multi Column Sort in List View_original_1298626613.png?1298626613" alt="" /></div>
|
||||
|
||||
<h3>Inbuilt sorting and natural sorting</h3>
|
||||
Better ListView has inbuilt list view sorting that works out of the box. You no longer need to implement your own item comparer. If custom comparer is needed, you can inherit from the Better ListView comparer to save time.
|
||||
<h3>Richer event data</h3>
|
||||
Many events have richer event data that allow you to do extra operations or tell you extra useful information. The richer events include: AfterItemSort, BeforeDrag, BeforeItemSort, ColumnClick (allows you to cancel sort), DragDropException, DrawBackground, DrawColumnHeaderBackground, DrawColumnHeader, DrawItemBackground, DrawItem, HitTestChanged, ItemActivate (event data tells you how the item got activated - mouse, keyboard or code), ItemDrag, ItemDrop, ItemReorder, ItemSearch, LabelEdit, RequestEmebeddedControl.
|
||||
<h3>Checkboxes in all views</h3>
|
||||
You can have checkboxes in LargeIcons view, SmallIcons view, List view, Thumbnails view and of course also in the Details view.
|
||||
|
||||
<div class="image"><img src="http://assets.componentowl.com/images/13/Checkboxes In LargeIcons View_original_1298626985.png?1298626985" alt="" /></div>
|
||||
|
||||
<h3>Three state checkboxes</h3>
|
||||
Three state checkboxes are supported in Better ListView:
|
||||
|
||||
<div class="image"><img src="http://assets.componentowl.com/images/14/Three State Checkboxes in List View_original_1298628177.png?1298628177" alt="" /></div>
|
||||
|
||||
<h3>Powerful list view tooltips</h3>
|
||||
You can display tooltips for nearly any part of Better ListView - tooltips for items, sub-items, checkboxes, item images, sub-item images, column headers, column header images, column header borders, and even for custom areas (regions). Owner-drawn tooltips are supported.
|
||||
|
||||
<div class="image"><img src="http://assets.componentowl.com/images/15/List View Tooltips Region And Owner Drawn Tooltips_original_1298635957.png?1298635957" alt="" /></div>
|
||||
|
||||
<h3>Uses current Windows theme</h3>
|
||||
Instead of implementing custom, un-native look and feel, Better ListView always automatically fully uses the current system theme. It supports Aero as well. Better ListView always looks great and feels right to the user.
|
||||
<h3>XML serialization of everything</h3>
|
||||
Every part of Better ListView (items, sub-items, column headers) can be both binary and XML serialized. You can easily XML serialize whole list view (or binary serialize) to save it to file or transfer items between controls. Standard ways of .NET serialization can be used (BinaryFormatter, XmlSerializer).
|
||||
<h3>Owner drawing</h3>
|
||||
Better ListView allows you to draw over the client area, items and column headers. Contrary to .NET ListView, owner drawing is fully operational even when the system uses Aero theme. You can draw separately to background and foreground parts of Better ListView without worrying about proper drawing order. Owner drawing events provide rich data, including exact item state and areas of every item part.
|
||||
|
||||
<div class="image"><img src="http://assets.componentowl.com/images/22/List View Owner Drawing Background Gradient_original_1298636653.png?1298636653" alt="" /></div>
|
||||
|
||||
<h3>Context menu for column headers, list items, and empty area</h3>
|
||||
Better ListView supports 3 types of context menus: Column header context menu, list view items context menu, and empty area context menu (when right-clicking white space).
|
||||
|
||||
<div class="image"><img src="http://assets.componentowl.com/images/17/Column Header Context Menu in List View_original_1298633212.png?1298633212" alt="" /></div>
|
||||
|
||||
<h3>Powerful hit-test</h3>
|
||||
The hit test returns very detailed information. It tells you not only the location (Client Area, Sub-Item, Sub-Item Text, Sub-Item Image, Checkbox, Column Header Image, and many more), but it also tells you the state of the item, and part of the item (left or right).
|
||||
<h3>Customizable search-by-typing</h3>
|
||||
Better ListView has excellent customization functionality for find-as-you-type item searching. The search modes include: Prefix (searchs from beginning of items), Substring (search any part of item text), Prefix + Substring, or Disabled. Additionally, search options include: Case sensitive, search first word only, play sound when item not found, prefer prefixes, search whole words. You can also restrict the search to only certain columns. You can also call "FindItemsWithText" function to find items from code.
|
||||
<h3>Display text when the list view is empty</h3>
|
||||
You can display a gray text centered in the list view if it's empty to hint or educate users. This will make your software more user friendly.
|
||||
|
||||
<div class="image"><img src="http://assets.componentowl.com/images/18/Show Text When List View is Empty_original_1298633516.png?1298633516" alt="" /></div>
|
||||
|
||||
<h3>Embedded controls for item editing</h3>
|
||||
Inbuilt in-line editing support includes label edit and combobox edit. You can also embed any custom control for in-line editing.
|
||||
|
||||
<div class="image"><img src="http://assets.componentowl.com/images/19/Custom Embedded Control in List View for Editing_original_1298633863.png?1298633863" alt="" /></div>
|
||||
|
||||
<h3>ListView item text formatting</h3>
|
||||
Supports both text trimming and auto-ellipsis for text that's too long. You can choose from: TrimCharacter, TrimWord, EllipsisCharacter, EllipsisWord, EllipsisPath (for file paths). Column header text can be broken into multiple lines.
|
||||
<h3>Automatic list view layout</h3>
|
||||
Better ListView can auto-size item images, item text, column header images, column header text.
|
||||
|
||||
.. obrazek .
|
||||
<h3>Custom list view item size</h3>
|
||||
You can set custom sizes for item text area and item images. You can also set custom size for column header text area and column header images. (Text area size is different from font size, text area size basically defines the size of the list view item.) This enables you to make tiny/huge column headers or list view items.
|
||||
|
||||
<div class="image"><img src="http://assets.componentowl.com/images/20/Custom Item Size in List View_original_1298634339.png?1298634339" alt="" /></div>
|
||||
|
||||
<h2>More advantages of our improved list view component:</h2>
|
||||
<ul class="common">
|
||||
<li><strong>Developer friendly</strong>: All classes and properties are as similar to the regular list view as possible. Everything is intuitive, very little learning is needed. You can use Better ListView immediately. <strong>Save time and ship sooner</strong>.</li>
|
||||
<li><strong>Better ListView has improved usability and fixed behavior</strong>. All Windows users are familiar with the list view used in Windows Explorer. Better ListView mimicks behavior and look & feel of the Windows Explorer list view as much as possible to leverage the existing user knowledge. <strong>Using Better ListView is pleasant for users.</strong> Many other list view components implement custom look and behavior and can oftentimes downright frustrate users (many controls don't even support mouse-wheel scrolling!) This doesn't happen with Better ListView.</li>
|
||||
<li><strong>Guaranteed support and continued development</strong>: Better ListView is developed as a joint-venture of two software companies that use Better ListView in their main products (popular <strong><a href="http://www.dextronet.com/swift-to-do-list-software" target="_blank">Swift To-Do List</a></strong> and <strong><a href="http://www.imagingshop.com" target="_blank">ImagingShop</a></strong>). These applications are used by thousands of users daily. This is your guarantee that Better ListView will be supported and developed in the future.</li>
|
||||
<li><strong>Tested in real world applications by thousands of users</strong>: Because Better ListView is used in professional consumer desktop software applications - Swift To-Do List and ImagingShop, thousands of users work with Better ListView every day. Although we use unit tests that cover most of code, and do thorough inhouse testing, this is your true guarantee that it is tested thoroughly in the real world. It is <strong>extremely stable</strong>.</li>
|
||||
<li>Better ListView does <strong>not</strong> inherit from the regular .NET list view. It is written in pure managed C# code and is flexible, light weight, and fast. Extensions of the regular .net list view only go so far. Better ListView goes further. Soure code licenses are also available for ultimate customization.</li>
|
||||
</ul>
|
||||
</div>
|
||||
20
app/views/products/_releases.html.erb
Normal file
20
app/views/products/_releases.html.erb
Normal file
@@ -0,0 +1,20 @@
|
||||
<% form_tag releases_page_path(@product), :method => :get do %>
|
||||
<div class="changes-since">
|
||||
<%= t("txt.releases.changes_since") %> <%= select_tag "since", versions_for_select(@product.releases.all_ordered, @since_release.version), :class => "autosubmit" %>
|
||||
</div>
|
||||
<% end %>
|
||||
<hr />
|
||||
<% if @since_release == @product.current_release %>
|
||||
<h2 class="first"><%= t('txt.releases.whats_new', :product => @product.name.strip_version, :version => @since_release.version) %></h2>
|
||||
<% else %>
|
||||
<h2 class="first"><%= t('txt.releases.whats_new_since', :product => @product.name.strip_version, :version => @since_release.version) %></h2>
|
||||
<% end %>
|
||||
|
||||
<% for release in @releases %>
|
||||
|
||||
<% unless release.changelog.blank? %>
|
||||
<h3><%= t('txt.releases.changes_in_version', :version => release.version, :date => l(release.date, :format => :cute)) %></h3>
|
||||
<p><%= release.changelog.gsub("\n", "<br />") %></p>
|
||||
<% end %>
|
||||
|
||||
<% end %>
|
||||
19
app/views/products/_social.html.erb
Normal file
19
app/views/products/_social.html.erb
Normal file
@@ -0,0 +1,19 @@
|
||||
<div class="newsletter">
|
||||
<% remote_form_for newsletter_subscription("product-page"), :html => { :id => "new_subscription_product", :onsubmit => "if (!validate_newsletter_form(this)) return false" } do |f| -%>
|
||||
<%= f.hidden_field :subscription_location_id %>
|
||||
<%= hidden_field_tag "form_id", "#new_subscription_product" %>
|
||||
<strong><% if @product.has_updates_newsletter? %><%= t("txt.product.receive_product_updates") %><% else %><%= t("txt.product.receive_updates") %><% end %></strong>
|
||||
<div><%= f.text_field :email, :value => t("txt.common.your_email"), :class => "email inline-label", :id => "product-newsletter-email" %></div>
|
||||
<div id="product-newsleter-lists" class="subscription-lists-ct" style="display: none"><%= subscription_lists('product-page', @product) %></div>
|
||||
<%= subscribe :small %>
|
||||
<% end -%>
|
||||
</div>
|
||||
<div class="sharethis-ct">
|
||||
<strong><%= t('txt.product.sharethis') %></strong>
|
||||
<%= render :partial => "shared/sharethis" %>
|
||||
</div>
|
||||
<% if @product.is_featured? && 1 == 2 %>
|
||||
<div class="fb-like">
|
||||
<fb:like-box profile_id="103814186343723" width="190" height="100" stream="false" header="false"></fb:like-box>
|
||||
</div>
|
||||
<% end %>
|
||||
107
app/views/products/show.html.erb
Normal file
107
app/views/products/show.html.erb
Normal file
@@ -0,0 +1,107 @@
|
||||
<div class="subpage product-content">
|
||||
<h1><%= @product.description('heading') %></h1>
|
||||
|
||||
<p class="section-info"><%= @product.section_description %></p>
|
||||
|
||||
<div class="sides">
|
||||
|
||||
<div class="right">
|
||||
|
||||
<% if @releases %>
|
||||
|
||||
<ul id="nav" class="nav">
|
||||
<li><%= link_to(t('txt.releases.back'), @product, :class => "current") %></li>
|
||||
</ul>
|
||||
|
||||
<div id="nav-panel" class="nav-panel product-detail releases"><%= render :partial => "releases" %></div>
|
||||
|
||||
<% else %>
|
||||
|
||||
<% if @product.tab_product_pages.size > 1 %>
|
||||
|
||||
<%= hidden_field_tag "tabs-initial-index", (@detail ? -1 : 0) %>
|
||||
|
||||
<ul id="nav" class="nav">
|
||||
<% for page in @product.tab_product_pages %>
|
||||
<li><%= link_to(page.name, product_page_path(@product, page), :class => ((@detail && @detail == page) ? "current" : "")) %></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
|
||||
<div id="nav-panel" class="nav-panel product-detail"><%#= render :partial => "draft" %><%= render :inline => @detail.html if @detail %></div>
|
||||
|
||||
<% else %>
|
||||
|
||||
<div id="nav-panel" class="nav-panel single-tab product-detail">
|
||||
<%#= render :partial => "draft" %><%= render :inline => (@product.default_page ? @product.default_page.html : "") %>
|
||||
</div>
|
||||
|
||||
<% end %>
|
||||
|
||||
<% end %>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="left">
|
||||
|
||||
<div class="buttons-box">
|
||||
<%= download_link_trial_or_free(@product) %>
|
||||
<% if better_splitbutton? %>
|
||||
<%= better_slitbutton_buy_link %>
|
||||
<% elsif !@product.free? %>
|
||||
<%= buy_link(@product) %>
|
||||
<% end %>
|
||||
<p><%= t("txt.product.version", :version => @release.version, :date => no_day_zero(l(@release.date, :format => :cute))) if @release %></p>
|
||||
</div>
|
||||
|
||||
<div class="compatibility">
|
||||
<p><strong><%= t('txt.product.compatibility_note') %></strong></p>
|
||||
<div class="documentation">
|
||||
<p><%= link_to_new_window "See Quick Start Guide", quick_start_guide_path(@product) %></p>
|
||||
<p><%= link_to_new_window "See Documentation", documentation_path(@product) %></p>
|
||||
<% if @product.code == "better-listview-express" %>
|
||||
<p><%= link_to_new_window "See Class Reference", class_reference_path(featured_product) %></p>
|
||||
<% else %>
|
||||
<p><%= link_to_new_window "See Class Reference", class_reference_path(@product) %></p>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<% unless in_screenshot_section?(@detail) %>
|
||||
|
||||
<% for screenshot in @screenshots %>
|
||||
<div class="screenshot">
|
||||
<p><%= screenshot_link(screenshot) %></p>
|
||||
</div>
|
||||
<%= render :partial => "social" if @screenshots.size > 1 && @screenshots.first == screenshot %>
|
||||
<% end %>
|
||||
|
||||
<% if @product.has_screenshots? %>
|
||||
<div class="small-button-ct">
|
||||
<%= small_button(t('txt.product.more_screenshots'), screenshots_path(@product)) %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<%= render :partial => "social" unless @screenshots.any? && @screenshots.size > 1 %>
|
||||
|
||||
<% else %>
|
||||
<%= render :partial => "social" %>
|
||||
<% end %>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="buttons-wrap">
|
||||
<div class="buttons">
|
||||
<%= download_link_trial_or_free(@product) %>
|
||||
<% if better_splitbutton? %>
|
||||
<%= better_slitbutton_buy_link %>
|
||||
<% elsif !@product.free? %>
|
||||
<%= buy_link(@product) %>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<%= render :partial => "shared/screenshot_buttons", :object => @product %>
|
||||
5
app/views/releases/_whatsnew.html.erb
Normal file
5
app/views/releases/_whatsnew.html.erb
Normal file
@@ -0,0 +1,5 @@
|
||||
<div class="release-popup-content">
|
||||
<div class="heading"><%= t('txt.releases.whats_new', :product => strip_version(@release.product.name), :version => @release.version) %></div>
|
||||
<div class="buttons-wrap"><div class="buttons"><%= download_link(@release.product, "small") %><%= buy_link(@release.product, "small") %></div></div>
|
||||
<%= @release.description %>
|
||||
</div>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user