Index: branches/1.0.x/inc/profile.css =================================================================== diff -u -N -r14805 -r15169 --- branches/1.0.x/inc/profile.css (.../profile.css) (revision 14805) +++ branches/1.0.x/inc/profile.css (.../profile.css) (revision 15169) @@ -1,133 +1,133 @@ -@charset "UTF-8"; - -/* Profile Blocks -*******************************************************************************/ -.profile { - background-color: #fff; - border: 1px solid #d0d0d0; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - padding: 20px 30px; - width: auto; -} -.profile.registerpage { - border: none; - padding: 0 30px; - width: 680px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.profile-title { - border-bottom: 1px solid #d0d0d0; - margin-bottom: 15px; - padding-bottom: 15px; -} -.profile, .review h1 { - color: #525252; - float: left; - font: 1.538em Verdana,Arial,Tahoma,Sans-Serif; -} -.profile p.req { - color: #3e85d2; - float: right; - font-size: 1em; - font-weight: bold; - padding-top: 10px; -} -.profile .halfcol { - float: left; - padding: 0 15px 0 0; - width: 315px; -} -.profile .halfcol-last { - padding: 0; - position: relative; -} - -.profile-form label { - display: block; - font-weight: bold; - padding-bottom: 3px; -} - -.profile-form.left label { - display: inline; - padding-bottom: 0px; - - float: left; - padding-top: 3px; - width: 90px; -} - -.field-content label { - display: inline; - font-weight: normal; - padding: 0; -} - -.red { - color: #cd0000; - font-weight: normal; - padding: 0 0 0 5px; -} -.profile-form p { - clear: both !important; - float: left; - padding: 5px 0; -} -.profile-form .field { width: 270px; } -.profile-form .alt2 .field { width: 150px; } -.field.statusSuccess { - background: url(@templates_base@/img/bg-field-success.jpg) repeat-x 0 0; - border: 1px solid #80d04d !important; -} -.field.statusError, .error .field { - background: url(@templates_base@/img/bg-field-error.jpg) repeat-x 0 0; - border: 1px solid #d80000 !important; -} - -.review .profile-form .field { float: left; width: 380px; } -.review .profile-form p.buttons { padding: 0 0 0 90px; width: 380px; } -.review .profile-form p.buttons em { float: right; text-align: right; width: 170px; } - -.terms { - text-align: center; - width: 100%; -} - -.password-block { - /*display: none;*/ - float: left; - padding: 5px 0; - position: relative; - width: 100%; -} -.registerpage .password-block { display: block; } -.password-block p { - clear: none !important; - padding: 0 15px 0 0; -} -.password-block p.pasfield2 { padding: 0; } -.password-block .field { width: 121px; } -#change-password { color: #267bd1; } - - -.colorbar { - display: inline-block; - height: 8px; - width: 29px; -} - -.password-strength { display: none; font-weight: bold; } -.password-strength .meterDefault { color: #aaa; } -.password-strength .meterFail { color: #daa; } -.password-strength .meterWarn { color: #fd6; } -.password-strength .meterGood { color: #ada; } -.password-strength .meterExcel { color: #66c133; } -.password-strength .colorbar.meterDefault { background-color: #ddd; } -.password-strength .colorbar.meterFail { background-color: #fdd; } -.password-strength .colorbar.meterWarn { background-color: #feb; } -.password-strength .colorbar.meterGood { background-color: #dfd; } -.password-strength .colorbar.meterExcel { background-color: #66c133; } +@charset "UTF-8"; + +/* Profile Blocks +*******************************************************************************/ +.profile { + background-color: #fff; + border: 1px solid #d0d0d0; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + padding: 20px 30px; + width: auto; +} +.profile.registerpage { + border: none; + padding: 0 30px; + width: 680px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.profile-title { + border-bottom: 1px solid #d0d0d0; + margin-bottom: 15px; + padding-bottom: 15px; +} +.profile, .review h1 { + color: #525252; + float: left; + font: 1.538em Verdana,Arial,Tahoma,Sans-Serif; +} +.profile p.req { + color: #3e85d2; + float: right; + font-size: 1em; + font-weight: bold; + padding-top: 10px; +} +.profile .halfcol { + float: left; + padding: 0 15px 0 0; + width: 315px; +} +.profile .halfcol-last { + padding: 0; + position: relative; +} + +.profile-form label { + display: block; + font-weight: bold; + padding-bottom: 3px; +} + +.profile-form.left label { + display: inline; + padding-bottom: 0px; + + float: left; + padding-top: 3px; + width: 90px; +} + +.field-content label { + display: inline; + font-weight: normal; + padding: 0; +} + +.red { + color: #cd0000; + font-weight: normal; + padding: 0 0 0 5px; +} +.profile-form p { + clear: both !important; + float: left; + padding: 5px 0; +} +.profile-form .field { width: 270px; } +.profile-form .alt2 .field { width: 150px; } +.field.statusSuccess { + background: url(@templates_base@/img/bg-field-success.jpg) repeat-x 0 0; + border: 1px solid #80d04d !important; +} +.field.statusError, .error .field { + background: url(@templates_base@/img/bg-field-error.jpg) repeat-x 0 0; + border: 1px solid #d80000 !important; +} + +.review .profile-form .field { float: left; width: 380px; } +.review .profile-form p.buttons { padding: 0 0 0 90px; width: 380px; } +.review .profile-form p.buttons em { float: right; text-align: right; width: 170px; } + +.terms { + text-align: center; + width: 100%; +} + +.password-block { + /*display: none;*/ + float: left; + padding: 5px 0; + position: relative; + width: 100%; +} +.registerpage .password-block { display: block; } +.password-block p { + clear: none !important; + padding: 0 15px 0 0; +} +.password-block p.pasfield2 { padding: 0; } +.password-block .field { width: 121px; } +#change-password { color: #267bd1; } + + +.colorbar { + display: inline-block; + height: 8px; + width: 29px; +} + +.password-strength { display: none; font-weight: bold; } +.password-strength .meterDefault { color: #aaa; } +.password-strength .meterFail { color: #daa; } +.password-strength .meterWarn { color: #fd6; } +.password-strength .meterGood { color: #ada; } +.password-strength .meterExcel { color: #66c133; } +.password-strength .colorbar.meterDefault { background-color: #ddd; } +.password-strength .colorbar.meterFail { background-color: #fdd; } +.password-strength .colorbar.meterWarn { background-color: #feb; } +.password-strength .colorbar.meterGood { background-color: #dfd; } +.password-strength .colorbar.meterExcel { background-color: #66c133; } Index: branches/1.0.x/inc/modal.css =================================================================== diff -u -N -r14708 -r15169 --- branches/1.0.x/inc/modal.css (.../modal.css) (revision 14708) +++ branches/1.0.x/inc/modal.css (.../modal.css) (revision 15169) @@ -1,7 +1,7 @@ -@charset "UTF-8"; - -.tbox {position:absolute; display:none; padding:14px 17px; z-index:900} -.tinner {padding:15px; -moz-border-radius:3px; border-radius:3px; background:#fff url(@templates_base@/img/modal/preload.gif) no-repeat 50% 50%; border:1px solid #404040;} -.tmask {position:absolute; display:none; top:0px; left:0px; height:100%; width:100%; background:#000; z-index:800} -.tclose {position:absolute; top:45px; right:50px; width:100px; height:15px; cursor:pointer; background:url(@templates_base@/img/modal/close.png) no-repeat 100% 0; color: #5a5a5a; font: bold 11px Arial; text-align: right; padding-right: 20px;} +@charset "UTF-8"; + +.tbox {position:absolute; display:none; padding:14px 17px; z-index:900} +.tinner {padding:15px; -moz-border-radius:3px; border-radius:3px; background:#fff url(@templates_base@/img/modal/preload.gif) no-repeat 50% 50%; border:1px solid #404040;} +.tmask {position:absolute; display:none; top:0px; left:0px; height:100%; width:100%; background:#000; z-index:800} +.tclose {position:absolute; top:45px; right:50px; width:100px; height:15px; cursor:pointer; background:url(@templates_base@/img/modal/close.png) no-repeat 100% 0; color: #5a5a5a; font: bold 11px Arial; text-align: right; padding-right: 20px;} .tcontent {border: 9px solid #e6e6e6; padding: 40px 50px;} \ No newline at end of file Index: branches/1.0.x/maintenance.tpl =================================================================== diff -u -N -r14948 -r15169 --- branches/1.0.x/maintenance.tpl (.../maintenance.tpl) (revision 14948) +++ branches/1.0.x/maintenance.tpl (.../maintenance.tpl) (revision 15169) @@ -1,165 +1,165 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file Index: branches/1.0.x/elements/ajax/shipping_type.tpl =================================================================== diff -u -N -r14822 -r15169 --- branches/1.0.x/elements/ajax/shipping_type.tpl (.../shipping_type.tpl) (revision 14822) +++ branches/1.0.x/elements/ajax/shipping_type.tpl (.../shipping_type.tpl) (revision 15169) @@ -1,42 +1,42 @@ - -
- -
- - - - - - - - - - - - - - - - - - \ No newline at end of file Index: branches/1.0.x/inc/details.css =================================================================== diff -u -N -r14859 -r15169 --- branches/1.0.x/inc/details.css (.../details.css) (revision 14859) +++ branches/1.0.x/inc/details.css (.../details.css) (revision 15169) @@ -1,355 +1,355 @@ -@charset "UTF-8"; - -/* Category Page -*******************************************************************************/ -.goods { - margin: 5px 0; - padding: 20px 20px 10px 20px; -} - -.block h2 a.product-prev { - background: url(@templates_base@/img/product-nav.png) no-repeat 0 0; - height: 21px; - position: absolute; - right: 40px; - top: 9px; - width: 21px; -} -.block h2 a.product-next { - background: url(@templates_base@/img/product-nav.png) no-repeat 100% 0; - height: 21px; - position: absolute; - right: 15px; - top: 9px; - width: 21px; -} -.block h2 a.product-prev:hover { background-position: 0 -21px; } -.block h2 a.product-next:hover { background-position: 100% -21px; } - -.block h2 a.product-prev.disabled { background-position: 0 -42px; } -.block h2 a.product-next.disabled { background-position: 100% -42px; } - -.block h2 a.product-prev.disabled:hover, -.block h2 a.product-next.disabled:hover { background: none; } - -.product-detail { position: relative; } -.product-detail .ribbon { - background: url(@templates_base@/img/ribbon-big.png) no-repeat 0 0; - height: 53px; - position: absolute; - top: -3px; right: -7px; - width: 136px; - z-index: 100; -} -.product-detail .ribbon.sale { background-position: 0 0; } -.product-detail .ribbon.top { background-position: 0 -53px; } -.product-detail .ribbon.new { background-position: 0 -106px; } - -.product-detail h1 { - color: #000; - float: left; - font: 1.846em Tahoma,Verdana,Arial,Sans-Serif; - padding: 0 0 20px; -} -.product-detail .rating { - float: left; - padding: 6px 0 0 10px; -} -.product-detail .h1-reviews { - float: left; - padding: 8px 0 0 10px; -} - -.product .info { - float: left; - padding: 0 20px 0 0; - width: 260px; -} -.product .info .img { - position: relative; -} -.product .viewlarger { - position: absolute; - text-align: center; - top: 265px; - width: 260px; -} -.product .viewlarger a { - background: url(@templates_base@/img/icon-zoom-small.png) no-repeat 0 2px; - padding: 0 0 0 20px; -} -.product .info .img .signsmall { - color: #000; - font-size: 0.846em; - position: absolute; - top: 320px; - text-align: center; - width: 260px; -} -.product .info .img .showmore { - color: #686767; - margin-top: 490px; - position: absolute; -} - -.product .info .doplinks { - background: url(@templates_base@/img/bg-doplinks.jpg) no-repeat 0 0; - float: left; - height: 152px; - margin-top: 220px; - padding: 40px 0 0 25px; - width: 225px; -} -.product .doplinks a.link-print { - background: url(@templates_base@/img/icon-print.jpg) no-repeat 0 0; - display: inline-block; - height: 32px; - line-height: 32px; - padding: 0 20px 13px 40px; -} -.product .doplinks a.link-compare { - background: url(@templates_base@/img/icon-compare.png) no-repeat 3px 5px; - display: inline-block; - height: 32px; - line-height: 32px; - padding: 0 20px 10px 40px; -} -.product .doplinks a.link-wishlist { - background: url(@templates_base@/img/icon-wishlist.jpg) no-repeat 0 0; - display: inline-block; - height: 32px; - line-height: 32px; - padding: 0 20px 0 40px; -} - -.product .description { - float: left; - width: 380px; -} -.product .description .text { - padding: 15px 0; -} - -.product .description .options-har { - background-color: #f0f0f0; - margin-bottom: 15px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.product .description .options-har .sel-options { - color: #686767; - float: left; - padding: 8px 0 8px 20px; -} -.product .description .har { border-top: 1px solid #d0d0d0; float: left; margin-top: 10px; padding-top: 10px; text-align: left; width: 50%; } -.product .description .har dt { float: left; font-weight: bold; padding: 0 10px 3px 0; width: 100px; } -.product .description .har dd { float: left; padding: 0 0 3px 0; width: 80px; } -.product .description .har_right dt { width: 50px; } - -.product .description .price-block { - float: left; - width: 150px; -} -.product .description .price-block s.under { - display: block; - font-size: 1.308em; - font-weight: bold; - padding-right: 10px; -} -.product .description .price-block s.under span { font-size: 0.706em; } -.product .description .price-block .redprice { padding: 10px 0; } -.product .description .price-block em.price { - color: #C2120A; - font-size: 1.846em; - font-weight: bold; - font-style: normal; -} -.product .description .price-block em.price span { font-size: 0.708em; } -.product .description .order-block { - float: right; - width: 230px; -} -.product .description .order-block .qty { - color: #686767; - float: left; - padding-top: 5px; -} -.product .description .order-block .qty .field { - text-align: center; - width: 25px; -} -.product .description .order-block .avail { - color: #686767; - float: right; - font-weight: bold; - padding-top: 10px; -} -.product .description .order-block .avail em { - color: #00b309; -} -.product .description .order-block .but { - float: right; -} -.product .description .order-block .addtocart { - background: url(@templates_base@/img/addtocart-left.jpg) no-repeat 0 0; - color: #faffed; - display: inline-block; - font-size: 1.077em; - font-weight: bold; - text-shadow: #000 0px 1px 1px; - text-decoration: none; -} -.product .description .order-block .addtocart span { - background: url(@templates_base@/img/addtocart-right.jpg) no-repeat 100% 0; - display: inline-block; - padding: 0 20px 0 10px; -} -.product .description .order-block .addtocart span i { - background: url(@templates_base@/img/bg-button-cart-add.png) no-repeat 0 3px; - line-height: 33px; - padding: 7px 0 7px 30px; -} - -.product .description .order-block .addedtocart { - color: #3D901F; - font-size: 1.154em; -} - -/*** Tabs ***/ -.ui-tabs .ui-tabs-nav { - padding: 0; -} -.ui-widget-header { - background: none; - border: none; - color: #000; -} -.ui-tabs .ui-tabs-nav li { - border: 1px solid #949494; -} -.ui-tabs .ui-tabs-nav li.ui-tabs-selected { - background: #fff url(@templates_base@/img/bg-tab.png) repeat-x 0 0; - border-bottom: none; - position: relative; - z-index: 100; - bottom: -1px; -} - -.ui-tabs .ui-tabs-panel { - border: 1px solid #949494; - height: 350px; - overflow-x: hidden; -} -.ui-tabs .ui-tabs-panel p { padding-bottom: 15px; } - -/*** Reviews ***/ -.reviews { - border-bottom: 1px solid #d0d0d0; - float: left; - padding-top: 30px; - width: 100%; -} -.reviews .info-review { - float: left; - padding: 0 0 20px; - width: 350px; -} -.reviews .info-review .title { - color: #2b2b2b; - font-size: 1.385em; - line-height: 1.2em; -} -.reviews .info-review .but-review { - float: left; - padding: 20px 0 0; -} -.reviews .info-review .addreview { - background: url(@templates_base@/img/icon-addreview.jpg) no-repeat 0 0; - display: block; - height: 22px; - line-height: 22px; - padding: 0 0 0 30px; -} -.reviews .info-review .sortby { - color: #585858; - float: left; - font-weight: bold; - padding: 20px 0 0 20px; -} -.reviews .overall-review { - float: right; - width: 215px; -} -.reviews .overall-review p { - color: #585858; - float: left; - font-weight: bold; - padding: 0 10px 0 0; -} -.reviews .overall-review .overall-detail { - float: left; -} -.reviews .overall-review .overall-detail i { - float: left; - width: 35px; -} -.reviews .overall-review .overall-detail span { - float: left; - width: 75px; -} - -.reviews .row-review { - border-top: 1px solid #d0d0d0; - clear: both !important; - float: left; - padding: 15px 0; -} -.reviews .row-review .user { color: #2275cd; font-weight: bold; padding: 0 0 10px; } -.reviews .row-review .text-review { color: #000; padding: 0 0 10px; } -.reviews .row-review .optional-review { color: #000; font-size: 0.846em; } -.reviews .row-review .optional-review p { - float: left; - padding: 0 20px 0 0; -} -.reviews .row-review .optional-review em { color: #8b8b8b; } -.reviews .row-review .optional-review p.rat img { margin-bottom: -2px; } -.reviews .row-review .optional-review p.date { float: right; padding: 0; text-align: right; } -.reviews .row-review .optional-review a { color: #000; } -.reviews .row-review .optional-review a.yes { color: #009000; font-weight: bold; } -.reviews .row-review .optional-review a.no { color: #ae0000; font-weight: bold; } - -/*** Pagination ***/ -.pagination { padding: 20px 0 10px; text-align: center; } -.pagination span, -.pagination a { - background: url(@templates_base@/img/paginate.png) no-repeat -28px 0; - color: #fff; - display: inline-block; - font-size: 1.308em; - font-weight: bold; - height: 28px; - line-height: 28px; - text-align: center; - text-decoration: none; - width: 28px; -} -.pagination span.prev { - background-position: 0 100%; - margin-right: 20px; -} -.pagination a.prev { - background-position: 0 0; - margin-right: 20px; -} -.pagination span.next { - background-position: -56px 100%; - margin-left: 20px; -} -.pagination a.next { - background-position: -56px 0; - margin-left: 20px; -} -.pagination a.active { - background-position: -28px 100%; -} +@charset "UTF-8"; + +/* Category Page +*******************************************************************************/ +.goods { + margin: 5px 0; + padding: 20px 20px 10px 20px; +} + +.block h2 a.product-prev { + background: url(@templates_base@/img/product-nav.png) no-repeat 0 0; + height: 21px; + position: absolute; + right: 40px; + top: 9px; + width: 21px; +} +.block h2 a.product-next { + background: url(@templates_base@/img/product-nav.png) no-repeat 100% 0; + height: 21px; + position: absolute; + right: 15px; + top: 9px; + width: 21px; +} +.block h2 a.product-prev:hover { background-position: 0 -21px; } +.block h2 a.product-next:hover { background-position: 100% -21px; } + +.block h2 a.product-prev.disabled { background-position: 0 -42px; } +.block h2 a.product-next.disabled { background-position: 100% -42px; } + +.block h2 a.product-prev.disabled:hover, +.block h2 a.product-next.disabled:hover { background: none; } + +.product-detail { position: relative; } +.product-detail .ribbon { + background: url(@templates_base@/img/ribbon-big.png) no-repeat 0 0; + height: 53px; + position: absolute; + top: -3px; right: -7px; + width: 136px; + z-index: 100; +} +.product-detail .ribbon.sale { background-position: 0 0; } +.product-detail .ribbon.top { background-position: 0 -53px; } +.product-detail .ribbon.new { background-position: 0 -106px; } + +.product-detail h1 { + color: #000; + float: left; + font: 1.846em Tahoma,Verdana,Arial,Sans-Serif; + padding: 0 0 20px; +} +.product-detail .rating { + float: left; + padding: 6px 0 0 10px; +} +.product-detail .h1-reviews { + float: left; + padding: 8px 0 0 10px; +} + +.product .info { + float: left; + padding: 0 20px 0 0; + width: 260px; +} +.product .info .img { + position: relative; +} +.product .viewlarger { + position: absolute; + text-align: center; + top: 265px; + width: 260px; +} +.product .viewlarger a { + background: url(@templates_base@/img/icon-zoom-small.png) no-repeat 0 2px; + padding: 0 0 0 20px; +} +.product .info .img .signsmall { + color: #000; + font-size: 0.846em; + position: absolute; + top: 320px; + text-align: center; + width: 260px; +} +.product .info .img .showmore { + color: #686767; + margin-top: 490px; + position: absolute; +} + +.product .info .doplinks { + background: url(@templates_base@/img/bg-doplinks.jpg) no-repeat 0 0; + float: left; + height: 152px; + margin-top: 220px; + padding: 40px 0 0 25px; + width: 225px; +} +.product .doplinks a.link-print { + background: url(@templates_base@/img/icon-print.jpg) no-repeat 0 0; + display: inline-block; + height: 32px; + line-height: 32px; + padding: 0 20px 13px 40px; +} +.product .doplinks a.link-compare { + background: url(@templates_base@/img/icon-compare.png) no-repeat 3px 5px; + display: inline-block; + height: 32px; + line-height: 32px; + padding: 0 20px 10px 40px; +} +.product .doplinks a.link-wishlist { + background: url(@templates_base@/img/icon-wishlist.jpg) no-repeat 0 0; + display: inline-block; + height: 32px; + line-height: 32px; + padding: 0 20px 0 40px; +} + +.product .description { + float: left; + width: 380px; +} +.product .description .text { + padding: 15px 0; +} + +.product .description .options-har { + background-color: #f0f0f0; + margin-bottom: 15px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.product .description .options-har .sel-options { + color: #686767; + float: left; + padding: 8px 0 8px 20px; +} +.product .description .har { border-top: 1px solid #d0d0d0; float: left; margin-top: 10px; padding-top: 10px; text-align: left; width: 50%; } +.product .description .har dt { float: left; font-weight: bold; padding: 0 10px 3px 0; width: 100px; } +.product .description .har dd { float: left; padding: 0 0 3px 0; width: 80px; } +.product .description .har_right dt { width: 50px; } + +.product .description .price-block { + float: left; + width: 150px; +} +.product .description .price-block s.under { + display: block; + font-size: 1.308em; + font-weight: bold; + padding-right: 10px; +} +.product .description .price-block s.under span { font-size: 0.706em; } +.product .description .price-block .redprice { padding: 10px 0; } +.product .description .price-block em.price { + color: #C2120A; + font-size: 1.846em; + font-weight: bold; + font-style: normal; +} +.product .description .price-block em.price span { font-size: 0.708em; } +.product .description .order-block { + float: right; + width: 230px; +} +.product .description .order-block .qty { + color: #686767; + float: left; + padding-top: 5px; +} +.product .description .order-block .qty .field { + text-align: center; + width: 25px; +} +.product .description .order-block .avail { + color: #686767; + float: right; + font-weight: bold; + padding-top: 10px; +} +.product .description .order-block .avail em { + color: #00b309; +} +.product .description .order-block .but { + float: right; +} +.product .description .order-block .addtocart { + background: url(@templates_base@/img/addtocart-left.jpg) no-repeat 0 0; + color: #faffed; + display: inline-block; + font-size: 1.077em; + font-weight: bold; + text-shadow: #000 0px 1px 1px; + text-decoration: none; +} +.product .description .order-block .addtocart span { + background: url(@templates_base@/img/addtocart-right.jpg) no-repeat 100% 0; + display: inline-block; + padding: 0 20px 0 10px; +} +.product .description .order-block .addtocart span i { + background: url(@templates_base@/img/bg-button-cart-add.png) no-repeat 0 3px; + line-height: 33px; + padding: 7px 0 7px 30px; +} + +.product .description .order-block .addedtocart { + color: #3D901F; + font-size: 1.154em; +} + +/*** Tabs ***/ +.ui-tabs .ui-tabs-nav { + padding: 0; +} +.ui-widget-header { + background: none; + border: none; + color: #000; +} +.ui-tabs .ui-tabs-nav li { + border: 1px solid #949494; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { + background: #fff url(@templates_base@/img/bg-tab.png) repeat-x 0 0; + border-bottom: none; + position: relative; + z-index: 100; + bottom: -1px; +} + +.ui-tabs .ui-tabs-panel { + border: 1px solid #949494; + height: 350px; + overflow-x: hidden; +} +.ui-tabs .ui-tabs-panel p { padding-bottom: 15px; } + +/*** Reviews ***/ +.reviews { + border-bottom: 1px solid #d0d0d0; + float: left; + padding-top: 30px; + width: 100%; +} +.reviews .info-review { + float: left; + padding: 0 0 20px; + width: 350px; +} +.reviews .info-review .title { + color: #2b2b2b; + font-size: 1.385em; + line-height: 1.2em; +} +.reviews .info-review .but-review { + float: left; + padding: 20px 0 0; +} +.reviews .info-review .addreview { + background: url(@templates_base@/img/icon-addreview.jpg) no-repeat 0 0; + display: block; + height: 22px; + line-height: 22px; + padding: 0 0 0 30px; +} +.reviews .info-review .sortby { + color: #585858; + float: left; + font-weight: bold; + padding: 20px 0 0 20px; +} +.reviews .overall-review { + float: right; + width: 215px; +} +.reviews .overall-review p { + color: #585858; + float: left; + font-weight: bold; + padding: 0 10px 0 0; +} +.reviews .overall-review .overall-detail { + float: left; +} +.reviews .overall-review .overall-detail i { + float: left; + width: 35px; +} +.reviews .overall-review .overall-detail span { + float: left; + width: 75px; +} + +.reviews .row-review { + border-top: 1px solid #d0d0d0; + clear: both !important; + float: left; + padding: 15px 0; +} +.reviews .row-review .user { color: #2275cd; font-weight: bold; padding: 0 0 10px; } +.reviews .row-review .text-review { color: #000; padding: 0 0 10px; } +.reviews .row-review .optional-review { color: #000; font-size: 0.846em; } +.reviews .row-review .optional-review p { + float: left; + padding: 0 20px 0 0; +} +.reviews .row-review .optional-review em { color: #8b8b8b; } +.reviews .row-review .optional-review p.rat img { margin-bottom: -2px; } +.reviews .row-review .optional-review p.date { float: right; padding: 0; text-align: right; } +.reviews .row-review .optional-review a { color: #000; } +.reviews .row-review .optional-review a.yes { color: #009000; font-weight: bold; } +.reviews .row-review .optional-review a.no { color: #ae0000; font-weight: bold; } + +/*** Pagination ***/ +.pagination { padding: 20px 0 10px; text-align: center; } +.pagination span, +.pagination a { + background: url(@templates_base@/img/paginate.png) no-repeat -28px 0; + color: #fff; + display: inline-block; + font-size: 1.308em; + font-weight: bold; + height: 28px; + line-height: 28px; + text-align: center; + text-decoration: none; + width: 28px; +} +.pagination span.prev { + background-position: 0 100%; + margin-right: 20px; +} +.pagination a.prev { + background-position: 0 0; + margin-right: 20px; +} +.pagination span.next { + background-position: -56px 100%; + margin-left: 20px; +} +.pagination a.next { + background-position: -56px 0; + margin-left: 20px; +} +.pagination a.active { + background-position: -28px 100%; +} Index: branches/1.0.x/elements/ajax/order_totals.tpl =================================================================== diff -u -N -r14829 -r15169 --- branches/1.0.x/elements/ajax/order_totals.tpl (.../order_totals.tpl) (revision 14829) +++ branches/1.0.x/elements/ajax/order_totals.tpl (.../order_totals.tpl) (revision 15169) @@ -1,42 +1,42 @@ - - - -
Subtotal
-
-
- - - - -
Shipping
-
-
- - -
Processing Fee
-
-
- - -
Tax %
-
-
- - -
Discount:
-
-
-
- - - - -
Gift Certificate
-
-
- -
Order Total
+ + + +
Subtotal
+
+
+ + + + +
Shipping
+
+
+ + +
Processing Fee
+
+
+ + +
Tax %
+
+
+ + +
Discount:
+
-
+
+ + + + +
Gift Certificate
+
+
+ +
Order Total
\ No newline at end of file Index: branches/1.0.x/inc/reset.css =================================================================== diff -u -N -r14600 -r15169 --- branches/1.0.x/inc/reset.css (.../reset.css) (revision 14600) +++ branches/1.0.x/inc/reset.css (.../reset.css) (revision 15169) @@ -1,48 +1,48 @@ -/* http://meyerweb.com/eric/tools/css/reset/ - v2.0 | 20110126 - License: none (public domain) -*/ - -html, body, div, span, applet, object, iframe, -h1, h2, h3, h4, h5, h6, p, blockquote, pre, -a, abbr, acronym, address, big, cite, code, -del, dfn, em, img, ins, kbd, q, s, samp, -small, strike, sub, tt, var, -b, u, i, center, -dl, dt, dd, ol, ul, li, -fieldset, form, label, legend, -table, caption, tbody, tfoot, thead, tr, th, td, -article, aside, canvas, details, embed, -figure, figcaption, footer, header, hgroup, -menu, nav, output, ruby, section, summary, -time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; -} -/* HTML5 display-role reset for older browsers */ -article, aside, details, figcaption, figure, -footer, header, hgroup, menu, nav, section { - display: block; -} -body { - line-height: 1; -} -ol, ul { - list-style: none; -} -blockquote, q { - quotes: none; -} -blockquote:before, blockquote:after, -q:before, q:after { - content: ''; - content: none; -} -table { - border-collapse: collapse; - border-spacing: 0; +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, sub, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; } \ No newline at end of file Index: branches/1.0.x/inc/review.css =================================================================== diff -u -N -r14708 -r15169 --- branches/1.0.x/inc/review.css (.../review.css) (revision 14708) +++ branches/1.0.x/inc/review.css (.../review.css) (revision 15169) @@ -1,59 +1,59 @@ -@charset "UTF-8"; - -/* Review Blocks -*******************************************************************************/ -.review { - background-color: #fff; - width: 500px; -} -.review h1 { - color: #525252; - font: 1.538em Verdana,Arial,Tahoma,Sans-Serif; - padding: 0 0 20px; -} - -.profile-form label { - float: left; - font-weight: bold; - padding-top: 3px; - width: 90px; -} -.red { - color: #cd0000; - font-weight: normal; - padding: 0 0 0 5px; -} -.profile-form p { - clear: both !important; - float: left; - padding: 5px 0; -} -.profile-form .field { float: left; width: 380px; } -.profile-form textarea.field { - height: 70px; -} -.profile-form p span { float: left; width: 380px; } -.profile-form p.buttons { padding: 0 0 0 90px; width: 380px; } -.profile-form p.buttons em { float: right; text-align: right; width: 170px; } -.field.statusSuccess { - background: url(@templates_base@/img/bg-field-success.jpg) repeat-x 0 0; - border: 1px solid #80d04d; -} -.field.statusError { - background: url(@templates_base@/img/bg-field-error.jpg) repeat-x 0 0; - border: 1px solid #d80000; -} - -.review .success { - color: #0b9f00; - font-size: 1.385em; - padding: 80px 0 20px; - text-align: center; -} -.review .warning { - padding-bottom: 30px; - text-align: center; -} -.review .button { - text-align: center; -} +@charset "UTF-8"; + +/* Review Blocks +*******************************************************************************/ +.review { + background-color: #fff; + width: 500px; +} +.review h1 { + color: #525252; + font: 1.538em Verdana,Arial,Tahoma,Sans-Serif; + padding: 0 0 20px; +} + +.profile-form label { + float: left; + font-weight: bold; + padding-top: 3px; + width: 90px; +} +.red { + color: #cd0000; + font-weight: normal; + padding: 0 0 0 5px; +} +.profile-form p { + clear: both !important; + float: left; + padding: 5px 0; +} +.profile-form .field { float: left; width: 380px; } +.profile-form textarea.field { + height: 70px; +} +.profile-form p span { float: left; width: 380px; } +.profile-form p.buttons { padding: 0 0 0 90px; width: 380px; } +.profile-form p.buttons em { float: right; text-align: right; width: 170px; } +.field.statusSuccess { + background: url(@templates_base@/img/bg-field-success.jpg) repeat-x 0 0; + border: 1px solid #80d04d; +} +.field.statusError { + background: url(@templates_base@/img/bg-field-error.jpg) repeat-x 0 0; + border: 1px solid #d80000; +} + +.review .success { + color: #0b9f00; + font-size: 1.385em; + padding: 80px 0 20px; + text-align: center; +} +.review .warning { + padding-bottom: 30px; + text-align: center; +} +.review .button { + text-align: center; +} Index: branches/1.0.x/inc/validationEngine.jquery.css =================================================================== diff -u -N -r14708 -r15169 --- branches/1.0.x/inc/validationEngine.jquery.css (.../validationEngine.jquery.css) (revision 14708) +++ branches/1.0.x/inc/validationEngine.jquery.css (.../validationEngine.jquery.css) (revision 15169) @@ -1,145 +1,145 @@ -.inputContainer { - position: relative; - float: left; -} - -.formError { - position: absolute; - top: 300px; - left: 300px; - display: block; - z-index: 5000; - cursor: pointer; -} - -.ajaxSubmit { - padding: 20px; - background: #55ea55; - border: 1px solid #999; - display: none -} - -.formError .formErrorContent { - width: 100%; - background: #990000 url(@templates_base@/img/validate/con-error.png) repeat-x 0 0; - position:relative; - z-index:5001; - color: #fff; - width: 200px; - font-family: Arial; - font-size: 12px; - box-shadow: 0 0 3px #444; - -moz-box-shadow: 0 0 3px #444; - -webkit-box-shadow: 0 0 3px #444; - padding: 4px 10px 4px 10px; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -.greenPopup .formErrorContent { - background: #33be40; -} - -.blackPopup .formErrorContent { - background: #393939; - color: #FFF; -} - -.formError .formErrorArrow { - background: url(@templates_base@/img/validate/con-arrow.png) no-repeat 0 0; - height: 17px; - margin: -21px 0 0 -8px; - position: relative; - width: 8px; - z-index: 5006; -} - -.formError .formErrorArrowBottom { - box-shadow: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - margin: 0px 0 0 12px; - top:2px; -} - -.formError .formErrorArrow div { - display: none; -/* border-left: 2px solid #ddd; - border-right: 2px solid #ddd; - box-shadow: 0 2px 3px #444; - -moz-box-shadow: 0 2px 3px #444; - -webkit-box-shadow: 0 2px 3px #444; - font-size: 0px; - height: 1px; - background: #ee0101; - margin: 0 auto; - line-height: 0; - font-size: 0; - display: block;*/ -} -/* -.formError .formErrorArrowBottom div { - box-shadow: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; -} - -.greenPopup .formErrorArrow div { - background: #33be40; -} - -.blackPopup .formErrorArrow div { - background: #393939; - color: #FFF; -} - -.formError .formErrorArrow .line10 { - width: 15px; - border: none; -} - -.formError .formErrorArrow .line9 { - width: 13px; - border: none; -} - -.formError .formErrorArrow .line8 { - width: 11px; -} - -.formError .formErrorArrow .line7 { - width: 9px; -} - -.formError .formErrorArrow .line6 { - width: 7px; -} - -.formError .formErrorArrow .line5 { - width: 5px; -} - -.formError .formErrorArrow .line4 { - width: 3px; -} - -.formError .formErrorArrow .line3 { - width: 1px; - border-left: 2px solid #ddd; - border-right: 2px solid #ddd; - border-bottom: 0 solid #ddd; -} - -.formError .formErrorArrow .line2 { - width: 3px; - border: none; - background: #ddd; -} - -.formError .formErrorArrow .line1 { - width: 1px; - border: none; - background: #ddd; -} +.inputContainer { + position: relative; + float: left; +} + +.formError { + position: absolute; + top: 300px; + left: 300px; + display: block; + z-index: 5000; + cursor: pointer; +} + +.ajaxSubmit { + padding: 20px; + background: #55ea55; + border: 1px solid #999; + display: none +} + +.formError .formErrorContent { + width: 100%; + background: #990000 url(@templates_base@/img/validate/con-error.png) repeat-x 0 0; + position:relative; + z-index:5001; + color: #fff; + width: 200px; + font-family: Arial; + font-size: 12px; + box-shadow: 0 0 3px #444; + -moz-box-shadow: 0 0 3px #444; + -webkit-box-shadow: 0 0 3px #444; + padding: 4px 10px 4px 10px; + border-radius: 3px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; +} + +.greenPopup .formErrorContent { + background: #33be40; +} + +.blackPopup .formErrorContent { + background: #393939; + color: #FFF; +} + +.formError .formErrorArrow { + background: url(@templates_base@/img/validate/con-arrow.png) no-repeat 0 0; + height: 17px; + margin: -21px 0 0 -8px; + position: relative; + width: 8px; + z-index: 5006; +} + +.formError .formErrorArrowBottom { + box-shadow: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + margin: 0px 0 0 12px; + top:2px; +} + +.formError .formErrorArrow div { + display: none; +/* border-left: 2px solid #ddd; + border-right: 2px solid #ddd; + box-shadow: 0 2px 3px #444; + -moz-box-shadow: 0 2px 3px #444; + -webkit-box-shadow: 0 2px 3px #444; + font-size: 0px; + height: 1px; + background: #ee0101; + margin: 0 auto; + line-height: 0; + font-size: 0; + display: block;*/ +} +/* +.formError .formErrorArrowBottom div { + box-shadow: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; +} + +.greenPopup .formErrorArrow div { + background: #33be40; +} + +.blackPopup .formErrorArrow div { + background: #393939; + color: #FFF; +} + +.formError .formErrorArrow .line10 { + width: 15px; + border: none; +} + +.formError .formErrorArrow .line9 { + width: 13px; + border: none; +} + +.formError .formErrorArrow .line8 { + width: 11px; +} + +.formError .formErrorArrow .line7 { + width: 9px; +} + +.formError .formErrorArrow .line6 { + width: 7px; +} + +.formError .formErrorArrow .line5 { + width: 5px; +} + +.formError .formErrorArrow .line4 { + width: 3px; +} + +.formError .formErrorArrow .line3 { + width: 1px; + border-left: 2px solid #ddd; + border-right: 2px solid #ddd; + border-bottom: 0 solid #ddd; +} + +.formError .formErrorArrow .line2 { + width: 3px; + border: none; + background: #ddd; +} + +.formError .formErrorArrow .line1 { + width: 1px; + border: none; + background: #ddd; +} */ \ No newline at end of file Index: branches/1.0.x/elements/ajax/order_details.tpl =================================================================== diff -u -N -r15036 -r15169 --- branches/1.0.x/elements/ajax/order_details.tpl (.../order_details.tpl) (revision 15036) +++ branches/1.0.x/elements/ajax/order_details.tpl (.../order_details.tpl) (revision 15169) @@ -1,51 +1,51 @@ - - - - - - rowspan="2"> - - - - - - -
- :
- : -
- - - - - - - - - - - - - - - - - -
- -
- - - - - - - - - - - - - -
Items in your order ()Qty.PriceTotal
+ + + + + + rowspan="2"> + + + + + + +
+ :
+ : +
+ + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + +
Items in your order ()Qty.PriceTotal
\ No newline at end of file Index: branches/1.0.x/inc/js/passwordStrengthMeter.js =================================================================== diff -u -N -r14759 -r15169 --- branches/1.0.x/inc/js/passwordStrengthMeter.js (.../passwordStrengthMeter.js) (revision 14759) +++ branches/1.0.x/inc/js/passwordStrengthMeter.js (.../passwordStrengthMeter.js) (revision 15169) @@ -1,138 +1,138 @@ -function PasswordStrengthMeter($settings) { - this.inputSelector = ''; - - this.phrases = { - 'short': 'Too Short Password', - 'bad': 'Week; Use letters & numbers', - 'good': 'Medium; Use special characters', - 'strong': 'Strong Password' - }; - - this.cssClasses = { - 'short': 'meterFail', - 'bad': 'meterWarn', - 'good': 'meterGood', - 'strong': 'meterExcel' - }; - - $.extend(true, this, $settings); - - var $me = this; - - $(document).ready( - function() { - $($me.inputSelector).keyup( - function($e) { - $($me.inputSelector + '_strength') - .html( $me.getStrengthHTML( $(this).val() ) ) - .show(); - } - ); - } - ); -} - -PasswordStrengthMeter.prototype.getStrength = function (password) { - var score = 0; - - // password < 4 - if (password.length < 4) { - return 'short'; - } - - // password length - score += password.length * 4; - score += parseInt( this.checkRepetition(1, password).length - password.length ); - score += parseInt( this.checkRepetition(2, password).length - password.length ); - score += parseInt( this.checkRepetition(3, password).length - password.length ); - score += parseInt( this.checkRepetition(4, password).length - password.length ); - - // password has 3 numbers - if (password.match(/(.*[0-9].*[0-9].*[0-9])/)) { - score += 5; - } - - // password has 2 symbols - if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) { - score += 5; - } - - // password has Upper and Lower chars - if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)) { - score += 10; - } - - // password has number and chars - if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/)) { - score += 15; - } - // - // password has number and symbol - if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([0-9])/)) { - score += 15; - } - - // password has char and symbol - if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([a-zA-Z])/)) { - score += 15; - } - - // password is just a nubers or chars - if (password.match(/^\w+$/) || password.match(/^\d+$/)) { - score -= 10; - } - - // verifying 0 < score < 100 - if (score < 0) { - score = 0; - } - - if (score > 100) { - score = 100; - } - - if (score < 34) { - return 'bad'; - } - - if (score < 68) { - return 'good'; - } - - return 'strong'; -} - -PasswordStrengthMeter.prototype.getStrengthHTML = function (password) { - var $strength = this.getStrength(password), - $css_class = this.cssClasses[$strength], - $phrase = this.phrases[$strength]; - - return ' ' + $phrase + ''; -} - -PasswordStrengthMeter.prototype.checkRepetition = function(pLen, str) { - var res = "", - repeated = true; - - for (i = 0; i < str.length; i++) { - repeated = true; - - for (j = 0; j < pLen && (j + i + pLen) < str.length; j++) { - repeated = repeated && (str.charAt(j + i) == str.charAt(j + i + pLen)); - } - - if (j < pLen) { - repeated = false; - } - - if (repeated) { - i += pLen - 1; - repeated = false; - } - else { - res += str.charAt(i); - } - } - - return res; +function PasswordStrengthMeter($settings) { + this.inputSelector = ''; + + this.phrases = { + 'short': 'Too Short Password', + 'bad': 'Week; Use letters & numbers', + 'good': 'Medium; Use special characters', + 'strong': 'Strong Password' + }; + + this.cssClasses = { + 'short': 'meterFail', + 'bad': 'meterWarn', + 'good': 'meterGood', + 'strong': 'meterExcel' + }; + + $.extend(true, this, $settings); + + var $me = this; + + $(document).ready( + function() { + $($me.inputSelector).keyup( + function($e) { + $($me.inputSelector + '_strength') + .html( $me.getStrengthHTML( $(this).val() ) ) + .show(); + } + ); + } + ); +} + +PasswordStrengthMeter.prototype.getStrength = function (password) { + var score = 0; + + // password < 4 + if (password.length < 4) { + return 'short'; + } + + // password length + score += password.length * 4; + score += parseInt( this.checkRepetition(1, password).length - password.length ); + score += parseInt( this.checkRepetition(2, password).length - password.length ); + score += parseInt( this.checkRepetition(3, password).length - password.length ); + score += parseInt( this.checkRepetition(4, password).length - password.length ); + + // password has 3 numbers + if (password.match(/(.*[0-9].*[0-9].*[0-9])/)) { + score += 5; + } + + // password has 2 symbols + if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) { + score += 5; + } + + // password has Upper and Lower chars + if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)) { + score += 10; + } + + // password has number and chars + if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/)) { + score += 15; + } + // + // password has number and symbol + if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([0-9])/)) { + score += 15; + } + + // password has char and symbol + if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([a-zA-Z])/)) { + score += 15; + } + + // password is just a nubers or chars + if (password.match(/^\w+$/) || password.match(/^\d+$/)) { + score -= 10; + } + + // verifying 0 < score < 100 + if (score < 0) { + score = 0; + } + + if (score > 100) { + score = 100; + } + + if (score < 34) { + return 'bad'; + } + + if (score < 68) { + return 'good'; + } + + return 'strong'; +} + +PasswordStrengthMeter.prototype.getStrengthHTML = function (password) { + var $strength = this.getStrength(password), + $css_class = this.cssClasses[$strength], + $phrase = this.phrases[$strength]; + + return ' ' + $phrase + ''; +} + +PasswordStrengthMeter.prototype.checkRepetition = function(pLen, str) { + var res = "", + repeated = true; + + for (i = 0; i < str.length; i++) { + repeated = true; + + for (j = 0; j < pLen && (j + i + pLen) < str.length; j++) { + repeated = repeated && (str.charAt(j + i) == str.charAt(j + i + pLen)); + } + + if (j < pLen) { + repeated = false; + } + + if (repeated) { + i += pLen - 1; + repeated = false; + } + else { + res += str.charAt(i); + } + } + + return res; } \ No newline at end of file Index: branches/1.0.x/inc/js/validate/jquery.validationEngine.js =================================================================== diff -u -N -r14600 -r15169 --- branches/1.0.x/inc/js/validate/jquery.validationEngine.js (.../jquery.validationEngine.js) (revision 14600) +++ branches/1.0.x/inc/js/validate/jquery.validationEngine.js (.../jquery.validationEngine.js) (revision 15169) @@ -1,1429 +1,1429 @@ -/* - * Inline Form Validation Engine 2.2, jQuery plugin - * - * Copyright(c) 2010, Cedric Dugas - * http://www.position-absolute.com - * - * 2.0 Rewrite by Olivier Refalo - * http://www.crionics.com - * - * Form validation engine allowing custom regex rules to be added. - * Licensed under the MIT License - */ -(function($) { - - var methods = { - - /** - * Kind of the constructor, called before any action - * @param {Map} user options - */ - init: function(options) { - var form = this; - if (!form.data('jqv') || form.data('jqv') == null ) { - methods._saveOptions(form, options); - - // bind all formError elements to close on click - $(".formError").live("click", function() { - $(this).fadeOut(150, function() { - - // remove prompt once invisible - $(this).remove(); - }); - }); - } - }, - /** - * Attachs jQuery.validationEngine to form.submit and field.blur events - * Takes an optional params: a list of options - * ie. jQuery("#formID1").validationEngine('attach', {promptPosition : "centerRight"}); - */ - attach: function(userOptions) { - - var form = this; - var options; - - if(userOptions) - options = methods._saveOptions(form, userOptions); - else - options = form.data('jqv'); - - var validateAttribute = (form.find("[data-validation-engine*=validate]")) ? "data-validation-engine" : "class"; - - if (!options.binded) { - if (options.bindMethod == "bind"){ - - // bind fields - form.find("[class*=validate]").not("[type=checkbox]").not("[type=radio]").not(".datepicker").bind(options.validationEventTrigger, methods._onFieldEvent); - form.find("[class*=validate][type=checkbox],[class*=validate][type=radio]").bind("click", methods._onFieldEvent); - - form.find("[class*=validate][class*=datepicker]").bind(options.validationEventTrigger,{"delay": 300}, methods._onFieldEvent); - - // bind form.submit - form.bind("submit", methods._onSubmitEvent); - } else if (options.bindMethod == "live") { - // bind fields with LIVE (for persistant state) - form.find("[class*=validate]").not("[type=checkbox]").not(".datepicker").live(options.validationEventTrigger, methods._onFieldEvent); - form.find("[class*=validate][type=checkbox]").live("click", methods._onFieldEvent); - - form.find("[class*=validate][class*=datepicker]").live(options.validationEventTrigger,{"delay": 300}, methods._onFieldEvent); - - // bind form.submit - form.live("submit", methods._onSubmitEvent); - } - - options.binded = true; - } - return this; - }, - /** - * Unregisters any bindings that may point to jQuery.validaitonEngine - */ - detach: function() { - var form = this; - var options = form.data('jqv'); - if (options.binded) { - - // unbind fields - form.find("[class*=validate]").not("[type=checkbox]").unbind(options.validationEventTrigger, methods._onFieldEvent); - form.find("[class*=validate][type=checkbox],[class*=validate][type=radio]").unbind("click", methods._onFieldEvent); - - // unbind form.submit - form.unbind("submit", methods.onAjaxFormComplete); - - - // unbind live fields (kill) - form.find("[class*=validate]").not("[type=checkbox]").die(options.validationEventTrigger, methods._onFieldEvent); - form.find("[class*=validate][type=checkbox]").die("click", methods._onFieldEvent); - // unbind form.submit - - - - - form.die("submit", methods.onAjaxFormComplete); - - form.removeData('jqv'); - } - }, - /** - * Validates the form fields, shows prompts accordingly. - * Note: There is no ajax form validation with this method, only field ajax validation are evaluated - * - * @return true if the form validates, false if it fails - */ - validate: function() { - return methods._validateFields(this); - }, - /** - * Validates one field, shows prompt accordingly. - * Note: There is no ajax form validation with this method, only field ajax validation are evaluated - * - * @return true if the form validates, false if it fails - */ - validateField: function(el) { - var options = $(this).data('jqv'); - return methods._validateField($(el), options); - }, - /** - * Validates the form fields, shows prompts accordingly. - * Note: this methods performs fields and form ajax validations(if setup) - * - * @return true if the form validates, false if it fails, undefined if ajax is used for form validation - */ - validateform: function() { - return methods._onSubmitEvent.call(this); - }, - /** - * Redraw prompts position, useful when you change the DOM state when validating - */ - updatePromptsPosition: function() { - var form = this.closest('form'); - var options = form.data('jqv'); - // No option, take default one - form.find('[class*=validate]').not(':hidden').not(":disabled").each(function(){ - var field = $(this); - - var prompt = methods._getPrompt(field); - var promptText = $(prompt).find(".formErrorContent").html(); - - if(prompt) methods._updatePrompt(field, $(prompt), promptText, undefined, false, options); - }) - }, - /** - * Displays a prompt on a element. - * Note that the element needs an id! - * - * @param {String} promptText html text to display type - * @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red) - * @param {String} possible values topLeft, topRight, bottomLeft, centerRight, bottomRight - */ - showPrompt: function(promptText, type, promptPosition, showArrow) { - - var form = this.closest('form'); - var options = form.data('jqv'); - // No option, take default one - if(!options) options = methods._saveOptions(this, options); - if(promptPosition) - options.promptPosition=promptPosition; - options.showArrow = showArrow==true; - - methods._showPrompt(this, promptText, type, false, options); - }, - /** - * Closes all error prompts on the page - */ - hidePrompt: function() { - var promptClass = "."+ methods._getClassName($(this).attr("id")) + "formError"; - $(promptClass).fadeTo("fast", 0.3, function() { - $(this).remove(); - }); - }, - /** - * Closes form error prompts, CAN be invidual - */ - hide: function() { - var closingtag; - if($(this).is("form")){ - closingtag = "parentForm"+$(this).attr('id'); - }else{ - closingtag = $(this).attr('id') +"formError"; - } - $('.'+closingtag).fadeTo("fast", 0.3, function() { - $(this).remove(); - }); - }, - /** - * Closes all error prompts on the page - */ - hideAll: function() { - $('.formError').fadeTo("fast", 0.3, function() { - $(this).remove(); - }); - }, - /** - * Typically called when user exists a field using tab or a mouse click, triggers a field - * validation - */ - _onFieldEvent: function(event) { - var field = $(this); - var form = field.closest('form'); - var options = form.data('jqv'); - // validate the current field - window.setTimeout(function() { - methods._validateField(field, options); - }, (event.data) ? event.data.delay : 0); - - }, - /** - * Called when the form is submited, shows prompts accordingly - * - * @param {jqObject} - * form - * @return false if form submission needs to be cancelled - */ - _onSubmitEvent: function() { - var form = $(this); - var options = form.data('jqv'); - - // validate each field (- skip field ajax validation, no necessary since we will perform an ajax form validation) - var r=methods._validateFields(form, true); - - if (r && options.ajaxFormValidation) { - methods._validateFormWithAjax(form, options); - return false; - } - - if(options.onValidationComplete) { - options.onValidationComplete(form, r); - return false; - } - return r; - }, - - /** - * Return true if the ajax field validations passed so far - * @param {Object} options - * @return true, is all ajax validation passed so far (remember ajax is async) - */ - _checkAjaxStatus: function(options) { - var status = true; - $.each(options.ajaxValidCache, function(key, value) { - if (!value) { - status = false; - // break the each - return false; - } - }); - return status; - }, - /** - * Validates form fields, shows prompts accordingly - * - * @param {jqObject} - * form - * @param {skipAjaxFieldValidation} - * boolean - when set to true, ajax field validation is skipped, typically used when the submit button is clicked - * - * @return true if form is valid, false if not, undefined if ajax form validation is done - */ - _validateFields: function(form, skipAjaxValidation) { - var options = form.data('jqv'); - - // this variable is set to true if an error is found - var errorFound = false; - - // Trigger hook, start validation - form.trigger("jqv.form.validating"); - // first, evaluate status of non ajax fields - form.find('[class*=validate]').not(':hidden').not(":disabled").each( function() { - var field = $(this); - errorFound |= methods._validateField(field, options, skipAjaxValidation); - }); - // second, check to see if all ajax calls completed ok - // errorFound |= !methods._checkAjaxStatus(options); - - // thrird, check status and scroll the container accordingly - form.trigger("jqv.form.result", [errorFound]); - - if (errorFound) { - - if (options.scroll) { - - // get the position of the first error, there should be at least one, no need to check this - //var destination = form.find(".formError:not('.greenPopup'):first").offset().top; - - // look for the visually top prompt - var destination = Number.MAX_VALUE; - var fixleft = 0; - var lst = $(".formError:not('.greenPopup')"); - - for (var i = 0; i < lst.length; i++) { - var d = $(lst[i]).offset().top; - if (d < destination){ - destination = d; - fixleft = $(lst[i]).offset().left; - } - } - - if (!options.isOverflown) - $("html:not(:animated),body:not(:animated)").animate({ - scrollTop: destination, - scrollLeft: fixleft - }, 1100); - else { - var overflowDIV = $(options.overflownDIV); - var scrollContainerScroll = overflowDIV.scrollTop(); - var scrollContainerPos = -parseInt(overflowDIV.offset().top); - - destination += scrollContainerScroll + scrollContainerPos - 5; - var scrollContainer = $(options.overflownDIV + ":not(:animated)"); - - scrollContainer.animate({ - scrollTop: destination - }, 1100); - - $("html:not(:animated),body:not(:animated)").animate({ - scrollTop: overflowDIV.offset().top, - scrollLeft: fixleft - }, 1100); - } - } - return false; - } - return true; - }, - /** - * This method is called to perform an ajax form validation. - * During this process all the (field, value) pairs are sent to the server which returns a list of invalid fields or true - * - * @param {jqObject} form - * @param {Map} options - */ - _validateFormWithAjax: function(form, options) { - - var data = form.serialize(); - var url = (options.ajaxFormValidationURL) ? options.ajaxFormValidationURL : form.attr("action"); - $.ajax({ - type: "GET", - url: url, - cache: false, - dataType: "json", - data: data, - form: form, - methods: methods, - options: options, - beforeSend: function() { - return options.onBeforeAjaxFormValidation(form, options); - }, - error: function(data, transport) { - methods._ajaxError(data, transport); - }, - success: function(json) { - - if (json !== true) { - - // getting to this case doesn't necessary means that the form is invalid - // the server may return green or closing prompt actions - // this flag helps figuring it out - var errorInForm=false; - for (var i = 0; i < json.length; i++) { - var value = json[i]; - - var errorFieldId = value[0]; - var errorField = $($("#" + errorFieldId)[0]); - - // make sure we found the element - if (errorField.length == 1) { - - // promptText or selector - var msg = value[2]; - // if the field is valid - if (value[1] == true) { - - if (msg == "" || !msg){ - // if for some reason, status==true and error="", just close the prompt - methods._closePrompt(errorField); - } else { - // the field is valid, but we are displaying a green prompt - if (options.allrules[msg]) { - var txt = options.allrules[msg].alertTextOk; - if (txt) - msg = txt; - } - methods._showPrompt(errorField, msg, "pass", false, options, true); - } - - } else { - // the field is invalid, show the red error prompt - errorInForm|=true; - if (options.allrules[msg]) { - var txt = options.allrules[msg].alertText; - if (txt) - msg = txt; - } - methods._showPrompt(errorField, msg, "", false, options, true); - } - } - } - options.onAjaxFormComplete(!errorInForm, form, json, options); - } else - options.onAjaxFormComplete(true, form, "", options); - } - }); - - }, - /** - * Validates field, shows prompts accordingly - * - * @param {jqObject} - * field - * @param {Array[String]} - * field's validation rules - * @param {Map} - * user options - * @return true if field is valid - */ - _validateField: function(field, options, skipAjaxValidation) { - if (!field.attr("id")) - $.error("jQueryValidate: an ID attribute is required for this field: " + field.attr("name") + " class:" + - field.attr("class")); - - var rulesParsing = field.attr('class'); - var getRules = /validate\[(.*)\]/.exec(rulesParsing); - if (!getRules) - return false; - var str = getRules[1]; - var rules = str.split(/\[|,|\]/); - - // true if we ran the ajax validation, tells the logic to stop messing with prompts - var isAjaxValidator = false; - var fieldName = field.attr("name"); - var promptText = ""; - var required = false; - options.isError = false; - options.showArrow = true; - - for (var i = 0; i < rules.length; i++) { - - var errorMsg = undefined; - switch (rules[i]) { - - case "required": - required = true; - errorMsg = methods._required(field, rules, i, options); - break; - case "custom": - errorMsg = methods._customRegex(field, rules, i, options); - break; - case "groupRequired": - // Check is its the first of group, if not, reload validation with first field - // AND continue normal validation on present field - var classGroup = "[class*=" +rules[i + 1] +"]"; - var firstOfGroup = field.closest("form").find(classGroup).eq(0); - if(firstOfGroup[0] != field[0]){ - methods._validateField(firstOfGroup, options, skipAjaxValidation) - options.showArrow = true; - continue; - }; - errorMsg = methods._groupRequired(field, rules, i, options); - if(errorMsg) required = true; - options.showArrow = false; - break; - case "ajax": - // ajax has its own prompts handling technique - if(!skipAjaxValidation){ - methods._ajax(field, rules, i, options); - isAjaxValidator = true; - } - break; - case "minSize": - errorMsg = methods._minSize(field, rules, i, options); - break; - case "maxSize": - errorMsg = methods._maxSize(field, rules, i, options); - break; - case "min": - errorMsg = methods._min(field, rules, i, options); - break; - case "max": - errorMsg = methods._max(field, rules, i, options); - break; - case "past": - errorMsg = methods._past(field, rules, i, options); - break; - case "future": - errorMsg = methods._future(field, rules, i, options); - break; - case "dateRange": - var classGroup = "[class*=" + rules[i + 1] + "]"; - var firstOfGroup = field.closest("form").find(classGroup).eq(0); - var secondOfGroup = field.closest("form").find(classGroup).eq(1); - /* - if (firstOfGroup[0] != field[0]) { - methods._validateField(firstOfGroup, options, skipAjaxValidation) - options.showArrow = true; - continue; - }; - */ - //if one entry out of the pair has value then proceed to run through validation - if (firstOfGroup[0].value || secondOfGroup[0].value) { - errorMsg = methods._dateRange(firstOfGroup, secondOfGroup, rules, i, options); - } - if (errorMsg) required = true; - options.showArrow = false; - break; - - case "dateTimeRange": - var classGroup = "[class*=" + rules[i + 1] + "]"; - var firstOfGroup = field.closest("form").find(classGroup).eq(0); - var secondOfGroup = field.closest("form").find(classGroup).eq(1); - /* - if (firstOfGroup[0] != field[0]) { - methods._validateField(firstOfGroup, options, skipAjaxValidation) - options.showArrow = true; - continue; - }; - */ - //if one entry out of the pair has value then proceed to run through validation - if (firstOfGroup[0].value || secondOfGroup[0].value) { - errorMsg = methods._dateTimeRange(firstOfGroup, secondOfGroup, rules, i, options); - } - if (errorMsg) required = true; - options.showArrow = false; - break; - case "maxCheckbox": - errorMsg = methods._maxCheckbox(field, rules, i, options); - field = $($("input[name='" + fieldName + "']")); - break; - case "minCheckbox": - errorMsg = methods._minCheckbox(field, rules, i, options); - field = $($("input[name='" + fieldName + "']")); - break; - case "equals": - errorMsg = methods._equals(field, rules, i, options); - break; - case "funcCall": - errorMsg = methods._funcCall(field, rules, i, options); - break; - - default: - //$.error("jQueryValidator rule not found"+rules[i]); - } - if (errorMsg !== undefined) { - promptText += errorMsg + "
"; - options.isError = true; - - } - - } - // If the rules required is not added, an empty field is not validated - if(!required){ - if(field.val() == "") options.isError = false; - } - - // Hack for radio/checkbox group button, the validation go into the - // first radio/checkbox of the group - var fieldType = field.attr("type"); - - if ((fieldType == "radio" || fieldType == "checkbox") && $("input[name='" + fieldName + "']").size() > 1) { - field = $($("input[name='" + fieldName + "'][type!=hidden]:first")); - options.showArrow = false; - } - if (fieldType == "text" && $("input[name='" + fieldName + "']").size() > 1) { - field = $($("input[name='" + fieldName + "'][type!=hidden]:first")); - options.showArrow = false; - } - - if (options.isError){ - - methods._showPrompt(field, promptText, "", false, options); - }else{ - if (!isAjaxValidator) methods._closePrompt(field); - } - field.trigger("jqv.field.result", [field, options.isError, promptText]); - return options.isError; - }, - /** - * Required validation - * - * @param {jqObject} field - * @param {Array[String]} rules - * @param {int} i rules index - * @param {Map} - * user options - * @return an error string if validation failed - */ - _required: function(field, rules, i, options) { - switch (field.attr("type")) { - case "text": - case "password": - case "textarea": - case "file": - default: - if (!field.val()) - return options.allrules[rules[i]].alertText; - break; - case "radio": - case "checkbox": - var name = field.attr("name"); - if ($("input[name='" + name + "']:checked").size() == 0) { - if ($("input[name='" + name + "']").size() == 1) - return options.allrules[rules[i]].alertTextCheckboxe; - else - return options.allrules[rules[i]].alertTextCheckboxMultiple; - } - break; - // required for + case "select-one": + // added by paul@kinetek.net for select boxes, Thank you + if (!field.val()) + return options.allrules[rules[i]].alertText; + break; + case "select-multiple": + // added by paul@kinetek.net for select boxes, Thank you + if (!field.find("option:selected").val()) + return options.allrules[rules[i]].alertText; + break; + } + }, + /** + * Validate that 1 from the group field is required + * + * @param {jqObject} field + * @param {Array[String]} rules + * @param {int} i rules index + * @param {Map} + * user options + * @return an error string if validation failed + */ + _groupRequired: function(field, rules, i, options) { + var classGroup = "[class*=" +rules[i + 1] +"]"; + var isValid = false; + // Check all fields from the group + field.closest("form").find(classGroup).each(function(){ + if(!methods._required($(this), rules, i, options)){ + isValid = true; + return false; + } + }) + + if(!isValid) return options.allrules[rules[i]].alertText; + }, + /** + * Validate Regex rules + * + * @param {jqObject} field + * @param {Array[String]} rules + * @param {int} i rules index + * @param {Map} + * user options + * @return an error string if validation failed + */ + _customRegex: function(field, rules, i, options) { + var customRule = rules[i + 1]; + var rule = options.allrules[customRule]; + if(!rule) { + alert("jqv:custom rule not found "+customRule); + return; + } + + var ex=rule.regex; + if(!ex) { + alert("jqv:custom regex not found "+customRule); + return; + } + var pattern = new RegExp(ex); + + if (!pattern.test(field.val())) + return options.allrules[customRule].alertText; + }, + /** + * Validate custom function outside of the engine scope + * + * @param {jqObject} field + * @param {Array[String]} rules + * @param {int} i rules index + * @param {Map} + * user options + * @return an error string if validation failed + */ + _funcCall: function(field, rules, i, options) { + var functionName = rules[i + 1]; + var fn = window[functionName]; + if (typeof(fn) == 'function') + return fn(field, rules, i, options); + + }, + /** + * Field match + * + * @param {jqObject} field + * @param {Array[String]} rules + * @param {int} i rules index + * @param {Map} + * user options + * @return an error string if validation failed + */ + _equals: function(field, rules, i, options) { + var equalsField = rules[i + 1]; + + if (field.val() != $("#" + equalsField).val()) + return options.allrules.equals.alertText; + }, + /** + * Check the maximum size (in characters) + * + * @param {jqObject} field + * @param {Array[String]} rules + * @param {int} i rules index + * @param {Map} + * user options + * @return an error string if validation failed + */ + _maxSize: function(field, rules, i, options) { + var max = rules[i + 1]; + var len = field.val().length; + + if (len > max) { + var rule = options.allrules.maxSize; + return rule.alertText + max + rule.alertText2; + } + }, + /** + * Check the minimum size (in characters) + * + * @param {jqObject} field + * @param {Array[String]} rules + * @param {int} i rules index + * @param {Map} + * user options + * @return an error string if validation failed + */ + _minSize: function(field, rules, i, options) { + var min = rules[i + 1]; + var len = field.val().length; + + if (len < min) { + var rule = options.allrules.minSize; + return rule.alertText + min + rule.alertText2; + } + }, + /** + * Check number minimum value + * + * @param {jqObject} field + * @param {Array[String]} rules + * @param {int} i rules index + * @param {Map} + * user options + * @return an error string if validation failed + */ + _min: function(field, rules, i, options) { + var min = parseFloat(rules[i + 1]); + var len = parseFloat(field.val()); + + if (len < min) { + var rule = options.allrules.min; + if (rule.alertText2) return rule.alertText + min + rule.alertText2; + return rule.alertText + min; + } + }, + /** + * Check number maximum value + * + * @param {jqObject} field + * @param {Array[String]} rules + * @param {int} i rules index + * @param {Map} + * user options + * @return an error string if validation failed + */ + _max: function(field, rules, i, options) { + var max = parseFloat(rules[i + 1]); + var len = parseFloat(field.val()); + + if (len >max ) { + var rule = options.allrules.max; + if (rule.alertText2) return rule.alertText + max + rule.alertText2; + //orefalo: to review, also do the translations + return rule.alertText + max; + } + }, + /** + * Checks date is in the past + * + * @param {jqObject} field + * @param {Array[String]} rules + * @param {int} i rules index + * @param {Map} + * user options + * @return an error string if validation failed + */ + _past: function(field, rules, i, options) { + + var p=rules[i + 1]; + var pdate = (p.toLowerCase() == "now")? new Date():methods._parseDate(p); + var vdate = methods._parseDate(field.val()); + + if (vdate < pdate ) { + var rule = options.allrules.past; + if (rule.alertText2) return rule.alertText + methods._dateToString(pdate) + rule.alertText2; + return rule.alertText + methods._dateToString(pdate); + } + }, + /** + * Checks date is in the future + * + * @param {jqObject} field + * @param {Array[String]} rules + * @param {int} i rules index + * @param {Map} + * user options + * @return an error string if validation failed + */ + _future: function(field, rules, i, options) { + + var p=rules[i + 1]; + var pdate = (p.toLowerCase() == "now")? new Date():methods._parseDate(p); + var vdate = methods._parseDate(field.val()); + + if (vdate > pdate ) { + var rule = options.allrules.future; + if (rule.alertText2) return rule.alertText + methods._dateToString(pdate) + rule.alertText2; + return rule.alertText + methods._dateToString(pdate); + } + }, + /** + * Checks if valid date + * + * @param {string} date string + * @return a bool based on determination of valid date + */ + _isDate: function (value) { + var dateRegEx = new RegExp(/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(?:(?:0?[1-9]|1[0-2])(\/|-)(?:0?[1-9]|1\d|2[0-8]))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(0?2(\/|-)29)(\/|-)(?:(?:0[48]00|[13579][26]00|[2468][048]00)|(?:\d\d)?(?:0[48]|[2468][048]|[13579][26]))$/); + if (dateRegEx.test(value)) { + return true; + } + return false; + }, + /** + * Checks if valid date time + * + * @param {string} date string + * @return a bool based on determination of valid date time + */ + _isDateTime: function (value){ + var dateTimeRegEx = new RegExp(/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1}$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^((1[012]|0?[1-9]){1}\/(0?[1-9]|[12][0-9]|3[01]){1}\/\d{2,4}\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1})$/); + if (dateTimeRegEx.test(value)) { + return true; + } + return false; + }, + //Checks if the start date is before the end date + //returns true if end is later than start + _dateCompare: function (start, end) { + return (new Date(start.toString()) < new Date(end.toString())); + }, + /** + * Checks date range + * + * @param {jqObject} first field name + * @param {jqObject} second field name + * @return an error string if validation failed + */ + _dateRange: function (first, second, rules, i, options) { + //are not both populated + if ((!first[0].value && second[0].value) || (first[0].value && !second[0].value)) { + return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2; + } + + //are not both dates + if (!methods._isDate(first[0].value) || !methods._isDate(second[0].value)) { + return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2; + } + + //are both dates but range is off + if (!methods._dateCompare(first[0].value, second[0].value)) { + return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2; + } + }, + + + /** + * Checks date time range + * + * @param {jqObject} first field name + * @param {jqObject} second field name + * @return an error string if validation failed + */ + _dateTimeRange: function (first, second, rules, i, options) { + //are not both populated + if ((!first[0].value && second[0].value) || (first[0].value && !second[0].value)) { + return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2; + } + //are not both dates + if (!methods._isDateTime(first[0].value) || !methods._isDateTime(second[0].value)) { + return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2; + } + //are both dates but range is off + if (!methods._dateCompare(first[0].value, second[0].value)) { + return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2; + } + }, + /** + * Max number of checkbox selected + * + * @param {jqObject} field + * @param {Array[String]} rules + * @param {int} i rules index + * @param {Map} + * user options + * @return an error string if validation failed + */ + _maxCheckbox: function(field, rules, i, options) { + + var nbCheck = rules[i + 1]; + var groupname = field.attr("name"); + var groupSize = $("input[name='" + groupname + "']:checked").size(); + if (groupSize > nbCheck) { + options.showArrow = false; + if (options.allrules.maxCheckbox.alertText2) return options.allrules.maxCheckbox.alertText + " " + nbCheck + " " + options.allrules.maxCheckbox.alertText2; + return options.allrules.maxCheckbox.alertText; + } + }, + /** + * Min number of checkbox selected + * + * @param {jqObject} field + * @param {Array[String]} rules + * @param {int} i rules index + * @param {Map} + * user options + * @return an error string if validation failed + */ + _minCheckbox: function(field, rules, i, options) { + + var nbCheck = rules[i + 1]; + var groupname = field.attr("name"); + var groupSize = $("input[name='" + groupname + "']:checked").size(); + if (groupSize < nbCheck) { + options.showArrow = false; + return options.allrules.minCheckbox.alertText + " " + nbCheck + " " + + options.allrules.minCheckbox.alertText2; + } + }, + /** + * Ajax field validation + * + * @param {jqObject} field + * @param {Array[String]} rules + * @param {int} i rules index + * @param {Map} + * user options + * @return nothing! the ajax validator handles the prompts itself + */ + _ajax: function(field, rules, i, options) { + + + var errorSelector = rules[i + 1]; + var rule = options.allrules[errorSelector]; + var extraData = rule.extraData; + var extraDataDynamic = rule.extraDataDynamic; + + if (!extraData) + extraData = ""; + + if (extraDataDynamic) { + var tmpData = []; + var domIds = String(extraDataDynamic).split(","); + for (var i = 0; i < domIds.length; i++) { + var id = domIds[i]; + if ($(id).length) { + var inputValue = field.closest("form").find(id).val(); + var keyValue = id.replace('#', '') + '=' + escape(inputValue); + tmpData.push(keyValue); + } + } + extraDataDynamic = tmpData.join("&"); + } else { + extraDataDynamic = ""; + } + + if (!options.isError) { + $.ajax({ + type: "GET", + url: rule.url, + cache: false, + dataType: "json", + data: "fieldId=" + field.attr("id") + "&fieldValue=" + field.val() + "&extraData=" + extraData + "&" + extraDataDynamic, + field: field, + rule: rule, + methods: methods, + options: options, + beforeSend: function() { + // build the loading prompt + var loadingText = rule.alertTextLoad; + if (loadingText) + methods._showPrompt(field, loadingText, "load", true, options); + }, + error: function(data, transport) { + methods._ajaxError(data, transport); + }, + success: function(json) { + + // asynchronously called on success, data is the json answer from the server + var errorFieldId = json[0]; + var errorField = $($("#" + errorFieldId)[0]); + // make sure we found the element + if (errorField.length == 1) { + var status = json[1]; + // read the optional msg from the server + var msg = json[2]; + if (!status) { + // Houston we got a problem - display an red prompt + options.ajaxValidCache[errorFieldId] = false; + options.isError = true; + + // resolve the msg prompt + if(msg) { + if (options.allrules[msg]) { + var txt = options.allrules[msg].alertText; + if (txt) + msg = txt; + } + } + else + msg = rule.alertText; + + methods._showPrompt(errorField, msg, "", true, options); + } else { + if (options.ajaxValidCache[errorFieldId] !== undefined) + options.ajaxValidCache[errorFieldId] = true; + + // resolves the msg prompt + if(msg) { + if (options.allrules[msg]) { + var txt = options.allrules[msg].alertTextOk; + if (txt) + msg = txt; + } + } + else + msg = rule.alertTextOk; + + // see if we should display a green prompt + if (msg) + methods._showPrompt(errorField, msg, "pass", true, options); + else + methods._closePrompt(errorField); + } + } + } + }); + } + }, + /** + * Common method to handle ajax errors + * + * @param {Object} data + * @param {Object} transport + */ + _ajaxError: function(data, transport) { + if(data.status == 0 && transport == null) + alert("The page is not served from a server! ajax call failed"); + else if(typeof console != "undefined") + console.log("Ajax error: " + data.status + " " + transport); + }, + /** + * date -> string + * + * @param {Object} date + */ + _dateToString: function(date) { + + return date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate(); + }, + /** + * Parses an ISO date + * @param {String} d + */ + _parseDate: function(d) { + + var dateParts = d.split("-"); + if(dateParts==d) + dateParts = d.split("/"); + return new Date(dateParts[0], (dateParts[1] - 1) ,dateParts[2]); + }, + /** + * Builds or updates a prompt with the given information + * + * @param {jqObject} field + * @param {String} promptText html text to display type + * @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red) + * @param {boolean} ajaxed - use to mark fields than being validated with ajax + * @param {Map} options user options + */ + _showPrompt: function(field, promptText, type, ajaxed, options, ajaxform) { + var prompt = methods._getPrompt(field); + // The ajax submit errors are not see has an error in the form, + // When the form errors are returned, the engine see 2 bubbles, but those are ebing closed by the engine at the same time + // Because no error was found befor submitting + if(ajaxform) prompt = false; + if (prompt) + methods._updatePrompt(field, prompt, promptText, type, ajaxed, options); + else + methods._buildPrompt(field, promptText, type, ajaxed, options); + }, + /** + * Builds and shades a prompt for the given field. + * + * @param {jqObject} field + * @param {String} promptText html text to display type + * @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red) + * @param {boolean} ajaxed - use to mark fields than being validated with ajax + * @param {Map} options user options + */ + _buildPrompt: function(field, promptText, type, ajaxed, options) { + + // create the prompt + var prompt = $('
'); + prompt.addClass(methods._getClassName(field.attr("id")) + "formError"); + // add a class name to identify the parent form of the prompt + if(field.is(":input")) prompt.addClass("parentForm"+methods._getClassName(field.parents('form').attr("id"))); + prompt.addClass("formError"); + + switch (type) { + case "pass": + prompt.addClass("greenPopup"); + break; + case "load": + prompt.addClass("blackPopup"); + } + if (ajaxed) + prompt.addClass("ajaxed"); + + // create the prompt content + var promptContent = $('
').addClass("formErrorContent").html(promptText).appendTo(prompt); + // create the css arrow pointing at the field + // note that there is no triangle on max-checkbox and radio + if (options.showArrow) { + var arrow = $('
').addClass("formErrorArrow"); + + switch (options.promptPosition) { + case "bottomLeft": + case "bottomRight": + prompt.find(".formErrorContent").before(arrow); + arrow.addClass("formErrorArrowBottom").html('
'); + break; + case "topLeft": + case "topRight": + arrow.html('
'); + prompt.append(arrow); + break; + } + } + + //Cedric: Needed if a container is in position:relative + // insert prompt in the form or in the overflown container? + if (options.isOverflown) + field.before(prompt); + else + $("body").append(prompt); + + var pos = methods._calculatePosition(field, prompt, options); + prompt.css({ + "top": pos.callerTopPosition, + "left": pos.callerleftPosition, + "marginTop": pos.marginTopSize, + "opacity": 0 + }); + + return prompt.animate({ + "opacity": 0.87 + }); + + }, + /** + * Updates the prompt text field - the field for which the prompt + * @param {jqObject} field + * @param {String} promptText html text to display type + * @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red) + * @param {boolean} ajaxed - use to mark fields than being validated with ajax + * @param {Map} options user options + */ + _updatePrompt: function(field, prompt, promptText, type, ajaxed, options) { + + if (prompt) { + if (type == "pass") + prompt.addClass("greenPopup"); + else + prompt.removeClass("greenPopup"); + + if (type == "load") + prompt.addClass("blackPopup"); + else + prompt.removeClass("blackPopup"); + + if (ajaxed) + prompt.addClass("ajaxed"); + else + prompt.removeClass("ajaxed"); + + prompt.find(".formErrorContent").html(promptText); + + var pos = methods._calculatePosition(field, prompt, options); + prompt.animate({ + "top": pos.callerTopPosition, + "left": pos.callerleftPosition, + "marginTop": pos.marginTopSize + }); + } + }, + /** + * Closes the prompt associated with the given field + * + * @param {jqObject} + * field + */ + _closePrompt: function(field) { + + var prompt = methods._getPrompt(field); + if (prompt) + prompt.fadeTo("fast", 0, function() { + prompt.remove(); + }); + }, + closePrompt: function(field) { + return methods._closePrompt(field); + }, + /** + * Returns the error prompt matching the field if any + * + * @param {jqObject} + * field + * @return undefined or the error prompt (jqObject) + */ + _getPrompt: function(field) { + var className = field.attr("id").replace(":","_") + "formError"; + var match = $("." + methods._escapeExpression(className))[0]; + if (match) + return $(match); + }, + /** + * Returns the escapade classname + * + * @param {selector} + * className + */ + _escapeExpression: function (selector) { + return selector.replace(/([#;&,\.\+\*\~':"\!\^$\[\]\(\)=>\|])/g, "\\$1"); + }, + /** + * Calculates prompt position + * + * @param {jqObject} + * field + * @param {jqObject} + * the prompt + * @param {Map} + * options + * @return positions + */ + _calculatePosition: function (field, promptElmt, options) { + + var promptTopPosition, promptleftPosition, marginTopSize; + var fieldWidth = field.width(); + var promptHeight = promptElmt.height(); + + var overflow = options.isOverflown; + if (overflow) { + // is the form contained in an overflown container? + promptTopPosition = promptleftPosition = 0; + // compensation for the arrow + marginTopSize = -promptHeight; + } else { + var offset = field.offset(); + promptTopPosition = offset.top; + promptleftPosition = offset.left; + marginTopSize = 0; + } + + switch (options.promptPosition) { + + default: + case "topRight": + if (overflow) + // Is the form contained in an overflown container? + promptleftPosition += fieldWidth - 30; + else { + promptleftPosition += fieldWidth - 30; + promptTopPosition += -promptHeight -2; + } + break; + case "topLeft": + promptTopPosition += -promptHeight - 10; + break; + case "centerRight": + promptleftPosition += fieldWidth + 13; + break; + case "bottomLeft": + promptTopPosition = promptTopPosition + field.height() + 15; + break; + case "bottomRight": + promptleftPosition += fieldWidth - 30; + promptTopPosition += field.height() + 5; + } + + return { + "callerTopPosition": promptTopPosition + 23 + "px", + "callerleftPosition": promptleftPosition + 50 + "px", + "marginTopSize": marginTopSize + "px" + }; + }, + /** + * Saves the user options and variables in the form.data + * + * @param {jqObject} + * form - the form where the user option should be saved + * @param {Map} + * options - the user options + * @return the user options (extended from the defaults) + */ + _saveOptions: function(form, options) { + + // is there a language localisation ? + if ($.validationEngineLanguage) + var allRules = $.validationEngineLanguage.allRules; + else + $.error("jQuery.validationEngine rules are not loaded, plz add localization files to the page"); + // --- Internals DO NOT TOUCH or OVERLOAD --- + // validation rules and i18 + $.validationEngine.defaults.allrules = allRules; + + var userOptions = $.extend({},$.validationEngine.defaults, options); + + form.data('jqv', userOptions); + return userOptions; + }, + + /** + * Removes forbidden characters from class name + * @param {String} className + */ + _getClassName: function(className) { + return className.replace(":","_").replace(".","_"); + } + }; + + /** + * Plugin entry point. + * You may pass an action as a parameter or a list of options. + * if none, the init and attach methods are being called. + * Remember: if you pass options, the attached method is NOT called automatically + * + * @param {String} + * method (optional) action + */ + $.fn.validationEngine = function(method) { + + var form = $(this); + if(!form[0]) return false; // stop here if the form does not exist + + if (typeof(method) == 'string' && method.charAt(0) != '_' && methods[method]) { + + // make sure init is called once + if(method != "showPrompt" && method != "hidePrompt" && method != "hide" && method != "hideAll") + methods.init.apply(form); + + return methods[method].apply(form, Array.prototype.slice.call(arguments, 1)); + } else if (typeof method == 'object' || !method) { + // default constructor with or without arguments + + methods.init.apply(form, arguments); + return methods.attach.apply(form); + } else { + $.error('Method ' + method + ' does not exist in jQuery.validationEngine'); + } + }; + // LEAK GLOBAL OPTIONS + $.validationEngine= {defaults:{ + + // Name of the event triggering field validation + validationEventTrigger: "blur", + // Automatically scroll viewport to the first error + scroll: true, + // Opening box position, possible locations are: topLeft, + // topRight, bottomLeft, centerRight, bottomRight + promptPosition: "topRight", + bindMethod:"bind", + // internal, automatically set to true when it parse a _ajax rule + inlineAjax: false, + // if set to true, the form data is sent asynchronously via ajax to the form.action url (get) + ajaxFormValidation: false, + // Ajax form validation callback method: boolean onComplete(form, status, errors, options) + // retuns false if the form.submit event needs to be canceled. + ajaxFormValidationURL: false, + // The url to send the submit ajax validation (default to action) + onAjaxFormComplete: $.noop, + // called right before the ajax call, may return false to cancel + onBeforeAjaxFormValidation: $.noop, + // Stops form from submitting and execute function assiciated with it + onValidationComplete: false, + + // Used when the form is displayed within a scrolling DIV + isOverflown: false, + overflownDIV: "", + + // true when form and fields are binded + binded: false, + // set to true, when the prompt arrow needs to be displayed + showArrow: true, + // did one of the validation fail ? kept global to stop further ajax validations + isError: false, + // Caches field validation status, typically only bad status are created. + // the array is used during ajax form validation to detect issues early and prevent an expensive submit + ajaxValidCache: {} + + }} + +})(jQuery); Index: branches/1.0.x/inc/compare.css =================================================================== diff -u -N -r14708 -r15169 --- branches/1.0.x/inc/compare.css (.../compare.css) (revision 14708) +++ branches/1.0.x/inc/compare.css (.../compare.css) (revision 15169) @@ -1,77 +1,77 @@ -@charset "UTF-8"; - -/* Compare Page -*******************************************************************************/ -#content .compare { padding: 20px; } -.good-item { - border-right: 1px dotted #333; - float: left; - min-height: 450px; - padding: 0 0 15px; - width: 225px; -} -.good-item.last-child { - border-right: none; -} -.good-item .button-delete { - padding: 0 0 10px 0; - text-align: center; -} -.good-item .rating { padding: 10px 0 0; text-align: center; } -.good-item .rating p { padding: 5px 0 0; } -.good-item .har { text-align: left; } -.good-item .har dt { float: left; font-weight: bold; padding: 0 10px 3px 0; width: 100px; } -.good-item .har dd { float: left; width: 80px; } - -.buttons-block { padding-top: 120px; text-align: center; } -.compare-button { - background: url(@templates_base@/img/bg-button-compare-left.jpg) no-repeat 0 0; - color: #323232; - display: inline-block; - font-size: 1.385em; - font-weight: bold; - text-decoration: none; -} -.compare-button span { - background: url(@templates_base@/img/bg-button-compare-right.jpg) no-repeat 100% 0; - display: inline-block; - height: 60px; - padding: 10px 20px; - text-align: center; -} - -/*** Compare accordion ***/ -#compare-menu h3 { - background: #fff url(@templates_base@/img/bg-form-fieldset.jpg) repeat-x 0 0; - color: #5b5b5b; - cursor: pointer; - font-weight: bold; - height: 26px; - line-height: 26px; - padding: 0 16px; - position: relative; -} -#compare-menu a { color: #5b5b5b; padding-left: 20px; text-decoration: none; } -#compare-menu h3.active a { color: #fff; } -#compare-menu .ui-icon-circle-arrow-e { - background: url(@templates_base@/img/bullet-menu.png) no-repeat 0 -22px; - height: 6px; - width: 10px; -} -#compare-menu .ui-icon-circle-arrow-s { - background: url(@templates_base@/img/bullet-menu.png) no-repeat 0 -6px; - height: 6px; - width: 10px; -} -#compare-menu .good-item-cell { - border-right: 1px dotted #333; - float: left; - max-height: 450px; - padding-bottom: 25px; - width: 225px; -} -#compare-menu .good-item-cell .description { - max-height: 450px; - overflow-x: hidden; - padding: 5px 16px; -} +@charset "UTF-8"; + +/* Compare Page +*******************************************************************************/ +#content .compare { padding: 20px; } +.good-item { + border-right: 1px dotted #333; + float: left; + min-height: 450px; + padding: 0 0 15px; + width: 225px; +} +.good-item.last-child { + border-right: none; +} +.good-item .button-delete { + padding: 0 0 10px 0; + text-align: center; +} +.good-item .rating { padding: 10px 0 0; text-align: center; } +.good-item .rating p { padding: 5px 0 0; } +.good-item .har { text-align: left; } +.good-item .har dt { float: left; font-weight: bold; padding: 0 10px 3px 0; width: 100px; } +.good-item .har dd { float: left; width: 80px; } + +.buttons-block { padding-top: 120px; text-align: center; } +.compare-button { + background: url(@templates_base@/img/bg-button-compare-left.jpg) no-repeat 0 0; + color: #323232; + display: inline-block; + font-size: 1.385em; + font-weight: bold; + text-decoration: none; +} +.compare-button span { + background: url(@templates_base@/img/bg-button-compare-right.jpg) no-repeat 100% 0; + display: inline-block; + height: 60px; + padding: 10px 20px; + text-align: center; +} + +/*** Compare accordion ***/ +#compare-menu h3 { + background: #fff url(@templates_base@/img/bg-form-fieldset.jpg) repeat-x 0 0; + color: #5b5b5b; + cursor: pointer; + font-weight: bold; + height: 26px; + line-height: 26px; + padding: 0 16px; + position: relative; +} +#compare-menu a { color: #5b5b5b; padding-left: 20px; text-decoration: none; } +#compare-menu h3.active a { color: #fff; } +#compare-menu .ui-icon-circle-arrow-e { + background: url(@templates_base@/img/bullet-menu.png) no-repeat 0 -22px; + height: 6px; + width: 10px; +} +#compare-menu .ui-icon-circle-arrow-s { + background: url(@templates_base@/img/bullet-menu.png) no-repeat 0 -6px; + height: 6px; + width: 10px; +} +#compare-menu .good-item-cell { + border-right: 1px dotted #333; + float: left; + max-height: 450px; + padding-bottom: 25px; + width: 225px; +} +#compare-menu .good-item-cell .description { + max-height: 450px; + overflow-x: hidden; + padding: 5px 16px; +} Index: branches/1.0.x/elements/ajax/payment_form.tpl =================================================================== diff -u -N -r14822 -r15169 --- branches/1.0.x/elements/ajax/payment_form.tpl (.../payment_form.tpl) (revision 14822) +++ branches/1.0.x/elements/ajax/payment_form.tpl (.../payment_form.tpl) (revision 15169) @@ -1,7 +1,7 @@ -
- - - + + + + \ No newline at end of file Index: branches/1.0.x/no_permission.tpl =================================================================== diff -u -N -r14935 -r15169 --- branches/1.0.x/no_permission.tpl (.../no_permission.tpl) (revision 14935) +++ branches/1.0.x/no_permission.tpl (.../no_permission.tpl) (revision 15169) @@ -1,23 +1,23 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + \ No newline at end of file Index: branches/1.0.x/inc/js/jquery.contentcarousel.js =================================================================== diff -u -N -r14600 -r15169 --- branches/1.0.x/inc/js/jquery.contentcarousel.js (.../jquery.contentcarousel.js) (revision 14600) +++ branches/1.0.x/inc/js/jquery.contentcarousel.js (.../jquery.contentcarousel.js) (revision 15169) @@ -1,155 +1,155 @@ -(function($) { - var cache = {}, - aux = { - // navigates left / right - navigate : function( dir, $el, $wrapper, opts ) { - var scroll = opts.scroll, - factor = 1, - idxClicked = 0; - - if( cache.expanded ) { - scroll = 1; // scroll is always 1 in full mode - factor = 3; // the width of the expanded item will be 3 times bigger than 1 collapsed item - idxClicked = cache.idxClicked; // the index of the clicked item - } - - // clone the elements on the right / left and append / prepend them according to dir and scroll - if( dir === 1 ) { - $wrapper.find('div.good-item:lt(' + scroll + ')').each(function(i) { - $(this).clone(true).css( 'left', ( cache.totalItems - idxClicked + i ) * cache.itemW * factor + 'px' ).appendTo( $wrapper ); - }); - } - else { - var $first = $wrapper.children().eq(0); - - $wrapper.find('div.good-item:gt(' + ( cache.totalItems - 1 - scroll ) + ')').each(function(i) { - // insert before $first so they stay in the right order - $(this).clone(true).css( 'left', - ( scroll - i + idxClicked ) * cache.itemW * factor + 'px' ).insertBefore( $first ); - }); - } - - // animate the left of each item - // the calculations are dependent on dir and on the cache.expanded value - $wrapper.find('div.good-item').each(function(i) { - var $item = $(this); - $item.stop().animate({ - left : ( dir === 1 ) ? '-=' + ( cache.itemW * factor * scroll ) + 'px' : '+=' + ( cache.itemW * factor * scroll ) + 'px' - }, opts.sliderSpeed, opts.sliderEasing, function() { - if( ( dir === 1 && $item.position().left < - idxClicked * cache.itemW * factor ) || ( dir === -1 && $item.position().left > ( ( cache.totalItems - 1 - idxClicked ) * cache.itemW * factor ) ) ) { - // remove the item that was cloned - $item.remove(); - } - cache.isAnimating = false; - }); - }); - - }, - // gets the item's position (1, 2, or 3) on the viewport (the visible items) - // val is the left of the item - getWinPos : function( val ) { - switch( val ) { - case 0 : return 1; break; - case cache.itemW : return 2; break; - case cache.itemW * 2 : return 3; break; - } - } - }, - methods = { - init : function( options ) { - - if( this.length ) { - - var settings = { - sliderSpeed : 500, // speed for the sliding animation - sliderEasing : 'easeOutExpo',// easing for the sliding animation - itemSpeed : 500, // speed for the item animation (open / close) - itemEasing : 'easeOutExpo',// easing for the item animation (open / close) - scroll : 1 // number of items to scroll at a time - }; - - return this.each(function() { - - // if options exist, lets merge them with our default settings - if ( options ) { - $.extend( settings, options ); - } - - var $el = $(this), - $wrapper = $el.find('div.items'), - $items = $wrapper.children('div.good-item'); - - // save the with of one item - cache.itemW = $items.width(); - // save the number of total items - cache.totalItems = $items.length; - - // add navigation buttons - if( cache.totalItems > 3 ) - $el.prepend('
ПредыдущийСледующий
') - - // control the scroll value - if( settings.scroll < 1 ) - settings.scroll = 1; - else if( settings.scroll > 3 ) - settings.scroll = 3; - - var $navPrev = $el.find('span.ca-nav-prev'), - $navNext = $el.find('span.ca-nav-next'); - - // hide the items except the first 3 - $wrapper.css( 'overflow', 'hidden' ); - - // the items will have position absolute - // calculate the left of each item - $items.each(function(i) { - $(this).css({ - position : 'absolute', - left : i * cache.itemW + 'px' - }); - }); - - // navigate left - $navPrev.bind('click.contentcarousel', function( event ) { - if( cache.isAnimating ) return false; - cache.isAnimating = true; - aux.navigate( -1, $el, $wrapper, settings ); - }); - - // navigate right - $navNext.bind('click.contentcarousel', function( event ) { - if( cache.isAnimating ) return false; - cache.isAnimating = true; - aux.navigate( 1, $el, $wrapper, settings ); - }); - - // adds events to the mouse - $el.bind('mousewheel.contentcarousel', function(e, delta) { - if(delta > 0) { - if( cache.isAnimating ) return false; - cache.isAnimating = true; - aux.navigate( -1, $el, $wrapper, settings ); - } - else { - if( cache.isAnimating ) return false; - cache.isAnimating = true; - aux.navigate( 1, $el, $wrapper, settings ); - } - return false; - }); - - }); - } - } - }; - - $.fn.contentcarousel = function(method) { - if ( methods[method] ) { - return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 )); - } else if ( typeof method === 'object' || ! method ) { - return methods.init.apply( this, arguments ); - } else { - $.error( 'Method ' + method + ' does not exist on jQuery.contentcarousel' ); - } - }; - +(function($) { + var cache = {}, + aux = { + // navigates left / right + navigate : function( dir, $el, $wrapper, opts ) { + var scroll = opts.scroll, + factor = 1, + idxClicked = 0; + + if( cache.expanded ) { + scroll = 1; // scroll is always 1 in full mode + factor = 3; // the width of the expanded item will be 3 times bigger than 1 collapsed item + idxClicked = cache.idxClicked; // the index of the clicked item + } + + // clone the elements on the right / left and append / prepend them according to dir and scroll + if( dir === 1 ) { + $wrapper.find('div.good-item:lt(' + scroll + ')').each(function(i) { + $(this).clone(true).css( 'left', ( cache.totalItems - idxClicked + i ) * cache.itemW * factor + 'px' ).appendTo( $wrapper ); + }); + } + else { + var $first = $wrapper.children().eq(0); + + $wrapper.find('div.good-item:gt(' + ( cache.totalItems - 1 - scroll ) + ')').each(function(i) { + // insert before $first so they stay in the right order + $(this).clone(true).css( 'left', - ( scroll - i + idxClicked ) * cache.itemW * factor + 'px' ).insertBefore( $first ); + }); + } + + // animate the left of each item + // the calculations are dependent on dir and on the cache.expanded value + $wrapper.find('div.good-item').each(function(i) { + var $item = $(this); + $item.stop().animate({ + left : ( dir === 1 ) ? '-=' + ( cache.itemW * factor * scroll ) + 'px' : '+=' + ( cache.itemW * factor * scroll ) + 'px' + }, opts.sliderSpeed, opts.sliderEasing, function() { + if( ( dir === 1 && $item.position().left < - idxClicked * cache.itemW * factor ) || ( dir === -1 && $item.position().left > ( ( cache.totalItems - 1 - idxClicked ) * cache.itemW * factor ) ) ) { + // remove the item that was cloned + $item.remove(); + } + cache.isAnimating = false; + }); + }); + + }, + // gets the item's position (1, 2, or 3) on the viewport (the visible items) + // val is the left of the item + getWinPos : function( val ) { + switch( val ) { + case 0 : return 1; break; + case cache.itemW : return 2; break; + case cache.itemW * 2 : return 3; break; + } + } + }, + methods = { + init : function( options ) { + + if( this.length ) { + + var settings = { + sliderSpeed : 500, // speed for the sliding animation + sliderEasing : 'easeOutExpo',// easing for the sliding animation + itemSpeed : 500, // speed for the item animation (open / close) + itemEasing : 'easeOutExpo',// easing for the item animation (open / close) + scroll : 1 // number of items to scroll at a time + }; + + return this.each(function() { + + // if options exist, lets merge them with our default settings + if ( options ) { + $.extend( settings, options ); + } + + var $el = $(this), + $wrapper = $el.find('div.items'), + $items = $wrapper.children('div.good-item'); + + // save the with of one item + cache.itemW = $items.width(); + // save the number of total items + cache.totalItems = $items.length; + + // add navigation buttons + if( cache.totalItems > 3 ) + $el.prepend('
ПредыдущийСледующий
') + + // control the scroll value + if( settings.scroll < 1 ) + settings.scroll = 1; + else if( settings.scroll > 3 ) + settings.scroll = 3; + + var $navPrev = $el.find('span.ca-nav-prev'), + $navNext = $el.find('span.ca-nav-next'); + + // hide the items except the first 3 + $wrapper.css( 'overflow', 'hidden' ); + + // the items will have position absolute + // calculate the left of each item + $items.each(function(i) { + $(this).css({ + position : 'absolute', + left : i * cache.itemW + 'px' + }); + }); + + // navigate left + $navPrev.bind('click.contentcarousel', function( event ) { + if( cache.isAnimating ) return false; + cache.isAnimating = true; + aux.navigate( -1, $el, $wrapper, settings ); + }); + + // navigate right + $navNext.bind('click.contentcarousel', function( event ) { + if( cache.isAnimating ) return false; + cache.isAnimating = true; + aux.navigate( 1, $el, $wrapper, settings ); + }); + + // adds events to the mouse + $el.bind('mousewheel.contentcarousel', function(e, delta) { + if(delta > 0) { + if( cache.isAnimating ) return false; + cache.isAnimating = true; + aux.navigate( -1, $el, $wrapper, settings ); + } + else { + if( cache.isAnimating ) return false; + cache.isAnimating = true; + aux.navigate( 1, $el, $wrapper, settings ); + } + return false; + }); + + }); + } + } + }; + + $.fn.contentcarousel = function(method) { + if ( methods[method] ) { + return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 )); + } else if ( typeof method === 'object' || ! method ) { + return methods.init.apply( this, arguments ); + } else { + $.error( 'Method ' + method + ' does not exist on jQuery.contentcarousel' ); + } + }; + })(jQuery); \ No newline at end of file Index: branches/1.0.x/elements/filters.elm.tpl =================================================================== diff -u -N -r15094 -r15169 --- branches/1.0.x/elements/filters.elm.tpl (.../filters.elm.tpl) (revision 15094) +++ branches/1.0.x/elements/filters.elm.tpl (.../filters.elm.tpl) (revision 15169) @@ -1,209 +1,209 @@ - - - - - - - - - - - - class="active"> - checked name="" id="_" value=""/>  - - class="active">() - - - -
- -
-
-
- - - - class="active"> - checked id="_" value=""/>  - - class="active">() - - - -
- -
-
- - -
- - -
  • - -
  • -
    - - -
  • ()
  • -
    - - -
    - - - - - Apply - - -
    - -
    -
      - -
    -
    px;">
    -
      - -
    -
    -
    - - - - -
    - - - - - - - - -
    - - -
    -

    - - Filter by - - - -

    -
    - -
    -
    - - -
    -
    -
    - - - '': , - - - - ListManager.replaceCounters('', {}); - - - - ListManager.replaceFilter('filter-form-', ''); + + + + + + + + + + + + class="active"> + checked name="" id="_" value=""/>  + + class="active">() + + + +
    + +
    +
    +
    + + + + class="active"> + checked id="_" value=""/>  + + class="active">() + + + +
    + +
    +
    + + +
    + + +
  • + +
  • +
    + + +
  • ()
  • +
    + + +
    + - + + + Apply + + +
    + +
    +
      + +
    +
    px;">
    +
      + +
    +
    +
    + + + + +
    + + + + + + + + +
    + + +
    +

    + + Filter by + + + +

    +
    + +
    +
    + + +
    +
    +
    + + + '': , + + + + ListManager.replaceCounters('', {}); + + + + ListManager.replaceFilter('filter-form-', ''); \ No newline at end of file Index: branches/1.0.x/cart.tpl =================================================================== diff -u -N -r15036 -r15169 --- branches/1.0.x/cart.tpl (.../cart.tpl) (revision 15036) +++ branches/1.0.x/cart.tpl (.../cart.tpl) (revision 15169) @@ -1,306 +1,306 @@ - - -Shopping Cart - - - - - - - - - - - -
    - -
    -
    - - - -

    Shopping Cart

    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Items in your order ()Qty.PriceTotal
    rowspan="2"> - - -
    - [ProductId: ; OptionsSalt: ; BackOrderFlag: ] -
    - - - - -   - - - - - - - - - - -
    - -
    - -
    style="display: none;"> - :
    - : -
    -
    -
    - - - - - -
    -
    - - - - - Delete -
    - - - - - - - - Edit Options - - - -
    - -
    -

    Discounts & Promotional Offers

    - -
    -
    style="display: none;"> - :  - -
    -    - <inp2:m_Phrase label='lu_comm_RemoveCoupon' no_editing='1'/> -
    -
    - -
    style="display: none;"> -

    If you have a discount or promotional offer code please enter it and click Apply button.

    -
    - - -
    -
    -
    - - - -
    - -
    -
    -
    style="display: none;"> -
    Discount:
    -
    -
    -
    - -
    -
    Total
    -
    -
    -
    -

    (before shipping & taxes)

    - Checkout -
    -
    - - -
    - - -

    Shopping Cart

    -
    - - -
    - - -
    -
    - - -
    - - - - + + +Shopping Cart + + + + + + + + + + + +
    + +
    +
    + + + +

    Shopping Cart

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Items in your order ()Qty.PriceTotal
    rowspan="2"> + + +
    + [ProductId: ; OptionsSalt: ; BackOrderFlag: ] +
    + + + + +   + + + + + + + + + + +
    + +
    + +
    style="display: none;"> + :
    + : +
    +
    +
    + + + + + +
    +
    + + + + + Delete +
    + + + + + + + + Edit Options + + + +
    + +
    +

    Discounts & Promotional Offers

    + +
    +
    style="display: none;"> + :  + +
    +    + <inp2:m_Phrase label='lu_comm_RemoveCoupon' no_editing='1'/> +
    +
    + +
    style="display: none;"> +

    If you have a discount or promotional offer code please enter it and click Apply button.

    +
    + + +
    +
    +
    + + + +
    + +
    +
    +
    style="display: none;"> +
    Discount:
    +
    -
    +
    + +
    +
    Total
    +
    +
    +
    +

    (before shipping & taxes)

    + Checkout +
    +
    + + +
    + + +

    Shopping Cart

    +
    + + +
    + + +
    +
    + + +
    + + + + \ No newline at end of file Index: branches/1.0.x/inc/category.css =================================================================== diff -u -N -r14747 -r15169 --- branches/1.0.x/inc/category.css (.../category.css) (revision 14747) +++ branches/1.0.x/inc/category.css (.../category.css) (revision 15169) @@ -1,220 +1,220 @@ -@charset "UTF-8"; - -/* Category Page -*******************************************************************************/ -.goods { - margin: 5px 0; - padding: 20px 20px 10px 20px; -} -.goods .good-item { - float: left; - height: 200px; - margin-bottom: 10px; - width: 165px; -} -.goods .good-item.borbottom { - border-bottom: 1px dotted #d0d0d0; - padding-bottom: 10px; -} -.goods .good-item dl { - border-right: 1px dotted #d0d0d0; - padding: 5px; -} -.goods .good-item dl.no-border-right { border-right: none; } - -/*** Filter block ***/ -.filter-block { float: left; padding: 10px 0; width: 100%; } -.filter-block div { float: left; } -.filter-block .paginate { - font-weight: bold; - padding: 0 40px 0 0; -} -.filter-block .sortby { font-weight: bold; } -.filter-block .sortby a { font-weight: normal; } -.filter-block .display_switch { float: right; text-align: right; } -.filter-block .display_switch a.switch_thumb { - width: 48px; - height: 21px; - display: block; - background: url(@templates_base@/img/display-view.png) no-repeat 0 0; - outline: none; - text-indent: -9999px; -} -.filter-block .display_switch a.swap { background-position: 0 100%; } -.filter-block .sortby form { display: inline; } - -.items { padding: 20px; } -.items.items-alt { padding: 0; } -.items .item { - border-top: 1px solid #d0d0d0; - float: left; - padding: 15px 10px; - position: relative; - width: auto; -} -.items .ribbon { - background: url(@templates_base@/img/ribbon.png) no-repeat 0 0; - height: 40px; - position: absolute; - top: -3px; right: -26px; - width: 102px; - z-index: 100; -} -.items .ribbon.sale { background-position: 0 0; } -.items .ribbon.top { background-position: 0 -40px; } -.items .ribbon.new { background-position: 0 -80px; } -.items .item .img { - float: left; - padding-right: 15px; - width: 70px; -} -.items .item .descr { - float: left; - padding-right: 15px; - width: 360px; -} -.items .item .descr h3 { - font-size: 1.077em; - font-weight: bold; - padding-bottom: 5px; -} -.items .item .descr .optional { padding: 5px 0; } -.items .item .descr .optional .stars { padding: 0 20px 0 0; } -.items .item .descr .optional .comp label em { - font-style: normal; - text-decoration: underline; -} -.items .item .descr .optional .comp label input { - bottom: -2px; - margin: 0 5px 0 0; - position: relative; -} -.items .item .price-block { - float: left; - width: 185px; -} -.items .item .price-block s.under { - display: block; - font-size: 1.308em; - font-weight: bold; - padding-right: 10px; -} -.items .item .price-block s.under span { font-size: 0.706em; } -.items .item .price-block .redprice { padding: 10px 0; } -.items .item .price-block em.price { - color: #C2120A; - font-size: 1.846em; - font-weight: bold; - font-style: normal; -} -.items .item .price-block em.price span { font-size: 0.708em; } -.items .item .price-block .addtocart { - background: url(@templates_base@/img/addtocart-left.jpg) no-repeat 0 0; - color: #faffed; - display: inline-block; - font-size: 1.077em; - font-weight: bold; - text-shadow: #000 0px 1px 1px; - text-decoration: none; -} -.items .item .price-block .addtocart span { - background: url(@templates_base@/img/addtocart-right.jpg) no-repeat 100% 0; - display: inline-block; - height: 33px; - line-height: 33px; - padding: 0 20px; -} - -ul.display { border-bottom: 1px solid #d0d0d0; float: left; width: 100%; } -ul.display li { float: left; width: 100%; } - -ul.thumb_view { border-bottom: none; } -ul.thumb_view li { - background-color: #fff; - border: 1px solid #d0d0d0; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - float: left; - height: 180px; - margin: 0 5px 5px 0; - width: 348px; -} -ul.thumb_view li .item { - border-top: none; - padding: 15px; - width: 319px; -} -ul.thumb_view li .item .img { - position: absolute; - top: 38px; - width: 133px; -} -ul.thumb_view li .item .img img { height: 133px; width: 133px; } -ul.thumb_view li .item .ribbon { right: -4px; } -ul.thumb_view li .item .descr { - position: absolute; - width: auto; -} -ul.thumb_view li .item .descr .optional { - left: 158px; - position: absolute; - top: 132px; - width: 165px; -} -ul.thumb_view li .item .descr .optional .stars { padding: 0 10px 0 0; } -ul.thumb_view li .item .descr p, -ul.thumb_view li .item .descr .optional .reviews { display: none; } -ul.thumb_view li .item .price-block { - float: none; - left: 170px; - position: absolute; - top: 50px; -} - -/*** Pagination ***/ -.pagination { padding-top: 20px; text-align: center; } -.pagination span, -.pagination a { - background: url(@templates_base@/img/paginate.png) no-repeat -28px 0; - color: #fff; - display: inline-block; - font-size: 1.308em; - font-weight: bold; - height: 28px; - line-height: 28px; - text-align: center; - text-decoration: none; - width: 28px; -} -.pagination span.prev { - background-position: 0 100%; - margin-right: 20px; -} -.pagination a.prev { - background-position: 0 0; - margin-right: 20px; -} -.pagination span.next { - background-position: -56px 100%; - margin-left: 20px; -} -.pagination a.next { - background-position: -56px 0; - margin-left: 20px; -} -.pagination a.active { - background-position: -28px 100%; -} - -/*** Searchbox ***/ -/* -.form { padding: 10px 0; } -.form input[type="text"] { - border: none; - background: #fff url(@templates_base@/img/bg-searchfield.jpg) no-repeat 0 0; - height: 23px; - padding: 2px 5px 2px 35px; - width: 162px; -} -*/ +@charset "UTF-8"; + +/* Category Page +*******************************************************************************/ +.goods { + margin: 5px 0; + padding: 20px 20px 10px 20px; +} +.goods .good-item { + float: left; + height: 200px; + margin-bottom: 10px; + width: 165px; +} +.goods .good-item.borbottom { + border-bottom: 1px dotted #d0d0d0; + padding-bottom: 10px; +} +.goods .good-item dl { + border-right: 1px dotted #d0d0d0; + padding: 5px; +} +.goods .good-item dl.no-border-right { border-right: none; } + +/*** Filter block ***/ +.filter-block { float: left; padding: 10px 0; width: 100%; } +.filter-block div { float: left; } +.filter-block .paginate { + font-weight: bold; + padding: 0 40px 0 0; +} +.filter-block .sortby { font-weight: bold; } +.filter-block .sortby a { font-weight: normal; } +.filter-block .display_switch { float: right; text-align: right; } +.filter-block .display_switch a.switch_thumb { + width: 48px; + height: 21px; + display: block; + background: url(@templates_base@/img/display-view.png) no-repeat 0 0; + outline: none; + text-indent: -9999px; +} +.filter-block .display_switch a.swap { background-position: 0 100%; } +.filter-block .sortby form { display: inline; } + +.items { padding: 20px; } +.items.items-alt { padding: 0; } +.items .item { + border-top: 1px solid #d0d0d0; + float: left; + padding: 15px 10px; + position: relative; + width: auto; +} +.items .ribbon { + background: url(@templates_base@/img/ribbon.png) no-repeat 0 0; + height: 40px; + position: absolute; + top: -3px; right: -26px; + width: 102px; + z-index: 100; +} +.items .ribbon.sale { background-position: 0 0; } +.items .ribbon.top { background-position: 0 -40px; } +.items .ribbon.new { background-position: 0 -80px; } +.items .item .img { + float: left; + padding-right: 15px; + width: 70px; +} +.items .item .descr { + float: left; + padding-right: 15px; + width: 360px; +} +.items .item .descr h3 { + font-size: 1.077em; + font-weight: bold; + padding-bottom: 5px; +} +.items .item .descr .optional { padding: 5px 0; } +.items .item .descr .optional .stars { padding: 0 20px 0 0; } +.items .item .descr .optional .comp label em { + font-style: normal; + text-decoration: underline; +} +.items .item .descr .optional .comp label input { + bottom: -2px; + margin: 0 5px 0 0; + position: relative; +} +.items .item .price-block { + float: left; + width: 185px; +} +.items .item .price-block s.under { + display: block; + font-size: 1.308em; + font-weight: bold; + padding-right: 10px; +} +.items .item .price-block s.under span { font-size: 0.706em; } +.items .item .price-block .redprice { padding: 10px 0; } +.items .item .price-block em.price { + color: #C2120A; + font-size: 1.846em; + font-weight: bold; + font-style: normal; +} +.items .item .price-block em.price span { font-size: 0.708em; } +.items .item .price-block .addtocart { + background: url(@templates_base@/img/addtocart-left.jpg) no-repeat 0 0; + color: #faffed; + display: inline-block; + font-size: 1.077em; + font-weight: bold; + text-shadow: #000 0px 1px 1px; + text-decoration: none; +} +.items .item .price-block .addtocart span { + background: url(@templates_base@/img/addtocart-right.jpg) no-repeat 100% 0; + display: inline-block; + height: 33px; + line-height: 33px; + padding: 0 20px; +} + +ul.display { border-bottom: 1px solid #d0d0d0; float: left; width: 100%; } +ul.display li { float: left; width: 100%; } + +ul.thumb_view { border-bottom: none; } +ul.thumb_view li { + background-color: #fff; + border: 1px solid #d0d0d0; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + float: left; + height: 180px; + margin: 0 5px 5px 0; + width: 348px; +} +ul.thumb_view li .item { + border-top: none; + padding: 15px; + width: 319px; +} +ul.thumb_view li .item .img { + position: absolute; + top: 38px; + width: 133px; +} +ul.thumb_view li .item .img img { height: 133px; width: 133px; } +ul.thumb_view li .item .ribbon { right: -4px; } +ul.thumb_view li .item .descr { + position: absolute; + width: auto; +} +ul.thumb_view li .item .descr .optional { + left: 158px; + position: absolute; + top: 132px; + width: 165px; +} +ul.thumb_view li .item .descr .optional .stars { padding: 0 10px 0 0; } +ul.thumb_view li .item .descr p, +ul.thumb_view li .item .descr .optional .reviews { display: none; } +ul.thumb_view li .item .price-block { + float: none; + left: 170px; + position: absolute; + top: 50px; +} + +/*** Pagination ***/ +.pagination { padding-top: 20px; text-align: center; } +.pagination span, +.pagination a { + background: url(@templates_base@/img/paginate.png) no-repeat -28px 0; + color: #fff; + display: inline-block; + font-size: 1.308em; + font-weight: bold; + height: 28px; + line-height: 28px; + text-align: center; + text-decoration: none; + width: 28px; +} +.pagination span.prev { + background-position: 0 100%; + margin-right: 20px; +} +.pagination a.prev { + background-position: 0 0; + margin-right: 20px; +} +.pagination span.next { + background-position: -56px 100%; + margin-left: 20px; +} +.pagination a.next { + background-position: -56px 0; + margin-left: 20px; +} +.pagination a.active { + background-position: -28px 100%; +} + +/*** Searchbox ***/ +/* +.form { padding: 10px 0; } +.form input[type="text"] { + border: none; + background: #fff url(@templates_base@/img/bg-searchfield.jpg) no-repeat 0 0; + height: 23px; + padding: 2px 5px 2px 35px; + width: 162px; +} +*/ Index: branches/1.0.x/error_notfound.tpl =================================================================== diff -u -N -r14935 -r15169 --- branches/1.0.x/error_notfound.tpl (.../error_notfound.tpl) (revision 14935) +++ branches/1.0.x/error_notfound.tpl (.../error_notfound.tpl) (revision 15169) @@ -1,23 +1,23 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + \ No newline at end of file Index: branches/1.0.x/inc/js/validate/jquery.validationEngine-en.js =================================================================== diff -u -N -r14600 -r15169 --- branches/1.0.x/inc/js/validate/jquery.validationEngine-en.js (.../jquery.validationEngine-en.js) (revision 14600) +++ branches/1.0.x/inc/js/validate/jquery.validationEngine-en.js (.../jquery.validationEngine-en.js) (revision 15169) @@ -1,167 +1,167 @@ -(function($){ - $.fn.validationEngineLanguage = function(){ - }; - $.validationEngineLanguage = { - newLang: function(){ - $.validationEngineLanguage.allRules = { - "required": { // Add your regex rules here, you can take telephone as an example - "regex": "none", - "alertText": "* This field is required", - "alertTextCheckboxMultiple": "* Please select an option", - "alertTextCheckboxe": "* This checkbox is required", - "alertTextDateRange": "* Both date range fields are required" - }, - "dateRange": { - "regex": "none", - "alertText": "* Invalid ", - "alertText2": "Date Range" - }, - "dateTimeRange": { - "regex": "none", - "alertText": "* Invalid ", - "alertText2": "Date Time Range" - }, - "minSize": { - "regex": "none", - "alertText": "* Minimum ", - "alertText2": " characters allowed" - }, - "maxSize": { - "regex": "none", - "alertText": "* Maximum ", - "alertText2": " characters allowed" - }, - "groupRequired": { - "regex": "none", - "alertText": "* You must fill one of the following fields" - }, - "min": { - "regex": "none", - "alertText": "* Minimum value is " - }, - "max": { - "regex": "none", - "alertText": "* Maximum value is " - }, - "past": { - "regex": "none", - "alertText": "* Date prior to " - }, - "future": { - "regex": "none", - "alertText": "* Date past " - }, - "maxCheckbox": { - "regex": "none", - "alertText": "* Maximum ", - "alertText2": " options allowed" - }, - "minCheckbox": { - "regex": "none", - "alertText": "* Please select ", - "alertText2": " options" - }, - "equals": { - "regex": "none", - "alertText": "* Fields do not match" - }, - "phone": { - // credit: jquery.h5validate.js / orefalo - "regex": /^([\+][0-9]{1,3}[ \.\-])?([\(]{1}[0-9]{2,6}[\)])?([0-9 \.\-\/]{3,20})((x|ext|extension)[ ]?[0-9]{1,4})?$/, - "alertText": "* Invalid phone number" - }, - "email": { - // Shamelessly lifted from Scott Gonzalez via the Bassistance Validation plugin http://projects.scottsplayground.com/email_address_validation/ - "regex": /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i, - "alertText": "* Invalid email address" - }, - "integer": { - "regex": /^[\-\+]?\d+$/, - "alertText": "* Not a valid integer" - }, - "number": { - // Number, including positive, negative, and floating decimal. credit: orefalo - "regex": /^[\-\+]?(([0-9]+)([\.,]([0-9]+))?|([\.,]([0-9]+))?)$/, - "alertText": "* Invalid floating decimal number" - }, - "date": { - "regex": /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/, - "alertText": "* Invalid date, must be in YYYY-MM-DD format" - }, - "ipv4": { - "regex": /^((([01]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))[.]){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))$/, - "alertText": "* Invalid IP address" - }, - "url": { - "regex": /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i, - "alertText": "* Invalid URL" - }, - "onlyNumberSp": { - "regex": /^[0-9\ ]+$/, - "alertText": "* Numbers only" - }, - "onlyLetterSp": { - "regex": /^[a-zA-Z\ \']+$/, - "alertText": "* Letters only" - }, - "onlyLetterNumber": { - "regex": /^[0-9a-zA-Z]+$/, - "alertText": "* No special characters allowed" - }, - // --- CUSTOM RULES -- Those are specific to the demos, they can be removed or changed to your likings - "ajaxUserCall": { - "url": "ajaxValidateFieldUser", - // you may want to pass extra data on the ajax call - "extraData": "name=eric", - "alertText": "* This user is already taken", - "alertTextLoad": "* Validating, please wait" - }, - "ajaxUserCallPhp": { - "url": "phpajax/ajaxValidateFieldUser.php", - // you may want to pass extra data on the ajax call - "extraData": "name=eric", - // if you provide an "alertTextOk", it will show as a green prompt when the field validates - "alertTextOk": "* This username is available", - "alertText": "* This user is already taken", - "alertTextLoad": "* Validating, please wait" - }, - "ajaxNameCall": { - // remote json service location - "url": "ajaxValidateFieldName", - // error - "alertText": "* This name is already taken", - // if you provide an "alertTextOk", it will show as a green prompt when the field validates - "alertTextOk": "* This name is available", - // speaks by itself - "alertTextLoad": "* Validating, please wait" - }, - "ajaxNameCallPhp": { - // remote json service location - "url": "phpajax/ajaxValidateFieldName.php", - // error - "alertText": "* This name is already taken", - // speaks by itself - "alertTextLoad": "* Validating, please wait" - }, - "validate2fields": { - "alertText": "* Please input HELLO" - }, - //tls warning:homegrown not fielded - "dateFormat":{ - "regex": /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(?:(?:0?[1-9]|1[0-2])(\/|-)(?:0?[1-9]|1\d|2[0-8]))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(0?2(\/|-)29)(\/|-)(?:(?:0[48]00|[13579][26]00|[2468][048]00)|(?:\d\d)?(?:0[48]|[2468][048]|[13579][26]))$/, - "alertText": "* Invalid Date" - }, - //tls warning:homegrown not fielded - "dateTimeFormat": { - "regex": /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1}$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^((1[012]|0?[1-9]){1}\/(0?[1-9]|[12][0-9]|3[01]){1}\/\d{2,4}\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1})$/, - "alertText": "* Invalid Date or Date Format", - "alertText2": "Expected Format: ", - "alertText3": "mm/dd/yyyy hh:mm:ss AM|PM or ", - "alertText4": "yyyy-mm-dd hh:mm:ss AM|PM" - } - }; - - } - }; - $.validationEngineLanguage.newLang(); +(function($){ + $.fn.validationEngineLanguage = function(){ + }; + $.validationEngineLanguage = { + newLang: function(){ + $.validationEngineLanguage.allRules = { + "required": { // Add your regex rules here, you can take telephone as an example + "regex": "none", + "alertText": "* This field is required", + "alertTextCheckboxMultiple": "* Please select an option", + "alertTextCheckboxe": "* This checkbox is required", + "alertTextDateRange": "* Both date range fields are required" + }, + "dateRange": { + "regex": "none", + "alertText": "* Invalid ", + "alertText2": "Date Range" + }, + "dateTimeRange": { + "regex": "none", + "alertText": "* Invalid ", + "alertText2": "Date Time Range" + }, + "minSize": { + "regex": "none", + "alertText": "* Minimum ", + "alertText2": " characters allowed" + }, + "maxSize": { + "regex": "none", + "alertText": "* Maximum ", + "alertText2": " characters allowed" + }, + "groupRequired": { + "regex": "none", + "alertText": "* You must fill one of the following fields" + }, + "min": { + "regex": "none", + "alertText": "* Minimum value is " + }, + "max": { + "regex": "none", + "alertText": "* Maximum value is " + }, + "past": { + "regex": "none", + "alertText": "* Date prior to " + }, + "future": { + "regex": "none", + "alertText": "* Date past " + }, + "maxCheckbox": { + "regex": "none", + "alertText": "* Maximum ", + "alertText2": " options allowed" + }, + "minCheckbox": { + "regex": "none", + "alertText": "* Please select ", + "alertText2": " options" + }, + "equals": { + "regex": "none", + "alertText": "* Fields do not match" + }, + "phone": { + // credit: jquery.h5validate.js / orefalo + "regex": /^([\+][0-9]{1,3}[ \.\-])?([\(]{1}[0-9]{2,6}[\)])?([0-9 \.\-\/]{3,20})((x|ext|extension)[ ]?[0-9]{1,4})?$/, + "alertText": "* Invalid phone number" + }, + "email": { + // Shamelessly lifted from Scott Gonzalez via the Bassistance Validation plugin http://projects.scottsplayground.com/email_address_validation/ + "regex": /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i, + "alertText": "* Invalid email address" + }, + "integer": { + "regex": /^[\-\+]?\d+$/, + "alertText": "* Not a valid integer" + }, + "number": { + // Number, including positive, negative, and floating decimal. credit: orefalo + "regex": /^[\-\+]?(([0-9]+)([\.,]([0-9]+))?|([\.,]([0-9]+))?)$/, + "alertText": "* Invalid floating decimal number" + }, + "date": { + "regex": /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/, + "alertText": "* Invalid date, must be in YYYY-MM-DD format" + }, + "ipv4": { + "regex": /^((([01]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))[.]){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))$/, + "alertText": "* Invalid IP address" + }, + "url": { + "regex": /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i, + "alertText": "* Invalid URL" + }, + "onlyNumberSp": { + "regex": /^[0-9\ ]+$/, + "alertText": "* Numbers only" + }, + "onlyLetterSp": { + "regex": /^[a-zA-Z\ \']+$/, + "alertText": "* Letters only" + }, + "onlyLetterNumber": { + "regex": /^[0-9a-zA-Z]+$/, + "alertText": "* No special characters allowed" + }, + // --- CUSTOM RULES -- Those are specific to the demos, they can be removed or changed to your likings + "ajaxUserCall": { + "url": "ajaxValidateFieldUser", + // you may want to pass extra data on the ajax call + "extraData": "name=eric", + "alertText": "* This user is already taken", + "alertTextLoad": "* Validating, please wait" + }, + "ajaxUserCallPhp": { + "url": "phpajax/ajaxValidateFieldUser.php", + // you may want to pass extra data on the ajax call + "extraData": "name=eric", + // if you provide an "alertTextOk", it will show as a green prompt when the field validates + "alertTextOk": "* This username is available", + "alertText": "* This user is already taken", + "alertTextLoad": "* Validating, please wait" + }, + "ajaxNameCall": { + // remote json service location + "url": "ajaxValidateFieldName", + // error + "alertText": "* This name is already taken", + // if you provide an "alertTextOk", it will show as a green prompt when the field validates + "alertTextOk": "* This name is available", + // speaks by itself + "alertTextLoad": "* Validating, please wait" + }, + "ajaxNameCallPhp": { + // remote json service location + "url": "phpajax/ajaxValidateFieldName.php", + // error + "alertText": "* This name is already taken", + // speaks by itself + "alertTextLoad": "* Validating, please wait" + }, + "validate2fields": { + "alertText": "* Please input HELLO" + }, + //tls warning:homegrown not fielded + "dateFormat":{ + "regex": /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(?:(?:0?[1-9]|1[0-2])(\/|-)(?:0?[1-9]|1\d|2[0-8]))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(0?2(\/|-)29)(\/|-)(?:(?:0[48]00|[13579][26]00|[2468][048]00)|(?:\d\d)?(?:0[48]|[2468][048]|[13579][26]))$/, + "alertText": "* Invalid Date" + }, + //tls warning:homegrown not fielded + "dateTimeFormat": { + "regex": /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1}$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^((1[012]|0?[1-9]){1}\/(0?[1-9]|[12][0-9]|3[01]){1}\/\d{2,4}\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1})$/, + "alertText": "* Invalid Date or Date Format", + "alertText2": "Expected Format: ", + "alertText3": "mm/dd/yyyy hh:mm:ss AM|PM or ", + "alertText4": "yyyy-mm-dd hh:mm:ss AM|PM" + } + }; + + } + }; + $.validationEngineLanguage.newLang(); })(jQuery); \ No newline at end of file Index: branches/1.0.x/.smsignore =================================================================== diff -u -N -r14801 -r15169 --- branches/1.0.x/.smsignore (.../.smsignore) (revision 14801) +++ branches/1.0.x/.smsignore (.../.smsignore) (revision 15169) @@ -1,3 +1,3 @@ -cart\.tpl -checkout\.tpl +cart\.tpl +checkout\.tpl receipt\.tpl \ No newline at end of file Index: branches/1.0.x/inc/cart.css =================================================================== diff -u -N -r14859 -r15169 --- branches/1.0.x/inc/cart.css (.../cart.css) (revision 14859) +++ branches/1.0.x/inc/cart.css (.../cart.css) (revision 15169) @@ -1,458 +1,458 @@ -@charset "UTF-8"; - -/* Cart Blocks -*******************************************************************************/ -.steps { - margin: 0 auto; - width: 535px; -} -.steps li { - background: url(@templates_base@/img/icon-step.png) no-repeat 100% 40%; - color: #bdbdbd; - float: left; - font-size: 9pt; - font-weight: bold; - padding: 0 85px 0 38px; - text-transform: uppercase; -} -.steps li:first-child { - padding-left: 0; -} -.steps li:last-child { - background: none; - padding-right: 0; -} -.steps li i { - display: block; - height: 36px; - margin: 0 auto 5px; - width: 40px; -} -.steps li.step1 i { background: url(@templates_base@/img/cart-steps.png) no-repeat 0 0; } -.steps li.step2 i { background: url(@templates_base@/img/cart-steps.png) no-repeat 0 -36px; } -.steps li.step3 i { background: url(@templates_base@/img/cart-steps.png) no-repeat 0 -72px; } -.steps li a { - color: #bdbdbd; - text-decoration: none; -} -.steps li.step1.active i { background: url(@templates_base@/img/cart-steps.png) no-repeat -40px 0; } -.steps li.step2.active i { background: url(@templates_base@/img/cart-steps.png) no-repeat -40px -36px; } -.steps li.step3.active i { background: url(@templates_base@/img/cart-steps.png) no-repeat -40px -72px; } -.steps li.active a { color: #878787; } - - -.cart-detail { - background-color: #fff; - border: 1px solid #d0d0d0; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - margin-top: 10px; - padding: 15px 30px 50px 30px; - width: 100%; -} -.cart-detail h1 { - color: #525252; - font: 1.538em Verdana,Arial,Tahoma,Sans-Serif; - padding: 0 0 20px 0; -} -.cart-detail .halfcol { - border-right: 1px dotted #aeaeae; - float: left; - margin: 0 14px 0 0; - padding: 0 14px 0 0; - width: 465px; -} -.cart-detail .halfcol-last { - border-right: none; - margin: 0; - padding: 0; - position: relative; -} -.cart-detail .halfcol-last .badge-optional { - background: url(@templates_base@/img/badge-optional.png) no-repeat 0 0; - height: 40px; - position: absolute; - top: -44px; left: -20px; - width: 102px; -} -.cart-detail .fieldset { - background: url(@templates_base@/img/bg-form-fieldset.jpg) repeat-x 0 0; - color: #000; - font-weight: bold; - height: 26px; - line-height: 26px; - padding: 0 0 10px 50px; - position: relative; -} -.cart-detail.receipt .fieldset { padding-left: 16px; } -.cart-detail .fieldset .link { - font-weight: normal; - position: absolute; - right: 15px; -} - -fieldset { padding: 0 0 15px; } - -.firstline { min-height: 140px; padding: 20px 0 0; position: relative; } -.firstline .login-alt { - color: #66c133; - font-size: 1.154em; - font-weight: bold; - padding: 5px 0 20px 50px; -} -.firstline .login-alt .plashka { - right: 194px; -} -.firstline .login-alt .plashka-sel { - margin: -6px 0 0 5px; -} - -.checkout-form label { - display: block; - font-weight: bold; - padding-bottom: 3px; -} -.checkout-form p { - clear: both !important; - float: left; - padding: 5px 0 5px 50px; -} -.checkout-form p.alt1 { - clear: none !important; - padding: 5px 10px 5px 50px; - width: 170px; -} -.checkout-form p.alt2 { - clear: none !important; - padding: 5px 0; - width: 120px; -} -.checkout-form .field { width: 300px; } -.checkout-form select.field { width: 311px; } -.field.statusSuccess { - background: url(@templates_base@/img/bg-field-success.jpg) repeat-x 0 0; - border: 1px solid #80d04d; -} -.field.statusError { - background: url(@templates_base@/img/bg-field-error.jpg) repeat-x 0 0; - border: 1px solid #d80000; -} - -.checkout-form p.alt1 .field, -.checkout-form p.alt2 .field, -.checkout-form p.pasfield1 .field, -.checkout-form p.pasfield2 .field { - width: 100%; -} - -.checkout-form .creditcard .field { width: 250px; } -.checkout-form .creditcard p.alt1.expdate .field { width: 78px; } -.checkout-form .creditcard p.alt2 .field { width: 70px; } - -.creditcards { padding: 0 0 0 50px; } -.creditcards span { - display: inline-block; - height: 45px; -} -.creditcards span.paypal { - border-left: 1px solid #d3d3d3; - margin-left: 10px; - padding-left: 15px; -} - -.password-block { - border: 1px solid #e3e3e3; - float: right; - padding: 12px 20px; - width: 390px; -} -.password-block p { - clear: none !important; - padding: 0 30px 0 0; -} -.password-block p.pasfield1 { - width: 150px; -} - -.colorbar { - display: inline-block; - height: 8px; - width: 29px; -} - -.password-strength { display: none; font-weight: bold; } -.password-strength .meterDefault { color: #aaa; } -.password-strength .meterFail { color: #daa; } -.password-strength .meterWarn { color: #fd6; } -.password-strength .meterGood { color: #ada; } -.password-strength .meterExcel { color: #66c133; } -.password-strength .colorbar.meterDefault { background-color: #ddd; } -.password-strength .colorbar.meterFail { background-color: #fdd; } -.password-strength .colorbar.meterWarn { background-color: #feb; } -.password-strength .colorbar.meterGood { background-color: #dfd; } -.password-strength .colorbar.meterExcel { background-color: #66c133; } - -.checkout-form .safe-shop { - background: url(@templates_base@/img/safe-shop.jpg) no-repeat 0 40px; - min-height: 335px; - margin: 115px 0 0 50px; -} -.checkout-form .safe-shop .title { - color: #389901; - font: bold 1.462em Verdana,Arial,Tahoma,Sans-Serif; - padding-left: 18px; -} -.checkout-form .safe-shop ul.list { - float: left; - padding: 10px 0 0 130px; -} -.checkout-form .safe-shop ul.list li { - background: url(@templates_base@/img/icon-galka.png) no-repeat 0 50%; - color: #313030; - font-weight: bold; - padding: 6px 0 6px 25px; -} - -dl.total { padding: 20px 0 0; width: 240px; } -dl.total dt, -dl.total dd { - float: left; - font-weight: bold; - padding: 0 0 10px; - text-align: right; - width: 120px; -} -dl.total dt.discount { color: #bf0000; } -dl.total dd { font-size: 1.385em; } -dl.total dd span { font-size: 15px; } -dl.total dd.price1 { color: #333; font-size: 1.538em; } -dl.total dd.price2 { color: #bf0000; } -dl.total dd.price3 { font-weight: normal; } -dl.total dd.price4 { color: #3f911f; font-size: 1.538em; } - -.product-discount .item-price span, .product-discount .item-discount span, -.shop-cart-row .price-cell span, .shop-cart-row .extended-price-cell span { - font-size: 12px; -} - -.cart-detail .terms { - text-align: right; - width: 240px; -} - -.place-button, -.place-grey-button, -.checkout-button, -.checkout-grey-button { - background: url(@templates_base@/img/order-left.jpg) no-repeat 0 0; - color: #faffed; - display: inline-block; - font-size: 1.385em; - font-weight: bold; - text-shadow: #000 0px 1px 1px; - text-decoration: none; -} -.place-grey-button, -.checkout-grey-button { - color: #000; - text-shadow: none; -} -.place-button span, -.place-grey-button span, -.checkout-button span, -.checkout-grey-button span { - background: url(@templates_base@/img/order-right.jpg) no-repeat 100% 0; - display: inline-block; - height: 37px; - line-height: 37px; - padding: 0 50px 0 30px; -} -.place-button:hover, -.place-grey-button:hover, -.checkout-button:hover, -.checkout-grey-button:hover { color: #faffed; } - -.checkout-button span { - background: url(@templates_base@/img/checkout-right.jpg) no-repeat 100% 0; - padding: 0 30px 0 20px; -} -.place-grey-button { - background: url(@templates_base@/img/checkout-grey-left.jpg) no-repeat 0 0; -} -.place-grey-button span { - background: url(@templates_base@/img/order-grey-right.jpg) no-repeat 100% 0; -} -.checkout-grey-button { - background: url(@templates_base@/img/checkout-grey-left.jpg) no-repeat 0 0; - margin-top: 20px; -} -.checkout-grey-button span { - background: url(@templates_base@/img/checkout-grey-right.jpg) no-repeat 100% 0; - padding: 0 30px 0 20px; -} - -.continue-button { - background: url(@templates_base@/img/bg-button-continue-right.jpg) no-repeat 100% 0; - color: #3c3c3c; - display: inline-block; - font-weight: bold; - margin-right: 20px; - text-decoration: none; -} -.continue-button span { - background: url(@templates_base@/img/bg-button-continue-left.jpg) no-repeat 0 0; - display: inline-block; - height: 26px; - line-height: 26px; - padding: 0 20px 0 25px; -} -.continue-button:hover { - color: #3c3c3c; -} - -.cart-detail.receipt .success-order { - background: url(@templates_base@/img/success.png) no-repeat 30px 30px; - border-bottom: 1px solid #d0d0d0; - margin-bottom: 25px; - padding: 0 0 25px 130px; -} -.cart-detail.receipt .success-order .links { - float: right; - padding: 0; -} -.cart-detail.receipt .success-order .links a.link-print { - background: url(@templates_base@/img/icon-print.jpg) no-repeat 0 0; - display: inline-block; - font-weight: bold; - height: 32px; - line-height: 32px; - padding: 0 20px 0 40px; -} -.cart-detail.receipt .success-order .links a.link-download { - background: url(@templates_base@/img/icon-download.jpg) no-repeat 0 0; - display: inline-block; - font-weight: bold; - height: 32px; - line-height: 32px; - padding: 0 0 0 40px; -} -.cart-detail.receipt .success-order .green { - color: #009f00; - font: 1.538em Tahoma,Verdana,Arial,Sans-Serif; -} -.cart-detail.receipt .success-order p { - padding: 5px 0; -} - -.cart-detail.receipt p { padding-left: 16px; } -.cart-detail.receipt dl.info { - padding-left: 16px; -} -.cart-detail.receipt dl.info dt { - clear: both !important; - float: left; - font-weight: bold; - padding: 5px 15px 5px 0; - width: 90px; -} -.cart-detail.receipt dl.info dd { - float: left; - padding: 5px 15px 5px 0; -} - -.cart-detail.receipt .items { - border-bottom: 1px solid #d1d1d1; - margin-top: 30px; - width: 100%; -} -.cart-detail.shoppingcart .items { - margin-top: 0; -} -.cart-detail.receipt .items thead { - background: url(@templates_base@/img/bg-form-fieldset.jpg) repeat-x 0 0; - border: 1px solid #adadad; -} -.cart-detail.receipt .items th { - color: #000; - font-weight: bold; - padding: 5px 10px; -} -.cart-detail.receipt .items td { - border-top: 1px solid #d1d1d1; - color: #000; - padding: 10px; - text-align: center; - vertical-align: middle; -} -.cart-detail.receipt .items tr:first-child td { - border-top: none; -} -.cart-detail.receipt .items td.options-td { - background-color: #f7f7f7; - border-top: none; - color: #686767; - text-align: left; -} -.cart-detail.receipt .items td.options-td .sel-options { float: left; padding: 0 20px 0 0; } -.cart-detail.receipt .items .item-img { width: 70px; } -.cart-detail.receipt .items .item-total { font-weight: bold; } -.cart-detail.receipt .items .item-title { - color: #333; - font-weight: bold; - text-align: left; -} -.cart-detail.receipt .items .item-quantity { position: relative; } -.cart-detail.receipt .items .item-quantity .field { text-align: center; width: 30px; } -.formStatus { - position: absolute; - top: 37px; - left: 15px; - display: block; - z-index: 5000; - cursor: pointer; -} -.formStatus .formContent { - width: 100%; - position:relative; - z-index:5001; - color: #fff; - white-space: nowrap; - font-family: Arial; - font-size: 12px; - box-shadow: 0 0 3px #444; - -moz-box-shadow: 0 0 3px #444; - -webkit-box-shadow: 0 0 3px #444; - padding: 4px 10px 4px 10px; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} -.formStatus .formArrow { - height: 11px; - margin: -34px 0 0 22px; - position: relative; - width: 21px; - z-index: 5006; -} -.formStatus.formSuccess .formContent { background: #398d1d url(@templates_base@/img/validate/con-success.png) repeat-x 0 0; } -.formStatus.formSuccess .formArrow { background: url(@templates_base@/img/validate/con-success-arrow.png) no-repeat 0 0; } -.formStatus.formError .formContent { background: #990000 url(@templates_base@/img/validate/con-error.png) repeat-x 0 0; } -.formStatus.formError .formArrow { background: url(@templates_base@/img/validate/con-error-arrow.png) no-repeat 0 0; } - -.cart-detail.receipt dl.total { float: right; padding-right: 30px; } - -.cart-detail.receipt .discount-block { - float: left; - padding: 20px 0 0; - width: 300px; -} -.cart-detail.receipt .discount-block p { padding: 5px 0; } -.cart-detail.receipt .discount-block .field { width: 170px; } -.cart-detail.receipt .discount-block .num-discount { position: relative; } -.cart-detail.receipt .discount-block .formStatus { left: -15px; } - -.cart-detail.shoppingcart h1 { float: left; } - -.cart-detail.shoppingcart .buttons-right { float: right; text-align: right; } -.cart-detail.shoppingcart .buttons-right dl.total { float: none; padding-right: 0; } +@charset "UTF-8"; + +/* Cart Blocks +*******************************************************************************/ +.steps { + margin: 0 auto; + width: 535px; +} +.steps li { + background: url(@templates_base@/img/icon-step.png) no-repeat 100% 40%; + color: #bdbdbd; + float: left; + font-size: 9pt; + font-weight: bold; + padding: 0 85px 0 38px; + text-transform: uppercase; +} +.steps li:first-child { + padding-left: 0; +} +.steps li:last-child { + background: none; + padding-right: 0; +} +.steps li i { + display: block; + height: 36px; + margin: 0 auto 5px; + width: 40px; +} +.steps li.step1 i { background: url(@templates_base@/img/cart-steps.png) no-repeat 0 0; } +.steps li.step2 i { background: url(@templates_base@/img/cart-steps.png) no-repeat 0 -36px; } +.steps li.step3 i { background: url(@templates_base@/img/cart-steps.png) no-repeat 0 -72px; } +.steps li a { + color: #bdbdbd; + text-decoration: none; +} +.steps li.step1.active i { background: url(@templates_base@/img/cart-steps.png) no-repeat -40px 0; } +.steps li.step2.active i { background: url(@templates_base@/img/cart-steps.png) no-repeat -40px -36px; } +.steps li.step3.active i { background: url(@templates_base@/img/cart-steps.png) no-repeat -40px -72px; } +.steps li.active a { color: #878787; } + + +.cart-detail { + background-color: #fff; + border: 1px solid #d0d0d0; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + margin-top: 10px; + padding: 15px 30px 50px 30px; + width: 100%; +} +.cart-detail h1 { + color: #525252; + font: 1.538em Verdana,Arial,Tahoma,Sans-Serif; + padding: 0 0 20px 0; +} +.cart-detail .halfcol { + border-right: 1px dotted #aeaeae; + float: left; + margin: 0 14px 0 0; + padding: 0 14px 0 0; + width: 465px; +} +.cart-detail .halfcol-last { + border-right: none; + margin: 0; + padding: 0; + position: relative; +} +.cart-detail .halfcol-last .badge-optional { + background: url(@templates_base@/img/badge-optional.png) no-repeat 0 0; + height: 40px; + position: absolute; + top: -44px; left: -20px; + width: 102px; +} +.cart-detail .fieldset { + background: url(@templates_base@/img/bg-form-fieldset.jpg) repeat-x 0 0; + color: #000; + font-weight: bold; + height: 26px; + line-height: 26px; + padding: 0 0 10px 50px; + position: relative; +} +.cart-detail.receipt .fieldset { padding-left: 16px; } +.cart-detail .fieldset .link { + font-weight: normal; + position: absolute; + right: 15px; +} + +fieldset { padding: 0 0 15px; } + +.firstline { min-height: 140px; padding: 20px 0 0; position: relative; } +.firstline .login-alt { + color: #66c133; + font-size: 1.154em; + font-weight: bold; + padding: 5px 0 20px 50px; +} +.firstline .login-alt .plashka { + right: 194px; +} +.firstline .login-alt .plashka-sel { + margin: -6px 0 0 5px; +} + +.checkout-form label { + display: block; + font-weight: bold; + padding-bottom: 3px; +} +.checkout-form p { + clear: both !important; + float: left; + padding: 5px 0 5px 50px; +} +.checkout-form p.alt1 { + clear: none !important; + padding: 5px 10px 5px 50px; + width: 170px; +} +.checkout-form p.alt2 { + clear: none !important; + padding: 5px 0; + width: 120px; +} +.checkout-form .field { width: 300px; } +.checkout-form select.field { width: 311px; } +.field.statusSuccess { + background: url(@templates_base@/img/bg-field-success.jpg) repeat-x 0 0; + border: 1px solid #80d04d; +} +.field.statusError { + background: url(@templates_base@/img/bg-field-error.jpg) repeat-x 0 0; + border: 1px solid #d80000; +} + +.checkout-form p.alt1 .field, +.checkout-form p.alt2 .field, +.checkout-form p.pasfield1 .field, +.checkout-form p.pasfield2 .field { + width: 100%; +} + +.checkout-form .creditcard .field { width: 250px; } +.checkout-form .creditcard p.alt1.expdate .field { width: 78px; } +.checkout-form .creditcard p.alt2 .field { width: 70px; } + +.creditcards { padding: 0 0 0 50px; } +.creditcards span { + display: inline-block; + height: 45px; +} +.creditcards span.paypal { + border-left: 1px solid #d3d3d3; + margin-left: 10px; + padding-left: 15px; +} + +.password-block { + border: 1px solid #e3e3e3; + float: right; + padding: 12px 20px; + width: 390px; +} +.password-block p { + clear: none !important; + padding: 0 30px 0 0; +} +.password-block p.pasfield1 { + width: 150px; +} + +.colorbar { + display: inline-block; + height: 8px; + width: 29px; +} + +.password-strength { display: none; font-weight: bold; } +.password-strength .meterDefault { color: #aaa; } +.password-strength .meterFail { color: #daa; } +.password-strength .meterWarn { color: #fd6; } +.password-strength .meterGood { color: #ada; } +.password-strength .meterExcel { color: #66c133; } +.password-strength .colorbar.meterDefault { background-color: #ddd; } +.password-strength .colorbar.meterFail { background-color: #fdd; } +.password-strength .colorbar.meterWarn { background-color: #feb; } +.password-strength .colorbar.meterGood { background-color: #dfd; } +.password-strength .colorbar.meterExcel { background-color: #66c133; } + +.checkout-form .safe-shop { + background: url(@templates_base@/img/safe-shop.jpg) no-repeat 0 40px; + min-height: 335px; + margin: 115px 0 0 50px; +} +.checkout-form .safe-shop .title { + color: #389901; + font: bold 1.462em Verdana,Arial,Tahoma,Sans-Serif; + padding-left: 18px; +} +.checkout-form .safe-shop ul.list { + float: left; + padding: 10px 0 0 130px; +} +.checkout-form .safe-shop ul.list li { + background: url(@templates_base@/img/icon-galka.png) no-repeat 0 50%; + color: #313030; + font-weight: bold; + padding: 6px 0 6px 25px; +} + +dl.total { padding: 20px 0 0; width: 240px; } +dl.total dt, +dl.total dd { + float: left; + font-weight: bold; + padding: 0 0 10px; + text-align: right; + width: 120px; +} +dl.total dt.discount { color: #bf0000; } +dl.total dd { font-size: 1.385em; } +dl.total dd span { font-size: 15px; } +dl.total dd.price1 { color: #333; font-size: 1.538em; } +dl.total dd.price2 { color: #bf0000; } +dl.total dd.price3 { font-weight: normal; } +dl.total dd.price4 { color: #3f911f; font-size: 1.538em; } + +.product-discount .item-price span, .product-discount .item-discount span, +.shop-cart-row .price-cell span, .shop-cart-row .extended-price-cell span { + font-size: 12px; +} + +.cart-detail .terms { + text-align: right; + width: 240px; +} + +.place-button, +.place-grey-button, +.checkout-button, +.checkout-grey-button { + background: url(@templates_base@/img/order-left.jpg) no-repeat 0 0; + color: #faffed; + display: inline-block; + font-size: 1.385em; + font-weight: bold; + text-shadow: #000 0px 1px 1px; + text-decoration: none; +} +.place-grey-button, +.checkout-grey-button { + color: #000; + text-shadow: none; +} +.place-button span, +.place-grey-button span, +.checkout-button span, +.checkout-grey-button span { + background: url(@templates_base@/img/order-right.jpg) no-repeat 100% 0; + display: inline-block; + height: 37px; + line-height: 37px; + padding: 0 50px 0 30px; +} +.place-button:hover, +.place-grey-button:hover, +.checkout-button:hover, +.checkout-grey-button:hover { color: #faffed; } + +.checkout-button span { + background: url(@templates_base@/img/checkout-right.jpg) no-repeat 100% 0; + padding: 0 30px 0 20px; +} +.place-grey-button { + background: url(@templates_base@/img/checkout-grey-left.jpg) no-repeat 0 0; +} +.place-grey-button span { + background: url(@templates_base@/img/order-grey-right.jpg) no-repeat 100% 0; +} +.checkout-grey-button { + background: url(@templates_base@/img/checkout-grey-left.jpg) no-repeat 0 0; + margin-top: 20px; +} +.checkout-grey-button span { + background: url(@templates_base@/img/checkout-grey-right.jpg) no-repeat 100% 0; + padding: 0 30px 0 20px; +} + +.continue-button { + background: url(@templates_base@/img/bg-button-continue-right.jpg) no-repeat 100% 0; + color: #3c3c3c; + display: inline-block; + font-weight: bold; + margin-right: 20px; + text-decoration: none; +} +.continue-button span { + background: url(@templates_base@/img/bg-button-continue-left.jpg) no-repeat 0 0; + display: inline-block; + height: 26px; + line-height: 26px; + padding: 0 20px 0 25px; +} +.continue-button:hover { + color: #3c3c3c; +} + +.cart-detail.receipt .success-order { + background: url(@templates_base@/img/success.png) no-repeat 30px 30px; + border-bottom: 1px solid #d0d0d0; + margin-bottom: 25px; + padding: 0 0 25px 130px; +} +.cart-detail.receipt .success-order .links { + float: right; + padding: 0; +} +.cart-detail.receipt .success-order .links a.link-print { + background: url(@templates_base@/img/icon-print.jpg) no-repeat 0 0; + display: inline-block; + font-weight: bold; + height: 32px; + line-height: 32px; + padding: 0 20px 0 40px; +} +.cart-detail.receipt .success-order .links a.link-download { + background: url(@templates_base@/img/icon-download.jpg) no-repeat 0 0; + display: inline-block; + font-weight: bold; + height: 32px; + line-height: 32px; + padding: 0 0 0 40px; +} +.cart-detail.receipt .success-order .green { + color: #009f00; + font: 1.538em Tahoma,Verdana,Arial,Sans-Serif; +} +.cart-detail.receipt .success-order p { + padding: 5px 0; +} + +.cart-detail.receipt p { padding-left: 16px; } +.cart-detail.receipt dl.info { + padding-left: 16px; +} +.cart-detail.receipt dl.info dt { + clear: both !important; + float: left; + font-weight: bold; + padding: 5px 15px 5px 0; + width: 90px; +} +.cart-detail.receipt dl.info dd { + float: left; + padding: 5px 15px 5px 0; +} + +.cart-detail.receipt .items { + border-bottom: 1px solid #d1d1d1; + margin-top: 30px; + width: 100%; +} +.cart-detail.shoppingcart .items { + margin-top: 0; +} +.cart-detail.receipt .items thead { + background: url(@templates_base@/img/bg-form-fieldset.jpg) repeat-x 0 0; + border: 1px solid #adadad; +} +.cart-detail.receipt .items th { + color: #000; + font-weight: bold; + padding: 5px 10px; +} +.cart-detail.receipt .items td { + border-top: 1px solid #d1d1d1; + color: #000; + padding: 10px; + text-align: center; + vertical-align: middle; +} +.cart-detail.receipt .items tr:first-child td { + border-top: none; +} +.cart-detail.receipt .items td.options-td { + background-color: #f7f7f7; + border-top: none; + color: #686767; + text-align: left; +} +.cart-detail.receipt .items td.options-td .sel-options { float: left; padding: 0 20px 0 0; } +.cart-detail.receipt .items .item-img { width: 70px; } +.cart-detail.receipt .items .item-total { font-weight: bold; } +.cart-detail.receipt .items .item-title { + color: #333; + font-weight: bold; + text-align: left; +} +.cart-detail.receipt .items .item-quantity { position: relative; } +.cart-detail.receipt .items .item-quantity .field { text-align: center; width: 30px; } +.formStatus { + position: absolute; + top: 37px; + left: 15px; + display: block; + z-index: 5000; + cursor: pointer; +} +.formStatus .formContent { + width: 100%; + position:relative; + z-index:5001; + color: #fff; + white-space: nowrap; + font-family: Arial; + font-size: 12px; + box-shadow: 0 0 3px #444; + -moz-box-shadow: 0 0 3px #444; + -webkit-box-shadow: 0 0 3px #444; + padding: 4px 10px 4px 10px; + border-radius: 3px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; +} +.formStatus .formArrow { + height: 11px; + margin: -34px 0 0 22px; + position: relative; + width: 21px; + z-index: 5006; +} +.formStatus.formSuccess .formContent { background: #398d1d url(@templates_base@/img/validate/con-success.png) repeat-x 0 0; } +.formStatus.formSuccess .formArrow { background: url(@templates_base@/img/validate/con-success-arrow.png) no-repeat 0 0; } +.formStatus.formError .formContent { background: #990000 url(@templates_base@/img/validate/con-error.png) repeat-x 0 0; } +.formStatus.formError .formArrow { background: url(@templates_base@/img/validate/con-error-arrow.png) no-repeat 0 0; } + +.cart-detail.receipt dl.total { float: right; padding-right: 30px; } + +.cart-detail.receipt .discount-block { + float: left; + padding: 20px 0 0; + width: 300px; +} +.cart-detail.receipt .discount-block p { padding: 5px 0; } +.cart-detail.receipt .discount-block .field { width: 170px; } +.cart-detail.receipt .discount-block .num-discount { position: relative; } +.cart-detail.receipt .discount-block .formStatus { left: -15px; } + +.cart-detail.shoppingcart h1 { float: left; } + +.cart-detail.shoppingcart .buttons-right { float: right; text-align: right; } +.cart-detail.shoppingcart .buttons-right dl.total { float: none; padding-right: 0; }