﻿/*******************************************************************************
 *        程序 ID     ：    Storage
 *        程序名称    ：    Storage管理类
 *        处 理       ：    定义CONST、Message和Storage类
 *        功 能       ：    定义CONST、Message和Storage类
 *
 *        修改履历
 *        年  月  日 区分 所 属/担 当        内 容                                        对应编号
 *        ---------- ---- ------------------ -------------------------------------------- --------
 *        2007/10/16 编写 Intasect/陈冬    新規作成
 *        2007/10/24 变更 Intasect/陈冬    Session失效后提示,等待两秒后刷新并打开登录页片
 *        2007/10/30 变更 Intasect/陈冬    GUEST用户不读Cookie(添加CONST.UseCookie标识)
 *        2007/11/04 变更 Intasect/陈冬    一般浏览者Session不过期                        W0710104.284
 *        2007/11/19 变更 Intasect/陈冬    修改过期后alert框样式与网站风格统一
 * 
 * 
 *        Copyright ( C ) 2007 by Intasect communications(Chengdu), Co, Ltd.
 *        All rights reserved.
 *
********************************************************************************/
var CONST = {
  SiteUrl   : "",
  GUEST     : "",
  Menu1Spec : ["我要找理财师","我要提供服务","我的信箱"],
  LoginAspx : "USM0031010",  //登录画面
  RiskTestAspx : "ALS0051010_1",  //风险测试画面
  MsgBoxAspx: "USC0031010",  //收件箱画面
  FullAspx  : ['BAS0071010',
               'BAS00A1010',
               'ALS00I1010', //理财保险方案选择客户
               'ALS00I5010', //理财保险方案封面
               'ALS00G1010','ALS00G2010','ALS00G3010','ALS00G4010','ALS00G5010','ALS00G6010','ALS00G7010','ALS00G8010','ALS00G9010','ALS00GA010','ALS00GB010','ALS00GC010','ALS00GD010',
               'CSC9990003'  //服务指南
               ],
  // 读取新信息的时间间隔(秒)
  ReadMsgTime : 120,
  // 读取指数行情的时间间隔(秒)
  ReadIndexTime : 180,
  //指数代码数组
  IndexArray:["sh000001","sh000003","sh000300","sz399001","sz399003"],
  //actor id
  Actors : {GUEST:'999', REGED:'101', MEMBER:'102'},
  
  HtmlTag :
  {
    Body   : "BODY",
    Table  : "TABLE",
    TBody  : "TBODY",
    Tr     : "TR",
    Td     : "TD",
    Div    : "DIV",
    Span   : "SPAN",
    A      : "A",
    Label  : "LABEL",
    Img    : "IMG",
    Input  : "INPUT",
    Select : "SELECT",
    Object : "OBJECT"
  },

  CSS :
  {
    Display    : {None:"none", Empty:""},
    Position   : {Absolute:"absolute", Relative:"relative"},
    Visibility : {Visible:"visible",Hidden:"hidden"}
  },
  
  Res :
  {
    ImgLoading       : "img/default/loading0.gif",
    ImgHelp          : "img/default/helpIcon.gif",
    ImgMenu3More     : "img/default/menu3more.gif",
    ImgMenu3Less     : "img/default/menu3less.gif",
    ImgMenuArrow     : "img/default/menuarrow.gif",
    ImgMenuArrowSpec : "img/default/menuarrow_Spec.gif",
    ImgSettingArrow  : "img/default/page_settings_arrow.gif",
    ImgAlertIcon     : "img/default/PT008.gif"
  }
}

var Message = {
  Show : function(str){
    var params = new Array();
    for(var i=1;i<arguments.length;i++){
      params[i-1]=arguments[i];
    }
    if(params.length>0){
      alert(str.format(params));
    }else{
      alert(str);
    }
  },

  MSG : 
  {
    GuestReadError        : "GUEST用户读取失败！",
    NotLoginedOrDataError : "没有以有效的数据库用户登录 或\n该用户的个性化设置表未初始化",
    AspxConfigNotFound    : "未配置画面{0},请检查AspxConfig.js!",
    AddCustomPageError    : "添加自定义页失败，请联系管理员！",
    PageInitUnComplete    : "页面未成功初始化！",
    SysException          : "sorry 出现错误,请和管理员联系！",
    MenuNotLoaded         : "未能加载菜单！",
    FlakeNotFound         : "Exception [Flakes : {0}] : 未找到页片！",
    SessionExpired        : "Session已过期,3秒后将自动跳转到登录页面",
    PageNoRights          : "您没有使用<font color='red'>{0}</font>功能的权限。<br>要使用该功能，请先<font color='red'>{1}</font>。",
    RegOrLoginFirst       : "请先注册或登录！",
    ApplayProvFirst       : "请先申请成为理财师！",
    NeedCorrectItem       : "请输入正确的品种！"
  }
}

var Storage = 
{
  Data    : {},
  state   : "",
  
  STATE   : 
  {
    Normal : "",
    Init   : "init",
    Wait   : "wait"
  },

  User    : "",
  Logined : false,
  WSUrl   : "/webservice/com/T000W11005.asmx/",
  INPRIVILEGE : "Inprivilege",
  AjaxMethod  : "POST",

  CHANGE  : 
  {
    GetMenuData      : "GetMenuData",
    GetFlakeData     : "GetFlakeData",
    GetMenu3s        : "GetMenu3s",
    AddPage          : "AddPage",
    UpdatePage       : "UpdatePage",
    MovePage         : "MovePage",
    TogglePage       : "TogglePage",
    RemovePage       : "RemovePage",
    AddFlake         : "AddFlake",
    UpdateFlake      : "UpdateFlake",
    MoveFlakeInCell  : "MoveFlakeInCell",
    MoveFlakeOutCell : "MoveFlakeOutCell",
    MoveFlakeOutPage : "MoveFlakeOutPage",
    RemoveFlake      : "RemoveFlake",
    ToggleMenuExpand : "ToggleMenuExpand",
    Quit             : "Quit",
    GetNewMsg        : "GetNewMsg"
  },
  
  Intervals :
  {
    Msg : null,
    Index : null
  },
  
  Timeouts :
  {
    Index : null
  },

  Init : function()
  {
    var siteurl = window.location.href.split("?")[0];
    if(siteurl.toLowerCase().indexOf("default") == -1)
    {
      this.WSUrl = siteurl + this.WSUrl;
    }
    else
    {
      this.WSUrl = siteurl.toLowerCase().replace(siteurl.toLowerCase().substring(siteurl.toLowerCase().indexOf("default")),this.WSUrl);
    }
    this.WSUrl = this.WSUrl.replace("//webservice","/webservice");
    CONST.SiteUrl = this.WSUrl.split("/webservice")[0];
    this.Logined = (this.User == "" || this.User == CONST.GUEST) ? false : true;
    this._InitObserver();
  },
  
  InitEnd : function()
  {
    //读取新信息
    if(this.User != "" && this.User != CONST.GUEST)
    {
        Storage.GetNewMsg();
        Storage.Intervals.Msg = setInterval("Storage.GetNewMsg()",CONST.ReadMsgTime * 1000);
    }
    //读取新指数
    Storage.GetNewIndex();
    Storage.StartIndexInterval();
  },
  
  _InitObserver : function()
  {
    var myObserver = {
      onInit : function(eventName,obj){
        Storage.state = Storage.STATE.Init;
      },
      onEndInit : function(eventName,obj){
        Storage.state = Storage.STATE.Normal;
        if(document.location.search == "?login" && (Storage.User == "" || Storage.User == CONST.GUEST))
        {
          Flakes.AddFlake(CONST.LoginAspx);
        }
      },
      onWait : function(eventName,obj){
        Storage.state = Storage.STATE.Wait;
      },
      onStopWait : function(eventName,obj){
        Storage.state = Storage.STATE.Normal;
      }
    }
    this.addObserver(myObserver);
  },

  //读个性化设置
  Read : function()
  {
    if (!this.Logined)
    {
      //从DB读Guest
      this._readGuestDB();
    } else {
      //从DB读Guest + User
      this._readDB();
    }
  },

  //从DB读Guest
  _readGuestDB : function()
  {
    var myAjax = new Ajax.Request(
      this.WSUrl + Storage.CHANGE.GetMenuData,
      {
        method      : Storage.AjaxMethod,
        parameters  : "user_id="+CONST.GUEST,
        onComplete  : Storage._completeGetGuestFlakeData
      }
    );
  },

  //关闭窗口
  Quit : function()
  {
    if(Storage.User == ""){
      return;
    }
    var ouser = Storage.User;
    Storage.User = "";
    var myAjax = new Ajax.Request(
      this.WSUrl + Storage.CHANGE.Quit,
      {
        method      : Storage.AjaxMethod,
        parameters  : "user_id=" + ouser,
        onComplete  : ""
      }
    );
  },
  
  //读取新信息
  GetNewMsg : function()
  {
    var myAjax = new Ajax.Request(
      this.WSUrl + Storage.CHANGE.GetNewMsg,
      {
        method      : Storage.AjaxMethod,
        parameters  : "user_id="+Storage.User,
        onComplete  : Storage._completeGetNewMsg
      }
    );
  },
  
  //读取新信息完成
  _completeGetNewMsg : function(AJAXRequest)
  {
    var msgNum = AJAXRequest.responseXML.text;
    Storage.ShowNewMsg(msgNum);
  },
  
  ShowNewMsg : function(msgNum)
  {
    if(!isNaN(parseInt(msgNum)))
    {
        if(msgNum != "0")
        {
            document.getElementById("aMyMsgBox").innerHTML="我的信箱(<font color=red>"+msgNum+"</font>)";
            return;
        }
    }
    document.getElementById("aMyMsgBox").innerHTML="我的信箱";
  },
  
  StartIndexInterval : function()
  {
    clearInterval(Storage.Intervals.Index);
    Storage.Intervals.Index = setInterval("Storage.GetNewIndex()",CONST.ReadIndexTime * 1000);
  },
  
  StopIndexInterval : function()
  {
    clearInterval(Storage.Intervals.Index);
    Storage.Intervals.Index = null;
  },
  
  //读取新行情
  GetNewIndex : function()
  {
    for(var i=0;i<CONST.IndexArray.length;i++)
    {
        var myAjax = new Ajax.Request(
          CONST.SiteUrl + "/IndexDataBridge.aspx",
          {
            method      : Storage.AjaxMethod,
            parameters  : "StockCode="+CONST.IndexArray[i],
            onComplete  : Storage._completeGetNewIndex
          }
        );
    }
  },
  
  //读取新行情完成
  _completeGetNewIndex : function(AJAXRequest)
  {
    if(AJAXRequest.responseText == "false")
    {
        return;
    }
    try
    {
        var indexdata = JSUtil.GetChildNode(AJAXRequest.responseXML,"indexdata");
        var updatetimes = JSUtil.GetChildNode(indexdata,"updatetimes").text;
        var biztime = JSUtil.GetChildNode(indexdata,"biztime").text;
        var indexcode = JSUtil.GetChildNode(indexdata,"indexcode").text;
        var indexname = JSUtil.GetChildNode(indexdata,"indexname").text;
        var datadate = JSUtil.GetChildNode(indexdata,"datadate").text;
        var datatime = JSUtil.GetChildNode(indexdata,"datatime").text;
        var curindex = JSUtil.GetChildNode(indexdata,"curindex").text;
        var prev = JSUtil.GetChildNode(indexdata,"prev").text;
        var open = JSUtil.GetChildNode(indexdata,"open").text;
        var rise = JSUtil.GetChildNode(indexdata,"rise").text;
        var low = JSUtil.GetChildNode(indexdata,"low").text;
        var high = JSUtil.GetChildNode(indexdata,"high").text;
        var riseratio = JSUtil.GetChildNode(indexdata,"riseratio").text;
        var quantity = JSUtil.GetChildNode(indexdata,"quantity").text;
        var volume = JSUtil.GetChildNode(indexdata,"volume").text;
        var risecolor;
        if(rise.indexOf("-") > -1)
        {
            risecolor = "#009900";
            //rise = rise.replace("-","↓");
//            riseratio = riseratio.replace("-","");
        }else{
            risecolor = "#FF3333";
            //rise = rise.replace("+","↑");
            riseratio = riseratio.replace("+","");
        }
        var dtp = datadate.split("-");
        datadate = new Date(parseInt(dtp[0],10),parseInt(dtp[1],10)-1,parseInt(dtp[2],10)).format("M月d日");
        var highcolor,lowcolor,opencolor;
        if(high >= prev)
        {
            highcolor = "#FF3333";
        }else{
            highcolor = "#009900";
        }
        if(low >= prev)
        {
            lowcolor = "#FF3333";
        }else{
            lowcolor = "#009900";
        }
        if(open >= prev)
        {
            opencolor = "#FF3333";
        }else{
            opencolor = "#009900";
        }
        document.getElementById("index"+indexcode).innerHTML = 
            "<table style=\"text-align:left; width:200px;\">"
            + "<tr><td colspan=\"2\" nowrap><label class=\"TextLabelStyle\">"+datadate+"</label>&nbsp;&nbsp;"+curindex+"&nbsp;&nbsp;<label style=\"color:" + risecolor + ";\">"+rise+" (" +riseratio+")</label></td></tr>"
            
            //新浪
            //+ "<tr><td colspan=\"2\"><img id=\"img"+indexcode+"\" src=\"http://image.sinajs.cn/newchart/small/b"+indexcode+".gif\" /></td></tr>"
            
            //证券之星
            + "<tr><td colspan=\"2\"><img id=\"img"+indexcode+"\" src=\"http://202.109.106.9/chartserver?code="+indexcode.substring(2)+"&mk="+(indexcode.substring(0,2) == "sh" ? "1" : "2")+"&freq=1&tech1=22&size=3\" style=\"width:200px;height:138px;\" /></td></tr>"
            
            + "<tr><td style=\"width:100px;\">&nbsp;&nbsp;昨收：<label>"+prev+"</label></td><td style=\"width:100px;\">今开：<label style=\"color:"+opencolor+";\">"+open+"</label></td></tr>"
            + "<tr><td style=\"width:100px;\">&nbsp;&nbsp;最高：<label style=\"color:" + highcolor + ";\">"+high+"</label></td><td style=\"width:100px;\">最低：<label style=\"color:"+lowcolor+";\">"+low+"</label></td></tr>"
            + "<tr><td colspan=\"2\">&nbsp;&nbsp;成交：<label>"+quantity+"手&nbsp;&nbsp;&nbsp;&nbsp;"+volume+"亿元</label></td></tr>"
            //+ "<tr><td>"+updatetimes+"</td></tr>"
            +"</table>";
        if(biztime == "+1")
        {
            //交易中
        }
        else if(biztime == "-1")
        {
            //非交易日或交易结束
            Storage.StopIndexInterval();
        }
        else
        {
            //即将开盘
            Storage.StopIndexInterval();
            if(Storage.Timeouts.Index == null)
            {
                Storage.Timeouts.Index = setTimeout("Storage.StartIndexInterval()",parseInt(biztime,10) * 60 * 1000);
            }
        }
        //window.status =  new Date();
    }catch(e){}
  },

  ParseAjaxResponse : function(AJAXRequest)
  {
    var responseObj = {};
    var dataXML = JSUtil.GetChildNode(JSUtil.GetChildNode(JSUtil.GetChildNode(AJAXRequest.responseXML,"DataSet"),"diffgr:diffgram"),"NewDataSet");
    var _pagearr_  = new Array();
    var _flakearr_ = new Array();
    var _menuXml_  = "";
    var _menu1ID_  = "";
    var _menu2ID_  = "";
    for(var i=0;i<dataXML.childNodes.length;i++)
    {
      var dataNode = dataXML.childNodes[i];
      if(dataNode.nodeName == "dtMenuInfo")
      {
        if (_menuXml_ == "")
        {
          _menuXml_ += "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
          _menuXml_ += "<menus>\n";
        }
        var __menu1_id      = JSUtil.GetChildNode(dataNode,"MENU1_ID").text;
        var __menu1_text    = JSUtil.GetChildNode(dataNode,"MENU1_TEXT").text;
        var __menu2_id      = JSUtil.GetChildNode(dataNode,"MENU2_ID").text;
        var __menu2_text    = JSUtil.GetChildNode(dataNode,"MENU2_TEXT").text;
        var __menu3_id      = JSUtil.GetChildNode(dataNode,"MENU3_ID").text;
        var __menu3_text    = JSUtil.GetChildNode(dataNode,"MENU3_TEXT").text;
        var __icon          = JSUtil.GetChildNode(dataNode,"ICON").text;
        var __right         = JSUtil.GetChildNode(dataNode,"RIGHT").text;
        var __aspx_id       = JSUtil.GetChildNode(dataNode,"ASPX_ID") ? JSUtil.GetChildNode(dataNode,"ASPX_ID").text : "";
        var __direct        = JSUtil.GetChildNode(dataNode,"DIRECT").text == 1 ? "true" : "false";
        var __service_id    = JSUtil.GetChildNode(dataNode,"SERVICE_ID") ? JSUtil.GetChildNode(dataNode,"SERVICE_ID").text : "";
        var __forcharge     = JSUtil.GetChildNode(dataNode,"FORCHARGE").text == 1 ? "true" : "false";
        var __service_price = JSUtil.GetChildNode(dataNode,"SERVICE_PRICE") ? JSUtil.GetChildNode(dataNode,"SERVICE_PRICE").text : "";
        if(__menu1_id != _menu1ID_ && __menu2_id != _menu2ID_)
        {
          if(_menu1ID_ != "" && _menu2ID_ != "")
          {
            _menuXml_ += "    </menu2>\n";
            _menuXml_ += "  </menu1>\n";
          }
        }else if(__menu2_id != _menu2ID_){
          if(_menu2ID_ != "")
          {
            _menuXml_ += "    </menu2>\n";
          }
        }
        if(__menu1_id != _menu1ID_)
        {
          _menuXml_ += "  <menu1 text=\""+__menu1_text+"\" menuID=\""+__menu1_id+"\">\n";
          _menu1ID_ = __menu1_id;
        }
        if(__menu2_id != _menu2ID_)
        {
          _menuXml_ += "    <menu2 text=\""+__menu2_text+"\" menuID=\""+__menu2_id+"\" fullExpand=\"false\">\n";
          _menu2ID_ = __menu2_id;
        }
        _menuXml_ += "      <menu3 menuID=\""+__menu3_id+"\" title=\""+__menu3_text+"\" icon=\""+__icon+"\" right=\""+__right+"\" pageid=\""+__aspx_id+"\" direct=\""+__direct+"\" forcharge=\""+__forcharge+"\"/>\n";
      }
      else if(dataNode.nodeName == "dtActorID")
      {
          Storage.ActorID = JSUtil.GetChildNode(dataNode,"ACTOR_ID").text;
      }
    }
    if(_menuXml_ != "")
    {
      _menuXml_ += "    </menu2>\n";
      _menuXml_ += "  </menu1>\n";
      _menuXml_ += "</menus>\n";
    }
    
    responseObj.menus = _menuXml_;
    
    return responseObj;
  },
  
  ParseFlakeData : function(AJAXRequest)
  {
    var responseObj = Storage.ParseAjaxResponse(AJAXRequest);
    Storage.Data.menus = responseObj.menus;

    Menu1s.Init();
    Storage.notify(Storage.EVENT.onEndInit);
  },

  //从DB读Guest完成
  _completeGetGuestFlakeData : function(AJAXRequest)
  {
    if(AJAXRequest.responseXML.xml == "" || JSUtil.GetChildNode(JSUtil.GetChildNode(AJAXRequest.responseXML,"DataSet"),"diffgr:diffgram") == null)
    {
      Message.Show(Message.MSG.GuestReadError);
      return;
    }
    
    Storage.ParseFlakeData(AJAXRequest);
  },

  //从DB读Guest + User完成
  _completeGetMenuData : function(AJAXRequest)
  {
    if(AJAXRequest.responseXML.xml == "" || JSUtil.GetChildNode(JSUtil.GetChildNode(AJAXRequest.responseXML,"DataSet"),"diffgr:diffgram") == null)
    {
      Message.Show(Message.MSG.NotLoginedOrDataError);
      Storage.User = "";
      return;
    }
    
    Storage.ParseFlakeData(AJAXRequest);
  },

  //从DB读Guest + User
  _readDB : function()
  {
    var myAjax = new Ajax.Request(
      this.WSUrl + Storage.CHANGE.GetMenuData,
      {
        method      : Storage.AjaxMethod,
        parameters  : "user_id="+this.User,
        onComplete  : Storage._completeGetMenuData
      }
    );
  },
    
  SessionExpired : function()
  {
    if(Storage.User == "" || Storage.User == CONST.GUEST)                      // ADD W0710104.284
    {
      Storage._refreshPage();
      return;
    }
    Storage.Quit();
    Dialog.alert(Message.MSG.SessionExpired,
                 {
                  okLabel:"确定",
                  buttonClass:"EditAeraButtonStyle",
                  windowParameters:{
                                    height:120,
                                    width:300,
                                    draggable:false,
                                    className:"dialog",
                                    icon:CONST.Res.ImgAlertIcon
                                   },
                  ok : Storage._showLogin
                 }
                );
     setTimeout(Storage._showLogin,3000);
  },
  
  _refreshPage : function()                                                    // ADD W0710104.284
  {
    window.location.href = CONST.SiteUrl;
  },
  
  //刷新并打开登录页片
  _showLogin : function()
  {
    window.location.href = CONST.SiteUrl + "?login";
  }
}

Object.extend(Storage,StaticObserver);
