var Hashtable=(function(){
var FUNCTION="function";
var arrayRemoveAt=(typeof Array.prototype.splice==FUNCTION) ?
function(arr, idx){
arr.splice(idx, 1);
} :
function(arr, idx){
var itemsAfterDeleted, i, len;
if(idx===arr.length - 1){
arr.length=idx;
}else{
itemsAfterDeleted=arr.slice(idx + 1);
arr.length=idx;
for (i=0, len=itemsAfterDeleted.length; i < len; ++i){
arr[idx + i]=itemsAfterDeleted[i];
}}
};
function hashObject(obj){
var hashCode;
if(typeof obj=="string"){
return obj;
}else if(typeof obj.hashCode==FUNCTION){
hashCode=obj.hashCode();
return (typeof hashCode=="string") ? hashCode:hashObject(hashCode);
}else if(typeof obj.toString==FUNCTION){
return obj.toString();
}else{
try {
return String(obj);
} catch (ex){
return Object.prototype.toString.call(obj);
}}
}
function equals_fixedValueHasEquals(fixedValue, variableValue){
return fixedValue.equals(variableValue);
}
function equals_fixedValueNoEquals(fixedValue, variableValue){
return (typeof variableValue.equals==FUNCTION) ?
variableValue.equals(fixedValue):(fixedValue===variableValue);
}
function createKeyValCheck(kvStr){
return function(kv){
if(kv===null){
throw new Error("null is not a valid " + kvStr);
}else if(typeof kv=="undefined"){
throw new Error(kvStr + " must not be undefined");
}};}
var checkKey=createKeyValCheck("key"), checkValue=createKeyValCheck("value");
function Bucket(hash, firstKey, firstValue, equalityFunction){
this[0]=hash;
this.entries=[];
this.addEntry(firstKey, firstValue);
if(equalityFunction!==null){
this.getEqualityFunction=function(){
return equalityFunction;
};}}
var EXISTENCE=0, ENTRY=1, ENTRY_INDEX_AND_VALUE=2;
function createBucketSearcher(mode){
return function(key){
var i=this.entries.length, entry, equals=this.getEqualityFunction(key);
while (i--){
entry=this.entries[i];
if(equals(key, entry[0])){
switch (mode){
case EXISTENCE:
return true;
case ENTRY:
return entry;
case ENTRY_INDEX_AND_VALUE:
return [ i, entry[1] ];
}}
}
return false;
};}
function createBucketLister(entryProperty){
return function(aggregatedArr){
var startIndex=aggregatedArr.length;
for (var i=0, len=this.entries.length; i < len; ++i){
aggregatedArr[startIndex + i]=this.entries[i][entryProperty];
}};}
Bucket.prototype={
getEqualityFunction: function(searchValue){
return (typeof searchValue.equals==FUNCTION) ? equals_fixedValueHasEquals:equals_fixedValueNoEquals;
},
getEntryForKey: createBucketSearcher(ENTRY),
getEntryAndIndexForKey: createBucketSearcher(ENTRY_INDEX_AND_VALUE),
removeEntryForKey: function(key){
var result=this.getEntryAndIndexForKey(key);
if(result){
arrayRemoveAt(this.entries, result[0]);
return result[1];
}
return null;
},
addEntry: function(key, value){
this.entries[this.entries.length]=[key, value];
},
keys: createBucketLister(0),
values: createBucketLister(1),
getEntries: function(entries){
var startIndex=entries.length;
for (var i=0, len=this.entries.length; i < len; ++i){
entries[startIndex + i]=this.entries[i].slice(0);
}},
containsKey: createBucketSearcher(EXISTENCE),
containsValue: function(value){
var i=this.entries.length;
while (i--){
if(value===this.entries[i][1]){
return true;
}}
return false;
}};
function searchBuckets(buckets, hash){
var i=buckets.length, bucket;
while (i--){
bucket=buckets[i];
if(hash===bucket[0]){
return i;
}}
return null;
}
function getBucketForHash(bucketsByHash, hash){
var bucket=bucketsByHash[hash];
return(bucket&&(bucket instanceof Bucket)) ? bucket:null;
}
function Hashtable(hashingFunctionParam, equalityFunctionParam){
var that=this;
var buckets=[];
var bucketsByHash={};
var hashingFunction=(typeof hashingFunctionParam==FUNCTION) ? hashingFunctionParam:hashObject;
var equalityFunction=(typeof equalityFunctionParam==FUNCTION) ? equalityFunctionParam:null;
this.put=function(key, value){
checkKey(key);
checkValue(value);
var hash=hashingFunction(key), bucket, bucketEntry, oldValue=null;
bucket=getBucketForHash(bucketsByHash, hash);
if(bucket){
bucketEntry=bucket.getEntryForKey(key);
if(bucketEntry){
oldValue=bucketEntry[1];
bucketEntry[1]=value;
}else{
bucket.addEntry(key, value);
}}else{
bucket=new Bucket(hash, key, value, equalityFunction);
buckets[buckets.length]=bucket;
bucketsByHash[hash]=bucket;
}
return oldValue;
};
this.get=function(key){
checkKey(key);
var hash=hashingFunction(key);
var bucket=getBucketForHash(bucketsByHash, hash);
if(bucket){
var bucketEntry=bucket.getEntryForKey(key);
if(bucketEntry){
return bucketEntry[1];
}}
return null;
};
this.containsKey=function(key){
checkKey(key);
var bucketKey=hashingFunction(key);
var bucket=getBucketForHash(bucketsByHash, bucketKey);
return bucket ? bucket.containsKey(key):false;
};
this.containsValue=function(value){
checkValue(value);
var i=buckets.length;
while (i--){
if(buckets[i].containsValue(value)){
return true;
}}
return false;
};
this.clear=function(){
buckets.length=0;
bucketsByHash={};};
this.isEmpty=function(){
return !buckets.length;
};
var createBucketAggregator=function(bucketFuncName){
return function(){
var aggregated=[], i=buckets.length;
while (i--){
buckets[i][bucketFuncName](aggregated);
}
return aggregated;
};};
this.keys=createBucketAggregator("keys");
this.values=createBucketAggregator("values");
this.entries=createBucketAggregator("getEntries");
this.remove=function(key){
checkKey(key);
var hash=hashingFunction(key), bucketIndex, oldValue=null;
var bucket=getBucketForHash(bucketsByHash, hash);
if(bucket){
oldValue=bucket.removeEntryForKey(key);
if(oldValue!==null){
if(!bucket.entries.length){
bucketIndex=searchBuckets(buckets, hash);
arrayRemoveAt(buckets, bucketIndex);
delete bucketsByHash[hash];
}}
}
return oldValue;
};
this.size=function(){
var total=0, i=buckets.length;
while (i--){
total +=buckets[i].entries.length;
}
return total;
};
this.each=function(callback){
var entries=that.entries(), i=entries.length, entry;
while (i--){
entry=entries[i];
callback(entry[0], entry[1]);
}};
this.putAll=function(hashtable, conflictCallback){
var entries=hashtable.entries();
var entry, key, value, thisValue, i=entries.length;
var hasConflictCallback=(typeof conflictCallback==FUNCTION);
while (i--){
entry=entries[i];
key=entry[0];
value=entry[1];
if(hasConflictCallback&&(thisValue=that.get(key))){
value=conflictCallback(key, thisValue, value);
}
that.put(key, value);
}};
this.clone=function(){
var clone=new Hashtable(hashingFunctionParam, equalityFunctionParam);
clone.putAll(that);
return clone;
};}
return Hashtable;
})();
/**
* jquery.numberformatter - Formatting/Parsing Numbers in jQuery
*
* Written by
* Michael Abernethy (mike@abernethysoft.com),
* Andrew Parry (aparry0@gmail.com)
*
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*
* @author Michael Abernethy, Andrew Parry
* @version 1.2.3-SNAPSHOT ($Id$)
*
* Dependencies
*
* jQuery (http://jquery.com)
* jshashtable (http://www.timdown.co.uk/jshashtable)
*
* Notes & Thanks
*
* many thanks to advweb.nanasi.jp for his bug fixes
* jsHashtable is now used also, so thanks to the author for that excellent little class.
*
* This plugin can be used to format numbers as text and parse text as Numbers
* Because we live in an international world, we cannot assume that everyone
* uses "," to divide thousands, and "." as a decimal point.
*
* As of 1.2 the way this plugin works has changed slightly, parsing text to a number
* has 1 set of functions, formatting a number to text has it's own. Before things
* were a little confusing, so I wanted to separate the 2 out more.
*
*
* jQuery extension functions:
*
* formatNumber(options, writeBack, giveReturnValue) - Reads the value from the subject, parses to
* a Javascript Number object, then formats back to text using the passed options and write back to
* the subject.
*
* parseNumber(options) - Parses the value in the subject to a Number object using the passed options
* to decipher the actual number from the text, then writes the value as text back to the subject.
*
*
* Generic functions:
*
* formatNumber(numberString, options) - Takes a plain number as a string (e.g. '1002.0123') and returns
* a string of the given format options.
*
* parseNumber(numberString, options) - Takes a number as text that is formatted the same as the given
* options then and returns it as a plain Number object.
*
* To achieve the old way of combining parsing and formatting to keep say a input field always formatted
* to a given format after it has lost focus you'd simply use a combination of the functions.
*
* e.g.
* $("#salary").blur(function(){
* 		$(this).parseNumber({format:"#,###.00", locale:"us"});
* 		$(this).formatNumber({format:"#,###.00", locale:"us"});
* });
*
* The syntax for the formatting is:
* 0=Digit
* #=Digit, zero shows as absent
* .=Decimal separator
* -=Negative sign
* ,=Grouping Separator
* %=Percent (multiplies the number by 100)
*
* For example, a format of "#,###.00" and text of 4500.20 will
* display as "4.500,20" with a locale of "de", and "4,500.20" with a locale of "us"
*
*
* As of now, the only acceptable locales are
* Arab Emirates -> "ae"
* Australia -> "au"
* Austria -> "at"
* Brazil -> "br"
* Canada -> "ca"
* China -> "cn"
* Czech -> "cz"
* Denmark -> "dk"
* Egypt -> "eg"
* Finland -> "fi"
* France  -> "fr"
* Germany -> "de"
* Greece -> "gr"
* Great Britain -> "gb"
* Hong Kong -> "hk"
* India -> "in"
* Israel -> "il"
* Japan -> "jp"
* Russia -> "ru"
* South Korea -> "kr"
* Spain -> "es"
* Sweden -> "se"
* Switzerland -> "ch"
* Taiwan -> "tw"
* Thailand -> "th"
* United States -> "us"
* Vietnam -> "vn"
**/
(function(jQuery){
var nfLocales=new Hashtable();
var nfLocalesLikeUS=[ 'ae','au','ca','cn','eg','gb','hk','il','in','jp','sk','th','tw','us' ];
var nfLocalesLikeDE=[ 'at','br','de','dk','es','gr','it','nl','pt','tr','vn' ];
var nfLocalesLikeFR=[ 'cz','fi','fr','ru','se','pl' ];
var nfLocalesLikeCH=[ 'ch' ];
var nfLocaleFormatting=[ [".", ","], [",", "."], [",", " "], [".", "'"] ];
var nfAllLocales=[ nfLocalesLikeUS, nfLocalesLikeDE, nfLocalesLikeFR, nfLocalesLikeCH ]
function FormatData(dec, group, neg){
this.dec=dec;
this.group=group;
this.neg=neg;
};
function init(){
for (var localeGroupIdx=0; localeGroupIdx < nfAllLocales.length; localeGroupIdx++){
localeGroup=nfAllLocales[localeGroupIdx];
for (var i=0; i < localeGroup.length; i++){
nfLocales.put(localeGroup[i], localeGroupIdx);
}}
};
function formatCodes(locale, isFullLocale){
if(nfLocales.size()==0)
init();
var dec=".";
var group=",";
var neg="-";
if(isFullLocale==false){
if(locale.indexOf('_')!=-1)
locale=locale.split('_')[1].toLowerCase();
else if(locale.indexOf('-')!=-1)
locale=locale.split('-')[1].toLowerCase();
}
var codesIndex=nfLocales.get(locale);
if(codesIndex){
var codes=nfLocaleFormatting[codesIndex];
if(codes){
dec=codes[0];
group=codes[1];
}}
return new FormatData(dec, group, neg);
};
jQuery.fn.formatNumber=function(options, writeBack, giveReturnValue){
return this.each(function(){
if(writeBack==null)
writeBack=true;
if(giveReturnValue==null)
giveReturnValue=true;
var text;
if(jQuery(this).is(":input"))
text=new String(jQuery(this).val());
else
text=new String(jQuery(this).text());
var returnString=jQuery.formatNumber(text, options);
if(writeBack){
if(jQuery(this).is(":input"))
jQuery(this).val(returnString);
else
jQuery(this).text(returnString);
}
if(giveReturnValue)
return returnString;
});
};
jQuery.formatNumber=function(numberString, options){
var options=jQuery.extend({}, jQuery.fn.formatNumber.defaults, options);
var formatData=formatCodes(options.locale.toLowerCase(), options.isFullLocale);
var dec=formatData.dec;
var group=formatData.group;
var neg=formatData.neg;
var validFormat="0#-,.";
var prefix="";
var negativeInFront=false;
for (var i=0; i < options.format.length; i++){
if(validFormat.indexOf(options.format.charAt(i))==-1)
prefix=prefix + options.format.charAt(i);
else
if(i==0&&options.format.charAt(i)=='-'){
negativeInFront=true;
continue;
}
else
break;
}
var suffix="";
for (var i=options.format.length - 1; i >=0; i--){
if(validFormat.indexOf(options.format.charAt(i))==-1)
suffix=options.format.charAt(i) + suffix;
else
break;
}
options.format=options.format.substring(prefix.length);
options.format=options.format.substring(0, options.format.length - suffix.length);
var number=new Number(numberString);
return jQuery._formatNumber(number, options, suffix, prefix, negativeInFront);
};
jQuery._formatNumber=function(number, options, suffix, prefix, negativeInFront){
var options=jQuery.extend({}, jQuery.fn.formatNumber.defaults, options);
var formatData=formatCodes(options.locale.toLowerCase(), options.isFullLocale);
var dec=formatData.dec;
var group=formatData.group;
var neg=formatData.neg;
var forcedToZero=false;
if(isNaN(number)){
if(options.nanForceZero==true){
number=0;
forcedToZero=true;
} else
return null;
}
if(suffix=="%")
number=number * 100;
var returnString="";
if(options.format.indexOf(".") > -1){
var decimalPortion=dec;
var decimalFormat=options.format.substring(options.format.lastIndexOf(".") + 1);
if(options.round==true)
number=new Number(number.toFixed(decimalFormat.length));
else {
var numStr=number.toString();
numStr=numStr.substring(0, numStr.lastIndexOf('.') + decimalFormat.length + 1);
number=new Number(numStr);
}
var decimalValue=number % 1;
var decimalString=new String(decimalValue.toFixed(decimalFormat.length));
decimalString=decimalString.substring(decimalString.lastIndexOf(".") + 1);
for (var i=0; i < decimalFormat.length; i++){
if(decimalFormat.charAt(i)=='#'&&decimalString.charAt(i)!='0'){
decimalPortion +=decimalString.charAt(i);
continue;
}else if(decimalFormat.charAt(i)=='#'&&decimalString.charAt(i)=='0'){
var notParsed=decimalString.substring(i);
if(notParsed.match('[1-9]')){
decimalPortion +=decimalString.charAt(i);
continue;
} else
break;
}else if(decimalFormat.charAt(i)=="0")
decimalPortion +=decimalString.charAt(i);
}
returnString +=decimalPortion
} else
number=Math.round(number);
var ones=Math.floor(number);
if(number < 0)
ones=Math.ceil(number);
var onesFormat="";
if(options.format.indexOf(".")==-1)
onesFormat=options.format;
else
onesFormat=options.format.substring(0, options.format.indexOf("."));
var onePortion="";
if(!(ones==0&&onesFormat.substr(onesFormat.length - 1)=='#')||forcedToZero){
var oneText=new String(Math.abs(ones));
var groupLength=9999;
if(onesFormat.lastIndexOf(",")!=-1)
groupLength=onesFormat.length - onesFormat.lastIndexOf(",") - 1;
var groupCount=0;
for (var i=oneText.length - 1; i > -1; i--){
onePortion=oneText.charAt(i) + onePortion;
groupCount++;
if(groupCount==groupLength&&i!=0){
onePortion=group + onePortion;
groupCount=0;
}}
if(onesFormat.length > onePortion.length){
var padStart=onesFormat.indexOf('0');
if(padStart!=-1){
var padLen=onesFormat.length - padStart;
var pos=onesFormat.length - onePortion.length - 1;
while (onePortion.length < padLen){
var padChar=onesFormat.charAt(pos);
if(padChar==',')
padChar=group;
onePortion=padChar + onePortion;
pos--;
}}
}}
if(!onePortion&&onesFormat.indexOf('0', onesFormat.length - 1)!==-1)
onePortion='0';
returnString=onePortion + returnString;
if(number < 0&&negativeInFront&&prefix.length > 0)
prefix=neg + prefix;
else if(number < 0)
returnString=neg + returnString;
if(!options.decimalSeparatorAlwaysShown){
if(returnString.lastIndexOf(dec)==returnString.length - 1){
returnString=returnString.substring(0, returnString.length - 1);
}}
returnString=prefix + returnString + suffix;
return returnString;
};
jQuery.fn.parseNumber=function(options, writeBack, giveReturnValue){
if(writeBack==null)
writeBack=true;
if(giveReturnValue==null)
giveReturnValue=true;
var text;
if(jQuery(this).is(":input"))
text=new String(jQuery(this).val());
else
text=new String(jQuery(this).text());
var number=jQuery.parseNumber(text, options);
if(number){
if(writeBack){
if(jQuery(this).is(":input"))
jQuery(this).val(number.toString());
else
jQuery(this).text(number.toString());
}
if(giveReturnValue)
return number;
}};
jQuery.parseNumber=function(numberString, options){
var options=jQuery.extend({}, jQuery.fn.parseNumber.defaults, options);
var formatData=formatCodes(options.locale.toLowerCase(), options.isFullLocale);
var dec=formatData.dec;
var group=formatData.group;
var neg=formatData.neg;
var valid="1234567890.-";
while (numberString.indexOf(group)>-1)
numberString=numberString.replace(group,'');
numberString=numberString.replace(dec,".").replace(neg,"-");
var validText="";
var hasPercent=false;
if(numberString.charAt(numberString.length - 1)=="%"||options.isPercentage==true)
hasPercent=true;
for (var i=0; i<numberString.length; i++){
if(valid.indexOf(numberString.charAt(i))>-1)
validText=validText + numberString.charAt(i);
}
var number=new Number(validText);
if(hasPercent){
number=number / 100;
var decimalPos=validText.indexOf('.');
if(decimalPos!=-1){
var decimalPoints=validText.length - decimalPos - 1;
number=number.toFixed(decimalPoints + 2);
}else{
number=number.toFixed(validText.length - 1);
}}
return number;
};
jQuery.fn.parseNumber.defaults={
locale: "us",
decimalSeparatorAlwaysShown: false,
isPercentage: false,
isFullLocale: false
};
jQuery.fn.formatNumber.defaults={
format: "#,###.00",
locale: "us",
decimalSeparatorAlwaysShown: false,
nanForceZero: true,
round: true,
isFullLocale: false
};
Number.prototype.toFixed=function(precision){
return jQuery._roundNumber(this, precision);
};
jQuery._roundNumber=function(number, decimalPlaces){
var power=Math.pow(10, decimalPlaces||0);
var value=String(Math.round(number * power) / power);
if(decimalPlaces > 0){
var dp=value.indexOf(".");
if(dp==-1){
value +='.';
dp=0;
}else{
dp=value.length - (dp + 1);
}
while (dp < decimalPlaces){
value +='0';
dp++;
}}
return value;
};})(jQuery);
(function(){
var cache={};
this.tmpl=function tmpl(str, data){
var fn = !/\W/.test(str) ?
cache[str]=cache[str] ||
tmpl(document.getElementById(str).innerHTML) :
new Function("obj",
"var p=[],print=function(){p.push.apply(p,arguments);};" +
"with(obj){p.push('" +
str
.replace(/[\r\t\n]/g, " ")
.split("<%").join("\t")
.replace(/((^|%>)[^\t]*)'/g, "$1\r")
.replace(/\t=(.*?)%>/g, "',$1,'")
.split("\t").join("');")
.split("%>").join("p.push('")
.split("\r").join("\\'")
+ "');}return p.join('');");
return data ? fn(data):fn;
};})();
(function($){
$.baseClass=function(obj){
obj=$(obj);
return obj.get(0).className.match(/([^ ]+)/)[1];
};
$.fn.addDependClass=function(className, delimiter){
var options={
delimiter: delimiter ? delimiter:'-'
}
return this.each(function(){
var baseClass=$.baseClass(this);
if(baseClass)
$(this).addClass(baseClass + options.delimiter + className);
});
};
$.fn.removeDependClass=function(className, delimiter){
var options={
delimiter: delimiter ? delimiter:'-'
}
return this.each(function(){
var baseClass=$.baseClass(this);
if(baseClass)
$(this).removeClass(baseClass + options.delimiter + className);
});
};
$.fn.toggleDependClass=function(className, delimiter){
var options={
delimiter: delimiter ? delimiter:'-'
}
return this.each(function(){
var baseClass=$.baseClass(this);
if(baseClass)
if($(this).is("." + baseClass + options.delimiter + className))
$(this).removeClass(baseClass + options.delimiter + className);
else
$(this).addClass(baseClass + options.delimiter + className);
});
};})(jQuery);
(function($){
function Draggable(){
this._init.apply(this, arguments);
};
Draggable.prototype.oninit=function(){
};
Draggable.prototype.events=function(){
};
Draggable.prototype.onmousedown=function(){
this.ptr.css({ position: "absolute" });
};
Draggable.prototype.onmousemove=function(evt, x, y){
this.ptr.css({ left: x, top: y });
};
Draggable.prototype.onmouseup=function(){
};
Draggable.prototype.isDefault={
drag: false,
clicked: false,
toclick: true,
mouseup: false
};
Draggable.prototype._init=function(){
if(arguments.length > 0){
this.ptr=$(arguments[0]);
this.outer=$(".draggable-outer");
this.is={};
$.extend(this.is, this.isDefault);
var _offset=this.ptr.offset();
this.d={
left: _offset.left,
top: _offset.top,
width: this.ptr.width(),
height: this.ptr.height()
};
this.oninit.apply(this, arguments);
this._events();
}};
Draggable.prototype._getPageCoords=function(event){
if(event.targetTouches&&event.targetTouches[0]){
return { x: event.targetTouches[0].pageX, y: event.targetTouches[0].pageY };} else
return { x: event.pageX, y: event.pageY };};
Draggable.prototype._bindEvent=function(ptr, eventType, handler){
var self=this;
if(this.supportTouches_)
ptr.get(0).addEventListener(this.events_[ eventType ], handler, false);
else
ptr.bind(this.events_[ eventType ], handler);
};
Draggable.prototype._events=function(){
var self=this;
this.supportTouches_=($.browser.webkit&&navigator.userAgent.indexOf("Mobile")!=-1);
this.events_={
"click": this.supportTouches_ ? "touchstart":"click",
"down": this.supportTouches_ ? "touchstart":"mousedown",
"move": this.supportTouches_ ? "touchmove":"mousemove",
"up":this.supportTouches_ ? "touchend":"mouseup"
};
this._bindEvent($(document), "move", function(event){
if(self.is.drag){
event.stopPropagation();
event.preventDefault();
self._mousemove(event);
}});
this._bindEvent($(document), "down", function(event){
if(self.is.drag){
event.stopPropagation();
event.preventDefault();
}});
this._bindEvent($(document), "up", function(event){
self._mouseup(event);
});
this._bindEvent(this.ptr, "down", function(event){
self._mousedown(event);
return false;
});
this._bindEvent(this.ptr, "up", function(event){
self._mouseup(event);
});
this.ptr.find("a")
.click(function(){
self.is.clicked=true;
if(!self.is.toclick){
self.is.toclick=true;
return false;
}})
.mousedown(function(event){
self._mousedown(event);
return false;
});
this.events();
};
Draggable.prototype._mousedown=function(evt){
this.is.drag=true;
this.is.clicked=false;
this.is.mouseup=false;
var _offset=this.ptr.offset();
var coords=this._getPageCoords(evt);
this.cx=coords.x - _offset.left;
this.cy=coords.y - _offset.top;
$.extend(this.d, {
left: _offset.left,
top: _offset.top,
width: this.ptr.width(),
height: this.ptr.height()
});
if(this.outer&&this.outer.get(0)){
this.outer.css({ height: Math.max(this.outer.height(), $(document.body).height()), overflow: "hidden" });
}
this.onmousedown(evt);
};
Draggable.prototype._mousemove=function(evt){
this.is.toclick=false;
var coords=this._getPageCoords(evt);
this.onmousemove(evt, coords.x - this.cx, coords.y - this.cy);
};
Draggable.prototype._mouseup=function(evt){
var oThis=this;
if(this.is.drag){
this.is.drag=false;
if(this.outer&&this.outer.get(0)){
if($.browser.mozilla){
this.outer.css({ overflow: "hidden" });
}else{
this.outer.css({ overflow: "visible" });
}
if($.browser.msie&&$.browser.version=='6.0'){
this.outer.css({ height: "100%" });
}else{
this.outer.css({ height: "auto" });
}}
this.onmouseup(evt);
}};
window.Draggable=Draggable;
})(jQuery);
(function($){
function isArray(value){
if(typeof value=="undefined") return false;
if(value instanceof Array||(!(value instanceof Object) &&
(Object.prototype.toString.call((value))=='[object Array]') ||
typeof value.length=='number' &&
typeof value.splice!='undefined' &&
typeof value.propertyIsEnumerable!='undefined' &&
!value.propertyIsEnumerable('splice')
)){
return true;
}
return false;
}
$.slider=function(node, settings){
var jNode=$(node);
if(!jNode.data("jslider") )
jNode.data("jslider", new jSlider(node, settings) );
return jNode.data("jslider");
};
$.fn.slider=function(action, opt_value){
var returnValue, args=arguments;
function isDef(val){
return val!==undefined;
};
function isDefAndNotNull(val){
return val!=null;
};
this.each(function(){
var self=$.slider(this, action);
if(typeof action=="string"){
switch(action){
case "value":
if(isDef(args[ 1 ])&&isDef(args[ 2 ]) ){
var pointers=self.getPointers();
if(isDefAndNotNull(pointers[0])&&isDefAndNotNull(args[1]) ){
pointers[0].set(args[ 1 ]);
pointers[0].setIndexOver();
}
if(isDefAndNotNull(pointers[1])&&isDefAndNotNull(args[2]) ){
pointers[1].set(args[ 2 ]);
pointers[1].setIndexOver();
}}
else if(isDef(args[ 1 ]) ){
var pointers=self.getPointers();
if(isDefAndNotNull(pointers[0])&&isDefAndNotNull(args[1]) ){
pointers[0].set(args[ 1 ]);
pointers[0].setIndexOver();
}}
else
returnValue=self.getValue();
break;
case "prc":
if(isDef(args[ 1 ])&&isDef(args[ 2 ]) ){
var pointers=self.getPointers();
if(isDefAndNotNull(pointers[0])&&isDefAndNotNull(args[1]) ){
pointers[0]._set(args[ 1 ]);
pointers[0].setIndexOver();
}
if(isDefAndNotNull(pointers[1])&&isDefAndNotNull(args[2]) ){
pointers[1]._set(args[ 2 ]);
pointers[1].setIndexOver();
}}
else if(isDef(args[ 1 ]) ){
var pointers=self.getPointers();
if(isDefAndNotNull(pointers[0])&&isDefAndNotNull(args[1]) ){
pointers[0]._set(args[ 1 ]);
pointers[0].setIndexOver();
}}
else
returnValue=self.getPrcValue();
break;
case "calculatedValue":
var value=self.getValue().split(";");
returnValue="";
for (var i=0; i < value.length; i++){
returnValue +=(i > 0 ? ";":"") + self.nice(value[i]);
};
break;
case "skin":
self.setSkin(args[1]);
break;
};}
else if(!action&&!opt_value){
if(!isArray(returnValue) )
returnValue=[];
returnValue.push(self);
}});
if(isArray(returnValue)&&returnValue.length==1)
returnValue=returnValue[ 0 ];
return returnValue||this;
};
var OPTIONS={
settings: {
from: 1,
to: 10,
step: 1,
smooth: true,
limits: true,
round: 0,
format: { format: "#,##0.##" },
value: "5;7",
dimension: ""
},
className: "jslider",
selector: ".jslider-",
template: tmpl(
'<span class="<%=className%>">' +
'<table><tr><td>' +
'<div class="<%=className%>-bg">' +
'<i class="l"></i><i class="r"></i>' +
'<i class="v"></i>' +
'</div>' +
'<div class="<%=className%>-pointer"></div>' +
'<div class="<%=className%>-pointer <%=className%>-pointer-to"></div>' +
'<div class="<%=className%>-label"><span><%=settings.from%></span></div>' +
'<div class="<%=className%>-label <%=className%>-label-to"><span><%=settings.to%></span><%=settings.dimension%></div>' +
'<div class="<%=className%>-value"><span></span><%=settings.dimension%></div>' +
'<div class="<%=className%>-value <%=className%>-value-to"><span></span><%=settings.dimension%></div>' +
'<div class="<%=className%>-scale"><%=scale%></div>'+
'</td></tr></table>' +
'</span>'
)
};
function jSlider(){
return this.init.apply(this, arguments);
};
jSlider.prototype.init=function(node, settings){
this.settings=$.extend(true, {}, OPTIONS.settings, settings ? settings:{});
this.inputNode=$(node).hide();
this.settings.interval=this.settings.to-this.settings.from;
this.settings.value=this.inputNode.attr("value");
if(this.settings.calculate&&$.isFunction(this.settings.calculate) )
this.nice=this.settings.calculate;
if(this.settings.onstatechange&&$.isFunction(this.settings.onstatechange) )
this.onstatechange=this.settings.onstatechange;
this.is={
init: false
};
this.o={};
this.create();
};
jSlider.prototype.onstatechange=function(){
};
jSlider.prototype.create=function(){
var $this=this;
this.domNode=$(OPTIONS.template({
className: OPTIONS.className,
settings: {
from: this.nice(this.settings.from),
to: this.nice(this.settings.to),
dimension: this.settings.dimension
},
scale: this.generateScale()
}));
this.inputNode.after(this.domNode);
this.drawScale();
if(this.settings.skin&&this.settings.skin.length > 0)
this.setSkin(this.settings.skin);
this.sizes={
domWidth: this.domNode.width(),
domOffset: this.domNode.offset()
};
$.extend(this.o, {
pointers: {},
labels: {
0: {
o: this.domNode.find(OPTIONS.selector + "value").not(OPTIONS.selector + "value-to")
},
1: {
o: this.domNode.find(OPTIONS.selector + "value").filter(OPTIONS.selector + "value-to")
}},
limits: {
0: this.domNode.find(OPTIONS.selector + "label").not(OPTIONS.selector + "label-to"),
1: this.domNode.find(OPTIONS.selector + "label").filter(OPTIONS.selector + "label-to")
}});
$.extend(this.o.labels[0], {
value: this.o.labels[0].o.find("span")
});
$.extend(this.o.labels[1], {
value: this.o.labels[1].o.find("span")
});
if(!$this.settings.value.split(";")[1]){
this.settings.single=true;
this.domNode.addDependClass("single");
}
if(!$this.settings.limits)
this.domNode.addDependClass("limitless");
this.domNode.find(OPTIONS.selector + "pointer").each(function(i){
var value=$this.settings.value.split(";")[i];
if(value){
$this.o.pointers[i]=new jSliderPointer(this, i, $this);
var prev=$this.settings.value.split(";")[i-1];
if(prev&&new Number(value) < new Number(prev)) value=prev;
value=value < $this.settings.from ? $this.settings.from:value;
value=value > $this.settings.to ? $this.settings.to:value;
$this.o.pointers[i].set(value, true);
}});
this.o.value=this.domNode.find(".v");
this.is.init=true;
$.each(this.o.pointers, function(i){
$this.redraw(this);
});
(function(self){
$(window).resize(function(){
self.onresize();
});
})(this);
};
jSlider.prototype.setSkin=function(skin){
if(this.skin_)
this.domNode.removeDependClass(this.skin_, "_");
this.domNode.addDependClass(this.skin_=skin, "_");
};
jSlider.prototype.setPointersIndex=function(i){
$.each(this.getPointers(), function(i){
this.index(i);
});
};
jSlider.prototype.getPointers=function(){
return this.o.pointers;
};
jSlider.prototype.generateScale=function(){
if(this.settings.scale&&this.settings.scale.length > 0){
var str="";
var s=this.settings.scale;
var prc=Math.round((100/(s.length-1))*10)/10;
for(var i=0; i < s.length; i++){
str +='<span style="left: ' + i*prc + '%">' +(s[i]!='|' ? '<ins>' + s[i] + '</ins>':'') + '</span>';
};
return str;
} else return "";
return "";
};
jSlider.prototype.drawScale=function(){
this.domNode.find(OPTIONS.selector + "scale span ins").each(function(){
$(this).css({ marginLeft: -$(this).outerWidth()/2 });
});
};
jSlider.prototype.onresize=function(){
var self=this;
this.sizes={
domWidth: this.domNode.width(),
domOffset: this.domNode.offset()
};
$.each(this.o.pointers, function(i){
self.redraw(this);
});
};
jSlider.prototype.update=function(){
this.onresize();
this.drawScale();
};
jSlider.prototype.limits=function(x, pointer){
if(!this.settings.smooth){
var step=this.settings.step*100 /(this.settings.interval);
x=Math.round(x/step) * step;
}
var another=this.o.pointers[1-pointer.uid];
if(another&&pointer.uid&&x < another.value.prc) x=another.value.prc;
if(another&&!pointer.uid&&x > another.value.prc) x=another.value.prc;
if(x < 0) x=0;
if(x > 100) x=100;
return Math.round(x*10) / 10;
};
jSlider.prototype.redraw=function(pointer){
if(!this.is.init) return false;
this.setValue();
if(this.o.pointers[0]&&this.o.pointers[1])
this.o.value.css({ left: this.o.pointers[0].value.prc + "%", width:(this.o.pointers[1].value.prc - this.o.pointers[0].value.prc) + "%" });
this.o.labels[pointer.uid].value.html(this.nice(pointer.value.origin
)
);
this.redrawLabels(pointer);
};
jSlider.prototype.redrawLabels=function(pointer){
function setPosition(label, sizes, prc){
sizes.margin=-sizes.label/2;
label_left=sizes.border + sizes.margin;
if(label_left < 0)
sizes.margin -=label_left;
if(sizes.border+sizes.label / 2 > self.sizes.domWidth){
sizes.margin=0;
sizes.right=true;
} else
sizes.right=false;
label.o.css({ left: prc + "%", marginLeft: sizes.margin, right: "auto" });
if(sizes.right) label.o.css({ left: "auto", right: 0 });
return sizes;
}
var self=this;
var label=this.o.labels[pointer.uid];
var prc=pointer.value.prc;
var sizes={
label: label.o.outerWidth(),
right: false,
border:(prc * this.sizes.domWidth) / 100
};
if(!this.settings.single){
var another=this.o.pointers[1-pointer.uid];
var another_label=this.o.labels[another.uid];
switch(pointer.uid){
case 0:
if(sizes.border+sizes.label / 2 > another_label.o.offset().left-this.sizes.domOffset.left){
another_label.o.css({ visibility: "hidden" });
another_label.value.html(this.nice(another.value.origin) );
label.o.css({ visibility: "visible" });
prc=(another.value.prc - prc) / 2 + prc;
if(another.value.prc!=pointer.value.prc){
label.value.html(this.nice(pointer.value.origin) + "&nbsp;&ndash;&nbsp;" + this.nice(another.value.origin));
sizes.label=label.o.outerWidth();
sizes.border=(prc * this.sizes.domWidth) / 100;
}}else{
another_label.o.css({ visibility: "visible" });
}
break;
case 1:
if(sizes.border - sizes.label / 2 < another_label.o.offset().left - this.sizes.domOffset.left + another_label.o.outerWidth()){
another_label.o.css({ visibility: "hidden" });
another_label.value.html(this.nice(another.value.origin));
label.o.css({ visibility: "visible" });
prc=(prc - another.value.prc) / 2 + another.value.prc;
if(another.value.prc!=pointer.value.prc){
label.value.html(this.nice(another.value.origin) + "&nbsp;&ndash;&nbsp;" + this.nice(pointer.value.origin));
sizes.label=label.o.outerWidth();
sizes.border=(prc * this.sizes.domWidth) / 100;
}}else{
another_label.o.css({ visibility: "visible" });
}
break;
}}
sizes=setPosition(label, sizes, prc);
if(another_label){
var sizes={
label: another_label.o.outerWidth(),
right: false,
border:(another.value.prc * this.sizes.domWidth) / 100
};
sizes=setPosition(another_label, sizes, another.value.prc);
}
this.redrawLimits();
};
jSlider.prototype.redrawLimits=function(){
if(this.settings.limits){
var limits=[ true, true ];
for(key in this.o.pointers){
if(!this.settings.single||key==0){
var pointer=this.o.pointers[key];
var label=this.o.labels[pointer.uid];
var label_left=label.o.offset().left - this.sizes.domOffset.left;
var limit=this.o.limits[0];
if(label_left < limit.outerWidth())
limits[0]=false;
var limit=this.o.limits[1];
if(label_left + label.o.outerWidth() > this.sizes.domWidth - limit.outerWidth())
limits[1]=false;
}};
for(var i=0; i < limits.length; i++){
if(limits[i])
this.o.limits[i].fadeIn("fast");
else
this.o.limits[i].fadeOut("fast");
};}};
jSlider.prototype.setValue=function(){
var value=this.getValue();
this.inputNode.attr("value", value);
this.onstatechange.call(this, value);
};
jSlider.prototype.getValue=function(){
if(!this.is.init) return false;
var $this=this;
var value="";
$.each(this.o.pointers, function(i){
if(this.value.prc!=undefined&&!isNaN(this.value.prc)) value +=(i > 0 ? ";":"") + $this.prcToValue(this.value.prc);
});
return value;
};
jSlider.prototype.getPrcValue=function(){
if(!this.is.init) return false;
var $this=this;
var value="";
$.each(this.o.pointers, function(i){
if(this.value.prc!=undefined&&!isNaN(this.value.prc)) value +=(i > 0 ? ";":"") + this.value.prc;
});
return value;
};
jSlider.prototype.prcToValue=function(prc){
if(this.settings.heterogeneity&&this.settings.heterogeneity.length > 0){
var h=this.settings.heterogeneity;
var _start=0;
var _from=this.settings.from;
for(var i=0; i <=h.length; i++){
if(h[i]) var v=h[i].split("/");
else       var v=[100, this.settings.to];
v[0]=new Number(v[0]);
v[1]=new Number(v[1]);
if(prc >=_start&&prc <=v[0]){
var value=_from +((prc-_start) * (v[1]-_from)) / (v[0]-_start);
}
_start=v[0];
_from=v[1];
};}else{
var value=this.settings.from +(prc * this.settings.interval) / 100;
}
return this.round(value);
};
jSlider.prototype.valueToPrc=function(value, pointer){
if(this.settings.heterogeneity&&this.settings.heterogeneity.length > 0){
var h=this.settings.heterogeneity;
var _start=0;
var _from=this.settings.from;
for (var i=0; i <=h.length; i++){
if(h[i]) var v=h[i].split("/");
else     var v=[100, this.settings.to];
v[0]=new Number(v[0]); v[1]=new Number(v[1]);
if(value >=_from&&value <=v[1]){
var prc=pointer.limits(_start + (value-_from)*(v[0]-_start)/(v[1]-_from));
}
_start=v[0]; _from=v[1];
};}else{
var prc=pointer.limits((value-this.settings.from)*100/this.settings.interval);
}
return prc;
};
jSlider.prototype.round=function(value){
value=Math.round(value / this.settings.step) * this.settings.step;
if(this.settings.round) value=Math.round(value * Math.pow(10, this.settings.round)) / Math.pow(10, this.settings.round);
else value=Math.round(value);
return value;
};
jSlider.prototype.nice=function(value){
value=value.toString().replace(/,/gi, ".").replace(/ /gi, "");;
if($.formatNumber){
return $.formatNumber(new Number(value), this.settings.format||{}).replace(/-/gi, "&minus;");
}else{
return new Number(value);
}};
function jSliderPointer(){
Draggable.apply(this, arguments);
}
jSliderPointer.prototype=new Draggable();
jSliderPointer.prototype.oninit=function(ptr, id, _constructor){
this.uid=id;
this.parent=_constructor;
this.value={};
this.settings=this.parent.settings;
};
jSliderPointer.prototype.onmousedown=function(evt){
this._parent={
offset: this.parent.domNode.offset(),
width: this.parent.domNode.width()
};
this.ptr.addDependClass("hover");
this.setIndexOver();
};
jSliderPointer.prototype.onmousemove=function(evt, x){
var coords=this._getPageCoords(evt);
this._set(this.calc(coords.x) );
};
jSliderPointer.prototype.onmouseup=function(evt){
if(this.parent.settings.callback&&$.isFunction(this.parent.settings.callback))
this.parent.settings.callback.call(this.parent, this.parent.getValue());
this.ptr.removeDependClass("hover");
};
jSliderPointer.prototype.setIndexOver=function(){
this.parent.setPointersIndex(1);
this.index(2);
};
jSliderPointer.prototype.index=function(i){
this.ptr.css({ zIndex: i });
};
jSliderPointer.prototype.limits=function(x){
return this.parent.limits(x, this);
};
jSliderPointer.prototype.calc=function(coords){
var x=this.limits(((coords-this._parent.offset.left)*100)/this._parent.width);
return x;
};
jSliderPointer.prototype.set=function(value, opt_origin){
this.value.origin=this.parent.round(value);
this._set(this.parent.valueToPrc(value, this), opt_origin);
};
jSliderPointer.prototype._set=function(prc, opt_origin){
if(!opt_origin)
this.value.origin=this.parent.prcToValue(prc);
this.value.prc=prc;
this.ptr.css({ left: prc + "%" });
this.parent.redraw(this);
};})(jQuery);
var group_color=[ "", "#FED27B", "#F68026", "#159680", "#798CD8", "#9FA3A6", "#FFCCCC", "#FF9999", "#99CCFF", "#92D050", "#DAEEF3", "#CCC0DA", "#FFFF99", "#FCD5B4", "#8DB4E2", "#D9D9D9", "#62E41A", "#CC66FF"];
var products=[
{ model: "UPT-SMT2/200", op: 2, minf: 30, maxf: 200, group: 10, title: "UltraHeat S2 Series", info: "• Output power 2 kW<br>• Frequency 30 – 200 kHz<br><br>Ideal for heat treating, bonding, annealing, hardening, brazing, sealing, and more…", img: "/wp-content/selector-images/S2-power_selector.jpg", link:"/induction-products/induction-heating-power-supplies/ultraheat-s-series/" },
{ model: "UPT-SHT2/400", op: 2, minf: 100, maxf: 400, group: 10, title: "UltraHeat S2 Series", info: "• Output power 2 kW<br>• Frequency 100 – 400 kHz<br><br>Ideal for heat treating, bonding, annealing, hardening, brazing, sealing, and more…", img: "/wp-content/selector-images/S2-power_selector.jpg", link:"/induction-products/induction-heating-power-supplies/ultraheat-s-series/" },
{ model: "UPT-SBT3/1200", op: 3, minf: 700, maxf: 1200, group: 12, title: "UltraHeat SBT", info: "• Output power 3 kW<br>• Frequency 700 – 1200 kHz<br><br>Ideal for Brazing and Soldering of small components, Heat Treatment…", img: "/wp-content/selector-images/UltraHeat-SB-selector.jpg", link:"/induction-products/induction-heating-power-supplies/ultraheat-sb-high-frequency-series/"  },
{ model: "UPT-SM4/100", op: 4, minf: 30, maxf: 100, group: 4, title: "UltraHeat S5 Series", info: "• Output power 4 kW<br>• Frequency 30 – 100 kHz<br><br>Ideal for heat treating, bonding, annealing, hardening, brazing, sealing, and more…", img: "/wp-content/selector-images/SM-4_selector.jpg", link:"/induction-products/induction-heating-power-supplies/ultraheat-sm-induction-heating-systems/"  },
{ model: "UPT-SMT5/200", op: 5, minf: 30, maxf: 200, group: 4, title: "UltraHeat S5 Series", info: "• Output power 5 kW<br>• Frequency 30 – 200 kHz<br><br>Ideal for heat treating, bonding, annealing, hardening, brazing, sealing, and more…", img: "/wp-content/selector-images/SM5_selector.jpg", link:"/induction-products/induction-heating-power-supplies/ultraheat-sm-induction-heating-systems/"  },
{ model: "UPT-SHT5/400", op: 5, minf: 100, maxf: 400, group: 4, title: "UltraHeat S5 Series", info: "• Output power 5 kW<br>• Frequency 100 – 400 kHz<br><br>Ideal for heat treating, bonding, annealing, hardening, brazing, sealing, and more…", img: "/wp-content/selector-images/SM5_selector.jpg", link:"/induction-products/induction-heating-power-supplies/ultraheat-sm-induction-heating-systems/"  },
{ model: "UPT-SMT-2A/100", op: 2, minf: 20, maxf: 100, group: 11, title: "UltraHeat S-AIR Series", info: "• Output power 2 kW<br>• Frequency 20 – 100 kHz<br><br>Ideal for sealing, fatigue testing, bonding, curing, shrink fitting, and more…", img: "/wp-content/selector-images/UltraHeat-S-Air_selector.jpg", link:"/induction-products/induction-heating-power-supplies/s-air-series-air-cooled-2-4kw/"  },
{ model: "UPT-SMT-5A/100", op: 4, minf: 20, maxf: 100, group: 11, title: "UltraHeat S-AIR Series", info: "• Output power 4 kW<br>• Frequency 20 – 100 kHz<br><br>Ideal for sealing, fatigue testing, bonding, curing, shrink fitting, and more…", img: "/wp-content/selector-images/UltraHeat-S-Air_selector.jpg", link:"/induction-products/induction-heating-power-supplies/s-air-series-air-cooled-2-4kw/"  },
{ model: "SOLO12/320", op: 12, minf: 32, maxf: 320, group: 14, title: "UltraHeat Solo Series", info: "• Output power 12 kW<br>• Frequency 32 – 320 kHz<br><br>Ideal for heat treating, bonding, annealing, hardening, brazing, sealing, and more…", img: "/wp-content/selector-images/Solo-Systems_selector.jpg", link:"/induction-products/induction-heating-power-supplies/solo-series/" },
{ model: "SOLO16/320", op: 16, minf: 40, maxf: 320, group: 14, title: "UltraHeat Solo Series", info: "• Output power 16 kW<br>• Frequency 40 – 320 kHz<br><br>Ideal for heat treating, bonding, annealing, hardening, brazing, sealing, and more…", img: "/wp-content/selector-images/Solo-Systems_selector.jpg", link:"/induction-products/induction-heating-power-supplies/solo-series/" },
{ model: "SOLO24/150", op: 24, minf: 50, maxf: 150, group: 14, title: "UltraHeat Solo Series", info: "• Output power 20-24 kW<br>• Frequency 50 – 150 kHz<br><br>Ideal for heat treating, bonding, annealing, hardening, brazing, sealing, and more…", img: "/wp-content/selector-images/Solo-Systems_selector.jpg", link:"/induction-products/induction-heating-power-supplies/solo-series/" },
{ model: "SOLO32W/150", op: 32, minf: 25, maxf: 150, group: 14, title: "UltraHeat Solo Series", info: "• Output power 25-32 kW<br>• Frequency 25 (50) – 150 kHz<br><br>Ideal for heat treating, bonding, annealing, hardening, brazing, sealing, and more…", img: "/wp-content/selector-images/Solo-Systems_selector.jpg", link:"/induction-products/induction-heating-power-supplies/solo-series/" },
{ model: "SOLO32L/50", op: 32, minf: 5, maxf: 25, group: 14, title: "UltraHeat Solo Series", info: "• Output power 25-32 kW<br>• Frequency 5 – 25 (50) kHz<br><br>Ideal for heat treating, bonding, annealing, hardening, brazing, sealing, and more…", img: "/wp-content/selector-images/Solo-Systems_selector.jpg", link:"/induction-products/induction-heating-power-supplies/solo-series/" },
{ model: "SOLO-AIR24/30", op: 24, minf: 10, maxf: 30, group: 8, title: "UltraHeat Solo/Air Series", info: "• Output power 24 kW<br>• Frequency 10 – 30 kHz<br><br>Ideal for Curing and Coating, Shrink-Fitting, Susceptor Heating, Preheat and Postheat, Special Induction Heating Applications and more…", img: "/wp-content/selector-images/Solo-Air_selector.jpg", link:"/induction-products/induction-heating-power-supplies/solo-air/" },
{ model: "SOLO-AIR32/30", op: 32, minf: 10, maxf: 30, group: 8, title: "UltraHeat Solo/Air Series", info: "• Output power 32 kW<br>• Frequency 10 – 30 kHz<br><br>Ideal for Curing and Coating, Shrink-Fitting, Susceptor Heating, Preheat and Postheat, Special Induction Heating Applications and more…", img: "/wp-content/selector-images/Solo-Air_selector.jpg", link:"/induction-products/induction-heating-power-supplies/solo-air/" },
{ model: "USP-C-100 | 200", op: 50, minf: 6, maxf: 60, group: 3, title: "SMART POWER", info: "• Configurable power supplies <br> with output from 50kW to 400kW.<br> Frequency ranges <br> from 6kHz to 60kHz <br> and 40kHz to 200kHz. <br> Single or multiple,<br> independently controlled <br> RF outputs from one cabinet.", img: "/wp-content/selector-images/smart-powerselector.jpg", link:"/induction-products/induction-heating-systems/smart-power-systems/" },
{ model: "USP-C-100 | 200", op: 100, minf: 6, maxf: 60, group: 3, title: "SMART POWER", info: "• Configurable power supplies <br> with output from 50kW to 400kW.<br> Frequency ranges <br> from 6kHz to 60kHz <br> and 40kHz to 200kHz. <br> Single or multiple,<br> independently controlled <br> RF outputs from one cabinet.", img: "/wp-content/selector-images/smart-powerselector.jpg", link:"/induction-products/induction-heating-systems/smart-power-systems/" },
{ model: "USP-C-100 | 200", op: 150, minf: 6, maxf: 60, group: 3, title: "SMART POWER", info: "• Configurable power supplies <br> with output from 50kW to 400kW.<br> Frequency ranges <br> from 6kHz to 60kHz <br> and 40kHz to 200kHz. <br> Single or multiple,<br> independently controlled <br> RF outputs from one cabinet.", img: "/wp-content/selector-images/smart-powerselector.jpg", link:"/induction-products/induction-heating-systems/smart-power-systems/" },
{ model: "USP-C-100 | 200", op: 200, minf: 6, maxf: 60, group: 3, title: "SMART POWER", info: "• Configurable power supplies <br> with output from 50kW to 400kW.<br> Frequency ranges <br> from 6kHz to 60kHz <br> and 40kHz to 200kHz. <br> Single or multiple,<br> independently controlled <br> RF outputs from one cabinet.", img: "/wp-content/selector-images/smart-powerselector.jpg", link:"/induction-products/induction-heating-systems/smart-power-systems/" },
{ model: "USP-C-100 | 200", op: 300, minf: 6, maxf: 60, group: 3, title: "SMART POWER", info: "• Configurable power supplies <br> with output from 50kW to 400kW.<br> Frequency ranges <br> from 6kHz to 60kHz <br> and 40kHz to 200kHz. <br> Single or multiple,<br> independently controlled <br> RF outputs from one cabinet.", img: "/wp-content/selector-images/smart-powerselector.jpg", link:"/induction-products/induction-heating-systems/smart-power-systems/" },
{ model: "USP-C-100 | 200", op: 400, minf: 6, maxf: 60, group: 3, title: "SMART POWER", info: "• Configurable power supplies <br> with output from 50kW to 400kW.<br> Frequency ranges <br> from 6kHz to 60kHz <br> and 40kHz to 200kHz. <br> Single or multiple,<br> independently controlled <br> RF outputs from one cabinet.", img: "/wp-content/selector-images/smart-powerselector.jpg", link:"/induction-products/induction-heating-systems/smart-power-systems/" },
{ model: "USP-C-100 | 200", op: 50, minf: 40, maxf: 200, group: 3, title: "SMART POWER", info: "• Configurable power supplies <br> with output from 50kW to 400kW.<br> Frequency ranges <br> from 6kHz to 60kHz <br> and 40kHz to 200kHz. <br> Single or multiple,<br> independently controlled <br> RF outputs from one cabinet.", img: "/wp-content/selector-images/smart-powerselector.jpg", link:"/induction-products/induction-heating-systems/smart-power-systems/" },
{ model: "USP-C-100 | 200", op: 100, minf: 40, maxf: 200, group: 3, title: "SMART POWER", info: "• Configurable power supplies <br> with output from 50kW to 400kW.<br> Frequency ranges <br> from 6kHz to 60kHz <br> and 40kHz to 200kHz. <br> Single or multiple,<br> independently controlled <br> RF outputs from one cabinet.", img: "/wp-content/selector-images/smart-powerselector.jpg", link:"/induction-products/induction-heating-systems/smart-power-systems/" },
{ model: "USP-C-100 | 200", op: 150, minf: 40, maxf: 200, group: 3, title: "SMART POWER", info: "• Configurable power supplies <br> with output from 50kW to 400kW.<br> Frequency ranges <br> from 6kHz to 60kHz <br> and 40kHz to 200kHz. <br> Single or multiple,<br> independently controlled <br> RF outputs from one cabinet.", img: "/wp-content/selector-images/smart-powerselector.jpg", link:"/induction-products/induction-heating-systems/smart-power-systems/" },
{ model: "USP-C-100 | 200", op: 200, minf: 40, maxf: 200, group: 3, title: "SMART POWER", info: "• Configurable power supplies <br> with output from 50kW to 400kW.<br> Frequency ranges <br> from 6kHz to 60kHz <br> and 40kHz to 200kHz. <br> Single or multiple,<br> independently controlled <br> RF outputs from one cabinet.", img: "/wp-content/selector-images/smart-powerselector.jpg", link:"/induction-products/induction-heating-systems/smart-power-systems/" },
{ model: "USP-C-100 | 200", op: 300, minf: 40, maxf: 200, group: 3, title: "SMART POWER", info: "• Configurable power supplies <br> with output from 50kW to 400kW.<br> Frequency ranges <br> from 6kHz to 60kHz <br> and 40kHz to 200kHz. <br> Single or multiple,<br> independently controlled <br> RF outputs from one cabinet.", img: "/wp-content/selector-images/smart-powerselector.jpg", link:"/induction-products/induction-heating-systems/smart-power-systems/" },
{ model: "USP-C-100 | 200", op: 400, minf: 40, maxf: 200, group: 3, title: "SMART POWER", info: "• Configurable power supplies <br> with output from 50kW to 400kW.<br> Frequency ranges <br> from 6kHz to 60kHz <br> and 40kHz to 200kHz. <br> Single or multiple,<br> independently controlled <br> RF outputs from one cabinet.", img: "/wp-content/selector-images/smart-powerselector.jpg", link:"/induction-products/induction-heating-systems/smart-power-systems/" },
];