

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.0
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && document.getElementById) x=document.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array;
  for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){
//   	alert(x.name);
   	document.MM_sr[j++]=x;
   	if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];
   }
}

function MM_showHideLayers() { //v3.0
  var i,p,v,obj,args=MM_showHideLayers.arguments;
  for (i=0; i<(args.length-2); i+=3) if ((obj=MM_findObj(args[i]))!=null) {
    p=args[i+1];
    v=args[i+2];
    if (obj.style) {
    	obj=obj.style;
    	if(p=='display'){
    		v=(v=='show')?'block':'none';
    		obj.display=v
    	}else{
    		v=(v=='show')?'visible':(v='hide')?'hidden':v;
    		obj.visibility=v
    	}

    }
   }
}

var xmlHttpObj_Pool = new Array();
var xmlHttpObj_Pool_url = new Array();

function createAJAXCall(url,target_id,additional_callback,showLoadingType) {

    if (showLoadingType==null) showLoadingType=0;
	if (target_id!=null && document.getElementById(target_id)==null){
        alert("ERROR TransformXmlHttpResponse(xmlHttpObj,target_id) , target_id not found="+target_id);
    }
	//add goolge analytics
	AJAX_add_google_track(url);
	
    if (target_id!=null){
        //clear target content and show loading msg
        if (showLoadingType==1){
        	//remove contenct
        	var children = document.getElementById(target_id).childNodes;
        	var max = children.length;
        	for (var i = 0; i < max; i++) {
        		document.getElementById(target_id).removeChild(children[max-i-1]);

        	}
        	//add new content
        	if (html2dom!=null){
        		document.getElementById(target_id).innerHTML="載入中";
        	}
        }
	}
	var newIdx=xmlHttpObj_Pool.length;
	xmlHttpObj_Pool_url[newIdx] =url;
	xmlHttpObj_Pool[newIdx] = GetXmlHttpObject();	
    if (xmlHttpObj_Pool[newIdx]==null) {
        alert ("Browser does not support HTTP Request");
        return;
    }
    //xmlHttpObj_Pool[newIdx].open("POST",url,true);
    //xmlHttpObj_Pool[newIdx].send(null);
    CallPost_XmlHttpObject(xmlHttpObj_Pool[newIdx],url);

    xmlHttpObj_Pool[newIdx].onreadystatechange=function (){
        createAJAXCall_onreadystatechange(newIdx,target_id,additional_callback);
    }
}

function createAJAXCall_onreadystatechange(newIdx,target_id,additional_callback){
		if (xmlHttpObj_Pool[newIdx].readyState==4 || xmlHttpObj_Pool[newIdx].readyState=="complete") {
            if (target_id!=null){
                TransformXmlHttpResponse(xmlHttpObj_Pool[newIdx],target_id,newIdx);
            }
			if (additional_callback!=null && typeof(additional_callback)=="function"){
				additional_callback();
			}
		}
}
function createAJAXCall_customize(url,callbackFun) {
    var xmlHttpObj=GetXmlHttpObject();
    if (xmlHttpObj==null) {
        alert ("Browser does not support HTTP Request");
        return;
    }
    xmlHttpObj.open("POST",url,true);
    xmlHttpObj.send(null);
    if (typeof(callbackFun)=="function"){
        xmlHttpObj.onreadystatechange=callbackFun;
    }
    return xmlHttpObj;
}

function TransformXmlHttpResponse(xmlHttpObj,target_id,newIdx){
    if (document.getElementById(target_id)==null){
        //alert("target_id :" +target_id +" not found");
        return;
    }
	//remove contenct
	var children = document.getElementById(target_id).childNodes;
	var max = children.length;
	for (var i = 0; i < max; i++) {
		document.getElementById(target_id).removeChild(children[max-i-1]);

	}
    //alert(xmlHttpObj.responseText);
	//add new content
    /*
	if (html2dom!=null){
		html2dom.getDOM(xmlHttpObj.responseText,target_id,xmlHttpObj_Pool_url[newIdx]);
		if (target_id=="ajax_div_lesson_detail"){
			//alert(html2dom.result);
			//document.getElementById(target_id).innerHTML=html2dom.result;
		}
        eval(html2dom.result);
        document.getElementById(target_id).innerHTML=document.getElementById(target_id).innerHTML;
        *///
        document.getElementById(target_id).innerHTML=xmlHttpObj.responseText;        
        document.getElementById(target_id).innerHTML=document.getElementById(target_id).innerHTML;            
	//}
}
function GetXmlHttpObject() {
	var objXMLHttp=null;
	if (window.XMLHttpRequest) {
		objXMLHttp=new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP");
	}
	return objXMLHttp;
}

function CallPost_XmlHttpObject(xmlHttpObj,url){
    var url_path=url;
    var url_params ="";
    if (url.indexOf('?')>=0){
        url_path=url.substring(0,url.indexOf('?'));
        url_params =url.substring(url.indexOf('?')+1);
        //alert(url_path);
        //alert(url_params);
    }
    xmlHttpObj.open("POST",url_path , true);
    //Send the proper header information along with the request
    xmlHttpObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlHttpObj.setRequestHeader("Content-length", url_params.length);
    xmlHttpObj.setRequestHeader("Connection", "close");
    xmlHttpObj.send(url_params);
}

function form_element_to_string(form){
	var fstr="";
	for (var i=0;i<form.elements.length;i++){
		var add = true;
		var obj=form.elements[i];
		if (obj.disabled){
			add = false;
		}
		if (obj.type=="button"){
			add = false;
		}
		if (obj.type=="checkbox" && !obj.checked){
			add = false;
		}
		if (obj.type=="radio" && !obj.checked){
			add = false;
		}
		if (add){
			fstr+="&"+obj.name;
			fstr+="="+encodeURI(form.elements[i].value);
		}
	}
	//alert(fstr);
	return fstr;
}

function trim(stringToTrim){ return stringToTrim.replace(/^\s+|\s+$/g,"");}

///////////////////////////////////////////////// HTML DOM ////////////////////////////////
//updated by ricky 2008-05-02
//fixed IE script problem

//copy from http://www.html2dom.com/html2dom.js
//update by ricky 2008-04-30
//fixed IE set attribute name problem
//fixed IE set attribute style problem
//fixed bug children[i].nodeType=7 problem

//copy and update from http://www.peterbe.com/plog/setAttribute-style-IE
//function rzCC(s){
//function _setStyle(element, declaration) {

//handle IE set attribute style problem
function rzCC(s){
   // thanks http://www.ruzee.com/blog/2006/07/\
   // retrieving-css-styles-via-javascript/
   for(var exp=/-([a-z])/;
       exp.test(s);
       s=s.replace(exp,RegExp.$1.toUpperCase()));
   return s;
 }

 function _setStyle(element, declaration) {
   if (declaration.charAt(declaration.length-1)==';')
     declaration = declaration.slice(0, -1);
   var k, v;
   var splitted = declaration.split(';');
   var r="";
   for (var i=0, len=splitted.length; i<len; i++) {
      k = rzCC(splitted[i].split(':')[0]);
      v = splitted[i].split(':')[1];
      //eval("element.style."+k+"='"+v+"'");


      k=trim(k);
      v=trim(v);


      r+=element+".style."+k+"='"+v+"';\n";
   }
   return r;
 }




var html2dom = {

    result: new String(),

    getDOM: function (html, appendTo,page_url)
    {
        if (html.length = 0) {
            this.result = "";
            return this.result;
        }

        var root_name = "kindarandomandhopefullyunique" +
                        Math.round((Math.random() * 99999)+10000);
        html = "<" + root_name + ">" +
               html +
               "</" + root_name + ">";
        var doc;
        // code for IE
        try{
            if (window.ActiveXObject) {
                doc=new ActiveXObject("Microsoft.XMLDOM");
                doc.async="false";
                doc.loadXML(html);
            // code for Mozilla, Firefox, Opera, etc.
            } else {
                var parser=new DOMParser();
                doc=parser.parseFromString(html,"text/xml");
            }

        }catch(err){
          alert("Error description: " + err.description + "\n\n");
        }

        //alert(html);
        //alert(doc.documentElement);

        if (doc.documentElement==null){
            alert("error parse ajax response : "+ page_url);
        }

        var root = doc.documentElement;
        if (root.hasChildNodes()) {

            if (appendTo) {
                if (typeof(appendTo) == "object") {
                    this.result = "var html2dom_root = " + appendTo + ";";
                } else if (typeof(appendTo) == "string") {
                    this.result = 'var html2dom_root = document.getElementById("' + appendTo + '");';
                }
            } else {
                this.result = "var html2dom_root = document.createElement('div');";
            }
            this.result += "\n";
            this.traverse(root, "html2dom_root");
        }
    },

    traverse: function (el, variable)
    {
        var children = el.childNodes;
        var max = children.length;
        for (var i = 0; i < max; i++) {
            //alert(children[i].nodeName);
			var write_js= true;
            var loadChildren=true;
            var nodeval = this.escape(children[i].nodeValue);
            var newvar = variable + '_' + (i + 1);
            switch (children[i].nodeType) {
                case 1: // element
                    newvar += '_' + children[i].nodeName;
                    if (children[i].nodeName=='script'){
                        //salert(children[i].childNodes[0].nodeValue);
                        this.result += children[i].childNodes[0].nodeValue +'\n';
                        write_js=false;
                        loadChildren=false;
                    }else{
                        //nornaml html
                        var el_name='';
                        //var el_style='';
                        for (var j = 0, a; a = children[i].attributes[j]; j++) {
                                if (a['nodeName']=='name'){
                                    el_name=this.escape(a['nodeValue']);
                                }
                                //if (a['nodeName']=='style'){
                                  //  el_style=this.escape(a['nodeValue']);
                                //}
                        }
                        this.result += newvar
                                    + ' = document.createElement("'
                                    + children[i].nodeName
                                    +  ((el_name=='')?'':' name=\''+ el_name+'\'')
                                    //+  ((el_style=='')?'':' style=\''+ el_style+'\'')
                                    +'");\n';
                        if (children[i].attributes) {
                            for (var j = 0, a; a = children[i].attributes[j]; j++) {
                                if (a['nodeName']=='style'){
                                    this.result += _setStyle(newvar, this.escape(a['nodeValue'])) +"";
                                }else{
                                    this.result += trim(newvar)
                                                +  '.setAttribute("'
                                                + a['nodeName']
                                                +'", "'
                                                + this.escape(a['nodeValue'])
                                                +'");\n';
                                }
                            }
                        }
                    }
                    break;
                case 3: // text
                    newvar += '_text';
                    this.result += newvar + ' = document.createTextNode("'+ nodeval +'");\n';
                    break;
                case 8: //comment
                    newvar += '_comment';
                    this.result += newvar + ' = document.createComment("'+ nodeval +'");\n';
                    break;

                 case 7:
                 	//alert(children[i].nodeName);
                 	write_js= false;
                 	break;
                 default:
                 	break;

            }
            if (loadChildren){
                if (children[i].hasChildNodes()) {
                    this.traverse(children[i], newvar);
                }
            }
            //alert(newvar);
            if (write_js){
        	    this.result += variable + '.appendChild('+ newvar + ');\n';
			}
        }

    },

    escape: function (str) {
        if (!str) return null;
        str = str.replace(/\\/g,'\\\\');
        str = str.replace(/\"/g,'\\\"');
        str = str.replace(/\n/g,'\\n');
        str = str.replace(/\r/g,'\\r');
        return str;
    }
}
///////////////////////////////////////////////// HTML DOM  END////////////////////////////////

//YAhoo YUI
function common_setYaooCalCfg(obj){

    obj.cfg.setProperty("MDY_YEAR_POSITION", 1);
    obj.cfg.setProperty("MDY_MONTH_POSITION", 2);
    obj.cfg.setProperty("MDY_DAY_POSITION", 3);
    obj.cfg.setProperty("MY_YEAR_POSITION", 1);
    obj.cfg.setProperty("MY_MONTH_POSITION", 2);

    // Date labels for Japanese locale
    obj.cfg.setProperty("MONTHS_SHORT",   ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]);
    obj.cfg.setProperty("MONTHS_LONG",    ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]);
    obj.cfg.setProperty("WEEKDAYS_1CHAR", ["日","一","二","三","四","五","六"]);
    obj.cfg.setProperty("WEEKDAYS_SHORT", ["日","一","二","三","四","五","六"]);
    obj.cfg.setProperty("WEEKDAYS_MEDIUM",["日","一","二","三","四","五","六"]);
    obj.cfg.setProperty("WEEKDAYS_LONG",  ["日","一","二","三","四","五","六"]);
    var navConfig = {
        strings : {
            month: "请选择月份",
            year: "请输入年份",
            submit: "确定",
            cancel: "取消",
            invalidYear: "请输入有效的年份"
        },
        monthFormat: YAHOO.widget.Calendar.SHORT,
        initialFocus: "year"
    };
    //set navigator
    obj.cfg.setProperty("navigator",  navConfig);
}
function common_createYahooCalEvenHandler_YYYYMMDD(updateObj,updateObjType){
    var calSelectHandler = function(type,args,obj) {
            var selected = args[0];
            var dates = args[0];
            var date = dates[0];
            var year = date[0], month = date[1], day = date[2];
            var newVal= year +"-" + month +"-" +day;
            updateObj.value=newVal;
            obj.hide();
    };
    return calSelectHandler;
}

function common_createYahooCalObjectEvent(calenderID,containerObjID,buttonID,textObj){
	YAHOO.namespace("example.calendar");
    var new_obj=eval("YAHOO.example.calendar."+calenderID);
	//alert("YAHOO.example.calendar."+calenderID);
    new_obj= new YAHOO.widget.Calendar(calenderID,containerObjID, { title:"请选择日期:", close:true});
    common_setYaooCalCfg(new_obj);
    //alert(textObj.value);
    var d1=fieldValToDate(textObj.value,"YYYY-MM-DD");
    //alert(d1);
    if (!isNaN(d1)){
        new_obj.select(d1);
    }
    new_obj.render();
    YAHOO.util.Event.addListener(buttonID,"click",new_obj.show,new_obj,true);
    var selectHandler=common_createYahooCalEvenHandler_YYYYMMDD(textObj,'TextBox');
    new_obj.selectEvent.subscribe(selectHandler, new_obj, true);
    return new_obj;
}
//Google analytic
function AJAX_add_google_track(url){
	add_google_track(url);
}
function add_google_track(url){
	if(window._gat!=null){
		var pageTracker = _gat._getTracker(G_GOOGLE_ANALYTICS_TRACKING_ID);
		pageTracker._trackPageview(url);		
	}else{
		//alert("google analytics : _gat not defined");
	}
}

function updateToolsBarLocation(id) {
	if ((document.body.clientHeight+document.body.scrollTop)<document.body.scrollHeight){
		var obj=document.getElementById(id);

		if (document.body.scrollTop<170){
			if(!obj){
			 return false;
			}
			obj.style.pixelTop=170;
		}else{
			obj.style.pixelTop=document.body.scrollTop;
		}
	}

}
