/**
 * @type function
 * @param {Ext.data.Store} 数据记录集合
 * @param {Object} 调用配置参数，支持如下属性
 *  <li>index: Integer,当前行记录索引位置</li>
 *  <li>idName: String,记录集合的id名称，如不提供则直接使用store.id值</li>
 *  <li>paiXuName: String,排序字段的名称，默认值为“paiXuCtrl”</li>
 *  <li>bingFaName: String,并发字段的名称，默认值为“bingFaCtrl”</li>
 *  <li>url: String,提交更新地址，如果不提供则采用公用地址执行，则必须提供表名，
 *    并且数据库中使用paiXuCtrl、bingFaCtrl字段</li>
 *  <li>action: String,执行操作，上移="up"，下移="down"，(交换="exchange")</li>
 *  <li>url: String,提交更新地址，如果不提供则采用公用地址执行，则必须提供表名，主键字段名
 *    并且数据库中使用paiXuCtrl、bingFaCtrl字段</li>
 *  <li>dbTable: String,数据库表名，如果不提供url必须提供</li>
 *  <li>dbKeyName: String,数据库表的主键字段名，如果不提供url必须提供</li>
 *  <li>reload: boolean,完成后是否刷新</li>
 *  <li>callBack: function handler,回调函数</li>  
 */
Ext.tsinnet.PaiXuMove = function(store,config){
  if (typeof store !="object"){
    top.Ext.Msg.alert("提示","请提供store参数");
    return false;
  }
  if (typeof config !="object"){
    top.Ext.Msg.alert("提示","请提供config参数");
    return false;
  }
  if ((typeof config.index!="number") || (config.index<0) || config.index>(store.getCount()-1)){
    top.Ext.Msg.alert("提示","参数提供不正确");
    return false;
  }
  if (!(config.action=="up"||config.action=="down")){
    top.Ext.Msg.alert("提示","不支持的操作类型");
    return false;
  }else if (config.index==0 && config.action=="up"){
    top.Ext.Msg.alert("提示","记录位于顶端,不允许上移操作");
    return false;
  }else if (config.index==(store.getCount()-1) && config.action=="down"){
    top.Ext.Msg.alert("提示","记录位于底端,不允许下移操作");
    return false;
  }
  if (!config.url && (!config.dbTable||!config.dbKeyName)){
    top.Ext.Msg.alert("提示","参数提供不正确");
    return false;
  }

  if (!config.paiXuName){
    config.paiXuName="paiXuCtrl";
  }
  if (!config.bingFaName){
    config.bingFaName="bingFaCtrl";
  }
  if (!config.idName){
    config.idName=store.reader.meta.id; 
  }
  var exChangeOneParams={
    guid:store.getAt(config.index).get(config.idName),
    paiXuCtrl:store.getAt(config.index).get(config.paiXuName)?store.getAt(config.index).get(config.paiXuName):-1,
    bingFaCtrl:store.getAt(config.index).get(config.bingFaName)?store.getAt(config.index).get(config.bingFaName):-1
  };
  var exChangeTwoParams={};
  if (config.action=="up"){
    exChangeTwoParams.guid=store.getAt(config.index-1).get(config.idName),
    exChangeTwoParams.paiXuCtrl=store.getAt(config.index-1).get(config.paiXuName)?store.getAt(config.index-1).get(config.paiXuName):-1,
    exChangeTwoParams.bingFaCtrl=store.getAt(config.index-1).get(config.bingFaName)?store.getAt(config.index-1).get(config.bingFaName):-1
  }else if (config.action=="down"){
    exChangeTwoParams.guid=store.getAt(config.index+1).get(config.idName),
    exChangeTwoParams.paiXuCtrl=store.getAt(config.index+1).get(config.paiXuName)?store.getAt(config.index+1).get(config.paiXuName):-1,
    exChangeTwoParams.bingFaCtrl=store.getAt(config.index+1).get(config.bingFaName)?store.getAt(config.index+1).get(config.bingFaName):-1
  }
  if (!config.url){
    config.url=CONTEXT_PATH+"/util/PaiXuCTRL.do";
  }
  var exChangeConfig={
    one:{
      guid:exChangeOneParams.guid,
      paiXuCtrl:exChangeOneParams.paiXuCtrl,
      bingFaCtrl:exChangeOneParams.bingFaCtrl
    },
    two:{
      guid:exChangeTwoParams.guid,
      paiXuCtrl:exChangeTwoParams.paiXuCtrl,
      bingFaCtrl:exChangeTwoParams.bingFaCtrl
    },
    paiXuName:config.paiXuName,
    bingFaName:config.bingFaName,
    url:config.url,
    dbTable:config.dbTable,
    dbKeyName:config.dbKeyName,
    reload:config.reload,
    callBack:config.callBack
  }
  return Ext.tsinnet.PaiXuExchange(exChangeConfig,store);
};

/**
 * @type function
 * @param {Object} 调用配置参数，支持如下属性
 *  <li>one: Object,需要交换的第一个数据属性信息，支持如下属性</li>
 *  <ul>
 *	  <li>guid: String,主键值</li>
 *    <li>paiXuCtrl: String,排序字段的名称</li>
 *    <li>bingFaCtrl: String,并发字段的名称</li>
 *  </ul>
 *  <li>two: Object,需要交换的第二个数据属性信息，支持的属性与one相同</li>
 *  <li>url: String,提交更新地址，如果不提供则采用公用地址执行，则必须提供表名，
 *    并且数据库中使用paiXuCtrl、bingFaCtrl字段</li>
 *  <li>action: String,执行操作，交换="exchange"，此处可以不提供</li>
 *  <li>dbTable: String,数据库表名，如果不提供url必须提供</li>
 *  <li>dbKeyName: String,数据库表的主键字段名，如果不提供url必须提供</li>
 *  <li>reload: boolean,完成后是否刷新</li>
 *  <li>callBack: function handler,回调函数</li>   
 */

Ext.tsinnet.PaiXuExchange=function(config,store){
  if (typeof config !="object"){
    top.Ext.Msg.alert("提示","请提供config参数");
    return false;
  }
  if (!config.url && (!config.dbTable||!config.dbKeyName)){
    top.Ext.Msg.alert("提示","参数提供不正确");
    return false;
  }
  if (!config.paiXuName){
    config.paiXuName="paiXuCtrl";
  }
  if (!config.bingFaName){
    config.bingFaName="bingFaCtrl";
  }
  if (!config.url){
    config.url=CONTEXT_PATH+"/util/PaiXuCTRL.do";
  }
  var params={
    one:Ext.encode(config.one),
    two:Ext.encode(config.two),
    dbTable:config.dbTable,
    dbKeyName:config.dbKeyName,
    paiXuName:config.paiXuName,
    bingFaName:config.bingFaName,
    reload:config.reload,
    callBack:config.callBack
  }
  Ext.Ajax.request({
    config:config,
    store:store,
    url:config.url,
    params:params,
    method:"POST",
    callback:Ext.tsinnet.PaiXuExchangeCallBack
  });
  return false;
};
Ext.tsinnet.PaiXuExchangeCallBack=function(options,success,response){
  if (!success){
    alert("服务器端运行出错");
  }else{
	  var resultObj = Ext.decode(response.responseText);
	  if(!resultObj) {
	    alert("错误<br>"+response.responseText);
	  }else if (resultObj.success === true){
      if (typeof options.store =="object" && options.config.reload){
        options.store.reload();
      }
	    if (typeof options.config.callBack =="function"){
	      options.config.callBack(options,success,response);
	    }
	  }else{
	    top.Ext.Msg.alert("信息","失败<br>"+resultObj.message);
	  }
  }
}
