﻿/*---------------------------------------------------------------------------
//
// 文件名：yhc.window.js
// 文件功能概述：包含与页面中窗体操作相关的类
//
// 依赖文件：mootools-core.js
//

//
//--------------------------------------------------------------------------*/

/**
 * 下拉框类 只能在元素的父元素闭合后才能使用
 *
 * 功能：
 *   支持自定义下拉列表
 *
 * 构造方法：
 *   @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;
  };
}

/**
 * WinForm窗体类
 *
 * 功能：
 *   将元素注册后，便具备窗体的功能，可以关闭，拖动，打开
 * 
**/
function WinForm(){

  var dragFormId=""; //当前窗体ID,指当前被选中并且有可能被鼠标拖动的ID
  
  var topFormId=""; //窗体ID,指在当前叠放层次中，处于最顶端的窗体ID
  
  var winforms=new Array();  //窗体列表
  
  hasBackdrop=true; //窗体弹出时是否包含背景幕
  
  this.setHasBackdrop=function(value){
    hasBackdrop=value;
  }
  
  
  
  //背景幕的相关操作
  var backdrop={
    "open": function(element){
    
      if(!($("backdrop_element")) ){
      
        var temp=document.createElement("div");
        temp.id="backdrop_element";
        temp.innerHTML="&nbsp;";
        
        temp.className="backdrop";
        
        //document.body.appendChild(temp);
        element.parentNode.appendChild(temp);
      }
      
      $("backdrop_element").style.display="block";
      backdrop.setPosition();
    },
    "close": function(){
      $("backdrop_element").style.display="none";
    },
    "setPosition": function(){
    
      var bodyWidth=parseInt(document.documentElement.clientWidth);
      var bodyHeight=parseInt(document.documentElement.clientHeight);
      var scroll_Top=parseInt(document.documentElement.scrollTop);
      var scroll_Left=parseInt(document.documentElement.scrollLeft);
      
      var element=$("backdrop_element");
      element.style.top="0px";
      element.style.left="0px";
      element.style.width=(scroll_Left+bodyWidth)+"px";
      element.style.height=(scroll_Top+bodyHeight)+"px";
    }
  };
  
  /**
   * 公共方法，注册窗体
   *
   * @id 窗体id
   * @dragX 在元素中，X轴上可拖动距离
   * @dragY 在元素中，Y轴上可拖动距离
   *
  **/
  this.register=function(id,dragX,dragY){
  
    winforms.push(id);  //添加窗体到列表
    var element=$(id);
    
    if(!(element)){
      return;
    }
    
    element.style.position="absolute";
    element.style.display="none";
    element.style.zIndex=1000;
    element.mouseAction="up"; //鼠标在窗体元素上的动作
    element.isOpen=false;
    
    //添加打开方法
    element.open=function(){
      element.style.display="block";
      
      //将元素居中显示
      setMiddlePosition(this);
      
      if(hasBackdrop){
        backdrop.open(this);
      }
      
      this.isOpen=true;
    }
    
    //添加关闭方法
    element.close=function(){
      this.style.display="none";
      
      if(hasBackdrop){
        backdrop.close();
      }
      
      this.isOpen=false;
    }
    
    //添加移动方法
    element.move=function(x,y){
      this.style.left=x;
      this.style.top=y;
    }
    
    //为窗体元素添加事件
    element.addEvents({
      
      "click": function(evt){
        
      },
      "mousedown": function(evt){
        //设置叠放层次
        if(topFormId!=""){
          this.style.zIndex=parseInt($(topFormId).style.zIndex)+1;
        }
        topFormId=this.id;
        //设置叠放层次 End
      
        this.mouseAction="down";
        
        var x=evt.page.x; //鼠标X轴位置
        var y=evt.page.y; //鼠标Y轴位置
        
        var params=this.getCoordinates();  //获取元素位置等信息
        
        this.gapX=x - params.left; //元素和鼠标在X轴上的差距
        this.gapY=y - params.top; //元素和鼠标在Y轴上的差距
        
        //判断是否可以拖动
        if(dragX=="" && dragY==""){
          dragFormId=this.id;
        }
        else if(dragX==""){
          if(this.gapY<dragY){
            dragFormId=this.id;
          }
        }
        else if(dragY==""){
          if(this.gapX<dragX){
            dragFormId=this.id;
          }
        }
        else{
          if(this.gapX<dragX && this.gapY<dragY){
            dragFormId=this.id;
          }
        }
        
      },
      "mouseup": function(evt){
        this.mouseAction="up";
        
        dragFormId="";
      }
      
    });
  }//窗体注册方法 结束
  
  //注册文档对象移动方法
  document.addEvent("mousemove",function(evt){
    
    if(dragFormId!=""){
      var x=evt.page.x; //鼠标X轴位置
      var y=evt.page.y; //鼠标Y轴位置
    
      var element=$(dragFormId);
      element.style.left= (x - element.gapX) + "px";
      element.style.top= (y - element.gapY) + "px";
    }
    
  });
  
  window.addEvents({
    "mouseup": function(){
      dragFormId="";
    },
    "resize": function(){
      reSetPosition();
    },
    "scroll": function(){
      reSetPosition();
    }
  });
  
  //重新设置弹出窗体位置
  function reSetPosition(){
  
    var hasOpenForm=false;
    for(var i=0;i<winforms.length;i++){
      var winf=$(winforms[i]);
      
      if(winf.isOpen){
        setMiddlePosition(winf);
        hasOpenForm=true;
      }
    }
    
    if(hasOpenForm && hasBackdrop){
      backdrop.setPosition();
    }
  }
  
  //设置制定元素居中显示
  function setMiddlePosition(element){
    var bodyWidth=parseInt(document.documentElement.clientWidth);
    var bodyHeight=parseInt(document.documentElement.clientHeight);
    var senderWidth=parseInt(element.offsetWidth);
    var senderHeight=parseInt(element.offsetHeight);
    var scroll_Top=parseInt(document.documentElement.scrollTop);
    var scroll_Left=parseInt(document.documentElement.scrollLeft);
  
    element.style.left=scroll_Left+(bodyWidth-senderWidth)/2+"px";
    element.style.top=scroll_Top+(bodyHeight-senderHeight)/2+"px";
  }
  
  //设置注册窗体叠放结构，在注册窗体的时候使用
  function SetNappe(id){
    //暂未实现
  }
  
}

//WinForm对象
var WF=new WinForm();

/**
 * SimpDrag 简单拖拽类
 *
 * 功能：
 *   将元素注册，允许元素的子元素随意拖动
 * 
**/
function SimpDrag(id,tagName,_click){

  var chkElementId="";  //当前选中元素
  var moveElementId=""; //当前移动元素Id
  var isEnter=false;  //当前鼠标是否在拖拽元素上按下

  var element=$(id);
  var dragElements=element.getElementsByTagName(tagName);
  
  for(var i=0;i<dragElements.length;i++){
  
    var dragElement=dragElements[i];
    
    dragElement.onclick=function(){
      this.style.backgroundColor='#cdcdcd';
      chkElementId=this.id;
      
      _click(this);
    };
  
    dragElement.onmousedown=function(){
      if(moveToElementId!=""){
        $(moveToElementId).style.backgroundColor='';
      }
    
      chkElementId=this.id;
      moveElementId=this.id;
      moveToElementId=this.id;
      isEnter=true;
    };
    dragElement.onmouseup=function(){
      exchange(moveElementId,moveToElementId);
    
      chkElementId=moveToElementId;
      moveElementId="";
      isEnter=false;
    };
    
  }//for dragElements end
  
  //注册文档对象移动方法
  document.addEvent("mousemove",function(evt){
    
    if(moveElementId!=""){
      var x=evt.page.x;
      var y=evt.page.y;
      
      chkMove(x,y);
    }
    
  });
  
  var moveToElementId="";
  
  //检查移动元素是否移动至可切换元素上方
  function chkMove(x,y){
  
    var drags=element.getElementsByTagName(tagName);
    
    for(var i=0;i<drags.length;i++){
    
      var dragElement=drags[i];
      var coord=$(dragElement.id).getCoordinates();
      
      if( y>coord.top && y<coord.bottom && x>coord.left && x<coord.right ){
      
        if(moveToElementId!=""){
          $(moveToElementId).style.backgroundColor='';
        }
        dragElement.style.backgroundColor='#cdcdcd';
        moveToElementId=dragElement.id;
        break;
      }
      
    }
    
  }
  
  //对调两个元素
  function exchange(id1,id2){
    var innerValue=$(id1).innerHTML;
    var value=$(id1).getAttribute("value");
    var color=$(id1).style.color;
    var fontWeight=$(id1).style.fontWeight;
    
    $(id1).innerHTML=$(id2).innerHTML;
    $(id2).innerHTML=innerValue;
    
    $(id1).style.color=$(id2).style.color;
    $(id2).style.color=color;
    
    $(id1).style.fontWeight=$(id2).style.fontWeight;
    $(id2).style.fontWeight=fontWeight;
    
    $(id1).setAttribute("value",$(id2).getAttribute("value"));
    $(id2).setAttribute("value",value);
  }
  
  this.getCheckElement=function(){
    return $(chkElementId);
  };
  
}

/**
 * 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);
  }
}
