/**
 * 初始化Tips
 *
 * @param string url 获取远程数据的地址。 如果不从远程获取,可传递''
 * @param string html 当url==''时,会显示html指定的字符串
 * @param string prefix 
 * @param object options 选项. 说明:
 *   tipsClass string tips元素的classname
 *   fixedWidth int 固定宽度. 如果未定义,按tipsClass定义
 *   fixedHeight int 固定宽度. 如果未定义,按tipsClass定义
 *   fixedHTML string 固定显示的文字. 仅在url=''时生效
 *   prefix string 为生成的element.id添加前缀,以区分不同类型的tip, 用来可防止element.id重复
 *   format function 格式化字符串
 *   toolBar bool 是否显示工具条(右边带一个X)
 */
whTipsInit['__tips__'] = [];
function whTipsInit(url,options){
    if(!options) options = {};
    var prefix = options['prefix'];
    if(prefix&&prefix['length'])
        prefix = prefix+'_';
    else prefix = '';
    var _tips = [], //保存已经获取过内容的tips
        _x,_y, //tips显示时鼠标的x,y座标
        ownhtml,//单个tips自己的文字
        format = options['format']||function(s){return s;}; //格式化字符串函数
    whTipsInit['__tips__'].push(_tips);
    /**
     * 显示浮动提示
     *
     * @param EventObject e
     * @param int tip_id SiteTip.id
     * @param ownhtml. 当前tip固定显示的内容. 仅在url=''时生效
     * @param params 传递给服务器的参数
     */
    return function(e,tip_id,html,params){
        var event = e || window.event;
        _x = Event['pointerX'](event);
        _y = Event['pointerY'](event);
        ownhtml = html||'';

        if(!_tips[tip_id]){
            var handler = getMouseoutHandle(tip_id);
            createTipEle(tip_id,handler);
            Event.observe(Event['element'](event),'mouseout',handler);
            _tips[tip_id] = {};
        }

        var tip_ele = $(prefix+'whTipEle'+tip_id);
        if(!_tips[tip_id]['loaded']) getTipContent(tip_id,params);

        toggleTip(tip_id,true);
    }

    function getMouseoutHandle(tip_id,second){
        var func = toggleTip.curry(tip_id);

        return function(){
            _tips[tip_id]['over'] = false;
            if(second===0) func();
            else{
                if(undefined===second) second = 500;
                _tips[tip_id].timer = window.setTimeout(func,second);
            }
        }
    }

    function getDim(tip_id){
        var w = options['fixedWidth'],
            h = options['fixedHeight'];
        if(!(w&&h)){
            if(!w) w = parseInt(Element.getStyle($(prefix+'whTipEle'+tip_id),'width'));
            if(!h) h = Element.getHeight($(prefix+'whTipEleContent'+tip_id));
            if(h==0) h = Element.getHeight($(prefix+'whTipEle'+tip_id));
        }

        if(options['toolBar']) h += Element.getHeight($(prefix+'whTipEleToolbar'+tip_id));
        return {width:w,height:h};
    }
    
    function toggleTip(tip_id,show){
        var dim = getDim(tip_id),
            w = dim.width,
            h = dim.height;

        var display = show===true?'block':'none',
            tip_ele = $(prefix+'whTipEle'+tip_id);
        
        if(show===true){
            var pos = getPosition(w,h);
            
            Element.setStyle(tip_ele,{left:pos['left']+'px',top:pos['top']+'px'});
            _tips[tip_id]['over'] = true;
            clearTimeout(_tips[tip_id]['timer']);
            _tips[tip_id]['timer'] = null;
            if(options['toolBar'])
                $(prefix+'whTipEleA'+tip_id).onclick = getMouseoutHandle(tip_id,0);
        }else _tips[tip_id]['over'] = false;

        if(_tips[tip_id]['loaded']&&!_tips[tip_id]['updateDim']){
            updateDim(tip_id);
        }

        if(Prototype.Browser.IE){
            if(show) Element.clonePosition( $('whTipEleForIE'),tip_ele);
            else{
                //检查当前是否有任何一个tip可见. 如果有,不隐藏iframe
                var has_over = false,tips,
                globalTips = whTipsInit['__tips__'];
                for(var i=0;i<globalTips.length;i++){
                    localTips = globalTips[i];
                    for(var tips_id2 in localTips){
                        if(localTips[tips_id2]&&localTips[tips_id2]['over']){
                            has_over = true;
                            break;
                        }
                    }
                }
            }
            if(has_over||show) display = 'block';
            $('whTipEleForIE').style.display = display;
        }

        tip_ele.style.display = display;
    }

    //重设尺寸
    function updateDim(tip_id){
        var dim = getDim(tip_id),
            tip_ele = $(prefix+'whTipEle'+tip_id);

        if(_tips[tip_id]['loaded']){
            tip_ele.style.width = dim.width+'px';
        }
        tip_ele.style.height = dim.height+'px';
        if(Prototype.Browser.IE){
            Element.clonePosition( $('whTipEleForIE'),tip_ele);
        }
        _tips[tip_id]['updateDim'] = 1;
    }

    function getTipContent(tip_id,params){
        var ele = $(prefix+'whTipEleContent'+tip_id);
        if(url.length){
            var query_str = 'id='+tip_id;
            if(params) query_str += '&'+$H(params).toQueryString();
            new Ajax.Request(url,{
                method:'get',
                parameters:query_str,
                onSuccess:function(req){
                    var doc = req.responseXML;
                    _tips[tip_id]['loaded'] = true;
	                if(doc&&doc.getElementsByTagName('tip')) {
                        ele.innerHTML = format(doc.getElementsByTagName('tip')[0].firstChild.nodeValue);
                        if(Element.visible($(prefix+'whTipEle'+tip_id))){
                            updateDim(tip_id);
                        }
                    }else{
                        ele.innerHTML = '无法获取内容';
                    }
                },
                onComplete:function(){
                    _tips[tip_id]['loaded'] = true;
                }
            });
        }else{            
            setTimeout(function(){
                _tips[tip_id]['loaded'] = true;
                ele.innerHTML = format(ownhtml||options['fixedHTML']||'无法获取内容');
                updateDim(tip_id);}.curry(),100);
        }
    }
    
    function createTipEle(tip_id,_handler){
        var tip = document.createElement('div');
        tip.setAttribute('id',prefix+'whTipEle'+tip_id);
        var classname = options['tipsClass']||'wh-tips-ele';
        tip.setAttribute('class',classname);
        tip.className = classname;
        document.body.appendChild(tip);

        if(options['toolBar']){
            var bar = document.createElement('div');
            Element.setStyle(bar,{borderBottom:'1px solid #ccc',textAlign:'right',padding:'3px 8px 3px 0px'});
            bar.id = prefix+'whTipEleToolbar'+tip_id;
            var a = document.createElement('a');
            a.innerHTML = '关闭';
            a.id = prefix+'whTipEleA'+tip_id;
            a.href = 'javascript:void(0)';
            bar.appendChild(a);
            tip.appendChild(bar);
        }
        tip.innerHTML += '<div id="'+prefix+'whTipEleContent'+tip_id+'"><img src="/images/ajax/loading_tip.gif" width="16" height="16" valign="absmiddle" hspace="5" />Loading...</div>';
        tip.onmouseover = toggleTip.curry(tip_id,true);
        tip.onmouseout = _handler;

        if(Prototype.Browser.IE){
            var iframe = document.createElement('iframe');
            iframe.setAttribute('class','wh-tips-ele-forIE');
            iframe.className = 'wh-tips-ele-forIE';
            iframe.setAttribute('src','javascript:false');
            iframe.setAttribute('id','whTipEleForIE');
            document.body.appendChild(iframe);
        }
    }

    function getPosition(w,h){
        var scrolls = Position.realOffset(document.body),   //页面当前滚动的距离
            pos = {left:_x-scrolls['left'],top:_y-scrolls['top']},
            x = pos['left']+scrolls['left'],
            y = pos['top']+scrolls['top'],
            vpw = document.documentElement['clientWidth']-3,     //视口宽度(不含滚动条)
            vph = document.documentElement['clientHeight']-3;    //视口高度
        
        if(vpw+scrolls['left']<w+x){                            //在x方向上将超出当前视口范围
            var leftSpace = pos['left'];                            //左侧空间
            var leftNeeds = pos['left']-w+scrolls['left'];      //左侧需要的距离
            if(scrolls['left']<=leftNeeds) x = leftNeeds;           //放在左边
            if(x<0) x = 0;
        }
        
        if(vph+scrolls['top']<h+y){                             //在y方向上超出当前视口范围
            var topSpace = pos['top'];                              //上方空间
            var topNeeds = pos['top']-h+scrolls['top'];         //上方需要的距离
            if(scrolls['top']<=topNeeds) y = topNeeds;              //放在上方
            if(y<0) y = 0;
        }
        return {left:x,top:y+5};
    }
};