var browserVersion = parseInt(navigator.appVersion);

var isNetscape = navigator.appName.indexOf("Netscape") != -1;

var isIE = navigator.appName.indexOf("Microsoft") != -1;

var agent = navigator.userAgent.toLowerCase(  );

var isWindows = agent.indexOf("win") != -1;

var isMac = agent.indexOf("mac") != -1;

var isUnix = agent.indexOf("X11") != -1; 

var COLOR_ODDROW   = "#E7F0FF";	// oddRow    tr's background color, defined in starsky.css
var COLOR_EVENROW  = "#FFFFFF";	// evenRow   tr's background color, defined in starsky.css
var COLOR_SELECTED = "#DDF3DA";	// selected  tr's background color
var COLOR_MOUSEOVER= "#FFFFD9";	// mouseover tr's background color

function $(obj_id) { 
	return document.getElementById(obj_id);
}
function getPureData(id) {
    var data = $(id).value;
    data = data.replace(/<br[\s\/]{0,2}>/ig, "\r\n");
    data = data.replace(/<.*?>/ig, "");
    return data;
}
    
//change background color when selected, list view
function changeSelectedColor(id,state,index) {
	if (state)
		$(id).style.background=COLOR_SELECTED;
	else
		$(id).style.background = index==1 ? COLOR_ODDROW : COLOR_EVENROW;
}

//change background color when mouse over, list view
function changeMouseoverColor(id,state) {
	if (!state)
		$(id).style.background=COLOR_MOUSEOVER;
}
//change background color when mouse out, list view
function changeMouseoutColor(id,state,index) {
	if (!state)
		$(id).style.background = index==1 ? COLOR_ODDROW : COLOR_EVENROW;
}

//goto custom page,used by paginationTag
function gotoPage(targetPage,curPage,totalPage,url,invalidMsg,errorMsg,hintMsg) {
	var msg = '';
	targetPage = trim(targetPage);
	if (targetPage=='' || !isPlusNumber(targetPage)) {
		msg = invalidMsg;
	} else if (targetPage<=0 || targetPage>totalPage) {
		msg = errorMsg;
	} else if (targetPage==curPage) {
		msg = hintMsg;
	}
	if (msg!='') {
		alert(msg);
		if ($('customPage'))
			$('customPage').focus();
		return false;
	}
	self.location = url;
}
//when press 'Enter' key then forbid auto goto custom page
function forbidAutoGotoPage(event) {
	if (!event)	event = window.event;
	var keyCode = window.event ? event.keyCode : event.which;
	if (keyCode==13)
		return false;
	return true;
}

//only allow input number
function limitInputNumber(event) {
	if (!event) event = window.event;
  	if (isIE) {
  		if (!(isNumber(event) || isControlKey(event))) {
  			event.keyCode = 0 ;
  			event.cancelBubble = true;
  			event.returnValue = false;
  			return false;
  		}
  	}
  	if (isNetscape){
  		if (!(isNumber(event) || isControlKey(event))) {
  			event.stopPropagation();
  			event.preventDefault();
  			return false;
  		}
  	}
  	return true;
}

//only allow input number
function onlyInputNumber(event) {
	if (isNumber(event) || isControlKey(event))
		return true;
	else
		return false;
}
//the key whether number
function isNumber(event) {
	if (!event)	event = window.event;
	var keyCode = window.event ? event.keyCode : event.which;
	if ((keyCode>47 && keyCode<58) || (keyCode>95 && keyCode<106))
		return true;
	else
		return false;
}
function isPlusNumber(str){
	var reg = new RegExp("^[0-9]+$");
	if (str.search(reg) != -1)
		return true;
	else
		return false;
}

//the key whether control key
function isControlKey(event) {
	if (!event)	event = window.event;
	var keyCode = window.event ? event.keyCode : event.which;
	switch (keyCode) {
		case 8: 	//Backspace
		//case 9: 	//Tab
		case 13: 	//Enter
		//case 35: 	//End
		//case 36: 	//Home
		//case 37: 	//Left
		//case 39: 	//Right
		//case 46:	//Delete
		//case 144: 	//NumLock
			return true;
		default:
			return false;
	}
}
//if press 'Enter' key,then the next control will get focus,this event happened with onkeydown only
function moveFocus(event) {
	if(event.keyCode==13)
		event.keyCode=9
}
//change selected item's position
function changeSelectPos(obj,index) {
	if (obj.selectedIndex != -1) {
		if(index==-1 && obj.selectedIndex>0)
				obj.options(obj.selectedIndex).swapNode(obj.options(obj.selectedIndex-1));
		else if(index==1 && obj.selectedIndex<obj.options.length-1)
				obj.options(obj.selectedIndex).swapNode(obj.options(obj.selectedIndex+1))
	}
}
//str whether empty
function isEmpty(str) {
	var empty = trim(str);
	if (empty==null || empty=="")
		return true;
	else
		return false;
}
//remove blank char from str
function trim(str) {
	for( var i=0; i<str.length && str.charAt(i)==" "; i++ ) ;
	for( var j=str.length; j>0 && str.charAt(j-1)==" "; j-- ) ;
	if( i>j ) return("");
	str = str.substring(i,j);
	return str;
}
//this method is a abandon method
function trimForAllInputDemo(form) {
	var elements = form.elements;
	for (var i=0; i<elements.length; i++) {
		var element = elements[i];
		if (element.type == "text" || element.type == "textarea") {
			element.value = trim(element.value);
		}
	}
}
//find all control,if type is 'text' or 'textarea',then remove blank char from it's value
function trimForAllInput() {
	var elements = document.getElementsByTagName('input');
	for (var i=0; i<elements.length; i++) {
		var element = elements[i];
		if (element.type == "text" || element.type == "textarea") {
			element.value = trim(element.value);
		}
	}
	var elements = document.getElementsByTagName('textarea');
	for (var i=0; i<elements.length; i++) {
		var element = elements[i];
		element.value = trim(element.value);
	}
}
//find all control,if type is 'text',then remove blank char from it's value
function trimForAllText() {
	var elements = document.getElementsByTagName('input');
	for (var i=0; i<elements.length; i++) {
		var element = elements[i];
		if (element.type == "text") {
			element.value = trim(element.value);
		}
	}
}

//limit input value length
function limitLength(element,event,len){
	if (element.value.length>len){
		element.value =  element.value.substr(0,len);
	}
}

//get selected radio value by radioId
function getRadioValueById(radioId) {
	var selectRadioValue = '';
	var radios = document.getElementsByName(radioId);
	if (radios){
		for(var i=0;i<radios.length;i++) {
			if (radios[i].checked) {
          		selectRadioValue = radios[i].value;
          		break;
          	}
        }
    }
	return selectRadioValue;
}

//get selected checkbox values by checkId, and split by ','
function getCheckValuesById(checkId) {
	var selectCheckValue = '';
	var objChecks = document.getElementsByName(checkId);
	if (objChecks){
		for(var i=0;i<objChecks.length;i++) {
			if (objChecks[i].checked) {
          		selectCheckValue = selectCheckValue + ',' + objChecks[i].value;
          	}
        }
        if (selectCheckValue!='')
        	selectCheckValue = selectCheckValue.substring(1);
    }
	return selectCheckValue;
}
//change all button's state,'true' then disable,'false' then enable
function disableAllButton(state) {
	var elements = document.getElementsByTagName("input");
    for (var i = 0; i < elements.length; i++) {
		if (elements[i].type == "button") {
			if (state == 'true') {
                elements[i].disabled = true;
            } else {
                elements[i].disabled = false;
            }
        }
    }
}
//check is ip
function isIP(strIP) {
	if (trim(strIP)=='')
		return false;
	var re=/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/g //??IP????????
	if(re.test(strIP)) {
		if( RegExp.$1 <256 && RegExp.$2<256 && RegExp.$3<256 && RegExp.$4<256)
			return true;
	}
	return false;
}
//check is image file
function isImageFile(fileName) {
	var strRegex = "\.(jpg|jpeg|gif|png|bmp)$";
	var re=new RegExp(strRegex,'i');
    if (re.test(fileName)){
        return true;
    } else {
		return false;
	}
}
//check is zip file
function isZipFile(fileName) {
	var strRegex = "\.(zip|rar)$";
	var re=new RegExp(strRegex,'i');
    if (re.test(fileName)){
        return true;
    } else {
		return false;
	}
}


//
var showSubmitConfirmation = false;
var submitConfirmationMsg = "";

function setConfirmationMessage(message) {
	showSubmitConfirmation = true;
	submitConfirmationMsg = message;
}
function confirmSubmit() {
	if (showSubmitConfirmation) {
		var confirmation = window.confirm(submitConfirmationMsg);
		
		if (confirmation == false) {
			showSubmitConfirmation = false;
		}
		return confirmation;
	} else {
		return true;
	}
}
function confirmSubmitAndTrim() {
	trimForAllText();
	if (showSubmitConfirmation) {
		var confirmation = window.confirm(submitConfirmationMsg);
		
		if (confirmation == false) {
			showSubmitConfirmation = false;
		}
		return confirmation;
	} else {
		return true;
	}
}
function clearConfirmMessage() {
	showSubmitConfirmation = false;
	submitConfirmationMsg = "";
}

//select tree's first node
function selectFirstNode(){
	try{
		var root = tree.getTree();
		var firstChild = root.getFirstChild();
		firstChild.expand();
		firstChild.select();
		firstChild.click();
	}catch(e){
	}
}
//expend tree's first node
function expendFirstNode(){
	try{
		var root = tree.getTree();
		var firstChild = root.getFirstChild();
		firstChild.expand();
	}catch(e){
	}
}
//is checked checkbox
function isCheckBoxSelected(form, chkname){
	var elements = form.elements;
	for (var i = 0; i < elements.length; i++) {
		var element = elements[i];
		if (element.type == "checkbox" && (chkname == null || element.name==chkname) && element.checked) {
			return true;
		}
	}
	return false;
}
function selectAllCheckBoxByName(form, checkBoxName) {
	var elements = form.elements;
	var selectAllName = "selectAll[" + checkBoxName + "]";
	var checked = form[selectAllName].checked;		

	for (var i = 0; i < elements.length; i++) {
		var element = elements[i];
		
		if (element.type == "checkbox" &&
			element.name == checkBoxName) {
			element.checked = checked;
		}
	}
}
function mySelectAllCheckBoxByName(form, selectAllName, checkBoxName) {
	var elements = form.elements;
	var checked = form[selectAllName].checked;

	for (var i = 0; i < elements.length; i++) {
		var element = elements[i];
		
		if (element.type == "checkbox" &&
			element.name == checkBoxName) {
			element.checked = checked;
		}
	}
}
//get selected checkbox's values by name, split by ','
function unionCheckBoxId(form, checkBoxName) {
	var elements = form.elements;
	var result = "";
	for (var i = 0; i < elements.length; i++) {
		var element = elements[i];
		if (element.type == "checkbox" && element.name == checkBoxName && element.checked == true) {
			result = result + "," + element.value;
		}
	}
	if (result!='')
    	result = result.substring(1);
	return result;
}

function isEmail(str) {
	var email = trim(str);
	if (email==null || email==""){
		return 'false';
	}
	var pos = email.indexOf('@',1);
	if (pos==-1 || pos==email.length-1){
		return 'false';
	}else{
		var pos1 = email.indexOf('@',pos+1);
		var pos2 = email.indexOf('.',pos+2);
		if (pos1!=-1 || pos2==-1 || email.charAt(pos+1)=="." || email.charAt(email.length-1)=="."){
			return 'false';
		}
	}
	return 'true';
}

//move one select's selected options to another select
function moveSelOption(srcId,targetId) {
	var srcObj = $(srcId);
	var targetObj = $(targetId);
	for(var i=0; i<srcObj.options.length; i++) {
		if(srcObj.options[i].selected) {
			var obj = new Option();
    		obj.value = srcObj.options[i].value
    		obj.text = srcObj.options[i].text
    		targetObj.options[targetObj.options.length] = obj;
		}
	}
	for(var i=srcObj.options.length-1; i>=0; i--) {
		if(srcObj.options[i].selected)
    		srcObj.options[i] = null;
	}
}
//move one select's all options to another select
function moveAllOption(srcId,targetId) {
	selAllOption(srcId);
	moveSelOption(srcId,targetId);
}
//selected one select's all options
function selAllOption(selId) {
	var selObj = $(selId);
	for(var i=0; i<selObj.options.length; i++) {
		selObj.options[i].selected = true;
	}
}












function onlyInputEmail(obj,event) {
	var str = trim(obj.value);
	var keyCode = event.keyCode;
	if (keyCode==32) return false;	//blank key
	if (str=='' && (keyCode==190 || keyCode==110)) return false;
	//if (str.indexOf('@') != -1 && )
}



//validate short time , such as 16:04:24
function isTime(str) {
    var a = str.match(/^(d{1,2})(:)?(d{1,2})2(d{1,2})$/);
    if (a == null) {return false;}
    if (a[1]>24 || a[3]>60 || a[4]>60)
      return false;
    return true;
}




//common validate
Validator = {
    Require : /.+/,
    Email : /^\w+([-+.]\w+)*@\w+([-.]\\w+)*\.\w+([-.]\w+)*$/,
    Phone : /^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/,
    Mobile : /^((\(\d{3}\))|(\d{3}\-))?13\d{9}$/,
    Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,
    IdCard : /^\d{15}(\d{2}[A-Za-z0-9])?$/,
    Currency : /^\d+(\.\d+)?$/,
    Number : /^\d+$/,
    Zip : /^[1-9]\d{5}$/,
    QQ : /^[1-9]\d{4,8}$/,
    Integer : /^[-\+]?\d+$/,
    Double : /^[-\+]?\d+(\.\d+)?$/,
    English : /^[A-Za-z]+$/,
    Chinese :  /^[\u0391-\uFFE5]+$/,
    UnSafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/,
    IsSafe : function(str){return !this.UnSafe.test(str);},
    SafeString : "this.IsSafe(value)",
    Limit : "this.limit(value.length,getAttribute('min'),  getAttribute('max'))",
    LimitB : "this.limit(this.LenB(value), getAttribute('min'), getAttribute('max'))",
    Date : "this.IsDate(value, getAttribute('min'), getAttribute('format'))",
    Repeat : "value == document.getElementsByName(getAttribute('to'))[0].value",
    Range : "getAttribute('min') < value && value < getAttribute('max')",
    Compare : "this.compare(value,getAttribute('operator'),getAttribute('to'))",
    Custom : "this.Exec(value, getAttribute('regexp'))",
    Group : "this.MustChecked(getAttribute('name'), getAttribute('min'), getAttribute('max'))",
    ErrorItem : [document.forms[0]],
    ErrorMessage : ["Error:\t\t\t\t"],
    Validate : function(theForm, mode){
    	trimForAllInput(theForm);
        var obj = theForm || event.srcElement;
        var count = obj.elements.length;
        this.ErrorMessage.length = 1;
        this.ErrorItem.length = 1;
        this.ErrorItem[0] = obj;
        for(var i=0;i<count;i++){
            with(obj.elements[i]){
                var _dataType = getAttribute("dataType");
                if(typeof(_dataType) == "object" || typeof(this[_dataType]) == "undefined")  continue;
                this.ClearState(obj.elements[i]);
                if(getAttribute("require") == "false" && value == "") continue;
                switch(_dataType){
                    case "Date" :
                    case "Repeat" :
                    case "Range" :
                    case "Compare" :
                    case "Custom" :
                    case "Group" : 
                    case "Limit" :
                    case "LimitB" :
                    case "SafeString" :
                        if(!eval(this[_dataType]))    {
                            this.AddError(i, getAttribute("msg"));
                        }
                        break;
                    default :
                        if(!this[_dataType].test(value)){
                            this.AddError(i, getAttribute("msg"));
                        }
                        break;
                }
            }
        }
        if(this.ErrorMessage.length > 1){
            mode = mode || 1;
            var errCount = this.ErrorItem.length;
            switch(mode){
            case 2 :
                for(var i=1;i<errCount;i++)
                    this.ErrorItem[i].style.color = "red";
            case 1 :
                alert(this.ErrorMessage.join("\n"));
                this.ErrorItem[1].focus();
                break;
            case 3 :
                for(var i=1;i<errCount;i++){
                try{
                    var span = document.createElement("SPAN");
                    span.id = "__ErrorMessagePanel";
                    span.style.color = "red";
                    this.ErrorItem[i].parentNode.appendChild(span);
                    span.innerHTML = this.ErrorMessage[i].replace(/\d+:/,"*");
                    }
                    catch(e){alert(e.description);}
                }
                this.ErrorItem[1].focus();
                break;
            default :
                alert(this.ErrorMessage.join("\n"));
                break;
            }
            return false;
        }
        return true;
    },
    limit : function(len,min, max){
        min = min || 0;
        max = max || Number.MAX_VALUE;
        return min <= len && len <= max;
    },
    LenB : function(str){
        return str.replace(/[^\x00-\xff]/g,"**").length;
    },
    ClearState : function(elem){
        with(elem){
            if(style.color == "red")
                style.color = "";
            var lastNode = parentNode.childNodes[parentNode.childNodes.length-1];
            if(lastNode.id == "__ErrorMessagePanel")
                parentNode.removeChild(lastNode);
        }
    },
    AddError : function(index, str){
        this.ErrorItem[this.ErrorItem.length] = this.ErrorItem[0].elements[index];
        this.ErrorMessage[this.ErrorMessage.length] = this.ErrorMessage.length + ":" + str;
    },
    Exec: function(op, reg){
        return new RegExp(reg,"g").test(op);
    },
    compare : function(op1,operator,op2){
        switch (operator) {
            case "NotEqual":
                return (op1 != op2);
            case "GreaterThan":
                return (op1 > op2);
            case "GreaterThanEqual":
                return (op1 >= op2);
            case "LessThan":
                return (op1 < op2);
            case "LessThanEqual":
                return (op1 <= op2);
            default:
                return (op1 == op2);            
        }
    },
    MustChecked : function(name, min, max){
        var groups = document.getElementsByName(name);
        var hasChecked = 0;
        min = min || 1;
        max = max || groups.length;
        for(var i=groups.length-1;i>=0;i--)
            if(groups[i].checked) hasChecked++;
        return min <= hasChecked && hasChecked <= max;
    },
    IsDate : function(op, formatString){
        formatString = formatString || "ymd";
        var m, year, month, day;
        switch(formatString){
            case "ymd" :
                m = op.match(new RegExp("^\\s*((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})\\s*$"));
                if(m == null ) return false;
                day = m[6];
                month = m[5]--;
                year =  (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));
                break;
            case "dmy" :
                m = op.match(new RegExp("^\\s*(\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))\\s*$"));
                if(m == null ) return false;
                day = m[1];
                month = m[3]--;
                year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10));
                break;
            default :
                break;
        }
        var date = new Date(year, month, day);
        return (typeof(date) == "object" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate());
        function GetFullYear(y){return ((y<30 ? "20" : "19") + y)|0;}
    }
}


