function eWarrant(){
	this.initialize.apply(this,arguments);
};
eWarrant.prototype = {
	timestamp:new Date(),
	extend:function(f){
		var superInitialize = eWarrant.prototype.initialize;
		for(var name in f){
			if(name=="initialize")
				eWarrant.prototype.initialize = function(){
					superInitialize.apply(this, arguments);
					f.initialize.apply(this,arguments);
				};
			else
				eWarrant.prototype[name] = f[name];
		}
	},
	initialize:function(){
		this.data = {page:1};
		this.query = {};
		if(location.search){
			var searchstr = location.search.substring(1);
			if(searchstr.match("=")){
				var kvs = searchstr.split("&");
				for(var i=0;i<kvs.length;i++){
					var kvstr = kvs[i];
					if(kvstr.match("^q(\\.|=)")){
						var qkvs = kvstr.substring(2).split(",");
						for(var j=0;j<qkvs.length;j++){
							var qkvstr = qkvs[j];
							var oper = qkvstr.match("[><!=~]+")[0];
							var qkv = qkvstr.split(oper);
							if(!this.query[qkv[0]])
								this.query[qkv[0]] = [];
							this.query[qkv[0]].push({oper:oper, value:unescape(qkv[1])});
						}
					}else{
						var kv = kvstr.split("=");
						this.data[kv[0]] = unescape(kv[1]);
					}
				}
			}else{
				this.data.i = unescape(searchstr);
			}
			
		}	
		var keys = ["w_code","w_id","prodid"];
		for(var i=0;!this.data.i&&i<keys.length;i++)
			this.data.i = this.data[keys[i]];
		var pathstrs = location.pathname.substr(location.pathname.indexOf("/")+1,location.pathname.lastIndexOf("/")-1).split("/"); 
		var pathnames = [];
		for(var i=0; i<pathstrs.length;i++)
			if(pathstrs[i])
				pathnames.push(pathstrs[i]);
		var ew = this;
		var body = $("body");
		body.append("<div id='terms' align='center'></div>");
	    var iframe = $(document.createElement("iframe"));
	    iframe.attr("src", "/shared-contents.html?20120104");
	    iframe.css("display", "none");
	    iframe.load(function(){
	    	iframe.contents().find("body>div[class]").each(function(){
				var div = $(this);
				$("#"+div.attr("class")).html(div.html());
			});
	    	var terms = $("#terms");
	    	terms.find(".accept").click(function(){
				ew.cookie("simack",1,1);
				location.reload();
			});
			terms.find(".close").click(function(){
				history.back();
			});
			$("#header-menu-"+(pathnames[0]||"top")).addClass("on").parent().siblings().find("a").removeClass("on");
			$('#font-size >a[id|="font"]').click(function(){
				var elm = $(this);
				ew.cookie("font-size", elm.index());
				elm.addClass("on").siblings().removeClass("on");
				body.removeClass().addClass(elm.attr('id'));
			}).filter(":eq("+(ew.cookie("font-size")==null?1:ew.cookie("font-size"))+")").click();
			var submenu = $("#submenu");
			var breadcrumbs = $("#breadcrumbs");
			if(pathnames.length){
				$.ajax({
					url:"/contents.json",
					async:false,
					cache:false,
					dataType:"json",
					success:function (data){
						function getContentsMap(items){
							var ret = {names:[],items:{}};
							for(var i=0;i<items.length;i++){
								var key = "";
								for(key in items[i])
									if(key !== "items"&&key !== "options")
										break;
								if(items[i].items)
									ret.items[key] = getContentsMap(items[i].items);
								else
									ret.items[key] = {};
								ret.items[key].options = items[i].options;
								ret.items[key].label = items[i][key];
								ret.names.push(key);
							}
							return ret;
						}
						var map = getContentsMap([data]);
						ew.contentsdata = data;
						var items = map.items.top.items;
						var menu = items[pathnames[0]];
						if(menu.options&&menu.options.submenu){
							var html = "&nbsp&nbsp&nbsp;";
							if(menu.names){
								for(var i=0;i<menu.names.length;i++){
									var name = menu.names[i];
									html += "|<a "+(name===pathnames[1]?" class=selected ":"")+" href='/"+pathnames[0]+"/"+name+"/'>"+menu.items[name].label+"</a>";
								}
								submenu.html(html+"|").show();
							}
						}else{
							submenu.hide();
						}
						if(breadcrumbs.length){
							var path = "/";
							var link = "<a href='/'>トップ</a>&nbsp;&gt;&nbsp;";
							for(var i=0;i<pathnames.length;i++){
								var name = pathnames[i];
								if(name){
									var item = items[name];
									path += name + "/";
									link += (pathnames.length-1===i?item.label:"<a href='"+path+"'>"+item.label+"</a>&nbsp;&gt;&nbsp;");
									items = item.items;
								}
							}
							breadcrumbs.html(link);
						}
						
						if(location.href.match("sitemap")){
							var lists = $("div.list");
							var limit = 17;
							var count = 0;
							function getSiteMap(parent,items, dep){
								var depth = dep || 0;
								for(var i=0;i<items.length;i++){
									var key = "";
									for(key in items[i])
										if(key !== "items"&&key !== "options")
											break;
									var url = parent + key + "/";
									for(var j=0;j<=depth;j++)
										$(lists[count<limit?0:1]).append("&nbsp;&nbsp;");
									$(lists[count<limit?0:1]).append("<a style='font-size:"+(16-(depth*2)) +"px' href='"+url+"'>"+items[i][key]+"</a><br><br>");
									if(items[i].items)
										getSiteMap(url,items[i].items,depth+1);
									count++;
									
								}
							}
							getSiteMap("/",ew.contentsdata.items);
						}
					}
				});
			}else{
				breadcrumbs.hide();
				submenu.hide();
			}
	    });
	    body.append(iframe);
	    $(".twitter").html("<a href='#' title='Twitterでつぶやく'  onclick='ew.toTwitter();' class='tweet_btn'></a>");
	},
	validator:function(element,options){
		var elm = $(element);
		var vopt = options[elm.attr("name")];
		function check(){
			if(!Boolean(elm.val().match(vopt.exp)))
				elm.val(vopt.def instanceof Function? vopt.def(elm.val()):vopt.def);
		}
		elm.keypress(function (e){
			var start;
			var end;
			if("selectionStart" in elm[0]){
				start = elm[0].selectionStart;
				end = elm[0].selectionEnd;
			}else{
				var selection = elm[0].createTextRange();
				selection.moveToBookmark(document.selection.createRange().getBookmark());
				var before = elm[0].createTextRange();
				before.collapse(true);
				before.setEndPoint("EndToStart",selection);
				start = before.text.length;
				end = before.text.length+selection.text.length;
			}
			var val = elm.val();
			val = val.substr(0,start)+String.fromCharCode(e.keyCode)+val.substr(end);
			if(elm.attr("size")<val.length||!Boolean(val.match(vopt.exp)))
				e.preventDefault();
		}).focus(check).change(check);
	},
	vopts: {
		decimal: {exp:"^(\\+|-)?(0|[1-9][0-9]*)(\\.[0-9]*)?$",def:function(val){return Number(val)||0;}},
		positive: {exp:"^\\+?(0|[1-9][0-9]*)(\\.[0-9]*)?$",def:function(val){return Number(val)||0;}},
		scale2: {exp:"^\\+?(0|[1-9][0-9]*)(\\.[0-9]{0,2})?$",def:function(val){return Number(val)||0;}},
		limit99: {exp:"^\\+?[0-9]{0,2}(\\.[0-9]{0,2})?$",def:function(val){return Number(val)||0;}},
		limit20: {exp:"^\\+?(20|[0-1]?[0-9]?(\\.[0-9]{0,2})?)$",def:function(val){return Number(val)||0;}},
		integer: {exp:"^(\\+|-)[0-9]+$",def:1},
		unsigned: {exp:"^\\+?[0-9]+$",def:1},
		email: {exp:"^((\\w|\\-)+(\\.(?!=@))?)+(@((\\w|\\-)+\\.?)*)?$",def:""}
	},
	format:function(elm,rec,key){
		var text = "";
		$.each(elm.attr("class").split(" "),function(index,str){
			if(str.match("^format")){
				var func = ew.formatter[str.split("-")[1]];
				if(func instanceof Function)
					text = text?func.call(ew.formatter,text):func.call(ew.formatter,rec,key);
			}
		});
		return text;
	},
	formatter: {
		val:function(){return ['',arguments[0],arguments[0][arguments[1]]][arguments.length]||'';},
		detailref: "/search/detail/",
		searchref: "/search/",
		id: function(){return arguments[0].id.substring(arguments[0].id.indexOf("#")+1);},
		simulatorref: function(){ return "javascript:ew.simulator(\""+arguments[0].id+"\")"; },
		simulator: function(){return arguments[0].expiry>this.date2str1(ew.timestamp)?"<a href='"+this.simulatorref.apply(this,arguments)+"'><span class='simicon'></span></a>":""; },
		chartref: function(){ return arguments[0].id?"http://www2.drvs.ne.jp/gs/ewarrant.cgi?gicode="+arguments[0].id.substr(arguments[0].id.indexOf("#")+1):""; },
		chart: function(){ return "<a target=_blank href='"+this.chartref.apply(this,arguments)+"'><span class='charticon'></span></a>"; },
		risk:function(){ return (arguments[0].prdStatus!=2&&arguments[0].prdRisk)? "<span style='width:25px;height:21px;display:inline-block;background:url(/images/dynamic_risk.gif) -"+(Number(arguments[0].prdRisk)-1)*25+"px -0px no-repeat'></span>":"-";},
		link: function(){ return arguments[0].expiry>this.date2str1(ew.timestamp)?"<a href='"+this.detailref+"?"+escape(arguments[0].id)+"'>"+this.val.apply(this,arguments)+"</a>":this.val.apply(this,arguments); },
		link2: function(){ return arguments[0].expiry>this.date2str1(ew.timestamp)?"<a href='"+this.detailref+"?"+escape(arguments[0].id)+"'>"+this.val.apply(this,arguments)+"&nbsp;"+this.series.apply(this,arguments)+"</a>":this.val.apply(this,arguments)+"&nbsp;"+this.series.apply(this,arguments); },
		simlink: function(){ return "<a href='"+this.simulatorref.apply(this,arguments)+"'>"+this.val.apply(this,arguments)+this.type.apply(this,arguments)+"</a>"; },
		lowdelta: function(){ return arguments[0].expiry>this.date2str1(ew.timestamp)?"<a "+(Math.abs(arguments[0].delta)<=0.01?"style='color:gray'":"")+" href='"+this.detailref+"?"+escape(arguments[0].id)+"'>"+arguments[0].undName+this.type.apply(this,arguments)+"</a>":arguments[0].undName+this.type.apply(this,arguments); },
		type: function(){ return (arguments[0].prdPricingModel=="OPT"&&arguments[0].prdPutCall)?(arguments[0].prdPutCall=="P"?"プット":"コール"):""; },
		model:function(){ return {OPT:"eワラント",PIN:"ニアピン",TRK:"トラッカー"}[arguments[0].prdPricingModel];},
		put: function(){ return "<a href='"+this.searchref+"?q=prdPricingModel=OPT,prdPutCall=P,undQuickCode="+ arguments[0].undQuickCode+"'>プット型</a>"; },
		call: function(){ return "<a href='"+this.searchref+"?q=prdPricingModel=OPT,prdPutCall=C,undQuickCode="+ arguments[0].undQuickCode+"'>コール型</a>"; },
		callput: function(){ return this.call.apply(this,arguments)+"&nbsp;&nbsp;&nbsp;"+this.put.apply(this,arguments); },
		series: function(){ return arguments[0].series+"回"; },
		ccy: function(){ return this.comma.apply(this,arguments)+"&nbsp;"+arguments[0].currencyEncoded;},
		yen: function(){ return this.comma.apply(this,arguments)+"&nbsp;"+"円";},
		date2str1: function(){return arguments[0].getFullYear()+(arguments[0].getMonth()<9?"0":"")+(arguments[0].getMonth()+1)+(arguments[0].getDate()<10?"0":"")+arguments[0].getDate();},
		date2str2: function(){return this.datestr3.call(this,this.date2str1.apply(this,arguments));},
		date2str3: function(){return this.date2str2.apply(this,arguments)+" "+["日","月","火","水","木","金","土"][arguments[0].getDay()]+"曜日";},
		datestr1: function(){ return (this.val.apply(this,arguments)==="")?"-":this.val.apply(this,arguments).substr(0,4)+"年"+this.val.apply(this,arguments).substr(4,2)+"月"+this.val.apply(this,arguments).substr(6,2)+"日";},
		datestr2: function(){ return this.datestr1.apply(this, arguments).substr(2); },
		datestr3: function(){return this.val.apply(this,arguments).substr(0,4)+"/"+this.val.apply(this,arguments).substr(4,2)+"/"+this.val.apply(this,arguments).substr(6,2);},
		timestamp: function(){return this.datestr3.apply(this,arguments)+" "+this.val.apply(this,arguments).substr(9,5);},
		comma: function(){
			var arr = String(this.val.apply(this,arguments)||"-").match("(-|\\+)?(\\d*)(\\.\\d+)?");
			var index = arr[2].length%3;
			var parts = arr[2].substr(index).match(/.../g)||[];
			index && parts.unshift(arr[2].substr(0,index));
			return (arr[1]||"")+parts.join(",")+(arr[3]!=null?arr[3]:"");
		},
		number: function(){ return Number(this.val.apply(this,arguments));},
		decimal: function(){ return this.val.apply(this,arguments)==''?'':this.comma.call(this,this.scale2.apply(this, arguments));},
		scale2: function() { var ret = this.decstr.apply(this,arguments); return ret.substr(0,ret.indexOf(".")+3); },
		decstr: function() { return isNaN(this.val.apply(this,arguments))?"":(this.val.apply(this,arguments)<0?Number(this.val.apply(this,arguments))-0.000001:Number(this.val.apply(this,arguments))+0.000001)+""; },
		spread: function(){ return this.scale2.apply(this,arguments)+"<br/>"+this.scale2.call(this,arguments[0],"priceSprdRate"); },
		tool1: function(){ return this.chart.apply(this,arguments)+this.simulator.apply(this,arguments); },
		tool2: function(){ return this.chart.apply(this,arguments)+"<br/><a href='"+this.detailref+"?"+escape(arguments[0].id)+"'>銘柄詳細</a>"; },
		tool3: function(){ return this.chart.apply(this,arguments)+"<br/><a href='"+this.searchref+"?q=undQuickCode="+arguments[0].undQuickCode+"'>銘柄一覧</a>"; },
		percentage: function() { return this.decimal.apply(this,arguments)+"%";},
		indicator: function(){ return Number(this.val.apply(this,arguments))?(this.val.apply(this,arguments)>0? '<font color="#a52a2a">+'+this.percentage.apply(this,arguments)+'&nbsp;↑</font>': '<font color="#0d840d">'+this.percentage.apply(this,arguments)+'&nbsp;↓</font>'):"-"; },
		status: function(){ return "<span style='width:65px;height:33px;display:inline-block;background:url(/images/icons_meigarakensaku.png) -33px -"+(this.val.apply(this,arguments)==""?0:(Number(this.val.apply(this,arguments))+1))*33+"px;'></span>"; },
		model: function(){ return "<span style='width:65px;height:33px;display:inline-block;background:url(/images/icons_meigarakensaku.png) -98px -"+({OPT:0,PIN:1,TRK:2}[arguments[0].prdPricingModel]*33)+"px;'></span>"; },
		pinFlag: function(){ return Number(this.val.apply(this,arguments))? "<span style='width:23px;height:23px;display:inline-block;background:url(/images/common.png) -440px -45px no-repeat'></span>":"-";},
		sign: function(){ var ret = this.decimal.apply(this,arguments); return Number(ret)? "<font color='"+(Number(ret)>0?"#a52a2a": "#0d840d")+"'>"+ret+"</font>":""; },
		offtime:function(){return arguments[0].offTime>0?arguments[0].offTime+"分":"-";},
		arrow:function(){return "&rarr;";},
		rank:function(){return this.none.apply(this,arguments);},
		none:function(){return this.val.apply(this,arguments);}
	},
	simulator:function(id){
		var rec;
		if(this.ds&&this.ds.recs){
			rec = this.ds.recs[id]||this.ds.recs["#"+id];
		} else {
			$.ajax({
				url:"/apps/InformationService",
				data:{i:id},
				cache: false,
				async:false,
				success:function(res){
					rec = res.data.recs[id];
				}
			});
		}
		if(!rec) return;
		var data = {
			w_id:id.substring(id.indexOf("#")+1),
			matdt:this.formatter.datestr3(rec.expiry),
			valdt:this.formatter.date2str2(ew.timestamp),
			type:rec.prdPutCall=="P"?1:0,
			futures_trading:rec.isFuture||0
		};
		if(rec.undCurrency=="JPY")
			data.exrate = "1";
		var fields = {
			company:"webNameEncoded3",
			kaigo:"series",
			warrant:"crbAsk",
			spot:"undLevel",
			k:"prdStrike",
			vol:"vol",
			vol_inc:"volUpperStrike",
			vol_dec:"volLowerStrike",
			unit:"prdContractSize",
			range:"npStrikeRange"
		};
		var terms = $("#terms");
		for(var key in fields)
			data[key] = rec[fields[key]];
		var form = $("#terms form").attr("action","/apps/"+(rec.prdPricingModel=="OPT"? "eWarrantSimulator": "NearpinSimulator"));
		form.attr("target", id);
		for(var key in data)
			form.find("input[name="+key+"]").attr("value", data[key]||0);
		if(this.cookie("simack")){
			ew.cookie("simack",1,1);
			form.submit();
		}else{
			form.submit(function(e){
				ew.cookie("simack",1,1);
			});
			terms.find(".accept").click(function(){
				terms.hide();
				form.submit();
			});
			terms.find(".close").click(function(){
				terms.hide();
			});
			terms.show();
		}
	},
	cookie:function(name,value,options){
		function expires(n){
			var date = new Date();
			date.setTime(date.getTime()+(n*24*60*60*1000));
			return "; expires="+date.toGMTString();
		}
		if(arguments.length>1){
			var opt = "";
			if(value!=null){
				if(options instanceof Object){
					for(var key in {expires:null,domain:null,path:null})
						if(options[key])
							opt += (key=="expires"?expires(options[key]): "; "+escape(key)+"="+escape(options[key]));
				}else{
					opt += (options?expires(options):"") + "; path=/";
				}
			}else{
				opt += expires(-1) + "; path=/";
			}
			document.cookie = escape(name)+"="+escape(value) + opt;
		}else{
			var arr = document.cookie.split("; ");
			for(var i=0;i<arr.length;i++)
				if(arr[i].indexOf(name+"=")==0)
					return arr[i].substring(name.length+1);
			return null;
		}
	},
	toTwitter:function(){
		window.open("https://twitter.com/?status="+encodeURIComponent(document.title+" "+location.href+" #ewarrantjp")).focus();		
	}
};
function ContentService(){
	this.initialize.apply(this,arguments);
}
ContentService.prototype = {
	initialize:function(flag){
		var str = "00000000000000"+flag;
		this.flag = str.substr(str.length-14);
	},
	getDate:function(){
		return new Date(this.flag.substr(6,4),Number(this.flag.substr(4,2))-1,this.flag.substr(2,2));
	} 
};
