//fake console avoiding error in non-firebug supported browsers

var pageLang="en-US";

if (typeof(console)=="undefined"){
	var console={
		log:function(){},
		dir:function(){}
	}
}

var pjID={
	location:{
		"Chinese Mainland":2,
		"Hong Kong":1
	},
	service:{
		"Facility Management Services (CN)":9,
		"Property Management Services (CN)":8,
		"Asset Management Services (CN)":7,
		"Building Consultancy and Improvement Works Services (HK)":6,
		"Other Management Services (HK)":5,
		"Carpark Management Services (HK)":4,
		"Facility Management Services (HK)":3,
		"Elite Services - Deluxe PM Brand (HK)":2,
		"Property Management Services (HK)":1
	},
	property:{
		"Building Consultancy and Improvement Works Services":6,		
		"Others":5,
		"Carpark":4,
		"Educational":3,
		"Commercial & Industrial":2,
		"Residential":1
	}
}

var translate_pjID={
	location:{
		"Chinese Mainland":"Chinese Mainland",
		"Hong Kong":"Hong Kong"
	},
	property:{
		"Building Consultancy and Improvement Works Services":"Building Consultancy and Improvement Works Services",
		"Others":"Others",
		"Carpark":"Carpark",
		"Educational":"Educational",
		"Commercial & Industrial":"Office, Commercial & Industrial",
		"Residential":"Residential"
	}
}

var pageFunction={};


$(function(){




	$.fn.reverse = [].reverse;

	anchor.read();

	// init main navigation
	menu.init();

	buildNav();

	langBtn();

	$('#right-column li.show-hide>a').click(function() {
		if ($(this).parent().find('.member').css('display') == 'none') {
			$('.member').hide();
			$(this).parent().find('.member').show();
		}
		else {
			$(this).parent().find('.member').hide();
		}
		return false;
	});

});


var init_filter_table=function(){
	new filter({
		altrowClass:["grey", "white"],
		selector:"select.tableFilter",
		items:"table.table1 tbody tr",
		data:"td:eq(0)",
		subtitle:"p.subtitle span"
	});
}



var pagination={
	setting:{
		elm:"div.pagin",
		pagesize:10,
		hideOnSinglePage:true
	},
	init:function(obj){
		var maxpage=Math.ceil(obj.length/pagination.setting.pagesize);
		var root=$(pagination.setting.elm).show().empty();
		if ((maxpage>1)||(!pagination.setting.hideOnSinglePage)){
			
			$("<div>").addClass("goto_first").click(function(){pagination.change(obj, 0);}).appendTo(root);
			
			for(var i=0;i<maxpage;i++){
				$("<div>").addClass("page").html(i+1).attr("page",i).click(function(){
					pagination.change(obj, parseInt($(this).attr("page")));
				}).appendTo(root);
			}

			$("<div>").addClass("goto_last").click(function(){pagination.change(obj, maxpage-1);}).appendTo(root);
						
			root.find("div.page[page]:first").addClass("current first");
			root.find("div.page[page]:last").addClass("last");
			
			pagination.change(obj, 0);
		}else{
			root.hide();
			if (typeof(pagination.setting.after)!="undefined") pagination.setting.after.call();			
		}
	},
	change:function(obj, page){
		var lbound=page*pagination.setting.pagesize;
		var ubound=(page+1)*pagination.setting.pagesize-1;
		obj.hide().slice(lbound, ubound+1).show();
		$(pagination.setting.elm+" div.page[page]").removeClass("current").filter(":eq("+page+")").addClass("current");
		if (typeof(pagination.setting.after)!="undefined") pagination.setting.after.call();

	}
}


var filter=function(option){
	
	var myClass=this;

	myClass.setting={
		selectFirstNonEmpty:false,
		pagination:pagination
	}
	
	myClass.init=function(option){
		option=$.extend(myClass.setting, option);

		if (typeof(option.init)!="undefined") value=option.init.call(null, option);
		if ((($(option.selector).length>0)&&($(option.items).length>0))||(option.selector=="")){

			$(option.selector).change(function(){
				var value=$(this).attr("value");
				if (typeof(option.before)!="undefined")	value=option.before.call(myClass, option, value);
				myClass.change(value, option);
			});

			var value=($(option.selector).length>0)?$(option.selector).attr("value"):"";
			if (($(option.selector).attr("value")=="")&&(option.selectFirstNonEmpty)) value=$(option.selector+" option[value!='']:first").attr("value");
			if (typeof(option.before)!="undefined")	value=option.before.call(myClass, option, value);
			myClass.change(value, option);
		}
	}
		
	myClass.change=function(){
//		if (typeof(arguments[0])=="string"){
			var value=arguments[0];
			var option=arguments[1];
			var customselector=(typeof(arguments[2])!="undefined")?arguments[2]:$(option.items).find(option.data+":contains('"+value+"')");

//			if(((option.selector!="")&&(value!=""))||(option.selector=="")){
				$(option.items).hide();
				customselector.parents(option.items).show();
				if (typeof(option.altrowClass)!="undefined"){				
					$(option.items).removeClass(option.altrowClass.join(" "));
					var selected=$(option.items+":visible");
					for(var i=0;i<selected.length;i++){
						$(selected[i]).addClass(option.altrowClass[i%option.altrowClass.length]);
					}
				}
				$(option.subtitle).html(value);

				if (typeof(option.after)!="undefined"){
//					option.after.call(null, option);
					option.pagination.setting["after"]=function(){option.after.call(null, option);}
				}
				
				// this bug is so odd! fix by a reverse?
				option.pagination.init(customselector.parents(option.items).reverse());
				
//			}
//		}

	}

	
	myClass.init(option);
}




var featurize=function(option){
	var boxes=$(option.feature.boxes);
	if (boxes.length<=$(option.items).length){
		for(var i=0;i<boxes.length;i++){
			var me=$(option.items+":first");
			if (me.length>0){
				var box=$(boxes[i]);
				for(var j=0;j<option.feature.databinding.length;j++){
					var bind=option.feature.databinding[j];
					switch (bind.type){
						case "html":
							box.find(bind.target).html(me.find(bind.source).html());
						break;
						case "src":
							box.find(bind.target).attr(bind.type, me.find(bind.source).attr(bind.type).replace("_small.", "."));
						break;
					}
				}
				me.empty().remove();
			}
		}
	}
}

var milestone={
	init:function(){
		$(".tabs li img[title]").click(function(){
			var me=$(this);
			var range=me.attr("title").split("-");
			me.parents("li:eq(0)").addClass("activetab").siblings().removeClass("activetab");
			milestone.settab(range[0], range[1]);
		}).hover(function(){
			$(this).addClass("hover");
		},function(){
			$(this).removeClass("hover");
		});
		$(".tabs li img[title]:last").click();
	},
	settab:function(from, to){
		var now=new Date();
		from=parseInt(from);
		to=parseInt((to.toLowerCase()=="now")?now.getFullYear():to);
		var selector="";
		var sep="";
		for (var i=from;i<=to;i++){
			selector+=sep+"div.milestone p.year:contains('"+i+"')";
			sep=", ";
		}
		$("div.milestone").hide();
		$(selector).each(function(){$(this).parents("div.milestone:eq(0)").show()});
	}
}


var menu={
	current_session:"",
	menu_timer:null,
	
	init:function(){
		if ($("#menu li.lv1 div.lv2 .navbox").length==0){
			$("#menu li.lv1 div.lv2>ul").each(function(){
				var me=$(this).parents("div.lv2");
				var txt='<div class="navbox navhead"><div class="navright"></div></div><div class="navbox navbody"><div class="navright">'+me.html()+'</div></div>';
				me.html(txt);
			});
		}
		
		
		$("#menu li.lv1").hover(function(){
			
			clearTimeout(menu.menu_timer);
			$("#menu li.lv1").removeClass("selected");
			
			var me=$(this);
			me.addClass("selected");
			me.find("div.lv2").width(233);
			var root=me.find(".column").parents("div.lv2:eq(0)");
			root.width(root.attr("width")+"px");
			var li=me.find("ul.column li.column");
	
			var h=0;
			for (var i=0;i<li.length;i++){
				h=Math.max(h,parseInt($(li[i]).css({"top":"0px","left":parseInt(root.width()*i/li.length+i*10)+"px"}).height()));
			}
			me.find("ul.column").height(h+"px");
			
			me.click(function(){document.location=me.find("a.menu").attr("href");});
	
		}, function(){
			clearTimeout(menu.menu_timer);
			menu.menu_timer=setTimeout(menu.closemenu, 250);
		});
	},
	
	closemenu:function(){
		clearTimeout(menu.menu_timer);
		$("#menu li.lv1").removeClass("selected");
	}
	
}

var drawData=function(option){
	
	var myClass=this;

	myClass.init=function(option){
		var callsetting={
			url: option.source,
			cache: false,
			success: function(json){
				json=myClass.default_dataBuilding(json, option);
				if (option.dataBuilding) json=option.dataBuilding.call(this, json, option);
				
				// *************
				for (var i=0;i<json.length;i++){
					for(var key in json[i]){
						if (json[i][key]==null){
							json[i][key]="";
						}
					}
				}
				// *************
				
				if (!option.dataRender) option.dataRender=myClass.default_dataRender;
				option.dataRender.call(this, json, option);

				if (option.select) myClass.default_dataSelect.call(this, json, option);

				
				if (option.afterRender) option.afterRender.call(this, json, option);
				
				$("img[src*=null], img[src*=undefined]").parent().addClass("hideImage");
				/*$("img[src*=null], img[src*=undefined]").parent().parent().css("display", "none"); 
				/*$(".hideImage").parent().remove();*/
				/*$('*:contains("undefined"):last').parent().parent().css("display","none");*/
				/*$('*:contains("undefined"):last').parent().css("display","none");
				$("a[href*='undefined']")
				   .each(function()
				   { 
					  $(this).parent().parent().remove();
				   });
				*/

			},
			error: function(){
				//console.log("error");
			}
		}
		if (myClass.sameDomain(option.source)){
			callsetting["dataType"]="json";
		}else{
			callsetting["url"]="http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20json%20where%20url%3D'"+escape(option.source)+"'&format=json&callback=";
		}
		$.ajax(callsetting);

	}


	myClass.default_dataBuilding=function(json, option){
		var month=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
		if (!myClass.sameDomain(option.source)) json=changeAxis(json.query.results.json.json);
		for(var i in json){
			try{
				var t=parseInt(json[i]["Year"].split("(")[1]);
				if (t>10000){
					var d=new Date(t);
					json[i]["Day"]=("00"+d.getDate()).substr(("00"+d.getDate()).length-2,2);
					json[i]["Month"]=month[d.getMonth()];
					json[i]["Year"]=parseInt(d.getFullYear());
				}
			}catch(e){}
		}
		return(json);
	}
	
	myClass.default_dataRender=function(json, option){
		var root=$(option.target).empty();
		for(var i in json){
			var txt=option.template;
			for (var key in option.mapping){
				do{
					var oldtxt=txt;
					txt=txt.replace(option.mapping[key], json[i][key]);
				}while(oldtxt!=txt);
			}
			$(txt).appendTo(root);
		}
	}



	myClass.default_dataSelect=function(json, option){
		var root=$(option.select);
		for(var i=0;i<json.length;i++){
			if (root.find("option[value="+json[i]["Year"]+"]").length===0){
				$("<option>").html(json[i]["Year"]).attr("value", json[i]["Year"]).appendTo(root);
			}
		}
	}

	myClass.sameDomain=function(url){
		var source=url.toLowerCase().split("://");
		if (source.length<2) return(true);
		
		var remote=source[1].split("/")[0];
		var local=document.location.toString().split("://")[1].split("/")[0];
		
		return(local==remote);
		
	}

	

	myClass.init(option);
}

var changeAxis=function(obj){
	var result=[];
	for (var key in obj){
		for (var i=0;i<obj[key].length;i++){
			if (typeof(result[i])=="undefined") result[i]={};
			result[i][key]=obj[key][i];
		}
	}
	return(result);
}


var validate=function(elm, types){

	var test=function(type, elm){
		var str=elm.attr("value")||elm.html();
		if (typeof(type)=="object"){
			for (var typename in type);
			check=type[typename];
		}else{
			typename=type;
		}
		var msg="";
		var label=$("label[for="+elm.attr("id")+"]").html();
		switch(typename){
			case "nonempty":
				if (str.replace(/(^\s*)|(\s*$)/g, "").length==0) return("Please fill in " + label + " box");
				break;
			case "email":
				var regex=/^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/;
				if (!regex.test(str)) return("Please check " + label);
				break;
			case "numberic":
				var regex=/(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
				if (!regex.test(str)) return("Please check " + label);
				break;
			case "minlength":
			    if (str.length < parseInt(check)) return ("Please check " + label);
				break;
			case "maxlength":
			    if (str.length > parseInt(check)) return ("Please check " + label);
				break;
			case "minvalue":
			    if (parseFloat(str) < parseFloat(check)) return ("Please check " + label);
				break;
			case "maxvalue":
			    if (parseFloat(str) > parseFloat(check)) return ("Please check " + label);
				break;
			case "checked":
			    if (elm.filter(":checked").length == 0) return ("Please check " + label);
				break;
		}
		return "";
	}

	var error=[];
	for (var i=0;i<types.length;i++){
		var result=test(types[i], elm);
		if (result!="")	error.push(result);
	}
	
	return error;
}


var anchor={
	parameter:{},
	read:function(){
		try{
			var loc=document.location.toString().split("#");
			var pairs=loc[1].split("&");
			for(var i=0;i<pairs.length;i++){
				var data=pairs[i].split("=");
				this.parameter[data[0]]=data[1];
			}
		}catch(e){
		}
	},
	rebuild:function(){
		var temp=[];
		for (var key in this.parameter){
			if (typeof(this.parameter[key])!="undefined"){
				temp.push(key+"="+this.parameter[key]);
			}
		}
		var loc=document.location.toString().split("#");
		document.location=loc[0]+"#"+temp.join("&");
	}
}


var buildNav=function(){
	var loc=document.location.toString();
	loc=loc.split("#")[0].split("/");
//	loc=loc.split("?")[0].split("#")[0].split("/");
	var loc_noquery=unescape(loc[loc.length-1].split("?")[0]);
	loc=unescape(loc[loc.length-1]);
	//console.log(loc);
	
	getxml("sitemap.xml", function(x){
		var leftNav=$("#left-column").empty();
		
		// leftNav
		var data=$(x).find("[fname="+loc+"]").parents("xml>nav");
		if (data.length==0) data=$(x).find("[fname="+loc_noquery+"][ignorequery=true]").parents("xml>nav");
		if (data.length==0) data=$(x).find("[fname="+loc+"]");
		data.find("group").each(function(){
			if ($(this).attr("name")!="") $("<p>").addClass("menu-long").html($(this).attr("name")).appendTo(leftNav);
			var ul=$("<ul>").addClass("menu").appendTo(leftNav);
			$(this).children("nav").each(function(){
				var li=$("<li>").addClass($(this).attr("show")).appendTo(ul);
				var obj={
					"href":$(this).attr("fname"),
					"ignorequery":$(this).attr("ignorequery")
				}
				$("<a>").attr(obj).html($(this).attr("name")).appendTo(li);


				var sn_ul=$("<ul>").appendTo(li);
				$(this).children("nav").each(function(){
					var sn_li=$("<li>").addClass("no-bullet").addClass($(this).attr("show")).appendTo(sn_ul);
					var obj={
						"href":$(this).attr("fname"),
						"ignorequery":$(this).attr("ignorequery")
					}					
					$("<a>").attr(obj).html($(this).attr("name")).appendTo(sn_li);
				})
				
			})
		})
		leftNav.find("ul.menu").each(function(){
			$(this).children("li:last").addClass("last");
		});
		leftNav.find("a[href="+loc+"]").addClass("currentpage").parents("li").addClass("currentpage");
		leftNav.find("a[href="+loc_noquery+"][ignorequery=true]").addClass("currentpage").parents("li").addClass("currentpage");
		if (data.find("nav[fname="+loc+"][show=none]").length>0){
			leftNav.find("a").each(function(){
				if ($(this).html()==data.find("nav[fname="+loc+"][show=none]").attr("name")){
					$(this).addClass("currentpage");
				}
			})
		}
		
		//ready!
		leftNav.show();

		
		try{
			pageFunction[data.find("[fname="+loc+"]").attr("onload")].call();
		}catch(e){
			pageFunction[data.find("[fname="+loc+"]").attr("onload")]=true;
		}
		
		//breadcrumb
		var breadcrumb=[];
		var medoc=$(x).find("[fname="+loc+"]");
		if (medoc.length==0) medoc=$(x).find("[fname="+loc_noquery+"][ignorequery=true]");
		breadcrumb.push(medoc.attr("name"));
		medoc.parents("nav").each(function(){
			var fname=(typeof($(this).attr("fname"))=="undefined")?$(this).find("nav[fname]:first").attr("fname"):$(this).attr("fname");
			breadcrumb.push('<a href="'+fname+'">'+$(this).attr("name")+'</a>');
		})
		breadcrumb.push('<a href="index.html">Home</a>');
		$(".breadcum").empty().html(breadcrumb.reverse().join(" &gt; "));
		
	});
}


var getxml=function(url, callback){
	
	var setting={
		url:url,
		type: 'get', 
		datatype: ($.browser.msie) ? "text" : "xml",
		success: function(strXML){
			try {
				var xml = new ActiveXObject("Microsoft.XMLDOM");
				xml.async = false;
				xml.loadXML(strXML);
			} catch(e){
				var xml = strXML;
			}
			callback.call(null, xml);
		}
	}
	setting["error"]=setting["success"];
	
	$.ajax(setting);
}


var langBtn=function(){	$("#toolbox .lang-selector span").click(function(){
var loc=document.location.toString();
		console.log(loc);
		var en=loc.split("/en/").join("/"+this.className+"/");
		var tc=loc.split("/tc/").join("/"+this.className+"/");
		var sc=loc.split("/sc/").join("/"+this.className+"/");
		if (en!=loc) document.location=en;
		if (tc!=loc) document.location=tc;
		if (sc!=loc) document.location=sc;
	});
	
}

/*
if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/ /*) 
  {
    var len = this.length;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}
*/
