likeku 7 lat temu
commit
93d3e1217d
100 zmienionych plików z 32410 dodań i 0 usunięć
  1. BIN
      global/img/Thumbs.db
  2. BIN
      global/img/avatra48.png
  3. 67 0
      global/js/admin.js
  4. 155 0
      global/js/checkemail.js
  5. 155 0
      global/js/chpasswd.js
  6. 81 0
      global/js/common.js
  7. 24 0
      global/js/easydialog.css
  8. 24 0
      global/js/easydialog.min.js
  9. 52 0
      global/js/faildemail.js
  10. 67 0
      global/js/global.js
  11. 4 0
      global/js/jquery-1.7.1.min.js
  12. 4 0
      global/js/jquery-1.7.2.min.js
  13. 660 0
      global/js/jquery.form.js
  14. 5 0
      global/js/jquery.leanModal.min.js
  15. 122 0
      global/js/jquery.metadata.js
  16. 382 0
      global/js/jquery.mockjax.js
  17. 1248 0
      global/js/jquery.validate.js
  18. 51 0
      global/js/jquery.validate.min.js
  19. 135 0
      global/js/mailListCreate.html
  20. 27 0
      global/js/recharge.js
  21. 154 0
      global/js/reg.js
  22. 80 0
      global/js/sendemail.js
  23. 777 0
      global/js/swfobject.js
  24. 81 0
      global/js/ueditor/dialogs/internal.js
  25. 126 0
      global/js/ueditor/dialogs/link/link.html
  26. BIN
      global/js/ueditor/lang/zh-cn/images/copy.png
  27. BIN
      global/js/ueditor/lang/zh-cn/images/localimage.png
  28. BIN
      global/js/ueditor/lang/zh-cn/images/music.png
  29. BIN
      global/js/ueditor/lang/zh-cn/images/upload.png
  30. 669 0
      global/js/ueditor/lang/zh-cn/zh-cn.js
  31. 1903 0
      global/js/ueditor/themes/default/css/ueditor.css
  32. 8 0
      global/js/ueditor/themes/default/css/ueditor.min.css
  33. 100 0
      global/js/ueditor/themes/default/dialogbase.css
  34. BIN
      global/js/ueditor/themes/default/images/anchor.gif
  35. BIN
      global/js/ueditor/themes/default/images/arrow.png
  36. BIN
      global/js/ueditor/themes/default/images/arrow_down.png
  37. BIN
      global/js/ueditor/themes/default/images/arrow_up.png
  38. BIN
      global/js/ueditor/themes/default/images/button-bg.gif
  39. BIN
      global/js/ueditor/themes/default/images/cancelbutton.gif
  40. BIN
      global/js/ueditor/themes/default/images/charts.png
  41. BIN
      global/js/ueditor/themes/default/images/cursor_h.gif
  42. BIN
      global/js/ueditor/themes/default/images/cursor_h.png
  43. BIN
      global/js/ueditor/themes/default/images/cursor_v.gif
  44. BIN
      global/js/ueditor/themes/default/images/cursor_v.png
  45. BIN
      global/js/ueditor/themes/default/images/dialog-title-bg.png
  46. BIN
      global/js/ueditor/themes/default/images/filescan.png
  47. BIN
      global/js/ueditor/themes/default/images/highlighted.gif
  48. BIN
      global/js/ueditor/themes/default/images/icons-all.gif
  49. BIN
      global/js/ueditor/themes/default/images/icons.gif
  50. BIN
      global/js/ueditor/themes/default/images/icons.png
  51. BIN
      global/js/ueditor/themes/default/images/loaderror.png
  52. BIN
      global/js/ueditor/themes/default/images/loading.gif
  53. BIN
      global/js/ueditor/themes/default/images/lock.gif
  54. BIN
      global/js/ueditor/themes/default/images/neweditor-tab-bg.png
  55. BIN
      global/js/ueditor/themes/default/images/pagebreak.gif
  56. BIN
      global/js/ueditor/themes/default/images/scale.png
  57. BIN
      global/js/ueditor/themes/default/images/sortable.png
  58. BIN
      global/js/ueditor/themes/default/images/spacer.gif
  59. BIN
      global/js/ueditor/themes/default/images/sparator_v.png
  60. BIN
      global/js/ueditor/themes/default/images/table-cell-align.png
  61. BIN
      global/js/ueditor/themes/default/images/tangram-colorpicker.png
  62. BIN
      global/js/ueditor/themes/default/images/toolbar_bg.png
  63. BIN
      global/js/ueditor/themes/default/images/unhighlighted.gif
  64. BIN
      global/js/ueditor/themes/default/images/upload.png
  65. BIN
      global/js/ueditor/themes/default/images/videologo.gif
  66. BIN
      global/js/ueditor/themes/default/images/word.gif
  67. BIN
      global/js/ueditor/themes/default/images/wordpaste.png
  68. 1 0
      global/js/ueditor/themes/iframe.css
  69. 104 0
      global/js/ueditor/third-party/codemirror/codemirror.css
  70. 3581 0
      global/js/ueditor/third-party/codemirror/codemirror.js
  71. 17386 0
      global/js/ueditor/ueditor.all.js
  72. 227 0
      global/js/ueditor/ueditor.config.js
  73. 860 0
      global/js/vanadium.js
  74. 596 0
      global/m/css/bootstrap-theme.css
  75. 14 0
      global/m/css/bootstrap-theme.min.css
  76. 14 0
      global/m/css/bootstrap.min.css
  77. BIN
      global/m/css/fonts/iconMenu.eot
  78. 22 0
      global/m/css/fonts/iconMenu.svg
  79. BIN
      global/m/css/fonts/iconMenu.ttf
  80. BIN
      global/m/css/fonts/iconMenu.woff
  81. 7 0
      global/m/css/iconMenu/Read Me.txt
  82. 152 0
      global/m/css/iconMenu/demo-files/demo.css
  83. 30 0
      global/m/css/iconMenu/demo-files/demo.js
  84. 215 0
      global/m/css/iconMenu/demo.html
  85. BIN
      global/m/css/iconMenu/fonts/iconMenu.eot
  86. 21 0
      global/m/css/iconMenu/fonts/iconMenu.svg
  87. BIN
      global/m/css/iconMenu/fonts/iconMenu.ttf
  88. BIN
      global/m/css/iconMenu/fonts/iconMenu.woff
  89. 363 0
      global/m/css/iconMenu/selection.json
  90. 60 0
      global/m/css/iconMenu/style.css
  91. 380 0
      global/m/css/style.css
  92. BIN
      global/m/fonts/glyphicons-halflings-regular.eot
  93. 22 0
      global/m/fonts/glyphicons-halflings-regular.svg
  94. BIN
      global/m/fonts/glyphicons-halflings-regular.ttf
  95. BIN
      global/m/fonts/glyphicons-halflings-regular.woff
  96. BIN
      global/m/fonts/glyphicons-halflings-regular.woff2
  97. 1184 0
      global/m/images/.svn/entries
  98. 5 0
      global/m/images/.svn/prop-base/btnLBg.png.svn-base
  99. 5 0
      global/m/images/.svn/prop-base/cate_set_tree.gif.svn-base
  100. 0 0
      global/m/images/.svn/prop-base/clear.gif.svn-base

BIN
global/img/Thumbs.db


BIN
global/img/avatra48.png


+ 67 - 0
global/js/admin.js

@@ -0,0 +1,67 @@
+
+
+$(function(){
+	
+	$("a[id^='en']").click(function() {
+		
+		var id=$(this).attr('data');
+		$("#en"+id).attr("class",'btn-disabled'); 
+		$("#en"+id).hide();
+		
+	});
+	
+	
+	$("a[id^='templte_']").click(function() {
+		var id=$(this).attr('data');
+		var content=$('#content_'+id).val();
+		var title=$('#title_'+id).val();
+		
+		$('#title').html(title);
+		$('#content').html(content);
+	});
+	
+	$("a[id^='status_']").click(function() {
+		var id=$(this).attr('data');
+
+		var a = id.split(":");
+		
+		easyDialog.open({
+			  container : {
+			    header : '手动确认订单状态',
+			    content :'确认后,为该用户加入金额:'+a[1]+'<br/>操作人:<input type="text" name="username" id="username" value="" />',
+			    yesFn : function(){
+					
+					 var username=$("#username").val();
+					 if($("#username").val()==""){
+						 alert('请填写操作人名称');
+						 return false;
+					 }else{
+
+						 var url="/m/c/status";
+						 $.ajax({
+								url:url,
+								type: "post",
+								cache: false,
+								dataType: "json",
+								data: {
+									id:a[0],
+									username:username
+								},
+								global: true,
+								success: function(data){
+									window.location.reload();
+
+								},
+								error:function(err){
+									alert('请检查操作');
+								}
+								});
+						 
+					 }
+				},
+			    noFn : true
+			  }
+			});
+		
+	});
+})	

+ 155 - 0
global/js/checkemail.js

@@ -0,0 +1,155 @@
+/*
+*本插件原作者Vanadium,原文请移步前往http://vanadiumjs.com/查看
+*本插件由Mr.Think中文整理,Mr.Think的博客:http://MrThink.net/
+*转载及使用请务必注明原作者.
+*/
+//弹出信息样式设置
+Vanadium.config = {
+    valid_class: 'inputSus',//验证正确时表单样式
+    invalid_class: 'erroT',//验证失败时该表单样式
+    message_value_class: 'msgvaluecss',//这个样式是弹出信息中调用值的样式
+    advice_class: '',//验证失败时文字信息的样式
+    prefix: ':',
+    separator: ';',
+    reset_defer_timeout: 100
+}
+//验证类型及弹出信息设置
+Vanadium.Type = function(className, validationFunction, error_message, message, init) {
+    this.initialize(className, validationFunction, error_message, message, init);
+};
+Vanadium.Type.prototype = {
+    initialize: function(className, validationFunction, error_message, message, init) {
+        this.className = className;
+        this.message = message;
+        this.error_message = error_message;
+        this.validationFunction = validationFunction;
+        this.init = init;
+    },
+    test: function(value) {
+        return this.validationFunction.call(this, value);
+    },
+    validMessage: function() {
+        return this.message;
+    },
+    invalidMessage: function() {
+        return this.error_message;
+    },
+    toString: function() {
+        return "className:" + this.className + " message:" + this.message + " error_message:" + this.error_message
+    },
+    init: function(parameter) {
+        if (this.init) {
+            this.init(parameter);
+        }
+    }
+};
+Vanadium.setupValidatorTypes = function() {
+    Vanadium.addValidatorType('empty', function(v) {
+        return  ((v == null) || (v.length == 0));
+    });
+    //***************************************以下为验证方法,使用时可仅保留用到的判断
+    Vanadium.addValidatorTypes([
+
+        //是否为空
+        ['required', function(v) {
+            return !Vanadium.validators_types['empty'].test(v);
+        }, '此项不可为空!'],
+        //强制选中 
+        ['accept', function(v, _p, e) {
+            return e.element.checked;
+        }, '必须接受!'],
+
+        //邮箱验证
+        ['email', function (v) {
+            return (Vanadium.validators_types['empty'].test(v) || /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v))
+        }, '格式错误,例如xxx@xxx.xxx'],
+        //输入固定长度字符串
+        ['length',
+        function (v, p) {
+            if (p === undefined) {
+                return true
+            } else {
+                return v.length == parseInt(p)
+            }
+        ;
+        },
+        function (_v, p) {
+            return '输入字符长度等于<span class="' + Vanadium.config.message_value_class + '">' + p + '</span>个.'
+        }
+        ],
+        //
+        ['min_length',
+        function (v, p) {
+            if (p === undefined) {
+                return true
+            } else {
+                return v.length >= parseInt(p)
+            }
+        ;
+        },
+        function (_v, p) {
+            return '输入字符长度不低于<span class="' + Vanadium.config.message_value_class + '">' + p + '</span>个.'
+        }
+        ],
+        ['max_length',
+        function (v, p) {
+            if (p === undefined) {
+                return true
+            } else {
+                return v.length <= parseInt(p)
+            }
+        ;
+        },
+        function (_v, p) {
+            return '输入字符长度不大于<span class="' + Vanadium.config.message_value_class + '">' + p + '</span>个.'
+        }
+        ],
+        //判断密码是相同
+        ['same_as',
+        function (v, p) {
+            if (p === undefined) {
+                return true
+            } else {
+                var exemplar = document.getElementById(p);
+                if (exemplar)
+                    return v == exemplar.value;
+                else
+                    return false;
+            }
+        ;
+        },
+        function (_v, p) {
+            var exemplar = document.getElementById(p);
+            if (exemplar)
+                return '两次密码输入不相同.';
+            else
+                return '没有可参考值!'
+        },
+        "",
+        function(validation_instance) {
+            var exemplar = document.getElementById(validation_instance.param);
+            if (exemplar){
+                jQuery(exemplar).bind('validate', function(){
+                    jQuery(validation_instance.element).trigger('validate');
+                });
+            }
+        }
+        ],
+        //ajax判断是否存在值
+        ['ajax',
+        function (v, p, validation_instance, decoration_context, decoration_callback) {
+            if (Vanadium.validators_types['empty'].test(v)) return true;
+            if (decoration_context && decoration_callback) {
+                jQuery.getJSON(p, {
+                    value: v, 
+                    id: validation_instance.element.id
+                }, function(data) {
+                    decoration_callback.apply(decoration_context, [[data], true]);
+                });
+            }
+            return true;
+        }]
+        ])
+    if (typeof(VanadiumCustomValidationTypes) !== "undefined" && VanadiumCustomValidationTypes) Vanadium.addValidatorTypes(VanadiumCustomValidationTypes);
+};
+        

+ 155 - 0
global/js/chpasswd.js

@@ -0,0 +1,155 @@
+/*
+*本插件原作者Vanadium,原文请移步前往http://vanadiumjs.com/查看
+*本插件由Mr.Think中文整理,Mr.Think的博客:http://MrThink.net/
+*转载及使用请务必注明原作者.
+*/
+//弹出信息样式设置
+Vanadium.config = {
+    valid_class: 'inputSus',//验证正确时表单样式
+    invalid_class: 'erroT',//验证失败时该表单样式
+    message_value_class: 'msgvaluecss',//这个样式是弹出信息中调用值的样式
+    advice_class: 'erroT',//验证失败时文字信息的样式
+    prefix: ':',
+    separator: ';',
+    reset_defer_timeout: 100
+}
+//验证类型及弹出信息设置
+Vanadium.Type = function(className, validationFunction, error_message, message, init) {
+    this.initialize(className, validationFunction, error_message, message, init);
+};
+Vanadium.Type.prototype = {
+    initialize: function(className, validationFunction, error_message, message, init) {
+        this.className = className;
+        this.message = message;
+        this.error_message = error_message;
+        this.validationFunction = validationFunction;
+        this.init = init;
+    },
+    test: function(value) {
+        return this.validationFunction.call(this, value);
+    },
+    validMessage: function() {
+        return this.message;
+    },
+    invalidMessage: function() {
+        return this.error_message;
+    },
+    toString: function() {
+        return "className:" + this.className + " message:" + this.message + " error_message:" + this.error_message
+    },
+    init: function(parameter) {
+        if (this.init) {
+            this.init(parameter);
+        }
+    }
+};
+Vanadium.setupValidatorTypes = function() {
+    Vanadium.addValidatorType('empty', function(v) {
+        return  ((v == null) || (v.length == 0));
+    });
+    //***************************************以下为验证方法,使用时可仅保留用到的判断
+    Vanadium.addValidatorTypes([
+
+        //是否为空
+        ['required', function(v) {
+            return !Vanadium.validators_types['empty'].test(v);
+        }, '此项不可为空!'],
+        //强制选中 
+        ['accept', function(v, _p, e) {
+            return e.element.checked;
+        }, '必须接受!'],
+
+        //邮箱验证
+        ['email', function (v) {
+            return (Vanadium.validators_types['empty'].test(v) || /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v))
+        }, '格式错误,例如xxx@xxx.xxx'],
+        //输入固定长度字符串
+        ['length',
+        function (v, p) {
+            if (p === undefined) {
+                return true
+            } else {
+                return v.length == parseInt(p)
+            }
+        ;
+        },
+        function (_v, p) {
+            return '输入字符长度等于<span class="' + Vanadium.config.message_value_class + '">' + p + '</span>个.'
+        }
+        ],
+        //
+        ['min_length',
+        function (v, p) {
+            if (p === undefined) {
+                return true
+            } else {
+                return v.length >= parseInt(p)
+            }
+        ;
+        },
+        function (_v, p) {
+            return '输入字符长度不低于<span class="' + Vanadium.config.message_value_class + '">' + p + '</span>个.'
+        }
+        ],
+        ['max_length',
+        function (v, p) {
+            if (p === undefined) {
+                return true
+            } else {
+                return v.length <= parseInt(p)
+            }
+        ;
+        },
+        function (_v, p) {
+            return '输入字符长度不大于<span class="' + Vanadium.config.message_value_class + '">' + p + '</span>个.'
+        }
+        ],
+        //判断密码是相同
+        ['same_as',
+        function (v, p) {
+            if (p === undefined) {
+                return true
+            } else {
+                var exemplar = document.getElementById(p);
+                if (exemplar)
+                    return v == exemplar.value;
+                else
+                    return false;
+            }
+        ;
+        },
+        function (_v, p) {
+            var exemplar = document.getElementById(p);
+            if (exemplar)
+                return '两次密码输入不相同.';
+            else
+                return '没有可参考值!'
+        },
+        "",
+        function(validation_instance) {
+            var exemplar = document.getElementById(validation_instance.param);
+            if (exemplar){
+                jQuery(exemplar).bind('validate', function(){
+                    jQuery(validation_instance.element).trigger('validate');
+                });
+            }
+        }
+        ],
+        //ajax判断是否存在值
+        ['ajax',
+        function (v, p, validation_instance, decoration_context, decoration_callback) {
+            if (Vanadium.validators_types['empty'].test(v)) return true;
+            if (decoration_context && decoration_callback) {
+                jQuery.getJSON(p, {
+                    value: v, 
+                    id: validation_instance.element.id
+                }, function(data) {
+                    decoration_callback.apply(decoration_context, [[data], true]);
+                });
+            }
+            return true;
+        }]
+        ])
+    if (typeof(VanadiumCustomValidationTypes) !== "undefined" && VanadiumCustomValidationTypes) Vanadium.addValidatorTypes(VanadiumCustomValidationTypes);
+};
+        

+ 81 - 0
global/js/common.js

@@ -0,0 +1,81 @@
+function _showCreditPrompt() {
+    var notice = getcookie('creditnotice').split('D');
+    var basev = getcookie('creditbase').split('D');
+    var creditrule = decodeURI(getcookie('creditrule', 1)).replace(String.fromCharCode(9), ' ');
+    //    if(!discuz_uid || notice.length < 2 || notice[9] != discuz_uid) {
+    //	setcookie('creditnotice', '');
+    //	setcookie('creditrule', '');
+    //	return;
+    //    }
+    var creditnames = creditnotice.split(',');
+    var creditinfo = [];
+    var e;
+    for(var i = 0; i < creditnames.length; i++) {
+	e = creditnames[i].split('|');
+	creditinfo[e[0]] = [e[1], e[2]];
+    }
+//    creditShow(creditinfo, notice, basev, 0, 1, creditrule);
+}
+
+function getcookie(name) {
+    var cookie_start = document.cookie.indexOf(name);
+    var cookie_end = document.cookie.indexOf(";", cookie_start);
+    return cookie_start == -1 ? '' : unescape(document.cookie.substring(cookie_start + name.length + 1, (cookie_end > cookie_start ? cookie_end : document.cookie.length)));
+}
+
+function setcookie(cookieName, cookieValue, seconds, path, domain, secure) {
+    seconds = seconds ? seconds : 8400000;
+    var expires = new Date();
+    expires.setTime(expires.getTime() + seconds);
+    document.cookie = escape(cookieName) + '=' + escape(cookieValue)
+    + (expires ? '; expires=' + expires.toGMTString() : '')
+    + (path ? '; path=' + path : '/')
+    + (domain ? '; domain=' + domain : '')
+    + (secure ? '; secure' : '');
+}
+
+function creditShow(creditinfo, notice, basev, bk, first, creditrule) {
+    var s = '', check = 0;
+    for(i = 1; i <= 8; i++) {
+	v = parseInt(Math.abs(parseInt(notice[i])) / 5) + 1;
+	if(notice[i] !== '0' && creditinfo[i]) {
+	    s += '<span>' + creditinfo[i][0] + (notice[i] != 0 ? (notice[i] > 0 ? '<em>+' : '<em class="desc">') + notice[i] + '</em>' : '') + creditinfo[i][1] + '</span>';
+	}
+	if(notice[i] > 0) {
+	    notice[i] = parseInt(notice[i]) - v;
+	    basev[i] = parseInt(basev[i]) + v;
+	} else if(notice[i] < 0) {
+	    notice[i] = parseInt(notice[i]) + v;
+	    basev[i] = parseInt(basev[i]) - v;
+	}
+	if($('hcredit_' + i)) {
+	    $('hcredit_' + i).innerHTML = basev[i];
+	}
+    }
+    for(i = 1; i <= 8; i++) {
+	if(notice[i] != 0) {
+	    check = 1;
+	}
+    }
+    if(!s || first) {
+	setcookie('creditnotice', '');
+	setcookie('creditbase', '');
+	setcookie('creditrule', '');
+	if(!s) {
+	    return;
+	}
+    }
+    if(!$('creditpromptdiv')) {
+	showPrompt(null, null, '<div id="creditpromptdiv">' + (creditrule ? '<i>' + creditrule + '</i> ' : '') + s + '</div>', 0);
+    } else {
+	$('creditpromptdiv').innerHTML = s;
+    }
+    setTimeout(function () {
+	hideMenu(1, 'prompt');
+	$('append_parent').removeChild($('ntcwin'));
+    }, 1500);
+}
+
+function showPrompt(ctrlid, evt, msg, timeout) {
+    $F('_showPrompt', arguments);
+}

+ 24 - 0
global/js/easydialog.css

@@ -0,0 +1,24 @@
+button::-moz-focus-inner{ border:0; padding:0; margin:0; }
+
+.easyDialog_wrapper{ width:320px; color:#444; border:8px solid rgba(51,51,51,0.6);_border:8px solid #858585; -webkit-border-radius:3px; -moz-border-radius:3px; border-radius:3px;display:none; font-family:"Microsoft yahei", Arial; }
+
+.easyDialog_wrapper .easyDialog_content{border:1px solid #325200;background:#fff;}
+
+.easyDialog_wrapper .easyDialog_title{ height:30px; line-height:30px; overflow:hidden; color:#fff; padding:0 10px; font-size:14px; border-bottom:1px solid #5d7c30; background:#9fc16b}
+
+.easyDialog_wrapper .close_btn{ font-family:arial; font-size:18px; _font-size:12px; font-weight:700; color:#fff; text-decoration:none; float:right; }
+
+.easyDialog_wrapper .close_btn:hover{ color:#415100; }
+
+.easyDialog_wrapper .easyDialog_text{ padding:25px 10px; font-size:13px; line-height:22px; }
+
+.easyDialog_wrapper .easyDialog_footer{ padding:0 10px; *zoom:1; }
+
+.easyDialog_wrapper .easyDialog_footer:after{ content:''; display:block; height:0; overflow:hidden; visibility:hidden; clear:both; }
+
+.easyDialog_wrapper .btn_highlight,
+.easyDialog_wrapper .btn_normal{ border:1px solid; border-radius:2px; cursor:pointer; font-family:"Microsoft yahei", Arial; float:right; font-size:12px; padding:0 12px; height:24px; line-height:24px; margin-bottom:10px; }
+
+.easyDialog_wrapper .btn_highlight{ background:#84af41; background:-webkit-gradient(linear,center bottom,center top,from(#84af41),to(#9fc16b)); background:-moz-linear-gradient(90deg, #84af41, #9fc16b); border-color:#6d9a27; color:#fff; }
+
+.easyDialog_wrapper .btn_normal{ margin-left:10px; border-color:#c3c3c3; background:#ececec; color:#333; background:-webkit-gradient(linear,center bottom,center top,from(#ececec),to(#f4f4f4)); background:-moz-linear-gradient(90deg,#ececec,#f4f4f4); }

Plik diff jest za duży
+ 24 - 0
global/js/easydialog.min.js


+ 52 - 0
global/js/faildemail.js

@@ -0,0 +1,52 @@
+var id;
+$(document).ready(function(){
+	
+	var send_email=function (){
+		//var wd=$("#loading").width();
+//		var wd=$("#loading").attr("width");
+//		alert(wd);
+//		if(wd>=900)
+//			clearInterval(id);
+		
+		var tid=$("#tid").val();
+		
+		var url="/m/send_faild_email_task/"+tid;
+		
+		$.ajax({
+			url:url,
+			type: "post",
+			cache: false,
+			dataType: "json",
+			data: {
+				tid:tid
+			},
+			global: true,
+			success: function(data){
+				
+				$("#is_send_count").html(data.is_send_count);
+				
+				$("#send_count").html(data.send_count);
+				
+				$("#error_email").html(data.error_email);
+				
+				$("#tid").val(tid);
+				
+				if(data.is_over==1)
+					send_email();
+				else
+					return false;
+			},
+			error:function(err){
+				console.log(err);
+			}
+			});
+		
+		
+		
+	}
+	
+	//id=setInterval(send_email, 1000);
+	
+	send_email();
+});
+

+ 67 - 0
global/js/global.js

@@ -0,0 +1,67 @@
+$(function(){
+	
+	$(".regForm dd .tips").click(function(){
+		$(this).siblings(".regForm dd .inputText").focus();
+	});
+	
+	$(".regForm dd .inputText").focus(function(){
+		$(this).siblings(".tips").css("color", "#CCC");
+	});
+	
+	// ·Çie
+	$(".regForm dd .inputText").bind("input", function(){
+		var curVal = $(this).val();
+		var label = $(this).siblings(".tips");
+		if(curVal != "") {
+			label.hide();
+		}else{
+			label.show();
+		}
+	});
+	// ie
+	$(".regForm dd .inputText").bind("propertychange", function(){
+		var curVal = $(this).val();
+		var label = $(this).siblings(".tips");
+		if(curVal != "") {
+			label.hide();
+		}else{
+			label.show();
+		}
+	});
+	
+	$(".regForm dd .inputText").blur(function(){
+		var curVal = $(this).val();
+		var label = $(this).siblings(".tips");
+		if(curVal == "") {
+			label.css("color", "#999");
+		}
+	});
+var zhemail = $("#zhemail").val();
+if(zhemail != "") {
+var label = $("#zhemail").siblings(".tips");
+label.hide();
+};
+var zhuser = $("#zhuser").val();
+if(zhuser != "") {
+var label = $("#zhuser").siblings(".tips");
+label.hide();
+};
+var zhanswer = $("#zhanswer").val();
+if(zhanswer != "") {
+var label = $("#zhanswer").siblings(".tips");
+label.hide();
+};
+
+$(".avtraLogin").hover(function () {
+    $(this).addClass("avtraLoginCur").children(".loginInfoMenu").slideDown("fast");
+	},
+ function () {
+    $(this).removeClass("avtraLoginCur").children(".loginInfoMenu").slideUp("fast")
+	}
+);	
+
+$(".openMore").click(function(){
+	$(this).parent(".orderEntry").siblings(".orderMore").slideToggle()
+})
+
+})	

Plik diff jest za duży
+ 4 - 0
global/js/jquery-1.7.1.min.js


Plik diff jest za duży
+ 4 - 0
global/js/jquery-1.7.2.min.js


+ 660 - 0
global/js/jquery.form.js

@@ -0,0 +1,660 @@
+/*
+ * jQuery Form Plugin
+ * version: 2.36 (07-NOV-2009)
+ * @requires jQuery v1.2.6 or later
+ *
+ * Examples and documentation at: http://malsup.com/jquery/form/
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ */
+;(function($) {
+
+/*
+	Usage Note:
+	-----------
+	Do not use both ajaxSubmit and ajaxForm on the same form.  These
+	functions are intended to be exclusive.  Use ajaxSubmit if you want
+	to bind your own submit handler to the form.  For example,
+
+	$(document).ready(function() {
+		$('#myForm').bind('submit', function() {
+			$(this).ajaxSubmit({
+				target: '#output'
+			});
+			return false; // <-- important!
+		});
+	});
+
+	Use ajaxForm when you want the plugin to manage all the event binding
+	for you.  For example,
+
+	$(document).ready(function() {
+		$('#myForm').ajaxForm({
+			target: '#output'
+		});
+	});
+
+	When using ajaxForm, the ajaxSubmit function will be invoked for you
+	at the appropriate time.
+*/
+
+/**
+ * ajaxSubmit() provides a mechanism for immediately submitting
+ * an HTML form using AJAX.
+ */
+$.fn.ajaxSubmit = function(options) {
+	// fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
+	if (!this.length) {
+		log('ajaxSubmit: skipping submit process - no element selected');
+		return this;
+	}
+
+	if (typeof options == 'function')
+		options = { success: options };
+
+	var url = $.trim(this.attr('action'));
+	if (url) {
+		// clean url (don't include hash vaue)
+		url = (url.match(/^([^#]+)/)||[])[1];
+   	}
+   	url = url || window.location.href || '';
+
+	options = $.extend({
+		url:  url,
+		type: this.attr('method') || 'GET',
+		iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
+	}, options || {});
+
+	// hook for manipulating the form data before it is extracted;
+	// convenient for use with rich editors like tinyMCE or FCKEditor
+	var veto = {};
+	this.trigger('form-pre-serialize', [this, options, veto]);
+	if (veto.veto) {
+		log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
+		return this;
+	}
+
+	// provide opportunity to alter form data before it is serialized
+	if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
+		log('ajaxSubmit: submit aborted via beforeSerialize callback');
+		return this;
+	}
+
+	var a = this.formToArray(options.semantic);
+	if (options.data) {
+		options.extraData = options.data;
+		for (var n in options.data) {
+		  if(options.data[n] instanceof Array) {
+			for (var k in options.data[n])
+			  a.push( { name: n, value: options.data[n][k] } );
+		  }
+		  else
+			 a.push( { name: n, value: options.data[n] } );
+		}
+	}
+
+	// give pre-submit callback an opportunity to abort the submit
+	if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
+		log('ajaxSubmit: submit aborted via beforeSubmit callback');
+		return this;
+	}
+
+	// fire vetoable 'validate' event
+	this.trigger('form-submit-validate', [a, this, options, veto]);
+	if (veto.veto) {
+		log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
+		return this;
+	}
+
+	var q = $.param(a);
+
+	if (options.type.toUpperCase() == 'GET') {
+		options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
+		options.data = null;  // data is null for 'get'
+	}
+	else
+		options.data = q; // data is the query string for 'post'
+
+	var $form = this, callbacks = [];
+	if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
+	if (options.clearForm) callbacks.push(function() { $form.clearForm(); });
+
+	// perform a load on the target only if dataType is not provided
+	if (!options.dataType && options.target) {
+		var oldSuccess = options.success || function(){};
+		callbacks.push(function(data) {
+			$(options.target).html(data).each(oldSuccess, arguments);
+		});
+	}
+	else if (options.success)
+		callbacks.push(options.success);
+
+	options.success = function(data, status) {
+		for (var i=0, max=callbacks.length; i < max; i++)
+			callbacks[i].apply(options, [data, status, $form]);
+	};
+
+	// are there files to upload?
+	var files = $('input:file', this).fieldValue();
+	var found = false;
+	for (var j=0; j < files.length; j++)
+		if (files[j])
+			found = true;
+
+	var multipart = false;
+//	var mp = 'multipart/form-data';
+//	multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
+
+	// options.iframe allows user to force iframe mode
+	// 06-NOV-09: now defaulting to iframe mode if file input is detected
+   if ((files.length && options.iframe !== false) || options.iframe || found || multipart) {
+	   // hack to fix Safari hang (thanks to Tim Molendijk for this)
+	   // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
+	   if (options.closeKeepAlive)
+		   $.get(options.closeKeepAlive, fileUpload);
+	   else
+		   fileUpload();
+	   }
+   else
+	   $.ajax(options);
+
+	// fire 'notify' event
+	this.trigger('form-submit-notify', [this, options]);
+	return this;
+
+
+	// private function for handling file uploads (hat tip to YAHOO!)
+	function fileUpload() {
+		var form = $form[0];
+
+		if ($(':input[name=submit]', form).length) {
+			alert('Error: Form elements must not be named "submit".');
+			return;
+		}
+
+		var opts = $.extend({}, $.ajaxSettings, options);
+		var s = $.extend(true, {}, $.extend(true, {}, $.ajaxSettings), opts);
+
+		var id = 'jqFormIO' + (new Date().getTime());
+		var $io = $('<iframe id="' + id + '" name="' + id + '" src="'+ opts.iframeSrc +'" />');
+		var io = $io[0];
+
+		$io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
+
+		var xhr = { // mock object
+			aborted: 0,
+			responseText: null,
+			responseXML: null,
+			status: 0,
+			statusText: 'n/a',
+			getAllResponseHeaders: function() {},
+			getResponseHeader: function() {},
+			setRequestHeader: function() {},
+			abort: function() {
+				this.aborted = 1;
+				$io.attr('src', opts.iframeSrc); // abort op in progress
+			}
+		};
+
+		var g = opts.global;
+		// trigger ajax global events so that activity/block indicators work like normal
+		if (g && ! $.active++) $.event.trigger("ajaxStart");
+		if (g) $.event.trigger("ajaxSend", [xhr, opts]);
+
+		if (s.beforeSend && s.beforeSend(xhr, s) === false) {
+			s.global && $.active--;
+			return;
+		}
+		if (xhr.aborted)
+			return;
+
+		var cbInvoked = 0;
+		var timedOut = 0;
+
+		// add submitting element to data if we know it
+		var sub = form.clk;
+		if (sub) {
+			var n = sub.name;
+			if (n && !sub.disabled) {
+				options.extraData = options.extraData || {};
+				options.extraData[n] = sub.value;
+				if (sub.type == "image") {
+					options.extraData[name+'.x'] = form.clk_x;
+					options.extraData[name+'.y'] = form.clk_y;
+				}
+			}
+		}
+
+		// take a breath so that pending repaints get some cpu time before the upload starts
+		setTimeout(function() {
+			// make sure form attrs are set
+			var t = $form.attr('target'), a = $form.attr('action');
+
+			// update form attrs in IE friendly way
+			form.setAttribute('target',id);
+			if (form.getAttribute('method') != 'POST')
+				form.setAttribute('method', 'POST');
+			if (form.getAttribute('action') != opts.url)
+				form.setAttribute('action', opts.url);
+
+			// ie borks in some cases when setting encoding
+			if (! options.skipEncodingOverride) {
+				$form.attr({
+					encoding: 'multipart/form-data',
+					enctype:  'multipart/form-data'
+				});
+			}
+
+			// support timout
+			if (opts.timeout)
+				setTimeout(function() { timedOut = true; cb(); }, opts.timeout);
+
+			// add "extra" data to form if provided in options
+			var extraInputs = [];
+			try {
+				if (options.extraData)
+					for (var n in options.extraData)
+						extraInputs.push(
+							$('<input type="hidden" name="'+n+'" value="'+options.extraData[n]+'" />')
+								.appendTo(form)[0]);
+
+				// add iframe to doc and submit the form
+				$io.appendTo('body');
+				io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
+				form.submit();
+			}
+			finally {
+				// reset attrs and remove "extra" input elements
+				form.setAttribute('action',a);
+				t ? form.setAttribute('target', t) : $form.removeAttr('target');
+				$(extraInputs).remove();
+			}
+		}, 10);
+
+		var domCheckCount = 50;
+
+		function cb() {
+			if (cbInvoked++) return;
+
+			io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
+
+			var ok = true;
+			try {
+				if (timedOut) throw 'timeout';
+				// extract the server response from the iframe
+				var data, doc;
+
+				doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
+				
+				var isXml = opts.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
+				log('isXml='+isXml);
+				if (!isXml && (doc.body == null || doc.body.innerHTML == '')) {
+				 	if (--domCheckCount) {
+						// in some browsers (Opera) the iframe DOM is not always traversable when
+						// the onload callback fires, so we loop a bit to accommodate
+						cbInvoked = 0;
+						setTimeout(cb, 100);
+						return;
+					}
+					log('Could not access iframe DOM after 50 tries.');
+					return;
+				}
+
+				xhr.responseText = doc.body ? doc.body.innerHTML : null;
+				xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
+				xhr.getResponseHeader = function(header){
+					var headers = {'content-type': opts.dataType};
+					return headers[header];
+				};
+
+				if (opts.dataType == 'json' || opts.dataType == 'script') {
+					// see if user embedded response in textarea
+					var ta = doc.getElementsByTagName('textarea')[0];
+					if (ta)
+						xhr.responseText = ta.value;
+					else {
+						// account for browsers injecting pre around json response
+						var pre = doc.getElementsByTagName('pre')[0];
+						if (pre)
+							xhr.responseText = pre.innerHTML;
+					}			  
+				}
+				else if (opts.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
+					xhr.responseXML = toXml(xhr.responseText);
+				}
+				data = $.httpData(xhr, opts.dataType);
+			}
+			catch(e){
+				ok = false;
+				$.handleError(opts, xhr, 'error', e);
+			}
+
+			// ordering of these callbacks/triggers is odd, but that's how $.ajax does it
+			if (ok) {
+				opts.success(data, 'success');
+				if (g) $.event.trigger("ajaxSuccess", [xhr, opts]);
+			}
+			if (g) $.event.trigger("ajaxComplete", [xhr, opts]);
+			if (g && ! --$.active) $.event.trigger("ajaxStop");
+			if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');
+
+			// clean up
+			setTimeout(function() {
+				$io.remove();
+				xhr.responseXML = null;
+			}, 100);
+		};
+
+		function toXml(s, doc) {
+			if (window.ActiveXObject) {
+				doc = new ActiveXObject('Microsoft.XMLDOM');
+				doc.async = 'false';
+				doc.loadXML(s);
+			}
+			else
+				doc = (new DOMParser()).parseFromString(s, 'text/xml');
+			return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
+		};
+	};
+};
+
+/**
+ * ajaxForm() provides a mechanism for fully automating form submission.
+ *
+ * The advantages of using this method instead of ajaxSubmit() are:
+ *
+ * 1: This method will include coordinates for <input type="image" /> elements (if the element
+ *	is used to submit the form).
+ * 2. This method will include the submit element's name/value data (for the element that was
+ *	used to submit the form).
+ * 3. This method binds the submit() method to the form for you.
+ *
+ * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
+ * passes the options argument along after properly binding events for submit elements and
+ * the form itself.
+ */
+$.fn.ajaxForm = function(options) {
+	return this.ajaxFormUnbind().bind('submit.form-plugin', function() {
+		$(this).ajaxSubmit(options);
+		return false;
+	}).bind('click.form-plugin', function(e) {
+		var target = e.target;
+		var $el = $(target);
+		if (!($el.is(":submit,input:image"))) {
+			// is this a child element of the submit el?  (ex: a span within a button)
+			var t = $el.closest(':submit');
+			if (t.length == 0)
+				return;
+			target = t[0];
+		}
+		var form = this;
+		form.clk = target;
+		if (target.type == 'image') {
+			if (e.offsetX != undefined) {
+				form.clk_x = e.offsetX;
+				form.clk_y = e.offsetY;
+			} else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
+				var offset = $el.offset();
+				form.clk_x = e.pageX - offset.left;
+				form.clk_y = e.pageY - offset.top;
+			} else {
+				form.clk_x = e.pageX - target.offsetLeft;
+				form.clk_y = e.pageY - target.offsetTop;
+			}
+		}
+		// clear form vars
+		setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100);
+	});
+};
+
+// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
+$.fn.ajaxFormUnbind = function() {
+	return this.unbind('submit.form-plugin click.form-plugin');
+};
+
+/**
+ * formToArray() gathers form element data into an array of objects that can
+ * be passed to any of the following ajax functions: $.get, $.post, or load.
+ * Each object in the array has both a 'name' and 'value' property.  An example of
+ * an array for a simple login form might be:
+ *
+ * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
+ *
+ * It is this array that is passed to pre-submit callback functions provided to the
+ * ajaxSubmit() and ajaxForm() methods.
+ */
+$.fn.formToArray = function(semantic) {
+	var a = [];
+	if (this.length == 0) return a;
+
+	var form = this[0];
+	var els = semantic ? form.getElementsByTagName('*') : form.elements;
+	if (!els) return a;
+	for(var i=0, max=els.length; i < max; i++) {
+		var el = els[i];
+		var n = el.name;
+		if (!n) continue;
+
+		if (semantic && form.clk && el.type == "image") {
+			// handle image inputs on the fly when semantic == true
+			if(!el.disabled && form.clk == el) {
+				a.push({name: n, value: $(el).val()});
+				a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+			}
+			continue;
+		}
+
+		var v = $.fieldValue(el, true);
+		if (v && v.constructor == Array) {
+			for(var j=0, jmax=v.length; j < jmax; j++)
+				a.push({name: n, value: v[j]});
+		}
+		else if (v !== null && typeof v != 'undefined')
+			a.push({name: n, value: v});
+	}
+
+	if (!semantic && form.clk) {
+		// input type=='image' are not found in elements array! handle it here
+		var $input = $(form.clk), input = $input[0], n = input.name;
+		if (n && !input.disabled && input.type == 'image') {
+			a.push({name: n, value: $input.val()});
+			a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+		}
+	}
+	return a;
+};
+
+/**
+ * Serializes form data into a 'submittable' string. This method will return a string
+ * in the format: name1=value1&amp;name2=value2
+ */
+$.fn.formSerialize = function(semantic) {
+	//hand off to jQuery.param for proper encoding
+	return $.param(this.formToArray(semantic));
+};
+
+/**
+ * Serializes all field elements in the jQuery object into a query string.
+ * This method will return a string in the format: name1=value1&amp;name2=value2
+ */
+$.fn.fieldSerialize = function(successful) {
+	var a = [];
+	this.each(function() {
+		var n = this.name;
+		if (!n) return;
+		var v = $.fieldValue(this, successful);
+		if (v && v.constructor == Array) {
+			for (var i=0,max=v.length; i < max; i++)
+				a.push({name: n, value: v[i]});
+		}
+		else if (v !== null && typeof v != 'undefined')
+			a.push({name: this.name, value: v});
+	});
+	//hand off to jQuery.param for proper encoding
+	return $.param(a);
+};
+
+/**
+ * Returns the value(s) of the element in the matched set.  For example, consider the following form:
+ *
+ *  <form><fieldset>
+ *	  <input name="A" type="text" />
+ *	  <input name="A" type="text" />
+ *	  <input name="B" type="checkbox" value="B1" />
+ *	  <input name="B" type="checkbox" value="B2"/>
+ *	  <input name="C" type="radio" value="C1" />
+ *	  <input name="C" type="radio" value="C2" />
+ *  </fieldset></form>
+ *
+ *  var v = $(':text').fieldValue();
+ *  // if no values are entered into the text inputs
+ *  v == ['','']
+ *  // if values entered into the text inputs are 'foo' and 'bar'
+ *  v == ['foo','bar']
+ *
+ *  var v = $(':checkbox').fieldValue();
+ *  // if neither checkbox is checked
+ *  v === undefined
+ *  // if both checkboxes are checked
+ *  v == ['B1', 'B2']
+ *
+ *  var v = $(':radio').fieldValue();
+ *  // if neither radio is checked
+ *  v === undefined
+ *  // if first radio is checked
+ *  v == ['C1']
+ *
+ * The successful argument controls whether or not the field element must be 'successful'
+ * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
+ * The default value of the successful argument is true.  If this value is false the value(s)
+ * for each element is returned.
+ *
+ * Note: This method *always* returns an array.  If no valid value can be determined the
+ *	   array will be empty, otherwise it will contain one or more values.
+ */
+$.fn.fieldValue = function(successful) {
+	for (var val=[], i=0, max=this.length; i < max; i++) {
+		var el = this[i];
+		var v = $.fieldValue(el, successful);
+		if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
+			continue;
+		v.constructor == Array ? $.merge(val, v) : val.push(v);
+	}
+	return val;
+};
+
+/**
+ * Returns the value of the field element.
+ */
+$.fieldValue = function(el, successful) {
+	var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
+	if (typeof successful == 'undefined') successful = true;
+
+	if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
+		(t == 'checkbox' || t == 'radio') && !el.checked ||
+		(t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
+		tag == 'select' && el.selectedIndex == -1))
+			return null;
+
+	if (tag == 'select') {
+		var index = el.selectedIndex;
+		if (index < 0) return null;
+		var a = [], ops = el.options;
+		var one = (t == 'select-one');
+		var max = (one ? index+1 : ops.length);
+		for(var i=(one ? index : 0); i < max; i++) {
+			var op = ops[i];
+			if (op.selected) {
+				var v = op.value;
+				if (!v) // extra pain for IE...
+					v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
+				if (one) return v;
+				a.push(v);
+			}
+		}
+		return a;
+	}
+	return el.value;
+};
+
+/**
+ * Clears the form data.  Takes the following actions on the form's input fields:
+ *  - input text fields will have their 'value' property set to the empty string
+ *  - select elements will have their 'selectedIndex' property set to -1
+ *  - checkbox and radio inputs will have their 'checked' property set to false
+ *  - inputs of type submit, button, reset, and hidden will *not* be effected
+ *  - button elements will *not* be effected
+ */
+$.fn.clearForm = function() {
+	return this.each(function() {
+		$('input,select,textarea', this).clearFields();
+	});
+};
+
+/**
+ * Clears the selected form elements.
+ */
+$.fn.clearFields = $.fn.clearInputs = function() {
+	return this.each(function() {
+		var t = this.type, tag = this.tagName.toLowerCase();
+		if (t == 'text' || t == 'password' || tag == 'textarea')
+			this.value = '';
+		else if (t == 'checkbox' || t == 'radio')
+			this.checked = false;
+		else if (tag == 'select')
+			this.selectedIndex = -1;
+	});
+};
+
+/**
+ * Resets the form data.  Causes all form elements to be reset to their original value.
+ */
+$.fn.resetForm = function() {
+	return this.each(function() {
+		// guard against an input with the name of 'reset'
+		// note that IE reports the reset function as an 'object'
+		if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
+			this.reset();
+	});
+};
+
+/**
+ * Enables or disables any matching elements.
+ */
+$.fn.enable = function(b) {
+	if (b == undefined) b = true;
+	return this.each(function() {
+		this.disabled = !b;
+	});
+};
+
+/**
+ * Checks/unchecks any matching checkboxes or radio buttons and
+ * selects/deselects and matching option elements.
+ */
+$.fn.selected = function(select) {
+	if (select == undefined) select = true;
+	return this.each(function() {
+		var t = this.type;
+		if (t == 'checkbox' || t == 'radio')
+			this.checked = select;
+		else if (this.tagName.toLowerCase() == 'option') {
+			var $sel = $(this).parent('select');
+			if (select && $sel[0] && $sel[0].type == 'select-one') {
+				// deselect all other options
+				$sel.find('option').selected(false);
+			}
+			this.selected = select;
+		}
+	});
+};
+
+// helper fn for console logging
+// set $.fn.ajaxSubmit.debug to true to enable debug logging
+function log() {
+	if ($.fn.ajaxSubmit.debug && window.console && window.console.log)
+		window.console.log('[jquery.form] ' + Array.prototype.join.call(arguments,''));
+};
+
+})(jQuery);

Plik diff jest za duży
+ 5 - 0
global/js/jquery.leanModal.min.js


+ 122 - 0
global/js/jquery.metadata.js

@@ -0,0 +1,122 @@
+/*
+ * Metadata - jQuery plugin for parsing metadata from elements
+ *
+ * Copyright (c) 2006 John Resig, Yehuda Katz, J�örn Zaefferer, Paul McLanahan
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ *
+ * Revision: $Id: jquery.metadata.js 4187 2007-12-16 17:15:27Z joern.zaefferer $
+ *
+ */
+
+/**
+ * Sets the type of metadata to use. Metadata is encoded in JSON, and each property
+ * in the JSON will become a property of the element itself.
+ *
+ * There are three supported types of metadata storage:
+ *
+ *   attr:  Inside an attribute. The name parameter indicates *which* attribute.
+ *          
+ *   class: Inside the class attribute, wrapped in curly braces: { }
+ *   
+ *   elem:  Inside a child element (e.g. a script tag). The
+ *          name parameter indicates *which* element.
+ *          
+ * The metadata for an element is loaded the first time the element is accessed via jQuery.
+ *
+ * As a result, you can define the metadata type, use $(expr) to load the metadata into the elements
+ * matched by expr, then redefine the metadata type and run another $(expr) for other elements.
+ * 
+ * @name $.metadata.setType
+ *
+ * @example <p id="one" class="some_class {item_id: 1, item_label: 'Label'}">This is a p</p>
+ * @before $.metadata.setType("class")
+ * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
+ * @desc Reads metadata from the class attribute
+ * 
+ * @example <p id="one" class="some_class" data="{item_id: 1, item_label: 'Label'}">This is a p</p>
+ * @before $.metadata.setType("attr", "data")
+ * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
+ * @desc Reads metadata from a "data" attribute
+ * 
+ * @example <p id="one" class="some_class"><script>{item_id: 1, item_label: 'Label'}</script>This is a p</p>
+ * @before $.metadata.setType("elem", "script")
+ * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
+ * @desc Reads metadata from a nested script element
+ * 
+ * @param String type The encoding type
+ * @param String name The name of the attribute to be used to get metadata (optional)
+ * @cat Plugins/Metadata
+ * @descr Sets the type of encoding to be used when loading metadata for the first time
+ * @type undefined
+ * @see metadata()
+ */
+
+(function($) {
+
+$.extend({
+	metadata : {
+		defaults : {
+			type: 'class',
+			name: 'metadata',
+			cre: /({.*})/,
+			single: 'metadata'
+		},
+		setType: function( type, name ){
+			this.defaults.type = type;
+			this.defaults.name = name;
+		},
+		get: function( elem, opts ){
+			var settings = $.extend({},this.defaults,opts);
+			// check for empty string in single property
+			if ( !settings.single.length ) settings.single = 'metadata';
+			
+			var data = $.data(elem, settings.single);
+			// returned cached data if it already exists
+			if ( data ) return data;
+			
+			data = "{}";
+			
+			if ( settings.type == "class" ) {
+				var m = settings.cre.exec( elem.className );
+				if ( m )
+					data = m[1];
+			} else if ( settings.type == "elem" ) {
+				if( !elem.getElementsByTagName )
+					return undefined;
+				var e = elem.getElementsByTagName(settings.name);
+				if ( e.length )
+					data = $.trim(e[0].innerHTML);
+			} else if ( elem.getAttribute != undefined ) {
+				var attr = elem.getAttribute( settings.name );
+				if ( attr )
+					data = attr;
+			}
+			
+			if ( data.indexOf( '{' ) <0 )
+			data = "{" + data + "}";
+			
+			data = eval("(" + data + ")");
+			
+			$.data( elem, settings.single, data );
+			return data;
+		}
+	}
+});
+
+/**
+ * Returns the metadata object for the first member of the jQuery object.
+ *
+ * @name metadata
+ * @descr Returns element's metadata object
+ * @param Object opts An object contianing settings to override the defaults
+ * @type jQuery
+ * @cat Plugins/Metadata
+ */
+$.fn.metadata = function( opts ){
+	return $.metadata.get( this[0], opts );
+};
+
+})(jQuery);

+ 382 - 0
global/js/jquery.mockjax.js

@@ -0,0 +1,382 @@
+/*!
+ * MockJax - jQuery Plugin to Mock Ajax requests
+ *
+ * Version:  1.4.0
+ * Released: 2011-02-04
+ * Source:   http://github.com/appendto/jquery-mockjax
+ * Docs:     http://enterprisejquery.com/2010/07/mock-your-ajax-requests-with-mockjax-for-rapid-development
+ * Plugin:   mockjax
+ * Author:   Jonathan Sharp (http://jdsharp.com)
+ * License:  MIT,GPL
+ * 
+ * Copyright (c) 2010 appendTo LLC.
+ * Dual licensed under the MIT or GPL licenses.
+ * http://appendto.com/open-source-licenses
+ */
+(function($) {
+	var _ajax = $.ajax,
+		mockHandlers = [];
+	
+	function parseXML(xml) {
+		if ( window['DOMParser'] == undefined && window.ActiveXObject ) {
+			DOMParser = function() { };
+			DOMParser.prototype.parseFromString = function( xmlString ) {
+				var doc = new ActiveXObject('Microsoft.XMLDOM');
+		        doc.async = 'false';
+		        doc.loadXML( xmlString );
+				return doc;
+			};
+		}
+		
+		try {
+			var xmlDoc 	= ( new DOMParser() ).parseFromString( xml, 'text/xml' );
+			if ( $.isXMLDoc( xmlDoc ) ) {
+				var err = $('parsererror', xmlDoc);
+				if ( err.length == 1 ) {
+					throw('Error: ' + $(xmlDoc).text() );
+				}
+			} else {
+				throw('Unable to parse XML');
+			}
+		} catch( e ) {
+			var msg = ( e.name == undefined ? e : e.name + ': ' + e.message );
+			$(document).trigger('xmlParseError', [ msg ]);
+			return undefined;
+		}
+		return xmlDoc;
+	}
+	
+	$.extend({
+		ajax: function(origSettings) {
+			var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings),
+			    mock = false;
+			// Iterate over our mock handlers (in registration order) until we find
+			// one that is willing to intercept the request
+			$.each(mockHandlers, function(k, v) {
+				if ( !mockHandlers[k] ) {
+					return;
+				}
+				var m = null;
+				// If the mock was registered with a function, let the function decide if we 
+				// want to mock this request
+				if ( $.isFunction(mockHandlers[k]) ) {
+					m = mockHandlers[k](s);
+				} else {
+					m = mockHandlers[k];
+					// Inspect the URL of the request and check if the mock handler's url 
+					// matches the url for this ajax request
+					if ( $.isFunction(m.url.test) ) {
+						// The user provided a regex for the url, test it
+						if ( !m.url.test( s.url ) ) {
+							m = null;
+						}
+					} else {
+						// Look for a simple wildcard '*' or a direct URL match
+						var star = m.url.indexOf('*');
+						if ( ( m.url != '*' && m.url != s.url && star == -1 ) ||
+							( star > -1 && m.url.substr(0, star) != s.url.substr(0, star) ) ) {
+							 // The url we tested did not match the wildcard *
+							 m = null;
+						}
+					}
+					if ( m ) {
+						// Inspect the data submitted in the request (either POST body or GET query string)
+						if ( m.data && s.data ) {
+							var identical = false;
+							// Deep inspect the identity of the objects
+							(function ident(mock, live) {
+								// Test for situations where the data is a querystring (not an object)
+								if (typeof live === 'string') {
+									// Querystring may be a regex
+									identical = $.isFunction( mock.test ) ? mock.test(live) : mock == live;
+									return identical;
+								}
+								$.each(mock, function(k, v) {
+									if ( live[k] === undefined ) {
+										identical = false;
+										return false;
+									} else {
+										identical = true;
+										if ( typeof live[k] == 'object' ) {
+											return ident(mock[k], live[k]);
+										} else {
+											if ( $.isFunction( mock[k].test ) ) {
+												identical = mock[k].test(live[k]);
+											} else {
+												identical = ( mock[k] == live[k] );
+											}
+											return identical;
+										}
+									}
+								});
+							})(m.data, s.data);
+							// They're not identical, do not mock this request
+							if ( identical == false ) {
+								m = null;
+							}
+						}
+						// Inspect the request type
+						if ( m && m.type && m.type != s.type ) {
+							// The request type doesn't match (GET vs. POST)
+							m = null;
+						}
+					}
+				}
+				if ( m ) {
+					mock = true;
+
+					// Handle console logging
+					var c = $.extend({}, $.mockjaxSettings, m);
+					if ( c.log && $.isFunction(c.log) ) {
+						c.log('MOCK ' + s.type.toUpperCase() + ': ' + s.url, $.extend({}, s));
+					}
+					
+					var jsre = /=\?(&|$)/, jsc = (new Date()).getTime();
+
+					// Handle JSONP Parameter Callbacks, we need to replicate some of the jQuery core here
+					// because there isn't an easy hook for the cross domain script tag of jsonp
+					if ( s.dataType === "jsonp" ) {
+						if ( s.type.toUpperCase() === "GET" ) {
+							if ( !jsre.test( s.url ) ) {
+								s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?";
+							}
+						} else if ( !s.data || !jsre.test(s.data) ) {
+							s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
+						}
+						s.dataType = "json";
+					}
+			
+					// Build temporary JSONP function
+					if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {
+						jsonp = s.jsonpCallback || ("jsonp" + jsc++);
+			
+						// Replace the =? sequence both in the query string and the data
+						if ( s.data ) {
+							s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
+						}
+			
+						s.url = s.url.replace(jsre, "=" + jsonp + "$1");
+			
+						// We need to make sure
+						// that a JSONP style response is executed properly
+						s.dataType = "script";
+			
+						// Handle JSONP-style loading
+						window[ jsonp ] = window[ jsonp ] || function( tmp ) {
+							data = tmp;
+							success();
+							complete();
+							// Garbage collect
+							window[ jsonp ] = undefined;
+			
+							try {
+								delete window[ jsonp ];
+							} catch(e) {}
+			
+							if ( head ) {
+								head.removeChild( script );
+							}
+						};
+					}
+					
+					var rurl = /^(\w+:)?\/\/([^\/?#]+)/,
+						parts = rurl.exec( s.url ),
+						remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
+					
+					// Test if we are going to create a script tag (if so, intercept & mock)
+					if ( s.dataType === "script" && s.type.toUpperCase() === "GET" && remote ) {
+						// Synthesize the mock request for adding a script tag
+						var callbackContext = origSettings && origSettings.context || s;
+						
+						function success() {
+							// If a local callback was specified, fire it and pass it the data
+							if ( s.success ) {
+								s.success.call( callbackContext, ( m.response ? m.response.toString() : m.responseText || ''), status, {} );
+							}
+				
+							// Fire the global callback
+							if ( s.global ) {
+								trigger( "ajaxSuccess", [{}, s] );
+							}
+						}
+				
+						function complete() {
+							// Process result
+							if ( s.complete ) {
+								s.complete.call( callbackContext, {} , status );
+							}
+				
+							// The request was completed
+							if ( s.global ) {
+								trigger( "ajaxComplete", [{}, s] );
+							}
+				
+							// Handle the global AJAX counter
+							if ( s.global && ! --jQuery.active ) {
+								jQuery.event.trigger( "ajaxStop" );
+							}
+						}
+						
+						function trigger(type, args) {
+							(s.context ? jQuery(s.context) : jQuery.event).trigger(type, args);
+						}
+						
+						if ( m.response && $.isFunction(m.response) ) {
+							m.response(origSettings);
+						} else {
+							$.globalEval(m.responseText);
+						}
+						success();
+						complete();
+						return false;
+					}
+					mock = _ajax.call($, $.extend(true, {}, origSettings, {
+						// Mock the XHR object
+						xhr: function() {
+							// Extend with our default mockjax settings
+							m = $.extend({}, $.mockjaxSettings, m);
+
+							if ( m.contentType ) {
+								m.headers['content-type'] = m.contentType;
+							}
+
+							// Return our mock xhr object
+							return {
+								status: m.status,
+								readyState: 1,
+								open: function() { },
+								send: function() {
+									// This is a substitute for < 1.4 which lacks $.proxy
+									var process = (function(that) {
+										return function() {
+											return (function() {
+												// The request has returned
+											 	this.status 		= m.status;
+												this.readyState 	= 4;
+										
+												// We have an executable function, call it to give 
+												// the mock handler a chance to update it's data
+												if ( $.isFunction(m.response) ) {
+													m.response(origSettings);
+												}
+												// Copy over our mock to our xhr object before passing control back to 
+												// jQuery's onreadystatechange callback
+												if ( s.dataType == 'json' && ( typeof m.responseText == 'object' ) ) {
+													this.responseText = JSON.stringify(m.responseText);
+												} else if ( s.dataType == 'xml' ) {
+													if ( typeof m.responseXML == 'string' ) {
+														this.responseXML = parseXML(m.responseXML);
+													} else {
+														this.responseXML = m.responseXML;
+													}
+												} else {
+													this.responseText = m.responseText;
+												}
+												// jQuery < 1.4 doesn't have onreadystate change for xhr
+												if ( $.isFunction(this.onreadystatechange) ) {
+													this.onreadystatechange( m.isTimeout ? 'timeout' : undefined );
+												}
+											}).apply(that);
+										};
+									})(this);
+
+									if ( m.proxy ) {
+										// We're proxying this request and loading in an external file instead
+										_ajax({
+											global: false,
+											url: m.proxy,
+											type: m.proxyType,
+											data: m.data,
+											dataType: s.dataType,
+											complete: function(xhr, txt) {
+												m.responseXML = xhr.responseXML;
+												m.responseText = xhr.responseText;
+												this.responseTimer = setTimeout(process, m.responseTime || 0);
+											}
+										});
+									} else {
+										// type == 'POST' || 'GET' || 'DELETE'
+										if ( s.async === false ) {
+											// TODO: Blocking delay
+											process();
+										} else {
+											this.responseTimer = setTimeout(process, m.responseTime || 50);
+										}
+									}
+								},
+								abort: function() {
+									clearTimeout(this.responseTimer);
+								},
+								setRequestHeader: function() { },
+								getResponseHeader: function(header) {
+									// 'Last-modified', 'Etag', 'content-type' are all checked by jQuery
+									if ( m.headers && m.headers[header] ) {
+										// Return arbitrary headers
+										return m.headers[header];
+									} else if ( header.toLowerCase() == 'last-modified' ) {
+										return m.lastModified || (new Date()).toString();
+									} else if ( header.toLowerCase() == 'etag' ) {
+										return m.etag || '';
+									} else if ( header.toLowerCase() == 'content-type' ) {
+										return m.contentType || 'text/plain';
+									}
+								},
+								getAllResponseHeaders: function() {
+									var headers = '';
+									$.each(m.headers, function(k, v) {
+										headers += k + ': ' + v + "\n";
+									});
+									return headers;
+								}
+							};
+						}
+					}));
+					return false;
+				}
+			});
+			// We don't have a mock request, trigger a normal request
+			if ( !mock ) {
+				return _ajax.apply($, arguments);
+			} else {
+				return mock;
+			}
+		}
+	});
+
+	$.mockjaxSettings = {
+		//url:        null,
+		//type:       'GET',
+		log:          function(msg) {
+		              	window['console'] && window.console.log && window.console.log(msg);
+		              },
+		status:       200,
+		responseTime: 500,
+		isTimeout:    false,
+		contentType:  'text/plain',
+		response:     '', 
+		responseText: '',
+		responseXML:  '',
+		proxy:        '',
+		proxyType:    'GET',
+		
+		lastModified: null,
+		etag:         '',
+		headers: {
+			etag: 'IJF@H#@923uf8023hFO@I#H#',
+			'content-type' : 'text/plain'
+		}
+	};
+
+	$.mockjax = function(settings) {
+		var i = mockHandlers.length;
+		mockHandlers[i] = settings;
+		return i;
+	};
+	$.mockjaxClear = function(i) {
+		if ( arguments.length == 1 ) {
+			mockHandlers[i] = null;
+		} else {
+			mockHandlers = [];
+		}
+	};
+})(jQuery);

Plik diff jest za duży
+ 1248 - 0
global/js/jquery.validate.js


Plik diff jest za duży
+ 51 - 0
global/js/jquery.validate.min.js


Plik diff jest za duży
+ 135 - 0
global/js/mailListCreate.html


+ 27 - 0
global/js/recharge.js

@@ -0,0 +1,27 @@
+
+$(function(){
+
+$(".payWayTab li").hover(function () {
+    $(this).addClass("hover");
+	},
+  function () {
+    $(this).removeClass("hover");
+	}
+);	
+
+var i=1;
+var show_li = $(".payWayTab li");
+show_li.each(function(index){
+		$(this).click(function(){
+			$(this).addClass("now").siblings().removeClass("now");
+			$(".payWayContent .wayItem").hide().eq($(".payWayTab li").index(this)).show();
+			i=index+1;
+		});
+});
+
+ $("input[type=radio]:checked").parent().addClass("focus");
+ $("input[type=radio]").click(function () {
+ 	$(this).parent().addClass("focus");
+ 	$(this).parent().siblings("li").removeClass("focus");
+ });
+})	

+ 154 - 0
global/js/reg.js

@@ -0,0 +1,154 @@
+/*
+*本插件原作者Vanadium,原文请移步前往http://vanadiumjs.com/查看
+*本插件由Mr.Think中文整理,Mr.Think的博客:http://MrThink.net/
+*转载及使用请务必注明原作者.
+*/
+//弹出信息样式设置
+Vanadium.config = {
+    valid_class: 'inputSus',//验证正确时表单样式
+    invalid_class: 'erroT',//验证失败时该表单样式
+    message_value_class: 'msgvaluecss',//这个样式是弹出信息中调用值的样式
+    advice_class: '',//验证失败时文字信息的样式
+    prefix: ':',
+    separator: ';',
+    reset_defer_timeout: 100
+}
+//验证类型及弹出信息设置
+Vanadium.Type = function(className, validationFunction, error_message, message, init) {
+    this.initialize(className, validationFunction, error_message, message, init);
+};
+Vanadium.Type.prototype = {
+    initialize: function(className, validationFunction, error_message, message, init) {
+        this.className = className;
+        this.message = message;
+        this.error_message = error_message;
+        this.validationFunction = validationFunction;
+        this.init = init;
+    },
+    test: function(value) {
+        return this.validationFunction.call(this, value);
+    },
+    validMessage: function() {
+        return this.message;
+    },
+    invalidMessage: function() {
+        return this.error_message;
+    },
+    toString: function() {
+        return "className:" + this.className + " message:" + this.message + " error_message:" + this.error_message
+    },
+    init: function(parameter) {
+        if (this.init) {
+            this.init(parameter);
+        }
+    }
+};
+Vanadium.setupValidatorTypes = function() {
+    Vanadium.addValidatorType('empty', function(v) {
+        return  ((v == null) || (v.length == 0));
+    });
+    //***************************************以下为验证方法,使用时可仅保留用到的判断
+    Vanadium.addValidatorTypes([
+
+        //是否为空
+        ['required', function(v) {
+            return !Vanadium.validators_types['empty'].test(v);
+        }, '此项不可为空!'],
+        //强制选中 
+        ['accept', function(v, _p, e) {
+            return e.element.checked;
+        }, '必须接受!'],
+
+        //邮箱验证
+        ['email', function (v) {
+            return (Vanadium.validators_types['empty'].test(v) || /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v))
+        }, '格式错误,例如xxx@xxx.xxx'],
+        //输入固定长度字符串
+        ['length',
+        function (v, p) {
+            if (p === undefined) {
+                return true
+            } else {
+                return v.length == parseInt(p)
+            }
+        ;
+        },
+        function (_v, p) {
+            return '输入字符长度等于<span class="' + Vanadium.config.message_value_class + '">' + p + '</span>个.'
+        }
+        ],
+        //
+        ['min_length',
+        function (v, p) {
+            if (p === undefined) {
+                return true
+            } else {
+                return v.length >= parseInt(p)
+            }
+        ;
+        },
+        function (_v, p) {
+            return '输入字符长度不低于<span class="' + Vanadium.config.message_value_class + '">' + p + '</span>个.'
+        }
+        ],
+        ['max_length',
+        function (v, p) {
+            if (p === undefined) {
+                return true
+            } else {
+                return v.length <= parseInt(p)
+            }
+        ;
+        },
+        function (_v, p) {
+            return '输入字符长度不大于<span class="' + Vanadium.config.message_value_class + '">' + p + '</span>个.'
+        }
+        ],
+        //判断密码是相同
+        ['same_as',
+        function (v, p) {
+            if (p === undefined) {
+                return true
+            } else {
+                var exemplar = document.getElementById(p);
+                if (exemplar)
+                    return v == exemplar.value;
+                else
+                    return false;
+            }
+        ;
+        },
+        function (_v, p) {
+            var exemplar = document.getElementById(p);
+            if (exemplar)
+                return '两次密码输入不相同.';
+            else
+                return '没有可参考值!'
+        },
+        "",
+        function(validation_instance) {
+            var exemplar = document.getElementById(validation_instance.param);
+            if (exemplar){
+                jQuery(exemplar).bind('validate', function(){
+                    jQuery(validation_instance.element).trigger('validate');
+                });
+            }
+        }
+        ],
+        //ajax判断是否存在值
+        ['ajax',
+        function (v, p, validation_instance, decoration_context, decoration_callback) {
+            if (Vanadium.validators_types['empty'].test(v)) return true;
+            if (decoration_context && decoration_callback) {
+                jQuery.getJSON(
+                    "http://localhost:8012/zhsso/check/"+$('#checkmail').val(),
+                    function(data) {
+                        decoration_callback.apply(decoration_context, [[data], true]);
+                    });
+            }
+            return true;
+        }]
+        ])
+    if (typeof(VanadiumCustomValidationTypes) !== "undefined" && VanadiumCustomValidationTypes) Vanadium.addValidatorTypes(VanadiumCustomValidationTypes);
+};
+        

+ 80 - 0
global/js/sendemail.js

@@ -0,0 +1,80 @@
+var id;
+$(document).ready(function(){
+	
+	var send_email=function (){
+		//var wd=$("#loading").width();
+//		var wd=$("#loading").attr("width");
+//		alert(wd);
+//		if(wd>=900)
+//			clearInterval(id);
+		
+		var tid=$("#tid").val();
+		
+		var url="/m/ajax_send_email_task/"+tid;
+		
+		$.ajax({
+			url:url,
+			type: "post",
+			cache: false,
+			dataType: "json",
+			data: {
+				tid:tid
+			},
+			global: true,
+			success: function(data){
+				
+				
+				$("#loading").width(data.percent);
+				
+				$("#is_send_count").html(data.is_send_count);
+				
+				$("#percent").html(data.percent);
+				
+				$("#faild_count").html(data.faild_count);
+				
+				$("#error_email").html(data.error_email);
+				
+				if(data.is_over==1)
+					send_email();
+				else
+					return false;
+				
+				
+//				easyDialog.open({
+//					  container : { content : '设置成功'},
+//					  autoClose : 1500,
+//					  overlay : false
+//				});
+				
+				
+				
+			},
+			error:function(err){
+				console.log(err);
+			}
+			});
+		
+		
+		//clearInterval(id);
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		//
+	}
+	
+	//id=setInterval(send_email, 1000);
+	
+	send_email();
+});
+

+ 777 - 0
global/js/swfobject.js

@@ -0,0 +1,777 @@
+/*!	SWFObject v2.2 <http://code.google.com/p/swfobject/> 
+	is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
+*/
+
+var swfobject = function() {
+	
+	var UNDEF = "undefined",
+		OBJECT = "object",
+		SHOCKWAVE_FLASH = "Shockwave Flash",
+		SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
+		FLASH_MIME_TYPE = "application/x-shockwave-flash",
+		EXPRESS_INSTALL_ID = "SWFObjectExprInst",
+		ON_READY_STATE_CHANGE = "onreadystatechange",
+		
+		win = window,
+		doc = document,
+		nav = navigator,
+		
+		plugin = false,
+		domLoadFnArr = [main],
+		regObjArr = [],
+		objIdArr = [],
+		listenersArr = [],
+		storedAltContent,
+		storedAltContentId,
+		storedCallbackFn,
+		storedCallbackObj,
+		isDomLoaded = false,
+		isExpressInstallActive = false,
+		dynamicStylesheet,
+		dynamicStylesheetMedia,
+		autoHideShow = true,
+	
+	/* Centralized function for browser feature detection
+		- User agent string detection is only used when no good alternative is possible
+		- Is executed directly for optimal performance
+	*/	
+	ua = function() {
+		var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,
+			u = nav.userAgent.toLowerCase(),
+			p = nav.platform.toLowerCase(),
+			windows = p ? /win/.test(p) : /win/.test(u),
+			mac = p ? /mac/.test(p) : /mac/.test(u),
+			webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
+			ie = !+"\v1", // feature detection based on Andrea Giammarchi's solution: http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html
+			playerVersion = [0,0,0],
+			d = null;
+		if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
+			d = nav.plugins[SHOCKWAVE_FLASH].description;
+			if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+
+				plugin = true;
+				ie = false; // cascaded feature detection for Internet Explorer
+				d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
+				playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
+				playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
+				playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;
+			}
+		}
+		else if (typeof win.ActiveXObject != UNDEF) {
+			try {
+				var a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
+				if (a) { // a will return null when ActiveX is disabled
+					d = a.GetVariable("$version");
+					if (d) {
+						ie = true; // cascaded feature detection for Internet Explorer
+						d = d.split(" ")[1].split(",");
+						playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
+					}
+				}
+			}
+			catch(e) {}
+		}
+		return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac };
+	}(),
+	
+	/* Cross-browser onDomLoad
+		- Will fire an event as soon as the DOM of a web page is loaded
+		- Internet Explorer workaround based on Diego Perini's solution: http://javascript.nwbox.com/IEContentLoaded/
+		- Regular onload serves as fallback
+	*/ 
+	onDomLoad = function() {
+		if (!ua.w3) { return; }
+		if ((typeof doc.readyState != UNDEF && doc.readyState == "complete") || (typeof doc.readyState == UNDEF && (doc.getElementsByTagName("body")[0] || doc.body))) { // function is fired after onload, e.g. when script is inserted dynamically 
+			callDomLoadFunctions();
+		}
+		if (!isDomLoaded) {
+			if (typeof doc.addEventListener != UNDEF) {
+				doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, false);
+			}		
+			if (ua.ie && ua.win) {
+				doc.attachEvent(ON_READY_STATE_CHANGE, function() {
+					if (doc.readyState == "complete") {
+						doc.detachEvent(ON_READY_STATE_CHANGE, arguments.callee);
+						callDomLoadFunctions();
+					}
+				});
+				if (win == top) { // if not inside an iframe
+					(function(){
+						if (isDomLoaded) { return; }
+						try {
+							doc.documentElement.doScroll("left");
+						}
+						catch(e) {
+							setTimeout(arguments.callee, 0);
+							return;
+						}
+						callDomLoadFunctions();
+					})();
+				}
+			}
+			if (ua.wk) {
+				(function(){
+					if (isDomLoaded) { return; }
+					if (!/loaded|complete/.test(doc.readyState)) {
+						setTimeout(arguments.callee, 0);
+						return;
+					}
+					callDomLoadFunctions();
+				})();
+			}
+			addLoadEvent(callDomLoadFunctions);
+		}
+	}();
+	
+	function callDomLoadFunctions() {
+		if (isDomLoaded) { return; }
+		try { // test if we can really add/remove elements to/from the DOM; we don't want to fire it too early
+			var t = doc.getElementsByTagName("body")[0].appendChild(createElement("span"));
+			t.parentNode.removeChild(t);
+		}
+		catch (e) { return; }
+		isDomLoaded = true;
+		var dl = domLoadFnArr.length;
+		for (var i = 0; i < dl; i++) {
+			domLoadFnArr[i]();
+		}
+	}
+	
+	function addDomLoadEvent(fn) {
+		if (isDomLoaded) {
+			fn();
+		}
+		else { 
+			domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+
+		}
+	}
+	
+	/* Cross-browser onload
+		- Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/
+		- Will fire an event as soon as a web page including all of its assets are loaded 
+	 */
+	function addLoadEvent(fn) {
+		if (typeof win.addEventListener != UNDEF) {
+			win.addEventListener("load", fn, false);
+		}
+		else if (typeof doc.addEventListener != UNDEF) {
+			doc.addEventListener("load", fn, false);
+		}
+		else if (typeof win.attachEvent != UNDEF) {
+			addListener(win, "onload", fn);
+		}
+		else if (typeof win.onload == "function") {
+			var fnOld = win.onload;
+			win.onload = function() {
+				fnOld();
+				fn();
+			};
+		}
+		else {
+			win.onload = fn;
+		}
+	}
+	
+	/* Main function
+		- Will preferably execute onDomLoad, otherwise onload (as a fallback)
+	*/
+	function main() { 
+		if (plugin) {
+			testPlayerVersion();
+		}
+		else {
+			matchVersions();
+		}
+	}
+	
+	/* Detect the Flash Player version for non-Internet Explorer browsers
+		- Detecting the plug-in version via the object element is more precise than using the plugins collection item's description:
+		  a. Both release and build numbers can be detected
+		  b. Avoid wrong descriptions by corrupt installers provided by Adobe
+		  c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports
+		- Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available
+	*/
+	function testPlayerVersion() {
+		var b = doc.getElementsByTagName("body")[0];
+		var o = createElement(OBJECT);
+		o.setAttribute("type", FLASH_MIME_TYPE);
+		var t = b.appendChild(o);
+		if (t) {
+			var counter = 0;
+			(function(){
+				if (typeof t.GetVariable != UNDEF) {
+					var d = t.GetVariable("$version");
+					if (d) {
+						d = d.split(" ")[1].split(",");
+						ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
+					}
+				}
+				else if (counter < 10) {
+					counter++;
+					setTimeout(arguments.callee, 10);
+					return;
+				}
+				b.removeChild(o);
+				t = null;
+				matchVersions();
+			})();
+		}
+		else {
+			matchVersions();
+		}
+	}
+	
+	/* Perform Flash Player and SWF version matching; static publishing only
+	*/
+	function matchVersions() {
+		var rl = regObjArr.length;
+		if (rl > 0) {
+			for (var i = 0; i < rl; i++) { // for each registered object element
+				var id = regObjArr[i].id;
+				var cb = regObjArr[i].callbackFn;
+				var cbObj = {success:false, id:id};
+				if (ua.pv[0] > 0) {
+					var obj = getElementById(id);
+					if (obj) {
+						if (hasPlayerVersion(regObjArr[i].swfVersion) && !(ua.wk && ua.wk < 312)) { // Flash Player version >= published SWF version: Houston, we have a match!
+							setVisibility(id, true);
+							if (cb) {
+								cbObj.success = true;
+								cbObj.ref = getObjectById(id);
+								cb(cbObj);
+							}
+						}
+						else if (regObjArr[i].expressInstall && canExpressInstall()) { // show the Adobe Express Install dialog if set by the web page author and if supported
+							var att = {};
+							att.data = regObjArr[i].expressInstall;
+							att.width = obj.getAttribute("width") || "0";
+							att.height = obj.getAttribute("height") || "0";
+							if (obj.getAttribute("class")) { att.styleclass = obj.getAttribute("class"); }
+							if (obj.getAttribute("align")) { att.align = obj.getAttribute("align"); }
+							// parse HTML object param element's name-value pairs
+							var par = {};
+							var p = obj.getElementsByTagName("param");
+							var pl = p.length;
+							for (var j = 0; j < pl; j++) {
+								if (p[j].getAttribute("name").toLowerCase() != "movie") {
+									par[p[j].getAttribute("name")] = p[j].getAttribute("value");
+								}
+							}
+							showExpressInstall(att, par, id, cb);
+						}
+						else { // Flash Player and SWF version mismatch or an older Webkit engine that ignores the HTML object element's nested param elements: display alternative content instead of SWF
+							displayAltContent(obj);
+							if (cb) { cb(cbObj); }
+						}
+					}
+				}
+				else {	// if no Flash Player is installed or the fp version cannot be detected we let the HTML object element do its job (either show a SWF or alternative content)
+					setVisibility(id, true);
+					if (cb) {
+						var o = getObjectById(id); // test whether there is an HTML object element or not
+						if (o && typeof o.SetVariable != UNDEF) { 
+							cbObj.success = true;
+							cbObj.ref = o;
+						}
+						cb(cbObj);
+					}
+				}
+			}
+		}
+	}
+	
+	function getObjectById(objectIdStr) {
+		var r = null;
+		var o = getElementById(objectIdStr);
+		if (o && o.nodeName == "OBJECT") {
+			if (typeof o.SetVariable != UNDEF) {
+				r = o;
+			}
+			else {
+				var n = o.getElementsByTagName(OBJECT)[0];
+				if (n) {
+					r = n;
+				}
+			}
+		}
+		return r;
+	}
+	
+	/* Requirements for Adobe Express Install
+		- only one instance can be active at a time
+		- fp 6.0.65 or higher
+		- Win/Mac OS only
+		- no Webkit engines older than version 312
+	*/
+	function canExpressInstall() {
+		return !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac) && !(ua.wk && ua.wk < 312);
+	}
+	
+	/* Show the Adobe Express Install dialog
+		- Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75
+	*/
+	function showExpressInstall(att, par, replaceElemIdStr, callbackFn) {
+		isExpressInstallActive = true;
+		storedCallbackFn = callbackFn || null;
+		storedCallbackObj = {success:false, id:replaceElemIdStr};
+		var obj = getElementById(replaceElemIdStr);
+		if (obj) {
+			if (obj.nodeName == "OBJECT") { // static publishing
+				storedAltContent = abstractAltContent(obj);
+				storedAltContentId = null;
+			}
+			else { // dynamic publishing
+				storedAltContent = obj;
+				storedAltContentId = replaceElemIdStr;
+			}
+			att.id = EXPRESS_INSTALL_ID;
+			if (typeof att.width == UNDEF || (!/%$/.test(att.width) && parseInt(att.width, 10) < 310)) { att.width = "310"; }
+			if (typeof att.height == UNDEF || (!/%$/.test(att.height) && parseInt(att.height, 10) < 137)) { att.height = "137"; }
+			doc.title = doc.title.slice(0, 47) + " - Flash Player Installation";
+			var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn",
+				fv = "MMredirectURL=" + win.location.toString().replace(/&/g,"%26") + "&MMplayerType=" + pt + "&MMdoctitle=" + doc.title;
+			if (typeof par.flashvars != UNDEF) {
+				par.flashvars += "&" + fv;
+			}
+			else {
+				par.flashvars = fv;
+			}
+			// IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it,
+			// because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
+			if (ua.ie && ua.win && obj.readyState != 4) {
+				var newObj = createElement("div");
+				replaceElemIdStr += "SWFObjectNew";
+				newObj.setAttribute("id", replaceElemIdStr);
+				obj.parentNode.insertBefore(newObj, obj); // insert placeholder div that will be replaced by the object element that loads expressinstall.swf
+				obj.style.display = "none";
+				(function(){
+					if (obj.readyState == 4) {
+						obj.parentNode.removeChild(obj);
+					}
+					else {
+						setTimeout(arguments.callee, 10);
+					}
+				})();
+			}
+			createSWF(att, par, replaceElemIdStr);
+		}
+	}
+	
+	/* Functions to abstract and display alternative content
+	*/
+	function displayAltContent(obj) {
+		if (ua.ie && ua.win && obj.readyState != 4) {
+			// IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it,
+			// because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
+			var el = createElement("div");
+			obj.parentNode.insertBefore(el, obj); // insert placeholder div that will be replaced by the alternative content
+			el.parentNode.replaceChild(abstractAltContent(obj), el);
+			obj.style.display = "none";
+			(function(){
+				if (obj.readyState == 4) {
+					obj.parentNode.removeChild(obj);
+				}
+				else {
+					setTimeout(arguments.callee, 10);
+				}
+			})();
+		}
+		else {
+			obj.parentNode.replaceChild(abstractAltContent(obj), obj);
+		}
+	} 
+
+	function abstractAltContent(obj) {
+		var ac = createElement("div");
+		if (ua.win && ua.ie) {
+			ac.innerHTML = obj.innerHTML;
+		}
+		else {
+			var nestedObj = obj.getElementsByTagName(OBJECT)[0];
+			if (nestedObj) {
+				var c = nestedObj.childNodes;
+				if (c) {
+					var cl = c.length;
+					for (var i = 0; i < cl; i++) {
+						if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) {
+							ac.appendChild(c[i].cloneNode(true));
+						}
+					}
+				}
+			}
+		}
+		return ac;
+	}
+	
+	/* Cross-browser dynamic SWF creation
+	*/
+	function createSWF(attObj, parObj, id) {
+		var r, el = getElementById(id);
+		if (ua.wk && ua.wk < 312) { return r; }
+		if (el) {
+			if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content
+				attObj.id = id;
+			}
+			if (ua.ie && ua.win) { // Internet Explorer + the HTML object element + W3C DOM methods do not combine: fall back to outerHTML
+				var att = "";
+				for (var i in attObj) {
+					if (attObj[i] != Object.prototype[i]) { // filter out prototype additions from other potential libraries
+						if (i.toLowerCase() == "data") {
+							parObj.movie = attObj[i];
+						}
+						else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
+							att += ' class="' + attObj[i] + '"';
+						}
+						else if (i.toLowerCase() != "classid") {
+							att += ' ' + i + '="' + attObj[i] + '"';
+						}
+					}
+				}
+				var par = "";
+				for (var j in parObj) {
+					if (parObj[j] != Object.prototype[j]) { // filter out prototype additions from other potential libraries
+						par += '<param name="' + j + '" value="' + parObj[j] + '" />';
+					}
+				}
+				el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';
+				objIdArr[objIdArr.length] = attObj.id; // stored to fix object 'leaks' on unload (dynamic publishing only)
+				r = getElementById(attObj.id);	
+			}
+			else { // well-behaving browsers
+				var o = createElement(OBJECT);
+				o.setAttribute("type", FLASH_MIME_TYPE);
+				for (var m in attObj) {
+					if (attObj[m] != Object.prototype[m]) { // filter out prototype additions from other potential libraries
+						if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
+							o.setAttribute("class", attObj[m]);
+						}
+						else if (m.toLowerCase() != "classid") { // filter out IE specific attribute
+							o.setAttribute(m, attObj[m]);
+						}
+					}
+				}
+				for (var n in parObj) {
+					if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // filter out prototype additions from other potential libraries and IE specific param element
+						createObjParam(o, n, parObj[n]);
+					}
+				}
+				el.parentNode.replaceChild(o, el);
+				r = o;
+			}
+		}
+		return r;
+	}
+	
+	function createObjParam(el, pName, pValue) {
+		var p = createElement("param");
+		p.setAttribute("name", pName);	
+		p.setAttribute("value", pValue);
+		el.appendChild(p);
+	}
+	
+	/* Cross-browser SWF removal
+		- Especially needed to safely and completely remove a SWF in Internet Explorer
+	*/
+	function removeSWF(id) {
+		var obj = getElementById(id);
+		if (obj && obj.nodeName == "OBJECT") {
+			if (ua.ie && ua.win) {
+				obj.style.display = "none";
+				(function(){
+					if (obj.readyState == 4) {
+						removeObjectInIE(id);
+					}
+					else {
+						setTimeout(arguments.callee, 10);
+					}
+				})();
+			}
+			else {
+				obj.parentNode.removeChild(obj);
+			}
+		}
+	}
+	
+	function removeObjectInIE(id) {
+		var obj = getElementById(id);
+		if (obj) {
+			for (var i in obj) {
+				if (typeof obj[i] == "function") {
+					obj[i] = null;
+				}
+			}
+			obj.parentNode.removeChild(obj);
+		}
+	}
+	
+	/* Functions to optimize JavaScript compression
+	*/
+	function getElementById(id) {
+		var el = null;
+		try {
+			el = doc.getElementById(id);
+		}
+		catch (e) {}
+		return el;
+	}
+	
+	function createElement(el) {
+		return doc.createElement(el);
+	}
+	
+	/* Updated attachEvent function for Internet Explorer
+		- Stores attachEvent information in an Array, so on unload the detachEvent functions can be called to avoid memory leaks
+	*/	
+	function addListener(target, eventType, fn) {
+		target.attachEvent(eventType, fn);
+		listenersArr[listenersArr.length] = [target, eventType, fn];
+	}
+	
+	/* Flash Player and SWF content version matching
+	*/
+	function hasPlayerVersion(rv) {
+		var pv = ua.pv, v = rv.split(".");
+		v[0] = parseInt(v[0], 10);
+		v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0"
+		v[2] = parseInt(v[2], 10) || 0;
+		return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
+	}
+	
+	/* Cross-browser dynamic CSS creation
+		- Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php
+	*/	
+	function createCSS(sel, decl, media, newStyle) {
+		if (ua.ie && ua.mac) { return; }
+		var h = doc.getElementsByTagName("head")[0];
+		if (!h) { return; } // to also support badly authored HTML pages that lack a head element
+		var m = (media && typeof media == "string") ? media : "screen";
+		if (newStyle) {
+			dynamicStylesheet = null;
+			dynamicStylesheetMedia = null;
+		}
+		if (!dynamicStylesheet || dynamicStylesheetMedia != m) { 
+			// create dynamic stylesheet + get a global reference to it
+			var s = createElement("style");
+			s.setAttribute("type", "text/css");
+			s.setAttribute("media", m);
+			dynamicStylesheet = h.appendChild(s);
+			if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) {
+				dynamicStylesheet = doc.styleSheets[doc.styleSheets.length - 1];
+			}
+			dynamicStylesheetMedia = m;
+		}
+		// add style rule
+		if (ua.ie && ua.win) {
+			if (dynamicStylesheet && typeof dynamicStylesheet.addRule == OBJECT) {
+				dynamicStylesheet.addRule(sel, decl);
+			}
+		}
+		else {
+			if (dynamicStylesheet && typeof doc.createTextNode != UNDEF) {
+				dynamicStylesheet.appendChild(doc.createTextNode(sel + " {" + decl + "}"));
+			}
+		}
+	}
+	
+	function setVisibility(id, isVisible) {
+		if (!autoHideShow) { return; }
+		var v = isVisible ? "visible" : "hidden";
+		if (isDomLoaded && getElementById(id)) {
+			getElementById(id).style.visibility = v;
+		}
+		else {
+			createCSS("#" + id, "visibility:" + v);
+		}
+	}
+
+	/* Filter to avoid XSS attacks
+	*/
+	function urlEncodeIfNecessary(s) {
+		var regex = /[\\\"<>\.;]/;
+		var hasBadChars = regex.exec(s) != null;
+		return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s;
+	}
+	
+	/* Release memory to avoid memory leaks caused by closures, fix hanging audio/video threads and force open sockets/NetConnections to disconnect (Internet Explorer only)
+	*/
+	var cleanup = function() {
+		if (ua.ie && ua.win) {
+			window.attachEvent("onunload", function() {
+				// remove listeners to avoid memory leaks
+				var ll = listenersArr.length;
+				for (var i = 0; i < ll; i++) {
+					listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]);
+				}
+				// cleanup dynamically embedded objects to fix audio/video threads and force open sockets and NetConnections to disconnect
+				var il = objIdArr.length;
+				for (var j = 0; j < il; j++) {
+					removeSWF(objIdArr[j]);
+				}
+				// cleanup library's main closures to avoid memory leaks
+				for (var k in ua) {
+					ua[k] = null;
+				}
+				ua = null;
+				for (var l in swfobject) {
+					swfobject[l] = null;
+				}
+				swfobject = null;
+			});
+		}
+	}();
+	
+	return {
+		/* Public API
+			- Reference: http://code.google.com/p/swfobject/wiki/documentation
+		*/ 
+		registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr, callbackFn) {
+			if (ua.w3 && objectIdStr && swfVersionStr) {
+				var regObj = {};
+				regObj.id = objectIdStr;
+				regObj.swfVersion = swfVersionStr;
+				regObj.expressInstall = xiSwfUrlStr;
+				regObj.callbackFn = callbackFn;
+				regObjArr[regObjArr.length] = regObj;
+				setVisibility(objectIdStr, false);
+			}
+			else if (callbackFn) {
+				callbackFn({success:false, id:objectIdStr});
+			}
+		},
+		
+		getObjectById: function(objectIdStr) {
+			if (ua.w3) {
+				return getObjectById(objectIdStr);
+			}
+		},
+		
+		embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) {
+			var callbackObj = {success:false, id:replaceElemIdStr};
+			if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) {
+				setVisibility(replaceElemIdStr, false);
+				addDomLoadEvent(function() {
+					widthStr += ""; // auto-convert to string
+					heightStr += "";
+					var att = {};
+					if (attObj && typeof attObj === OBJECT) {
+						for (var i in attObj) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs
+							att[i] = attObj[i];
+						}
+					}
+					att.data = swfUrlStr;
+					att.width = widthStr;
+					att.height = heightStr;
+					var par = {}; 
+					if (parObj && typeof parObj === OBJECT) {
+						for (var j in parObj) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs
+							par[j] = parObj[j];
+						}
+					}
+					if (flashvarsObj && typeof flashvarsObj === OBJECT) {
+						for (var k in flashvarsObj) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs
+							if (typeof par.flashvars != UNDEF) {
+								par.flashvars += "&" + k + "=" + flashvarsObj[k];
+							}
+							else {
+								par.flashvars = k + "=" + flashvarsObj[k];
+							}
+						}
+					}
+					if (hasPlayerVersion(swfVersionStr)) { // create SWF
+						var obj = createSWF(att, par, replaceElemIdStr);
+						if (att.id == replaceElemIdStr) {
+							setVisibility(replaceElemIdStr, true);
+						}
+						callbackObj.success = true;
+						callbackObj.ref = obj;
+					}
+					else if (xiSwfUrlStr && canExpressInstall()) { // show Adobe Express Install
+						att.data = xiSwfUrlStr;
+						showExpressInstall(att, par, replaceElemIdStr, callbackFn);
+						return;
+					}
+					else { // show alternative content
+						setVisibility(replaceElemIdStr, true);
+					}
+					if (callbackFn) { callbackFn(callbackObj); }
+				});
+			}
+			else if (callbackFn) { callbackFn(callbackObj);	}
+		},
+		
+		switchOffAutoHideShow: function() {
+			autoHideShow = false;
+		},
+		
+		ua: ua,
+		
+		getFlashPlayerVersion: function() {
+			return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
+		},
+		
+		hasFlashPlayerVersion: hasPlayerVersion,
+		
+		createSWF: function(attObj, parObj, replaceElemIdStr) {
+			if (ua.w3) {
+				return createSWF(attObj, parObj, replaceElemIdStr);
+			}
+			else {
+				return undefined;
+			}
+		},
+		
+		showExpressInstall: function(att, par, replaceElemIdStr, callbackFn) {
+			if (ua.w3 && canExpressInstall()) {
+				showExpressInstall(att, par, replaceElemIdStr, callbackFn);
+			}
+		},
+		
+		removeSWF: function(objElemIdStr) {
+			if (ua.w3) {
+				removeSWF(objElemIdStr);
+			}
+		},
+		
+		createCSS: function(selStr, declStr, mediaStr, newStyleBoolean) {
+			if (ua.w3) {
+				createCSS(selStr, declStr, mediaStr, newStyleBoolean);
+			}
+		},
+		
+		addDomLoadEvent: addDomLoadEvent,
+		
+		addLoadEvent: addLoadEvent,
+		
+		getQueryParamValue: function(param) {
+			var q = doc.location.search || doc.location.hash;
+			if (q) {
+				if (/\?/.test(q)) { q = q.split("?")[1]; } // strip question mark
+				if (param == null) {
+					return urlEncodeIfNecessary(q);
+				}
+				var pairs = q.split("&");
+				for (var i = 0; i < pairs.length; i++) {
+					if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
+						return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1)));
+					}
+				}
+			}
+			return "";
+		},
+		
+		// For internal usage only
+		expressInstallCallback: function() {
+			if (isExpressInstallActive) {
+				var obj = getElementById(EXPRESS_INSTALL_ID);
+				if (obj && storedAltContent) {
+					obj.parentNode.replaceChild(storedAltContent, obj);
+					if (storedAltContentId) {
+						setVisibility(storedAltContentId, true);
+						if (ua.ie && ua.win) { storedAltContent.style.display = "block"; }
+					}
+					if (storedCallbackFn) { storedCallbackFn(storedCallbackObj); }
+				}
+				isExpressInstallActive = false;
+			} 
+		}
+	};
+}();

+ 81 - 0
global/js/ueditor/dialogs/internal.js

@@ -0,0 +1,81 @@
+(function () {
+    var parent = window.parent;
+    //dialog对象
+    dialog = parent.$EDITORUI[window.frameElement.id.replace( /_iframe$/, '' )];
+    //当前打开dialog的编辑器实例
+    editor = dialog.editor;
+
+    UE = parent.UE;
+
+    domUtils = UE.dom.domUtils;
+
+    utils = UE.utils;
+
+    browser = UE.browser;
+
+    ajax = UE.ajax;
+
+    $G = function ( id ) {
+        return document.getElementById( id )
+    };
+    //focus元素
+    $focus = function ( node ) {
+        setTimeout( function () {
+            if ( browser.ie ) {
+                var r = node.createTextRange();
+                r.collapse( false );
+                r.select();
+            } else {
+                node.focus()
+            }
+        }, 0 )
+    };
+    utils.loadFile(document,{
+        href:editor.options.themePath + editor.options.theme + "/dialogbase.css?cache="+Math.random(),
+        tag:"link",
+        type:"text/css",
+        rel:"stylesheet"
+    });
+    lang = editor.getLang(dialog.className.split( "-" )[2]);
+    if(lang){
+        domUtils.on(window,'load',function () {
+
+            var langImgPath = editor.options.langPath + editor.options.lang + "/images/";
+            //针对静态资源
+            for ( var i in lang["static"] ) {
+                var dom = $G( i );
+                if(!dom) continue;
+                var tagName = dom.tagName,
+                    content = lang["static"][i];
+                if(content.src){
+                    //clone
+                    content = utils.extend({},content,false);
+                    content.src = langImgPath + content.src;
+                }
+                if(content.style){
+                    content = utils.extend({},content,false);
+                    content.style = content.style.replace(/url\s*\(/g,"url(" + langImgPath)
+                }
+                switch ( tagName.toLowerCase() ) {
+                    case "var":
+                        dom.parentNode.replaceChild( document.createTextNode( content ), dom );
+                        break;
+                    case "select":
+                        var ops = dom.options;
+                        for ( var j = 0, oj; oj = ops[j]; ) {
+                            oj.innerHTML = content.options[j++];
+                        }
+                        for ( var p in content ) {
+                            p != "options" && dom.setAttribute( p, content[p] );
+                        }
+                        break;
+                    default :
+                        domUtils.setAttributes( dom, content);
+                }
+            }
+        } );
+    }
+
+
+})();
+

+ 126 - 0
global/js/ueditor/dialogs/link/link.html

@@ -0,0 +1,126 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        *{margin:0;padding:0;color: #838383;}
+        table{font-size: 12px;margin: 10px;line-height: 30px}
+        .txt{width:300px;height:21px;line-height:21px;border:1px solid #d7d7d7;}
+    </style>
+</head>
+<body>
+    <table>
+        <tr>
+            <td><label for="text"> <var id="lang_input_text"></var></label></td>
+            <td><input class="txt" id="text" type="text" disabled="true"/></td>
+        </tr>
+        <tr>
+            <td><label for="href"> <var id="lang_input_url"></var></label></td>
+            <td><input class="txt" id="href" type="text" /></td>
+        </tr>
+        <tr>
+            <td><label for="title"> <var id="lang_input_title"></var></label></td>
+            <td><input class="txt" id="title" type="text"/></td>
+        </tr>
+        <tr>
+             <td colspan="2">
+                 <label for="target"><var id="lang_input_target"></var></label>
+                 <input id="target" type="checkbox"/>
+             </td>
+        </tr>
+        <tr>
+            <td colspan="2" id="msg"></td>
+        </tr>
+    </table>
+<script type="text/javascript">
+    var range = editor.selection.getRange(),
+        link = range.collapsed ? editor.queryCommandValue( "link" ) : editor.selection.getStart(),
+        url,
+        text = $G('text'),
+        rangeLink = domUtils.findParentByTagName(range.getCommonAncestor(),'a',true),
+        orgText;
+    link = domUtils.findParentByTagName( link, "a", true );
+    if(link){
+        url = utils.html(link.getAttribute( '_href' ) || link.getAttribute( 'href', 2 ));
+
+        if(rangeLink === link && !link.getElementsByTagName('img').length){
+            text.removeAttribute('disabled');
+            orgText = text.value = link[browser.ie ? 'innerText':'textContent'];
+        }else{
+            text.setAttribute('disabled','true');
+            text.value = lang.validLink;
+        }
+
+    }else{
+        if(range.collapsed){
+            text.removeAttribute('disabled');
+            text.value = '';
+        }else{
+            text.setAttribute('disabled','true');
+            text.value = lang.validLink;
+        }
+
+    }
+    $G("title").value = url ? link.title : "";
+    $G("href").value = url ? url: '';
+    $G("target").checked = url && link.target == "_blank" ? true :  false;
+    $focus($G("href"));
+
+    function handleDialogOk(){
+        var href =$G('href').value.replace(/^\s+|\s+$/g, '');
+        if(href){
+            if(!hrefStartWith(href,["http","/","ftp://",'#'])) {
+                href  = "http://" + href;
+            }
+            var obj = {
+                'href' : href,
+                'target' : $G("target").checked ? "_blank" : '_self',
+                'title' : $G("title").value.replace(/^\s+|\s+$/g, ''),
+                '_href':href
+            };
+            //修改链接内容的情况太特殊了,所以先做到这里了
+            //todo:情况多的时候,做到command里
+            if(orgText && text.value != orgText){
+                link[browser.ie ? 'innerText' : 'textContent'] =  obj.textValue = text.value;
+                range.selectNode(link).select()
+            }
+            if(range.collapsed){
+                obj.textValue = text.value;
+            }
+            editor.execCommand('link',utils.clearEmptyAttrs(obj) );
+            dialog.close();
+        }
+    }
+    dialog.onok = handleDialogOk;
+    $G('href').onkeydown = $G('title').onkeydown = function(evt){
+        evt = evt || window.event;
+        if (evt.keyCode == 13) {
+            handleDialogOk();
+            return false;
+        }
+    };
+    $G('href').onblur = function(){
+        if(!hrefStartWith(this.value,["http","/","ftp://",'#'])){
+            $G("msg").innerHTML = "<span style='color: red'>"+lang.httpPrompt+"</span>";
+        }else{
+            $G("msg").innerHTML = "";
+        }
+    };
+
+    function hrefStartWith(href,arr){
+        href = href.replace(/^\s+|\s+$/g, '');
+        for(var i=0,ai;ai=arr[i++];){
+            if(href.indexOf(ai)==0){
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+</script>
+</body>
+</html>

BIN
global/js/ueditor/lang/zh-cn/images/copy.png


BIN
global/js/ueditor/lang/zh-cn/images/localimage.png


BIN
global/js/ueditor/lang/zh-cn/images/music.png


BIN
global/js/ueditor/lang/zh-cn/images/upload.png


+ 669 - 0
global/js/ueditor/lang/zh-cn/zh-cn.js

@@ -0,0 +1,669 @@
+/**
+ * Created with JetBrains PhpStorm.
+ * User: taoqili
+ * Date: 12-6-12
+ * Time: 下午5:02
+ * To change this template use File | Settings | File Templates.
+ */
+UE.I18N['zh-cn'] = {
+    'labelMap':{
+        'anchor':'锚点', 'undo':'撤销', 'redo':'重做', 'bold':'加粗', 'indent':'首行缩进', 'snapscreen':'截图',
+        'italic':'斜体', 'underline':'下划线', 'strikethrough':'删除线', 'subscript':'下标','fontborder':'字符边框',
+        'superscript':'上标', 'formatmatch':'格式刷', 'source':'源代码', 'blockquote':'引用',
+        'pasteplain':'纯文本粘贴模式', 'selectall':'全选', 'print':'打印', 'preview':'预览',
+        'horizontal':'分隔线', 'removeformat':'清除格式', 'time':'时间', 'date':'日期',
+        'unlink':'取消链接', 'insertrow':'前插入行', 'insertcol':'前插入列', 'mergeright':'右合并单元格', 'mergedown':'下合并单元格',
+        'deleterow':'删除行', 'deletecol':'删除列', 'splittorows':'拆分成行',
+        'splittocols':'拆分成列', 'splittocells':'完全拆分单元格','deletecaption':'删除表格标题','inserttitle':'插入标题',
+        'mergecells':'合并多个单元格', 'deletetable':'删除表格', 'cleardoc':'清空文档','insertparagraphbeforetable':"表格前插入行",'insertcode':'代码语言',
+        'fontfamily':'字体', 'fontsize':'字号', 'paragraph':'段落格式', 'simpleupload':'单图上传', 'insertimage':'多图上传','edittable':'表格属性','edittd':'单元格属性', 'link':'超链接',
+        'emotion':'表情', 'spechars':'特殊字符', 'searchreplace':'查询替换', 'map':'Baidu地图', 'gmap':'Google地图',
+        'insertvideo':'视频', 'help':'帮助', 'justifyleft':'居左对齐', 'justifyright':'居右对齐', 'justifycenter':'居中对齐',
+        'justifyjustify':'两端对齐', 'forecolor':'字体颜色', 'backcolor':'背景色', 'insertorderedlist':'有序列表',
+        'insertunorderedlist':'无序列表', 'fullscreen':'全屏', 'directionalityltr':'从左向右输入', 'directionalityrtl':'从右向左输入',
+        'rowspacingtop':'段前距', 'rowspacingbottom':'段后距',  'pagebreak':'分页', 'insertframe':'插入Iframe', 'imagenone':'默认',
+        'imageleft':'左浮动', 'imageright':'右浮动', 'attachment':'附件', 'imagecenter':'居中', 'wordimage':'图片转存',
+        'lineheight':'行间距','edittip' :'编辑提示','customstyle':'自定义标题', 'autotypeset':'自动排版',
+        'webapp':'百度应用','touppercase':'字母大写', 'tolowercase':'字母小写','background':'背景','template':'模板','scrawl':'涂鸦',
+        'music':'音乐','inserttable':'插入表格','drafts': '从草稿箱加载', 'charts': '图表'
+    },
+    'insertorderedlist':{
+        'num':'1,2,3...',
+        'num1':'1),2),3)...',
+        'num2':'(1),(2),(3)...',
+        'cn':'一,二,三....',
+        'cn1':'一),二),三)....',
+        'cn2':'(一),(二),(三)....',
+        'decimal':'1,2,3...',
+        'lower-alpha':'a,b,c...',
+        'lower-roman':'i,ii,iii...',
+        'upper-alpha':'A,B,C...',
+        'upper-roman':'I,II,III...'
+    },
+    'insertunorderedlist':{
+        'circle':'○ 大圆圈',
+        'disc':'● 小黑点',
+        'square':'■ 小方块 ',
+        'dash' :'— 破折号',
+        'dot':' 。 小圆圈'
+    },
+    'paragraph':{'p':'段落', 'h1':'标题 1', 'h2':'标题 2', 'h3':'标题 3', 'h4':'标题 4', 'h5':'标题 5', 'h6':'标题 6'},
+    'fontfamily':{
+        'songti':'宋体',
+        'kaiti':'楷体',
+        'heiti':'黑体',
+        'lishu':'隶书',
+        'yahei':'微软雅黑',
+        'andaleMono':'andale mono',
+        'arial': 'arial',
+        'arialBlack':'arial black',
+        'comicSansMs':'comic sans ms',
+        'impact':'impact',
+        'timesNewRoman':'times new roman'
+    },
+    'customstyle':{
+        'tc':'标题居中',
+        'tl':'标题居左',
+        'im':'强调',
+        'hi':'明显强调'
+    },
+    'autoupload': {
+        'exceedSizeError': '文件大小超出限制',
+        'exceedTypeError': '文件格式不允许',
+        'jsonEncodeError': '服务器返回格式错误',
+        'loading':"正在上传...",
+        'loadError':"上传错误",
+        'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!'
+    },
+    'simpleupload':{
+        'exceedSizeError': '文件大小超出限制',
+        'exceedTypeError': '文件格式不允许',
+        'jsonEncodeError': '服务器返回格式错误',
+        'loading':"正在上传...",
+        'loadError':"上传错误",
+        'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!'
+    },
+    'elementPathTip':"元素路径",
+    'wordCountTip':"字数统计",
+    'wordCountMsg':'当前已输入{#count}个字符, 您还可以输入{#leave}个字符。 ',
+    'wordOverFlowMsg':'<span style="color:red;">字数超出最大允许值,服务器可能拒绝保存!</span>',
+    'ok':"确认",
+    'cancel':"取消",
+    'closeDialog':"关闭对话框",
+    'tableDrag':"表格拖动必须引入uiUtils.js文件!",
+    'autofloatMsg':"工具栏浮动依赖编辑器UI,您首先需要引入UI文件!",
+    'loadconfigError': '获取后台配置项请求出错,上传功能将不能正常使用!',
+    'loadconfigFormatError': '后台配置项返回格式出错,上传功能将不能正常使用!',
+    'loadconfigHttpError': '请求后台配置项http错误,上传功能将不能正常使用!',
+    'snapScreen_plugin':{
+        'browserMsg':"仅支持IE浏览器!",
+        'callBackErrorMsg':"服务器返回数据有误,请检查配置项之后重试。",
+        'uploadErrorMsg':"截图上传失败,请检查服务器端环境! "
+    },
+    'insertcode':{
+        'as3':'ActionScript 3',
+        'bash':'Bash/Shell',
+        'cpp':'C/C++',
+        'css':'CSS',
+        'cf':'ColdFusion',
+        'c#':'C#',
+        'delphi':'Delphi',
+        'diff':'Diff',
+        'erlang':'Erlang',
+        'groovy':'Groovy',
+        'html':'HTML',
+        'java':'Java',
+        'jfx':'JavaFX',
+        'js':'JavaScript',
+        'pl':'Perl',
+        'php':'PHP',
+        'plain':'Plain Text',
+        'ps':'PowerShell',
+        'python':'Python',
+        'ruby':'Ruby',
+        'scala':'Scala',
+        'sql':'SQL',
+        'vb':'Visual Basic',
+        'xml':'XML'
+    },
+    'confirmClear':"确定清空当前文档么?",
+    'contextMenu':{
+        'delete':"删除",
+        'selectall':"全选",
+        'deletecode':"删除代码",
+        'cleardoc':"清空文档",
+        'confirmclear':"确定清空当前文档么?",
+        'unlink':"删除超链接",
+        'paragraph':"段落格式",
+        'edittable':"表格属性",
+        'aligntd':"单元格对齐方式",
+        'aligntable':'表格对齐方式',
+        'tableleft':'左浮动',
+        'tablecenter':'居中显示',
+        'tableright':'右浮动',
+        'edittd':"单元格属性",
+        'setbordervisible':'设置表格边线可见',
+        'justifyleft':'左对齐',
+        'justifyright':'右对齐',
+        'justifycenter':'居中对齐',
+        'justifyjustify':'两端对齐',
+        'table':"表格",
+        'inserttable':'插入表格',
+        'deletetable':"删除表格",
+        'insertparagraphbefore':"前插入段落",
+        'insertparagraphafter':'后插入段落',
+        'deleterow':"删除当前行",
+        'deletecol':"删除当前列",
+        'insertrow':"前插入行",
+        'insertcol':"左插入列",
+        'insertrownext':'后插入行',
+        'insertcolnext':'右插入列',
+        'insertcaption':'插入表格名称',
+        'deletecaption':'删除表格名称',
+        'inserttitle':'插入表格标题行',
+        'deletetitle':'删除表格标题行',
+        'inserttitlecol':'插入表格标题列',
+        'deletetitlecol':'删除表格标题列',
+        'averageDiseRow':'平均分布各行',
+        'averageDisCol':'平均分布各列',
+        'mergeright':"向右合并",
+        'mergeleft':"向左合并",
+        'mergedown':"向下合并",
+        'mergecells':"合并单元格",
+        'splittocells':"完全拆分单元格",
+        'splittocols':"拆分成列",
+        'splittorows':"拆分成行",
+        'tablesort':'表格排序',
+        'enablesort':'设置表格可排序',
+        'disablesort':'取消表格可排序',
+        'reversecurrent':'逆序当前',
+        'orderbyasc':'按ASCII字符升序',
+        'reversebyasc':'按ASCII字符降序',
+        'orderbynum':'按数值大小升序',
+        'reversebynum':'按数值大小降序',
+        'borderbk':'边框底纹',
+        'setcolor':'表格隔行变色',
+        'unsetcolor':'取消表格隔行变色',
+        'setbackground':'选区背景隔行',
+        'unsetbackground':'取消选区背景',
+        'redandblue':'红蓝相间',
+        'threecolorgradient':'三色渐变',
+        'copy':"复制(Ctrl + c)",
+        'copymsg': "浏览器不支持,请使用 'Ctrl + c'",
+        'paste':"粘贴(Ctrl + v)",
+         'pastemsg': "浏览器不支持,请使用 'Ctrl + v'"
+    },
+    'copymsg': "浏览器不支持,请使用 'Ctrl + c'",
+    'pastemsg': "浏览器不支持,请使用 'Ctrl + v'",
+    'anthorMsg':"链接",
+    'clearColor':'清空颜色',
+    'standardColor':'标准颜色',
+    'themeColor':'主题颜色',
+    'property':'属性',
+    'default':'默认',
+    'modify':'修改',
+    'justifyleft':'左对齐',
+    'justifyright':'右对齐',
+    'justifycenter':'居中',
+    'justify':'默认',
+    'clear':'清除',
+    'anchorMsg':'锚点',
+    'delete':'删除',
+    'clickToUpload':"点击上传",
+    'unset':'尚未设置语言文件',
+    't_row':'行',
+    't_col':'列',
+    'more':'更多',
+    'pasteOpt':'粘贴选项',
+    'pasteSourceFormat':"保留源格式",
+    'tagFormat':'只保留标签',
+    'pasteTextFormat':'只保留文本',
+    'autoTypeSet':{
+        'mergeLine':"合并空行",
+        'delLine':"清除空行",
+        'removeFormat':"清除格式",
+        'indent':"首行缩进",
+        'alignment':"对齐方式",
+        'imageFloat':"图片浮动",
+        'removeFontsize':"清除字号",
+        'removeFontFamily':"清除字体",
+        'removeHtml':"清除冗余HTML代码",
+        'pasteFilter':"粘贴过滤",
+        'run':"执行",
+        'symbol':'符号转换',
+        'bdc2sb':'全角转半角',
+        'tobdc':'半角转全角'
+    },
+
+    'background':{
+        'static':{
+            'lang_background_normal':'背景设置',
+            'lang_background_local':'在线图片',
+            'lang_background_set':'选项',
+            'lang_background_none':'无背景色',
+            'lang_background_colored':'有背景色',
+            'lang_background_color':'颜色设置',
+            'lang_background_netimg':'网络图片',
+            'lang_background_align':'对齐方式',
+            'lang_background_position':'精确定位',
+            'repeatType':{'options':["居中", "横向重复", "纵向重复", "平铺","自定义"]}
+
+        },
+        'noUploadImage':"当前未上传过任何图片!",
+        'toggleSelect':"单击可切换选中状态\n原图尺寸: "
+    },
+    //===============dialog i18N=======================
+    'insertimage':{
+        'static':{
+            'lang_tab_remote':"插入图片", //节点
+            'lang_tab_upload':"本地上传",
+            'lang_tab_online':"在线管理",
+            'lang_tab_search':"图片搜索",
+            'lang_input_url':"地 址:",
+            'lang_input_size':"大 小:",
+            'lang_input_width':"宽度",
+            'lang_input_height':"高度",
+            'lang_input_border':"边 框:",
+            'lang_input_vhspace':"边 距:",
+            'lang_input_title':"描 述:",
+            'lang_input_align':'图片浮动方式:',
+            'lang_imgLoading':" 图片加载中……",
+            'lang_start_upload':"开始上传",
+            'lock':{'title':"锁定宽高比例"}, //属性
+            'searchType':{'title':"图片类型", 'options':["新闻", "壁纸", "表情", "头像"]}, //select的option
+            'searchTxt':{'value':"请输入搜索关键词"},
+            'searchBtn':{'value':"百度一下"},
+            'searchReset':{'value':"清空搜索"},
+            'noneAlign':{'title':'无浮动'},
+            'leftAlign':{'title':'左浮动'},
+            'rightAlign':{'title':'右浮动'},
+            'centerAlign':{'title':'居中独占一行'}
+        },
+        'uploadSelectFile':'点击选择图片',
+        'uploadAddFile':'继续添加',
+        'uploadStart':'开始上传',
+        'uploadPause':'暂停上传',
+        'uploadContinue':'继续上传',
+        'uploadRetry':'重试上传',
+        'uploadDelete':'删除',
+        'uploadTurnLeft':'向左旋转',
+        'uploadTurnRight':'向右旋转',
+        'uploadPreview':'预览中',
+        'uploadNoPreview':'不能预览',
+        'updateStatusReady': '选中_张图片,共_KB。',
+        'updateStatusConfirm': '已成功上传_张照片,_张照片上传失败',
+        'updateStatusFinish': '共_张(_KB),_张上传成功',
+        'updateStatusError': ',_张上传失败。',
+        'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。',
+        'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!',
+        'errorExceedSize':'文件大小超出',
+        'errorFileType':'文件格式不允许',
+        'errorInterrupt':'文件传输中断',
+        'errorUploadRetry':'上传失败,请重试',
+        'errorHttp':'http请求错误',
+        'errorServerUpload':'服务器返回出错',
+        'remoteLockError':"宽高不正确,不能所定比例",
+        'numError':"请输入正确的长度或者宽度值!例如:123,400",
+        'imageUrlError':"不允许的图片格式或者图片域!",
+        'imageLoadError':"图片加载失败!请检查链接地址或网络状态!",
+        'searchRemind':"请输入搜索关键词",
+        'searchLoading':"图片加载中,请稍后……",
+        'searchRetry':" :( ,抱歉,没有找到图片!请重试一次!"
+    },
+    'attachment':{
+        'static':{
+            'lang_tab_upload': '上传附件',
+            'lang_tab_online': '在线附件',
+            'lang_start_upload':"开始上传",
+            'lang_drop_remind':"可以将文件拖到这里,单次最多可选100个文件"
+        },
+        'uploadSelectFile':'点击选择文件',
+        'uploadAddFile':'继续添加',
+        'uploadStart':'开始上传',
+        'uploadPause':'暂停上传',
+        'uploadContinue':'继续上传',
+        'uploadRetry':'重试上传',
+        'uploadDelete':'删除',
+        'uploadTurnLeft':'向左旋转',
+        'uploadTurnRight':'向右旋转',
+        'uploadPreview':'预览中',
+        'updateStatusReady': '选中_个文件,共_KB。',
+        'updateStatusConfirm': '已成功上传_个文件,_个文件上传失败',
+        'updateStatusFinish': '共_个(_KB),_个上传成功',
+        'updateStatusError': ',_张上传失败。',
+        'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。',
+        'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!',
+        'errorExceedSize':'文件大小超出',
+        'errorFileType':'文件格式不允许',
+        'errorInterrupt':'文件传输中断',
+        'errorUploadRetry':'上传失败,请重试',
+        'errorHttp':'http请求错误',
+        'errorServerUpload':'服务器返回出错'
+    },
+    'insertvideo':{
+        'static':{
+            'lang_tab_insertV':"插入视频",
+            'lang_tab_searchV':"搜索视频",
+            'lang_tab_uploadV':"上传视频",
+            'lang_video_url':"视频网址",
+            'lang_video_size':"视频尺寸",
+            'lang_videoW':"宽度",
+            'lang_videoH':"高度",
+            'lang_alignment':"对齐方式",
+            'videoSearchTxt':{'value':"请输入搜索关键字!"},
+            'videoType':{'options':["全部", "热门", "娱乐", "搞笑", "体育", "科技", "综艺"]},
+            'videoSearchBtn':{'value':"百度一下"},
+            'videoSearchReset':{'value':"清空结果"},
+
+            'lang_input_fileStatus':' 当前未上传文件',
+            'startUpload':{'style':"background:url(upload.png) no-repeat;"},
+
+            'lang_upload_size':"视频尺寸",
+            'lang_upload_width':"宽度",
+            'lang_upload_height':"高度",
+            'lang_upload_alignment':"对齐方式",
+            'lang_format_advice':"建议使用mp4格式."
+
+        },
+        'numError':"请输入正确的数值,如123,400",
+        'floatLeft':"左浮动",
+        'floatRight':"右浮动",
+        '"default"':"默认",
+        'block':"独占一行",
+        'urlError':"输入的视频地址有误,请检查后再试!",
+        'loading':" &nbsp;视频加载中,请等待……",
+        'clickToSelect':"点击选中",
+        'goToSource':'访问源视频',
+        'noVideo':" &nbsp; &nbsp;抱歉,找不到对应的视频,请重试!",
+
+        'browseFiles':'浏览文件',
+        'uploadSuccess':'上传成功!',
+        'delSuccessFile':'从成功队列中移除',
+        'delFailSaveFile':'移除保存失败文件',
+        'statusPrompt':' 个文件已上传! ',
+        'flashVersionError':'当前Flash版本过低,请更新FlashPlayer后重试!',
+        'flashLoadingError':'Flash加载失败!请检查路径或网络状态',
+        'fileUploadReady':'等待上传……',
+        'delUploadQueue':'从上传队列中移除',
+        'limitPrompt1':'单次不能选择超过',
+        'limitPrompt2':'个文件!请重新选择!',
+        'delFailFile':'移除失败文件',
+        'fileSizeLimit':'文件大小超出限制!',
+        'emptyFile':'空文件无法上传!',
+        'fileTypeError':'文件类型不允许!',
+        'unknownError':'未知错误!',
+        'fileUploading':'上传中,请等待……',
+        'cancelUpload':'取消上传',
+        'netError':'网络错误',
+        'failUpload':'上传失败!',
+        'serverIOError':'服务器IO错误!',
+        'noAuthority':'无权限!',
+        'fileNumLimit':'上传个数限制',
+        'failCheck':'验证失败,本次上传被跳过!',
+        'fileCanceling':'取消中,请等待……',
+        'stopUploading':'上传已停止……',
+
+        'uploadSelectFile':'点击选择文件',
+        'uploadAddFile':'继续添加',
+        'uploadStart':'开始上传',
+        'uploadPause':'暂停上传',
+        'uploadContinue':'继续上传',
+        'uploadRetry':'重试上传',
+        'uploadDelete':'删除',
+        'uploadTurnLeft':'向左旋转',
+        'uploadTurnRight':'向右旋转',
+        'uploadPreview':'预览中',
+        'updateStatusReady': '选中_个文件,共_KB。',
+        'updateStatusConfirm': '成功上传_个,_个失败',
+        'updateStatusFinish': '共_个(_KB),_个成功上传',
+        'updateStatusError': ',_张上传失败。',
+        'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。',
+        'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!',
+        'errorExceedSize':'文件大小超出',
+        'errorFileType':'文件格式不允许',
+        'errorInterrupt':'文件传输中断',
+        'errorUploadRetry':'上传失败,请重试',
+        'errorHttp':'http请求错误',
+        'errorServerUpload':'服务器返回出错'
+    },
+    'webapp':{
+        'tip1':"本功能由百度APP提供,如看到此页面,请各位站长首先申请百度APPKey!",
+        'tip2':"申请完成之后请至ueditor.config.js中配置获得的appkey! ",
+        'applyFor':"点此申请",
+        'anthorApi':"百度API"
+    },
+    'template':{
+        'static':{
+            'lang_template_bkcolor':'背景颜色',
+            'lang_template_clear' : '保留原有内容',
+            'lang_template_select' : '选择模板'
+        },
+        'blank':"空白文档",
+        'blog':"博客文章",
+        'resume':"个人简历",
+        'richText':"图文混排",
+        'sciPapers':"科技论文"
+
+
+    },
+    'scrawl':{
+        'static':{
+            'lang_input_previousStep':"上一步",
+            'lang_input_nextsStep':"下一步",
+            'lang_input_clear':'清空',
+            'lang_input_addPic':'添加背景',
+            'lang_input_ScalePic':'缩放背景',
+            'lang_input_removePic':'删除背景',
+            'J_imgTxt':{title:'添加背景图片'}
+        },
+        'noScarwl':"尚未作画,白纸一张~",
+        'scrawlUpLoading':"涂鸦上传中,别急哦~",
+        'continueBtn':"继续",
+        'imageError':"糟糕,图片读取失败了!",
+        'backgroundUploading':'背景图片上传中,别急哦~'
+    },
+    'music':{
+        'static':{
+            'lang_input_tips':"输入歌手/歌曲/专辑,搜索您感兴趣的音乐!",
+            'J_searchBtn':{value:'搜索歌曲'}
+        },
+        'emptyTxt':'未搜索到相关音乐结果,请换一个关键词试试。',
+        'chapter':'歌曲',
+        'singer':'歌手',
+        'special':'专辑',
+        'listenTest':'试听'
+    },
+    'anchor':{
+        'static':{
+            'lang_input_anchorName':'锚点名字:'
+        }
+    },
+    'charts':{
+        'static':{
+            'lang_data_source':'数据源:',
+            'lang_chart_format': '图表格式:',
+            'lang_data_align': '数据对齐方式',
+            'lang_chart_align_same': '数据源与图表X轴Y轴一致',
+            'lang_chart_align_reverse': '数据源与图表X轴Y轴相反',
+            'lang_chart_title': '图表标题',
+            'lang_chart_main_title': '主标题:',
+            'lang_chart_sub_title': '子标题:',
+            'lang_chart_x_title': 'X轴标题:',
+            'lang_chart_y_title': 'Y轴标题:',
+            'lang_chart_tip': '提示文字',
+            'lang_cahrt_tip_prefix': '提示文字前缀:',
+            'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀',
+            'lang_chart_data_unit': '数据单位',
+            'lang_chart_data_unit_title': '单位:',
+            'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃',
+            'lang_chart_type': '图表类型:',
+            'lang_prev_btn': '上一个',
+            'lang_next_btn': '下一个'
+        }
+    },
+    'emotion':{
+        'static':{
+            'lang_input_choice':'精选',
+            'lang_input_Tuzki':'兔斯基',
+            'lang_input_BOBO':'BOBO',
+            'lang_input_lvdouwa':'绿豆蛙',
+            'lang_input_babyCat':'baby猫',
+            'lang_input_bubble':'泡泡',
+            'lang_input_youa':'有啊'
+        }
+    },
+    'gmap':{
+        'static':{
+            'lang_input_address':'地址',
+            'lang_input_search':'搜索',
+            'address':{value:"北京"}
+        },
+        searchError:'无法定位到该地址!'
+    },
+    'help':{
+        'static':{
+            'lang_input_about':'关于UEditor',
+            'lang_input_shortcuts':'快捷键',
+            'lang_input_introduction':'UEditor是由百度web前端研发部开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点。开源基于BSD协议,允许自由使用和修改代码。',
+            'lang_Txt_shortcuts':'快捷键',
+            'lang_Txt_func':'功能',
+            'lang_Txt_bold':'给选中字设置为加粗',
+            'lang_Txt_copy':'复制选中内容',
+            'lang_Txt_cut':'剪切选中内容',
+            'lang_Txt_Paste':'粘贴',
+            'lang_Txt_undo':'重新执行上次操作',
+            'lang_Txt_redo':'撤销上一次操作',
+            'lang_Txt_italic':'给选中字设置为斜体',
+            'lang_Txt_underline':'给选中字加下划线',
+            'lang_Txt_selectAll':'全部选中',
+            'lang_Txt_visualEnter':'软回车',
+            'lang_Txt_fullscreen':'全屏'
+        }
+    },
+    'insertframe':{
+        'static':{
+            'lang_input_address':'地址:',
+            'lang_input_width':'宽度:',
+            'lang_input_height':'高度:',
+            'lang_input_isScroll':'允许滚动条:',
+            'lang_input_frameborder':'显示框架边框:',
+            'lang_input_alignMode':'对齐方式:',
+            'align':{title:"对齐方式", options:["默认", "左对齐", "右对齐", "居中"]}
+        },
+        'enterAddress':'请输入地址!'
+    },
+    'link':{
+        'static':{
+            'lang_input_text':'文本内容:',
+            'lang_input_url':'链接地址:',
+            'lang_input_title':'标题:',
+            'lang_input_target':'是否在新窗口打开:'
+        },
+        'validLink':'只支持选中一个链接时生效',
+        'httpPrompt':'您输入的超链接中不包含http等协议名称,默认将为您添加http://前缀'
+    },
+    'map':{
+        'static':{
+            lang_city:"城市",
+            lang_address:"地址",
+            city:{value:"北京"},
+            lang_search:"搜索",
+            lang_dynamicmap:"插入动态地图"
+        },
+        cityMsg:"请选择城市",
+        errorMsg:"抱歉,找不到该位置!"
+    },
+    'searchreplace':{
+        'static':{
+            lang_tab_search:"查找",
+            lang_tab_replace:"替换",
+            lang_search1:"查找",
+            lang_search2:"查找",
+            lang_replace:"替换",
+            lang_searchReg:'支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”',
+            lang_searchReg1:'支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”',
+            lang_case_sensitive1:"区分大小写",
+            lang_case_sensitive2:"区分大小写",
+            nextFindBtn:{value:"下一个"},
+            preFindBtn:{value:"上一个"},
+            nextReplaceBtn:{value:"下一个"},
+            preReplaceBtn:{value:"上一个"},
+            repalceBtn:{value:"替换"},
+            repalceAllBtn:{value:"全部替换"}
+        },
+        getEnd:"已经搜索到文章末尾!",
+        getStart:"已经搜索到文章头部",
+        countMsg:"总共替换了{#count}处!"
+    },
+    'snapscreen':{
+        'static':{
+            lang_showMsg:"截图功能需要首先安装UEditor截图插件! ",
+            lang_download:"点此下载",
+            lang_step1:"第一步,下载UEditor截图插件并运行安装。",
+            lang_step2:"第二步,插件安装完成后即可使用,如不生效,请重启浏览器后再试!"
+        }
+    },
+    'spechars':{
+        'static':{},
+        tsfh:"特殊字符",
+        lmsz:"罗马字符",
+        szfh:"数学字符",
+        rwfh:"日文字符",
+        xlzm:"希腊字母",
+        ewzm:"俄文字符",
+        pyzm:"拼音字母",
+        yyyb:"英语音标",
+        zyzf:"其他"
+    },
+    'edittable':{
+        'static':{
+            'lang_tableStyle':'表格样式',
+            'lang_insertCaption':'添加表格名称行',
+            'lang_insertTitle':'添加表格标题行',
+            'lang_insertTitleCol':'添加表格标题列',
+            'lang_orderbycontent':"使表格内容可排序",
+            'lang_tableSize':'自动调整表格尺寸',
+            'lang_autoSizeContent':'按表格文字自适应',
+            'lang_autoSizePage':'按页面宽度自适应',
+            'lang_example':'示例',
+            'lang_borderStyle':'表格边框',
+            'lang_color':'颜色:'
+        },
+        captionName:'表格名称',
+        titleName:'标题',
+        cellsName:'内容',
+        errorMsg:'有合并单元格,不可排序'
+    },
+    'edittip':{
+        'static':{
+            lang_delRow:'删除整行',
+            lang_delCol:'删除整列'
+        }
+    },
+    'edittd':{
+        'static':{
+            lang_tdBkColor:'背景颜色:'
+        }
+    },
+    'formula':{
+        'static':{
+        }
+    },
+    'wordimage':{
+        'static':{
+            lang_resave:"转存步骤",
+            uploadBtn:{src:"upload.png",alt:"上传"},
+            clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"},
+            lang_step:"1、点击顶部复制按钮,将地址复制到剪贴板;2、点击添加照片按钮,在弹出的对话框中使用Ctrl+V粘贴地址;3、点击打开后选择图片上传流程。"
+        },
+        'fileType':"图片",
+        'flashError':"FLASH初始化失败,请检查FLASH插件是否正确安装!",
+        'netError':"网络连接错误,请重试!",
+        'copySuccess':"图片地址已经复制!",
+        'flashI18n':{} //留空默认中文
+    },
+    'autosave': {
+        'saving':'保存中...',
+        'success':'本地保存成功'
+    }
+};

Plik diff jest za duży
+ 1903 - 0
global/js/ueditor/themes/default/css/ueditor.css


Plik diff jest za duży
+ 8 - 0
global/js/ueditor/themes/default/css/ueditor.min.css


+ 100 - 0
global/js/ueditor/themes/default/dialogbase.css

@@ -0,0 +1,100 @@
+/*弹出对话框页面样式组件
+*/
+
+/*reset
+*/
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, font, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td {
+    margin: 0;
+    padding: 0;
+    outline: 0;
+    font-size: 100%;
+}
+
+body {
+    line-height: 1;
+}
+
+ol, ul {
+    list-style: none;
+}
+
+blockquote, q {
+    quotes: none;
+}
+
+ins {
+    text-decoration: none;
+}
+
+del {
+    text-decoration: line-through;
+}
+
+table {
+    border-collapse: collapse;
+    border-spacing: 0;
+}
+
+/*module
+*/
+body {
+    background-color: #fff;
+    font: 12px/1.5 sans-serif, "宋体", "Arial Narrow", HELVETICA;
+    color: #646464;
+}
+
+/*tab*/
+.tabhead {
+    position: relative;
+    z-index: 10;
+}
+
+.tabhead span {
+    display: inline-block;
+    padding: 0 5px;
+    height: 30px;
+    border: 1px solid #ccc;
+    background: url("images/dialog-title-bg.png") repeat-x;
+    text-align: center;
+    line-height: 30px;
+    cursor: pointer;
+    *margin-right: 5px;
+}
+
+.tabhead span.focus {
+    height: 31px;
+    border-bottom: none;
+    background: #fff;
+}
+
+.tabbody {
+    position: relative;
+    top: -1px;
+    margin: 0 auto;
+    border: 1px solid #ccc;
+}
+
+/*button*/
+a.button {
+    display: block;
+    text-align: center;
+    line-height: 24px;
+    text-decoration: none;
+    height: 24px;
+    width: 95px;
+    border: 0;
+    color: #838383;
+    background: url(../../themes/default/images/icons-all.gif) no-repeat;
+}
+
+a.button:hover {
+    background-position: 0 -30px;
+}

BIN
global/js/ueditor/themes/default/images/anchor.gif


BIN
global/js/ueditor/themes/default/images/arrow.png


BIN
global/js/ueditor/themes/default/images/arrow_down.png


BIN
global/js/ueditor/themes/default/images/arrow_up.png


BIN
global/js/ueditor/themes/default/images/button-bg.gif


BIN
global/js/ueditor/themes/default/images/cancelbutton.gif


BIN
global/js/ueditor/themes/default/images/charts.png


BIN
global/js/ueditor/themes/default/images/cursor_h.gif


BIN
global/js/ueditor/themes/default/images/cursor_h.png


BIN
global/js/ueditor/themes/default/images/cursor_v.gif


BIN
global/js/ueditor/themes/default/images/cursor_v.png


BIN
global/js/ueditor/themes/default/images/dialog-title-bg.png


BIN
global/js/ueditor/themes/default/images/filescan.png


BIN
global/js/ueditor/themes/default/images/highlighted.gif


BIN
global/js/ueditor/themes/default/images/icons-all.gif


BIN
global/js/ueditor/themes/default/images/icons.gif


BIN
global/js/ueditor/themes/default/images/icons.png


BIN
global/js/ueditor/themes/default/images/loaderror.png


BIN
global/js/ueditor/themes/default/images/loading.gif


BIN
global/js/ueditor/themes/default/images/lock.gif


BIN
global/js/ueditor/themes/default/images/neweditor-tab-bg.png


BIN
global/js/ueditor/themes/default/images/pagebreak.gif


BIN
global/js/ueditor/themes/default/images/scale.png


BIN
global/js/ueditor/themes/default/images/sortable.png


BIN
global/js/ueditor/themes/default/images/spacer.gif


BIN
global/js/ueditor/themes/default/images/sparator_v.png


BIN
global/js/ueditor/themes/default/images/table-cell-align.png


BIN
global/js/ueditor/themes/default/images/tangram-colorpicker.png


BIN
global/js/ueditor/themes/default/images/toolbar_bg.png


BIN
global/js/ueditor/themes/default/images/unhighlighted.gif


BIN
global/js/ueditor/themes/default/images/upload.png


BIN
global/js/ueditor/themes/default/images/videologo.gif


BIN
global/js/ueditor/themes/default/images/word.gif


BIN
global/js/ueditor/themes/default/images/wordpaste.png


+ 1 - 0
global/js/ueditor/themes/iframe.css

@@ -0,0 +1 @@
+/*可以在这里添加你自己的css*/

+ 104 - 0
global/js/ueditor/third-party/codemirror/codemirror.css

@@ -0,0 +1,104 @@
+.CodeMirror {
+    line-height: 1em;
+    font-family: monospace;
+}
+
+.CodeMirror-scroll {
+    overflow: auto;
+    height: 300px;
+    /* This is needed to prevent an IE[67] bug where the scrolled content
+       is visible outside of the scrolling box. */
+    position: relative;
+}
+
+.CodeMirror-gutter {
+    position: absolute; left: 0; top: 0;
+    z-index: 10;
+    background-color: #f7f7f7;
+    border-right: 1px solid #eee;
+    min-width: 2em;
+    height: 100%;
+}
+.CodeMirror-gutter-text {
+    color: #aaa;
+    text-align: right;
+    padding: .4em .2em .4em .4em;
+    white-space: pre !important;
+}
+.CodeMirror-lines {
+    padding: .4em;
+}
+
+.CodeMirror pre {
+    -moz-border-radius: 0;
+    -webkit-border-radius: 0;
+    -o-border-radius: 0;
+    border-radius: 0;
+    border-width: 0; margin: 0; padding: 0; background: transparent;
+    font-family: inherit;
+    font-size: inherit;
+    padding: 0; margin: 0;
+    white-space: pre;
+    word-wrap: normal;
+}
+
+.CodeMirror-wrap pre {
+    word-wrap: break-word;
+    white-space: pre-wrap;
+}
+.CodeMirror-wrap .CodeMirror-scroll {
+    overflow-x: hidden;
+}
+
+.CodeMirror textarea {
+    outline: none !important;
+}
+
+.CodeMirror pre.CodeMirror-cursor {
+    z-index: 10;
+    position: absolute;
+    visibility: hidden;
+    border-left: 1px solid black;
+}
+.CodeMirror-focused pre.CodeMirror-cursor {
+    visibility: visible;
+}
+
+span.CodeMirror-selected { background: #d9d9d9; }
+.CodeMirror-focused span.CodeMirror-selected { background: #d2dcf8; }
+
+.CodeMirror-searching {background: #ffa;}
+
+/* Default theme */
+
+.cm-s-default span.cm-keyword {color: #708;}
+.cm-s-default span.cm-atom {color: #219;}
+.cm-s-default span.cm-number {color: #164;}
+.cm-s-default span.cm-def {color: #00f;}
+.cm-s-default span.cm-variable {color: black;}
+.cm-s-default span.cm-variable-2 {color: #05a;}
+.cm-s-default span.cm-variable-3 {color: #085;}
+.cm-s-default span.cm-property {color: black;}
+.cm-s-default span.cm-operator {color: black;}
+.cm-s-default span.cm-comment {color: #a50;}
+.cm-s-default span.cm-string {color: #a11;}
+.cm-s-default span.cm-string-2 {color: #f50;}
+.cm-s-default span.cm-meta {color: #555;}
+.cm-s-default span.cm-error {color: #f00;}
+.cm-s-default span.cm-qualifier {color: #555;}
+.cm-s-default span.cm-builtin {color: #30a;}
+.cm-s-default span.cm-bracket {color: #cc7;}
+.cm-s-default span.cm-tag {color: #170;}
+.cm-s-default span.cm-attribute {color: #00c;}
+.cm-s-default span.cm-header {color: #a0a;}
+.cm-s-default span.cm-quote {color: #090;}
+.cm-s-default span.cm-hr {color: #999;}
+.cm-s-default span.cm-link {color: #00c;}
+
+span.cm-header, span.cm-strong {font-weight: bold;}
+span.cm-em {font-style: italic;}
+span.cm-emstrong {font-style: italic; font-weight: bold;}
+span.cm-link {text-decoration: underline;}
+
+div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
+div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}

Plik diff jest za duży
+ 3581 - 0
global/js/ueditor/third-party/codemirror/codemirror.js


Plik diff jest za duży
+ 17386 - 0
global/js/ueditor/ueditor.all.js


+ 227 - 0
global/js/ueditor/ueditor.config.js

@@ -0,0 +1,227 @@
+/**
+ * ueditor完整配置项
+ * 可以在这里配置整个编辑器的特性
+ */
+/**************************提示********************************
+ * 所有被注释的配置项均为UEditor默认值。
+ * 修改默认配置请首先确保已经完全明确该参数的真实用途。
+ * 主要有两种修改方案,一种是取消此处注释,然后修改成对应参数;另一种是在实例化编辑器时传入对应参数。
+ * 当升级编辑器时,可直接使用旧版配置文件替换新版配置文件,不用担心旧版配置文件中因缺少新功能所需的参数而导致脚本报错。
+ **************************提示********************************/
+
+(function () {
+
+    /**
+     * 编辑器资源文件根路径。它所表示的含义是:以编辑器实例化页面为当前路径,指向编辑器资源文件(即dialog等文件夹)的路径。
+     * 鉴于很多同学在使用编辑器的时候出现的种种路径问题,此处强烈建议大家使用"相对于网站根目录的相对路径"进行配置。
+     * "相对于网站根目录的相对路径"也就是以斜杠开头的形如"/myProject/ueditor/"这样的路径。
+     * 如果站点中有多个不在同一层级的页面需要实例化编辑器,且引用了同一UEditor的时候,此处的URL可能不适用于每个页面的编辑器。
+     * 因此,UEditor提供了针对不同页面的编辑器可单独配置的根路径,具体来说,在需要实例化编辑器的页面最顶部写上如下代码即可。当然,需要令此处的URL等于对应的配置。
+     * window.UEDITOR_HOME_URL = "/xxxx/xxxx/";
+     */
+    var URL = window.UEDITOR_HOME_URL || getUEBasePath();
+
+    /**
+     * 配置项主体。注意,此处所有涉及到路径的配置别遗漏URL变量。
+     */
+    window.UEDITOR_CONFIG = {
+
+        //为编辑器实例添加一个路径,这个不能被注释
+        UEDITOR_HOME_URL: URL
+
+        // 服务器统一请求接口路径
+        , serverUrl: URL + "php/controller.php"
+
+        //工具栏上的所有的功能按钮和下拉框,可以在new编辑器的实例时选择自己需要的从新定义
+        
+        , toolbars: [["source","link","unlink","bold","fullscreen"]]
+        //当鼠标放在工具栏上时显示的tooltip提示,留空支持自动多语言配置,否则以配置值为准
+        //,labelMap:{
+        //    'anchor':'', 'undo':''
+        //}
+
+        //语言配置项,默认是zh-cn。有需要的话也可以使用如下这样的方式来自动多语言切换,当然,前提条件是lang文件夹下存在对应的语言文件:
+        //lang值也可以通过自动获取 (navigator.language||navigator.browserLanguage ||navigator.userLanguage).toLowerCase()
+        //,lang:"zh-cn"
+        //,langPath:URL +"lang/"
+
+        //主题配置项,默认是default。有需要的话也可以使用如下这样的方式来自动多主题切换,当然,前提条件是themes文件夹下存在对应的主题文件:
+        //现有如下皮肤:default
+        //,theme:'default'
+        //,themePath:URL +"themes/"
+
+        //,zIndex : 900     //编辑器层级的基数,默认是900
+
+        //针对getAllHtml方法,会在对应的head标签中增加该编码设置。
+        //,charset:"utf-8"
+
+        //若实例化编辑器的页面手动修改的domain,此处需要设置为true
+        //,customDomain:false
+
+        //常用配置项目
+        //,isShow : true    //默认显示编辑器
+
+        //,textarea:'editorValue' // 提交表单时,服务器获取编辑器提交内容的所用的参数,多实例时可以给容器name属性,会将name给定的值最为每个实例的键值,不用每次实例化的时候都设置这个值
+
+        //,initialContent:'欢迎使用ueditor!'    //初始化编辑器的内容,也可以通过textarea/script给值,看官网例子
+
+        //,autoClearinitialContent:true //是否自动清除编辑器初始内容,注意:如果focus属性设置为true,这个也为真,那么编辑器一上来就会触发导致初始化的内容看不到了
+
+        //,focus:false //初始化时,是否让编辑器获得焦点true或false
+
+        //如果自定义,最好给p标签如下的行高,要不输入中文时,会有跳动感
+        //,initialStyle:'p{line-height:1em}'//编辑器层级的基数,可以用来改变字体等
+
+        //,iframeCssUrl: URL + '/themes/iframe.css' //给编辑器内部引入一个css文件
+
+        //,initialFrameWidth:1000  //初始化编辑器宽度,默认1000
+        //,initialFrameHeight:320  //初始化编辑器高度,默认320
+
+        //,readonly : false //编辑器初始化结束后,编辑区域是否是只读的,默认是false
+
+        //,autoClearEmptyNode : true //getContent时,是否删除空的inlineElement节点(包括嵌套的情况)
+
+        //,fullscreen : false //是否开启初始化时即全屏,默认关闭
+
+        //,imagePopup:true      //图片操作的浮层开关,默认打开
+
+        //粘贴只保留标签,去除标签所有属性
+        //,retainOnlyLabelPasted: false
+
+        //,pasteplain:false  //是否默认为纯文本粘贴。false为不使用纯文本粘贴,true为使用纯文本粘贴
+        //纯文本粘贴模式下的过滤规则
+        //'filterTxtRules' : function(){
+        //    function transP(node){
+        //        node.tagName = 'p';
+        //        node.setStyle();
+        //    }
+        //    return {
+        //        //直接删除及其字节点内容
+        //        '-' : 'script style object iframe embed input select',
+        //        'p': {$:{}},
+        //        'br':{$:{}},
+        //        'div':{'$':{}},
+        //        'li':{'$':{}},
+        //        'caption':transP,
+        //        'th':transP,
+        //        'tr':transP,
+        //        'h1':transP,'h2':transP,'h3':transP,'h4':transP,'h5':transP,'h6':transP,
+        //        'td':function(node){
+        //            //没有内容的td直接删掉
+        //            var txt = !!node.innerText();
+        //            if(txt){
+        //                node.parentNode.insertAfter(UE.uNode.createText(' &nbsp; &nbsp;'),node);
+        //            }
+        //            node.parentNode.removeChild(node,node.innerText())
+        //        }
+        //    }
+        //}()
+
+        //,allHtmlEnabled:false //提交到后台的数据是否包含整个html字符串
+
+        //,autoTransWordToList:false  //禁止word中粘贴进来的列表自动变成列表标签
+
+        //快捷菜单
+        //,shortcutMenu:["fontfamily", "fontsize", "bold", "italic", "underline", "forecolor", "backcolor", "insertorderedlist", "insertunorderedlist"]
+
+        //tab
+        //点击tab键时移动的距离,tabSize倍数,tabNode什么字符做为单位
+        //,tabSize:4
+        //,tabNode:'&nbsp;'
+
+        //autoHeightEnabled
+        // 是否自动长高,默认true
+        //,autoHeightEnabled:true
+
+        //scaleEnabled
+        //是否可以拉伸长高,默认true(当开启时,自动长高失效)
+        //,scaleEnabled:false
+        //,minFrameWidth:800    //编辑器拖动时最小宽度,默认800
+        //,minFrameHeight:220  //编辑器拖动时最小高度,默认220
+
+        //sourceEditor
+        //源码的查看方式,codemirror 是代码高亮,textarea是文本框,默认是codemirror
+        //注意默认codemirror只能在ie8+和非ie中使用
+        //,sourceEditor:"codemirror"
+        //如果sourceEditor是codemirror,还用配置一下两个参数
+        //codeMirrorJsUrl js加载的路径,默认是 URL + "third-party/codemirror/codemirror.js"
+        //,codeMirrorJsUrl:URL + "third-party/codemirror/codemirror.js"
+        //codeMirrorCssUrl css加载的路径,默认是 URL + "third-party/codemirror/codemirror.css"
+        //,codeMirrorCssUrl:URL + "third-party/codemirror/codemirror.css"
+        //编辑器初始化完成后是否进入源码模式,默认为否。
+        //,sourceEditorFirst:false
+
+        //iframeUrlMap
+        //dialog内容的路径 ~会被替换成URL,垓属性一旦打开,将覆盖所有的dialog的默认路径
+        //,iframeUrlMap:{
+        //    'anchor':'~/dialogs/anchor/anchor.html',
+        //}
+
+    };
+
+    function getUEBasePath(docUrl, confUrl) {
+
+        return getBasePath(docUrl || self.document.URL || self.location.href, confUrl || getConfigFilePath());
+
+    }
+
+    function getConfigFilePath() {
+
+        var configPath = document.getElementsByTagName('script');
+
+        return configPath[ configPath.length - 1 ].src;
+
+    }
+
+    function getBasePath(docUrl, confUrl) {
+
+        var basePath = confUrl;
+
+
+        if (/^(\/|\\\\)/.test(confUrl)) {
+
+            basePath = /^.+?\w(\/|\\\\)/.exec(docUrl)[0] + confUrl.replace(/^(\/|\\\\)/, '');
+
+        } else if (!/^[a-z]+:/i.test(confUrl)) {
+
+            docUrl = docUrl.split("#")[0].split("?")[0].replace(/[^\\\/]+$/, '');
+
+            basePath = docUrl + "" + confUrl;
+
+        }
+
+        return optimizationPath(basePath);
+
+    }
+
+    function optimizationPath(path) {
+
+        var protocol = /^[a-z]+:\/\//.exec(path)[ 0 ],
+            tmp = null,
+            res = [];
+
+        path = path.replace(protocol, "").split("?")[0].split("#")[0];
+
+        path = path.replace(/\\/g, '/').split(/\//);
+
+        path[ path.length - 1 ] = "";
+
+        while (path.length) {
+
+            if (( tmp = path.shift() ) === "..") {
+                res.pop();
+            } else if (tmp !== ".") {
+                res.push(tmp);
+            }
+
+        }
+
+        return protocol + res.join("/");
+
+    }
+
+    window.UE = {
+        getUEBasePath: getUEBasePath
+    };
+
+})();

+ 860 - 0
global/js/vanadium.js

@@ -0,0 +1,860 @@
+/*
+ @author Daniel Kwiecinski <daniel.kwiecinski@lambder.com>
+ @copyright 2009 Daniel Kwiecinski.
+ 本插件原作者Vanadium,原文请移步前往http://vanadiumjs.com/查看
+ 本插件由Mr.Think中文整理,Mr.Think的博客:http://MrThink.net/
+ 转载及使用请务必注明原作者.
+*/
+//********** vanadium-jquery.js **********
+Vanadium = {};
+Vanadium.Version = '0.1';
+Vanadium.CompatibleWithJQuery = '1.3.2';
+Vanadium.Type = "jquery";
+
+if (jQuery().jquery.indexOf(Vanadium.CompatibleWithJQuery) != 0 && window.console && window.console.warn)
+  console.warn("This version of Vanadium is tested with jQuery " + Vanadium.CompatibleWithJQuery +
+               " it may not work as expected with this version (" + jQuery().jquery + ")");
+
+Vanadium.each = jQuery.each;
+
+Vanadium.all_elements = function() {
+  return jQuery('*');
+};
+
+Vanadium.partition = function(elements, dyscriminator) {
+  var left = [];
+  var right = [];
+  Vanadium.each(elements, function() {
+    if (dyscriminator(this)) {
+      left.push(this);
+    } else {
+      right.push(this);
+    }
+    ;
+  });
+  return [left, right];
+};
+//********** vanadium-hashmap.js **********
+var HashMap = function() {
+  this.initialize();
+}
+HashMap.hashmap_instance_id = 0;
+HashMap.prototype = {
+  hashkey_prefix: "<#HashMapHashkeyPerfix>",
+  hashcode_field: "<#HashMapHashcodeField>",
+  initialize: function() {
+    this.backing_hash = {};
+    this.code = 0;
+    HashMap.hashmap_instance_id += 1;
+    this.instance_id = HashMap.hashmap_instance_id;
+  },
+  hashcodeField: function() {
+    return this.hashcode_field + this.instance_id;
+  },
+  /*
+   maps value to key returning previous assocciation
+   */
+  put: function(key, value) {
+    var prev;
+
+    if (key && value) {
+      var hashCode;
+      if (typeof(key) === "number" || typeof(key) === "string") {
+        hashCode = key;
+      } else {
+        hashCode = key[this.hashcodeField()];
+      }
+      if (hashCode) {
+        prev = this.backing_hash[hashCode];
+      } else {
+        this.code += 1;
+        hashCode = this.hashkey_prefix + this.code;
+        key[this.hashcodeField()] = hashCode;
+      }
+      this.backing_hash[hashCode] = [key, value];
+    }
+    return prev === undefined ? undefined : prev[1];
+  },
+  /*
+   returns value associated with given key
+   */
+  get: function(key) {
+    var value;
+    if (key) {
+      var hashCode;
+      if (typeof(key) === "number" || typeof(key) === "string") {
+        hashCode = key;
+      } else {
+        hashCode = key[this.hashcodeField()];
+      }
+      if (hashCode) {
+        value = this.backing_hash[hashCode];
+      }
+    }
+    return value === undefined ? undefined : value[1];
+  },
+  /*
+   deletes association by given key.
+   Returns true if the assocciation existed, false otherwise
+   */
+  del: function(key) {
+    var success = false;
+    if (key) {
+      var hashCode;
+      if (typeof(key) === "number" || typeof(key) === "string") {
+        hashCode = key;
+      } else {
+        hashCode = key[this.hashcodeField()];
+      }
+      if (hashCode) {
+        var prev = this.backing_hash[hashCode];
+        this.backing_hash[hashCode] = undefined;
+        if (prev !== undefined){
+          key[this.hashcodeField()] = undefined; //let's clean the key object
+          success = true;
+        }
+      }
+    }
+    return success;
+  },
+  /*
+   iterate over key-value pairs passing them to provided callback
+   the iteration process is interrupted when the callback returns false.
+   the execution context of the callback is the value of the key-value pair
+   @ returns the HashMap (so we can chain)                                                                  (
+   */
+  each: function(callback, args) {
+    var key;
+    for (key in this.backing_hash){
+      if (callback.call(this.backing_hash[key][1], this.backing_hash[key][0], this.backing_hash[key][1]) === false)
+        break;
+    }
+    return this;
+  },
+  toString: function() {
+    return "HashMapJS"
+  }
+}
+//********** vanadium-container.js **********
+Vanadium.containers = new HashMap();
+
+var ContainerValidation = function(html_element) {
+  this.initialize(html_element)
+}
+ContainerValidation.prototype = {
+  initialize: function(html_element) {
+    this.html_element = html_element;
+    this.elements = [];
+  },
+  add_element: function(element) {
+    this.elements.push(element);
+  },
+  decorate: function() {
+    var valid = null;
+    for (var id in this.elements) {
+      if (this.elements[id].invalid === undefined) {
+        valid = undefined;
+      } else if (this.elements[id].invalid === true) {
+        valid = false;
+        break;
+      } else if (this.elements[id].invalid === false && valid === null) {
+        valid = true;
+      }
+    }
+    if (valid === undefined) {
+      jQuery(this.html_element).removeClass(Vanadium.config.invalid_class);
+      jQuery(this.html_element).removeClass(Vanadium.config.valid_class);
+    } else if (valid) {
+      jQuery(this.html_element).removeClass(Vanadium.config.invalid_class);
+      jQuery(this.html_element).addClass(Vanadium.config.valid_class);
+    } else {
+      jQuery(this.html_element).removeClass(Vanadium.config.valid_class);
+      jQuery(this.html_element).addClass(Vanadium.config.invalid_class);
+    }
+  }
+}
+//********** vanadium-form.js **********
+var VanadiumForm = function(element) {
+    this.initialize(element);
+}
+Vanadium.forms = new HashMap();
+VanadiumForm.add_element = function(validation_element) {
+    var form = validation_element.element.form;
+    if (form) {
+        var vanadum_form = Vanadium.forms.get(form);
+        if (vanadum_form) {
+            vanadum_form.validation_elements.push(validation_element);
+        } else {
+            vanadum_form = new VanadiumForm(validation_element);
+            Vanadium.forms.put(form, vanadum_form);
+        }
+    }
+}
+VanadiumForm.prototype = {
+    initialize: function(validation_element) {
+        this.validation_elements = [validation_element];
+        this.form = validation_element.element.form;
+        var self = this;
+        var on_form_submit = function() {
+            var validation_result = self.validate();
+
+            var success = true;
+            validation_result.each(function(_element, validation_results) {
+                for (var r in validation_results) {
+                    if (validation_results[r].success == false) {
+                        success = false;
+                        break;
+                    }
+                }
+                if (success == false) {
+                    return false;// break from hashmap iteration
+                }
+            });
+            if (!success) {
+                self.decorate();
+                return false;
+            }
+            return success;
+        };
+        //jQuery(this.form).submit(on_form_submit);
+        jQuery(this.form).find(':submit').click(function() {
+            return on_form_submit();
+        });
+
+        this.form.decorate = function() {
+            self.decorate();
+        }
+    },
+    validate: function() {
+        var validation = new HashMap();
+        Vanadium.each(this.validation_elements,
+                function() {
+                    validation.put(this, this.validate());
+                });
+        return validation;
+    },
+
+    decorate: function(validation_results) {
+        if (arguments.length == 0) {
+            validation_results = this.validate();
+        }
+        validation_results.each(function(element, element_validation_results) {
+            element.decorate(element_validation_results);
+        });
+    },
+
+    validateAndDecorate: function() {
+        this.decorate(this.validate())
+    }
+}
+//********** vanadium-base.js **********
+Vanadium.validators_types = {};
+Vanadium.elements_validators_by_id = {};
+Vanadium.all_elements_validators = [];
+Vanadium.created_advices = [];
+Vanadium.all_html_elements = new HashMap();
+Vanadium.empty_advice_marker_class = '-vanadium-empty-advice-'
+//validation rules
+Vanadium.rules = {}
+Vanadium.init = function() {
+    this.setupValidatorTypes();
+    this.scan_dom();
+}
+Vanadium.addValidatorType = function(className, validationFunction, error_message, message, init) {
+    this.validators_types[className] = new Vanadium.Type(className, validationFunction, error_message, message, init);
+};
+
+Vanadium.addValidatorTypes = function(validators_args) {
+    var self = this;
+    Vanadium.each(validators_args,
+            function() {
+                Vanadium.addValidatorType.apply(self, this);
+            }
+            )
+};
+Vanadium.scan_dom = function() {
+    Vanadium.each(Vanadium.all_elements(),
+            function(_idx, child) {
+                var class_names = child.className.split(' ');
+                if (Vanadium.is_input_element(child)) {
+                    var element_validation = new ElementValidation(child);
+                    if (child.id)
+                        Vanadium.elements_validators_by_id[child.id] = element_validation
+                    Vanadium.all_elements_validators.push(element_validation)
+                    Vanadium.all_html_elements.put(child, element_validation);
+                    VanadiumForm.add_element(element_validation);
+                    //create validation rules based on class markup
+                    Vanadium.each(class_names,
+                            function() {
+                                var parameters = Vanadium.parse_class_name(this);
+                                /*'this' is class_name*/
+                                if (parameters) {
+                                    Vanadium.add_validation_instance(element_validation, parameters);
+                                    Vanadium.add_validation_modifier(element_validation, parameters);
+                                }
+                            });
+                    //create validation rules based on json providen in VanadiumRules variable
+                    Vanadium.each(Vanadium.get_rules(child.id),
+                            function() {
+                                var parameters = this;
+                                if (parameters) {
+                                    Vanadium.add_validation_instance(element_validation, parameters);
+                                    Vanadium.add_validation_modifier(element_validation, parameters);
+                                }
+                            });
+                    element_validation.setup();
+                } else {
+                    Vanadium.add_validation_container(child);
+                }
+            })
+}
+Vanadium.add_validation_container = function(element) {
+    var class_names = element.className.split(' ');
+    Vanadium.each(class_names,
+            function() {
+                var parameters = Vanadium.parse_class_name(this);
+                if (parameters[0] == 'container') {
+                    Vanadium.containers.put(element, new ContainerValidation(element));
+                    return true
+                }
+            });
+    Vanadium.each(Vanadium.get_rules(element.id),
+            function() {
+                var rule = this;
+                if (rule == 'container') {
+                    Vanadium.containers.put(element, new ContainerValidation(element));
+                    return true
+                }
+            });
+}
+Vanadium.get_rules = function(element_id) {
+    var rule_from_string_or_hash = function(r) {
+        if (typeof r === "string") {
+            return [r];
+        } else if (Vanadium.isArray(r)) {
+            return r;
+        } else if (typeof(r) === "object") {
+            return [r.validator, r.parameter, r.advice];
+        } else {
+            return undefined;
+        }
+    }
+    //
+    var rules = [];
+    //
+    var rs = Vanadium.rules[element_id];
+    if (typeof rs === "undefined") {
+        return [];
+    } else if (typeof rs === "string") {
+        rules.push(rs);
+    } else if (Vanadium.isArray(rs)) {
+        for (var r in rs) {
+            rules.push(rule_from_string_or_hash(rs[r]));
+        }
+    } else if (typeof(rs) === "object") {
+        rules.push(rule_from_string_or_hash(rs));
+    }
+    return rules;
+}
+Vanadium.parse_class_name = function(class_name) {
+    if (class_name.indexOf(Vanadium.config.prefix) == 0) {
+        var v_params = class_name.substr(Vanadium.config.prefix.length).split(Vanadium.config.separator)
+        for (var key in v_params) {
+            if (v_params[key] == "") {
+                v_params[key] = undefined
+            }
+        }
+        return v_params;
+    } else {
+        return [];
+    }
+}
+Vanadium.add_validation_instance = function(element_validation, parameters) {
+    var v_name = parameters[0];
+    var v_param = parameters[1];
+    var v_advice_id = parameters[2];
+    var validator_type = Vanadium.validators_types[v_name]
+    if (validator_type) {
+        element_validation.add_validation_instance(validator_type, v_param, v_advice_id);
+    }
+}
+Vanadium.add_validation_modifier = function(element_validation, parameters) {
+    var m_name = parameters[0];
+    var m_param = parameters[1];
+    if (m_name == 'only_on_blur' || m_name == 'only_on_submit' || m_name == 'wait' || m_name == 'advice') {
+        element_validation.add_validation_modifier(m_name, m_param);
+    }
+}
+Vanadium.validate = function() {
+    var validation = new HashMap();
+    Vanadium.each(Vanadium.all_elements_validators,
+            function() {
+                validation.put(this, this.validate());
+            });
+    return validation;
+}
+Vanadium.validateAndDecorate = function(html_element) {
+    if (typeof html_element === "undefined") {  // validate and decorate everything
+        Vanadium.decorate(Vanadium.validate());
+    } else if (html_element.nodeType == 1) {
+        var element_validation = Vanadium.all_html_elements.get(html_element) || Vanadium.forms.get(html_element);
+        if (element_validation) {
+            element_validation.validateAndDecorate(false);
+        }
+    }
+}
+Vanadium.decorate = function(validation_results) {
+    if (typeof validation_results === "object") {
+        if (validation_results.toString() == "HashMapJS") {
+            validation_results.each(function(element, element_validation_results) {
+                element.decorate(element_validation_results);
+            })
+        } else {//this is probably json structure representing validation result
+            var element_id;
+            for (element_id in validation_results) {
+                var element = Vanadium.elements_validators_by_id[element_id];
+                if (element) {
+                    element.decorate(validation_results[element_id]);
+                }
+            }
+        }
+    }
+}
+Vanadium.reset = function() {
+    Vanadium.each(Vanadium.all_elements_validators,
+            function() {
+                this.reset();
+            });
+}
+//********** vanadium-utils.js **********
+Vanadium.isArray = function(object) {
+  return object != null && typeof object == "object" &&
+         'splice' in object && 'join' in object;
+}
+Vanadium.isFunction = function(object) {
+  return object != null && object.toString() === "[object Function]";
+}
+Vanadium.extend = function(extension) {
+  var args = [Vanadium];
+  for (var idx = 0; idx < arguments.length; idx++) {
+    args.push(arguments[idx]);
+  }
+  return jQuery.extend.apply(jQuery, args);
+}
+Vanadium.bind = function(fun, context) {
+  return function() {
+    return fun.apply(context, arguments);
+  }
+}
+//********** vanadium-dom.js **********
+Vanadium.extend(
+{
+  /**
+   *	gets the type of element, to check whether it is compatible
+   */
+  getElementType: function(element) {
+    switch (true) {
+      case (element.nodeName.toUpperCase() == 'TEXTAREA'):
+        return Vanadium.TEXTAREA;
+      case (element.nodeName.toUpperCase() == 'INPUT' && element.type.toUpperCase() == 'TEXT'):
+        return Vanadium.TEXT;
+      case (element.nodeName.toUpperCase() == 'INPUT' && element.type.toUpperCase() == 'PASSWORD'):
+        return Vanadium.PASSWORD;
+      case (element.nodeName.toUpperCase() == 'INPUT' && element.type.toUpperCase() == 'CHECKBOX'):
+        return Vanadium.CHECKBOX;
+      case (element.nodeName.toUpperCase() == 'INPUT' && element.type.toUpperCase() == 'FILE'):
+        return Vanadium.FILE;
+      case (element.nodeName.toUpperCase() == 'SELECT'):
+        return Vanadium.SELECT;
+      case (element.nodeName.toUpperCase() == 'INPUT'):
+        throw new Error('Vanadium::getElementType - Cannot use Vanadium on an ' + element.type + ' input!');
+      default:
+        throw new Error('Vanadium::getElementType - Element must be an input, select, or textarea!');
+    }
+    ;
+  },
+  is_input_element : function(element) {
+    return (element.nodeName.toUpperCase() == 'TEXTAREA') ||
+           (element.nodeName.toUpperCase() == 'INPUT' && element.type.toUpperCase() == 'TEXT') ||
+           (element.nodeName.toUpperCase() == 'INPUT' && element.type.toUpperCase() == 'PASSWORD') ||
+           (element.nodeName.toUpperCase() == 'INPUT' && element.type.toUpperCase() == 'CHECKBOX') ||
+           (element.nodeName.toUpperCase() == 'INPUT' && element.type.toUpperCase() == 'FILE') ||
+           (element.nodeName.toUpperCase() == 'SELECT')
+  },
+  /**
+   *	makes a span containg the passed or failed advice
+   *
+   * @return {HTMLSpanObject} - a span element with the advice message in it
+   */
+  createAdvice: function(element, advice_id, message) {
+    var advice = document.createElement('span');
+    advice.id = advice_id;
+    var textNode = document.createTextNode(message);
+    advice.appendChild(textNode);
+    element.parentNode.insertBefore(advice, element.nextSibling);
+    this.created_advices.push(advice);
+  },
+  /**
+   *	adds the class of the element/advice/container to indicte if valid or not
+   */
+  addValidationClass: function(element, valid) {
+    if (element) {
+      this.removeValidationClass(element);
+      if (valid) {
+        element.className += ' ' + Vanadium.config.valid_class;
+      } else {
+        element.className += ' ' + Vanadium.config.invalid_class;
+      }
+      ;
+    }
+    ;
+  },
+  /**
+   *	removes the class that has been applied to the element/advice/container to indicte if valid or not
+   */
+  removeValidationClass: function(element) {
+    if (element) {
+      if (element.className.indexOf(Vanadium.config.invalid_class) != -1) element.className = element.className.split(Vanadium.config.invalid_class).join(' ');
+      if (element.className.indexOf(Vanadium.config.valid_class) != -1) element.className = element.className.split(Vanadium.config.valid_class).join(' ');
+    }
+    ;
+  },
+  /** element types constants ****/
+  TEXTAREA: 1,
+  TEXT: 2,
+  PASSWORD: 3,
+  CHECKBOX: 4,
+  SELECT: 5,
+  FILE: 6
+}
+        );
+//-------------------- vanadium-element.js -----------------------------
+ElementValidation = function(element) {
+  this.initialize(element)
+};
+ElementValidation.prototype = {
+  initialize: function(element) {
+    this.virgin = true;
+    this.element = element;
+    this.validations = [];
+    this.only_on_blur = false;
+    this.only_on_submit = false;
+    this.wait = 100;
+    this.created_advices = [];
+    this.decorated = false;
+    this.containers = null;
+    this.invalid = undefined;
+    this.advice_id = undefined; //this is general common advice for all validation instances having no specific advice defined
+  },
+  add_validation_instance: function(validator_type, param, advice_id) {
+    this.validations.push(new Validation(this.element, validator_type, param, advice_id));
+  },
+  add_validation_modifier: function(modifier, param) {
+    if (modifier == 'only_on_blur') {
+      //  whether you want it to validate as you type or only on blur  (DEFAULT: false)
+      this.only_on_blur = true
+    } else if (modifier == 'only_on_submit') {
+      //  whether should be validated only when the form it belongs to is submitted (DEFAULT: false)
+      this.only_on_submit = true
+    } else if (modifier == 'wait') {
+      //  the time you want it to pause from the last keystroke before it validates (ms) (DEFAULT: 0)
+      var milisesonds = parseInt(param);
+      if (milisesonds != NaN && typeof(milisesonds) === "number") {
+        this.wait = milisesonds;
+      }
+      ;
+    } else if (modifier == 'advice') {
+      var advice = document.getElementById(param);
+      if (advice) {
+        this.advice_id = param;
+      }
+    }
+    ;
+  },
+  element_containers: function() {
+    if (this.containers === null) {
+      this.containers = new HashMap();
+      var parent = this.element.parentNode;
+      //search up the DOM tree
+      while (parent != document) {
+        var container = Vanadium.containers.get(parent);
+        if (container) {
+          container.add_element(this);
+          this.containers.put(parent, container);
+        }
+        ;
+        parent = parent.parentNode;
+      }
+      ;
+    }
+    ;
+    return this.containers;
+  },
+  // context - the contect in which decoration_callback should be invoked
+  // decoration_callback - the decoration used by asynchronous validation
+  validate: function(decoration_context, decoration_callback) {
+    var result = [];
+    Vanadium.each(this.validations, function() {
+      result.push(this.validate(decoration_context, decoration_callback));
+    });
+    return result;
+  },
+  decorate: function(element_validation_results, do_not_reset) {
+    if (!do_not_reset) {
+      this.reset();
+    }
+    this.decorated = true;
+    var self = this;
+    var passed_and_failed = Vanadium.partition(element_validation_results, function(validation_result) {
+      return validation_result.success
+    });
+    var passed = passed_and_failed[0];
+    var failed = passed_and_failed[1];
+    // add apropirate CSS class to the validated element
+    if (failed.length > 0) {
+      this.invalid = true; //mark this validation element as invalid
+      Vanadium.addValidationClass(this.element, false);
+    } else if (passed.length > 0 && !this.invalid) { //when valid result comes but the previous was invalid and no reset was done, the invalid flag should stay unchanged
+      this.invalid = false; //mark this validation element as valid
+      Vanadium.addValidationClass(this.element, true);
+    } else {
+      this.invalid = undefined; //mark this validation element as undefined
+    }
+    ;
+    // add apropirate CSS class to the validated element's containers
+    this.element_containers().each(function(_element, container) {
+      container.decorate();
+    });
+    //
+    Vanadium.each(failed, function(_idx, validation_result) {
+      var advice = undefined;
+      if (self.advice_id) {
+        advice = document.getElementById(self.advice_id);
+      }
+      if (advice || validation_result.advice_id) {
+        advice = advice || document.getElementById(validation_result.advice_id);
+        if (advice) {
+          jQuery(advice).addClass(Vanadium.config.advice_class);
+          var advice_is_empty = advice.childNodes.length == 0
+          if (advice_is_empty || jQuery(advice).hasClass(Vanadium.empty_advice_marker_class)) {
+            jQuery(advice).addClass(Vanadium.empty_advice_marker_class);
+            jQuery(advice).append("<span>" + validation_result.message + "</span>");
+          }
+          ;
+          jQuery(advice).show();
+        } else {
+          advice = self.create_advice(validation_result);
+        }
+        ;
+      } else {
+        advice = self.create_advice(validation_result);
+      }
+      ;
+      Vanadium.addValidationClass(advice, false);
+    });
+  },
+  validateAndDecorate : function(regard_virginity) {
+    //That's tricky one ;)
+    // 1. we are runing validate to get all validation results
+    // 2. there could be possible some validations running asynchronous
+    // so we won't get the result imediately. In that case the provided decoration callback
+    // will be invoked on return from asynchronous callback
+    // It is used by Ajax based server-side validation
+    if(!regard_virginity || !this.virgin)
+      this.decorate(this.validate(this, this.decorate));
+  },
+  create_advice: function(validation_result) {
+    var span = document.createElement("span");
+    this.created_advices.push(span);
+    jQuery(span).addClass(Vanadium.config.advice_class);
+    jQuery(span).html(validation_result.message);
+    jQuery(this.element).after(span);
+    return span;
+  },
+  reset: function() {
+    this.invalid = undefined; //mark this validation element as undefined
+    //    this.element_containers().each(function(_element, container) {
+    //      container.decorate();
+    //    });
+    var element_advice = document.getElementById(this.advice_id);
+    if (element_advice) {
+      if (jQuery(element_advice).hasClass(Vanadium.empty_advice_marker_class)) {
+        jQuery(element_advice).empty();
+      }
+      jQuery(element_advice).hide();
+    }
+    Vanadium.each(this.validations, function() {
+      var advice = document.getElementById(this.adviceId);
+      if (advice) {
+        if (jQuery(advice).hasClass(Vanadium.empty_advice_marker_class)) {
+          jQuery(advice).empty();
+        }
+        jQuery(advice).hide();
+      }
+      ;
+    });
+
+    var created_advice = this.created_advices.pop();
+    while (!(created_advice === undefined)) {
+      jQuery(created_advice).remove();
+      created_advice = this.created_advices.pop();
+    }
+    ;
+    Vanadium.removeValidationClass(this.element);
+  },
+  //
+  //
+  //
+  /**
+   * makes the validation wait the alotted time from the last keystroke
+   */
+  deferValidation: function() {
+    if (this.wait >= 300) this.reset();
+    var self = this;
+    if (self.timeout) clearTimeout(self.timeout);
+    self.timeout = setTimeout(function() {
+      jQuery(self.element).trigger('validate');
+    }, self.wait);
+  },
+  deferReset: function() {
+    var self = this;
+    if (self.reset_timeout) clearTimeout(self.reset_timeout);
+    self.reset_timeout = setTimeout(function() {
+      self.reset();
+    }, Vanadium.config.reset_defer_timeout);
+  },
+  setup: function() {
+    var self = this;
+    this.elementType = Vanadium.getElementType(this.element);
+
+    this.form = this.element.form;
+
+    this.element_containers();
+
+    if (!this.only_on_submit) {
+      this.observe();
+      jQuery(self.element).bind('validate', function() {
+        self.validateAndDecorate.call(self, true)
+      });
+      jQuery(self.element).bind('defer_validation', function() {
+        self.deferValidation.call(self)
+      });
+      jQuery(self.element).bind('reset', function() {
+        self.reset.call(self)
+      });
+    }
+  },
+  observe: function() {
+    var element = this.element;
+    var elementType = Vanadium.getElementType(element);
+    var self = this;
+    jQuery(element).focus(function() {
+      self.virgin = false;
+    });
+    switch (elementType) {
+      case Vanadium.CHECKBOX:
+        jQuery(element).click(function() {
+          //TODO check db click !!!
+          self.virgin = false; //this is here 'cos safari do not focus on checkboxes
+          jQuery(self.element).trigger('validate');
+        });
+        break;
+      //TODO check if checkboxes support on-change too. and if yes handle it!
+      // let it run into the next to add a change event too
+      case Vanadium.SELECT:
+      case Vanadium.FILE:
+        jQuery(element).change(function() {
+          jQuery(element).trigger('validate');
+        });
+        break;
+      default:
+        jQuery(element).keydown(function(e) {
+          if (e.keyCode != 9) {//no tabulation as it changes focus
+            jQuery(element).trigger('reset');
+          }
+          ;
+        });
+
+        if (!this.only_on_blur) {
+          jQuery(element).keyup(function(e) {
+            if (e.keyCode != 9) {//no tabulation as it changes focus
+              jQuery(element).trigger('defer_validation');
+            }
+            ;
+          });
+        };
+        jQuery(element).blur(function() {
+          jQuery(element).trigger('validate');
+        });
+    }
+  }
+};
+//********** vanadium-instance.js **********
+var Validation = function(element, validation_type, param, advice_id) {
+  this.initialize(element, validation_type, param, advice_id)
+}
+Validation.prototype = {
+  initialize: function(element, validation_type, param, advice_id) {
+    this.element = element;
+    this.validation_type = validation_type;
+    this.param = param;
+    //
+    this.adviceId = advice_id;
+    var advice = document.getElementById(advice_id);
+    if (advice) {
+      jQuery(advice).addClass(Vanadium.config.advice_class);
+    }
+    if(this.validation_type.init){//Vanadium.isFunction(this.validation_type.init)){
+      this.validation_type.init(this); //this give us oportunity to define in validation_type scope activity which will be performed on its instance initialisation
+    }
+  },
+  emmit_message: function(message) {
+    if (typeof(message) === "string") {
+      return message;
+    } else if (typeof(message) === "function") {
+      return message.call(this, jQuery(this.element).val(), this.param);
+    }
+  },
+  validMessage: function() {
+    return this.emmit_message(this.validation_type.validMessage()) || 'ok'
+  },
+  invalidMessage: function() {
+    return this.emmit_message(this.validation_type.invalidMessage()) || 'error'
+  },
+  test: function(decoration_context, decoration_callback) {
+    return this.validation_type.validationFunction.call(this, jQuery(this.element).val(), this.param, this, decoration_context, decoration_callback);
+  },
+  // decoration_context - the contect in which decoration_callback should be invoked
+  // decoration_callback - the decoration used by asynchronous validation
+  validate: function(decoration_context, decoration_callback) {
+    var return_value = {
+      success: false,
+      message: "Received invalid return value."
+    }
+    var validation_result = this.test(decoration_context, decoration_callback);
+    if (typeof validation_result === "boolean") {
+      return {
+        success: validation_result,
+        advice_id: this.adviceId,
+        message: (validation_result ? this.validMessage() : this.invalidMessage())
+      }
+    } else if (typeof validation_result === "object") {
+      jQuery.extend.apply(return_value, validation_result);
+    }
+    return return_value;
+  }
+}
+//********** vanadium-init.js **********
+jQuery(document).ready(function () {
+  if (typeof(VanadiumConfig) === "object" && VanadiumConfig) {
+    Vanadium.each(VanadiumConfig, function(k, v) {
+      Vanadium.config[k] = v;
+    })
+  }
+  if (typeof(VanadiumRules) === "object" && VanadiumRules) {
+    Vanadium.each(VanadiumRules, function(k, v) {
+      Vanadium.rules[k] = v;
+    })
+  }
+  Vanadium.init();
+});

+ 596 - 0
global/m/css/bootstrap-theme.css

@@ -0,0 +1,596 @@
+/*!
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*!
+ * Generated using the Bootstrap Customizer (http://v3.bootcss.com/customize/?id=83f1d03153c26fe8fb49)
+ * Config saved to config.json and https://gist.github.com/83f1d03153c26fe8fb49
+ */
+/*!
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+.btn-default,
+.btn-primary,
+.btn-success,
+.btn-info,
+.btn-warning,
+.btn-danger {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.btn-default:active,
+.btn-primary:active,
+.btn-success:active,
+.btn-info:active,
+.btn-warning:active,
+.btn-danger:active,
+.btn-default.active,
+.btn-primary.active,
+.btn-success.active,
+.btn-info.active,
+.btn-warning.active,
+.btn-danger.active {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn-default.disabled,
+.btn-primary.disabled,
+.btn-success.disabled,
+.btn-info.disabled,
+.btn-warning.disabled,
+.btn-danger.disabled,
+.btn-default[disabled],
+.btn-primary[disabled],
+.btn-success[disabled],
+.btn-info[disabled],
+.btn-warning[disabled],
+.btn-danger[disabled],
+fieldset[disabled] .btn-default,
+fieldset[disabled] .btn-primary,
+fieldset[disabled] .btn-success,
+fieldset[disabled] .btn-info,
+fieldset[disabled] .btn-warning,
+fieldset[disabled] .btn-danger {
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.btn-default .badge,
+.btn-primary .badge,
+.btn-success .badge,
+.btn-info .badge,
+.btn-warning .badge,
+.btn-danger .badge {
+  text-shadow: none;
+}
+.btn:active,
+.btn.active {
+  background-image: none;
+}
+.btn-default {
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#e0e0e0));
+  background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #dbdbdb;
+  text-shadow: 0 1px 0 #fff;
+  border-color: #ccc;
+}
+.btn-default:hover,
+.btn-default:focus {
+  background-color: #e0e0e0;
+  background-position: 0 -15px;
+}
+.btn-default:active,
+.btn-default.active {
+  background-color: #e0e0e0;
+  border-color: #dbdbdb;
+}
+.btn-default.disabled,
+.btn-default[disabled],
+fieldset[disabled] .btn-default,
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled.focus,
+.btn-default[disabled].focus,
+fieldset[disabled] .btn-default.focus,
+.btn-default.disabled:active,
+.btn-default[disabled]:active,
+fieldset[disabled] .btn-default:active,
+.btn-default.disabled.active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default.active {
+  background-color: #e0e0e0;
+  background-image: none;
+}
+.btn-primary {
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);
+  background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));
+  background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #245580;
+}
+.btn-primary:hover,
+.btn-primary:focus {
+  background-color: #265a88;
+  background-position: 0 -15px;
+}
+.btn-primary:active,
+.btn-primary.active {
+  background-color: #265a88;
+  border-color: #245580;
+}
+.btn-primary.disabled,
+.btn-primary[disabled],
+fieldset[disabled] .btn-primary,
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled.focus,
+.btn-primary[disabled].focus,
+fieldset[disabled] .btn-primary.focus,
+.btn-primary.disabled:active,
+.btn-primary[disabled]:active,
+fieldset[disabled] .btn-primary:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary.active {
+  background-color: #265a88;
+  background-image: none;
+}
+.btn-success {
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
+  background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
+  background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #3e8f3e;
+}
+.btn-success:hover,
+.btn-success:focus {
+  background-color: #419641;
+  background-position: 0 -15px;
+}
+.btn-success:active,
+.btn-success.active {
+  background-color: #419641;
+  border-color: #3e8f3e;
+}
+.btn-success.disabled,
+.btn-success[disabled],
+fieldset[disabled] .btn-success,
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled.focus,
+.btn-success[disabled].focus,
+fieldset[disabled] .btn-success.focus,
+.btn-success.disabled:active,
+.btn-success[disabled]:active,
+fieldset[disabled] .btn-success:active,
+.btn-success.disabled.active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success.active {
+  background-color: #419641;
+  background-image: none;
+}
+.btn-info {
+  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+  background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
+  background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #28a4c9;
+}
+.btn-info:hover,
+.btn-info:focus {
+  background-color: #2aabd2;
+  background-position: 0 -15px;
+}
+.btn-info:active,
+.btn-info.active {
+  background-color: #2aabd2;
+  border-color: #28a4c9;
+}
+.btn-info.disabled,
+.btn-info[disabled],
+fieldset[disabled] .btn-info,
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled.focus,
+.btn-info[disabled].focus,
+fieldset[disabled] .btn-info.focus,
+.btn-info.disabled:active,
+.btn-info[disabled]:active,
+fieldset[disabled] .btn-info:active,
+.btn-info.disabled.active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info.active {
+  background-color: #2aabd2;
+  background-image: none;
+}
+.btn-warning {
+  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+  background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
+  background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #e38d13;
+}
+.btn-warning:hover,
+.btn-warning:focus {
+  background-color: #eb9316;
+  background-position: 0 -15px;
+}
+.btn-warning:active,
+.btn-warning.active {
+  background-color: #eb9316;
+  border-color: #e38d13;
+}
+.btn-warning.disabled,
+.btn-warning[disabled],
+fieldset[disabled] .btn-warning,
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled.focus,
+.btn-warning[disabled].focus,
+fieldset[disabled] .btn-warning.focus,
+.btn-warning.disabled:active,
+.btn-warning[disabled]:active,
+fieldset[disabled] .btn-warning:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning.active {
+  background-color: #eb9316;
+  background-image: none;
+}
+.btn-danger {
+  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+  background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
+  background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #b92c28;
+}
+.btn-danger:hover,
+.btn-danger:focus {
+  background-color: #c12e2a;
+  background-position: 0 -15px;
+}
+.btn-danger:active,
+.btn-danger.active {
+  background-color: #c12e2a;
+  border-color: #b92c28;
+}
+.btn-danger.disabled,
+.btn-danger[disabled],
+fieldset[disabled] .btn-danger,
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled.focus,
+.btn-danger[disabled].focus,
+fieldset[disabled] .btn-danger.focus,
+.btn-danger.disabled:active,
+.btn-danger[disabled]:active,
+fieldset[disabled] .btn-danger:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger.active {
+  background-color: #c12e2a;
+  background-image: none;
+}
+.thumbnail,
+.img-thumbnail {
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+}
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
+  background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+  background-color: #e8e8e8;
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+  background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
+  background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
+  background-color: #2e6da4;
+}
+.navbar-default {
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#f8f8f8));
+  background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);
+}
+.navbar-default .navbar-nav > .open > a,
+.navbar-default .navbar-nav > .active > a {
+  background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
+  background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
+  background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);
+}
+.navbar-brand,
+.navbar-nav > li > a {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
+}
+.navbar-inverse {
+  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);
+  background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222222));
+  background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  border-radius: 4px;
+}
+.navbar-inverse .navbar-nav > .open > a,
+.navbar-inverse .navbar-nav > .active > a {
+  background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
+  background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
+  background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);
+  box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);
+}
+.navbar-inverse .navbar-brand,
+.navbar-inverse .navbar-nav > li > a {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.navbar-static-top,
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  border-radius: 0;
+}
+@media (max-width: 767px) {
+  .navbar .navbar-nav .open .dropdown-menu > .active > a,
+  .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
+  .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: #fff;
+    background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+    background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
+    background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
+    background-repeat: repeat-x;
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
+  }
+}
+.alert {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+.alert-success {
+  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+  background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
+  background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
+  border-color: #b2dba1;
+}
+.alert-info {
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+  background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
+  background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
+  border-color: #9acfea;
+}
+.alert-warning {
+  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+  background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
+  background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
+  border-color: #f5e79e;
+}
+.alert-danger {
+  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+  background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
+  background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
+  border-color: #dca7a7;
+}
+.progress {
+  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+  background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
+  background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
+}
+.progress-bar {
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);
+  background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));
+  background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);
+}
+.progress-bar-success {
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+  background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
+  background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
+}
+.progress-bar-info {
+  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
+  background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
+  background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
+}
+.progress-bar-warning {
+  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
+  background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
+  background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
+}
+.progress-bar-danger {
+  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
+  background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
+  background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
+}
+.progress-bar-striped {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.list-group {
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+}
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+  text-shadow: 0 -1px 0 #286090;
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);
+  background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));
+  background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);
+  border-color: #2b669a;
+}
+.list-group-item.active .badge,
+.list-group-item.active:hover .badge,
+.list-group-item.active:focus .badge {
+  text-shadow: none;
+}
+.panel {
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+.panel-default > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
+  background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+}
+.panel-primary > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+  background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
+  background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
+}
+.panel-success > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+  background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
+  background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
+}
+.panel-info > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+  background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
+  background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
+}
+.panel-warning > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
+  background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
+  background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
+}
+.panel-danger > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
+  background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
+  background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
+}
+.well {
+  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+  background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
+  background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
+  border-color: #dcdcdc;
+  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);
+  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);
+}

Plik diff jest za duży
+ 14 - 0
global/m/css/bootstrap-theme.min.css


Plik diff jest za duży
+ 14 - 0
global/m/css/bootstrap.min.css


BIN
global/m/css/fonts/iconMenu.eot


Plik diff jest za duży
+ 22 - 0
global/m/css/fonts/iconMenu.svg


BIN
global/m/css/fonts/iconMenu.ttf


BIN
global/m/css/fonts/iconMenu.woff


+ 7 - 0
global/m/css/iconMenu/Read Me.txt

@@ -0,0 +1,7 @@
+Open *demo.html* to see a list of all the glyphs in your font along with their codes/ligatures.
+
+To use the generated font in desktop programs, you can install the TTF font. In order to copy the character associated with each icon, refer to the text box at the bottom right corner of each glyph in demo.html. The character inside this text box may be invisible; but it can still be copied. See this guide for more info: https://icomoon.io/#docs/local-fonts
+
+You won't need any of the files located under the *demo-files* directory when including the generated font in your own projects.
+
+You can import *selection.json* back to the IcoMoon app using the *Import Icons* button (or via Main Menu → Manage Projects) to retrieve your icon selection.

+ 152 - 0
global/m/css/iconMenu/demo-files/demo.css

@@ -0,0 +1,152 @@
+body {
+    padding: 0;
+    margin: 0;
+    font-family: sans-serif;
+    font-size: 1em;
+    line-height: 1.5;
+    color: #555;
+    background: #fff;
+}
+h1 {
+    font-size: 1.5em;
+    font-weight: normal;
+}
+small {
+    font-size: .66666667em;
+}
+a {
+    color: #e74c3c;
+    text-decoration: none;
+}
+a:hover, a:focus {
+    box-shadow: 0 1px #e74c3c;
+}
+.bshadow0, input {
+    box-shadow: inset 0 -2px #e7e7e7;
+}
+input:hover {
+    box-shadow: inset 0 -2px #ccc;
+}
+input, fieldset {
+    font-family: sans-serif;
+    font-size: 1em;
+    margin: 0;
+    padding: 0;
+    border: 0;
+}
+input {
+    color: inherit;
+    line-height: 1.5;
+    height: 1.5em;
+    padding: .25em 0;
+}
+input:focus {
+    outline: none;
+    box-shadow: inset 0 -2px #449fdb;
+}
+.glyph {
+    font-size: 16px;
+    width: 15em;
+    padding-bottom: 1em;
+    margin-right: 4em;
+    margin-bottom: 1em;
+    float: left;
+    overflow: hidden;
+}
+.liga {
+    width: 80%;
+    width: calc(100% - 2.5em);
+}
+.talign-right {
+    text-align: right;
+}
+.talign-center {
+    text-align: center;
+}
+.bgc1 {
+    background: #f1f1f1;
+}
+.fgc1 {
+    color: #999;
+}
+.fgc0 {
+    color: #000;
+}
+p {
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+.mvm {
+    margin-top: .75em;
+    margin-bottom: .75em;
+}
+.mtn {
+    margin-top: 0;
+}
+.mtl, .mal {
+    margin-top: 1.5em;
+}
+.mbl, .mal {
+    margin-bottom: 1.5em;
+}
+.mal, .mhl {
+    margin-left: 1.5em;
+    margin-right: 1.5em;
+}
+.mhmm {
+    margin-left: 1em;
+    margin-right: 1em;
+}
+.mls {
+    margin-left: .25em;
+}
+.ptl {
+    padding-top: 1.5em;
+}
+.pbs, .pvs {
+    padding-bottom: .25em;
+}
+.pvs, .pts {
+    padding-top: .25em;
+}
+.unit {
+    float: left;
+}
+.unitRight {
+    float: right;
+}
+.size1of2 {
+    width: 50%;
+}
+.size1of1 {
+    width: 100%;
+}
+.clearfix:before, .clearfix:after {
+    content: " ";
+    display: table;
+}
+.clearfix:after {
+    clear: both;
+}
+.hidden-true {
+    display: none;
+}
+.textbox0 {
+    width: 3em;
+    background: #f1f1f1;
+    padding: .25em .5em;
+    line-height: 1.5;
+    height: 1.5em;
+}
+#testDrive {
+    display: block;
+    padding-top: 24px;
+    line-height: 1.5;
+}
+.fs0 {
+    font-size: 16px;
+}
+.fs1 {
+    font-size: 32px;
+}
+

+ 30 - 0
global/m/css/iconMenu/demo-files/demo.js

@@ -0,0 +1,30 @@
+if (!('boxShadow' in document.body.style)) {
+    document.body.setAttribute('class', 'noBoxShadow');
+}
+
+document.body.addEventListener("click", function(e) {
+    var target = e.target;
+    if (target.tagName === "INPUT" &&
+        target.getAttribute('class').indexOf('liga') === -1) {
+        target.select();
+    }
+});
+
+(function() {
+    var fontSize = document.getElementById('fontSize'),
+        testDrive = document.getElementById('testDrive'),
+        testText = document.getElementById('testText');
+    function updateTest() {
+        testDrive.innerHTML = testText.value || String.fromCharCode(160);
+        if (window.icomoonLiga) {
+            window.icomoonLiga(testDrive);
+        }
+    }
+    function updateSize() {
+        testDrive.style.fontSize = fontSize.value + 'px';
+    }
+    fontSize.addEventListener('change', updateSize, false);
+    testText.addEventListener('input', updateTest, false);
+    testText.addEventListener('change', updateTest, false);
+    updateSize();
+}());

+ 215 - 0
global/m/css/iconMenu/demo.html

@@ -0,0 +1,215 @@
+<!doctype html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>IcoMoon Demo</title>
+    <meta name="description" content="An Icon Font Generated By IcoMoon.io">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <link rel="stylesheet" href="demo-files/demo.css">
+    <link rel="stylesheet" href="style.css"></head>
+<body>
+    <div class="bgc1 clearfix">
+        <h1 class="mhmm mvm"><span class="fgc1">Font Name:</span> iconMenu <small class="fgc1">(Glyphs:&nbsp;11)</small></h1>
+    </div>
+    <div class="clearfix mhl ptl">
+        <h1 class="mvm mtn fgc1">Grid Size: 16</h1>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-home">
+                
+                </span>
+                <span class="mls"> icon-home</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="4a" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#x4a;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="home, house" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-paste">
+                
+                </span>
+                <span class="mls"> icon-paste</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="41" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#x41;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="paste, clipboard-file" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-cart">
+                
+                </span>
+                <span class="mls"> icon-cart</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="47" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#x47;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="cart, purchase" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-coin-yen">
+                
+                </span>
+                <span class="mls"> icon-coin-yen</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="42" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#x42;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="coin-yen, money4" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-envelop">
+                
+                </span>
+                <span class="mls"> icon-envelop</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="48" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#x48;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="envelop, mail" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-calendar">
+                
+                </span>
+                <span class="mls"> icon-calendar</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="43" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#x43;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="calendar, date" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-user">
+                
+                </span>
+                <span class="mls"> icon-user</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="44" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#x44;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="user, profile2" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-cog">
+                
+                </span>
+                <span class="mls"> icon-cog</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="46" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#x46;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="cog, gear" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-switch">
+                
+                </span>
+                <span class="mls"> icon-switch</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="4b" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#x4b;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="switch" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-clipboard">
+                
+                </span>
+                <span class="mls"> icon-clipboard</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="49" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#x49;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="clipboard, board" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-tree">
+                
+                </span>
+                <span class="mls"> icon-tree</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="45" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#x45;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="tree, branches" class="liga unitRight" />
+            </div>
+        </div>
+  </div>
+
+    <!--[if gt IE 8]><!-->
+    <div class="mhl clearfix mbl">
+        <h1>Font Test Drive</h1>
+        <label>
+            Font Size: <input id="fontSize" type="number" class="textbox0 mbm"
+            min="8" value="48" />
+            px
+        </label>
+        <input id="testText" type="text" class="phl size1of1 mvl"
+        placeholder="Type some text to test..." value=""/>
+        </label>
+        <div id="testDrive" class="icon-">&nbsp;
+        </div>
+    </div>
+    <!--<![endif]-->
+    <div class="bgc1 clearfix">
+        <p class="mhl">Generated by <a href="https://icomoon.io/app">IcoMoon</a></p>
+    </div>
+
+    <script src="demo-files/demo.js"></script>
+</body>
+</html>

BIN
global/m/css/iconMenu/fonts/iconMenu.eot


Plik diff jest za duży
+ 21 - 0
global/m/css/iconMenu/fonts/iconMenu.svg


BIN
global/m/css/iconMenu/fonts/iconMenu.ttf


BIN
global/m/css/iconMenu/fonts/iconMenu.woff


Plik diff jest za duży
+ 363 - 0
global/m/css/iconMenu/selection.json


+ 60 - 0
global/m/css/iconMenu/style.css

@@ -0,0 +1,60 @@
+@font-face {
+    font-family: 'iconMenu';
+    src:    url('fonts/iconMenu.eot?hcw3jq');
+    src:    url('fonts/iconMenu.eot?hcw3jq#iefix') format('embedded-opentype'),
+        url('fonts/iconMenu.ttf?hcw3jq') format('truetype'),
+        url('fonts/iconMenu.woff?hcw3jq') format('woff'),
+        url('fonts/iconMenu.svg?hcw3jq#iconMenu') format('svg');
+    font-weight: normal;
+    font-style: normal;
+}
+
+[class^="icon-"], [class*=" icon-"] {
+    /* use !important to prevent issues with browser extensions that change fonts */
+    font-family: 'iconMenu' !important;
+    speak: none;
+    font-style: normal;
+    font-weight: normal;
+    font-variant: normal;
+    text-transform: none;
+    line-height: 1;
+
+    /* Better Font Rendering =========== */
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-home:before {
+    content: "\4a";
+}
+.icon-paste:before {
+    content: "\41";
+}
+.icon-cart:before {
+    content: "\47";
+}
+.icon-coin-yen:before {
+    content: "\42";
+}
+.icon-envelop:before {
+    content: "\48";
+}
+.icon-calendar:before {
+    content: "\43";
+}
+.icon-user:before {
+    content: "\44";
+}
+.icon-cog:before {
+    content: "\46";
+}
+.icon-switch:before {
+    content: "\4b";
+}
+.icon-clipboard:before {
+    content: "\49";
+}
+.icon-tree:before {
+    content: "\45";
+}
+

+ 380 - 0
global/m/css/style.css

@@ -0,0 +1,380 @@
+body{
+  font-family:"微软雅黑","Tahoma";
+  height:100%;
+  background: #fff;
+  overflow-x: hidden;
+}
+ul, ol, li, h1 {
+  line-height:normal;
+  list-style-image:none;
+  list-style-position:outside;
+  list-style-type:none;
+}
+dl,ul {
+  margin:0;
+  padding:0;
+}
+dd {
+  margin-left:0
+}
+a {
+  outline:none;
+  text-decoration: none;
+}
+a img {
+  border:0 none
+}
+img {
+  vertical-align:middle;
+  border:0px
+}
+table {
+  border-collapse:collapse
+}
+.fL {float:left}
+.fR {float:right}
+.clearfix:after {
+  content:".";
+  display:block;
+  height:0;
+  clear:both;
+  visibility:hidden
+}
+.clearfix {
+  display:inline-block;
+  overflow:hidden
+}
+.clearfix {
+  display:block
+}
+@font-face {
+  font-family: 'iconMenu';
+  src:    url('fonts/iconMenu.eot?hcw3jq');
+  src:    url('fonts/iconMenu.eot?hcw3jq#iefix') format('embedded-opentype'),
+  url('fonts/iconMenu.ttf?hcw3jq') format('truetype'),
+  url('fonts/iconMenu.woff?hcw3jq') format('woff'),
+  url('fonts/iconMenu.svg?hcw3jq#iconMenu') format('svg');
+  font-weight: normal;
+  font-style: normal;
+}
+
+[class^="icon-"], [class*=" icon-"] {
+  /* use !important to prevent issues with browser extensions that change fonts */
+  font-family: 'iconMenu' !important;
+  speak: none;
+  font-style: normal;
+  font-weight: normal;
+  font-variant: normal;
+  text-transform: none;
+  line-height: 1;
+
+  /* Better Font Rendering =========== */
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+
+.loginWrapper{
+  position: absolute;
+  width: 430px;
+  height: 320px;
+  top: 50%;
+  left: 50%;
+  background:#fff;
+  box-shadow: 0 8px 8px -6px #aaa;
+  -moz-box-shadow:0 8px 8px -6px #aaa;
+  -webkit-box-shadow:0 8px 8px -6px #aaa;
+  border: 1px solid #eee;
+  border-radius: 5px;
+  margin-left:-225px;
+  margin-top: -160px;
+}
+.loginContent{
+  padding: 20px 40px;
+}
+.loginTitle{
+  text-align: left;
+  padding-left:10px;
+  border-left: 4px solid #aaa;
+}
+.logoTitleTx{
+  border-left:4px solid #009F86;
+}
+.loginForm{
+  margin: 30px 0 20px 0;
+}
+.btnLogin{
+  width:100%;
+}
+.loginTitleMain{
+  position:relative;
+}
+.loginOther{
+  position:absolute;
+  top:5px;
+  right:0;
+}
+
+/* -------------index start-------------- */
+.wrapper{
+  overflow-x:hidden;
+}
+.leftWrapper{
+  position:fixed;
+  overflow-y:auto;
+  height:100%;
+  left:0;
+  width:56px;
+  background:#222;
+  color: #fff;
+}
+.logo{
+  width:100%;
+  background:#000;
+  text-align: center;
+  cursor:pointer;
+  overflow:hidden;
+  text-overflow:ellipsis;
+}
+.logoWd{
+  background:#8D826D;
+}
+.logoGe{
+  background:#647B97;
+}
+.logoTx{
+  background:#009F86;
+}
+.logo h2{
+  margin:0;
+  height:38px;
+  padding:10px 0;
+  font-size: 18px;
+}
+.logoInfo{
+  display:none;
+}
+.logo h2 a{
+  color:#fff;
+}
+.logoList{
+  width:100%;
+  position:absolute;
+  z-index: 99;
+  background:#f1f1f1;
+  padding:5px 0;
+  display:none;
+}
+.logoList ul li{
+  font-size: 12px;
+  padding:5px 0;
+}
+.logoList ul li a{
+  color:#333;
+}
+.subMenu{
+  border-bottom:1px solid #222;
+}
+.subMenuTitle a:hover{
+  color:#fff;
+  text-decoration: none;
+}
+.subMenuTitle a.active{
+  color:#fff;
+  border-left: 2px solid #FF6501;
+}
+.subMenuTitle a:focus{
+  text-decoration: none;
+}
+.subMenuTitle{
+  position:relative;
+  margin:0;
+  background:#2E2D2B;
+  font-size: 14px;
+  line-height: 25px;
+}
+.subMenuTitle a{
+  padding:15px 0;
+  color:#ccc;
+  border-left: solid 2px transparent;
+  display:block;
+  cursor: pointer;
+}
+.subMenuText{
+  position:absolute;
+  width:125px;
+  top:15px;
+  left:56px;
+  display:none;
+}
+.caret-triangle{
+  margin-top:12px;
+}
+.userMain{
+  position:absolute;
+  bottom:10px;
+}
+.userImg{
+  margin:0 12px;
+  width:32px;
+  height:32px;
+  border-radius: 18px;
+}
+.userName{
+  display:none;
+  font-size: 14px;
+  top:8px;
+}
+.userName a{
+  color:#ccc;
+}
+.userName a:hover{
+  color:#fff;
+  text-decoration: none;
+}
+.exit{
+  margin:0 0 0 15px;
+}
+.iconImg{
+  font-size: 20px;
+  padding:0 17px;
+}
+.bg{
+  background:#2E2D2B;
+  color:#fff !important;
+}
+.subMenuContent ul{
+  padding:10px 0 10px 25px;
+  text-align: left;
+}
+.subMenuContent ul li a{
+  display:block;
+  padding:5px 0;
+  color:#ccc;
+}
+.mainWrapper{
+  margin:0 0 0 71px;
+  background:#fff;
+}
+.pageTop{
+  margin-top: 20px;
+}
+.shopContent{
+  margin:20px 0;
+}
+.sort{
+  float:left;
+  vertical-align: middle;
+}
+.sort .form-control{
+  width:110px;
+}
+.btnGroup{
+  float:left;
+  margin:0 20px 0 0;
+}
+.search{
+  float:left;
+  width:465px;
+  margin:0 20px 0 0;
+}
+.tableContent{
+  margin:20px 0 0 0;
+}
+.tableContent .table{
+  margin:0;
+}
+.tabMain,.tabShopContent{
+  margin:25px 0 0 0;
+}
+.textCon{
+  margin:0 10px 0 0;
+}
+.tabMain .table tr td,.tableContent .table tr td{
+  vertical-align: middle;
+}
+.formInfo{
+  min-height: 27px;
+  padding-top: 7px;
+}
+.provinceSelect,.citySelect{
+  width:100px;
+}
+.total-main{
+  margin:20px 0 30px 0;
+  padding-bottom: 15px;
+  border-bottom: 1px solid #ddd;
+}
+.total-main ul li{
+  float:left;
+  margin-right: 15px;
+  border-right: 1px solid #ddd;
+}
+.total-main ul li:last-child{
+  border:none;
+}
+.total-content{
+  min-width:225px;
+  height:113px;
+  text-align: center;
+}
+.total-content-balanc{
+  width:360px;
+  height:100px;
+  background:#EEF1EA;
+}
+.total-title{
+  margin:0;
+  padding:15px 30px 10px 30px;
+  font-size: 20px;
+}
+.total-content-Y{
+  border-left:1px solid #ddd;
+  border-right: 1px solid #ddd;
+}
+.total-num{
+  font-size: 24px;
+  font-weight: bold;
+}
+.total-num-file{
+  line-height: 60px;
+}
+.total-column{
+  margin:0 18px;
+}
+.total-column dl dt{
+  font-size: 14px;
+  font-weight: normal;
+}
+.total-balanc-main{
+  margin-top: 45px;
+}
+.total-balanc-main ul li{
+  float:left;
+  margin-right: 100px;
+}
+.total-tableY{
+  margin:25px 0;
+  width:360px;
+  text-align: center;
+}
+.total-tableM{
+  width: 550px;
+  text-align: center;
+}
+.mainWrapper nav a{
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5px;
+  text-decoration:none;
+  color: #337ab7;
+  background-color: #ffffff;
+  border: 1px solid #dddddd;
+  margin-left: -1px;
+}
+.mainWrapper nav a.current {
+  background: #ccc;
+  color: #fff;
+  font-weight: 600;
+  cursor: default;
+}

BIN
global/m/fonts/glyphicons-halflings-regular.eot


Plik diff jest za duży
+ 22 - 0
global/m/fonts/glyphicons-halflings-regular.svg


BIN
global/m/fonts/glyphicons-halflings-regular.ttf


BIN
global/m/fonts/glyphicons-halflings-regular.woff


BIN
global/m/fonts/glyphicons-halflings-regular.woff2


Plik diff jest za duży
+ 1184 - 0
global/m/images/.svn/entries


+ 5 - 0
global/m/images/.svn/prop-base/btnLBg.png.svn-base

@@ -0,0 +1,5 @@
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END

+ 5 - 0
global/m/images/.svn/prop-base/cate_set_tree.gif.svn-base

@@ -0,0 +1,5 @@
+K 13
+svn:mime-type
+V 24
+application/octet-stream
+END

+ 0 - 0
global/m/images/.svn/prop-base/clear.gif.svn-base


Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików