/*! Module Name : BusLibrary.js
      version : 1.0
    Developer : daniel Park
    Description
    : 대중교통 관련 라이브러리.
*/


function getRailName(_lineNumber){
    var railName = "";

    if (!_lineNumber)
        return "";

    switch (_lineNumber) {
        case '100': railName = '분당선';  break;
        case '101': railName = '공항전철';  break;
        case '103': railName = '중앙선';  break;
        default:
            if(_lineNumber > 0 && _lineNumber <10)
                railName = "서울"+ (_lineNumber%10) + "호선";
            if(_lineNumber > 20 && _lineNumber <30)
                railName = "인천"+ (_lineNumber%20) + "호선";
            else if(_lineNumber > 30 && _lineNumber <40)
                railName = '대전'+ (_lineNumber%30) + '호선';
            else if(_lineNumber > 40 && _lineNumber <50)
                railName = '대구'+ (_lineNumber%40) + '호선';
            else if(_lineNumber > 50 && _lineNumber <60)
                railName = '광주'+ (_lineNumber%50) + '호선';
            else if(_lineNumber > 70 && _lineNumber <80)
                railName = '부산'+ (_lineNumber%70) + '호선';
            break;
    }

    return railName;
};

function getBusName(_lineNumber){
    var railName = "";
    if (!_lineNumber)
        return "";

    switch (_lineNumber) {
        case '1': railName = '일반';  break;
        case '2': railName = '좌석';  break;
        case '3': railName = '마을버스';  break;
        case '4': railName = '직행버스';  break;
        case '5': railName = '공항버스';  break;
        case '6': railName = '간선급행';  break;
        case '10': railName = '외곽';  break;
        case '11': railName = '간선';  break;
        case '12': railName = '지선';  break;
        case '13': railName = '순환';  break;
        case '14': railName = '광역 또는 급행';  break;
        case '26': railName = '급행간선';  break;
    }

    return railName;
};

function getRoadName(_type, _laneNumber){
    if(_type==1)
        return getBusName(_laneNumber);
    else if(_type==2)
        return getRailName(_laneNumber);
};

function LaneInformation(){
    this.laneX = new Array();
    this.laneY = new Array();
    this.laneName = '';
};
LaneInformation.prototype.setLaneName = function(_laneName){
    this.laneName = _laneName;
};
LaneInformation.prototype.getLaneName = function(){
    return this.laneName;
};
LaneInformation.prototype.setLaneX = function(_laneX){
    this.laneX.push(_laneX);
};
LaneInformation.prototype.getLaneX = function(_laneIndex){
    return this.laneX[_laneIndex];
};
LaneInformation.prototype.setLaneY = function(_laneY){
    this.laneY.push(_laneY);
};
LaneInformation.prototype.getLaneY = function(_laneIndex){
    return this.laneY[_laneIndex];
};
LaneInformation.prototype.getLength = function(){
    return this.laneX.length;
};

function TransportCoordinate(){
    this.arrLaneInformation = [];
    this.exchangeInfomation = null;
};
TransportCoordinate.prototype.initLaneInformation = function(initArrayIndex){
    this.arrLaneInformation = new Array(initArrayIndex);
};
TransportCoordinate.prototype.initExchangeInfomation = function(initArrayIndex){
    this.exchangeInfomation = new LaneInformation(initArrayIndex);
};
TransportCoordinate.prototype.setExchangeX = function(_laneX){
    this.exchangeInfomation.setLaneX(_laneX);
};
TransportCoordinate.prototype.setExchangeY = function(_laneY){
    this.exchangeInfomation.setLaneY(_laneY);
};
TransportCoordinate.prototype.getExchangeX = function(_laneIndex){
    return this.exchangeInfomation.getLaneX(_laneIndex);
};
TransportCoordinate.prototype.getExchangeY = function(_laneIndex){
    return this.exchangeInfomation.getLaneY(_laneIndex);
};
TransportCoordinate.prototype.addLaneInformation = function(laneInformation){
    this.arrLaneInformation.push(laneInformation);
};
TransportCoordinate.prototype.setLaneInformationX = function(_arrIndex, _valueX){
    this.arrLaneInformation[_arrIndex].setLaneX(_valueX);
};
TransportCoordinate.prototype.setLaneInformationY = function(_arrIndex, _valueY){
    this.arrLaneInformation[_arrIndex].setLaneY(_valueY);
};
TransportCoordinate.prototype.getLaneInformationX = function(_arrIndex, _linkIndex){
    return this.arrLaneInformation[_arrIndex].getLaneX(_linkIndex);
};
TransportCoordinate.prototype.getLaneInformationY = function(_arrIndex, _linkIndex){
    return this.arrLaneInformation[_arrIndex].getLaneY(_linkIndex);
};
TransportCoordinate.prototype.getLaneLength = function(){
    return this.arrLaneInformation.length;
};
TransportCoordinate.prototype.getLanePerLinkLength = function(_arrIndex){
    return this.arrLaneInformation[_arrIndex].getLength();
};
TransportCoordinate.prototype.getExchangeLength = function(){
    return this.exchangeInfomation.getLength();
};

/* Sortting Json */
function sortLinkInfoOfJson(str){
    /* 1.1 :: value Declare && Valid Checking */
    if (!str)
       return null;
    var railName = '';
    var laneLength = 0;
    var transCoord = new TransportCoordinate();

    var nodes = str;

    if (!nodes.result.lane || nodes.result.lane.length==0)
       return null;

    /* 1.2 :: LaneInformation initialize.... */
    laneLength = nodes.result.lane.length;
    //transCoord.initLaneInformation(laneLength);

    /* 1.3 :: LaneInformation Parsing */
    for (var nodeIndex = 0; nodeIndex < laneLength; nodeIndex++) {

        var laneClass = nodes.result.lane[nodeIndex]["class"];
        var laneType = nodes.result.lane[nodeIndex]["type"];
        var laneSection = nodes.result.lane[nodeIndex]["section"];

        railName = getRoadName(laneClass, laneType);

        /* 1.3.1 :: Lane Informaton Loop */
        for (sectionIndex = 0; sectionIndex < laneSection.length; sectionIndex++) {
            var rule = laneSection[sectionIndex]["Rule"];
            debugger;
            /* 1.3.1.1 :: Area Create */
            transCoord.addLaneInformation(getSorttingLaneInformation(rule, laneSection[sectionIndex]["graphPos"]));
        }
    }

    return transCoord;
};

/* Sortting LaneInformation */
function getSorttingLaneInformation(rule, data){
    var tempInformation;
    switch (rule) {
        case 0:
            tempInformation = sequenceData(data);
            break;
        case 1:
            tempInformation = reverseData(data);
            break;
        case 2:
            tempInformation = zigzagData(data);
            break;
        case 3:
            tempInformation = OddEvenExchangeData(data);
            break;
        case 4:
            tempInformation = MidNumberData(data);
            break;
        default:
            tempInformation = sequenceData(data);
    }

    return tempInformation;
};

/* Sequence Rule */
function sequenceData(data){
    var tempLaneInfo = new LaneInformation();

    for (var subIndex = 0; subIndex < data.length; subIndex++) {
        var x = (parseInt(data[subIndex]["x"]));
        var y = (parseInt(data[subIndex]["y"]));
        tempLaneInfo.setLaneX(x);
        tempLaneInfo.setLaneY(y);
    }

    return tempLaneInfo;
};

/* Reverse Rule */
function reverseData(data){
    var tempLaneInfo = new LaneInformation();

    for (var subIndex = data.length - 1; subIndex >= 0; subIndex--) {
        var x = (parseInt(data[subIndex]["x"]));
        var y = (parseInt(data[subIndex]["y"]));
        tempLaneInfo.setLaneX(x);
        tempLaneInfo.setLaneY(y);
    }

    return tempLaneInfo;
};

/* Zigzag Rule */
function zigzagData(data){
    var tempLaneInfo = new LaneInformation();

    for (var subIndex= 0; subIndex < Math.floor(data.length); subIndex += 2) {
        var x = (parseInt(data[subIndex]["x"]));
        var y = (parseInt(data[subIndex]["y"]));
        tempLaneInfo.setLaneX(x);
        tempLaneInfo.setLaneY(y);
    }

    var startIndex;
    if (data.length % 2 == 0)
        startIndex = data.length - 1;
    else
        startIndex = data.length - 2;

    for (var subIndex = startIndex; subIndex > 0; subIndex -= 2) {
        var x = (parseInt(data[subIndex]["x"]));
        var y = (parseInt(data[subIndex]["y"]));
        tempLaneInfo.setLaneX(x);
        tempLaneInfo.setLaneY(y);
    }

    return tempLaneInfo;
};

/* 홀수/짝수 인덱스 치환 */
function OddEvenExchangeData(data){
    var tempLaneInfo = new LaneInformation();
    var subIndex;

    for(subIndex=0 ; subIndex<Math.floor(data.length/2) ; subIndex++){
        var x = (parseInt(data[subIndex*2+1]["x"]));
        var y = (parseInt(data[subIndex*2+1]["y"]));
        tempLaneInfo.setLaneX(x);
        tempLaneInfo.setLaneY(y);

        var x = (parseInt(data[subIndex*2]["x"]));
        var y = (parseInt(data[subIndex*2]["y"]));
        tempLaneInfo.setLaneX(x);
        tempLaneInfo.setLaneY(y);
     }


    if(data.length%2 != 0){
        var x = (parseInt(data[subIndex*2]["x"]));
        var y = (parseInt(data[subIndex*2]["y"]));
        tempLaneInfo.setLaneX(x);
        tempLaneInfo.setLaneY(y);
    }

    return tempLaneInfo;
};

/* MidNumberData */
function MidNumberData(data){
    var subIndex;
    var tempLaneInfo = new LaneInformation();

    if (data.length % 2 == 0) {
        for(subIndex=Math.floor(data.length/2) ; subIndex<data.length ; subIndex++){
            var x = (parseInt(data[subIndex]["x"]));
            var y = (parseInt(data[subIndex]["y"]));
            tempLaneInfo.setLaneX(x);
            tempLaneInfo.setLaneY(y);
        }
    }
    else{
        for(subIndex=Math.floor(data.length/2)+1 ; subIndex<data.length ; subIndex++){
            var x = (parseInt(data[subIndex]["x"]));
            var y = (parseInt(data[subIndex]["y"]));
            tempLaneInfo.setLaneX(x);
            tempLaneInfo.setLaneY(y);
        }
    }

    for(subIndex=0 ; subIndex<Math.floor(data.length/2) ; subIndex++){
        var x = (parseInt(data[subIndex]["x"]));
        var y = (parseInt(data[subIndex]["y"]));
        tempLaneInfo.setLaneX(x);
        tempLaneInfo.setLaneY(y);
    }

    return tempLaneInfo;
}

