/**
 * @namespace map2fun.data
 * @constructor
 */
map2fun.data.DataControl = function(){
};

map2fun.data.DataControl.prototype.getUnits = function(callback){
    if (!callback || callback instanceof Function) {
        var param = app.ui.location.get();
    }
    else {
        var param = callback;
    }
    var _class = this;
    if (param.start) {
        param.start++;
    }
    else {
        $("#addressList").empty();
        param.pageSize = 20;
        param.start = 1;
    }
    app.debug(param.start);
    $.getJSON(map2fun.UNIT_FINDER_PATH, param, function(data){
        if (data.result.status == 1) {
            _class.showUnitsOnList(data.result.units);
            if (data.result.more) {
                if (!$("#unitResults a.viewMore")[0]) {
                    $("<a href='#' class='action viewMore radius once'><span>+</span>  查看更多</a>").click(function(){
                        _class.getUnits(param);
                    }).appendTo("#unitResults");
                }
            }
            else {
                $("#unitResults a.viewMore").remove();
            }
            if (callback && callback instanceof Function) 
                callback();
        }
    });
};

map2fun.data.DataControl.prototype.getPaths = function(callback){
    if (!callback || callback instanceof Function) {
        var param = app.ui.location.get();
    }
    else {
        var param = callback;
    }
    var _class = this;
    if (param.start) {
        param.start++;
    }
    else {
        param.pageSize = 20;
        param.start = 1;
    }
    $("#tourList").empty();
    app.map.clearOverlays();
    
    var _class = this, paths = new Array();
    $.getJSON(map2fun.PATH_FINDER_PATH, param, function(data){
        if (data.result.status == 1) {
        
            $.each(data.result.paths, function(i, item){
                paths.push(new map2fun.control.ui.Path(item));
            });
            _class.showPathsOnList(paths);
            _class.showPathsOnMap(paths);
            $("#pathResults a.viewMore").remove();
            if (data.result.more) {
                if (param.start > 1) {
                    $("<a href='#' class='action viewPrv once viewMore radius'>上一页</a>").click(function(){
                        _class.getPaths(param);
                    }).appendTo("#pathResults");
                }
                
                $("<a href='#' class='action viewNext once viewMore radius'>下一页</a>").click(function(){
                    _class.getPaths(param);
                }).appendTo("#pathResults");
            }
            
            if (callback && callback instanceof Function) 
                callback();
        }
    });
    app.data("pathResults", paths);
};

map2fun.data.DataControl.prototype.getNodes = function(callback){
    var location = app.ui.location.serialize(), currentNodes = new Array(), geocoder = new GClientGeocoder(), _class = this;
    app.debug("Get nodes for: ", location);
    geocoder.getLocations(location, function(response){
        if (!response || response.Status.code != 200) {
            app.alert("无法找到您输入的地址，请重新检查……");
        }
        else {
        
            app.debug(response);
            app.map.clearOverlays();
            var node;
            $.each(response.Placemark, function(i, item){
                node = new map2fun.control.ui.Node(item, response.name);
                app.debug("Code for " + node.title + ": " + node.id);
                app.debug(node.lat, node.lng);
                currentNodes.push(node);
                _class.markNodeOnMap(node);
            });
            app.map.panTo(new google.maps.LatLng(response.Placemark[0].Point.coordinates[1], response.Placemark[0].Point.coordinates[0]));
            
            _class.showNodesOnSidebar(currentNodes);
            if (callback) 
                callback();
        }
    });
};

map2fun.data.DataControl.prototype.showPathsOnList = function(paths){
    $("#pathResults").find("#keyName").remove();
    var keyName = $("<span class='radius'></span>").text("\"" + app.ui.location.serialize() + "\"");
    var serachTitle = $("<h3 id='keyName' class='once'></h3>").append(keyName).append(" 的搜索结果：");
    
    $("#pathResults").prepend(serachTitle);
    
    
    $.each(paths, function(i, path){
        $("#tourList").append(path.getContent());
    });
};

map2fun.data.DataControl.prototype.showPathsOnMap = function(paths){
    var i = 0;
    var dir = new google.maps.Directions();
    try {
    
        dir.loadFromWaypoints(paths[i].getPointStr(), {
            getPolyline: true
        });
        
        GEvent.addListener(dir, "load", function(){
            paths[i].setPath(dir.getPolyline());
            paths[i].mark();
            
            if (paths.length > 1 && i < paths.length - 1) {
                i++;
                dir.loadFromWaypoints(paths[i].getPointStr(), {
                    getPolyline: true
                });
            }
        });
        app.map.setCenter(paths[0].localResults[paths[0].localResults.length - 1].getLatLng(), 12);
    } 
    catch (e) {
        app.alert(e.message + "<br />您肯能需要刷新浏览器！");
    }
    
};


map2fun.data.DataControl.prototype.showUnitsOnList = function(units){
    var _class = this, keyName = $("<span class='radius'></span>").text("\"" + app.ui.location.serialize() + "\""), serachTitle = $("<h3 id='keyName' class='once'></h3>").append(keyName).append(" 的搜索结果："), localResults = map2fun.control.ui.LocalResult.sortUnitByNode(units);
    
    $("#unitResults").find("#keyName").remove();
    $("#unitResults").prepend(serachTitle);
    
    app.data("localResults", localResults);
    $.each(localResults, function(i, item){
        app.debug("building for: ", item.code);
        $("#addressList").append(item.getBreif());
        _class.markNodeOnMap(item);
    });
    
    app.map.setCenter(new google.maps.LatLng(localResults[0].lat, localResults[0].lng), 10);
    
};

map2fun.data.DataControl.prototype.markNodeOnMap = function(/* Markable */node){
    app.map.addOverlay(node.getMarker(node.getContent()));
};


map2fun.data.DataControl.prototype.showNodesOnSidebar = function(nodes){
    $("#mapInfo .indicator").text("共有如下地点（地址）：");
    $("#mapInfo .list").empty();
    var list = $("<ol></ol>").appendTo("#mapInfo .list");
    $.each(nodes, function(i, item){
        list.append(item.getBrief());
    });
};

map2fun.data.DataControl.prototype.showResultOnMap = function(results){//显示从Google发来的结果
    $("#mapInfo .indicator").text("共有如下地点（地址）：");
    
    $.each(results, function(i, item){
        var marker = item.getMarker();
        app.map.addOverlay(item.getMarker());
    });
    
    // move the map to the first result
    var first = results[0].result;
    //app.debug(first.lat + " " + first.lng);
    app.map.panTo(new google.maps.LatLng(first.lat, first.lng));
};


map2fun.data.DataControl.prototype.addUnit = function(param){
    var _class = this;
    $.getJSON(map2fun.ADD_UNIT_PATH, param, function(data){
        if (data.result.status == 1) {
            var win = $("<div class='addUnitResp lightbox'></div>").append("<h3>已经成功添加场所！</h3>").append($("<a href='#' class='action'>关闭并返回</a> ").click(app.ui.mainView.swap).click(app.ui.lightbox.close)).append(" | ").append($("<a href='#' class='action'>继续添加场所</a> ").click(function(){
                app.ui.lightbox.open(app.ui.mainView.views.addUnit);
            })).append(" | ").append($("<a href='#' class='action'>关闭窗口</a>").click(app.ui.lightbox.close));
            app.show(win[0]);
            var field = $(".unitDetail");
            field.find("select").val("0");
            field.find("input").val("");
            field.find("textarea").val("");
        }
        else 
            if (data.result.status == 0) {
				param.sid = data.result.sid;
                _class.confirmRepeat({
					candidates : data.result.possibleUnits,
					param : param,
					type: 1
				});
            }
            else {
                app.alert("出现未知错误，请重试！");
            }
    });
};

map2fun.data.DataControl.prototype.confirmRepeat = function(arg){
	
    if (arg.candidates && arg.candidates.length > 0) {
		var _class = this;
        var box = $("<div class='confirmRepeat lightbox'></div>");
        var title = $("<h3>请求您的确认</h3>");
        var list = $("<ul />");
        $.each(arg.candidates, function(i, item){
			$("<li />").append($("<a />", {
                className: "external",
                href: arg.type == 1 ? map2fun.UNIT_DETAIL_PATH + "?id=" + item.id : map2fun.PATH_DETAIL_PATH + "?id=" + item.id,
                text: item.name
            })).appendTo(list);
        });
        
        var confirm = $("<a />", {
            className: "action confirm radius",
            text: "内容没有重复，继续分享"
        }).click(function(){
			if(arg.type == 1) {
				delete arg.param.cost;
				delete arg.param.desc;
				delete arg.param.nodeId;
				delete arg.param.title;
				delete arg.param.score;
				_class.addUnit(arg.param);
			} else if(arg.type == 2) {
				delete arg.param.unitId;
				delete arg.param.desc;
				delete arg.param.name;
				delete arg.param.score;
				_class.addPath(arg.param);
			}
        });
		
		var cancel = $("<a />",{
			className: "action cancel",
			text: "取消分享操作，并返回"
		}).click(function() {
			app.ui.mainView.swap();
			app.ui.lightbox.close();
		});
		box.append(title).append("<p>您添加的内容可能与下面的这些信息重复，请仔细阅读后再进行下一步操作；如果您确认时没有重复的，您可以继续分享！</p>")
			.append(list).append(confirm).append(cancel);
		app.show(box[0]);
    }
};

map2fun.data.DataControl.prototype.submitUnits = function(){
    var unitId = new Array(), localResults = new Array(), points = new Array(), pointStr = new Array(), map, dir;
    
    $("#unitBusket li.heading").each(function(i, item){
        var p = map2fun.utils.decode($(this).find("a.unit-title").attr("rel"))[0];
        unitId.push(item.getAttribute("rel"));
        points.push(new google.maps.LatLng(p[0], p[1]));
        pointStr.push(p.toString());
    });
    
    if (unitId.length == 1 || unitId.length > 25) {
        app.alert("一条路线上的地点数量必须在2到25之间！");
    }
    
    app.data("unitId", unitId.slice(0));
    
    points = points.unique();//delete the repeated points
    app.data("selectedLocalResults", localResults);
    app.ui.lightbox.open(app.ui.mainView.views.addPath);
    
    map = new google.maps.Map2($("#facebox .mini-map")[0]);
    dir = new google.maps.Directions(map);
    dir.loadFromWaypoints(pointStr);
};

map2fun.data.DataControl.prototype.resetUnits = function(){
    $("#unitBusket .list li").fadeOut(function(){
        $(this).remove();
        if (!$("#unitBusket .list li")[0]) {
            $("#unitBusket .indicator").show();
            $("#unitBusket .busketAction").hide();
        }
    });
    $("li.local-result").fadeIn().find("li").fadeIn();
};

map2fun.data.DataControl.prototype.addPath = function(param){
	var _class = this;
	if(!param.sid) {
		param.nodeId = app.data("unitId") + "";
	}
    $.getJSON(map2fun.ADD_PATH_PATH, param, function(data){
        if (data.result.status == 1) {
            var win = $("<div class='addPathResp lightbox'></div>").append("<h3>已经成功添加路线！</h3>").append($("<a href='#' class='action'>关闭并返回</a>").click(function(){
                app.ui.lightbox.close();
                app.ui.mainView.swap();
            }));
            app.show(win[0]);
        } else if(data.result.status == 0) {
			_class.confirmRepeat({
				candidates: data.result.possiblePaths,
				param: param,
				type : 2
			});
		} else {
			app.alert("出现未知错误，请重试！");
		}
    });
    
};

map2fun.data.DataControl.prototype.validate = function(field){
    var v = new map2fun.data.Validator(), e = new Array();
    field.find(".msg").remove();
    app.debug(field[0].name);
    switch (field[0].name) {
        case "login":
            if (v.isNull(field.find("input[name='userName']").val())) {
                e.push("用户名不能为空");
            }
            if (v.isNull(field.find("input[name='password']").val())) {
                e.push("密码不能为空");
            }
            break;
        case "register":
            if (!v.isGoodStr(field.find("input[name='userName']").val())) {
                e.push("用户名不合法");
            }
            if (!v.isPassword(field.find("input[name='password']").val())) {
                e.push("密码不合法");
            }
            if (!v.isSame(field.find("input[name='confirmPassword']").val(), field.find("input[name='password']").val())) {
                e.push("两次输入的密码不同");
            }
            if (!v.isEmail(field.find("input[name='email']").val())) {
                e.push("电子邮箱不合法");
            }
            if (v.isNull(field.find("input[name='verifyCode']").val())) {
                e.push("请填写验证码");
            }
            break;
        case "unit":
            var _a = true;
            field.find("input, textarea").each(function(){
                if (v.isNull(this.value)) {
                    _a = false;
                }
            });
            if (!_a) {
                e.push("以下内容均不可为空");
            }
            if (field.find("select[name='type']")[0].options[field.find("select[name='type']")[0].selectedIndex].value == 0) {
                e.push("请为该场所选择类型");
            }
            if (field.find("select[name='score']")[0].options[field.find("select[name='score']")[0].selectedIndex].value == 0) {
                e.push("请为该场所打个分");
            }
            break;
        case "path":
            var _a = true;
            field.find("input").each(function(){
                if (v.isNull(this.value)) {
                    _a = false;
                }
            });
            if (!_a) {
                e.push("以下内容均不可为空");
            }
            if (field.find("select[name='score']")[0].options[field.find("select[name='score']")[0].selectedIndex].value == 0) {
                e.push("请为该路线打个分");
            }
            break;
    };
    
    if (e.length) {
        var msg = $("<div class='msg' />");
        var error = $("<p class='warning " + field[0].name + "Error' />").prependTo(msg);
        $.each(e, function(i, item){
            if (i == e.length - 1) {
                error.append(item + "！");
            }
            else {
                error.append(item + ";<br />");
            }
        });
        field.prepend(msg);
        return false;
    }
    return true;
};

map2fun.data.Validator = function(){
};

map2fun.data.Validator.prototype.isNull = function(str){
    return str.length == 0;
};

map2fun.data.Validator.prototype.isSame = function(a1, a2){
    return a1 == a2;
};

map2fun.data.Validator.prototype.isGoodStr = function(str){
    var reg = /^[a-zA-Z][a-zA-Z0-9_]{3,15}$/;
    return reg.test(str);
};

map2fun.data.Validator.prototype.isPassword = function(str){
    var reg = /^[x00-x7f]+$/;
    if (!reg.test(str)) {
        return false;
    }
    if (str.length < 6 || str.length > 16) {
        return false;
    }
    return true;
};

map2fun.data.Validator.prototype.isEmail = function(str){
    var reg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/;
    return reg.test(str);
    
};
