Archive: ComponentOwl Rails app, DB backups, go redirect script

This commit is contained in:
EC2 Default User
2026-03-23 16:20:05 +00:00
commit 50037f386f
218 changed files with 14558 additions and 0 deletions

View 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

View 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

View 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

View 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

View 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

View 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

View File

@@ -0,0 +1,6 @@
class CronController < ApplicationController
def resend_support_requests
Cron.resend_support_requests
render :nothing => true
end
end

View 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

View 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

View 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

View File

@@ -0,0 +1,9 @@
class HomeController < ApplicationController
caches_page :index
def index
@static_page = StaticPage['home-blv20']
end
end

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View File

@@ -0,0 +1,2 @@
module ActivationsHelper
end

View 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

View File

@@ -0,0 +1,2 @@
module ArticlesHelper
end

View 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

View 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

View 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

View File

@@ -0,0 +1,2 @@
module FeedsHelper
end

View File

@@ -0,0 +1,2 @@
module HomeHelper
end

View File

@@ -0,0 +1,2 @@
module LandingPagesHelper
end

View 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

View 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
View 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

View File

@@ -0,0 +1,2 @@
module PressHelper
end

View File

@@ -0,0 +1,2 @@
module ProductPagesHelper
end

View 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

View File

@@ -0,0 +1,2 @@
module ReleasesHelper
end

View File

@@ -0,0 +1,2 @@
module ResourcesHelper
end

View 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

View File

@@ -0,0 +1,2 @@
module SubscriptionsHelper
end

View File

@@ -0,0 +1,2 @@
module SupportHelper
end

View File

@@ -0,0 +1,2 @@
module SupportRequestsHelper
end

View 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

View 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
View File

@@ -0,0 +1,2 @@
module WpHelper
end

146
app/models/activation.rb Normal file
View 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

View 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
View 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
View 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
View 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

View 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

View 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
View 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
View 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; }

View 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
View 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;
}

View 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; }
}

View File

@@ -0,0 +1,250 @@
<h1>About Us</h1>
<blockquote class="quote"><b>&ldquo;</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>&ldquo;The [Better ListView] control is very easy and intuitive to use and
is well documented.&rdquo;
&ndash; <%= 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&rsquo;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>&ldquo;<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.&rdquo;
<br />&ndash; <%= link_to "Daniel Nolan", "http://sweetfancymuses.wordpress.com/" %></blockquote>
</div>
</div>
<div class="testimonial-wide-ct">
<div class="testimonial-wide">
<blockquote>&ldquo;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>!
&rdquo;
<br />&ndash; 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&rsquo;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 &amp; 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&rsquo;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>&ldquo;Component Owl created <strong>the one and only tool I dont want to be without when it comes to software developing in Visual Studio</strong>. Also, Ive 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.&rdquo;
&ndash; 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>

View 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>

View 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>

View 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 %>

View 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

View 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&amp;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>

View 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>

View File

@@ -0,0 +1 @@
<%= render :partial => "error/not_found" %>

View File

@@ -0,0 +1 @@
<%= render :partial => "error/not_found" %>

View 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>

View 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} &raquo; #{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")} &raquo; #{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>

View 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>

View 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

View 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>

View 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 &amp; 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>&ldquo;Better List View is <b>awesome</b>.&rdquo; &ndash; 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. Its 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. Weve 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>

View 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>

View 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>

View 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>Youve 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>&ndash; 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 (&lt; 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&nbsp;To-Do&nbsp;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>

View 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>

View 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>

View 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>

View 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>

View 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">&copy; 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>

View 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 %>

View File

@@ -0,0 +1 @@
<%= @message %>

View File

@@ -0,0 +1,10 @@
<%= @license_key.error %>
Source file:
---------------------------------------------
<%= @license_key.source_file_data.join("\n") %>
XML Request:
---------------------------------------------
<%= @license_key.raw_post_data %>

View File

@@ -0,0 +1,6 @@
<% @licenses.each do |license| %>
<%= license[:product].name %>:
---------------------------------------------
<%= license[:license_keys].join("\n") %>
<% end %>

View 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

View 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) %>

View File

@@ -0,0 +1,205 @@
<h1>Licensing &amp; 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&nbsp;countries", customer_service_path %>.</p>
</div>
<br /><br /><br />
<%= image_tag "CSLogo.gif", :alt => "ComponentSource.com" %>
</div>

View File

@@ -0,0 +1,7 @@
<div class="order-content">
<%= render :inline => @page.html %>
<%#= render :partial => "draft" %>
</div>

View 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

View File

@@ -0,0 +1,4 @@
<div class="edition-popup-content">
<div class="heading"><%= t('txt.order.stdl_editions_difference') %></div>
<%= @edition.description %>
</div>

View 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>

View 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 &amp; 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 &amp; 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 &amp; drop inserting at the position specified by user. Drag &amp; drop preview is shown using an insertion mark.
<h3>Column-header reordering</h3>
Better ListView has inbuilt easy drag &amp; 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 &amp; 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>

View 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 %>

View 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 %>

View 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 %>

View 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