Page MenuHomeIn-Portal Phabricator

modern-store
No OneTemporary

File Metadata

Created
Wed, Aug 20, 2:40 AM

modern-store

Index: branches/1.0.x/products/compare.tpl
===================================================================
--- branches/1.0.x/products/compare.tpl (nonexistent)
+++ branches/1.0.x/products/compare.tpl (revision 14907)
@@ -0,0 +1,159 @@
+<!--##
+<NAME>Compare Products</NAME>
+<DESC>Product comparison page</DESC>
+<SECTION>Pages||Compare Products</SECTION>
+##-->
+<inp2:m_DefineElement name="page_title"><inp2:st_PageInfo type="htmlhead_title" html_escape="1"/></inp2:m_DefineElement>
+
+<!--## MAIN CONTENT ##-->
+<inp2:m_DefineElement name="content">
+ <div class="block no-border-bottom">
+ <h2><em>Comparing Products (4)</em><span></span></h2>
+ <div class="compare border-radius">
+
+ <div class="good-item">
+ <div class="button-delete"><a href="#"><img src="<inp2:m_TemplatesBase/>img/icon-delete.png" width="13" height="13" alt="" /></a></div>
+ <dl>
+ <dt><a href="#">Nikon D5000 Digital Camera</a></dt>
+ <dd>
+ <p class="img"><a href="#"><img src="<inp2:m_TemplatesBase/>img/samples/good1.jpg" width="136" height="136" alt="" /></a></p>
+ <p class="price">$759.<span>95</span></p>
+ <p><a href="#" class="addtocart"><span>Add to Cart</span></a></p>
+ </dd>
+ </dl>
+ <div class="rating">
+ <p><img src="<inp2:m_TemplatesBase/>img/star-small.jpg" width="18" height="18" alt="" /><img src="<inp2:m_TemplatesBase/>img/star-small.jpg" width="18" height="18" alt="" /><img src="<inp2:m_TemplatesBase/>img/star-small.jpg" width="18" height="18" alt="" /><img src="<inp2:m_TemplatesBase/>img/star-small.jpg" width="18" height="18" alt="" /><img src="<inp2:m_TemplatesBase/>img/star-small.jpg" width="18" height="18" alt="" /></p>
+ <p><a href="">Reviews</a> (<a href="">12</a>)</p>
+ </div>
+ <dl class="har">
+ <dt>Model:</dt>
+ <dd>XT2324</dd>
+ <dt>Manufacturer:</dt>
+ <dd>Apple</dd>
+ <dt>SKU:</dt>
+ <dd>23423424</dd>
+ <dt>Size:</dt>
+ <dd>22''</dd>
+ </dl>
+ </div>
+ <div class="good-item">
+ <div class="button-delete"><a href="#"><img src="<inp2:m_TemplatesBase/>img/icon-delete.png" width="13" height="13" alt="" /></a></div>
+ <dl>
+ <dt><a href="#">Nikon D5000 Digital Camera</a></dt>
+ <dd>
+ <p class="img"><a href="#"><img src="<inp2:m_TemplatesBase/>img/samples/good1.jpg" width="136" height="136" alt="" /></a></p>
+ <p class="price">$759.<span>95</span></p>
+ <p><a href="#" class="addtocart"><span>Add to Cart</span></a></p>
+ </dd>
+ </dl>
+ <div class="rating">
+ <p><img src="<inp2:m_TemplatesBase/>img/star-small.jpg" width="18" height="18" alt="" /><img src="<inp2:m_TemplatesBase/>img/star-small.jpg" width="18" height="18" alt="" /><img src="<inp2:m_TemplatesBase/>img/star-small.jpg" width="18" height="18" alt="" /><img src="<inp2:m_TemplatesBase/>img/star-small.jpg" width="18" height="18" alt="" /><img src="<inp2:m_TemplatesBase/>img/star-small.jpg" width="18" height="18" alt="" /></p>
+ <p><a href="">Reviews</a> (<a href="">12</a>)</p>
+ </div>
+ <dl class="har">
+ <dt>Model:</dt>
+ <dd>XT2324</dd>
+ <dt>Manufacturer:</dt>
+ <dd>Apple</dd>
+ <dt>SKU:</dt>
+ <dd>23423424</dd>
+ <dt>Size:</dt>
+ <dd>22''</dd>
+ </dl>
+ </div>
+ <div class="good-item">
+ <div class="button-delete"><a href="#"><img src="<inp2:m_TemplatesBase/>img/icon-delete.png" width="13" height="13" alt="" /></a></div>
+ <dl>
+ <dt><a href="#">Nikon D5000 Digital Camera</a></dt>
+ <dd>
+ <p class="img"><a href="#"><img src="<inp2:m_TemplatesBase/>img/samples/good1.jpg" width="136" height="136" alt="" /></a></p>
+ <p class="price">$759.<span>95</span></p>
+ <p><a href="#" class="addtocart"><span>Add to Cart</span></a></p>
+ </dd>
+ </dl>
+ <div class="rating">
+ <p><img src="<inp2:m_TemplatesBase/>img/star-small.jpg" width="18" height="18" alt="" /><img src="<inp2:m_TemplatesBase/>img/star-small.jpg" width="18" height="18" alt="" /><img src="<inp2:m_TemplatesBase/>img/star-small.jpg" width="18" height="18" alt="" /><img src="<inp2:m_TemplatesBase/>img/star-small.jpg" width="18" height="18" alt="" /><img src="<inp2:m_TemplatesBase/>img/star-small.jpg" width="18" height="18" alt="" /></p>
+ <p><a href="">Reviews</a> (<a href="">12</a>)</p>
+ </div>
+ <dl class="har">
+ <dt>Model:</dt>
+ <dd>XT2324</dd>
+ <dt>Manufacturer:</dt>
+ <dd>Apple</dd>
+ <dt>SKU:</dt>
+ <dd>23423424</dd>
+ <dt>Size:</dt>
+ <dd>22''</dd>
+ </dl>
+ </div>
+ <div class="good-item last-child">
+ <p class="buttons-block"><a href="#" class="compare-button"><span><img src="<inp2:m_TemplatesBase/>img/bg-button-compare-add.png" width="24" height="24" alt="" /><br />Select Product<br />to Compare</span></a></p>
+ </div>
+ <div class="clear"></div>
+
+ <div id="compare-menu" style="width: 678px;">
+ <h3><a href="#">Description</a></h3>
+ <div>
+ <div class="good-item-cell">
+ <div class="description">
+ <p>Vestibulum eu ipsum est. Morbi risus magna, aliquam eu consequat in, ultricies quis lorem. Maecenas rutrum pulvinar lectus, vel aliquam lorem porttitor nec. Phasellus non orci sem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec massa massa. Proin ac leo mauris.</p><p>Mauris ut felis Phasellus non orci sem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec massa massa. Proin ac leo mauris.</p>
+ </div>
+ </div>
+ <div class="good-item-cell">
+ <div class="description">
+ <p>Vestibulum eu ipsum est. Morbi risus magna, aliquam eu consequat in, ultricies quis lorem. Maecenas rutrum pulvinar lectus, vel aliquam lorem porttitor nec. Phasellus non orci sem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec massa massa. Proin ac leo mauris.</p><p>Mauris ut felis Phasellus non orci sem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec massa massa. Proin ac leo mauris.</p>
+ </div>
+ </div>
+ <div class="good-item-cell">
+ <div class="description">
+ <p>Vestibulum eu ipsum est. Morbi risus magna, aliquam eu consequat in, ultricies quis lorem. Maecenas rutrum pulvinar lectus, vel aliquam lorem porttitor nec. Phasellus non orci sem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec massa massa. Proin ac leo mauris.</p><p>Mauris ut felis Phasellus non orci sem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec massa massa. Proin ac leo mauris.</p>
+ </div>
+ </div>
+ <div class="clear"></div>
+ </div>
+ <h3><a href="#">Features</a></h3>
+ <div>
+
+ </div>
+ <h3><a href="#">Details</a></h3>
+ <div>
+
+ </div>
+ <h3><a href="#">Specifications</a></h3>
+ <div>
+
+ </div>
+ <h3><a href="#">Overall Rating</a></h3>
+ <div>
+
+ </div>
+ <h3><a href="#">Reviews</a></h3>
+ <div>
+
+ </div>
+ </div>
+ <div class="clear"></div>
+ </div>
+ </div>
+</inp2:m_DefineElement>
+<!--## /MAIN CONTENT ##-->
+
+<inp2:m_DefineElement name="add_to_head">
+ <script type= "text/javascript">
+ $(function() {
+ var icons = {
+ header: "ui-icon-circle-arrow-e",
+ headerSelected: "ui-icon-circle-arrow-s"
+ };
+ $( "#compare-menu" ).accordion({
+ icons: icons,
+ autoHeight: false,
+ navigation: true
+ });
+ });
+ </script>
+</inp2:m_DefineElement>
+
+<!--## DESIGN TEMPLATE ##-->
+<inp2:m_include template="designs/default_design.des" pass_params="1"/>
+<!--## /DESIGN TEMPLATE ##-->
\ No newline at end of file
Index: branches/1.0.x/inc/js/jquery.scripts.js
===================================================================
--- branches/1.0.x/inc/js/jquery.scripts.js (revision 14906)
+++ branches/1.0.x/inc/js/jquery.scripts.js (revision 14907)
@@ -1,233 +1,262 @@
/* === General usage functions === */
function jq($selector, $delimiter) {
return ($selector + '').replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + ($delimiter || '') + '-]', 'g'), '\\$&');
}
function in_array(needle, haystack)
{
return array_search(needle, haystack) != -1;
}
function array_search(needle, haystack)
{
for (var i=0; i<haystack.length; i++)
{
if (haystack[i] == needle) return i;
}
return -1;
}
Array.prototype.diff = function(a) {
return this.filter(
function (i) {
return a.indexOf(i) == -1;
}
);
};
function get_control($mask, $field, $append, $prepend) {
$append = $append !== undefined ? '_' + $append : '';
$prepend = $prepend !== undefined ? $prepend + '_' : '';
return document.getElementById( $prepend + $mask.replace('#FIELD_NAME#', $field) + $append );
}
function update_checkbox_options($cb_mask, $hidden_id, $form_selector)
{
var $tmp = '',
$kf = $($form_selector !== undefined ? $form_selector : '#' + $form_name).get(0);
for (var i = 0; i < $kf.elements.length; i++) {
if ( $kf.elements[i].id.match($cb_mask) ) {
if ($kf.elements[i].checked) {
$tmp += '|'+$kf.elements[i].value;
}
}
}
if ($tmp.length > 0) {
$tmp += '|';
}
document.getElementById($hidden_id).value = $tmp.replace(/,$/, '');
}
function watch_anchor () {
var $last_anchor = '';
setInterval(
function () {
if (window.location.hash != $last_anchor) {
$last_anchor = window.location.hash;
var $new_anchor = $last_anchor ? $last_anchor.substring(1) : '';
$('body').trigger('anchorchanged', [$new_anchor]);
}
}, 100
);
}
function sort_object($object) {
// Setup Arrays
var $sorted_keys = [], $sorted_object = {};
for (var $property_name in $object) {
$sorted_keys.push($property_name);
}
$sorted_keys.sort();
$($sorted_keys).each(
function () {
$sorted_object[this] = $object[this];
}
);
return $sorted_object;
}
+function compare_product($product_id, $compare_event, $callback) {
+ if ( $compare_event === undefined || $compare_event === true ) {
+ $compare_event = 'OnAddToCompare';
+ }
+ else if ( $compare_event === false ) {
+ $compare_event = 'OnRemoveFromCompare';
+ }
+
+ var $url = FormManager.getURL('p', 'elements/side_boxes/compare.elm', $compare_event);
+
+ $.get(
+ $url,
+ {'p_id': $product_id},
+ function ($data) {
+ $('#compare-products-sidebox').replaceWith($data);
+
+ if ( $callback !== undefined && $.isFunction($callback) ) {
+ $callback($data);
+ }
+ }
+ );
+
+ return false;
+}
+
+function redirect($url)
+{
+ window.location.href = $url;
+}
+
/* === DBlocks class === */
function DBlocks() {
var $me = this;
this.selectors = ['#lang', '#currency', '#login', /*'#login-alt',*/ '#profile'];
$(document).ready(
function () {
$me.init();
}
);
}
DBlocks.prototype.init = function () {
var $manager = this;
$( this.selectors.join(', ') ).unbind('click').click(
function($e, $now) {
var $me = $(this),
$parent = $me.parent();
if ( $parent.is('.plashka-sel') ) {
$parent.removeClass('plashka-sel');
if ( $now === undefined || $now === false ) {
$('#' + $me.attr('id') + '-sel').fadeOut();
}
else {
$('#' + $me.attr('id') + '-sel').hide();
}
}
else {
$manager.hideOthers($me);
$parent.addClass('plashka-sel');
$('#' + $me.attr('id') + '-sel').fadeIn();
}
return false;
}
);
$('.icon-close').click(
function() {
$('#login').parent().removeClass('plashka-sel'); // ,#login-alt
$('#login-sel').fadeOut(); // , #login-alt-sel
return false;
}
);
}
DBlocks.prototype.hideOthers = function ($current) {
$( this.selectors.join(', ') ).not($current).each(
function () {
var $me = $(this),
$parent = $me.parent();
if ( $parent.is('.plashka-sel') ) {
$me.trigger('click', [true]);
}
}
);
}
/* === RatingManager class === */
function RatingManager ($url) {
this.Url = $url;
}
RatingManager.prototype.makeVote = function ($vote, $prefix, $id, $size) {
var $url = this.Url.replace('#PREFIX#', $prefix).replace('#VOTE#', $vote).replace('#ID#', $id).replace('#SIZE#', $size);
$.get(
$url,
function ($response) {
if ($response.substring(0, 5) == '@err:') {
alert( $response.substring(5) );
return ;
}
document.getElementById('page_rating_' + $id).innerHTML = $response;
}
)
}
-/* === Startup === */
-$(document).ready(
- function() {
- watch_anchor();
+function add_to_cart_handler() {
+ var $me = $(this),
+ $qty = $me.attr('qty_id') !== undefined ? parseInt($('#' + $me.attr('qty_id')).val()) : 1;
- $('#change-password').click(
- function($e) {
- $('#password-show').hide();
- $('#password-block').fadeIn();
- return false;
- }
- );
+ if ( $me.hasClass('addedtocart') ) {
+ // disabled button
+ return false;
+ }
+ if ( isNaN($qty) ) {
+ $qty = 1;
+ }
- $('.addtocart, .button-addtocart').click(
- function () {
- var $me = $(this),
- $qty = $me.attr('qty_id') !== undefined ? parseInt($('#' + $me.attr('qty_id')).val()) : 1;
+ var $bubble = $('.basketStatus'),
+ $timer_id = $bubble.data('hide_timer');
+ clearTimeout($timer_id);
- if ( $me.hasClass('addedtocart') ) {
- // disabled button
- return false;
+ $.get(
+ $me.attr('href') + '&qty=' + $qty,
+ function ($bubble_content) {
+ $('.basketContent', $bubble).html( $bubble_content.replace(/#QTY#/g, $qty) );
+ $bubble
+ .stop(true, true)
+ .fadeIn(
+ 'slow',
+ function () {
+ var $timer = setTimeout(function(){ $bubble.fadeOut('slow'); }, 2000);
+ $bubble.data('hide_timer', $timer);
}
+ );
- if ( isNaN($qty) ) {
- $qty = 1;
- }
+ if ( $me.hasClass('addtocart') ) {
+ $me.removeClass('addtocart').addClass('addedtocart').html('Added to Cart');
+ }
+ }
+ );
- var $bubble = $('.basketStatus'),
- $timer_id = $bubble.data('hide_timer');
+ return false;
+}
- clearTimeout($timer_id);
+/* === Startup === */
+$(document).ready(
+ function() {
+ watch_anchor();
- $.get(
- $me.attr('href') + '&qty=' + $qty,
- function ($bubble_content) {
- $('.basketContent', $bubble).html( $bubble_content.replace(/#QTY#/g, $qty) );
- $bubble
- .stop(true, true)
- .fadeIn(
- 'slow',
- function () {
- var $timer = setTimeout(function(){ $bubble.fadeOut('slow'); }, 2000);
- $bubble.data('hide_timer', $timer);
- }
- );
-
- if ( $me.hasClass('addtocart') ) {
- $me.removeClass('addtocart').addClass('addedtocart').html('Added to Cart');
- }
- }
- );
+ $('#change-password').click(
+ function($e) {
+ $('#password-show').hide();
+ $('#password-block').fadeIn();
return false;
}
);
+
+ $('.addtocart, .button-addtocart').click(add_to_cart_handler);
}
);
\ No newline at end of file
Index: branches/1.0.x/inc/js/form_manager.js
===================================================================
--- branches/1.0.x/inc/js/form_manager.js (revision 14906)
+++ branches/1.0.x/inc/js/form_manager.js (revision 14907)
@@ -1,533 +1,537 @@
function FormManager() { }
FormManager.init = function ($settings) {
$.ajaxSetup( {cache: false} );
this.url = '';
this.fieldMask = '#PREFIX#[#ID#][#FIELD_NAME#]';
this.noErrorsHTML = '';
this.checkTimeout = 1000;
this.pendingChecks = {};
this.fields = {};
this.fieldTypes = {};
this.forms = {};
this.fieldWatermarks = {};
this.xhrRequests = [];
$.extend(this, $settings);
}
FormManager.resetFields = function ($prefix) {
this.fields[$prefix] = [];
}
FormManager.registerField = function ($prefix, $field, $watermark, $field_type) {
// fields are registered before form -> store them in separate array
if (!this.fields[$prefix]) {
this.fields[$prefix] = [];
}
if ($watermark === undefined) {
$watermark = '';
}
this.fieldWatermarks[$prefix + '_' + $field] = $watermark;
this.fields[$prefix].push($field);
if ($field_type !== undefined) {
this.fieldTypes[$prefix + '_' + $field] = $field_type;
}
}
FormManager.unregisterField = function ($prefix, $field) {
var $field_index = array_search($field, this.fields[$prefix]);
this.fields[$prefix].splice($field_index, 1);
delete this.fieldWatermarks[$prefix + '_' + $field];
delete this.fieldTypes[$prefix + '_' + $field];
}
FormManager.getFieldMask = function ($prefix) {
return this.fieldMask.replace('#PREFIX#', $prefix).replace('#ID#', this.form_param($prefix, 'id'));
}
FormManager.getField = function ($prefix, $field, $prepend, $append) {
if ($prepend === undefined) {
$prepend = '';
}
if ($append === undefined) {
$append = '';
}
var $control_id = this.getFieldMask($prefix).replace('#FIELD_NAME#', $field);
return document.getElementById($prepend + $control_id + $append);
}
FormManager.getBlurFields = function ($prefix, $field) {
var $field_mask = this.getFieldMask($prefix);
switch ( this.fieldTypes[$prefix + '_' + $field] ) {
case 'swf_upload':
return this.getField($prefix, $field, undefined, '[tmp_names]');
break;
case 'date':
$field += '_date';
break;
case 'radio':
return $("input[name='" + jq($field_mask.replace('#FIELD_NAME#', $field)) + "']");
break;
case 'checkbox':
return get_control($field_mask, $field, undefined, '_cb');
break;
case 'checkboxes':
return $("input[id^='" + jq($field_mask.replace('#FIELD_NAME#', $field)) + "_']");
break;
case 'cc_expiration':
return $('select', this.getCell($prefix, $field, 'field'));
break;
}
return this.getField($prefix, $field);
}
FormManager.registerForm = function ($settings) {
var $defaults = {
url: false, // url for form submission
prefix: '', // unit prefix, used in the form
enabled: true, // form submit enabled
enabledTimer: null, // timer that performs form-resubmit countdown
save_event: '', // event to use for form data processing
id: 0, // id of item being add/edited on a form
form_id: '', // form id to work with
before_close: '', // before window close callback
validation_failure: '', // on validate failure callback
immediate_validation: true // perfom validation on blur
}
this.forms[$settings.prefix] = {};
$.extend(this.forms[$settings.prefix], $defaults, $settings);
// when form is registred, then all it's fields should also be registred
if ( !this.form_param($settings.prefix, 'immediate_validation') ) {
return ;
}
var $me = this;
$( this.fields[$settings.prefix] ).each(
function () {
$( $me.getBlurFields($settings.prefix, this) ).blur(
function ($e) {
$me.checkField(this);
}
);
}
);
$('input[title], select[title], textarea[title]', '#' + this.forms[$settings.prefix].form_id).qtip(
{
style: {
classes: 'ui-tooltip-light ui-tooltip-shadow'
},
position: {
my: 'left center',
at: 'right center'
},
show: {
event: 'focus'
}
}
);
$('img.help-icon', '#' + this.forms[$settings.prefix].form_id ).qtip(
{
style: {
classes: 'ui-tooltip-light ui-tooltip-shadow'
},
position: {
my: 'bottom left',
at: 'top center'
}
}
);
}
FormManager.getURL = function ($prefix, $template, $event, $params) {
var $url = this.form_param($prefix, 'url');
if (!$url) {
$url = this.url;
}
if ($template === undefined) {
$template = '';
}
$url = $url.replace('#TEMPLATE#', $template);
if ($event !== undefined) {
$url += ($url.indexOf('?') == -1 ? '?' : '&') + 'events[' + $prefix + ']=' + $event;
}
if ( typeof($params) == 'object' ) {
for (key in $params) {
$url += ($url.indexOf('?') == -1 ? '?' : '&') + key + '=' + $params[key];
}
}
return $url;
}
FormManager.processResponse = function ($prefix, $data, $add_params) {
// enable form back
// alert('enabling for for [' + $prefix + '] in processResponse');
if ( $add_params !== undefined ) {
$add_params.response = $data;
}
else {
$add_params = {response: $data};
}
this.clearErrors($prefix);
if ($data.status == 'OK') {
var $next_template = this.getNextTemplate($prefix, $data);
if ( $next_template || $data.do_refresh ) {
var $before_close = this.getFormParamOverride($prefix, 'before_close', $add_params);
if ( $.isFunction($before_close) ) {
$before_close.call(this, $data, $add_params);
}
if ( $next_template ) {
// load another template instead of current form
$('#TB_ajaxContent').html('').load( this.getURL($prefix, $next_template, undefined, $data.params) );
}
else if ( $data.do_refresh ) {
// refresh whole page
window.location.href = window.location.href;
}
}
else {
// close form without refreshing the page
this.closeForm($prefix, $data, $add_params);
}
}
else {
// set new errors
for ($field in $data.field_errors) {
this.setFieldStatus($prefix, $field, $data.field_errors[$field]);
}
var $validation_failure = this.form_param($prefix, 'validation_failure');
if ( $.isFunction($validation_failure) ) {
$validation_failure.call(this, $data, $add_params);
}
}
this.enableForm($prefix, true);
// var $me = this;
// setTimeout(function () { $me.enableForm($prefix, true); }, 1000);
}
/**
* Clear errors from all from fields
*
* @param $prefix
*/
FormManager.clearErrors = function ($prefix) {
var $fields = this.fields[$prefix];
if (typeof($fields) == 'undefined') {
$fields = [];
}
for (var $i = 0; $i < $fields.length; $i++) {
this.setFieldStatus($prefix, $fields[$i]);
}
}
FormManager.getNextTemplate = function ($prefix, $responce) {
if ( $responce.next_template && $responce.next_template != '' ) {
return $responce.next_template;
}
else if ( this.form_param($prefix, 'next_template') ) {
return this.form_param($prefix, 'next_template');
}
return false;
}
FormManager.getCell = function ($prefix, $field_name, $cell_type) {
$field_name = $field_name.replace(/_(date|time)$/, '');
return this.getField($prefix, $field_name, undefined, '_' + $cell_type + '_cell');
}
FormManager.setFieldStatus = function ($prefix, $field_name, $error_msg) {
var field_cell = this.getCell($prefix, $field_name, 'field');
var status_cell = this.getCell($prefix, $field_name, 'status');
if (!field_cell) {
alert('Error field "' + $field_name + '" missing.');
return ;
}
if ($error_msg === undefined || !$error_msg) {
// show OK
$(field_cell).parents('p:first').removeClass('error'); //.addClass('ok');
$(status_cell)/*.removeClass('field-error')*/.html(this.noErrorsHTML);
var $fields = this.fields[$prefix];
for (var $i = 0; $i < $fields.length; $i++) {
if ( this.fieldHasError($prefix, $fields[$i]) ) {
return ;
}
}
}
else {
// show error message
$(field_cell).parents('p:first')/*.removeClass('ok')*/.addClass('error');
$(status_cell)/*.addClass('field-error')*/.html($error_msg);
}
}
FormManager.fieldHasError = function ($prefix, $field) {
var status_cell = this.getField($prefix, $field, undefined, '_status_cell');
return $.trim( $(status_cell).html() ) != $.trim( this.noErrorsHTML );
}
FormManager.checkField = function ($input, $delayed) {
if ( !$input.id.match(/^(.*?)\[.*?\]\[(.*?)\].*?$/) ) {
return ;
}
var $prefix = RegExp.$1;
var $field = RegExp.$2.replace(/(_date|_time)$/, '');
if ( $field.match(/(.*)(Month|Year)$/) && this.fieldTypes[$prefix + '_' + RegExp.$1 + 'Date'] == 'cc_expiration' ) {
$field = RegExp.$1 + 'Date';
}
if ( this.pendingChecks[$field] ) {
clearTimeout( this.pendingChecks[$field] );
delete this.pendingChecks[$field];
}
var $me = this;
this.pendingChecks[$field] = setTimeout(
function () {
$me.validateField($prefix, $field, $input)
},
($delayed === true ? this.checkTimeout : 0)
);
}
FormManager.validateField = function ($prefix, $field, $input) {
var $me = this;
var form = document.getElementById( this.form_param($prefix, 'form_id') );
var $request = $.post(
this.getURL($prefix, undefined, 'OnValidateField') + '&field=' + encodeURIComponent($field) + '&' + $input.name + '=' + encodeURIComponent($input.value),
$(form).serialize(),
function ($data) {
$data = eval('(' + $data + ')');
$me.setFieldStatus($prefix, $field, $data.status == 'OK' ? undefined : $data.status);
$("input[type='submit']", form).attr('disabled', !$.isArray($data.other_errors) );
}
);
this.xhrRequests.push($request);
};
FormManager.form_param = function ($prefix, $param, $value) {
+ if ( this.forms[$prefix] === undefined ) {
+ return '';
+ }
+
if ($value === undefined) {
return this.forms[$prefix][$param];
}
this.forms[$prefix][$param] = $value;
}
FormManager.getFormParamOverride = function ($prefix, $param, $overrides) {
if ( $overrides[$param] !== undefined ) {
return $overrides[$param];
}
return this.form_param($prefix, $param);
}
/* === related to form opening/closing/submitting === */
FormManager.openForm = function ($prefix, $template, $width, $height, $source_form, $params) {
var $url = this.getURL($prefix, $template, undefined, $params);
$url += ($url.indexOf('?') == -1 ? '?' : '&') + 'width=' + $width + '&height=' + $height + '&modal=true';
var $tb_settings = {url: $url};
if ($source_form !== undefined) {
$tb_settings.postParams = $($source_form).serialize();
}
TB.show($tb_settings);
}
FormManager.validateAll = function ($prefix, $status) {
var $fields = this.fields[$prefix];
for (var $i = 0; $i < $fields.length; $i++) {
this.setFieldStatus($prefix, $fields[$i], $status);
}
}
FormManager.closeForm = function ($prefix, $data, $add_params) {
if ( $data === undefined ) {
$data = {};
}
if ( $add_params === undefined ) {
$add_params = {};
}
var $before_close = this.getFormParamOverride($prefix, 'before_close', $add_params);
this.cancelXHRRequests();
this.validateAll($prefix);
if ( $.isFunction($before_close) ) {
var $result = $before_close.call(this, $data, $add_params);
if ($result === false) {
return;
}
}
TB.remove();
}
FormManager._getFormFields = function ($prefix) {
var $fields = this.fields[$prefix];
if (typeof($fields) == 'undefined') {
$fields = [];
}
// remove watermakrs from input fields
for (var $i = 0; $i < $fields.length; $i++) {
var $control = this.getField($prefix, $fields[$i]);
var $watermark = this.fieldWatermarks[ $prefix + '_' + $fields[$i] ];
if ($control && $watermark !== undefined && $control.value == $watermark) {
$control.value = '';
}
}
var form = document.getElementById( this.form_param($prefix, 'form_id') );
var $form_fields = $(form).serialize();
// restore watermarks in input fields
for (var $i = 0; $i < $fields.length; $i++) {
var $control = this.getField($prefix, $fields[$i]);
var $watermark = this.fieldWatermarks[$prefix + '_' + $fields[$i]];
if ($control && $watermark !== undefined && !$control.value) {
$control.value = $watermark;
}
}
return $form_fields;
}
FormManager.enableForm = function ($prefix, $enabled) {
if ($enabled === undefined) {
$enabled = true;
}
if ($enabled) {
clearTimeout( this.form_param($prefix, 'enabledTimer') );
this.form_param($prefix, 'enabledTimer', null);
}
else {
var $me = this;
// set timer for 10 seconds to enable form back (just in case if ajax responce fails)
var $timer = setTimeout(
function () {
// alert('enabling for for [' + $prefix + '] in setTimeout');
$me.enableForm($prefix, true);
}
, 10000
);
this.form_param($prefix, 'enabledTimer', $timer);
}
this.form_param($prefix, 'enabled', $enabled);
}
FormManager.cancelXHRRequests = function () {
while ( this.xhrRequests.length > 0 ) {
this.xhrRequests.shift().abort();
}
}
FormManager.submitForm = function ($prefix, $add_params) {
if ( !this.form_param($prefix, 'enabled') ) {
return ;
}
// disable form
this.enableForm($prefix, false);
var $me = this;
this.cancelXHRRequests();
$.post(
this.getURL( $prefix, '', this.form_param($prefix, 'save_event') ),
this._getFormFields($prefix),
function ($data) {
var $redirect = TB.parseRedirect($data);
if ( $redirect !== false ) {
window.location.href = $redirect;
return ;
}
$me.processResponse($prefix, eval('(' + $data + ')'), $add_params);
}
)
}
FormManager.beforeClose = function () {
this.cancelXHRRequests();
for (var $prefix in this.forms) {
var $before_close = this.form_param($prefix, 'before_close');
if ( $.isFunction($before_close) ) {
$before_close.call(this, {}, {});
}
}
}
\ No newline at end of file
Index: branches/1.0.x/elements/side_boxes/compare.elm.tpl
===================================================================
--- branches/1.0.x/elements/side_boxes/compare.elm.tpl (revision 14906)
+++ branches/1.0.x/elements/side_boxes/compare.elm.tpl (revision 14907)
@@ -1,32 +1,60 @@
-<inp2:p_InitList list_name="compare_products" types="compare" parent_cat_id="0" recursive="1" max="4"/>
+<inp2:m_if check="m_Get" name="ajax" equals_to="yes">
+ <inp2:m_NoDebug/>
+</inp2:m_if>
-<div class="block no-border-bottom">
- <h2><em>Comparing Products (3)</em><span class="bullet"></span></h2>
+<inp2:m_Include template="elements/content_boxes.elm" strip_nl="2"/>
+<inp2:m_Include template="elements/product_elements.elm" strip_nl="2"/>
+
+<inp2:p_InitList list_name="compare_products" types="compare" parent_cat_id="any" per_page="4"/>
+
+<div class="block no-border-bottom" id="compare-products-sidebox"<inp2:m_ifnot check="p_TotalRecords" list_name="compare_products"> style="display: none;"</inp2:m_ifnot>>
+ <h2>
+ <em>Comparing Products (<inp2:p_TotalRecords list_name="compare_products"/>)</em>
+ <span class="bullet"></span>
+ </h2>
<div class="good-item border-radius-bottom comparing-items">
- <dl>
- <dt><a href="#">Nikon D5000 Digital Camera</a></dt>
- <dd>
- <p class="img"><a href="#"><img src="<inp2:m_TemplatesBase/>img/samples/good1.jpg" width="136" height="136" alt="" /></a></p>
- <p class="button-delete"><a href="#"><img src="<inp2:m_TemplatesBase/>img/icon-delete.png" width="13" height="13" alt="" /></a></p>
- </dd>
- </dl>
- <dl>
- <dt><a href="#">Nikon D5000 Digital Camera</a></dt>
- <dd>
- <p class="img"><a href="#"><img src="<inp2:m_TemplatesBase/>img/samples/good1.jpg" width="136" height="136" alt="" /></a></p>
- <p class="button-delete"><a href="#"><img src="<inp2:m_TemplatesBase/>img/icon-delete.png" width="13" height="13" alt="" /></a></p>
- </dd>
- </dl>
- <dl>
- <dt><a href="#">Nikon D5000 Digital Camera</a></dt>
- <dd>
- <p class="img"><a href="#"><img src="<inp2:m_TemplatesBase/>img/samples/good1.jpg" width="136" height="136" alt="" /></a></p>
- <p class="button-delete"><a href="#"><img src="<inp2:m_TemplatesBase/>img/icon-delete.png" width="13" height="13" alt="" /></a></p>
- </dd>
- </dl>
+ <inp2:m_DefineElement name="compare_product_element">
+ <dl>
+ <dt><a href="<inp2:ProductLink template='__default__'/>"><inp2:Field name="Name"/></a></dt>
+ <dd>
+ <p class="img">
+ <a href="<inp2:ProductLink template='__default__'/>">
+ <inp2:Image render_as="image_element" Primary="1" Thumbnail="1" DefaultImage="img/no_picture.gif" MaxWidth="136" MaxHeight="136"/>
+ </a>
+ </p>
+
+ <p class="button-delete">
+ <a href="#"><img src="<inp2:m_TemplatesBase/>img/icon-delete.png" width="13" height="13" alt="" /></a>
+ </p>
+ </dd>
+ </dl>
+ </inp2:m_DefineElement>
+
+ <inp2:p_ListProducts list_name="compare_products" render_as="sidebox_product_element" no_table="1"/>
+
<p class="form buttons">
- <input type="submit" value="Compare" id="submit" class="green-button" />&nbsp;&nbsp;&nbsp;
- <input type="reset" value="Clear" id="cancel" class="grey-button" />
+ <input type="button" value="Compare" id="compare-products-btn" class="green-button" />&nbsp;&nbsp;&nbsp;
+ <input type="button" value="Clear" id="cancel-compare-btn" class="grey-button" />
</p>
</div>
-</div>
\ No newline at end of file
+</div>
+
+<script type="text/javascript">
+ $(document).ready(
+ function () {
+ $('.addtocart', '#compare-products-sidebox').click(add_to_cart_handler);
+
+ $('#compare-products-btn').click(
+ function () {
+ redirect('<inp2:m_Link template="products/compare" js_escape="1"/>');
+ }
+ );
+
+ $('#cancel-compare-btn').click(
+ function () {
+ compare_product(0, 'OnCancelCompare');
+ }
+ );
+ }
+ );
+</script>
\ No newline at end of file
Index: branches/1.0.x/elements/side_boxes/subscribe.elm.tpl
===================================================================
--- branches/1.0.x/elements/side_boxes/subscribe.elm.tpl (revision 14906)
+++ branches/1.0.x/elements/side_boxes/subscribe.elm.tpl (revision 14907)
@@ -1,24 +1,24 @@
<inp2:u.subscribe-sidebox_FormName name="subscription"/>
<div class="subscribe-block">
<h4>Get Promotions & Discounts:</h4>
- <form method="post" action="<inp2:m_FormAction />" class="form" name="mailing_list_form">
+ <form method="post" action="<inp2:m_FormAction />" class="form" name="mailing_list_form">
<fieldset>
<inp2:if check="u.subscribe-sidebox_Field" name="SubscriberEmail">
<input type="text" class="field subsfield" name="<inp2:u.subscribe-sidebox_InputName name='SubscriberEmail'/>" value="<inp2:u.subscribe-sidebox_Field name='SubscriberEmail'/>" onblur="if (this.value == '') this.value='Your Email'" onclick="if (this.value == 'Your Email') this.value=''"/>
<inp2:m_else/>
<input type="text" class="field subsfield" name="<inp2:u.subscribe-sidebox_InputName name='SubscriberEmail'/>" value="Your Email" onblur="if (this.value == '') this.value='Your Email'" onclick="if (this.value == 'Your Email') this.value=''" />
</inp2:if>
-
+
<inp2:m_if check="u.subscribe-sidebox_HasError" field="any">
<span class="field-error"><inp2:u.subscribe-sidebox_Error field="SubscriberEmail"/></span><br />
</inp2:m_if>
-
+
<a href="#" class="grey-but"><span><inp2:m_Phrase label='lu_btn_Subscribe' no_editing='1'/></span></a>
-
+
<input type="hidden" name="events[u.subscribe-sidebox][OnSubscribeQuery]" value="1"/>
<input type="hidden" name="subscribe_template" value="mailing/subscribe"/>
<input type="hidden" name="unsubscribe_template" value="mailing/unsubscribe"/>
</fieldset>
</form>
</div>
\ No newline at end of file
Index: branches/1.0.x/elements/product_elements.elm.tpl
===================================================================
--- branches/1.0.x/elements/product_elements.elm.tpl (revision 14906)
+++ branches/1.0.x/elements/product_elements.elm.tpl (revision 14907)
@@ -1,48 +1,48 @@
<inp2:m_DefineElement name="product_list_element">
<li>
<div class="item">
<inp2:m_if check="Field" name="IsNew">
<div class="ribbon new"></div>
<inp2:m_elseif check="Field" name="IsPop" />
<div class="ribbon top"></div>
<inp2:m_elseif check="Field" name="Featured" db="1" />
<div class="ribbon sale"></div>
</inp2:m_if>
<div class="img">
<a href="<inp2:ProductLink template='__default__'/>"><inp2:Image render_as="image_element" Primary="1" Thumbnail="1" DefaultImage="img/no_picture.gif" MaxWidth="69" MaxHeight="69"/></a>
</div>
<div class="descr">
<h3><a href="<inp2:ProductLink template='__default__'/>"><inp2:Field field="Name" html_escape="1"/></a></h3>
<p><inp2:Field field="Description" html_escape="1" cut_first="200"/></p>
<div class="optional">
<span class="stars">
<inp2:VotesIndicator small_style="small-star"/>
</span>
<span class="reviews">
<a href="<inp2:ProductLink template='__default__'/>">Reviews</a> (<a href="<inp2:ProductLink template='__default__'/>"><inp2:Field name="CachedReviewsQty"/></a>)&nbsp;&nbsp;&nbsp;
</span>
<span class="comp">
- <label><input type="checkbox" name="compare-1" value="1" /><em>Compare</em></label>
+ <label><input type="checkbox" class="compare-checkbox" value="<inp2:Field name='ProductId'/>"<inp2:m_if check="InCompare"> checked</inp2:m_if>/><em>Compare</em></label>
</span>
</div>
</div>
<div class="price-block">
<p><s class="under"><inp2:Field name="MSRP" currency="selected" decimal_tag="span"/></s></p>
<p class="redprice"><em class="price"><inp2:Field name="Price" currency="selected" decimal_tag="span"/></em></p>
<p><a href="<inp2:AddToCartLink template='elements/ajax/cart_bubble' product_template='__default__'/>" class="addtocart" rel="nofollow"><span>Add to Cart</span></a></p>
</div>
</div>
</li>
</inp2:m_DefineElement>
<inp2:m_DefineElement name="sidebox_product_element">
<dl class="<inp2:m_if check='m_Param' name='is_last'>last</inp2:m_if>">
<dt><a href="<inp2:ProductLink template='__default__'/>"><inp2:Field field="Name" html_escape="1" cut_first="45"/></a></dt>
<dd>
<p class="img"><a href="<inp2:ProductLink template='__default__'/>"><inp2:Image render_as="image_element" Primary="1" Thumbnail="1" DefaultImage="img/no_picture.gif" MaxWidth="136" MaxHeight="136"/></a></p>
<p class="price"><inp2:Field name="Price" currency="selected" decimal_tag="span"/></p>
<p><a href="<inp2:AddToCartLink template='elements/ajax/cart_bubble' product_template='__default__'/>" class="addtocart" rel="nofollow"><span>Add to Cart</span></a></p>
</dd>
</dl>
</inp2:m_DefineElement>
\ No newline at end of file
Index: branches/1.0.x/elements/html_head.elm.tpl
===================================================================
--- branches/1.0.x/elements/html_head.elm.tpl (revision 14906)
+++ branches/1.0.x/elements/html_head.elm.tpl (revision 14907)
@@ -1,76 +1,76 @@
<inp2:m_if check="c.current_Field" name="MetaKeywords">
<meta name="Keywords" content="<inp2:c.current_Field name='MetaKeywords'/>"/>
<inp2:m_else/>
<meta name="Keywords" content="<inp2:m_GetConfig name='Category_MetaKey'/>"/>
</inp2:m_if>
<inp2:m_if check="c.current_Field" name="MetaDescription">
<meta name="Description" content="<inp2:c.current_Field name='MetaDescription'/>"/>
<inp2:m_else/>
<meta name="Description" content="<inp2:m_GetConfig name='Category_MetaDesc'/>"/>
</inp2:m_if>
<meta name="author" content="<inp2:m_GetConfig name='Site_Name'/>"/>
<meta http-equiv="content-type" content="text/html; charset=<inp2:lang.current_Field name='Charset'/>" />
<link rel="icon" href="<inp2:m_BaseURL/>favicon.ico" type="image/x-icon" />
<link rel="shortcut icon" href="<inp2:m_BaseURL/>favicon.ico" type="image/x-icon" />
-<link rel="stylesheet" type="text/css" href="<inp2:m_Compress files='inc/reset.css|inc/styles.css|inc/category.css|inc/flexslider.css|inc/modal.css|inc/details.css|inc/jquery.gzoom.css|inc/pikachoose.css|inc/qtip.css|inc/profile.css|inc/cart.css'/>" media="all" charset="<inp2:lang.current_Field name='Charset'/>"/>
+<link rel="stylesheet" type="text/css" href="<inp2:m_Compress files='inc/reset.css|inc/styles.css|inc/category.css|inc/flexslider.css|inc/modal.css|inc/details.css|inc/jquery.gzoom.css|inc/pikachoose.css|inc/qtip.css|inc/profile.css|inc/cart.css|inc/compare.css'/>" media="all" charset="<inp2:lang.current_Field name='Charset'/>"/>
<!-- including "inc/profile.css" will break logged-in user's menu -->
<link type="text/css" rel="stylesheet" href="<inp2:m_TemplatesBase />inc/ui/jquery.ui.all.css" charset="utf-8" />
<!--##
<link type="text/css" rel="stylesheet" href="<inp2:m_TemplatesBase />inc/reset.css" charset="utf-8" />
<link type="text/css" rel="stylesheet" href="<inp2:m_TemplatesBase />inc/styles.css" charset="utf-8" />
<link type="text/css" rel="stylesheet" href="<inp2:m_TemplatesBase />inc/category.css" charset="utf-8" />
<link type="text/css" rel="stylesheet" href="<inp2:m_TemplatesBase />inc/flexslider.css" charset="utf-8" />
<link type="text/css" rel="stylesheet" href="<inp2:m_TemplatesBase />inc/modal.css" charset="utf-8" />
<link type="text/css" rel="stylesheet" href="<inp2:m_TemplatesBase />inc/details.css" charset="utf-8" />
<link type="text/css" rel="stylesheet" href="<inp2:m_TemplatesBase />inc/jquery.gzoom.css" charset="utf-8" />
<link type="text/css" rel="stylesheet" href="<inp2:m_TemplatesBase />inc/pikachoose.css" charset="utf-8" />
##-->
<!--## JS FOR ADMIN ##-->
<inp2:st_EditingScripts/>
<script type="text/javascript">
var $base_url = '<inp2:m_TemplatesBase/>';
</script>
<!--## JS FOR FRONT ##-->
<inp2:m_ifnot check="m_GetConst" name="EDITING_MODE">
<!--## EXCLUDE THIS JS WHEN IN ADMIN ##-->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="<inp2:m_Compress files='/inc/js/thickbox/thickbox.css'/>"/>
<script src="<inp2:m_Compress files='inc/js/thickbox/thickbox.js'/>" type="text/javascript"></script>
</inp2:m_ifnot>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.15/jquery-ui.min.js" type="text/javascript"></script>
<script src="<inp2:m_TemplatesBase />inc/js/ui/jquery.ui.core.min.js" type="text/javascript"></script>
<script src="<inp2:m_TemplatesBase />inc/js/ui/jquery.ui.widget.min.js" type="text/javascript"></script>
<script src="<inp2:m_TemplatesBase />inc/js/ui/jquery.ui.accordion.min.js" type="text/javascript"></script>
<script src="<inp2:m_TemplatesBase />inc/js/jquery.flexslider-min.js" type="text/javascript"></script>
<script src="<inp2:m_TemplatesBase />inc/js/jquery.scripts.js" type="text/javascript"></script>
<script src="<inp2:m_TemplatesBase />inc/js/tinybox.js" type="text/javascript"></script>
<script src="<inp2:m_TemplatesBase />inc/js/jquery.qtip.min.js" type="text/javascript"></script>
<script src="<inp2:m_TemplatesBase />inc/js/form_manager.js" type="text/javascript"></script>
<script type="text/javascript">
var aRatingManager = new RatingManager('<inp2:m_Link template="index" events[#PREFIX#]="OnMakeVote" rating="#VOTE#" id="#ID#" no_amp="1" size="#SIZE#"/>');
FormManager.init(
{
url: '<inp2:m_Link template="#TEMPLATE#" js_escape="1" __NO_REWRITE__="1" no_amp="1"/>',
noErrorsHTML: ''
}
);
</script>
<inp2:m_Comment>
<!--[if lt IE 9]>
<![endif]-->
</inp2:m_Comment>
\ No newline at end of file
Index: branches/1.0.x/elements/content_boxes/products.elm.tpl
===================================================================
--- branches/1.0.x/elements/content_boxes/products.elm.tpl (revision 14906)
+++ branches/1.0.x/elements/content_boxes/products.elm.tpl (revision 14907)
@@ -1,28 +1,44 @@
<inp2:m_DefaultParam prefix="" list_name="" layout="list"/>
<inp2:m_if check="m_Get" name="ajax" equals_to="yes">
<inp2:m_NoDebug/>
<inp2:m_Get name="list_prefix" result_to_var="prefix"/>
<inp2:m_Get name="list_name" result_to_var="list_name"/>
<inp2:m_Get name="layout" result_to_var="layout"/>
</inp2:m_if>
<inp2:$prefix_InitList list_name="$list_name" main_list="1"/>
<inp2:m_Include template="elements/content_boxes.elm" strip_nl="2"/>
<inp2:m_Include template="elements/product_elements.elm" strip_nl="2"/>
<inp2:m_if check="{$prefix}_TotalRecords" list_name="$list_name">
<inp2:m_Include template="elements/sorting.elm" list_name="$list_name" prefix="$prefix" layout="$layout" ajax="1"/>
<div class="items <inp2:m_if check='m_Param' name='layout' equals_to='list'>border-radius<inp2:m_else/>items-alt</inp2:m_if>">
<ul class="display<inp2:m_if check='m_Param' name='layout' equals_to='grid'> thumb_view</inp2:m_if>">
<inp2:$prefix_ListProducts list_name="$list_name" render_as="product_list_element"/>
</ul>
<div class="clear"></div>
<inp2:m_Include template="elements/pagination.elm" list_name="$list_name" prefix="$prefix" ajax="1"/>
</div>
+
+ <script type="text/javascript">
+ $(document).ready(
+ function () {
+ $('.compare-checkbox').click(
+ function ($e) {
+ var $me = $(this);
+
+ compare_product($me.val(), $me.is(':checked'));
+ }
+ );
+
+ $('.addtocart', '#products').click(add_to_cart_handler);
+ }
+ );
+ </script>
<inp2:m_else/>
No Products
</inp2:m_if>

Event Timeline