|  |  | 
 |  |  |     window: { title: "Pick the start color and opacity for the gradient" }, | 
 |  |  |     images: { clientPath: "images/" }, | 
 |  |  |     paint: a Paint object, | 
 |  |  |     newstop: String of value "same", "inverse", "black" or "white"  | 
 |  |  |     newstop: String of value "same", "inverse", "black" or "white" | 
 |  |  |          OR object with one or both values {color: #Hex color, opac: number 0-1} | 
 |  |  |   } | 
 |  |  |   | 
 |  |  |  | 
 |  |  | - the Paint object is: | 
 |  |  |   Paint { | 
 |  |  |     type: String, // one of "none", "solidColor", "linearGradient", "radialGradient" | 
 |  |  | 
 |  |  |  | 
 |  |  |  * | 
 |  |  |  */ | 
 |  |  |   | 
 |  |  |  | 
 |  |  | (function() { | 
 |  |  |   | 
 |  |  |  | 
 |  |  | var ns = { svg: 'http://www.w3.org/2000/svg', xlink: 'http://www.w3.org/1999/xlink' }; | 
 |  |  | if(!window.console) { | 
 |  |  |   window.console = new function() { | 
 |  |  | 
 |  |  |   }; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | $.jGraduate = {  | 
 |  |  | $.jGraduate = { | 
 |  |  |   Paint: | 
 |  |  |     function(opt) { | 
 |  |  |       var options = opt || {}; | 
 |  |  | 
 |  |  |       var $this = $(this), $settings = $.extend(true, {}, jQuery.fn.jGraduateDefaults, options), | 
 |  |  |         id = $this.attr('id'), | 
 |  |  |         idref = '#'+$this.attr('id')+' '; | 
 |  |  |        | 
 |  |  |  | 
 |  |  |             if (!idref) | 
 |  |  |             { | 
 |  |  |               alert('Container element must have an id attribute to maintain unique id strings for sub-elements.'); | 
 |  |  |               return; | 
 |  |  |             } | 
 |  |  |              | 
 |  |  |  | 
 |  |  |             var okClicked = function() { | 
 |  |  |               switch ( $this.paint.type ) { | 
 |  |  |                 case "radialGradient": | 
 |  |  | 
 |  |  |       if ($this.paint.type == "none") { | 
 |  |  |         $this.paint = $.jGraduate.Paint({solidColor: 'ffffff'}); | 
 |  |  |       } | 
 |  |  |        | 
 |  |  |  | 
 |  |  |             $this.addClass('jGraduate_Picker'); | 
 |  |  |             $this.html('<ul class="jGraduate_tabs">' + | 
 |  |  |                     '<li class="jGraduate_tab_color jGraduate_tab_current" data-type="col">Solid Color</li>' + | 
 |  |  |                     '<li class="jGraduate_tab_lingrad" data-type="lg">Linear Gradient</li>' + | 
 |  |  |                     '<li class="jGraduate_tab_radgrad" data-type="rg">Radial Gradient</li>' + | 
 |  |  |                     '<li class="jGraduate_tab_color jGraduate_tab_current" data-type="col">颜色</li>' + | 
 |  |  |                   '<li class="jGraduate_tab_lingrad" data-type="lg">线性渐变</li>' + | 
 |  |  |                     '<li class="jGraduate_tab_radgrad" data-type="rg">径向渐变</li>' + | 
 |  |  |                   '</ul>' + | 
 |  |  |                   '<div class="jGraduate_colPick"></div>' + | 
 |  |  |                   '<div class="jGraduate_gradPick"></div>' + | 
 |  |  |             '<div class="jGraduate_LightBox"></div>' + | 
 |  |  |             '<div id="' + id + '_jGraduate_stopPicker" class="jGraduate_stopPicker"></div>' | 
 |  |  |                    | 
 |  |  |                    | 
 |  |  |  | 
 |  |  |  | 
 |  |  |                   ); | 
 |  |  |       var colPicker = $(idref + '> .jGraduate_colPick'); | 
 |  |  |       var gradPicker = $(idref + '> .jGraduate_gradPick'); | 
 |  |  |        | 
 |  |  |  | 
 |  |  |             gradPicker.html( | 
 |  |  |               '<div id="' + id + '_jGraduate_Swatch" class="jGraduate_Swatch">' + | 
 |  |  |                 '<h2 class="jGraduate_Title">' + $settings.window.pickerTitle + '</h2>' + | 
 |  |  |                 '<div id="' + id + '_jGraduate_GradContainer" class="jGraduate_GradContainer"></div>' + | 
 |  |  |                 '<div id="' + id + '_jGraduate_StopSlider" class="jGraduate_StopSlider"></div>' + | 
 |  |  |               '</div>' +  | 
 |  |  |               '</div>' + | 
 |  |  |               '<div class="jGraduate_Form jGraduate_Points jGraduate_lg_field">' + | 
 |  |  |                 '<div class="jGraduate_StopSection">' + | 
 |  |  |                   '<label class="jGraduate_Form_Heading">Begin Point</label>' + | 
 |  |  |                   '<label class="jGraduate_Form_Heading">起点</label>' + | 
 |  |  |                   '<div class="jGraduate_Form_Section">' + | 
 |  |  |                     '<label>x:</label>' + | 
 |  |  |                     '<input type="text" id="' + id + '_jGraduate_x1" size="3" title="Enter starting x value between 0.0 and 1.0"/>' + | 
 |  |  |                     '<input type="text" id="' + id + '_jGraduate_x1" size="3" title="输入介于0.0和1.0之间的起始x值"/>' + | 
 |  |  |                     '<label> y:</label>' + | 
 |  |  |                     '<input type="text" id="' + id + '_jGraduate_y1" size="3" title="Enter starting y value between 0.0 and 1.0"/>' + | 
 |  |  |                     '<input type="text" id="' + id + '_jGraduate_y1" size="3" title="输入介于0.0和1.0之间的起始y值"/>' + | 
 |  |  |                   '</div>' + | 
 |  |  |                 '</div>' + | 
 |  |  |                 '<div class="jGraduate_StopSection">' + | 
 |  |  |                   '<label class="jGraduate_Form_Heading">End Point</label>' + | 
 |  |  |                   '<label class="jGraduate_Form_Heading">终点</label>' + | 
 |  |  |                   '<div class="jGraduate_Form_Section">' + | 
 |  |  |                     '<label>x:</label>' + | 
 |  |  |                     '<input type="text" id="' + id + '_jGraduate_x2" size="3" title="Enter ending x value between 0.0 and 1.0"/>' + | 
 |  |  |                     '<input type="text" id="' + id + '_jGraduate_x2" size="3" title="输入介于0.0和1.0之间的起始x值"/>' + | 
 |  |  |                     '<label> y:</label>' + | 
 |  |  |                     '<input type="text" id="' + id + '_jGraduate_y2" size="3" title="Enter ending y value between 0.0 and 1.0"/>' + | 
 |  |  |                     '<input type="text" id="' + id + '_jGraduate_y2" size="3" title="输入介于0.0和1.0之间的起始y值"/>' + | 
 |  |  |                   '</div>' + | 
 |  |  |                 '</div>' + | 
 |  |  |               '</div>' + | 
 |  |  |               '<div class="jGraduate_Form jGraduate_Points jGraduate_rg_field">' + | 
 |  |  |           '<div class="jGraduate_StopSection">' + | 
 |  |  |             '<label class="jGraduate_Form_Heading">Center Point</label>' + | 
 |  |  |             '<label class="jGraduate_Form_Heading">中心点</label>' + | 
 |  |  |             '<div class="jGraduate_Form_Section">' + | 
 |  |  |               '<label>x:</label>' + | 
 |  |  |               '<input type="text" id="' + id + '_jGraduate_cx" size="3" title="Enter x value between 0.0 and 1.0"/>' + | 
 |  |  |               '<input type="text" id="' + id + '_jGraduate_cx" size="3" title="输入介于0.0和1.0之间的起始x值"/>' + | 
 |  |  |               '<label> y:</label>' + | 
 |  |  |               '<input type="text" id="' + id + '_jGraduate_cy" size="3" title="Enter y value between 0.0 and 1.0"/>' + | 
 |  |  |               '<input type="text" id="' + id + '_jGraduate_cy" size="3" title="输入介于0.0和1.0之间的起始y值"/>' + | 
 |  |  |             '</div>' + | 
 |  |  |           '</div>' + | 
 |  |  |           '<div class="jGraduate_StopSection">' + | 
 |  |  |             '<label class="jGraduate_Form_Heading">Focal Point</label>' + | 
 |  |  |             '<label class="jGraduate_Form_Heading">焦点</label>' + | 
 |  |  |             '<div class="jGraduate_Form_Section">' + | 
 |  |  |               '<label>Match center: <input type="checkbox" checked="checked" id="' + id + '_jGraduate_match_ctr"/></label><br/>' + | 
 |  |  |               '<label>x:</label>' + | 
 |  |  |               '<input type="text" id="' + id + '_jGraduate_fx" size="3" title="Enter x value between 0.0 and 1.0"/>' + | 
 |  |  |               '<input type="text" id="' + id + '_jGraduate_fx" size="3" title="输入介于0.0和1.0之间的起始x值"/>' + | 
 |  |  |               '<label> y:</label>' + | 
 |  |  |               '<input type="text" id="' + id + '_jGraduate_fy" size="3" title="Enter y value between 0.0 and 1.0"/>' + | 
 |  |  |               '<input type="text" id="' + id + '_jGraduate_fy" size="3" title="输入介于0.0和1.0之间的起始y值"/>' + | 
 |  |  |             '</div>' + | 
 |  |  |           '</div>' + | 
 |  |  |               '</div>' + | 
 |  |  |         '<div class="jGraduate_StopSection jGraduate_SpreadMethod">' + | 
 |  |  |           '<label class="jGraduate_Form_Heading">Spread method</label>' + | 
 |  |  |           '<label class="jGraduate_Form_Heading">扩散方式</label>' + | 
 |  |  |           '<div class="jGraduate_Form_Section">' + | 
 |  |  |             '<select class="jGraduate_spreadMethod">' + | 
 |  |  |               '<option value=pad selected>Pad</option>' + | 
 |  |  |               '<option value=reflect>Reflect</option>' + | 
 |  |  |               '<option value=repeat>Repeat</option>' + | 
 |  |  |             '</select>' +  | 
 |  |  |               '<option value=pad selected>延长</option>' + | 
 |  |  |               '<option value=reflect>映射</option>' + | 
 |  |  |               '<option value=repeat>重复</option>' + | 
 |  |  |             '</select>' + | 
 |  |  |           '</div>' + | 
 |  |  |         '</div>' + | 
 |  |  |               '<div class="jGraduate_Form">' + | 
 |  |  |                 '<div class="jGraduate_Slider jGraduate_RadiusField jGraduate_rg_field">' + | 
 |  |  |             '<label class="prelabel">Radius:</label>' + | 
 |  |  |             '<label class="prelabel">半径:</label>' + | 
 |  |  |             '<div id="' + id + '_jGraduate_Radius" class="jGraduate_SliderBar jGraduate_Radius" title="Click to set radius">' + | 
 |  |  |               '<img id="' + id + '_jGraduate_RadiusArrows" class="jGraduate_RadiusArrows" src="' + $settings.images.clientPath + 'rangearrows2.gif">' + | 
 |  |  |             '</div>' + | 
 |  |  |             '<label><input type="text" id="' + id + '_jGraduate_RadiusInput" size="3" value="100"/>%</label>' +  | 
 |  |  |             '<label><input type="text" id="' + id + '_jGraduate_RadiusInput" size="3" value="100"/>%</label>' + | 
 |  |  |                 '</div>' + | 
 |  |  |                 '<div class="jGraduate_Slider jGraduate_EllipField jGraduate_rg_field">' + | 
 |  |  |             '<label class="prelabel">Ellip:</label>' + | 
 |  |  |             '<label class="prelabel">椭圆:</label>' + | 
 |  |  |             '<div id="' + id + '_jGraduate_Ellip" class="jGraduate_SliderBar jGraduate_Ellip" title="Click to set Ellip">' + | 
 |  |  |               '<img id="' + id + '_jGraduate_EllipArrows" class="jGraduate_EllipArrows" src="' + $settings.images.clientPath + 'rangearrows2.gif">' + | 
 |  |  |             '</div>' + | 
 |  |  |             '<label><input type="text" id="' + id + '_jGraduate_EllipInput" size="3" value="0"/>%</label>' +  | 
 |  |  |             '<label><input type="text" id="' + id + '_jGraduate_EllipInput" size="3" value="0"/>%</label>' + | 
 |  |  |                 '</div>' + | 
 |  |  |                 '<div class="jGraduate_Slider jGraduate_AngleField jGraduate_rg_field">' + | 
 |  |  |             '<label class="prelabel">Angle:</label>' + | 
 |  |  |             '<label class="prelabel">角度:</label>' + | 
 |  |  |             '<div id="' + id + '_jGraduate_Angle" class="jGraduate_SliderBar jGraduate_Angle" title="Click to set Angle">' + | 
 |  |  |               '<img id="' + id + '_jGraduate_AngleArrows" class="jGraduate_AngleArrows" src="' + $settings.images.clientPath + 'rangearrows2.gif">' + | 
 |  |  |             '</div>' + | 
 |  |  |             '<label><input type="text" id="' + id + '_jGraduate_AngleInput" size="3" value="0"/>º </label>' +  | 
 |  |  |             '<label><input type="text" id="' + id + '_jGraduate_AngleInput" size="3" value="0"/>º </label>' + | 
 |  |  |                 '</div>' + | 
 |  |  |                 '<div class="jGraduate_Slider jGraduate_OpacField">' + | 
 |  |  |             '<label class="prelabel">Opac:</label>' + | 
 |  |  |             '<label class="prelabel">透明度:</label>' + | 
 |  |  |             '<div id="' + id + '_jGraduate_Opac" class="jGraduate_SliderBar jGraduate_Opac" title="Click to set Opac">' + | 
 |  |  |               '<img id="' + id + '_jGraduate_OpacArrows" class="jGraduate_OpacArrows" src="' + $settings.images.clientPath + 'rangearrows2.gif">' + | 
 |  |  |             '</div>' + | 
 |  |  |             '<label><input type="text" id="' + id + '_jGraduate_OpacInput" size="3" value="100"/>%</label>' +  | 
 |  |  |             '<label><input type="text" id="' + id + '_jGraduate_OpacInput" size="3" value="100"/>%</label>' + | 
 |  |  |                 '</div>' + | 
 |  |  |               '</div>' + | 
 |  |  |               '<div class="jGraduate_OkCancel">' + | 
 |  |  |                 '<input type="button" id="' + id + '_jGraduate_Ok" class="jGraduate_Ok" value="OK"/>' + | 
 |  |  |                 '<input type="button" id="' + id + '_jGraduate_Cancel" class="jGraduate_Cancel" value="Cancel"/>' + | 
 |  |  |               '</div>'); | 
 |  |  |                | 
 |  |  |  | 
 |  |  |       // -------------- | 
 |  |  |             // Set up all the SVG elements (the gradient, stops and rectangle) | 
 |  |  |             var MAX = 256, MARGINX = 0, MARGINY = 0, STOP_RADIUS = 15/2, | 
 |  |  |               SIZEX = MAX - 2*MARGINX, SIZEY = MAX - 2*MARGINY; | 
 |  |  |                | 
 |  |  |             var curType, curGradient, previewRect;   | 
 |  |  |              | 
 |  |  |  | 
 |  |  |             var curType, curGradient, previewRect; | 
 |  |  |  | 
 |  |  |       var attr_input = {}; | 
 |  |  |              | 
 |  |  |  | 
 |  |  |             var SLIDERW = 145; | 
 |  |  |             $('.jGraduate_SliderBar').width(SLIDERW); | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var container = $('#' + id+'_jGraduate_GradContainer')[0]; | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var svg = mkElem('svg', { | 
 |  |  |         id: id + '_jgraduate_svg', | 
 |  |  |         width: MAX, | 
 |  |  |         height: MAX, | 
 |  |  |         xmlns: ns.svg | 
 |  |  |       }, container); | 
 |  |  |        | 
 |  |  |       // if we are sent a gradient, import it  | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       // if we are sent a gradient, import it | 
 |  |  |  | 
 |  |  |       curType = curType || $this.paint.type; | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var grad = curGradient = $this.paint[curType]; | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var gradalpha = $this.paint.alpha; | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var isSolid = curType === 'solidColor'; | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       // Make any missing gradients | 
 |  |  |       switch ( curType ) { | 
 |  |  |         case "solidColor": | 
 |  |  | 
 |  |  |             y2: 0 | 
 |  |  |           }, svg); | 
 |  |  |       } | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       if(isSolid) { | 
 |  |  |         grad = curGradient = $('#' + id + '_lg_jgraduate_grad')[0]; | 
 |  |  |         var color = $this.paint[curType]; | 
 |  |  |         mkStop(0, '#' + color, 1); | 
 |  |  |          | 
 |  |  |  | 
 |  |  |         var type = typeof $settings.newstop; | 
 |  |  |          | 
 |  |  |  | 
 |  |  |         if(type === 'string') { | 
 |  |  |           switch ( $settings.newstop ) { | 
 |  |  |             case 'same': | 
 |  |  |               mkStop(1, '#' + color, 1);         | 
 |  |  |               mkStop(1, '#' + color, 1); | 
 |  |  |               break; | 
 |  |  |  | 
 |  |  |             case 'inverse': | 
 |  |  | 
 |  |  |               } | 
 |  |  |               mkStop(1, '#' + inverted, 1); | 
 |  |  |               break; | 
 |  |  |              | 
 |  |  |  | 
 |  |  |             case 'white': | 
 |  |  |               mkStop(1, '#ffffff', 1); | 
 |  |  |               break; | 
 |  |  |    | 
 |  |  |  | 
 |  |  |             case 'black': | 
 |  |  |               mkStop(1, '#000000', 1); | 
 |  |  |               break; | 
 |  |  | 
 |  |  |         } | 
 |  |  |       } | 
 |  |  |  | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var x1 = parseFloat(grad.getAttribute('x1')||0.0), | 
 |  |  |         y1 = parseFloat(grad.getAttribute('y1')||0.0), | 
 |  |  |         x2 = parseFloat(grad.getAttribute('x2')||1.0), | 
 |  |  |         y2 = parseFloat(grad.getAttribute('y2')||0.0); | 
 |  |  |          | 
 |  |  |  | 
 |  |  |       var cx = parseFloat(grad.getAttribute('cx')||0.5), | 
 |  |  |         cy = parseFloat(grad.getAttribute('cy')||0.5), | 
 |  |  |         fx = parseFloat(grad.getAttribute('fx')|| cx), | 
 |  |  |         fy = parseFloat(grad.getAttribute('fy')|| cy); | 
 |  |  |  | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var previewRect = mkElem('rect', { | 
 |  |  |         id: id + '_jgraduate_rect', | 
 |  |  |         x: MARGINX, | 
 |  |  | 
 |  |  |         fill: 'url(#'+id+'_jgraduate_grad)', | 
 |  |  |         'fill-opacity': gradalpha/100 | 
 |  |  |       }, svg); | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       // stop visuals created here | 
 |  |  |       var beginCoord = $('<div/>').attr({ | 
 |  |  |         'class': 'grad_coord jGraduate_lg_field', | 
 |  |  | 
 |  |  |         top: y1 * MAX, | 
 |  |  |         left: x1 * MAX | 
 |  |  |       }).data('coord', 'start').appendTo(container); | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var endCoord = beginCoord.clone().text(2).css({ | 
 |  |  |         top: y2 * MAX, | 
 |  |  |         left: x2 * MAX | 
 |  |  |       }).attr('title', 'End stop').data('coord', 'end').appendTo(container); | 
 |  |  |      | 
 |  |  |  | 
 |  |  |       var centerCoord = $('<div/>').attr({ | 
 |  |  |         'class': 'grad_coord jGraduate_rg_field', | 
 |  |  |         title: 'Center stop' | 
 |  |  | 
 |  |  |         top: cy * MAX, | 
 |  |  |         left: cx * MAX | 
 |  |  |       }).data('coord', 'center').appendTo(container); | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var focusCoord = centerCoord.clone().text('F').css({ | 
 |  |  |         top: fy * MAX, | 
 |  |  |         left: fx * MAX, | 
 |  |  |         display: 'none' | 
 |  |  |       }).attr('title', 'Focus point').data('coord', 'focus').appendTo(container); | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       focusCoord[0].id = id + '_jGraduate_focusCoord'; | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var coords = $(idref + ' .grad_coord'); | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       $.each(['x1', 'y1', 'x2', 'y2', 'cx', 'cy', 'fx', 'fy'], function(i, attr) { | 
 |  |  |         var attrval = curGradient.getAttribute(attr); | 
 |  |  |          | 
 |  |  |  | 
 |  |  |         var isRadial = isNaN(attr[1]); | 
 |  |  |          | 
 |  |  |  | 
 |  |  |         if(!attrval) { | 
 |  |  |           // Set defaults | 
 |  |  |           if(isRadial) { | 
 |  |  | 
 |  |  |           .change(function() { | 
 |  |  |             // TODO: Support values < 0 and > 1 (zoomable preview?) | 
 |  |  |             if (isNaN(parseFloat(this.value)) || this.value < 0) { | 
 |  |  |               this.value = 0.0;  | 
 |  |  |               this.value = 0.0; | 
 |  |  |             } else if(this.value > 1) { | 
 |  |  |               this.value = 1.0; | 
 |  |  |             } | 
 |  |  |              | 
 |  |  |  | 
 |  |  |             if(!(attr[0] === 'f' && !showFocus)) { | 
 |  |  |               if(isRadial && curType === 'radialGradient' || !isRadial && curType === 'linearGradient') { | 
 |  |  |                 curGradient.setAttribute(attr, this.value); | 
 |  |  |               } | 
 |  |  |             } | 
 |  |  |              | 
 |  |  |  | 
 |  |  |             if(isRadial) { | 
 |  |  |               var $elem = attr[0] === "c" ? centerCoord : focusCoord; | 
 |  |  |             } else { | 
 |  |  |               var $elem = attr[1] === "1" ? beginCoord : endCoord;             | 
 |  |  |               var $elem = attr[1] === "1" ? beginCoord : endCoord; | 
 |  |  |             } | 
 |  |  |              | 
 |  |  |  | 
 |  |  |             var cssName = attr.indexOf('x') >= 0 ? 'left' : 'top'; | 
 |  |  |              | 
 |  |  |  | 
 |  |  |             $elem.css(cssName, this.value * MAX); | 
 |  |  |         }).change(); | 
 |  |  |       }); | 
 |  |  | 
 |  |  |           curGradient.appendChild(stop); | 
 |  |  |         } | 
 |  |  |         if(opac === null) opac = 1; | 
 |  |  |          | 
 |  |  |  | 
 |  |  |         var picker_d = 'M-6.2,0.9c3.6-4,6.7-4.3,6.7-12.4c-0.2,7.9,3.1,8.8,6.5,12.4c3.5,3.8,2.9,9.6,0,12.3c-3.1,2.8-10.4,2.7-13.2,0C-9.6,9.9-9.4,4.4-6.2,0.9z'; | 
 |  |  |          | 
 |  |  |  | 
 |  |  |         var pathbg = mkElem('path',{ | 
 |  |  |           d: picker_d, | 
 |  |  |           fill: 'url(#jGraduate_trans)', | 
 |  |  |           transform: 'translate(' + (10 + n * MAX) + ', 26)' | 
 |  |  |         }, stopGroup); | 
 |  |  |          | 
 |  |  |  | 
 |  |  |         var path = mkElem('path',{ | 
 |  |  |           d: picker_d, | 
 |  |  |           fill: color, | 
 |  |  | 
 |  |  |           e.preventDefault(); | 
 |  |  |           return false; | 
 |  |  |         }).data('stop', stop).data('bg', pathbg).dblclick(function() { | 
 |  |  |           $('div.jGraduate_LightBox').show();      | 
 |  |  |           $('div.jGraduate_LightBox').show(); | 
 |  |  |           var colorhandle = this; | 
 |  |  |           var stopOpacity = +stop.getAttribute('stop-opacity') || 1; | 
 |  |  |           var stopColor = stop.getAttribute('stop-color') || 1; | 
 |  |  | 
 |  |  |               $('#'+id+'_jGraduate_stopPicker').hide(); | 
 |  |  |             }); | 
 |  |  |         }); | 
 |  |  |          | 
 |  |  |  | 
 |  |  |         $(curGradient).find('stop').each(function() { | 
 |  |  |           var cur_s = $(this); | 
 |  |  |           if(+this.getAttribute('offset') > n) { | 
 |  |  | 
 |  |  |         if(sel) selectStop(path); | 
 |  |  |         return stop; | 
 |  |  |       } | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       function remStop() { | 
 |  |  |         delStop.setAttribute('display', 'none'); | 
 |  |  |         var path = $(cur_stop); | 
 |  |  | 
 |  |  |         var bg = path.data('bg'); | 
 |  |  |         $([cur_stop, stop, bg]).remove(); | 
 |  |  |       } | 
 |  |  |        | 
 |  |  |          | 
 |  |  |  | 
 |  |  |  | 
 |  |  |       var stops, stopGroup; | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var stopMakerDiv = $('#' + id + '_jGraduate_StopSlider'); | 
 |  |  |  | 
 |  |  |       var cur_stop, stopGroup, stopMakerSVG, drag; | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var delStop = mkElem('path',{ | 
 |  |  |         d:'m9.75,-6l-19.5,19.5m0,-19.5l19.5,19.5', | 
 |  |  |         fill:'none', | 
 |  |  | 
 |  |  |         display:'none' | 
 |  |  |       }, stopMakerSVG); | 
 |  |  |  | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       function selectStop(item) { | 
 |  |  |         if(cur_stop) cur_stop.setAttribute('stroke', '#000'); | 
 |  |  |         item.setAttribute('stroke', 'blue'); | 
 |  |  | 
 |  |  |       //  opac_select.val(cur_stop.attr('fill-opacity') || 1); | 
 |  |  |       //  root.append(delStop); | 
 |  |  |       } | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var stop_offset; | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       function remDrags() { | 
 |  |  |         $win.unbind('mousemove', dragColor); | 
 |  |  |         if(delStop.getAttribute('display') !== 'none') { | 
 |  |  | 
 |  |  |         } | 
 |  |  |         drag = null; | 
 |  |  |       } | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var scale_x = 1, scale_y = 1, angle = 0; | 
 |  |  |       var c_x = cx; | 
 |  |  |       var c_y = cy; | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       function xform() { | 
 |  |  |         var rot = angle?'rotate(' + angle + ',' + c_x + ',' + c_y + ') ':''; | 
 |  |  |         if(scale_x === 1 && scale_y === 1) { | 
 |  |  | 
 |  |  | //          $('#ang').removeClass('dis'); | 
 |  |  |         } | 
 |  |  |       } | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       function dragColor(evt) { | 
 |  |  |  | 
 |  |  |         var x = evt.pageX - stop_offset.left; | 
 |  |  | 
 |  |  |           } else { | 
 |  |  |             delStop.setAttribute('display', 'none'); | 
 |  |  |           } | 
 |  |  |          | 
 |  |  |  | 
 |  |  |         drag.setAttribute('transform', xf_str); | 
 |  |  |         $.data(drag, 'bg').setAttribute('transform', xf_str); | 
 |  |  |         var stop = $.data(drag, 'stop'); | 
 |  |  |         var s_x = (x - 10) / MAX; | 
 |  |  |          | 
 |  |  |  | 
 |  |  |         stop.setAttribute('offset', s_x); | 
 |  |  |         var last = 0; | 
 |  |  |          | 
 |  |  |  | 
 |  |  |         $(curGradient).find('stop').each(function(i) { | 
 |  |  |           var cur = this.getAttribute('offset'); | 
 |  |  |           var t = $(this); | 
 |  |  | 
 |  |  |           } | 
 |  |  |           last = cur; | 
 |  |  |         }); | 
 |  |  |          | 
 |  |  |  | 
 |  |  |       } | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       stopMakerSVG = mkElem('svg', { | 
 |  |  |         width: '100%', | 
 |  |  |         height: 45 | 
 |  |  |       }, stopMakerDiv[0]); | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var trans_pattern = mkElem('pattern', { | 
 |  |  |         width: 16, | 
 |  |  |         height: 16, | 
 |  |  |         patternUnits: 'userSpaceOnUse', | 
 |  |  |         id: 'jGraduate_trans' | 
 |  |  |       }, stopMakerSVG); | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var trans_img = mkElem('image', { | 
 |  |  |         width: 16, | 
 |  |  |         height: 16 | 
 |  |  |       }, trans_pattern); | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var bg_image = $settings.images.clientPath + 'map-opacity.png'; | 
 |  |  |  | 
 |  |  |       trans_img.setAttributeNS(ns.xlink, 'xlink:href', bg_image); | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       $(stopMakerSVG).on("click touchstart", function(evt) { | 
 |  |  |         stop_offset = stopMakerDiv.offset(); | 
 |  |  |         var target = evt.target; | 
 |  |  | 
 |  |  |         mkStop(x / MAX, 0, 0, true); | 
 |  |  |         evt.stopPropagation(); | 
 |  |  |       }); | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       $(stopMakerSVG).mouseover(function() { | 
 |  |  |         stopMakerSVG.appendChild(delStop); | 
 |  |  |       }); | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       stopGroup = mkElem('g', {}, stopMakerSVG); | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       mkElem('line', { | 
 |  |  |         x1: 10, | 
 |  |  |         y1: 15, | 
 |  |  | 
 |  |  |         'stroke-width': 2, | 
 |  |  |         stroke: '#000' | 
 |  |  |       }, stopMakerSVG); | 
 |  |  |        | 
 |  |  |        | 
 |  |  |  | 
 |  |  |  | 
 |  |  |       var spreadMethodOpt = gradPicker.find('.jGraduate_spreadMethod').change(function() { | 
 |  |  |         curGradient.setAttribute('spreadMethod', $(this).val()); | 
 |  |  |       }); | 
 |  |  |        | 
 |  |  |      | 
 |  |  |  | 
 |  |  |  | 
 |  |  |       // handle dragging the stop around the swatch | 
 |  |  |       var draggingCoord = null; | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var onCoordDrag = function(evt) { | 
 |  |  |         var x = evt.pageX - offset.left; | 
 |  |  |         var y = evt.pageY - offset.top; | 
 |  |  | 
 |  |  |         // clamp stop to the swatch | 
 |  |  |         x = x < 0 ? 0 : x > MAX ? MAX : x; | 
 |  |  |         y = y < 0 ? 0 : y > MAX ? MAX : y; | 
 |  |  |          | 
 |  |  |  | 
 |  |  |         draggingCoord.css('left', x).css('top', y); | 
 |  |  |  | 
 |  |  |         // calculate stop offset                 | 
 |  |  |         // calculate stop offset | 
 |  |  |         var fracx = x / SIZEX; | 
 |  |  |         var fracy = y / SIZEY; | 
 |  |  |          | 
 |  |  |  | 
 |  |  |         var type = draggingCoord.data('coord'); | 
 |  |  |         var grad = curGradient; | 
 |  |  |          | 
 |  |  |  | 
 |  |  |         switch ( type ) { | 
 |  |  |           case 'start': | 
 |  |  |             attr_input.x1.val(fracx); | 
 |  |  | 
 |  |  |             grad.setAttribute('fy', fracy); | 
 |  |  |             xform(); | 
 |  |  |         } | 
 |  |  |          | 
 |  |  |  | 
 |  |  |         evt.preventDefault(); | 
 |  |  |       } | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var onCoordUp = function() { | 
 |  |  |         draggingCoord = null; | 
 |  |  |         $win.unbind('mousemove', onCoordDrag).unbind('mouseup', onCoordUp); | 
 |  |  |       } | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       // Linear gradient | 
 |  |  | //      (function() { | 
 |  |  |  | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       stops = curGradient.getElementsByTagNameNS(ns.svg, 'stop'); | 
 |  |  |  | 
 |  |  |       // if there are not at least two stops, then  | 
 |  |  |       // if there are not at least two stops, then | 
 |  |  |       if (numstops < 2) { | 
 |  |  |         while (numstops < 2) { | 
 |  |  |           curGradient.appendChild( document.createElementNS(ns.svg, 'stop') ); | 
 |  |  | 
 |  |  |         } | 
 |  |  |         stops = curGradient.getElementsByTagNameNS(ns.svg, 'stop'); | 
 |  |  |       } | 
 |  |  |        | 
 |  |  |       var numstops = stops.length;         | 
 |  |  |  | 
 |  |  |       var numstops = stops.length; | 
 |  |  |       for(var i = 0; i < numstops; i++) { | 
 |  |  |         mkStop(0, 0, 0, 0, stops[i]); | 
 |  |  |       } | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       spreadMethodOpt.val(curGradient.getAttribute('spreadMethod') || 'pad'); | 
 |  |  |  | 
 |  |  |       var offset; | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       // No match, so show focus point | 
 |  |  |       var showFocus = false;  | 
 |  |  |        | 
 |  |  |       var showFocus = false; | 
 |  |  |  | 
 |  |  |       previewRect.setAttribute('fill-opacity', gradalpha/100); | 
 |  |  |  | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       $('#' + id + ' div.grad_coord').mousedown(function(evt) { | 
 |  |  |         evt.preventDefault(); | 
 |  |  |         draggingCoord = $(this); | 
 |  |  | 
 |  |  |         offset = draggingCoord.parent().offset(); | 
 |  |  |         $win.mousemove(onCoordDrag).mouseup(onCoordUp); | 
 |  |  |       }); | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       // bind GUI elements | 
 |  |  |       $('#'+id+'_jGraduate_Ok').bind('click touchstart', function() { | 
 |  |  |         $this.paint.type = curType; | 
 |  |  | 
 |  |  |  | 
 |  |  |       if(curType === 'radialGradient') { | 
 |  |  |         if(showFocus) { | 
 |  |  |           focusCoord.show();         | 
 |  |  |           focusCoord.show(); | 
 |  |  |         } else { | 
 |  |  |           focusCoord.hide(); | 
 |  |  |           attr_input.fx.val(""); | 
 |  |  | 
 |  |  |       } | 
 |  |  |  | 
 |  |  |       $("#" + id + "_jGraduate_match_ctr")[0].checked = !showFocus; | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var lastfx, lastfy; | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       $("#" + id + "_jGraduate_match_ctr").change(function() { | 
 |  |  |         showFocus = !this.checked; | 
 |  |  |         focusCoord.toggle(showFocus); | 
 |  |  | 
 |  |  |           attr_input.fy.val(fy); | 
 |  |  |         } | 
 |  |  |       }); | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var stops = curGradient.getElementsByTagNameNS(ns.svg, 'stop'); | 
 |  |  |       var numstops = stops.length; | 
 |  |  |       // if there are not at least two stops, then  | 
 |  |  |       // if there are not at least two stops, then | 
 |  |  |       if (numstops < 2) { | 
 |  |  |         while (numstops < 2) { | 
 |  |  |           curGradient.appendChild( document.createElementNS(ns.svg, 'stop') ); | 
 |  |  | 
 |  |  |         } | 
 |  |  |         stops = curGradient.getElementsByTagNameNS(ns.svg, 'stop'); | 
 |  |  |       } | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var slider; | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var setSlider = function(e) { | 
 |  |  |         var offset = slider.offset; | 
 |  |  |         var div = slider.parent; | 
 |  |  | 
 |  |  |         if (x <= 0) x = 0; | 
 |  |  |         var posx = x - 5; | 
 |  |  |         x /= SLIDERW; | 
 |  |  |          | 
 |  |  |  | 
 |  |  |         switch ( slider.type ) { | 
 |  |  |           case 'radius': | 
 |  |  |             x = Math.pow(x * 2, 2.5); | 
 |  |  | 
 |  |  |               x /= .5; // 2 | 
 |  |  |               x = 2 - x; | 
 |  |  |               scale_y = x <= 0 ? .01 : x; | 
 |  |  |             }  | 
 |  |  |             } | 
 |  |  |             xform(); | 
 |  |  |             x -= 1; | 
 |  |  |             if(scale_y === x + 1) { | 
 |  |  | 
 |  |  |         x = Math.round(x*100); | 
 |  |  |         slider.input.val(x); | 
 |  |  |       }; | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var ellip_val = 0, angle_val = 0; | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       if(curType === 'radialGradient') { | 
 |  |  |         var tlist = curGradient.gradientTransform.baseVal; | 
 |  |  |         if(tlist.numberOfItems === 2) { | 
 |  |  | 
 |  |  |           if(t.type === 2 && s.type === 3) { | 
 |  |  |             var m = s.matrix; | 
 |  |  |             if(m.a !== 1) { | 
 |  |  |               ellip_val = Math.round(-(1 - m.a) * 100);  | 
 |  |  |               ellip_val = Math.round(-(1 - m.a) * 100); | 
 |  |  |             } else if(m.d !== 1) { | 
 |  |  |               ellip_val = Math.round((1 - m.d) * 100); | 
 |  |  |             }  | 
 |  |  |             } | 
 |  |  |           } | 
 |  |  |         } else if(tlist.numberOfItems === 3) { | 
 |  |  |           // Assume [R][T][S] | 
 |  |  |           var r = tlist.getItem(0); | 
 |  |  |           var t = tlist.getItem(1); | 
 |  |  |           var s = tlist.getItem(2); | 
 |  |  |            | 
 |  |  |           if(r.type === 4  | 
 |  |  |             && t.type === 2  | 
 |  |  |  | 
 |  |  |           if(r.type === 4 | 
 |  |  |             && t.type === 2 | 
 |  |  |             && s.type === 3) { | 
 |  |  |  | 
 |  |  |             angle_val = Math.round(r.angle); | 
 |  |  |             var m = s.matrix; | 
 |  |  |             if(m.a !== 1) { | 
 |  |  |               ellip_val = Math.round(-(1 - m.a) * 100);  | 
 |  |  |               ellip_val = Math.round(-(1 - m.a) * 100); | 
 |  |  |             } else if(m.d !== 1) { | 
 |  |  |               ellip_val = Math.round((1 - m.d) * 100); | 
 |  |  |             }  | 
 |  |  |              | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |           } | 
 |  |  |         } | 
 |  |  |       } | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var sliders = { | 
 |  |  |         radius: { | 
 |  |  |           handle: '#' + id + '_jGraduate_RadiusArrows', | 
 |  |  | 
 |  |  |           val: angle_val | 
 |  |  |         } | 
 |  |  |       } | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       $.each(sliders, function(type, data) { | 
 |  |  |         var handle = $(data.handle); | 
 |  |  |         handle.mousedown(function(evt) { | 
 |  |  | 
 |  |  |           $win.mousemove(dragSlider).mouseup(stopSlider); | 
 |  |  |           evt.preventDefault(); | 
 |  |  |         }); | 
 |  |  |          | 
 |  |  |  | 
 |  |  |         $(data.input).val(data.val).change(function() { | 
 |  |  |           var val = +this.value; | 
 |  |  |           var xpos = 0; | 
 |  |  | 
 |  |  |               if(isRad) curGradient.setAttribute('r', val / 100); | 
 |  |  |               xpos = (Math.pow(val / 100, 1 / 2.5) / 2) * SLIDERW; | 
 |  |  |               break; | 
 |  |  |              | 
 |  |  |  | 
 |  |  |             case 'opacity': | 
 |  |  |               $this.paint.alpha = val; | 
 |  |  |               previewRect.setAttribute('fill-opacity', val / 100); | 
 |  |  |               xpos = val * (SLIDERW / 100); | 
 |  |  |               break; | 
 |  |  |                | 
 |  |  |  | 
 |  |  |             case 'ellip': | 
 |  |  |               scale_x = scale_y = 1; | 
 |  |  |               if(val === 0) { | 
 |  |  | 
 |  |  |               xpos = SLIDERW * ((val + 100) / 2) / 100; | 
 |  |  |               if(isRad) xform(); | 
 |  |  |               break; | 
 |  |  |              | 
 |  |  |  | 
 |  |  |             case 'angle': | 
 |  |  |               angle = val; | 
 |  |  |               xpos = angle / 180; | 
 |  |  | 
 |  |  |           handle.css({'margin-left': xpos - 5}); | 
 |  |  |         }).change(); | 
 |  |  |       }); | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var dragSlider = function(evt) { | 
 |  |  |         setSlider(evt); | 
 |  |  |         evt.preventDefault(); | 
 |  |  |       }; | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var stopSlider = function(evt) { | 
 |  |  |         $win.unbind('mousemove', dragSlider).unbind('mouseup', stopSlider); | 
 |  |  |         slider = null; | 
 |  |  |       }; | 
 |  |  |        | 
 |  |  |        | 
 |  |  |  | 
 |  |  |  | 
 |  |  |       // -------------- | 
 |  |  |       var thisAlpha = ($this.paint.alpha*255/100).toString(16); | 
 |  |  |       while (thisAlpha.length < 2) { thisAlpha = "0" + thisAlpha; } | 
 |  |  |       thisAlpha = thisAlpha.split(".")[0]; | 
 |  |  |       color = $this.paint.solidColor == "none" ? "" : $this.paint.solidColor + thisAlpha; | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       if(!isSolid) { | 
 |  |  |         color = stops[0].getAttribute('stop-color'); | 
 |  |  |       } | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       // This should be done somewhere else, probably | 
 |  |  |       $.extend($.fn.jPicker.defaults.window, { | 
 |  |  |         alphaSupport: true, effects: {type: 'show',speed: 0} | 
 |  |  |       }); | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       colPicker.jPicker( | 
 |  |  |         { | 
 |  |  |           window: { title: $settings.window.pickerTitle }, | 
 |  |  | 
 |  |  |           $this.paint.alpha = color.val('ahex') ? Math.round((color.val('a') / 255) * 100) : 100; | 
 |  |  |           $this.paint.solidColor = color.val('hex') ? color.val('hex') : "none"; | 
 |  |  |           $this.paint.radialGradient = null; | 
 |  |  |           okClicked();  | 
 |  |  |           okClicked(); | 
 |  |  |         }, | 
 |  |  |         null, | 
 |  |  |         function(){ cancelClicked(); } | 
 |  |  |         ); | 
 |  |  |  | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       var tabs = $(idref + ' .jGraduate_tabs li'); | 
 |  |  |       tabs.on("click touchstart", function() { | 
 |  |  |         tabs.removeClass('jGraduate_tab_current'); | 
 |  |  | 
 |  |  |           // Show/hide appropriate fields | 
 |  |  |           $('.jGraduate_' + type + '_field').show(); | 
 |  |  |           $('.jGraduate_' + (type === 'lg' ? 'rg' : 'lg') + '_field').hide(); | 
 |  |  |            | 
 |  |  |  | 
 |  |  |           $('#' + id + '_jgraduate_rect')[0].setAttribute('fill', 'url(#' + id + '_' + type + '_jgraduate_grad)'); | 
 |  |  |            | 
 |  |  |  | 
 |  |  |           // Copy stops | 
 |  |  |            | 
 |  |  |  | 
 |  |  |           curType = type === 'lg' ? 'linearGradient' : 'radialGradient'; | 
 |  |  |            | 
 |  |  |  | 
 |  |  |           $('#' + id + '_jGraduate_OpacInput').val($this.paint.alpha).change(); | 
 |  |  |            | 
 |  |  |  | 
 |  |  |           var newGrad = $('#' + id + '_' + type + '_jgraduate_grad')[0]; | 
 |  |  |            | 
 |  |  |  | 
 |  |  |           if(curGradient !== newGrad) { | 
 |  |  |             var cur_stops = $(curGradient).find('stop');   | 
 |  |  |             var cur_stops = $(curGradient).find('stop'); | 
 |  |  |             $(newGrad).empty().append(cur_stops); | 
 |  |  |             curGradient = newGrad; | 
 |  |  |             var sm = spreadMethodOpt.val(); | 
 |  |  | 
 |  |  |           break; | 
 |  |  |       } | 
 |  |  |       $this.show(); | 
 |  |  |        | 
 |  |  |  | 
 |  |  |       // jPicker will try to show after a 0ms timeout, so need to fire this after that | 
 |  |  |       setTimeout(function() { | 
 |  |  |         tab.addClass('jGraduate_tab_current').click();   | 
 |  |  |         tab.addClass('jGraduate_tab_current').click(); | 
 |  |  |       }, 10); | 
 |  |  |     }); | 
 |  |  |   }; | 
 |  |  | })(); | 
 |  |  | })(); |