﻿// JScript 文件
//namespace -> MQ (when the document was done)


//如果使用多次addLoadEvent方法 最后一次使用会覆盖前面所有的addLoadEvent方法的内容
(function(){

//The primary namespace object
//type {Object}
//alias ADS

if(!window['ADS']){
    window['ADS']={};
}


/**
 * Checks to see if the current browser is compatible with the entire library
 */
function isCompatible(other) {
    // Use capability detection to check requirements
    if( other===false 
        || !Array.prototype.push
        || !Object.hasOwnProperty
        || !document.createElement
        || !document.getElementsByTagName
        ) {
        alert('TR- if you see this message isCompatible is failing incorrectly.');
        return false;
    }
    return true;
}
window['ADS']['isCompatible'] = isCompatible;



function $(){
    var elements=new Array();
    for(var i=0;i<arguments.length;i++){
        var element=arguments[i];
        if(typeof element=='string'){
            element=document.getElementById(element);
        }
        if(arguments.length==1){
            return element;
        }
        elements.push(element);
    }
    return elements;
};
window['ADS']['$']=$;



window['ADS']['node'] = {
    ELEMENT_NODE                : 1,
    ATTRIBUTE_NODE              : 2,
    TEXT_NODE                   : 3,
    CDATA_SECTION_NODE          : 4,
    ENTITY_REFERENCE_NODE       : 5,
    ENTITY_NODE                 : 6,
    PROCESSING_INSTRUCTION_NODE : 7,
    COMMENT_NODE                : 8,
    DOCUMENT_NODE               : 9,
    DOCUMENT_TYPE_NODE          : 10,
    DOCUMENT_FRAGMENT_NODE      : 11,
    NOTATION_NODE               : 12
};



//重新绑定函数的对象
function bindFunction(obj, func) {
    return function() {
        func.apply(obj,arguments);    
    };
};
window['ADS']['bindFunction'] = bindFunction;



//遍历html文档中全部节点
function walkTheDOMRecursive(func,node,depth,returnedFromParent) {
    var root = node || window.document;
    returnedFromParent = func.call(root,depth++,returnedFromParent);
    node = root.firstChild;
    while(node) {
        walkTheDOMRecursive(func,node,depth,returnedFromParent);
        node = node.nextSibling;
    }
};
window['ADS']['walkTheDOMRecursive'] = walkTheDOMRecursive;



//获取相同class的节点
function getElementsByClassName(className, tag, parent){
    parent = parent || document;
    if(!(parent = $(parent))) return false;
    
    // Locate all the matching tags
    var allTags = (tag == "*" && parent.all) ? parent.all : parent.getElementsByTagName(tag);
    var matchingElements = new Array();
    
    // Create a regular expression to determine if the className is correct
    className = className.replace(/\-/g, "\\-");
    var regex = new RegExp("(^|\\s)" + className + "(\\s|$)");
    
    var element;
    // Check each element
    for(var i=0; i<allTags.length; i++){
        element = allTags[i];
        if(regex.test(element.className)){
            matchingElements.push(element);
        }
    }
    
    // Return any matching elements
    return matchingElements;
};
window['ADS']['getElementsByClassName'] = getElementsByClassName;



//添加事件
function addEvent(node,type,listener){
    if(!isCompatible()){ return false };
    if(!(node=$(node))) return false;
    
    if(node.addEventListener){
        //W3C method
        node.addEventListener(type,listener,false);
        return true;
    } else if(node.attachEvent) {
        //MSIE method
        node['e'+type+listener]=listener;
        node[type+listener]=function(){node['e'+type+listener](window.event);}
        node.attachEvent('on'+type,node[type+listener]);
        return true;
    }
    
    // didn't have either so return false
    return false;
};
window['ADS']['addEvent']=addEvent;



function removeEvent(node,type,listener){
    if(!(node=$(node))) return false;
    if(node.removeEventListener){
        node.removeEventListener(type,listener,false);
        return true;
    } else if(node.detachEvent){
        node.detachEvent('on'+type,node[type+listener]);
        node[type+listener]=null;
        return true;
    }
    return false;
};
window['ADS']['removeEvent']=removeEvent;



//addLoadEvent   此方法目的为 当页面中包含一些大文件的内容时 如图片 
//可以在图片没有加载完成时 执行load事件中的事件侦听器
function addLoadEvent(loadEvent,waitForImages){
    if(!isCompatible()) return false;
    
    if(waitForImages){
        return addEvent(window,'load',loadEvent);
    }
    
    var init=function(){
        if(arguments.callee.done) return;
        arguments.callee.done=true;
        loadEvent.apply(document,arguments);
    };
    
    //for W3C
    if(document.addEventListener){
        document.addEventListener('DOMContentLoaded',init,false);
    }
    
    //for safari,use setInterval()
    if(/WebKit/i.test(navigator.userAgent)){
        var _timer=setInterval(function(){
            if(/loaded|complete/.test(document.readyState)){
                clearInterval(_timer);
                init();
            }
        },10);
    }
    
    //for IE
    /*@cc_on @*/
    /*@if (@_win32)
    document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
    var script=document.getElementById("__ie_onload");
    script.onreadystatechange=function(){
        if(this.readyState=="complete"){
            init();
        }
    };
    /*@end @*/
    return true;
}
window['ADS']['addLoadEvent']=addLoadEvent;



//获取事件对象
function getEventObject(W3CEvent){
    return W3CEvent||window.event;
}
window['ADS']['getEventObject']=getEventObject;



//阻止默认事件
function preventDefault(eventObject) {
    eventObject = eventObject || getEventObject(eventObject);
    if(eventObject.preventDefault) {
        eventObject.preventDefault();
    } else {
        eventObject.returnValue = false;
    }
}
window['ADS']['preventDefault'] = preventDefault;



//取得发生事件的目标元素
function getTarget(eventObject){
    eventObject = eventObject || getEventObject(eventObject);
    //for W3C or MSIE
    var target = eventObject.target || eventObject.srcElement;
    //for Safari
    if(target.nodeType == ADS.node.TEXT_NODE){
        target = node.parentNode;
    }
    return target;
}
window['ADS']['getTarget'] = getTarget;



//获得单击了哪一个鼠标键
function getMouseButton(eventObject) {
    eventObject = eventObject || getEventObject(eventObject);
    // Initialize an object wit the appropriate properties
    var buttons = {
        'left':false,
        'middle':false,
        'right':false
    };
    // Check the toString value of the eventObject
    // W3C Dom object have a toString method and in this case it
    // should be MouseEvent
    if(eventObject.toString && eventObject.toString().indexOf('MouseEvent') != -1) {
        // W3C Method
        switch(eventObject.button) {
            case 0: buttons.left = true; break;
            case 1: buttons.middle = true; break;
            case 2: buttons.right = true; break;
            default: break;
        }
    } else if(eventObject.button) {
        // MSIE method
        switch(eventObject.button) {
            case 1: buttons.left = true; break;
            case 2: buttons.right = true; break;
            case 3:
                buttons.left = true;
                buttons.right = true;
            break;
            case 4: buttons.middle = true; break;
            case 5:
                buttons.left = true;
                buttons.middle = true;
            break;
            case 6:
                buttons.middle = true;
                buttons.right = true;
            break;
            case 7:
                buttons.left = true;
                buttons.middle = true;
                buttons.right = true;
            break;
            default: break;
        }
    } else {
        return false;
    }
    return buttons;

}
window['ADS']['getMouseButton'] = getMouseButton;



//获取鼠标坐标
function getPointerPositionInDocument(eventObject){
    eventObject=eventObject||getEventObject(eventObject);
    
    var x=eventObject.pageX||(eventObject.clientX+(document.documentElement.scrollLeft||document.body.scrollLeft));
    
    var y=eventObject.pageY||(eventObject.clientY+(document.documentElement.scrollTop||document.body.scrollTop));
    
    //现在x和y中包含着鼠标相对于文档原点的坐标
    return {'x':x,'y':y};
}
window['ADS']['getPointerPositionInDocument']=getPointerPositionInDocument;



//获取键盘事件对应的值
function getKeyPressed(eventObject){
    eventObject=eventObject||getEventObject(eventObject);
    
    var code=eventObject.keyCode;
    var value=String.fromCharCode(code);
    return {'code':code,'value':value};
}
window['ADS']['getKeyPressed']=getKeyPressed;



//把连接字符（-）去掉并大写紧跟他的字母
function camelize(s) {
    return s.replace(/-(\w)/g, function (strMatch, p1){
        return p1.toUpperCase();
    });
}
window['ADS']['camelize'] = camelize;

function uncamelize(s, sep) {
    sep = sep || '-';
    return s.replace(/([a-z])([A-Z])/g, function (strMatch, p1, p2){
        return p1 + sep + p2.toLowerCase();
    });
}
window['ADS']['camelize'] = camelize;


//通过id修改单个元素的样式
function setStyleById(element,styles){
    if(!(element = $(element))) return false;
    for(property in styles){
        if(!styles.hasOwnProperty(property)) continue;
        
        if(element.style.setProperty){
            // DOM2样式规范方法
            element.style.setProperty(uncamelize(property,'-'),styles[property],null);
        } else {
            // 备用方法
            element.style[camelize(property)]=styles[property];
        }
    }
    return true;
}
window['ADS']['setStyle'] = setStyleById;
window['ADS']['setStyleById'] = setStyleById;



//通过类名修改多个元素的样式
function setStylesByClassName(parent,tag,className,styles){
    if(!(parent=$(parent))) return false;
    var elements=getElementsByClassName(className,tag,parent);
    for(var e = 0;e<elements.length;e++){
        setStyleById(elements[e],styles);
    }
    return true;
}
window['ADS']['setStylesByClassName']=setStylesByClassName;



//通过标签名修改多个元素的样式
function setStylesByTagName(tagname,parent,styles){
    parent=$(parent)||document;
    var elements = parent.getElementsByTagName(tagname);
    for(var e=0;e<elements.length;e++){
        setStyleById(elements[e],styles);
    }
}
window['ADS']['setStylesByTagName']=setStylesByTagName;



//取得包含元素类名的数组
function getClassNames(element){
    if(!(element=$(element))) return false;
    //用一个空格替换多个空格
    //然后基于空格分割类名
//！！！原句    return element.className.replace(/\s+/,' ').split(' ');！！！
    return element.className.split('__');
};
window['ADS']['getClassNames']=getClassNames;



//检查元素中是否存在某个类
function hasClassName(element,className){
    if(!(element=$(element))) return false;
    var classes=getClassNames(element);
    for(var i=0;i<classes.length;i++){
        //检测classNames是否匹配，如果是则返回true
        if(classes[i]===className){ return true }
    }
    return false;
};
window['ADS']['hasClassName']=hasClassName;



//为元素添加类
function addClassName(element,className){
    if(!(element=$(element))) return false;
    //将类名添加到当前className的末尾
    //如果没有className，则不包含空格
    element.className+=(element.className ? '__' : '')+className;
    return true;
};
window['ADS']['addClassName']=addClassName;



//从元素中删除类
function removeClassName(element,className){
    if(!(element=$(element))) return false;
    var classes=getClassNames(element);
    var length=classes.length;
    //循环遍历数组删除匹配的项
    //因为从数组中删除项会使
    //数组变短，所以要反向循环
    for(var i=length-1;i>=0;i--){
//！！！原句        if(classes[i]===className){ delete(classes[i]); }！！！
        if(classes[i]===className){ classes.splice(i,1); }
    }
    if(classes.length>1){
        element.className=classes.join('__');
    }else if(classes.length==1){
        element.className=classes;
    }
    return (length==classes.length?false:true);
};
window['ADS']['removeClassName']=removeClassName;



//添加一个样式表
function addStyleSheet(url,media) {
    media = media || 'screen';
    var link = document.createElement('LINK');
    link.setAttribute('rel','stylesheet');
    link.setAttribute('type','text/css');
    link.setAttribute('href',url);
    link.setAttribute('media',media);
    document.getElementsByTagName('head')[0].appendChild(link);
}
window['ADS']['addStyleSheet'] = addStyleSheet;



//移除一个样式表
function removeStyleSheet(url,media) {
    var styles = getStyleSheets(url,media);
    for(var i = 0 ; i < styles.length ; i++) {
        var node = styles[i].ownerNode || styles[i].owningElement;
        // Disable the stylesheet
        styles[i].disabled = true;
        // Remove the node
        node.parentNode.removeChild(node);
    }
}
window['ADS']['removeStyleSheet'] = removeStyleSheet;



//通过url取得样式表
function getStyleSheets(url,media) {
    var sheets = [];
    for(var i = 0 ; i < document.styleSheets.length ; i++) {
        if (url &&  document.styleSheets[i].href.indexOf(url) == -1) { continue; }
        if(media) {
            // Normaizle the media strings
            media = media.replace(/,\s*/,',');
            var sheetMedia;
                
            if(document.styleSheets[i].media.mediaText) {
                // DOM mehtod
                sheetMedia = document.styleSheets[i].media.mediaText.replace(/,\s*/,',');
                // Safari adds an extra comma and space
                sheetMedia = sheetMedia.replace(/,\s*$/,'');
            } else {
                // MSIE
                sheetMedia = document.styleSheets[i].media.replace(/,\s*/,',');
            }
            // Skip it if the media don't match
            if (media != sheetMedia) { continue; }
        }
        sheets.push(document.styleSheets[i]);
    }
    return sheets;
}
window['ADS']['getStyleSheets'] = getStyleSheets;



//编辑一条样式规则
function editCSSRule(selector,styles,url,media) {
    var styleSheets = (typeof url == 'array' ? url : getStyleSheets(url,media));

    for ( i = 0; i < styleSheets.length; i++ ) {

        // Retrieve the list of rules
        // The DOM2 Style method is styleSheets[i].cssRules
        // The MSIE method is styleSheets[i].rules
        var rules = styleSheets[i].cssRules || styleSheets[i].rules;
        if (!rules) { continue; }
               
        // Convert to uppercase as MSIIE defaults to UPPERCASE tags.
        // this could cause conflicts if you're using case sensetive ids
        selector = selector.toUpperCase();
        
        for(var j = 0; j < rules.length; j++) {
            // Check if it matches
            if(rules[j].selectorText.toUpperCase() == selector) {
                for (property in styles) {
                    if(!styles.hasOwnProperty(property)) { continue; }
                    // Set the new style property
                    rules[j].style[camelize(property)] = styles[property];
                }
            }
        }
    }
}
window['ADS']['editCSSRule'] = editCSSRule;



//添加一条css规则
//在safari中无效（2009.07）
function addCSSRule(selector, styles, index, url, media) {
    var declaration = '';

    // Build the declaration string from the style object
    for (property in styles) {
        if(!styles.hasOwnProperty(property)) { continue; }
        declaration += property + ':' + styles[property] + '; ';
    }

    var styleSheets = (typeof url == 'array' ? url : getStyleSheets(url,media));
    var newIndex;
    for(var i = 0 ; i < styleSheets.length ; i++) {
        // Add the rule        
        if(styleSheets[i].insertRule) {
            // The DOM2 Style method
            // index = length is the end of the list
            newIndex = (index >= 0 ? index : styleSheets[i].cssRules.length);
            styleSheets[i].insertRule(selector + ' { ' + declaration + ' } ', 
                newIndex);
        } else if(styleSheets[i].addRule) {
            // The Microsoft method
            // index = -1 is the end of the list 
            newIndex = (index >= 0 ? index : -1);
            styleSheets[i].addRule(selector, declaration, newIndex);
        }
    }
}
window['ADS']['addCSSRule'] = addCSSRule;



// 书本以外的方法 互联网摘抄或自己写成的 //


//获取元素的内容 如<a href="#">123</a> 内容为123
function getTargetValue(e) {
    var t = "";
    // 如果传入的是元素，则继续遍历其子元素，
    // 否则假定它是一个数组
    e = e.childNodes || e;
    // 遍历所有字节点
    for ( var j = 0; j < e.length; j++ ) {
        // 如果不是元素，追加其文本值
        // 否则，递归遍历所有元素的子节点
        t+=e[j].nodeType!= 1?e[j].nodeValue:getTargetValue(e[j].childNodes);
    }
    // 返回匹配的文本
    return t;
}
window['ADS']['getTargetValue']=getTargetValue;




})();


//去除空格
String.prototype.trim= function(){  
   // 用正则表达式将前后空格  
   // 用空字符串替代。  
   return this.replace(/(^\s*)|(\s*$)/g, "");  
}


