2131 lines
60 KiB
JavaScript
Executable File
2131 lines
60 KiB
JavaScript
Executable File
/*changed by warlee
|
||
* @link http://www.kalcaddle.com/
|
||
* @author warlee | e-mail:kalcaddle@qq.com
|
||
* @copyright warlee 2014.(Shanghai)Co.,Ltd
|
||
* @license http://kalcaddle.com/tools/licenses/license.txt
|
||
*/
|
||
|
||
//return 时间戳到秒
|
||
var time = function(){
|
||
var time = (new Date()).valueOf();
|
||
return parseInt(time/1000);
|
||
}
|
||
//return 时间戳,含小数点;小数点部分为毫秒;date('Y/m/d H:i:s',time()) or date('Y/m/d H:i:s')
|
||
var timeFloat = function(){
|
||
var time = (new Date()).valueOf();
|
||
return time/1000;
|
||
}
|
||
var urlEncode = encodeURIComponent;
|
||
var urlDecode = decodeURIComponent;
|
||
var UUID = function(){
|
||
return 'uuid_'+time()+'_'+Math.ceil(Math.random()*10000)
|
||
}
|
||
var round = function(val,point){//随机数
|
||
if (!point) point = 2;
|
||
point = Math.pow(10,parseInt(point));
|
||
return Math.round(parseFloat(val)*point)/point;
|
||
}
|
||
var roundFromTo = function(from,to){//生成from到to的随机数;整数,包含to不包含from
|
||
var react = to - from;
|
||
return Math.ceil(Math.random()*react+from);
|
||
}
|
||
var md5 = function(str){
|
||
return CryptoJS.MD5(str).toString();
|
||
}
|
||
var aesEncode = function(str,key){
|
||
return CryptoJS.AES.encrypt(str,key).toString();
|
||
}
|
||
var aesDecode = function(str,key){
|
||
return CryptoJS.AES.decrypt(str,key).toString(CryptoJS.enc.Utf8);
|
||
}
|
||
var replaceAll = function(str, find, replace_to){
|
||
while (str.indexOf(find) >= 0){
|
||
str = str.replace(find, replace_to);
|
||
}
|
||
return str;
|
||
}
|
||
var ltrim = function (str,remove){
|
||
if (!str || str.length == 0) return "";
|
||
var i;remove = remove==undefined?' ':remove;
|
||
while (str.substring(0,remove.length) == remove ) {
|
||
str = str.substring(remove.length);
|
||
}
|
||
return str;
|
||
}
|
||
var rtrim = function (str,remove){
|
||
if (!str || str.length == 0) return "";
|
||
var i;remove = remove == undefined?' ' : remove;
|
||
while (str.substring(str.length - remove.length) == remove ) {
|
||
str = str.substring(0,str.length - remove.length);
|
||
}
|
||
return str;
|
||
}
|
||
var trim = function (str,remove){
|
||
if(remove == undefined){
|
||
return str.replace(/(^\s*)|(\s*$)/g,"");
|
||
}
|
||
return ltrim(rtrim(str,remove),remove);
|
||
}
|
||
var quoteHtml = function(str){
|
||
str = str.replace(/"/g,'"');
|
||
str = str.replace(/'/g,''');
|
||
return str;
|
||
}
|
||
var quoteEncode = function(str){
|
||
str = str.replace(/(['"])/g,'\\$1');
|
||
return str;
|
||
}
|
||
var canvasSupport = function() {
|
||
return !!document.createElement('canvas').getContext;
|
||
}
|
||
var isWap = function(){
|
||
if(navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)){
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
//var obj1 = $.extend({}, obj);//浅拷贝
|
||
//var obj2 = $.extend(true, {}, obj);//深拷贝
|
||
|
||
|
||
Array.prototype.remove = function(from, to) {
|
||
var rest = this.slice((to || from) + 1 || this.length);
|
||
this.length = from < 0 ? this.length + from : from;
|
||
return this.push.apply(this, rest);
|
||
};
|
||
|
||
//跨框架数据共享;
|
||
var KOD_NAMESPACE = 'kod';
|
||
var ShareData = {
|
||
data: function (name, value) {
|
||
var top = ShareData.frameTop();
|
||
var cache = top['_CACHE'] || {};
|
||
top['_CACHE'] = cache;
|
||
if(name==undefined){
|
||
return cache;
|
||
}
|
||
return value !== undefined ? cache[name] = value : cache[name];
|
||
},
|
||
remove: function (name) {
|
||
var top = ShareData.frameTop();
|
||
var cache = top['_CACHE'];
|
||
if (cache && cache[name]) delete cache[name];
|
||
},
|
||
frameChild:function(frame,action){
|
||
if (!window.frames[frame]) return false;
|
||
var that = window.frames[frame];
|
||
try {
|
||
action(that);
|
||
} catch (e) {
|
||
console.trace();
|
||
}
|
||
return that;
|
||
},
|
||
frameTop:function(frame,action){//frame=='' 则parent;为空则获取;指定则从top找child
|
||
var top = window;
|
||
var testParent = function (page) {
|
||
try {
|
||
if(page.parent && page.parent.KOD_NAMESPACE){
|
||
return page.parent;
|
||
}else{
|
||
return false;
|
||
}
|
||
} catch (e) {
|
||
return false;
|
||
}
|
||
};
|
||
while(testParent(top)!==false && top!=testParent(top)){
|
||
top = testParent(top);
|
||
}
|
||
if (frame!='' && typeof(frame) != 'undefined') {
|
||
if (!top.frames[frame]) return false;
|
||
top = top.frames[frame];
|
||
}
|
||
if(top == window){
|
||
return top;//自己则忽略事件调用,避免循环
|
||
}
|
||
if (typeof (action) == 'function'){
|
||
try {
|
||
action(top);
|
||
} catch (e) {
|
||
//console.trace();
|
||
}
|
||
}
|
||
return top;
|
||
}
|
||
};
|
||
jQuery.easing.def="easeInOutCubic";//easeOutExpo,easeInOutExpo,easeInOutSine
|
||
|
||
|
||
//cookie操作
|
||
//titmeout 单位为天
|
||
var Cookie = (function(){
|
||
var data = {};
|
||
var _init = function(){
|
||
data = {};//初始化
|
||
var cookieArray=document.cookie.split("; ");
|
||
for (var i=0;i<cookieArray.length;i++){
|
||
var arr=cookieArray[i].split("=");
|
||
data[arr[0]] = unescape(arr[1]);
|
||
}
|
||
return data;
|
||
}
|
||
var get = function(key){//没有key代表获取所有
|
||
_init();
|
||
if (key == undefined) return data;
|
||
return data[key];
|
||
};
|
||
var set = function(key,value,timeout){
|
||
var str = escape(key)+"="+escape(value);//不设置时间代表跟随页面生命周期
|
||
if (timeout == undefined){//时间以小时计
|
||
timeout = 365;
|
||
}
|
||
var expDate=new Date();
|
||
expDate.setTime(expDate.getTime() + timeout*3600*24*1000);
|
||
str += "; expires="+expDate.toGMTString();
|
||
document.cookie = str;
|
||
};
|
||
var del = function(key){
|
||
document.cookie = key+"=;expires="+(new Date(0)).toGMTString();
|
||
};
|
||
var clear = function(){
|
||
_init();
|
||
for(var key in data){
|
||
del(key);
|
||
}
|
||
}
|
||
return {
|
||
get:get,
|
||
set:set,
|
||
del:del,
|
||
clear:clear
|
||
}
|
||
})();
|
||
|
||
//LocalData操作 数据存储
|
||
var LocalData = (function(){
|
||
var name_space = 'kodexplorer_';
|
||
var makeKey = function(key){
|
||
if(key!=''){
|
||
return name_space+key;
|
||
}else{
|
||
return key;
|
||
}
|
||
}
|
||
var support = function(){
|
||
try{
|
||
if(window.localStorage){
|
||
return true;
|
||
}else{
|
||
return false;
|
||
}
|
||
}catch(e){return false;}
|
||
}
|
||
var get = function(key){//没有key代表获取所有
|
||
key = makeKey(key);
|
||
if(support()){
|
||
if(key!=undefined){
|
||
return localStorage.getItem(key);
|
||
}else{
|
||
var result = {};
|
||
for (var i = 0; i < localStorage.length; i++) {
|
||
result[localStorage.key(i)] = localStorage.getItem(localStorage.key(i));
|
||
}
|
||
return result;
|
||
}
|
||
}else{
|
||
return Cookie.get(key);
|
||
}
|
||
};
|
||
var set = function(key,value,timeout){
|
||
key = makeKey(key);
|
||
if(support()){
|
||
localStorage.setItem(key,value);
|
||
}else{
|
||
Cookie.set(key,value,timeout);
|
||
}
|
||
};
|
||
var del = function(key){
|
||
key = makeKey(key);
|
||
if(support()){
|
||
localStorage.removeItem(key);
|
||
}else{
|
||
Cookie.del(key);
|
||
}
|
||
};
|
||
|
||
//复杂数据读写 只存储json数据
|
||
var setConfig = function(key,value){
|
||
key = makeKey(key);
|
||
value = base64Encode(jsonEncode(value));
|
||
if(support()){
|
||
localStorage.setItem(key,value);
|
||
}
|
||
}
|
||
//复杂数据读写
|
||
var getConfig = function(key){
|
||
var result = this.get(key);
|
||
if(result === null || result == undefined || result == ''){
|
||
return false;
|
||
}else{
|
||
return jsonDecode(base64Decode(result));
|
||
}
|
||
}
|
||
var clear = function(){
|
||
if(support()){
|
||
for(var i=0;i<storage.length;i++){
|
||
localStorage.removeItem(storage.key(i));
|
||
}
|
||
}else{
|
||
Cookie.clear();
|
||
}
|
||
}
|
||
return {
|
||
support:support,
|
||
get:get,
|
||
set:set,
|
||
setConfig:setConfig,
|
||
getConfig:getConfig,
|
||
del:del,
|
||
clear:clear
|
||
}
|
||
})();
|
||
|
||
|
||
//ie 兼容
|
||
if(!Array.indexOf){
|
||
Array.prototype.indexOf = function(obj){
|
||
for(var i=0; i<this.length; i++){
|
||
if(this[i]==obj){
|
||
return i;
|
||
}
|
||
}
|
||
return -1;
|
||
}
|
||
}
|
||
|
||
var jsonEncodeForce = function(obj){
|
||
function censor(censor) {
|
||
var i = 0;
|
||
return function(key, value) {
|
||
if(i !== 0 && typeof(censor) === 'object' && typeof(value) == 'object' && censor == value)
|
||
return '[Circular]';
|
||
|
||
if(i >= 100) // seems to be a harded maximum of 30 serialized objects?
|
||
return '[Unknown]';
|
||
|
||
++i; // so we know we aren't using the original object anymore
|
||
return value;
|
||
}
|
||
}
|
||
return jsonEncode(obj,censor(obj));
|
||
}
|
||
|
||
|
||
//队列数据类;用于历史记录记录前进后退等;数据浏览器持久化
|
||
//eg: var historySearch = new Queen(10,'historySearch');
|
||
function Queen(maxLength,identify){
|
||
//数据读取与存储
|
||
var data = function(list){
|
||
if(!LocalData.support()){
|
||
return [];
|
||
}
|
||
if(list == undefined){
|
||
return LocalData.getConfig(identify);
|
||
}else{
|
||
return LocalData.setConfig(identify,list);
|
||
}
|
||
}
|
||
var queenList = data();//本地存储初始化
|
||
if(!queenList){
|
||
queenList = [];
|
||
}
|
||
var index = queenList.length - 1;
|
||
var add = function(val){
|
||
index = queenList.length-1;//重置
|
||
if (val == '' || val == queenList[queenList.length - 1]){
|
||
return;
|
||
}
|
||
if (queenList.length - 1 >= maxLength) {
|
||
queenList = queenList.slice(1 , queenList.length);
|
||
}
|
||
queenList.push(val);
|
||
data(queenList);
|
||
index = queenList.length - 1;//重置
|
||
};
|
||
var next = function(){
|
||
if (++index <= queenList.length - 1) {
|
||
return queenList[index];
|
||
}else{
|
||
index = queenList.length;
|
||
return '';
|
||
}
|
||
}
|
||
var back = function(){
|
||
if (--index >= 0) {
|
||
return queenList[index];
|
||
}else{
|
||
index = 0;
|
||
return queenList[0];
|
||
}
|
||
}
|
||
var last = function(){
|
||
return queenList[queenList.length - 1];
|
||
}
|
||
var clear = function(){
|
||
index = 0;
|
||
queenList = [];
|
||
data(queenList);
|
||
}
|
||
return {
|
||
add:add,
|
||
back:back,
|
||
next:next,
|
||
last:last,
|
||
clear:clear,
|
||
list:function(){
|
||
return queenList;
|
||
}
|
||
}
|
||
};
|
||
|
||
|
||
function download(data, strFileName, strMimeType) {
|
||
var self = window, // this script is only for browsers anyway...
|
||
defaultMime = "application/octet-stream", // this default mime also triggers iframe downloads
|
||
mimeType = strMimeType || defaultMime,
|
||
payload = data,
|
||
url = !strFileName && !strMimeType && payload,
|
||
anchor = document.createElement("a"),
|
||
toString = function(a){return String(a);},
|
||
myBlob = (self.Blob || self.MozBlob || self.WebKitBlob || toString),
|
||
fileName = strFileName || "download",
|
||
blob,
|
||
reader;
|
||
myBlob= myBlob.call ? myBlob.bind(self) : Blob ;
|
||
|
||
if(String(this)==="true"){
|
||
payload=[payload, mimeType];
|
||
mimeType=payload[0];
|
||
payload=payload[1];
|
||
}
|
||
if(url && url.length< 2048){
|
||
fileName = url.split("/").pop().split("?")[0];
|
||
anchor.href = url; // assign href prop to temp anchor
|
||
if(anchor.href.indexOf(url) !== -1){ // if the browser determines that it's a potentially valid url path:
|
||
var ajax=new XMLHttpRequest();
|
||
ajax.open( "GET", url, true);
|
||
ajax.responseType = 'blob';
|
||
ajax.onload= function(e){
|
||
download(e.target.response, fileName, defaultMime);
|
||
};
|
||
setTimeout(function(){ ajax.send();}, 0); // allows setting custom ajax headers using the return:
|
||
return ajax;
|
||
} // end if valid url?
|
||
}
|
||
if(/^data\:[\w+\-]+\/[\w+\-]+[,;]/.test(payload)){
|
||
if(payload.length > (1024*1024*1.999) && myBlob !== toString ){
|
||
payload=dataUrlToBlob(payload);
|
||
mimeType=payload.type || defaultMime;
|
||
}else{
|
||
return navigator.msSaveBlob ? // IE10 can't do a[download], only Blobs:
|
||
navigator.msSaveBlob(dataUrlToBlob(payload), fileName) :
|
||
saveToData(payload) ; // everyone else can save dataURLs un-processed
|
||
}
|
||
}//end if dataURL passed?
|
||
|
||
blob = payload instanceof myBlob ?
|
||
payload :
|
||
new myBlob([payload], {type: mimeType}) ;
|
||
function dataUrlToBlob(strUrl) {
|
||
var parts= strUrl.split(/[:;,]/),
|
||
type= parts[1],
|
||
decoder= parts[2] == "base64" ? atob : decodeURIComponent,
|
||
binData= decoder( parts.pop() ),
|
||
mx= binData.length,
|
||
i= 0,
|
||
uiArr= new Uint8Array(mx);
|
||
for(i;i<mx;++i) uiArr[i]= binData.charCodeAt(i);
|
||
|
||
return new myBlob([uiArr], {type: type});
|
||
}
|
||
|
||
function saveToData(url, winMode){
|
||
if ('download' in anchor) { //html5 A[download]
|
||
anchor.href = url;
|
||
anchor.setAttribute("download", fileName);
|
||
anchor.className = "download-js-link";
|
||
anchor.innerHTML = "downloading...";
|
||
anchor.style.display = "none";
|
||
document.body.appendChild(anchor);
|
||
setTimeout(function() {
|
||
anchor.click();
|
||
document.body.removeChild(anchor);
|
||
if(winMode===true){setTimeout(function(){ self.URL.revokeObjectURL(anchor.href);}, 250 );}
|
||
}, 66);
|
||
return true;
|
||
}
|
||
if(/(Version)\/(\d+)\.(\d+)(?:\.(\d+))?.*Safari\//.test(navigator.userAgent)) {
|
||
url=url.replace(/^data:([\w\/\-\+]+)/, defaultMime);
|
||
if(!window.open(url)){ // popup blocked, offer direct download:
|
||
if(confirm("Displaying New Document\n\nUse Save As... to download, then click back to return to this page.")){ location.href=url; }
|
||
}
|
||
return true;
|
||
}
|
||
var f = document.createElement("iframe");
|
||
document.body.appendChild(f);
|
||
if(!winMode){ // force a mime that will download:
|
||
url="data:"+url.replace(/^data:([\w\/\-\+]+)/, defaultMime);
|
||
}
|
||
f.src=url;
|
||
setTimeout(function(){ document.body.removeChild(f); }, 333);
|
||
}
|
||
if (navigator.msSaveBlob) { // IE10+ : (has Blob, but not a[download] or URL)
|
||
return navigator.msSaveBlob(blob, fileName);
|
||
}
|
||
if(self.URL){
|
||
saveToData(self.URL.createObjectURL(blob), true);
|
||
}else{
|
||
if( typeof(blob) === "string" ||
|
||
blob.constructor===toString ){
|
||
return saveToData("data:"+mimeType+";base64,"+window.btoa(blob));
|
||
}
|
||
reader=new FileReader();
|
||
reader.onload=function(e){
|
||
saveToData(this.result);
|
||
};
|
||
reader.readAsDataURL(blob);
|
||
}
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* hook;
|
||
*
|
||
* alert.hook("alert",window,function(){console.log(arguments);});
|
||
* ui.pathOpen.open.hook("open",ui.pathOpen,function(){});
|
||
* String.prototype.slice.hook("slice",String.prototype,function(){});
|
||
*
|
||
* hookFunc支持hook前执行;hook后执行; 如果参数是函数则默认为hook前执行;如果为对象则分别配置hook前、hook后执行
|
||
* {before:function,after:function} //
|
||
* ---------------------------
|
||
* ui.fileLight.select.hook("select",ui.fileLight,{before:function(){console.log("1",arguments)},after:function(){console.log("2",arguments)}});
|
||
*
|
||
* ---------------------------
|
||
* 1.hook函数在原函数之前执行;可修改传入参数;修改后返回arguments
|
||
* 2.如果没有任何返回:则使用原始参数
|
||
* 3.before function 如果返回"hookReturn";则不执行旧函数;相当于替换
|
||
*/
|
||
function Hooks(){
|
||
return {
|
||
initEnv:function () {
|
||
Function.prototype.hook = function (funcName,context,hookFunc) {
|
||
var _context = null; //函数上下文
|
||
var _funcName = null; //函数名
|
||
var _realFunc = funcName+"Old";
|
||
|
||
var hookFuncBefore = undefined;
|
||
var hookFuncAfter = undefined;
|
||
if(typeof(hookFunc) == 'function'){
|
||
hookFuncBefore = hookFunc;
|
||
}else if(typeof(hookFunc) == 'object'){
|
||
hookFuncBefore = hookFunc['before'];
|
||
hookFuncAfter = hookFunc['after'];
|
||
}
|
||
|
||
if(!hookFuncBefore){
|
||
hookFuncBefore = function(){};
|
||
}
|
||
_context = context || window;
|
||
_funcName = funcName || getFuncName(this);
|
||
_context[_realFunc] = this;
|
||
if( _context[_funcName] != undefined &&
|
||
_context[_funcName].prototype &&
|
||
_context[_funcName].prototype.isHooked){
|
||
console.log("Already has been hooked,unhook first");
|
||
return false;
|
||
}
|
||
function getFuncName (fn) {// 获取函数名
|
||
var strFunc = fn.toString();
|
||
var _regex = /function\s+(\w+)\s*\(/;
|
||
var patten = strFunc.match(_regex);
|
||
if (patten) {
|
||
return patten[1];
|
||
};
|
||
return '';
|
||
}
|
||
try{
|
||
eval('_context[_funcName] = function '+_funcName+'(){\n'+
|
||
'var args = Array.prototype.slice.call(arguments,0);\n'+
|
||
'var obj = this;\n'+
|
||
'args = hookFuncBefore.apply(obj,args);\n'+
|
||
'if(args === "hookReturn"){return;}\n'+
|
||
'if(args === undefined){args = arguments;}\n'+
|
||
'var result = _context[_realFunc].apply(obj,args);\n'+
|
||
'if(hookFuncAfter){return hookFuncAfter.apply(result);}\n'+
|
||
'else{return result;}\n'+
|
||
'};');
|
||
_context[_funcName].prototype.isHooked = true;
|
||
return true;
|
||
}catch (e){
|
||
console.log("Hook failed,check the params.");
|
||
return false;
|
||
}
|
||
}
|
||
Function.prototype.unhook = function (funcName,context) {
|
||
var _context = null;
|
||
var _funcName = null;
|
||
_context = context || window;
|
||
_funcName = funcName;
|
||
var realFunc = funcName+"Old";
|
||
if (!_context[_funcName].prototype.isHooked){
|
||
console.log("No function is hooked on");
|
||
return false;
|
||
}
|
||
_context[_funcName] = _context[realFunc];
|
||
delete _context[realFunc];
|
||
return true;
|
||
}
|
||
},
|
||
cleanEnv:function () {
|
||
if(Function.prototype.hasOwnProperty("hook")){
|
||
delete Function.prototype.hook;
|
||
}
|
||
if(Function.prototype.hasOwnProperty("unhook")){
|
||
delete Function.prototype.unhook;
|
||
}
|
||
return true;
|
||
}
|
||
};
|
||
}
|
||
var hook = new Hooks();
|
||
hook.initEnv();
|
||
|
||
//是否在数组中。
|
||
var inArray = function(arr,value) {
|
||
for (var i=0,l = arr.length ; i <l ; i++) {
|
||
if (arr[i] === value) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
var stopPP = function(e){//防止事件冒泡
|
||
e = e || window.event;
|
||
if(!e) return;
|
||
if (e.stopPropagation) {
|
||
e.stopPropagation();
|
||
}
|
||
if (e.preventDefault) {
|
||
e.preventDefault();
|
||
}
|
||
e.cancelBubble = true;
|
||
e.keyCode = 0;
|
||
e.returnValue = false;
|
||
}
|
||
|
||
|
||
//tips message
|
||
//type: success/error/warning/info
|
||
var Tips = (function(){
|
||
var in_time = 400;
|
||
var delay = 1000;
|
||
var staticPath = "./static/";
|
||
if(typeof(G) != "undefined"){
|
||
staticPath = G.static_path;
|
||
}
|
||
var _init = function(single,msg,code){
|
||
var tipsIDname = UUID();
|
||
if(single){
|
||
tipsIDname = 'messageTips';
|
||
}
|
||
|
||
var tipsID = "#"+tipsIDname;
|
||
if ($(tipsID).length ==0) {
|
||
var html='<div id="'+tipsIDname+'" class="tips_box"><i class="tips-icon"></i><div class="tips-msg"><p></p></div>'+
|
||
'<a class="tips_close">×</a><div style="clear:both"></div></div>'
|
||
$('body').append(html);
|
||
|
||
$(tipsID).show().css({'left':($(window).width() - $(tipsID).innerWidth())/2});
|
||
$(window).bind('resize',function(){
|
||
if ($(tipsID).css('display') =="none") return;
|
||
self.stop(true,true)
|
||
$(tipsID).css({'left':($(window).width() - $(tipsID).width()) / 2});
|
||
});
|
||
$(tipsID).find('.tips_close').click(function(){
|
||
$(tipsID).animate({opacity:0},
|
||
in_time,0,function(){
|
||
$(this).hide();
|
||
});
|
||
});
|
||
}
|
||
var self = $(tipsID),theType;
|
||
switch(code){// success/warning/info/error
|
||
case 100:delay = 2000;//加长时间 5s
|
||
case true:
|
||
case undefined:
|
||
case 'success':theType = 'success';break;
|
||
case 'info':theType = 'info';break;
|
||
case 'warning':theType = 'warning';break;
|
||
case false:
|
||
case 'error':theType = 'error';delay = 2000;break;
|
||
default:theType = 'info';break;
|
||
}
|
||
|
||
self.removeClass().addClass('tips_box '+theType);
|
||
if (msg != undefined) self.find('.tips-msg p').html(msg);
|
||
$(tipsID).show().css({'left':($(window).width() - $(tipsID).innerWidth())/2});
|
||
return self;
|
||
};
|
||
var tips = function(msg,code){
|
||
if (msg && typeof(msg) == 'object'){
|
||
code = msg.code;
|
||
msg = msg.data;
|
||
}
|
||
var self = _init(false,msg,code);
|
||
self.stop(true,true)
|
||
.css({opacity:0,'top':-self.height()})
|
||
.show()
|
||
.animate({opacity:1,top:0},in_time,0)
|
||
.delay(delay)
|
||
.animate({opacity:0,top:-self.height()},in_time,0,function(){
|
||
self.remove();
|
||
});
|
||
};
|
||
var loading = function(msg,code){
|
||
if (typeof(msg) == 'object'){
|
||
code=msg.code;
|
||
msg = msg.data;
|
||
}
|
||
if (msg == undefined) msg = 'loading...';
|
||
msg+= " <img src='"+staticPath+"images/common/loading_circle.gif'/>";
|
||
|
||
var self = _init(true,msg,code);
|
||
self.stop(true,true)
|
||
.css({'opacity':'0','top':-self.height()})
|
||
.animate({opacity:1,top:0},in_time,0);
|
||
};
|
||
var close = function(msg,code){
|
||
if (typeof(msg) == 'object'){
|
||
try{
|
||
code=msg.code;msg = msg.data;
|
||
if(code && typeof(msg) != 'string'){
|
||
msg = "Success!";
|
||
}
|
||
}catch(e){
|
||
code=0;msg ='';
|
||
};
|
||
}
|
||
var self = _init(true,msg,code);
|
||
self.delay(delay)
|
||
.show()
|
||
.animate({
|
||
opacity:0,
|
||
top:-self.height()
|
||
},
|
||
in_time,0,function(){
|
||
self.remove();
|
||
});
|
||
};
|
||
return{
|
||
tips:tips,
|
||
loading:loading,
|
||
close:close
|
||
}
|
||
})();
|
||
|
||
//获取keys
|
||
var objectKeys = function(obj){
|
||
var keys = [];
|
||
for(var p in obj){
|
||
if(obj.hasOwnProperty(p)){
|
||
keys.push(p);
|
||
}
|
||
}
|
||
return keys;
|
||
}
|
||
//获取values
|
||
var objectValues = function(obj){
|
||
var values = [];
|
||
for(var p in obj){
|
||
keys.push(obj[p]);
|
||
}
|
||
return values;
|
||
}
|
||
|
||
var $sizeInt = function($obj){
|
||
var str = $obj+'';
|
||
var theSize = parseInt(str.replace('px',''));
|
||
if (isNaN(theSize)) {
|
||
return 0;
|
||
}else{
|
||
return theSize;
|
||
}
|
||
}
|
||
|
||
//点击水波效果;按钮
|
||
var loadRipple = function(search_arr,ignore_arr){
|
||
var UUID = function(){
|
||
var time = (new Date()).valueOf();
|
||
return 'uuid_'+parseInt(time/1000)+'_'+Math.ceil(Math.random()*10000)
|
||
}
|
||
var getTarget = function($target){
|
||
for (var i = 0; i < search_arr.length; i++) {
|
||
var se = search_arr[i];
|
||
if( se.substr(0,1) == '#'){
|
||
if($target.attr('id') == se.substr(1) ){
|
||
return $target;
|
||
}else if($target.parent(se).length!=0){
|
||
return $($target.parents(se)[0]);
|
||
}
|
||
}else if( se.substr(0,1) == '.'){
|
||
if($target.hasClass(se.substr(1)) ){
|
||
return $target;
|
||
}else if($target.parents(se).length!=0){
|
||
return $($target.parents(se)[0]);
|
||
}
|
||
}else{
|
||
if($target.is(se)){
|
||
return $target;
|
||
}else if($target.parents(se).length!=0){
|
||
return $($target.parents(se)[0]);
|
||
}
|
||
}
|
||
}
|
||
return '';
|
||
}
|
||
var isIgnore = function($target){
|
||
for (var i = 0; i < ignore_arr.length; i++) {
|
||
var select = ignore_arr[i];
|
||
if($target.closest(select).length !=0){//从当前想上查找
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
if (typeof(Worker) == "undefined" ||
|
||
$.browser.msie && $.browser.version<=10) { //ie 10不支持 但支持worker
|
||
return;//不支持html5 css3
|
||
}
|
||
//|| $(e.target).parents(".aui_state_focus").length!=0
|
||
$('body').on('mousedown', function (e) {
|
||
var $target= getTarget($(e.target));
|
||
if($target=='' || isIgnore($target)){
|
||
return;
|
||
}
|
||
var uuid = 'ripple_'+UUID();
|
||
var father = $target;//$(this) $target
|
||
var circle_width = $target.outerWidth();
|
||
$('<div class="ripple_father" id="'+uuid+'"><div class="ripple"></div></div>').appendTo(father);
|
||
if($target.outerWidth()<$target.outerHeight()){
|
||
circle_width = $target.outerHeight();
|
||
}
|
||
circle_width = circle_width>150?150:circle_width;
|
||
circle_width = circle_width<50?50:circle_width;
|
||
|
||
var $ripp = $('#'+uuid).css({
|
||
left: 0,
|
||
top: 0,
|
||
'border-radius':$target.css("border-radius"),
|
||
width: $target.innerWidth(),
|
||
height:$target.innerHeight()
|
||
});
|
||
|
||
var position = $ripp.parent().css('position');
|
||
if(position != 'absolute' && position != 'fixed'){//父元素为绝对定位则不设置相对定位
|
||
$ripp.parent().css('position','relative');
|
||
}
|
||
$('#'+uuid+' .ripple').css({
|
||
'background':$target.css('color'),
|
||
"margin-left":e.pageX - circle_width/2 - $target.offset().left,
|
||
"margin-top": e.pageY - circle_width/2 - $target.offset().top,
|
||
"width": circle_width,
|
||
"height":circle_width
|
||
});
|
||
|
||
var animateTime = 700;
|
||
setTimeout(function(){
|
||
$ripp.find('.ripple').css('transform',"scale(2.5)");
|
||
},animateTime);
|
||
$(this).one('mouseup',function(){
|
||
$ripp.animate({'opacity':0},400,function(){
|
||
$ripp.remove();
|
||
});
|
||
});
|
||
});
|
||
}
|
||
|
||
//通用遮罩层
|
||
var MaskView = (function(){
|
||
var opacity = 0.7;
|
||
var color ='#000';
|
||
var animatetime = 250;
|
||
var maskId = "#windowMaskView";
|
||
var maskContent = '#maskViewContent';
|
||
var staticPath = "./static/";
|
||
if(typeof(G) != "undefined"){
|
||
staticPath = G.static_path;
|
||
}
|
||
var add = function(content,t_opacity,t_color,time){
|
||
if (t_opacity != undefined) opacity == t_opacity;
|
||
if (t_color != undefined) color == t_color;
|
||
if (time != undefined) animatetime == time;
|
||
|
||
if ($(maskId).length == 0) {
|
||
var html ='<div id="windowMaskView" style="position:fixed;top:0;left:0;right:0;bottom:0;background:'+
|
||
color+';opacity:'+opacity+';filter:alpha(opacity='+(opacity*100)+');z-index:9998;"></div><div id="maskViewContent" style="position:absolute;z-index:9999"></div>';
|
||
$('body').append(html);
|
||
$(maskId).bind('click',close);
|
||
$(maskContent).bind('click',function(e){
|
||
e.stopPropagation();
|
||
});
|
||
$(window).unbind('resize').bind('resize',_resize);
|
||
}
|
||
$(maskContent).html(content).fadeIn(animatetime);_resize();
|
||
$(maskId).hide().fadeIn(animatetime);
|
||
};
|
||
var _resize = function(){
|
||
var $content = $(maskContent);
|
||
$content.css({'width':'auto','height':'auto'}).css({
|
||
top:($(window).height()-$content.height())/2,
|
||
left:($(window).width()-$content.width())/2});
|
||
imageSize();
|
||
}
|
||
var tips = function(msg){
|
||
add("<div style='font-size:50px;color:#fff;'>"+msg+"</div>");
|
||
}
|
||
var image = function(url){
|
||
add("<img class='kod_image_view_loading' src='"+staticPath+"js/lib/picasa/style/loading.gif' style='position:fixed;top:50%;left:50%;opacity:0.5;z-index:99'/>"+
|
||
"<img src='"+htmlEncode(url)+"' class='image kod_image_view' "+
|
||
" style='opacity:0.01;-webkit-box-reflect: below 1px -webkit-gradient(linear,left top,left bottom,from(transparent),"+
|
||
"color-stop(80%,transparent),color-stop(70%,rgba(255,255,255,0)),to(rgba(255,255,255,0.3)));'/>");
|
||
var $content = $(maskContent)
|
||
var $dom = $content.find('.image');
|
||
var dragFlag = false,E;
|
||
var old_left,old_top;
|
||
|
||
$('#maskViewContent .kod_image_view_loading').fadeIn(300);
|
||
$('#maskViewContent .kod_image_view').load(function(){
|
||
$('#maskViewContent .kod_image_view_loading').stop(true).fadeOut(500, function() {
|
||
$(this).remove();
|
||
});
|
||
_resize();
|
||
$(this).css('opacity',1.0).addClass('animated-500 dialogShow');
|
||
});
|
||
$(document).bind({
|
||
mousedown:function(e){
|
||
if (!$(e.target).hasClass('image')) return;
|
||
dragFlag = true;
|
||
$dom.css('cursor','move');
|
||
stopPP(e);E = e;
|
||
old_top = parseInt($content.css('top').replace('px',''));
|
||
old_left = parseInt($content.css('left').replace('px',''));
|
||
},
|
||
mousemove:function(e){
|
||
if (!dragFlag) return;
|
||
$content.css({
|
||
'left':old_left+(e.clientX-E.clientX),
|
||
'top':old_top+(e.clientY-E.clientY)
|
||
});
|
||
},
|
||
mouseup:function(){
|
||
dragFlag = false;
|
||
$dom.css('cursor','default');
|
||
},
|
||
keydown:function(e){
|
||
if ($(maskId).length > 0 && e.keyCode == 27){
|
||
MaskView.close();
|
||
stopPP(e);
|
||
}
|
||
}
|
||
});
|
||
|
||
$('#windowMaskView,#maskViewContent img').mousewheel(function(delta){
|
||
var offset = delta>0?1:-1;
|
||
offset = offset * Math.abs(delta/3);
|
||
var o_w = parseInt($dom.width()),
|
||
o_h=parseInt($dom.height()),
|
||
w = o_w * (1+offset/5),
|
||
h = o_h * (1+offset/5);
|
||
if(w<=20 || h<=20) return;
|
||
if(w>=10000 || h>=10000) return;
|
||
|
||
var top = parseInt($content.css("top"))-(h-o_h)/2;
|
||
var left = parseInt($content.css("left"))-(w-o_w)/2;
|
||
$(maskContent+','+maskContent+' .image').stop(false)
|
||
.animate({'width':w,'height':h,'top':top,'left':left},200);
|
||
});
|
||
}
|
||
var imageSize = function(){
|
||
var $dom = $(maskContent).find('.image');
|
||
if ($dom.length == 0) return;
|
||
var image=new Image();
|
||
image.src = $dom.attr('src');
|
||
var percent = 0.7,
|
||
w_width = $(window).width(),
|
||
w_height= $(window).height(),
|
||
m_width = image.width,
|
||
m_height= image.height,
|
||
width,height;
|
||
if (m_width >= w_width*percent){
|
||
width = w_width*percent;
|
||
height= m_height/m_width * width;
|
||
}else{
|
||
width = m_width;
|
||
height= m_height;
|
||
}
|
||
$dom.css({'width':width,'height':height});
|
||
var $content = $(maskContent);
|
||
$content.css({'width':'auto','height':'auto'}).css({
|
||
top:($(window).height()-$content.height())/2,
|
||
left:($(window).width()-$content.width())/2});
|
||
}
|
||
var close = function(){
|
||
$(maskId).fadeOut(animatetime);
|
||
if ($(maskContent).find('.image').length!=0) {
|
||
$(maskContent+','+maskContent+' .image').animate({
|
||
'width':0,
|
||
'height':0,
|
||
'top':$(window).height()/2,
|
||
'left':$(window).width()/2
|
||
},animatetime*1.3,0,function(){
|
||
$(maskContent).hide();
|
||
_resize();
|
||
});
|
||
}else{
|
||
$(maskContent).fadeOut(animatetime);
|
||
}
|
||
};
|
||
return{
|
||
image:image,
|
||
tips:tips,
|
||
close:close
|
||
}
|
||
})();
|
||
|
||
|
||
//textarea自适应高度
|
||
(function($){
|
||
$.fn.displayWidth = function(){//文本宽度
|
||
var text = $(this).text() || $(this).val();
|
||
var html = "<span style='z-index:-1;;white-space: nowrap;font-size:"+$(this).css('font-size')+"'>"+text+"</span>";
|
||
var $html = $(html);
|
||
$html.appendTo('body');
|
||
var size = $html.get(0).offsetWidth;
|
||
$html.remove();
|
||
return size;
|
||
}
|
||
$.fn.autoTextarea = function(options) {
|
||
var defaults={
|
||
minHeight:34,
|
||
padding:0
|
||
};
|
||
var opts = $.extend({},defaults,options);
|
||
var ie = !!window.attachEvent && !window.opera;
|
||
var resetHeight = function(that){
|
||
if($(that).is('input')){//input则自动调节宽度
|
||
$(that).css('width',$(that).displayWidth()+20);
|
||
return;
|
||
}
|
||
if(!ie) that.style.height = opts.minHeight+"px";
|
||
var height = that.scrollHeight-opts.padding;
|
||
if(height<=opts.minHeight){
|
||
that.style.height = opts.minHeight+"px";
|
||
}else{
|
||
that.style.height = height+"px";
|
||
}
|
||
}
|
||
this.each(function(){
|
||
$(this).die("paste cut keydown keyup focus blur change")
|
||
.live("paste cut keydown keyup focus blur change",function(){
|
||
resetHeight(this);
|
||
});
|
||
resetHeight(this);
|
||
});
|
||
};
|
||
|
||
//长按
|
||
$.fn.longPress = function(callback,time){
|
||
if(time == undefined) time = 2000;
|
||
$(this).die('mousedown').live('mousedown', function() {
|
||
var timer = setTimeout(function() {
|
||
callback(this);
|
||
},time);
|
||
$(this).data('longPressTimer',timer);
|
||
}).die('mouseup').live('mouseup', function(){
|
||
clearTimeout($(this).data('longPressTimer'));
|
||
}).die('mouseout').live('mouseout', function(){
|
||
clearTimeout($(this).data('longPressTimer'));
|
||
});
|
||
}
|
||
|
||
$.fn.inputChange = function(callback){
|
||
this.each(function(){
|
||
$(this).on('input propertychange change blur', function() {
|
||
if($(this).prop('comStart')) return; // 中文输入过程中不截断
|
||
var value = $(this).val();
|
||
callback(this,value);
|
||
}).on('compositionstart', function(){
|
||
$(this).prop('comStart', true);
|
||
}).on('compositionend', function(){
|
||
$(this).prop('comStart', false);
|
||
});
|
||
return this;
|
||
});
|
||
}
|
||
$("#area_id").on('input propertychange change blur', function() {
|
||
if($(this).prop('comStart')) return; // 中文输入过程中不截断
|
||
var value = $(this).val();
|
||
console.log("change:"+value);
|
||
}).on('compositionstart', function(){
|
||
$(this).prop('comStart', true);
|
||
}).on('compositionend', function(){
|
||
$(this).prop('comStart', false);
|
||
});
|
||
|
||
//自动focus,并移动光标到指定位置,默认移到最后
|
||
$.fn.textFocus=function(index){
|
||
var range,len,index=index===undefined?0:parseInt(v);
|
||
if($(this).is(':focus')){
|
||
return;
|
||
}
|
||
|
||
var thatDom = $(this).get(0);
|
||
index = (index==undefined?this.value.length:parseInt(index));
|
||
if($.browser.msie){
|
||
var range=thatDom.createTextRange();
|
||
index===0?range.collapse(false):range.move("character",index);
|
||
range.select();
|
||
}else{
|
||
thatDom.setSelectionRange(index,0);
|
||
}
|
||
this.focus();
|
||
return this;
|
||
};
|
||
|
||
//选中input内文本段,并移动光标到最后
|
||
$.fn.textSelect=function(from,to){
|
||
if($(this).length == 0 || $(this).is(':focus')){
|
||
return;
|
||
}
|
||
|
||
var thatDom = $(this).get(0);
|
||
from = (from==undefined?0:parseInt(from));
|
||
to = (to==undefined? $(this).val().length:parseInt(to));
|
||
if($.browser.msie){
|
||
var range=thatDom.createTextRange();
|
||
range.moveEnd('character',to);
|
||
range.moveStart('character',from);
|
||
range.select();
|
||
}else{
|
||
thatDom.setSelectionRange(from,to-from);
|
||
}
|
||
this.focus();
|
||
return this;
|
||
};
|
||
})(jQuery);
|
||
|
||
//拖动事件
|
||
(function($){
|
||
$.fn.drag = function(obj,is_stopPP) {
|
||
this.each(function(){
|
||
var isDraging = false;
|
||
var mouseFirstX = 0;
|
||
var mouseFirstY = 0;
|
||
|
||
var $that = $(this);
|
||
$that.die('mousedown').live('mousedown',function(e){
|
||
if (e.which != 1) return true;
|
||
dragStart(e);
|
||
if($that.setCapture) $that.setCapture();
|
||
$(document).mousemove(function(e) {dragMove(e);});
|
||
$(document).one('mouseup',function(e) {
|
||
dragEnd(e);
|
||
if($that.releaseCapture) {$that.releaseCapture();}
|
||
stopPP(e);
|
||
return false;
|
||
});
|
||
if(is_stopPP){//指定不冒泡才停止向上冒泡。split拖拽调整宽度,父窗口拖拽框选防止冒泡
|
||
stopPP(e);return false;
|
||
}
|
||
//stopPP(e);return false;//跨iframe导致事件屏蔽问题
|
||
});
|
||
var dragStart = function(e){
|
||
isDraging = true;
|
||
mouseFirstX = e.pageX;
|
||
mouseFirstY = e.pageY;
|
||
if (typeof(obj["start"]) == 'function'){
|
||
obj["start"](e,$that);
|
||
}
|
||
};
|
||
var dragMove = function(e){
|
||
if (!isDraging) return true;
|
||
if (typeof(obj["move"]) == 'function'){
|
||
obj["move"](e.pageX-mouseFirstX,e.pageY-mouseFirstY,e,$that);
|
||
}
|
||
};
|
||
var dragEnd = function(e){
|
||
if (!isDraging) return false;
|
||
isDraging = false;
|
||
if (typeof(obj["end"]) == 'function'){
|
||
obj["end"](e.pageX-mouseFirstX,e.pageY-mouseFirstY,e,$that);
|
||
}
|
||
};
|
||
});
|
||
};
|
||
})(jQuery);
|
||
|
||
|
||
(function($){
|
||
$.getUrlParam = function(name,url){
|
||
if(!url) url = window.location.href;
|
||
var urlParam = $.parseUrl(url);
|
||
return urlParam.params[name];//unescape
|
||
};
|
||
$.parseUrl = function(url){
|
||
var a = document.createElement('a');
|
||
a.href = url;
|
||
return {
|
||
source: url,
|
||
protocol: a.protocol.replace(':', ''),
|
||
host: a.hostname,
|
||
port: a.port,
|
||
query: a.search,
|
||
params: (function() {
|
||
var ret = {},
|
||
seg = a.search.replace(/^\?/, '').split('&'),
|
||
len = seg.length,
|
||
i = 0,
|
||
s;
|
||
for (; i < len; i++) {
|
||
if (!seg[i]) {
|
||
continue;
|
||
}
|
||
s = seg[i].split('=');
|
||
ret[s[0]] = s[1];
|
||
}
|
||
return ret;
|
||
})(),
|
||
file: (a.pathname.match(/\/([^\/?#]+)$/i) || [, ''])[1],
|
||
hash: a.hash.replace('#', ''),
|
||
path: a.pathname.replace(/^([^\/])/, '/$1'),
|
||
relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [, ''])[1],
|
||
segments: a.pathname.replace(/^\//, '').split('/')
|
||
};
|
||
}
|
||
|
||
//选择器,目标含有特殊字符的预处理
|
||
//http://stackoverflow.com/questions/2786538/need-to-escape-a-special-character-in-a-jquery-selector-string
|
||
$.escape = function(str) {
|
||
if(!str){
|
||
return str;
|
||
}
|
||
return str.replace(/[ !"#$%&'()*+,.\/:;<=>?@[\\\]^`{|}~]/g, "\\$&");
|
||
};
|
||
$.setStyle = function(cssText,id){
|
||
var head = document.getElementsByTagName('head')[0] ||document.documentElement;
|
||
var element = document.getElementById(id);
|
||
$(element).remove();
|
||
|
||
element = document.createElement('style');
|
||
id && (element.id = id);
|
||
element.type="text/css";
|
||
head.appendChild(element);
|
||
if (element.styleSheet!== undefined) {
|
||
// IE http://support.microsoft.com/kb/262161
|
||
if (document.getElementsByTagName('style').length > 31) {
|
||
throw new Error('Exceed the maximal count of style tags in IE')
|
||
}
|
||
element.styleSheet.cssText = cssText
|
||
}else {
|
||
element.appendChild(document.createTextNode(cssText));
|
||
}
|
||
}
|
||
|
||
// 进指定字符串通过浏览器下载
|
||
$.htmlDownload = function(str,name){
|
||
if(!/Trident|MSIE/.test(navigator.userAgent)){//html5 支持保存文件
|
||
// http://danml.com/download.html
|
||
download(str, name, "text/html")
|
||
}else{//ie 下载
|
||
var ifr = document.createElement('iframe');
|
||
ifr.style.display = 'none';
|
||
ifr.src = str;
|
||
document.body.appendChild(ifr);
|
||
ifr.contentWindow.document.execCommand('SaveAs', false, name);
|
||
document.body.removeChild(ifr);
|
||
}
|
||
}
|
||
|
||
//打印html
|
||
$.htmlPrint = function(html){
|
||
html = "<div style='width:100%;height:100%;'>"+html+"</div>";
|
||
if ($.browser.opera) {
|
||
var tab = window.open("","print-preview");
|
||
doc.open();
|
||
var doc = tab.document;
|
||
var paWindow = tab;
|
||
}else{
|
||
var $iframe = $("<iframe />");
|
||
$iframe.css({ position: "absolute",width:"0px",height:"0px",left:"-2000px",top:"-2000px" });
|
||
$iframe.appendTo("body");
|
||
var doc = $iframe[0].contentWindow.document;
|
||
var paWindow = $iframe[0].contentWindow;
|
||
}
|
||
if (!doc) throw "Cannot find document.";
|
||
|
||
// $("link").each( function() {
|
||
// doc.write("<link type='text/css' rel='stylesheet' href='" + $(this).attr("href") + "' />");
|
||
// });
|
||
doc.write(html);
|
||
doc.close();
|
||
setTimeout( function () {
|
||
$(doc).ready(function(){
|
||
paWindow.focus();
|
||
paWindow.print();
|
||
if (tab) tab.close();
|
||
});
|
||
},500);
|
||
};
|
||
$.fn.extend({
|
||
//dom绑定enter事件 用于input
|
||
keyEnter:function(callback){
|
||
this.each(function(){
|
||
$(this).die('keydown').live('keydown',function(e){
|
||
if (e.keyCode == 13 && callback){
|
||
callback();
|
||
}
|
||
});
|
||
});
|
||
},
|
||
inScreen:function(isCenter){//是否在屏幕中 ;isCenter 按中心点来判断
|
||
var el = $(this).get(0);
|
||
if (typeof jQuery === "function" && el instanceof jQuery) {
|
||
el = el[0];
|
||
}
|
||
var rect = el.getBoundingClientRect(),
|
||
vWidth = window.innerWidth || document.documentElement.clientWidth,
|
||
vHeight = window.innerHeight || document.documentElement.clientHeight,
|
||
efp = function (x, y) { return document.elementFromPoint(x, y) };
|
||
if (rect.right < 0 || rect.bottom < 0 ||
|
||
rect.left > vWidth || rect.top > vHeight){
|
||
return false;
|
||
}
|
||
// if(isCenter){//按元素中心点判断
|
||
// var left = rect.left + (rect.right - rect.left)/2;
|
||
// var top = rect.top + (rect.bottom - rect.top)/2;
|
||
// return el.contains(efp(left,top))
|
||
// }
|
||
return (
|
||
el.contains(efp(rect.left, rect.top))
|
||
|| el.contains(efp(rect.right, rect.top))
|
||
|| el.contains(efp(rect.right, rect.bottom))
|
||
|| el.contains(efp(rect.left, rect.bottom))
|
||
);
|
||
},
|
||
//dom绑定鼠标滚轮事件
|
||
mousewheel: function(fn){
|
||
var mousewheel = jQuery.browser.mozilla ? "DOMMouseScroll" : "mousewheel";
|
||
this.each(function(){
|
||
$(this).bind(mousewheel ,function(e){
|
||
e= window.event || e;
|
||
var delta = e.wheelDelta ? (e.wheelDelta / 120) : (- e.detail / 3);
|
||
fn.call(this,delta);
|
||
return false;
|
||
});
|
||
});
|
||
},
|
||
//晃动 $('.wrap').shake(4,4,100);//次数;位移;运动时间
|
||
shake: function(times,offset,delay){
|
||
this.each(function(){
|
||
$(this).stop().each(function(){
|
||
var Obj = $(this);
|
||
var marginLeft = parseInt(Obj.css('margin-left'));
|
||
delay = delay > 50 ? delay : 50;
|
||
Obj.animate({'margin-left':marginLeft+offset},delay,function(){
|
||
Obj.animate({'margin-left':marginLeft},delay,function(){
|
||
times = times - 1;
|
||
if(times > 0)
|
||
Obj.shake(times,offset,delay);
|
||
});
|
||
});
|
||
});
|
||
});
|
||
return this;
|
||
},
|
||
scale:function(xScale, yScale) {
|
||
var Obj = $(this);
|
||
if($.browser.mozilla || $.browser.opera || $.browser.safari) {
|
||
// x轴方向和y方向分别缩放的比例
|
||
Obj.css('transform', 'scale(' + xScale + ', ' + yScale + ')');
|
||
// 缩放后,相对于父元素左上角的偏移量
|
||
Obj.css('transform-origin', '0px 0px');
|
||
}else if($.browser.msie && parseInt($.browser.version)>= 9) {
|
||
Obj.css('-ms-transform', 'scale(' + xScale + ')');
|
||
Obj.css('-ms-transform-origin', '0px 0px');
|
||
}else if($.browser.msie && parseInt($.browser.version) < 9) {
|
||
Obj.css('zoom', xScale);
|
||
}else {
|
||
Obj.css('-webkit-transform', 'scale(' + xScale + ', ' + yScale + ')');
|
||
Obj.css('-webkit-transform-origin', '0px 0px');
|
||
}
|
||
}
|
||
});
|
||
})(jQuery);
|
||
|
||
(function($){
|
||
$.tooltipsy = function (el, options) {
|
||
this.options = options;
|
||
this.$el = $(el);
|
||
this.title = this.$el.attr('title') || '';
|
||
this.$el.attr('title', '');
|
||
this.random = parseInt(Math.random()*10000);
|
||
this.ready = false;
|
||
this.shown = false;
|
||
this.width = 0;
|
||
this.height = 0;
|
||
this.delaytimer = null;
|
||
|
||
this.$el.data("tooltipsy", this);
|
||
this.init();
|
||
};
|
||
|
||
$.tooltipsy.prototype = {
|
||
init: function () {
|
||
var base = this,
|
||
settings,
|
||
$el = base.$el,
|
||
el = $el[0];
|
||
|
||
base.settings = settings = $.extend({}, base.defaults, base.options);
|
||
settings.delay = +settings.delay;
|
||
|
||
if (typeof settings.content === 'function') {
|
||
base.readify();
|
||
}
|
||
|
||
if (settings.showEvent === settings.hideEvent && settings.showEvent === 'click') {
|
||
$el.toggle(function (e) {
|
||
if (settings.showEvent === 'click' && el.tagName == 'A') {
|
||
e.preventDefault();
|
||
}
|
||
if (settings.delay > 0) {
|
||
base.delaytimer = window.setTimeout(function () {
|
||
base.show(e);
|
||
}, settings.delay);
|
||
}
|
||
else {
|
||
base.show(e);
|
||
}
|
||
}, function (e) {
|
||
if (settings.showEvent === 'click' && el.tagName == 'A') {
|
||
e.preventDefault();
|
||
}
|
||
window.clearTimeout(base.delaytimer);
|
||
base.delaytimer = null;
|
||
base.hide(e);
|
||
});
|
||
}
|
||
else {
|
||
$el.bind(settings.showEvent, function (e) {
|
||
if (settings.showEvent === 'click' && el.tagName == 'A') {
|
||
e.preventDefault();
|
||
}
|
||
base.delaytimer = window.setTimeout(function () {
|
||
base.show(e);
|
||
}, settings.delay || 0);
|
||
}).bind(settings.hideEvent, function (e) {
|
||
if (settings.showEvent === 'click' && el.tagName == 'A') {
|
||
e.preventDefault();
|
||
}
|
||
window.clearTimeout(base.delaytimer);
|
||
base.delaytimer = null;
|
||
base.hide(e);
|
||
});
|
||
}
|
||
},
|
||
|
||
show: function (e) {
|
||
if (this.ready === false) {
|
||
this.readify();
|
||
}
|
||
|
||
var base = this,
|
||
settings = base.settings,
|
||
$tipsy = base.$tipsy,
|
||
$el = base.$el,
|
||
el = $el[0],
|
||
offset = base.offset(el);
|
||
|
||
if (base.shown === false) {
|
||
if ((function (o) {
|
||
var s = 0, k;
|
||
for (k in o) {
|
||
if (o.hasOwnProperty(k)) {
|
||
s++;
|
||
}
|
||
}
|
||
return s;
|
||
})(settings.css) > 0) {
|
||
base.$tip.css(settings.css);
|
||
}
|
||
base.width = $tipsy.outerWidth();
|
||
base.height = $tipsy.outerHeight();
|
||
}
|
||
|
||
if (settings.alignTo === 'cursor' && e) {
|
||
var tip_position = [e.clientX + settings.offset[0], e.clientY + settings.offset[1]];
|
||
if (tip_position[0] + base.width > $(window).width()) {
|
||
var tip_css = {top: tip_position[1] + 'px', right: tip_position[0] + 'px', left: 'auto'};
|
||
}
|
||
else {
|
||
var tip_css = {top: tip_position[1] + 'px', left: tip_position[0] + 'px', right: 'auto'};
|
||
}
|
||
}
|
||
else {
|
||
var tip_position = [
|
||
(function () {
|
||
if (settings.offset[0] < 0) {
|
||
return offset.left - Math.abs(settings.offset[0]) - base.width;
|
||
}
|
||
else if (settings.offset[0] === 0) {
|
||
return offset.left - ((base.width - $el.outerWidth()) / 2);
|
||
}
|
||
else {
|
||
return offset.left + $el.outerWidth() + settings.offset[0];
|
||
}
|
||
})(),
|
||
(function () {
|
||
if (settings.offset[1] < 0) {
|
||
return offset.top - Math.abs(settings.offset[1]) - base.height;
|
||
}
|
||
else if (settings.offset[1] === 0) {
|
||
return offset.top - ((base.height - base.$el.outerHeight()) / 2);
|
||
}
|
||
else {
|
||
return offset.top + base.$el.outerHeight() + settings.offset[1];
|
||
}
|
||
})()
|
||
];
|
||
}
|
||
$tipsy.css({top: tip_position[1] + 'px', left: tip_position[0] + 'px'});
|
||
base.settings.show(e, $tipsy.stop(true, true));
|
||
},
|
||
|
||
hide: function (e) {
|
||
var base = this;
|
||
|
||
if (base.ready === false) {
|
||
return;
|
||
}
|
||
|
||
if (e && e.relatedTarget === base.$tip[0]) {
|
||
base.$tip.bind('mouseleave', function (e) {
|
||
if (e.relatedTarget === base.$el[0]) {
|
||
return;
|
||
}
|
||
base.settings.hide(e, base.$tipsy.stop(true, true));
|
||
});
|
||
return;
|
||
}
|
||
base.settings.hide(e, base.$tipsy.stop(true, true));
|
||
},
|
||
|
||
readify: function () {
|
||
this.ready = true;
|
||
this.$tipsy = $('<div id="tooltipsy' + this.random + '" style="position:fixed;z-index:2147483647;display:none">').appendTo('body');
|
||
this.$tip = $('<div class="' + this.settings.className + '">').appendTo(this.$tipsy);
|
||
this.$tip.data('rootel', this.$el);
|
||
var e = this.$el;
|
||
var t = this.$tip;
|
||
this.$tip.html(this.settings.content != '' ? (typeof this.settings.content == 'string' ? this.settings.content : this.settings.content(e, t)) : this.title);
|
||
},
|
||
|
||
offset: function (el) {
|
||
return this.$el[0].getBoundingClientRect();
|
||
},
|
||
|
||
destroy: function () {
|
||
if (this.$tipsy) {
|
||
this.$tipsy.remove();
|
||
$.removeData(this.$el, 'tooltipsy');
|
||
}
|
||
},
|
||
|
||
defaults: {
|
||
alignTo: 'element',
|
||
offset: [0, -1],
|
||
content: '',
|
||
show: function (e, $el) {
|
||
$el.fadeIn(100);
|
||
},
|
||
hide: function (e, $el) {
|
||
$el.fadeOut(100);
|
||
},
|
||
css: {},
|
||
className: 'tooltipsy',
|
||
delay: 200,
|
||
showEvent: 'mouseenter',
|
||
hideEvent: 'mouseleave'
|
||
}
|
||
};
|
||
|
||
$.fn.tooltipsy = function(options) {
|
||
return this.each(function() {
|
||
new $.tooltipsy(this, options);
|
||
});
|
||
};
|
||
|
||
})(jQuery);
|
||
|
||
|
||
|
||
|
||
|
||
//yyyy-mm-dd H:i:s or yy-mm-dd to timestamp
|
||
var strtotime = function(datetime){
|
||
var tmp_datetime = datetime.replace(/:/g,'-');
|
||
tmp_datetime = tmp_datetime.replace(/ /g,'-');
|
||
var arr = tmp_datetime.split("-");
|
||
var y=arr[0];
|
||
var m=arr[1]-1;
|
||
var d=arr[2];
|
||
var h=arr[3]-8; ///兼容八小时时差问题
|
||
var i=arr[4];
|
||
var s=arr[5];
|
||
//兼容无"时:分:秒"模式
|
||
if(arr[3]=='undefined' || isNaN(h)){
|
||
h=0;
|
||
}
|
||
if(arr[4]=='undefined' || isNaN(i)){
|
||
i=0;
|
||
}
|
||
if(arr[5]=='undefined' || isNaN(s)){
|
||
s=0;
|
||
}
|
||
var now = new Date(Date.UTC(y,m,d,h,i,s));
|
||
return parseInt(now.getTime()/1000);
|
||
}
|
||
var date = function(format, timestamp){
|
||
timestamp = parseInt(timestamp);
|
||
var a, jsdate=((timestamp) ? new Date(timestamp*1000) : new Date());
|
||
var pad = function(n, c){
|
||
if((n = n + "").length < c){
|
||
return new Array(++c - n.length).join("0") + n;
|
||
} else {
|
||
return n;
|
||
}
|
||
};
|
||
var txt_weekdays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
|
||
var txt_ordin = {1:"st", 2:"nd", 3:"rd", 21:"st", 22:"nd", 23:"rd", 31:"st"};
|
||
var txt_months = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
||
var f = {
|
||
// Day
|
||
d: function(){return pad(f.j(), 2)},
|
||
D: function(){return f.l().substr(0,3)},
|
||
j: function(){return jsdate.getDate()},
|
||
l: function(){return txt_weekdays[f.w()]},
|
||
N: function(){return f.w() + 1},
|
||
S: function(){return txt_ordin[f.j()] ? txt_ordin[f.j()] : 'th'},
|
||
w: function(){return jsdate.getDay()},
|
||
z: function(){return (jsdate - new Date(jsdate.getFullYear() + "/1/1")) / 864e5 >> 0},
|
||
|
||
// Week
|
||
W: function(){
|
||
var a = f.z(), b = 364 + f.L() - a;
|
||
var nd2, nd = (new Date(jsdate.getFullYear() + "/1/1").getDay() || 7) - 1;
|
||
if(b <= 2 && ((jsdate.getDay() || 7) - 1) <= 2 - b){
|
||
return 1;
|
||
} else{
|
||
if(a <= 2 && nd >= 4 && a >= (6 - nd)){
|
||
nd2 = new Date(jsdate.getFullYear() - 1 + "/12/31");
|
||
return date("W", Math.round(nd2.getTime()/1000));
|
||
} else{
|
||
return (1 + (nd <= 3 ? ((a + nd) / 7) : (a - (7 - nd)) / 7) >> 0);
|
||
}
|
||
}
|
||
},
|
||
|
||
// Month
|
||
F: function(){return txt_months[f.n()]},
|
||
m: function(){return pad(f.n(), 2)},
|
||
M: function(){return f.F().substr(0,3)},
|
||
n: function(){return jsdate.getMonth() + 1},
|
||
t: function(){
|
||
var n;
|
||
if( (n = jsdate.getMonth() + 1) == 2 ){
|
||
return 28 + f.L();
|
||
} else{
|
||
if( n & 1 && n < 8 || !(n & 1) && n > 7 ){
|
||
return 31;
|
||
} else{
|
||
return 30;
|
||
}
|
||
}
|
||
},
|
||
|
||
// Year
|
||
L: function(){var y = f.Y();return (!(y & 3) && (y % 1e2 || !(y % 4e2))) ? 1 : 0},
|
||
Y: function(){return jsdate.getFullYear()},
|
||
y: function(){return (jsdate.getFullYear() + "").slice(2)},
|
||
|
||
// Time
|
||
a: function(){return jsdate.getHours() > 11 ? "pm" : "am"},
|
||
A: function(){return f.a().toUpperCase()},
|
||
B: function(){
|
||
var off = (jsdate.getTimezoneOffset() + 60)*60;
|
||
var theSeconds = (jsdate.getHours() * 3600) + (jsdate.getMinutes() * 60) + jsdate.getSeconds() + off;
|
||
var beat = Math.floor(theSeconds/86.4);
|
||
if (beat > 1000) beat -= 1000;
|
||
if (beat < 0) beat += 1000;
|
||
if ((String(beat)).length == 1) beat = "00"+beat;
|
||
if ((String(beat)).length == 2) beat = "0"+beat;
|
||
return beat;
|
||
},
|
||
g: function(){return jsdate.getHours() % 12 || 12},
|
||
G: function(){return jsdate.getHours()},
|
||
h: function(){return pad(f.g(), 2)},
|
||
H: function(){return pad(jsdate.getHours(), 2)},
|
||
i: function(){return pad(jsdate.getMinutes(), 2)},
|
||
s: function(){return pad(jsdate.getSeconds(), 2)},
|
||
|
||
O: function(){
|
||
var t = pad(Math.abs(jsdate.getTimezoneOffset()/60*100), 4);
|
||
if (jsdate.getTimezoneOffset() > 0) t = "-" + t; else t = "+" + t;
|
||
return t;
|
||
},
|
||
P: function(){var O = f.O();return (O.substr(0, 3) + ":" + O.substr(3, 2))},
|
||
c: function(){return f.Y() + "-" + f.m() + "-" + f.d() + "T" + f.h() + ":" + f.i() + ":" + f.s() + f.P()},
|
||
U: function(){return Math.round(jsdate.getTime()/1000)}
|
||
};
|
||
return format.replace(/[\\]?([a-zA-Z])/g, function(t, s){
|
||
if( t!=s ){
|
||
ret = s;
|
||
} else if( f[s] ){
|
||
ret = f[s]();
|
||
} else{
|
||
ret = s;
|
||
}
|
||
return ret;
|
||
});
|
||
}
|
||
|
||
|
||
var Base64Hex = (function(){
|
||
var encode = function (str) {
|
||
var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||
var out, i, len;
|
||
var c1, c2, c3;
|
||
|
||
len = str.length;
|
||
i = 0;
|
||
out = "";
|
||
while(i < len) {
|
||
c1 = str.charCodeAt(i++) & 0xff;
|
||
if(i == len){
|
||
out += base64EncodeChars.charAt(c1 >> 2);
|
||
out += base64EncodeChars.charAt((c1 & 0x3) << 4);
|
||
out += "==";
|
||
break;
|
||
}
|
||
c2 = str.charCodeAt(i++);
|
||
if(i == len){
|
||
out += base64EncodeChars.charAt(c1 >> 2);
|
||
out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
|
||
out += base64EncodeChars.charAt((c2 & 0xF) << 2);
|
||
out += "=";
|
||
break;
|
||
}
|
||
c3 = str.charCodeAt(i++);
|
||
out += base64EncodeChars.charAt(c1 >> 2);
|
||
out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
|
||
out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
|
||
out += base64EncodeChars.charAt(c3 & 0x3F);
|
||
}
|
||
return out;
|
||
}
|
||
|
||
var decode = function(str) {
|
||
var base64DecodeChars = new Array(
|
||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
|
||
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
|
||
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
||
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
|
||
-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
||
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
|
||
var c1, c2, c3, c4;
|
||
var i, len, out;
|
||
|
||
len = str.length;
|
||
i = 0;
|
||
out = "";
|
||
while(i < len) {
|
||
/* c1 */
|
||
do {
|
||
c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
|
||
} while(i < len && c1 == -1);
|
||
if(c1 == -1)
|
||
break;
|
||
|
||
/* c2 */
|
||
do {
|
||
c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
|
||
} while(i < len && c2 == -1);
|
||
if(c2 == -1)
|
||
break;
|
||
|
||
out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
|
||
|
||
/* c3 */
|
||
do {
|
||
c3 = str.charCodeAt(i++) & 0xff;
|
||
if(c3 == 61)
|
||
return out;
|
||
c3 = base64DecodeChars[c3];
|
||
} while(i < len && c3 == -1);
|
||
if(c3 == -1)
|
||
break;
|
||
|
||
out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
|
||
/* c4 */
|
||
do {
|
||
c4 = str.charCodeAt(i++) & 0xff;
|
||
if(c4 == 61)
|
||
return out;
|
||
c4 = base64DecodeChars[c4];
|
||
} while(i < len && c4 == -1);
|
||
if(c4 == -1)
|
||
break;
|
||
out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
|
||
}
|
||
return out;
|
||
}
|
||
return {
|
||
encode:encode,
|
||
decode:decode
|
||
}
|
||
})();
|
||
|
||
|
||
var Base64 = (function(){
|
||
var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
|
||
var encode = function (input) {
|
||
var output = "";
|
||
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
|
||
var i = 0;
|
||
input = utf8Encode(input);
|
||
while (i < input.length) {
|
||
chr1 = input.charCodeAt(i++);
|
||
chr2 = input.charCodeAt(i++);
|
||
chr3 = input.charCodeAt(i++);
|
||
enc1 = chr1 >> 2;
|
||
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
|
||
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
|
||
enc4 = chr3 & 63;
|
||
if (isNaN(chr2)) {
|
||
enc3 = enc4 = 64;
|
||
} else if (isNaN(chr3)) {
|
||
enc4 = 64;
|
||
}
|
||
output = output +
|
||
_keyStr.charAt(enc1) + _keyStr.charAt(enc2) +
|
||
_keyStr.charAt(enc3) + _keyStr.charAt(enc4);
|
||
}
|
||
return output;
|
||
}
|
||
// public method for decoding
|
||
var decode = function (input) {
|
||
var output = "";
|
||
var chr1, chr2, chr3;
|
||
var enc1, enc2, enc3, enc4;
|
||
var i = 0;
|
||
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
|
||
while (i < input.length) {
|
||
enc1 = _keyStr.indexOf(input.charAt(i++));
|
||
enc2 = _keyStr.indexOf(input.charAt(i++));
|
||
enc3 = _keyStr.indexOf(input.charAt(i++));
|
||
enc4 = _keyStr.indexOf(input.charAt(i++));
|
||
chr1 = (enc1 << 2) | (enc2 >> 4);
|
||
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
|
||
chr3 = ((enc3 & 3) << 6) | enc4;
|
||
output = output + String.fromCharCode(chr1);
|
||
if (enc3 != 64) {
|
||
output = output + String.fromCharCode(chr2);
|
||
}
|
||
if (enc4 != 64) {
|
||
output = output + String.fromCharCode(chr3);
|
||
}
|
||
}
|
||
output = utf8Decode(output);
|
||
return output;
|
||
}
|
||
// private method for UTF-8 encoding
|
||
utf8Encode = function (string) {
|
||
string = string.replace(/\r\n/g,"\n");
|
||
var utftext = "";
|
||
for (var n = 0; n < string.length; n++) {
|
||
var c = string.charCodeAt(n);
|
||
if (c < 128) {
|
||
utftext += String.fromCharCode(c);
|
||
} else if((c > 127) && (c < 2048)) {
|
||
utftext += String.fromCharCode((c >> 6) | 192);
|
||
utftext += String.fromCharCode((c & 63) | 128);
|
||
} else {
|
||
utftext += String.fromCharCode((c >> 12) | 224);
|
||
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
|
||
utftext += String.fromCharCode((c & 63) | 128);
|
||
}
|
||
|
||
}
|
||
return utftext;
|
||
}
|
||
|
||
// private method for UTF-8 decoding
|
||
utf8Decode = function (utftext) {
|
||
var string = "";
|
||
var i = 0;
|
||
var c = c1 = c2 = 0;
|
||
while ( i < utftext.length ) {
|
||
c = utftext.charCodeAt(i);
|
||
if (c < 128) {
|
||
string += String.fromCharCode(c);
|
||
i++;
|
||
} else if((c > 191) && (c < 224)) {
|
||
c2 = utftext.charCodeAt(i+1);
|
||
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
|
||
i += 2;
|
||
} else {
|
||
c2 = utftext.charCodeAt(i+1);
|
||
c3 = utftext.charCodeAt(i+2);
|
||
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
|
||
i += 3;
|
||
}
|
||
}
|
||
return string;
|
||
};
|
||
return {
|
||
encode:encode,
|
||
decode:decode
|
||
}
|
||
})();
|
||
|
||
|
||
var authCrypt = (function(){
|
||
var base64Encode = Base64Hex.encode;
|
||
var base64Decode = Base64Hex.decode;
|
||
var time = function() {
|
||
var timeStamp = new Date().getTime();
|
||
return parseInt(timeStamp / 1000);
|
||
}
|
||
var microtime = function(timeFloat) {
|
||
var timeStamp = new Date().getTime();
|
||
var sec = parseInt(timeStamp / 1000);
|
||
return timeFloat ? (timeStamp / 1000) : (timeStamp - (sec * 1000)) / 1000 + ' ' + sec;
|
||
}
|
||
var chr = function(s) {
|
||
return String.fromCharCode(s);
|
||
}
|
||
var ord = function(s) {
|
||
return s.charCodeAt();
|
||
}
|
||
var authcode = function(str, operation, key, expiry) {
|
||
var operation = operation ? operation : 'DECODE';
|
||
var key = key ? key : '';
|
||
var expiry = expiry ? expiry : 0;
|
||
var ckey_length = 4;
|
||
key = md5(key);
|
||
var keya = md5(key.substr(0, 16));
|
||
var keyb = md5(key.substr(16, 16));
|
||
if(ckey_length){
|
||
if(operation == 'DECODE'){
|
||
var keyc = str.substr(0, ckey_length);
|
||
}else{
|
||
var md5_time = md5(microtime());
|
||
var start = md5_time.length - ckey_length;
|
||
var keyc = md5_time.substr(start, ckey_length)
|
||
}
|
||
}else{
|
||
var keyc = '';
|
||
}
|
||
|
||
var cryptkey = keya + md5(keya + keyc);
|
||
var strbuf;
|
||
if (operation == 'DECODE') {
|
||
str = str.substr(ckey_length);
|
||
strbuf = base64Decode(str);
|
||
} else {
|
||
expiry = expiry ? expiry + time() : 0;
|
||
tmpstr = expiry.toString();
|
||
if (tmpstr.length >= 10){
|
||
str = tmpstr.substr(0, 10) + md5(str + keyb).substr(0, 16) + str;
|
||
}else {
|
||
var count = 10 - tmpstr.length;
|
||
for (var i = 0; i < count; i++) {
|
||
tmpstr = '0' + tmpstr;
|
||
}
|
||
str = tmpstr + md5(str + keyb).substr(0, 16) + str;
|
||
}
|
||
strbuf = str;
|
||
}
|
||
|
||
var box = new Array(256);
|
||
for (var i = 0; i < 256; i++) {
|
||
box[i] = i;
|
||
}
|
||
var rndkey = new Array();
|
||
for (var i = 0; i < 256; i++) {
|
||
rndkey[i] = cryptkey.charCodeAt(i % cryptkey.length);
|
||
}
|
||
for (var j = i = 0; i < 256; i++) {
|
||
j = (j + box[i] + rndkey[i]) % 256;
|
||
tmp = box[i];
|
||
box[i] = box[j];
|
||
box[j] = tmp;
|
||
}
|
||
|
||
var s = '';
|
||
strbuf = strbuf.split('');
|
||
for (var a = j = i = 0; i < strbuf.length; i++) {
|
||
a = (a + 1) % 256;
|
||
j = (j + box[a]) % 256;
|
||
tmp = box[a];
|
||
box[a] = box[j];
|
||
box[j] = tmp;
|
||
s += chr(ord(strbuf[i])^(box[(box[a] + box[j]) % 256]));
|
||
}
|
||
|
||
if (operation == 'DECODE') {
|
||
if ((s.substr(0, 10) == 0 || s.substr(0, 10) - time() > 0) && s.substr(10, 16) == md5(s.substr(26) + keyb).substr(0, 16)) {
|
||
s = s.substr(26);
|
||
} else {
|
||
s = '';
|
||
}
|
||
} else {
|
||
s = base64Encode(s);
|
||
var regex = new RegExp('=', "g");
|
||
s = s.replace(regex, '');
|
||
s = keyc + s;
|
||
}
|
||
return s;
|
||
}
|
||
return {
|
||
authcode:authcode,
|
||
encode:function(string,key,expiry){
|
||
var result = authcode(string,"ENCODE",key,expiry);
|
||
result = result.replace(/\+/g,'-');
|
||
result = result.replace(/\//g,'_');
|
||
result = result.replace(/=/g,'.');
|
||
return result;
|
||
},
|
||
decode:function(string,key){
|
||
string = string.replace(/-/g,'+');
|
||
string = string.replace(/_/g,'/');
|
||
string = string.replace(/\./g,'=');
|
||
var result = authcode(string,"DECODE",key);
|
||
return result;
|
||
}
|
||
}
|
||
})();
|
||
|
||
|
||
var base64Encode = Base64.encode;
|
||
var base64Decode = Base64.decode;
|
||
var htmlEncode=function(str){
|
||
var s = "";
|
||
if (!str || str.length == 0) return "";
|
||
s = str.replace(/&/g, "&");
|
||
s = s.replace(/</g, "<");
|
||
s = s.replace(/>/g, ">");
|
||
//s = s.replace(/ /g, " ");
|
||
s = s.replace(/\'/g, "'");
|
||
s = s.replace(/\"/g, """);
|
||
return s;
|
||
}
|
||
var htmlDecode=function(str){
|
||
var temp = document.createElement("div");
|
||
temp.innerHTML = str;
|
||
var output = temp.innerText || temp.textContent;
|
||
temp = null;
|
||
return output;
|
||
}
|
||
//去掉所有的html标记
|
||
var htmlRemoveTags=function(str){
|
||
return str.replace(/<[^>]+>/g,"");
|
||
}
|
||
|
||
//http://codepen.io/anon/pen/wWaMQZ?editors=1011
|
||
//对应php处理
|
||
var hashEncode = function(str){
|
||
if(!str) return str;
|
||
var res = base64Encode(str);
|
||
res = res.replace(/\+/g, "_a");
|
||
res = res.replace(/\//g, "_b");
|
||
res = res.replace(/=/g, "_c");
|
||
return res;
|
||
}
|
||
var hashDecode = function (str) {
|
||
if(!str) return str;
|
||
var res = str.replace(/_a/g, "+");
|
||
res = res.replace(/_b/g, "/");
|
||
res = res.replace(/_c/g, "=");
|
||
return base64Decode(res);
|
||
}
|
||
|
||
|
||
//ie js
|
||
if (!window.console) {
|
||
window.console = {
|
||
log:function(){},
|
||
trace:function() {},
|
||
info:function() {},
|
||
warn:function() {},
|
||
error:function() {},
|
||
assert:function() {},
|
||
dir:function() {},
|
||
clear:function() {},
|
||
profile:function() {}
|
||
};
|
||
//window.console = undefined;
|
||
}
|
||
if (!Object.keys) {
|
||
Object.keys = (function() {
|
||
'use strict';
|
||
var hasOwnProperty = Object.prototype.hasOwnProperty,
|
||
hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),
|
||
dontEnums = [
|
||
'toString',
|
||
'toLocaleString',
|
||
'valueOf',
|
||
'hasOwnProperty',
|
||
'isPrototypeOf',
|
||
'propertyIsEnumerable',
|
||
'constructor'
|
||
],
|
||
dontEnumsLength = dontEnums.length;
|
||
return function(obj) {
|
||
if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {
|
||
throw new TypeError('Object.keys called on non-object');
|
||
}
|
||
|
||
var result = [], prop, i;
|
||
for (prop in obj) {
|
||
if (hasOwnProperty.call(obj, prop)) {
|
||
result.push(prop);
|
||
}
|
||
}
|
||
if (hasDontEnumBug) {
|
||
for (i = 0; i < dontEnumsLength; i++) {
|
||
if (hasOwnProperty.call(obj, dontEnums[i])) {
|
||
result.push(dontEnums[i]);
|
||
}
|
||
}
|
||
}
|
||
return result;
|
||
};
|
||
}());
|
||
}
|