14 mountain bike frame

|
Challenge Mantis 26 Inch Mountain Bike - Mens.
$99.99
The Challenge Mantis mens' bike is a mountain bike suitable for off-roading or simply pedalling around town. Featuring a front suspension fork for a smoother ride and 18 gears for greater control.Bronze steel frame.18 gears with Twist grip shifters.Sunrun SL-KDSG-03 gears.Front V-type and rear V-type brakes.Front suspension.Weight fully assembled 17kg.48.3cm / 19 inch frame size.66cm / 26 inch wheel size.Suitable from 82 to 95cm / 32 to 37 inch inside leg measurement.Suitable for ages 14 years and over.Mountain bike style tyres.Adjustable handlebar height.Adjustable seat height.Additional features:Bell.Sunrun RD-HG-04 rear derailleur.General information:Some assembly required to fit front wheel, adjust brakes, fit pedals, saddle and handlebars.Instructions included.EAN/MPN/UPC/ISBN: 5021967100591.
|

|
Challenge Serene 26 Inch Mountain Bike - Ladies.
$99.99
The Challenge Serene ladies' bike is a mountain bike suitable for off-roading or simply pedalling around town. Featuring a front suspension fork for a smoother ride and 18 gears for greater control.Bronze steel frame.18 gears with Twist grip shifters.Sunrun SL-KDSG-03 gears.Front V-type and rear V-type brakes.Front suspension.Weight fully assembled 17kg.43.2cm / 17 inch frame size.66cm / 26 inch wheel size.Suitable from 82 to 95cm / 32 to 37 inch inside leg measurement.Suitable for ages 14 years and over.Mountain bike style tyres.Adjustable handlebar height.Adjustable seat height.Additional features:Bell.Sunrun RD-HG-04 rear derailleur.General information:Some assembly required to fit front wheel, adjust brakes, fit pedals, saddle and handlebars.Instructions included.EAN/MPN/UPC/ISBN: 5021967100607.
|

|
Muddyfox Parklane 26 inch Mountain Bike - Ladies'
$299.99
General information: EAN/MPN/UPC/ISBN: 5021967100676. Instructions included. Some assembly required to fit front wheel, adjust brakes, fit pedals, saddle and handlebars. Additional features: Bell. Adjustable handlebar height. Adjustable seat height. Mountain bike style tyres. Suitable for ages 14 years and over. 40cm / 16 inch frame size. 66cm / 26 inch wheel size. Suitable from 61 to 71cm / 24 to 28 inch inside leg measurement. Weight fully assembled 17kg. Front suspension. Front Disc and rear Disc brakes. Shimano gears. 21 gears with EZ Fire shifters. Pink steel frame.
|

|
Raleigh Attack 26 Inch Mountain Bike - Mens
$199.99
18 gears with Twist grip shifters. Black steel frame. Front suspension. Weight fully assembled 15.7kg. 66cm / 26 inch wheel size. Suitable from 73 to 86cm / 28 to 33 inch inside leg measurement. Suitable for ages 14 years and over. Mountain bike style tyres. Adjustable handlebar height. Adjustable seat height. Front Disc and rear Alloy V brake brakes. 48cm / 19 inch frame size. MicroSHIFT MS12-6R gears. General information: Some assembly required to fit front wheel, adjust brakes, fit pedals, saddle and handlebars. Click on image for a video of assembly instructions. Tools and instructions included. By Raleigh.
|

|
Raleigh Azure 26 inch Mountain Bike - Ladies'
$179.99
General information: Tools and instructions included. Click on image for a video of assembly instructions. Some assembly required to fit front wheel, adjust brakes, fit pedals, saddle and handlebars. Adjustable seat height. Adjustable handlebar height. Mountain bike style tyres. Suitable for ages 14 years and over. 66cm / 26 inch wheel size. Suitable from 69 to 81cm / 27 to 35 inch inside leg measurement. Weight fully assembled 17.5kg. Front suspension. Front Disc and rear V-type brakes. Shimano gears. 18 gears with Twist grip shifters. Blue aluminium frame.
|

|
Raleigh Attack 26 Inch Mountain Bike - Mens.
$199.99
This Raleigh Attack Mens' Mountain Bike features front suspension for a smoother ride, and 18 twist grip gears. Ideal for off-roading, trail biking and getting around town.Black steel frame.18 gears with Twist grip shifters.MicroSHIFT MS12-6R gears.Front Disc and rear Alloy V brake brakes.Front suspension.Weight fully assembled 15.7kg.48cm / 19 inch frame size.66cm / 26 inch wheel size.Suitable from 73 to 86cm / 28 to 33 inch inside leg measurement.Suitable for ages 14 years and over.Mountain bike style tyres.Adjustable handlebar height.Adjustable seat height.General information:Some assembly required to fit front wheel, adjust brakes, fit pedals, saddle and handlebars.Click on image for a video of assembly instructions.Tools and instructions included.
|

|
MOUNTAINPEAK Mountain Bike Mudguard
$24.48
MOUNTAINPEAK Mountain Bike Mudguard is made of Synthetic fiber plastic, high strength, impact resistance, and can be folded 360 degrees, not break. It is supported by frame which has hole by itself. The back-wheel is approximately 60 cm long, and front-wheel is about 45cm, specially designed for mountain bike. It will bring more convenience for those who like to take many things outdoor.
|

|
Challenge Mantis 26 Inch Mountain Bike - Mens
$99.99
General information: EAN/MPN/UPC/ISBN: 5021967100591. Instructions included. Some assembly required to fit front wheel, adjust brakes, fit pedals, saddle and handlebars. Additional features: Bell. Sunrun RD-HG-04 rear derailleur. Adjustable seat height. Adjustable handlebar height. Mountain bike style tyres. Suitable for ages 14 years and over. 66cm / 26 inch wheel size. 48.3cm / 19 inch frame size. Weight fully assembled 17kg. Front suspension. Front V-type and rear V-type brakes. Bronze steel frame. 18 gears with Twist grip shifters. Suitable from 82 to 95cm / 32 to 37 inch inside leg measurement. Sunrun SL-KDSG-03 gears. By Challenge.
|

|
Challenge Serene 26 Inch Mountain Bike - Ladies
$99.99
General information: Instructions included. EAN/MPN/UPC/ISBN: 5021967100607. Some assembly required to fit front wheel, adjust brakes, fit pedals, saddle and handlebars. Additional features: Bell. Sunrun RD-HG-04 rear derailleur. Adjustable handlebar height. Adjustable seat height. Mountain bike style tyres. Suitable for ages 14 years and over. 43.2cm / 17 inch frame size. 66cm / 26 inch wheel size. Weight fully assembled 17kg. Front V-type and rear V-type brakes. Front suspension. 18 gears with Twist grip shifters. Bronze steel frame. Sunrun SL-KDSG-03 gears. Suitable from 82 to 95cm / 32 to 37 inch inside leg measurement. By Challenge.
|

|
Challenge 26 Inch Folding Mountain Bike
$199.99
General information: EAN/MPN/UPC/ISBN: 5021967999171. Click on image for a video of assembly instructions. Tools and instructions included. Some assembly required to fit front wheel, adjust brakes, fit pedals, saddle and handlebars. Suitable for ages 14 years and over. Mountain bike style tyres. Adjustable handlebar height. Adjustable seat height. 66cm / 26 inch wheel size. 47cm / 18.5 inch frame size. Front V-type and rear V-type brakes. Weight fully assembled 17kg. 18 gears with Twist grip shifters. Blue and silver steel frame. Sunrun SL-KDSG-03 Friction gears. Suitable from 66 to 81cm / 26 to 32 inch inside leg measurement. Sunrun RD-HG-03 rear derailleur. By Challenge.
|

|
Mountain Bike Overpass
$20
After just one wash you will not know where the print ends and the shirt begins. Our unique printing process actually pulls the dye color out of the shirt and leaves the ink color behind, essentially dyeing the cotton with the ink. Life is Crap T-shirt features an over-sized relaxed fit, with reinforced double-stitching on all seams. After dyeing they are washed and dried, so they arrive to you comfortable, pre-shrunk & ready to wear. This heavyweight 100% Cotton tee will last you years and years. Visit our full size chart!
|

|
Mountain Bike Trail
$20
After just one wash you will not know where the print ends and the shirt begins. Our unique printing process actually pulls the dye color out of the shirt and leaves the ink color behind, essentially dyeing the cotton with the ink. Life is Crap T-shirt features an over-sized relaxed fit, with reinforced double-stitching on all seams. After dyeing they are washed and dried, so they arrive to you comfortable, pre-shrunk & ready to wear. This heavyweight 100% Cotton tee will last you years and years. Visit our full size chart!
|

|
Muddyfox Street 26Inc Front Suspension Mountain Bike - Mens.
$299.99
The Muddyfox Street mens' mountain bike has a green steel frame and 21 Shimano gears with premium EZ Fire shifters. Featuring front suspension to give you a smoother ride, this bike is suitable for town riding and off-roading. Inside leg range 69-84cm/27-33in.Green steel frame.21 gears with EZ Fire shifters.Shimano ST-EF51-7R/L gears.Front Disc and rear Disc brakes.Front suspension.Weight fully assembled 17kg.48cm / 19 inch frame size.66cm / 26 inch wheel size.Suitable for ages 14 years and over.Mountain bike style tyres.Adjustable handlebar height.Adjustable seat height.Additional features:Bell.General information:Some assembly required to fit front wheel, adjust brakes, fit pedals, saddle and handlebars.Instructions included.EAN/MPN/UPC/ISBN: 5021967100669.
|

|
Muddyfox Fluid 26 Inch Front Suspension Mountain Bike
$326.8
General information: Instructions included. Click on image for a video of assembly instructions. Some assembly required to fit front wheel, adjust brakes, fit pedals, saddle and handlebars. Suitable for ages 14 years and over. Mountain bike style tyres. Suitable from 61+cm / 26+ inch inside leg measurement. 66cm / 26 inch wheel size. 36cm / 14 inch frame size. Weight fully assembled 16kg. Front suspension. 16 gears with EZ Fire shifters. Front Tektro alloy mechanical disc and rear Tektro alloy mechanical disc brakes. Black frame. By Muddyfox.
|

|
Raleigh Mission 26 Inch Dual Suspension Mountain Bike
$199.99
General information: Manufacturer's 5 year frame and fork guarantee. Tools and instructions included. Click on image for a video of assembly instructions. Some assembly required to fit front wheel, adjust brakes, fit pedals, saddle and handlebars. Mountain bike style tyres. Suitable for ages 14 years and over. Dual suspension. 18 gears with Twist grip shifters. Black steel frame. 66cm / 26 inch wheel size. Shimano gears. 47cm / 18.5 inch frame size. Suitable from 71 to 84cm / 28 to 33 inch inside leg measurement. Front and back steel brakes. By Raleigh.
|

|
Mountain Bike
$17.04
Menasha Ridge Press - Mountain Bike - 100404
|

|
Challenge Dreamer Rigid 26 Inch Mountain Bike - Ladies.
$89.99
The Challenge Dreamer Rigid Mountain Bike is the ideal bike for all cyclists, whether you are getting around town or being a little more adventurous and exploring your local trails. The tyres are designed to cope with both roads and muddy trails.White and pink steel frame.18 gears with Thumb shift shifters.Power SFT-332P gears.Front V-type and rear V-type brakes.Weight fully assembled 15.5kg.43.2cm / 17 inch frame size.66cm / 26 inch wheel size.Suitable from 82 to 95cm / 32 to 37 inch inside leg measurement.Suitable for ages 14 years and over.Mountain bike style tyres.Adjustable handlebar height.Adjustable seat height.Additional features:Bell.Power RD-25 rear derailleur.General information:Some assembly required to fit front wheel, adjust brakes, fit pedals, saddle and handlebars.Instructions included.Manufacturer's 1 year guarantee.EAN/MPN/UPC/ISBN: 5021967100560.
|

|
Raleigh Yukon 26 Inch Dual Suspension Mountain Bike - Mens.
$149.99
The Raleigh Yukon Mountain Bike has dual suspension, giving you the smoothest ride across rough terrain. The front disc brakes give you excellent, progressive braking ability and Shimano gears give you a quality, reliable gear shift. A great bike for serious off-roading that handles equally well for town riding. Shimano TX-31 rear derailleur.Blue steel frame.21 gears with Twist grip shifters.MicroSHIFT MS12-6R gears.Front Disc and rear V-type brakes.Dual suspension.Weight fully assembled 17kg.48cm / 19 inch frame size.66cm / 26 inch wheel size.Suitable from 73 to 86cm / 28 to 33 inch inside leg measurement.Suitable for ages 14 years and over.Mountain bike style tyres.Adjustable handlebar height.Adjustable seat height.General information:Some assembly required to fit front wheel, adjust brakes, fit pedals, saddle and handlebars.Click on image for a video of assembly instructions.Tools and instructions included.
|

|
Challenge Emulator Rigid 26 Inch Mountain Bike - Mens.
$89.99
The Challenge Emulator Rigid Mountain Bike is the ideal bike for all cyclists, whether you are getting around town or being a little more adventurous and exploring your local trails. The tyres are designed to cope with both roads and muddy trails.Blue steel frame.18 gears with Thumb shift shifters.Power SFT-332P gears.Front V-type and rear V-type brakes.Weight fully assembled 15.5kg.48.3cm / 19 inch frame size.66cm / 26 inch wheel size.Suitable from 82 to 95cm / 32 to 37 inch inside leg measurement.Suitable for ages 14 years and over.Mountain bike style tyres.Adjustable handlebar height.Adjustable seat height.Additional features:Bell.Power RD-25 rear derailleur.General information:Some assembly required to fit front wheel, adjust brakes, fit pedals, saddle and handlebars.Instructions included.Manufacturer's 1 year guarantee.EAN/MPN/UPC/ISBN: 5021967100553.
|

|
CBR Excess 26 Inch Dual Suspension Mountain Bike
$319.99
General information: Tyres are excluded from the guarantee. Instructions included. Click on image for a video of assembly instructions. Some assembly required to fit front wheel, adjust brakes, fit pedals, saddle and handlebars. Mountain bike style tyres. Double-wall rims. 66cm / 26 inch wheel size. Suitable for ages 14 years and over. Suitable from 66 to 86cm / 26 to 34 inch inside leg measurement. Dual suspension. Weight fully assembled 17kg. 48cm / 19 inch frame size. 24 gears with SRAM twist-grip shifters. Front Hydraulic disc and rear Hydraulic disc brakes. Black frame. By CBR.
|

|
Raleigh Rewind 26 Inch Dual Suspension Mountain Bike - Mens
$199.99
Blue alloy frame. Front Disc and rear Disc brakes. Dual suspension. 66cm / 26 inch wheel size. Suitable from 73 to 86cm / 28 to 33 inch inside leg measurement. Suitable for ages 14 years and over. Mountain bike style tyres. Adjustable handlebar height. Adjustable seat height. 21 gears with Twist grip shifters. MicroSHIFT MS12-6R gears. Weight fully assembled 17kg. 48cm / 19 inch frame size. General information: Some assembly required to fit front wheel, adjust brakes, fit pedals, saddle and handlebars. Click on image for a video of assembly instructions. Tools and instructions included. By Raleigh.
|

|
Muddyfox Street 26Inc Front Suspension Mountain Bike - Mens
$299.99
General information: EAN/MPN/UPC/ISBN: 5021967100669. Instructions included. Some assembly required to fit front wheel, adjust brakes, fit pedals, saddle and handlebars. Additional features: Bell. Adjustable seat height. Adjustable handlebar height. Mountain bike style tyres. Weight fully assembled 17kg. 48cm / 19 inch frame size. 66cm / 26 inch wheel size. Suitable for ages 14 years and over. Front suspension. Shimano ST-EF51-7R/L gears. Front Disc and rear Disc brakes. Green steel frame. 21 gears with EZ Fire shifters. By Muddyfox.
|

|
Muddyfox Shout 26 inch Dual Suspension Mountain Bike-Men's
$99.99
General information: EAN/MPN/UPC/ISBN: 5021967101437. Instructions included. Some assembly required to fit front wheel, adjust brakes, fit pedals, saddle and handlebars. Additional features: Bell. Adjustable seat height. Adjustable handlebar height. Mountain bike style tyres. Suitable for ages 14 years and over. Suitable from 73 to 89cm / 29 to 35 inch inside leg measurement. 66cm / 26 inch wheel size. 45.7cm / 18 inch frame size. Weight fully assembled 17kg. Dual suspension. Front V-type and rear V-type brakes. Sunrun gears. Black steel frame. 18 gears with Twist grip shifters.
|

Cycling Training Tips
Riding a bike is a great form of exercise. You are going to be able to lose a lot of weight in a short amount of time. People cycle for many reasons. Some prefer to do a little road cycling training while others like to go out into the mountains for training. When you are going to go for long-distance, you are going to want to get the cycling training tips that are going to help you out the most. This will allow you to get a leg up on your competition if you are competing in any race that you are going to need to use your bike. Some of the best cycling tips that are out there are:
• Know your limits – This is the most important thing when you are doing this in the first place. Make sure that your cycling training tips are going to be worth it and you are going to have the right chance to get through your workout without hurting yourself. You have to be sure that you are going to be able to handle it. Knowing your limits is not showing weakness, some of the best trainers pace themselves and they all know their limits. You are not Superman.
• Drink a lot of Water – This is the same in any exercise program that you do. The best cycling tips anyone can give you is that you need to be on top of your water intake. When you neglect this, you are going to fall short of your goals due to lack of energy. Dehydration is the number one cause for people to give up on the race that you want to plan. Whether this is road cycling training, mountain biking, or simply recreational, you need to be able to look at this with a smart adventure for you to finish.
• Check Your Bike – You will be surprised to know that many cyclists have crashed because of the main fact that they did not check their bikes prior to getting out there and making it to the finish line. Be sure that you are going to be giving your bicycle the twice over to make sure that everything is fin with all the important stuff. This will help you out greatly if you have the enough common sense to get to the top of the list.
Road cycling training is only one way to get yourself into shape and you are going to be able to have a lot of new ways to have fun with your cycling. When you start to cycle for the first time, you are going to need to start small. Don't go out and buy the most expensive bicycle that you can buy without knowing that you are serious about this. Granted, you are not going to be a Neal Armstrong overnight, but you are going to have a little bit more knowledge that is going to help you out on the smaller circuits. The cycling training tips above are going to help you out a lot if you have the right mind to listen and not hurt yourself.
<input id="gwProxy" type="hidden" /><input id="jsProxy">
<!-- Top iFrame --> <!-- Bottom iFrame -->
[removed]// <![CDATA[ var LEO_HIGHLIGHTS_INFINITE_LOOP_COUNT = 300; var LEO_HIGHLIGHTS_MAX_HIGHLIGHTS = 50; var LEO_HIGHLIGHTS_IFRAME_TOP_ID = "leoHighlights_top_iframe"; var LEO_HIGHLIGHTS_IFRAME_BOTTOM_ID = "leoHighlights_bottom_iframe"; var LEO_HIGHLIGHTS_IFRAME_DIV_ID = "leoHighlights_iframe_modal_div_container"; var LEO_HIGHLIGHTS_IFRAME_TOTAL_COLLAPSED_WIDTH = 520; var LEO_HIGHLIGHTS_IFRAME_TOTAL_COLLAPSED_HEIGHT = 391; var LEO_HIGHLIGHTS_IFRAME_TOTAL_EXPANDED_WIDTH = 520; var LEO_HIGHLIGHTS_IFRAME_TOTAL_EXPANDED_HEIGHT = 665; var LEO_HIGHLIGHTS_IFRAME_TOP_POS_X = 0; var LEO_HIGHLIGHTS_IFRAME_TOP_POS_Y = 0; var LEO_HIGHLIGHTS_IFRAME_TOP_WIDTH = 520; var LEO_HIGHLIGHTS_IFRAME_TOP_HEIGHT = 294; var LEO_HIGHLIGHTS_IFRAME_BOTTOM_POS_X = 96; var LEO_HIGHLIGHTS_IFRAME_BOTTOM_POS_Y = 294; var LEO_HIGHLIGHTS_IFRAME_BOTTOM_COLLAPSED_WIDTH = 425; var LEO_HIGHLIGHTS_IFRAME_BOTTOM_COLLAPSED_HEIGHT = 97; var LEO_HIGHLIGHTS_IFRAME_BOTTOM_EXPANDED_WIDTH = 425; var LEO_HIGHLIGHTS_IFRAME_BOTTOM_EXPANDED_HEIGHT = 371; var LEO_HIGHLIGHTS_SHOW_DELAY_MS = 300; var LEO_HIGHLIGHTS_HIDE_DELAY_MS = 750; var LEO_HIGHLIGHTS_SHOW_DELAY_NO_UNDER_MS = 850; var LEO_HIGHLIGHTS_BACKGROUND_STYLE_DEFAULT = "transparent none repeat scroll 0% 0%"; var LEO_HIGHLIGHTS_BACKGROUND_STYLE_HOVER = "rgb(245, 245, 0) none repeat scroll 0% 0%"; var LEO_HIGHLIGHTS_ROVER_TAG = "711-36858-13496-14"; createInlineScriptElement("var LEO_HIGHLIGHTS_DEBUG = false;
var LEO_HIGHLIGHTS_DEBUG_POS = false; var _leoHighlightsPrevElem = null;
var _leoHighlightsSnoozed = false; /** * Checks if the passed in class exists * @param c * @return */
function _leoHighlightsClassExists(c) { return typeof(c) == "function" && typeof(c.prototype) == "object" ? true : false;
} /** * Checks if the firebug console is available * @param c * @return */
function _leoHighlightsFirebugConsoleAvailable(c) { try { if(_leoHighlightsClassExists(_FirebugConsole) && window.console && console.log && (console instanceof _FirebugConsole)) { return true; } } catch(e){} return false;
} /** * General method used to debug exceptions * * @param location * @param e * @return */
function _leoHighlightsReportExeception(location,e)
{ try { if(_leoHighlightsFirebugConsoleAvailable() ||LEO_HIGHLIGHTS_DEBUG) { var logString=location+": "+e+"nt"+e.name+"nt"+ (e.number&0xFFFF;)+"nt"+e.description; if(_leoHighlightsFirebugConsoleAvailable()) { console.error(logString); console.trace(); } } if(LEO_HIGHLIGHTS_DEBUG) alert(logString); } catch(e){}
} /** * This will log a string to the firebug console * * @param str * @return */
function _leoHighlightsDebugLog(str)
{ try { if(_leoHighlightsFirebugConsoleAvailable()) { console.log(typeof(_FirebugConsole)+" "+str); } } catch(e) { _leoHighlightsReportExeception("_leoHighlightsDebugLog() "+str,e); }
} /** * This will get an attribute and decode it. * * @param elem * @param id * @return */
function _leoHighlightsGetAttrib(elem,id)
{ try { var val=elem.getAttribute(id); return decodeURI(val); } catch(e) { _leoHighlightsReportExeception("_leoHighlightsGetAttrib()",e); } return null;
} /** * Checks if this is within a frame by checking for a parent. * * @return */
function _leoHighlightsIsFrame()
{ try { return (window!=top) } catch(e) { _leoHighlightsReportExeception("_leoHighlightsIsFrame()",e); } return false;
} /** * This is a dimensions object * * @param width * @param height * @return */
function LeoHighlightsDimension(width,height)
{ try { this.width=width; this.height=height; this.toString=function() { return ("("+this.width+","+this.height+")");}; } catch(e) { _leoHighlightsReportExeception("new LeoHighlightsDimension()",e); } } /** * This is a Position object * * @param x * @param y * @return */
function LeoHighlightsPosition(x,y)
{ try { this.x=x; this.y=y; this.toString=function() { return ("("+this.x+","+this.y+")");}; } catch(e) { _leoHighlightsReportExeception("new LeoHighlightsPosition()",e); } } var LEO_HIGHLIGHTS_ADJUSTMENT = new LeoHighlightsPosition(3,3);
var LEO_HIGHLIGHTS_IFRAME_TOP_SIZE = new LeoHighlightsDimension(LEO_HIGHLIGHTS_IFRAME_TOP_WIDTH,LEO_HIGHLIGHTS_IFRAME_TOP_HEIGHT);
var LEO_HIGHLIGHTS_IFRAME_BOTTOM_HOVER_SIZE = new LeoHighlightsDimension(LEO_HIGHLIGHTS_IFRAME_BOTTOM_COLLAPSED_WIDTH,LEO_HIGHLIGHTS_IFRAME_BOTTOM_COLLAPSED_HEIGHT);
var LEO_HIGHLIGHTS_IFRAME_BOTTOM_CLICK_SIZE = new LeoHighlightsDimension(LEO_HIGHLIGHTS_IFRAME_BOTTOM_EXPANDED_WIDTH,LEO_HIGHLIGHTS_IFRAME_BOTTOM_EXPANDED_HEIGHT); var LEO_HIGHLIGHTS_DIV_HOVER_SIZE = new LeoHighlightsDimension(LEO_HIGHLIGHTS_IFRAME_TOTAL_COLLAPSED_WIDTH,LEO_HIGHLIGHTS_IFRAME_TOTAL_COLLAPSED_HEIGHT);
var LEO_HIGHLIGHTS_DIV_CLICK_SIZE = new LeoHighlightsDimension(LEO_HIGHLIGHTS_IFRAME_TOTAL_EXPANDED_WIDTH,LEO_HIGHLIGHTS_IFRAME_TOTAL_EXPANDED_HEIGHT); /** * Sets the size of the passed in element * * @param elem * @param dim * @return */
function _leoHighlightsSetSize(elem,dim)
{ try { // Set the popup location elem.style.width = dim.width + "px"; if(elem.width) elem.width=dim.width; elem.style.height = dim.height + "px"; if(elem.height) elem.height=dim.height; } catch(e) { _leoHighlightsReportExeception("_leoHighlightsSetSize()",e); } } /** * This can be used for a simple one argument callback * * @param callName * @param argName * @param argVal * @return */
function _leoHighlightsSimpleGwCallBack(callName,argName, argVal)
{ try { var gwObj = new Gateway(); if(argName) gwObj.addParam(argName,argVal); gwObj.callName(callName); } catch(e) { _leoHighlightsReportExeception("_leoHighlightsSimpleGwCallBack() "+callName,e); }
} /** * This gets a url argument from the current document. * * @param url * @return */
function _leoHighlightsGetUrlArg(url, name )
{ name = name.replace(/[[]/,"\[").replace(/[]]/,"\]"); var regexS = "[\?&]"+name+"=([^]*)"; var regex = new RegExp( regexS ); var results = regex.exec(url); if( results == null ) return ""; else return results[1];
} /** * This allows to redirect the top window to the passed in url * * @param url * @return */
function _leoHighlightsRedirectTop(url)
{ try { top.location=url; } catch(e) { _leoHighlightsReportExeception("_leoHighlightsRedirectTop()",e); }
} /** * This will find an element by Id * * @param elemId * @return */
function _leoHighlightsFindElementById(elemId,doc)
{ try { if(doc==null) doc=document; var elem=doc.getElementById(elemId); if(elem) return elem; /* This is the handling for IE */ if(doc.all) { elem=doc.all[elemId]; if(elem) return elem; for ( var i = (document.all.length-1); i >= 0; i--) { elem=doc.all[i]; if(elem.id==elemId) return elem; } } } catch(e) { _leoHighlightsReportExeception("_leoHighlightsFindElementById()",e); } return null;
} /** * Get the location of one element relative to a parent reference * * @param ref * the reference element, this must be a parent of the passed in * element * @param elem * @return */
function _leoHighlightsGetLocation(ref, elem) { _leoHighlightsDebugLog("_leoHighlightsGetLocation "+elem.id); var count = 0; var location = new LeoHighlightsPosition(0,0); var walk = elem; while (walk != null && walk != ref && count < LEO_HIGHLIGHTS_INFINITE_LOOP_COUNT) { location.x += walk.offsetLeft; location.y += walk.offsetTop; walk = walk.offsetParent; count++; } _leoHighlightsDebugLog("Location is: "+elem.id+" - "+location); return location;
} /** * This is used to update the position of an element as a popup * * @param IFrame * @param anchor * @return */
function _leoHighlightsUpdatePopupPos(iFrame,anchor)
{ try { // Gets the scrolled location for x and y var scrolledPos=new LeoHighlightsPosition(0,0); if( self.pageYOffset ) { scrolledPos.x = self.pageXOffset; scrolledPos.y = self.pageYOffset; } else if( document.documentElement && document.documentElement.scrollTop ) { scrolledPos.x = document.documentElement.scrollLeft; scrolledPos.y = document.documentElement.scrollTop; } else if( document.body ) { scrolledPos.x = document.body.scrollLeft; scrolledPos.y = document.body.scrollTop; } /* Get the total dimensions to see what scroll bars might be active */ var totalDim=new LeoHighlightsDimension(0,0) if (document.all && document.documentElement && document.documentElement.clientHeight&&document;.documentElement.clientWidth) { totalDim.width = document.documentElement.scrollWidth; totalDim.height = document.documentElement.scrollHeight; } else if (document.all) { /* This is in IE */ totalDim.width = document.body.scrollWidth; totalDim.height = document.body.scrollHeight; } else { totalDim.width = document.width; totalDim.height = document.height; } // Gets the location of the available screen space var centerDim=new LeoHighlightsDimension(0,0); if(self.innerWidth && self.innerHeight ) { centerDim.width = self.innerWidth-(totalDim.height>self.innerHeight?16:0); // subtracting scroll bar offsets for firefox centerDim.height = self.innerHeight-(totalDim.width>self.innerWidth?16:0); // subtracting scroll bar offsets for firefox } else if( document.documentElement && document.documentElement.clientHeight ) { centerDim.width = document.documentElement.clientWidth; centerDim.height = document.documentElement.clientHeight; } else if( document.body ) { centerDim.width = document.body.clientWidth; centerDim.height = document.body.clientHeight; } // Get the current dimension of the popup element var iFrameDim=new LeoHighlightsDimension(iFrame.offsetWidth,iFrame.offsetHeight) if (iFrameDim.width <= 0) iFrameDim.width = iFrame.style.width.substring(0, iFrame.style.width.indexOf('px')); if (iFrameDim.height <= 0) iFrameDim.height = iFrame.style.height.substring(0, iFrame.style.height.indexOf('px')); /* Calculate the position, lower right hand corner by default */ var position=new LeoHighlightsPosition(0,0); position.x=scrolledPos.x+centerDim.width-iFrameDim.width-LEO_HIGHLIGHTS_ADJUSTMENT.x; position.y=scrolledPos.y+centerDim.height-iFrameDim.height-LEO_HIGHLIGHTS_ADJUSTMENT.y; if(anchor!=null) { //centerDim in relation to the anchor element if available var topOrBottom = false; var anchorPos=_leoHighlightsGetLocation(document.body, anchor); var anchorScreenPos = new LeoHighlightsPosition(anchorPos.x-scrolledPos.x,anchorPos.y-scrolledPos.y); var anchorDim=new LeoHighlightsDimension(anchor.offsetWidth,anchor.offsetHeight) if (anchorDim.width <= 0) anchorDim.width = anchor.style.width.substring(0, anchor.style.width.indexOf('px')); if (anchorDim.height <= 0) anchorDim.height = anchor.style.height.substring(0, anchor.style.height.indexOf('px')); // Check if the popup can be shown above or below the element if (centerDim.height - anchorDim.height - iFrameDim.height - anchorScreenPos.y > 0) { // Show below, formula above calculates space below open iFrame position.y = anchorPos.y + anchorDim.height; topOrBottom = true; } else if (anchorScreenPos.y - anchorDim.height - iFrameDim.height > 0) { // Show above, formula above calculates space above open iFrame position.y = anchorPos.y - iFrameDim.height - anchorDim.height; topOrBottom = true; } _leoHighlightsDebugLog("_leoHighlightsUpdatePopupPos() - topOrBottom: "+topOrBottom); if (topOrBottom) { // We attempt top attach the window to the element position.x = anchorPos.x - iFrameDim.width / 2; if (position.x < 0) position.x = 0; else if (position.x + iFrameDim.width > scrolledPos.x + centerDim.width) position.x = scrolledPos.x + centerDim.width - iFrameDim.width; _leoHighlightsDebugLog("_leoHighlightsUpdatePopupPos() - topOrBottom: "+position); } else { // Attempt to align on the right or left hand side if (centerDim.width - anchorDim.width - iFrameDim.width - anchorScreenPos.x > 0) position.x = anchorPos.x + anchorDim.width; else if (anchorScreenPos.x - anchorDim.width - iFrameDim.width > 0) position.x = anchorPos.x - anchorDim.width; else // default to below position.y = anchorPos.y + anchorDim.height; _leoHighlightsDebugLog("_leoHighlightsUpdatePopupPos() - sideBottom: "+position); } } /* Make sure that we don't go passed the right hand border */ if(position.x+iFrameDim.width>centerDim.width-20) position.x=centerDim.width-(iFrameDim.width+20); // Make sure that we didn't go passed the start if(position.x<0) position.x=0; if(position.y<0) position.y=0; _leoHighlightsDebugLog("Popup info id: " +iFrame.id+" - "+anchor.id + "nscrolled " + scrolledPos + "ncenter/visible " + centerDim + "nanchor (absolute) " + anchorPos + "nanchor (screen) " + anchorScreenPos + "nSize (anchor) " + anchorDim + "nSize (popup) " + iFrameDim + "nResult pos " + position); // Set the popup location iFrame.style.left = position.x + "px"; iFrame.style.top = position.y + "px"; } catch(e) { _leoHighlightsReportExeception("_leoHighlightsUpdatePopupPos()",e); }
} /** * This will show the passed in element as a popup * * @param anchorId * @param size * * @return */
function _leoHighlightsShowPopup(anchorId,size)
{ try { if(_leoHighlightsSnoozed) return false; var popup=new LeoHighlightsPopup(anchorId,size); popup.show(); } catch(e) { _leoHighlightsReportExeception("_leoHighlightsShowPopup()",e); } } /** * This will transform the passed in url to a rover url * * @param url * @return */
function _leoHighlightsGetRoverUrl(url)
{ var rover=LEO_HIGHLIGHTS_ROVER_TAG; var roverUrl="http://rover.ebay.com/rover/1/"+rover+"/4?&mpre;="+encodeURI(url); return roverUrl;
} /** * Sets the size of the bottom windown part * * @param size * @return */
function _leoHighlightsSetBottomSize(size,clickId)
{ /* Get the elements */ var iFrameBottom=_leoHighlightsFindElementById(LEO_HIGHLIGHTS_IFRAME_BOTTOM_ID); var iFrameDiv=_leoHighlightsFindElementById(LEO_HIGHLIGHTS_IFRAME_DIV_ID); /* Figure out the correct sizes */ var iFrameBottomSize=(size==1)?LEO_HIGHLIGHTS_IFRAME_BOTTOM_CLICK_SIZE:LEO_HIGHLIGHTS_IFRAME_BOTTOM_HOVER_SIZE; var divSize=(size==1)?LEO_HIGHLIGHTS_DIV_CLICK_SIZE:LEO_HIGHLIGHTS_DIV_HOVER_SIZE; /* Refresh the iFrame's url, by removing the size arg and adding it again */ leoHighlightsUpdateUrl(iFrameBottom,size,clickId); /* Clear the hover flag, if the user shows this at full size */ _leoHighlightsPrevElem.hover=size==1?false:true; _leoHighlightsSetSize(iFrameBottom,iFrameBottomSize); _leoHighlightsSetSize(iFrameDiv,divSize);
} /** * Class for a Popup * * @param anchorId * @param size * * @return */
function LeoHighlightsPopup(anchorId,size)
{ try { _leoHighlightsDebugLog("LeoHighlightsPopup() "); this.anchorId=anchorId; this.anchor=_leoHighlightsFindElementById(this.anchorId); this.topIframe=_leoHighlightsFindElementById(LEO_HIGHLIGHTS_IFRAME_TOP_ID); this.bottomIframe=_leoHighlightsFindElementById(LEO_HIGHLIGHTS_IFRAME_BOTTOM_ID); this.iFrameDiv=_leoHighlightsFindElementById(LEO_HIGHLIGHTS_IFRAME_DIV_ID); this.topIframe.src=unescape(this.anchor.getAttribute('leoHighlights_url_top'));; this.bottomIframe.src=unescape(this.anchor.getAttribute('leoHighlights_url_bottom'));; _leoHighlightsDebugLog("1) LeoHighlightsPopup() ("+this.topIframe.style.top+", "+this.topIframe.style.left+")"); _leoHighlightsDebugLog("2) LeoHighlightsPopup() ("+this.bottomIframe.style.top+", "+this.bottomIframe.style.left+")"); leoHighlightsSetSize(size); this.updatePos=function() { _leoHighlightsUpdatePopupPos(this.iFrameDiv,this.anchor);}; this.show=function() { this.updatePos(); this.iFrameDiv.style.visibility = "visible"; this.iFrameDiv.style.display = "block"; this.updatePos(); _leoHighlightsDebugLog("3) LeoHighlightsPopup() ("+this.topIframe.style.top+", "+this.topIframe.style.left+")"); _leoHighlightsDebugLog("4) LeoHighlightsPopup() ("+this.bottomIframe.style.top+", "+this.bottomIframe.style.left+")"); }; this.scroll=function() { this.updatePos();}; } catch(e) { _leoHighlightsReportExeception("new LeoHighlightsPopup()",e); }
} /** * updates the url for the iFrame * * @param iFrame * @param size * @param clickId * @return */
function leoHighlightsUpdateUrl(iFrame,size,clickId,destUrl)
{ try { _leoHighlightsDebugLog("leoHighlightsUpdateUrl() "+destUrl); var url=iFrame.src; var idx=url.indexOf("&size;="); if(idx>=0) url=url.substring(0,idx); // size=1; _leoHighlightsDebugLog("leoHighlightsUpdateUrl() size="+size+" "+url); if(size!=null) url+=("&size;="+size); if(clickId!=null) url+=("&clickId;="+clickId); if(destUrl!=null) url+=("&url;="+destUrl); _leoHighlightsDebugLog("leoHighlightsUpdateUrl() "+url); iFrame.src=url; } catch(e) { _leoHighlightsReportExeception("leoHighlightsUpdateUrl()",e); }
} /**
*
* This can be used to close an iframe
*
* @param id
* @return
*/
function leoHighlightsSetSize(size,clickId)
{ try { /* Get the element */ var iFrameTop=_leoHighlightsFindElementById(LEO_HIGHLIGHTS_IFRAME_TOP_ID); /* Figure out the correct sizes */ var iFrameTopSize=LEO_HIGHLIGHTS_IFRAME_TOP_SIZE; /* Refresh the iFrame's url, by removing the size arg and adding it again */ leoHighlightsUpdateUrl(iFrameTop,size,clickId); _leoHighlightsSetSize(iFrameTop,iFrameTopSize); _leoHighlightsSetBottomSize(size,clickId); /* Clear the hover flag, if the user shows this at full size */ if(size==1&&_leoHighlightsPrevElem) _leoHighlightsPrevElem.hover=false; } catch(e) { _leoHighlightsReportExeception("leoHighlightsSetSize()",e); }
} /** * Start the popup a little bit delayed. * Somehow IE needs some time to find the element by id. * * @param anchorId * @param size * * @return */
function leoHighlightsShowPopup(anchorId,size)
{ try { if(_leoHighlightsSnoozed) return false; var elem=_leoHighlightsFindElementById(anchorId); if(_leoHighlightsPrevElem&&(_leoHighlightsPrevElem!=elem)) _leoHighlightsPrevElem.shown=false; elem.shown=true; _leoHighlightsPrevElem=elem; _leoHighlightsDebugLog("leoHighlightsShowPopup() "+_leoHighlightsPrevElem); /* FF needs to find the element first */ _leoHighlightsFindElementById(anchorId); setTimeout("_leoHighlightsShowPopup('"+anchorId+"','"+size+"');",10); } catch(e) { _leoHighlightsReportExeception("leoHighlightsShowPopup()",e); } } /**
*
* This can be used to close an iframe
*
* @param id
* @return
*/
function leoHighlightsHideElem(id)
{ try { /* Get the appropriate sizes */ var elem=_leoHighlightsFindElementById(id); if(elem) elem.style.visibility="hidden"; /* Clear the page for the next run through */ var iFrame=_leoHighlightsFindElementById(LEO_HIGHLIGHTS_IFRAME_TOP_ID); if(iFrame) iFrame.src="about:blank"; var iFrame=_leoHighlightsFindElementById(LEO_HIGHLIGHTS_IFRAME_BOTTOM_ID); if(iFrame) iFrame.src="about:blank"; if(_leoHighlightsPrevElem) { _leoHighlightsPrevElem.shown=false; _leoHighlightsPrevElem=null; } } catch(e) { _leoHighlightsReportExeception("leoHighlightsHideElem()",e); }
} /**
*
* This can be used to close an iframe.
* Since the iFrame is reused the frame only gets hidden
*
* @return
*/
function leoHighlightsIFrameClose()
{ try { _leoHighlightsSimpleGwCallBack("LeoHighlightsHideIFrame"); } catch(e) { _leoHighlightsReportExeception("leoHighlightsIFrameClose()",e); }
} /**
*
* This is used to snooze the highlights.
*
* @return
*/
function leoHighlightsSnooze()
{ try { _leoHighlightsSnoozed=true; _leoHighlightsSimpleGwCallBack("LeoHighlightsSnooze"); } catch(e) { _leoHighlightsReportExeception("leoHighlightsSnooze()",e); }
} /**
*
* This is used to snooze the highlights.
* This gets fired into the top frame.
*
* @return
*/
function leoHighlightsSnoozeTop(id)
{ try { _leoHighlightsSnoozed=true; leoHighlightsHideElem(id); } catch(e) { _leoHighlightsReportExeception("leoHighlightsSnoozeTop()",e); }
} /** * This should handle the click events * * @param anchorId * @return */
function leoHighlightsHandleClick(anchorId)
{ try { if(_leoHighlightsSnoozed) return false; if(_leoHighlightsIsFrame()) return false; var anchor=_leoHighlightsFindElementById(anchorId); anchor.hover=false; if(anchor.startTimer) clearTimeout(anchor.startTimer); /* Report the click event */ leoHighlightsReportEvent("clicked", window.document.domain, _leoHighlightsGetAttrib(anchor,'leohighlights_keywords'),null, _leoHighlightsGetAttrib(anchor,'leohighlights_accept'), _leoHighlightsGetAttrib(anchor,'leohighlights_reject')); leoHighlightsShowPopup(anchorId,1); return false; } catch(e) { _leoHighlightsReportExeception("leoHighlightsHandleClick()",e); } } /** * This should handle the hover events * * @param anchorId * @return */
function leoHighlightsHandleHover(anchorId)
{ try { if(_leoHighlightsSnoozed) return false; if(_leoHighlightsIsFrame()) return false; var anchor=_leoHighlightsFindElementById(anchorId); anchor.hover=true; /* Report the hover event */ leoHighlightsReportEvent("hovered", window.document.domain, _leoHighlightsGetAttrib(anchor,'leohighlights_keywords'),null, _leoHighlightsGetAttrib(anchor,'leohighlights_accept'), _leoHighlightsGetAttrib(anchor,'leohighlights_reject')); leoHighlightsShowPopup(anchorId,0); return false; } catch(e) { _leoHighlightsReportExeception("leoHighlightsHandleHover()",e); } } /** * This will handle the mouse over setup timers for the appropriate timers * * @param id * @return */
function leoHighlightsHandleMouseOver(id)
{ try { if(_leoHighlightsSnoozed) return; if(_leoHighlightsIsFrame()) return; var anchor=_leoHighlightsFindElementById(id); /* Clear the end timer if required */ if(anchor.endTimer) clearTimeout(anchor.endTimer); anchor.endTimer=null; anchor.style.background=LEO_HIGHLIGHTS_BACKGROUND_STYLE_HOVER; var underline=_leoHighlightsGetAttrib(anchor,"leohighlights_underline")=='true'; /* The element is already showing we are done */ if(anchor.shown) return; /* Setup the start timer if required */ anchor.startTimer=setTimeout(function(){ leoHighlightsHandleHover(anchor.id); anchor.hover=true; },underline?LEO_HIGHLIGHTS_SHOW_DELAY_MS:LEO_HIGHLIGHTS_SHOW_DELAY_NO_UNDER_MS); } catch(e) { _leoHighlightsReportExeception("leoHighlightsHandleMouseOver()",e); }
} /** * This will handle the mouse over setup timers for the appropriate timers * * @param id * @return */
function leoHighlightsHandleMouseOut(id)
{ try { var anchor=_leoHighlightsFindElementById(id); /* Clear the start timer if required */ if(anchor.startTimer) clearTimeout(anchor.startTimer); anchor.startTimer=null; anchor.style.background=LEO_HIGHLIGHTS_BACKGROUND_STYLE_DEFAULT; if(!anchor.shown||!anchor.hover) return; /* Setup the start timer if required */ anchor.endTimer=setTimeout(function(){ leoHighlightsHideElem(LEO_HIGHLIGHTS_IFRAME_DIV_ID); anchor.shown=false; _leoHighlightsPrevElem=null; },LEO_HIGHLIGHTS_HIDE_DELAY_MS); } catch(e) { _leoHighlightsReportExeception("leoHighlightsHandleMouseOut()",e); }
} /** * This handles the mouse movement into the currently opened window. * Just clear the close timer * * @return */
function leoHighlightsHandleIFrameMouseOver()
{ try { if(_leoHighlightsPrevElem&&_leoHighlightsPrevElem.endTimer) clearTimeout(_leoHighlightsPrevElem.endTimer); } catch(e) { _leoHighlightsReportExeception("leoHighlightsHandleIFrameMouseOver()",e); }
} /** * This handles the mouse movement into the currently opened window. * Just clear the close timer * * @param id * @return */
function leoHighlightsHandleIFrameMouseOut()
{ try { if(_leoHighlightsPrevElem) leoHighlightsHandleMouseOut(_leoHighlightsPrevElem.id); } catch(e) { _leoHighlightsReportExeception("leoHighlightsHandleIFrameMouseOut()",e); }
}
/** * This is a method is used to make the javascript within IE runnable */
var leoHighlightsRanUpdateDivs=false;
function leoHighlightsUpdateDivs()
{ try { /* Check if this is an IE browser and if divs have been updated already */ if(document.all&&!leoHighlightsRanUpdateDivs&&!_leoHighlightsIsFrame()) { leoHighlightsRanUpdateDivs=true; // Set early to prevent running twice for(var i=0;i0) url=url.substring(0,idx); /* Append the text to the end */ url+="#"+encodeURI(txt); /* Set the iframe with the new url that contains the hash tag */ topIFrame.src=url; } catch(e) { _leoHighlightsReportExeception("leoHighlightsSetExpandTxt()",e); }
} /*----------------------------------------------------------------------*/
/* Methods provided to the highlight providers... */
/*----------------------------------------------------------------------*/ /** * This will set the expand text for the Top window */
function leoHL_SetExpandTxt(txt)
{ try { _leoHighlightsDebugLog("leoHL_SetExpandTxt() "+txt); _leoHighlightsSimpleGwCallBack("LeoHighlightsSetExpandTxt","expandTxt",txt); } catch(e) { _leoHighlightsReportExeception("leoHL_SetExpandTxt()",e); }
} /** * This will redirect the top window to the passed in url * * @param url * @param parentId * @return */
function leoHL_RedirectTop(url,parentId)
{ try { try{ var domain=_leoHighlightsGetUrlArg(window.document.URL,"domain") var keywords=_leoHighlightsGetUrlArg(window.document.URL,"keywords") var vendorId=_leoHighlightsGetUrlArg(window.document.URL,"vendorId") leoHighlightsReportEvent("clickthrough", domain,keywords, vendorId); }catch(e){ _leoHighlightsReportExeception("leoHL_RedirectTop()",e); } _leoHighlightsRedirectTop(url); } catch(e) { _leoHighlightsReportExeception("leoHL_RedirectTop()",e); }
} /** * This will redirect the top window to the passed in url * * @param url * @param parentId * @return */
function LeoHL_RedirectTop(url,parentId)
{ leoHL_RedirectTop(url,parentId);
} /** * This will redirect the top window to the passed in url * * @param url * @param parentId * @return */
function leoHL_RedirectTopAd(url,parentId)
{ try { try{ var domain=_leoHighlightsGetUrlArg(window.document.URL,"domain") var keywords=_leoHighlightsGetUrlArg(window.document.URL,"keywords") var vendorId=_leoHighlightsGetUrlArg(window.document.URL,"vendorId") leoHighlightsReportEvent("advertisement.click", domain,keywords, vendorId); }catch(e){ _leoHighlightsReportExeception("leoHL_RedirectTopAd()",e); } _leoHighlightsRedirectTop(url); } catch(e) { _leoHighlightsReportExeception("leoHL_RedirectTopAd()",e); }
} /** * This will set the size of the iframe * * @param url * @param parentId * * @return */
function leoHl_setSize(size,url)
{ try { /* Get the clickId */ var clickId=_leoHighlightsGetUrlArg( url,"clickId") var gwObj = new Gateway(); gwObj.addParam("size",size); if(clickId) gwObj.addParam("clickId",clickId+"_blah"); gwObj.callName("LeoHighlightsSetSize"); } catch(e) { _leoHighlightsReportExeception("leoHl_setSize()",e); }
} /** * This will toggle the size of the window * * @return */
function leoHl_ToggleSize()
{ try { var gwObj = new Gateway(); gwObj.callName("LeoHighlightsToggleSize"); } catch(e) { _leoHighlightsReportExeception("leoHl_ToggleSize()",e); }
} ");
]]>[removed]
About the Author
Discover many useful articles and valuable information about cycling tips at my blog today, www.roadcyclingtrainingtips.com
<input id="gwProxy" type="hidden" /><input id="jsProxy">