var db;                             // 本地数据库
var DATABASE_NAME = 'yilong';       // 数据库名称
var db_error = false;               // 数据库错误标识
var errorMessage = '';              // 数据库错误信息
var row_nums = 0;                   // 数据库记录数
var noerror = 1;                    // 1没有错误 2有错误，但可以继续 3有错误不继续

var localServer;        //本地服务器
var workerPool;         //Gears工作池
var childId;            //工作者

var ticket_statuss = {1:"未上网", "20":"退回", "30":"国外扣关", "40":"国内扣关", "50":"收寄", "60":"上EMS网", "70":"OK", "80":"未妥投", "90":"已妥投"};

var source_types = {"1":"本部录入", "2":"本部导入", "3":"同行录入", "4":"同行导入"};
var ticket_types = {"1":"包裹", "2":"文件"};
var total_types = {"1":"本部发货", "2":"同行直发"};
var check_statuss = {"1":"未生成总单", "2":"生成总单", "3":"已出货", "4":"已提货", "5":"退回当地", "6":"退回客人"};

//时间格式化
Date.prototype.format=function(format){var returnStr='';var replace=Date.replaceChars;for(var i=0;i<format.length;i++){var curChar=format.charAt(i);if(replace[curChar]){returnStr+=replace[curChar].call(this);}else{returnStr+=curChar;}}return returnStr;};Date.replaceChars={shortMonths:['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],longMonths:['January','February','March','April','May','June','July','August','September','October','November','December'],shortDays:['Sun','Mon','Tue','Wed','Thu','Fri','Sat'],longDays:['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],d:function(){return(this.getDate()<10?'0':'')+this.getDate();},D:function(){return Date.replaceChars.shortDays[this.getDay()];},j:function(){return this.getDate();},l:function(){return Date.replaceChars.longDays[this.getDay()];},N:function(){return this.getDay()+1;},S:function(){return(this.getDate()%10==1&&this.getDate()!=11?'st':(this.getDate()%10==2&&this.getDate()!=12?'nd':(this.getDate()%10==3&&this.getDate()!=13?'rd':'th')));},w:function(){return this.getDay();},z:function(){return"Not Yet Supported";},W:function(){return"Not Yet Supported";},F:function(){return Date.replaceChars.longMonths[this.getMonth()];},m:function(){return(this.getMonth()<9?'0':'')+(this.getMonth()+1);},M:function(){return Date.replaceChars.shortMonths[this.getMonth()];},n:function(){return this.getMonth()+1;},t:function(){return"Not Yet Supported";},L:function(){return"Not Yet Supported";},o:function(){return"Not Supported";},Y:function(){return this.getFullYear();},y:function(){return(''+this.getFullYear()).substr(2);},a:function(){return this.getHours()<12?'am':'pm';},A:function(){return this.getHours()<12?'AM':'PM';},B:function(){return"Not Yet Supported";},g:function(){return this.getHours()%12||12;},G:function(){return this.getHours();},h:function(){return((this.getHours()%12||12)<10?'0':'')+(this.getHours()%12||12);},H:function(){return(this.getHours()<10?'0':'')+this.getHours();},i:function(){return(this.getMinutes()<10?'0':'')+this.getMinutes();},s:function(){return(this.getSeconds()<10?'0':'')+this.getSeconds();},e:function(){return"Not Yet Supported";},I:function(){return"Not Supported";},O:function(){return(-this.getTimezoneOffset()<0?'-':'+')+(Math.abs(this.getTimezoneOffset()/60)<10?'0':'')+(Math.abs(this.getTimezoneOffset()/60))+'00';},T:function(){var m=this.getMonth();this.setMonth(0);var result=this.toTimeString().replace(/^.+ \(?([^\)]+)\)?$/,'$1');this.setMonth(m);return result;},Z:function(){return-this.getTimezoneOffset()*60;},c:function(){return"Not Yet Supported";},r:function(){return this.toString();},U:function(){return this.getTime()/1000;}};


/**
 * Initializes the application
 */
function InitGear() 
{
    if (!window.google || !google.gears) {
        $("body").append("<div id='InstallGears'>你尚未安装Google Gears，请点击[<a href='/files/GearsSetup.exe' target='_blank'>安装 Google Gears</a>]。");
        $.blockUI({ 
            message: $('#InstallGears'),
            css:{
                left:200,
                width:600,
                height:30,
                'overflow': 'auto'
            }
        });
        return false;
    }

    try {
        db = google.gears.factory.create('beta.database');
    } 
    catch (ex) {
        // Gears not installed
        alert('无法创建本地数据库:\n\n' + ex.message);
        return false;
    }

    try {
        db.open(DATABASE_NAME);
    }
    catch(ex) {
        alert("数据库忙，请稍候再试");
        return false;
    }
    
    return true;
}


function InitLocalServer()
{
    try {
        localServer = google.gears.factory.create("beta.localserver");
    }
    catch (ex) {
        alert('无法创建本地服务器:\n\n' + ex.message);
        return false;
    }
    var store = localServer.createManagedStore('yilong-store');
    store.manifestUrl = '/Systems/SiteManifest';
    store.checkForUpdate();

    return true;
}


function parentHandler(messageText, sender, message) {

    //alert(message.body[0]+ ", "+ message.body[1]+", "+message.body[2]);
    
    //return ;
    if (message.body[0]==1) {
        //显示进度条
        $("#progressbar").reportprogress(message.body[1]);
        $("#progressbar2").reportprogress(message.body[2]);
        return true;
    }
    
    if (message.body[0]==0) {
        if ($("#LoginForm").length>0) {
            ExecuteSqlites();
            top.location.href='/Profiles';
            return false;
        }
        $.unblockUI();
        setTimeout(comet_connect, 3000); 
        return true;
    }
    alert("系统出现错误，请将窗口关闭后重新打开(1)！"+message.body[1]+message.body[2]);
    return false;
}


function InitWorkerPool()
{
    //alert ('workerpool');
    try {
        workerPool = google.gears.factory.create('beta.workerpool');
    } 
    catch (e) {
        alert('无法创建工作池:\n\n' + ex.message);
        return false;
    }
  
    workerPool.onmessage = parentHandler;
    try {
        childId = workerPool.createWorkerFromUrl('/js/worker.js');
    } 
    catch (e) {
        alert('无法创建工作者:\n\n' + ex.message);
        return false;
    }
    return true;
}

function asyncComputation(data) {
    if (workerPool) {
        workerPool.sendMessage(data, childId);
    }
}



function executeToObjects(sql, args) 
{
    var db_error = false;
    row_nums = 0;
    
    try {
        var rs = db.execute(sql, args);
    }
    catch (ex) {
        db_error = true;
        errorMessage = ex.message || ex.description || String(ex);
        //alert(errorMessage);
    }
    
    if (db_error) {
        return false;
    }
    
    if (sql.substr(0, 6).toUpperCase() != "SELECT") {
        rs.close();
        return true;
    }
    
    var rv = [];
    if (rs && rs.isValidRow()) {
        var cols = rs.fieldCount();
        var colNames = [];
        for (var i = 0; i < cols; i++) {
            colNames.push(rs.fieldName(i));
        }

        while (rs.isValidRow()) {
            var h = {};
            for (i =0; i<cols; i++) {
                h[colNames[i]] = rs.field(i);
            }
            rv.push(h);
            rs.next();
            row_nums ++;
        }
    }
    
    rs.close();
    return rv;
    
}


function GetLogins()
{
    var sql = "SELECT b.* FROM tb_logins a LEFT JOIN tb_users b ON a.user_id=b.id LIMIT 1";
    var result = executeToObjects(sql)[0];
    return result;
}


/**
 * 保存到本地数据库
 */
/*
function UpdateData(data)
{

    var cur_page = data['cur_page'];        //当前页
    var timestamp = data['timestamp'];      //当前时间
    var table_name = "";                    //表名

    var insert_field = [];
    var update_field = [];
    var field_nums = 0;
    var sql = "";
    
    $.each(data['fields'], function(key, val){
        field_nums ++;
        insert_field.push("?");
        if (key==0) return;
        update_field.push(val+"=?");
    });
            
    $.each(data, function(key, val) {
        if (key.indexOf('tb_')<0) return ;
        table_name = key;
        
        var insert_sql = "INSERT INTO "+key+" VALUES("+insert_field.join(",")+")";
        var update_sql = "UPDATE "+key+" SET "+update_field.join(",")+" WHERE id=?";
        
        
        $.each(val, function(i, row) {
            sql = "SELECT count(*) AS nums FROM " + key + " WHERE id=? LIMIT 1";
            var result = executeToObjects(sql, [row[0]])[0];
            
            var args = [];
            if (result['nums']<1) {     //插入新的数据
                for(j=0;j<field_nums;j++) {
                    args.push(row[j]);
                }
                sql = insert_sql;
            }
            else {
                for(j=1;j<field_nums;j++) {
                    args.push(row[j]);
                }
                args.push(row[0]);
                sql = update_sql;
            }
            db.execute(sql, args)
        });
    });
    
    if (cur_page>0) {
        sql = "UPDATE tb_versions SET cur_page=? WHERE tb_name=?";
        db.execute(sql, [cur_page, table_name]);
    }
    else {
        sql = "UPDATE tb_versions SET update_time=?, cur_page=? WHERE tb_name=?";
        db.execute(sql, [timestamp, cur_page, table_name]);
    }
}
*/


/**
 * Comet 连接
 */
function comet_connect()
{
    //检查数据库版本
    var sql = "SELECT * FROM tb_versions";
    var result = executeToObjects(sql);
    if(result===false) {
        result = [];
    }
    
    postData = [];
    
    if (typeof result[0]=="undefined" || typeof result[0]['tb_time'] == "undefined") {
        executeToObjects("DROP TABLE tb_versions");
    }
    else {
        $.each(result, function(i, row){
            if (typeof row['tb_time'] == "undefined") {
                return false;
            }
            postData.push([row['tb_name'], row['update_time'], row['tb_time']]);
        });
    }
    
    var post_error = 0;
    
    try{
        $.post(
            '/Profiles/Backend',
            {versions:$.toJSON(postData)},
            function(data){
                if (data['result']>0) {
                    post_error = 1;
                    alert("系统出现错误，请将窗口关闭后重新打开(2)！"+data['info']);
                    //setTimeout(comet_connect, 10000); 
                    return false;
                }
                //服务器有数据需要更新到客户端
                //alert(data['info']);
                if (data['info']==2 || data['info']=='2') {
                    
                    if ($("#LoginForm").length==0) {
                        $.blockUI({ 
                            message: $('#processDiv'),
                            showOverlay: false,
                            fadeOut: 500,
                            css:{border:0,top:0,left:0,width:280,height:50,opacity: .7}
                        });
                    }

                    $("#progressbar").reportprogress(0);
                    $("#progressbar2").reportprogress(0);
                    
                    if (!workerPool) {
                        alert("无法更新数据，请重新打开浏览器");
                        return false
                    }
                    workerPool.sendMessage(data['other'], childId);
                    return true;
                }
                
                if ($("#LoginForm").length>0) {
                    $("#progressbar").reportprogress(100);
                    $("#progressbar2").reportprogress(100);
                    ExecuteSqlites();
                    top.location.href='/Profiles';
                    return false;
                }
                setTimeout(comet_connect, 3000); 
                return true;
             },
            'json'
        );
    }
    catch(ex) {
        post_error = 1;
        setTimeout(comet_connect, 30000);
        return false;
    }
    return true;
}



$().ajaxError(function(event,request, settings,ex){
   setTimeout(comet_connect, 30000);
   //alert(event.type);
});

var shift = 0;
$(document).keydown(function(event){
    shift = event.keyCode;
});

//
var last_id=0;
function SelectRecord(obj) 
{
    if (shift==16) {
        shift = 0;
        current_id = obj.parent().parent().find("tr").index(obj.parent()[0]); //parseInt(obj.html());
        var is_add = 0;
        if (obj.parent().attr('class').indexOf('trselected')<0) {
            is_add = 1;
        }
        var min = current_id>=last_id?last_id:current_id;
        var max = current_id>=last_id?current_id:last_id;

        while (min <= max) {
            var obj2 = obj.parent().parent().find("tr:eq("+min+")");
            if (is_add==1) {
                if (obj2.attr("class").indexOf("trselected")<0) {
                    obj2.addClass("trselected");
                }
            }
            else {
                if (obj2.attr("class").indexOf("trselected")>=0) {
                    obj2.removeClass("trselected");
                }
            }
            min ++;
            
        }
        return ;
    }
    
    if (obj.parent().attr('class').indexOf("trselected")>=0) {
        obj.parent().removeClass("trselected");
    }
    else {
        obj.parent().addClass("trselected");
        
    }
    last_id = obj.parent().parent().find("tr").index(obj.parent()[0]);
    
}


//
function SelectAll(obj)
{
    var parentObj = obj.parent().parent().parent().find("tbody");
    
    if (obj.attr('class')!='selectall') {
        parentObj.find("tr").not($(".trselected")).each(function(){
            $(this).addClass("trselected");
        });
        obj.addClass("selectall");
    }
    else {
        parentObj.find(".trselected").each(function(){
            $(this).removeClass("trselected");
        });
        obj.removeClass("selectall");
    }
}

var counts_sql = '';
var result_sql = '';
var go_per_page = 20;

function GoPages(obj)
{
    Go2Page(obj.val());
}

function Go2Page(page_id)
{
    PageQuery(page_id, go_per_page);
}


function PageQuery(cur_page, per_page)
{
    //alert(counts_sql);
    var result = executeToObjects(counts_sql)[0];
    var total_num = result['nums'];
    
    if (typeof per_page=='undefined') per_page=20;
    if (per_page<1) {
        per_page = 20;
    }
    if (per_page >100) {
        per_page=100;
    }
    go_per_page = per_page;
    
    var total_page = total_num/per_page;
    total_page = Math.ceil(total_page);
    
    if (typeof cur_page=='undefined') {
        var cur_page = 1;
    }
    
    if (cur_page<1) cur_page=1;
    if (cur_page>total_page) cur_page=total_page;
    
    cur_page = parseInt(cur_page);
    
    var prev_page = cur_page-1;
    var next_page = cur_page+1;
    
    var page_count = "共有<span>"+total_num+"</span>条记录 当前第<span>"+cur_page+"</span>页/共<span>"+total_page+"页</span> ";
    if (cur_page<=1) {
        page_count += "首页 上页 ";
    }
    else {
        page_count += "<a href='javascript:;' onclick='Go2Page(1)'>首页</a> <a href='javascript:;' onclick='Go2Page("+prev_page+")'>上页</a> ";
    }
    if (cur_page>=total_page) {
        page_count += "下页 尾页 ";
    }
    else {
        page_count += "<a href='javascript:;' onclick='Go2Page("+next_page+")'>下页</a> <a href='javascript:;' onclick='Go2Page("+total_page+")'>尾页</a> ";
    }
    
    page_count += "转到<select id='cur_page' onchange='GoPages($(this))'";
    if (total_page<=1) page_count += " disabled";
    page_count += ">";
    for(var i=1; i<=total_page; i++) {
        page_count +="<option value='"+i+"'";
        if (i==cur_page) page_count +=" selected";
        page_count += ">"+i+"</option>";
    }

    
    
    $("#page_count").html(page_count);
    $(".page_count").html(page_count);
    var start = (cur_page-1)*per_page;

    result = executeToObjects(result_sql+" LIMIT ?,?", [start, per_page]);
    
    QueryData(result);
    return result;
}


function SqlQuote(str, def)
{
    var result = str.replace(/\'/, "''");
    if (typeof def=='undefined' || def==false) {
        return "'"+result+"'";
    }
    return result;
}



function CC2PY(l1) 
{
	var l2 = l1.length;
	var I1 = "";
	var reg = new RegExp('[a-zA-Z0-9\- ]');
	for (var i=0; i<l2; i++) {
		var val = l1.substr(i,1);
		if(reg.test(val)) {
			I1 += val;
		} 
		else {
		    key = SqlQuote(val, true);
		    var result=executeToObjects("SELECT first_letter FROM tb_pinyins WHERE status=1 AND chinese LIKE '%"+key+"%'")[0];
		    if (row_nums>0) {
                I1 += result['first_letter'];
		    }
		    else {
		        I1 += val;
		    }
		}
	}
	I1 = I1.replace(/ /g,'-');
	while (I1.indexOf('--')>0) {
		I1 = I1.replace('--','-');
	}
	return I1;
}


function CC2PY2(l1) 
{
	var l2 = l1.length;
	var I1 = "";
	var reg = new RegExp('[a-zA-Z0-9\- ]');
	for (var i=0; i<l2; i++) {
		var val = l1.substr(i,1);
		if(reg.test(val)) {
			I1 += val;
		} 
		else {
		    key = SqlQuote(val, true);
		    var result=executeToObjects("SELECT pinyin FROM tb_pinyins WHERE status=1 AND chinese LIKE '%"+key+"%'")[0];
		    if (row_nums>0) {
		        if (I1!="") I1+=",";
                I1 += '"'+result['pinyin']+'"';
		    }
		    else {
		        I1 += val;
		    }
		}
	}
	I1 = I1.replace(/ /g,'-');
	while (I1.indexOf('--')>0) {
		I1 = I1.replace('--','-');
	}
	return "["+I1+"]";
}


/*
 * 将 yyyy-mm-dd转为unix_timestamp
 */
function strtotime(str)
{
    var arr = str.split('-');
    var date = new Date(arr[0], (arr[1]-1), arr[2]);
    return date.getTime()/1000;
}


function CheckPriv(name, action, showalert)
{
    if (typeof action=="undefined") {
        action = "index";
    }
    if (typeof showalert=="undefined") {
        showalert = true;
    }
    
    
    var logins = GetLogins();
    if (logins==false) {
        if (showalert==true) alert("尚未登录");
        return false;
    }

    
    name = name.toLowerCase();
    action = action.toLowerCase();
    //alert(name+"/"+action);
    if (name=="profiles") return true;
    
    var post_id = logins['post_id'];
    
     
    var result = executeToObjects("SELECT id FROM tb_privileges WHERE name=? AND action=? AND status=1", [name, action])[0];
    if (!result) {
        if (showalert==true) alert("权限未定义");
        return false;
    }
    
    var priv_id = result['id'];
    
    //检查职位权限
    result = executeToObjects("SELECT COUNT(*) AS nums FROM tb_post_privs WHERE post_id=? AND privs LIKE '%"+'"'+priv_id+'"'+"%'", [post_id])[0];
    if (!result || result['nums']<1) {
        if (showalert==true) alert("您没有此功能的操作权限，请联系管理员");
        return false;
    }
    return true;
}


/**
 * 将内容变成输入框
 */
function SetToEdit(obj, len)
{
    if (typeof len =='undefined') {
        len = 6;
    }
    var v = obj.html();
    if (obj.find("input").length>0) return false;
    
    obj.html("<input type='text' value='"+v+"' onblur='SetToText($(this))' size='"+len+"' />");
    obj.find("input").focus();
    obj.find("input").select();
}

/**
 * 将输入框变为文字
 */
function SetToText(obj) {
    var v = obj.val();
    obj.parent().html(v);
}

/**
 * 执行SQL
 */
function ExecuteSqlites() {
    var result = executeToObjects("SELECT * FROM tb_sqlite_sqls WHERE is_execute=0");
    $.each(result, function(i, row){
        //alert(row['sqls']);
        executeToObjects(row['sqls']);
        executeToObjects("UPDATE tb_sqlite_sqls SET is_execute=1 WHERE id=?", [row['id']]);
        return;
    });
    return;
}


//判断浏览器
function getOs()
{
   if(navigator.userAgent.indexOf("MSIE")>0)return 1;
   if(isFirefox=navigator.userAgent.indexOf("Firefox")>0)return 2;
   if(isSafari=navigator.userAgent.indexOf("Safari")>0)return 3;  
   if(isCamino=navigator.userAgent.indexOf("Camino")>0)return 4;
   if(isMozilla=navigator.userAgent.indexOf("Gecko/")>0)return 5;
   return 0;
}


