|
|
//基础框架
|
|
|
(function() {
|
|
|
var $C = window.$ = jQuery;
|
|
|
var Cute = window.Cute = {
|
|
|
set$: function($){
|
|
|
window.$C = $;
|
|
|
},
|
|
|
config: {
|
|
|
SITEURL: "",
|
|
|
RESOURCEURL: "",
|
|
|
SCRIPTPATH: "/static/js/",
|
|
|
SERVICEURL: "/api/",
|
|
|
DEBUG: true
|
|
|
},
|
|
|
init: function() {
|
|
|
// 可以通过在 url 上加 ?cute-DEBUG 来开启 DEBUG 模式
|
|
|
if (window.location.search && window.location.search.indexOf('cute-DEBUG') !== -1) {
|
|
|
this.config.DEBUG = true;
|
|
|
}
|
|
|
return this;
|
|
|
},
|
|
|
log: function(msg, src) {
|
|
|
if (this.config.DEBUG) {
|
|
|
if (src) {
|
|
|
msg = src + ': ' + msg;
|
|
|
}
|
|
|
if (window['console'] !== undefined && console.log) {
|
|
|
console.log(msg);
|
|
|
}
|
|
|
}
|
|
|
return this;
|
|
|
},
|
|
|
error: function(msg) {
|
|
|
if (this.config.DEBUG) {
|
|
|
throw msg;
|
|
|
}
|
|
|
},
|
|
|
common: {
|
|
|
confirm: function(msg, url, options) {
|
|
|
if (arguments.length < 2) {
|
|
|
url = msg;
|
|
|
msg = "真的要删除吗?";
|
|
|
}
|
|
|
new Cute.ui.dialog().confirm(msg, $C.extend(options || {}, {
|
|
|
yes: function() {
|
|
|
if (url.constructor == String) {
|
|
|
location.href = url;
|
|
|
return false;
|
|
|
} else if (url.constructor == Function) {
|
|
|
url();
|
|
|
return false;
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
}));
|
|
|
return false;
|
|
|
},
|
|
|
copy: function(txt) {
|
|
|
if (window.clipboardData) {
|
|
|
window.clipboardData.clearData();
|
|
|
window.clipboardData.setData("Text", txt);
|
|
|
} else if (navigator.userAgent.indexOf("Opera") != -1) {
|
|
|
window.location = txt;
|
|
|
} else if (window.netscape) {
|
|
|
try {
|
|
|
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
|
|
|
} catch (e) {
|
|
|
alert("您的firefox安全限制限制您进行剪贴板操作,请打开'about:config'将signed.applets.codebase_principal_support'设置为true'之后重试");
|
|
|
return false;
|
|
|
}
|
|
|
var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
|
|
|
if (!clip) return false;
|
|
|
var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
|
|
|
if (!trans) return false;
|
|
|
trans.addDataFlavor('text/unicode');
|
|
|
var str = new Object();
|
|
|
var len = new Object();
|
|
|
var str = Components.classes['@mozilla.org/supports-string;1'].createInstance(Components.interfaces.nsISupportsString);
|
|
|
var copytext = txt;
|
|
|
str.data = copytext;
|
|
|
trans.setTransferData("text/unicode", str, copytext.length * 2);
|
|
|
var clipid = Components.interfaces.nsIClipboard;
|
|
|
if (!clip) return false;
|
|
|
clip.setData(trans, null, clipid.kGlobalClipboard);
|
|
|
} else {
|
|
|
return false;
|
|
|
}
|
|
|
return true;
|
|
|
},
|
|
|
flashCopy: function(obj, txt, success) {
|
|
|
var that = this;
|
|
|
$C(obj).each(function() {
|
|
|
var content = txt;
|
|
|
if ($C.isFunction(txt)) {
|
|
|
content = txt.call(this);
|
|
|
}
|
|
|
// if($C.support.cssFloat){
|
|
|
if (typeof ZeroClipboard == "undefined") return false;
|
|
|
this.clip = null;
|
|
|
ZeroClipboard.setMoviePath(Cute.config.RESOURCEURL + "/js/ZeroClipboard.swf");
|
|
|
this.clip = new ZeroClipboard.Client();
|
|
|
this.clip.setHandCursor(true);
|
|
|
this.clip.setText(content);
|
|
|
this.clip.addEventListener('onComplete', success);
|
|
|
$C(window).resize(function() {
|
|
|
this.clip.reposition();
|
|
|
} .bind(this));
|
|
|
this.clip.glue(this);
|
|
|
// }else{
|
|
|
// $C(this).on('click', function(){
|
|
|
// that.copy(content);
|
|
|
// success();
|
|
|
// });
|
|
|
// }
|
|
|
return this.clip;
|
|
|
});
|
|
|
},
|
|
|
checkAll: function(obj, elName) {
|
|
|
$C(obj).closest("form").find("input:checkbox[name=" + elName + "]").prop("checked", $C(obj).porp("checked"));
|
|
|
},
|
|
|
insertSelection: function(obj, str) {
|
|
|
var obj = $C(obj)[0];
|
|
|
obj.focus();
|
|
|
var pos = this.getRangPos(obj);
|
|
|
if(pos.start == 0 && pos.end == 0){
|
|
|
this.selectText(obj, $(obj).val().length);
|
|
|
}
|
|
|
if (typeof document.selection != "undefined") {
|
|
|
document.selection.createRange().text = str;
|
|
|
obj.createTextRange().duplicate().moveStart("character", -str.length);
|
|
|
} else {
|
|
|
var tclen = obj.value.length;
|
|
|
var m = obj.selectionStart;
|
|
|
obj.value = obj.value.substr(0, obj.selectionStart) + str + obj.value.substring(obj.selectionStart, tclen);
|
|
|
obj.selectionStart = m + str.length;
|
|
|
obj.setSelectionRange(m + str.length, m + str.length);
|
|
|
}
|
|
|
},
|
|
|
selectText: function(obj, start, end) {
|
|
|
var obj = $C(obj)[0];
|
|
|
obj.focus();
|
|
|
if(end == undefined){
|
|
|
end = start;
|
|
|
}
|
|
|
if (typeof document.selection != "undefined") {
|
|
|
var range = obj.createTextRange();
|
|
|
range.collapse(true);
|
|
|
range.moveEnd("character", end);
|
|
|
range.moveStart("character", start);
|
|
|
range.select();
|
|
|
} else {
|
|
|
obj.setSelectionRange(start, end); //设光标
|
|
|
}
|
|
|
},
|
|
|
getRangPos: function(obj) {
|
|
|
var obj = $C(obj)[0];
|
|
|
var pos = {};
|
|
|
if (typeof document.selection != "undefined") {
|
|
|
var range = document.selection.createRange();
|
|
|
if (obj != range.parentElement()) return
|
|
|
var range_all = document.body.createTextRange();
|
|
|
range_all.moveToElementText(obj);
|
|
|
for (var sel_start = 0; range_all.compareEndPoints('StartToStart', range) < 0; sel_start++) {
|
|
|
range_all.moveStart('character', 1);
|
|
|
}
|
|
|
for (var i = 0; i <= sel_start; i++) {
|
|
|
if (obj.value.charAt(i) == '\n')
|
|
|
sel_start++;
|
|
|
}
|
|
|
pos.start = sel_start;
|
|
|
var range_all = document.body.createTextRange();
|
|
|
range_all.moveToElementText(obj);
|
|
|
for (var sel_end = 0; range_all.compareEndPoints('StartToEnd', range) < 0; sel_end++)
|
|
|
range_all.moveStart('character', 1);
|
|
|
for (var i = 0; i <= sel_end; i++) {
|
|
|
if (obj.value.charAt(i) == '\n')
|
|
|
sel_end++;
|
|
|
}
|
|
|
pos.end = sel_end;
|
|
|
} else if (obj.selectionStart || obj.selectionStart == '0') {
|
|
|
pos.start = obj.selectionStart;
|
|
|
pos.end = obj.selectionEnd;
|
|
|
}
|
|
|
return pos;
|
|
|
},
|
|
|
scrolling: function(obj, options, func) {
|
|
|
var defaults = {
|
|
|
target: 1,
|
|
|
timer: 800,
|
|
|
offset: 0,
|
|
|
parent: 'html,body'
|
|
|
};
|
|
|
func = func || $C.noop;
|
|
|
var o = $C.extend(defaults, options || {});
|
|
|
$C(obj).each(function(i) {
|
|
|
switch (o.target) {
|
|
|
case 1:
|
|
|
var targetTop = $C(obj).offset().top + o.offset;
|
|
|
$C(o.parent).animate({
|
|
|
scrollTop: targetTop
|
|
|
}, o.timer, Cute.Function.bind(func, obj, o));
|
|
|
break;
|
|
|
case 2:
|
|
|
var targetLeft = $C(obj).offset().left + o.offset;
|
|
|
$C(o.parent).animate({
|
|
|
scrollLeft: targetLeft
|
|
|
}, o.timer, Cute.Function.bind(func, obj, o));
|
|
|
break;
|
|
|
}
|
|
|
return false;
|
|
|
});
|
|
|
return this;
|
|
|
}
|
|
|
},
|
|
|
ui: {},
|
|
|
plugin: {}
|
|
|
};
|
|
|
|
|
|
Cute.params = { //参数操作
|
|
|
init: function(str) {
|
|
|
this.list = {};
|
|
|
var params = str ? str : location.search;
|
|
|
$C.each(params.match(/(?:[\?|\&])[^\=]+=[^\&|#|$]*/gi) || [], function(n, item) {
|
|
|
var _item = item.substring(1);
|
|
|
var _key = _item.split("=", 1)[0];
|
|
|
var _value = _item.replace(eval("/" + _key + "=/i"), "");
|
|
|
this.list[_key.toLowerCase()] = Cute.String.urldecode(_value);
|
|
|
} .bind(this));
|
|
|
return this;
|
|
|
},
|
|
|
get: function(item) {
|
|
|
if (typeof this.list == "undefined") this.init();
|
|
|
var _item = this.list[item.toLowerCase()];
|
|
|
return _item ? _item : "";
|
|
|
},
|
|
|
set: function(options) {
|
|
|
if (typeof this.list == "undefined") this.init();
|
|
|
$C.extend(true, this.list, options || {});
|
|
|
return this;
|
|
|
},
|
|
|
serialize: function() {
|
|
|
if (typeof this.list == "undefined") this.init();
|
|
|
return $C.param(this.list, true);
|
|
|
},
|
|
|
hashString: function(item) {
|
|
|
if (!item) return location.hash.substring(1);
|
|
|
var sValue = location.hash.match(new RegExp("[\#\&]" + item + "=([^\&]*)(\&?)", "i"));
|
|
|
sValue = sValue ? sValue[1] : "";
|
|
|
return sValue == location.hash.substring(1) ? "" : sValue == undefined ? location.hash.substring(1) : Cute.String.urldecode(sValue);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
Cute.api = { //接口调用方法
|
|
|
ajax: function(type, action, data, callback, cache, async, options) {
|
|
|
if (typeof data == 'function' && typeof callback == 'undefined') {
|
|
|
callback = data;
|
|
|
data = undefined;
|
|
|
}
|
|
|
var url = "";
|
|
|
if(!options) options = {};
|
|
|
if (action != undefined) {
|
|
|
if (action.substring(0,1) == "/" || action.indexOf('http://') !== -1) {
|
|
|
url = action;
|
|
|
if(action.indexOf('http://') !== -1)
|
|
|
options['dataType'] = 'jsonp';
|
|
|
} else {
|
|
|
url = Cute.config.SERVICEURL + '/' + action;
|
|
|
if(Cute.config.SERVICEURL.substring(0,1) !== "/" && Cute.config.SERVICEURL.indexOf(location.hostname) == -1){
|
|
|
if(!options) options = {};
|
|
|
if(type == 'GET'){
|
|
|
options['dataType'] = 'jsonp';
|
|
|
}else if(type == 'POST'){
|
|
|
options['crossDomain'] = true;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
url = location.pathname;
|
|
|
}
|
|
|
return $C.ajax($C.extend({
|
|
|
url: url,
|
|
|
data: data,
|
|
|
async: typeof async !== "undefined" ? async : true,
|
|
|
type: typeof type !== "undefined" ? type : "GET",
|
|
|
//dataType: "json",
|
|
|
ifModified: false,
|
|
|
timeout: 20000,
|
|
|
traditional: false,
|
|
|
headers:{
|
|
|
},
|
|
|
cache: typeof cache != "undefined" ? cache : false,
|
|
|
success: callback,
|
|
|
// dataFilter: function(data) {
|
|
|
// return eval("(" + data + ")");
|
|
|
// },
|
|
|
error: function() {
|
|
|
if (async == false) {
|
|
|
new Cute.ui.dialog().alert("出错");
|
|
|
}
|
|
|
$C("#dialog_loading").remove();
|
|
|
return false;
|
|
|
},
|
|
|
beforeSend: function(request) {
|
|
|
}
|
|
|
}, options || {}));
|
|
|
},
|
|
|
get: function(action, data, callback, cache, async, options) {
|
|
|
return this.ajax("GET", action, data, callback, cache, async, options);
|
|
|
},
|
|
|
post: function(action, data, callback, cache, async, options) {
|
|
|
return this.ajax("POST", action, data, callback, cache, async, options);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
Cute.Class = {
|
|
|
/*
|
|
|
*创建一个命名空间
|
|
|
*/
|
|
|
namespace: function(module) {
|
|
|
var space = module.split('.');
|
|
|
var s = '';
|
|
|
for (var i in space) {
|
|
|
if (space[i].constructor == String) {
|
|
|
if (0 == s.length)
|
|
|
s = space[i];
|
|
|
else
|
|
|
s += '.' + space[i];
|
|
|
eval("if ((typeof(" + s + ")) == 'undefined') " + s + " = {};");
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
/*
|
|
|
*创建一个类,并执行构造函数
|
|
|
*/
|
|
|
create: function() {
|
|
|
var f = function() {
|
|
|
this.initialize.apply(this, arguments);
|
|
|
};
|
|
|
for (var i = 0, il = arguments.length, it; i < il; i++) {
|
|
|
it = arguments[i];
|
|
|
if (it == null) continue;
|
|
|
$C.extend(f.prototype, it);
|
|
|
}
|
|
|
return f;
|
|
|
},
|
|
|
/*
|
|
|
*继承一个类,暂不支持多重继承
|
|
|
*/
|
|
|
inherit: function(superC, opt) {
|
|
|
function temp() { };
|
|
|
temp.prototype = superC.prototype;
|
|
|
|
|
|
var f = function() {
|
|
|
this.initialize.apply(this, arguments);
|
|
|
};
|
|
|
|
|
|
f.prototype = new temp();
|
|
|
$C.extend(f.prototype, opt);
|
|
|
f.prototype.superClass_ = superC.prototype;
|
|
|
f.prototype.super_ = function() {
|
|
|
this.superClass_.initialize.apply(this, arguments);
|
|
|
};
|
|
|
return f;
|
|
|
}
|
|
|
};
|
|
|
Cute.Object = {
|
|
|
/*
|
|
|
* 对象的完全克隆
|
|
|
*/
|
|
|
clone: function(obj) {
|
|
|
var con = obj.constructor, cloneObj = null;
|
|
|
if (con == Object) {
|
|
|
cloneObj = new con();
|
|
|
} else if (con == Function) {
|
|
|
return Cute.Function.clone(obj);
|
|
|
} else cloneObj = new con(obj.valueOf());
|
|
|
|
|
|
for (var it in obj) {
|
|
|
if (cloneObj[it] != obj[it]) {
|
|
|
if (typeof (obj[it]) != 'object') {
|
|
|
cloneObj[it] = obj[it];
|
|
|
} else {
|
|
|
cloneObj[it] = arguments.callee(obj[it])
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
cloneObj.toString = obj.toString;
|
|
|
cloneObj.valueOf = obj.valueOf;
|
|
|
return cloneObj;
|
|
|
}
|
|
|
};
|
|
|
Cute.Function = {
|
|
|
before: function(self, fun){
|
|
|
return function(){
|
|
|
if(fun.apply(this, arguments) === false){
|
|
|
return false;
|
|
|
}
|
|
|
return self.apply(this, arguments);
|
|
|
}
|
|
|
},
|
|
|
after: function(self, fun){
|
|
|
return function(){
|
|
|
var ret = self.apply(this, arguments);
|
|
|
if(ret)
|
|
|
return ret;
|
|
|
return fun.apply(this, arguments);
|
|
|
}
|
|
|
},
|
|
|
timeout: function(fun, time) {
|
|
|
return setTimeout(fun, time * 1000);
|
|
|
},
|
|
|
interval: function(fun, time) {
|
|
|
return setInterval(fun, time * 1000);
|
|
|
},
|
|
|
//域绑定,可传参
|
|
|
bind: function(fun) {
|
|
|
var _this = arguments[1], args = [];
|
|
|
for (var i = 2, il = arguments.length; i < il; i++) {
|
|
|
args.push(arguments[i]);
|
|
|
}
|
|
|
return function() {
|
|
|
var thisArgs = args.concat();
|
|
|
for (var i = 0, il = arguments.length; i < il; i++) {
|
|
|
thisArgs.push(arguments[i]);
|
|
|
}
|
|
|
return fun.apply(_this || this, thisArgs);
|
|
|
}
|
|
|
},
|
|
|
// 域绑定,可传事件
|
|
|
bindEvent: function(fun) {
|
|
|
var _this = arguments[1], args = [];
|
|
|
for (var i = 2, il = arguments.length; i < il; i++) {
|
|
|
args.push(arguments[i]);
|
|
|
}
|
|
|
return function(e) {
|
|
|
var thisArgs = args.concat();
|
|
|
thisArgs.unshift(e || window.event);
|
|
|
return fun.apply(_this || this, thisArgs);
|
|
|
}
|
|
|
},
|
|
|
clone: function(fun) {
|
|
|
var clone = function() {
|
|
|
return fun.apply(this, arguments);
|
|
|
};
|
|
|
clone.prototype = fun.prototype;
|
|
|
for (prototype in fun) {
|
|
|
if (fun.hasOwnProperty(prototype) && prototype != 'prototype') {
|
|
|
clone[prototype] = fun[prototype];
|
|
|
}
|
|
|
}
|
|
|
return clone;
|
|
|
}
|
|
|
};
|
|
|
Cute.Cookie = {
|
|
|
get: function(name) {
|
|
|
var v = document.cookie.match('(?:^|;)\\s*' + name + '=([^;]*)');
|
|
|
return v ? decodeURIComponent(v[1]) : null;
|
|
|
},
|
|
|
set: function(name, value, expires, path, domain) {
|
|
|
var str = name + "=" + encodeURIComponent(value);
|
|
|
if (expires != null && expires != '') {
|
|
|
if (expires == 0) {
|
|
|
expires = 100 * 365 * 24 * 60 * 60;
|
|
|
}
|
|
|
var exp = new Date();
|
|
|
exp.setTime(exp.getTime() + expires * 1000);
|
|
|
str += "; expires=" + exp.toUTCString();
|
|
|
}
|
|
|
if (path) {
|
|
|
str += "; path=" + path;
|
|
|
}
|
|
|
if (domain) {
|
|
|
str += "; domain=" + domain;
|
|
|
}
|
|
|
document.cookie = str;
|
|
|
},
|
|
|
del: function(name, path, domain) {
|
|
|
document.cookie = name + "=" +
|
|
|
((path) ? "; path=" + path : "") +
|
|
|
((domain) ? "; domain=" + domain : "") +
|
|
|
"; expires=Thu, 01-Jan-70 00:00:01 GMT";
|
|
|
}
|
|
|
};
|
|
|
Cute.Json = {
|
|
|
stringify: function(obj) {
|
|
|
if (window['JSON']) {
|
|
|
return JSON.stringify(obj);
|
|
|
}else{
|
|
|
var t = typeof (obj);
|
|
|
if (t != "object" || obj === null) {
|
|
|
// simple data type
|
|
|
if (t == "string") obj = '"' + obj + '"';
|
|
|
return String(obj);
|
|
|
} else {
|
|
|
// recurse array or object
|
|
|
var n, v, json = [], arr = (obj && obj.constructor == Array);
|
|
|
for (n in obj) {
|
|
|
v = obj[n];
|
|
|
t = typeof(v);
|
|
|
if (obj.hasOwnProperty(n)) {
|
|
|
if (t == "string") v = '"' + v + '"'; else if (t == "object" && v !== null) v = this.stringify(v);
|
|
|
json.push((arr ? "" : '"' + n + '":') + String(v));
|
|
|
}
|
|
|
}
|
|
|
return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
Cute.String = {
|
|
|
//去除空格
|
|
|
trim: function(str) {
|
|
|
return str.replace(/^\s+|\s+$/g, '');
|
|
|
},
|
|
|
urldecode: decodeURIComponent,
|
|
|
urlencode: encodeURIComponent,
|
|
|
//过滤HTML
|
|
|
filterHTML: function(str){
|
|
|
return str.replace(/<\/?[^>]*>/g,'');
|
|
|
},
|
|
|
//格式化HTML
|
|
|
escapeHTML: function(str) {
|
|
|
return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
|
},
|
|
|
//反格式化HTML
|
|
|
unescapeHTML: function(str) {
|
|
|
return str.replace(/</g, '<').replace(/>/g, '>').replace(/&/g, '&');
|
|
|
},
|
|
|
// 取得字符的字节长度,汉字认为是两个字符
|
|
|
byteLength: function(str) {
|
|
|
return str.replace(/[^\x00-\xff]/g, "**").length;
|
|
|
},
|
|
|
//截断
|
|
|
cut: function(str, length, padding){
|
|
|
var r =/[^\x00-\xff]/g;
|
|
|
if(str.replace(r, "mm").length > length){
|
|
|
var m = Math.floor(length/2);
|
|
|
for(var i=m; i<str .length; i++){
|
|
|
if(str.substr(0, i).replace(r, "mm").length>=length){
|
|
|
return str.substr(0, i) + padding;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return str;
|
|
|
},
|
|
|
rnd: function (a, b) {
|
|
|
return Math.floor((b - a + 1) * Math.random() + a)
|
|
|
},
|
|
|
// 除去最后一个字符
|
|
|
delLast: function(str) {
|
|
|
return str.substring(0, str.length - 1);
|
|
|
},
|
|
|
// String to Int
|
|
|
toInt: function(str) {
|
|
|
return Math.floor(str);
|
|
|
},
|
|
|
// 取左边多少字符,中文两个字节
|
|
|
left: function(str, n) {
|
|
|
var s = str.replace(/\*/g, " ").replace(/[^\x00-\xff]/g, "**");
|
|
|
s = s.slice(0, n).replace(/\*\*/g, " ").replace(/\*/g, "").length;
|
|
|
return str.slice(0, s);
|
|
|
},
|
|
|
// 取右边多少字符,中文两个字节
|
|
|
right: function(str, n) {
|
|
|
var len = str.length;
|
|
|
var s = str.replace(/\*/g, " ").replace(/[^\x00-\xff]/g, "**");
|
|
|
s = s.slice(s.length - n, s.length).replace(/\*\*/g, " ").replace(/\*/g, "").length;
|
|
|
return str.slice(len - s, len);
|
|
|
},
|
|
|
// 除去HTML标签
|
|
|
removeHTML: function(str) {
|
|
|
return str.replace(/<\/?[^>]+>/gi, '');
|
|
|
},
|
|
|
//"<div>{0}</div>{1}".format(txt0,txt1);
|
|
|
format: function() {
|
|
|
var str = arguments[0], args = [];
|
|
|
for (var i = 1, il = arguments.length; i < il; i++) {
|
|
|
args.push(arguments[i]);
|
|
|
}
|
|
|
return str.replace(/\{(\d+)\}/g, function(m, i) {
|
|
|
return args[i];
|
|
|
});
|
|
|
},
|
|
|
// toString(16)
|
|
|
on16: function(str) {
|
|
|
var a = [], i = 0;
|
|
|
for (; i < str.length; ) a[i] = ("00" + str.charCodeAt(i++).toString(16)).slice(-4);
|
|
|
return "\\u" + a.join("\\u");
|
|
|
},
|
|
|
// unString(16)
|
|
|
un16: function(str) {
|
|
|
return unescape(str.replace(/\\/g, "%"));
|
|
|
},
|
|
|
base64_encode: function(data) {
|
|
|
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
|
|
|
var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
|
|
|
ac = 0,
|
|
|
enc = "",
|
|
|
tmp_arr = [];
|
|
|
|
|
|
if(!data) {
|
|
|
return data;
|
|
|
}
|
|
|
|
|
|
do { // pack three octets into four hexets
|
|
|
o1 = data.charCodeAt(i++);
|
|
|
o2 = data.charCodeAt(i++);
|
|
|
o3 = data.charCodeAt(i++);
|
|
|
|
|
|
bits = o1 << 16 | o2 << 8 | o3;
|
|
|
|
|
|
h1 = bits >> 18 & 0x3f;
|
|
|
h2 = bits >> 12 & 0x3f;
|
|
|
h3 = bits >> 6 & 0x3f;
|
|
|
h4 = bits & 0x3f;
|
|
|
|
|
|
// use hexets to index into b64, and append result to encoded string
|
|
|
tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
|
|
|
} while (i < data.length);
|
|
|
|
|
|
enc = tmp_arr.join('');
|
|
|
|
|
|
var r = data.length % 3;
|
|
|
|
|
|
return(r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);
|
|
|
},
|
|
|
base64_decode: function(data) {
|
|
|
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
|
|
|
var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
|
|
|
ac = 0,
|
|
|
dec = "",
|
|
|
tmp_arr = [];
|
|
|
|
|
|
if (!data) {
|
|
|
return data;
|
|
|
}
|
|
|
|
|
|
data += '';
|
|
|
|
|
|
do { // unpack four hexets into three octets using index points in b64
|
|
|
h1 = b64.indexOf(data.charAt(i++));
|
|
|
h2 = b64.indexOf(data.charAt(i++));
|
|
|
h3 = b64.indexOf(data.charAt(i++));
|
|
|
h4 = b64.indexOf(data.charAt(i++));
|
|
|
|
|
|
bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
|
|
|
|
|
|
o1 = bits >> 16 & 0xff;
|
|
|
o2 = bits >> 8 & 0xff;
|
|
|
o3 = bits & 0xff;
|
|
|
|
|
|
if (h3 == 64) {
|
|
|
tmp_arr[ac++] = String.fromCharCode(o1);
|
|
|
} else if (h4 == 64) {
|
|
|
tmp_arr[ac++] = String.fromCharCode(o1, o2);
|
|
|
} else {
|
|
|
tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
|
|
|
}
|
|
|
} while (i < data.length);
|
|
|
|
|
|
dec = tmp_arr.join('');
|
|
|
dec = this.utf8_decode(dec);
|
|
|
|
|
|
return dec;
|
|
|
},
|
|
|
uniqid: function(prefix, more_entropy) {
|
|
|
// + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
|
|
|
// + revised by: Kankrelune (http://www.webfaktory.info/)
|
|
|
// % note 1: Uses an internal counter (in php_js global) to avoid collision
|
|
|
// * example 1: uniqid();
|
|
|
// * returns 1: 'a30285b160c14'
|
|
|
// * example 2: uniqid('foo');
|
|
|
// * returns 2: 'fooa30285b1cd361'
|
|
|
// * example 3: uniqid('bar', true);
|
|
|
// * returns 3: 'bara20285b23dfd1.31879087'
|
|
|
if (typeof prefix == 'undefined') {
|
|
|
prefix = "";
|
|
|
}
|
|
|
|
|
|
var retId;
|
|
|
var formatSeed = function (seed, reqWidth) {
|
|
|
seed = parseInt(seed, 10).toString(16); // to hex str
|
|
|
if (reqWidth < seed.length) { // so long we split
|
|
|
return seed.slice(seed.length - reqWidth);
|
|
|
}
|
|
|
if (reqWidth > seed.length) { // so short we pad
|
|
|
return Array(1 + (reqWidth - seed.length)).join('0') + seed;
|
|
|
}
|
|
|
return seed;
|
|
|
};
|
|
|
|
|
|
// BEGIN REDUNDANT
|
|
|
if (!this.php_js) {
|
|
|
this.php_js = {};
|
|
|
}
|
|
|
// END REDUNDANT
|
|
|
if (!this.php_js.uniqidSeed) { // init seed with big random int
|
|
|
this.php_js.uniqidSeed = Math.floor(Math.random() * 0x75bcd15);
|
|
|
}
|
|
|
this.php_js.uniqidSeed++;
|
|
|
|
|
|
retId = prefix; // start with prefix, add current milliseconds hex string
|
|
|
retId += formatSeed(parseInt(new Date().getTime() / 1000, 10), 8);
|
|
|
retId += formatSeed(this.php_js.uniqidSeed, 5); // add seed hex string
|
|
|
if (more_entropy) {
|
|
|
// for more entropy we add a float lower to 10
|
|
|
retId += (Math.random() * 10).toFixed(8).toString();
|
|
|
}
|
|
|
|
|
|
return retId;
|
|
|
}
|
|
|
};
|
|
|
Cute.Array = {
|
|
|
// 判断是否包含某个值或者对象
|
|
|
include: function(arr, value) {
|
|
|
if (arr.constructor != Array) return false;
|
|
|
return this.index(arr, value) != -1;
|
|
|
},
|
|
|
// 判断一个对象在数组中的位置
|
|
|
index: function(arr, value) {
|
|
|
for (var i = 0, il = arr.length; i < il; i++) {
|
|
|
if (arr[i] == value) return i;
|
|
|
}
|
|
|
return -1;
|
|
|
},
|
|
|
// 过滤重复项
|
|
|
unique: function(arr) {
|
|
|
if (arr.length && typeof (arr[0]) == 'object') {
|
|
|
var len = arr.length;
|
|
|
for (var i = 0, il = len; i < il; i++) {
|
|
|
var it = arr[i];
|
|
|
for (var j = len - 1; j > i; j--) {
|
|
|
if (arr[j] == it) arr.splice(j, 1);
|
|
|
}
|
|
|
}
|
|
|
return arr;
|
|
|
} else {
|
|
|
var result = [], hash = {};
|
|
|
for (var i = 0, key; (key = arr[i]) != null; i++) {
|
|
|
if (!hash[key]) {
|
|
|
result.push(key);
|
|
|
hash[key] = true;
|
|
|
}
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
},
|
|
|
//移去某一项
|
|
|
remove: function(arr, o) {
|
|
|
if (typeof o == 'number' && !Cute.Array.include(arr, o)) {
|
|
|
arr.splice(o, 1);
|
|
|
} else {
|
|
|
var i = Cute.Array.index(arr, o);
|
|
|
if (i >= 0) arr.splice(i, 1);
|
|
|
}
|
|
|
return arr;
|
|
|
},
|
|
|
//取随机一项
|
|
|
random: function(arr) {
|
|
|
var i = Math.round(Math.random() * (arr.length - 1));
|
|
|
return arr[i];
|
|
|
},
|
|
|
//乱序
|
|
|
shuffle: function(arr) {
|
|
|
return arr.sort(function(a, b) {
|
|
|
return Math.random() > .5 ? -1 : 1;
|
|
|
});
|
|
|
}
|
|
|
};
|
|
|
Cute.Date = {
|
|
|
// new Date().format('yyyy年MM月dd日');
|
|
|
format: function(date, f) {
|
|
|
var o = {
|
|
|
"M+": date.getMonth() + 1,
|
|
|
"d+": date.getDate(),
|
|
|
"h+": date.getHours(),
|
|
|
"m+": date.getMinutes(),
|
|
|
"s+": date.getSeconds(),
|
|
|
"q+": Math.floor((date.getMonth() + 3) / 3),
|
|
|
"S": date.getMilliseconds()
|
|
|
};
|
|
|
if (/(y+)/.test(f))
|
|
|
f = f.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
|
|
|
for (var k in o)
|
|
|
if (new RegExp("(" + k + ")").test(f))
|
|
|
f = f.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
|
|
|
return f;
|
|
|
}
|
|
|
};
|
|
|
Cute.Event = {
|
|
|
out: function(el, name, func, canMore) {
|
|
|
var callback = function(e) {
|
|
|
var src = e.target,
|
|
|
isIn = false;
|
|
|
while (src) {
|
|
|
if (src == el) {
|
|
|
isIn = true;
|
|
|
break;
|
|
|
}
|
|
|
src = src.parentNode;
|
|
|
}
|
|
|
if (!isIn) {
|
|
|
func.call(el, e);
|
|
|
if (!canMore) {
|
|
|
$C.event.remove(document.body, name, c);
|
|
|
if (el._EVENT && el._EVENT.out && el._EVENT.out.length) {
|
|
|
var arr = el._EVENT.out;
|
|
|
for (var i = 0, il = arr.length; i < il; i++) {
|
|
|
if (arr[i].efunc == c && arr[i].name == name) {
|
|
|
arr.splice(i, 1);
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
var c = callback.bindEvent(window);
|
|
|
if (!el._EVENT) {
|
|
|
el._EVENT = {
|
|
|
out: []
|
|
|
}
|
|
|
}
|
|
|
el._EVENT.out.push({
|
|
|
name: name,
|
|
|
func: func,
|
|
|
efunc: c
|
|
|
});
|
|
|
$C.event.add(document.body, name, c);
|
|
|
},
|
|
|
unout: function(el, name, func) {
|
|
|
if (el._EVENT && el._EVENT.out && el._EVENT.out.length) {
|
|
|
var arr = el._EVENT.out;
|
|
|
if(func === undefined){
|
|
|
$C.event.remove(document.body, name);
|
|
|
}else{
|
|
|
for (var i = 0; i < arr.length; i++) {
|
|
|
if (func == arr[i].func && name == arr[i].name) {
|
|
|
$C.event.remove(document.body, name,arr[i].efunc);
|
|
|
arr.splice(i, 1);
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
$C.extend(Cute, {
|
|
|
isUndefined: function(o) {
|
|
|
return o === undefined;
|
|
|
},
|
|
|
isBoolean: function(o) {
|
|
|
return typeof o === 'boolean';
|
|
|
},
|
|
|
isString: function(o) {
|
|
|
return typeof o === 'string';
|
|
|
},
|
|
|
isNumber: function(o) {
|
|
|
return !isNaN(Number(o)) && isFinite(o);
|
|
|
},
|
|
|
include: function(url, callback, media) {
|
|
|
var afile = url.toLowerCase().replace(/^\s|\s$/g, "").match(/([^\/\\]+)\.(\w+)$/);
|
|
|
if (!afile) return false;
|
|
|
switch (afile[2]) {
|
|
|
case "css":
|
|
|
var el = $C('<link rel="stylesheet" id="' + afile[1] + '" href="' + url + '" type="text/css" media="' + (media ? media : 'all') + '" />').appendTo("head");
|
|
|
if (!$C.support.cssFloat) {
|
|
|
el.load(function() {
|
|
|
if (typeof callback == 'function') callback();
|
|
|
});
|
|
|
} else {
|
|
|
var i = 0;
|
|
|
var checkInterval = setInterval(function() {
|
|
|
if ($C("head>link").index(el) != -1) {
|
|
|
if (i < 10) clearInterval(checkInterval)
|
|
|
if (typeof callback == 'function') callback();
|
|
|
i++;
|
|
|
}
|
|
|
}, 200);
|
|
|
}
|
|
|
break;
|
|
|
case "js":
|
|
|
$C.ajax({
|
|
|
global: false,
|
|
|
cache: true,
|
|
|
ifModified: true,
|
|
|
dataType: "script",
|
|
|
url: url,
|
|
|
success: callback
|
|
|
});
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}, true);
|
|
|
|
|
|
Cute.Widget = {
|
|
|
drag: function(obj, position, target, offset, func) {
|
|
|
func = func || $C.noop;
|
|
|
target = $C(target || obj);
|
|
|
position = position || window;
|
|
|
offset = offset || {
|
|
|
x: 0,
|
|
|
y: 0
|
|
|
};
|
|
|
return obj.css("cursor", "move").bind("mousedown.drag", function(e) {
|
|
|
e.preventDefault();
|
|
|
e.stopPropagation();
|
|
|
//if (e.which && (e.which != 1)) return;
|
|
|
//if (e.originalEvent.mouseHandled) { return; }
|
|
|
if (document.defaultView) {
|
|
|
var _top = document.defaultView.getComputedStyle(target[0], null).getPropertyValue("top");
|
|
|
var _left = document.defaultView.getComputedStyle(target[0], null).getPropertyValue("left");
|
|
|
} else {
|
|
|
if (target[0].currentStyle) {
|
|
|
var _top = target.css("top");
|
|
|
var _left = target.css("left");
|
|
|
}
|
|
|
}
|
|
|
var width = target.outerWidth(),
|
|
|
height = target.outerHeight();
|
|
|
if (position === window) {
|
|
|
position = $C.browser.msie6 ? document.body : window;
|
|
|
var mainW = $C(position).width() - offset.x,
|
|
|
mainH = $C(position).height() - offset.y;
|
|
|
} else {
|
|
|
var mainW = $C(position).outerWidth() - offset.x,
|
|
|
mainH = $C(position).outerHeight() - offset.y;
|
|
|
}
|
|
|
target.posX = e.pageX - parseInt(_left);
|
|
|
target.posY = e.pageY - parseInt(_top);
|
|
|
if (target[0].setCapture) target[0].setCapture();
|
|
|
else if (window.captureEvents) window.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP);
|
|
|
$C(document).unbind(".drag").bind("mousemove.drag", function(e) {
|
|
|
var posX = e.pageX - target.posX,
|
|
|
posY = e.pageY - target.posY;
|
|
|
target.css({
|
|
|
left: function() {
|
|
|
if (posX > 0 && posX + width < mainW)
|
|
|
return posX;
|
|
|
else if (posX <= 0)
|
|
|
return offset.x;
|
|
|
else if (posX + width >= mainW)
|
|
|
return mainW - width
|
|
|
},
|
|
|
top: function() {
|
|
|
if (posY > 0 && posY + height < mainH)
|
|
|
return posY;
|
|
|
else if (posY <= 0)
|
|
|
return offset.y;
|
|
|
else if (posY + height >= mainH)
|
|
|
return mainH - height;
|
|
|
}
|
|
|
});
|
|
|
func(_top, _left, width, height, posY, posX);
|
|
|
}).bind("mouseup.drag", function(e) {
|
|
|
if (target[0].releaseCapture) target[0].releaseCapture();
|
|
|
else if (window.releaseEvents) window.releaseEvents(Event.MOUSEMOVE | Event.MOUSEUP);
|
|
|
$C(this).unbind(".drag");
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
};
|
|
|
var ext = function(target, src, is) {
|
|
|
if (!target) target = {};
|
|
|
for (var it in src) {
|
|
|
if (is) {
|
|
|
target[it] = Cute.Function.bind(function() {
|
|
|
var c = arguments[0], f = arguments[1];
|
|
|
var args = [this];
|
|
|
for (var i = 2, il = arguments.length; i < il; i++) {
|
|
|
args.push(arguments[i]);
|
|
|
}
|
|
|
return c[f].apply(c, args);
|
|
|
}, null, src, it);
|
|
|
} else {
|
|
|
target[it] = src[it];
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
ext(window.Class = {}, Cute.Class, false);
|
|
|
ext(Function.prototype, Cute.Function, true);
|
|
|
ext(String.prototype, Cute.String, true);
|
|
|
//ext(Array.prototype, Cute.Array, true);
|
|
|
ext(Date.prototype, Cute.Date, true);
|
|
|
})();
|
|
|
|
|
|
|
|
|
jQuery.fn.extend({ //jQuery 扩展
|
|
|
out: function(name, listener, canMore) {
|
|
|
return this.each(function() {
|
|
|
Cute.Event.out(this, name, listener, canMore);
|
|
|
});
|
|
|
},
|
|
|
unout: function(name, listener) {
|
|
|
return this.each(function() {
|
|
|
Cute.Event.unout(this, name, listener);
|
|
|
});
|
|
|
},
|
|
|
drag: function(position, target, offset, func) {
|
|
|
Cute.Widget.drag(this,position, target, offset, func)
|
|
|
},
|
|
|
scrolling: function(options, func) {
|
|
|
Cute.common.scrolling(this,options, func);
|
|
|
}
|
|
|
});
|
|
|
jQuery.extend(true, {
|
|
|
browser: {
|
|
|
msie: /msie/.test(navigator.userAgent.toLowerCase()),
|
|
|
msie6: /msie/.test(navigator.userAgent.toLowerCase()) && /MSIE 6\.0/i.test(window.navigator.userAgent) && !/MSIE 7\.0/i.test(window.navigator.userAgent) && !/MSIE 8\.0/i.test(window.navigator.userAgent)
|
|
|
},
|
|
|
support : {
|
|
|
pjax : window.history && window.history.pushState && window.history.replaceState && !navigator.userAgent.match(/(iPod|iPhone|iPad|WebApps\/.+CFNetwork)/),
|
|
|
storage : !!window.localStorage
|
|
|
}
|
|
|
}); |