Script ini sya backup dari http://cdn.js-kit.com/scripts/ratings.js agar suatu saat nanti bisa saya gunakan jikalau link dari js-kit itu sendiri mati.
try { if(!window.JSK$EPB && navigator.appVersion.match(/[345]\.[.0-9 ]+Safari/)) { var d = document.createElement('div'); d.style.height = 0; var tgt = 'jsk-ifrmsess-' + Math.random(); d.innerHTML = '<iframe id="' + tgt + '" name="' + tgt + '" src="about:blank" width=0 height=0 style="border: none"></iframe>'; var f = function() { document.body.appendChild(d); var ifrsess = d.firstChild; var getFrame = function(FrameName, Parent) { var tp = Parent ? getFrameDoc(Parent) : document; var fr = tp.getElementById(FrameName).contentWindow; return fr; } var getFrameDoc = function(FrameName, Parent) { var FEl = getFrame(FrameName, Parent); return FEl.contentDocument || FEl.document; } var iDOC = getFrameDoc(tgt); var frm = iDOC.createElement('form'); frm.method = 'post';frm.action = window.location.protocol + '//js-kit.com/api/session/refresh.js'; iDOC.body.appendChild(frm); ifrsess.onreadystatechange = ifrsess.onload = function() { if(ifrsess.readyState && ifrsess.readyState != 'loaded' && ifrsess.readyState != 'complete') return; ifrsess.onload = ifrsess.onreadystatechange = null; }; frm.submit(); } if(document.body) f(); else setTimeout(f, 0); } else {}} catch(e) {}; /* * Copyright (c) 2007 JS-Kit.com. All rights reserved. * $Date: 2011-02-04 00:50:36 -0800 (Fri, 04 Feb 2011) $ * $Id: ratings.js 30602 2011-02-04 08:50:36Z oleg $ */ if ( ! window.$JRA) { /* Global JS Ratings Array */ var $JRA = []; var $JRH = {}; var $JRLT = { yourRatingTitleCase: 'Your Rating', yourRating: 'Your rating', vote: 'vote', votes: 'votes', unrated: 'Unrated', rateThis: 'Rate this', avgRating: 'avg rating', avgRatingExtend: 'Average rating', poweredBy: 'Powered by', youHaveNotRatedYet: 'You have not rated yet', addACommentToYourRating: 'Add a comment to your rating', noVotesReceivedYet: 'No votes received yet', beTheFirstToRate: 'Be the first to rate!', ratingsDisabled: 'Voting Closed', thankYou: 'Thank\u00a0you!', thank: 'Thanks', scoreThis: 'Score\u00a0this', yourScore: 'Your score', up: 'up', down: 'down' }; var $JRL = window.JSRC_Translate || function(t) { return (window.$JRLTL ? $JRLTL[t] : false) || $JRLT[t] || t; } } if(!window.JSKitLib) JSKitLib = {vars:{}}; JSKitLib.cr = function(arg) { if(!arg) return document.createElement("div"); arg.t = arg.t || "div"; var div = document.createElement(arg.t); if(arg.className) div.className = arg.className; if(arg.style) JSKitLib.addStyle(div, arg.style); return div; } JSKitLib.deleteProperty = function(obj, prop) { if (typeof obj[prop] == 'function') { obj[prop] = null; } else { try { delete obj[prop]; } catch (e) { obj[prop] = null; } } } JSKitLib.trim = function(str) { if (typeof(str) != "string") return ""; var str = str.replace(/^\s\s*/, ''), ws = /\s/, i = str.length; while (ws.test(str.charAt(--i))); return str.slice(0, i + 1); } JSKitLib.truncate = function(text, maxLength, postfix, cutWords) { if (text.length <= maxLength) return text; var match = text.match(new RegExp("^.{1," + maxLength + "}\\b")); return ((match && !cutWords ? match[0] : false) || text.substr(0, maxLength)) + (postfix || ""); } JSKitLib.extractDomain = function(url) { var match = url.match(/(https?:\/\/)?(www.)?([^\/]*)/); return match ? match[3] : url; } JSKitLib.encodeJSONLiteral = function(string) { var replacements = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'}; return string.replace(/[\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff\\]/g, function (a) { return (replacements.hasOwnProperty(a)) ? replacements[a] : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); }); } JSKitLib.Object2JSON = function(obj) { var out; switch (typeof(obj)) { case "number" : out = isFinite(obj) ? obj : 'null'; break; case "string" : out = '"' + JSKitLib.encodeJSONLiteral(obj) + '"'; break; case "boolean" : out = '"' + obj.toString() + '"'; break; default : if (obj instanceof Array) { var container = JSKitLib.fmap(obj, function(element) { return JSKitLib.Object2JSON(element); }); out = '[' + container.join(",") + ']'; } else if(obj instanceof Object) { var source = obj.exportProperties || obj; var container = JSKitLib.fmap(source, function(value, property) { if (source instanceof Array) { property = value; value = obj[property]; } return '"' + property + '":' + JSKitLib.Object2JSON(value); }); out = '{' + container.join(",") + '}'; } else { out = 'null'; } } return out; } JSKitLib.appendExternalParams = function(service, requestType, currentParams) { if (!window.JSKitExternalParams) return currentParams; JSKitLib.fmap(window.JSKitExternalParams, function(data) { var serviceRegExp = new RegExp(data.service || "*"); var requestTypeRegExp = new RegExp(data.requestType || "*"); if (serviceRegExp.test(service) && requestTypeRegExp.test(requestType)) { JSKitLib.fmap(data.params, function(value, key) { currentParams[key] = value; }); } }); return currentParams; } JSKitLib.isPreIE7 = function() { if (document.body && document.body.filters && parseInt(navigator.appVersion.split("MSIE") [1]) < 7) return true; } JSKitLib.isPreIE8 = function() { if (document.body && document.body.filters && parseInt(navigator.appVersion.split("MSIE") [1]) < 8) return true; } JSKitLib.isIE = function() { if (document.body && document.body.filters && navigator.appVersion.match(/MSIE/)) return true; } JSKitLib.getBrowser = function() { if (JSKitLib.vars.browser) return JSKitLib.vars.browser; if (document.body && document.body.filters && navigator.appVersion.match(/MSIE/)) { JSKitLib.vars.browser = "IE"; } else if ((navigator.appCodeName.toLowerCase()=="mozilla") && (navigator.appName.toLowerCase()=="netscape") && (navigator.product.toLowerCase()=="gecko") ) { if (navigator.userAgent.toLowerCase().indexOf("safari")!=-1) { JSKitLib.vars.browser = "safari"; } else if (navigator.userAgent.toLowerCase().indexOf("firefox")!=-1) { JSKitLib.vars.browser = "gecko"; } } else if (navigator.product && navigator.product.toLowerCase()=="gecko") { JSKitLib.vars.browser = "gecko"; } else if (navigator.appName.match(/Opera/)) { JSKitLib.vars.browser = "opera"; } return JSKitLib.vars.browser; } JSKitLib.isFF3 = function() { return (navigator.userAgent.indexOf("Firefox/3") != -1); } JSKitLib.isGChrome = function() { return (navigator.userAgent.toLowerCase().indexOf('chrome') != -1); } JSKitLib.isSafari = function() { if (navigator.appVersion.match(/Safari/)) { return true; } } JSKitLib.isOpera = function() { if (navigator.appName.match(/Opera/)) { return true; } } JSKitLib.getOuterHTML = function(node) { var clone = node.cloneNode(true); var parent = document.createElement('div'); parent.appendChild(clone); var ihtml = parent.innerHTML; // ff converts sp characters inside of href to hex ascii var ihtmlHref = ihtml.match(/href\s*=\s*"[^"]*(%7B|%7D)[^"]*"/g) || []; for (var i=0; i< ihtmlHref.length; i++) { var a = ihtmlHref[i]; var b = a.replace(/%7B/g, '{'); b = b.replace(/%7D/g, '}'); ihtml = ihtml.replace(a, b); } return ihtml; }; JSKitLib.html = function() { var div = document.createElement("div"); for(var text = '', i = 0; i < arguments.length; i++) text += arguments[i]; div.innerHTML = text; var ch = div.firstChild; div = null; return ch; } JSKitLib.text = function(text, element, clear) { var textNode = document.createTextNode(text); if (element) { if (clear) JSKitLib.removeChildren(element); element.appendChild(textNode); } return textNode; } JSKitLib.attachDescriptors2Elements = function(elements, layoutBlocksPrefix, descriptors, parentStructure) { JSKitLib.fmap(elements, function(element, id) { var pattern = id.match(layoutBlocksPrefix + "(.*)"); var name = pattern ? pattern[1] : undefined; if (name && typeof(descriptors[name]) == "function") { var node = descriptors[name](element, parentStructure); if (node) element.appendChild(node); } }); } JSKitLib.toDOM = function(template, layoutBlocksPrefix, descriptors) { var content = JSKitLib.html(template); var elements = JSKitLib.mapClass2Object({}, content); var structure = { "set" : function(name, element) { elements[layoutBlocksPrefix + name] = element; }, "get" : function(name, ignorePrefix) { return elements[((ignorePrefix) ? "" : layoutBlocksPrefix) + name]; }, "content" : content }; JSKitLib.attachDescriptors2Elements(elements, layoutBlocksPrefix, descriptors, structure); return structure; } JSKitLib.htmlQuote = function (newValue, param) { newValue = newValue.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">") param = param || {}; if(!param.title) newValue = newValue.replace(/ /," "); if(param.attribute) newValue = newValue.replace(/"/g,"""); return newValue; } JSKitLib.htmlUnquote = function (newValue) { return newValue.replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&"); } JSKitLib.addScript = function(src, content, callback) { var sId = "js-kit-script-"+src.replace(/[\/.]/g, ''); content.jsk$scriptId = sId; if(document.getElementById(sId)) { if (callback) callback(); return; } var s = document.createElement('script'); s.id = sId; s.type ='text/javascript'; s.charset = 'utf-8'; s.src = src; content.appendChild(s); if (callback) { s.onload = s.onreadystatechange = function() { if (s.readyState && s.readyState != 'loaded' && s.readyState != 'complete') return; s.onreadystatechange = s.onload = null; callback(); } } return s; } JSKitLib.stripTags = function(text) { var r = /<\/?(a|em|strong|i|b|u|sup|sub|object|param|embed|span|pre|p)(.|\n)*?>/gi; text = text.replace(/<object(.|\n)+?<\/object>/gi,"[video]"); text = text.replace(r,""); return (text.length > 150) ? text.slice(0,150) + "..." : text; } JSKitLib.createHiddenIframe = function(id, target, cb, clearOnload, src) { clearOnload = (typeof clearOnload == 'undefined' ? true : !!clearOnload); src = src || 'about:blank'; target = target || document.body; var d = document.createElement('div'); d.style.height = 0; d.innerHTML = '<iframe id="' + id + '" name="' + id + '" src="' + src + '" width="0" height="0" frameborder="0" style="border: none"></iframe>'; target.appendChild(d); var ifr = d.firstChild; if (cb) { ifr.onreadystatechange = function(e) { if (ifr.readyState && ifr.readyState != 'loaded' && ifr.readyState != 'complete') return; if (clearOnload) { ifr.onreadystatechange = ifr.onload = null; } cb(); }; if (!JSKitLib.isOpera()) { ifr.onload = ifr.onreadystatechange; } } return ifr; } JSKitLib.overlapSelectsIE = function(target) { var container = document.createElement('div'); container.innerHTML = '<iframe style="position: absolute; z-index: -1; filter: mask(); border: 0; margin: 0; padding: 0; top: 0; left: 0; width: 9999px; height: 9999px; overflow: hidden;"></iframe>'; target.appendChild(container.firstChild); } JSKitLib.openPopup = function(url, extConfig){ var target = '_blank'; var config = { 'width' : '960', 'height' : '800', 'status' : 'no', 'menubar' : 'no', 'toolbar' : 'no', 'resizable' : 'no', 'location' : 'yes', 'scrollbars' : 'yes', 'directories': 'no'}; JSKitLib.fmap(extConfig || [], function(value, key){ if (key == 'target') target = value; else config[key] = value; }); var calcScreenDimensions = function(){ if (JSKitLib.isOpera()) { var doc = (document.compatMode == "BackCompat") ? document.body : document.documentElement; return {'width': doc.clientWidth, 'height': doc.clientHeight}; } return {'width': screen.width, 'height': screen.height}; }; var calcCorrections = function() { if (JSKitLib.isOpera()) return {'height': 35, 'width': 10, 'top' : 0}; if (JSKitLib.isSafari() && !JSKitLib.isGChrome()) return {'height': 150, 'width': 0, 'top' : 100}; return {'height': 0, 'width': 0, 'top' : 0}; }; var screenDimensions = calcScreenDimensions(); var corrections = calcCorrections(); if (config.height > screenDimensions.height - corrections.height) config.height = screenDimensions.height - corrections.height; if (config.width > screenDimensions.width - corrections.width) config.width = screenDimensions.width - corrections.width; if (!(config.left && config.top) && config.width && config.height) { config.left = Math.round((screenDimensions.width - config.width)/2); config.top = Math.round((screenDimensions.height - corrections.top - config.height)/2); } var params = JSKitLib.fmap(config, function(value, key) {return key + "=" + value;}).join(", "); return window.open(url, target, params); } JSKitLib.setEventHandler = function(obj, eventNames, eventHandler) { JSKitLib.fmap(eventNames, function(eventName) { obj["on" + eventName] = function(){ eventHandler(); return false; } }); } JSKitLib.resetEventHandler = function(obj, eventNames) { JSKitLib.fmap(eventNames, function(eventName) { obj["on" + eventName] = function(){}; }); } JSKitLib.addEventHandler = function(obj, eventNames, eventHandler, capture) { JSKitLib.fmap(eventNames, function(e) { if (obj.addEventListener) { obj.addEventListener(e, eventHandler, !!capture); } else if (obj.attachEvent) { if (capture) { if (capture === true) capture = obj; capture.setCapture(); capture.attachEvent('onlosecapture', eventHandler); } obj.attachEvent('on' + e, eventHandler); } }); } JSKitLib.removeEventHandler = function(obj, eventNames, eventHandler, capture) { JSKitLib.fmap(eventNames, function(e) { if (obj.removeEventListener) { obj.removeEventListener(e, eventHandler, !!capture); } else if (obj.detachEvent) { if (capture) { if (capture === true) capture = obj; capture.detachEvent('onlosecapture', eventHandler); capture.releaseCapture(); } obj.detachEvent('on' + e, eventHandler); } }); } JSKitLib.setMouseEvent = function(obj, eventName, eventHandler) { var normalize = function(pr_event){ e = pr_event || window.event; if (!e.target) e.target = e.srcElement || document; if (e.target.nodeType == 3) e.target = e.target.parentNode; if (!e.relatedTarget && e.fromElement) e.relatedTarget = (e.fromElement == e.target) ? e.toElement : e.fromElement; return e; }; obj["onmouse" + eventName] = function(pr_event) { var e = normalize(pr_event); if (e.relatedTarget == obj || JSKitLib.isChildNodeOf(obj, e.relatedTarget)) return false; eventHandler(e); }; } JSKitLib.stopEventPropagation = function(e) { if (!e) e = window.event; e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation(); } JSKitLib.preventDefaultEvent = function(e) { if (!e) e = window.event; e.returnValue = false; if (e.preventDefault) e.preventDefault(); } JSKitLib.deferCall = function(func, onlyIE) { if (!JSKitLib.vars.windowOnLoadFired && (!onlyIE || (onlyIE && JSKitLib.isIE() && !window.$JSKitNoDeferCallIfIE))) { JSKitLib.addEventHandler(window, ['load'], func); } else { func(); } } JSKitLib.addHandlers = function(obj, moveHandler, upHandler, capture) { JSKitLib.addEventHandler(obj, ['mousemove'], moveHandler, capture); JSKitLib.addEventHandler(obj, ['mouseup'], upHandler, capture); } JSKitLib.removeHandlers = function(obj, moveHandler, upHandler, capture) { JSKitLib.removeEventHandler(obj, ['mousemove'], moveHandler, capture); JSKitLib.removeEventHandler(obj, ['mouseup'], upHandler, capture); } JSKitLib.notDraggable = function(element) { element.onselectstart = function(ev) { JSKitLib.stopEventPropagation(ev); return true; } element.onmousedown = JSKitLib.stopEventPropagation; return element; } JSKitLib.getMousePosition = function(e) { if (!e) var e = window.event; if (e.clientX || e.clientY) { return {x:e.clientX, y:e.clientY}; } else { return {x:e.pageX, y:e.pageY}; } } JSKitLib.preventSelect = function(element, exceptions) { var browser = JSKitLib.getBrowser(); var prevent = function() { if (browser == 'IE' || browser == 'safari') { element.onselectstart = function() { return false; } } else if (browser == 'gecko') { JSKitLib.addClass(element, 'js-nsgecko'); } } if (typeof exceptions == 'object') { var include = exceptions.include || []; var exclude = exceptions.exclude || []; // Do not handle for certain browsers if (exclude.length) { for (var i=0; i < exclude.length; i++) { if (exclude[i] != browser) { prevent(); } } } // Handle for certain browsers if (include.length) { for (var i=0; i < include.length; i++) { if (include[i] == browser) { prevent(); } } } } else { prevent(); } } JSKitLib.timedRetry = function(obj) { if(obj.pred()) { obj.onSuccess(); } else { obj.currentRetries = (obj.currentRetries || 0) + 1; if(obj.currentRetries > obj.maxRetries) { if(obj.onFailure) obj.onFailure(); } else { if(obj.onRetry) obj.onRetry(); setTimeout(function(){ JSKitLib.timedRetry(obj); }, obj.timeout); } } } JSKitLib.addDOMLoadedListener = function(callback) { window.JSK$DOMLoadedCallbacks = window.JSK$DOMLoadedCallbacks || []; window.JSK$DOMLoadedCallbacks.push(callback); if (window.JSK$DOMLoadedCallbacks.length > 1) return; var totalListener = function() { JSKitLib.fmap(window.JSK$DOMLoadedCallbacks, function(c) { c(); }); } switch (JSKitLib.getBrowser()) { case 'gecko': case 'opera': document.addEventListener("DOMContentLoaded", totalListener, false); break; case 'IE': var temp = document.createElement('div'); (function() { try { temp.doScroll('left'); } catch (e) { setTimeout(arguments.callee, 100); return; } totalListener(); })(); break; case 'safari': (function() { if (document.readyState != 'complete') { setTimeout(arguments.callee, 100); return; } totalListener(); })(); break; default: JSKitLib.addEventHandler(window, ['load'], totalListener); } } JSKitLib.addCss = function(cssCode, name, content) { var doc = content || document; if(name) { name = "js-" + name + "-css"; if (doc.getElementById(name)) return; } var se = doc.createElement("style"); se.type = "text/css"; if(name) se.id = name; if (se.styleSheet) se.styleSheet.cssText = cssCode; else se.appendChild(doc.createTextNode(cssCode)); var hd = doc.getElementsByTagName("head"); if(hd && hd[0]) hd[0].appendChild(se); else if (JSKitLib.isGChrome()) { doc.body.insertBefore(se, doc.body.firstChild); } else doc.write('<style>'+cssCode+'</style>'); } JSKitLib.getElementsByClass = function(node, searchClass, tag) { var classElements = []; node = node || document; tag = tag || '*'; var tagElements = node.getElementsByTagName(tag); var regex = new RegExp("(^|\\s)" + searchClass + "(\\s|$)"); for (var i=0, j=0; i < tagElements.length; i++) { if (regex.test(tagElements[i].className)) { classElements[j] = tagElements[i]; j++; } } return classElements; }; JSKitLib.mapClass2Object = function(ctl, e) { if(e.className) { var arr = String(e.className).split(/[ ]+/); JSKitLib.map(function(el) { ctl[el] = e }, arr); } if(e.name) ctl[e.name] = e; try { var self = this; JSKitLib.map(function(child) { JSKitLib.mapClass2Object(ctl, child); }, e.childNodes); } catch(e){} return ctl; } JSKitLib.hasClass = function(element, className) { return element.className.match(new RegExp('(\\s|^)' + className + '(\\s|$)')); } JSKitLib.addClass = function(element, className) { if (!JSKitLib.hasClass(element, className)) { element.className += ' ' + className; } } JSKitLib.removeClass = function(element, className) { if (JSKitLib.hasClass(element, className)) { var regex = new RegExp('(\\s|^)' + className + '(\\s|$)'); element.className = element.className.replace(regex, ' '); } } JSKitLib.addPNG = function(node, imageURL) { if (JSKitLib.isIE()) { var cp = $JSKitGlobal.cachedPngs; JSKitLib.fmap(cp, function(img) { img.nodes = JSKitLib.filter(function(elm) { return elm != node; }, img.nodes); }); if(cp[imageURL]) { if(cp[imageURL].loaded) { node.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + imageURL + "', sizingMethod='crop')" } else { cp[imageURL].nodes.push(node); } } else { cp[imageURL] = {nodes:[node]}; var tPng = document.createElement("IMG"); tPng.style.display = "none"; tPng.onload = function() { cp[imageURL].loaded = true; var n = cp[imageURL].nodes; for(var i=0; i<n.length; i++) { n[i].runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + imageURL + "', sizingMethod='crop')"; } cp[imageURL].nodes = []; }; node.appendChild(tPng); tPng.src = imageURL; } } else { node.style.backgroundImage = 'url(' + imageURL + ')'; node.style.backgroundRepeat = 'no-repeat'; } return node; } JSKitLib.preloadImg = function(imgURL) { if (!JSKitLib.preloadImgList) JSKitLib.preloadImgList = {}; if (!JSKitLib.preloadImgList[imgURL]) { (new Image()).src = imgURL; JSKitLib.preloadImgList[imgURL] = true; } }; JSKitLib.pngBar = function(color, div, fixed) { var str; var url = "'//cdn.js-kit.com/images/bars/bar-" + color + ".png'"; if(document.body && document.body.filters) { str = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=" + url + ", sizingMethod='"+(fixed?'crop':'scale')+"')"; if(div) div.runtimeStyle.filter = str; return "filter: " + str + ";"; } else { str = "url(" + url + ")"; if(div) div.style.backgroundImage = str; return "background: " + str + ";"; } }; JSKitLib.createMiniStarObject = function(rating, scale, specs) { var fullStar = specs.full; var emptyStar = specs.empty; var starWidth = specs.width; var starHeight = specs.height; var setImage = function(star, imageURL) { if(star.imageURL == imageURL) return; // Already set and we know it star.imageURL = imageURL; JSKitLib.addPNG(star, imageURL); } var obj = document.createElement('div'); var objWidth = 0; var objHeight = starHeight; /* Increment by Full Star Ratings */ for (var i=2; i <= scale; i += 2) { var star = document.createElement('div'); star.style.cssFloat = 'left'; star.style.styleFloat = 'left'; star.style.width = starWidth + 'px'; star.style.height = starHeight + 'px'; star.style.fontSize = starHeight + 'px'; // ie6 objWidth += starHeight; if (rating >= i) { setImage(star, fullStar); } else { setImage(star, emptyStar); } obj.appendChild(star); } JSKitLib.setStyle(obj, "height: " + objHeight + "px; width: " + objWidth + "px; float: left; margin-right: 5px;"); return obj; } JSKitLib.map = function(f, arr) { if(arr) for(var i = 0; i < arr.length; i++) f(arr[i], i, arr); return arr; } JSKitLib.filter = function(f, arr) { var newArr = []; if(arr) for(var i = 0; i < arr.length; i++) if(f(arr[i], i, arr)) newArr.push(arr[i]); return newArr; } JSKitLib.lookup = function(f, arr){ return JSKitLib.filter(f, arr).shift(); } JSKitLib.fmap = function(o,f) { var r, a = [], l = o.length; if(l > 0 || l === 0) for(var i = 0; i < l; i++) { r = f.call(this,o[i],i,arguments); if(r !== undefined) a.push(r); } else for(var i in o) if(o.hasOwnProperty(i)) { r = f.call(this,o[i],i,arguments); if(r !== undefined) a.push(r); } return a; } JSKitLib.foldl = function(acc,o,f) { var r, l = o.length; if(l > 0 || l === 0) for(var i = 0; i < l; i++) { r = f.call(this,o[i],acc,i); if(r != undefined) acc = r; } else for(var i in o) if(o.hasOwnProperty(i)) { r = f.call(this,o[i],acc,i); if(r != undefined) acc = r; } return acc; } JSKitLib.intersperse = function(f) { return JSKitLib.foldl([], this, function(e, acc, i) { if(acc.length) acc.push(f); acc.push(e); }); } JSKitLib.merge = function() { return Array.prototype.concat.apply([], arguments); } JSKitLib.cloneObject = function(obj) { return JSKitLib.foldl({}, obj, function(value, acc, key) { acc[key] = value; }); } // rounds number to x decimal places JSKitLib.round = function(number, x) { x = (!x ? 2 : x); return Math.round(number*Math.pow(10,x))/Math.pow(10,x); } JSKitLib.zeroPad = function(number, x) { number = JSKitLib.round(number, x); var text = new String(number); var matches = text.match(/(\d*)(\.(\d*))?/) || []; var decimal = matches[3] || ''; if (!decimal) { text += '.'; } var count = x - decimal.length; for (var i=0; i<count; i++) { text += '0'; } return text; } JSKitLib.removeChildren = function(element) { while(element && element.hasChildNodes()) element.removeChild(element.firstChild); } JSKitLib.visible = function(element) { return element.style.display != 'none'; } JSKitLib.show = function(element, style) { element.style.display = style || ''; } JSKitLib.hide = function(element) { element.style.display = 'none'; } JSKitLib.toggle = function(element, style) { (element.style.display == 'none') ? JSKitLib.show(element, style) : JSKitLib.hide(element); } JSKitLib.getStyle = function(element) { if (typeof element.style.cssText != "undefined") { return element.style.cssText; } else { return element.getAttribute("style"); } } JSKitLib.setStyle = function(element, style) { if (typeof element.style.cssText != "undefined") { element.style.cssText = style; } else { element.setAttribute("style", style); } } JSKitLib.addStyle = function(element, style) { var oldStyle = JSKitLib.getStyle(element); JSKitLib.setStyle(element, oldStyle + '; ' + style); // IE needs ; } JSKitLib.getStyleProperty = function(el, prop) { if (typeof el == 'string') { el = document.getElementById(el); } if (el.currentStyle) { return el.currentStyle[prop]; } else if (window.getComputedStyle) { return document.defaultView.getComputedStyle(el, null).getPropertyValue(prop); } else { return el.style[prop]; } } JSKitLib.findPos = function(obj) { var origObj = obj; var curleft = curtop = curright = curbottom = 0; if (obj.offsetParent) { curleft = obj.offsetLeft; curtop = obj.offsetTop; while (obj = obj.offsetParent) { curleft += obj.offsetLeft; curtop += obj.offsetTop; } } curright = curleft + origObj.offsetWidth; curbottom = curtop + origObj.offsetHeight; return [curleft,curtop,curright,curbottom]; } JSKitLib.calcCenterPos = function(elmWidth, elmHeight) { var doc = (document.compatMode == "BackCompat") ? document.body : document.documentElement; var scroll = JSDL.prototype.getCurScroll(); return [ scroll.scroll_left + Math.max(0, Math.round((doc.clientWidth - elmWidth)/2)), scroll.scroll_top + Math.max(0, Math.round((doc.clientHeight - elmHeight)/2)) ]; } JSKitLib.getDocSize = function (){ var doc_width,doc_height; if(typeof window.innerWidth=="number"){ if(document.documentElement && document.defaultView && typeof document.defaultView.scrollMaxY=="number"){ doc_height=document.documentElement.offsetHeight-document.defaultView.scrollMaxY; doc_width=document.documentElement.offsetWidth; } else { doc_height=window.innerHeight; doc_width=window.innerWidth; } } else { if(document.documentElement && typeof document.documentElement.clientWidth=="number" && document.documentElement.clientWidth){ doc_height=document.documentElement.clientHeight; doc_width=document.documentElement.clientWidth; } else { if(document.compatMode == "BackCompat"){ doc_height=document.body.offsetHeight; doc_width=document.body.offsetWidth; } else { doc_height=document.body.clientHeight; doc_width=document.body.clientWidth; } } } return [doc_height,doc_width]; } JSKitLib.getJSKitBodyElement = function() { var be = document.getElementById('js-kit-body-element'); if (!be) { be = document.createElement('div'); be.id = "js-kit-body-element"; document.body.appendChild(be); } return be; } JSKitLib.isChildNodeOf = function(parent, child) { if (parent === child) return false while (child && child !== parent) { try {child = child.parentNode;} catch(e){child = parent;} } return child === parent; } JSKitLib.replaceChildren = function(where, replacement) { JSKitLib.removeChildren(where); JSKitLib.addChild(where, replacement); } JSKitLib.addChild = function(to, what) { if (typeof(to) != 'object') return; if(arguments.length == 3 && arguments[2]) to.insertBefore(what, to.firstChild); else to.appendChild(what); } JSKitLib.hasParentNode = function(el) { return el && el.parentNode && el.parentNode.nodeType != 11; } JSKitLib.setOpacity = function(div, val) { if(document.body.filters) { if(val == 1) div.style.filter = ''; else div.style.filter = 'alpha(opacity: ' + Math.round(val * 100) + ')'; } else { div.style.opacity = val; } } if (typeof JSKitLib.vars.windowOnLoadFired == 'undefined') { JSKitLib.vars.windowOnLoadFired = false; JSKitLib.addEventHandler(window, ['load'], function(){ JSKitLib.vars.windowOnLoadFired = true; }); } JSKitLib.setThumbImage = function(args) { if (typeof args != 'object') return; var element = args.element; var ud = args.ud; var actionable = args.actionable; var imageURL = args.imageURL; var ignoreEmpty = args.ignoreEmpty; var numVotes = args.numVotes; var thumbWidth = args.thumbWidth; var thumbHeight = args.thumbHeight; if(element.imageURL != imageURL){ element.imageURL = imageURL JSKitLib.addPNG(element, imageURL); } var offsetTop=0; var offsetLeft=0; if(ud == 'down') offsetLeft=-thumbWidth; if((!actionable)||(!numVotes && !ignoreEmpty)) offsetTop=-thumbHeight; if(JSKitLib.isIE() && !JSKitLib.isPreIE7()){ element.parentNode.parentNode.style.left=offsetLeft+'px'; element.parentNode.parentNode.style.top=offsetTop+'px'; } else { element.parentNode.style.left=offsetLeft+'px'; element.parentNode.style.top=offsetTop+'px'; } } // Returns an single div with a specified thumb image JSKitLib.createThumbImage = function(args) { if (typeof args != 'object') return; var ud = args.ud; var actionable = args.actionable; var imageURL = args.imageURL; var ignoreEmpty = args.ignoreEmpty; var numVotes = args.numVotes; var thumbWidth = args.thumbWidth; var thumbHeight = args.thumbHeight; var div1 = document.createElement('div'); var div2 = document.createElement('div'); var div3 = document.createElement('div'); div3.style.position = 'relative'; div3.style.width = thumbWidth + 'px'; div3.style.height = thumbHeight + 'px'; div3.style.overflow = 'hidden'; div2.style.position = 'absolute'; div2.style.width = thumbWidth + 'px'; div2.style.height = thumbHeight + 'px'; // div1 is full size of all thumb images, and uses offset and // overflow of its parents to show specific thumb image div1.style.width = (thumbWidth * 2) + 'px'; div1.style.height = (thumbHeight * 2) + 'px'; if(JSKitLib.isIE() && !JSKitLib.isPreIE7()){ var divtmp = document.createElement('div'); divtmp.style.width = (thumbWidth * 2) + 'px'; divtmp.style.height = (thumbHeight * 2) + 'px'; div3.appendChild(div2); div2.appendChild(divtmp); divtmp.appendChild(div1); } else { div2.appendChild(div1); } div3.appendChild(div2); JSKitLib.setThumbImage( { element: div1, ud: ud, actionable: actionable, imageURL: imageURL, ignoreEmpty: ignoreEmpty, numVotes: numVotes, thumbWidth: thumbWidth, thumbHeight: thumbHeight } ); return div3; } var JSKitGlobal = function() { this._appAvailable = {}; this._appObjects = {}; // Specific objects of an application type this._appObjectActions = {}; // app.object.actions this.cachedPngs = {}; this._isAppAvailable = function(app) { return (this._appAvailable[app]) ? true : false; } this.isRatingsAppAvailable = function() { return this._isAppAvailable('ratings'); } this.isCommentsAppAvailable = function() { return this._isAppAvailable('comments'); } this._setAppAvailable = function(app) { this._appAvailable[app] = true; /* index this app */ this.indexAppObjects(app); /* execute any queued actions */ this.executeAppObjectActions(app); } this.setRatingsAppAvailable = function() { this._setAppAvailable('ratings'); } this.setCommentsAppAvailable = function() { this._setAppAvailable('comments'); } this.indexAppObjects = function(app) { if (app == 'ratings') { var appArray = $JRA; } else if (app == 'comments') { var appArray = $JCA; } else { alert('Attempt to index invalid app type'); return; } for (var i=0; i < appArray.length; i++) { // Check that it's not standalone if (appArray[i].isStandalone()) { continue; } var uniq = appArray[i].uniq; if ( ! this._appObjects[uniq] ) { this._appObjects[uniq] = {}; } if ( ! this._appObjects[uniq][app]) { this._appObjects[uniq][app] = []; } this._appObjects[uniq][app].push(appArray[i]); } } this.executeAppObjectActions = function(app) { if (this._appObjectActions[app]) { for (var i=0; i < this._appObjectActions[app].length; i++) { var uniq = this._appObjectActions[app][i].uniq; if (this._getAppObject(app, uniq)) { this._appObjectActions[app][i].action(); } } } } this._getAppObject = function(app, uniq) { if (this._appObjects[uniq] && this._appObjects[uniq][app]) { return this._appObjects[uniq][app][0]; // Return only the first } return null; } this.getCommentsAppObject = function(uniq) { return this._getAppObject('comments', uniq); } /* Returns a Ratings Object */ this.getRatingsAppObject = function(uniq) { return this._getAppObject('ratings', uniq); } this.copyRatingsAppObject = function(uniq, node) { if ( ! this.isRatingsAppAvailable()) { return; } var oldObj = this.getRatingsAppObject(uniq); var newObj = oldObj.clone(node, { 'view':'user', 'commentprompt':'no', 'menu':'no' } ); return newObj; } this._tryAppObjectAction = function(app, uniq, action) { if (this._isAppAvailable(app)) { if (this._getAppObject(app, uniq)) { action(); } } else { if ( ! this._appObjectActions[app]) { this._appObjectActions[app] = []; } this._appObjectActions[app].push( { 'uniq' : uniq, 'action' : action } ); } } this.tryRatingsAppObjectAction = function(uniq, action) { this._tryAppObjectAction('ratings', uniq, action); } this.tryCommentsAppObjectAction = function(uniq, action) { this._tryAppObjectAction('comments', uniq, action); } } /* Singleton-like handler */ JSKitGlobal.getInstance = function() { if (!window.JSKitGlobalInstance) { JSKitGlobalInstance = new JSKitGlobal(); } return JSKitGlobalInstance; } /* JSKitGlobal object */ $JSKitGlobal = JSKitGlobal.getInstance(); JSKitLib.getRef = function(self) { var wl = window.location; return wl.protocol + "//" + self.config.domain + wl.pathname; } JSKitLib.readConfig = function(wtype, target, cf) { cf = cf || {}; var gtags = JSKitLib.parseConfigTags(document, wtype, 'span'); var ltags = JSKitLib.parseConfigTags(target, '', 'span'); var gc = window.JSKitConfig || {}; for(var i = 3; i < arguments.length; i++) { var arg = arguments[i]; if(typeof(arg) == 'string') arg = [arg]; var name = arg[0]; var value = cf[name] || target.getAttribute(name) || ltags[name] || gc[wtype + '-' + name] || gtags[name]; var wl = window.location; switch (name) { case 'path': value = JSKitLib._normPath(target, value); break; case 'permalink': value = value || wl.href.replace(wl.hash,''); if (!value.match(/^https?:\/\//)) value = "http://" + wl.host + value.replace(/^([^\/]+)/, "/$1"); break; case 'title': value = value || document.title; break; case 'domain': value = value || wl.host; break; } if(arg.length > 1) { if(typeof(arg[1]) == 'number') { if(value) { var n = parseInt(value); if(isNaN(n) || n < 0) { if(value == "no") value = 0; else value = arg[1]; } else value = n; } else value = arg[1]; } else if(typeof(arg[1]) == 'object') { for(var j=arg[1].length; j; j--) if(arg[1][j-1] == value) break; if(!j) value = arg[1][j]; } else { if(!value) value = arg[1]; } } cf[name] = value; } return cf; } JSKitLib.parseConfigTags = function(target, wtype, tag) { var cache = document._widgets_config; if (wtype && cache && cache[wtype]) return cache[wtype]; var regp = wtype ? wtype+'?-' : ''; var nodes = target.getElementsByTagName(tag); var config = {}; for (var i = 0; i < nodes.length; i++) { var reg = RegExp("^js-kit-config-"+regp+"(.*)$"); var m = reg.exec(nodes[i].className); if (m && m.length) { config[m[1].toLowerCase()] = nodes[i].innerHTML; nodes[i].style.display = 'none'; } } if (wtype) { document._widgets_config = document._widgets_config || {}; document._widgets_config[wtype] = config; } return config; } JSKitLib._normPath = function(target, path) { var wl = window.location; var uniq = String(target.getAttribute("uniq") || target.getAttribute("unique") || ''); /* trim uniq */ var uniq = uniq.replace(/^\s\s*/, ''), ws = /\s/, i = uniq.length; while (ws.test(uniq.charAt(--i))); uniq = uniq.slice(0, i + 1); /* end of trim */ var plus = true; if (uniq) { plus = uniq.match(/^\+\/*(.*)/); if (plus) path = plus[1]; else path = uniq; } if(path) { path = String(path); var ar = path.match(/^https?:\/\/[^\/]+(.*)/); if(ar) path = ar[1]; else path = path.replace(/^([^\/]+)/, (plus ? wl.pathname : "") + "/$1"); path = path.replace(/^\/+/, "/"); } else { path=wl.pathname; } return path; } JSKitLib.initWidgets = function(widget_type, request, constructor) { var sendRequest = function(domain, multiParams, target) { if (!multiParams.length) return; var wl = window.location; request = request || {"extra_params": {}}; var req = { uri: request.base_uri, ref: wl.protocol + "//" + domain + wl.pathname, epb: window.JSKitEPB ? JSKitEPB.getAsHash() : {}, request: request.extra_params, variableRequest: multiParams, transport: 'GET', target: target, trailer: request.trailer }; new JSRVC(req); } var els = document.body.getElementsByTagName("div"); if(!els || !els.length) return; var multiI = {}; var multiQ = {}; var obj; var reg = new RegExp('js-kit-' + widget_type + '?'); for (var i = 0; i < els.length; i++) { var m = reg.exec(els[i].className); if (!m || !m.length || els[i].jsk$initialized) continue; obj = constructor(els[i]); els[i].jsk$initialized = true; if (obj.config.disabled && obj.config.disabled != "no") continue; var d = obj.config.domain; if (!multiQ[d]) { multiQ[d] = []; multiI[d] = 0; } multiQ[d].push(obj.singleRequestParams); multiI[d]++; } JSKitLib.fmap(multiQ, function(v, k){ if (v) sendRequest(k, v, obj.target); }); } if(!window.JSKW$Events){ var JSKW$Events = new JSEC(); } ///////////////////////////////////// // JS Event Class ///////////////////////////////////// function JSEC() { this.contextHandles = []; } JSEC.prototype.registerEventCallback = function (contextHandle, eventHandle, eventName) { if(!contextHandle) { contextHandle = new JSECC(eventHandle, eventName); this.contextHandles.push(contextHandle); contextHandle.cHdlId = this.contextHandles.length - 1; } else { contextHandle.registerEventCallback(eventHandle, eventName); } return contextHandle; } JSEC.prototype.deRegisterEventCallback = function (contextHandle, eventHandle, eventName) { contextHandle.deRegisterEventCallback(eventHandle, eventName); } JSEC.prototype.syncBroadcast = function (eventName) { var args = arguments; JSKitLib.fmap(this.contextHandles, function(c){ if(c) c.broadCast.apply(c, args); }); } JSEC.prototype.asyncBroadcast = function (eventName) { var self = this; var args = arguments; setTimeout(function(){ self.syncBroadcast.apply(self, args); }, 0); } JSEC.prototype.invalidateContext = function (contextHandle) { if(contextHandle) { contextHandle.invalidateContext(); delete this.contextHandles[contextHandle.cHdlId]; } } ///////////////////////////////////// // JS Event Context Class ///////////////////////////////////// function JSECC(eventHandle, eventName) { this.registeredCallbacks = []; if(eventName || eventHandle) this.registerEventCallback(eventHandle, eventName); } JSECC.prototype.registerEventCallback = function (eventHandle, eventName) { var ev = eventName || ''; if(!this.registeredCallbacks[ev]) this.registeredCallbacks[ev] = []; this.registeredCallbacks[ev].push(eventHandle); } JSECC.prototype.deRegisterEventCallback = function (eventHandle, eventName) { var ev = eventName || ''; var self = this; if(!eventHandle) { delete this.registeredCallbacks[ev]; return; } var k=0; while(k<this.registeredCallbacks[ev].length) { if(this.registeredCallbacks[ev][k] == eventHandle) { self.registeredCallbacks[ev].splice(k, 1); } else k++; } if(!this.registeredCallbacks[ev].length) delete this.registeredCallbacks[ev]; } JSECC.prototype.invalidateContext = function () { this.registeredCallbacks = []; try { if(this.jsk$invalidate) this.jsk$invalidate(); } catch(e) { ; }; } JSECC.prototype.broadCast = function (eventName) { var self = this; var ar = ['']; var args = arguments; if(eventName!='') ar.push(eventName); JSKitLib.fmap(ar, function(ev){ if(self.registeredCallbacks[ev]) JSKitLib.fmap(self.registeredCallbacks[ev], function(evHdl){ evHdl.apply(self, args); }); }); } //////////////////// JSRVC // requestObj // request: {uri: someuri, param1: val1, param2: val2, ...} // [transport: ("GET" | "POST")] // [target: some_DOM_element] // [variableRequest: [{param1_1: val1_1, param1_2: val1_2, ...}, // {param2_1: val2_1, param2_2: val2_2,...}, ...]] // [form: some_form] // [onreturn: some_callback] // [randevu : (true | false)] // [requestId: some request identity] // [trailer: specifies the name of parameter which should terminate // each sub-request of multi-request] function JSRVC(requestObj) { var s = this; s.requestId = requestObj.requestId || s.generateRequestId(); s.requestsInProgress = 0; s.requestsQueue = []; s.trailer = requestObj.trailer; s.processRequest(requestObj); } JSRVC.prototype.generateRequestId = function() { return ((new Date()).valueOf() + Math.random()).toString(); } JSRVC.prototype.processRequest = function(requestObj) { var s = this; s.error = undefined; if(s.requestsInProgress) { s.requestsQueue.push(requestObj); return; } s.requestObj = requestObj; if(s.requestObj.pickup && !s.eventCtx) s.eventCtx = JSKW$Events.registerEventCallback(s.eventCtx, function() {s.eventCallback.apply(s, arguments);}, "randevu_answer"); var req = s.requestObj; s.preProcessRequest(); if(!req.transport) req.transport = req.form ? "POST" : s.getRequestTransport(); req.target = req.target || document.body; var onCompleteCB = req.timeout ? function() { s.startTimeoutTimer.call(s); } : undefined; var handlers = {'onload': s.onLoadRequest, 'onreadystatechange': s.onLoadRequest}; switch(req.transport) { case "GET": s.processGETRequest(onCompleteCB, handlers); break; case "POST": s.processPOSTRequest(onCompleteCB, handlers); break; } } JSRVC.prototype.preProcessRequest = function() { var req = this.requestObj; if(!req.request) req.request = {}; JSKitLib.fmap(req.epb || {}, function(v, k) { req.request[k] = v; }); if (req.ref) req.request.ref = req.ref; req.request.randevuId = this.requestId; if(!req.variableRequest) req.variableRequest = []; if(req.pickup) req.request.randevuRnd = Math.random(); } JSRVC.prototype.calcGetRequest = function() { var s = this; var req = s.requestObj; var reqvar = req.variableRequest; var permGETReq = s.serializeRequest(req.request); var varGETReq = JSKitLib.fmap(reqvar, function(el, idx){ return s.serializeRequest(el, '[' + idx + ']'); }); return [permGETReq, varGETReq]; } JSRVC.prototype.getRequestTransport = function() { var ser = this.calcGetRequest(); var permReq = ser[0]; var varReq = ser[1]; var firstReqLen = permReq.length + (varReq.length>0 ? varReq[0].length : 0); var totalReqLen = 0; for(var i=0; i<varReq.length; i++) totalReqLen += varReq[i].length; return ((firstReqLen > 1700) || (totalReqLen > 3400) ? "POST" : "GET"); } JSRVC.prototype.startTimeoutTimer = function() { var s = this; if(s.timeoutTimer) clearTimeout(s.timeoutTimer); s.timeoutTimer = setTimeout(function() { s.timeoutExpired(); }, s.requestObj.timeout); } JSRVC.prototype.timeoutExpired = function() { this.timeoutTimer = undefined; this.error = "timeout"; this.returnAnswer(); } JSRVC.prototype.returnAnswer = function(answerData) { var s = this; answerData = answerData || {}; if(answerData.script) { var script = document.createElement('script'); script.text = answerData.script; this.requestObj.target.appendChild(script); } if(s.requestObj.onreturn) { s.requestObj.onreturn.call(s, s.error || "data", answerData.data); } } JSRVC.prototype.serializeRequest = function(obj, prefix) { var s = this; var toString = function(k, v) { return encodeURIComponent(k) + (prefix || '') + "=" + encodeURIComponent(v); }; var request = JSKitLib.fmap(obj, function(v, k) { if (s.trailer != k) return toString(k, v); }); if (s.trailer && typeof(obj[s.trailer]) != "undefined") { request.push(toString(s.trailer, obj[s.trailer])); } return request.join("&"); } JSRVC.prototype.setElementAttributes = function(obj, attrs) { var s = this; if (!obj) return; JSKitLib.fmap(attrs, function(v, k) { obj[k] = function() { v.call(s, obj) }; }); } JSRVC.prototype.runScript = function(src, data, handlers) { var script = document.createElement('script'); this.setElementAttributes(script, handlers); script.setAttribute("charset", "utf-8"); script.setAttribute("src", src + (data ? '?' + data : '')); this.requestsInProgress++; this.requestObj.target.appendChild(script); this.script = script; } JSRVC.prototype.processGETRequest = function(onCompleteCB, handlers) { var s = this; var ser = s.calcGetRequest(); var reqperm = ser[0]; var reqpermlen = reqperm.length; var reqvar = ser[1]; var reqvarlen = reqvar.length; var currequest = ''; for(var i=0; i<reqvarlen; i++) { currequest += '&' + reqvar[i]; if(currequest.length + reqpermlen + (i+1<reqvarlen ? reqvar[i+1].length : 0) > 2000) { s.runScript(s.requestObj.uri, reqperm + currequest, handlers); currequest = ''; } } if((currequest) || (!reqvarlen)) s.runScript(s.requestObj.uri, reqperm + '&' + currequest, handlers); if(onCompleteCB) onCompleteCB(); } JSRVC.prototype.processPOSTRequest = function(onCompleteCB, handlers) { var s = this; var req = s.requestObj.request; var reqvar = s.requestObj.variableRequest; var reqvarlen = s.requestObj.variableRequest.length; var createForm = function() { var iframe = 'js-ifrm-' + Math.random(); var ifr = JSKitLib.createHiddenIframe(iframe, s.requestObj.target); var doc = ifr.contentDocument ? ifr.contentDocument : ifr.document; var f = doc.createElement('FORM'); f.doc = doc; if(JSKitLib.isIE()) doc.charset = "utf-8"; f.target = iframe; JSKitLib.timedRetry({ timeout: 100, maxRetries: 50, onSuccess: function() { doc.body.appendChild(f); }, pred: function() { return !!doc.body; } }); return f; }; var getForm = function() { return (s.requestObj.form && !reqvarlen) ? s.requestObj.form : createForm(); } var fillForm = function(form, obj) { form.method = 'POST'; form.enctype = "application/x-www-form-urlencoded"; form.acceptCharset = 'UTF-8'; form.action = s.requestObj.uri; JSKitLib.fmap(obj, function(v, k) { var frmel = (form.doc || document).createElement('INPUT'); frmel.type = "hidden"; frmel.name = k; frmel.value = v; form.appendChild(frmel); }); } var postRequest = function(pobj, vobj) { var form = getForm(); fillForm(form, pobj); if(vobj) fillForm(form, vobj); if (form.target) s.setElementAttributes(document.getElementById(form.target), handlers); JSKitLib.fmap(handlers, function(v, k) { form[k] = v; }); s.requestsInProgress++; JSKitLib.timedRetry({ timeout: 100, maxRetries: 50, onSuccess: function() { form.submit(); }, pred: function() { return (form.parentNode && form.parentNode.nodeType!=11); } }); } JSKitLib.fmap(reqvar, function(v) { postRequest(req, v); }); if(!reqvarlen) postRequest(req); if(onCompleteCB) onCompleteCB(); } JSRVC.prototype.onLoadRequest = function(el) { var s = this; if(el.readyState && el.readyState != 'loaded' && el.readyState != 'complete') return; el.onreadystatechange = el.onload = null; if(!s.requestObj.pickup) { s.requestObj.checked = true; s.requestsInProgress--; } s.postProcessRequest(); } JSRVC.prototype.postProcessRequest = function(source, data) { var s = this; if(s.requestObj.pickup && source!="pickup") return; if(s.requestObj.randevu && !s.error && s.requestObj.transport == "POST") { s.processRequest({ 'uri': '//js-kit.com/api/server-answer.js', 'ref': s.requestObj.ref, 'epb': s.requestObj.epb, 'pickup': true, 'onreturn': s.requestObj.onreturn, 'target': s.requestObj.target}); return; } s.returnAnswer(data); if(!s.requestsInProgress) { if(s.timeoutTimer) { clearTimeout(s.timeoutTimer); s.timeoutTimer = undefined; } if(s.requestsQueue.length && !s.error) s.processRequest(s.requestsQueue.pop()); } } JSRVC.prototype.eventCallback = function(eventName, randevuId, status, data) { if(this.requestId != randevuId) return; this.requestsInProgress--; if(this.script && this.script.parentNode) { this.script.parentNode.removeChild(this.script); this.script = undefined; } switch(status) { case "ready": if(this.eventCtx) { JSKW$Events.invalidateContext(this.eventCtx); this.eventCtx = undefined; } this.postProcessRequest("pickup", data); break; case "timeout": if(this.error) { this.returnAnswer(data); } else { this.processRequest(this.requestObj); } break; case "exceeded": this.error = "attempts_number_exceeded"; this.returnAnswer(); break; } } JSRVC.prototype.cancelRequest = function() { this.error = 'canceled'; } if(!window.JSKitEPB){ var JSKitEPB = new JSKitEPBLib(); } function JSKitEPBLib() { this.JSK$EPB = window.JSK$EPB ? window.JSK$EPB : {}; } JSKitEPBLib.prototype.isExists = function() { return (this.JSK$EPB.mac && this.JSK$EPB.profile) ? 1: 0; } JSKitEPBLib.prototype.getValue = function(ValueName) { return !this.isExists() || this.JSK$EPB.profile[ValueName] == undefined ? undefined : this.JSK$EPB.profile[ValueName]; } JSKitEPBLib.prototype.getElement = function(Pref,El,ArrKey) { var rslt = []; if(typeof(El) == 'object') { if(El instanceof Array) { if(ArrKey) { var len = El.length; for(var i=0; i<len; i++) rslt = rslt.concat(this.getElement(Pref,El[i],ArrKey)); } } else { for(var i in El) rslt = rslt.concat(this.getElement(Pref,El[i],i)); } } else { if(ArrKey) { rslt.push({'Name': Pref+ArrKey, 'Value': El}); } } return rslt; } JSKitEPBLib.prototype.getAsObj = function() { var rslt = []; var pref = "epb-"; var epb = this.JSK$EPB; if(!epb.profile || !epb.mac) return rslt; rslt.push({'Name': pref+"mac",'Value': epb.mac}); return rslt.concat(this.getElement(pref,epb.profile)); } JSKitEPBLib.prototype.getURIEncodedSerialize = function() { var ser = this.getAsObj(); var ar = []; for(var i=0; i<ser.length; i++) { ar.push(ser[i].Name + "=" + encodeURIComponent(ser[i].Value)); } return ar.join("&"); } JSKitEPBLib.prototype.getAsHash = function(obj) { var ser = this.getAsObj(); obj = obj || {}; JSKitLib.fmap(ser, function(v) { obj[v.Name] = v.Value; }); return obj; } /* Class Functions */ // Initialize instances of JSRC objects JSRC.init = function() { JSKitLib.initWidgets('ratings', {base_uri: JSRC.URI + '-data.js'}, function(div) { var obj = new JSRC(div); var params = {'jx': obj.jraIndex, 'p': obj.config.path}; if (obj.config.property) params.pr = obj.config.property; if (obj.config.category) params.cg = obj.config.category; obj.singleRequestParams = params; return obj; }); } // External API JSRC.reinit = function() { $JRA = []; JSRC.init(); } JSRC.prototype.addClassStyle = function(element, className) { JSKitLib.addClass(element, className); } JSRC.prototype.setPath = function(path) { this.path = path; this.pathOverride = path; } JSRC.prototype.getRatingDataFromServer = function() { var mr = this.path; this.server('-data.js', 'p[0]=' + encodeURIComponent(mr) + (this.config.property ? '&pr[0]=' + encodeURIComponent(this.config.property) : '') + (this.config.category ? '&cg[0]=' + encodeURIComponent(this.config.category) : '') + '&jx[0]=' + this.jraIndex); } /* CSS Stylings */ JSRC.writeCSS = function() { var css = ''; for (prop in JSRC.CSS) { css += prop + ' {' + JSRC.CSS[prop] + '}'; } JSKitLib.addCss(css, "js-RatingsCssText"); } /* JS Rating Class */ function JSRC(target) { this.jraIndex = $JRA.length; $JRA.push(this); var self = this; var options = arguments[1] || {}; this.cr = function(tag) { return document.createElement(tag) }; this.pathOverride = ''; this.raterInc = 2; // Increment ratio of rateable v. displayable this.scale = 10; // Points on rating scale this.onRate = []; // Callbacks for post rating processing this.isStandalone = function() { return (this.config.standalone == 'yes') ? true : false; } this.starWidth = 16; this.starHeight = 15; this.miniStarWidth = 9; this.miniStarHeight = 9; this.totalWidth; //The total width of the visible widget var wl = window.location; this.target = target; /* Configuration */ this.config = JSKitLib.readConfig("ratings", target, {}, 'path', ['standalone', 'no'], ['view', 'combo'], ['commentprompt', true], 'imageurl', 'imagesize', 'title', 'notop', 'permalink', 'domain', ['freeze', 'no'], ['menu', 'yes'], ['subtext', 'yes'], 'property', 'category', 'starcolor', 'usercolor', 'thumbnail', ['thumbsize', 'normal'], 'showinfoonrate', 'partnerID' ); for (var i in options) this.config[i] = options[i]; target.innerHTML = ""; JSKitLib.show(target); if (this.config.starcolor) this.config.starcolor = this.config.starcolor.toLowerCase(); if (this.config.usercolor) this.config.usercolor = this.config.usercolor.toLowerCase(); this.config.isExtend = (this.config.partnerID == 'Userplane'); if(this.config.view.match(/score/)){ if(this.config.thumbsize.match(/small/)){ this.starWidth = 10; this.starHeight = 12; } else if(this.config.thumbsize.match(/large/)){ this.starWidth = 15; this.starHeight = 18; } else { this.config.thumbsize = 'normal'; this.starWidth = 12; this.starHeight = 15; } } // Handle defaults for showinfoonrate attribute if ( ! this.config.showinfoonrate) { if (this.config.view.match(/score/)) { this.config.showinfoonrate = "yes"; } } // Special menu handling for particular sites if (wl.host.match(/icanhascheezburger.com/)) { this.config.menu = 'no'; } if(this.config.imageurl && this.config.imagesize) { var dim = this.config.imagesize.match(/(\d+)([^\d]+(\d+))?/); if(dim) { this.starWidth = dim[1]; this.starHeight = dim[3] || this.starWidth; } } if(this.config.view.match(/score/)){ this.ratingBarWidth = 2 * this.starWidth; this.ratingBarHeight = this.starHeight; } else { this.ratingBarWidth = this.scale / this.raterInc * this.starWidth; this.ratingBarHeight = this.starHeight; } this.uniq = this.path = this.pathOverride = this.config.path; if ( ! $JRH[this.uniq]) { $JRH[this.uniq] = []; } $JRH[this.uniq].push(this); this.defineIcons(); JSKitLib.preloadImg(JSRC.INFO_IMG); if (options.newRating) { //TODO this.newRating({ Sum: options.newRating.objSum, Num: options.newRating.objNum, Votes: options.newRating.objVotes }, { Sum: options.newRating.userRating}); } this.server = function(ext, data) { var sc = self.cr("script"); sc.setAttribute("charset", "utf-8"); sc.src = JSRC.URI + ext + "?ref=" + encodeURIComponent(JSKitLib.getRef(self)) + "&" + JSKitEPB.getURIEncodedSerialize() + "&p=" + encodeURIComponent(self.pathOverride) + '&' + data + self.appendExternalParams(ext); self.target.appendChild(sc); return false; } if(options.autorequest) { this.getRatingDataFromServer(); } } /* Constants */ JSRC.DOMAIN = (window.location.protocol.substr(0, 4) != 'http' ? 'http:' : '') + '//js-kit.com'; JSRC.URI = JSRC.DOMAIN + '/rating'; JSRC.BASE_STAR_URI = JSRC.DOMAIN + '/images/stars/'; JSRC.INFO_IMG = JSRC.DOMAIN + '/images/i-wg.png'; JSRC.INFO_IMG_ALERT = JSRC.DOMAIN + '/images/i-wg-green.png'; JSRC.INFO_IMG_WIDTH = 15; JSRC.INFO_IMG_OFFSET = 7; JSRC.INFOBOX_WINDOW_WIDTH = 200; JSRC.CSS = { '.js-rating-labelText': 'padding-top: 2px; font-size: 11px; text-align: center; cursor: default; -moz-user-select: none;', '.js-ratingsExtend .js-rating-labelText': 'padding-top: '+(JSKitLib.isIE()?2:4)+'px; font-size: 11px; text-align: left; cursor: default; -moz-user-select: none;', '.js-rating-labelTextUp': 'padding-top: 2px; font-size: 11px; text-align: center; cursor: default; -moz-user-select: none;', '.js-rating-labelTextDown': 'padding-top: 2px; font-size: 11px; text-align: center; cursor: default; -moz-user-select: none;', '.js-rating-afterRating': 'width: 100px; font-size: 12px; text-align: center; padding: .3em;', '.js-rating-infoBox': 'color: black; text-align:left; -moz-user-select: none;', '.js-rating-infoBoxStats': 'line-height: 12pt; padding: 0.5em 0.8em 0.2em 0.8em; font-family: Arial, Helvetica, sans-serif; font-size: 10pt;', '.js-rating-infoBoxPoweredBy': 'font-size: 9pt;', '.js-ratings-tableWrapper' : 'background: transparent;', '.js-rating-infoBoxRatingsDisabled': 'font-size: 9pt; color: #a00;', '.js-ratingInfoBoxTotalVotes' : 'margin-right: 3px;', //new Extend skin '.js-ratingsExtend .js-rating-infoBoxStats': 'line-height: 12pt; padding: 0; font-size: 10pt; color: #c2c2c2;' } JSRC.prototype.appendExternalParams = function(ext) { var params = JSKitLib.fmap( JSKitLib.appendExternalParams("ratings", ext, {}), function(value, key) { return key + "=" + value; } ).join("&"); return params.length ? "&" + params : ""; } JSRC.prototype.defineIcons = function() { var self = this; this.fullStar = []; this.halfStar = []; this.emptyStar = []; this.miniFullStar = []; this.miniEmptyStar = []; this.Thumb = []; var genstar = function(confColor, defColor, type) { var acceptedColors = { blue:1, yellow:1, gold:1, golden:1, green:1, violet:1, emerald:1, indigo:1, red:1, ruby:1 }; var color = (confColor && acceptedColors[confColor]) ? confColor : defColor; var starURI = JSRC.BASE_STAR_URI; if(self.config.imageurl) { starURI = self.config.imageurl + '/'; color = type; } var size = ''; self.fullStar[type] = starURI + color + size + '.png'; self.halfStar[type] = starURI + color + size + '-half.png'; self.emptyStar[type] = starURI + size + 'gray.png'; if ( ! self.config.imageurl) { self.miniFullStar[type] = starURI + color + '-tiny.png'; self.miniEmptyStar[type] = starURI + 'gray-tiny.png'; self.miniStarWidth = 9; self.miniStarHeight = 9; } else { self.miniFullStar[type] = self.fullStar[type]; self.miniEmptyStar[type] = self.emptyStar[type]; self.miniStarWidth = self.starWidth; self.miniStarHeight = self.starHeight; } JSKitLib.preloadImg(self.fullStar[type]); JSKitLib.preloadImg(self.halfStar[type]); JSKitLib.preloadImg(self.emptyStar[type]); JSKitLib.preloadImg(self.miniFullStar[type]); JSKitLib.preloadImg(self.miniEmptyStar[type]); } var genthumb = function(type) { var thumbURI = JSRC.BASE_STAR_URI; if(self.config.imageurl) { thumbURI = self.config.imageurl; self.Thumb[type] = thumbURI; } else { self.Thumb[type] = thumbURI + type + '-thumb.png'; } JSKitLib.preloadImg(self.Thumb[type]); } if(this.config.view.match(/score/)){ genthumb(this.config.thumbsize); } else { genstar(this.config.starcolor, 'ruby', 'star'); genstar(this.config.usercolor, 'gold', 'user'); } } JSRC.writeCSS(); /* Init a single call to init */ if ( ! $JRA.length) { JSRC.init(); $JSKitGlobal.setRatingsAppAvailable(); } else { JSRC.init(); } JSRC.prototype.dtInfoBox = '<div class="js-rating-infoBox" onselectstart="return false">' + '<div class="js-rTopDetailFont" style="color: black; background-color:#ffa; margin: .5em .8em 0 .8em; padding: 2px 5px; text-align:center;">About this rated object</div>' + '<div class="js-rating-infoBoxStats">' + '<div class="js-rating-infoBoxRatingsDisabled" style="display:none;">{Label:ratingsDisabled}<br></div>' + '<span class="js-ratingInfoBoxTotalVotes">{totalVotes}</span>' + '<span class="js-ratingInfoBoxAvgRating" style="white-space: nowrap">{avgStarRating}</span>' + '<br>' + '<span class="js-ratingInfoBoxUserRatingMsg">{userRatingMsg}</span>' + '</div>' + '</div>'; JSRC.prototype.dtInfoBoxExtended = '<div class="js-rating-infoBox" onselectstart="return false">' + '<div class="js-rating-infoBoxStats">' + '<div class="js-rating-infoBoxRatingsDisabled" style="display:none;">{Label:ratingsDisabled}<br></div>' + '<span class="js-ratingInfoBoxTotalVotes">{avgStarRating}</span>' + '<span class="js-ratingInfoBoxAvgRating" style="white-space: nowrap">{totalVotes}</span>' + '<br>' + '<span class="js-ratingInfoBoxUserRatingMsg">{userRatingMsg}</span>' + '</div>' + '</div>'; JSRC.prototype.contentBoxUp = '<div style="padding-right: 7px; padding-left: 3px;"><span class="js-rating-labelTextUp"><nobr>{votedUp}</nobr></span></div>'; JSRC.prototype.contentBoxDown = '<div style="padding-left: 3px;"><span class="js-rating-labelTextDown"><nobr>{votedDown}</nobr></span></div>'; JSRC.prototype.gtmpl = function(t) { var lowercase = function(a, m) { return String(m).toLowerCase(); } t = t.replace(/^[^<]*(<.*>)[^>]*$/m, "$1"); t = t.replace(/(<[\/]?[A-Z]+)/g, lowercase); t = t.replace(/{Label:([^}]*)}/g,function(a,m){return $JRL(m);}); return t; } JSRC.prototype.tmpl = function(t, obj) { var self = this; t = self.gtmpl(t); t = t.replace(/{([A-Za-z0-9]+)}/g,function(a,m){return obj.hasOwnProperty(m)?obj[m]:'{'+m+'}';}); return t; } /* Will add a callback for post rating processing */ JSRC.prototype.addOnRate = function(action) { this.onRate.push(action); } JSRC.prototype.processOnRate = function() { for (var i=0; i < this.onRate.length; i++) { this.onRate[i](); } } JSRC.prototype.table = function(content) { var self = this; var a = function(n, w) {var o=self.cr(n);o.appendChild(w);return o;} var t = a('table', a('tbody', a('tr', a('td', content)))); var z = function(a) {t.setAttribute(a, '0')} z('cellSpacing'); z('cellPadding'); z('border'); return t; } JSRC.prototype.display = function() { var self = this; var target = this.target; // wrapper for our floated elements var wrapper = this.cr('div'); wrapper.className = "js-ratingWrapper"; wrapper.onselectstart = function() { return false; } var actionable = (this.config.freeze == "yes") ? false : true; if (this.config.view.match(/(combo|user)/) && this.config.freeze == "yes") { this.userRatingBar = this.initRating(this.objEffRating, 'star', false); } else { this.userRatingBar = this.initRating(this.userRating, 'user', actionable); } this.userRatingDiv = this.cr('div'); this.userRatingDiv.appendChild(this.userRatingBar); if (this.config.subtext != 'no') { this.textTotal = this.cr('div'); this.addClassStyle(this.textTotal, 'js-rating-labelText'); this.refreshTextTotal(); } var rating; var text; if(this.config.isExtend){ var tmpl = JSKitLib.html(this.tmpl(this.dtExtend, [])); var ctls = JSKitLib.mapClass2Object({}, tmpl); target = ctls["js-RatingStars"]; this.extendTarget = target; if(this.target.getAttribute('title')) { this.target.setAttribute('title', ''); var table = ctls["js-RatingStarsView"]; if(table) table.setAttribute('title', this.config.title); } var nav = ctls["js-RatingNavView"]; this.infoBox = new JSRTC(nav, { 'count': 3 }, this, {'skin': 'Extend'}); text = ctls["js-RatingText"]; rating = ctls["js-Rating"]; var ads = ctls["js-RatingNavAd"]; var div = document.createElement('div'); var adId = Math.floor(Math.random()*99999999999); var ifrId = 'userplane-ad' + adId; div.innerHTML = '<iframe id="' + ifrId + '" name="' + ifrId + '" frameborder="0" marginwidth="0" marginheight="0" width="100%" height="0" src="about:blank"></iframe>'; ads.appendChild(div); var iframe = div.firstChild; iframe.onreadystatechange = function() { if (iframe.readyState && iframe.readyState != 'loaded' && iframe.readyState != 'complete') { return; } iframe.contentWindow.location.href = JSRC.DOMAIN + '/userplane_ad/' + adId; iframe.onreadystatechange = function() { if (iframe.readyState && iframe.readyState != 'loaded' && iframe.readyState != 'complete') { return; } iframe.onload = iframe.onreadystatechange = null; var onUserplaneAd = function(error, data) { if (error != "data") return; iframe.height = data.height; } new JSRVC({uri: JSRC.DOMAIN + '/api/server-answer.js', 'target': target, 'onreturn': onUserplaneAd, 'pickup': true, 'requestId': 'userplanead' + adId}); }; iframe.onload = iframe.onreadystatechange; } iframe.onload = iframe.onreadystatechange; } if (this.config.view.match(/split/)) { // split view : community and user ratings this.defaultView = 'user'; var starRatingBar = this.initRating(this.objEffRating, 'star', false); var starRatingDiv = this.cr('div'); starRatingDiv.className = 'js-starRatingDiv'; starRatingDiv.style.width = this.ratingBarWidth + 'px'; starRatingDiv.appendChild(starRatingBar); if(this.config.isExtend) text.appendChild(this.textTotal) else starRatingDiv.appendChild(this.textTotal); wrapper.appendChild(starRatingDiv); JSKitLib.addStyle(this.userRatingDiv, 'float:left; width:' + this.ratingBarWidth + 'px'); if (this.config.subtext != 'no') { this.textRating = this.cr('div'); this.addClassStyle(this.textRating, 'js-rating-labelText'); this.refreshTextRating(); if(this.config.isExtend) { text.appendChild(this.textRating) this.textRating.style.marginTop = '7px'; } else this.userRatingDiv.appendChild(this.textRating); this.activeText = this.textRating; } if(this.config.isExtend) this.totalWidth = this.ratingBarWidth; else this.totalWidth = 2 * this.ratingBarWidth + 10; wrapper.appendChild(this.userRatingDiv); } else if (this.config.view.match(/user/)) { // single star set, only shows current user's rating this.defaultView = 'user'; this.userRatingDiv.style.cssFloat = 'left'; this.userRatingDiv.style.styleFloat = 'left'; if (this.config.subtext != 'no' && !this.config.isExtend) { this.textRating = this.cr('div'); this.addClassStyle(this.textRating, 'js-rating-labelText'); this.refreshTextRating(); if(this.config.isExtend) text.appendChild(this.textRating) this.userRatingDiv.appendChild(this.textRating); this.activeText = this.textRating; } this.totalWidth = this.ratingBarWidth; wrapper.appendChild(this.userRatingDiv); } else { // single star set, defaults to community rating this.defaultView = 'star'; if (this.config.subtext != 'no') { if(!this.config.view.match(/score/)) { if(this.config.isExtend) text.appendChild(this.textTotal) else this.userRatingDiv.appendChild(this.textTotal); } else { this.userRatingBar.style.top = this.starHeight + 'px'; this.textTotal.style.height = this.starHeight + 'px'; if (this.config.isExtend) { this.userRatingDiv.style.height = this.starHeight + 'px'; text.appendChild(this.textTotal); } else { this.userRatingDiv.style.height = 2 * this.starHeight + 'px'; this.userRatingDiv.insertBefore(this.textTotal, this.userRatingDiv.firstChild); } } this.activeText = this.textTotal; } this.totalWidth = this.ratingBarWidth; wrapper.appendChild(this.userRatingDiv); } // Set our total width if(!this.config.view.match(/score/)) wrapper.style.width = this.totalWidth + 'px'; /* Rating Menu */ if (this.config.menu != 'no' && this.config.freeze != 'yes' && !this.config.isExtend) { if(!this.config.view.match(/score/)) wrapper.style.width = (this.totalWidth + 10 + JSRC.INFO_IMG_WIDTH) + 'px'; var menuArrow = this.createMenuArrow(); this.prepMenu(); // 'i' and infobox if((this.config.view.match(/score/)) && (this.config.subtext != 'no')) menuArrow.style.marginTop = (2*this.starHeight-16)+'px'; var self = this; this.addOnRate(function() { if (self.config.showinfoonrate == 'yes' || self.infoBox) self.showInfoBox(); }); wrapper.appendChild(menuArrow); } // Set the target width if(!this.config.view.match(/score/)){ var targetMinWidth = parseInt(wrapper.style.width) + 6; // 3px margin var targetWidth = target.style.width || targetMinWidth; if (parseInt(targetWidth) <= targetMinWidth) target.style.width = targetMinWidth + 'px'; } if(!this.isStandalone() && this.config.commentprompt != 'no') { var addCommentPrompt = function() { var afterRatingA = document.createElement('a'); afterRatingA.appendChild(document.createTextNode($JRL('addACommentToYourRating'))); afterRatingA.onclick = function() { self.getCommentsAppObject().ShowCommentDialog(null); return false; }; afterRatingA.href = 'javascript:void(0);'; var afterRatingDiv = document.createElement('div'); afterRatingDiv.appendChild(afterRatingA); self.addClassStyle(afterRatingDiv, 'js-rating-afterRating'); var afterRating = self.createWindow(afterRatingDiv); afterRating.style.position ='absolute'; afterRating.style.left = (self.totalWidth + 5) + 'px'; afterRating.style.top = '-4px'; afterRating.style.zIndex = '110'; // above menuArrow JSKitLib.hide(afterRating); self.addOnRate(function() { JSKitLib.show(afterRating); setTimeout(function() { JSKitLib.hide(afterRating); }, 5000); }); wrapper.appendChild(afterRating); } $JSKitGlobal.tryCommentsAppObjectAction(this.uniq, addCommentPrompt); } var tableWrapper = this.table(wrapper); tableWrapper.className = "js-ratings-tableWrapper"; JSKitLib.addChild(target, tableWrapper); // stars if(rating) JSKitLib.addChild(this.target, rating); if(this.config.view.match(/score/)){ this.totalWidth=6+2*this.starWidth+this.contentBoxElUp.offsetWidth+this.contentBoxElDown.offsetWidth; var targetMinWidth; if(this.config.isExtend) targetMinWidth = this.totalWidth; else if (this.config.menu != 'no' && this.config.freeze != 'yes') targetMinWidth = this.totalWidth + 6 + 10 + JSRC.INFO_IMG_WIDTH; else targetMinWidth = this.totalWidth + 6; var targetWidth = target.style.width || targetMinWidth; if (parseInt(targetWidth) <= targetMinWidth) target.style.width = targetMinWidth + 'px'; wrapper.style.width = targetMinWidth + 'px'; this.userRatingDiv.style.width = (this.totalWidth) + 'px'; if(this.textTotal) this.textTotal.style.width = (this.totalWidth) + 'px'; this.userRatingBar.style.width = (this.totalWidth) + 'px'; this.wrapper = wrapper; } if(!this.config.view.match(/split/) && !this.config.view.match(/user/)){ this.userRatingDiv.style.cssFloat = 'left'; this.userRatingDiv.style.styleFloat = 'left'; } if(!this.config.view.match(/split/)) { this.refreshRating(); } } // generic jskit body tag fror absolutely position elements JSRC.prototype.createBodyElement = function() { if ( ! document.getElementById('js-kit-body-element')) { var be = this.cr('div'); be.id = "js-kit-body-element"; document.body.appendChild(be); } } // Adds the 'i' button and infobox JSRC.prototype.prepMenu = function() { var self = this; var prepMenu = function() { self.createBodyElement(); var infoBoxWrapper = self.cr('div'); self.infoBoxWrapper = infoBoxWrapper; document.getElementById('js-kit-body-element').appendChild(infoBoxWrapper); var infobox1Show = infobox2Show = false; var infoBoxMouseover = function() { clearTimeout(self.ratingMenuTimer); } self.target.onmouseover = function() { infobox1Show = true; infoBoxMouseover(); JSKitLib.show(self.menuArrow); } // Initial time to hide box after mouseout self.infoBoxLifeTime = 1500; self.infoBoxWrapper.onmouseover = function() { infobox2Show = true; // If user is active in window, increase time before hiding self.infoBoxLifeTime = 3000; infoBoxMouseover(); } var infoBoxMouseout = function() { if (infobox1Show || infobox2Show) return; self.ratingMenuTimer = setTimeout(function() { self.ratingMenuTimer = null; self.hideInfoBox(); JSKitLib.hide(self.menuArrow); }, self.infoBoxLifeTime); } self.target.onmouseout = function() { infobox1Show = false; infoBoxMouseout(); } self.infoBoxWrapper.onmouseout = function() { infobox2Show = false; infoBoxMouseout(); } }; // document.body.append functionality can only happen after window.onload in IE JSKitLib.deferCall(prepMenu, true); } JSRC.prototype.doAdminAlert = function() { if (this.isAdmin && !this.config.permalink && !window.$JSKitViaHaloScan) { var alertEndDate = new Date(); alertEndDate.setFullYear(2008, 3, 22); var today = new Date(); if (today < alertEndDate) { return true; } } return false; } JSRC.prototype.createMenuArrow = function() { this.menuArrow = document.createElement('div'); JSKitLib.addStyle(this.menuArrow, 'width:15px; height:15px; margin-left: '+ JSRC.INFO_IMG_OFFSET + 'px; cursor:pointer; float: left;'); JSKitLib.hide(this.menuArrow); if (this.doAdminAlert()) { JSKitLib.addPNG(this.menuArrow, JSRC.INFO_IMG_ALERT); } else { JSKitLib.addPNG(this.menuArrow, JSRC.INFO_IMG); } this.infoBoxImg = this.menuArrow; var self = this; this.menuArrow.onclick = function() { self.toggleInfoBox(); } return this.menuArrow; } JSRC.prototype.hideInfoBox = function() { if (this.infoBox && !this.config.isExtend) { JSKitLib.removeChildren(this.infoBox.target); this.infoBox = null; } } JSRC.prototype.toggleInfoBox = function() { if (this.infoBox) { this.hideInfoBox(); } else { this.showInfoBox(); } } JSRC.prototype.refreshInfoBox = function() { if (this.infoBox) { this.hideInfoBox(); this.showInfoBox(); } } JSRC.prototype.createWindow = function(content, opts) { if (typeof opts != 'object') opts = {}; var wrapper = document.createElement('div'); JSKitLib.addStyle(wrapper, 'border: 1px solid #ccc;'); var box = document.createElement('div'); JSKitLib.addStyle(box, 'background: #ffc; border: none; filter: alpha(opacity=90); opacity: 0.9; padding: .3em;'); if (typeof content == 'string') { box.appendChild(JSKitLib.html(content)); } else { box.appendChild(content); } wrapper.appendChild(box); return wrapper; } JSRC.prototype.createInfoBox = function() { var self = this; var ext = self.config.isExtend; var vars = { totalVotes: this.getTextForTotalVotes(this.objNum), avgStarRating: (function() { if(self.config.view.match(/score/)){ if(self.objNum){ var up = (self.objSum-self.objNum*self.raterInc)/(self.scale-self.raterInc); var down = self.objNum-((self.objSum-self.objNum*self.raterInc)/(self.scale-self.raterInc)); return (ext?$JRL('avgRatingExtend')+': '+$JRL('up')+': <b>'+up+'</b>, '+$JRL('down')+': <b>'+down+'</b> by ' : '('+$JRL('up')+': '+up+', '+$JRL('down')+': '+down+')'); } else { return ''; } } else { return self.objAvgStarRating > 0 ? (ext?$JRL('avgRatingExtend')+' <b>'+JSKitLib.zeroPad(self.objAvgStarRating, 2)+'</b> by ' :'(' + JSKitLib.zeroPad(self.objAvgStarRating, 2) + ' ' + $JRL('avgRating') + ')') : '' } })(), userRatingMsg: (function() { if (self.userRating) { if(self.config.view.match(/score/)){ return $JRL('yourScore') + ': ' + (self.userRating==self.raterInc? '-1' : '+1'); } else { return $JRL('yourRating') + ': ' + (self.userRating / self.raterInc); } } else { if (self.config.freeze != 'yes') { return (self.objNum) ? $JRL('youHaveNotRatedYet') : $JRL('beTheFirstToRate'); } else { return ''; } } })() }; var tmpl = JSKitLib.html(this.tmpl(this.config.isExtend ? JSRC.prototype.dtInfoBoxExtended : JSRC.prototype.dtInfoBox, vars)); var ctls = JSKitLib.mapClass2Object({}, tmpl); if (this.config.freeze == "yes") { JSKitLib.show(ctls['js-rating-infoBoxRatingsDisabled']); } return tmpl; } /* Process all rating objects with the same ID */ JSRC.prototype.processSiblings = function(handler) { for (var i=0; i < $JRH[this.uniq].length; i++) { // property must match as well if (this.config.property || $JRH[this.uniq][i].config.property) { if ($JRH[this.uniq][i].config.property == this.config.property) { handler($JRH[this.uniq][i]); } } else if (this.config.category || $JRH[this.uniq][i].config.category) { if ($JRH[this.uniq][i].config.category == this.config.category) { handler($JRH[this.uniq][i]); } } else { handler($JRH[this.uniq][i]); } } } JSRC.prototype.rate = function(givenRating) { var self = this; var oldRating = this.userRating; this.setUserRating(givenRating); var objSum = this.objSum; var objNum = this.objNum; var objVotes = this.objVotes; if(oldRating) { objSum -= oldRating; objNum --; } if(this.config.view.match(/score/) && (this.config.thumbsize=='small' || this.config.thumbsize=='normal')){ this.setTmpText($JRL('thank')); } else { this.setTmpText($JRL('thankYou')); } // Update all ratings for this ID this.processSiblings(function(sibling) { //TODO: determine if current user increments objVotes count sibling.newRating({ Sum: objSum + givenRating, Num: objNum + 1, Votes: objVotes }, { Sum: givenRating }); }); // TODO: parametric rating if (window.$J$PRA && typeof $J$PRA == 'object') { for (var i=0; i < $J$PRA.length; i++) { if ($J$PRA[i].path == this.path) { $J$PRA[i].onRate(); } } } var title = this.config.title; this.server(".put", "rating=" + givenRating + (this.config.property ? "&property=" + this.config.property : "") + (this.config.category ? "&category=" + this.config.category : "") + (title ? ("&title=" + encodeURIComponent(title)) : "") + (this.config.notop ? "¬op=true" : "") + (this.config.permalink ? "&permalink=" + encodeURIComponent(this.config.permalink) : "") + (this.config.thumbnail ? "&thumbnail=" + encodeURIComponent(this.config.thumbnail) : "") + (this.config.view ? "&view=" + encodeURIComponent(this.config.view) : "") ); // Handle any callbacks this.processOnRate(); } JSRC.prototype.setUserRating = function(rating) { this.userRating = rating; } // Returns: an array of actionable rating icons JSRC.prototype.getRatingIcons = function() { if (this._ratingIcons && this._ratingIcons.length > 0) { return this._ratingIcons; } this._ratingIcons = this._getIcons('js-kit-rater'); return this._ratingIcons; } JSRC.prototype.getObjIcons = function() { if (this._objIcons && this._objIcons.length > 0) { return this._objIcons; } this._objIcons = this._getIcons('js-kit-objIcon'); return this._objIcons; } JSRC.prototype._getIcons = function(iconClass) { var divs = this.target.getElementsByTagName('div'); var icons = []; for (var i=0; i < divs.length; i++) { if (divs[i].className && divs[i].className.indexOf(iconClass) >= 0) { icons.push(divs[i]); } } return icons; } JSRC.prototype.getTextForTotalVotes = function(votes) { var text; switch(votes) { case 1: text = votes + ' ' + $JRL('vote'); break; default: text = votes + ' ' + $JRL('votes'); break; } return $JRL(text); } JSRC.prototype.getTextForUserRating = function(rating) { var text = $JRL('yourRatingTitleCase') + ': ' + rating; return text; } JSRC.prototype.refreshTextTotal = function() { if(this.config.view.match(/score/)){ this.setTextTotal(""); } else if(this.config.isExtend) { var text = (this.objAvgStarRating && this.objNum) ? "Rated "+JSKitLib.zeroPad(this.objAvgStarRating,2)+" ("+this.getTextForTotalVotes(this.objNum)+")" : $JRL('unrated'); this.setTextTotal(text); } else { var text = (this.objNum) ? this.getTextForTotalVotes(this.objNum) : $JRL('unrated'); this.setTextTotal(text); } } JSRC.prototype.refreshTextRating = function(text) { if (this.userRating) { var text = this.getTextForUserRating(this.userRating / this.raterInc); } else { var text = $JRL('yourRatingTitleCase'); } this.setTextRating(text); } JSRC.prototype.setTextRating = function(text) { this._setText(this.textRating, text); } JSRC.prototype.setTextTotal = function(text) { this.lastSetText = text; if(this.tmpTextTimer) return; this._setText(this.textTotal, text); } JSRC.prototype.setActiveText = function(text) { this._setText(this.activeText, text); } JSRC.prototype.setTmpText = function(text) { var self = this; if(this.tmpTextTimer) clearTimeout(this.tmpTextTimer); this.tmpTextTimer = setTimeout(function() { self.tmpTextTimer = null; self.setTextTotal(self.lastSetText); }, 3000); this._setText(this.textTotal, text); } JSRC.prototype._setText = function(node, text) { if ( ! node) { return; } while (node.hasChildNodes()) { node.removeChild(node.firstChild); } node.appendChild(document.createTextNode(text)); } JSRC.prototype.setImage = function(star, imageURL) { if(star.imageURL == imageURL) return; // Already set and we know it star.imageURL = imageURL; JSKitLib.addPNG(star, imageURL); } JSRC.prototype.setThumbImage = function(element, ud, actionable, imageURL, ignoreEmpty) { JSKitLib.setThumbImage( { element: element, ud: ud, actionable: actionable, imageURL: imageURL, ignoreEmpty: ignoreEmpty, numVotes: this.objNum, thumbWidth: this.starWidth, thumbHeight: this.starHeight } ); } // Returns an single div with a specified thumb image JSRC.prototype.createThumbImage = function(ud, actionable, imageURL, ignoreEmpty) { return JSKitLib.createThumbImage({ ud: ud, actionable: actionable, imageURL: imageURL, ignoreEmpty: ignoreEmpty, numVotes: this.objNum, thumbWidth: this.starWidth, thumbHeight: this.starHeight }); } // Handles the hover state for the actionable stars JSRC.prototype.hover = function(index) { if(this.tmpTextTimer) return; var icons = this.getRatingIcons(); if(this.config.view.match(/score/)){ this.setActiveText($JRL('scoreThis')); this.contentBoxElUp.style.opacity="0"; this.contentBoxElUp.style.filter="alpha(opacity:0)"; this.contentBoxElDown.style.opacity="0"; this.contentBoxElDown.style.filter="alpha(opacity:0)"; if(icons.length>=2){ this.setThumbImage(icons[0],'up',1,this.Thumb[this.config.thumbsize],1); this.setThumbImage(icons[1],'down',1,this.Thumb[this.config.thumbsize],1); this.setThumbOpacity(icons[0],1); this.setThumbOpacity(icons[1],1); } } else { this.setActiveText($JRL('rateThis') + ': ' + (index / this.raterInc)); for (var i=0; i < icons.length; i++) { if (index > (i * this.raterInc)) { this.setImage(icons[i], this.fullStar['user']); } else { this.setImage(icons[i], this.emptyStar['user']); } } } } JSRC.prototype.refreshObjRating = function() { var icons = this.getObjIcons(); this._refreshRating('star', this.objEffRating, icons); } JSRC.prototype.calcScore = function() { return(this.objNum ? (this.objSum-6*this.objNum)/4 : 0); } JSRC.prototype.setScoreOpacity = function(icons) { var isfreeze=this.config.freeze=='yes'? true : false; var curscore=this.calcScore(); if(icons.length>=2){ this.setThumbImage(icons[0],'up',!isfreeze,this.Thumb[this.config.thumbsize]); this.setThumbImage(icons[1],'down',!isfreeze,this.Thumb[this.config.thumbsize]); var setTextOpacity = function(el, opacity) { el.style.opacity=opacity; el.style.filter='alpha(opacity:'+(100*opacity)+')'; } if(isfreeze){ this.setThumbOpacity(icons[0],0.6); this.setThumbOpacity(icons[1],0.6); setTextOpacity(this.contentBoxElUp, 1); setTextOpacity(this.contentBoxElDown, 1); } else if(this.objNum){ if(curscore>0){ this.setThumbOpacity(icons[0],1); this.setThumbOpacity(icons[1],0.6); setTextOpacity(this.contentBoxElUp, 1); setTextOpacity(this.contentBoxElDown, 0.6); } else if(curscore<0){ this.setThumbOpacity(icons[1],1); this.setThumbOpacity(icons[0],0.6); setTextOpacity(this.contentBoxElDown, 1); setTextOpacity(this.contentBoxElUp, 0.6); } else { this.setThumbOpacity(icons[0],1); this.setThumbOpacity(icons[1],1); setTextOpacity(this.contentBoxElUp, 1); setTextOpacity(this.contentBoxElDown, 1); } } else { this.setThumbOpacity(icons[0],1); this.setThumbOpacity(icons[1],1); setTextOpacity(this.contentBoxElUp, 1); setTextOpacity(this.contentBoxElDown, 1); } } } JSRC.prototype.refreshUDRating = function() { var icons = this.getRatingIcons(); this.setScoreOpacity(icons); if (this.config.view.match(/score/)){ this.refreshContentBox('all'); } if (this.defaultView == 'star') { this.refreshTextTotal(); } else { this.refreshTextRating(); } } // Resets the user rating view to their actual rating JSRC.prototype.refreshRating = function() { if (this.defaultView == 'star') { var type = 'star'; var comparison = this.objEffRating; } else { var type = 'user'; var comparison = this.userRating; } var isfreeze=this.config.freeze=='yes'? true : false; var icons = isfreeze? this.getObjIcons() : this.getRatingIcons(); if(this.config.view.match(/score/)){ this.setScoreOpacity(icons); } else { this._refreshRating(type, comparison, icons); } if (this.defaultView == 'star') { this.refreshTextTotal(); } else { this.refreshTextRating(); } } JSRC.prototype._refreshRating = function(type, comparison, icons) { for (var i=0; i < icons.length; i++) { if (comparison > (i * this.raterInc)) { if (i * this.raterInc + (this.raterInc / 2) == comparison) { this.setImage(icons[i], this.halfStar[type]); } else { this.setImage(icons[i], this.fullStar[type]); } } else { this.setImage(icons[i], this.emptyStar[type]); } } } JSRC.prototype.refreshContentBox = function (refreshobj,uptext,downtext) { var oldTotalWidth = this.totalWidth; var self=this; var target = self.extendTarget || self.target; var vars={ votedDown: downtext? downtext : (function(){ return (self.objNum-((self.objSum-self.objNum*self.raterInc)/(self.scale-self.raterInc))) })(), votedUp: uptext? uptext : (function(){ return ((self.objSum-self.objNum*self.raterInc)/(self.scale-self.raterInc)) })() }; if(refreshobj=='all' || refreshobj=='up'){ var contentUp=JSKitLib.html(this.tmpl(this.contentBoxUp,vars)); if(this.contentBoxElUp.hasChildNodes()){ this.contentBoxElUp.firstChild.innerHTML=contentUp.innerHTML; } else { this.contentBoxElUp.appendChild(contentUp); } } if(refreshobj=='all' || refreshobj=='down'){ var contentDown=JSKitLib.html(this.tmpl(this.contentBoxDown,vars)); if(this.contentBoxElDown.hasChildNodes()){ this.contentBoxElDown.firstChild.innerHTML=contentDown.innerHTML; } else { this.contentBoxElDown.appendChild(contentDown); } } if(this.userRatingBar){ this.totalWidth=6+2*this.starWidth+this.contentBoxElUp.offsetWidth+this.contentBoxElDown.offsetWidth; var delta = this.totalWidth - oldTotalWidth; var targetMinWidth; if(this.config.isExtend) targetMinWidth = this.totalWidth; else if (this.config.menu != 'no' && this.config.freeze != 'yes') { targetMinWidth = this.totalWidth + 6 + 10 + JSRC.INFO_IMG_WIDTH; } else { targetMinWidth = this.totalWidth + 6; } var targetWidth = target.style.width || targetMinWidth; if(delta>0) { if (parseInt(targetWidth) <= targetMinWidth) { target.style.width = targetMinWidth + 'px'; } this.wrapper.style.width = targetMinWidth + 'px'; this.userRatingDiv.style.width = (this.totalWidth) + 'px'; if(this.textTotal) { this.textTotal.style.width = (this.totalWidth) + 'px'; } this.userRatingBar.style.width = (this.totalWidth) + 'px'; } else { this.userRatingBar.style.width = (this.totalWidth) + 'px'; if(this.textTotal) { this.textTotal.style.width = (this.totalWidth) + 'px'; } this.userRatingDiv.style.width = (this.totalWidth) + 'px'; this.wrapper.style.width = targetMinWidth + 'px'; if (parseInt(targetWidth) <= targetMinWidth) { target.style.width = targetMinWidth + 'px'; } } } } JSRC.prototype.setThumbOpacity = function(element, curopacity) { if (JSKitLib.isPreIE7()) { element.parentNode.style.filter='alpha(opacity:'+(100*curopacity)+')'; } else if (JSKitLib.isIE()) { element.parentNode.style.filter='progid:DXImageTransform.Microsoft.Alpha(opacity:'+(100*curopacity)+')'; } else { element.style.opacity=curopacity; } } JSRC.prototype.initRating = function(rating, type, actionable) { var self = this; var node = this.cr('div'); if(!this.config.view.match(/score/)){ node.style.width = this.ratingBarWidth + 'px'; } node.style.height = this.ratingBarHeight + 'px'; var inf = function() { if(self.refreshScheduled) clearTimeout(self.refreshScheduled); } var outf = function() { if(self.refreshScheduled) clearTimeout(self.refreshScheduled); if(self.config.view.match(/score/)){ self.refreshScheduled = setTimeout( function(){self.refreshScheduled=null; self.refreshUDRating()}, 300); } else { self.refreshScheduled = setTimeout( function(){self.refreshScheduled=null; self.refreshRating()}, 300); } } node.onmouseover = function() { if(self.refreshScheduled) clearTimeout(self.refreshScheduled); } node.onmouseout = outf; var star; if(this.config.view.match(/score/)){ star = this.cr('div'); star.style.cssFloat = 'left'; star.style.styleFloat = 'left'; star.style.width = this.starWidth + 'px'; star.style.height = this.starHeight + 'px'; star.style.position = 'relative'; star.style.overflow = 'hidden'; star.title = '+1'; var upThumb = this.cr('div'); upThumb.style.width = (this.starWidth * 2)+'px'; upThumb.style.height = (this.starHeight * 2)+'px'; if (actionable) { upThumb.className += ' js-kit-rater'; star.onmouseover = function() { inf(); self.hover(self.scale); } star.onmouseout = outf; star.onclick = function() { self.rate(self.scale); } } else { upThumb.className += ' js-kit-objIcon'; } var startmp= this.cr('div'); startmp.style.position='absolute'; startmp.style.width = this.starWidth + 'px'; startmp.style.height = this.starHeight + 'px'; var startmp2; if(JSKitLib.isIE() && !JSKitLib.isPreIE7()){ startmp2=this.cr('div'); startmp2.style.width = (this.starWidth * 2) + 'px'; startmp2.style.height = (this.starHeight * 2) + 'px'; startmp2.appendChild(upThumb); startmp.appendChild(startmp2); this.setThumbImage(upThumb,'up',actionable,this.Thumb[this.config.thumbsize]); } else { startmp.appendChild(upThumb); this.setThumbImage(upThumb,'up',actionable,this.Thumb[this.config.thumbsize]); } star.appendChild(startmp); node.appendChild(star); star = this.cr('div'); star.style.cssFloat = 'left'; star.style.styleFloat = 'left'; star.style.height = this.ratingBarHeight + 'px'; this.contentBoxElUp=star; node.appendChild(star); star = this.cr('div'); star.style.cssFloat = 'left'; star.style.styleFloat = 'left'; star.style.width = this.starWidth + 'px'; star.style.height = this.starHeight + 'px'; star.style.position = 'relative'; star.style.overflow = 'hidden'; star.style.marginTop = '1px'; star.title = '-1'; var downThumb = this.cr('div'); downThumb.style.width = (this.starWidth * 2)+'px'; downThumb.style.height = (this.starHeight * 2)+'px'; if (actionable) { downThumb.className += ' js-kit-rater'; star.onmouseover = function() { inf(); self.hover(self.raterInc); } star.onmouseout = outf; star.onclick = function() { self.rate(self.raterInc); } } else { downThumb.className += ' js-kit-objIcon'; } startmp= this.cr('div'); startmp.style.position='absolute'; startmp.style.width = this.starWidth + 'px'; startmp.style.height = this.starHeight + 'px'; if(JSKitLib.isIE() && !JSKitLib.isPreIE7()){ startmp2=this.cr('div'); startmp2.style.width = (this.starWidth * 2) + 'px'; startmp2.style.height = (this.starHeight * 2) + 'px'; startmp2.appendChild(downThumb); startmp.appendChild(startmp2); this.setThumbImage(downThumb,'down',actionable,this.Thumb[this.config.thumbsize]); } else { startmp.appendChild(downThumb); this.setThumbImage(downThumb,'down',actionable,this.Thumb[this.config.thumbsize]); } star.appendChild(startmp); node.appendChild(star); star = this.cr('div'); star.style.cssFloat = 'left'; star.style.styleFloat = 'left'; star.style.height = this.ratingBarHeight + 'px'; this.contentBoxElDown=star; node.appendChild(star); this.refreshContentBox('all'); } else { /* Increment by Full Star Ratings */ for (var i=this.raterInc; i <= this.scale; i += this.raterInc) { star = this.cr('div'); star.style.cssFloat = 'left'; star.style.styleFloat = 'left'; star.style.width = this.starWidth + 'px'; star.style.height = this.starHeight + 'px'; if (rating + this.raterInc > i) { if (rating + this.raterInc - i >= this.raterInc) { this.setImage(star, this.fullStar[type]); } else { this.setImage(star, this.halfStar[type]); } } else { this.setImage(star, this.emptyStar[type]); } if (actionable) { (function(i) { star.className += ' js-kit-rater'; star.onmouseover = function() { inf(); self.hover(i); } star.onmouseout = outf; star.onclick = function() { self.rate(i); } })(i); } else { star.className += ' js-kit-objIcon'; } node.appendChild(star); } } if (actionable) { node.style.cursor = 'pointer'; } return node; } JSRC.prototype.getCommentsAppObject = function() { if (this.isStandalone()) { return null; } else { return $JSKitGlobal.getCommentsAppObject(this.uniq); } } JSRC.prototype.hasCommentsAppObject = function() { return this.getCommentsAppObject() ? true : false; } JSRC.prototype.clone = function(node, options) { if ( ! options) { options = {}; } var clone = new JSRC(node, { 'newRating' : { 'objSum' : this.objSum, 'objNum' : this.objNum, 'userRating' : this.userRating }, 'path' : options.path || this.config.path, 'view' : options.view || this.config.view, 'notop' : options.notop || this.config.notop, 'commentprompt' : options.commentprompt || this.config.commentprompt, 'starcolor' : options.starcolor || this.config.starcolor, 'usercolor' : options.usercolor || this.config.usercolor, 'imageurl' : options.imageurl || this.config.imageurl, 'imagesize' : options.imagesize || this.config.imagesize, 'menu' : options.menu || this.config.menu }); return clone; } // Part of externally useable API JSRC.prototype.rerender = function() { this.getRatingDataFromServer(); } JSRC.prototype.newRating = function() { var args = arguments; if(typeof args[0] != 'object') args = [ args[3], args[4], args[5] || {} ]; var community = args[0]; var user = args[1] || { Sum: 0 }; var opts = args[2] || { admin: false}; if(opts.sitecfg) { var propsMap = { "ratings-info-on-rate": "showinfoonrate" }; JSKitLib.fmap.call(this, opts.sitecfg, function(v,k) { if(propsMap.hasOwnProperty(k)) this.config[propsMap[k]] = v; }); } this.isAdmin = opts.admin; this.config.isExtend = this.config.isExtend || community.isExtend; if(this.config.isExtend) JSKitLib.addClass(this.target, "js-ratingsExtend"); if(user.frozen) this.config.freeze = "yes"; this.objSum = community.Sum; this.objNum = community.Num; this.objVotes = community.Votes || community.Num; this.userRating = user.Sum; if(this.config.view.match(/score/)){ if(this.objNum){ this.objAvgStarRating = JSKitLib.round(((this.objSum / this.objNum)-(this.scale+this.raterInc)/2)/ this.raterInc, 2); } else { this.objAvgStarRating = 0; } } else { this.objAvgStarRating = JSKitLib.round((this.objSum / this.objNum) / this.raterInc, 2); } this.objEffRating = Math.round(this.objSum / this.objNum) || 0; // Used for star display purposes if(this.refreshScheduled) { clearTimeout(this.refreshScheduled); this.refreshScheduled = null; } if (this.constructed) { this.refreshTextTotal(); this.refreshObjRating(); if(this.config.view.match(/score/)){ this.refreshUDRating(); } else { this.refreshRating(); } } else { this.constructed = true; this.display(); } // TODO: use JSKitGlobal if (window.$J$PRA && typeof $J$PRA == 'object') { for (var i=0; i < $J$PRA.length; i++) { $J$PRA[i].updateComposite(); } } } JSRC.prototype.showInfoBox = function(xOpts) { // Only one infobox should be displayed at a time JSKitLib.map(function(obj) { obj.hideInfoBox(); }, $JRA); var div = this.cr('div'); var pos = JSKitLib.findPos(this.target); JSKitLib.setStyle(div, 'width: ' + JSRC.INFOBOX_WINDOW_WIDTH + 'px; position: absolute; top: ' + (pos[3] + 3) + 'px; z-index:15500;'); // If rating widget is too close to left side, show on the right side if (pos[0] > JSRC.INFOBOX_WINDOW_WIDTH || this.totalWidth >= JSRC.INFOBOX_WINDOW_WIDTH) { div.style.left = (pos[2] - JSRC.INFOBOX_WINDOW_WIDTH - 6) + 'px'; // 3px margin } else { div.style.left = pos[0] + 'px'; // 3px margin } JSKitLib.removeChildren(this.infoBoxWrapper); this.infoBoxWrapper.appendChild(div); var infoBox = new JSRTC(div, { count: 3 }, this, xOpts); this.infoBox = infoBox; } if(!window.$JRTA) { var $JRTA = []; var $JRTLT = { vote: 'vote', votes: 'votes', msgNoHotItems: 'There are currently no Hot items on this site.', msgNoUserItems: 'You have not voted yet.', msgNoTopItems: 'There are currently no Top Rated items on this site.', adminMsgPermalinkHelp: 'This new "My" tab will allow your users to build their own personal list of their favorite content on your site.<br><br>All you need to do is add permalink and title attributes to your rateable content.<br><br>For further information, see the <a href="http://wiki.js-kit.com/Admin-Guide#JSKitpath/permalinkattributes">FAQ on JS-Kit path/permalink attributes</a>, or <a href="http://js-kit.com/support/">contact Support Team</a> for assistance.', adminMsgNoRatings: 'There are currently no items in your Top Rated view. Listings will be displayed when enough votes have been collected.', adminMsgNoRatingsNoHot: 'There are currently no items in your Hot view. Listings will be displayed when enough data has been collected.', adminMsgAlert: 'Testing', hotInProgress: 'JS-Kit is measuring raters\' activity to present the most popular items here. Please allow some time for meaningful data to be collected.' }; var $JRTL = window.JSRTC_Translate || function(t) { return $JRTLT[t] || t; } } /* Constants */ JSRTC.DOMAIN = (window.location.protocol.substr(0, 4) != 'http' ? 'http:' : '') + '//js-kit.com'; JSRTC.IMG_DIR = JSRTC.DOMAIN + '/images/top'; JSRTC.SKIN_DIR = JSRTC.IMG_DIR + '/skins'; /* CSS Base Style */ // Note: This differs from JSRC.CSS in that the keys here are complete JSRTC.CSS = { // User Generic '.js-ratingWrapper': 'position: relative; margin: 3px;', '.js-rTopFont': 'font-family: Arial, Helvetica, sans-serif; font-size: 10pt;', '.js-rTopTitleFont': 'font-weight: bold;', '.js-rTopTabFont': 'font-weight: bold;', '.js-rTopDetailFont': 'font-family: Arial, Helvetica, sans-serif; font-size: 8pt;', '.js-rTopRowColor1': '', '.js-rTopRowColor2': '', '.js-starRatingDiv': 'float: left; margin: 0px 10px 0px 0px;', // General 'div.js-rTopFrame': 'background: #f8f8f8; border: solid 1px #e0e0e0; padding: 0; margin: 0.5em; -moz-user-select: none; -webkit-box-shadow: 0px 10px 50px #222; cursor: default; z-Index: 15000;', 'div.js-rTop': 'cursor: default; border: solid 1px #f8f8f8; padding:1px;', 'div.js-rTopBg': 'width: 100%;', // width needed for ie redraw 'div.js-rTopView': 'margin: -2pt -2px 0px; padding: 0 0 1px 0; zoom: 1;', 'div.js-rTopBody': 'margin: 0;', 'div.js-rTopTop': 'margin: 0;', 'div.js-rTopHot': 'margin: 0;', '.js-nsgecko': '-moz-user-select: none;', // New Extend skin .js-ratingsExtend '.js-Rating': 'border: 3px solid #ececec; font-family: sans-serif; background-color: #FFFFFF;', '.js-RatingData': 'padding: 7px;', '.js-RatingData table': 'border: 0px; border-collapse: collapse;', '.js-RatingData table td': 'padding: 0px;', '.js-RatingText': 'margin-left: 5px; color: #a3a3a3', '.js-RatingNavAd': 'font-size: 9pt; margin-top: 5px; zoom: 1;', '.js-RatingNavView': 'margin-top: 13px;', '.js-ratingsExtend .js-ratingWrapper': 'position: relative; margin: 3px 3px 3px 0px;', '.js-ratingsExtend .js-rTopNav': 'border-bottom: 1px solid #ebebeb; font-size: 8pt; font-weight: normal;', '.js-ratingsExtend .js-rTopNavTabActive': 'background-color: #ebebeb; color: #767676;', '.js-ratingsExtend .js-rTopNavTab': 'padding: 2px 4px; height: auto; margin: 0px; border: none; background-image: none;', '.js-ratingsExtend .js-rTopNavTabWrap': 'float:none;', '.js-ratingsExtend .js-rTop': 'padding: 0px; border: none; font-size: 9pt', '.js-ratingsExtend .js-rTopView': 'background: none; margin: 0px; padding: 0px', '.js-ratingsExtend .js-rTopBody': 'border-bottom: 1px solid #ebebeb; padding: 5px 0px 7px 0px;', '.js-ratingsExtend .js-rTopFrame': 'background: transparent; border: none; padding: 0; margin: 0; -moz-user-select: none; -webkit-box-shadow: none; ', '.js-ratingsExtend .js-starRatingDiv': 'margin: 0px 0px 7px 0px;', // New Extend skin Top rated .js-ratingsExtend '.js-ratingsExtend .js-rTopItem': 'padding: 0px;', '.js-ratingsExtend .js-rTopItem table': 'table-layout: fixed; width: 100%;', '.js-ratingsExtend .js-rTopItemRating': 'color: #c2c2c2; margin-left: 5px;', '.js-ratingsExtend .js-rTopItemLink': 'white-space: nowrap; margin-right: 5px; color: #3366ff; font-size: 9pt; text-decoration: none', // New Extend skin Hot '.js-ratingsExtend .js-rTopHotItem': 'padding: 0px;', '.js-ratingsExtend .js-rTopHotItemInfo': 'color: #c2c2c2', '.js-ratingsExtend .js-rTopHotItemLink': 'white-space: nowrap; color: #3366ff; font-size: 9pt; text-decoration: none', // New Extend Top Score .js-ratingsExtend '.js-ratingsExtend .js-rTopScoreItem': 'color: #3d6883; padding: 0px;', '.js-ratingsExtend .js-rTopScoreItemInfo': 'font-size: 8pt;', '.js-ratingsExtend .js-rTopScoreItemStars': 'margin-right: 5px;', '.js-ratingsExtend .js-rTopScoreItemRate': 'width: 30px; margin-top: 3px', '.js-ratingsExtend .js-rTopScoreItemLink': 'white-space: nowrap; color: #3366ff; text-decoration: none', '.js-ratingsExtend .js-rTopItemScoreRating': 'margin-left: 5px; color: #c2c2c2', //New Extend skin Footter in navigator .js-ratingsExtend '.js-ratingsExtend .js-rTopFooter': 'display: none;', '.js-ratingsExtend .js-RatingPoweredBy': 'width: 100%; text-align: right; background-color: #fbfbfb; font-size:8pt; padding: 3px 0;', '.js-ratingsExtend .js-rTopPoweredByLink': 'color: #c7c7c7; font-family: Arial; padding-right: 5px; text-decoration: none', // Tab Navigation 'div.js-rTopNav': 'margin: 0;', 'div.js-rTopNavTabWrap': 'float: left;', 'div.js-rTopNavTab': 'height: 1.6em; padding-top: 0.4em; text-align: center; cursor: pointer; margin-top: 1px; border-left: 1px solid #e0e0e0; border-bottom: 1px solid #e0e0e0;', 'div.js-rTopNavTabActive': 'border-bottom: none; cursor: default;', 'div.js-rTopNavTabLeft': 'border-left: none;', 'div.js-rTopNavTabRight': 'border-right: none;', // Top Rated 'div.js-rTopItems': 'margin: 0; text-align: left;', 'div.js-rTopItem': 'padding: 0.3em 0.6em;', 'div.js-rTopItem table': 'border: 0px; border-collapse: collapse;', 'div.js-rTopItem table td': 'padding: 0px;', 'span.js-rTopItemCounter': 'margin-right: .3em;', 'a.js-rTopItemLink': 'zoom: 1;', 'span.js-rTopItemRating': 'margin: 0; white-space: nowrap', // User Top Rated 'div.js-rTopUserItems': 'margin: 0; text-align: left;', 'div.js-rTopUserItem': 'padding: 0.3em 0.6em;', 'a.js-rTopUserItemLink': 'zoom: 1;', 'div.js-rTopUserThisItems': 'margin: 0; text-align: left;', 'div.js-rTopUserThisItem': 'padding: 0.3em 0.6em;', 'a.js-rTopUserThisItemLink': 'zoom: 1;', // Top Scored 'div.js-rTopScoreItems': 'margin: 0; text-align: left;', 'div.js-rTopScoreItem': 'padding: 0.3em 0.6em 0.3em 0.6em;', 'span.js-rTopScoreItemCounter': 'margin-right: .3em;', 'div.js-rTopScoreItemInfo': 'margin-top: 0.0em;', 'a.js-rTopScoreItemLink': 'zoom: 1;', 'span.js-rTopScoreItemRating': 'margin: 0; white-space: nowrap', // Hot 'div.js-rTopHotItems': 'margin: 0; text-align: left;', 'div.js-rTopHotItem': 'padding: 0.3em 0.6em;', //'span.js-rTopHotItemInfo': 'margin: 0.2em .4em .3em 0;', 'a.js-rTopHotItemLink': 'zoom: 1;', // User Top Scored 'div.js-rTopUserScoreItems': 'margin: 0; text-align: left;', 'div.js-rTopUserScoreItem': 'padding: 0.3em 0.6em 0.3em 0.6em;', 'div.js-rTopUserScoreItemInfo': 'margin: 0.2em 0;', 'a.js-rTopUserScoreItemLink': 'zoom: 1;', 'div.js-rTopUserThisScoreItems': 'margin: 0; text-align: left;', 'div.js-rTopUserThisScoreItem': 'padding: 0.3em 0.6em 0.3em 0.6em;', 'div.js-rTopUserThisScoreItemInfo': 'margin: 0.2em 0;', 'a.js-rTopUserThisScoreItemLink': 'zoom: 1;', // Footer 'div.js-rTopFooter': 'padding: 0; margin: 0; overflow: hidden; position: relative; zoom: 1;', 'div.js-rTopPoweredBy': 'text-align:right; cursor: pointer; font-size:8pt; padding-bottom: 3px; padding-right:5px;', 'div.js-rTopPoweredByLink': 'font-family: Arial; text-decoration: none;', 'div.js-rTopBodyMsg': 'padding: 0.7em 0.5em 0.3em 0.5em;', 'div.js-rTopBodyAdminMsg': 'padding: 0.7em 0.5em;', 'div.js-rTopBodyAdminMsgHeader': 'padding-bottom: 0.3em; font-size:12pt; font-weight: bold;', 'div.js-rTopBodyAdminMsgBody': '', '.js-ratingsExtend .js-rTopBodyAdminMsgHeader': 'font-size:9pt;', '.js-ratingsExtend .js-rTopFont': 'font-size:9pt;' } JSRTC.writeCSS = function() { var css = ''; for (prop in JSRTC.CSS) { css += prop + ' {' + JSRTC.CSS[prop] + '}'; } JSKitLib.addCss(css, "js-RatingsTopCssText"); } JSRTC.writeCSS(); /* Object and Methods */ // TODO: how do we want to handle skins, etc? JSRTC.writeSkinCSS = function() { var titleFont = ''; var tabFont = ''; var navTab = ''; var detailFont = ''; var msgBody = ''; var skin = 'ice'; if (skin != 'none') { var skinDir = JSRTC.SKIN_DIR + '/' + skin; var header = 'background: url(' + skinDir + '/navi-header-bg.gif) -20px top repeat; border: none;'; var footer = 'background-color: #fff'; var view = 'background: #ffffff url(' + JSRTC.IMG_DIR + '/navi-tab-front-bg.gif) top repeat-x;'; var rowColor2 = "background: #f8f8f8;"; var navTab = "background: url(" + JSRTC.IMG_DIR + "/navi-tab-back-bg.gif) 0 -1px repeat-x;"; var adminNote = 'color: #009933'; switch (skin) { case 'default': titleFont = ' color: #435362'; tabFont = ' color: #003366'; detailFont = ' color: #435362'; msgBody = ' color: #435362'; break; case 'ice': titleFont = ' color: #3d6883'; tabFont = ' color: #003366'; detailFont = ' color: #3d6883'; msgBody = ' color: #3d6883'; break; case 'silver': titleFont = ' color: #5d5954'; tabFont = ' color: #003366'; detailFont = ' color: #5d5954'; msgBody = ' color: #5d5954'; break; case 'suede': titleFont = ' color: #603a13'; tabFont = ' color: #9a6329'; detailFont = ' color: #603a13'; msgBody = ' color: #603a13'; break; default: break; } } else { var skinDir = JSRTC.SKIN_DIR + '/none'; var poweredBy = 'background: url(' + skinDir + '/navi-footer-buttons.gif) -20px -32px no-repeat;'; } var css = "div.js-rTopHeader {" + header + "}" + ".js-rTopTitleFont {" + titleFont + "}" + "div.js-rTopView {" + view + "}" + ".js-rTopTabFont {" + tabFont + "}" + "div.js-rTopNavTab {" + navTab + "}" + ".js-rTopDetailFont {" + detailFont + "}" + "div.js-rTopFooter {" + footer + "}" + "div.js-rTopPoweredByLink {" + tabFont + "}" + ".js-rTopRowColor2 {" + rowColor2 + "}" + "div.js-rTopBodyMsgBody {" + msgBody + "}" + "div.js-rTopBodyAdminMsgBody {" + msgBody + "}" + "div.js-rTopNavTabActive { background: none; }" + "a.js-rTopItemLink {" + tabFont + "}" + "a.js-rTopScoreItemLink {" + tabFont + "}" + "a.js-rTopHotItemLink {" + tabFont + "}" + "a.js-rTopUserItemLink {" + tabFont + "}" + "a.js-rTopUserScoreItemLink {" + tabFont + "}" + "div.js-rTopBodyAdminMsgHeader {" + adminNote + "}" ; JSKitLib.addCss(css, "js-RatingsTopSkinCss"); } JSRTC.writeSkinCSS(); /* Class JSRTC */ function JSRTC(target, options, parentObj, xOpts) { this.jtaIndex = $JRTA.length; $JRTA.push(this); this.cr = function(tag) { return document.createElement(tag); } var wl = window.location; this.parentObj = parentObj; this.target = target; // Tab/Body data this.views = []; this.part = {}; // TR, HH, HD, HW parent object this.starWidth = 9; this.starHeight = 9; var self = this; /* Config */ this.config = {}; this.config.inline = {}; this.config.server = {}; // config from server, or recently saved this.config.get = function(key) { return self.config.inline[key] || self.config.server[key] }; this.config.getInline = function(key) { return self.config.inline[key] }; this.config.getServer = function(key) { return self.config.server[key] }; // TODO: change over to standard config function var iConfig = {}; iConfig.skin = options["skin"] || 'default'; iConfig.target = options["target"] || ''; iConfig.category = options["category"] || ''; if (options["count"]) iConfig.count = options["count"]; this.config.inline = iConfig; this.domain = target.getAttribute("site") || parentObj.config.domain; this.domain = this.domain.replace(/^[a-z]+:\/\//, ''); this.domain = wl.protocol + "//" + this.domain; this.server = function(smod, ext, data) { if ($JSKitGlobal.bestofDataLoading) return; $JSKitGlobal.bestofDataLoading = true; var wl = window.location; var sc = self.cr("script"); sc.setAttribute("charset", "utf-8"); var categ = self.config.get('category') ? "&category=" + self.config.get('category') : ""; sc.src = JSRTC.DOMAIN + '/' + smod + ext + "?ref=" + encodeURIComponent(JSKitLib.getRef(self.parentObj)) + "&" + data + "&" + JSKitEPB.getURIEncodedSerialize() + "&" + categ self.target.appendChild(sc); sc.onload = sc.onreadystatechange = function() { $JSKitGlobal.bestofDataLoading = false; }; return false; } this.serverPut = function(ext, data) { return self.server("navapi.cgi/", ext, data); } // Process xOpts (additional values we may need passed in by callee) this.xOpts = (typeof xOpts == 'object') ? xOpts : {}; self.server("bestof", "-data.js","app=mininav&jx="+self.jtaIndex+"&count="+self.config.get('count')); } JSRC.prototype.dtExtend = '<div class="js-Rating">' +'<div class="js-RatingData">' + '<table class="js-RatingStarsView"><tbody><tr>' + '<td><div class="js-RatingStars"></div></td>' + '<td><div class="js-RatingText"></div></td>' + '</tbody></tr></table>' + '<div class="js-RatingNavView"></div>' + '<div class="js-RatingNavAd"></div>' +'</div>' + '<div class="js-RatingPoweredBy">' + '<a class="js-rTopPoweredByLink" target="_blank" href="http://www.userplane.com/index.cfm?fuseaction=apps.partners">Powered by JS-Kit</a>' + '</div>' '</div>'; // TODO: templates should all be dynamic JSRTC.prototype.getMainTemplate = function(skin) { var html = '<div style = "word-wrap:break-word" class="js-rTopFrame">' + '<div class="js-rTop">' + '<div class="js-rTopBg">' + '<div class="js-rTopHeader"></div>' // View is instance of a Tab/Body + '<div class="js-rTopView">' + '<div class="js-rTopNav js-rTopTabFont"></div>' // Tab Navigation + '<div class="js-rTopBody"></div>' // Body + '</div>' // Top Footer + '<div class="js-rTopFooter">' + '<div class="js-rTopPoweredBy">' + '<a class="js-rTopPoweredByLink" target="_blank" href="http://js-kit.com/?wow_mn">Powered by JS-Kit</a>' + '</div>' + '</div>' + '<div style="clear:both;"></div>' + '</div>' // js-rTopBg + '</div>' // js-rTop + '</div>' ; return html; } JSRTC.prototype.dtBodyAdminMsg = '<div class="js-rTopBodyAdminMsg">' + '<div class="js-rTopBodyAdminMsgHeader">' + '<span>Hello admin:</span>' + '</div>' + '<div class="js-rTopBodyAdminMsgBody js-rTopFont"></div>' + '</div>' ; JSRTC.prototype.dtBodyMsg = '<div class="js-rTopBodyMsg">' + '<div class="js-rTopBodyMsgBody js-rTopFont"></div>' + '</div>' ; JSRTC.prototype.getdtBodyTop = function(){ var html; if(this.xOpts.skin == "Extend") html = '<div class="js-rTopTop">' + '<div class="js-rTopItems">' + '<div class="js-rTopItem">' + '<table><tbody><tr>' + '<td style="width: 50px"><div class="js-rTopItemStars"></div></td>' + '<td><div style="overflow:hidden; width:100%; white-space:nowrap; '+(JSKitLib.isIE()?'height: 1.3em;':'')+'"><a class="js-rTopItemLink" href="{url}">{title}</a></div></td>' + '<td style="width:75px;"><span class="js-rTopItemRating js-rTopDetailFont">{rating} ({votes})</span></td>' + '</tr></tbody></table>' + '</div>' + '</div>' + '</div>'; else html = '<div class="js-rTopTop">' + '<div class="js-rTopDetailFont" style="color: black; background-color:#ffa; margin: .5em .8em 0 .8em; padding: 2px 5px; text-align:center;">Sitewide top rated objects</div>' + '<div class="js-rTopItems">' + '<div class="js-rTopItem">' + '<a class="js-rTopItemLink js-rTopFont" href="{url}">{title}</a>' + '<div class="js-rTopItemInfo">' + '<table><tbody><tr><td valign="middle">' + '<div class="js-rTopItemStars"></div>' + '</td><td>' + '<span class="js-rTopItemRating js-rTopDetailFont">{rating} ({votes})</span>' + '</td></tr></tbody></table>' + '</div>' + '</div>' + '</div>' + '</div>'; return html; } JSRTC.prototype.getdtBodyTopScore = function(){ var html; if(this.xOpts.skin == "Extend") html = '<div class="js-rTopTopScore">' + '<div class="js-rTopScoreItems">' + '<div class="js-rTopScoreItem">' + '<div class="js-rTopScoreItemInfo">' + '<table cellspacing="0" cellpadding="0" border="0"><tbody><tr>' + '<td valign="middle"><div class="js-rTopScoreItemStars"></div></td>' + '<td><div class="js-rTopScoreItemRate"><b>{rating}</b></div></td>' + '<td><a class="js-rTopScoreItemLink js-rTopFont" href="{url}">{title}</a></td>' + '<td><span class="js-rTopItemScoreRating js-rTopDetailFont">({votes})</span></td>' + '</td></tr></tbody></table>' + '</div>' + '</div>' + '</div>' + '</div>'; else html = '<div class="js-rTopTopScore">' + '<div class="js-rTopDetailFont" style="color: black; background-color:#ffa; margin: .5em .8em 0 .8em; padding: 2px 5px; text-align:center;">Sitewide top rated objects</div>' + '<div class="js-rTopScoreItems">' + '<div class="js-rTopScoreItem">' + '<a class="js-rTopScoreItemLink js-rTopFont" href="{url}">{title}</a>' + '<div class="js-rTopScoreItemInfo">' + '<table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="middle">' + '<div class="js-rTopScoreItemStars" style="padding-right:5px;"></div>' + '</td><td>' + '<span class="js-rTopItemScoreRating js-rTopDetailFont"><b>{rating}</b> ({votes})</span>' + '</td></tr></tbody></table>' + '</div>' + '</div>' + '</div>' + '</div>'; return html; } JSRTC.prototype.getdtBodyHot = function(){ var html; if(this.xOpts.skin == "Extend") html = '<div class="js-rTopHot">' + '<div class="js-rTopHotItems">' + '<div class="js-rTopHotItem">' + '<a class="js-rTopHotItemLink js-rTopFont" href="{url}">{title}</a>' + '<span class="js-rTopHotItemInfo js-rTopDetailFont"> ({votes})</span>' + '</div>' + '</div>' + '</div>' else html = '<div class="js-rTopHot">' + '<div class="js-rTopDetailFont" style="color: black; background-color:#ffa; margin: .5em .8em 0 .8em; padding: 2px 5px; text-align:center;">Sitewide hot objects</div>' + '<div class="js-rTopHotItems">' + '<div class="js-rTopHotItem">' + '<a class="js-rTopHotItemLink js-rTopFont" href="{url}">{title}</a>' + '<table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="middle">' + '<span class="js-rTopHotItemInfo js-rTopDetailFont"> ({votes})</span>' + '</td></tr></tbody></table>' + '</div>' + '</div>' + '</div>'; return html; } JSRTC.prototype.dtBodyUser = '<div class="js-rTopUser">' + '<div class="js-rTopUserThis" style="display: none">' + '<div class="js-rTopDetailFont" style="color: black; background-color:#ffa; margin: .5em .8em 0 .8em; padding: 2px 5px; text-align:center;">My vote on this object</div>' + '<div class="js-rTopUserThisItems">' + '<div class="js-rTopUserThisItem">' + '<a class="js-rTopUserThisItemLink js-rTopFont" href="{url}">{title}</a>' + '<div class="js-rTopUserThisItemInfo">' + '<table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="middle">' + '<div class="js-rTopUserThisItemStars"></div>' + '</td><td>' + '<span class="js-rTopItemRating js-rTopDetailFont"> </span>' // Needed for even spacing with dtBodyTop + '</td></tr></tbody></table>' + '</div>' + '</div>' + '</div>' + '</div>' + '<div class="js-rTopUserOther" style="display: none">' + '<div class="js-rTopDetailFont" style="color: black; background-color:#ffa; margin: .5em .8em 0 .8em; padding: 2px 5px; text-align:center;">My recent top ratings</div>' + '<div class="js-rTopUserItems">' + '<div class="js-rTopUserItem">' + '<a class="js-rTopUserItemLink js-rTopFont" href="{url}">{title}</a>' + '<div class="js-rTopUserItemInfo">' + '<table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="middle">' + '<div class="js-rTopUserItemStars"></div>' + '</td><td>' + '<span class="js-rTopItemRating js-rTopDetailFont"> </span>' // Needed for even spacing with dtBodyTop + '</td></tr></tbody></table>' + '</div>' + '</div>' + '</div>' + '</div>' + '</div>' ; JSRTC.prototype.dtBodyUserScore = '<div class="js-rTopUserScore">' + '<div class="js-rTopUserThisScore" style="display: none">' + '<div class="js-rTopDetailFont" style="color: black; background-color:#ffa; margin: .5em .8em 0 .8em; padding: 2px 5px; text-align:center;">My vote on this object</div>' + '<div class="js-rTopUserThisScoreItems">' + '<div class="js-rTopUserThisScoreItem">' + '<table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="top">' + '<div class="js-rTopUserThisScoreItemStars" style="padding-right: 5px; padding-top: .2em;"></div>' + '</td><td>' + '<div><a class="js-rTopUserThisScoreItemLink js-rTopFont" href="{url}">{title}</a></div>' + '</td></tr></tbody></table>' + '</div>' + '</div>' + '</div>' + '<div class="js-rTopUserOtherScore" style="display: none">' + '<div class="js-rTopDetailFont" style="color: black; background-color:#ffa; margin: .5em .8em 0 .8em; padding: 2px 5px; text-align:center;">My recent top ratings</div>' + '<div class="js-rTopUserScoreItems">' + '<div class="js-rTopUserScoreItem">' + '<table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="top">' + '<div class="js-rTopUserScoreItemStars" style="padding-right: 5px; padding-top: .2em;"></div>' + '</td><td>' + '<div><a class="js-rTopUserScoreItemLink js-rTopFont" href="{url}">{title}</a></div>' + '</td></tr></tbody></table>' + '</div>' + '</div>' + '</div>' + '</div>' + '</div>' ; JSRTC.prototype.gtmpl = function(t) { var lowercase = function(a, m) { return String(m).toLowerCase(); } t = t.replace(/^[^<]*(<.*>)[^>]*$/m, "$1"); t = t.replace(/(<[\/]?[A-Z]+)/g, lowercase); t = t.replace(/{Label:([^}]*)}/g,function(a,m){return $JRTL(m);}); return t; } JSRTC.prototype.tmpl = function(t, obj) { var self = this; t = self.gtmpl(t); var purify = function(text) { var text = String(text).replace(/^[ \s]+|[ \s]+$/, ''); text = text.replace(/([^&<>\s]{12})([^&<>\s]{12})/g, '$1<wbr></wbr>$2'); text = text.replace(/[ \t\r\n]+/g, ' '); return text; } t = t.replace(/{([A-Za-z0-9]+)}/g,function(a,m){return obj.hasOwnProperty(m)?purify(obj[m]):'{'+m+'}';}); return t; } JSRTC.prototype.getMiniStars = function(rating, scale) { rating = Math.round(rating); var fullStar = this.config.get('image1url') || JSRTC.DOMAIN + '/images/stars/gold-tiny.png'; var emptyStar = this.config.get('image2url') || JSRTC.DOMAIN + '/images/stars/gray-tiny.png'; var stars = JSKitLib.createMiniStarObject(rating, scale, { full: fullStar, empty: emptyStar, width: this.starWidth, height: this.starHeight }); return stars; } JSRTC.prototype.getMiniThumb = function(score) { var thumbImage = JSRTC.DOMAIN + '/images/stars/small-thumb.png'; var upDown = score >=0 ? 'up' : 'down'; var miniThumb = JSKitLib.createThumbImage({ ud: upDown, actionable: true, imageURL: thumbImage, ignoreEmpty: true, thumbWidth: 10, thumbHeight: 12 }); return miniThumb; } /* * Extract all info from our config and place in our object */ JSRTC.prototype.processConfig = function(config) { // Note: Until BestOf is ensured of having permalinks, we will // base our tab selection on whether or not a particular // rating div has a permalink or not var dataTypes = this.getServerDataTypes(); var isScore = (this.parentObj.config.view.match(/score/)); var myTab = { type:(isScore ? "US": "UR"), title:"My", active:((this.xOpts.skin=="Extend")?false:true) }; this.views = []; if (this.parentObj.config.permalink) { this.views.push(myTab); if (dataTypes['TR'] || dataTypes['TS'] || this.isAdmin) { this.views.push({ type:(isScore ? "TS" : "TR"), title:"Top", active: true }); this.views.push({ type:"HT", title:"Hot", active: true }); } } else if (dataTypes[myTab.type]) { this.views.push(myTab); } this.views.push({ type:"RI", title:"Info", active: true }); } // Returns a hash of server provided data types JSRTC.prototype.getServerDataTypes = function() { var data = this.serverData[0].data; var dataTypes = {}; for (var i=0; i < data.length; i++) { dataTypes[data[i].type] = true; } return dataTypes; } JSRTC.prototype.toggleViews = function(id) { // Iterate through hide/unactivate as necessary var skin = this.xOpts.skin || ""; var views = this.getActiveViews(); if (!views.length) return; for (var i=0; i < views.length; i++) { if (i != id) { JSKitLib.removeClass(views[i].tab, "js-rTopNavTabActive"); JSKitLib.hide(views[i].content); } } // Now display the proper view JSKitLib.addClass(views[id].tab, "js-rTopNavTabActive"); JSKitLib.show(views[id].content); } JSRTC.prototype.table = function(tr) { var self = this; var a = function(n, w) {var o=self.cr(n);o.appendChild(w);return o;} var t = a('table', a('tbody', tr)); var z = function(a) {t.setAttribute(a, '0')} z('cellSpacing'); z('cellPadding'); z('border'); return t; } JSRTC.prototype.getViews = function() { return this.views; } JSRTC.prototype.getActiveViews = function() { var views = this.views; var aViews = []; for (var i=0; i < views.length; i++) { if (typeof views[i] == 'object' && views[i].active) { aViews.push(views[i]); } } return aViews; } JSRTC.prototype.isViewActive = function(type) { var views = this.getActiveViews(); for (var i=0; i < views.length; i++) { if (typeof views[i] == 'object' && (views[i].type == type) && views[i].active) { return true; } } return false; } JSRTC.prototype.createTabs = function() { var self = this; var views = this.getActiveViews(); var skin = this.xOpts.skin || ""; var numTabs = views.length; // TODO: Show no tab if only one // Calculate the width of each tab var width = Math.floor(100/numTabs); var adjWidth = (numTabs * width != 100) ? (100 - ((numTabs - 1) * width)) : width; var tr = this.cr('tr'); for (var i=0; i < views.length; i++) { var td = this.cr('td'); if(skin!="Extend") td.setAttribute('width', width + '%'); var tabWrap = this.cr('div'); tabWrap.className = "js-rTopNavTabWrap"; if(skin!="Extend") tabWrap.style.width = '100%'; var tabMain = this.cr('div'); tabMain.className = "js-rTopNavTab"; JSKitLib.preventSelect(tabMain); // preventSelect for tabs titles // Left, Right if (i==0) { if(skin!="Extend") td.setAttribute('width', adjWidth + '%'); JSKitLib.addClass(tabMain, "js-rTopNavTabLeft"); JSKitLib.addClass(tabMain, "js-rTopNavTabActive"); } else { if (i == (views.length - 1)) { JSKitLib.addClass(tabMain, "js-rTopNavTabRight"); } } var divTitle = document.createElement("div"); divTitle.style.display = "inline"; divTitle.innerHTML = views[i].title; (function(i) { tabMain.onclick = function() { self.toggleViews(i); self.positionAffiliate(); }; })(i); tabMain.appendChild(divTitle); tabWrap.appendChild(tabMain); views[i].tab = tabMain; // Obj ref to tab node td.appendChild(tabWrap); tr.appendChild(td); } var table = this.table(tr); if(skin!="Extend") table.setAttribute('width', '100%'); return table; } JSRTC.prototype.createBody = function(navData) { var self = this; var views = this.getActiveViews(); var contentDiv = this.cr('div'); for (var i=0; i < views.length; i++) { switch (views[i].type) { /* Rating Info */ case "RI": var content = this.parentObj.createInfoBox(); break; /* User Ratings */ case "UR": var content = this.createBodyUser(navData); break; case "US": var content = this.createBodyUserScore(navData); break; case "AA": var content = this.createBodyAdminMsg($JRTL('adminMsgAlert')); break; case "TR": var content = this.createBodyTop(navData); JSKitLib.preventSelect(content); break; case "TS": var content = this.createBodyTopScore(navData); JSKitLib.preventSelect(content); break; case "HT": var content = this.createBodyHot(navData); JSKitLib.preventSelect(content); break; case "EP" : /* Not handling EP */ break; case "PL" : var content = this.cr("div"); content.className = "js-kit-poll"; } if (typeof content == 'object') { views[i].content = content; contentDiv.appendChild(content); } } return contentDiv; } JSRTC.prototype.createBodyTop = function(navData) { var self = this; var skin = this.xOpts.skin || ""; var body = JSKitLib.html(this.getdtBodyTop()); var ctls = JSKitLib.mapClass2Object({}, body); /* Top TR */ var tip = ctls['js-rTopItems']; var tTemplate = tip.innerHTML; tip.innerHTML = ''; var topItem = function(items, idx) { var item = items[idx]; var idiv = JSKitLib.html(self.tmpl(tTemplate, item)); if (idx % 2 != 0 && skin != "Extend") JSKitLib.addClass(idiv, "js-rTopRowColor2"); var ictls = JSKitLib.mapClass2Object({}, idiv); var link = ictls['js-rTopItemLink']; if (item.url.match(/^[a-z]+:\/\//)) { link.href = item.url; } else { link.href = self.domain + item.url; } if (self.config.get('target')) { link.target = self.config.get('target'); } var stars = ictls['js-rTopItemStars']; stars.appendChild(item.stars); return idiv; } if (navData.part.TR.items.length) { JSKitLib.map(function(item, i, items) { JSKitLib.addChild(tip, topItem(items, i)); }, navData.part.TR.items); } else { if (this.isAdmin) { tip.appendChild(this.createBodyAdminMsg($JRTL('adminMsgNoRatings'))); } else { tip.appendChild(this.createBodyMsg($JRTL('msgNoTopItems'))); } } return body; } JSRTC.prototype.createBodyTopScore = function(navData) { var self = this; var skin = this.xOpts.skin || ""; var body = JSKitLib.html(this.getdtBodyTopScore()); var ctls = JSKitLib.mapClass2Object({}, body); /* Top TS */ var tip = ctls['js-rTopScoreItems']; var tTemplate = tip.innerHTML; tip.innerHTML = ''; var topItem = function(items, idx) { var item = items[idx]; var idiv = JSKitLib.html(self.tmpl(tTemplate, item)); if (skin!="Extend" && idx % 2 != 0) JSKitLib.addClass(idiv, "js-rTopRowColor2"); var ictls = JSKitLib.mapClass2Object({}, idiv); var link = ictls['js-rTopScoreItemLink']; if (item.url.match(/^[a-z]+:\/\//)) { link.href = item.url; } else { link.href = self.domain + item.url; } if (self.config.get('target')) { link.target = self.config.get('target'); } var stars = ictls['js-rTopScoreItemStars']; stars.appendChild(item.stars); return idiv; } if (navData.part.TS.items.length) { JSKitLib.map(function(item, i, items) { JSKitLib.addChild(tip, topItem(items, i)); }, navData.part.TS.items); } else { if (this.isAdmin) { tip.appendChild(this.createBodyAdminMsg($JRTL('adminMsgNoRatings'))); } else { tip.appendChild(this.createBodyMsg($JRTL('msgNoTopItems'))); } } return body; } JSRTC.prototype.createBodyUser = function(navData) { var self = this; var body = JSKitLib.html(this.dtBodyUser); var ctls = JSKitLib.mapClass2Object({}, body); /* Top UR */ var tip = ctls['js-rTopUserItems']; var tipthis = ctls['js-rTopUserThisItems']; var tTemplate = tip.innerHTML; var tThisTemplate = tipthis.innerHTML; tip.innerHTML = ''; tipthis.innerHTML = ''; var existOther = 0; var isThis = function(item) { return (String(item.path || '').toLowerCase() == String(self.parentObj.config.path || '').toLowerCase()); }; var userThisItem = function(pObj) { var p = pObj.config.permalink || pObj.path; var item = {url: p,title: pObj.config.title || p}; var idiv = JSKitLib.html(self.tmpl(tThisTemplate, item)); var ictls = JSKitLib.mapClass2Object({}, idiv); var link = ictls['js-rTopUserThisItemLink']; if (item.url && item.url.match(/^[a-z]+:\/\//)) { link.href = item.url; } else { link.href = self.domain + (item.url ? item.url : ''); } if (self.config.get('target')) { link.target = self.config.get('target'); } var stars = ictls['js-rTopUserThisItemStars']; var istars = self.getMiniStars(pObj.userRating, 10); stars.appendChild(istars); return idiv; } var userItem = function(items, idx) { var item = items[idx]; if(isThis(item)) return undefined; existOther = 1; var idiv = JSKitLib.html(self.tmpl(tTemplate, item)); if (idx % 2 != 0) JSKitLib.addClass(idiv, "js-rTopRowColor2"); var ictls = JSKitLib.mapClass2Object({}, idiv); var link = ictls['js-rTopUserItemLink']; if (item.url.match(/^[a-z]+:\/\//)) { link.href = item.url; } else { link.href = self.domain + item.url; } if (self.config.get('target')) { link.target = self.config.get('target'); } var stars = ictls['js-rTopUserItemStars']; stars.appendChild(item.stars); return idiv; } if (navData.part.UR.items.length || self.parentObj.userRating) { if(self.parentObj.userRating){ var cd = userThisItem(self.parentObj); if(cd) JSKitLib.addChild(tipthis, cd); ctls['js-rTopUserThis'].style.display = 'block'; } else { ctls['js-rTopUserThis'].style.display = 'none'; } JSKitLib.map(function(item, i, items) { var cd = userItem(items, i); if(cd) JSKitLib.addChild(tip, cd); }, navData.part.UR.items); if(existOther){ ctls['js-rTopUserOther'].style.display = 'block'; } else { ctls['js-rTopUserOther'].style.display = 'none'; } } else { if (this.isAdmin) { if (this.parentObj.config.permalink) { ctls['js-rTopUserOther'].style.display = 'block'; tip.appendChild(this.createBodyMsg($JRTL('msgNoUserItems'))); } else { ctls['js-rTopUserOther'].style.display = 'block'; tip.appendChild(this.createBodyAdminMsg($JRTL('adminMsgPermalinkHelp'))); } } else { ctls['js-rTopUserOther'].style.display = 'block'; tip.appendChild(this.createBodyMsg($JRTL('msgNoUserItems'))); } } return body; } JSRTC.prototype.createBodyUserScore = function(navData) { var self = this; var body = JSKitLib.html(this.dtBodyUserScore); var ctls = JSKitLib.mapClass2Object({}, body); /* Top UR */ var tip = ctls['js-rTopUserScoreItems']; var tipthis = ctls['js-rTopUserThisScoreItems']; var tTemplate = tip.innerHTML; var tThisTemplate = tipthis.innerHTML; tip.innerHTML = ''; tipthis.innerHTML = ''; var existOther = 0; var isThis = function(item) { return (String(item.path || '').toLowerCase() == String(self.parentObj.config.path || '').toLowerCase()); }; var userThisItem = function(pObj) { var p = pObj.config.permalink || pObj.path; var item = {url: p, title: pObj.config.title || p}; var idiv = JSKitLib.html(self.tmpl(tThisTemplate, item)); var ictls = JSKitLib.mapClass2Object({}, idiv); var link = ictls['js-rTopUserThisScoreItemLink']; if (item.url && item.url.match(/^[a-z]+:\/\//)) { link.href = item.url; } else { link.href = self.domain + (item.url ? item.url : ''); } if (self.config.get('target')) { link.target = self.config.get('target'); } var stars = ictls['js-rTopUserThisScoreItemStars']; var istars = self.getMiniThumb(pObj.calcScore()); stars.appendChild(istars); return idiv; } var userItem = function(items, idx) { var item = items[idx]; if(isThis(item)) return undefined; existOther = 1; var idiv = JSKitLib.html(self.tmpl(tTemplate, item)); if (idx % 2 != 0) JSKitLib.addClass(idiv, "js-rTopRowColor2"); var ictls = JSKitLib.mapClass2Object({}, idiv); var link = ictls['js-rTopUserScoreItemLink']; if (item.url && item.url.match(/^[a-z]+:\/\//)) { link.href = item.url; } else { link.href = self.domain + (item.url ? item.url : ''); } if (self.config.get('target')) { link.target = self.config.get('target'); } var stars = ictls['js-rTopUserScoreItemStars']; stars.appendChild(item.stars); return idiv; } if (navData.part.US.items.length || self.parentObj.userRating) { if(self.parentObj.userRating){ var cd = userThisItem(self.parentObj); if(cd) JSKitLib.addChild(tipthis, cd); ctls['js-rTopUserThisScore'].style.display = 'block'; } else { ctls['js-rTopUserThisScore'].style.display = 'none'; } JSKitLib.map(function(item, i, items) { var cd = userItem(items, i); if(cd) JSKitLib.addChild(tip, cd); }, navData.part.US.items); if(existOther){ ctls['js-rTopUserOtherScore'].style.display = 'block'; } else { ctls['js-rTopUserOtherScore'].style.display = 'none'; } } else { if (this.isAdmin) { if (this.parentObj.config.permalink) { ctls['js-rTopUserOtherScore'].style.display = 'block'; tip.appendChild(this.createBodyMsg($JRTL('msgNoUserItems'))); } else { ctls['js-rTopUserOtherScore'].style.display = 'block'; tip.appendChild(this.createBodyAdminMsg($JRTL('adminMsgPermalinkHelp'))); } } else { ctls['js-rTopUserOtherScore'].style.display = 'block'; tip.appendChild(this.createBodyMsg($JRTL('msgNoUserItems'))); } } return body; } JSRTC.prototype.createBodyAdminMsg = function(msg) { var body = JSKitLib.html(this.dtBodyAdminMsg); var ctls = JSKitLib.mapClass2Object({}, body); var msgBody = ctls["js-rTopBodyAdminMsgBody"]; msgBody.innerHTML = msg; return body; } JSRTC.prototype.createBodyMsg = function(msg) { var body = JSKitLib.html(this.dtBodyMsg); var ctls = JSKitLib.mapClass2Object({}, body); var msgBody = ctls["js-rTopBodyMsgBody"]; msgBody.innerHTML = msg; return body; } JSRTC.prototype.createBodyHot = function(navData) { var self = this; var skin = this.xOpts.skin || ""; var body = JSKitLib.html(this.getdtBodyHot()); var ctls = JSKitLib.mapClass2Object({}, body); /* Hot */ var hotp = ctls['js-rTopHotItems']; var hTemplate = hotp.innerHTML; hotp.innerHTML = ''; var hotItem = function(items, idx) { var item = items[idx]; var idiv = JSKitLib.html(self.tmpl(hTemplate, item)); if (skin!="Extend" && idx % 2 != 0) JSKitLib.addClass(idiv, "js-rTopRowColor2"); var ictls = JSKitLib.mapClass2Object({}, idiv); var link = ictls['js-rTopHotItemLink']; if (item.url.match(/^[a-z]+:\/\//)) { link.href = item.url; } else { link.href = self.domain + item.url; } if (self.config.get('target')) { link.target = self.config.get('target'); } return idiv; } if (navData.part.HT.items.length) { JSKitLib.map(function(item, i, items) { JSKitLib.addChild(hotp, hotItem(items, i)); }, navData.part.HT.items); } else { var dataTypes = this.getServerDataTypes(); if (dataTypes.TR) { hotp.appendChild(this.createBodyMsg($JRTL('hotInProgress'))); } else { if (this.isAdmin) { hotp.appendChild(this.createBodyAdminMsg($JRTL('adminMsgNoRatingsNoHot'))); } else { hotp.appendChild(this.createBodyMsg($JRTL('msgNoHotItems'))); } } } return body; } JSRTC.prototype.displayTop = function(navData, opts) { var self = this; navData.Title = this.config.get('title'); var skin = this.xOpts.skin || ""; var template = this.getMainTemplate(skin); var pdiv = JSKitLib.html(this.tmpl(template, navData)); var ctls = JSKitLib.mapClass2Object({}, pdiv); this.ctls = ctls; /* Navigation Tabs */ var topNav = ctls['js-rTopNav']; topNav.appendChild(this.createTabs()); /* Main Content */ var topBody = ctls['js-rTopBody']; topBody.appendChild(this.createBody(navData)); if (opts.whitelabel && ctls["js-rTopPoweredBy"]) JSKitLib.hide(ctls["js-rTopPoweredBy"]); /* Activate the Main View */ // TODO: handle for single view this.toggleViews(0); this.target.innerHTML = ''; JSKitLib.addChild(this.target, pdiv); if (opts.ad) { //this.displayAd(opts.ad); } } JSRTC.prototype.displayAd = function(ad) { /* Ads */ if (typeof ad == 'object' && ad.data) { if (ad.flags && ad.flags.match(/a/)) { try { eval("ad.data = " + ad.data); this.doAffiliateAbsolute(ad); } catch(e) {}; } else { if (ad.data.match(/<script/i)) { var div = this.cr('div'); div.style.margin = '9px 0'; var banner = this.cr('div'); banner.style.margin = '0 auto'; banner.style.width = ad.width + 'px'; var iframe = document.createElement('iframe'); iframe.frameBorder = 0; iframe.scrolling = "no"; iframe.marginWidth = 0; iframe.marginHeight = 0; iframe.width = ad.width; iframe.height = ad.height; iframe.src = 'http://js-kit.com/reflector?html=' + encodeURIComponent('<html><body>' + ad.data + '</body></html>'); div.appendChild(banner); banner.appendChild(iframe); this.target.appendChild(div); } else { var div = this.cr('div'); div.style.margin = '9px 0'; var banner = this.cr('div'); banner.style.margin = '0 auto'; div.appendChild(banner); banner.innerHTML = ad.data; this.target.appendChild(div); } } } } JSRTC.prototype.getTextForTotalVotes = function(votes) { var text; switch(parseInt(votes)) { case 1: text = votes + ' ' + $JRTL('vote'); break; default: text = votes + ' ' + $JRTL('votes'); break; } return text; } JSRTC.prototype.getTextForTotalScoreVotes = function(votes) { return $JRTL('by') + ' ' + this.getTextForTotalVotes(votes); } JSRTC.prototype.prepHotItems = function(items) { if (!items.length) return; // Filter proper number of results if (this.config.get('count') < items.length) items.length = this.config.get('count'); // Prepare vote counts for (var i=0; i < items.length; i++) { items[i].votes = this.getTextForTotalVotes(items[i].val2); } return items; } JSRTC.prototype.prepTopItems = function(items) { if(!items.length) return; // Filter proper number of results if (this.config.get('count') < items.length) items.length = this.config.get('count'); // Prepare our stars for (var i=0; i < items.length; i++) { items[i].stars = this.getMiniStars(items[i].val1, 10); items[i].rating = JSKitLib.zeroPad(JSKitLib.round(items[i].val1 / 2, 2), 2); items[i].votes = this.getTextForTotalVotes(items[i].val2); items[i].counter = i + 1; } return items; } JSRTC.prototype.prepUserItems = function(items) { if(!items.length) return; // Filter proper number of results if (this.config.get('count') < items.length) items.length = this.config.get('count'); // Prepare our stars for (var i=0; i < items.length; i++) { items[i].stars = this.getMiniStars(items[i].rating, 10); items[i].rating = JSKitLib.zeroPad(JSKitLib.round(items[i].rating / 2, 2), 2); items[i].counter = i + 1; } return items; } JSRTC.prototype.prepTopScoreItems = function(items) { if(!items.length) return; // Filter proper number of results if (this.config.get('count') < items.length) items.length = this.config.get('count'); // Prepare our score icons for (var i=0; i < items.length; i++) { items[i].rating = JSKitLib.round(items[i].val1>0 ? '+'+items[i].val1 : items[i].val1); items[i].votes = this.getTextForTotalScoreVotes(items[i].val2); var upDown = items[i].rating <= 0 ? 'down' : 'up'; //items[i].stars = this.parentObj.createThumbImage(upDown, 1, this.parentObj.Thumb[this.parentObj.config.thumbsize],1); items[i].stars = this.getMiniThumb(items[i].rating); } return items; } JSRTC.prototype.prepUserScoreItems = function(items) { if(!items.length) return; // Filter proper number of results if (this.config.get('count') < items.length) items.length = this.config.get('count'); // Prepare our score icons for (var i=0; i < items.length; i++) { var upDown = items[i].rating == this.parentObj.raterInc ? -1 : 1; items[i].stars = this.getMiniThumb(upDown); } return items; } /* * Affiliate Code */ JSRTC.prototype.getAffiliateAbsoluteContainer = function(ad) { var ad_width = ad.width; var ad_height = ad.height; var d1 = this.cr('div'); var d2 = this.cr('div'); JSKitLib.setStyle(d1, "margin-top: 9px; cursor: pointer; height:" + ad_height + "px;"); JSKitLib.setStyle(d2, "width:" + ad_width + "px; margin:0 auto;"); d1.appendChild(d2); return d1; } JSRTC.prototype.processAffiliateAbsolute = function(ad) { // Only allowing one absolute ad per Top if (this.jtaIndex != 0) return; // Create the container for our affiliate this.affContainer = this.getAffiliateAbsoluteContainer(ad); this.target.appendChild(this.affContainer); // IE allows flash to overflow a container, but we need special // handling for non IE browsers if (JSKitLib.isIE()) { this.affContainer.firstChild.appendChild(ad.data()); } else { this.affDiv = this.cr('div'); this.affDiv.style.position = 'absolute'; this.positionAffiliate(); this.affDiv.style.zIndex = 1000; this.affDiv.appendChild(ad.data()); JSKitLib.getJSKitBodyElement().appendChild(this.affDiv); // Handling repositioning of ad var self = this; JSKitLib.addEventHandler(window, ['load', 'resize'], function() { self.positionAffiliate(); }); } } JSRTC.prototype.positionAffiliate = function() { if ( ! JSKitLib.isIE() && this.affContainer) { var pos = JSKitLib.findPos(this.affContainer.firstChild); this.affDiv.style.left = pos[0] + 'px'; this.affDiv.style.top = pos[1] + 'px'; } } // Handles absolutely positioned affiliates JSRTC.prototype.doAffiliateAbsolute = function(ad) { // Run once only if ( ! this.didAffiliateAbsolute) { if (ad) { this.processAffiliateAbsolute(ad); } this.didAffiliateAbsolute = true; } } /* * Navigator Data Processing */ JSRTC.prototype.processDataTop = function(navData) { var TR = JSKitLib.filter( function(o) { return (o.type === "TR" && o.title.length); }, navData.data); navData.part.TR.items = this.prepTopItems(TR) || []; } JSRTC.prototype.processDataTopScore = function(navData) { var TS = JSKitLib.filter( function(o) { return (o.type === "TS" && o.title.length); }, navData.data); navData.part.TS.items = this.prepTopScoreItems(TS) || []; } JSRTC.prototype.processDataUser = function(navData) { var UR = JSKitLib.filter( function(o) { return (o.type === "UR"); }, navData.data); navData.part.UR.items = this.prepUserItems(UR) || []; } JSRTC.prototype.processDataUserScore = function(navData) { var US = JSKitLib.filter( function(o) { return (o.type === "US"); }, navData.data); navData.part.US.items = this.prepUserScoreItems(US) || []; } JSRTC.prototype.processDataHot = function(navData) { // Hot by Hour var HH = JSKitLib.filter( function(o) { return (o.type === "HH" && o.title.length); }, navData.data); // Hot by Day var HD = JSKitLib.filter( function(o) { return (o.type === "HD" && o.title.length); }, navData.data); // Hot by Week var HW = JSKitLib.filter( function(o) { return (o.type === "HW" && o.title.length); }, navData.data); // For Hot, use HD, and if less than 2 results use HW navData.part.HT.items = this.prepHotItems(HD) || []; if (navData.part.HT.items.length < 2) { navData.part.HT.items = this.prepHotItems(HW) || []; } } JSRTC.prototype.newAd = function(data) { this.displayAd(data); } // This must be the last function. JSRTC.prototype.newData = function(data, opts) { opts = opts || {}; this.serverData = [ data, opts ]; // Saving what was returned by server. this.config.server = data.config || {}; this.serverTime = opts.serverTime; this.isAdmin = opts.admin || false; this.isNewSite = opts.newSite || false; var navData = {}; navData.data = data.data; // Process Config this.processConfig(this.config.server); navData.part = { TR: {}, TS: {}, HH: {}, HD: {}, HW: {}, HT: {}, // Composite of HH, HD, HW UR: {}, US: {} }; this.processDataTop(navData); this.processDataTopScore(navData); this.processDataHot(navData); this.processDataUser(navData); this.processDataUserScore(navData); // Now parse template and attach node this.displayTop(navData, opts); }
0 komentar:
Posting Komentar
Silahkan request di kolom komentar,
dan kami akan me-respon permintaan teman-teman :)