// CMCore
if (typeof(CM) == 'undefined') {
    var CM = {};
}
var j$ = undefined;
if(j$ == null){
	jQuery.noConflict();
	j$ = jQuery;
}
CM.Core = function(symbolName) {
    this.symbolName = symbolName;
    this.keywordCharEnc    = 'utf8';
    this.codec             = 'utf8';
    this.ovrHost           = 'im.gmo.ov.yahoo.co.jp';
    this.refererHost       = 'xml.jp.overture.com';
    this.source            = 'gmo_jp_yaplog_cm_kw';
    this.ctxtId     = ['yaplog_category1_1'];
    this.switchLimit       = 1.0;
    this.targetTextMax     = 200;
    this.tryLoadAdMaxCount = 200;
    this.ctxtUrl           = 'http%3a%2f%2fwww.yaplog.jp%2f';
    this.ctxtKeywords      = '';
    this.isYap             = false;
};
CM.Core.prototype = {
    coreVersion: 1.0,
    zSr: undefined,
    ovrSrc: undefined,
    getReferer: function(){
    	//var refStr = document.referrer;
    	var refStr = "http://search.yahoo.co.jp/search?p=%E3%82%A8%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%86%E3%82%A4%E3%83%B3%E3%83%A1%E3%83%B3%E3%83%88&search.x=1&fr=top_ga1_sa&tid=top_ga1_sa&ei=UTF-8&aq=&oq=";
    	//var refStr = "http://www.google.co.jp/search?hl=ja&q=%E3%81%98%E3%82%83%E3%82%89%E3%82%93&lr=&aq=8r&oq=j";
    	//var refStr = "http://www.yaplog.jp/keyword/%83%7D%83X%83N/1/1/6322/-1/";
		if(refStr == null || refStr == "" || refStr == undefined){
			return "";
		}
		var rtnval;
		var parameters = new Array();
		var valuename = "";
		if(refStr.indexOf("search.yahoo.co.jp") != -1) valuename = "p";
		else if(refStr.indexOf("www.google.co.jp") != -1) valuename = "q";
		else if(refStr.indexOf("www.yaplog.jp/keyword/") != -1){
			this.isYap = true;
			return refStr.split("/")[4];
		}else{
			return "";
		}
		parameters = (refStr.slice(refStr.indexOf("?")+1,refStr.length)).split("&");
		for(var i = 0 ; i < parameters.length ; i++){
			if(parameters[i].indexOf(valuename) != -1){
				rtnval = parameters[i].split("=")[1];
	
				if(rtnval == undefined || rtnval == null)
					rtnval = "";
	
				return rtnval;
			}
		}
		return "";
    },
    getType: function(){
        return 'yaplog_userim';
    },
    getAdMaxCount: function() {
        return 2;
    },
    targetText: '',
    getTargetText: function() {
        return '';
    },
    invoke: function() {
        this.switchLogic();
    },
    switchLogic: function() {
        var keyword = "";//this.getReferer();
        if(keyword == ''){
	        if (this.getAdMaxCount() < 1) {
	            this.zSr = [];
	            this.showAds(this.zSr);
	        } else{
	            this.switchAd();
	        }
	    }else{
	    	this.switchAdForReferer(keyword);
	    }
    },
    switchAd: function() {
        var ovrQuery = [], keys = [], keyQuery = '';
            ovrQuery.push('source=' + this.source);
            ovrQuery.push('type=' + this.getType());
            ovrQuery.push('ctxtId=' + this.ctxtId);
            ovrQuery.push('ctxtUrl=' + encodeURL(this.ctxtUrl));
            ovrQuery.push('keywordCharEnc='+ this.keywordCharEnc);
            ovrQuery.push('outputCharEnc=' + this.codec);
            ovrQuery.push('maxCount=' + this.getAdMaxCount());
            ovrQuery.push('ctxtKeywords=' + this.ctxtKeywords);
            this.ovrSrc = 'http://' + this.ovrHost + '/js_flat/?' + ovrQuery.join('&');
            this.loadAdData();
    },
    switchAdForReferer: function(keyword) {
       LatestSearchWord.getXml(keyword,this.getAdMaxCount(),this.isYap,this.parse_xml);
    },
    loadAdData: function() {
        var iframe, iframeDocument, iframeWindow, html;
        try {
            iframe = document.createElement('iframe');
            iframe.style.width = '0px';
            iframe.style.height = '0px';
            iframe.style.border = '0px';
            iframe.style.borderStyle = 'hidden';
        } catch (e) {}
        document.body.appendChild(iframe);
        iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
        html  = '';
        html += '<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">';
        html += '<head>';
        html += '<meta http-equiv="Content-Type" content="text/html; charset=' + this.srcCodec + '" />';
        html += '<script type="text/javascript" src="' + this.ovrSrc + '" charset="' + this.srcCodec + '" ></script>';
        html += '</head>';
        html += '<body></body>';
        iframeDocument.open();
        iframeDocument.write(html);
        iframeDocument.close();
        iframeWindow = iframe.contentWindow;
        (function(grok) {
            var timer = null, tryCount = 0;
            return function(){
                timer = setInterval(function() {
                    if (tryCount > grok.tryLoadAdMaxCount) {
                        clearInterval(timer);
                        grok.loadAdDataTimeOut();
                    } else if (typeof(iframeWindow.zSr) == 'undefined') {
                        tryCount++;
                    } else if (iframeWindow.zSr.length > 0) {
                        clearInterval(timer);
                        grok.zSr = [];
                        for (var i = 0, len = iframeWindow.zSr.length ;i < len;i++) {
                            grok.zSr[i] = iframeWindow.zSr[i];
                        }
                        grok.showAds(grok.zSr);
                    } else {
                        tryCount++;
                    }
                }, 100);
            };
        })(this)();
    },
    showAds: function(adData) {
        //
    },
    loadAdDataTimeOut: function() {
        //
    },
    parse_xml: function(xml) {
        //
    }
};

CM.Util = {
    deligate: function(target, func) {
        return function() {
            func.apply(target, arguments);
        }
    },
    randomChoice: function(args) {
        return args[Math.floor(Math.random() * args.length)];
    },
    textWrap: (function() {
        if (/opera/.test(navigator.userAgent.toLowerCase())) {
            return function(str) {
                return String(str).replace(/(.)/g, '$1' + '&#8203;');
            };
        } else {
            return function(str) {
                return String(str).replace(/(.)/g, '$1' + '<wbr />');
            };
        }
    })(),
    strip: function(str) {
        return String(str).replace(/^[ \s]*/gim, '').replace(/[ \s]*$/gim, '');
    },
    getText: function(node) {
        var targetNode = node || document.body;
        var children = targetNode.childNodes, texts = [];
        for (var child, type, nodeName, i=0, len = children.length;i < len; i++) {
            child = children.item(i);
            type = child.nodeType;
            if (type == 1) {
                // Element Node
                nodeName = child.nodeName;
                if ((nodeName != 'SCRIPT')&&(nodeName != 'NOSCRIPT')) {
                    texts.push(arguments.callee(child));
                }
            } else if (type == 3) {
                // Text Node
                texts.push(child.data);
            } else if (type == 8) {
                // Comment Node
            }
        }
        return texts.join('');
    },
    getTextByMark: function(startMark, endMark, node) {
        var html, startIndex, endIndex, targetText = '', targetNode = node || document.body;
        html = targetNode.innerHTML;
        startIndex = startMark.length + html.indexOf(startMark);
        endIndex = html.indexOf(endMark);
        if (startIndex < endIndex) {
            targetText = this.strip(html.substring(startIndex, endIndex)).replace(/<\/?[^>]+>/gim, '');
        }
        return targetText;
    },
    getTextsByMark: function(startMark, endMark, node) {
        var html, targetTextList = [], targetNode = node || document.body, patern, matchList = null;
        html = targetNode.innerHTML;
        patern = new RegExp(startMark + '[\\s\\S]*?' + endMark, 'gim');
        matchList = html.match(patern);
        if (matchList) {
            for (var i = 0, len = matchList.length; i < len; i++) {
                targetTextList.push(this.strip(matchList[i].replace(/<\/?[^>]+>/gim, '')));
            }
        }
        return targetTextList;
    },
    getElementsByClassName: function(className, node) {
        var targetNode = node || document;
        var children = targetNode.getElementsByTagName('*') || document.all;
        var elements = [];
        for (var i = 0, len1 = children.length; i < len1; i++) {
            var classNames = children[i].className.split(' ');
            for (var j = 0, len2 = classNames.length; j < len2; j++) {
                if (classNames[j] == className) {
                    elements.push(children[i]);
                    break;
                }
            }
        }
        return elements;
    },
    map: function(args, func) {
        var results = [];
        for (var i = 0, len = args.length; i < len; i++) {
            results.push(func(args[i]));
        }
        return results;
    },
    addListener: (function() {
        if ( window.addEventListener ) {
            return function(node, type, func) {
                node.addEventListener(type, func, false);
            }
        } else if ( window.attachEvent ) {
            return function(node, type, func) {
                var wrapperFunc = function() {
                    func.call(node, window.event);
                };
                node.attachEvent('on'+type, wrapperFunc);
            };
        } else {
            return function(node, type, func) {
                node['on'+type] = func;
            }
        }
    })(),
    kishEncode: function(targetStr) {
        if (targetStr == '') {
            return '';
        }
        var encstr = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789()'.split('');
        var chrcode, bitcnt, rest;
        chrcode = bitcnt = rest = 0;
        for (var i = 0, len = targetStr.length, result = ''; i < len; i++) {
            chrcode = targetStr.charCodeAt(i);
            rest <<= 16;
            rest |= chrcode;
            bitcnt += 16;
            while (bitcnt >= 6) {
                result += encstr[rest >> (bitcnt - 6)];
                rest &= (1 << (bitcnt - 6)) - 1;
                bitcnt -= 6;
            }
        }
        if (bitcnt) {
            result += encstr[rest << (6 - bitcnt)];
        }
        return result;
    }
};