function JQTTools() {
	this._version = "0.0.5";
	this._author = "JohnQiao";
	this._date = "2010-07-02 1:30AM";
	this._update = "2010-07-21 10:49AM";
	this._switchTLCache = new Map();
}

JQTTools.prototype = {
	
	conditionAnalysis : function(conArray,tempHtml,jsonData,index){
		var resultHtml = "";
		for(a in conArray){
			switch(conArray[a][3]){ // 第4位为操作符 replace ctrlShow等
				case 'replace':{
					resultHtml = this.replaceAnalysis(conArray[a],tempHtml,jsonData,index);
					tempHtml = resultHtml;
				}break;
				case 'ctrlShow':{
					resultHtml = this.ctrlShowAnalysis(conArray[a],tempHtml,jsonData,index);
				}break;
				case 'switch':{
					resultHtml += this.switchAnalysis(conArray[a],tempHtml,jsonData,index);
				}break;
			}
		}
		return resultHtml;
	},
	
	replaceAnalysis : function(a,tempHtml,jsonData,index){
		this.booleanAnalysis(a,jsonData,index) ?
			tempHtml = tempHtml.replaceAll('\\|'+a[4]+'\\|',a[5]) :	tempHtml = tempHtml.replaceAll('\\|'+a[4]+'\\|',a[6]);
		return tempHtml;
	},
	
	ctrlShowAnalysis : function(a,tempHtml,jsonData,index){
		if(this.booleanAnalysis(a,jsonData,index)){
			tempHtml = clear(tempHtml);
		}
		else{
			var type = a[5]; // 获得隐藏类型
			if(type=="hidden"){
				tempHtml = tempHtml.replaceAll("\\|DISPLAY\\|","display:none");
				tempHtml = clear(tempHtml);
			}
			else{
				var startIndex = tempHtml.indexOf("["+a[4]+"]");
				var endIndex = tempHtml.indexOf("[/"+a[4]+"]")+a[4].length+3;
				var t = tempHtml;
				tempHtml = t.substring(0,startIndex) + t.substring(endIndex);
				tempHtml = tempHtml.replaceAll("\\|DISPLAY\\|","");
			}
		}
		
		function clear(t){
			t = t.replaceAll("\\["+a[4]+"\\]","")
				 .replaceAll("\\[\\/"+a[4]+"\\]","")
				 .replaceAll("\\|DISPLAY\\|","");
			return t
		}
		return tempHtml;
	},
	
	switchAnalysis : function(a,tempHtml,jsonData,index){
		var resultHtml = "";
		// 分析模板
		if(this._switchTLCache.size()==0){templateAnalysis(tempHtml);}
		if(this.booleanAnalysis(a,jsonData,index)){
			resultHtml = JQTTools._switchTLCache.get(a[4])
		}
		
		function templateAnalysis(tempHtml){
			// 此时模板中不能出现'['或']'，否则会匹配出错
			while(tempHtml.indexOf("[")!=-1 || tempHtml.indexOf("]")!=-1){
				// 找[*]
				var i = tempHtml.indexOf('[');
				var j = tempHtml.indexOf(']');
				var tag = tempHtml.substring(i+1,j);
				var templateHtml = tempHtml.substring(i+tag.length+2,tempHtml.indexOf('[/'+tag+']'));
				JQTTools._switchTLCache.put(tag,templateHtml);
				// 去除第一模板
				tempHtml = tempHtml.slice(tempHtml.indexOf('[/'+tag+']')+tag.length+2+1);
			}
			//alert(JQTTools._switchTLCache.keys());
			//alert(JQTTools._switchTLCache.values());
			//alert(tempHtml);
		}
		
		return resultHtml;
	},
	
	booleanAnalysis : function(a,jsonData,index){
		var v1 = "";
		if(jsonData[a[0]][1]==undefined){
			v1 = jsonData[a[0]];
		}
		else{
			v1= jsonData[a[0]][index]; // 数据值
		}
		var o = a[1]; // 运算符
		var v2 = a[2]; // 用户期望值
		v1 += "";
		v2 += "";
		switch(o){
			case '=':{return v1==v2;}break;
			case '!=':{return v1!=v2;}break;
			case '>':{return v1>v2;}break;
			case '>=':{return v1>=v2;}break;
			case '<':{return v1<v2;}break;
			case '<=':{return v1<=v2;}break;
		}
	}
}

var JQTTools = new JQTTools();

String.prototype.replaceAll = function(s1,s2) {
    return this.replace(new RegExp(s1,"gm"),s2);
}

/** 
* Make a map like java. 
* You can use this map like this :  
* var myMap = new Map(); 
* myMap.put("key","value"); 
* var key = myMap.get("key"); 
*/  
function Map() {  
  
    this.elements = new Array();  
  
    this.size = function() {  
        return this.elements.length;  
    }  
  
    this.isEmpty = function() {  
        return (this.elements.length < 1);  
    }  
  
    this.clear = function() {  
        this.elements = new Array();  
    }  
  
    this.put = function(_key, _value) {  
        this.elements.push({key:_key, value:_value});  
    }  
  
    this.remove = function(_key) {  
        var bln = false;  
  
        try {  
            for (i = 0; i < this.elements.length; i++) {  
                if (this.elements[i].key == _key) {  
                    this.elements.splice(i, 1);  
                    return true;  
                }  
            }  
        } catch(e) {  
            bln = false;  
        }  
        return bln;  
    }  
  
    this.get = function(_key) {  
        try{   
            for (i = 0; i < this.elements.length; i++) {  
                if (this.elements[i].key == _key) {  
                    return this.elements[i].value;  
                }  
            }  
        }catch(e) {  
            return null;  
        }  
    }  
  
    this.element = function(_index) {  
        if (_index < 0 || _index >= this.elements.length) {  
            return null;  
        }  
        return this.elements[_index];  
    }  
  
    this.containsKey = function(_key) {  
        var bln = false;  
        try {  
            for (i = 0; i < this.elements.length; i++) {  
                if (this.elements[i].key == _key) {  
                    bln = true;  
                }  
            }  
        }catch(e) {  
            bln = false;  
        }  
        return bln;  
    }  
  
    this.containsValue = function(_value) {  
        var bln = false;  
        try {  
            for (i = 0; i < this.elements.length; i++) {  
                if (this.elements[i].value == _value){  
                    bln = true;  
                }  
            }  
        } catch(e) {  
            bln = false;  
        }  
        return bln;  
    }  
  
    this.values = function() {  
        var arr = new Array();  
        for (i = 0; i < this.elements.length; i++) {  
            arr.push(this.elements[i].value);  
        }  
        return arr;  
    }  
  
    this.keys = function() {  
        var arr = new Array();  
        for (i = 0; i < this.elements.length; i++) {  
            arr.push(this.elements[i].key);  
        }  
        return arr;  
    }  
}
