if (window.HTMLElement) {
    HTMLElement.prototype.__defineSetter__("outerHTML", function(sHTML) {
        var r = this.ownerDocument.createRange();
        r.setStartBefore(this);
        var df = r.createContextualFragment(sHTML);
        this.parentNode.replaceChild(df, this);
        return sHTML;
    });
    HTMLElement.prototype.__defineGetter__("outerHTML", function() {
        var attr;
        var attrs = this.attributes;
        var str = "<" + this.tagName;
        for (var i = 0; i < attrs.length; i++) {
            attr = attrs[i];
            if (attr.specified)
                str += " " + attr.name + '="' + attr.value + '"';
        }
        return str + ">" + this.innerHTML + "</" + this.tagName + ">";
    });
}

Array.prototype.getCitySet = function(zipstring, returnzipstring) {
    var rzipstring = (arguments.length > 1) ? arguments[1] : "";
    var item = function(params, index) {
        return { CityCode: params[0], CityName: params[1], CityNameEN: params[2], CityNameCN: params[3], SonCitySet: function() {
            var oneset = rzipstring.split("&");
            if (rzipstring.length == 0 || oneset.length - 1 < index) return [];
            var sonArray = new Array;
            sonArray.getCitySet(oneset[index]);
            return sonArray;
        }
        };
    };
    this.unZipModel(zipstring, item);
}

Array.prototype.getAirCorpSet = function(zipstring, returnzipstring) {
    var rzipstring = (arguments.length > 1) ? arguments[1] : "";
    var item = function(params, index) {
        return { Corp: params[0], CorpName: params[1], SonCitySet: function() {
            var oneset = rzipstring.split("&");
            if (rzipstring.length == 0 || oneset.length - 1 < index) return [];
            var sonArray = new Array;
            sonArray.getAirCorpSet(oneset[index]);
            return sonArray;
        }
        };
    };
    this.unZipModel(zipstring, item);
}

var DeliveryDateRule = function(zipstring) {
    var deliveryparams = zipstring.split("&");

    //this.ValidWeekDay=deliveryparams[0];
    var WeekEndDay = deliveryparams[1];
    this.GetTimeField = function(weekday) {
        var timeField = new Array;
        if (WeekEndDay.indexOf(weekday) > -1)
            timeField.getTimeField(deliveryparams[3]);
        else
            timeField.getTimeField(deliveryparams[2]);
        return timeField;
    };
}

Array.prototype.getTimeField = function(zipstring) {
    var item = function(params, index) {
        return { TimeId: params[0], TimeValue: params[1] };
    };
    this.unZipModel(zipstring, item);
}
Array.prototype.getDeliverSet = function(zipstring) {
    var item = function(params, index) {
        return { AreaId: params[0], Fee: params[1], TimeLimit: params[2], AreaName: params[3], LastDeliverTime: params[4], DeliverNote: params[5], AllValue: params.join(",") };
    };
    this.unZipModel(zipstring, item);
}
Array.prototype.getFlightSet = function(ItiSetTag, zipstring) {
    var item = function(params, index) {
        return { Id: params[0], Price: params[1], StartTime: params[2], ArriveTime: params[3], ClassType: params[4], AirCode: params[5], PlaneType: params[6], AdultType: params[7], StopType: params[8]
	, PriceEnable: true, TimeEnable: params[9] == "True", ClassTypeEnable: params[10] == "True", AirCodeEnable: true, PlaneTypeEnable: true, AdultTypeEnable: true, StopTypeEnable: true, ArriveDate: params[11]
	, SrcAirPort: params[12], SrcAirPortEnable: true, DestAirPort: params[13], DestAirPortEnable: true
        };
    };
    this.unZipModel(zipstring, item);
    this.GetValueByName = function(index, fieldname) {
        if (fieldname == "Price") return this[index].Price;
        else if (fieldname == "StartTime") return this[index].StartTime;
        else if (fieldname == "ArriveTime") return this[index].ArriveTime;
        else if (fieldname == "ClassType") return this[index].ClassType;
        else if (fieldname == "AirCode") return this[index].AirCode;
        else if (fieldname == "PlaneType") return this[index].PlaneType;
        else if (fieldname == "AdultType") return this[index].AdultType;
        else if (fieldname == "StopType") return this[index].StopType;
        else if (fieldname == "ArriveDate") return this[index].ArriveDate;
        else if (fieldname == "SrcAirPort") return this[index].SrcAirPort;
        else if (fieldname == "DestAirPort") return this[index].DestAirPort;
        else return 0;
    }
    this.SetValueByName = function(index, fieldname, value) {
        if (fieldname == "Price") this[index].PriceEnable = value;
        else if (fieldname == "StartTime" || fieldname == "ArriveTime") this[index].TimeEnable = value;
        else if (fieldname == "ClassType") this[index].ClassTypeEnable = value;
        else if (fieldname == "AirCode") this[index].AirCodeEnable = value;
        else if (fieldname == "PlaneType") this[index].PlaneTypeEnable = value;
        else if (fieldname == "AdultType") this[index].AdultTypeEnable = value;
        else if (fieldname == "StopType") this[index].StopTypeEnable = value;
        else if (fieldname == "SrcAirPort") this[index].SrcAirPortEnable = value;
        else if (fieldname == "DestAirPort") this[index].DestAirPortEnable = value;
    }
    this.IsEnable = function(index) {
        return this[index].PriceEnable && this[index].TimeEnable && this[index].ClassTypeEnable && this[index].AirCodeEnable && this[index].PlaneTypeEnable && this[index].AdultTypeEnable && this[index].StopTypeEnable && this[index].SrcAirPortEnable && this[index].DestAirPortEnable;
    }
    this.HasEnable = function() {
        for (var i = 0; i < this.length; i++) {
            if (this.IsEnable(i)) return true
        }
        return false;
    }

    this.EnableCount = function() {
        var count = 0;
        for (var i = 0; i < this.length; i++) {
            if (this.IsEnable(i)) count++;
        }
        return count;
    }

}
Array.prototype.IsEnable = function() {
    for (var i = 0; i < this.length; i++) {
        if (this[i].IsEnable) return true
    }
    return false;
}
Array.prototype.ReDisplay = function(divName) {

    var HtmlString = "";
    for (var i = 0; i < this.length; i++) {

        var obj = document.getElementById(divName + "_Iti_" + this[i].Id);
        if (obj != null) {
            HtmlString += obj.outerHTML + "<br>";
        }

        //HtmlString += document.getElementById(divName+"_Iti_" +this[i].Id).outerHTML + "<br>";



    }

    var Span = document.getElementById("SearchResult1_" + divName + "Itinerary1_" + divName + "Repeated");
//    if (Span != null) {
//        Span.innerHTML = HtmlString;
//        }
    
    //解决firefox下的innerHTML加载比较慢的问题
    replaceHtml("SearchResult1_" + divName + "Itinerary1_" + divName + "Repeated", HtmlString);

}

function replaceHtml(el, html) {
    var oldEl = document.getElementById(el);
    var newEl = oldEl.cloneNode(false);
    newEl.innerHTML = html;
    oldEl.parentNode.replaceChild(newEl, oldEl);
    return newEl;
}

/*
Array.prototype.sortBy=function(sortField, orderBy){
var order = (arguments.length>1)?arguments[1]:"asce";
var temp;
for(var i=0; i<this.length; i++) {
var k = i;
for(var j=i+1; j<this.length; j++) {
fieldValue0 = setDataType( this.GetValueByName(j, sortField ));
fieldValue1 = setDataType( this.GetValueByName(k, sortField ));
if ( order=="desc"){
if( fieldValue0 > fieldValue1)  
k=j;
}
else{
if( fieldValue0 < fieldValue1 )  
k=j;
}
}
if (k != i){
temp = this[i];
this[i] = this[k];
this[k] = temp;
}
}
}	

*/

Array.prototype.sortBy = function(sortField, orderBy, sortField2) {
    var order = (arguments.length > 1) ? arguments[1] : "asce";
    var temp;

    if (sortField == "Price") {
        sortField2 = "StartTime";
    }
    else {
        sortField2 = "Price";
    }
    for (var i = 0; i < this.length; i++) {
        var k = i;
        for (var j = i + 1; j < this.length; j++) {

            fieldValue0 = setDataType(this.GetValueByName(j, sortField));
            fieldValue1 = setDataType(this.GetValueByName(k, sortField));

            fieldValue0_2 = setDataType(this.GetValueByName(j, sortField2));
            fieldValue1_2 = setDataType(this.GetValueByName(k, sortField2));


            if (order == "desc") {
                if (fieldValue0 > fieldValue1) {
                    k = j;
                }
                if (fieldValue0 == fieldValue1) {
                    if (fieldValue0_2 < fieldValue1_2) k = j;
                }
            }
            else {
                if (fieldValue0 < fieldValue1) {
                    k = j;
                }
                if (fieldValue0 == fieldValue1) {
                    if (fieldValue0_2 < fieldValue1_2) k = j;
                }

            }
        }
        if (k != i) {
            temp = this[i];
            this[i] = this[k];
            this[k] = temp;
        }
    }
}


Array.prototype.filter = function(filtdelegate, filtField, filtValue1, filtValue2) {
    var valueStart = filtValue1 == "" ? 0 : filtValue1;
    var valueEnd = filtValue2 == "" ? 100000 : filtValue2;

    for (var i = 0; i < this.length; i++) {
        fieldValue = parseInt(this.GetValueByName(i, filtField), 10);
        var filtresult = (fieldValue >= parseInt(valueStart, 10) && fieldValue <= parseInt(valueEnd, 10));
        this.SetValueByName(i, filtField, filtresult);
        filtresult = this.IsEnable(i);
        if (filtdelegate != null) filtdelegate(this[i].Id, filtresult);
    }
}

Array.prototype.equalFilter = function(filtdelegate, filtField, filtValue, checked) {
    for (var i = 0; i < this.length; i++) {
        var filtresult;
        if (filtValue == "") filtresult = true;
        else {
            fieldValue = this.GetValueByName(i, filtField);
            filtresult = (fieldValue == filtValue);
        }
        if (filtresult) {
            filtresult = checked;
            this.SetValueByName(i, filtField, filtresult);
            filtresult = this.IsEnable(i);
            if (filtdelegate != null) filtdelegate(this[i].Id, filtresult);
        }
    }
}

Array.prototype.equalRepulsionFilter = function(filtdelegate, filtField, filtValue) {
    for (var i = 0; i < this.length; i++) {
        var filtresult;
        if (filtValue == "") filtresult = true;
        else {
            fieldValue = this.GetValueByName(i, filtField);

            if (filtField == "ClassType")
                filtresult = ((parseInt(fieldValue, 10) | parseInt(filtValue, 10)) == parseInt(fieldValue, 10));
            else filtresult = (fieldValue == filtValue);
        }
        this.SetValueByName(i, filtField, filtresult);
        filtresult = this.IsEnable(i);
        if (filtdelegate != null) filtdelegate(this[i].Id, filtresult);
    }
}

Array.prototype.unZipModel = function(zipstring, iterator) {
    var pairs = zipstring.split(";");
    for (var i = 0; i < pairs.length; i++) {
        var pair = pairs[i].split("|");
        this.push(iterator(pair, i));
    }
}
function SelectSort(arr) { //选择排序->直接选择排序
    var st = new Date();
    var temp;
    for (var i = 0; i < arr.length; i++) {
        var k = i;
        for (var j = i + 1; j < arr.length; j++) {
            if ((setDataType(arr[j])) < (setDataType(arr[k])))
                k = j;
        }
        if (k != i) {
            temp = arr[i];
            arr[i] = arr[k];
            arr[k] = temp;
        }
    }
    status = (new Date() - st) + ' ms';
    return arr;
}

function setDataType(cValue) {
    if (isNaN(cValue)) {
        cValue = cValue.toUpperCase();
        return cValue;
    }
    else {
        var myNum;
        myNum = String.fromCharCode(48 + cValue.length) + cValue;
        return myNum;
    }
}

/* ==================== ScriptHelper 开始 ==================== */
/* scriptHelper 脚本帮助对象.
创建人: ziqiu.zhang  2008.3.5
添加函数: 
getScroll():得到鼠标滚过的距离-兼容XHTML
getClient():得到浏览器当前显示区域的大小-兼容XHTML
showDivCommon():显示图层.
   
使用举例:
<div id="testDiv" style="display:none; position:absolute; border:1px #000000;">我是测试图层我是测试图层</div>
<div style="width:400px; text-align:center;"><div><a href="#" onclick="ScriptHelper.showDivCommon(this,'testDiv', 20, 70)">事件源</a></div></div>

*/

function scriptHelper() {
}

//得到鼠标滚过的距离 scrollTop 与 scrollLeft 
//用法与测试:
/*
var myClient = getClient();
alert("myClient.clientHeight:" + myClient.clientHeight);
alert("myClient.clientWidth:" + myClient.clientWidth);
*/
scriptHelper.prototype.getScroll = function() {
    var sTop = 0, sLeft = 0, sWidth = 0, sHeight = 0;

    sTop = (document.body.scrollTop > document.documentElement.scrollTop) ? document.body.scrollTop : document.documentElement.scrollTop;
    if (isNaN(sTop) || sTop < 0) { sTop = 0; }

    sLeft = (document.body.scrollLeft > document.documentElement.scrollLeft) ? document.body.scrollLeft : document.documentElement.scrollLeft;
    if (isNaN(sLeft) || sLeft < 0) { sLeft = 0; }

    return { sTop: sTop, sLeft: sLeft, sWidth: sWidth, sHeight: sHeight };
}

//得到浏览器当前显示区域的大小 clientHeight 与 clientWidth
/*	用法与测试:
var myScroll = getScroll();	
alert("myScroll.sTop:" + myScroll.sTop);
alert("myScroll.sLeft:" + myScroll.sLeft);
*/
scriptHelper.prototype.getClient = function() {
    var h1 = document.body.clientHeight;
    var h2 = document.documentElement.clientHeight;
    var isXhtml = (h2 <= h1 && h2 != 0) ? true : false;

    this.clientHeight = isXhtml ? document.documentElement.clientHeight : document.body.clientHeight;
    this.clientWidth = isXhtml ? document.documentElement.clientWidth : document.body.clientWidth;

    return { clientHeight: this.clientHeight, clientWidth: this.clientWidth };
}


//显示图层,再次调用则隐藏
scriptHelper.prototype.showDivCommon = function(sObj, divId, sObjHeight, moveLeft) {
    //sObj		: 要弹出图层的事件源
    //divId		: 要显示的图层ID
    //moveLeft  : centerLeft=0的情况下,显示图层的左面和事件源对其.moveLeft表示手工向左移动的距离.不移动则为0(默认).
    //sObjHeight: 事件源的高度,默认为20;

    //取消冒泡事件
    if (window.event != null) {
        window.event.cancelBubble = true;
    }
    else if (ScriptHelper.showDivCommon.caller.arguments[0] != null) {
        //alert(EventUtil.getEvent.caller.arguments[0]);
        ScriptHelper.showDivCommon.caller.arguments[0].cancelBubble = true;
    }

    var divObj = document.getElementById(divId); //获得图层对象
    var sObjOffsetTop = 0; //事件源的垂直距离
    var sObjOffsetLeft = 0; //事件源的水平距离
    var myClient = this.getClient();
    var myScroll = this.getScroll();
    var sWidth = sObj.width; //事件源对象的宽度
    var sHeight = sObjHeight; //事件源对象的高度
    var bottomSpace; //距离底部的距离

    if (moveLeft == null) {
        moveLeft = 0;
    }
    if (sObjHeight == null) {
        sObjHeight = 20;
    }


    if (divObj.style.display.toLowerCase() != "none") {
        //隐藏图层
        divObj.style.display = "none";
    }
    else {
        if (sObj == null) {
            alert("事件源对象为null");
            return false;
        }

        /* 获取事件源对象的偏移量 */
        var tempObj = sObj; //用于计算事件源坐标的临时对象
        while (tempObj && tempObj.tagName.toUpperCase() != "BODY") {
            sObjOffsetTop += tempObj.offsetTop;
            sObjOffsetLeft += tempObj.offsetLeft;
            tempObj = tempObj.offsetParent;
        }
        tempObj = null;

        /* 获取事件源控件的高度和宽度.*/
        if (sWidth == null) {
            sWidth = 100; //无法获取则为100
        }
        else {
            sWidth = sWidth + 1; //留出1px的距离			
        }

        /* 获取距离底部的距离 */
        //bottomSpace = myClient.clientHeight - myScroll.sTop - sHeight;		

        /* 设置图层显示位置 */
        //divObj.style.top=(bottomSpace>=divObj.height)?sObjOffsetTop+sHeight:sObjOffsetTop-divObj.height;
        divObj.style.top = (parseInt(sObjOffsetTop) + parseInt(sHeight)).toString() + "px";
        divObj.style.left = (parseInt(sObjOffsetLeft) - parseInt(moveLeft)).toString() + "px";
        divObj.style.display = "block";
    }
}

//关闭图层
scriptHelper.prototype.closeDivCommon = function(divId) {
    //divId		: 要隐藏的图层ID	
    var divObj = document.getElementById(divId); //获得图层对象	
    if (divObj != null) {
        divObj.style.display = "none";
    }
}

//关闭所有的过滤条件图层
scriptHelper.prototype.closeFilterDiv = function() {
    ScriptHelper.closeDivCommon("AirPortSrcFilterDivFlow");
    ScriptHelper.closeDivCommon("AirPortDestFilterDivFlow");
    ScriptHelper.closeDivCommon("AirCorpFilterDivFlow");
    ScriptHelper.closeDivCommon("PlaneTypeDivFlow");
}


//国内机票 搜索结果页使用的左侧过滤控件折叠用函数.
scriptHelper.prototype.showDivForFilter = function(ulId, sObj) {
    var obj = document.getElementById(ulId);

    if (obj == null) return;
    if (obj.style.display.toLowerCase() != "none") {
        obj.style.display = "none";
        sObj.className = "summarytitle3 taL leftlistli";
    }
    else {
        obj.style.display = "block";
        sObj.className = "summarytitle3 taL leftlistli2";
    }
}


var ScriptHelper = new scriptHelper(); //建立scriptHelper类的一个实例对象.全局使用.

/* ==================== ScriptHelper 结束 ==================== */	
