﻿/*---------------------------------------------------------------------------
// Copyright 2006-2008 萤火虫网络科技有限公司
//
// 文件名：yhc.window.js
// 文件功能概述：包含与页面中窗体操作相关的类
//
// 依赖文件：mootools-core.js
//
// 创建标识：夸大20080810
//
//--------------------------------------------------------------------------*/

/**
 * 下拉框类 只能在元素的父元素闭合后才能使用
 *
 * 功能：
 *   支持自定义下拉列表
 *
 * 构造方法：
 *   @id 需要点击产生下拉框的元素id 元素不能是input
 *
 * 例：
 * var slt=new YhcSelect("select");
 * slt.add("0","书籍");
 * slt.add("1","影视");
**/
function YhcSelect(id){
  element=$(id);
  
  //创建元素的下拉菜单元素
  var menuId=id+"+"+"menu";
  var menu=document.createElement("ul");
  menu.id=menuId;
  menu.style.display="none";
  menu.style.position="absolute";
  element.parentNode.appendChild(menu);
  
  /*
    添加菜单项
    @value 对应值
    @text 文本
  */
  this.add=function(value,text){
    var option=document.createElement("li");
    option.setAttribute("val",value);
    option.innerHTML=text;
    option.style.cursor="pointer";
    menu.appendChild(option);
    
    option.onclick=OptionClick;
  };
  
  //菜单项点击事件
  function OptionClick(){
    menu.style.display="none";
    element.value=this.getAttribute("va");
    element.innerHTML=this.innerHTML;
  }
  
  //添加事件
  element.addEvents({
    "click": function(evt){
      var position=this.getPosition();
      var size=this.getSize();
      
      menu.style.display="block";
      menu.style.top=(position.y+size.y)+"px";
      menu.style.left=(position.x-1)+"px";
    },
    "blur": function(evt){
      menu.style.display="none";
    }
  });
  
};

/**
 * 简单下拉框类 
 *
 * 功能：
 *   支持自定义下拉列表 由一个基元素和一个菜单元素组成，下拉框的样式以及鼠标移上去的样式，都由css样式控制，本类不处理
 *
 * 构造方法：
 *   @id 需要点击产生下拉框的元素id 元素不能是input
 *   @menuId 下拉框菜单元素id
 *   @itemTag 下拉框选择项标签 例如：div
 *   [@option] 参数 Object
 *     @x 在X轴上的微调
 *     @y 在Y轴上的微调
 *         
 * 例：
 *   var slt=new SimpleSelect("select","menu","div");
**/
function SimpleSelect(id,menuId,itemTag){
  var element=$(id);
  var menu=$(menuId);
  
  //可选参数设定
  var options={x:0,y:0};
  if(arguments.length>3){
    var temp=arguments[3];
    for(var key in temp){
      options[key]=temp[key];
    }
  }
  
  //设置下拉菜单初始值
  menu.style.position="absolute";
  menu.style.display="none";
  
  element.addEvents({
    "click": function(evt){
      var position=this.getPosition();
      var size=this.getSize();
      menu.style.display="block";
      menu.style.top=(position.y+size.y+parseInt(options.y))+"px";
      menu.style.left=(position.x+parseInt(options.x))+"px";
    }
  });
  
  //设置下拉菜单项
  var items=menu.getElementsByTagName(itemTag);
  if(!items || items.length==0){
    alert("参数menuId所对应元素不正确");
  }
  else{
    for(var i=0;i<items.length;i++){
      items[i].onclick=OptionClick;
    }
  }
  
  //菜单项点击事件
  function OptionClick(){
    menu.style.display="none";
    element.innerHTML=this.innerHTML;
  }
}

/**
 * 简单菜单类
 *
 * 功能：
 *   支持自定义下拉列表 由一个基元素和一个菜单元素组成，菜单的样式以及鼠标移上去的样式，都由css样式控制，本类不处理
 *
 * 构造方法：
 *   @id 需要点击产生下拉框的元素id 元素不能是input
 *   @menuId 下拉框菜单元素id
 *   [@option] 参数 Object
 *     @x 在X轴上的微调
 *     @y 在Y轴上的微调
 *     @visibleEvent 菜单显示事件
 *         
 * 例：
 *   var slt=new SimpleMenu("select","menu",{x:-77,y:0,visibleEvent:"mouseover"});
**/
function SimpleMenu(id,menuId){
  var element=$(id);
  var menu=$(menuId);
  
  //可选参数设定
  var options={x:0,y:0,visibleEvent:"click"};
  if(arguments.length>2){
    var temp=arguments[2];
    for(var key in temp){
      options[key]=temp[key];
    }
  }
  
  //设置下拉菜单初始值
  menu.style.position="absolute";
  menu.style.display="none";
  
  element.addEvent(options.visibleEvent,
    function(evt){
      var position=this.getPosition();
      var size=this.getSize();
      menu.style.display="block";
      menu.style.top=(position.y+size.y+parseInt(options.y))+"px";
      menu.style.left=(position.x+parseInt(options.x))+"px";
    }
  );
  
  //鼠标是否移动到菜单以及菜单项上
  var isEnter=false;
  
  //菜单项鼠标离开事件
  element.addEvents({
    "mouseenter": function(evt){
      isEnter=true;
    },
    "mouseleave": function(evt){
      window.temp1=this;
      window.setTimeout("window.temp1.closeMenu()",500);
      isEnter=false;
    }
  });
  
  //设置菜单事件
  menu.addEvents({
    "mouseenter": function(evt){
      isEnter=true;
    },
    "mouseleave": function(evt){
      window.temp2=this;
      window.setTimeout("window.temp2.closeMenu()",500);
      isEnter=false;
    }
  });
  
  menu.closeMenu=element.closeMenu=closeMenu;
  
  function closeMenu(){
    if(!isEnter){
      menu.style.display="none";
    }
  };
  
}

/**
 * 简单滑动门类
 *
 * 功能：
 *   简单的滑动门处理类，适合在元素的id已知的情况下使用
 *
 * 构造方法：
 *   @slips 滑动按钮以及滑动门的对应数组 请按顺序填写 [滑动门开关,滑动门,滑动门未开启时的样式,滑动门开启后的样式]
 *
 * 例：
 *   var slt=new SimpleSlip([
 *     ["natureChange","naturePage","a1","a2"],
 *     ["changeTop","TopPage","a1","a2"]
 *   ],{changeEvent:"mouseenter"});
**/
function SimpleSlip(slips){
  var options={changeEvent:"click",visibleDisplay:"block",invisibleDisplay:"none"};
  //参数设定
  if(arguments.length>1){
    var temp=arguments[1];
    for(var key in temp){
      options[key]=temp[key];
    }
  }
  
  if($type(slips)!="array"){
    alert("参数@slips类型不正确");  //Exception
  }
  
  var slipSwitchIds=new Array();  //滑动门开关id
  
  var openSlipId="";  //当前开启的滑动门id
  
  for(var i=0;i<slips.length;i++){
  
    var slipItems=slips[i];
    slipSwitchIds.push(slipItems[0]);
    
    var slipSwitch = $(slipItems[0]);
    slipSwitch.slip = slipItems[1]; //设置滑动门开关所对应的滑动门
    slipSwitch.closeClass = slipItems[2]; //滑动门关闭开关样式
    slipSwitch.openClass = slipItems[3]; //滑动门开启开关样式
    
    slipSwitch.addEvent(options.changeEvent,
      function(evt){
        Blurs();
        openSlipId=this.id;
        this.className=this.openClass;
        if(this.slip!=""){
          $(this.slip).style.display=options.visibleDisplay;
        }
      }
    );
  }
  
  //让所有的滑动门按钮和滑动门失去焦点
  function Blurs(){
    for(var i=0;i<slipSwitchIds.length;i++){
    
      var slipSwitch=$(slipSwitchIds[i]);
      slipSwitch.className=slipSwitch.closeClass;
      if(slipSwitch.slip!=""){
        $(slipSwitch.slip).style.display=options.invisibleDisplay;
      }
    }//end for
  }
  
  //将第一个滑动门设置为焦点对象
  $(slipSwitchIds[0]).fireEvent(options.changeEvent);
  
  //共有方法，获取当前开启的滑动门
  this.getOpenSlipId=function(){
    return openSlipId;
  };
}

/**
 * ScrollBox 元素滚动盒子
 *
 * 功能：
 *   注册元素中的子元素定时滚动
 * 
**/
function ScrollBox(id,tagName,timespan){
  //inch 微调 scrollTimespan 滚动频率
  var options={inch:0,scrollTimespan:50};
  //参数设定
  if(arguments.length>3){
    var temp=arguments[3];
    for(var key in temp){
      options[key]=temp[key];
    }
  }

  var element=$(id);
  
  var scrollHeight=parseInt(element.getChildren(tagName)[0].offsetHeight)+options.inch;  //需要移动的高度
  
  element.style.height=scrollHeight+"px";
  element.style.overflow="hidden";
  
  window.toScrollBoxEvent=goScroll;
  
  window.goScrollHandler=window.setTimeout("toScrollBoxEvent()",timespan);
  
  //滚动初始方法
  function goScroll(){
    window.toScrollHandler=window.setInterval("toScrollBox()",options.scrollTimespan);
    window.clearTimeout(window.goScrollHandler);
  }
  
  //滚动盒子
  window.toScrollBox=function(){
    //滚动
    if(element.scrollTop<scrollHeight){
      element.scrollTop+=1;
    }
    else{
      window.clearInterval(window.toScrollHandler);
      window.comeBackScroll();
      window.goScrollHandler=window.setTimeout("toScrollBoxEvent()",timespan);
    }
  }
  
  //将盒子状态归零
  window.comeBackScroll=function(){
    
    //将滚动后的元素加入最后一个位置
    var cloneNode=element.getChildren(tagName)[0].clone();
    element.appendChild(cloneNode);
    
    //去掉第一个元素
    element.removeChild(element.getChildren(tagName)[0]);
    
    //将scrollTop归零
    element.scrollTop=0;
  }
  
  //
}

/**
 * registerTopScrollAD 注册头部滚动广告
 *
 * 
**/
function registerTopScrollAD(id){
  var options={
    start_time:2000,  //开始滚动时间
    down_range:10,  //向下滚动幅度
    down_interval:1,  //向下时间间隔
    up_range:10,  //向上滚动幅度
    up_interval:10,   //向上时间间隔
    wait_time:5000, //停留等待时间
    event_start: function(){},  //开始滚动执行的方法
    event_up: function(){}  //当准备向上滚动时执行的方法
  };
  
  //参数设定
  if(arguments.length>1){
    var temp=arguments[1];
    for(var key in temp){
      options[key]=temp[key];
    }
  }
  
  //初始化对象
  var element=$(id);
  element.style.display="block";
  element.style.position="";
  element.oldHeight=parseInt(element.offsetHeight);
  element.style.overflow="hidden";
  element.style.height="0px";
  element.scrollTop=element.oldHeight;

  //将方法都挂接在window对象上，让settimeout和setInterval可以访问
  var funName="rtad_"+id;
  window[funName]=new Object();
  var rtadObj=window["rtad_"+id];
  
  rtadObj.stoDown=0;
  rtadObj.stoUp=0;
  
  //滚动效果
  rtadObj.dragDiv=function(way){
    var currentHeight=parseInt(element.style.height);
    
    if(way=="down" && currentHeight<element.oldHeight){
      element.style.height = currentHeight+ options.down_range + "px";
      element.scrollTop += options.down_range;
    }
    else if(way=="up" && currentHeight>0){
      element.scrollTop-=options.up_range;
      element.style.height=currentHeight-options.up_range+"px";
    }
    else{
      if(way=="down"){
        window.clearInterval(rtadObj.stoDown);
        window.setTimeout('window["'+funName+'"].toUp()',options.wait_time);
      }
      else{
        window.clearInterval(rtadObj.stoUp);
      }
    }
  }
  
  window.setTimeout('window["'+funName+'"].toDown()',options.start_time);
  
  //向下滚动
  rtadObj.toDown=function(){
    options.event_start(element,rtadObj);
    rtadObj.stoDown=window.setInterval('window["'+funName+'"].dragDiv("down")',options.down_interval)
  }
  
  //向上收起
  rtadObj.toUp=function(){
    options.event_up(element,rtadObj);
    //element.style.display="none";
    rtadObj.stoUp=window.setInterval('window["'+funName+'"].dragDiv("up")',options.up_interval);
  }
}


function ResumeError(){ 
  return true;
} 
window.onerror = ResumeError; 