/*
	Add Librally ad lib
	by HAYA
*/
/* @@ Functions */



/* @ prototype */
/*  bind, bindAsEventListener */
(function(){
if(!Function.bind){
	Function.prototype.bind = function(){
		var __method = this, args = Array.prototype.slice.call(arguments), object = args.shift();
		return function(){
			return __method.apply(object, args.concat(Array.prototype.slice.call(arguments)));
		}
	}
}
if(!Function.bindAsEventListener){
	Function.prototype.bindAsEventListener = function(object){
		var __method = this, args = Array.prototype.slice.call(arguments), object = args.shift();
		return function(event){
			return __method.apply(object, [( event || window.event)].concat(args).concat(Array.prototype.slice.call(arguments)));
		}
	}
}
})();


//
$put = function( a ){
	var s ='';
	for(var p in a ) s+= p+':'+a[p]+', ';
	alert( s);
}




// AdLib
var $Ad = {};

/* super global var */
$Ad.GLOBAL = (function(){ return this; })();

/* for data */
$Ad.Data = {};
/* for action hook */
$Ad.Hook = {};

/* AdLib Class (Object type) */
$Ad.Class = {}; // for Class template
$Ad.AdClass = {
	// new class
	newClass: function(){
		var cls = $Ad.Obj.extendSuper( this );
		if ( typeof( cls.initialize ) == 'function' ) cls.initialize.apply( cls, arguments );
		return cls;
	},
	// extend class 
	extendClass: function( ext, ext2 ){
		var cls = $Ad.Obj.extendSuper( this, ext );
		if( ext2 ) cls = cls.extendClass( ext2 );
		return cls;
	}
}


/* Object */
$Ad.Obj = {
	// extend property by copy
	extend: function( obj, ext ){
		for(var p in ext ) obj[p] = ext[p];
		return obj;
	},
	// extend property by prototype
	extendSuper: function( superObj, ext ){
		var f = function(){};
		f.prototype = superObj;
		var o = new f;
		for(var p in ext ) o[p] = ext[p];
		return o;
	},
	// Object.hasOwnProperty for old Safari
	hasOwn: function( obj, p ){
		return Object.hasOwnProperty ? obj.hasOwnProperty(p) : ( obj[p] && !obj.constructor.prototype[p] );
	}

}

/* Array */
$Ad.Ary = {
	fromArguments: function( arg, start ){
		var a = Array.prototype.slice.call( arg );
		return ( start > 0 ) ? a.slice( start ) : a;
	}
};

/* Function */
$Ad.Func = {
	scope: function( obj, func ){
		return function(){ func.apply( obj, arguments ); }
	},
	// ありがちなClassのコンストラクタ作成
	createClass: function( obj ){
		var f = function(){
			if( typeof( this.initialize ) == 'function' ) this.initialize.apply( this, arguments );
		};
		if( obj ) f.prototype = obj;
		return f;
	},
	// 継承 by prototype property copy
	inheritClass: function( subClass, superClass ){
		for(var prop in superClass.prototype ){
			subClass.prototype[prop] = superClass.prototype[prop];
		}
	}
}

/* String */
$Ad.Str = {
	// trim
	trim: function( str, c, side ){
		c = (c) ? c : '[\\s\\t\\n\\r\\0]'; // Safari bug? -> '\\v' = 'v'
		var e;
		switch(side){
			case 1 : e = '^'+c+'*'; break;
			case 2 : e =  c + '*$'; break;
			default: e = '^'+c+'*|'+c+'*$';
		}
		return str.replace( RegExp( e, 'g' ), '' );
	},
	ltrim: function( str, c ){ return $Ad.Str.trim( str, c, 1 ); },
	rtrim: function( str, c ){ return $Ad.Str.trim( str, c, 2 ); },
	// pad
	pad: function( str, len, pad, over, side ){
		var r = ''+str;
		var l = len - r.length;
		if(l<0){
			if(!over){
				switch(side){
					case 1 : r = r.substr(-l,len); break;
					case 2 : r = r.substr( 0,len); break;
					default: r = r.substr(Math.floor(-l/2),len);
				}
			}
		}else {
			pad = pad ? pad.substr(0,1) : ' ';
			switch(side){
				case 1 : r = $Ad.Str.repeat(pad,l)+r; break;
				case 2 : r = r+$Ad.Str.repeat(pad,l); break;
				default: r = $Ad.Str.repeat(pad,Math.ceil(l/2))+r+$Ad.Str.repeat(pad,Math.floor(l/2));
			}
		}
		return r;
	},
	lpad: function( str, len, pad, over ){ return $Ad.Str.pad(str,len,pad,over,1); },
	rpad: function( str, len, pad, over ){ return $Ad.Str.pad(str,len,pad,over,2); },
	//
	repeat: function( str, c ){
		var r = ''; var i; for(i=0;i<c;i++){ r+=str; }; return r;
	},
	//
	truncate: function( str, length, truncation ){
    str = ''+ str; length = length || 30;
    truncation = ( truncation == undefined ) ? '...' : truncation;
    return str.length > length ?
      str.slice( 0, length - truncation.length ) + truncation : str;
  },
	//
	addslashes: function( str ){
		//return str.replace('/([\"\'])/g', "\\$1").replace('/\0/g', "\\0"); //@php.js ??
		return str.replace( /\\/g, '\\\\' ).replace( /"/g, '\\"' ).replace( /'/g, "\\'" );
	},
	stripslashes: function( str ){
		//return str.replace('/\0/g', '0').replace('/\(.)/g', '$1'); //@php.js ??
		return str.replace( /\\\\/g , '\\' ).replace( /\\"/g, '"' ).replace( /\\'/g, "'" );
	},
	stripReturns: function( str, c ){
		c = c ? c : '';
		return str.replace( /\x0D\x0A|\x0D|\x0A/g, c );
	},
	stripTags: function( str ){
		return str.replace(/<\/?[^>]+>/gi, '');
	},
	escapeHTML: function( str ){
		var div = document.createElement('div');
    var text = document.createTextNode(str);
    div.appendChild(text);
    return div.innerHTML;
	},
	htmlspecialchars: function(s, t, c){
		s = s.toString().replace(/&/g,'&amp;').replace(/</g, '&lt;').replace(/>/g,'&gt;');
		switch(t){
		case 'ENT_QUOTES':
			s = s.replace(/"/g,'&quot;').replace(/'/g,'&#039;');
			break;
		case 'ENT_NOQUOTES':
			break;
		case 'ENT_COMPAT':
		default:
			s = s.replace(/"/g,'&quot;');
			break;
		}
		return s;
	},
	// クエリ文字列を配列に（やっつっけ…）
	parse: function( s ){
		var q, r = s.split('?');
		r = $Ad.Str.trim(r[r.length-1]);
		if( r.indexOf('=') != -1 ){
			r = $Ad.Str.addslashes(r);
			r = r.replace(/\s+&/gm,'&').replace(/&\s+/gm,'&').replace(/\s+=/gm,'=').replace(/=\s+/gm,'=');
			r = '{"'+(((r.split('&')).join('","')).split('=')).join('":"')+'"}';
			try{ var r = eval(r); }catch(e){ var r = {}; }
		} else{ q = {}; q[r] = ''; r = q; }
		return r;
	},
	parseUrl: function( s ){
		var url, q = s.split('?'), $s = $Ad.Str;
		if( q.length > 1 ){
			url = q[0]; q = $s.parse( q[q.length-1] );
		}else {
			if( q[0].indexOf('=') != -1 ){ url = ''; q = $s.parse( q[0] ); }else { url = q[0], q ={} }
		}
		return [ $s.trim( url ), q ];
	}

}
// String Option
$Ad.Str.vsprintf = function( s, a ){
	return $Ad.Str.sprintf( [s].concat(a) );
}
$Ad.Str.sprintf = function( s ){
	var i, a, c, v, m, p, t, n, f, k = 1, b = s.split('');
	for(i=0,f=b.length;i<=f;i++){
		if(b[i] == '%'){
			v = arguments[k++];
			m = n = c = '', a = 0, p = ' ';
			switch(typeof(v)){
				case 'object':
					if(v == null){ v = ''; }; break;
				case 'undefined':
					throw new Error('too few arguments'); break;
			}
			do{
				t = b[i], b[i++] = '';
				switch(t){
					case '$':
						v = arguments[n]; n = ''; break;
					case '.':
						if(n == ''){ n = 0; }; c = b[i], b[i++] = ''; break;
					case '%':
						t = b[i]; break;
					case '+':
						if(m == ''){ m = '+'; }; break;
					case '-':
						a = 1; break;
					case "'":
						p = b[i], b[i++] = ''; break;
					case '0':
						if(n == ''){ p = t; break; };
						if(c == ''){ n+= t; } else { c+= t; };
						break;
					case '1': case '2': case '3': case '4': case '5':
					case '6': case '7': case '8': case '9':
						if(c == ''){ n += t; } else { c += t; }; break;
					default:
						i--; break;
				}
			} while('#' < t && t < ':');

			n = (n == '') ? 0 : Number(n);
			if(!isNaN(Number(v))) {
				if(v < 0){ m = ''; }; if(c != ''){ v = v.toFixed(c); };
			}

			switch(t) {
				case '%': k--; b[i] = t; continue;
				case 'F': v = v.toFixed(6); break;
				case 'f': v = v.toFixed(6); break;
				case 'o': v = v.toString(8); break;
				case 'u': v = v.toString(10); break;
				case 'd': v = v.toString(10); break;
				case 'c': v = String.fromCharCode(v); break;
				case 'b': v = parseInt(v).toString(2); break;
				case 'x': v = v.toString(16).toLowerCase(); break;
				case 'X': v = v.toString(16).toUpperCase(); break;
				case 'e': v = parseInt(v).toExponential(c || 5); break;
				case 's': m = ''; if(c != '') v = v.slice(0, c); break;
			}

			if(v.length < n) {
				if(a) v = v + Array(n - v.length - m.length + 1).join(p);
				else  v = Array(n - v.length - m.length + 1).join(p) + v;
			}
			b[i] = m + v;
		}
	}
	return b.join('');
}

/* */
$Ad.Method = {
	isZeroTrue: function( v ){ return ( v || typeof( v ) === 'number' ); },
	evalSymbol: function( v ){
		var r;
		eval( "try{ r = "+v+"; }catch(e){ r = undefined; }" );
		alert(v);
		return r;
	}
}


/* JSON */
$Ad.Json = {
	eval: function( json ){
		if ( typeof( json ) != 'string' ){
			json = $Ad.Ajax.responseText( json );
		}
		json = json.replace( /\x0D\x0A|\x0D|\x0A/g, '' );
		json = json ? eval( "("+json+")" ) : null;
		return json;
	},
	toJson: function( o ){
		var arr = [], idx=0;
		for( var i in o )
			arr[idx++] = ( "object" == typeof o[i] )? i +" : "+ $Ad.Json.toJson( o[i] ) : i +" : "+ o[i];
		return "{ " + arr.join(" , ") + " }";
	}
}

/* DOM */
$Ad.Dom = {
	// javascript(src)を動的に追加。文字化け防止(safari)
	appendJs: function( src, attr ){
		var tag = document.createElement('script');
		tag.src = src;
		if( !attr.type ) attr.type = "text/javascript";
		if( !attr.charset ) attr.charset = "UTF-8";
		for(var p in attr ){ tag[p] = attr[p]; }
		document.body.appendChild(tag);
		return tag;
	}
}

/* CSS */
$Ad.Css = {
	opacity: function( name, opa ){
		jQuery(name).css({"filter":'alpha(opacity='+opa*100+')',"-moz-opacity":opa,"opacity":opa});
	}
}

/* Image */
$Ad.Img = {
// Image objectを作る
// img <- srcかImage用の{}, event <- 関数(onloadかeventの{})
	create: function( img, event ){
		var g = $Ad.Img._sub.parseOnLoad( img, event );
		return $Ad.Img.onLoadAndComplete( g[0], g[1] );
	},
// Image objectにonloadを設定（既に読込済だとonloadが実行されないブラウザ対応）
// img <- srcかImage, callback <- onload用関数
	onLoadAndComplete: function( img, callback ){
		var g = img;
		if( typeof g =='string' ){ g = new Image(); g.src = img; }
		if( typeof callback =='function' ){
			if( g.complete ){
				callback.apply(g);
			}else {
				g.onload = function(){ callback.apply(g) };
			}
		}
		return g;
	}, 
/* 画像の先読み
imgs <- srcやImage用{}の[]
params <- {
	onComplete <- 全読込み完了時の関数(Image[]), scope <- 関数実行時のscope object(this)
	timeout <- timeoutまでのミリ秒, onTimeout <-timeout時の関数(Image[])
	interval <- 読込中割込みミリ秒, onInterval <- 読込中割込み関数(既読込数,全読込数)
}*/
	preload: function( imgs, params ){
		var images = [], imagesCount = 0, completes = timeouts = false;
		var tmo, tmi, delTm = function( tm ){ if( tm ){ clearTimeout( tm ); } };
		var callf  = function( f,a ){ if( typeof f=='function' ){ f.apply( params.scope,a ); } }
		var onload = function( img ){
			imagesCount++;
			if( imagesCount >= imgs.length && !completes && !timeouts ){
				delTm( tmo ); delTm( tmi ); completes = true; callf( params.onComplete, [images] );
			}
		}
		var out = function(){
			if( !completes ){ delTm( tmi ); timeouts = true; callf( params.onTimeout, [images] ); }
		}
		var loop = function(){
			if( !completes && !timeouts ){
				callf( params.onInterval, [imagesCount,images.length,images] );
				tmi = setTimeout( loop, params.interval );
			}
		}
		imgs = ( typeof imgs =='object' ) ? imgs : [imgs];
		for(var i=0; i<imgs.length; i++ ){ images[i] = $Ad.Img.create( imgs[i], onload ); }
		if( params.timeout  > 0 ) tmo = setTimeout( out, params.timeout );
		if( params.interval > 0 ) loop();
		return images;
	},

	_sub: {
		parseOnLoad: function( img, event ){
			var o = ( typeof img =='string' ) ? { src:img } : img;
			var f = function(){}; f.prototype = o; var c = new f;
			var f = ( typeof event !='object' ) ? { onload:event } : event;
			var p, g = new Image();
			for( p in f ){ c[p] = f[p]; }
			for( p in c ){
				if( typeof c[p] =='function' ){
				var pp = p;
					c[p] = ( typeof o[p] =='function' ) ?
						function(){ o[pp].call(g); f[pp].call(g); } : function(){ f[pp].call(g); };
				}
			}
			for( p in c ){ if( p != 'onload' ){ g[p] = c[p]; } }
			return [ g, c.onload ];
		}
	}

}

//
$Ad.site = {
	mailto: function( ms, opt ){
		if( ms != "" ){
			opt = opt ? opt : {};
			var at = opt['at'] ? opt['at'] : $Ad.site.mailto_at;
			var i = ms.length;
			var j = ms.indexOf( at );
			ms = ms.substring( 0, j )+"@"+( ms.substring( j+at.length, i ) );
			ms = "lt"+"o:"+ms; ms = "mai" + ms;
			location.href = ms;
			return false;
		}
	},
	mailto_at: "atto!(^_^)v",

	goback: function(){
		history.back();
		return false;
	}

}

