function Stack () {
var items = [];
this .push = function (element) {
items.push(element);
};
this .pop = function () {
return items.pop();
};
this .peek = function () {
return items[items.length - 1 ];
};
this .isEmpty = function () {
return items.length === 0 ;
};
this .size = function () {
return items.length;
};
this .clear = function () {
items = [];
};
this .print = function () {
console.log(items.toString());
};
}
function Queue () {
var items = [];
this .enqueue = function (element) {
items.push(element);
}
this .dequeue = function () {
return items.shift();
}
this .front = function () {
return items[0 ];
}
this .isEmpty = function () {
return items.length === 0 ;
}
this .clear = function () {
items = [];
}
this .size = function () {
return items.length;
}
this .print = function () {
console.log(items.toString());
}
}
var inherit = (function () {
var F = function () { };
return function (Child, Parent) {
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;
Child.prototype.uber = Parent.prototype;
}
})();
function deepClone (original, target) {
var target = target || {},
toStr = Object .prototype.toString,
arrStr = '[object Array]' ;
for (var prop in original){
if (original.hasOwnProperty(prop)){
if (typeof original[prop] === 'object' ){
target[prop] = (toStr.call(original[prop]) === arrStr) ? [] : {};
deepClone(original[prop], target[prop]);
}else {
target[prop] = original[prop];
}
}
}
return target;
}
Array .prototype.unique = function () {
var obj = {},
arr = [],
len = this .length;
for (var i = 0 ; i < len; i++){
if (!obj[this [i]]){
obj[this [i]] = true ;
arr.push(this [i]);
}
}
return arr;
}
function classOf (o) {
if (o === null ) return "Null" ;
if (o === undefined ) return "Undefined" ;
return Object .prototype.toString.call(o).slice(8 ,-1 );
}
Element.prototype.eleIndex = function () {
var index = 0 ,
node = this ;
while (node = node.previousSibling){
if (node.nodeType == 1 ){
index++;
}
}
return index;
}
Element.prototype.nthParentEle = function (n) {
var node = this ,
n = n || 0 ;
while (node && n--) {
node = node.parentElement;
}
return node;
}
Element.prototype.nthSiblingEle = function (n) {
var node = this ;
while (node && n) {
if (n > 0 ){
if (node.nextElementSibling){
node = node.nextElementSibling;
}else {
for (node = node.nextSibling; node && node.nodeType !== 1 ; node = node.nextSibling);
}
n--;
}else {
if (node.previousElementSibling){
node = node.previousElementSibling;
}else {
for (node = node.previousSibling; node && node.nodeType !== 1 ; node = node.previousSibling);
}
n++;
}
}
return node;
}
Element.prototype.insertAfter = function (targetNode, afterNode) {
var siblingNode = afterNode.nextElementSibling;
if (siblingNode) {
this .insertBefore(targetNode,siblingNode);
} else {
this .appendChild(targetNode);
}
return targetNode;
}
Element.prototype.remove = function () {
this .parentElement.removeChild(this );
}
Element.prototype.revChild = function () {
var child = this .children,
len = child.length;
for (var i = len - 2 ; i >= 0 ; i--){
this .appendChild(child[i]);
}
return this ;
}
function getScrollOffset () {
if (window.pageXOffset){
return {
x: window.pageXOffset,
y: window.pageYOffset
}
}else {
return {
x: document.body.scrollLeft + document.documentElement.scrollLeft,
y: document.body.scrollTop + document.documentElement.scrollTop
}
}
}
function getViewportOffset () {
if (window.innerWidth){
return {
w: window.innerWidth,
h: window.innerHeight
}
}else if (document.compatMode === "CSS1Compat" ){
return {
w: document.documentElement.clientWidth,
h: document.documentElement.clientHeight
}
}else {
return {
w: document.body.clientWidth,
h: document.body.clientHeight
}
}
}
Element.prototype.getCoord = function () {
var coordX = 0 ,
coordY = 0 ,
docEle = this ;
while (docEle){
coordX += docEle.offsetLeft;
coordY += docEle.offsetTop;
docEle = docEle.offsetParent;
}
return {
x: coordX,
y: coordY
}
};
//获取相对文档的距离
var X = this.getBoundingClientRect ().left +document.documentElement .scrollLeft
var Y =this.getBoundingClientRect ().top +document.documentElement .scrollTop
function getStyle (ele, style) {
if (window.getComputedStyle){
return window.getComputedStyle(ele,null )[style];
}else {
return ele.currentStyle[style];
}
}
function addEvent (elem, type, handler) {
if (elem.addEventListener){
elem.addEventListener(type, handler, false );
}else if (elem.attachEvent){
elem['temp' + type + handler] = handler;
elem['temp' + type] = function () {
elem['temp' + type + handler].call(elem);
}
elem.attachEvent('on' + type, elem['temp' + type]);
}else {
elem['on' + type] = handler;
}
}
function removeEvent (elem, type, handler) {
if (elem.removeEventListener){
elem.removeEventListener(type, handler, false );
}else if (elem.detachEvent){
elem.detachEvent('on' + type, elem['temp' + type]);
}else {
elem['on' + type] = null ;
}
}
function stopBubble (event) {
if (event.stopPropagation){
event.stopPropagation();
}else {
event.cancelBubble = true ;
}
}
function cancelHandler (event) {
if (event.preventDefault){
event.preventDefault();
}else {
event.returnValue = false ;
}
}
function drag (elem) {
var disX;
var disY;
addEvent(elem,"mousedown" ,function (e) {
var event = e || window.event;
disX = event.clientX - parseInt (getStyle(this ,"left" ));
disY = event.clientY - parseInt (getStyle(this ,"top" ));
addEvent(document,"mousemove" ,mouseMove);
addEvent(document,"mouseup" ,mouseUp);
});
function mouseMove (e) {
var event = e || window.event;
elem.style.left = event.pageX - disX + 'px' ;
elem.style.top = event.pageY - disY + 'px' ;
}
function mouseUp () {
removeEvent(document,"mousemove" ,mouseMove);
removeEvent(document,"mouseup" ,mouseUp);
}
}
function startMove (elem, json, func) {
clearInterval(elem.timer);
var iSpeed;
var iCur;
var bStop;
elem.timer = setInterval(function () {
bStop = true ;
for (var attr in json){
iCur = attr === 'opacity' ? parseFloat (getStyle(elem,attr)) * 100 : parseInt (getStyle(elem,attr));
iSpeed = attr === 'opacity' ? (parseFloat (json[attr])* 100 - iCur) / 7 : (parseInt (json[attr]) - iCur) / 7 ;
iSpeed = iSpeed > 0 ? Math .ceil(iSpeed) : Math .floor(iSpeed);
elem.style[attr] = attr === "opacity" ? (iCur + iSpeed) / 100 : iCur + iSpeed + 'px' ;
if (iCur !== (attr === 'opacity' ? parseFloat (json[attr]) * 100 : parseInt (json[attr]))){
bStop = false ;
}
}
if (bStop){
clearInterval(elem.timer);
if (func){
func();
}
}
},30 );
}
function scriptLoaded (url, callback) {
var script = document.createElement('script' );
script.type = "text/javascript" ;
if (script.readyState){
script.onreadystatechange = function () {
if (script.readyState == "complete" || script.readyState == "loaded" ){
callback();
script.onreadystatechange = null ;
}
}
}else {
script.onload = function () {
script.onload = null ;
callback();
}
}
script.src = url;
document.head.appendChild(script);
}
Document.prototype.getByClassName = function (target) {
var allEle = document.getElementsByTagName('*' ),
len = allEle.length,
arr = [],
classArr = [],
classArrLen;
for (var i = 0 ; i < len; i++) {
classArr = allEle[i].className.myTrim().splice(' ' );
classArrLen = classArr.length;
for (var j = 0 ; j < classArrLen; j++){
if (classArr[j] === target){
arr.push(allEle[i]);
break ;
}
}
}
return arr;
}
String .prototype.myTrim = function () {
var reg = /^\s*|\s*$/ ;
return this .replace(reg,'' );
}
String .prototype.trim=function () {
return this .replace(/(^\s*)|(\s*$)/g , "" );
}
String .prototype.ltrim=function () {
return this .replace(/(^\s*)/g ,"" );
}
String .prototype.rtrim=function () {
return this .replace(/(\s*$)/g ,"" );
}
function addLoadEvent (func) {
var oldLoad=window.onload
if (typeof window.onload!='function' ){
window.onload=func
}else {
window.onload=function () {
oldLoad()
func()
}
}
}