/*
* Really easy field validation with Prototype
* http://tetlaw.id.au/view/javascript/really-easy-field-validation
* Andrew Tetlaw
* Version 1.5.4.1 (2007-01-05)
*
* Copyright (c) 2007 Andrew Tetlaw
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*/
var Validator = Class.create();

Validator.prototype = {
 initialize : function(className, error, test, options) {
 if(typeof test == 'function'){
 this.options = $H(options);
 this._test = test;
 } else {
 this.options = $H(test);
 this._test = function(){return true};
 }
 this.error = error || 'Validation failed.';
 this.className = className;
 },
 test : function(v, elm) {
 return (this._test(v,elm) && this.options.all(function(p){
 return Validator.methods[p.key] ? Validator.methods[p.key](v,elm,p.value) : true;
 }));
 }
}
Validator.methods = {
 pattern : function(v,elm,opt) {return Validation.get('IsEmpty').test(v) || opt.test(v)},
 minLength : function(v,elm,opt) {return v.length >= opt},
 maxLength : function(v,elm,opt) {return v.length <= opt},
 min : function(v,elm,opt) {return v >= parseFloat(opt)},
 max : function(v,elm,opt) {return v <= parseFloat(opt)},
 notOneOf : function(v,elm,opt) {return $A(opt).all(function(value) {
 return v != value;
 })},
 oneOf : function(v,elm,opt) {return $A(opt).any(function(value) {
 return v == value;
 })},
 is : function(v,elm,opt) {return v == opt},
 isNot : function(v,elm,opt) {return v != opt},
 equalToField : function(v,elm,opt) {return v == $F(opt)},
 notEqualToField : function(v,elm,opt) {return v != $F(opt)},
 include : function(v,elm,opt) {return $A(opt).all(function(value) {
 return Validation.get(value).test(v,elm);
 })}
}

var Validation = Class.create();
Validation.defaultOptions = {
 onSubmit : true,
 stopOnFirst : false,
 immediate : false,
 focusOnError : true,
 useTitles : false,
 addClassNameToContainer: false,
 containerClassName: '.input-box',
 onFormValidate : function(result, form) {},
 onElementValidate : function(result, elm) {}
};

Validation.prototype = {
 initialize : function(form, options){
 this.form = $(form);
 if (!this.form) {
 return;
 }
 this.options = Object.extend({
 onSubmit : Validation.defaultOptions.onSubmit,
 stopOnFirst : Validation.defaultOptions.stopOnFirst,
 immediate : Validation.defaultOptions.immediate,
 focusOnError : Validation.defaultOptions.focusOnError,
 useTitles : Validation.defaultOptions.useTitles,
 onFormValidate : Validation.defaultOptions.onFormValidate,
 onElementValidate : Validation.defaultOptions.onElementValidate
 }, options || {});
 if(this.options.onSubmit) Event.observe(this.form,'submit',this.onSubmit.bind(this),false);
 if(this.options.immediate) {
 Form.getElements(this.form).each(function(input) { // Thanks Mike! 
 if (input.tagName.toLowerCase() == 'select') {
 Event.observe(input, 'blur', this.onChange.bindAsEventListener(this));
 }
 Event.observe(input, 'change', this.onChange.bindAsEventListener(this));
 }, this);
 }
 },
 onChange : function (ev) {
 Validation.isOnChange = true;
 Validation.validate(Event.element(ev),{
 useTitle : this.options.useTitles, 
 onElementValidate : this.options.onElementValidate
 });
 Validation.isOnChange = false; 
 },
 onSubmit : function(ev){
 if(!this.validate()) Event.stop(ev);
 },
 validate : function() {
 var result = false;
 var useTitles = this.options.useTitles;
 var callback = this.options.onElementValidate;
 try {
 if(this.options.stopOnFirst) {
 result = Form.getElements(this.form).all(function(elm) { return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback}); });
 } else {
 result = Form.getElements(this.form).collect(function(elm) { return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback}); }).all();
 }
 } catch (e) {

 }
 if(!result && this.options.focusOnError) {
 try{
 Form.getElements(this.form).findAll(function(elm){return $(elm).hasClassName('validation-failed')}).first().focus()
 }
 catch(e){

 }
 }
 this.options.onFormValidate(result, this.form);
 return result;
 },
 reset : function() {
 Form.getElements(this.form).each(Validation.reset);
 }
}

Object.extend(Validation, {
 validate : function(elm, options){
 options = Object.extend({
 useTitle : false,
 onElementValidate : function(result, elm) {}
 }, options || {});
 elm = $(elm);

 var cn = $w(elm.className);
 return result = cn.all(function(value) {
 var test = Validation.test(value,elm,options.useTitle);
 options.onElementValidate(test, elm);
 return test;
 });
 },
 insertAdvice : function(elm, advice){
 var container = $(elm).up('.field-row');
 if(container){
 Element.insert(container, {after: advice});
 } else if (elm.up('td.value')) {
 elm.up('td.value').insert({bottom: advice});
 } else if (elm.advaiceContainer && $(elm.advaiceContainer)) {
 $(elm.advaiceContainer).update(advice);
 }
 else {
 switch (elm.type.toLowerCase()) {
 case 'checkbox':
 case 'radio':
 var p = elm.parentNode;
 if(p) {
 Element.insert(p, {'bottom': advice});
 } else {
 Element.insert(elm, {'after': advice});
 }
 break;
 default:
 Element.insert(elm, {'after': advice});
 }
 }
 },
 showAdvice : function(elm, advice, adviceName){
 if(!elm.advices){
 elm.advices = new Hash();
 }
 else{
 elm.advices.each(function(pair){
 this.hideAdvice(elm, pair.value);
 }.bind(this));
 }
 elm.advices.set(adviceName, advice);
 if(typeof Effect == 'undefined') {
 advice.style.display = 'block';
 } else {
 if(!advice._adviceAbsolutize) {
 new Effect.Appear(advice, {duration : 1 });
 } else {
 Position.absolutize(advice);
 advice.show();
 advice.setStyle({
 'top':advice._adviceTop,
 'left': advice._adviceLeft,
 'width': advice._adviceWidth,
 'z-index': 1000
 });
 advice.addClassName('advice-absolute');
 }
 }
 },
 hideAdvice : function(elm, advice){
 if(advice != null) advice.hide();
 },
 updateCallback : function(elm, status) {
 if (typeof elm.callbackFunction != 'undefined') {
 eval(elm.callbackFunction+'(\''+elm.id+'\',\''+status+'\')');
 }
 },
 ajaxError : function(elm, errorMsg) {
 var name = 'validate-ajax';
 var advice = Validation.getAdvice(name, elm);
 if (advice == null) {
 advice = this.createAdvice(name, elm, false, errorMsg);
 }
 this.showAdvice(elm, advice, 'validate-ajax');
 this.updateCallback(elm, 'failed');

 elm.addClassName('validation-failed');
 elm.addClassName('validate-ajax');
 if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') {
 var container = elm.up(Validation.defaultOptions.containerClassName);
 if (container && this.allowContainerClassName(elm)) {
 container.removeClassName('validation-passed');
 container.addClassName('validation-error');
 }
 }
 },
 allowContainerClassName: function (elm) {
 if (elm.type == 'radio' || elm.type == 'checkbox') {
 return elm.hasClassName('change-container-classname');
 }
 
 return true;
 },
 test : function(name, elm, useTitle) {
 var v = Validation.get(name);
 var prop = '__advice'+name.camelize();
 try {
 if(Validation.isVisible(elm) && !v.test($F(elm), elm)) {
 //if(!elm[prop]) {
 var advice = Validation.getAdvice(name, elm);
 if (advice == null) {
 advice = this.createAdvice(name, elm, useTitle);
 }
 this.showAdvice(elm, advice, name);
 this.updateCallback(elm, 'failed');
 //}
 elm[prop] = 1;
 if (!elm.advaiceContainer) {
 elm.removeClassName('validation-passed');
 elm.addClassName('validation-failed');
 } 
 
 if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') {
 var container = elm.up(Validation.defaultOptions.containerClassName);
 if (container && this.allowContainerClassName(elm)) {
 container.removeClassName('validation-passed');
 container.addClassName('validation-error');
 }
 }
 return false;
 } else {
 var advice = Validation.getAdvice(name, elm);
 this.hideAdvice(elm, advice);
 this.updateCallback(elm, 'passed');
 elm[prop] = '';
 elm.removeClassName('validation-failed');
 elm.addClassName('validation-passed');
 if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') {
 var container = elm.up(Validation.defaultOptions.containerClassName);
 if (container && !container.down('.validation-failed') && this.allowContainerClassName(elm)) {
 if (!Validation.get('IsEmpty').test(elm.value) || !this.isVisible(elm)) { 
 container.addClassName('validation-passed');
 } else {
 container.removeClassName('validation-passed');
 }
 container.removeClassName('validation-error');
 }
 }
 return true;
 }
 } catch(e) {
 throw(e)
 }
 },
 isVisible : function(elm) {
 while(elm.tagName != 'BODY') {
 if(!$(elm).visible()) return false;
 elm = elm.parentNode;
 }
 return true;
 },
 getAdvice : function(name, elm) {
 return $('advice-' + name + '-' + Validation.getElmID(elm)) || $('advice-' + Validation.getElmID(elm));
 },
 createAdvice : function(name, elm, useTitle, customError) {
 var v = Validation.get(name);
 var errorMsg = useTitle ? ((elm && elm.title) ? elm.title : v.error) : v.error;
 if (customError) {
 errorMsg = customError;
 }
 try {
 if (Translator){
 errorMsg = Translator.translate(errorMsg);
 }
 }
 catch(e){}

 // �����ʾ����ı�֧�� #2010-06-15 By Jesse
 if ($(elm.id + '-tip-container') != null) {
 $(elm.id + '-tip-container').type = elm.type;
 elm = $(elm.id + '-tip-container');
 } else if ($(elm.id + '-reload') != null) {
 $(elm.id + '-reload').type = elm.type;
 elm = $(elm.id + '-reload');
 }

 advice = '<div class="validation-advice" id="advice-' + name + '-' + Validation.getElmID(elm) +'" style="display:none">' + errorMsg + '</div>'


 Validation.insertAdvice(elm, advice);
 advice = Validation.getAdvice(name, elm);
 if($(elm).hasClassName('absolute-advice')) {
 var dimensions = $(elm).getDimensions();
 var originalPosition = Position.cumulativeOffset(elm);

 advice._adviceTop = (originalPosition[1] + dimensions.height) + 'px';
 advice._adviceLeft = (originalPosition[0]) + 'px';
 advice._adviceWidth = (dimensions.width) + 'px';
 advice._adviceAbsolutize = true;
 }
 return advice;
 },
 getElmID : function(elm) {
 return elm.id ? elm.id : elm.name;
 },
 reset : function(elm) {
 elm = $(elm);
 var cn = $w(elm.className);
 cn.each(function(value) {
 var prop = '__advice'+value.camelize();
 if(elm[prop]) {
 var advice = Validation.getAdvice(value, elm);
 if (advice) {
 advice.hide();
 }
 elm[prop] = '';
 }
 elm.removeClassName('validation-failed');
 elm.removeClassName('validation-passed');
 if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') {
 var container = elm.up(Validation.defaultOptions.containerClassName);
 if (container) {
 container.removeClassName('validation-passed');
 container.removeClassName('validation-error');
 }
 }
 });
 },
 add : function(className, error, test, options) {
 var nv = {};
 nv[className] = new Validator(className, error, test, options);
 Object.extend(Validation.methods, nv);
 },
 addAllThese : function(validators) {
 var nv = {};
 $A(validators).each(function(value) {
 nv[value[0]] = new Validator(value[0], value[1], value[2], (value.length > 3 ? value[3] : {}));
 });
 Object.extend(Validation.methods, nv);
 },
 get : function(name) {
 return Validation.methods[name] ? Validation.methods[name] : Validation.methods['_LikeNoIDIEverSaw_'];
 },
 methods : {
 '_LikeNoIDIEverSaw_' : new Validator('_LikeNoIDIEverSaw_','',{})
 }
});

Validation.add('IsEmpty', '', function(v) {
 return (v == '' || (v == null) || (v.length == 0) || /^\s+$/.test(v)); // || /^\s+$/.test(v));
});

Validation.addAllThese([
 ['validate-select', 'Please select an option.', function(v) {
 return ((v != "none") && (v != null) && (v.length != 0));
 }],
 ['required-entry', 'This is a required field.', function(v) {
 return !Validation.get('IsEmpty').test(v);
 }],
 ['validate-nl-phone', 'Please enter a 10 digit phone number.', function(v) {
 return Validation.get('IsEmpty').test(v) || /^[\d]{10}$/.test(v);
 }],
 ['validate-fr-phone', 'Please enter a 10 digit phone number.', function(v) {
 return Validation.get('IsEmpty').test(v) || /^[\d]{10}$/.test(v);
 }],
 ['validate-number', 'Please enter a valid number in this field.', function(v) {
 return Validation.get('IsEmpty').test(v) || (!isNaN(parseNumber(v)) && !/^\s+$/.test(parseNumber(v)));
 }],
 ['validate-digits', 'Please use numbers only in this field. please avoid spaces or other characters such as dots or commas.', function(v) {
 return Validation.get('IsEmpty').test(v) || !/[^\d]/.test(v);
 }],
 ['validate-alpha', 'Please use letters only (a-z or A-Z) in this field.', function (v) {
 return Validation.get('IsEmpty').test(v) || /^[a-zA-Z]+$/.test(v)
 }],
 ['validate-code', 'Please use only letters (a-z), numbers (0-9) or underscore(_) in this field, first character should be a letter.', function (v) {
 return Validation.get('IsEmpty').test(v) || /^[a-z]+[a-z0-9_]+$/.test(v)
 }],
 ['validate-alphanum', 'Please use only letters (a-z or A-Z) or numbers (0-9) only in this field. No spaces or other characters are allowed.', function(v) {
 return Validation.get('IsEmpty').test(v) || /^[a-zA-Z0-9]+$/.test(v) /*!/\W/.test(v)*/
 }],
 ['validate-street', 'Please use only letters (a-z or A-Z) or numbers (0-9) or spaces and # only in this field.', function(v) {
 return Validation.get('IsEmpty').test(v) || /^[ \w]{3,}([A-Za-z]\.)?([ \w]*\#\d+)?(\r\n| )[ \w]{3,}/.test(v)
 }],
 ['validate-phoneStrict', 'Please enter a valid phone number. For example (123) 456-7890 or 123-456-7890.', function(v) {
 return Validation.get('IsEmpty').test(v) || /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/.test(v);
 }],
 ['validate-phoneLax', 'Please enter a valid phone number. For example (123) 456-7890 or 123-456-7890.', function(v) {
 return Validation.get('IsEmpty').test(v) || /^((\d[-. ]?)?((\(\d{3}\))|\d{3}))?[-. ]?\d{3}[-. ]?\d{4}$/.test(v);
 }],
 ['validate-fax', 'Please enter a valid fax number. For example (123) 456-7890 or 123-456-7890.', function(v) {
 return Validation.get('IsEmpty').test(v) || /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/.test(v);
 }],
 ['validate-date', 'Please enter a valid date.', function(v) {
 var test = new Date(v);
 return Validation.get('IsEmpty').test(v) || !isNaN(test);
 }],
 ['validate-email', 'Please enter a valid email address. For example johndoe@domain.com.', function (v) {
 //return Validation.get('IsEmpty').test(v) || /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v)
 //return Validation.get('IsEmpty').test(v) || /^[\!\#$%\*/?|\^\{\}`~&\'\+\-=_a-z0-9][\!\#$%\*/?|\^\{\}`~&\'\+\-=_a-z0-9\.]{1,30}[\!\#$%\*/?|\^\{\}`~&\'\+\-=_a-z0-9]@([a-z0-9_-]{1,30}\.){1,5}[a-z]{2,4}$/i.test(v)
 return Validation.get('IsEmpty').test(v) || /^[a-z0-9,!\#\$%&'\*\+/=\?\^_`\{\|}~-]+(\.[a-z0-9,!#\$%&'\*\+/=\?\^_`\{\|}~-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*\.([a-z]{2,})/i.test(v)
 }],
 ['validate-email-index', 'Please enter a valid email address.', function (v) {
 //return Validation.get('IsEmpty').test(v) || /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v)
 //return Validation.get('IsEmpty').test(v) || /^[\!\#$%\*/?|\^\{\}`~&\'\+\-=_a-z0-9][\!\#$%\*/?|\^\{\}`~&\'\+\-=_a-z0-9\.]{1,30}[\!\#$%\*/?|\^\{\}`~&\'\+\-=_a-z0-9]@([a-z0-9_-]{1,30}\.){1,5}[a-z]{2,4}$/i.test(v)
 return Validation.get('IsEmpty').test(v) || /^[a-z0-9,!\#\$%&'\*\+/=\?\^_`\{\|}~-]+(\.[a-z0-9,!#\$%&'\*\+/=\?\^_`\{\|}~-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*\.([a-z]{2,})/i.test(v)
 }],
 ['validate-emailSender', 'Please use only letters (a-z or A-Z), numbers (0-9) , underscore(_) or spaces in this field.', function (v) {
 return Validation.get('IsEmpty').test(v) || /^[a-zA-Z0-9_\s]+$/.test(v)
 }],
 ['validate-password', 'Please enter 6 or more characters. Leading or trailing spaces will be ignored.', function(v) {
 var pass=v.strip(); /*strip leading and trailing spaces*/
 return !(pass.length>0 && pass.length < 6);
 }],
 ['validate-admin-password', 'Please enter 7 or more characters. Password should contain both numeric and alphabetic characters.', function(v) {
 var pass=v.strip();
 if (0 == pass.length) {
 return true;
 }
 if (!(/[a-z]/i.test(v)) || !(/[0-9]/.test(v))) {
 return false;
 }
 return !(pass.length < 7);
 }],
 ['validate-cpassword', 'Please make sure your passwords match.', function(v) {
 if ($('password')) {
 var pass = $('password');
 }
 else {
 var pass = $$('.validate-password').length ? $$('.validate-password')[0] : $$('.validate-admin-password')[0];
 }
 var conf = $('confirmation') ? $('confirmation') : $$('.validate-cpassword')[0];
 return (pass.value == conf.value);
 }],
 ['validate-url', 'Please enter a valid URL. http:// is required', function (v) {
 return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(v)
 }],
 ['validate-clean-url', 'Please enter a valid URL. For example http://www.example.com or www.example.com', function (v) {
 return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(v) || /^(www)((\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(v)
 }],
 ['validate-identifier', 'Please enter a valid Identifier. For example example-page, example-page.html or anotherlevel/example-page', function (v) {
 return Validation.get('IsEmpty').test(v) || /^[A-Z0-9][A-Z0-9_\/-]+(\.[A-Z0-9_-]+)*$/i.test(v)
 }],
 ['validate-xml-identifier', 'Please enter a valid XML-identifier. For example something_1, block5, id-4', function (v) {
 return Validation.get('IsEmpty').test(v) || /^[A-Z][A-Z0-9_\/-]*$/i.test(v)
 }],
 ['validate-ssn', 'Please enter a valid social security number. For example 123-45-6789.', function(v) {
 return Validation.get('IsEmpty').test(v) || /^\d{3}-?\d{2}-?\d{4}$/.test(v);
 }],
 ['validate-zip', 'Please enter a valid zip code. For example 90602 or 90602-1234.', function(v) {
 return Validation.get('IsEmpty').test(v) || /(^\d{5}$)|(^\d{5}-\d{4}$)/.test(v);
 }],
 ['validate-zip-international', 'Please enter a valid zip code.', function(v) {
 //return Validation.get('IsEmpty').test(v) || /(^[A-z0-9]{2,10}([\s]{0,1}|[\-]{0,1})[A-z0-9]{2,10}$)/.test(v);
 return true;
 }],
 ['validate-phone-fr', 'Numéro de téléphone d\'au moins 10 chiffres.', function(v) {
 return Validation.get('IsEmpty').test(v) || /(^\d{10,}$)/.test(v);
 }], 
 ['validate-zip-fr', 'Code postal doit être de 5 chiffres.', function(v) {
 return Validation.get('IsEmpty').test(v) || /(^\d{5}$)/.test(v);
 }],
 ['validate-zip-nl', 'Vul een geldige postcode in. Bijv. 9080ab.', function(v) {
 return Validation.get('IsEmpty').test(v) || /(^\d{4}[a-zA-Z]{2}$)/.test(v);
 }],
 ['validate-zip-ch', 'Code postal doit être de 4 chiffres.', function(v) {
 return Validation.get('IsEmpty').test(v) || /(^\d{4}$)/.test(v);
 }],
 ['validate-zip-other', 'Please enter a valid zip code.', function(v) {
 return Validation.get('IsEmpty').test(v) || /(^[a-zA-Z0-9]{1}[a-zA-Z0-9\s]*[a-zA-Z0-9]{1}$)/.test(v);
 }],
 
 ['validate-zip-gb', 'Please enter a valid zip code.', function(v) {
 return Validation.get('IsEmpty').test(v) || /(^[a-zA-Z]{1}[a-zA-Z0-9]{2,3}\s[0-9]{1}[a-zA-Z0-9]{2}$)/.test(v);
 }],
 ['validate-date-au', 'Please use this date format: dd/mm/yyyy. For example 17/03/2006 for the 17th of March, 2006.', function(v) {
 if(Validation.get('IsEmpty').test(v)) return true;
 var regex = /^(\d{2})\/(\d{2})\/(\d{4})$/;
 if(!regex.test(v)) return false;
 var d = new Date(v.replace(regex, '$2/$1/$3'));
 return ( parseInt(RegExp.$2, 10) == (1+d.getMonth()) ) &&
 (parseInt(RegExp.$1, 10) == d.getDate()) &&
 (parseInt(RegExp.$3, 10) == d.getFullYear() );
 }],
 ['validate-currency-dollar', 'Please enter a valid $ amount. For example $100.00.', function(v) {
 // [$]1[##][,###]+[.##]
 // [$]1###+[.##]
 // [$]0.##
 // [$].##
 return Validation.get('IsEmpty').test(v) || /^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/.test(v)
 }],
 ['validate-one-required', 'Please select one of the above options.', function (v,elm) {
 var p = elm.parentNode;
 var options = p.getElementsByTagName('INPUT');
 return $A(options).any(function(elm) {
 return $F(elm);
 });
 }],
 ['validate-one-required-by-name', 'Please select one of the options.', function (v,elm) {
 var inputs = $$('input[name="' + elm.name.replace(/([\\"])/g, '\\$1') + '"]');
 
 var error = 1;
 for(var i=0;i<inputs.length;i++) {
 if((inputs[i].type == 'checkbox' || inputs[i].type == 'radio') && inputs[i].checked == true) {
 error = 0;
 }
 
 if(Validation.isOnChange && (inputs[i].type == 'checkbox' || inputs[i].type == 'radio')) {
 Validation.reset(inputs[i]);
 }
 }

 if( error == 0 ) {
 return true;
 } else {
 return false;
 }
 }],
 ['validate-not-negative-number', 'Please enter a valid number in this field.', function(v) {
 v = parseNumber(v);
 return (!isNaN(v) && v>=0);
 }],
 ['validate-state', 'Please select State/Province.', function(v) {
 return (v!=0 || v == '');
 }],

 ['validate-new-password', 'Please enter 6 or more characters. Leading or trailing spaces will be ignored.', function(v) {
 if (!Validation.get('validate-password').test(v)) return false;
 if (Validation.get('IsEmpty').test(v) && v != '') return false;
 return true;
 }],
 ['validate-greater-than-zero', 'Please enter a number greater than 0 in this field.', function(v) {
 if(v.length)
 return parseFloat(v) > 0;
 else
 return true;
 }],
 ['validate-zero-or-greater', 'Please enter a number 0 or greater in this field.', function(v) {
 if(v.length)
 return parseFloat(v) >= 0;
 else
 return true;
 }],
 ['validate-cc-number', 'Please enter a valid credit card number.', function(v, elm) {
 // remove non-numerics
 var ccTypeContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_number')) + '_cc_type');
 if (ccTypeContainer && typeof Validation.creditCartTypes.get(ccTypeContainer.value) != 'undefined'
 && Validation.creditCartTypes.get(ccTypeContainer.value)[2] == false) {
 if (!Validation.get('IsEmpty').test(v) && Validation.get('validate-digits').test(v)) {
 return true;
 } else {
 return false;
 }
 }
 return validateCreditCard(v);
 }],
 ['validate-cc-type', 'Credit card number doesn\'t match credit card type', function(v, elm) {
 // remove credit card number delimiters such as "-" and space
 elm.value = removeDelimiters(elm.value);
 v = removeDelimiters(v);

 var ccTypeContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_number')) + '_cc_type');
 if (!ccTypeContainer) {
 return true;
 }
 var ccType = ccTypeContainer.value;

 if (typeof Validation.creditCartTypes.get(ccType) == 'undefined') {
 return false;
 }

 // Other card type or switch or solo card
 if (Validation.creditCartTypes.get(ccType)[0]==false) {
 return true;
 }

 // Matched credit card type
 var ccMatchedType = '';

 Validation.creditCartTypes.each(function (pair) {
 if (pair.value[0] && v.match(pair.value[0])) {
 ccMatchedType = pair.key;
 throw $break;
 }
 });

 if(ccMatchedType != ccType) {
 return false;
 }
 
 if (ccTypeContainer.hasClassName('validation-failed') && Validation.isOnChange) {
 Validation.validate(ccTypeContainer);
 }

 return true;
 }],
 ['validate-cc-type-select', 'Card type doesn\'t match credit card number', function(v, elm) {
 var ccNumberContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_type')) + '_cc_number');
 if (Validation.isOnChange && Validation.get('IsEmpty').test(ccNumberContainer.value)) {
 return true;
 }
 if (Validation.get('validate-cc-type').test(ccNumberContainer.value, ccNumberContainer)) {
 Validation.validate(ccNumberContainer);
 }
 return Validation.get('validate-cc-type').test(ccNumberContainer.value, ccNumberContainer);
 }],
 ['validate-cc-exp', 'Incorrect credit card expiration date', function(v, elm) {
 var ccExpMonth = v;
 var ccExpYear = $('ccsave_expiration_yr').value;
 var currentTime = new Date();
 var currentMonth = currentTime.getMonth() + 1;
 var currentYear = currentTime.getFullYear();
 if (ccExpMonth < currentMonth && ccExpYear == currentYear) {
 return false;
 }
 return true;
 }],
 ['validate-cc-cvn', 'Please enter a valid credit card verification number.', function(v, elm) {
 var ccTypeContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_cid')) + '_cc_type');
 if (!ccTypeContainer) {
 return true;
 }
 var ccType = ccTypeContainer.value;

 if (typeof Validation.creditCartTypes.get(ccType) == 'undefined') {
 return false;
 }

 var re = Validation.creditCartTypes.get(ccType)[1];

 if (v.match(re)) {
 return true;
 }

 return false;
 }],
 ['validate-ajax', '', function(v, elm) { return true; }],
 ['validate-data', 'Please use only letters (a-z or A-Z), numbers (0-9) or underscore(_) in this field, first character should be a letter.', function (v) {
 if(v != '' && v) {
 return /^[A-Za-z]+[A-Za-z0-9_]+$/.test(v);
 }
 return true;
 }],
 ['validate-css-length', 'Please input a valid CSS-length. For example 100px or 77pt or 20em or .5ex or 50%', function (v) {
 if (v != '' && v) {
 return /^[0-9\.]+(px|pt|em|ex|%)?$/.test(v) && (!(/\..*\./.test(v))) && !(/\.$/.test(v));
 }
 return true;
 }],
 ['validate-length', 'Maximum length exceeded.', function (v, elm) {
 var re = new RegExp(/^maximum-length-[0-9]+$/);
 var result = true;
 $w(elm.className).each(function(name, index) {
 if (name.match(re) && result) {
 var length = name.split('-')[2];
 result = (v.length <= length);
 }
 });
 return result;
 }]
]);


// Credit Card Validation Javascript
// copyright 12th May 2003, by Stephen Chapman, Felgall Pty Ltd

// You have permission to copy and use this javascript provided that
// the content of the script is not changed in any way.

function validateCreditCard(s) {
 // remove non-numerics
 var v = "0123456789";
 var w = "";
 for (i=0; i < s.length; i++) {
 x = s.charAt(i);
 if (v.indexOf(x,0) != -1)
 w += x;
 }
 // validate number
 j = w.length / 2;
 k = Math.floor(j);
 m = Math.ceil(j) - k;
 c = 0;
 for (i=0; i<k; i++) {
 a = w.charAt(i*2+m) * 2;
 c += a > 9 ? Math.floor(a/10 + a%10) : a;
 }
 for (i=0; i<k+m; i++) c += w.charAt(i*2+1-m) * 1;
 return (c%10 == 0);
}

function removeDelimiters (v) {
 v = v.replace(/\s/g, '');
 v = v.replace(/\-/g, '');
 return v;
}

function parseNumber(v)
{
 if (typeof v != 'string') {
 return parseFloat(v);
 }

 var isDot = v.indexOf('.');
 var isComa = v.indexOf(',');

 if (isDot != -1 && isComa != -1) {
 if (isComa > isDot) {
 v = v.replace('.', '').replace(',', '.');
 }
 else {
 v = v.replace(',', '');
 }
 }
 else if (isComa != -1) {
 v = v.replace(',', '.');
 }

 return parseFloat(v);
}

/**
 * Hash with credit card types wich can be simply extended in payment modules
 * 0 - regexp for card number
 * 1 - regexp for cvn
 * 2 - check or not credit card number trough Luhn algorithm by
 * function validateCreditCard wich you can find above in this file
 */
Validation.creditCartTypes = $H({
 'VI': [new RegExp('^4[0-9]{12}([0-9]{3})?$'), new RegExp('^[0-9]{3}$'), true],
 'MC': [new RegExp('^5[1-5][0-9]{14}$'), new RegExp('^[0-9]{3}$'), true],
 'AE': [new RegExp('^3[47][0-9]{13}$'), new RegExp('^[0-9]{4}$'), true],
 'DI': [new RegExp('^6011[0-9]{12}$'), new RegExp('^[0-9]{3}$'), true],
 'SS': [new RegExp('^((6759[0-9]{12})|(49[013][1356][0-9]{13})|(633[34][0-9]{12})|(633110[0-9]{10})|(564182[0-9]{10}))([0-9]{2,3})?$'), new RegExp('^([0-9]{3}|[0-9]{4})?$'), true],
 'OT': [false, new RegExp('^([0-9]{3}|[0-9]{4})?$'), false]
});

/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
 * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
 */
function toggleMenu(el, over, where)
{
 if(!where){
 where='top';
 }
 if (over) {
 Element.addClassName(el, 'over');
 if(JSExt.$(el).attr("class") == 'level0 nav-index parent over'){
 Element.addClassName(el, 'over-index');
 }else{
 if(where == 'top'){
 var navIndexOffset=JSExt.$('#nav').children('li').eq(0).offset();
// JSExt.$(el).prepend("<div style='background:#fff; width:114px; height:2px; position:absolute; left:2px; top:27px; z-index:1000;' class='mc_menu_sty_re' id='mc_menu_sty_re'></div>");
 var offset=JSExt.$(el).offset();
 var realLeft=(navIndexOffset.left-offset.left)+'px';
 JSExt.$(el).children('a').addClass('topselect');
 JSExt.$(el).children('div.nav-brand').css('left',realLeft);
 var brand=JSExt.$(el).children('div.nav-brand');
 var middHeight=brand.children('div.nav_top_brand_midd').height();
 var linkHeight=brand.children('div.top_nav_links').height();
 if(middHeight>linkHeight&&!JSExt.$(el).hasClass('nav-nouveaute')){
 brand.children('div.top_nav_links').height(middHeight);
 }
 if(JSExt.$(el).hasClass('nav-nouveaute')){
 var barndHeight=brand.children('div.nav_top_brand').height();
 brand.children('div.top_nav_links').height(barndHeight);
 brand.children('div.nav_top_brand_midd').height(barndHeight);
 }
 //JSExt.$(el).children('div.nav-brand').removeClass("hide");
// JSExt.$("#mc_menu_sty_re").mouseover(function(){
// JSExt.$(el).find("ul").removeClass("hide");
// JSExt.$("#mc_menu_sty_re").attr("ishover","ishover");
// });
 }
 };
 if(JSExt.$(el).attr("class") == 'level0 nav-marques parent over'){
 Element.addClassName(el, 'over-marques');
 };
 }
 else {
 Element.removeClassName(el, 'over');
 if(JSExt.$(el).attr("class") == 'level0 nav-index parent over-index'){
 Element.removeClassName(el, 'over-index');
 }else{
 if(where == 'top'){
// if(JSExt.$("#mc_menu_sty_re").attr("ishover") != "ishover"){
// JSExt.$(el).children().remove(".mc_menu_sty_re");
// }
 JSExt.$(el).children('a').removeClass('topselect');
 JSExt.$(el).children('div.nav-brand').css('left','-10000px');
 }
 };
 if(JSExt.$(el).attr("class") == 'level0 nav-marques parent over-marques'){
 Element.removeClassName(el, 'over-marques');
 };
 }
}

/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
 * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
 */
// old school cookie functions grabbed off the web

if (!window.Mage) var Mage = {};

Mage.Cookies = {};
Mage.Cookies.set = function(name, value){
 var argv = arguments;
 var argc = arguments.length;
 var expires = (argc > 2) ? argv[2] : null;
 var path = (argc > 3) ? argv[3] : '/';
 var domain = (argc > 4) ? argv[4] : null;
 var secure = (argc > 5) ? argv[5] : false;
 document.cookie = name + "=" + escape (value) +
 ((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
 ((path == null) ? "" : ("; path=" + path)) +
 ((domain == null) ? "" : ("; domain=" + domain)) +
 ((secure == true) ? "; secure" : "");
};

Mage.Cookies.get = function(name){
 var arg = name + "=";
 var alen = arg.length;
 var clen = document.cookie.length;
 var i = 0;
 var j = 0;
 while(i < clen){
 j = i + alen;
 if (document.cookie.substring(i, j) == arg)
 return Mage.Cookies.getCookieVal(j);
 i = document.cookie.indexOf(" ", i) + 1;
 if(i == 0)
 break;
 }
 return null;
};

Mage.Cookies.clear = function(name) {
 if(Mage.Cookies.get(name)){
 document.cookie = name + "=" +
 "; expires=Thu, 01-Jan-70 00:00:01 GMT";
 }
};

Mage.Cookies.getCookieVal = function(offset){
 var endstr = document.cookie.indexOf(";", offset);
 if(endstr == -1){
 endstr = document.cookie.length;
 }
 return unescape(document.cookie.substring(offset, endstr));
};
/*淘宝延时加载库*/
(function(f,c,d){var h={mix:function(n,m,l,q){if(!m||!n){return n}if(l===d){l=true}var k,o,j;if(q&&(j=q.length)){for(k=0;k<j;k++){o=q[k];if(o in m){e(o,n,m,l)}}}else{for(o in m){e(o,n,m,l)}}return n}},e=function(l,k,j,i){if(i||!(l in k)){k[l]=j[l]}},a=(f&&f[c])||{},b=0,g="";f=a.__HOST||(a.__HOST=f||{});c=f[c]=h.mix(a,h,false);c.mix(c,{__APP_MEMBERS:["namespace"],__APP_INIT_METHODS:["__init"],version:"1.1.6",merge:function(){var m={},k,j=arguments.length;for(k=0;k<j;k++){c.mix(m,arguments[k])}return m},augment:function(){var k=arguments,j=k.length-2,n=k[0],m=k[j],o=k[j+1],l=1;if(!c.isArray(o)){m=o;o=d;j++}if(!c.isBoolean(m)){m=d;j++}for(;l<j;l++){c.mix(n.prototype,k[l].prototype||k[l],m,o)}return n},extend:function(m,l,j,o){if(!l||!m){return m}var i=Object.create?function(p,q){return Object.create(p,{constructor:{value:q}})}:function(q,s){function p(){}p.prototype=q;var r=new p();r.constructor=s;return r},n=l.prototype,k;m.prototype=k=i(n,m);m.superclass=i(n,l);if(j){c.mix(k,j)}if(o){c.mix(m,o)}return m},__init:function(){this.Config=this.Config||{};this.Env=this.Env||{};this.Config.debug=""},namespace:function(){var n=arguments,k=n.length,t=null,q,m,s,r=(n[k-1]===true&&k--);for(q=0;q<k;q++){s=(g+n[q]).split(".");t=r?f:this;for(m=(f[s[0]]===t)?1:0;m<s.length;++m){t=t[s[m]]=t[s[m]]||{}}}return t},app:function(k,o){var m=c.isString(k),n=m?f[k]||{}:k,l=0,j=c.__APP_INIT_METHODS.length;c.mix(n,this,true,c.__APP_MEMBERS);for(;l<j;l++){c[c.__APP_INIT_METHODS[l]].call(n)}c.mix(n,c.isFunction(o)?o():o);m&&(f[k]=n);return n},log:function(k,i,j){if(c.Config.debug){if(j){k=j+": "+k}if(f.console!==d&&console.log){console[i&&console[i]?i:"log"](k)}}},error:function(i){if(c.Config.debug){throw i}},guid:function(i){return(i||g)+b++}});c.__init();return c})(this,"KISSY");(function(f,e){var k=f.__HOST,b=Object.prototype.toString,h=Array.prototype.indexOf,j=Array.prototype.lastIndexOf,a=Array.prototype.filter,d=String.prototype.trim,c="",g=/^\s+|\s+$/g,i={};f.mix(f,{type:function(l){return l==null?String(l):i[b.call(l)]||"object"},isNull:function(l){return l===null},isUndefined:function(l){return l===e},isEmptyObject:function(m){for(var l in m){return false}return true},isPlainObject:function(l){return l&&b.call(l)==="[object Object]"&&"isPrototypeOf" in l},clone:function(p){var n=p,l,m;if(p&&((l=f.isArray(p))||f.isPlainObject(p))){n=l?[]:{};for(m in p){if(p.hasOwnProperty(m)){n[m]=f.clone(p[m])}}}return n},trim:d?function(l){return(l==e)?c:d.call(l)}:function(l){return(l==e)?c:l.toString().replace(g,c)},substitute:function(n,m,l){if(!f.isString(n)||!f.isPlainObject(m)){return n}return n.replace(l||/\\?\{([^{}]+)\}/g,function(p,o){if(p.charAt(0)==="\\"){return p.slice(1)}return(m[o]!==e)?m[o]:c})},each:function(m,q,p){var o,s,n=0,r=m.length,l=r===e||f.type(m)==="function";p=p||k;if(l){for(o in m){if(q.call(p,m[o],o,m)===false){break}}}else{for(s=m[0];n<r&&q.call(p,s,n,m)!==false;s=m[++n]){}}return m},indexOf:h?function(m,l){return h.call(l,m)}:function(o,m){for(var n=0,l=m.length;n<l;++n){if(m[n]===o){return n}}return -1},lastIndexOf:(j)?function(m,l){return j.call(l,m)}:function(n,l){for(var m=l.length-1;m>=0;m--){if(l[m]===n){break}}return m},unique:function(m,p){if(p){m.reverse()}var l=m.slice(),o=0,r,q;while(o<l.length){q=l[o];while((r=f.lastIndexOf(q,l))!==o){l.splice(r,1)}o+=1}if(p){l.reverse()}return l},inArray:function(m,l){return f.indexOf(m,l)>-1},filter:a?function(l,n,m){return a.call(l,n,m)}:function(l,o,n){var m=[];f.each(l,function(r,q,p){if(o.call(n,r,q,p)){m.push(r)}});return m},now:function(){return new Date().getTime()}});f.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(l,m){i["[object "+l+"]"]=(m=l.toLowerCase());f["is"+l]=function(n){return f.type(n)==m}})})(KISSY);(function(d,a){var c=d.__HOST,s=c.document,p=s.documentElement,t="",l="&",g=encodeURIComponent("[]"),k=false,h=[],q=false,f=500,j=40,i=/^#?([\w-]+)$/,n=/^(\w+)\[\]$/,m=/\S/;d.mix(d,{isWindow:function(e){return d.type(e)==="object"&&"setInterval" in e},makeArray:function(e){if(e===null||e===a){return[]}if(d.isArray(e)){return e}if(typeof e.length!=="number"||d.isString(e)||d.isFunction(e)){return[e]}return b(e)},param:function(z,v){if(!d.isPlainObject(z)){return t}v=v||l;var u=[],x,y;for(x in z){y=z[x];x=encodeURIComponent(x);if(r(y)){u.push(x,"=",encodeURIComponent(y+t),v)}else{if(d.isArray(y)&&y.length){for(var w=0,e=y.length;w<e;++w){if(r(y[w])){u.push(x,g+"=",encodeURIComponent(y[w]+t),v)}}}}}u.pop();return u.join(t)},unparam:function(B,D){if(typeof B!=="string"||(B=d.trim(B)).length===0){return{}}var z={},e=B.split(D||l),w,C,u,v,x=0,y=e.length;for(;x<y;++x){w=e[x].split("=");C=decodeURIComponent(w[0]);try{u=decodeURIComponent(w[1]||t)}catch(A){u=w[1]||t}if((v=C.match(n))&&v[1]){z[v[1]]=z[v[1]]||[];z[v[1]].push(u)}else{z[C]=u}}return z},globalEval:function(v){if(v&&m.test(v)){var u=s.getElementsByTagName("head")[0]||p,e=s.createElement("script");e.text=v;u.insertBefore(e,u.firstChild);u.removeChild(e)}},later:function(B,A,x,u,w){A=A||0;u=u||{};var v=B,z=d.makeArray(w),y,e;if(d.isString(B)){v=u[B]}if(!v){d.error("method undefined")}y=function(){v.apply(u,z)};e=(x)?setInterval(y,A):setTimeout(y,A);return{id:e,interval:x,cancel:function(){if(this.interval){clearInterval(e)}else{clearTimeout(e)}}}},ready:function(e){if(!q){this._bindReady()}if(k){e.call(c,this)}else{h.push(e)}return this},_bindReady:function(){var D=this,y=s.documentElement.doScroll,u=y?"onreadystatechange":"DOMContentLoaded",B="complete",v=function(){D._fireReady()};q=true;if(s.readyState===B){return v()}if(s.addEventListener){function x(){s.removeEventListener(u,x,false);v()}s.addEventListener(u,x,false);c.addEventListener("load",v,false)}else{function A(){if(s.readyState===B){s.detachEvent(u,A);v()}}s.attachEvent(u,A);c.attachEvent("onload",v);var w=false;try{w=c.frameElement==null}catch(C){}if(y&&w){function z(){try{y("left");v()}catch(e){setTimeout(z,1)}}z()}}},_fireReady:function(){if(k){return}k=true;if(h){var u,e=0;while(u=h[e++]){u.call(c,this)}h=null}},available:function(w,e){w=(w+t).match(i)[1];if(!w||!d.isFunction(e)){return}var u=1,v=d.later(function(){if(s.getElementById(w)&&(e()||1)||++u>f){v.cancel()}},j,true)}});function r(u){var e=typeof u;return u===null||(e!=="object"&&e!=="function")}function b(e){return Array.prototype.slice.call(e)}try{b(p.childNodes)}catch(o){b=function(e){for(var u=[],v=e.length-1;v>=0;v--){u[v]=e[v]}return u}}if(location&&(location.search||t).indexOf("ks-debug")!==-1){d.Config.debug=true}})(KISSY);(function(f,b){var e=f.__HOST,q=e.document,h=q.getElementsByTagName("head")[0]||q.documentElement,r="",m="cssfullpath",p=1,g=2,i=3,d=4,k=f.mix,n=q.createElement("script").readyState?function(t,u){var s=t.onreadystatechange;t.onreadystatechange=function(){var v=t.readyState;if(v==="loaded"||v==="complete"){t.onreadystatechange=null;s&&s();u.call(this)}}}:function(s,t){s.addEventListener("load",t,false)},c=/\.css(?:\?|$)/i,j;j={add:function(v,x,u){var t=this,y=t.Env.mods,w,z,s;if(f.isString(v)&&!u&&f.isPlainObject(x)){z={};z[v]=x;v=z}if(f.isPlainObject(v)){f.each(v,function(B,A){B.name=A;if(y[A]){k(B,y[A],false)}});k(y,v)}else{u=u||{};w=y[v]||{};v=u.host||w.host||v;w=y[v]||{};k(w,{name:v,status:g});if(!w.fns){w.fns=[]}x&&w.fns.push(x);s=w.requires;k((y[v]=w),u);y[v]["requires"]=s;if((w.attach!==false)&&t.__isAttached(w.requires)){t.__attachMod(w)}}return t},use:function(z,A,v){z=z.replace(/\s+/g,r).split(",");v=v||{};var C=this,B=C.Env.mods,u=(v||0).global,w,x=z.length,y,t,s;if(u){C.__mixMods(u)}if(C.__isAttached(z)){A&&A(C);return}for(w=0;w<x&&(y=B[z[w]]);w++){if(y.status===d){continue}if(v.order&&w>0){if(!y.requires){y.requires=[]}y._requires=y.requires.concat();t=z[w-1];if(!f.inArray(t,y.requires)&&!(f.inArray(y.name,B[t].requires||[]))){y.requires.push(t)}}C.__attach(y,function(){if(y._requires){y.requires=y._requires;delete y._requires}if(!s&&C.__isAttached(z)){s=true;A&&A(C)}},u)}return C},__attach:function(v,z,y){var t=this,x=v.requires||[],u=0,s=x.length;for(;u<s;u++){t.__attach(t.Env.mods[x[u]],w,y)}t.__buildPath(v);t.__load(v,w,y);function w(){var A=v.requires||[];if(t.__isAttached(A)){if(v.status===g){t.__attachMod(v)}if(v.status===d){z()}}}},__mixMods:function(v){var u=this.Env.mods,t=v.Env.mods,s;for(s in t){this.__mixMod(u,t,s,v)}},__mixMod:function(x,v,t,w){var u=x[t]||{},s=u.status;f.mix(u,f.clone(v[t]));if(s){u.status=s}if(w){this.__buildPath(u,w.Config.base)}x[t]=u},__attachMod:function(t){var s=this;if(t.fns){f.each(t.fns,function(u){u&&u(s)});t.fns=b}t.status=d},__isAttached:function(s){var v=this.Env.mods,u,t=(s=f.makeArray(s)).length-1;for(;t>=0&&(u=v[s[t]]);t--){if(u.status!==d){return false}}return true},__load:function(x,z,t){var B=this,s=x.fullpath,A=f.Env._loadQueue,u=A[s],w;x.status=x.status||0;if(x.status<p&&u){x.status=u.nodeName?p:g}if(f.isString(x[m])){B.getScript(x[m]);x[m]=g}if(x.status<p&&s){x.status=p;w=B.getScript(s,{success:function(){KISSY.log(x.name+" is loaded.","info");y()},error:function(){x.status=i;v()},charset:x.charset});if(!c.test(s)){A[s]=w}}else{if(x.status===p){n(u,y)}else{z()}}function y(){v();if(x.status!==i){if(t){B.__mixMod(B.Env.mods,t.Env.mods,x.name,t)}if(x.status!==d){x.status=g}z()}}function v(){A[s]=g}},__buildPath:function(t,u){var s=this.Config;v("path","fullpath");if(t[m]!==g){v("csspath",m)}function v(x,w){if(!t[w]&&t[x]){t[w]=(u||s.base)+t[x]}if(t[w]&&s.debug){t[w]=t[w].replace(/-min/g,"")}}},getScript:function(s,z,w){var A=c.test(s),v=q.createElement(A?"link":"script"),u=z,x,y,t;if(f.isPlainObject(u)){z=u.success;x=u.error;y=u.timeout;w=u.charset}if(A){v.href=s;v.rel="stylesheet"}else{v.src=s;v.async=true}if(w){v.charset=w}if(A){f.isFunction(z)&&z.call(v)}else{n(v,function(){if(t){t.cancel();t=b}f.isFunction(z)&&z.call(v);if(h&&v.parentNode){h.removeChild(v)}})}if(f.isFunction(x)){t=f.later(function(){t=b;x()},(y||this.Config.timeout)*1000)}h.insertBefore(v,h.firstChild);return v}};k(f,j);var a=/^(.*)(seed|kissy)(-min)?\.js[^/]*/i,l=/(seed|kissy)(-min)?\.js/;function o(B){var s=B.src,y=B.getAttribute("data-combo-prefix")||"??",C=B.getAttribute("data-combo-sep")||",",w=s.split(C),t,v=w[0],A=v.indexOf(y);if(A==-1){t=s.replace(a,"$1")}else{t=v.substring(0,A);var z=v.substring(A+2,v.length);if(z.match(l)){t+=z.replace(a,"$1")}else{for(var x=1;x<w.length;x++){var u=w[x];if(u.match(l)){t+=u.replace(a,"$1");break}}}}return t}f.__initLoader=function(){var s=q.getElementsByTagName("script"),t=s[s.length-1],u=o(t);this.Env.mods={};this.Env._loadQueue={};if(!this.Config.base){this.Config.base=u}if(!this.Config.timeout){this.Config.timeout=10}};f.__initLoader();f.each(j,function(t,s){f.__APP_MEMBERS.push(s)});f.__APP_INIT_METHODS.push("__initLoader")})(KISSY);(function(a){var b={core:{path:"packages/core-min.js",charset:"utf-8"}};a.each(["sizzle","dd","datalazyload","flash","switchable","suggest","calendar","uibase","overlay","imagezoom"],function(c){b[c]={path:c+"/"+c+"-pkg-min.js",requires:["core"],charset:"utf-8"}});b.calendar.csspath="calendar/default-min.css";b.overlay.requires=["uibase"];a.add(b)})(KISSY);KISSY.add("ua",function(h){var b=navigator.userAgent,d="",a="mobile",f=d,i=d,g,c={},e=function(j){var k=0;return parseFloat(j.replace(/\./g,function(){return(k++===0)?".":""}))};if((g=b.match(/AppleWebKit\/([\d.]*)/))&&g[1]){c[f="webkit"]=e(g[1]);if((g=b.match(/Chrome\/([\d.]*)/))&&g[1]){c[i="chrome"]=e(g[1])}else{if((g=b.match(/\/([\d.]*) Safari/))&&g[1]){c[i="safari"]=e(g[1])}}if(/ Mobile\//.test(b)){c[a]="apple"}else{if((g=b.match(/NokiaN[^\/]*|Android \d\.\d|webOS\/\d\.\d/))){c[a]=g[0].toLowerCase()}}}else{if((g=b.match(/Presto\/([\d.]*)/))&&g[1]){c[f="presto"]=e(g[1]);if((g=b.match(/Opera\/([\d.]*)/))&&g[1]){c[i="opera"]=e(g[1]);if((g=b.match(/Opera\/.* Version\/([\d.]*)/))&&g[1]){c[i]=e(g[1])}if((g=b.match(/Opera Mini[^;]*/))&&g){c[a]=g[0].toLowerCase()}else{if((g=b.match(/Opera Mobi[^;]*/))&&g){c[a]=g[0]}}}}else{if((g=b.match(/MSIE\s([^;]*)/))&&g[1]){c[f="trident"]=0.1;c[i="ie"]=e(g[1]);if((g=b.match(/Trident\/([\d.]*)/))&&g[1]){c[f]=e(g[1])}}else{if((g=b.match(/Gecko/))){c[f="gecko"]=0.1;if((g=b.match(/rv:([\d.]*)/))&&g[1]){c[f]=e(g[1])}if((g=b.match(/Firefox\/([\d.]*)/))&&g[1]){c[i="firefox"]=e(g[1])}}}}}c.core=f;c.shell=i;c._numberify=e;h.UA=c});KISSY.add("ua-extra",function(e){var h=e.UA,a=navigator.userAgent,d,g,f,b={},c=h._numberify;if(d=a.match(/360SE/)){b[f="se360"]=3}else{if((d=a.match(/Maxthon/))&&(g=window.external)){f="maxthon";try{b[f]=c(g.max_version)}catch(i){b[f]=0.1}}else{if(d=a.match(/TencentTraveler\s([\d.]*)/)){b[f="tt"]=d[1]?c(d[1]):0.1}else{if(d=a.match(/TheWorld/)){b[f="theworld"]=3}else{if(d=a.match(/SE\s([\d.]*)/)){b[f="sougou"]=d[1]?c(d[1]):0.1}}}}}f&&(b.shell=f);e.mix(h,b)});KISSY.add("dom",function(a,c){a.DOM={_isElementNode:function(d){return b(d,1)},_isKSNode:function(d){return a.Node&&b(d,a.Node.TYPE)},_getWin:function(d){return(d&&("scrollTo" in d)&&d.document)?d:b(d,9)?d.defaultView||d.parentWindow:d===c?window:false},_nodeTypeIs:b};function b(d,e){return d&&d.nodeType===e}});KISSY.add("selector",function(g,e){var n=document,p=g.DOM,l=" ",d="*",h="getDOMNode",i=h+"s",q=/^#[\w-]+$/,c=/^(?:#([\w-]+))?\s*([\w-]+|\*)?\.?([\w-]+)?$/;function k(s,y){var w,x,v=[],z,r,u;y=m(y);if(g.isString(s)){s=g.trim(s);if(q.test(s)){x=a(s.slice(1),y);if(x){v=[x]}}else{if((w=c.exec(s))){z=w[1];r=w[2];u=w[3];if((y=z?a(z,y):y)){if(u){if(!z||s.indexOf(l)!==-1){v=o(u,r,y)}else{x=a(z,y);if(x&&p.hasClass(x,u)){v=[x]}}}else{if(r){v=f(r,y)}}}}else{if(g.ExternalSelector){return g.ExternalSelector(s,y)}else{j(s)}}}}else{if(s&&(s[h]||s[i])){v=s[h]?[s[h]()]:s[i]()}else{if(s&&(g.isArray(s)||b(s))){v=s}else{if(s){v=[s]}}}}if(b(v)){v=g.makeArray(v)}v.each=function(A,t){return g.each(v,A,t)};return v}function b(r){return r&&!r.nodeType&&r.item&&(r!=window)}function m(r){if(r===e){r=n}else{if(g.isString(r)&&q.test(r)){r=a(r.slice(1),n)}else{if(r&&r.nodeType!==1&&r.nodeType!==9){r=null}}}return r}function a(s,r){if(r.nodeType!==9){r=r.ownerDocument}return r.getElementById(s)}function f(r,s){return s.getElementsByTagName(r)}(function(){var r=n.createElement("div");r.appendChild(n.createComment(""));if(r.getElementsByTagName(d).length>0){f=function(s,y){var v=y.getElementsByTagName(s);if(s===d){var x=[],w=0,u=0,z;while((z=v[w++])){if(z.nodeType===1){x[u++]=z}}v=x}return v}}})();function o(y,z,r){var t=r.getElementsByClassName(y),x=t,v=0,u=0,w=t.length,s;if(z&&z!==d){x=[];z=z.toUpperCase();for(;v<w;++v){s=t[v];if(s.tagName===z){x[u++]=s}}}return x}if(!n.getElementsByClassName){if(n.querySelectorAll){o=function(s,r,t){return t.querySelectorAll((r?r:"")+"."+s)}}else{o=function(A,B,r){var u=r.getElementsByTagName(B||d),y=[],w=0,v=0,x=u.length,s,z;A=l+A+l;for(;w<x;++w){s=u[w];z=s.className;if(z&&(l+z+l).indexOf(A)>-1){y[v++]=s}}return y}}}function j(r){g.error("Unsupported selector: "+r)}g.query=k;g.get=function(r,s){return k(r,s)[0]||null};g.mix(p,{query:k,get:g.get,filter:function(s,x){var u=k(s),w,r,t,v=[];if(g.isString(x)&&(w=c.exec(x))&&!w[1]){r=w[2];t=w[3];x=function(y){return !((r&&y.tagName!==r.toUpperCase())||(t&&!p.hasClass(y,t)))}}if(g.isFunction(x)){v=g.filter(u,x)}else{if(x&&g.ExternalSelector){v=g.ExternalSelector._filter(s,x+"")}else{j(x)}}return v},test:function(r,t){var s=k(r);return s.length&&(p.filter(s,t).length===s.length)}})});KISSY.add("dom-data",function(c,a){var e=window,i=c.DOM,h="_ks_data_"+c.now(),b={},d={},g={EMBED:1,OBJECT:1,APPLET:1};c.mix(i,{data:function(n,l,p){if(c.isPlainObject(l)){for(var o in l){i.data(n,o,l[o])}return}if(p===a){var m=c.get(n),r,j,s,q;if(!m||g[m.nodeName]){return}if(m==e){m=d}r=f(m);j=r?b:m;s=r?m[h]:h;q=j[s];if(c.isString(l)&&q){return q[l]}return q}else{c.query(n).each(function(u){if(!u||g[u.nodeName]){return}if(u==e){u=d}var k=b,t;if(!f(u)){t=h;k=u}else{if(!(t=u[h])){t=u[h]=c.guid()}}if(l&&p!==a){if(!k[t]){k[t]={}}k[t][l]=p}})}},removeData:function(j,k){c.query(j).each(function(o){if(!o){return}if(o==e){o=d}var n,l=b,q,p=f(o);if(!p){l=o;n=h}else{n=o[h]}if(!n){return}q=l[n];if(k){if(q){delete q[k];if(c.isEmptyObject(q)){i.removeData(o)}}}else{if(!p){try{delete o[h]}catch(m){}}else{if(o.removeAttribute){o.removeAttribute(h)}}if(p){delete l[n]}}})}});function f(j){return j&&j.nodeType}});KISSY.add("dom-class",function(b,f){var e=" ",c=b.DOM,d=/[\.\s]\s*\.?/,g=/[\n\t]/g;b.mix(c,{hasClass:function(h,i){return a(h,i,function(p,q,k){var n=p.className;if(n){var o=e+n+e,m=0,l=true;for(;m<k;m++){if(o.indexOf(e+q[m]+e)<0){l=false;break}}if(l){return true}}},true)},addClass:function(h,i){a(h,i,function(o,q,k){var m=o.className;if(!m){o.className=i}else{var n=e+m+e,p=m,l=0;for(;l<k;l++){if(n.indexOf(e+q[l]+e)<0){p+=e+q[l]}}o.className=b.trim(p)}})},removeClass:function(h,i){a(h,i,function(o,q,k){var m=o.className;if(m){if(!k){o.className=""}else{var n=(e+m+e).replace(g,e),l=0,p;for(;l<k;l++){p=e+q[l]+e;while(n.indexOf(p)>=0){n=n.replace(p,e)}}o.className=b.trim(n)}}})},replaceClass:function(h,j,i){c.removeClass(h,j);c.addClass(h,i)},toggleClass:function(h,l,k){var j=b.isBoolean(k),i;a(h,l,function(p,q,m){var n=0,o;for(;n<m;n++){o=q[n];i=j?!k:c.hasClass(p,o);c[i?"removeClass":"addClass"](p,o)}})}});function a(l,r,q,p){if(!(r=b.trim(r))){return p?false:f}var j=b.query(l),m=0,n=j.length,h=r.split(d),k,o;for(;m<n;m++){k=j[m];if(c._isElementNode(k)){o=q(k,h,h.length);if(o!==f){return o}}}if(p){return false}}});KISSY.add("dom-attr",function(c,f){var k=c.UA,t=document,r=t.documentElement,e=!r.hasAttribute,o=r.textContent!==f?"textContent":"innerText",a="select",u="",s="checked",g="style",p=c.DOM,n=p._isElementNode,j=function(v){return p._nodeTypeIs(v,3)},d=/^(?:href|src|style)/,h=/^(?:href|src|colspan|rowspan)/,l=/\r/g,q=/^(?:radio|checkbox)/,i={readonly:"readOnly"},b={val:1,css:1,html:1,text:1,data:1,width:1,height:1,offset:1};if(e){c.mix(i,{"for":"htmlFor","class":"className"})}c.mix(p,{attr:function(v,y,B,A){if(c.isPlainObject(y)){A=B;for(var w in y){p.attr(v,w,y[w],A)}return}if(!(y=c.trim(y))){return}y=y.toLowerCase();if(A&&b[y]){return p[y](v,B)}y=i[y]||y;if(B===f){var z=c.get(v);if(!n(z)){return f}var x;if(!d.test(y)){x=z[y]}if(x===f){x=z.getAttribute(y)}if(e){if(h.test(y)){x=z.getAttribute(y,2)}else{if(y===g){x=z[g].cssText}}}return x===null?f:x}c.each(c.query(v),function(C){if(!n(C)){return}if(y===g){C[g].cssText=B}else{if(y===s){C[y]=!!B}C.setAttribute(y,u+B)}})},removeAttr:function(v,w){c.each(c.query(v),function(x){if(n(x)){p.attr(x,w,u);x.removeAttribute(w)}})},val:function(w,C){if(C===f){var B=c.get(w);if(!n(B)){return f}if(m("option",B)){return(B.attributes.value||{}).specified?B.value:B.text}if(m(a,B)){var z=B.selectedIndex,y=B.options;if(z<0){return null}else{if(B.type==="select-one"){return p.val(y[z])}}var x=[],A=0,v=y.length;for(;A<v;++A){if(y[A].selected){x.push(p.val(y[A]))}}return x}if(k.webkit&&q.test(B.type)){return B.getAttribute("value")===null?"on":B.value}return(B.value||u).replace(l,u)}c.each(c.query(w),function(E){if(m(a,E)){if(c.isNumber(C)){C+=u}var G=c.makeArray(C),F=E.options,D;for(A=0,v=F.length;A<v;++A){D=F[A];D.selected=c.inArray(p.val(D),G)}if(!G.length){E.selectedIndex=-1}}else{if(n(E)){E.value=C}}})},text:function(v,x){if(x===f){var w=c.get(v);if(n(w)){return w[o]||u}else{if(j(w)){return w.nodeValue}}}else{c.each(c.query(v),function(y){if(n(y)){y[o]=x}else{if(j(y)){y.nodeValue=x}}})}}});function m(w,v){return v&&v.nodeName.toUpperCase()===w.toUpperCase()}});KISSY.add("dom-style",function(d,e){var t=d.DOM,l=d.UA,z=document,s=z.documentElement,g="style",k="float",w="cssFloat",x="styleFloat",c="width",n="height",m="auto",o="display",h="none",r=parseInt,j=/^(?:left|top)/,p=/^(?:width|height|top|left|right|bottom|margin|padding)/i,v=/-([a-z])/ig,u=function(A,B){return B.toUpperCase()},y="",a="px",f={},i={};d.mix(t,{_CUSTOM_STYLES:f,_getComputedStyle:function(B,A){var D="",C=B.ownerDocument;if(B[g]){D=C.defaultView.getComputedStyle(B,null)[A]}return D},css:function(A,D,F){if(d.isPlainObject(D)){for(var B in D){t.css(A,B,D[B])}return}if(D.indexOf("-")>0){D=D.replace(v,u)}D=f[D]||D;if(F===e){var E=d.get(A),C="";if(E&&E[g]){C=D.get?D.get(E):E[g][D];if(C===""&&!D.get){C=b(E,D,t._getComputedStyle(E,D))}}return C===e?"":C}else{if(F===null||F===y){F=y}else{if(!isNaN(new Number(F))&&p.test(D)){F+=a}}if((D===c||D===n)&&parseFloat(F)<0){return}d.each(d.query(A),function(G){if(G&&G[g]){D.set?D.set(G,F):(G[g][D]=F);if(F===y){if(!G[g].cssText){G.removeAttribute(g)}}}})}},width:function(A,B){if(B===e){return q(A,c)}else{t.css(A,c,B)}},height:function(A,B){if(B===e){return q(A,n)}else{t.css(A,n,B)}},show:function(A){d.query(A).each(function(E){if(!E){return}E.style[o]=t.data(E,o)||y;if(t.css(E,o)===h){var D=E.tagName,B=i[D],C;if(!B){C=z.createElement(D);z.body.appendChild(C);B=t.css(C,o);t.remove(C);i[D]=B}t.data(E,o,B);E.style[o]=B}})},hide:function(A){d.query(A).each(function(D){if(!D){return}var C=D.style,B=C[o];if(B!==h){if(B){t.data(D,o,B)}C[o]=h}})},toggle:function(A){d.query(A).each(function(B){if(B){if(B.style[o]===h){t.show(B)}else{t.hide(B)}}})},addStyleSheet:function(A,C){var B;if(C&&(C=C.replace("#",y))){B=d.get("#"+C)}if(B){return}B=t.create("<style>",{id:C});d.get("head").appendChild(B);if(B.styleSheet){B.styleSheet.cssText=A}else{B.appendChild(z.createTextNode(A))}}});if(s[g][w]!==e){f[k]=w}else{if(s[g][x]!==e){f[k]=x}}function q(A,B){var C=d.get(A),E=B===c?["Left","Right"]:["Top","Bottom"],D=B===c?C.offsetWidth:C.offsetHeight;d.each(E,function(F){D-=parseFloat(t._getComputedStyle(C,"padding"+F))||0;D-=parseFloat(t._getComputedStyle(C,"border"+F+"Width"))||0});return D}function b(C,B,E){var D,A=E;if(E===m&&j.test(B)){A=0;if(d.inArray(t.css(C,"position"),["absolute","fixed"])){D=C[B==="left"?"offsetLeft":"offsetTop"];if(l.ie===8||l.opera){D-=r(t.css(C.offsetParent,"border-"+B+"-width"))||0}A=D-(r(t.css(C,"margin-"+B))||0)}}return A}});KISSY.add("dom-style-ie",function(f,d){if(!f.UA.ie){return}var p=f.DOM,m=document,c=m.documentElement,o="opacity",n="filter",j="filters",i="currentStyle",l="runtimeStyle",b="left",e="px",h=p._CUSTOM_STYLES,q=/^-?\d+(?:px)?$/i,g=/^-?\d/,a=/^(?:width|height)$/;try{if(c.style[o]===d&&c[j]){h[o]={get:function(s){var u=100;try{u=s[j]["DXImageTransform.Microsoft.Alpha"][o]}catch(t){try{u=s[j]("alpha")[o]}catch(r){}}return u/100+""},set:function(t,u){var s=t.style,r=(t.currentStyle||0).filter||"";s.zoom=1;if(r){r=r.replace(/alpha\(opacity=.+\)/ig,"");if(r){r+=", "}}s[n]=r+"alpha("+o+"="+u*100+")"}}}}catch(k){f.log("IE filters ActiveX is disabled. ex = "+k)}if(!(m.defaultView||{}).getComputedStyle&&c[i]){p._getComputedStyle=function(v,t){var u=v.style,s=v[i][t];if(a.test(t)){s=p[t](v)+e}else{if((!q.test(s)&&g.test(s))){var w=u[b],r=v[l][b];v[l][b]=v[i][b];u[b]=t==="fontSize"?"1em":(s||0);s=u.pixelLeft+e;u[b]=w;v[l][b]=r}}return s}}});KISSY.add("dom-offset",function(d,g){var x=d.DOM,m=d.UA,c=window,C=document,p=x._isElementNode,q=x._nodeTypeIs,t=x._getWin,j=C.compatMode==="CSS1Compat",w=Math.max,v=parseInt,n="position",B="relative",f="document",u="body",o="documentElement",s="ownerDocument",i="viewport",l="scroll",e="client",k="left",r="top",h="scrollTo",z=l+"Left",y=l+"Top",a="getBoundingClientRect";d.mix(x,{offset:function(D,E){if(!(D=d.get(D))||!D[s]){return null}if(E===g){return b(D)}A(D,E)},scrollIntoView:function(W,N,R,X){if(!(W=d.get(W))||!W[s]){return}X=X===g?true:!!X;R=R===g?true:!!R;if(!N||N===c){return W.scrollIntoView(R)}N=d.get(N);if(q(N,9)){N=t(N)}var L=N&&(h in N)&&N[f],J=x.offset(W),G=L?{left:x.scrollLeft(N),top:x.scrollTop(N)}:x.offset(N),P={left:J[k]-G[k],top:J[r]-G[r]},M=L?x.viewportHeight(N):N.clientHeight,D=L?x.viewportWidth(N):N.clientWidth,I=x[z](N),F=x[y](N),H=I+D,S=F+M,E=W.offsetHeight,V=W.offsetWidth,U=P.left+I-(v(x.css(N,"borderLeftWidth"))||0),O=P.top+F-(v(x.css(N,"borderTopWidth"))||0),Q=U+V,Y=O+E,K,T;if(E>M||O<F||R){K=O}else{if(Y>S){K=Y-M}}if(X){if(V>D||U<I||R){T=U}else{if(Q>H){T=Q-D}}}if(L){if(K!==g||T!==g){N[h](T,K)}}else{if(K!==g){N[y]=K}if(T!==g){N[z]=T}}}});d.each(["Left","Top"],function(D,E){var F=l+D;x[F]=function(I){var H=0,G=t(I),J;if(G&&(J=G[f])){H=G[E?"pageYOffset":"pageXOffset"]||J[o][F]||J[u][F]}else{if(p((I=d.get(I)))){H=I[F]}}return H}});d.each(["Width","Height"],function(D){x["doc"+D]=function(E){var F=E||C;return w(j?F[o][l+D]:F[u][l+D],x[i+D](F))};x[i+D]=function(F){var H="inner"+D,E=t(F),G=E[f];return(H in E)?E[H]:(j?G[o][e+D]:G[u][e+D])}});function b(G){var F,D=0,H=0,E=t(G[s]);if(G[a]){F=G[a]();D=F[k];H=F[r];if(m.mobile!=="apple"){D+=x[z](E);H+=x[y](E)}}return{left:D,top:H}}function A(G,I){if(x.css(G,n)==="static"){G.style[n]=B}var D=b(G),E={},H,F;for(F in I){H=v(x.css(G,F),10)||0;E[F]=H+I[F]-D[F]}x.css(G,E)}});KISSY.add("dom-traversal",function(b,f){var d=b.DOM,e=d._isElementNode;b.mix(d,{parent:function(g,h){return c(g,h,"parentNode",function(i){return i.nodeType!=11})},next:function(g,h){return c(g,h,"nextSibling")},prev:function(g,h){return c(g,h,"previousSibling")},siblings:function(g,h){return a(g,h,true)},children:function(g,h){return a(g,h)},contains:function(g,i){var h=false;if((g=b.get(g))&&(i=b.get(i))){if(g.contains){if(i.nodeType===3){i=i.parentNode;if(i===g){return true}}if(i){return g.contains(i)}}else{if(g.compareDocumentPosition){return !!(g.compareDocumentPosition(i)&16)}else{while(!h&&(i=i.parentNode)){h=i==g}}}}return h}});function c(k,i,l,j){if(!(k=b.get(k))){return null}if(i===f){i=1}var h=null,m,g;if(b.isNumber(i)&&i>=0){if(i===0){return k}m=0;g=i;i=function(){return ++m===g}}while((k=k[l])){if(e(k)&&(!i||d.test(k,i))&&(!j||j(k))){h=k;break}}return h}function a(h,n,m){var k=[],o=b.get(h),i,g=o,l;if(o&&m){g=o.parentNode}if(g){for(i=0,l=g.firstChild;l;l=l.nextSibling){if(e(l)&&l!==o&&(!n||d.test(l,n))){k[i++]=l}}}return k}});KISSY.add("dom-create",function(f,h){var D=document,z=f.DOM,l=f.UA,n=l.ie,s=z._nodeTypeIs,r=z._isElementNode,u=z._isKSNode,t="div",j="parentNode",c=D.createElement(t),w=/<(\w+)/,v=/<script([^>]*)>([^<]*(?:(?!<\/script>)<[^<]*)*)<\/script>/ig,g=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,A=/\ssrc=(['"])(.*?)\1/i,x=/\scharset=(['"])(.*?)\1/i;f.mix(z,{create:function(G,J,I){if(s(G,1)||s(G,3)){return q(G)}if(u(G)){return q(G[0])}if(!(G=f.trim(G))){return null}var H=null,K=z._creators,E,L=t,F,p;if((E=g.exec(G))){H=(I||D).createElement(E[1])}else{if((E=w.exec(G))&&(F=E[1])&&f.isFunction(K[(F=F.toLowerCase())])){L=F}p=K[L](G,I).childNodes;if(p.length===1){H=p[0][j].removeChild(p[0])}else{H=m(p,I||D)}}return e(H,J)},_creators:{div:function(E,p){var F=p?p.createElement(t):c;F.innerHTML=E;return F}},html:function(p,G,E,H){if(G===h){var F=f.get(p);if(r(F)){return F.innerHTML}}else{f.each(f.query(p),function(I){if(r(I)){y(I,G,E,H)}})}},remove:function(p){f.each(f.query(p),function(E){if(r(E)&&E.parentNode){E.parentNode.removeChild(E)}})}});function e(E,p){if(r(E)&&f.isPlainObject(p)){z.attr(E,p,true)}return E}function m(E,G){var F=null,H,p;if(E&&(E.push||E.item)&&E[0]){G=G||E[0].ownerDocument;F=G.createDocumentFragment();if(E.item){E=f.makeArray(E)}for(H=0,p=E.length;H<p;H++){F.appendChild(E[H])}}else{f.log("Unable to convert "+E+" to fragment.")}return F}function q(E){var p=E.cloneNode(true);if(l.ie<8){p.innerHTML=E.innerHTML}return p}function y(G,F,E,I){if(!E){a(G,F);f.isFunction(I)&&I();return}var H=f.guid("ks-tmp-"),p=new RegExp(v);F+='<span id="'+H+'"></span>';f.available(H,function(){var P=f.get("head"),M,L,K,J,N,O,Q;p.lastIndex=0;while((M=p.exec(F))){L=M[1];K=L?L.match(A):false;if(K&&K[2]){O=D.createElement("script");O.src=K[2];if((J=L.match(x))&&J[2]){O.charset=J[2]}O.async=true;P.appendChild(O)}else{if((Q=M[2])&&Q.length>0){f.globalEval(Q)}}}(N=D.getElementById(H))&&z.remove(N);f.isFunction(I)&&I()});a(G,F)}function a(F,E){E=(E+"").replace(v,"");try{F.innerHTML=E}catch(p){while(F.firstChild){F.removeChild(F.firstChild)}if(E){F.appendChild(z.create(E))}}}if(n||l.gecko||l.webkit){var i=z._creators,k=z.create,C="<table>",B="</table>",d=/(?:\/(?:thead|tfoot|caption|col|colgroup)>)+\s*<tbody/,b={option:"select",td:"tr",tr:"tbody",tbody:"table",col:"colgroup",legend:"fieldset"};for(var o in b){(function(p){i[o]=function(F,E){return k("<"+p+">"+F+"</"+p+">",null,E)}})(b[o])}if(n){i.script=function(E,p){var F=p?p.createElement(t):c;F.innerHTML="-"+E;F.removeChild(F.firstChild);return F};if(n<8){i.tbody=function(F,E){var G=k(C+F+B,null,E),p=G.children.tags("tbody")[0];if(G.children.length>1&&p&&!d.test(F)){p[j].removeChild(p)}return G}}}f.mix(i,{optgroup:i.option,th:i.td,thead:i.tbody,tfoot:i.tbody,caption:i.tbody,colgroup:i.tbody})}});KISSY.add("dom-insertion",function(b){var c=b.DOM,d="parentNode",a="nextSibling";b.mix(c,{insertBefore:function(f,e){if((f=b.get(f))&&(e=b.get(e))&&e[d]){e[d].insertBefore(f,e)}return f},insertAfter:function(f,e){if((f=b.get(f))&&(e=b.get(e))&&e[d]){if(e[a]){e[d].insertBefore(f,e[a])}else{e[d].appendChild(f)}}return f},append:function(f,e){if((f=b.get(f))&&(e=b.get(e))){if(e.appendChild){e.appendChild(f)}}},prepend:function(f,e){if((f=b.get(f))&&(e=b.get(e))){if(e.firstChild){c.insertBefore(f,e.firstChild)}else{e.appendChild(f)}}}})});KISSY.add("event",function(c,b){var m=document,p=c.DOM,l=m.addEventListener?function(t,s,r,q){if(t.addEventListener){t.addEventListener(s,r,!!q)}}:function(s,r,q){if(s.attachEvent){s.attachEvent("on"+r,q)}},i=m.removeEventListener?function(t,s,r,q){if(t.removeEventListener){t.removeEventListener(s,r,!!q)}}:function(s,r,q){if(s.detachEvent){s.detachEvent("on"+r,q)}},g="ksEventTargetId",k=" ",j=c.now(),a={};var o={EVENT_GUID:g,special:{},add:function(t,v,x,z){if(d("add",t,v,x,z)){return}var r=h(t),q,u,A,s,w,y;if(r===-1||!v||!c.isFunction(x)){return}if(!r){f(t,(r=j++));a[r]={target:t,events:{}}}A=a[r].events;if(!A[v]){q=!t.isCustomEventTarget;u=((q||t._supportSpecialEvent)&&o.special[v])||{};s=function(C,B){if(!C||!C.fixed){C=new c.EventObject(t,C,v)}if(c.isPlainObject(B)){c.mix(C,B)}if(u.setup){u.setup(C)}return(u.handle||o._handle)(t,C,A[v].listeners)};A[v]={handle:s,listeners:[]};w=u.fix||v;y=u.capture;if(q){l(t,w,s,y)}else{if(t._addEvent){t._addEvent(w,s,y)}}}A[v].listeners.push({fn:x,scope:z||t})},remove:function(v,y,B,D){if(d("remove",v,y,B,D)){return}var q=h(v),E,A,z,s,r,u,x,C,w;if(q===-1){return}if(!q||!(x=a[q])){return}if(x.target!==v){return}D=D||v;E=x.events||{};if((A=E[y])){z=A.listeners;u=z.length;if(c.isFunction(B)&&u){for(s=0,r=0,C=[];s<u;++s){if(B!==z[s].fn||D!==z[s].scope){C[r++]=z[s]}}A.listeners=C;u=C.length}if(B===b||u===0){if(!v.isCustomEventTarget){w=o.special[y]||{};i(v,w.fix||y,A.handle)}else{if(v._removeEvent){v._removeEvent(y,A.handle)}}delete E[y]}}if(y===b||c.isEmptyObject(E)){for(y in E){o.remove(v,y)}delete a[q];n(v)}},_handle:function(w,u,t){t=t.slice(0);var r,s=0,q=t.length,v;for(;s<q;++s){v=t[s];r=v.fn.call(v.scope,u);if(r!==b){u.result=r;if(r===false){u.halt()}}if(u.isImmediatePropagationStopped){break}}return r},_getCache:function(q){return a[q]},_simpleAdd:l,_simpleRemove:i};o.on=o.add;function d(r,q,t,v,u){if(c.isString(q)){q=c.query(q)}if(c.isArray(q)){c.each(q,function(w){o[r](w,t,v,u)});return true}if((t=c.trim(t))&&t.indexOf(k)>0){c.each(t.split(k),function(w){o[r](q,w,v,u)});return true}if(q.getDOMNodes){for(var s=0;s<q.length;s++){o[r](q.item(s),t,v,u)}return true}}function h(q){return e(q)?p.data(q,g):-1}function f(q,r){if(e(q)){p.data(q,g,r)}}function n(q){p.removeData(q,g)}function e(q){return q&&q.nodeType!==3&&q.nodeType!==8}c.Event=o});KISSY.add("event-object",function(a,e){var d=document,c="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" ");function b(i,h,g){var f=this;f.currentTarget=i;f.originalEvent=h||{};if(h){f.type=h.type;f._fix()}else{f.type=g;f.target=i}if(i.isCustomEventTarget){if(a.DOM._isKSNode(i)){f.target=new a.Node(f.target)}}f.currentTarget=i;f.fixed=true}a.augment(b,{_fix:function(){var h=this,f=h.originalEvent,g=c.length,n,j=h.currentTarget,i=(j.nodeType===9)?j:(j.ownerDocument||d);while(g){n=c[--g];h[n]=f[n]}if(!h.target){h.target=h.srcElement||d}if(h.target.nodeType===3){h.target=h.target.parentNode}if(!h.relatedTarget&&h.fromElement){h.relatedTarget=(h.fromElement===h.target)?h.toElement:h.fromElement}if(h.pageX===e&&h.clientX!==e){var m=i.documentElement,k=i.body;h.pageX=h.clientX+(m&&m.scrollLeft||k&&k.scrollLeft||0)-(m&&m.clientLeft||k&&k.clientLeft||0);h.pageY=h.clientY+(m&&m.scrollTop||k&&k.scrollTop||0)-(m&&m.clientTop||k&&k.clientTop||0)}if(h.which===e){h.which=(h.charCode!==e)?h.charCode:h.keyCode}if(h.metaKey===e){h.metaKey=h.ctrlKey}if(!h.which&&h.button!==e){h.which=(h.button&1?1:(h.button&2?3:(h.button&4?2:0)))}},preventDefault:function(){var f=this.originalEvent;if(f.preventDefault){f.preventDefault()}else{f.returnValue=false}this.isDefaultPrevented=true},stopPropagation:function(){var f=this.originalEvent;if(f.stopPropagation){f.stopPropagation()}else{f.cancelBubble=true}this.isPropagationStopped=true},stopImmediatePropagation:function(){var f=this.originalEvent;if(f.stopImmediatePropagation){f.stopImmediatePropagation()}else{this.stopPropagation()}this.isImmediatePropagationStopped=true},halt:function(f){if(f){this.stopImmediatePropagation()}else{this.stopPropagation()}this.preventDefault()}});a.EventObject=b});KISSY.add("event-target",function(b,c){var a=b.Event;b.EventTarget={isCustomEventTarget:true,fire:function(g,h){var i=b.DOM.data(this,a.EVENT_GUID)||-1,d=a._getCache(i)||{},f=d.events||{},e=f[g];if(e&&b.isFunction(e.handle)){return e.handle(c,h)}return this},on:function(f,e,d){a.add(this,f,e,d);return this},detach:function(f,e,d){a.remove(this,f,e,d);return this}}});KISSY.add("event-mouseenter",function(b){var a=b.Event;if(!b.UA.ie){b.each([{name:"mouseenter",fix:"mouseover"},{name:"mouseleave",fix:"mouseout"}],function(c){a.special[c.name]={fix:c.fix,setup:function(d){d.type=c.name},handle:function(g,h,f){if(b.DOM._isKSNode(g)){g=g[0]}var d=h.relatedTarget;try{while(d&&d!==g){d=d.parentNode}if(d!==g){a._handle(g,h,f)}}catch(i){b.log(i)}}}})}});KISSY.add("event-focusin",function(b){var a=b.Event;if(document.addEventListener){b.each([{name:"focusin",fix:"focus"},{name:"focusout",fix:"blur"}],function(c){a.special[c.name]={fix:c.fix,capture:true,setup:function(d){d.type=c.name}}})}});KISSY.add("node",function(b){var c=b.DOM;function a(f,h,e){var d=this,g;if(!(d instanceof a)){return new a(f,h,e)}if(!f){d.length=0;return}if(b.isString(f)){g=c.create(f,h,e);if(g.nodeType===11){return new b.NodeList(g.childNodes)}}else{if(f instanceof a){return f}else{g=f}}d[0]=g}a.TYPE="-ks-Node";b.augment(a,{length:1,getDOMNode:function(){return this[0]},nodeType:a.TYPE});b.one=function(d,e){var f=b.get(d,e);return f?new a(f):null};b.Node=a});KISSY.add("nodelist",function(b){var d=b.DOM,c=Array.prototype,e=d._isElementNode;function a(f){if(!(this instanceof a)){return new a(f)}c.push.apply(this,b.makeArray(f)||[])}b.mix(a.prototype,{length:0,item:function(h){var g=null,j,f;if(e(h)){for(j=0,f=this.length;j<f;j++){if(h===this[j]){h=j;break}}}if(e(this[h])){g=new b.Node(this[h])}return g},getDOMNodes:function(){return c.slice.call(this)},each:function(j,h){var f=this.length,g=0,k;for(k=new b.Node(this[0]);g<f&&j.call(h||k,k,g,this)!==false;k=new b.Node(this[++g])){}return this}});b.all=function(f,g){return new a(b.query(f,g,true))};b.NodeList=a});KISSY.add("node-attach",function(d,b){var q=d.DOM,n=d.Event,i=q._nodeTypeIs,m=q._isKSNode,c=d.Node.prototype,a=d.NodeList.prototype,f="getDOMNode",e=f+"s",g=1,j=2,p=4;function k(s,u,r,v){var t=this[s?e:f](),w=[t].concat(d.makeArray(u));if(u[r]===b){return v.apply(q,w)}else{v.apply(q,w);return this}}function h(s,r){d.each(s,function(t){d.each([c,a],function(v,u){v[t]=(function(w){switch(r){case g:return function(){return k.call(this,u,arguments,1,w)};case j:return function(){return k.call(this,u,arguments,0,w)};case p:return function(){var x=this[u?e:f](),y=w.apply(q,[x].concat(d.makeArray(arguments)));return y?new d[d.isArray(y)?"NodeList":"Node"](y):null};default:return function(){var x=this[u?e:f](),y=w.apply(q,[x].concat(d.makeArray(arguments)));return y===b?this:y}}})(q[t])})})}d.mix(c,{one:function(r){return d.one(r,this[0])},all:function(r){return d.all(r,this[0])}});h(["data","removeData"],g);h(["hasClass","addClass","removeClass","replaceClass","toggleClass"]);h(["attr","removeAttr"],g);h(["val","text"],j);h(["css"],g);h(["width","height"],j);h(["offset"],j);h(["scrollIntoView"]);h(["parent","next","prev","siblings","children"],p);h(["contains"]);h(["html"],j);h(["remove"]);d.each(["insertBefore","insertAfter"],function(r){c[r]=function(s){q[r].call(q,this[0],s);return this}});d.each([c,a],function(s,r){d.each(["append","prepend"],function(t){s[t]=function(u){return o.call(this,u,r,t)};s[t+"To"]=function(u){return l.call(this,u,t)}})});function o(t,r,s){if(t){d.each(this,function(v){var u;if(r||d.isString(t)){u=q.create(t)}else{if(i(t,1)||i(t,3)){u=t}if(m(t)){u=t[0]}}q[s](u,v)})}return this}function l(s,r){if((s=d.get(s))&&s.appendChild){d.each(this,function(t){q[r](t,s)})}return this}d.mix(c,d.EventTarget);c._supportSpecialEvent=true;c._addEvent=function(s,t,r){n._simpleAdd(this[0],s,t,r)};c._removeEvent=function(s,t,r){n._simpleRemove(this[0],s,t,r)};delete c.fire;d.mix(a,d.EventTarget);delete a.fire});if(!this.JSON){this.JSON={}}(function(){function f(n){return n<10?"0"+n:n}if(typeof Date.prototype.toJSON!=="function"){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf()}}var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+string+'"'}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==="object"&&typeof value.toJSON==="function"){value=value.toJSON(key)}if(typeof rep==="function"){value=rep.call(holder,key,value)}switch(typeof value){case"string":return quote(value);case"number":return isFinite(value)?String(value):"null";case"boolean":case"null":return String(value);case"object":if(!value){return"null"}gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==="[object Array]"){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||"null"}v=partial.length===0?"[]":gap?"[\n"+gap+partial.join(",\n"+gap)+"\n"+mind+"]":"["+partial.join(",")+"]";gap=mind;return v}if(rep&&typeof rep==="object"){length=rep.length;for(i=0;i<length;i+=1){k=rep[i];if(typeof k==="string"){v=str(k,value);if(v){partial.push(quote(k)+(gap?": ":":")+v)}}}}else{for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?": ":":")+v)}}}}v=partial.length===0?"{}":gap?"{\n"+gap+partial.join(",\n"+gap)+"\n"+mind+"}":"{"+partial.join(",")+"}";gap=mind;return v}}if(typeof JSON.stringify!=="function"){JSON.stringify=function(value,replacer,space){var i;gap="";indent="";if(typeof space==="number"){for(i=0;i<space;i+=1){indent+=" "}}else{if(typeof space==="string"){indent=space}}rep=replacer;if(replacer&&typeof replacer!=="function"&&(typeof replacer!=="object"||typeof replacer.length!=="number")){throw new Error("JSON.stringify")}return str("",{"":value})}}if(typeof JSON.parse!=="function"){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==="object"){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v}else{delete value[k]}}}}return reviver.call(holder,key,value)}text=String(text);cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})}if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""))){j=eval("("+text+")");return typeof reviver==="function"?walk({"":j},""):j}throw new SyntaxError("JSON.parse")}}}());KISSY.add("json",function(a){var b=window.JSON;a.JSON={parse:function(c){if(c==null||c===""){return null}return b.parse(c)},stringify:b.stringify}});KISSY.add("ajax",function(k,e){var j=window,h=function(){},z="GET",d="POST",u="Content-Type",g="json",r=g+"p",p="script",m="callback",A="",v="start",t="send",b="stop",y="success",s="complete",l="error",a="timeout",w="parsererror",q={type:z,url:A,contentType:"application/x-www-form-urlencoded",async:true,data:null,xhr:j.ActiveXObject?function(){if(j.XmlHttpRequest){try{return new j.XMLHttpRequest()}catch(C){}}try{return new j.ActiveXObject("Microsoft.XMLHTTP")}catch(B){}}:function(){return new j.XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"},jsonp:m};function n(H){H=k.merge(q,H);if(!H.url){return}if(H.data&&!k.isString(H.data)){H.data=k.param(H.data)}H.context=H.context||H;var J,E=y,F,I=H.type.toUpperCase(),B;if(H.dataType===r){J=H.jsonpCallback||r+k.now();H.url=i(H.url,H.jsonp+"="+J);H.dataType=p;var D=j[J];j[J]=function(L){if(k.isFunction(D)){D(L)}else{j[J]=e;try{delete j[J]}catch(M){}}o([y,s],L,E,K,H)}}if(H.data&&I===z){H.url=i(H.url,H.data)}if(H.dataType===p){x(v,H);B=k.getScript(H.url,J?null:function(){o([y,s],A,E,K,H)});x(t,H);return B}var C=false,K=H.xhr();x(v,H);K.open(I,H.url,H.async);try{if(H.data||H.contentType){K.setRequestHeader(u,H.contentType)}K.setRequestHeader("Accept",H.dataType&&H.accepts[H.dataType]?H.accepts[H.dataType]+", */*; q=0.01":H.accepts._default)}catch(G){}K.onreadystatechange=function(L){if(!K||K.readyState===0||L==="abort"){if(!C){o(s,null,l,K,H)}C=true;if(K){K.onreadystatechange=h}}else{if(!C&&K&&(K.readyState===4||L===a)){C=true;K.onreadystatechange=h;E=(L===a)?a:f(K)?y:l;try{F=c(K,H.dataType)}catch(M){E=w}o([E===y?y:l,s],F,E,K,H);if(L===a){K.abort();x(b,H)}if(H.async){K=null}}}};x(t,H);try{K.send(I===d?H.data:null)}catch(G){o([l,s],F,l,K,H)}if(!H.async){x(s,H)}return K}k.mix(n,k.EventTarget);k.mix(n,{get:function(C,E,F,B,D){if(k.isFunction(E)){B=F;F=E}return n({type:D||z,url:C,data:E,success:function(G,I,H){F&&F.call(this,G,I,H)},dataType:B})},post:function(C,D,E,B){if(k.isFunction(D)){B=E;E=D;D=e}return n.get(C,D,E,B,d)},jsonp:function(B,C,D){if(k.isFunction(C)){D=C;C=null}return n.get(B,C,D,r)}});n.getScript=k.getScript;k.io=k.ajax=n.ajax=n;k.jsonp=n.jsonp;k.IO=n;function f(C){try{return C.status>=200&&C.status<300||C.status===304||C.status===1223}catch(B){}return false}function i(B,C){return B+(B.indexOf("?")===-1?"?":"&")+C}function o(C,D,B,E,F){if(k.isArray(C)){k.each(C,function(G){o(G,D,B,E,F)})}else{if(B===C&&F[C]){F[C].call(F.context,D,B,E)}x(C,F)}}function x(C,B){n.fire(C,{ajaxConfig:B})}function c(F,D){var C=A,B,E=F;if(!k.isString(E)){C=F.getResponseHeader(u)||A;B=D==="xml"||!D&&C.indexOf("xml")>=0;E=B?F.responseXML:F.responseText;if(B&&E.documentElement.nodeName===w){throw w}}if(k.isString(E)){if(D===g||!D&&C.indexOf(g)>=0){E=k.JSON.parse(E)}}return E}});KISSY.add("anim-easing",function(c){var g=Math,f=g.PI,d=g.pow,a=g.sin,b=1.70158,e={easeNone:function(h){return h},easeIn:function(h){return h*h},easeOut:function(h){return(2-h)*h},easeBoth:function(h){return(h*=2)<1?0.5*h*h:0.5*(1-(--h)*(h-2))},easeInStrong:function(h){return h*h*h*h},easeOutStrong:function(h){return 1-(--h)*h*h*h},easeBothStrong:function(h){return(h*=2)<1?0.5*h*h*h*h:0.5*(2-(h-=2)*h*h*h)},elasticIn:function(h){var j=0.3,i=j/4;if(h===0||h===1){return h}return -(d(2,10*(h-=1))*a((h-i)*(2*f)/j))},elasticOut:function(h){var j=0.3,i=j/4;if(h===0||h===1){return h}return d(2,-10*h)*a((h-i)*(2*f)/j)+1},elasticBoth:function(h){var j=0.45,i=j/4;if(h===0||(h*=2)===2){return h}if(h<1){return -0.5*(d(2,10*(h-=1))*a((h-i)*(2*f)/j))}return d(2,-10*(h-=1))*a((h-i)*(2*f)/j)*0.5+1},backIn:function(h){if(h===1){h-=0.001}return h*h*((b+1)*h-b)},backOut:function(h){return(h-=1)*h*((b+1)*h+b)+1},backBoth:function(h){if((h*=2)<1){return 0.5*(h*h*(((b*=(1.525))+1)*h-b))}return 0.5*((h-=2)*h*(((b*=(1.525))+1)*h+b)+2)},bounceIn:function(h){return 1-e.bounceOut(1-h)},bounceOut:function(h){var i=7.5625,j;if(h<(1/2.75)){j=i*h*h}else{if(h<(2/2.75)){j=i*(h-=(1.5/2.75))*h+0.75}else{if(h<(2.5/2.75)){j=i*(h-=(2.25/2.75))*h+0.9375}else{j=i*(h-=(2.625/2.75))*h+0.984375}}}return j},bounceBoth:function(h){if(h<0.5){return e.bounceIn(h*2)*0.5}return e.bounceOut(h*2-1)*0.5+0.5}};e.NativeTimeFunction={easeNone:"linear",ease:"ease",easeIn:"ease-in",easeOut:"ease-out",easeBoth:"ease-in-out",easeInStrong:"cubic-bezier(0.9, 0.0, 0.9, 0.5)",easeOutStrong:"cubic-bezier(0.1, 0.5, 0.1, 1.0)",easeBothStrong:"cubic-bezier(0.9, 0.0, 0.1, 1.0)"};c.Easing=e});KISSY.add("anim",function(e,g){var u=e.DOM,b=e.Easing,f=parseFloat,c=u.create("<div>"),q=("backgroundColor borderBottomColor borderBottomWidth borderBottomStyle borderLeftColor borderLeftWidth borderLeftStyle borderRightColor borderRightWidth borderRightStyle borderSpacing borderTopColor borderTopWidth borderTopStyle bottom color font fontFamily fontSize fontWeight height left letterSpacing lineHeight marginBottom marginLeft marginRight marginTop maxHeight maxWidth minHeight minWidth opacity outlineColor outlineOffset outlineWidth paddingBottom paddingLeft paddingRight paddingTop right textIndent top width wordSpacing zIndex").split(" "),t=13,r="opacity",j="none",w="Property",v="start",k="step",i="complete",l={duration:1,easing:"easeNone",nativeSupport:true};function x(z,D,A,C,F,B){if(!(z=e.get(z))){return}if(!(this instanceof x)){return new x(z,D,A,C,F,B)}var G=this,E=e.isPlainObject(A),s=D,y;G.domEl=z;if(e.isPlainObject(s)){s=e.param(s,";").replace(/=/g,":").replace(/%23/g,"#").replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}G.props=o(s);G.targetStyle=s;if(E){y=e.merge(l,A)}else{y=e.clone(l);if(A){(y.duration=f(A)||1)}if(e.isString(C)||e.isFunction(C)){y.easing=C}if(e.isFunction(F)){y.complete=F}if(B!==g){y.nativeSupport=B}}G.config=y;if(y.nativeSupport&&p()&&e.isString((C=y.easing))){if(/cubic-bezier\([\s\d.,]+\)/.test(C)||(C=b.NativeTimeFunction[C])){y.easing=C;G.transitionName=p()}}if(e.isFunction(F)){G.on(i,F)}}e.augment(x,e.EventTarget,{run:function(){var H=this,A=H.config,B=H.domEl,D,F,z,G,E=H.props,s={},y,C;for(y in E){s[y]=n(u.css(B,y))}if(H.fire(v)===false){return}H.stop();if(H.transitionName){H._nativeRun()}else{D=A.duration*1000;z=e.now();G=z+D;F=A.easing;if(e.isString(F)){F=b[F]||b.easeNone}H.timer=e.later((C=function(){var L=e.now(),J=L>G?1:(L-z)/D,K,M,I;for(y in E){K=s[y];M=E[y];if(M.v==0){M.u=K.u}if(K.u!==M.u){K.v=0}u.css(B,y,M.f(K.v,M.v,F(J))+M.u)}if((H.fire(k)===false)||(I=L>G)){H.stop();if(I){H.fire(i)}}}),t,true);C()}return H},_nativeRun:function(){var s=this,y=s.config,z=s.domEl,C=s.props,B=y.duration*1000,E=y.easing,A=s.transitionName,D={};e.log("Amin uses native transition.");D[A+"Property"]="all";D[A+"Duration"]=B+"ms";D[A+"TimingFunction"]=E;u.css(z,D);e.later(function(){d(z,C,s.targetStyle)},0);e.later(function(){s.stop(true)},B)},stop:function(y){var s=this;if(s.transitionName){s._nativeStop(y)}else{if(s.timer){s.timer.cancel();s.timer=g}if(y){d(s.domEl,s.props,s.targetStyle);s.fire(i)}}return s},_nativeStop:function(y){var s=this,A=s.domEl,B=s.transitionName,z=s.props,C;if(y){u.css(A,B+w,j);s.fire(i)}else{for(C in z){u.css(A,C,u._getComputedStyle(A,C))}u.css(A,B+w,j)}}});x.supportTransition=function(){return !!p()};e.Anim=x;function p(){var s="transition",y;if(c.style[s]!==g){y=s}else{e.each(["Webkit","Moz","O"],function(z){if(c.style[(s=z+"Transition")]!==g){y=s;return false}})}p=function(){return y};return y}function d(z,y,s){if(e.UA.ie&&s.indexOf(r)>-1){u.css(z,r,y[r].v)}z.style.cssText+=";"+s}function o(A){var z,B={},y=q.length,s;c.innerHTML='<div style="'+A+'"></div>';z=c.firstChild.style;while(y--){if((s=z[q[y]])){B[q[y]]=n(s)}}return B}function n(z){var s=f(z),y=(z+"").replace(/^[-\d.]+/,"");return isNaN(s)?{v:y,u:"",f:a}:{v:s,u:y,f:h}}function h(s,y,z){return(s+(y-s)*z).toFixed(3)}function a(y,C,E){var A=2,z,D,B,F=[],s=[];while(z=3,D=arguments[A-1],A--){if(m(D,0,4)==="rgb("){D=D.match(/\d+/g);while(z--){F.push(~~D[z])}}else{if(m(D,0)==="#"){if(D.length===4){D="#"+m(D,1)+m(D,1)+m(D,2)+m(D,2)+m(D,3)+m(D,3)}while(z--){F.push(parseInt(m(D,1+z*2,2),16))}}else{return C}}}while(z--){B=~~(F[z+3]+(F[z]-F[z+3])*E);s.push(B<0?0:B>255?255:B)}return"rgb("+s.join(",")+")"}function m(y,s,z){return y.substr(s,z||1)}});KISSY.add("anim-node-plugin",function(g,c){var p=g.DOM,l=g.Anim,f=g.Node.prototype,a=g.NodeList.prototype,e="display",k="none",h="overflow",b="hidden",i="opacity",j="height",n="width",o="auto",m={show:[h,i,j,n],fade:[i],slide:[h,j]};g.each([f,a],function(q){q.animate=function(){var r=g.makeArray(arguments);g.each(this,function(s){l.apply(c,[s].concat(r)).run()});return this};g.each({show:["show",1],hide:["show",0],toggle:["toggle"],fadeIn:["fade",1],fadeOut:["fade",0],slideDown:["slide",1],slideUp:["slide",0]},function(s,r){q[r]=function(t,u){if(p[r]&&arguments.length===0){p[r](this)}else{g.each(this,function(v){d(v,s[0],t,u,s[1])})}return this}})});function d(r,u,s,w,t){if(u==="toggle"){t=p.css(r,e)===k?1:0;u="show"}if(t){p.css(r,e,p.data(r,e)||"")}var v={},q={};g.each(m[u],function(x){if(x===h){v[h]=p.css(r,h);p.css(r,h,b)}else{if(x===i){v[i]=p.css(r,i);q.opacity=t?1:0;if(t){p.css(r,i,0)}}else{if(x===j){v[j]=p.css(r,j);q.height=(t?p.css(r,j)||r.naturalHeight:0);if(t){p.css(r,j,0)}}else{if(x===n){v[n]=p.css(r,n);q.width=(t?p.css(r,n)||r.naturalWidth:0);if(t){p.css(r,n,0)}}}}}});new g.Anim(r,q,s,"easeOut",function(){if(!t){var x=r.style,y=x[e];if(y!==k){if(y){p.data(r,e,y)}x[e]=k}if(v[j]){p.css(r,{height:v[j]})}if(v[n]){p.css(r,{width:v[n]})}if(v[i]){p.css(r,{opacity:v[i]})}if(v[h]){p.css(r,{overflow:v[h]})}}if(w&&g.isFunction(w)){w()}}).run()}});KISSY.add("cookie",function(a){var e=document,c=encodeURIComponent,d=decodeURIComponent;a.Cookie={get:function(h){var g,f;if(b(h)){if((f=e.cookie.match("(?:^| )"+h+"(?:(?:=([^;]*))|;|$)"))){g=f[1]?d(f[1]):""}}return g},set:function(h,m,f,i,k,j){var l=c(m),g=f;if(typeof g==="number"){g=new Date();g.setTime(g.getTime()+f*86400000)}if(g instanceof Date){l+="; expires="+g.toUTCString()}if(b(i)){l+="; domain="+i}if(b(k)){l+="; path="+k}if(j){l+="; secure"}e.cookie=h+"="+l},remove:function(f,g,i,h){this.set(f,"",0,g,i,h)}};function b(f){return a.isString(f)&&f!==""}});KISSY.add("attribute",function(b,d){function a(){this.__attrs={};this.__attrVals={}}b.augment(a,{__getDefAttrs:function(){return b.clone(this.__attrs)},addAttr:function(e,f){var g=this;g.__attrs[e]=b.clone(f||{});return g},addAttrs:function(f,e){var g=this;b.each(f,function(i,h){if(h in e){i.value=e[h]}g.addAttr(h,i)});return g},hasAttr:function(e){return e&&(e in (this.__attrs||{}))},removeAttr:function(e){var f=this;if(f.hasAttr(e)){delete f.__attrs[e];delete f.__attrVals[e]}return f},set:function(e,g){var f=this,h=f.get(e);if(h===g){return}if(false===f.__fireAttrChange("before",e,h,g)){return}f.__set(e,g);f.__fireAttrChange("after",e,h,f.__attrVals[e]);return f},__fireAttrChange:function(e,g,h,f){return this.fire(e+c(g)+"Change",{attrName:g,prevVal:h,newVal:f})},__set:function(e,h){var g=this,i,f=g.__attrs[e],j=f&&f.setter;if(j){i=j.call(g,h)}if(i!==d){h=i}g.__attrVals[e]=h},get:function(g){var i=this,h,e,f;h=i.__attrs[g];e=h&&h.getter;f=g in i.__attrVals?i.__attrVals[g]:i.__getDefAttrVal(g);if(e){f=e.call(i,f)}return f},__getDefAttrVal:function(f){var h=this,g=h.__attrs[f],e,i;if(!g){return}if((e=g.valueFn)){i=e.call(h);if(i!==d){g.value=i}delete g.valueFn}return g.value},reset:function(e){var f=this;if(f.hasAttr(e)){return f.set(e,f.__getDefAttrVal(e))}for(e in f.__attrs){if(f.hasAttr(e)){f.reset(e)}}return f}});b.Attribute=a;function c(e){e=e+"";return e.charAt(0).toUpperCase()+e.substring(1)}a.__capitalFirst=c});KISSY.add("base",function(d){function c(e){d.Attribute.call(this);var f=this.constructor;while(f){b(this,f.ATTRS);f=f.superclass?f.superclass.constructor:null}a(this,e)}function b(g,f){if(f){for(var e in f){if(f.hasOwnProperty(e)&&!g.hasAttr(e)){g.addAttr(e,f[e])}}}}function a(g,f){if(f){for(var e in f){if(f.hasOwnProperty(e)){g.__set(e,f[e])}}}}d.augment(c,d.EventTarget,d.Attribute);d.Base=c});KISSY.add("core");
var TB=KISSY.app("TB");TB.add("mod~global",function(){var e=KISSY,j=!"0"[0],r=j&&!window.XMLHttpRequest,C=document,d=window,k,q,i=" ",n="hover",g,t="g_config" in d?("appId" in d.g_config?parseInt(d.g_config["appId"]):undefined):undefined,a="mini-cart",h="mini-cart-no-layer",m=location.hostname.split("."),D=C.domain,c=D.indexOf("tmall.com")>-1,v=!(D.indexOf("taobao.com")>-1||c),p=v?".daily.taobao.net":".taobao.com",B="",w=(C.location.href.indexOf("https://")===0),y={},b={siteNav:function(){if(!g){return}if(r){e.each(A("menu","*",g),function(F){var G=A("menu-bd","*",F)[0];if(F&&G){var E=false;if(!w){E=C.createElement("iframe");E.src="about: blank";E.className="menu-bd";F.insertBefore(E,G)}u(F,"mouseenter",function(){l(F,n);if(!E){return}E.style.height=parseInt(G.offsetHeight)+25+"px";E.style.width=parseInt(G.offsetWidth)+1+"px"});u(F,"mouseleave",function(){o(F,n)})}})}u(C.forms.topSearch,"submit",function(){if(form.q.value==B){form.action="http://list.taobao.com/browse/cat-0.htm"}})},tDog:function(){if((t&&t!=-1)||"tstart" in q||"tdog" in q){e.ready(function(){var E="http://"+k+"/p/header/webww-min.js?t=20110513.js";e.getScript(E)})}},tLabs:function(){var E=z("l");if(!E){return}e.ready(function(){var F="http://"+k+"/p/tlabs/??tlabs.js,base64.js,cookie.js,validator.js,loader.js,util.js,top.js?t=20101012.js";if("ks-local" in q){F="http://test.taobao.com/code/fed/2010/tlabs/combo.php?b=src&f=tlabs.js,base64.js,cookie.js,validator.js,loader.js,util.js,top.js"}e.getScript(F,function(){if(typeof TLabs!=="undefined"){TLabs.init(v?{baseUrl:"http://dev.labs.daily.taobao.net/l?b=/f/&f=",l:E}:{l:E})}})})},initHeaderLinks:function(){if(D.indexOf(".taobao.net")===-1){return}var G=g?g.getElementsByTagName("a"):[],F=0,E=G.length,H=m;while(H.length>3){H.shift()}H=H.join(".");for(;F<E;F++){G[F].href=G[F].href.replace("taobao.com",H)}},initLogout:function(){var E=C.getElementById("#J_Logout");if(!E){return}u(E,"click",function(G){G.halt();var F=E.href;new Image().src="//taobao.alipay.com/user/logout.htm";setTimeout(function(){location.href=F},20)})},initSiteNav:function(){var G=C.getElementById("J_Service"),F=C.getElementById("J_ServicesContainer"),I,E="http://www.taobao.com/index_inc/2010c/includes/get-services.php",J="__services_results";if(!G||!F){return}u(G,"mouseover",H);function H(){I=e.getScript(E+"?cb="+J)}window[J]=function(K){if(I){I.parentNode.removeChild(I)}I=null;try{F.innerHTML=K;F.style.height="auto";x(G,"mouseover",H)}catch(L){F.style.display="none"}}},jsBugTracker:function(){if(location.hostname.indexOf("daily.taobao.net")===-1){return}d.onerror=function(F,J,H){var E=z("_nk_"),G=z("tracknick"),I="http://tracker.ued.taobao.net/?collect&"+e.param({url:location.href,error:F,file:J,line:H,ua:navigator.userAgent,type:t,username:E||G,login:!!(z("_l_g_")&&E||z("ck1")&&G)})+"&t="+(+new Date());new Image().src=I}},test:function(){e.ready(function(){if(location.href.indexOf("__cloudyrun__")>-1){e.getScript("http://assets.daily.taobao.net/p/cloudyrun/1.0/cloudyrun-taobao-pkg.js?t="+(+new Date()))}})},miniCart:function(){var E=TB.Global;if(E._OFF){return}if(c||D.indexOf("tmall.net")>-1){if(e.isUndefined(t)){return}else{if(!(z("uc2")&&z("mt"))){e.getScript("http://www"+p+"/go/app/tmall/login-api.php?t="+e.now());return}}}E.initMiniCart()}};TB.Global={init:function(E){k=v?"assets.daily.taobao.net":"a.tbcdn.cn";q=e.unparam(location.search.substring(1));g=C.getElementById("site-nav");this._OFF=!!!g;this.config=E;if(E&&E.mc&&E.mc===-1){this._OFF=true}if(window.top!==window.self){e.log(["in frame, exit"]);this._OFF=true}for(var F in b){b[F]()}},writeLoginInfo:function(K){K=K||{};var T=this,F=z("_nk_")||z("tracknick"),H=f(z("uc1")),R=parseInt(H._msg_)||0,M=e.now(),L=K.memberServer||"http://member1.taobao.com",I=K.loginServer||"https://login.taobao.com",P=K.loginUrl||I+"/member/login.jhtml?f=top",G=location.href,E,O,N,Q,S,J=B;if(/^http.*(\/member\/login\.jhtml)$/i.test(G)){G=B}E=K.redirectUrl||G;if(E){P+="&redirectURL="+encodeURIComponent(E)}O=K.logoutUrl||I+"/member/logout.jhtml?f=top";N=L+"/member/newbie.htm";Q=L+"/message/list_private_msg.htm?t="+M;S="http://jianghu.taobao.com/admin/home.htm?t="+M;if(T.isLogin()){J='您好，<a class="user-nick" href="'+S+'" target="_top">'+s(unescape(F.replace(/\\u/g,"%u")))+"</a>！"+T.showVIP()+'<a id="J_Logout" href="'+O+'" target="_top">退出</a><a href="'+Q+'" target="_top">站内信';if(R){J+="("+R+")"}J+="</a>"}else{J='您好，欢迎来淘宝！<a href="'+P+'" target="_top">请登录</a>';J+='<a href="'+N+'" target="_top">免费注册</a>'}C.write(J)},showVIP:function(){var E=parseInt(f(z("uc1"))["tag"])||0,G=B,F="http://vip"+p;e.log(["vip",E]);if(e.indexOf(E,[1,2,3])>-1){G='<span class="menu"><a href="'+F+'" rel="nofollow" target="_top" class="user-vip vip-icon'+E+'" title="'+(E===1?"黄金":(E===2?"白金":"钻石"))+'会员"> </a></span>'}else{if(E===-100){G='<span class="menu"><span class="vip-ovl menu-bd">您已具备VIP资格<a href="'+F+'/apply_vip.htm" rel="nofollow" target="_top" >点亮VIP图标</a></span><a class="vip-icon0 menu-hd" rel="nofollow" target="_top" href="'+F+'"> <b></b></a></span>'}}return G},isLogin:function(){var F=z("tracknick"),E=z("_nk_")||F;return !!(z("_l_g_")&&E||z("ck1")&&F)},isGreyUser:function(){var G=f(z("uc2")),F,E;E=!!(G&&(F=G.ab)&&F.length>0&&F.substring(0,1)==="J");e.log(["isGreyUser",E]);return E},isInList:function(){var E=(e.indexOf(t,[2,5,6,3,1,15,19,7,8,9,17,18,10])>-1||c||D.indexOf("tmall.net")>-1);e.log(["isInList",E]);return E},getCartElem:function(){return g&&A("cart","li",g)[0]},initMiniCart:function(){var F=this,J="http://buy"+p+"/auction/cart/top_cart_quantity.htm?",H=function(){e.getScript(J+"callback=TB.Global.setCartNum&t="+e.now()+(t?"&appid="+t:B))};if(F._OFF=(F._OFF||!!!F.getCartElem())){return}e.log(["off",F._OFF]);var E=f(z("mt")),G,I;if(E&&(G=E.ci)){G=G.split("_");I=parseInt(G[1]);G=parseInt(G[0]);F._OFF=G<0;if(G<0){e.log("ci < 0, not request and not init minicart");return}if(F.isLogin()){if(I===0){e.log("login , cp = 0, ci >= 0, requesting");H()}else{if(I===1){e.log("login , cp = 1, minicart is init.");TB.Global.setCartNum(G)}}}else{if(I===0){e.log("not login , cp = 0, ci >= 0, minicart is init.");TB.Global.setCartNum(G)}else{if(I===1){e.log("not login , cp = 1, ci >= 0, requesting.");H()}}}}else{e.log(["no mt, requesting"]);H()}},setCartNum:function(G){if(!e.isNumber(G)||TB.Global._OFF){return}var F=TB.Global.getCartElem();if(!F){return}var H=F.getElementsByTagName("a")[0],I='<b class="mini-cart-line"></b><s></s>购物车',E=t!==19;if(G<0){TB.Global._OFF=G===-1;H.innerHTML=I;o(F,a);d.MiniCart&&d.MiniCart.hide();return}H.innerHTML=I+"<b"+(G<10?' class="mc-pt3"':B)+">"+G+"</b>件"+(E?"<i></i>":B);H.href="http://ju.atpanel.com/?url=http://buy"+p+"/auction/cart/my_cart.htm?from=mini&ad_id=&am_id=&cm_id=&pm_id=150042785330be233161";l(F,a);if(!E){l(F,h)}if(d.MiniCart){d.MiniCart.cartNum=G;d.MiniCart.isExpired=true}else{e.ready(function(){var J=0;e.getScript("http://"+k+"/p/global/1.0/minicart"+(v?B:"-min")+".js?t=20110519.js",function(){if(e.DOM){d.MiniCart.init(G,E)}else{e.log("minicart: try "+J);if(J<10){setTimeout(arguments.callee,1000);J++}else{e.use("core",function(){d.MiniCart.init(G,E)})}}})})}},run:function(E){var F=this;F.initMiniCart();b.tLabs();if(F.isLogin()){var G=0;e.later(function(){var I=C.getElementById("J_Logout");e.log(["tmall vip try: ",G]);if(!I){if(G<20){setTimeout(arguments.callee,20);G++}return}var H=F.showVIP();if(H.length<1){return}var J=C.createElement("div");J.innerHTML=H;I.parentNode.insertBefore(J.firstChild,I)},30)}}};function z(F){if(d.userCookie&&!e.isUndefined(d.userCookie[F])){return d.userCookie[F]}if(e.isUndefined(y[F])){var E=C.cookie.match("(?:^|;)\\s*"+F+"=([^;]*)");y[F]=(E&&E[1])?decodeURIComponent(E[1]):B}return y[F]}function s(F){var G=C.createElement("div"),E=C.createTextNode(F);G.appendChild(E);return G.innerHTML}function A(M,N,E){var G=E.getElementsByTagName(N||"*"),K=[],I=0,H=0,J=G.length,F,L;M=i+M+i;for(;I<J;++I){F=G[I];L=F.className;if(L&&(i+L+i).indexOf(M)>-1){K[H++]=F}}return K}function u(H,G,F,E){if(!H){return}if(H.addEventListener){H.addEventListener(G,F,!!E)}else{if(H.attachEvent){H.attachEvent("on"+G,F)}}}function x(H,G,F,E){if(!H){return}if(H.removeEventListener){H.removeEventListener(G,F,!!E)}else{if(H.detachEvent){H.detachEvent("on"+G,F)}}}function l(G,E){var F=i+G.className+i;if(F.indexOf(i+E+i)===-1){F+=E;G.className=e.trim(F)}}function o(G,E){var F=i+G.className+i;if(F.indexOf(i+E+i)!==-1){F=F.replace(i+E+i,i);G.className=e.trim(F)}}function f(E){if(d.userCookie&&d.userCookie.version=="2"){return e.unparam(E,"&amp;")}return e.unparam(E)}});
﻿var JSExt = {};

JSExt.$ = jQuery.noConflict();

JSExt.init = function (config) {
 //JSExt.$ = config.$ ? config.$ : null;
};


/******************************** 变量处理 ****************************************/

JSExt.variable = {};
JSExt.$V = function(name, val) {
 if (val == null) {
 return JSExt.variable[name];
 } else {
 JSExt.variable[name] = val;
 return true;
 }
};


/******************************** Util ****************************************/

JSExt.Util = {
 // 获取文件扩展名
 getFileExtName: function(fileName) {
 var extName = null;
 var extPos = fileName.lastIndexOf('.') + 1;

 if (extPos > 0) {
 extName = fileName.substr(extPos).toLowerCase();
 } else {
 extName = '';
 }

 return extName;
 },
 // 获取 Url 中的所有参数
 getUrlParams: function(url) {
 var szUrl = url == null ? document.location.href : url;
 var cacheKey = 'cache.JSExt.Util.getUrlParams.' + szUrl;

 if (!JSExt.$V(cacheKey)) {
 var aryParam = szUrl.substring(szUrl.indexOf('?') + 1).split('&');
 var params = {};

 for(var i = 0, length = aryParam.length; i < length; i++) {
 var paramPos = aryParam[i].indexOf('=');
 if (paramPos >= 0) {
 params[aryParam[i].substr(0, paramPos)] = aryParam[i].substr(paramPos + 1);
 } else {
 params[aryParam[i]] = '';
 }
 }

 JSExt.$V(cacheKey, params);
 }

 return JSExt.$V(cacheKey);
 },
 // 获取 Url 中的某个参数
 getUrlParam: function(paramName) {
 return this.getUrlParams()[paramName];
 },
 // 设置 Tab
 setToTab: function(tabElms) {
 tabElms.find('[callTab]').click(function(){
 tabElms.children('ul').children('li').removeClass('tab_selected');
 JSExt.$(this).parent().addClass('tab_selected');
 tabElms.children('div').removeClass('tab_selected');
 tabElms.children('div').filter('[tabId=' + JSExt.$(this).attr('callTab') + ']').addClass('tab_selected');
 });
 },
 // 设置 Tab
 setToWindow: function(tabElms) {
 tabElms.find('[callTab]').click(function(){
 tabElms.children('ul').children('li').removeClass('tab_selected');
 JSExt.$(this).parent().addClass('tab_selected');
 tabElms.children('div').removeClass('tab_selected');
 tabElms.children('div').filter('[tabId=' + JSExt.$(this).attr('callTab') + ']').addClass('tab_selected');
 });
 },
 getGMTTime: function(dateObj) {
 var gmtOffset = parseInt(dateObj.getTimezoneOffset()) * 60 * 1000;
 var timestamp = parseInt(dateObj.getTime()) + gmtOffset;

 return timestamp;
 }
};


/******************************** 事件处理 ****************************************/

JSExt.Event = {
 bind: function(oTarget, sEventType, fnHandler) {
 if(oTarget.addEventListener){
 oTarget.addEventListener(sEventType, fnHandler, false);
 }else if(oTarget.attachEvent){
 oTarget.attachEvent("on" + sEventType, fnHandler);
 }else{
 oTarget["on" + sEventType] = fnHandler;
 }
 },
 unbind: function(oTarget, sEventType, fnHandler) {
 if(oTarget.removeEventListener){
 oTarget.removeEventListener(sEventType, fnHandler, false);
 }else if(oTarget.detachEvent){
 oTarget.detachEvent("on" + sEventType, fnHandler);
 }else{
 oTarget["on" + sEventType] = null;
 }
 },
 getEvent: function() {
 if(window.event){
 return window.event;
 }else{
 return JSExt.Event.getEvent.caller.arguments[0];
 }
 },
 getSrcElement: function(evt) {
 return evt.srcElement ? evt.srcElement : evt.target;
 },
 fire: function(element, eventName) {
 if (element) {
 if (document.all && navigator.userAgent.toLowerCase().match(/msie ([\d.]+)/)[1] < 9) {
 element.fireEvent('on' + eventName);
 } else {
 var evt = document.createEvent('HTMLEvents');
 evt.initEvent(eventName, true, true);
 element.dispatchEvent(evt);
 }
 }
 }
};


/******************************** 模板处理 ****************************************/

JSExt.Template = function(containerId, templateTagName, templateNameAttr) {
 this.list = function (containerId, templateTagName, templateNameAttr) {
 containerId = containerId ? containerId : 'attributeTemplateList';
 templateTagName = templateTagName ? templateTagName : 'div';
 templateNameAttr = templateNameAttr ? templateNameAttr : 'templateName';
 var cacheName = 'cache.templateList.' + containerId + templateTagName + templateNameAttr;

 if (!JSExt.$V(cacheName)) {
 var templateElmList = document.getElementById(containerId).getElementsByTagName(templateTagName);
 var templateList = {};
 for (var i = 0, length = templateElmList.length; i < length; i++) {
 if (templateElmList[i].getAttribute(templateNameAttr)) {
 templateList[templateElmList[i].getAttribute(templateNameAttr)] = templateElmList[i];
 }
 }

 JSExt.$V(cacheName, templateList);
 }

 return JSExt.$V(cacheName);
 };
 this.get = function (name, data) {
 var templateList = this.list(this.containerId, this.templateTagName, this.templateNameAttr);
 if (data.code && templateList[name + '_' + data.code] != null && templateList[name].innerHTML.length > 0) {
 name = name + '_' + data.code;
 } else if (templateList[name] == null || templateList[name].innerHTML.length == 0) {
 templateList[name] = {innerHTML: '<' + templateTagName + '></' + templateTagName + '>'};
 }
 var template = templateList[name].innerHTML;

 // 处理变量
 var pattern = '({\\$[a-zA-Z0-9_\.]{1,}})|(%7B\\$[a-zA-Z0-9_\.]{1,}%7D)';
 var regex = new RegExp(pattern, 'g');
 var templateVarList = template.match(regex);
 if (templateVarList != null) {
 for (var i = 0, length = templateVarList.length; i < length; i++) {
 template = template.replace(templateVarList[i], this.Util.getData(templateVarList[i], data));
 }
 }

 // 处理常量
 var pattern = '{\\@([a-zA-Z0-9_\.]{1,})}|%7B\\@([a-zA-Z0-9_\.]{1,})%7D';
 var regex = new RegExp(pattern, 'g');
 template = template.replace(regex, '$1');

 return template;
 };
 this.Util = {
 getData: function (name, data) {
 var result = null;
 var key = name.substr(0,1) == '{' ? name.substr(2, name.length - 3) : name.substr(4, name.length - 7);
 key = key.indexOf('.') == -1 ? key : key.split('.');

 if (JSExt.$.isArray(key)) {
 var tempVar = data;
 for (var i = 0, length = key.length; i < length; i++) {
 if (tempVar[key[i]]) {
 tempVar = tempVar[key[i]];
 }
 }
 if (JSExt.$.inArray(typeof tempVar, ['string', 'number', 'boolean']) >= 0) {
 result = tempVar;
 }
 } else if (data[key]) {
 result = data[key];
 }

 return result == null ? '' : result;
 }
 };
};


/******************************** 商品类 ****************************************/

JSExt.Product = {};

//产品画册
JSExt.Product.Image = {
 isInit: false, 
 config: {}, 
 // 初始化
 init: function(configData) {
 this.setColorListData(configData.colorData.list);
 if (typeof configData.bindLoadGallery == 'boolean' && configData.bindLoadGallery) {
 JSExt.Product.Attr.Event.postEvent.optionClick.loadCurrentGalleryImage = JSExt.Product.Image.loadCurrentGallery;
 } else if (typeof configData.bindLoadGallery == 'function') {
 JSExt.Product.Attr.Event.postEvent.optionClick.loadCurrentGalleryImage = configData.bindLoadGallery;
 }
 this.loadingEnable=false;
 if(configData.loadingEnable){
 this.loadingEnable=true;
 }
 this.isInit = true;
 }, 
 setColorListData: function(colorData) {
 this.config.colorListData = colorData;
 }, 
 getLoadingEnable:function(){
 return this.loadingEnable;
 },
 getColorListData: function() {
 return this.config.colorListData;
 }, 
 // 选择图片
 select: function(elm) {
 try {
 if (!JSExt.Product.Image.isInit) {
 throw 'Please initialize object first!';
 }
 var obj = JSExt.$(elm);
 var colorId = obj.attr('imgColorId');
 obj.parent("li").hide().siblings().show();
 // 如果找不到属性，则加载
 if (!elm.bigImg) {
 var galleryImagesData = JSExt.Product.Image.getColorListData()[colorId].galleryImages;
 for (var i = 0, length = galleryImagesData.length; i < length; i++) {
 if (galleryImagesData[i].info.id == elm.imgId) {
 elm.baseImg = galleryImagesData[i].image.base;
 elm.bigImg = galleryImagesData[i].image.big;
 elm.fileType = galleryImagesData[i].info.fileType;
 break;
 }
 }
 }

 // 读取数据
 var productImageBoxClass = '.product-img-box-' + elm.attr.getProductId();
 var galleryImage = JSExt.$(productImageBoxClass + ' > div > div > div > #gallery-image');
 var galleryFlash = JSExt.$(productImageBoxClass + ' > div > div > div > #gallery-flash');
 var imageContainerInner = JSExt.$(productImageBoxClass + ' > div > div > #image-container-inner');
 var flashContainerInner = JSExt.$(productImageBoxClass + ' > div > div > #flash-container-inner');
 if (elm.fileType && elm.fileType != 'swf') {
 galleryImage.attr('alt', obj.attr('alt'));
 galleryImage.attr('title', obj.attr('title'));
 if(this.loadingEnable){
 this.loadImage(galleryImage,obj.attr('baseImg'),elm.attr.getProductId());
 }else{
 galleryImage.attr('src', elm.baseImg);
 }
 galleryImage.attr('jqImg', elm.bigImg);
 flashContainerInner.css('display', 'none');
 imageContainerInner.css('display', 'block');
 } else {
 galleryFlash.children('param[name=movie]').val(elm.baseImg);
 galleryFlash.children('embed:first').attr('src', elm.baseImg);
 imageContainerInner.css('display', 'none');
 flashContainerInner.css('display', 'block');
 }
 } catch (e) { throw e; }
 }, 
 /*********************************************************/
 loadImage:function(elm,baseImg,productId){
 var img = new Image();
 img.src=baseImg;
 if(img.complete){
 elm.attr('src', baseImg);
 return;
 }
 this.elmDisabled(elm,productId);
 JSExt.$(img).load(function(){
 elm.attr('src', baseImg);
 JSExt.Product.Image.loadingDivHide(productId);
 elm.parent().addClass('jqzoom');
 if(loadingTimeId){
 clearTimeout(loadingTimeId);
 }
 return false;
 });
 var loadingTimeId=setTimeout(function(){
 elm.attr('src', baseImg);
 JSExt.Product.Image.loadingDivHide(productId);
 if(!elm.parent().hasClass('jqzoom')){
 elm.parent().addClass('jqzoom');
 }
 },10000);
 
 },
 elmDisabled:function(elm,productId){
 this.galleryImageLoading(elm,productId);
 this.moreviewsDisabled(productId);
 this.attributeReloadContainerDisabled(productId);
 },
 galleryImageLoading:function(elm,productId){
 var height=parseInt(elm.css('height'));
 var width=parseInt(elm.css('width'));
 var loadingElm='.gallery-image-loading-'+productId;
 JSExt.$(loadingElm)
 .css({'width':width+2+'px','height':height+2+'px'})
 .css({'opacity': '0.4','filter': 'alpha(opacity=40)','-moz-opacity': '0.4'})
 .show();
 var marginValue=(height-90)/2+'px auto';
 JSExt.$(loadingElm).children('img').css('margin',marginValue);
 elm.parent().removeClass('jqzoom');
 },
 moreviewsDisabled:function(productId){
 var elm=JSExt.$('.more-views');
 var height=elm.height();
 var width=elm.width();
 JSExt.$('.more-views-disabled-'+productId)
 .css({'width':width+'px','height':height+'px'}).show()
 .css({'opacity': '0.4','filter': 'alpha(opacity=40)','-moz-opacity': '0.4'});
 },
 attributeReloadContainerDisabled:function(productId){
 var elm=JSExt.$('.product-info-'+productId);
 var height=elm.height();
 var width=elm.width();
 JSExt.$('.attributeReloadContainer-disabled-'+productId)
 .css({'width':width+'px','height':height+'px','z-index':'100'}).show()
 .css({'opacity': '0.4','filter': 'alpha(opacity=40)','-moz-opacity': '0.4'});
 },
 loadingDivHide:function(productId){
 JSExt.$('.attributeReloadContainer-disabled-'+productId).hide();
 JSExt.$('.more-views-disabled-'+productId).hide();
 JSExt.$('.gallery-image-loading-'+productId).hide();
 },
 /*********************************************************/
 //列表页切换
 turnSecondImg:function(elm, isSecond){
 /*
 if (!elm.isInitSecondData) {
 var imgSecondSrc = elm.getAttribute("second_img");
 elm.secondImage = imgSecondSrc ? imgSecondSrc : null;
 elm.smallImage = elm.src;
 elm.isInitSecondData = true;
 }
 elm.isSecond = isSecond ? true : false;
 if (elm.isSecond && elm.secondImage){
 if (elm.existSecondImage == undefined) {
 var Img = new Image;
 Img.src = imgSecondSrc;
 Img.onload = function(){
 elm.existSecondImage = true;
 if (elm.isSecond) {
 elm.src = elm.secondImage;
 }
 };
 Img.onerror = function(){
 elm.existSecondImage = false;
 };
 } else if (elm.existSecondImage) {
 elm.src = elm.secondImage;
 }
 } else {
 elm.src = elm.smallImage;
 }
 */
 var elm=JSExt.$(elm);
 var elm_img_url=elm.attr('src');
 var second_url=elm.attr('second_img');
 if(second_url.indexOf('second_image.jpg')==-1){
 elm.attr('src',second_url);
 elm.attr('second_img',elm_img_url); 
 }
 },
 // 加载当前列表
 loadCurrentGallery: function() {
 try {
 var attr = this.opt.attr;
 var opt = this.opt;
 var productId = attr.getProductId();
 JSExt.Product.Image.setColorListData(attr.getColorData().list);
 if (!JSExt.Product.Image.isInit) {
 throw 'Please initialize object first!';
 }
 var colorId = attr.getValByCode('color');
 var moreView = JSExt.$('.product-img-box-' + productId + ' > .more-views > ul');
 if (moreView.attr('colorId') == colorId) {
 return ;
 }
 var tempElm = moreView.children('li').eq(0);
 var template = tempElm.html();
 if (colorId > 0 && template != null && template.length > 0) {
 moreView.html('');
 var galleryImagesData = JSExt.Product.Image.getColorListData()[colorId].galleryImages;
 var imageLabel = null;
 var productName =JSExt.$('.product-2col-right .product-shop .product-name h1').val();
 for (var i = 0, length = galleryImagesData.length; i < length; i++) {
 var templateObj = JSExt.$(template);
 templateObj.removeAttr('src');
 var templateElm = templateObj.get(0);
 templateElm.attr = attr;
 if(galleryImagesData[i].info.label=="nozoom" || !galleryImagesData[i].info.label){
 imageLabel = productName+"-"+JSExt.Product.Image.getColorListData()[colorId].label;
 } else {
 imageLabel = galleryImagesData[i].info.label;
 }
 templateObj.attr('alt', imageLabel);
 templateObj.attr('title', imageLabel);
 templateObj.attr('src', galleryImagesData[i].image.thumbnail);
 templateElm.fileType = galleryImagesData[i].info.fileType;
 templateElm.baseImg = galleryImagesData[i].image.base;
 templateElm.bigImg = galleryImagesData[i].image.big;
 templateElm.imgId = galleryImagesData[i].image.id;
 templateElm.imgColorId = galleryImagesData[i].image.colorId;
 if(length==1){
 moreView.hide();
 }else{
 moreView.show();
 }
 var tempElm = JSExt.$('<li></li>').append(templateObj);
 moreView.append(tempElm);
 }
 }
 moreView.attr('colorId', colorId);
 if (moreView.children('li').children('img').length > 0) {
 JSExt.Event.fire(moreView.children('li').children('img').get(0), 'click');
 }
 } catch (e) { throw e; }
 }
};


//////////////////////////////////////////////////////////////////////////
// 产品属性
JSExt.Product.Attr = function(config) {
 this.tpl = null;
 this.dataCache = {};
 this.cache = function(key, data) {
 if (typeof(data) != 'undefined') {
 this.dataCache[key] = data;
 }

 return this.dataCache[key];
 };
 // 初始化数据
 this.init = function(config) {
 this.tpl = config.tpl ? config.tpl : this.tpl;
 this.opt = new JSExt.Product.Attr.Option(this);
 if (config.attributeData) {
 if (config.attributeDataIndex) {
 this.getFormatedData(config.attributeData, config.attributeDataIndex);
 } else {
 this.getFormatedData(config.attributeData);
 }
 } else {
 throw 'attribute data source not found!';
 }
 if (config.colorData) {
 this.setColorData(config.colorData);
 var mergeColorData = this.mergeColorData4AttrData(this.getFormatedData(), config.colorData);
 this.setFormatedData(mergeColorData);
 this.selectColor='';
 if(config.colorData.selectColor){
 if(config.colorData.selectColor.length>0){
 this.selectColor=config.colorData.selectColor;
 }
 }
 }
 if (config.defaultShow) {
 this.show();
 }
 };
 this.config = {
 showTipIn: 'after', // before, after, null
 showAllOption: false,
 defaultSelect: false,
 attributeContainerType: 'reload'
 };
 this.formatData = function(sourceData, attributeConfigIndex) {
 // 初始化数据
 if (sourceData == null) {
 return false;
 }
 var formatedData = [];
 var attributeKeys = [];

 // 取得所有Key
 for (var key in sourceData.attributes) {
 attributeKeys.push(key);
 }

 // 格式化数据
 var attributeKeysCount = attributeKeys.length;
 for (var i = 0; i < attributeKeysCount; i++) {
 var tempDataObj = {};

 // 取得节点信息
 tempDataObj.info = {id: sourceData.attributes[attributeKeys[i]].id,
 code: sourceData.attributes[attributeKeys[i]].code,
 label: sourceData.attributes[attributeKeys[i]].label};

 // 取得节点选项信息
 tempDataObj.options = [];
 JSExt.$.each(sourceData.attributes[attributeKeys[i]].options, function(key, obj){
 var tempObj = {};
 tempObj.info = {id: obj.id,
 label: obj.label,
 code: sourceData.attributes[attributeKeys[i]].code};
 tempObj.products = obj.products;

 tempDataObj.options.push(tempObj);
 });

 formatedData.push(tempDataObj);
 }

 // 重组数据排序
 if (attributeConfigIndex != null) {
 var tempFormatedData = [];
 for (var i = 0, length = formatedData.length; i < length; i++) {
 for (var key in attributeConfigIndex) {
 if (formatedData[i].info.id == key) {
 tempFormatedData[attributeConfigIndex[key]] = formatedData[i];
 }
 }
 }
 formatedData = tempFormatedData;
 }

 return formatedData;
 };
 this.getProductId = function () {
 return this.getSourceData()['productId'];
 };
 this.setColorData = function (data) {
 this.cache('colorData', data);
 return true;
 };
 this.getColorData = function () {
 return this.cache('colorData');
 };
 this.setFormatedData = function (data) {
 this.cache('formatedData', data);
 return true;
 };
 this.getSourceData = function () {
 return this.cache('sourceData');
 };
 this.getFormatedData = function (sourceData, attributeConfigIndex) {
 if (sourceData) {
 this.cache('sourceData', sourceData);
 this.cache('formatedData', this.formatData(sourceData, attributeConfigIndex));
 } else if (!this.cache('formatedData')) {
 throw 'format data is not found!';
 }

 return this.cache('formatedData');
 };
 this.mergeColorData4AttrData = function(attrData, colorData) {
 for (var i = 0, attrLength = attrData.length; i < attrLength; i++) {
 if (attrData[i].info.code == 'color') {
 for (var key = 0, optLength = attrData[i].options.length; key < optLength; key++) {
 if (colorData.list[attrData[i].options[key].info.id] != null) {
 attrData[i].options[key].info.colorData = colorData.list[attrData[i].options[key].info.id];
 if(colorData.list[attrData[i].options[key].info.id].colorName){
 var colorNameTmp=colorData.list[attrData[i].options[key].info.id].colorName;
 colorNameTmp=colorNameTmp.replace(' ','-');
 colorNameTmp=colorNameTmp.replace('/','-');
 colorNameTmp=colorNameTmp.replace('.','-');
 attrData[i].options[key].info.colorName = colorNameTmp.toLowerCase();
 }
 }
 }

 break;
 }
 }

 return attrData;
 };
 this.getAttributeContainer = function() {
 return document.getElementById('attributeReloadContainer-' + this.getProductId());
 };
 this.getLastAttribute = function() {
 var attributeReloadContainer = this.getAttributeContainer();
 var attributeElms = attributeReloadContainer.childNodes;
 for (var i = attributeElms.length - 1; i >= 0; i--) {
 if (attributeElms[i].nodeType == 1 && attributeElms[i].getAttribute('isOptionContainer') != null) {
 return attributeElms[i];
 }
 }

 return null;
 };
 // 获取属性值
 this.getValByCode = function(code) {
 var attributeElm = null;
 var formatedData = this.getFormatedData();
 var attributeId = null;

 for (var i = 0, length = formatedData.length; i < length; i++) {
 if (formatedData[i].info.code == code) {
 attributeId = formatedData[i].info.id;
 break;
 }
 }

 if (attributeId == null) {
 return null;
 }

 attributeElm = this.getElmObj(attributeId);

 return attributeElm.value;
 };
 // 获取属性代码
 this.getCodeById = function(attrId) {
 var formatedData = this.getFormatedData();
 for (var i = 0, length = formatedData.length; i < length; i++) {
 if (formatedData[i].info.id == attrId) {
 return formatedData[i].info.code;
 }
 }

 return null;
 };
 // 获取属性Id
 this.getElmId = function(attrKey, type) {
 var elmId = 'attribute-' + this.getProductId() + '-';

 if (type == 'reload') {
 elmId += attrKey + '-reload';
 } else if (type == 'tip-container') {
 elmId += attrKey + '-tip-container';
 } else {
 elmId += attrKey;
 }

 return elmId;
 };
 // 获取属性Obj
 this.getElmObj = function(attrKey, type) {
 var elmId = this.getElmId(attrKey, type);
 elm = document.getElementById(elmId);

 return elm;
 };
 // 初始化数据
 this.create = function(attrKey, createOption, isForce) {
 var attributeData = this.getFormatedData()[attrKey];
 var attributeContainer = this.getAttributeContainer();
 var optionContainer = JSExt.$(this.tpl.get('optionContainer', attributeData.info)).get(0);
 var optionContainerId = this.getElmId(attributeData.info.id, this.config.attributeContainerType);

 if (!isForce && document.getElementById(optionContainerId)) {
 return ;
 }

 // 创建选项容器
 optionContainer.setAttribute('id', optionContainerId);
 optionContainer.setAttribute('attrId', attributeData.info.id);
 optionContainer.setAttribute('attrCode', attributeData.info.code);
 optionContainer.setAttribute('attrLv', attrKey);
 optionContainer.setAttribute('isOptionContainer', 1);
 optionContainer.style.display = 'none';
 attributeContainer.appendChild(optionContainer);

 // 创建提示容器
 var tipContainer = null;
 if (this.config.showTipIn != null) {
 tipContainer = document.createElement('div');
 tipContainer.setAttribute('id', this.getElmId(attributeData.info.id, 'tip-container'));
 }

 if (tipContainer != null && this.config.showTipIn == 'before') {
 optionContainer.appendChild(tipContainer);
 }

 // 创建选项及绑定事件
 if (createOption == null || createOption == true) {
 var aoReKey = 0;
 for (var optKey in attributeData.options) {
 if (isNaN(optKey)) {
 continue;
 }
 var optionData = attributeData.options[optKey];
 if (!this.opt.inAttribute(attrKey, optKey)) {
 continue;
 }

 var tempElmList = [];
 var optionListContainer = null;
 // get optionContainer.children
 for (var i = 0, cnLength = optionContainer.childNodes.length; i < cnLength; i++) {
 if (optionContainer.childNodes[i].nodeType == 1) {
 tempElmList.push(optionContainer.childNodes[i]);
 }
 }
 if (tempElmList.length > 0) {
 for (var i = 0, length = tempElmList.length; i < length; i++) {
 if (tempElmList[i].getAttribute('containerType') && 
 tempElmList[i].getAttribute('containerType') == 'optionList') {
 optionListContainer = tempElmList[i];
 break;
 }
 }
 }
 if (!optionListContainer) {
 optionListContainer = optionContainer;
 }
 this.opt.create(optionListContainer, optionData, optionContainer.getAttribute('id'), attrKey, aoReKey++);
 }
 }

 if (tipContainer != null && this.config.showTipIn == 'after') {
 optionContainer.appendChild(tipContainer);
 }
 };
 // 显示属性选项
 this.show = function(attrKey) {
 JSExt.Product.Attr.Event.execute('pre', 'attributeShow', this, arguments);

 attrKey = (typeof attrKey == 'number' && attrKey > 0) ? attrKey : 0;

 var attributeContainer = this.getAttributeContainer();
 var attributeData = this.getFormatedData()[attrKey];
 if (attributeData == null) {
 return false;
 }

 // 去除所选属性的所有下级节点
 if (attributeContainer.hasChildNodes && attrKey > 0) {
 var removeList = [];
 JSExt.$.each(attributeContainer.childNodes, function(key, optionElm) {
 if (optionElm && (optionElm.getAttribute('attrLv') == null || parseInt(optionElm.getAttribute('attrLv')) >= attrKey)) {
 removeList.push(optionElm);
 }
 });
 
 for (var i = 0; i < removeList.length; i++) {
 // 如果非默认显示全部，则去除未显示选项的选择提示
 if (this.config.showAllOption == false && removeList[i].getAttribute('attrId') != null) {
 var attributeElm = this.getElmObj(removeList[i].getAttribute('attrId'));
 if (attributeElm.disabled && attributeElm.options.length > 0) {
 attributeElm.options[0].removeAttribute('value');
 }
 }

 attributeContainer.removeChild(removeList[i]);
 }
 
 }

 // 创建并显示下级节点
 this.create(attrKey);
 var currentAttributeElm = document.getElementById(this.getElmId(attributeData.info.id, this.config.attributeContainerType));
 currentAttributeElm.style.display = 'block';

 JSExt.Product.Attr.Event.execute('post', 'attributeShow', this, arguments, {'currentAttributeElm': currentAttributeElm});
 };

 this.init(config);
};
JSExt.Product.Attr.Event = {
 preEvent: {},
 postEvent: {},
 getParam: function(args) {
 if (args.length > 0) {
 return args[args.length - 1];
 } else {
 return {};
 }
 },
 execute: function(type, action, thisObj, args, param) {
 var events = this[type + 'Event'][action];
 var params = [];
 for (var i = 0, length = args.length; i < length; i++) {
 params[i] = args[i];
 }
 params.push(param);

 for (var key in events) {
 events[key].apply(thisObj, params);
 }
 }
};


JSExt.Product.Attr.Option = function (attr) {
 this.attr = attr;
 this.inAttribute = function(attrKey, optKey) {
 var attributeData = this.attr.getFormatedData()[attrKey];
 var optionProducts = attributeData.options[optKey].products;

 if (attributeData == null) {
 return false;
 }

 // 取得选项商品，并回朔上级选项是否存在该商品
 for (var key = attrKey - 1; key >= 0; key--) {
 var tempArr = [];
 var aProducts = this.getSelectedData(key).products;
 for (var i = 0, length = optionProducts.length; i < length; i++) {
 if (JSExt.$.inArray(optionProducts[i], aProducts) >= 0) {
 tempArr.push(optionProducts[i]);
 }
 }

 optionProducts = tempArr;
 if (optionProducts.length < 1) {
 return false;
 }
 }

 return true;
 };
 this.getElmId = function(attrElmId, optKey, type) {
 var elmId = attrElmId + '-option-' + optKey + '-' + type;

 return elmId;
 };
 this.getElmByChild = function(childElm) {
 var elm = childElm;
 for (var i = 0; i < 20; i++) {
 if (!elm || elm.getAttribute('isOption')) {
 break;
 } else {
 elm = elm.parentNode;
 }
 }

 return elm;
 };
 this.getContainer = function(optElm) {
 var container = optElm.parentNode;
 for (var i = 0; i < 20; i++) {
 if (!container || container.getAttribute('isOptionContainer')) {
 break;
 } else {
 container = container.parentNode;
 }
 }

 return container;
 };
 this.getOptionElms = function(container) {
 var nodes = container.childNodes;
 var optionElmContainer = null;
 for (var i = 0, length = nodes.length; i < length; i++) {
 if (nodes[i].nodeName != '#text' && nodes[i].getAttribute('containerType') && nodes[i].getAttribute('containerType') == 'optionList') {
 optionElmContainer = nodes[i];
 break;
 }
 }
 if (!optionElmContainer) {
 optionElmContainer = container;
 }

 return optionElmContainer.childNodes;
 };
 this.getTipContainers = function(container) {
 var nodes = container.childNodes;
 var elms = [];

 for (var i = 0, length = nodes.length; i < length; i++) {
 if (nodes[i].nodeName != '#text' && nodes[i].getAttribute('id') && nodes[i].getAttribute('id').indexOf('-' + this.attr.getElmId(container.getAttribute('attrId'), 'tip-container')) >= 0) {
 elms.push(nodes[i]);
 }
 }

 return elms;
 };
 this.getSelectedElm = function(attrKey) {
 var attributeData = this.attr.getFormatedData()[attrKey];
 var optionElm = JSExt.$('#' + this.attr.getElmId(attributeData.info.id));

 for ( var i = 0, length = attributeData.options.length; i < length; i++ ) {
 if (attributeData.options[i].info.id == optionElm.val()) {
 var elmId = this.getElmId(this.attr.getElmId(attributeData.info.id, this.attr.config.attributeContainerType), i, 'select');
 return document.getElementById(elmId);
 }
 }

 return null;
 };
 this.getSelectedData = function(attrKey) {
 var attributeData = this.attr.getFormatedData()[attrKey];
 var optionElm = JSExt.$('#' + this.attr.getElmId(attributeData.info.id));

 for ( var i = 0, length = attributeData.options.length; i < length; i++ ) {
 if (attributeData.options[i].info.id == optionElm.val()) {
 return attributeData.options[i];
 }
 }

 return {};
 };
 this.create = function(optionContainer, optionData, attrElmId, attrKey, optKey) {
 // 创建默认状态
 var defaultOptionElm = JSExt.$(this.attr.tpl.get('optionNotSelect', optionData.info)).get(0);
 defaultOptionElm.cacheData = {};
 defaultOptionElm.setAttribute('id', this.getElmId(attrElmId, optKey, 'default'));
 defaultOptionElm.setAttribute('attrLv', attrKey);
 defaultOptionElm.setAttribute('optLv', optKey);
 defaultOptionElm.setAttribute('optId', optionData.info.id);
 defaultOptionElm.setAttribute('title', optionData.info.label);
 defaultOptionElm.setAttribute('isOption', 1);
 if(optionData.info.colorName){
 defaultOptionElm.setAttribute('colorname', optionData.info.colorName);
 }
 defaultOptionElm.setAttribute('optionType', 'default');
 defaultOptionElm.setAttribute('optionKey', attrKey + '_' + optKey);
 defaultOptionElm.cacheData.displayMode = defaultOptionElm.style.display ? defaultOptionElm.style.display : '';

 optionContainer.appendChild(defaultOptionElm);
 defaultOptionElm.opt = this;
 JSExt.Event.bind(defaultOptionElm, 'click', this.Event.click);

 // 创建选中状态
 var selectOptionElm = JSExt.$(this.attr.tpl.get('optionIsSelect', optionData.info)).get(0);
 selectOptionElm.cacheData = {};
 selectOptionElm.setAttribute('id', this.getElmId(attrElmId, optKey, 'select'));
 selectOptionElm.setAttribute('attrLv', attrKey);
 selectOptionElm.setAttribute('optLv', optKey);
 selectOptionElm.setAttribute('optId', optionData.info.id);
 selectOptionElm.setAttribute('title', optionData.info.label);
 if(optionData.info.colorName){
 selectOptionElm.setAttribute('colorname', optionData.info.colorName);
 }
 selectOptionElm.setAttribute('isOption', 1);
 selectOptionElm.setAttribute('optionType', 'selected');
 selectOptionElm.setAttribute('optionKey', attrKey + '_' + optKey);
 selectOptionElm.cacheData.displayMode = selectOptionElm.style.display ? selectOptionElm.style.display : '';
 selectOptionElm.style.display = 'none';

 optionContainer.appendChild(selectOptionElm);

 var param = {'defaultOptionElm': defaultOptionElm, 'selectOptionElm': selectOptionElm, 'optionData': optionData, 'attrKey': attrKey};
 JSExt.Product.Attr.Event.execute('post', 'optionCreate', this, arguments, param);
 };
 this.Event = {
 select: function() {
 var opt = this.opt ? this.opt : this;
 var optionElm = opt.getElmByChild(this);
 if (optionElm.getAttribute('notExeBasicEvent')) {
 return false;
 }

 var optionContainer = opt.getContainer(optionElm);
 var selectElm = opt.attr.getElmObj(optionContainer.getAttribute('attrId'));

 // 当选项不允许选择时
 if (selectElm.disabled) {
 return false;
 }

 selectElm.value = optionElm.getAttribute('optId');
 JSExt.Event.fire(selectElm, 'change');

 // 选择成功
 if (selectElm.value == optionElm.getAttribute('optId')) {
 var optionElmList = opt.getOptionElms(optionContainer);

 // 所有选项置为默认状态
 for (var i = 0, length = optionElmList.length; i < length; i++) {
 if (optionElmList[i].nodeType == 1) {
 if (optionElmList[i].getAttribute('optionType') == 'selected') {
 optionElmList[i].style.display = 'none';
 } else {
 optionElmList[i].style.display = optionElmList[i].cacheData.displayMode;
 }
 }
 }
 var removeList = opt.getTipContainers(optionContainer);
 // 去除本选项提示信息
 for (var i = 0, length = removeList.length; i < length; i++) {
 optionContainer.removeChild(removeList[i]);
 }

 // 改变选中选项样式
 var optionObj = JSExt.$(optionElm);
 optionObj.css('display', 'none');
 var optionOtherObj = optionObj.siblings('[optionKey=' + optionObj.attr('optionKey') + ']').get(0);
 optionOtherObj.style.display = optionOtherObj.cacheData.displayMode;

 // 显示下级菜单
 opt.attr.show(parseInt(optionContainer.getAttribute('attrLv')) + 1);
 } else {
 throw "Select failure, Options exception!";
 }
 }, 
 click: function() {
 var _this = JSExt.Event.getSrcElement(JSExt.Event.getEvent(this));
 JSExt.Product.Attr.Event.execute('pre', 'optionClick', _this, arguments);
 _this.opt.Event.select.apply(_this, arguments);
 JSExt.Product.Attr.Event.execute('post', 'optionClick', _this, arguments);
 }
 };
};



////////////////////////////////////// 商品事件

JSExt.Product.Event = {};

// 改变购买数
// @param $V.Product.Event.changeQty.maxQty
JSExt.Product.Event.changeQty = function(elm, operateType, qty) {
 if (operateType != 'add' && operateType != 'sub' && operateType != 'set') {
 return false;
 }

 var $ = JSExt.$;
 elm = $(elm);
 var maxQty = parseInt(JSExt.$V('Product.Event.changeQty.maxQty'));
 var productElm = $('[isOption=1][optionType=selected]:visible:last');
 var productQty = productElm.length > 0 ? parseInt(productElm.attr('productsQty')) : null;
 maxQty = isNaN(maxQty) ? null : maxQty;
 productQty = (productQty && !isNaN(productQty)) ? productQty : null;
 if (productQty && maxQty) {
 maxQty = maxQty > productQty ? productQty : maxQty;
 } else if (productQty) {
 maxQty = productQty;
 }

 var qtyElm = elm.attr('elmId') ? elm : $('[elmId=' + elm.attr('callElm') + ']').eq(0);
 var currentQty = parseInt(qtyElm.val());
 currentQty = (isNaN(currentQty) || currentQty < 1) ? 1 : currentQty;

 qty = operateType == 'set' ? currentQty : parseInt(qty);
 qty = (isNaN(qty) || qty < 1) ? 1 : qty;

 if (operateType == 'add' && ((maxQty && (currentQty + qty) <= maxQty) || !maxQty)) {
 currentQty += qty;
 } else if (operateType == 'sub') {
 if (currentQty > qty) {
 currentQty -= qty;
 }
 } else if (operateType == 'set') {
 currentQty = qty;
 }

 if (maxQty && currentQty > maxQty) {
 currentQty = maxQty;
 }

 qtyElm.val(currentQty);
};


////////////////////////////////////// 商品属性事件
//currentAttributeElm
JSExt.Product.Attr.Event.preEvent.attributeShow = {};
//currentAttributeElm
JSExt.Product.Attr.Event.postEvent.attributeShow = {};

// 默认选择第一个选项
JSExt.Product.Attr.Event.postEvent.attributeShow.defaultSelect = function() {
 var attr = this;
 var opt = this.opt;
 if (attr.config.defaultSelect != true) {
 return false;
 }

 var param = JSExt.Product.Attr.Event.getParam(arguments);
 var currentAttributeElm = param.currentAttributeElm;
 if (currentAttributeElm != null) {
 var optionId = opt.getElmId(currentAttributeElm.id, 0, 'default');
 JSExt.Event.fire(document.getElementById(optionId), 'click');
 }
};

// 颜色尺寸规则事件
JSExt.Product.Attr.Event.postEvent.attributeShow.colorAndSizeRule = function() {
 var attr = this;
 var opt = this.opt;
 var param = JSExt.Product.Attr.Event.getParam(arguments);
 var currentAttributeElm = param.currentAttributeElm;
 var attrCode = attr.getCodeById(currentAttributeElm.getAttribute('attrId'));
 var options = JSExt.$(opt.getOptionElms(currentAttributeElm));
 if (options <= 0) {
 return false;
 }
 if (attrCode == 'color') {
 var colorData = attr.getColorData();
 if (!colorData) {
 return false;
 }

 // 自动选择颜色
 var defaultOpt = null;
 var selectedColorId=null;
 var selectedColor=null;
 var selectType=false;
 /*selectedColor*/
 if(this.selectColor.length>0){
 selectedColor = this.selectColor;
 }else{
 selectedColorId=JSExt.Util.getUrlParam('ColorID');
 }
 // 获取所选颜色
 if (selectedColorId) {
 defaultOpt = options.filter('[optId=' + selectedColorId + ']');
 selectType=true;
 } else if (selectedColor) {
 defaultOpt = options.filter('[colorname=' + selectedColor + ']');
 selectType=true;
 }
 if ((!selectedColorId && !selectedColor) || !defaultOpt || defaultOpt.length <= 0) {
 // 获取默认颜色
 defaultOpt = options.filter('[optId=' + colorData.info.defaultColorId + ']');
 }
 if (defaultOpt.length > 0 && defaultOpt.attr('productsQty') <= 0) {
 defaultOpt = options.filter('[productsQty!=0]');
 }
 if (defaultOpt.length > 0) {
 JSExt.Event.fire(defaultOpt.get(0), 'click');
 } else {
 JSExt.Event.fire(options.get(0), 'click');
 }

 // 如果只有一个选项，隐藏属性框
 if (options.length == 1) {
 currentAttributeElm.style.display = 'none';
 }
 } else if (attrCode.indexOf('size') == 0) {
 // 如果只有一个选项，自动选择
 if (options.length == 2) {
 JSExt.Event.fire(options.get(0), 'click');
 }
 }
};

//默认显示所有选项
JSExt.Product.Attr.Event.postEvent.attributeShow.showAllOption = function() {
 var attr = this;
 var opt = this.opt;
 if (attr.config.showAllOption != true) {
 return false;
 }

 var currentAttributeElm = attr.getLastAttribute();
 if (currentAttributeElm != null) {
 var attrKey = parseInt(currentAttributeElm.getAttribute('attrLv'));
 var formatedData = attr.getFormatedData();
 var attributeData = formatedData[attrKey];
 var attributeReload = null, attributeElm = null;

 for (var i = attrKey + 1, length = formatedData.length; i < length; i++) {
 // 显示选项
 attr.create(i, false);
 attributeReload = document.getElementById(attr.getElmId(formatedData[i].info.id, attr.config.attributeContainerType));
 attributeReload.style.display = 'block';

 // 启用未选择选项判断
 attributeElm = document.getElementById(attr.getElmId(formatedData[i].info.id));
 if (attributeElm != null && attributeElm.disabled && attributeElm.options.length > 0) {
 attributeElm.options[0].setAttribute('value', '');
 }
 }
 }
};


//////////////////////////////////////商品属性选项事件

//defaultOptionElm、selectOptionElm
JSExt.Product.Attr.Event.postEvent.optionCreate = {};

JSExt.Product.Attr.Event.preEvent.optionClick = {};
JSExt.Product.Attr.Event.postEvent.optionClick = {};

// 初始化库存信息
JSExt.Product.Attr.Event.postEvent.optionCreate.initQtyOption = function() {
 var attr = this.attr;
 var opt = this;
 var param = JSExt.Product.Attr.Event.getParam(arguments);

 var productCollection = [param.optionData.products];
 for (var i = 0; i < param.attrKey; i++) {
 productCollection.push(opt.getSelectedData(i).products);
 }

 // 筛选选项包含商品及库存
 var productIds = productCollection[0].slice();
 for (var i = 0, ilength = productIds.length; i < ilength; i++) {
 for (var j = 1, jlength = productCollection.length; j < jlength; j++) {
 if (JSExt.$.inArray(productIds[i], productCollection[j]) < 0) {
 productIds[i] = null;
 }
 }
 }
 var temp = [];
 var productsQty = 0;
 for (var i = 0, length = productIds.length; i < length; i++) {
 if (productIds[i] != null) {
 temp.push(productIds[i]);
 productsQty += parseInt(attr.getSourceData().qty[productIds[i]]);
 }
 }
 productIds = temp;

 var defOpt = JSExt.$(param.defaultOptionElm);
 var selOpt = JSExt.$(param.selectOptionElm);
 if (productsQty <= 0) {
 defOpt.addClass('notQty');
 selOpt.addClass('notQty');
 }
 defOpt.attr('productIds', productIds);
 defOpt.attr('productsQty', productsQty);
 selOpt.attr('productIds', productIds);
 selOpt.attr('productsQty', productsQty);
};

// 绑定鼠标事件
JSExt.Product.Attr.Event.postEvent.optionCreate.bindMouseEvent = function() {
 var attr = this.attr;
 var opt = this;
 var args = arguments;
 var param = JSExt.Product.Attr.Event.getParam(arguments);
 var defOpt = JSExt.$(param.defaultOptionElm);

 // 重载无库存选项点击事件
 if (parseInt(defOpt.attr('productsQty')) <= 0 && defOpt.attr('attrLv') >=attr.getFormatedData().length - 1) {
 JSExt.Event.unbind(param.defaultOptionElm, 'click',opt.Event.click);
 defOpt.click(function (e) {
 var mailWindow = JSExt.$('#out_of_stock_send_mail_window');
 var offset=defOpt.offset();
 var emailInputElm = mailWindow.find('input[name=email]');
 mailWindow.css('display', 'block');
 mailWindow.css('top',(offset.top-100)+'px')
 .css('left','785px');
 emailInputElm.css('display', '');
 mailWindow.attr('productId', defOpt.attr('productIds'));
 mailWindow.attr('colorId',attr.getValByCode('color'));
 mailWindow.attr('sizeId', defOpt.attr('optId'));

 if (!mailWindow.attr('initEvent')) {
 var closeButton = mailWindow.find('.close_window');
 var sendMailButton = mailWindow.find('.send-mail-button');
 closeButton.click(function(){
 mailWindow.css('display', 'none');
 });
 sendMailButton.click(function(){
 if (Validation.validate(emailInputElm.get(0))) {
 sendMailButton.attr('disabled', 'disabled');
 JSExt.$.ajax({
 type: "POST",
 dataType: "json",
 url: mailWindow.attr('requestUrl'),
 data: "product_id=" + mailWindow.attr('productId') + '&color_id=' + mailWindow.attr('colorId') + '&size_id=' + mailWindow.attr('sizeId') + '&email=' + emailInputElm.val(),
 success: function(result){
 if (result.success) {
 var inputContainer = JSExt.$('#out_of_stock_send_mail_window_container > .send-mail-input');
 var messageContainer = JSExt.$('#out_of_stock_send_mail_window_container > .send-mail-message');
 inputContainer.css('display', 'none');
 messageContainer.html(result.notice);
 messageContainer.css('display', '');
 setTimeout(function(){
 closeButton.click();
 messageContainer.css('display', 'none');
 messageContainer.html('');
 inputContainer.css('display', '');
 }, 3000);
 } else {
 alert(result.notice);
 }
 sendMailButton.removeAttr('disabled');
 }
 });
 }
 });
 mailWindow.attr('initEvent', '1');
 }
 });
 } else {
 defOpt.click(function () {
 var qty = JSExt.$('#qty');
 var qtyNumber = parseInt(qty.val());
 qtyNumber = isNaN(qtyNumber) ? 1 : qtyNumber;
 var maxNumber = parseInt(defOpt.attr('productsQty'));
 if (!isNaN(maxNumber) && qtyNumber > maxNumber) {
 maxNumber = maxNumber > 0 ? maxNumber : 1;
 qty.val(maxNumber);
 }
 JSExt.$('#out_of_stock_send_mail_window > .close_window').click();
 });
 }

 // 设置鼠标经过事件
 defOpt.hover(
 function() {
 JSExt.Product.Attr.Event.preEvent.optionClick.showSelected.apply(this, args);
 JSExt.$(this).addClass('mouseOver');
 },
 function() {
 var params = [];
 for (var i = 0, length = arguments.length; i < length; i ++) {
 params[i] = arguments[i];
 }
 params.push({'defaultOptionElm': this.opt.getSelectedElm(param.attrKey)});
 JSExt.Product.Attr.Event.preEvent.optionClick.showSelected.apply(this, params);
 JSExt.$(this).removeClass('mouseOver');
 }
 );
};

/*显示选择*/
JSExt.Product.Attr.Event.preEvent.optionClick.showSelected = function() {
 var attr = this.opt.attr;
 var opt = this.opt;
 var param = JSExt.Product.Attr.Event.getParam(arguments);
 var content = JSExt.$(opt.getElmByChild(this));
 var notSelected = false;
 if (param) {
 if (param.defaultOptionElm == null) {
 notSelected = true;
 } else {
 content = JSExt.$(param.defaultOptionElm);
 }
 }
 var attributeContainer = content.parents('[isOptionContainer=1]');
 var contentContainer = attributeContainer.find('.selected_option_label');
 if (contentContainer.length > 0) {
 var showInfo = null;
 if (notSelected) {
 showInfo = '';
 } else if (parseInt(content.attr('productsQty')) <= 0) {
 showInfo = content.attr('title') + ' / ' + Translator.translate('Out of Stock');
 } else {
 if (content.attr('attrLv') >= attr.getFormatedData().length - 1) {
 var maxQty = parseInt(JSExt.$V('Product.Event.changeQty.maxQty'));
 if (!isNaN(maxQty) && maxQty > parseInt(content.attr('productsQty'))) {
 showInfo = Translator.translate('%s - Over %s');
 showInfo = showInfo.replace('%s', content.attr('title')).replace('%s', content.attr('productsQty'));
 }
 }
 if (showInfo == null) {
 showInfo = content.attr('title');
 }
 }

 contentContainer.html(showInfo);
 }
};
/*
JSExt.Product.Attr.Event.postEvent.optionClick.showSelected = function() {
 var contentContainer = JSExt.$('#msg-select');
 if (contentContainer.length > 0) {
 var selectedOption = JSExt.$('#attributeReloadContainer').find('[isOption=1][optionType=selected]:visible');
 contentContainer.empty();
 for (var i = 0, length = selectedOption.length; i < length; i++) {
 var tempObj = JSExt.$('<span></span>');
 tempObj.attr('class', 'is_' + selectedOption.eq(i).parents('[isOptionContainer=1]').attr('attrCode').split('_')[0]);
 tempObj.html('"' + selectedOption.eq(i).attr('title') + '"');
 contentContainer.append(tempObj);
 }
 }
};
*/


JSExt.ColorListPlus={};
JSExt.ColorListPlus.stock=function(select,stock_img_id){
 JSExt.$(select).each(function(){
 JSExt.$(this).click(function(){
 var qty=JSExt.$(this).attr('productsqty');
 if(qty<=0){
 JSExt.$(stock_img_id).show();
 }else{
 JSExt.$(stock_img_id).hide();
 }
 });
 });
};

JSExt.Addtocar= {};
JSExt.Addtocar.checkForm=function(elm){
 var is_select=productAddToCartForm.validator.validate();
 if(is_select){
 JSExt.$('#add-to-cart-hcon').removeClass("hide");
 }
};

JSExt.Addtocar.Tocar=function(elm){
 var is_select=productAddToCartForm.validator.validate();
 if(is_select){
 JSExt.$('#addtype').val(0);
 productAddToCartForm.form.submit();
 }
};
JSExt.Addtocar.continuebuy=function(elm){
 var is_select=productAddToCartForm.validator.validate();
 if(is_select){
 JSExt.$('#addtype').val(1);
 productAddToCartForm.form.submit();
 }
};

JSExt.Addtocar.close=function(elm){
 JSExt.$('#add-to-cart-hcon').addClass("hide");
};

JSExt.Addtocar.suitOneAdd=function(form,id){
 var suitOneForm=form+'_'+id;
 var suitAddToCartForm=new VarienForm(suitOneForm);
 if(suitAddToCartForm.validator.validate()){
 suitAddToCartForm.form.submit();
 }
};

JSExt.Addtocar.suitAdd=function(form, id) {
 if ( typeof(suitProductIds) === 'undefined' ) {
 alert(Translator.translate("data error!"));
 return this; 
 }
 
 var suitProductsInfo = [];
 for( var i=0;i<suitProductIds.length;i++ ) {
 var tmpProductForm = new VarienForm(form + '_' + suitProductIds[i]);
 if( !tmpProductForm.validator.validate() ){
 alert(Translator.translate("there are products which have not been selected"));
 return this;
 }
 suitProductsInfo.push(tmpProductForm.form.serialize());
 }
 
 if ( suitProductsInfo.length === 0 ) {
 alert(Translator.translate("there are products which have not been selected"));
 return this; 
 }
 
 var suitFormId = form + '_' + id;
 var suitAddtocarFrom = new VarienForm(suitFormId);
 suitAddtocarFrom.form.suit_products.value = suitProductsInfo;
 
 if(suitAddtocarFrom.validator.validate()){
 suitAddtocarFrom.form.submit();
 return this;
 }
};

JSExt.Checkout = {};
JSExt.Checkout.Cart = {};
JSExt.Checkout.Cart.add = function(formObj, type,id) {
 type = typeof type == 'string' ? type : '';
 if(id){
 var messagebox='div.add-to-messagebox-'+id;
 var addbutton='button.productadd';
 var loadingClass="div.add-to-cart-loading-"+id;
 }
 formObj.form.addtype.value = type;
 var isValidated = formObj.validator.validate();
 if (isValidated) {
 if (type == 'ajax') {
 JSExt.$(addbutton).attr('disabled','disabled');
 JSExt.$(loadingClass).show();
 var request = new Ajax.Request(
 formObj.form.action,
 {
 method: 'post',
 /*onCreate:function(){
 request['timeoutId']=setTimeout(function(){
 if(!request.transport.readyState){
 alert('time out');
 JSExt.$(addbutton).removeAttr('disabled');
 JSExt.$(loadingClass).hide();
 }
 },1000);
 },*/
 //onComplete: function() {},
 onSuccess: function(transport) {
 clearTimeout(request['timeoutId']);
 if (transport && transport.responseText){
 try{
 response = eval('(' + transport.responseText + ')');
 } catch (e) {
 response = {};
 }
 }
 if (response.error){
 if ((typeof response.message) == 'string') {
 alert(response.message);
 JSExt.$(addbutton).removeAttr('disabled');
 JSExt.$(loadingClass).hide();
 }
 } else {
 if ((typeof response.update) == 'object') {
 
 if ((typeof response.update.cartLink) == 'string') {
 JSExt.$('.public_header').addClass('customerIsLogin');
 JSExt.$('#top-link-cart').html(JSExt.$(response.update.cartLink).html());
 }
 if ((typeof response.update.cartProductList) == 'string') {
 JSExt.$('.top_cart_list').html(response.update.cartProductList);
 }
 JSExt.$(loadingClass).hide();
 JSExt.$(messagebox).show();
 var messageboxTimeId=setTimeout(function(){JSExt.$(messagebox).hide();},3000);
 JSExt.$(addbutton).removeAttr('disabled');
 }
 }
 },
 onFailure: function() {
 alert(Translator.translate('Can not add item to shopping cart'));
 JSExt.$(addbutton).removeAttr('disabled');
 JSExt.$(loadingClass).hide();
 },
 parameters: formObj.form.serialize()
 }
 );
 } else {
 formObj.form.submit();
 }
 }
};
JSExt.Checkout.Cart.close=function(id){
 var emlClass='div.add-to-messagebox-'+id;
 JSExt.$(emlClass).hide()
}
JSExt.Checkout.Cart.topcartShow=function(){
 scroll(0,0);
 JSExt.$('div.top_cart_list').show();
 setTimeout(function(){JSExt.$('div.top_cart_list').hide();},3000);
}
JSExt.suitImage={}
JSExt.suitImage.show=function(divClass){
 var xOffset = 10;
 var yOffset = 30;
 divClass="."+divClass;
 JSExt.$(divClass).each(function(){
 JSExt.$(this).hover(
 function(e){
 var offset = JSExt.$(this).offset();
 JSExt.$("body").append("<p id='img_preview'><img src='"+ JSExt.$(this).attr('imgsrc') +"' alt='Image preview' /></p>");
 JSExt.$('#img_preview')
 .css("top",(offset.top) + "px")
 .css("left",(offset.left + 149) + "px")
 .css("z-index","2000")
 .fadeIn("fast");
 },function(e){
 JSExt.$("#img_preview").remove();
 
 });
 });
};
JSExt.Suit={};
JSExt.Suit.changeImg=function(eml){
 var suitImgEml=JSExt.$('#suitimage-container-inner #suit-img');
 var imgEml=JSExt.$(eml);
 imgEml.parent("li").hide().siblings().show();
 var baseimg=imgEml.attr('baseimg');
 suitImgEml.attr('src',baseimg);
};

JSExt.Color_list={};
JSExt.Color_list.show=function(elm){
 var this_elm=JSExt.$(elm);
 this_elm.children('div.color_images').show();
};
JSExt.Color_list.hide=function(elm){
 var this_elm = JSExt.$(elm);
 this_elm.children('div.color_images').hide();
};

/********************************首页动画**************************************/
JSExt.CoverFlow = {};
JSExt.CoverFlow.init = function(container, coverFlowImgList, options) {
 var $ = JSExt.$;
 var list = null;
 var imgHeight = options.imgHeight;
 var imgWidth = options.imgWidth;
 if (options.showNumber && coverFlowImgList.length < options.showNumber) {
 options.showNumber = coverFlowImgList.length;
 }
 container.height(imgHeight);
 var completeEvt = function() { 
 $('#loading').css('display','none');
 $('#fk-load').css('display','none');
 container.children('li').children('a').children('img').fadeIn();
 var moveLeft = function() {
 container.prepend(container.children('li:last'));
 JSExt.CoverFlow.core(container, options, true);
 };
 var moveRight = function() {
 container.append(container.children('li:first'));
 JSExt.CoverFlow.core(container, options, true);
 };
 var off = setInterval(moveRight, 5500);
 $('#pre').click(function() {
 moveLeft();
 clearInterval(off);
 off = setInterval(moveLeft, 5500);
 });
 $('#next').click(function() {
 moveRight();
 clearInterval(off);
 off = setInterval(moveRight, 5500);
 });
 var aObjList = [];
 var liObjList = [];
 var imgObjList = [];
 var leftLoadedNum = coverFlowImgList.length - options.showNumber;
 if (leftLoadedNum > 0) { 
 for (var i = options.showNumber, loadedNum = coverFlowImgList.length; i < coverFlowImgList.length; i++) { 
 var data = coverFlowImgList[i];
 aObjList[i] = $('<a></a>');
 imgObjList[i] = $('<img></img>');
 liObjList[i] = $('<li></li>');
 if (data.top) {
 imgObjList[i].get(0).isTop = true;
 }
 aObjList[i].attr('href', data.href);
 if(data.target){
 aObjList[i].attr("target",data.target); 
 }
 imgObjList[i].hide();
 imgObjList[i].get(0).indexKey = i;
 aObjList[i].append(imgObjList[i]);
 liObjList[i].append(aObjList[i]);
 imgObjList[i].load(function() {
 container.append(liObjList[$(this).get(0).indexKey]);
 });
 imgObjList[i].attr('src', data.img);
 }
 }
 };

 if (typeof coverFlowImgList != 'object') {
 return ;
 }
 for (var i = 0, loadedNum = options.showNumber; i < options.showNumber; i++) {
 var data = coverFlowImgList[i];
 var liObj = $('<li></li>');
 var aObj = $('<a></a>');
 var imgObj = $('<img></img>');
 if (data.top) {
 imgObj.get(0).isTop = true;
 }
 aObj.attr('href', data.href);
 if(data.target){
 aObj.attr("target",data.target);
 }
 imgObj.hide();
 imgObj.load(function() {
 loadedNum--;
 if (loadedNum == 0) {
 completeEvt();
 }
 });
 imgObj.attr('src', data.img);
 aObj.append(imgObj);
 liObj.append(aObj);
 container.append(liObj);
 }
 list = container.children('li');
 list.height(imgHeight);
 JSExt.CoverFlow.core(container, options, false);
};

JSExt.CoverFlow.core = function(container, options, useAnimate){
 var showNumber = options.showNumber;
 var imgMaxHeight = options.imgHeight;
 var imgMinHeightPercent = options.imgMinHeightPercent;
 var ulWidth = options.ulWidth;

 var list = container.children('li');
 var sideNumber = showNumber - 1;
 var spacingWidth = ulWidth - options.imgWidth;
 var sideWidth = parseInt(spacingWidth / sideNumber);
 var centerNumber = parseInt(showNumber / 2) + 1;
 var imgMinHeight = (imgMaxHeight * imgMinHeightPercent / 100);
 var imgSidePartHeight = (imgMaxHeight - imgMinHeight) / centerNumber;
 list.each(function(key, elm) {
 var obj = list.eq(key);
 var imgObj = obj.children('a').children('img');
 var imgElm = imgObj.get(0);

 if (!imgElm.orgHeight) {
 imgElm.orgHeight = options.imgHeight;
 imgElm.orgWidth = options.imgWidth;
 }

 var zIdx = null;
 if (key + 1 > centerNumber) {
 zIdx = showNumber - key;
 } else {
 zIdx = key + 1;
 }

 var imgHeight = (imgSidePartHeight * zIdx + imgMinHeight);
 var imgWidth = parseInt((imgHeight / imgElm.orgHeight) * imgElm.orgWidth);
 var liWidth = imgWidth + 32;
 var imgHeight = parseInt(imgHeight);

 var top = ((imgMaxHeight - imgHeight) / 2) + 'px';
 var left = null;
 if (key + 1 > centerNumber) {
 left = (key * sideWidth + ((imgElm.orgWidth - imgWidth))) + 'px';
 } else {
 left = (key * sideWidth) +'px';
 }

 if (useAnimate) {
 obj.animate({'left': left, 'height': imgHeight + 'px', 'width': liWidth + 'px', 'top': top}, {queue: false, duration: 500});
 imgObj.animate({'height': imgHeight + 'px', 'width': imgWidth + 'px'}, {queue: false, duration: 500});
 } else {
 obj.css({'left': left, 'height': imgHeight + 'px', 'width': liWidth + 'px', 'top': top});
 imgObj.css({'height': imgHeight + 'px', 'width': imgWidth + 'px'});
 }
 obj.css('z-index', zIdx);
 });
};


jQuery.cookie = function(name, value, options) {
 if (typeof value != 'undefined') {
 options = options || {};
 if (value === null) {
 value = '';
 options = $.extend({}, options);
 options.expires = -1;
 }
 var expires = '';
 if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
 var date;
 if (typeof options.expires == 'number') {
 date = new Date();
 date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
 } else {
 date = options.expires;
 }
 expires = '; expires=' + date.toUTCString();
 }
 var path = options.path ? '; path=' + (options.path) : '';
 var domain = options.domain ? '; domain=' + (options.domain) : '';
 var secure = options.secure ? '; secure' : '';
 document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
 } else {
 var cookieValue = null;
 if (document.cookie && document.cookie != '') {
 var cookies = document.cookie.split(';');
 for (var i = 0; i < cookies.length; i++) {
 var cookie = jQuery.trim(cookies[i]);
 if (cookie.substring(0, name.length + 1) == (name + '=')) {
 cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
 break;
 }
 }
 }
 return cookieValue;
 }
};

