
//check browser
var isie=(/msie/i).test(navigator.userAgent); //ie
var isie6=(/msie 6/i).test(navigator.userAgent); //ie 6
var isie7=(/msie 7/i).test(navigator.userAgent); //ie 7
var isie8=(/msie 8/i).test(navigator.userAgent); //ie 8
var isie9=(/msie 9/i).test(navigator.userAgent); //ie 9
var isfirefox=(/firefox/i).test(navigator.userAgent); //firefox
var isapple=(/applewebkit/i).test(navigator.userAgent); //safari,chrome
var isopera=(/opera/i).test(navigator.userAgent); //opera
var isios=(/(ipod|iphone|ipad)/i).test(navigator.userAgent);//ios
var isipad=(/(ipad)/i).test(navigator.userAgent);//ipad
var isandroid=(/android/i).test(navigator.userAgent);//android
var ismobile=isios || isandroid;

//check os
var iswindow7=(/NT 6\.1/).test(navigator.userAgent);


//for html5
if(isie6 || isie7 || isie8){
	document.createElement('header');
	document.createElement('nav');
	document.createElement('section');
	document.createElement('article');
	document.createElement('aside');
	document.createElement('footer');
}

//check browser able to use canvas
var checkcanvas=document.createElement('canvas');
var hascanvas=(checkcanvas.getContext)? true : false;
checkcanvas=null;

//utils
var util={

	//create element
	//(property option object)
	create : function(opts){
		var rv=(isie6 || isie7 || isie8)? '' : document.createElement(opts.tagname);
		if(opts.tagname=='img' && !opts.alt) opts.alt='';
		for(var i in opts){
			if(i!='tagname'){
				if(isie6 || isie7 || isie8) rv+=' '+((i=='classname')? 'class' : i)+'="'+opts[i]+'"';
				else rv.setAttribute((i=='classname')? 'class' : i,opts[i]);
			}
		}
		return (isie6 || isie7 || isie8)? document.createElement('<'+opts.tagname+rv+'>') : rv;
	},

	//event
	event : {

		//add event. (add event target, event name(except 'on'), function);
		add : function(tg, name, func){
			//ie error
			if(isie && name=='error' && (tg.nodeName && tg.nodeName.toLowerCase()=='img')){
				tg.setAttribute('onerror', '('+func+')();');
				return;
			}
			if(tg.attachEvent) tg.attachEvent('on'+name, func);
			else tg.addEventListener(name, func, false);
		},

		//remove event. (remove event target, event name(except 'on'), function);
		remove : function(tg, name, func){
			if(tg.detachEvent) tg.detachEvent('on'+name, func);
			else tg.removeEventListener(name, func, false);
		},

		//get event info
		info : function(e){
			if(!e) e=window.event;
			return {
				target : e.target || e.srcElement,
				clientX : e.clientX, clientY : e.clientY,
				screenX : e.screenX, screenY : e.screenY,
				offsetX : e.offsetX || e.layerX, offsetY : e.offsetX || e.layerY
			};
		}

	},

	//scroll
	scroll : {

		get : function(){
			if(isapple) return [document.body.scrollLeft, document.body.scrollTop, document.body.scrollWidth, document.body.scrollHeight];
			else return [document.documentElement.scrollLeft, document.documentElement.scrollTop, document.documentElement.scrollWidth, document.documentElement.scrollHeight];
		},

		set : function(l, t){
			if(isapple){
				if(l || l===0) document.body.scrollLeft=l;
				document.body.scrollTop=t;
			}else{
				if(l || l===0) document.documentElement.scrollLeft=l;
				document.documentElement.scrollTop=t;
			}
		}

	},

	//opacity
	opacity : {

		get : function(tg){
			var rv;
			if(isie6 || isie7 || isie8){
				if(tg.style.filter!='') rv=parseInt(tg.style.filter.match(/alpha\(opacity=([0-9]+)\)/)[1])/100;
			}else rv=tg.style.opacity;
			return (rv || rv===0)? rv : null;
		},

		set : function(tg, v){
			if(isie6 || isie7 || isie8) tg.style.filter='alpha(opacity='+(v*100)+')';
			else tg.style.opacity=v;
		}

	},

	//form
	form : {

		//add focusing event to form items
		focusing : function(){
			var item=[];
			var ip=document.getElementsByTagName('input');
			for(var i=0,max=ip.length; i<max; i++) if(ip[i].type=='text') item.push(ip[i]);
			var ta=document.getElementsByTagName('textarea');
			for(var i=0,max=ta.length; i<max; i++) item.push(ta[i]);
			for(var i=0,max=item.length; i<max; i++){
				util.event.add(item[i],'focus',function(e){
					ani.set({target:(e.target)? e.target : e.srcElement,to:'border-color:#61563B',time:0.5,fps:36});
				});
				util.event.add(item[i],'blur',function(e){
					ani.set({target:(e.target)? e.target : e.srcElement,to:'border-color:#CFC9BA',time:0.5,fps:36});
				});
			}
		},

		//form check
		check : function(tg){
			var item=[];
			var ip=tg.getElementsByTagName('input');
			for(var i=0,max=ip.length; i<max; i++) if(ip[i].type=='text') item.push(ip[i]);
			var ta=tg.getElementsByTagName('textarea');
			for(var i=0,max=ta.length; i<max; i++) item.push(ta[i]);
			var sel=tg.getElementsByTagName('select');
			for(var i=0,max=sel.length; i<max; i++) item.push(sel[i]);
			for(var i=0,r,max=item.length; i<max; i++){
				r=(item[i].required || (/required/).test(item[i].className))? true : false;
				if(r && (!item[i].value)){
					item[i].focus();
					return false;
				}
			}		
			return true;
		}

	},

	//image
	image : {

		//image load
		//img=image object | image object array
		load : function(img, callback){

			var imgnum=1;
			var imgloadednum=0;
			var imgs=[];

			if(img.constructor==Array){
				imgnum=img.length;
				for(var i=0; i<imgnum; i++){
					load(img[i]);
				}
				return;
			}else{
				load(img);
			}

			function load(tg){
				if(!tg.originalwidth){
					var copy=util.create({tagname:'img', src:tg.src, style:'position:absolute;left:0;top:-100000px;'});
					copy.onerror=function(){
						tg.error=true;
						document.body.removeChild(copy);
						copy=null;
						imgnum--;
						loadcheck();
					}
					copy.onload=function(){
						tg.loaded=true;
						tg.originalwidth=copy.width;
						tg.originalheight=copy.height;
						document.body.removeChild(copy);
						copy=null;
						imgloadednum++;
						loadcheck();
					}
					document.body.appendChild(copy);
				}else{
					imgloadednum++;
					loadcheck();
				}
			}

			function loadcheck(copiedimg){
				if(imgnum==imgloadednum){
					callback.call(img);
				}
			}

		},

		//image resize
		//(image object, width, height[, image full in given size(true|false)], resize bigger image than given size(true|false))
		resize : function(img, w, h, fill, onlybigger, center){

			if(img.error) return;

			if(!img.originalwidth){
				util.image.load(img, function(){
					util.image.resize(img, w, h, fill, onlybigger);
				});
				return;
			}

			var ck, rate;
			ck=(img.originalwidth>img.originalheight);
			rate=((fill && ck) || !fill && !ck)? h/img.originalheight : w/img.originalwidth;
			if(fill){
				if(w>Math.round(img.originalwidth*rate)) rate=w/img.originalwidth;
				else if(h>Math.round(img.originalheight*rate)) rate=h/img.originalheight;
			}else{
				if(w<Math.round(img.originalwidth*rate)) rate=w/img.originalwidth;
				else if(h<Math.round(img.originalheight*rate)) rate=h/img.originalheight;
			}

			if(!fill && onlybigger && (img.originalwidth<w && img.originalheight<h)){
				img.style.width=img.originalwidth+'px';
				img.style.height=img.originalheight+'px';
				if(center){
					img.style.marginLeft=((w-img.originalwidth)/2)+'px';
					img.style.marginTop=((h>img.originalheight)? (h-img.originalheight)/2 : 0)+'px';
				}
			}else{
				img.style.width=(img.originalwidth*rate)+'px';
				img.style.height=(img.originalheight*rate)+'px';
				if(center){
					img.style.marginLeft=((w-(img.originalwidth*rate))/2)+'px';
					img.style.marginTop=((h>img.originalheight*rate)? (h-(img.originalheight*rate))/2 : 0)+'px';
				}
			}

		}

	},

	//swf
	swf : {

		//write
		write : function(containerid, swfid, src, w, h, flashvars, winmode, bgcolor){
			var container=(typeof(containerid)=='string')? document.getElementById(containerid) : containerid;
			var savehtml=container.innerHTML;
			if(!winmode) winmode='transparent';
			if(!bgcolor) bgcolor='none';
			if(!flashvars) flashvars='';
			var html='';
			if(isie){
				html+='<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+w+'" height="'+h+'" id="'+swfid+'">';
			}else{
				html+='<object type="application/x-shockwave-flash" data="'+src+'" width="'+w+'" height="'+h+'" id="'+swfid+'">';
			}
			html+='<param name="allowScriptAccess" value="always" />';
			html+='<param name="allowFullScreen" value="true" />';
			html+='<param name="quality" value="high">';
			html+='<param name="base" value="." />';
			html+='<param name="movie" value="'+src+'" />';
			html+='<param name="wmode" value="'+winmode+'">';
			html+='<param name="bgcolor" value="'+bgcolor+'" />';
			html+='<param name="flashVars" value="'+flashvars+'">';
			html+=savehtml;
			html+='</object>';
			container.innerHTML=html;
		}

	},

	//ajax control
	//call ajax.send(method='get' | 'post', url string, query string, callbackfunction)
	//if access is success, run callback function with response data argument
	ajax : {

		xmlhttp : null,
		callback : null,

		send : function(method, url, query, callback){
			util.ajax.xmlhttp=(window.ActiveXObject)? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
			util.ajax.callback=callback;
			if(method=='get'){
				util.ajax.xmlhttp.open('GET', url+'?'+query, true);
				util.ajax.xmlhttp.onreadystatechange=util.ajax.readystatechange;
				util.ajax.xmlhttp.send(null);
			}else if(method=='post'){
				util.ajax.xmlhttp.open('POST', url, true);
				util.ajax.xmlhttp.onreadystatechange=util.ajax.readystatechange;
				util.ajax.xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
				util.ajax.xmlhttp.send(query);
			}
		},

		readystatechange : function(){
			if(util.ajax.xmlhttp.readyState==4 && util.ajax.xmlhttp.status==200){
				//util.ajax.callback(util.ajax.xmlhttp.responseXML || util.ajax.xmlhttp.responseText);
				util.ajax.callback();
			}
		}

	},

	//cookie control
	cookie : {

		set : function(name, value, term, path, domain){
			var cookieset=name+'='+value+';';
			if(term){
				var expdate=new Date();
				expdate.setTime(expdate.getTime()+(term*1000)*(60*60));
				cookieset+='expires='+expdate.toGMTString()+';';
			}
			if(path) cookieset+='path='+path+';';
			if(domain) cookieset+='domain='+domain+';';
			document.cookie=cookieset;
		},

		get : function(findstr){
			var rv=null;
			var cookies=document.cookie;
			if(cookies && cookies.indexOf(findstr)!=-1){
				cookies=cookies.split(';');
				for(var i=0,max=cookies.length; i<max; i++){
					cookies[i]=cookies[i].split('=');
					cookies[i][0]=cookies[i][0].replace(' ','');
					if(cookies[i][0]==findstr) rv=cookies[i][1];
				}
				return rv;
			}else return false;
		}

	},

	json : {

		tostring : function(v, doublequotes){
			var txt='{';
			var q=(doublequotes)? '"' : "'";
			for(var i in v){
				txt+=q+i+q+':';
				if(typeof(v[i])=='object' && !v[i].nodeType && v[i].constructor!=Array){
					txt+=util.json.tostring(v[i], doublequotes);
				}else{
					txt+=q+util.string.replacetags(v[i])+q;
				}
				txt+=',';
			}
			return txt.replace(/\,$/, '')+'}';
		}

	},

	string : {

		replacetags : function(v){
			return (v && v.replace)? v.replace(/\</g, '&lt;') : v;
		}

	},

	//check values
	//call trace(argument(s));
	trace : {

		obj : null,

		action : function(){
			if(!util.trace.obj){
				util.trace.obj=util.create({tagname:'div', style:'position:absolute;left:5px;top:5px;font-family:verdana;font-size:11px;color:#000;line-height:1.35em;padding:2px 4px;border:1px solid #000;background:#FFF;z-index:10000;'});
				util.event.add(util.trace.obj, 'click', function(){
					util.trace.clear();
				});
				document.body.appendChild(util.trace.obj);
				util.opacity.set(util.trace.obj, 0.75);
			}
			var v='';
			for(var i=0, max=arguments.length; i<max; i++){
				if(arguments[i]===null) v+='null';
				else if(arguments[i]===undefined) v+='undefined';
				else if(arguments[i]===window) v+='window';
				else if(typeof(arguments[i])=='object' && !arguments[i].nodeType && arguments[i].constructor!=Array){
					v+=arguments[i]+'='+util.json.tostring(arguments[i]);
				}else{
					v+=util.string.replacetags(arguments[i]);
				}
				v+=', ';
			}
			v=v.replace(/\, $/, '');
			util.trace.obj.innerHTML+=v+'<br />';
		},

		clear : function(){
			if(util.trace.obj) util.trace.obj.innerHTML='';
		}

	}

}

//check values
window.trace=util.trace.action;
window.trace.clear=util.trace.clear;
