﻿/**
 * 等同于 document.getElementById('id');
 * @return {HTMLElement}
 */
var $ = document.getElementById;

/**
 * 创建一个DOM元素
 * @param {String} tagName 元素的名称
 * @return {HTMLElement} 创建成功的DOM元素
 */
function createElement(tagName){
    return document.createElement(tagName);
}

/**
 * 等同于 document.getElementsByTagName('tagname');
 * @return {Array}
 */
var _ = document.getElementsByTagName;

/**
 * 获取URL后面的参数值
 * @param {String} vname 参数的名称
 * @param {String} source 获取的来源，默认为window.location;
 * @return {String} 参数对应的值，当此参数不存在的时候则返回空字符串
 */
function getParameter(vname, source){
	var reg = new RegExp("(?:\\?|\#|\&)" + vname + "=([^&]+)\&?");
    if (source) {
        if (reg.test(source)) {
            var result = reg.exec(source, "im");
            return result[1];
        }
        else {
            return "";
        }
    }
    if (reg.test(window.location.toString())) {
        var result = reg.exec(window.location, "im");
        return result[1];
    }
    else {
        return "";
    }
}

var org = {
    youyee: {
        display: {
            /**
             * 获取HTML元素的宽度
             * @param {HTMLElement} element 需要被获取宽度的元素
             * @return {int} 宽度值
             */
            getWidth: function(element){
                var ele = org.youyee.dom.$(element);
                return ele.offsetWidth;
            },
            /**
             * 获取HTML元素的高度
             * @param {HTMLElement} element 需要被获取高度的元素
             * @return {int} 高度值
             */
            getHeight: function(element){
                var ele = org.youyee.dom.$(element);
                return ele.offsetHeight;
            },
            /**
             * 获取HTML元素的x坐标
             * @param {HTMLElement} element 需要被获取坐标的元素
             * @return {int} x坐标的值
             */
            getX: function(element){
                var x = 0;
                var ele = org.youyee.dom.$(element);
                while (ele != null) {
                    x += ele.offsetLeft;
                    ele = ele.offsetParent;
                }
            },
            /**
             * 获取HTML元素的y坐标
             * @param {HTMLElement} element 需要被获取坐标的元素
             * @return {int} y坐标的值
             */
            getY: function(element){
                var y = 0;
                var ele = org.youyee.dom.$(element);
                while (ele != null) {
                    y += ele.offsetTop;
                    ele = ele.offsetParent;
                }
            },
            parsePixel: function(value){
                v = value.slice(0, value.indexOf("px"));
                return parseInt(v, 10);
            }
        },
        //封装了基本的dom获取和页面设置方法
        dom: {
            /**
             * 设置窗口的标题栏
             * @param {String} value
             */
            setTitle: function(value){
                document.title = value;
            },
            /**
             * 获取body元素
             */
            body: function(){
                return document.getElementsByTagName("body")[0];
            },
            /**
             * 跳转到指定页面
             * @param {String} url
             */
            setLocation: function(url){
                window.location.href = url;
            },
            
            /**
             * 获取当前Window的地址
             * @return {String} url
             */
            getLocation: function(){
                return window.location.href.toString();
            },
            
            //用于打开一个新窗口并且跳转到指定地址
            navigateToURL: function(url){
                window.open(url);
            }
        },
        //提供简单的拖放功能，在Widget中使用
        dragdrop: {
            /**
             * 在使用拖动功能前保证初始化拖放管理器
             */
            initial: function(){
                org.youyee.event.addEventListener(_("html")[0], org.youyee.event.MOUSE_MOVE, org.youyee.dragdrop._onMouseMove);
            },
            /**
             * 当不需要再使用拖动功能时可以销毁管理器从而节省资源
             */
            destroy: function(){
                org.youyee.event.removeEventListener(_("html")[0], org.youyee.event.MOUSE_MOVE, org.youyee.dragdrop._onMouseMove);
            },
            /**
             * 使该HTML元素开始被拖拽
             * @param {HTMLElement} element
             */
            startDrag: function(element){
                org.youyee.dragdrop.stopDrag();
                if (org.youyee.dragdrop._ele != element) {
                    org.youyee.dragdrop.iDiffX = org.youyee.dragdrop.mouseX - element.offsetLeft;
                    org.youyee.dragdrop.iDiffY = org.youyee.dragdrop.mouseY - element.offsetTop;
                    org.youyee.dragdrop._ele = element;
                }
            },
            /**
             * 停止当前的拖拽操作
             */
            stopDrag: function(){
                if (org.youyee.dragdrop._ele) {
                    org.youyee.dragdrop._ele = null;
                }
            },
            _onMouseMove: function(event){
                org.youyee.dragdrop.mouseX = parseInt(event.clientX, 10);
                org.youyee.dragdrop.mouseY = parseInt(event.clientY, 10);
                if (org.youyee.dragdrop._ele) {
                    org.youyee.event.preventDefault(event);
                    org.youyee.dragdrop._ele.style.left = (org.youyee.dragdrop.mouseX - org.youyee.dragdrop.iDiffX) + "px";
                    org.youyee.dragdrop._ele.style.top = (org.youyee.dragdrop.mouseY - org.youyee.dragdrop.iDiffY) + "px";
                }
            },
            _ele: null,
            mouseX: 0,
            mouseY: 0,
            iDiffX: 0,
            iDiffY: 0
        },
        //用于处理事件的工具集
        event: {
            /**
             * 获取当前时间的发送对象
             * @param {Event} evt 触发的事件
             * @return {HTMLElement} 返回发送事件的对象
             */
            getTarget: function(evt){
                if (evt.target) {
                    return evt.target;
                }
                return evt.srcElement;
            },
            /**
             * 阻止时间的效果
             * @param {Event} event
             */
            preventDefault: function(event){
                if (typeof event == "undefined") {
                    event = window.event;
                }
                event.returnValue = false;
                if (typeof event.preventDefault != "undefined") {
                    event.preventDefault();
                }
                return true;
            },
            /**
             * 为元素设置事件监听函数
             * @param {HTMLElement} element 需要被设置监听器的对象
             * @param {String} evt 监听的事件名
             * @param {Function} handler 事件的监听函数
             */
            addEventListener: function(element, evt, handler){
                if (element.addEventListener) {
                    if (evt.slice(0, 2) != "on") {
                        element.addEventListener(evt, handler, false);
                    }
                    else {
                        element.addEventListener(evt.slice(2, evt.length), handler, false);
                    }
                }
                else 
                    if (element.attachEvent) {
                        if (evt.slice(0, 2) != "on") {
                            element.attachEvent("on" + evt, handler, false);
                        }
                        else {
                            element.attachEvent(evt, handler, false);
                        }
                    }
                    else {
                        if (evt.slice(0, 2) != "on") {
                            element["on" + evt] = handler;
                        }
                        else {
                            element[evt] = handler;
                        }
                    }
            },
            /**
             * 注销元素的事件监听函数
             * @param {HTMLElement} element 需要被注销监听器的对象
             * @param {String} evt 监听的事件名
             * @param {Function} handler 事件的监听函数
             */
            removeEventListener: function(element, evt, handler){
                if (element.removeEventListener) {
                    if (evt.slice(0, 2) != "on") {
                        element.removeEventListener(evt, handler, false);
                    }
                    else {
                        element.removeEventListener(evt.slice(2, evt.length), handler, false);
                    }
                }
                else 
                    if (element.detachEvent) {
                        if (evt.slice(0, 2) != "on") {
                            element.detachEvent("on" + evt, handler);
                        }
                        else {
                            element.detachEvent(evt, handler);
                        }
                    }
                    else {
                        if (evt.slice(0, 2) != "on") {
                            element["on" + evt] = null;
                        }
                        else {
                            element[evt] = null;
                        }
                    }
            },
            CLICK: "click",
            MOUSE_DOWN: "mousedown",
            MOUSE_MOVE: "mousemove",
            MOUSE_UP: "mouseup",
            MOUSE_OVER: "mouseover",
            MOUSE_OUT: "mouseout"
        },
        net: {
            /**
             * URL请求的方法
             */
            URLRequestMethod: {
                POST: "POST",
                GET: "GET"
            },
            /**
             * 能够迅速创建XMLHttpRequest对象，无视浏览器差异
             * example: var xmlhttp = new org.youyee.net.XMLHttpRequest();
             */
            XMLHttpRequest: function(){
                var xml_http_request;
                if (window.ActiveXObject) {
                    xml_http_request = new ActiveXObject("Microsoft.XMLHTTP");
                }
                else 
                    if (window.XMLHttpRequest) {
                        xml_http_request = new XMLHttpRequest();
                    }
                return xml_http_request;
            },
            /**
             * 检查XHR的请求是否成功
             * @param {XMLHttpRequest} xml_http_request
             */
            isSuccResponse: function(xml_http_request){
                if (xml_http_request.readyState == 4) {
                    if (xml_http_request.status == 200) {
                        return true;
                    }
                    else {
                        return false;
                    }
                }
                else {
                    return false;
                }
            },
            /**
             * 检查XHR的请求是否错误
             * @param {XMLHttpRequest} xml_http_request
             */
            isErrorResponse: function(xml_http_request){
                if (xml_http_request.readyState == 4) {
                    if (xml_http_request.status >= 400) {
                        return true;
                    }
                }
                return false;
            },
            /**
             * 模拟Flash里的URLLoader，比起单纯的XMLHttpRequest要更加简洁，并且封装了多种方法
             * 通过定义onComplete的方法能够直接接收到服务器返回的数据，并且能够自动检查服务器是否已经返回完成
             * 通过访问data属性能够获取到从服务器返回的数据
             */
            URLLoader: function(){
                var _loader = new Object();
                _loader.xmlHttpRequest = new org.youyee.net.XMLHttpRequest();
                _loader.data = new Object();
                _loader._header = "Content-Type";
                _loader._headerValue = "application/x-www-form-urlencoded";
                _loader.xmlHttpRequest.onreadystatechange = function(){
                    if (org.youyee.net.isSuccResponse(_loader.xmlHttpRequest)) {
                        _loader.data = _loader.xmlHttpRequest.responseText;
                        _loader.onComplete(_loader.xmlHttpRequest.responseText);
                    }
                    if (org.youyee.net.isErrorResponse(_loader.xmlHttpRequest)) {
                        _loader.onError(_loader.xmlHttpRequest.status);
                    }
                }
                /**
                 * 当URLLoader加载成功的时候会调用此函数，并把服务器的返回的数据作为参数传入此函数
                 * @param {Object} re
                 */
                _loader.onComplete = function(re){
                }
                /**
                 * 当URLLoader请求出错时会调用此函数，并把出错的代码作为参数传入函数
                 * @param {int} code
                 */
                _loader.onError = function(code){
                }
                
                /**
                 * 设置URLLoader的请求头
                 * @param {Object} header 请求头
                 * @param {Object} value 对应请求头的值
                 */
                _loader.setRequestHeader = function(header, value){
                    this._header = header;
                    this._headerValue = value;
                }
                /**
                 * 开始从服务器读取
                 * @param {String} url 服务器的地址
                 * @param {String} method 采用的数据传输方法 POST，还是GET
                 * @param {Object} query_data 向服务器发送数据，Hash表形式
                 */
                _loader.load = function(url, method, query_data){
                    var data = "";
                    if (!query_data) {
                        data = "";
                    }
                    else {
                        for (var i in query_data) {
                            data += (i + "=" + query_data[i] + "&");
                        }
                    }
                    //去除最后多余的那个'&'符号
                    data = data.slice(0, -1);
                    this.xmlHttpRequest.open(method, url);
                    //设置请求头为表格
                    this.xmlHttpRequest.setRequestHeader(this._header, this._headerValue);
                    this.xmlHttpRequest.send(data);
                }
                return _loader;
            }
        },
        //用于获取用户浏览器信息的功能集
        userAgent: {
            /**
             * 获取userAgent字符串
             */
            toString: function(){
                return navigator.userAgent;
            },
            /**
             * 获取浏览器的类型
             */
            getBrowser: function(){
                var info = org.youyee.userAgent.toString();
                if (info.indexOf("MSIE") != -1) {
                    return "ie";
                }
                if (info.indexOf("Safari") != -1) {
                    return "safari";
                }
                if (info.indexOf("Firefox") != -1) {
                    return "firefox";
                }
            },
            /**
             * 获取IE浏览器的版本
             */
            getIEVersion: function(){
                var info = org.youyee.userAgent.toString();
                var regEx = new RegExp("MSIE (\\d+\\.\\d+);");
                regEx.test(info);
                return parseInt(RegExp["$1"], 10);
            }
        },
		utils: {
			/**
			 * 创建一个Timer对象，相当于ActionScript 3.0当中的Timer，能够指定频率和呼叫的次数
			 * @param {int} delay Timer的调用频率
			 * @param {uint} count Timer的调用次数，如果不指定则不断调用下去
			 * @return {Timer} 一个Timer对象
			 */
			Timer: function(delay, count){
				var _t = {};
				_t._t = null;
				_t.delay = delay;
				_t.count = (count) ? count : null;
				_t._cnt = _t.count;
				_t.onTimer = null;
				_t.onComplete = null;
				_t.start = function(){
					this._cnt = 0;
					this._t = setInterval(this._handleTimerEvent, delay);
				}
				_t.stop = function(){
					try{
		            	clearInterval(this._t);
					} catch (e){}
		            this._cnt = 0;
				}
				_t._handleTimerEvent = function(){
					if (_t._cnt < _t.count || _t.count == null) {
						if (_t.onTimerEvent) {
							_t.onTimerEvent(_t._cnt);
						}
						_t._cnt++;
					}
					else {
						_t.stop();
						if (_t.onComplete) {
							_t.onComplete();
						}
					}
				}
				return _t;
			}
		}
    }
};

