/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */ /** * 用户登录操作 * * @fileOverview * @author $_EYOUMBR_COPYRIGHT_$ * @version $_EYOUMBR_VERSION_$ */ function Login() { // {{{ members var __this = this; /** * @type Object * 缩放的配置 */ var zoomCharOptions = { 'maxFontSize' : 16, 'miniFontSize' : 12, 'zoomSpeed': 1 }; /** * @type Int * * 缩放的偏移量 */ var zoomCharResize = 12; /** * @type Object * * 缩放建立的临时div */ var zoomCharTmpDiv = null; /** * @type int * 自动匹配显示的数目,如果为0则不限制 */ var autoCompleteNum = 10; /** * @type Object * @按键值 */ var KEY = { LEFT:37, UP:38, RIGHT:39, DOWN:40, PAGEUP:33, PAGEDOWN:34, RETURN:13, ESC:27, TAB:9 }; // }}} end members // {{{ functions // {{{ function init() /** * 初始化 * * @param void * @return void */ this.init = function() { if (document.getElementById('pop')) { document.getElementById('pop').style.display = 'none'; } //字符缩放 if (document.getElementById('user')) { _createContDiv(); _bindInput(); } if (document.getElementById('box')) { //读取cookie,画登录框的位置 var pos = getCookie('empos') - 0; var _t = (pos === 0 ? 'right' : 'left'); _doDrag(_t); //初始化登陆框的拖拽 _initDrag(); } if (document.getElementById('down')) { _initDown(); } } // }}} // {{{ function _bind() /** * 绑定 * * @param Object obj * @param String ev * @param Fucntino ev * @return void */ function _bind(node, ev, callback) { if (!node) return; var _callback = function(ev) { if (false === callback.apply(node, [ev])) { if (ev.preventDefault) { ev.preventDefault(); } return false; } } if (node.addEventListener) { node.addEventListener(ev, _callback, false); } else { node.attachEvent('on'+ev, _callback); } } // }}} // {{{ function _bindInput() /** * 绑定input * * @param void * @return void */ function _bindInput() { obj = document.getElementById('user'); //绑定字缩放 _bind(obj, 'keydown', _keyEvent); //绑定失去焦点 _bind(obj, 'blur', function(){ setTimeout(function(){ if (document.getElementById('pop')) { document.getElementById('pop').style.display = 'none'; } if (obj.empty != 1) { _zoomInputChar(); } }, 50); }); } // }}} // {{{ function _keyEvent() /** * 键盘事件处理 * * @param HtmlEvent event * * @return void; */ function _keyEvent(ev) { var e = window.event || ev; var keyCode = e.keyCode || e.which; var container = document.getElementById('pop'); switch(keyCode) { case KEY.TAB: case KEY.DOWN: if (container.style.display === 'none') return; _moveDown(); return false; break; case KEY.UP: if (container.style.display === 'none') return; _moveUp(); return false; break; case KEY.PAGEDOWN: if (container.style.display === 'none') return; _moveLast(); return false; break; case KEY.PAGEUP: if (container.style.display === 'none') return; _moveFirst(); return false; break; case KEY.LEFT: case KEY.RIGHT: break; case KEY.ESC: if (container.style.display === 'none') return; that.hide(true); return false; break; case KEY.RETURN: if (container.style.display === 'none') return; _fillItem(); return false; break; default: setTimeout(function(){ _zoomInputChar(); _getDomain(); }, 50); break; } }; // }}} // {{{ function _strTrim() /** * 去掉字符串两边的空白字符 * * @param {String} str 需要被处理的字符串 * return string 处理之后的字符串 */ function _strTrim(str) { str += ""; return str; return str.replace(/^\s*/, "").replace(/\s*$/, ""); } // }}} // {{{ function _htmlSpecialChars() /** * 把html特殊字符进行格式化 * 与php的同名函数规则相同 * * @param {String} str 要被处理的字符串 * @param {String} mode 处理方式 * "ENT_COMPAT" 只处理双引号,默认方式 * "ENT_QUOTES" 单引号和双引号*都*处理 * "ENT_NOQUOTES" 单引号和双引号都*不*处理 * * @returns {String} 处理之后的字符串 */ function _htmlSpecialChars(str, mode) { str = String(str).replace(/&/g, "&").replace(//g, ">"); switch (mode) { case "ENT_QUOTES": str = str.replace(/"/g, """).replace(/'/g, "'"); break; case "ENT_NOQUOTES": break; case "ENT_COMPAT": default: str = str.replace(/"/g, """); break; } return str; } // }}} // {{{ function _empty() /** * 清空元素所有的节点 * * @param max parentObj * @return max */ function _empty(parentObj) { if (!parentObj) { return false; } var c = parentObj.childNodes; var len = c.length; if (len < 1) { return parentObj; } for (var i = len - 1; i >= 0; i--) { if (c[i]) { parentObj.removeChild(c[i]); } } return parentObj; } // }}} // {{{ zoomInputChar 缩放用户名的字体大小 // {{{ function _createContDiv() /** * 创建内容div * * @param boolean isReset * @return void */ function _createContDiv() { if (zoomCharTmpDiv) { return false; } var input = document.getElementById('user'); //创建内容div var cDiv = document.createElement('div'); cDiv.style.position = 'absolute'; cDiv.style.left = '-1000px'; cDiv.style.top = '-1000px'; zoomCharTmpDiv = cDiv; cDiv.style.fontFamily = _getElementStyle(input, 'fontFamily', false); cDiv.style.fontWeight = _getElementStyle(input, 'fontWeight', false); document.body.appendChild(cDiv); input.style.fontSize = zoomCharOptions['maxFontSize'] + 'px'; } // }}} // {{{ function _zoomInputChar() /** * 缩放字体 * * @param void * @reutrn void */ function _zoomInputChar() { var inputElem = document.getElementById('user'); inputElem.empty = 0; var cDiv = zoomCharTmpDiv; cDiv.innerHTML = _strTrim(_htmlSpecialChars(inputElem.value)); var fSize = parseInt(inputElem.style.fontSize); cDiv.style.fontSize = fSize + 'px'; var cw = cDiv.offsetWidth; var tw = inputElem.offsetWidth - zoomCharResize; while(true) { if (cw > tw) { if (fSize == zoomCharOptions['miniFontSize']) { break; } var tmpSize = fSize - zoomCharOptions['zoomSpeed']; cDiv.style.fontSize = tmpSize + 'px'; if (cDiv.offsetWidth < tw) { fSize = tmpSize; break; } cw = cDiv.offsetWidth; fSize = tmpSize; } else { if (fSize == zoomCharOptions['maxFontSize']) { break; } var tmpSize = fSize + zoomCharOptions['zoomSpeed']; cDiv.style.fontSize = tmpSize + 'px'; if (cDiv.offsetWidth > tw) { break; } cw = cDiv.offsetWidth; fSize = tmpSize; } } if (inputElem.value == '') { fSize = zoomCharOptions['maxFontSize']; inputElem.empty = 1; } inputElem.style.fontSize = fSize + "px"; } // }}} // {{{ function _getElementStyle() /** * 获取元素的style * * @param obj obj * @param {} styleName * @param boolean isInt * @return res */ function _getElementStyle (obj, styleName, isInt) { isInt = (isInt == undefined ? false : isInt); if (window.getComputedStyle) { var cs = window.getComputedStyle(obj, null); } else { var cs = obj.currentStyle; } if (isInt) { return parseInt(cs[styleName]); } else { return cs[styleName]; } } // }}} // }}} // {{{ autoComplete 自动匹配 // {{{ function _getDomain() /** * 获取自动匹配的域 * * @param void * @return void */ function _getDomain() { var value = _strTrim(document.getElementById('user').value); var currentDomain = []; var len = domainList.length; for (var i=0; i 0 && len > autoCompleteNum) { len = autoCompleteNum; } for (var k=0; k' + val + ''; } popDiv.innerHTML = html; } // }}} // {{{ function _getSelectElement() /** * 获取选中的p * * @param void * @return void */ function _getSelectElement() { var ps = document.getElementById('pop').getElementsByTagName('p'); var len = ps.length; for (var i=0; i 0) { _selectedItem(ps[0]); } } // }}} // {{{ function _moveUp() /** * 移动到上一个项目 * * @param void * @return void */ function _moveUp() { var p = _getSelectElement(); if (p.previousSibling) { _selectedItem(p.previousSibling); } else { _moveLast(); } } // }}} // {{{ function _moveLast() /** * 移动到最后一个项目 * * @param void * @return void */ function _moveLast() { var p = document.getElementById('pop').getElementsByTagName('p'); var pl = p.length; if (pl > 0) { _selectedItem(p[pl-1]); } } // }}} // {{{ function _fillItem() /** * 在input中填充一个项目 * * @param domNode li * @return void */ function _fillItem(p) { if (!p) { p = _getSelectElement(); } if (!p) { return false; } var val = p.getAttribute('data'); document.getElementById('user').value = val; setTimeout(function() { document.getElementById('pop').style.display = 'none'; _zoomInputChar(); }, 50); } // }}} // }}} // {{{ class dragAndDrop /** * 拖拽类 * * @class */ function dragAndDrop() { // {{{ members var __this = this; var container = null; var dragObject = null; var mouseOffset = null; var target = null; var targetIndex = -1; var optionTarget = null; var zIndex = 9999; var zIndexAutoAdd = false; var mouseAt = {}; var distance = 1; var clickStartPositon = []; var willDragItem; var clickDown = false; var dragStarted = false; var enableDrag = true; var dragItemPos = []; var dragItems = []; //保存拖拽的目标对象 var dropTargets = []; //拖拽辅助对象 var dragHelper = null; //开始拖动触发 var onDragStart = null; //拖动中触发 var onDragStarting = null; //拖拽事件完成触发 var onDragStop = null; //拖拽放下触发 var onDropDown = null; //拖拽到目标上触发 var onDropOver = null; //从拖拽目标上离开触发 var onDropOut = null; var dragRange = null; // }}} members end // {{{ functions // {{{ function getMousePosition() /** * 获取鼠标的位置 * * @param object ev * * @return array [x,y]; */ this.getMousePosition = function (ev) { if (ev.pageX || ev.pageY) { return [ev.pageX, ev.pageY]; } else { return [ ev.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft), ev.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) ]; } } // }}} // {{{ function getPosition() /** * 获取元素的位置 * * @param object e * * @return array [x.y] */ this.getPosition = function (e) { if (e.getBoundingClientRect()) { if (e.tagName === 'BODY') { return [0, 0]; } var pos = e.getBoundingClientRect(); return [pos.left + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft), pos.top + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop)]; } var left = 0; var _top = 0; while (e.offsetParent) { left += e.offsetLeft; _top += e.offsetTop; e = e.offsetParent; } left += e.offsetLeft; _top += e.offsetTop; return [left, _top]; } // }}} // {{{ function mouseMove() /** * 鼠标拖动触发事件 * * @param object ev * * @return void */ this.mouseMove = function (ev) { if(!enableDrag) { return; } ev = ev || window.event; var mousePos = __this.getMousePosition(ev); if (!clickDown) { return; } if (false === dragStarted) { if (Math.max( Math.abs(mousePos[0] - clickStartPositon[0]), Math.abs(mousePos[1] - clickStartPositon[1])) < distance ) { return; } else { var item = willDragItem; dragStarted = true; mouseOffset = __this.getMouseOffset(item, ev); dragItemPos = __this.getPosition(item); if (typeof onDragStart === 'function') { onDragStart(ev, item); } if (typeof(dragHelper) === 'function') { dragObject = dragHelper(item); } else if (dragHelper === 'clone') { dragObject = item.cloneNode(true); item.parentNode.appendChild(dragObject); } else { dragObject = item; } //添加要drop的目标 if (typeof(optionTarget) === 'function') { dropTargets = optionTarget(); } if (zIndexAutoAdd) { zIndex++; } dragObject.style.position = 'absolute'; dragObject.style.zIndex = zIndex; willDragItem = null; } } if (!dragObject) { return; } if (mouseAt.left !== undefined) { mouseOffset[0] = mouseAt.left - 0; } else if (mouseAt.right !== undefined) { mouseOffset[0] = dragObject.offsetWidth - mouseAt.right; } if (mouseAt.top !== undefined) { mouseOffset[1] = mouseAt.top - 0; } else if (mouseAt.bottom !== undefined) { mouseOffset[1] = dragObject.offsetHeight - mouseAt.bottom; } if (typeof(dragRange) === 'function') { var range = dragRange(dragItemPos, [mousePos[0] - mouseOffset[0], mousePos[1] - mouseOffset[1]], dragObject); dragObject.style.top = range[1] + 'px'; dragObject.style.left = range[0] + 'px'; } else { dragObject.style.top = mousePos[1] - mouseOffset[1] + 'px'; dragObject.style.left = mousePos[0] - mouseOffset[0] + 'px'; } //解决滚动条问题 /* var dragItemPos2 = __this.getPosition(dragObject); var x = dragItemPos2[0]; var y = dragItemPos2[1]; var X = x + dragObject.offsetWidth; var Y = y + dragObject.offsetHeight; var sl = document.documentElement.scrollLeft === 0 ? document.body.scrollLeft : document.documentElement.scrollLeft; var st = document.documentElement.scrollTop === 0 ? document.body.scrollTop : document.documentElement.scrollTop; if (x <= sl) { window.scrollBy(-10, 0); } else if (X >= document.body.offsetWidth + sl) { window.scrollBy(10, 0); } if (y <= st) { window.scrollBy(0, -10); } else if (Y >= document.body.offsetHeight + st) { window.scrollBy(0, 10); } */ if (typeof onDragStarting === 'function') { onDragStarting(ev, dragObject); } //移动过成中 寻找目标 onDropOver, onDropOut var l = dropTargets.length; var findme = false; var lastTargetIndex = targetIndex; target = null; targetIndex = null; var dragPos = __this.getPosition(dragObject); var dragWidth = parseInt(dragObject.offsetWidth); var dragHeight = parseInt(dragObject.offsetHeight); for (var i=0; i targPos[0]) && (mousePos[0] < (targPos[0] + targWidth)) && (mousePos[1] > targPos[1]) && (mousePos[1] < (targPos[1] + targHeight)) ) { */ if (false === findme && ( !(dragPos[0] > targPos[0] + targWidth || dragPos[0] + dragWidth < targPos[0]) && !(dragPos[1] > targPos[1] + targHeight || dragPos[1] + dragHeight < targPos[1]) ) && //上面是两个有交集,下面判断x轴超过一半入在目标内 (Math.min(targPos[0]+targWidth, dragPos[0] + dragWidth) - Math.max(targPos[0], dragPos[0]) > dragWidth/2) ) { findme = true; target = curTarget; targetIndex = i; if (typeof onDropOver === 'function') { onDropOver(ev, target, dragObject); } } if (i === lastTargetIndex && targetIndex !== lastTargetIndex) { if (typeof onDropOut === 'function') { onDropOut(ev, curTarget, dragObject); } } } return false; } // }}} // {{{ function mouseUp() /** * 鼠标放下触发 * * @param object ev * * @return void */ this.mouseUp = function (ev) { clickDown = false; dragStarted = false; //说明在拖动状态 if(!dragObject || !enableDrag) { return; } if (typeof onDragStop === 'function') { onDragStop(ev, target); } //找到target; if (target !== null) { if (typeof onDropDown === 'function') { onDropDown(ev, target, dragObject); } if (typeof onDropOut === 'function') { onDropOut(ev, target, dragObject); } } //不是拖动原来的节点,则删除 if (dragHelper !== 'self') { dragObject.parentNode.removeChild(dragObject); } dragObject = null; target = null; targetIndex = -1; } // }}} // {{{ function setDragable() /** * 绑定拖拽事件到DOM对象 * * @param mixd item string dom的Id | object dom对象 * @param handle item string dom的Id | object dom对象 点击拖动生效的部分 * * @return void */ this.setDragable = function (item, handle) { if(!item) return; if (typeof handle === 'string' && document.getElementById(handle)) { handle = document.getElementById(handle); } else if (typeof handle !== 'object') { handle = item; } dragItems.push([item, handle]); handle.onmousedown = function(ev) { if(!enableDrag) { return; } ev = ev || window.event; clickStartPositon = __this.getMousePosition(ev); willDragItem = item; dragStarted = false; clickDown = true; if (document.all) { ev.cancelBubble = true; } else { ev.preventDefault(); } return false; } } // }}} // {{{ function unsetDragable() /** * 取消dom对象的事件绑定 * * @param mixd item string dom的Id | object dom对象 * @param handle item string dom的Id | object dom对象 点击拖动生效的部分 * * @return void */ this.unsetDragable = function (item, handle) { if(!item) return; if (typeof handle === 'string' && document.getElementById(handle)) { handle = document.getElementById(handle); } else if (typeof handle !== 'object') { handle = item; } handle.onmousedown = null; } // }}} // {{{ function getMouseOffset() /** * 获取鼠标相对于dom对象的位置 * * @param object target dom对象 * @param object ev event对象 * * @return array [x,y] */ this.getMouseOffset = function(target, ev) { ev = ev || window.event; var docPos = this.getPosition(target); var mousePos = __this.getMousePosition(ev); return [mousePos[0] - docPos[0], mousePos[1] - docPos[1]]; } // }}} // {{{ function init() /** * 初始化操作 * * @param object options {container, target, dragStarting, dragStart, dragStop, dropOut, dragStop, dropOver, zIndexAutoAdd, zIndex, mouseAt, distance} * * @return void */ this.init = function (options) { //设置容器 if (options.container) { if (typeof options.container === 'string') { if (!document.getElementById(options.container)) { container = document.body; } else { container = document.getElementById(options.container); } } else if (typeof options.container === 'object') { container = options.container; } } else { container = document.body; } //添加要drop的目标 if (typeof(options.target) === 'object' && options.target.length) { var dt = options.target; var l = dt.length; for (var i=0; i 0) { distance = options.distance; } //绑定容器中鼠标事件 if (document.attachEvent) { container.attachEvent('onmousemove', this.mouseMove); container.attachEvent('onmouseup', this.mouseUp); } else { container.addEventListener('mousemove', this.mouseMove, false); container.addEventListener('mouseup', this.mouseUp, false); } this.setEnabled(true); } // }}} // {{{ function addDropTarget() /** * 添加要拖动的目标 * * @param object dropTarget 目标DOM对象 * * @return void */ this.addDropTarget = function(dropTarget) { dropTargets.push(dropTarget); } // }}} // {{{ function setEnabled() /** * 设置是否能拖动 * * @param boolean flag true 可以拖动 | false 不可拖动 * * @return void */ this.setEnabled = function(flag) { enableDrag = !!flag; } // }}} // {{{ function destroy() /** * 取消拖动资源 * * @param void * * @return void */ this.destroy = function() { if (document.detachEvent) { container.detachEvent('onmousemove', this.mouseMove); container.detachEvent('onmouseup', this.mouseUp); } else { container.removeEventListener('mousemove', this.mouseMove, false); container.removeEventListener('mouseup', this.mouseUp, false); } var item; while (item = dragItems.shift()) { this.unsetDragable(item[0], item[1]); } this.setEnabled(false); } // }}} // }}} functions end } // }}} dragAndDrop end // {{{ dragAndDrop 拖动 // {{{ function _initDrag() /** * 初始化拖动 * * @param void * @return void */ function _initDrag() { var dragObj = new dragAndDrop(); var div = document.getElementById('box'); dragObj.setDragable(div, 'dragbar'); dragObj.init({ container: document, target: [document.getElementById('drag_target')], distance: 5, helper: function(node) { //防止拖动时选中文本 if (window.getSelection) { window.getSelection().removeAllRanges(); } else { document.selection.empty(); } //创建拖动节点 var _div_node = node.cloneNode(true); document.body.appendChild(_div_node); if ('opacity' in _div_node.style) { _div_node.style.opacity = '0.5'; } else { _div_node.style.filter = "Alpha(Opacity=50)"; } return _div_node; }, dropOver: function(ev, tf, draged) { tf.style.border = "dotted 3px #f60"; }, dropOut: function(ev, tf, draged) { tf.style.border = "dotted 1px #000"; }, dragRange: function(o,n,item) { var x = n[0]; var y = n[1]; var X = document.body.offsetWidth + document.documentElement.scrollLeft - item.offsetWidth; var Y = document.body.offsetHeight + document.documentElement.scrollTop - item.offsetHeight; if (x <= 0) { x = 0; } else if (x >= X) { x = X; } if (y <= 0) { y = 0; } else if (y >= Y) { y = Y; } return [x, y]; }, dragStart : function(ev) { document.getElementById('drag_target').style.display = 'block'; }, dragStop: function(ev, tf) { document.getElementById('drag_target').style.display = 'none'; }, dropDown: function(ev, tf, draged) { var boxDiv = document.getElementById('box'); var left = _getElementStyle(boxDiv, 'left', true); var _type = (left != 60 ? 'left' : 'right'); _doDrag(_type); } }); } // }}} // {{{ function _doDrag() /** * 执行drag * * @param String type * @return void */ function _doDrag(type) { if (!type) { type = 'right' } var boxDiv = document.getElementById('box'); var downDiv = document.getElementById('down'); var tarDiv = document.getElementById('drag_target'); var divf = document.getElementById('f'); if (type == 'left') { boxDiv.style.right = 'auto'; boxDiv.style.left = '60px'; if (downDiv) { downDiv.style.left = 'auto'; downDiv.style.right = '60px'; } tarDiv.style.left = 'auto'; tarDiv.style.right = '60px'; divf.style.left = 'auto'; divf.style.right = '60px'; setCookie('empos', 1); } else { boxDiv.style.left = 'auto'; boxDiv.style.right = '60px'; if (downDiv) { downDiv.style.right = 'auto'; downDiv.style.left = '60px'; } tarDiv.style.right = 'auto'; tarDiv.style.left = '60px'; divf.style.right = 'auto'; divf.style.left = '60px'; setCookie('empos', 0); } } // }}} // }}} // {{{ 画下载的内容 // {{{ function _initDown() /** * 初始化下载 * @param void * @return void */ function _initDown() { lastDownTab = ''; var tab = document.getElementById('down_tab'); _empty(tab); var tabItems = document.getElementById('down_tab_items'); _empty(tabItems); _drawDown(); } // }}} // }}} // }}} end functions }