973 lines
23 KiB
JavaScript
973 lines
23 KiB
JavaScript
/********************************************
|
||
Magike Project
|
||
copyright (c) Magike Group
|
||
This software must be only used in Magike Systeam.
|
||
http://www.magike.net
|
||
powered by qining
|
||
********************************************/
|
||
|
||
function getScrollTop(){
|
||
var yScrolltop;
|
||
var xScrollleft;
|
||
if (self.pageYOffset || self.pageXOffset) {
|
||
yScrolltop = self.pageYOffset;
|
||
xScrollleft = self.pageXOffset;
|
||
} else if (typeof(document.documentElement) != "undefined" && typeof(document.documentElement.scrollTop) != "undefined" || typeof(document.documentElement.scrollLeft) != "undefined" ){ // Explorer 6 Strict
|
||
yScrolltop = document.documentElement.scrollTop;
|
||
xScrollleft = document.documentElement.scrollLeft;
|
||
} else if (typeof(document.body) != "undefined") {// all other Explorers
|
||
yScrolltop = document.body.scrollTop;
|
||
xScrollleft = document.body.scrollLeft;
|
||
}
|
||
|
||
arrayPageScroll = new Array(xScrollleft,yScrolltop);
|
||
return arrayPageScroll;
|
||
}
|
||
|
||
function getPageSize(){
|
||
var de = document.documentElement;
|
||
var w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
|
||
var h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight;
|
||
arrayPageSize = new Array(w,h);
|
||
return arrayPageSize;
|
||
}
|
||
|
||
function findPosX(obj){var curleft = 0;if (obj && obj.offsetParent) {while (obj.offsetParent) { curleft += obj.offsetLeft;obj = obj.offsetParent;}} else if (obj && obj.x) curleft += obj.x;return curleft;}
|
||
function findPosY(obj){var curtop = 0;if (obj && obj.offsetParent) { while (obj.offsetParent) { curtop += obj.offsetTop;obj = obj.offsetParent;}} else if (obj && obj.y) curtop += obj.y;return curtop;}
|
||
|
||
var ajaxFinish = true;
|
||
function ajaxLoadingStart()
|
||
{
|
||
ajaxFinish = false;
|
||
$("#ajax_loading").show();
|
||
}
|
||
|
||
function ajaxLoadingFinish()
|
||
{
|
||
ajaxFinish = true;
|
||
$("#ajax_loading").fadeOut("slow");
|
||
}
|
||
|
||
function registerTableCheckbox(table,className)
|
||
{
|
||
$("."+className,$("#"+table)).click
|
||
(
|
||
function()
|
||
{
|
||
$(this.parentNode.parentNode).toggleClass("select");
|
||
}
|
||
);
|
||
|
||
$("tr",$("#"+table)).mouseover
|
||
(
|
||
function()
|
||
{
|
||
if($("."+className,$(this)).attr("checked") != true && !$(this).hasClass("heading"))
|
||
{
|
||
$(this).addClass("hover");
|
||
}
|
||
}
|
||
);
|
||
|
||
$("tr",$("#"+table)).mouseout
|
||
(
|
||
function()
|
||
{
|
||
if($("."+className,$(this)).attr("checked") != true && !$(this).hasClass("heading"))
|
||
{
|
||
$(this).removeClass("hover");
|
||
}
|
||
}
|
||
);
|
||
}
|
||
|
||
function selectTableAll(table,className)
|
||
{
|
||
$("."+className,$("#"+table)).each(
|
||
function()
|
||
{
|
||
$(this).attr("checked",true);
|
||
$(this.parentNode.parentNode).addClass("select");
|
||
}
|
||
);
|
||
}
|
||
|
||
function selectTableNone(table,className)
|
||
{
|
||
$("."+className,$("#"+table)).each(
|
||
function()
|
||
{
|
||
$(this).attr("checked",false);
|
||
$(this.parentNode.parentNode).removeClass("select");
|
||
}
|
||
);
|
||
}
|
||
|
||
function selectTableOther(table,className)
|
||
{
|
||
$("."+className,$("#"+table)).each(
|
||
function()
|
||
{
|
||
if($(this).attr("checked") == true)
|
||
{
|
||
$(this).attr("checked",false);
|
||
$(this.parentNode.parentNode).removeClass("select");
|
||
$(this.parentNode.parentNode).removeClass("hover");
|
||
}
|
||
else
|
||
{
|
||
$(this).attr("checked",true);
|
||
$(this.parentNode.parentNode).addClass("select");
|
||
}
|
||
}
|
||
);
|
||
}
|
||
|
||
function registerInputFocus(element)
|
||
{
|
||
$("input",element).focus
|
||
(
|
||
function()
|
||
{
|
||
e = $(this);
|
||
if(e.attr("type") == "text" || e.attr("type") == "password")
|
||
{
|
||
e.addClass("focus");
|
||
}
|
||
}
|
||
);
|
||
|
||
$("textarea.text",element).focus
|
||
(
|
||
function()
|
||
{
|
||
$(this).addClass("focus");
|
||
}
|
||
);
|
||
|
||
$("input",element).blur
|
||
(
|
||
function()
|
||
{
|
||
e = $(this);
|
||
if(e.attr("type") == "text" || e.attr("type") == "password")
|
||
{
|
||
e.removeClass("focus");
|
||
}
|
||
}
|
||
);
|
||
|
||
$("textarea",element).blur
|
||
(
|
||
function()
|
||
{
|
||
$(this).removeClass("focus");
|
||
}
|
||
);
|
||
|
||
$("span.button",element).mouseover
|
||
(
|
||
function()
|
||
{
|
||
$(this).addClass("focus");
|
||
}
|
||
);
|
||
|
||
$("span.button",element).mouseout
|
||
(
|
||
function()
|
||
{
|
||
$(this).removeClass("focus");
|
||
$(this).removeClass("click");
|
||
}
|
||
);
|
||
|
||
$("span.button",element).mousedown
|
||
(
|
||
function()
|
||
{
|
||
$(this).removeClass("click");
|
||
}
|
||
);
|
||
|
||
$("span.button",element).mouseup
|
||
(
|
||
function()
|
||
{
|
||
$(this).removeClass("click");
|
||
}
|
||
);
|
||
}
|
||
|
||
var confirmElement;
|
||
function magikeConfirm(el)
|
||
{
|
||
confirmElement = el;
|
||
|
||
div = $(document.createElement("div"));
|
||
p = $(document.createElement("p"));
|
||
p.text($(el).attr("msg"));
|
||
div.append(p);
|
||
|
||
magikeUI.createPopup({title: mgTruncate($(el).attr("msg"),20,'...'),center: true,block:true,
|
||
shadow:true,width: 300,height: 0,text:div,
|
||
ok:'OK',cancel:'Cancel',handle:magikeConfirmHandle});
|
||
}
|
||
|
||
function magikeConfirmHandle()
|
||
{
|
||
magikeLocation($(confirmElement).attr('rel'));
|
||
}
|
||
|
||
function mgTruncate(str,length,pre)
|
||
{
|
||
return str.length > length ? str.substr(0,length) + pre : str;
|
||
}
|
||
|
||
var submitConfirmElement;
|
||
function magikeSubmitConfirm(msg,el,action)
|
||
{
|
||
submitConfirmElement = el;
|
||
|
||
div = $(document.createElement("div"));
|
||
p = $(document.createElement("p"));
|
||
p.text(msg);
|
||
div.append(p);
|
||
|
||
if(action)
|
||
{
|
||
$('input[@name=do]').val(action);
|
||
}
|
||
|
||
magikeUI.createPopup({title: mgTruncate(msg,16,'...'),center: true,block:true,
|
||
shadow:true,width: 300,height: 0,text:div,
|
||
ok:'OK',cancel:'Cancel',handle:magikeSubmitConfirmHandle});
|
||
}
|
||
|
||
function magikeSubmitConfirmHandle()
|
||
{
|
||
if($('input:checked',$('#' + submitConfirmElement)).val())
|
||
{
|
||
document.getElementById(submitConfirmElement).submit();
|
||
}
|
||
else
|
||
{
|
||
$('.magikeShadow').remove();
|
||
$('.magikePopup').remove();
|
||
}
|
||
}
|
||
|
||
function magikeLocation(url)
|
||
{
|
||
setTimeout("window.location.href = '" + url + "'; ",0);
|
||
}
|
||
|
||
function magikeCreateSelect(item)
|
||
{
|
||
select = $(document.createElement("select"));
|
||
for(var i in item)
|
||
{
|
||
option = $(document.createElement("option"));
|
||
option.attr("value",item[i]);
|
||
option.html(i);
|
||
select.append(option);
|
||
}
|
||
|
||
return select;
|
||
}
|
||
|
||
MagikeUI = function()
|
||
{
|
||
|
||
}
|
||
|
||
MagikeUI.prototype = {
|
||
//实例化一个窗口
|
||
createPopup: function(args)
|
||
{
|
||
popupTitleText = args.title ? args.title : 'Magike Window';
|
||
//判断浏览器
|
||
var isIE = 0;
|
||
|
||
//创建窗口外框
|
||
var popupWindow = $(document.createElement("div"));
|
||
popupWindow.addClass("magikePopup");
|
||
popupWindow.released = true;
|
||
popupWindow.x = false;
|
||
popupWindow.y = false;
|
||
|
||
//是否有遮罩层
|
||
popupWindow.shadow = args.shadow ? args.shadow : false;
|
||
|
||
if(popupWindow.shadow)
|
||
{
|
||
this.createShadow();
|
||
}
|
||
|
||
//创建窗口阴影
|
||
var popupShadow = $(document.createElement("div"));
|
||
popupShadow.addClass("magikePopupShadow");
|
||
|
||
//创建窗口内部
|
||
var popupContent = $(document.createElement("div"));
|
||
popupContent.addClass("magikePopupContent");
|
||
popupWindow.append(popupContent);
|
||
popupWindow.append(popupShadow);
|
||
|
||
//创建窗口文本部分
|
||
var popupText = $(document.createElement("div"));
|
||
popupText.addClass("magikePopupText");
|
||
popupText.append(args.text ? args.text : null);
|
||
|
||
//创建窗口按钮部分
|
||
var popupButton = $(document.createElement("div"));
|
||
|
||
var okButton = $(document.createElement("span"));
|
||
okButton.addClass("button");
|
||
okButton.css("margin-left","10px");
|
||
okButton.text(args.ok ? args.ok : "OK");
|
||
|
||
var cancelButton = $(document.createElement("span"));
|
||
cancelButton.addClass("button");
|
||
cancelButton.css("float","right");
|
||
cancelButton.css("margin-right","10px");
|
||
cancelButton.text(args.cancel ? args.cancel : "Cancel");
|
||
|
||
popupButton.addClass("magikePopupButton");
|
||
popupButton.append(okButton);
|
||
popupButton.append(cancelButton);
|
||
|
||
if(args.width)
|
||
{
|
||
popupWindow.width(args.width+2);
|
||
popupShadow.width(args.width);
|
||
popupContent.width(args.width);
|
||
}
|
||
if(args.height)
|
||
{
|
||
popupWindow.height(args.height+2);
|
||
popupShadow.height(args.height);
|
||
popupContent.height(args.height);
|
||
popupText.height(args.height - 61);
|
||
popupButton.height(36);
|
||
}
|
||
|
||
//创建窗口标题
|
||
var popupTitle = $(document.createElement("div"));
|
||
popupTitle.addClass("magikePopupTitle");
|
||
popupTitle.html(popupTitleText);
|
||
|
||
popupWindow.block = args.block ? args.block : false;
|
||
if(!popupWindow.block)
|
||
{
|
||
popupTitle.css("cursor","move");
|
||
}
|
||
|
||
//创建窗口关闭按钮
|
||
var closeBar = $(document.createElement("span"));
|
||
closeBar.addClass("magikePopupClose");
|
||
popupTitle.append(closeBar);
|
||
popupContent.append(popupTitle);
|
||
popupContent.append(popupText);
|
||
popupContent.append(popupButton);
|
||
|
||
$(document.body).append(popupWindow);
|
||
|
||
if(!args.height)
|
||
{
|
||
resizeHeight = popupText.height() + 70;
|
||
popupWindow.height(resizeHeight+2);
|
||
popupShadow.height(resizeHeight);
|
||
popupContent.height(resizeHeight);
|
||
popupText.height(resizeHeight - 61);
|
||
popupButton.height(36);
|
||
}
|
||
|
||
if(args.center)
|
||
{
|
||
size = getPageSize();
|
||
pos = getScrollTop();
|
||
|
||
vleft = parseInt((size[0] - popupWindow.width())/2 + pos[0]);
|
||
vtop = parseInt((size[1] - popupWindow.height())/2 + pos[1]);
|
||
popupWindow.css({left:vleft + 'px',top:vtop + 'px'});
|
||
}
|
||
|
||
//增加事件监听
|
||
registerInputFocus(popupWindow);
|
||
|
||
if(!popupWindow.block)
|
||
{
|
||
popupTitle.mousedown(
|
||
function()
|
||
{
|
||
popupWindow.released = false;
|
||
popupShadow.hide();
|
||
}
|
||
);
|
||
|
||
popupWindow.mousedown(
|
||
function()
|
||
{
|
||
$('.magikePopup').css('z-index',995);
|
||
$('.magikePopupShadow').css('z-index',996);
|
||
$('.magikePopupContent').css('z-index',997);
|
||
popupWindow.css('z-index',998);
|
||
popupShadow.css('z-index',999);
|
||
popupContent.css('z-index',1000);
|
||
}
|
||
);
|
||
|
||
$(document).mouseup(
|
||
function()
|
||
{
|
||
popupWindow.released = true;
|
||
popupWindow.x = false;
|
||
popupWindow.y = false;
|
||
popupShadow.show();
|
||
}
|
||
);
|
||
|
||
popupTitle.mousemove(
|
||
function(e)
|
||
{
|
||
if(!popupWindow.released)
|
||
{
|
||
if(isIE ? e.button : !e.button)
|
||
{
|
||
if(!popupWindow.x && !popupWindow.y)
|
||
{
|
||
popupWindow.x = e.clientX;
|
||
popupWindow.y = e.clientY;
|
||
}
|
||
|
||
popupWindow.css('left',parseInt(popupWindow.css('left').replace('px',''))+(e.clientX - popupWindow.x)+'px');
|
||
popupWindow.css('top',parseInt(popupWindow.css('top').replace('px',''))+(e.clientY - popupWindow.y)+'px');
|
||
popupWindow.x = e.clientX;
|
||
popupWindow.y = e.clientY;
|
||
}
|
||
else
|
||
{
|
||
popupWindow.released = true;
|
||
}
|
||
}
|
||
}
|
||
);
|
||
|
||
$(document).mousemove(
|
||
function(e)
|
||
{
|
||
|
||
if(!popupWindow.released)
|
||
{
|
||
if(isIE ? e.button : !e.button)
|
||
{
|
||
if(!popupWindow.x && !popupWindow.y)
|
||
{
|
||
popupWindow.x = e.clientX;
|
||
popupWindow.y = e.clientY;
|
||
}
|
||
|
||
popupWindow.css('left',parseInt(popupWindow.css('left').replace('px',''))+(e.clientX - popupWindow.x)+'px');
|
||
popupWindow.css('top',parseInt(popupWindow.css('top').replace('px',''))+(e.clientY - popupWindow.y)+'px');
|
||
popupWindow.x = e.clientX;
|
||
popupWindow.y = e.clientY;
|
||
}
|
||
else
|
||
{
|
||
popupWindow.released = true;
|
||
}
|
||
}
|
||
}
|
||
);
|
||
}
|
||
|
||
$('.magikePopupClose',popupWindow).click(
|
||
function()
|
||
{
|
||
popupWindow.remove();
|
||
if(popupWindow.shadow)
|
||
{
|
||
$('.magikeShadow').remove();
|
||
}
|
||
}
|
||
);
|
||
|
||
cancelButton.click(
|
||
function()
|
||
{
|
||
popupWindow.remove();
|
||
if(popupWindow.shadow)
|
||
{
|
||
$('.magikeShadow').remove();
|
||
}
|
||
}
|
||
);
|
||
|
||
okButton.click(args.handle ? args.handle : function()
|
||
{
|
||
popupWindow.remove();
|
||
if(popupWindow.shadow)
|
||
{
|
||
$('.magikeShadow').remove();
|
||
}
|
||
});
|
||
},
|
||
|
||
//创建一个阴影
|
||
createShadow: function()
|
||
{
|
||
var shadow = $(document.createElement("div"));
|
||
shadow.addClass("magikeShadow");
|
||
shadow.css('width',document.documentElement.scrollWidth > document.documentElement.clientWidth ?
|
||
document.documentElement.scrollWidth : document.documentElement.clientWidth);
|
||
shadow.css('height',document.documentElement.scrollHeight > document.documentElement.clientHeight ?
|
||
document.documentElement.scrollHeight : document.documentElement.clientHeight);
|
||
$(document.body).append(shadow);
|
||
|
||
$(window).resize(
|
||
function()
|
||
{
|
||
shadow.css('width',document.documentElement.scrollWidth > document.documentElement.clientWidth ?
|
||
document.documentElement.scrollWidth : document.documentElement.clientWidth);
|
||
shadow.css('height',document.documentElement.scrollHeight > document.documentElement.clientHeight ?
|
||
document.documentElement.scrollHeight : document.documentElement.clientHeight);
|
||
}
|
||
);
|
||
}
|
||
};
|
||
|
||
var MagikeUI = MagikeUI;
|
||
var magikeUI = new MagikeUI();
|
||
|
||
function fixCssHack()
|
||
{
|
||
$("td").each
|
||
(
|
||
function()
|
||
{
|
||
if($(this).html() == "")
|
||
{
|
||
$(this).html(" ");
|
||
}
|
||
}
|
||
);
|
||
|
||
$(".message").fadeIn(1000);
|
||
$(".message").dblclick(function(){$(this).hide();});
|
||
$(".proc").click(function(){$(this).hide();});
|
||
|
||
$(window).unload(
|
||
function()
|
||
{
|
||
$('span.button').unbind();
|
||
$('textarea').unbind();
|
||
$('input').unbind();
|
||
$('tr').unbind();
|
||
}
|
||
);
|
||
}
|
||
|
||
var validateElements;
|
||
var showLoading;
|
||
function magikeValidator(url,mod)
|
||
{
|
||
validateElements = null;
|
||
$(".validate-word").html("");
|
||
showLoading = true;
|
||
|
||
if(typeof(tinyMCE) != "undefined")
|
||
{
|
||
tinyMCE.triggerSave();
|
||
}
|
||
|
||
s = $('.validate-me').serialize();
|
||
$.ajax({
|
||
type: 'POST',
|
||
url: url + '?mod=' + mod,
|
||
data: s,
|
||
cache: false,
|
||
dataType: "json",
|
||
success: function(js){
|
||
if(js != 0)
|
||
{
|
||
for(var i in js)
|
||
{
|
||
$("#" + i + "-word").html(js[i]);
|
||
}
|
||
$(".proc").fadeOut();
|
||
}
|
||
else
|
||
{
|
||
validateSuccess.apply(this);
|
||
}
|
||
showLoading = false;
|
||
}
|
||
});
|
||
}
|
||
|
||
$(document).ajaxStart(
|
||
function()
|
||
{
|
||
$(".proc").hide();
|
||
if(showLoading)
|
||
{
|
||
$(".proc").show();
|
||
}
|
||
}
|
||
);
|
||
|
||
/**输入框架自动完成beta
|
||
* Author:张炼
|
||
* Date:2007-8-17
|
||
**/
|
||
|
||
//自动完成绑定类
|
||
function AutoCompleter(textbox, url , boxclass, selectclass, unselectclass, hoverclass){
|
||
//得到输入框
|
||
this.textbox = $(textbox);
|
||
this.textbox.attr("autocomplete", "off");
|
||
this.list = new Array();
|
||
|
||
//样式的保存
|
||
this.boxclass = boxclass;
|
||
this.selectclass = selectclass;
|
||
this.unselectclass = unselectclass;
|
||
this.hoverclass = hoverclass;
|
||
|
||
//关键词选取容器
|
||
this.box = document.createElement("div");
|
||
|
||
//初始化请求地址
|
||
this.url = url;
|
||
|
||
|
||
if(!boxclass)
|
||
this.box.style.cssText = AutoCompleter.defaultBoxStyle;
|
||
else this.box.className = boxclass;
|
||
|
||
this.box.style.position = "absolute";
|
||
this.box.innerHTML = "Loading...";
|
||
this.hide();
|
||
this.textbox[0].parentNode.insertBefore(this.box, this.textbox[0]);
|
||
|
||
|
||
var _completer = this;
|
||
|
||
//对操作进行事件绑定
|
||
//按键的时候的事件,主要进行
|
||
this.box.onkeydown = function(e){
|
||
e = e ? e : event;
|
||
return _completer.keydown(e);
|
||
};
|
||
this.textbox.bind("keydown", this.box.onkeydown);
|
||
this.textbox.bind("keyup", function(e){
|
||
_completer.start(e);
|
||
});
|
||
|
||
if($.browser.opera) {
|
||
this.textbox.bind("keypress", function(e){return e.keyCode!=13 || this.visible == false;});
|
||
}
|
||
if (!this.textbox[0].setSelectionRange && this.textbox[0].createTextRange){
|
||
function getcate(){
|
||
this.focus();
|
||
var txb = this;
|
||
var s = txb.scrollTop;
|
||
|
||
var r = document.selection.createRange();
|
||
_completer.caterange = r.duplicate();
|
||
|
||
var t = txb.createTextRange();
|
||
t.collapse(true);
|
||
t.select();
|
||
|
||
var j = document.selection.createRange();
|
||
r.setEndPoint("StartToStart",j);
|
||
|
||
_completer.cateposition = r.text.replace(/\n/g, "").length;
|
||
|
||
r.collapse(false);
|
||
r.select();
|
||
txb.scrollTop = s;
|
||
}
|
||
this.textbox[0].getcate = getcate;
|
||
//this.textbox.bind("blur", getcate);
|
||
}
|
||
$(document).bind("click", function(e){
|
||
var tf = e.srcElement;
|
||
if(!tf) tf = e.target;
|
||
while(tf && tf != document.documentElement && tf != document.body){
|
||
if(tf == _completer.box || tf == _completer.textbox[0]) return;
|
||
tf = tf.parentNode;
|
||
}
|
||
_completer.hide();
|
||
});
|
||
}
|
||
AutoCompleter.spliters = ",, ";
|
||
//得到一个元素在页面上的绝对位置,p为想得到位置的元素,返回结果为Object{left:<int>, top:<int>},r为是否只求到其定位元素
|
||
AutoCompleter.getPos = function(tag, r){
|
||
var p = tag;
|
||
var res = {left:p.offsetLeft, top:p.offsetTop};
|
||
do{
|
||
var s = p.currentStyle ? p.currentStyle : getComputedStyle(p, null);
|
||
|
||
//如果只求到定位元素
|
||
if(r){
|
||
var position = s.position.toLowerCase();
|
||
if(position == "absolute" || position == "relative") break;
|
||
}
|
||
if(p != tag){
|
||
//加上相对位置
|
||
res.left += p.offsetLeft;
|
||
res.top += p.offsetTop;
|
||
|
||
if(0){
|
||
//加上边框宽度
|
||
var border = parseInt(s.borderTopWidth);
|
||
if(!isNaN(border)) res.top += border;
|
||
border = parseInt(s.borderLeftWidth);
|
||
if(!isNaN(border)) res.left += border;
|
||
}
|
||
}
|
||
p = p.offsetParent;
|
||
}while(p);
|
||
return res;
|
||
};
|
||
AutoCompleter.defaultBoxStyle = "border:1px solid #369;background:#fff;color:#000;cursor:pointer";
|
||
AutoCompleter.defaultUnSelectStyle = "padding:2px 10px";
|
||
AutoCompleter.defaultSelectStyle = "padding:2px 10px;background:#B8D6D6;color:#fff";
|
||
AutoCompleter.defaultHoverStyle = "padding:2px 10px;background:#B8D6D6";
|
||
AutoCompleter.prototype =
|
||
{
|
||
//得到当前光标位置
|
||
getindex: function(){
|
||
if(this.textbox[0].getcate){
|
||
this.textbox[0].getcate();
|
||
return this.cateposition;
|
||
}else{
|
||
if(this.textbox[0].setSelectionRange) return this.textbox[0].selectionEnd;
|
||
else return this.textbox.val().length;
|
||
}
|
||
},
|
||
|
||
setindex: function(i){
|
||
if(this.textbox[0].getcate){
|
||
var r = this.textbox[0].createTextRange();
|
||
r.collapse(true);
|
||
r.moveStart('character', i);
|
||
r.select();
|
||
}
|
||
else{
|
||
this.textbox[0].selectionEnd = i;
|
||
this.textbox[0].selectionStart = i;
|
||
}
|
||
},
|
||
|
||
//输入框键被按下之后发生
|
||
keydown: function(e){
|
||
if(e.ctrlKey){
|
||
if(e.keyCode == 74){
|
||
e.keyCode = 0;
|
||
this.start(e);
|
||
}
|
||
else return;
|
||
return false;
|
||
}
|
||
if(!this.visible) return;
|
||
if(e.keyCode == 38) this.up(e);
|
||
else if(e.keyCode == 40) this.down(e);
|
||
else if(e.keyCode == 13) {
|
||
if(!this.word) return;
|
||
this.select();
|
||
}
|
||
else return;
|
||
return false;
|
||
},
|
||
|
||
//往上选词
|
||
up: function(e){
|
||
var last = this.word ? this.list[this.word] : null;
|
||
if(!last || !last.previousSibling) this.focus(this.box.childNodes[this.box.childNodes.length - 1]);
|
||
else this.focus(last.previousSibling);
|
||
},
|
||
|
||
focus: function(k){
|
||
var last = this.word ? this.list[this.word] : null;
|
||
if(last){
|
||
if(!this.unselectclass) last.style.cssText = AutoCompleter.defaultUnSelectStyle;
|
||
else last.className = this.unselectclass;
|
||
}
|
||
if(k){
|
||
if(!this.selectclass) k.style.cssText = AutoCompleter.defaultSelectStyle;
|
||
else k.className = this.selectclass;
|
||
}
|
||
this.word = k.innerHTML;
|
||
},
|
||
|
||
select: function(){
|
||
this.hide();
|
||
this.key = this.word;
|
||
this.lastkey = this.word;
|
||
|
||
if(!this.word) return;
|
||
|
||
var v = this.textbox.val();
|
||
|
||
var r = this.getwordindex(v);
|
||
|
||
var scroll = this.textbox[0].scrollTop;
|
||
|
||
var bstr = v.substr(0, r.start) + this.word;
|
||
this.textbox.val(bstr + v.substr(r.end, v.length - r.end));
|
||
this.setindex(bstr.length);
|
||
|
||
this.textbox[0].scrollTop = scroll;
|
||
},
|
||
|
||
//往下选词
|
||
down: function(e){
|
||
var last = this.word ? this.list[this.word] : null;
|
||
if(!last || !last.nextSibling) this.focus(this.box.childNodes[0]);
|
||
else this.focus(last.nextSibling);
|
||
},
|
||
|
||
controlkeys: [38, 40, 13],
|
||
|
||
//在按键起来之后发生,开始自动完成
|
||
start: function(e){
|
||
for(var i = 0; i < this.controlkeys.length; ++i){
|
||
if(e.keyCode == this.controlkeys[i]) return;
|
||
}
|
||
this.key = this.getword();
|
||
//if(this.lastkey == this.key) return;
|
||
if(this.key == "") this.hide(e);
|
||
else this.show(e);
|
||
this.lastkey = this.key;
|
||
},
|
||
|
||
getword: function(e){
|
||
var v = this.textbox.val();
|
||
if( v == "" ) return v;
|
||
var r = this.getwordindex(v);
|
||
if(r.end <= r.start) return "";
|
||
return v.substring(r.start, r.end);
|
||
},
|
||
|
||
getwordindex: function(v){
|
||
var ci = this.getindex();
|
||
var as = AutoCompleter.spliters;
|
||
var r = {start: -1, end: v.length};
|
||
for(var i = 0; i < as.length; ++i) r.start = Math.max(v.lastIndexOf(as.charAt(i), ci - 1), r.start);
|
||
++r.start;
|
||
for(var i = 0; i < as.length; ++i){
|
||
var e = v.indexOf(as.charAt(i), ci);
|
||
if(e >= 0 && e < r.end) r.end = e;
|
||
}
|
||
return r;
|
||
},
|
||
|
||
//显示自动完成
|
||
show: function(e){
|
||
if(this.key != this.lastkey)
|
||
this.search(this.key, e);
|
||
else this.justshow();
|
||
},
|
||
|
||
justshow: function(){
|
||
if(!this.length) return;
|
||
this.visible = true;
|
||
var p = AutoCompleter.getPos(this.textbox[0]);
|
||
this.box.style.top = (p.top + this.textbox[0].offsetHeight) + "px";
|
||
this.box.style.left = p.left + "px";
|
||
this.box.style.display = "block";
|
||
},
|
||
|
||
search: function(k, e){
|
||
var _completer = this;
|
||
cacheList = _completer.serachInCache(k);
|
||
if(cacheList.length == 0)
|
||
{
|
||
$.ajax({
|
||
type: 'GET',
|
||
url: this.url,
|
||
data: "keywords=" + k,
|
||
cache: true,
|
||
dataType: "json",
|
||
success: function(json){
|
||
_completer.list = json;
|
||
_completer.reset(json);
|
||
}
|
||
});
|
||
}
|
||
else
|
||
{
|
||
_completer.reset(cacheList);
|
||
}
|
||
},
|
||
|
||
serachInCache: function(k){
|
||
result = new Array();
|
||
|
||
for(var i in this.list)
|
||
{
|
||
if(i.toLowerCase().indexOf(k.toLowerCase()) == 0)
|
||
{
|
||
result.push(i);
|
||
}
|
||
}
|
||
|
||
return result;
|
||
},
|
||
|
||
reset: function(arr){
|
||
this.length = 0;
|
||
this.list = {};
|
||
for(var i = 0; i < arr.length; ++i){
|
||
if(arr[i] == null || arr[i] == "") continue;
|
||
this.list[arr[i]] = arr[i];
|
||
++ this.length;
|
||
}
|
||
this.refresh();
|
||
this.justshow();
|
||
},
|
||
|
||
refresh: function(){
|
||
this.word = null;
|
||
|
||
if(!this.length) this.hide();
|
||
|
||
this.box.innerHTML = "";
|
||
|
||
var _completer = this;
|
||
for(var k in this.list){
|
||
if(k == "") continue;
|
||
var d = document.createElement("div");
|
||
d.innerHTML = k;
|
||
this.list[k] = d;
|
||
this.box.appendChild(d);
|
||
d.onclick = function(e){
|
||
_completer.focus(this);
|
||
_completer.select();
|
||
};
|
||
d.onmouseover = function(e){
|
||
if(this.innerHTML == _completer.word) return;
|
||
if(_completer.hoverclass) this.className = _completer.hoverclass;
|
||
else this.style.cssText = AutoCompleter.defaultHoverStyle;
|
||
};
|
||
d.onmouseout = function(e){
|
||
if(this.innerHTML == _completer.word) return;
|
||
if(!_completer.unselectclass) this.style.cssText = AutoCompleter.defaultUnSelectStyle;
|
||
else this.className = _completer.unselectclass;
|
||
};
|
||
d.onmouseout();
|
||
}
|
||
},
|
||
|
||
list: {},
|
||
|
||
hide: function(e){
|
||
this.visible = false;
|
||
this.box.style.display = "none";
|
||
}
|
||
}
|