IF YOU HAVE NOT ALREADY DONE SO, PLEASE DO VISIT THE BELOW PETITION AND SIGN FOR ELVIS’ BIRTHDAY TO BE MADE A NATIONAL HOLIDAY.
https://www.change.org/p/us-government-make-january-8th-elvis-presley-s-birthday-of-every-year-a-national-holiday?recruiter=11063340&utm_source=share_petition&utm_medium=email&utm_campaign=share_email_responsive
Choose who must hold the title of the king for 2016!
Elvis Presley – The King of Music 2015. All Hail The King!
PLEASE DON’T FORGET TO VISIT “THE KING OF MUSIC” POLLING SITE AND VOTE FOR ELVIS EVERY SINGLE DAY DURING 2016. WE SIMPLY CANNOT LET ANYONE ELSE CLAIM ELVIS’ RIGHTFUL TITLE. BELOW IS THE LINK TO THE SITE FOR VOTING:
http://thekingofmusic.com/
I vote every single day and I hope everyone who reads this will do so also for every day the rest of this year.
Lets make it happen again for this new year of 2016!
<<<<<<<<<<>>>>>>>>>>
MORE GOOD NEWS FOR 2015
Lets make it happen again for this new year of 2016!
The Song of Ages 2015 is Suspicious Minds – Elvis Presley.
Let’s all remember to vote every single day in 2016 for this same song again or any Elvis song which may be added to the list. Below is the link for voting for the new year.
http://songofages.com/
<<<<<<<<<<>>>>>>>>>>
TUESDAY, MARCH 1, 2016
I love this beautiful photo from Facebook…
<<<<<<<<<<>>>>>>>>>>
WEDNESDAY, MARCH 2, 2016
I still get questions from people asking if Jesse really did die last year. I want to share the following article which refutes the satirical article which was published stating that an 80-year-old homeless man whose body was found was Elvis and that DNA tests showed that he was Elvis Presley. I am sharing the following Snopes report showing that the article was only done as a spoof. I have answered a number of individual questions about this silly article but there are still rumors floating around which still gain attention and questions.
http://www.snopes.com/media/notnews/elvishomeless.asp
FALSE: Dead Ringer Singer

snopes

Claim: The body of a homeless man found in San Diego has been identified as that of Elvis Presley.
![]() |
FALSE |
Example: [Collected via email, January 2015]
Origins: On 31 January 2015, Empire News published an article positing the body of a homeless man discovered in San Diego was found through DNA testing to be that of singer Elvis Presley:
Earlier this month, an 80-year-old, homeless, white-bearded man was found deceased under an overpass in San Diego, California. Nobody knew the man’s name, but friends referred to him as Jessie, so investigators decided to try DNA testing with hopes that something would pop up in the nationwide DNA database. What popped up on the computer screen in the high-tech lab stunned everyone. The DNA results of ‘Jessie Doe’ were an exact match to the one and only, Elvis Aaron Presley.
Lab technician Robert Brensdale said he and his lab assistant, Madeline Hedgespeth, laughed when the name popped up. “We thought somebody, somewhere, somehow in the system pulled the greatest and most elaborate prank on us ever, we both laughed with hysteria for about an hour,” Brensdale told Jerry Hardin of the Hollywood Word, a new entertainment publication based out of Los Angeles.
Soon afterwards links and excerpts referencing this article were being circulated via social media, with many of those who encountered the item mistaking it for a genuine news article. However, the report was just a spoof of the ubiquitous “Elvis is alive” and “Elvis faked his death” rumors that have circulated ever since the singer passed away in August 1977, accompanied by an artificial rendering of what an elderly Elvis might look like. The spoof was published by the Empire News, a fake news web site that issues fictional stories such as “Cure for Cancer Discovered; ‘Amazingly Simple’ Says Researcher,” and “College Student Excused from Classes After Dog Eats Grandmother,” and “Woman Gives Birth, Confuses Doctors by Asking for Maternity Test.” The site’s disclaimer notes that “Empire News is intended for entertainment purposes only.”
Please do share this with anyone you know who may have been taken in by this sick joke.
<<<<<<<<<<>>>>>>>>>>
Below is a very good video of one of Elvis’ entire shows in Las Vegas in December 1976. He was such a wonderful professional who put on a wonderful show for his audience even though his heart and mind were so troubled at this point in time. The very sad notes which he wrote in his hotel room were written during this same month. He loved his fans and loved singing so much. He always made his work look so easy and fun for him to do. That is a professional! This show is an example of the reason his fans did not think he was unhappy and miserable…why they can’t believe that he would leave.
This video was shared on Facebook by Jeannette and I extend my thanks to her.
elvis presley – las vegas 3 december 1976 – full show, video and audio
great full show with original but upgraded video and audio. Complete with band solos!
Don’t forget to check out my other Elvis shows! More to come!!
http://www.elvispresley4you.simpsite.nl
I do want to state here and now, though, that I feel that whoever fished these extremely private notes from the trash can in Elvis’ private hotel suite and then sold them was the worst kind of low-life traitor. I share this here only to substantiate what Jesse, himself, has stated about his reasons for choosing to end the life of “Elvis” (the image) on August 16, 1977.
I do feel that this is permissible with Jesse since he wrote about his situation, back then, in his book “The Truth About Elvis Aron Presley In His Own Words“. He wrote in the introduction to his book that he was “lonely, depressed , in bad health…” Jesse told me himself, during one of our phone visits, that “the last two years of my life were pure misery“.
Below is a copy of this page from his letter for the introduction to his book:
Below is the cover of a magazine from 1995 which carried their article about these handwritten notes as a cover story.
Because this magazine is 25 years old and it is very difficult to find used copies…I am sharing the full article. No profit is being made from this material so I am following the Fair Use allowance as shown below:
FAIR USE
Copyright Disclaimer Under Section 107 of the Copyright Act 1976, allowance is made for “fair use” for purposes such as criticism, comment, news reporting, teaching, scholarship, and research. Fair use is a use permitted by copyright statute that might otherwise be infringing. Non-profit, educational or personal use tips the balance in favor of fair use.”
Cover of the magazine:
YouTube – The (Elvis) Letter Help me Lord owned by Judith Bruyn
httpv://youtu.be/NqYjal0MpAU
YouTube – Wayne Newton Interview About Elvis Uploaded by MeganMMurphy on Oct 29, 2009
I do have a page on my site devoted to the topic of Wayne Newton’s song “The Letter“. Below is the link to my page:
That is a page which I created a number of years ago. Some of my above material appears on that page…but this article contains much better scans as the scans on that page were made from my much older scanner.
Think on This …
Try to see self in the other’s place. And this will bring the basic spiritual forces that must be the prompting influence in the experience of each soul, if it would grow in grace, in knowledge, in understanding; not only of its relationship to God, its relationship to its fellow man, but its relationship in the home and in the social life.
By Edgar Cayce
“Walk A Mile In My Shoes….before you abuse, criticize and accuse, walk a mile in my shoes”. Sung by Elvis who always exemplified compassion toward others.
<<<<<<<<<<>>>>>>>>>>>
THURSDAY, MARCH 3, 2016
I vote every single day and I hope everyone who reads this will do so also for every day the rest of this year.
http://thekingofmusic.com/ http://songofages.com/

<<<<<<<<<<>>>>>>>>>>
I have some very sad and worrisome news to share. This is a prayer request for my dear friend, hero, and website host and co-administrator, Mark Crowson.
Mark called me yesterday to tell me about some major health problems that he has learned about this week. I just saw that he has posted it on his Facebook page now. Since he has made it public, I do want to share Mark’s post about his health issues here for my regular visitors to see.
I ask that everyone, please, pray for Mark, his wife and children, and for his health care providers to find the correct answers and treatments.
Below is Mark’s Facebook post:
Mark Crowson
46 mins ·
11 Years ago I was diagnosed with chronic myeloid leukemia. I underwent many different treatment options and I have stayed in remission since. Three years ago I was taken to the hospital after waking up and feeling like I had a stroke. I was released after the doctors could not determine what was wrong. Not two days letter I was rushed back to the hospital with a headache so bad I felt like my brain was being torn in half. I went to see another holistic doctor and have not had any symptoms since. I have had several headaches ( not as bad ) and on frequent occasion I have pains. I assumed it was from gaining weight and losing weight. Two months ago I went to the doctor for a small situation and they took labs and compared it to my first hospital visit above. I assumed all was well. For now, it appears it is not. I was called earlier this week and told that I have LUPUS and now possible non hodgkin’s lymphoma. Yep, the BIG C (cancer) is possibly back with a vengeance and brought a friend to the surprise party. Today, Crystal and I will start a series of blood work and test and followed by second and yes third opinions to see what our Lord has planned for our family and my health. Please pray for the doctors and technicians, our employees (friends) and most importantly my precious wife and children. Pray for strength and guidance and a restorations of our minds, spirit and of course my body. I can deal with the idea of cancer. The LUPUS is what concerns my heart as there is no cure and it brings multiple challenges. There is no cure just treatment for pain management or to adjust to the complications that it brings.
<<<<<<<<<<>>>>>>>>>>
Jesse called me this afternoon and we had a really good visit. He is doing fine. Most of our conversation was private. But, we did speak of the loss of Dr. Nick and Jesse and I were in complete agreement regarding the way Dr. Nick has been treated. I don’t think that Jesse will mind my quoting two things he said “Dr. Nick took a lot of secrets to his grave.” and “He was railroaded.” I have always said that Dr. Nick’s problems were all started by Geraldo Rivera doing his so-called “investigation” and subsequent 20/20 expose’. Jesse agrees with this and we both dislike Geraldo very much and feel that he is an egotistical person who cares only about advancing himself.
<<<<<<<<<<>>>>>>>>>>
SENT TO JESSE THROUGH THIS POINT ON FRIDAY, MARCH 4, 2016
<<<<<<<<<<>>>>>>>>>>
SATURDAY, MARCH 5, 2016
I really like the collage showing Elvis through the years. It was posted on Facebook by The Authorized Worldwide United Elvis Admin Group
Of course, I HAVE to add just one more photo (from 1994) to their collage. Ha, ha.
<<<<<<<<<<>>>>>>>>>>
‘Million Dollar Quartet’ TV series casts Elvis, other roles
Drake Milligan, a young but longtime Elvis “tribute artist,” will play the Man Who Will Be (the) King, in the upcoming TV series “Million Dollar Quartet.”
By John Beifuss of The Commercial Appeal
Drake Milligan, a young Texan and frequent Graceland visitor who has been an Elvis “tribute artist” since age 8, has been cast as Elvis Presley in “Million Dollar Quartet,” the upcoming CMT series about the Memphis-based birth of rock and roll.
Country Music Television announced the casting Thursday during an event promoting the network’s 2015-2016 season in New York.
“Milllion Dollar Quartet” is set to begin filming April 4 in Memphis. The eight-episode season — the first in what CMT hopes will be a yearslong hit — is scheduled to debut in November.
Milligan, from Mansfield, Texas, previously portrayed Elvis as a 1953 Humes High student in a 16-minute short titled “Nobody,” shot in Memphis in 2014. “Million Dollar Quartet” will bring him back to town to again play a pre-fame student Elvis.
The first season of “Million Dollar Quartet” is set to end in 1954, the year Presley made his epochal recordings at Sun and two years before Presley, Johnny Cash, Jerry Lee Lewis and Carl Perkins met for the impromptu studio session that earned the singers the “Million Dollar Quartet” label.
Other announced cast members include Kevin Fonteyne (ABC Family’s “Melissa & Joey,” Showtime’s “Masters of Sex”) as Cash, and twins Christian and Jonah Lees as cousins Jerry Lee Lewis and Jimmy Swaggart. Like Fonteyne, the Lees brothers have extensive television credits.
Produced by Leslie Greif’s Los Angeles-based Thinkfactory Media in conjunction with CMT, “Million Dollar Quartet” is expected to spend at least $17 million in Memphis and Shelby County over the next few months so the production can qualify for $4.3 million in state funds set aside for local filmmaking. This would dwarf the amounts spent in West Tennessee by such past movie/television projects as “Walk the Line,” “The Firm” and “The People vs. Larry Flynt.” The series director will be London-born Roland Joffe, a two-time Oscar nominee (for “The Killing Fields” and “The Mission”) who previously worked with Greif on the recent History Channel miniseries “Texas Rising.”
http://www.commercialappeal.com/blogs/entertainment/go-play/Million-Dollar-Quartet-Cast-Its-Elvis-Others-371082261.html
<<<<<<<<<<>>>>>>>>>>
MONDAY, MARCH 7, 2016
Below is the photo of one of the rings which Jesse gave to my husband, Tom, years ago. I have displayed this photo on my site before. However, I recently came upon some new information which substantiates the note which Jesse wrote to Tom about the ring. At the time, for some reason, I just assumed it was his right wrist.
Over the weekend I happened upon a website specializing in celebrity X-rays. This came to me through a news alert for Elvis’ name to which I subscribe. When I glanced at the site and read the article about Elvis’ broken wrist, I found it amazing that this wrist X-ray is of Elvis’ left wrist and shows that it was broken during Karate practice in the month of September, 1973.
You will note in Jesse’s note to Tom, he wrote that it was broken by Kang Rhee, his Karate instructor. You will also see that the identifying label on the X-ray itself shows that it took placed in SEPT, 1973. While Jesse wrote, from his memory, that it was in SEPT., 1974. I believe that this article pertains to the broken wrist to which Jesse referred…but that he was off one year in his memory of when it happened. This is completely understandable as it had been well over 35 years at the time that Jesse wrote his note to Tom shown below.
I don’t know about everyone else, but I experienced two excruciating injuries myself much more recently than 35 years. Once I tore the meniscus in my knee and the pain was excruciating and took a very long time to heal. The other was a stress fracture in my spine. Both of these were so painful that the memory of the events is indelibly burned into my memory. However, if someone held a gun to my head, I could not begin to remember the year that my injuries took place.
So, in Jesse’s note, the month of SEPT was correct and the year was off only one year.
When I first shared the photo of the ring and note, it was associated with an X-ray of Elvis’ right wrist and a photo of Elvis with his right hand injured. Now that I have this new documentation, I feel certain that Jesse was referring to his left wrist as shown in this new material.
http://www.two-views.com/celebrity/elvis-presley-wrist-xray.html#sthash.KYChsGUW.xbpBgvxn.dpbs
<<<<<<<<<<>>>>>>>>>>
TUESDAY, MARCH 8, 2016
I worked on restoring some of the very early Current News and Events pages recently. It is a very slow and tedious task and something that I have not gotten around to tackling for a number of years. Pages 1, 2, and 3 are pretty much back in good shape. The pages are very complicated because there are so many images, video links, links to other pages on my site, etc. I did not realize, until I was working on them, that many of the links to my own other pages were no longer working.
Below is the announcement which I posted last night on the master Current News and Event’s page.
SPECIAL ANNOUNCEMENT AND AN APOLOGY TO MY VISITORS:
I have become aware that over the course of the past almost 7 years, a lot of my material on my early Current News and Events Pages has been lost or shuffled. I see there are missing photos, videos and some of the links are no longer valid. I am embarrassed very much by this as it was always my intention for everything on my site to be available in a perfectly organized and easy manner to access. From day one, I worked so hard to make sure that everything was in order and nothing left out of my pages.
I see now that so much material has been scrambled or lost altogether due to moving from one web host to another following a sabotage of my website on my original location years ago. That first web host encrypted my material making it impossible to reconstruct my site on this new location properly. I have gone back and tried to fix some of those Current News Pages. Now, I see that even after that, more material was lost later when this present site was updated to a newer version several times.
This is not the fault of my present website host/administrator. It just happened in the course of making needed changes and improvements to the format of the site.
I said all of that to say that I have worked many, many hours just attempting to put things right on just one of the several Current News and Events pages and have come to see that I probably am not going to be able to ever get them ALL repaired. However, I will continue attempting to correct them as time, health, etc. permit. There is still some important information available on all of the pages, so please do take a look at all pages.
So, I ask that each visitor, please, don’t judge my entire site by the condition of some of the early Current News and Events pages. These pages were pristine when they were first created…honest! Thank you for your understanding and patience.
I have begun feeling some better and have been concentrating on my web site. I have decided to permanently cease my correspondence. I love being in touch with people, but there is only one of me and many contacts. Stress is a big factor in how I handle my Fibromyalgia and therefore, I am finding more ways to spend some time resting and relaxing. Also, I want to concentrate on catching up on some maintenance of my existing pages. So, once again, I apologize for not responding to Emails, comments on the Messages For Jesse page, messages on Facebook, etc. I do appreciate all of my visitors very much and have tried my best to respond to the correspondence which I receive. However, my correspondence had reached a point of consuming much of my days which left me very little time to research and compose new articles for my site. Thank you all for forgiving and understanding my limitations.
<<<<<<<<<<>>>>>>>>>>
THURSDAY, MARCH 10, 2016
I have two things to address here this morning:
First of all, I worked for hours last night again trying to restore the lost material from the early Current News and Events Pages. I had thought that I was through with the Page #3. However, last night I found more of the lost material from that page and so I began attempting to reconstruct more on that page. I worked for hours and was only able to restore one more article. It ended in frustration and near tears for me. For this reason, I may have to just post a notice at the top of the pages which are damaged and move on. I am not totally giving up yet…but may have to do so. I do sincerely apologize for this. I really hate this because those early pages contained so much of my documentation when I was fighting against attacks so desperately to establish my site’s credibility.
I must explain that, when the first round of damage took place, my entire site was in the condition which these first pages are in now. I worked for endless days to restore all of my pages which are dedicated to one topic as I felt those were most important and they still are. By the time I completed restoring all of those pages, I just simply didn’t have the will power to tackle the Current News Pages and so I felt those pages were not as critical to the completeness of my site as perhaps many newcomers to my site would not go back to read all of the past current news. And so, I kept putting off restoring those news pages because I was working so hard to keep adding new material to the site. It nagged in the back of my mind about those pages though.
All of that damage occurred when my former web host (TipTop), without my knowledge, encrypted all of my own personal material to prevent me from moving my site to another location. My site with TipTop was sabotaged and they sold my domain name out from under me. This was causing me to lose my web site altogether along with my visitor following. That was when my current web host (my hero) came to me and offered his services to construct the new site for me. He, together with his legal counsel, contacted the entity who had bought my domain name from TipTop and using the legal grounds was able to regain my domain name so that my new site could continue under the same title. This made it possible for my visitors to continue to find my site. My new web host could not fix nor control that TipTop had encrypted all of my material. That is when the most major damage occurred.
Since then, my web host has done several major, and wonderful, revamps to my site to make the site better. During the first of these revamps, some of my material was lost again. I did not realize the extent of this at the time. I just recently realized that this second damage went farther on my site than I initially realized. I had pretty much thought that it was only the first 10 Current News pages which were still affected from the first move of the site. I now see that there is some remaining damage to some other pages even after I tried to repair those changes as well.
This is all rather overwhelming to me and I am embarrassed for visitors to the see the sloppy appearance on some pages. I worked so diligently to make sure that I had everything presented clearly and that it was easily followed and accessed.
I explain all of this simply to apologize and to explain why I may not be able to correct all of the damage.
Thank you to all of my visitors for understanding.
Now, the second thing is this:
Last night I was unpleasantly made aware that one of the biggest lies published about me, Jesse and my website has resulted in a major slander to me personally as it is in search results for my name and includes personal photos of me.
Below is the link to the search results:
http://bit.ly/1YuNAx5
Here are the images to which I refer:

The above proves that once something is published on the Internet it is there forever and multiplies and grows. Even a lawsuit cannot make it go away. I am fully aware that, because of my site, I have made myself a public figure of sorts and that I have to accept the problems that can arise from that. But, dumb me, I thought that truth and justice would still prevail. Not so in today’s world.
I have addressed the accusation that the man in my photo of Jesse, who IS Elvis, is the same man as shown in the black and white 1950’s photo. I proved in December, 2013 that this accusation is false and is a slander to me. But nothing stops the perpetrator of this lie. Below is some of my article from December, 2013 which proves that the accusation was a lie.
Showing results forlinda sigmon hood debunked elvis photos
Search instead forlinda sigmond hood’s debunked elvis photos
SATURDAY, DECEMBER 21, 2013
A new good friend,Declan posted the following links on our blog page. These links furnish us with photos of Jerry Presley’s father in much more recent years than the one in 1950 when he was holding his twin little boys, Jerry and Terry.
You will see in the two photos below which I would guess were taken in the 1970’s and 1990’s…(judging by Jerry’s own age in these photos) absolutely prove beyond all shadow of a doubt that Jesse’s photo is of Jesse himself, WHO IS/WAS ELVIS ARON PRESLEY. This proves that it is not Jerry Presley’s father in Jesse’s 1994 photo.
REV. DALE PRESLEY 1950 – 1970’s – 1990’s or later

Rev. Dale Presley in 1950 holding his twin sons, Jerry and Terry.
http://www.jerrypresleyshow.com/photos/history04.htm
footnote: I just tested this link and found that it no longer exists. I am sorry about this. Thank the good lord that I did salvage the photos back in 2013. Evidently Jerry Presley has removed them from his site.

Rev. Dale Presley shown above with Jerry and other family members. 3rd man from your right is Rev. Presley (wearing the blue checkered shirt). http://www.jerrypresleyshow.com/photos/history17.htm
footnote: I just tested this link and found that it no longer exists. I am sorry about this. Thank the good lord that I did salvage the photos back in 2013. Evidently Jerry Presley has removed them from his site.

Rev. Dale Presley shown above with Jerry and other family members. 3rd man from your right is Rev. Presley.
http://www.jerrypresleyshow.com/photos/history24.htm
footnote: I just tested this link and found that it no longer exists. I am sorry about this. Thank the good lord that I did salvage the photos back in 2013. Evidently Jerry Presley has removed them from his site.
My heartfelt thanks to Declan for his wonderful help with this issue.
Below is the link to my page on which this full story relating to the above appears:
So there you have it….Jesse’s and my truth. Take it or leave it.
<<<<<<<<<<>>>>>>>>>>
THURSDAY, MARCH 10, 2016
Just want to share that Jesse did phone me tonight and we had a very nice visit. He sounded great and said that he is doing OK today. He has arthritis in his fingers and they hurt and he has some trouble sleeping. He again spoke to me about the fact that he HAD to leave when he did. He said it was not a hoax but something that HAD to be done. He said he could not see himself at 42 continuing and doing as many shows as they wanted him to. I told him that I completely understand and that I am thankful that he did do what he did. He said if he was at Graceland, what could he do? There would be nothing for him to do. He couldn’t even go out on the porch. He said that he is glad that it is the way it is now. I am so glad for him and so thankful for the safe and private life he now has. He said again that someday, the truth will be known. As I have said many times before, I hope I am gone from this earth before that takes place. I don’t want to be in this world without Tom and Jesse.
<<<<<<<<<<>>>>>>>>>>
SENT TO JESSE THROUGH THIS POINT ON FRIDAY, MARCH 11, 2016
<<<<<<<<<<>>>>>>>>>>
SATURDAY, MARCH 12, 2016
Below is an audio of a song which came out on the Orion Rockabilly album. Below that is a performance of Elvis in 1974 of the same song. I love the Orion song and have always believed that it is Elvis on this particular song. Jesse confirmed that it is him on some of the Orion songs…but we have never discussed which songs are really done by him. I thought my visitors would enjoy hearing the Orion version of Long Tall Sally compared to the Elvis version of the same song. See what you think!
Long Tall Sally from the Orion Rockabilly Album
elvis presley – rock medley 1974 – very rare
elvis live – rock medley 1974 – awesome!! Including footage live in Memphis 1974
http://www.elvispresley4you.simpsite.nl
I thank my good friend, Lucilia, who shared this video with me on Facebook sometime ago. This is the first chance I have had to record the song from my Orion collection and load it onto my site.
This Orion album is available as an MP3 download on Amazon. If you are a Prime member, you may play some of the songs for no charge.
Sun Collector Classics – Rockabilly
<<<<<<<<<<>>>>>>>>
This is interesting news coming from Loretta Lynn in an interview this week.
LORETTA LYNN MAKES SURPRISING CONFESSION ABOUT ELVIS THAT NO ONE SAW COMING
Loretta Lynn and Elvis Presley are two of the greatest musical artists to ever live. Presley is ranked as the second best-selling solo artist in the United States of all time, while Lynn is the most awarded female artist in country music history. Over the course of her career, Lynn has collaborated with a number of other major stars and made lots of friendships along the way. As it turns out, her and Presley shared a friendship while he was still alive, even though they never really hung around with one another.
During an interview with Bravo TV about some of her famous friends, Lynn made a confession that no one saw coming. Before Presley passed away, the two of them had made plans to write a song together, but they never got the chance to do so.
“You know, we were gonna write together, two weeks before he died, we talked about it. We were gonna get together and write and we never got to.”
Wow, what a missed opportunity that was. We wonder what kind of song Presley and Lynn would have ended up writing together? Maybe it even would have been a duet! Since Lynn never got the chance to write a song with Presley, she’s performed some of his famous songs throughout the years. One such occasion was her 1980 performance of Presley’s emotional song, “In the Ghetto” which you can watch below, along with her full Bravo TV interview.
It’s such a shame that Presley and Lynn never got the chance to collaborate, because that would have been one incredible song!
http://countryrebel.com/blogs/videos/114022979-loretta-lynn-makes-surprising-confession-about-elvis-that-no-one-saw-coming
<<<<<<<<<<>>>>>>>>>>
SUNDAY, MARCH 13, 2016
Elvis Presley estate sues Las Vegas casino for holding memorabilia “hostage”
BY SALLY HO, ASSOCIATED PRESS
LAS VEGAS (AP) The Elvis Presley estate has filed a lawsuit against a Las Vegas casino-hotel that is holding artifacts and memorabilia involving the King as part of a leasing dispute.
Elvis Presley Enterprises Inc. filed the lawsuit Monday in Clark County District Court seeking to retrieve stage outfits, jewelry, letters and a high school yearbook, among other artifacts from the career, home and wedding of Elvis.
The estate and business group is trying to get back hundreds of items it loaned to the much-hyped “Graceland Presents Elvis” attraction at the Westgate Las Vegas Resort and Casino.
The off-Strip property took control of the items last month when it shut down the attraction that includes a museum exhibit, wedding chapel and theater. The move came after the third-party operator, Exhibit A Circle, said it was quitting.
The lawsuit accused the casino of holding the valuables hostage for leverage in its leasing dispute with Exhibit A Circle, noting the estate has been cut off from a
urity camera that allowed it to monitor the items. It’s asking the court to order the items be returned and seeks punitive damages.
Elvis Presley Enterprises declined to comment further on its lawsuit but previously said Westgate aggressively seized the valuables without a legitimate legal basis. Elvis Presley Enterprises runs the Graceland attraction in Memphis, Tennessee.
Westgate’s chief operating officer Mark Waltrip declined to discuss the case.
The latest lawsuit is separate from the legal dispute between the casino and Exhibit A Circle that is being reviewed by an independent arbitrator. The Elvis estate group says it’s not involved but Exhibit A Circle’s manager is also the managing partner of the company that owns a majority of Elvis Presley Enterprises.
Westgate maintains that Exhibit A Circle defaulted on its 10-year lease with the casino. Waltrip suggested the closure was caused by poor attendance but he said the casino spent millions of dollars outfitting the space and wants to recoup money owed as part of that leasing agreement. He said the company hopes to reach an amicable solution with all parties.
Exhibit A Circle previously said the casino violated the contract first but declined to elaborate.
http://weartv.com/news/entertainment/elvis-presley-estate-sues-las-vegas-casino-for-holding-memorabilia-hostage
<<<<<<<<<<>>>>>>>>>>
MONDAY, MARCH 14, 2016
I want to add a small footnote about my above article comparing the Orion version of Long Tall Sally with Elvis’ version. All the years that I have enjoyed the Orion version while believing that it really is Elvis, I have gotten a little smile of happiness and amusement because, to me, it seems to be a message song from Elvis. Listen to the words carefully. He changed one crucial word in the song to make it about him dodging so people won’t see him. In the lyrics where it says “Saw Uncle John with bald-headed Sally…saw Aunt Mary coming, so I ducked back in the alley”. Also, I enjoy hearing him sing “Everything’s all right” repeatedly ’cause to me, it is him telling us all that he is OK and still here and that he is “gonna have some fun” for a change.
<<<<<<<<<<>>>>>>>>>>
TUESDAY, MARCH 15, 2016
I thank my friend, Mike, for sending this video to me. I think Jesse will enjoy seeing this. I certainly did.
Elvis Presley 1954 (First Ever Colour Shots).
<<<<<<<<<<>>>>>>>>>>
WEDNESDAY, MARCH 16, 2016
My friend, Jeannette shared the below photo on my Facebook timeline and I thank her. I love the beautiful expression on Elvis’ face in this picture. You can just see the love and good will coming from his soul.
<<<<<<<<<<>>>>>>>>>>
WEDNESDAY, MARCH 16, 2016
I thank Nerida who shared this video with me on my Facebook timeline. I will put this on my weekly DVD to Jesse in case he may enjoy it.
Elvis Pearl Harbour Concert
Published on Apr 14, 2012
The CD is re-mastered for the first time ever, presenting Elvis’ last concert in March, 1961, before returning to the stage 8 years later!
<<<<<<<<<<>>>>>>>>>>
WEDNESDAY, MARCH 16, 2016
I believe I shared the below video early on in my site…now on one of those pages which is missing so much material. It is so good that I want to share it again.
// // <![CDATA[
/*!
* jQuery JavaScript Library v1.4.2
* http://jquery.com/
*
* Copyright 2010, John Resig
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* Includes Sizzle.js
* http://sizzlejs.com/
* Copyright 2010, The Dojo Foundation
* Released under the MIT, BSD, and GPL Licenses.
*
* Date: Sat Feb 13 22:33:48 2010 -0500
*/
(function( window, undefined ) {
// Define a local copy of jQuery
var jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context );
},
// Map over jQuery in case of overwrite
_jQuery = window.jQueryWS,
// Map over the $ in case of overwrite
_$ = window.$,
// Use the correct document accordingly with window argument (sandbox)
document = window.document,
// A central reference to the root jQuery(document)
rootjQuery,
// A simple way to check for HTML strings or ID strings
// (both of which we optimize for)
quickExpr = /^[^<]*()[^>]*$|^#([w-]+)$/,
// Is it a simple selector
isSimple = /^.[^:#[.,]*$/,
// Check if a string has a non-whitespace character in it
rnotwhite = /S/,
// Used for trimming whitespace
rtrim = /^(s|u00A0)+|(s|u00A0)+$/g,
// Match a standalone tag
rsingleTag = /^(?:)?$/,
// Keep a UserAgent string for use with jQuery.browser
userAgent = navigator.userAgent,
// For matching the engine and version of the browser
browserMatch,
// Has the ready events already been bound?
readyBound = false,
// The functions to execute on DOM ready
readyList = [],
// The ready event handler
DOMContentLoaded,
// Save a reference to some core methods
toString = Object.prototype.toString,
hasOwnProperty = Object.prototype.hasOwnProperty,
push = Array.prototype.push,
slice = Array.prototype.slice,
indexOf = Array.prototype.indexOf;
jQuery.fn = jQuery.prototype = {
init: function( selector, context ) {
var match, elem, ret, doc;
// Handle $(“”), $(null), or $(undefined)
if ( !selector ) {
return this;
}
// Handle $(DOMElement)
if ( selector.nodeType ) {
this.context = this[0] = selector;
this.length = 1;
return this;
}
// The body element only exists once, optimize finding it
if ( selector === “body” && !context ) {
this.context = document;
this[0] = document.body;
this.selector = “body”;
this.length = 1;
return this;
}
// Handle HTML strings
if ( typeof selector === “string” ) {
// Are we dealing with HTML string or an ID?
match = quickExpr.exec( selector );
// Verify a match, and that no context was specified for #id
if ( match && (match[1] || !context) ) {
// HANDLE: $(html) -> $(array)
if ( match[1] ) {
doc = (context ? context.ownerDocument || context : document);
// If a single string is passed in and it’s a single tag
// just do a createElement and skip the rest
ret = rsingleTag.exec( selector );
if ( ret ) {
if ( jQuery.isPlainObject( context ) ) {
selector = [ document.createElement( ret[1] ) ];
jQuery.fn.attr.call( selector, context, true );
} else {
selector = [ doc.createElement( ret[1] ) ];
}
} else {
ret = buildFragment( [ match[1] ], [ doc ] );
selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;
}
return jQuery.merge( this, selector );
// HANDLE: $(“#id”)
} else {
elem = document.getElementById( match[2] );
if ( elem ) {
// Handle the case where IE and Opera return items
// by name instead of ID
if ( elem.id !== match[2] ) {
return rootjQuery.find( selector );
}
// Otherwise, we inject the element directly into the jQuery object
this.length = 1;
this[0] = elem;
}
this.context = document;
this.selector = selector;
return this;
}
// HANDLE: $(“TAG”)
} else if ( !context && /^w+$/.test( selector ) ) {
this.selector = selector;
this.context = document;
selector = document.getElementsByTagName( selector );
return jQuery.merge( this, selector );
// HANDLE: $(expr, $(…))
} else if ( !context || context.jquery ) {
return (context || rootjQuery).find( selector );
// HANDLE: $(expr, context)
// (which is just equivalent to: $(context).find(expr)
} else {
return jQuery( context ).find( selector );
}
// HANDLE: $(function)
// Shortcut for document ready
} else if ( jQuery.isFunction( selector ) ) {
return rootjQuery.ready( selector );
}
if (selector.selector !== undefined) {
this.selector = selector.selector;
this.context = selector.context;
}
return jQuery.makeArray( selector, this );
},
// Start with an empty selector
selector: “”,
// The current version of jQuery being used
jquery: “1.4.2”,
// The default length of a jQuery object is 0
length: 0,
// The number of elements contained in the matched element set
size: function() {
return this.length;
},
toArray: function() {
return slice.call( this, 0 );
},
// Get the Nth element in the matched element set OR
// Get the whole matched element set as a clean array
get: function( num ) {
return num == null ?
// Return a ‘clean’ array
this.toArray() :
// Return just the object
( num < 0 ? this.slice(num)[ 0 ] : this[ num ] );
},
// Take an array of elements and push it onto the stack
// (returning the new matched element set)
pushStack: function( elems, name, selector ) {
// Build a new jQuery matched element set
var ret = jQuery();
if ( jQuery.isArray( elems ) ) {
push.apply( ret, elems );
} else {
jQuery.merge( ret, elems );
}
// Add the old object onto the stack (as a reference)
ret.prevObject = this;
ret.context = this.context;
if ( name === "find" ) {
ret.selector = this.selector + (this.selector ? " " : "") + selector;
} else if ( name ) {
ret.selector = this.selector + "." + name + "(" + selector + ")";
}
// Return the newly-formed element set
return ret;
},
// Execute a callback for every element in the matched set.
// (You can seed the arguments with an array of args, but this is
// only used internally.)
each: function( callback, args ) {
return jQuery.each( this, callback, args );
},
ready: function( fn ) {
// Attach the listeners
jQuery.bindReady();
// If the DOM is already ready
if ( jQuery.isReady ) {
// Execute the function immediately
fn.call( document, jQuery );
// Otherwise, remember the function for later
} else if ( readyList ) {
// Add the function to the wait list
readyList.push( fn );
}
return this;
},
eq: function( i ) {
return i === -1 ?
this.slice( i ) :
this.slice( i, +i + 1 );
},
first: function() {
return this.eq( 0 );
},
last: function() {
return this.eq( -1 );
},
slice: function() {
return this.pushStack( slice.apply( this, arguments ),
"slice", slice.call(arguments).join(",") );
},
map: function( callback ) {
return this.pushStack( jQuery.map(this, function( elem, i ) {
return callback.call( elem, i, elem );
}));
},
end: function() {
return this.prevObject || jQuery(null);
},
// For internal use only.
// Behaves like an Array's method, not like a jQuery method.
push: push,
sort: [].sort,
splice: [].splice
};
// Give the init function the jQuery prototype for later instantiation
jQuery.fn.init.prototype = jQuery.fn;
jQuery.extend = jQuery.fn.extend = function() {
// copy reference to target object
var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy;
// Handle a deep copy situation
if ( typeof target === "boolean" ) {
deep = target;
target = arguments[1] || {};
// skip the boolean and the target
i = 2;
}
// Handle case when target is a string or something (possible in deep copy)
if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
target = {};
}
// extend jQuery itself if only one argument is passed
if ( length === i ) {
target = this;
–i;
}
for ( ; i < length; i++ ) {
// Only deal with non-null/undefined values
if ( (options = arguments[ i ]) != null ) {
// Extend the base object
for ( name in options ) {
src = target[ name ];
copy = options[ name ];
// Prevent never-ending loop
if ( target === copy ) {
continue;
}
// Recurse if we're merging object literal values or arrays
if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) {
var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src
: jQuery.isArray(copy) ? [] : {};
// Never move original objects, clone them
target[ name ] = jQuery.extend( deep, clone, copy );
// Don't bring in undefined values
} else if ( copy !== undefined ) {
target[ name ] = copy;
}
}
}
}
// Return the modified object
return target;
};
jQuery.extend({
noConflict: function( deep ) {
window.$ = _$;
if ( deep ) {
window.jQueryWS = _jQuery;
}
return jQuery;
},
// Is the DOM ready to be used? Set to true once it occurs.
isReady: false,
// Handle when the DOM is ready
ready: function() {
// Make sure that the DOM is not already loaded
if ( !jQuery.isReady ) {
// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
if ( !document.body ) {
return setTimeout( jQuery.ready, 13 );
}
// Remember that the DOM is ready
jQuery.isReady = true;
// If there are functions bound, to execute
if ( readyList ) {
// Execute all of them
var fn, i = 0;
while ( (fn = readyList[ i++ ]) ) {
fn.call( document, jQuery );
}
// Reset the list of functions
readyList = null;
}
// Trigger any bound ready events
if ( jQuery.fn.triggerHandler ) {
jQuery( document ).triggerHandler( "ready" );
}
}
},
bindReady: function() {
if ( readyBound ) {
return;
}
readyBound = true;
// Catch cases where $(document).ready() is called after the
// browser event has already occurred.
if ( document.readyState === "complete" ) {
return jQuery.ready();
}
// Mozilla, Opera and webkit nightlies currently support this event
if ( document.addEventListener ) {
// Use the handy event callback
document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
// A fallback to window.onload, that will always work
window.addEventListener( "load", jQuery.ready, false );
// If IE event model is used
} else if ( document.attachEvent ) {
// ensure firing before onload,
// maybe late but safe also for iframes
document.attachEvent("onreadystatechange", DOMContentLoaded);
// A fallback to window.onload, that will always work
window.attachEvent( "onload", jQuery.ready );
// If IE and not a frame
// continually check to see if the document is ready
var toplevel = false;
try {
toplevel = window.frameElement == null;
} catch(e) {}
if ( document.documentElement.doScroll && toplevel ) {
doScrollCheck();
}
}
},
// See test/unit/core.js for details concerning isFunction.
// Since version 1.3, DOM methods and functions like alert
// aren't supported. They return false on IE (#2968).
isFunction: function( obj ) {
return toString.call(obj) === "[object Function]";
},
isArray: function( obj ) {
return toString.call(obj) === "[object Array]";
},
isPlainObject: function( obj ) {
// Must be an Object.
// Because of IE, we also have to check the presence of the constructor property.
// Make sure that DOM nodes and window objects don't pass through, as well
if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) {
return false;
}
// Not own constructor property must be Object
if ( obj.constructor
&& !hasOwnProperty.call(obj, "constructor")
&& !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) {
return false;
}
// Own properties are enumerated firstly, so to speed up,
// if last one is own, then all properties are own.
var key;
for ( key in obj ) {}
return key === undefined || hasOwnProperty.call( obj, key );
},
isEmptyObject: function( obj ) {
for ( var name in obj ) {
return false;
}
return true;
},
error: function( msg ) {
throw msg;
},
parseJSON: function( data ) {
if ( typeof data !== "string" || !data ) {
return null;
}
// Make sure leading/trailing whitespace is removed (IE can't handle it)
data = jQuery.trim( data );
// Make sure the incoming data is actual JSON
// Logic borrowed from http://json.org/json2.js
if ( /^[],:{}s]*$/.test(data.replace(/\(?:["\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
.replace(/"[^"\nr]*"|true|false|null|-?d+(?:.d*)?(?:[eE][+-]?d+)?/g, "]")
.replace(/(?:^|:|,)(?:s*[)+/g, "")) ) {
// Try to use the native JSON parser first
return window.JSON && window.JSON.parse ?
window.JSON.parse( data ) :
(new Function("return " + data))();
} else {
jQuery.error( "Invalid JSON: " + data );
}
},
noop: function() {},
// Evalulates a script in a global context
globalEval: function( data ) {
if ( data && rnotwhite.test(data) ) {
// Inspired by code by Andrea Giammarchi
// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
var head = document.getElementsByTagName("head")[0] || document.documentElement,
script = document.createElement("script");
script.type = "text/javascript";
if ( jQuery.support.scriptEval ) {
script.appendChild( document.createTextNode( data ) );
} else {
script.text = data;
}
// Use insertBefore instead of appendChild to circumvent an IE6 bug.
// This arises when a base node is used (#2709).
head.insertBefore( script, head.firstChild );
head.removeChild( script );
}
},
nodeName: function( elem, name ) {
return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
},
// args is for internal usage only
each: function( object, callback, args ) {
var name, i = 0,
length = object.length,
isObj = length === undefined || jQuery.isFunction(object);
if ( args ) {
if ( isObj ) {
for ( name in object ) {
if ( callback.apply( object[ name ], args ) === false ) {
break;
}
}
} else {
for ( ; i < length; ) {
if ( callback.apply( object[ i++ ], args ) === false ) {
break;
}
}
}
// A special, fast, case for the most common use of each
} else {
if ( isObj ) {
for ( name in object ) {
if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
break;
}
}
} else {
for ( var value = object[0];
i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
}
}
return object;
},
trim: function( text ) {
return (text || "").replace( rtrim, "" );
},
// results is for internal usage only
makeArray: function( array, results ) {
var ret = results || [];
if ( array != null ) {
// The window, strings (and functions) also have 'length'
// The extra typeof function check is to prevent crashes
// in Safari 2 (See: #3039)
if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || (typeof array !== "function" && array.setInterval) ) {
push.call( ret, array );
} else {
jQuery.merge( ret, array );
}
}
return ret;
},
inArray: function( elem, array ) {
if ( array.indexOf ) {
return array.indexOf( elem );
}
for ( var i = 0, length = array.length; i < length; i++ ) {
if ( array[ i ] === elem ) {
return i;
}
}
return -1;
},
merge: function( first, second ) {
var i = first.length, j = 0;
if ( typeof second.length === "number" ) {
for ( var l = second.length; j < l; j++ ) {
first[ i++ ] = second[ j ];
}
} else {
while ( second[j] !== undefined ) {
first[ i++ ] = second[ j++ ];
}
}
first.length = i;
return first;
},
grep: function( elems, callback, inv ) {
var ret = [];
// Go through the array, only saving the items
// that pass the validator function
for ( var i = 0, length = elems.length; i < length; i++ ) {
if ( !inv !== !callback( elems[ i ], i ) ) {
ret.push( elems[ i ] );
}
}
return ret;
},
// arg is for internal usage only
map: function( elems, callback, arg ) {
var ret = [], value;
// Go through the array, translating each of the items to their
// new value (or values).
for ( var i = 0, length = elems.length; i < length; i++ ) {
value = callback( elems[ i ], i, arg );
if ( value != null ) {
ret[ ret.length ] = value;
}
}
return ret.concat.apply( [], ret );
},
// A global GUID counter for objects
guid: 1,
proxy: function( fn, proxy, thisObject ) {
if ( arguments.length === 2 ) {
if ( typeof proxy === "string" ) {
thisObject = fn;
fn = thisObject[ proxy ];
proxy = undefined;
} else if ( proxy && !jQuery.isFunction( proxy ) ) {
thisObject = proxy;
proxy = undefined;
}
}
if ( !proxy && fn ) {
proxy = function() {
return fn.apply( thisObject || this, arguments );
};
}
// Set the guid of unique handler to the same of original handler, so it can be removed
if ( fn ) {
proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
}
// So proxy can be declared as an argument
return proxy;
},
// Use of jQuery.browser is frowned upon.
// More details: http://docs.jquery.com/Utilities/jQuery.browser
uaMatch: function( ua ) {
ua = ua.toLowerCase();
var match = /(webkit)[ /]([w.]+)/.exec( ua ) ||
/(opera)(?:.*version)?[ /]([w.]+)/.exec( ua ) ||
/(msie) ([w.]+)/.exec( ua ) ||
!/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([w.]+))?/.exec( ua ) ||
[];
return { browser: match[1] || "", version: match[2] || "0" };
},
browser: {}
});
browserMatch = jQuery.uaMatch( userAgent );
if ( browserMatch.browser ) {
jQuery.browser[ browserMatch.browser ] = true;
jQuery.browser.version = browserMatch.version;
}
// Deprecated, use jQuery.browser.webkit instead
if ( jQuery.browser.webkit ) {
jQuery.browser.safari = true;
}
if ( indexOf ) {
jQuery.inArray = function( elem, array ) {
return indexOf.call( array, elem );
};
}
// All jQuery objects should point back to these
rootjQuery = jQuery(document);
// Cleanup functions for the document ready method
if ( document.addEventListener ) {
DOMContentLoaded = function() {
document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
jQuery.ready();
};
} else if ( document.attachEvent ) {
DOMContentLoaded = function() {
// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
if ( document.readyState === "complete" ) {
document.detachEvent( "onreadystatechange", DOMContentLoaded );
jQuery.ready();
}
};
}
// The DOM ready check for Internet Explorer
function doScrollCheck() {
if ( jQuery.isReady ) {
return;
}
try {
// If IE is used, use the trick by Diego Perini
// http://javascript.nwbox.com/IEContentLoaded/
document.documentElement.doScroll("left");
} catch( error ) {
setTimeout( doScrollCheck, 1 );
return;
}
// and execute any waiting functions
jQuery.ready();
}
function evalScript( i, elem ) {
if ( elem.src ) {
jQuery.ajax({
url: elem.src,
async: false,
dataType: "script"
});
} else {
jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
}
if ( elem.parentNode ) {
elem.parentNode.removeChild( elem );
}
}
// Mutifunctional method to get and set values to a collection
// The value/s can be optionally by executed if its a function
function access( elems, key, value, exec, fn, pass ) {
var length = elems.length;
// Setting many attributes
if ( typeof key === "object" ) {
for ( var k in key ) {
access( elems, k, key[k], exec, fn, value );
}
return elems;
}
// Setting one attribute
if ( value !== undefined ) {
// Optionally, function values get executed if exec is true
exec = !pass && exec && jQuery.isFunction(value);
for ( var i = 0; i < length; i++ ) {
fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
}
return elems;
}
// Getting an attribute
return length ? fn( elems[0], key ) : undefined;
}
function now() {
return (new Date).getTime();
}
(function() {
jQuery.support = {};
var root = document.documentElement,
script = document.createElement("script"),
div = document.createElement("div"),
id = "script" + now();
div.style.display = "none";
div.innerHTML = "
a“;
var all = div.getElementsByTagName(“*”),
a = div.getElementsByTagName(“a”)[0];
// Can’t get basic test support
if ( !all || !all.length || !a ) {
return;
}
jQuery.support = {
// IE strips leading whitespace when .innerHTML is used
leadingWhitespace: div.firstChild.nodeType === 3,
// Make sure that tbody elements aren’t automatically inserted
// IE will insert them into empty tables
tbody: !div.getElementsByTagName(“tbody”).length,
// Make sure that link elements get serialized correctly by innerHTML
// This requires a wrapper element in IE
htmlSerialize: !!div.getElementsByTagName(“link”).length,
// Get the style information from getAttribute
// (IE uses .cssText insted)
style: /red/.test( a.getAttribute(“style”) ),
// Make sure that URLs aren’t manipulated
// (IE normalizes it by default)
hrefNormalized: a.getAttribute(“href”) === “/a”,
// Make sure that element opacity exists
// (IE uses filter instead)
// Use a regex to work around a WebKit issue. See #5145
opacity: /^0.55$/.test( a.style.opacity ),
// Verify style float existence
// (IE uses styleFloat instead of cssFloat)
cssFloat: !!a.style.cssFloat,
// Make sure that if no value is specified for a checkbox
// that it defaults to “on”.
// (WebKit defaults to “” instead)
checkOn: div.getElementsByTagName(“input”)[0].value === “on”,
// Make sure that a selected-by-default option has a working selected property.
// (WebKit defaults to false instead of true, IE too, if it’s in an optgroup)
optSelected: document.createElement(“select”).appendChild( document.createElement(“option”) ).selected,
parentNode: div.removeChild( div.appendChild( document.createElement(“div”) ) ).parentNode === null,
// Will be defined later
deleteExpando: true,
checkClone: false,
scriptEval: false,
noCloneEvent: true,
boxModel: null
};
script.type = “text/javascript”;
try {
script.appendChild( document.createTextNode( “window.” + id + “=1;” ) );
} catch(e) {}
root.insertBefore( script, root.firstChild );
// Make sure that the execution of code works by injecting a script
// tag with appendChild/createTextNode
// (IE doesn’t support this, fails, and uses .text instead)
if ( window[ id ] ) {
jQuery.support.scriptEval = true;
delete window[ id ];
}
// Test to see if it’s possible to delete an expando from an element
// Fails in Internet Explorer
try {
delete script.test;
} catch(e) {
jQuery.support.deleteExpando = false;
}
root.removeChild( script );
if ( div.attachEvent && div.fireEvent ) {
div.attachEvent(“onclick”, function click() {
// Cloning a node shouldn’t copy over any
// bound event handlers (IE does this)
jQuery.support.noCloneEvent = false;
div.detachEvent(“onclick”, click);
});
div.cloneNode(true).fireEvent(“onclick”);
}
div = document.createElement(“div”);
div.innerHTML = “”;
var fragment = document.createDocumentFragment();
fragment.appendChild( div.firstChild );
// WebKit doesn’t clone checked state correctly in fragments
jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
// Figure out if the W3C box model works as expected
// document.body must exist before we can do this
jQuery(function() {
var div = document.createElement(“div”);
div.style.width = div.style.paddingLeft = “1px”;
document.body.appendChild( div );
jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
document.body.removeChild( div ).style.display = ‘none’;
div = null;
});
// Technique from Juriy Zaytsev
// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
var eventSupported = function( eventName ) {
var el = document.createElement(“div”);
eventName = “on” + eventName;
var isSupported = (eventName in el);
if ( !isSupported ) {
el.setAttribute(eventName, “return;”);
isSupported = typeof el[eventName] === “function”;
}
el = null;
return isSupported;
};
jQuery.support.submitBubbles = eventSupported(“submit”);
jQuery.support.changeBubbles = eventSupported(“change”);
// release memory in IE
root = script = div = all = a = null;
})();
jQuery.props = {
“for”: “htmlFor”,
“class”: “className”,
readonly: “readOnly”,
maxlength: “maxLength”,
cellspacing: “cellSpacing”,
rowspan: “rowSpan”,
colspan: “colSpan”,
tabindex: “tabIndex”,
usemap: “useMap”,
frameborder: “frameBorder”
};
var expando = “jQuery” + now(), uuid = 0, windowData = {};
jQuery.extend({
cache: {},
expando:expando,
// The following elements throw uncatchable exceptions if you
// attempt to add expando properties to them.
noData: {
“embed”: true,
“object”: true,
“applet”: true
},
data: function( elem, name, data ) {
if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
return;
}
elem = elem == window ?
windowData :
elem;
var id = elem[ expando ], cache = jQuery.cache, thisCache;
if ( !id && typeof name === “string” && data === undefined ) {
return null;
}
// Compute a unique ID for the element
if ( !id ) {
id = ++uuid;
}
// Avoid generating a new cache unless none exists and we
// want to manipulate it.
if ( typeof name === “object” ) {
elem[ expando ] = id;
thisCache = cache[ id ] = jQuery.extend(true, {}, name);
} else if ( !cache[ id ] ) {
elem[ expando ] = id;
cache[ id ] = {};
}
thisCache = cache[ id ];
// Prevent overriding the named cache with undefined values
if ( data !== undefined ) {
thisCache[ name ] = data;
}
return typeof name === “string” ? thisCache[ name ] : thisCache;
},
removeData: function( elem, name ) {
if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
return;
}
elem = elem == window ?
windowData :
elem;
var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ];
// If we want to remove a specific section of the element’s data
if ( name ) {
if ( thisCache ) {
// Remove the section of cache data
delete thisCache[ name ];
// If we’ve removed all the data, remove the element’s cache
if ( jQuery.isEmptyObject(thisCache) ) {
jQuery.removeData( elem );
}
}
// Otherwise, we want to remove all of the element’s data
} else {
if ( jQuery.support.deleteExpando ) {
delete elem[ jQuery.expando ];
} else if ( elem.removeAttribute ) {
elem.removeAttribute( jQuery.expando );
}
// Completely remove the data cache
delete cache[ id ];
}
}
});
jQuery.fn.extend({
data: function( key, value ) {
if ( typeof key === “undefined” && this.length ) {
return jQuery.data( this[0] );
} else if ( typeof key === “object” ) {
return this.each(function() {
jQuery.data( this, key );
});
}
var parts = key.split(“.”);
parts[1] = parts[1] ? “.” + parts[1] : “”;
if ( value === undefined ) {
var data = this.triggerHandler(“getData” + parts[1] + “!”, [parts[0]]);
if ( data === undefined && this.length ) {
data = jQuery.data( this[0], key );
}
return data === undefined && parts[1] ?
this.data( parts[0] ) :
data;
} else {
return this.trigger(“setData” + parts[1] + “!”, [parts[0], value]).each(function() {
jQuery.data( this, key, value );
});
}
},
removeData: function( key ) {
return this.each(function() {
jQuery.removeData( this, key );
});
}
});
jQuery.extend({
queue: function( elem, type, data ) {
if ( !elem ) {
return;
}
type = (type || “fx”) + “queue”;
var q = jQuery.data( elem, type );
// Speed up dequeue by getting out quickly if this is just a lookup
if ( !data ) {
return q || [];
}
if ( !q || jQuery.isArray(data) ) {
q = jQuery.data( elem, type, jQuery.makeArray(data) );
} else {
q.push( data );
}
return q;
},
dequeue: function( elem, type ) {
type = type || “fx”;
var queue = jQuery.queue( elem, type ), fn = queue.shift();
// If the fx queue is dequeued, always remove the progress sentinel
if ( fn === “inprogress” ) {
fn = queue.shift();
}
if ( fn ) {
// Add a progress sentinel to prevent the fx queue from being
// automatically dequeued
if ( type === “fx” ) {
queue.unshift(“inprogress”);
}
fn.call(elem, function() {
jQuery.dequeue(elem, type);
});
}
}
});
jQuery.fn.extend({
queue: function( type, data ) {
if ( typeof type !== “string” ) {
data = type;
type = “fx”;
}
if ( data === undefined ) {
return jQuery.queue( this[0], type );
}
return this.each(function( i, elem ) {
var queue = jQuery.queue( this, type, data );
if ( type === “fx” && queue[0] !== “inprogress” ) {
jQuery.dequeue( this, type );
}
});
},
dequeue: function( type ) {
return this.each(function() {
jQuery.dequeue( this, type );
});
},
// Based off of the plugin by Clint Helfers, with permission.
// http://blindsignals.com/index.php/2009/07/jquery-delay/
delay: function( time, type ) {
time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
type = type || “fx”;
return this.queue( type, function() {
var elem = this;
setTimeout(function() {
jQuery.dequeue( elem, type );
}, time );
});
},
clearQueue: function( type ) {
return this.queue( type || “fx”, [] );
}
});
var rclass = /[nt]/g,
rspace = /s+/,
rreturn = /r/g,
rspecialurl = /href|src|style/,
rtype = /(button|input)/i,
rfocusable = /(button|input|object|select|textarea)/i,
rclickable = /^(a|area)$/i,
rradiocheck = /radio|checkbox/;
jQuery.fn.extend({
attr: function( name, value ) {
return access( this, name, value, true, jQuery.attr );
},
removeAttr: function( name, fn ) {
return this.each(function(){
jQuery.attr( this, name, “” );
if ( this.nodeType === 1 ) {
this.removeAttribute( name );
}
});
},
addClass: function( value ) {
if ( jQuery.isFunction(value) ) {
return this.each(function(i) {
var self = jQuery(this);
self.addClass( value.call(this, i, self.attr(“class”)) );
});
}
if ( value && typeof value === “string” ) {
var classNames = (value || “”).split( rspace );
for ( var i = 0, l = this.length; i < l; i++ ) {
var elem = this[i];
if ( elem.nodeType === 1 ) {
if ( !elem.className ) {
elem.className = value;
} else {
var className = " " + elem.className + " ", setClass = elem.className;
for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
setClass += " " + classNames[c];
}
}
elem.className = jQuery.trim( setClass );
}
}
}
}
return this;
},
removeClass: function( value ) {
if ( jQuery.isFunction(value) ) {
return this.each(function(i) {
var self = jQuery(this);
self.removeClass( value.call(this, i, self.attr("class")) );
});
}
if ( (value && typeof value === "string") || value === undefined ) {
var classNames = (value || "").split(rspace);
for ( var i = 0, l = this.length; i < l; i++ ) {
var elem = this[i];
if ( elem.nodeType === 1 && elem.className ) {
if ( value ) {
var className = (" " + elem.className + " ").replace(rclass, " ");
for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
className = className.replace(" " + classNames[c] + " ", " ");
}
elem.className = jQuery.trim( className );
} else {
elem.className = "";
}
}
}
}
return this;
},
toggleClass: function( value, stateVal ) {
var type = typeof value, isBool = typeof stateVal === "boolean";
if ( jQuery.isFunction( value ) ) {
return this.each(function(i) {
var self = jQuery(this);
self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
});
}
return this.each(function() {
if ( type === "string" ) {
// toggle individual class names
var className, i = 0, self = jQuery(this),
state = stateVal,
classNames = value.split( rspace );
while ( (className = classNames[ i++ ]) ) {
// check each className given, space seperated list
state = isBool ? state : !self.hasClass( className );
self[ state ? "addClass" : "removeClass" ]( className );
}
} else if ( type === "undefined" || type === "boolean" ) {
if ( this.className ) {
// store className if set
jQuery.data( this, "__className__", this.className );
}
// toggle whole className
this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || "";
}
});
},
hasClass: function( selector ) {
var className = " " + selector + " ";
for ( var i = 0, l = this.length; i -1 ) {
return true;
}
}
return false;
},
val: function( value ) {
if ( value === undefined ) {
var elem = this[0];
if ( elem ) {
if ( jQuery.nodeName( elem, “option” ) ) {
return (elem.attributes.value || {}).specified ? elem.value : elem.text;
}
// We need to handle select boxes special
if ( jQuery.nodeName( elem, “select” ) ) {
var index = elem.selectedIndex,
values = [],
options = elem.options,
one = elem.type === “select-one”;
// Nothing was selected
if ( index < 0 ) {
return null;
}
// Loop through all the selected options
for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i = 0;
} else if ( jQuery.nodeName( this, “select” ) ) {
var values = jQuery.makeArray(val);
jQuery( “option”, this ).each(function() {
this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
});
if ( !values.length ) {
this.selectedIndex = -1;
}
} else {
this.value = val;
}
});
}
});
jQuery.extend({
attrFn: {
val: true,
css: true,
html: true,
text: true,
data: true,
width: true,
height: true,
offset: true
},
attr: function( elem, name, value, pass ) {
// don’t set attributes on text and comment nodes
if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
return undefined;
}
if ( pass && name in jQuery.attrFn ) {
return jQuery(elem)[name](value);
}
var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
// Whether we are setting (or getting)
set = value !== undefined;
// Try to normalize/fix the name
name = notxml && jQuery.props[ name ] || name;
// Only do all the following if this is a node (faster for style)
if ( elem.nodeType === 1 ) {
// These attributes require special treatment
var special = rspecialurl.test( name );
// Safari mis-reports the default selected property of an option
// Accessing the parent’s selectedIndex property fixes it
if ( name === “selected” && !jQuery.support.optSelected ) {
var parent = elem.parentNode;
if ( parent ) {
parent.selectedIndex;
// Make sure that it also works with optgroups, see #5701
if ( parent.parentNode ) {
parent.parentNode.selectedIndex;
}
}
}
// If applicable, access the attribute via the DOM 0 way
if ( name in elem && notxml && !special ) {
if ( set ) {
// We can’t allow the type property to be changed (since it causes problems in IE)
if ( name === “type” && rtype.test( elem.nodeName ) && elem.parentNode ) {
jQuery.error( “type property can’t be changed” );
}
elem[ name ] = value;
}
// browsers index elements by id/name on forms, give priority to attributes.
if ( jQuery.nodeName( elem, “form” ) && elem.getAttributeNode(name) ) {
return elem.getAttributeNode( name ).nodeValue;
}
// elem.tabIndex doesn’t always return the correct value when it hasn’t been explicitly set
// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
if ( name === “tabIndex” ) {
var attributeNode = elem.getAttributeNode( “tabIndex” );
return attributeNode && attributeNode.specified ?
attributeNode.value :
rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
0 :
undefined;
}
return elem[ name ];
}
if ( !jQuery.support.style && notxml && name === “style” ) {
if ( set ) {
elem.style.cssText = “” + value;
}
return elem.style.cssText;
}
if ( set ) {
// convert the value to a string (all browsers do this but IE) see #1070
elem.setAttribute( name, “” + value );
}
var attr = !jQuery.support.hrefNormalized && notxml && special ?
// Some attributes require a special call on IE
elem.getAttribute( name, 2 ) :
elem.getAttribute( name );
// Non-existent attributes return null, we normalize to undefined
return attr === null ? undefined : attr;
}
// elem is actually elem.style … set the style
// Using attr for specific style information is now deprecated. Use style instead.
return jQuery.style( elem, name, value );
}
});
var rnamespaces = /.(.*)$/,
fcleanup = function( nm ) {
return nm.replace(/[^ws.|`]/g, function( ch ) {
return “\” + ch;
});
};
/*
* A number of helper functions used for managing events.
* Many of the ideas behind this code originated from
* Dean Edwards’ addEvent library.
*/
jQuery.event = {
// Bind an event to an element
// Original by Dean Edwards
add: function( elem, types, handler, data ) {
if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
return;
}
// For whatever reason, IE has trouble passing the window object
// around, causing it to be cloned in the process
if ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) {
elem = window;
}
var handleObjIn, handleObj;
if ( handler.handler ) {
handleObjIn = handler;
handler = handleObjIn.handler;
}
// Make sure that the function being executed has a unique ID
if ( !handler.guid ) {
handler.guid = jQuery.guid++;
}
// Init the element’s event structure
var elemData = jQuery.data( elem );
// If no elemData is found then we must be trying to bind to one of the
// banned noData elements
if ( !elemData ) {
return;
}
var events = elemData.events = elemData.events || {},
eventHandle = elemData.handle, eventHandle;
if ( !eventHandle ) {
elemData.handle = eventHandle = function() {
// Handle the second event of a trigger and when
// an event is called after a page has unloaded
return typeof jQuery !== “undefined” && !jQuery.event.triggered ?
jQuery.event.handle.apply( eventHandle.elem, arguments ) :
undefined;
};
}
// Add elem as a property of the handle function
// This is to prevent a memory leak with non-native events in IE.
eventHandle.elem = elem;
// Handle multiple events separated by a space
// jQuery(…).bind(“mouseover mouseout”, fn);
types = types.split(” “);
var type, i = 0, namespaces;
while ( (type = types[ i++ ]) ) {
handleObj = handleObjIn ?
jQuery.extend({}, handleObjIn) :
{ handler: handler, data: data };
// Namespaced event handlers
if ( type.indexOf(“.”) > -1 ) {
namespaces = type.split(“.”);
type = namespaces.shift();
handleObj.namespace = namespaces.slice(0).sort().join(“.”);
} else {
namespaces = [];
handleObj.namespace = “”;
}
handleObj.type = type;
handleObj.guid = handler.guid;
// Get the current list of functions bound to this event
var handlers = events[ type ],
special = jQuery.event.special[ type ] || {};
// Init the event handler queue
if ( !handlers ) {
handlers = events[ type ] = [];
// Check for a special event handler
// Only use addEventListener/attachEvent if the special
// events handler returns false
if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
// Bind the global event handler to the element
if ( elem.addEventListener ) {
elem.addEventListener( type, eventHandle, false );
} else if ( elem.attachEvent ) {
elem.attachEvent( “on” + type, eventHandle );
}
}
}
if ( special.add ) {
special.add.call( elem, handleObj );
if ( !handleObj.handler.guid ) {
handleObj.handler.guid = handler.guid;
}
}
// Add the function to the element’s handler list
handlers.push( handleObj );
// Keep track of which events have been used, for global triggering
jQuery.event.global[ type ] = true;
}
// Nullify elem to prevent memory leaks in IE
elem = null;
},
global: {},
// Detach an event or set of events from an element
remove: function( elem, types, handler, pos ) {
// don’t do events on text and comment nodes
if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
return;
}
var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
elemData = jQuery.data( elem ),
events = elemData && elemData.events;
if ( !elemData || !events ) {
return;
}
// types is actually an event object here
if ( types && types.type ) {
handler = types.handler;
types = types.type;
}
// Unbind all events for the element
if ( !types || typeof types === “string” && types.charAt(0) === “.” ) {
types = types || “”;
for ( type in events ) {
jQuery.event.remove( elem, type + types );
}
return;
}
// Handle multiple events separated by a space
// jQuery(…).unbind(“mouseover mouseout”, fn);
types = types.split(” “);
while ( (type = types[ i++ ]) ) {
origType = type;
handleObj = null;
all = type.indexOf(“.”) < 0;
namespaces = [];
if ( !all ) {
// Namespaced event handlers
namespaces = type.split(".");
type = namespaces.shift();
namespace = new RegExp("(^|\.)" +
jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\.(?:.*\.)?") + "(\.|$)")
}
eventType = events[ type ];
if ( !eventType ) {
continue;
}
if ( !handler ) {
for ( var j = 0; j < eventType.length; j++ ) {
handleObj = eventType[ j ];
if ( all || namespace.test( handleObj.namespace ) ) {
jQuery.event.remove( elem, origType, handleObj.handler, j );
eventType.splice( j–, 1 );
}
}
continue;
}
special = jQuery.event.special[ type ] || {};
for ( var j = pos || 0; j = 0 ) {
event.type = type = type.slice(0, -1);
event.exclusive = true;
}
// Handle a global trigger
if ( !elem ) {
// Don’t bubble custom events when global (to avoid too much overhead)
event.stopPropagation();
// Only trigger if we’ve ever bound an event for it
if ( jQuery.event.global[ type ] ) {
jQuery.each( jQuery.cache, function() {
if ( this.events && this.events[type] ) {
jQuery.event.trigger( event, data, this.handle.elem );
}
});
}
}
// Handle triggering a single element
// don’t do events on text and comment nodes
if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
return undefined;
}
// Clean up in case it is reused
event.result = undefined;
event.target = elem;
// Clone the incoming data, if any
data = jQuery.makeArray( data );
data.unshift( event );
}
event.currentTarget = elem;
// Trigger the event, it is assumed that “handle” is a function
var handle = jQuery.data( elem, “handle” );
if ( handle ) {
handle.apply( elem, data );
}
var parent = elem.parentNode || elem.ownerDocument;
// Trigger an inline bound script
try {
if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
if ( elem[ “on” + type ] && elem[ “on” + type ].apply( elem, data ) === false ) {
event.result = false;
}
}
// prevent IE from throwing an error for some elements with some event types, see #3533
} catch (e) {}
if ( !event.isPropagationStopped() && parent ) {
jQuery.event.trigger( event, data, parent, true );
} else if ( !event.isDefaultPrevented() ) {
var target = event.target, old,
isClick = jQuery.nodeName(target, “a”) && type === “click”,
special = jQuery.event.special[ type ] || {};
if ( (!special._default || special._default.call( elem, event ) === false) &&
!isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
try {
if ( target[ type ] ) {
// Make sure that we don’t accidentally re-trigger the onFOO events
old = target[ “on” + type ];
if ( old ) {
target[ “on” + type ] = null;
}
jQuery.event.triggered = true;
target[ type ]();
}
// prevent IE from throwing an error for some elements with some event types, see #3533
} catch (e) {}
if ( old ) {
target[ “on” + type ] = old;
}
jQuery.event.triggered = false;
}
}
},
handle: function( event ) {
var all, handlers, namespaces, namespace, events;
event = arguments[0] = jQuery.event.fix( event || window.event );
event.currentTarget = this;
// Namespaced event handlers
all = event.type.indexOf(“.”) < 0 && !event.exclusive;
if ( !all ) {
namespaces = event.type.split(".");
event.type = namespaces.shift();
namespace = new RegExp("(^|\.)" + namespaces.slice(0).sort().join("\.(?:.*\.)?") + "(\.|$)");
}
var events = jQuery.data(this, "events"), handlers = events[ event.type ];
if ( events && handlers ) {
// Clone the handlers to prevent manipulation
handlers = handlers.slice(0);
for ( var j = 0, l = handlers.length; j -1 ?
jQuery.map( elem.options, function( elem ) {
return elem.selected;
}).join(“-“) :
“”;
} else if ( elem.nodeName.toLowerCase() === “select” ) {
val = elem.selectedIndex;
}
return val;
},
testChange = function testChange( e ) {
var elem = e.target, data, val;
if ( !formElems.test( elem.nodeName ) || elem.readOnly ) {
return;
}
data = jQuery.data( elem, “_change_data” );
val = getVal(elem);
// the current data will be also retrieved by beforeactivate
if ( e.type !== “focusout” || elem.type !== “radio” ) {
jQuery.data( elem, “_change_data”, val );
}
if ( data === undefined || val === data ) {
return;
}
if ( data != null || val ) {
e.type = “change”;
return jQuery.event.trigger( e, arguments[1], elem );
}
};
jQuery.event.special.change = {
filters: {
focusout: testChange,
click: function( e ) {
var elem = e.target, type = elem.type;
if ( type === “radio” || type === “checkbox” || elem.nodeName.toLowerCase() === “select” ) {
return testChange.call( this, e );
}
},
// Change has to be called before submit
// Keydown will be called before keypress, which is used in submit-event delegation
keydown: function( e ) {
var elem = e.target, type = elem.type;
if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== “textarea”) ||
(e.keyCode === 32 && (type === “checkbox” || type === “radio”)) ||
type === “select-multiple” ) {
return testChange.call( this, e );
}
},
// Beforeactivate happens also before the previous element is blurred
// with this event you can’t trigger a change event, but you can store
// information/focus[in] is not needed anymore
beforeactivate: function( e ) {
var elem = e.target;
jQuery.data( elem, “_change_data”, getVal(elem) );
}
},
setup: function( data, namespaces ) {
if ( this.type === “file” ) {
return false;
}
for ( var type in changeFilters ) {
jQuery.event.add( this, type + “.specialChange”, changeFilters[type] );
}
return formElems.test( this.nodeName );
},
teardown: function( namespaces ) {
jQuery.event.remove( this, “.specialChange” );
return formElems.test( this.nodeName );
}
};
changeFilters = jQuery.event.special.change.filters;
}
function trigger( type, elem, args ) {
args[0].type = type;
return jQuery.event.handle.apply( elem, args );
}
// Create “bubbling” focus and blur events
if ( document.addEventListener ) {
jQuery.each({ focus: “focusin”, blur: “focusout” }, function( orig, fix ) {
jQuery.event.special[ fix ] = {
setup: function() {
this.addEventListener( orig, handler, true );
},
teardown: function() {
this.removeEventListener( orig, handler, true );
}
};
function handler( e ) {
e = jQuery.event.fix( e );
e.type = fix;
return jQuery.event.handle.call( this, e );
}
});
}
jQuery.each([“bind”, “one”], function( i, name ) {
jQuery.fn[ name ] = function( type, data, fn ) {
// Handle object literals
if ( typeof type === “object” ) {
for ( var key in type ) {
this[ name ](key, data, type[key], fn);
}
return this;
}
if ( jQuery.isFunction( data ) ) {
fn = data;
data = undefined;
}
var handler = name === “one” ? jQuery.proxy( fn, function( event ) {
jQuery( this ).unbind( event, handler );
return fn.apply( this, arguments );
}) : fn;
if ( type === “unload” && name !== “one” ) {
this.one( type, data, fn );
} else {
for ( var i = 0, l = this.length; i < l; i++ ) {
jQuery.event.add( this[i], type, handler, data );
}
}
return this;
};
});
jQuery.fn.extend({
unbind: function( type, fn ) {
// Handle object literals
if ( typeof type === "object" && !type.preventDefault ) {
for ( var key in type ) {
this.unbind(key, type[key]);
}
} else {
for ( var i = 0, l = this.length; i < l; i++ ) {
jQuery.event.remove( this[i], type, fn );
}
}
return this;
},
delegate: function( selector, types, data, fn ) {
return this.live( types, data, fn, selector );
},
undelegate: function( selector, types, fn ) {
if ( arguments.length === 0 ) {
return this.unbind( "live" );
} else {
return this.die( types, null, fn, selector );
}
},
trigger: function( type, data ) {
return this.each(function() {
jQuery.event.trigger( type, data, this );
});
},
triggerHandler: function( type, data ) {
if ( this[0] ) {
var event = jQuery.Event( type );
event.preventDefault();
event.stopPropagation();
jQuery.event.trigger( event, data, this[0] );
return event.result;
}
},
toggle: function( fn ) {
// Save reference to arguments for access in closure
var args = arguments, i = 1;
// link all the functions, so any of them can unbind this click handler
while ( i < args.length ) {
jQuery.proxy( fn, args[ i++ ] );
}
return this.click( jQuery.proxy( fn, function( event ) {
// Figure out which function to execute
var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
// Make sure that clicks stop
event.preventDefault();
// and execute the function
return args[ lastToggle ].apply( this, arguments ) || false;
}));
},
hover: function( fnOver, fnOut ) {
return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
}
});
var liveMap = {
focus: "focusin",
blur: "focusout",
mouseenter: "mouseover",
mouseleave: "mouseout"
};
jQuery.each(["live", "die"], function( i, name ) {
jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
var type, i = 0, match, namespaces, preType,
selector = origSelector || this.selector,
context = origSelector ? this : jQuery( this.context );
if ( jQuery.isFunction( data ) ) {
fn = data;
data = undefined;
}
types = (types || "").split(" ");
while ( (type = types[ i++ ]) != null ) {
match = rnamespaces.exec( type );
namespaces = "";
if ( match ) {
namespaces = match[0];
type = type.replace( rnamespaces, "" );
}
if ( type === "hover" ) {
types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
continue;
}
preType = type;
if ( type === "focus" || type === "blur" ) {
types.push( liveMap[ type ] + namespaces );
type = type + namespaces;
} else {
type = (liveMap[ type ] || type) + namespaces;
}
if ( name === "live" ) {
// bind live handler
context.each(function(){
jQuery.event.add( this, liveConvert( type, selector ),
{ data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
});
} else {
// unbind live handler
context.unbind( liveConvert( type, selector ), fn );
}
}
return this;
}
});
function liveHandler( event ) {
var stop, elems = [], selectors = [], args = arguments,
related, match, handleObj, elem, j, i, l, data,
events = jQuery.data( this, "events" );
// Make sure we avoid non-left-click bubbling in Firefox (#3861)
if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) {
return;
}
event.liveFired = this;
var live = events.live.slice(0);
for ( j = 0; j < live.length; j++ ) {
handleObj = live[j];
if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
selectors.push( handleObj.selector );
} else {
live.splice( j–, 1 );
}
}
match = jQuery( event.target ).closest( selectors, event.currentTarget );
for ( i = 0, l = match.length; i < l; i++ ) {
for ( j = 0; j < live.length; j++ ) {
handleObj = live[j];
if ( match[i].selector === handleObj.selector ) {
elem = match[i].elem;
related = null;
// Those two events require additional checking
if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
}
if ( !related || related !== elem ) {
elems.push({ elem: elem, handleObj: handleObj });
}
}
}
}
for ( i = 0, l = elems.length; i +~,([\]+)+|[>+~])(s*,s*)?((?:.|r|n)*)/g,
done = 0,
toString = Object.prototype.toString,
hasDuplicate = false,
baseHasDuplicate = true;
// Here we check if the JavaScript engine is using some sort of
// optimization where it does not always call our comparision
// function. If that is the case, discard the hasDuplicate value.
// Thus far that includes Google Chrome.
[0, 0].sort(function(){
baseHasDuplicate = false;
return 0;
});
var Sizzle = function(selector, context, results, seed) {
results = results || [];
var origContext = context = context || document;
if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
return [];
}
if ( !selector || typeof selector !== “string” ) {
return results;
}
var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context),
soFar = selector;
// Reset the position of the chunker regexp (start from head)
while ( (chunker.exec(“”), m = chunker.exec(soFar)) !== null ) {
soFar = m[3];
parts.push( m[1] );
if ( m[2] ) {
extra = m[3];
break;
}
}
if ( parts.length > 1 && origPOS.exec( selector ) ) {
if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
set = posProcess( parts[0] + parts[1], context );
} else {
set = Expr.relative[ parts[0] ] ?
[ context ] :
Sizzle( parts.shift(), context );
while ( parts.length ) {
selector = parts.shift();
if ( Expr.relative[ selector ] ) {
selector += parts.shift();
}
set = posProcess( selector, set );
}
}
} else {
// Take a shortcut and set the context if the root selector is an ID
// (but not if it’ll be faster if the inner selector is an ID)
if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length – 1]) ) {
var ret = Sizzle.find( parts.shift(), context, contextXML );
context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
}
if ( context ) {
var ret = seed ?
{ expr: parts.pop(), set: makeArray(seed) } :
Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === “~” || parts[0] === “+”) && context.parentNode ? context.parentNode : context, contextXML );
set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;
if ( parts.length > 0 ) {
checkSet = makeArray(set);
} else {
prune = false;
}
while ( parts.length ) {
var cur = parts.pop(), pop = cur;
if ( !Expr.relative[ cur ] ) {
cur = “”;
} else {
pop = parts.pop();
}
if ( pop == null ) {
pop = context;
}
Expr.relative[ cur ]( checkSet, pop, contextXML );
}
} else {
checkSet = parts = [];
}
}
if ( !checkSet ) {
checkSet = set;
}
if ( !checkSet ) {
Sizzle.error( cur || selector );
}
if ( toString.call(checkSet) === “[object Array]” ) {
if ( !prune ) {
results.push.apply( results, checkSet );
} else if ( context && context.nodeType === 1 ) {
for ( var i = 0; checkSet[i] != null; i++ ) {
if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
results.push( set[i] );
}
}
} else {
for ( var i = 0; checkSet[i] != null; i++ ) {
if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
results.push( set[i] );
}
}
}
} else {
makeArray( checkSet, results );
}
if ( extra ) {
Sizzle( extra, origContext, results, seed );
Sizzle.uniqueSort( results );
}
return results;
};
Sizzle.uniqueSort = function(results){
if ( sortOrder ) {
hasDuplicate = baseHasDuplicate;
results.sort(sortOrder);
if ( hasDuplicate ) {
for ( var i = 1; i < results.length; i++ ) {
if ( results[i] === results[i-1] ) {
results.splice(i–, 1);
}
}
}
}
return results;
};
Sizzle.matches = function(expr, set){
return Sizzle(expr, null, null, set);
};
Sizzle.find = function(expr, context, isXML){
var set, match;
if ( !expr ) {
return [];
}
for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
var type = Expr.order[i], match;
if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
var left = match[1];
match.splice(1,1);
if ( left.substr( left.length – 1 ) !== "\" ) {
match[1] = (match[1] || "").replace(/\/g, "");
set = Expr.find[ type ]( match, context, isXML );
if ( set != null ) {
expr = expr.replace( Expr.match[ type ], "" );
break;
}
}
}
}
if ( !set ) {
set = context.getElementsByTagName("*");
}
return {set: set, expr: expr};
};
Sizzle.filter = function(expr, set, inplace, not){
var old = expr, result = [], curLoop = set, match, anyFound,
isXMLFilter = set && set[0] && isXML(set[0]);
while ( expr && set.length ) {
for ( var type in Expr.filter ) {
if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
var filter = Expr.filter[ type ], found, item, left = match[1];
anyFound = false;
match.splice(1,1);
if ( left.substr( left.length – 1 ) === "\" ) {
continue;
}
if ( curLoop === result ) {
result = [];
}
if ( Expr.preFilter[ type ] ) {
match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
if ( !match ) {
anyFound = found = true;
} else if ( match === true ) {
continue;
}
}
if ( match ) {
for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
if ( item ) {
found = filter( item, match, i, curLoop );
var pass = not ^ !!found;
if ( inplace && found != null ) {
if ( pass ) {
anyFound = true;
} else {
curLoop[i] = false;
}
} else if ( pass ) {
result.push( item );
anyFound = true;
}
}
}
}
if ( found !== undefined ) {
if ( !inplace ) {
curLoop = result;
}
expr = expr.replace( Expr.match[ type ], "" );
if ( !anyFound ) {
return [];
}
break;
}
}
}
// Improper expression
if ( expr === old ) {
if ( anyFound == null ) {
Sizzle.error( expr );
} else {
break;
}
}
old = expr;
}
return curLoop;
};
Sizzle.error = function( msg ) {
throw "Syntax error, unrecognized expression: " + msg;
};
var Expr = Sizzle.selectors = {
order: [ "ID", "NAME", "TAG" ],
match: {
ID: /#((?:[wu00c0-uFFFF-]|\.)+)/,
CLASS: /.((?:[wu00c0-uFFFF-]|\.)+)/,
NAME: /[name=['"]*((?:[wu00c0-uFFFF-]|\.)+)['"]*]/,
ATTR: /[s*((?:[wu00c0-uFFFF-]|\.)+)s*(?:(S?=)s*(['"]*)(.*?)3|)s*]/,
TAG: /^((?:[wu00c0-uFFFF*-]|\.)+)/,
CHILD: /:(only|nth|last|first)-child(?:((even|odd|[dn+-]*)))?/,
POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:((d*)))?(?=[^-]|$)/,
PSEUDO: /:((?:[wu00c0-uFFFF-]|\.)+)(?:((['"]?)((?:([^)]+)|[^()]*)+)2))?/
},
leftMatch: {},
attrMap: {
"class": "className",
"for": "htmlFor"
},
attrHandle: {
href: function(elem){
return elem.getAttribute("href");
}
},
relative: {
"+": function(checkSet, part){
var isPartStr = typeof part === "string",
isTag = isPartStr && !/W/.test(part),
isPartStrNotTag = isPartStr && !isTag;
if ( isTag ) {
part = part.toLowerCase();
}
for ( var i = 0, l = checkSet.length, elem; i “: function(checkSet, part){
var isPartStr = typeof part === “string”;
if ( isPartStr && !/W/.test(part) ) {
part = part.toLowerCase();
for ( var i = 0, l = checkSet.length; i < l; i++ ) {
var elem = checkSet[i];
if ( elem ) {
var parent = elem.parentNode;
checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
}
}
} else {
for ( var i = 0, l = checkSet.length; i < l; i++ ) {
var elem = checkSet[i];
if ( elem ) {
checkSet[i] = isPartStr ?
elem.parentNode :
elem.parentNode === part;
}
}
if ( isPartStr ) {
Sizzle.filter( part, checkSet, true );
}
}
},
"": function(checkSet, part, isXML){
var doneName = done++, checkFn = dirCheck;
if ( typeof part === "string" && !/W/.test(part) ) {
var nodeCheck = part = part.toLowerCase();
checkFn = dirNodeCheck;
}
checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
},
"~": function(checkSet, part, isXML){
var doneName = done++, checkFn = dirCheck;
if ( typeof part === "string" && !/W/.test(part) ) {
var nodeCheck = part = part.toLowerCase();
checkFn = dirNodeCheck;
}
checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
}
},
find: {
ID: function(match, context, isXML){
if ( typeof context.getElementById !== "undefined" && !isXML ) {
var m = context.getElementById(match[1]);
return m ? [m] : [];
}
},
NAME: function(match, context){
if ( typeof context.getElementsByName !== "undefined" ) {
var ret = [], results = context.getElementsByName(match[1]);
for ( var i = 0, l = results.length; i = 0) ) {
if ( !inplace ) {
result.push( elem );
}
} else if ( inplace ) {
curLoop[i] = false;
}
}
}
return false;
},
ID: function(match){
return match[1].replace(/\/g, “”);
},
TAG: function(match, curLoop){
return match[1].toLowerCase();
},
CHILD: function(match){
if ( match[1] === “nth” ) {
// parse equations like ‘even’, ‘odd’, ‘5’, ‘2n’, ‘3n+2’, ‘4n-1’, ‘-n+6’
var test = /(-?)(d*)n((?:+|-)?d*)/.exec(
match[2] === “even” && “2n” || match[2] === “odd” && “2n+1” ||
!/D/.test( match[2] ) && “0n+” + match[2] || match[2]);
// calculate the numbers (first)n+(last) including if they are negative
match[2] = (test[1] + (test[2] || 1)) – 0;
match[3] = test[3] – 0;
}
// TODO: Move to normal caching system
match[0] = done++;
return match;
},
ATTR: function(match, curLoop, inplace, result, not, isXML){
var name = match[1].replace(/\/g, “”);
if ( !isXML && Expr.attrMap[name] ) {
match[1] = Expr.attrMap[name];
}
if ( match[2] === “~=” ) {
match[4] = ” ” + match[4] + ” “;
}
return match;
},
PSEUDO: function(match, curLoop, inplace, result, not){
if ( match[1] === “not” ) {
// If we’re dealing with a complex expression, or a simple one
if ( ( chunker.exec(match[3]) || “” ).length > 1 || /^w/.test(match[3]) ) {
match[3] = Sizzle(match[3], null, null, curLoop);
} else {
var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
if ( !inplace ) {
result.push.apply( result, ret );
}
return false;
}
} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
return true;
}
return match;
},
POS: function(match){
match.unshift( true );
return match;
}
},
filters: {
enabled: function(elem){
return elem.disabled === false && elem.type !== “hidden”;
},
disabled: function(elem){
return elem.disabled === true;
},
checked: function(elem){
return elem.checked === true;
},
selected: function(elem){
// Accessing this property makes selected-by-default
// options in Safari work properly
elem.parentNode.selectedIndex;
return elem.selected === true;
},
parent: function(elem){
return !!elem.firstChild;
},
empty: function(elem){
return !elem.firstChild;
},
has: function(elem, i, match){
return !!Sizzle( match[3], elem ).length;
},
header: function(elem){
return /hd/i.test( elem.nodeName );
},
text: function(elem){
return “text” === elem.type;
},
radio: function(elem){
return “radio” === elem.type;
},
checkbox: function(elem){
return “checkbox” === elem.type;
},
file: function(elem){
return “file” === elem.type;
},
password: function(elem){
return “password” === elem.type;
},
submit: function(elem){
return “submit” === elem.type;
},
image: function(elem){
return “image” === elem.type;
},
reset: function(elem){
return “reset” === elem.type;
},
button: function(elem){
return “button” === elem.type || elem.nodeName.toLowerCase() === “button”;
},
input: function(elem){
return /input|select|textarea|button/i.test(elem.nodeName);
}
},
setFilters: {
first: function(elem, i){
return i === 0;
},
last: function(elem, i, match, array){
return i === array.length – 1;
},
even: function(elem, i){
return i % 2 === 0;
},
odd: function(elem, i){
return i % 2 === 1;
},
lt: function(elem, i, match){
return i match[3] – 0;
},
nth: function(elem, i, match){
return match[3] – 0 === i;
},
eq: function(elem, i, match){
return match[3] – 0 === i;
}
},
filter: {
PSEUDO: function(elem, match, i, array){
var name = match[1], filter = Expr.filters[ name ];
if ( filter ) {
return filter( elem, i, match, array );
} else if ( name === “contains” ) {
return (elem.textContent || elem.innerText || getText([ elem ]) || “”).indexOf(match[3]) >= 0;
} else if ( name === “not” ) {
var not = match[3];
for ( var i = 0, l = not.length; i = 0 );
}
}
},
ID: function(elem, match){
return elem.nodeType === 1 && elem.getAttribute(“id”) === match;
},
TAG: function(elem, match){
return (match === “*” && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
},
CLASS: function(elem, match){
return (” ” + (elem.className || elem.getAttribute(“class”)) + ” “)
.indexOf( match ) > -1;
},
ATTR: function(elem, match){
var name = match[1],
result = Expr.attrHandle[ name ] ?
Expr.attrHandle[ name ]( elem ) :
elem[ name ] != null ?
elem[ name ] :
elem.getAttribute( name ),
value = result + “”,
type = match[2],
check = match[4];
return result == null ?
type === “!=” :
type === “=” ?
value === check :
type === “*=” ?
value.indexOf(check) >= 0 :
type === “~=” ?
(” ” + value + ” “).indexOf(check) >= 0 :
!check ?
value && result !== false :
type === “!=” ?
value !== check :
type === “^=” ?
value.indexOf(check) === 0 :
type === “$=” ?
value.substr(value.length – check.length) === check :
type === “|=” ?
value === check || value.substr(0, check.length + 1) === check + “-” :
false;
},
POS: function(elem, match, i, array){
var name = match[2], filter = Expr.setFilters[ name ];
if ( filter ) {
return filter( elem, i, match, array );
}
}
}
};
var origPOS = Expr.match.POS;
for ( var type in Expr.match ) {
Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^[]*])(?![^(]*))/.source );
Expr.leftMatch[ type ] = new RegExp( /(^(?:.|r|n)*?)/.source + Expr.match[ type ].source.replace(/\(d+)/g, function(all, num){
return “\” + (num – 0 + 1);
}));
}
var makeArray = function(array, results) {
array = Array.prototype.slice.call( array, 0 );
if ( results ) {
results.push.apply( results, array );
return results;
}
return array;
};
// Perform a simple check to determine if the browser is capable of
// converting a NodeList to an array using builtin methods.
// Also verifies that the returned array holds DOM nodes
// (which is not the case in the Blackberry browser)
try {
Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
// Provide a fallback method if it does not work
} catch(e){
makeArray = function(array, results) {
var ret = results || [];
if ( toString.call(array) === “[object Array]” ) {
Array.prototype.push.apply( ret, array );
} else {
if ( typeof array.length === “number” ) {
for ( var i = 0, l = array.length; i < l; i++ ) {
ret.push( array[i] );
}
} else {
for ( var i = 0; array[i]; i++ ) {
ret.push( array[i] );
}
}
}
return ret;
};
}
var sortOrder;
if ( document.documentElement.compareDocumentPosition ) {
sortOrder = function( a, b ) {
if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
if ( a == b ) {
hasDuplicate = true;
}
return a.compareDocumentPosition ? -1 : 1;
}
var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
if ( ret === 0 ) {
hasDuplicate = true;
}
return ret;
};
} else if ( "sourceIndex" in document.documentElement ) {
sortOrder = function( a, b ) {
if ( !a.sourceIndex || !b.sourceIndex ) {
if ( a == b ) {
hasDuplicate = true;
}
return a.sourceIndex ? -1 : 1;
}
var ret = a.sourceIndex – b.sourceIndex;
if ( ret === 0 ) {
hasDuplicate = true;
}
return ret;
};
} else if ( document.createRange ) {
sortOrder = function( a, b ) {
if ( !a.ownerDocument || !b.ownerDocument ) {
if ( a == b ) {
hasDuplicate = true;
}
return a.ownerDocument ? -1 : 1;
}
var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
aRange.setStart(a, 0);
aRange.setEnd(a, 0);
bRange.setStart(b, 0);
bRange.setEnd(b, 0);
var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
if ( ret === 0 ) {
hasDuplicate = true;
}
return ret;
};
}
// Utility function for retreiving the text value of an array of DOM nodes
function getText( elems ) {
var ret = "", elem;
for ( var i = 0; elems[i]; i++ ) {
elem = elems[i];
// Get the text from text nodes and CDATA nodes
if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
ret += elem.nodeValue;
// Traverse everything else, except comment nodes
} else if ( elem.nodeType !== 8 ) {
ret += getText( elem.childNodes );
}
}
return ret;
}
// Check to see if the browser returns elements by name when
// querying by getElementById (and provide a workaround)
(function(){
// We're going to inject a fake input element with a specified name
var form = document.createElement("div"),
id = "script" + (new Date).getTime();
form.innerHTML = "“;
// Inject it into the root element, check its status, and remove it quickly
var root = document.documentElement;
root.insertBefore( form, root.firstChild );
// The workaround has to do additional checks after a getElementById
// Which slows things down for other browsers (hence the branching)
if ( document.getElementById( id ) ) {
Expr.find.ID = function(match, context, isXML){
if ( typeof context.getElementById !== “undefined” && !isXML ) {
var m = context.getElementById(match[1]);
return m ? m.id === match[1] || typeof m.getAttributeNode !== “undefined” && m.getAttributeNode(“id”).nodeValue === match[1] ? [m] : undefined : [];
}
};
Expr.filter.ID = function(elem, match){
var node = typeof elem.getAttributeNode !== “undefined” && elem.getAttributeNode(“id”);
return elem.nodeType === 1 && node && node.nodeValue === match;
};
}
root.removeChild( form );
root = form = null; // release memory in IE
})();
(function(){
// Check to see if the browser returns only elements
// when doing getElementsByTagName(“*”)
// Create a fake element
var div = document.createElement(“div”);
div.appendChild( document.createComment(“”) );
// Make sure no comments are found
if ( div.getElementsByTagName(“*”).length > 0 ) {
Expr.find.TAG = function(match, context){
var results = context.getElementsByTagName(match[1]);
// Filter out possible comments
if ( match[1] === “*” ) {
var tmp = [];
for ( var i = 0; results[i]; i++ ) {
if ( results[i].nodeType === 1 ) {
tmp.push( results[i] );
}
}
results = tmp;
}
return results;
};
}
// Check to see if an attribute returns normalized href attributes
div.innerHTML = ““;
if ( div.firstChild && typeof div.firstChild.getAttribute !== “undefined” &&
div.firstChild.getAttribute(“href”) !== “#” ) {
Expr.attrHandle.href = function(elem){
return elem.getAttribute(“href”, 2);
};
}
div = null; // release memory in IE
})();
if ( document.querySelectorAll ) {
(function(){
var oldSizzle = Sizzle, div = document.createElement(“div”);
div.innerHTML = ”
“;
// Safari can’t handle uppercase or unicode characters when
// in quirks mode.
if ( div.querySelectorAll && div.querySelectorAll(“.TEST”).length === 0 ) {
return;
}
Sizzle = function(query, context, extra, seed){
context = context || document;
// Only use querySelectorAll on non-XML documents
// (ID selectors don’t work in non-HTML documents)
if ( !seed && context.nodeType === 9 && !isXML(context) ) {
try {
return makeArray( context.querySelectorAll(query), extra );
} catch(e){}
}
return oldSizzle(query, context, extra, seed);
};
for ( var prop in oldSizzle ) {
Sizzle[ prop ] = oldSizzle[ prop ];
}
div = null; // release memory in IE
})();
}
(function(){
var div = document.createElement(“div”);
div.innerHTML = ”
“;
// Opera can’t find a second classname (in 9.6)
// Also, make sure that getElementsByClassName actually exists
if ( !div.getElementsByClassName || div.getElementsByClassName(“e”).length === 0 ) {
return;
}
// Safari caches class attributes, doesn’t catch changes (in 3.2)
div.lastChild.className = “e”;
if ( div.getElementsByClassName(“e”).length === 1 ) {
return;
}
Expr.order.splice(1, 0, “CLASS”);
Expr.find.CLASS = function(match, context, isXML) {
if ( typeof context.getElementsByClassName !== “undefined” && !isXML ) {
return context.getElementsByClassName(match[1]);
}
};
div = null; // release memory in IE
})();
function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
for ( var i = 0, l = checkSet.length; i < l; i++ ) {
var elem = checkSet[i];
if ( elem ) {
elem = elem[dir];
var match = false;
while ( elem ) {
if ( elem.sizcache === doneName ) {
match = checkSet[elem.sizset];
break;
}
if ( elem.nodeType === 1 && !isXML ){
elem.sizcache = doneName;
elem.sizset = i;
}
if ( elem.nodeName.toLowerCase() === cur ) {
match = elem;
break;
}
elem = elem[dir];
}
checkSet[i] = match;
}
}
}
function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
for ( var i = 0, l = checkSet.length; i 0 ) {
match = elem;
break;
}
}
elem = elem[dir];
}
checkSet[i] = match;
}
}
}
var contains = document.compareDocumentPosition ? function(a, b){
return !!(a.compareDocumentPosition(b) & 16);
} : function(a, b){
return a !== b && (a.contains ? a.contains(b) : true);
};
var isXML = function(elem){
// documentElement is verified for cases where it doesn’t yet exist
// (such as loading iframes in IE – #4833)
var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
return documentElement ? documentElement.nodeName !== “HTML” : false;
};
var posProcess = function(selector, context){
var tmpSet = [], later = “”, match,
root = context.nodeType ? [context] : context;
// Position selectors must be done after the filter
// And so must :not(positional) so we move all PSEUDOs to the end
while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
later += match[0];
selector = selector.replace( Expr.match.PSEUDO, “” );
}
selector = Expr.relative[selector] ? selector + “*” : selector;
for ( var i = 0, l = root.length; i = 0) === keep;
});
};
jQuery.fn.extend({
find: function( selector ) {
var ret = this.pushStack( “”, “find”, selector ), length = 0;
for ( var i = 0, l = this.length; i 0 ) {
// Make sure that the results are unique
for ( var n = length; n < ret.length; n++ ) {
for ( var r = 0; r < length; r++ ) {
if ( ret[r] === ret[n] ) {
ret.splice(n–, 1);
break;
}
}
}
}
}
return ret;
},
has: function( target ) {
var targets = jQuery( target );
return this.filter(function() {
for ( var i = 0, l = targets.length; i 0;
},
closest: function( selectors, context ) {
if ( jQuery.isArray( selectors ) ) {
var ret = [], cur = this[0], match, matches = {}, selector;
if ( cur && selectors.length ) {
for ( var i = 0, l = selectors.length; i -1 : jQuery(cur).is(match) ) {
ret.push({ selector: selector, elem: cur });
delete matches[selector];
}
}
cur = cur.parentNode;
}
}
return ret;
}
var pos = jQuery.expr.match.POS.test( selectors ) ?
jQuery( selectors, context || this.context ) : null;
return this.map(function( i, cur ) {
while ( cur && cur.ownerDocument && cur !== context ) {
if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) {
return cur;
}
cur = cur.parentNode;
}
return null;
});
},
// Determine the position of an element within
// the matched set of elements
index: function( elem ) {
if ( !elem || typeof elem === “string” ) {
return jQuery.inArray( this[0],
// If it receives a string, the selector is used
// If it receives nothing, the siblings are used
elem ? jQuery( elem ) : this.parent().children() );
}
// Locate the position of the desired element
return jQuery.inArray(
// If it receives a jQuery object, the first element is used
elem.jquery ? elem[0] : elem, this );
},
add: function( selector, context ) {
var set = typeof selector === “string” ?
jQuery( selector, context || this.context ) :
jQuery.makeArray( selector ),
all = jQuery.merge( this.get(), set );
return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
all :
jQuery.unique( all ) );
},
andSelf: function() {
return this.add( this.prevObject );
}
});
// A painfully simple check to see if an element is disconnected
// from a document (should be improved, where feasible).
function isDisconnected( node ) {
return !node || !node.parentNode || node.parentNode.nodeType === 11;
}
jQuery.each({
parent: function( elem ) {
var parent = elem.parentNode;
return parent && parent.nodeType !== 11 ? parent : null;
},
parents: function( elem ) {
return jQuery.dir( elem, “parentNode” );
},
parentsUntil: function( elem, i, until ) {
return jQuery.dir( elem, “parentNode”, until );
},
next: function( elem ) {
return jQuery.nth( elem, 2, “nextSibling” );
},
prev: function( elem ) {
return jQuery.nth( elem, 2, “previousSibling” );
},
nextAll: function( elem ) {
return jQuery.dir( elem, “nextSibling” );
},
prevAll: function( elem ) {
return jQuery.dir( elem, “previousSibling” );
},
nextUntil: function( elem, i, until ) {
return jQuery.dir( elem, “nextSibling”, until );
},
prevUntil: function( elem, i, until ) {
return jQuery.dir( elem, “previousSibling”, until );
},
siblings: function( elem ) {
return jQuery.sibling( elem.parentNode.firstChild, elem );
},
children: function( elem ) {
return jQuery.sibling( elem.firstChild );
},
contents: function( elem ) {
return jQuery.nodeName( elem, “iframe” ) ?
elem.contentDocument || elem.contentWindow.document :
jQuery.makeArray( elem.childNodes );
}
}, function( name, fn ) {
jQuery.fn[ name ] = function( until, selector ) {
var ret = jQuery.map( this, fn, until );
if ( !runtil.test( name ) ) {
selector = until;
}
if ( selector && typeof selector === “string” ) {
ret = jQuery.filter( selector, ret );
}
ret = this.length > 1 ? jQuery.unique( ret ) : ret;
if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
ret = ret.reverse();
}
return this.pushStack( ret, name, slice.call(arguments).join(“,”) );
};
});
jQuery.extend({
filter: function( expr, elems, not ) {
if ( not ) {
expr = “:not(” + expr + “)”;
}
return jQuery.find.matches(expr, elems);
},
dir: function( elem, dir, until ) {
var matched = [], cur = elem[dir];
while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
if ( cur.nodeType === 1 ) {
matched.push( cur );
}
cur = cur[dir];
}
return matched;
},
nth: function( cur, result, dir, elem ) {
result = result || 1;
var num = 0;
for ( ; cur; cur = cur[dir] ) {
if ( cur.nodeType === 1 && ++num === result ) {
break;
}
}
return cur;
},
sibling: function( n, elem ) {
var r = [];
for ( ; n; n = n.nextSibling ) {
if ( n.nodeType === 1 && n !== elem ) {
r.push( n );
}
}
return r;
}
});
var rinlinejQuery = / jQueryd+=”(?:d+|null)”/g,
rleadingWhitespace = /^s+/,
rxhtmlTag = /(]*?)/>/g,
rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,
rtagName = /<([w:]+)/,
rtbody = /
<tbody/i,
rhtml = /<|&#?w+;/,
rnocache = /<script|<object|<embed|
<option|
“;
},
wrapMap = {
option: [ 1, “”, ”
” ],
legend: [ 1, ”
“, ”
” ],
thead: [ 1, ”
” ],
tr: [ 2, ”
” ],
td: [ 3, ”
” ],
col: [ 2, ”
” ],
area: [ 1, ”
” ],
_default: [ 0, “”, “” ]
};
wrapMap.optgroup = wrapMap.option;
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
wrapMap.th = wrapMap.td;
// IE can’t serialize
and tags normally
if ( !jQuery.support.htmlSerialize ) {
wrapMap._default = [ 1, “div
” ];
}
jQuery.fn.extend({
text: function( text ) {
if ( jQuery.isFunction(text) ) {
return this.each(function(i) {
var self = jQuery(this);
self.text( text.call(this, i, self.text()) );
});
}
if ( typeof text !== “object” && text !== undefined ) {
return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
}
return jQuery.text( this );
},
wrapAll: function( html ) {
if ( jQuery.isFunction( html ) ) {
return this.each(function(i) {
jQuery(this).wrapAll( html.call(this, i) );
});
}
if ( this[0] ) {
// The elements to wrap the target around
var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
if ( this[0].parentNode ) {
wrap.insertBefore( this[0] );
}
wrap.map(function() {
var elem = this;
while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
elem = elem.firstChild;
}
return elem;
}).append(this);
}
return this;
},
wrapInner: function( html ) {
if ( jQuery.isFunction( html ) ) {
return this.each(function(i) {
jQuery(this).wrapInner( html.call(this, i) );
});
}
return this.each(function() {
var self = jQuery( this ), contents = self.contents();
if ( contents.length ) {
contents.wrapAll( html );
} else {
self.append( html );
}
});
},
wrap: function( html ) {
return this.each(function() {
jQuery( this ).wrapAll( html );
});
},
unwrap: function() {
return this.parent().each(function() {
if ( !jQuery.nodeName( this, “body” ) ) {
jQuery( this ).replaceWith( this.childNodes );
}
}).end();
},
append: function() {
return this.domManip(arguments, true, function( elem ) {
if ( this.nodeType === 1 ) {
this.appendChild( elem );
}
});
},
prepend: function() {
return this.domManip(arguments, true, function( elem ) {
if ( this.nodeType === 1 ) {
this.insertBefore( elem, this.firstChild );
}
});
},
before: function() {
if ( this[0] && this[0].parentNode ) {
return this.domManip(arguments, false, function( elem ) {
this.parentNode.insertBefore( elem, this );
});
} else if ( arguments.length ) {
var set = jQuery(arguments[0]);
set.push.apply( set, this.toArray() );
return this.pushStack( set, “before”, arguments );
}
},
after: function() {
if ( this[0] && this[0].parentNode ) {
return this.domManip(arguments, false, function( elem ) {
this.parentNode.insertBefore( elem, this.nextSibling );
});
} else if ( arguments.length ) {
var set = this.pushStack( this, “after”, arguments );
set.push.apply( set, jQuery(arguments[0]).toArray() );
return set;
}
},
// keepData is for internal use only–do not document
remove: function( selector, keepData ) {
for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
if ( !keepData && elem.nodeType === 1 ) {
jQuery.cleanData( elem.getElementsByTagName(“*”) );
jQuery.cleanData( [ elem ] );
}
if ( elem.parentNode ) {
elem.parentNode.removeChild( elem );
}
}
}
return this;
},
empty: function() {
for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
// Remove element nodes and prevent memory leaks
if ( elem.nodeType === 1 ) {
jQuery.cleanData( elem.getElementsByTagName(“*”) );
}
// Remove any remaining nodes
while ( elem.firstChild ) {
elem.removeChild( elem.firstChild );
}
}
return this;
},
clone: function( events ) {
// Do the clone
var ret = this.map(function() {
if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
// IE copies events bound via attachEvent when
// using cloneNode. Calling detachEvent on the
// clone will also remove the events from the orignal
// In order to get around this, we use innerHTML.
// Unfortunately, this means some modifications to
// attributes in IE that are actually only stored
// as properties will not be copied (such as the
// the name attribute on an input).
var html = this.outerHTML, ownerDocument = this.ownerDocument;
if ( !html ) {
var div = ownerDocument.createElement(“div”);
div.appendChild( this.cloneNode(true) );
html = div.innerHTML;
}
return jQuery.clean([html.replace(rinlinejQuery, “”)
// Handle the case in IE 8 where action=/test/> self-closes a tag
.replace(/=([^=”‘>s]+/)>/g, ‘=”$1″>’)
.replace(rleadingWhitespace, “”)], ownerDocument)[0];
} else {
return this.cloneNode(true);
}
});
// Copy the events from the original to the clone
if ( events === true ) {
cloneCopyEvent( this, ret );
cloneCopyEvent( this.find(“*”), ret.find(“*”) );
}
// Return the cloned set
return ret;
},
html: function( value ) {
if ( value === undefined ) {
return this[0] && this[0].nodeType === 1 ?
this[0].innerHTML.replace(rinlinejQuery, “”) :
null;
// See if we can take a shortcut and just use innerHTML
} else if ( typeof value === “string” && !rnocache.test( value ) &&
(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
!wrapMap[ (rtagName.exec( value ) || [“”, “”])[1].toLowerCase() ] ) {
value = value.replace(rxhtmlTag, fcloseTag);
try {
for ( var i = 0, l = this.length; i < l; i++ ) {
// Remove element nodes and prevent memory leaks
if ( this[i].nodeType === 1 ) {
jQuery.cleanData( this[i].getElementsByTagName("*") );
this[i].innerHTML = value;
}
}
// If using innerHTML throws an exception, use the fallback method
} catch(e) {
this.empty().append( value );
}
} else if ( jQuery.isFunction( value ) ) {
this.each(function(i){
var self = jQuery(this), old = self.html();
self.empty().append(function(){
return value.call( this, i, old );
});
});
} else {
this.empty().append( value );
}
return this;
},
replaceWith: function( value ) {
if ( this[0] && this[0].parentNode ) {
// Make sure that the elements are removed from the DOM before they are inserted
// this can help fix replacing a parent with child elements
if ( jQuery.isFunction( value ) ) {
return this.each(function(i) {
var self = jQuery(this), old = self.html();
self.replaceWith( value.call( this, i, old ) );
});
}
if ( typeof value !== "string" ) {
value = jQuery(value).detach();
}
return this.each(function() {
var next = this.nextSibling, parent = this.parentNode;
jQuery(this).remove();
if ( next ) {
jQuery(next).before( value );
} else {
jQuery(parent).append( value );
}
});
} else {
return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
}
},
detach: function( selector ) {
return this.remove( selector, true );
},
domManip: function( args, table, callback ) {
var results, first, value = args[0], scripts = [], fragment, parent;
// We can't cloneNode fragments that contain checked, in WebKit
if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
return this.each(function() {
jQuery(this).domManip( args, table, callback, true );
});
}
if ( jQuery.isFunction(value) ) {
return this.each(function(i) {
var self = jQuery(this);
args[0] = value.call(this, i, table ? self.html() : undefined);
self.domManip( args, table, callback );
});
}
if ( this[0] ) {
parent = value && value.parentNode;
// If we're in a fragment, just use that instead of building a new one
if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
results = { fragment: parent };
} else {
results = buildFragment( args, this, scripts );
}
fragment = results.fragment;
if ( fragment.childNodes.length === 1 ) {
first = fragment = fragment.firstChild;
} else {
first = fragment.firstChild;
}
if ( first ) {
table = table && jQuery.nodeName( first, "tr" );
for ( var i = 0, l = this.length; i 0 || results.cacheable || this.length > 1 ?
fragment.cloneNode(true) :
fragment
);
}
}
if ( scripts.length ) {
jQuery.each( scripts, evalScript );
}
}
return this;
function root( elem, cur ) {
return jQuery.nodeName(elem, “table”) ?
(elem.getElementsByTagName(“tbody”)[0] ||
elem.appendChild(elem.ownerDocument.createElement(“tbody”))) :
elem;
}
}
});
function cloneCopyEvent(orig, ret) {
var i = 0;
ret.each(function() {
if ( this.nodeName !== (orig[i] && orig[i].nodeName) ) {
return;
}
var oldData = jQuery.data( orig[i++] ), curData = jQuery.data( this, oldData ), events = oldData && oldData.events;
if ( events ) {
delete curData.handle;
curData.events = {};
for ( var type in events ) {
for ( var handler in events[ type ] ) {
jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
}
}
}
});
}
function buildFragment( args, nodes, scripts ) {
var fragment, cacheable, cacheresults,
doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
// Only cache “small” (1/2 KB) strings that are associated with the main document
// Cloning options loses the selected state, so don’t cache them
// IE 6 doesn’t like it when you put or elements in a fragment
// Also, WebKit does not clone ‘checked’ attributes on cloneNode, so don’t cache
if ( args.length === 1 && typeof args[0] === “string” && args[0].length < 512 && doc === document &&
!rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
cacheable = true;
cacheresults = jQuery.fragments[ args[0] ];
if ( cacheresults ) {
if ( cacheresults !== 1 ) {
fragment = cacheresults;
}
}
}
if ( !fragment ) {
fragment = doc.createDocumentFragment();
jQuery.clean( args, doc, fragment, scripts );
}
if ( cacheable ) {
jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
}
return { fragment: fragment, cacheable: cacheable };
}
jQuery.fragments = {};
jQuery.each({
appendTo: "append",
prependTo: "prepend",
insertBefore: "before",
insertAfter: "after",
replaceAll: "replaceWith"
}, function( name, original ) {
jQuery.fn[ name ] = function( selector ) {
var ret = [], insert = jQuery( selector ),
parent = this.length === 1 && this[0].parentNode;
if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
insert[ original ]( this[0] );
return this;
} else {
for ( var i = 0, l = insert.length; i 0 ? this.clone(true) : this).get();
jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
ret = ret.concat( elems );
}
return this.pushStack( ret, name, insert.selector );
}
};
});
jQuery.extend({
clean: function( elems, context, fragment, scripts ) {
context = context || document;
// !context.createElement fails in IE with an error but returns typeof ‘object’
if ( typeof context.createElement === “undefined” ) {
context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
}
var ret = [];
for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
if ( typeof elem === “number” ) {
elem += “”;
}
if ( !elem ) {
continue;
}
// Convert html string into DOM nodes
if ( typeof elem === “string” && !rhtml.test( elem ) ) {
elem = context.createTextNode( elem );
} else if ( typeof elem === “string” ) {
// Fix “XHTML”-style tags in all browsers
elem = elem.replace(rxhtmlTag, fcloseTag);
// Trim whitespace, otherwise indexOf won’t work as expected
var tag = (rtagName.exec( elem ) || [“”, “”])[1].toLowerCase(),
wrap = wrapMap[ tag ] || wrapMap._default,
depth = wrap[0],
div = context.createElement(“div”);
// Go to html and back, then peel off extra wrappers
div.innerHTML = wrap[1] + elem + wrap[2];
// Move to the right depth
while ( depth– ) {
div = div.lastChild;
}
// Remove IE’s autoinserted
from table fragmentsif ( !jQuery.support.tbody ) {
// String was a
“;
jQuery.extend( container.style, { position: “absolute”, top: 0, left: 0, margin: 0, border: 0, width: “1px”, height: “1px”, visibility: “hidden” } );
container.innerHTML = html;
body.insertBefore( container, body.firstChild );
innerDiv = container.firstChild;
checkDiv = innerDiv.firstChild;
td = innerDiv.nextSibling.firstChild.firstChild;
this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
checkDiv.style.position = “fixed”, checkDiv.style.top = “20px”;
// safari subtracts parent border width here which is 5px
this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
checkDiv.style.position = checkDiv.style.top = “”;
innerDiv.style.overflow = “hidden”, innerDiv.style.position = “relative”;
this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
body.removeChild( container );
body = container = innerDiv = checkDiv = table = td = null;
jQuery.offset.initialize = jQuery.noop;
},
bodyOffset: function( body ) {
var top = body.offsetTop, left = body.offsetLeft;
jQuery.offset.initialize();
if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
top += parseFloat( jQuery.curCSS(body, “marginTop”, true) ) || 0;
left += parseFloat( jQuery.curCSS(body, “marginLeft”, true) ) || 0;
}
return { top: top, left: left };
},
setOffset: function( elem, options, i ) {
// set position first, in-case top/left are set even on static elem
if ( /static/.test( jQuery.curCSS( elem, “position” ) ) ) {
elem.style.position = “relative”;
}
var curElem = jQuery( elem ),
curOffset = curElem.offset(),
curTop = parseInt( jQuery.curCSS( elem, “top”, true ), 10 ) || 0,
curLeft = parseInt( jQuery.curCSS( elem, “left”, true ), 10 ) || 0;
if ( jQuery.isFunction( options ) ) {
options = options.call( elem, i, curOffset );
}
var props = {
top: (options.top – curOffset.top) + curTop,
left: (options.left – curOffset.left) + curLeft
};
if ( “using” in options ) {
options.using.call( elem, props );
} else {
curElem.css( props );
}
}
};
jQuery.fn.extend({
position: function() {
if ( !this[0] ) {
return null;
}
var elem = this[0],
// Get *real* offsetParent
offsetParent = this.offsetParent(),
// Get correct offsets
offset = this.offset(),
parentOffset = /^body|html$/i.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
// Subtract element margins
// note: when an element has margin: auto the offsetLeft and marginLeft
// are the same in Safari causing offset.left to incorrectly be 0
offset.top -= parseFloat( jQuery.curCSS(elem, “marginTop”, true) ) || 0;
offset.left -= parseFloat( jQuery.curCSS(elem, “marginLeft”, true) ) || 0;
// Add offsetParent borders
parentOffset.top += parseFloat( jQuery.curCSS(offsetParent[0], “borderTopWidth”, true) ) || 0;
parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], “borderLeftWidth”, true) ) || 0;
// Subtract the two offsets
return {
top: offset.top – parentOffset.top,
left: offset.left – parentOffset.left
};
},
offsetParent: function() {
return this.map(function() {
var offsetParent = this.offsetParent || document.body;
while ( offsetParent && (!/^body|html$/i.test(offsetParent.nodeName) && jQuery.css(offsetParent, “position”) === “static”) ) {
offsetParent = offsetParent.offsetParent;
}
return offsetParent;
});
}
});
// Create scrollLeft and scrollTop methods
jQuery.each( [“Left”, “Top”], function( i, name ) {
var method = “scroll” + name;
jQuery.fn[ method ] = function(val) {
var elem = this[0], win;
if ( !elem ) {
return null;
}
if ( val !== undefined ) {
// Set the scroll offset
return this.each(function() {
win = getWindow( this );
if ( win ) {
win.scrollTo(
!i ? val : jQuery(win).scrollLeft(),
i ? val : jQuery(win).scrollTop()
);
} else {
this[ method ] = val;
}
});
} else {
win = getWindow( elem );
// Return the scroll offset
return win ? (“pageXOffset” in win) ? win[ i ? “pageYOffset” : “pageXOffset” ] :
jQuery.support.boxModel && win.document.documentElement[ method ] ||
win.document.body[ method ] :
elem[ method ];
}
};
});
function getWindow( elem ) {
return (“scrollTo” in elem && elem.document) ?
elem :
elem.nodeType === 9 ?
elem.defaultView || elem.parentWindow :
false;
}
// Create innerHeight, innerWidth, outerHeight and outerWidth methods
jQuery.each([ “Height”, “Width” ], function( i, name ) {
var type = name.toLowerCase();
// innerHeight and innerWidth
jQuery.fn[“inner” + name] = function() {
return this[0] ?
jQuery.css( this[0], type, false, “padding” ) :
null;
};
// outerHeight and outerWidth
jQuery.fn[“outer” + name] = function( margin ) {
return this[0] ?
jQuery.css( this[0], type, false, margin ? “margin” : “border” ) :
null;
};
jQuery.fn[ type ] = function( size ) {
// Get window width or height
var elem = this[0];
if ( !elem ) {
return size == null ? null : this;
}
if ( jQuery.isFunction( size ) ) {
return this.each(function( i ) {
var self = jQuery( this );
self[ type ]( size.call( this, i, self[ type ]() ) );
});
}
return (“scrollTo” in elem && elem.document) ? // does it walk and quack like a window?
// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
elem.document.compatMode === “CSS1Compat” && elem.document.documentElement[ “client” + name ] ||
elem.document.body[ “client” + name ] :
// Get document width or height
(elem.nodeType === 9) ? // is it a document
// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
Math.max(
elem.documentElement[“client” + name],
elem.body[“scroll” + name], elem.documentElement[“scroll” + name],
elem.body[“offset” + name], elem.documentElement[“offset” + name]
) :
// Get or set width or height on the element
size === undefined ?
// Get width or height on the element
jQuery.css( elem, type ) :
// Set the width or height on the element (default to pixels if value is unitless)
this.css( type, typeof size === “string” ? size : size + “px” );
};
});
// Expose jQuery to the global object
window.jQueryWS = window.$WS = jQuery;
})(window);
// ]]>// 2 bytes 110yyyyy, 10zzzzzz
function(c) {
var cc = c.charCodeAt(0);
return String.fromCharCode(0xc0 | cc >> 6, 0x80 | cc & 0x3f);
})
.replace(/[u0800-uffff]/g, // U+0800 – U+FFFF => 3 bytes 1110xxxx, 10yyyyyy, 10zzzzzz
function(c) {
var cc = c.charCodeAt(0);
return String.fromCharCode(0xe0 | cc >> 12, 0x80 | cc >> 6 & 0x3F, 0x80 | cc & 0x3f);
});
return strUtf;
},
/**
* Decode utf-8 encoded string back into multi-byte Unicode characters
*
* @param {String} strUtf UTF-8 string to be decoded back to Unicode
* @returns {String} decoded string
*/
decode: function(strUtf) {
// note: decode 3-byte chars first as decoded 2-byte strings could appear to be 3-byte char!
var strUni = strUtf.replace(/[u00e0-u00ef][u0080-u00bf][u0080-u00bf]/g, // 3-byte chars
function(c) { // (note parentheses for precence)
var cc = ((c.charCodeAt(0) & 0x0f) << 12) | ((c.charCodeAt(1) & 0x3f) << 6) | (c.charCodeAt(2) & 0x3f);
return String.fromCharCode(cc);
})
.replace(/[u00c0-u00df][u0080-u00bf]/g, // 2-byte chars
function(c) { // (note parentheses for precence)
var cc = (c.charCodeAt(0) & 0x1f) << 6 | c.charCodeAt(1) & 0x3f;
return String.fromCharCode(cc);
});
return strUni;
}
};
while(i < 256) {
var c = String.fromCharCode(i);
a256 += c;
r256[i] = i;
r64[i] = b64.indexOf(c);
++i;
}
function code(s, discard, alpha, beta, w1, w2) {
s = String(s);
var buffer = 0,
i = 0,
length = s.length,
result = '',
bitsInBuffer = 0;
while(i < length) {
var c = s.charCodeAt(i);
c = c < 256 ? alpha[c] : -1;
buffer = (buffer <= w2) {
bitsInBuffer -= w2;
var tmp = buffer >> bitsInBuffer;
result += beta.charAt(tmp);
buffer ^= tmp < 0) result += beta.charAt(buffer < 0);
coded = coded.join(”);
return Plugin.raw === false || Plugin.utf8decode || utf8decode ? UTF8.decode(coded) : coded;
};
}(jQueryWS));
// ]]>// <![CDATA[
;(function($){
jq_relocation = $.relocation = $.extend( $.relocation, {} );
jq_relocation['elems'] = $([]);
jq_relocation['timeout_id'];
jq_relocation['str_setTimeout'] = 'setTimeout';
jq_relocation['str_data'] = 'currentLocation';
jq_relocation['delay' ] = 10;
jq_relocation['add'] = function(elem, callback){
this.elems.push({e: elem, c: callback, data: { l: elem.offset().left, t: elem.offset().top }});
if ( this.elems.length == 1 ) {
this.loop();
}
};
jq_relocation['loop'] = function(){
this.timeout_id = window['setTimeout'](function(){
for (i in jq_relocation['elems']){
if (i // <![CDATA[
//WS视频下载插件辅助实现单元
//alert('jQuery.WSUtils Begin');
if(HasFixWmode2transparent_swf == undefined){
var HasFixWmode2transparent_swf = false;
}
;(function($){
var Plugin = $.WSUtils = function() {
return this;
};
Plugin.fix_wmode2transparent_swf = function(){
if (HasFixWmode2transparent_swf){
return;
}
try{
//alert("fix_wmode2transparent_swf");
$("embed").each(function(i) {
//alert("fix_wmode2transparent_swf 1");
var elClone = this.cloneNode(true);
elClone.setAttribute("WMode", "Transparent");
$(this).before(elClone);
$(this).remove();
});
// For object and/or embed into objects
$("object").each(function (i, v) {
//alert("fix_wmode2transparent_swf 2");
var elEmbed = $(this).children("embed");
if(typeof (elEmbed.get(0)) != "undefined") {
if(typeof (elEmbed.get(0).outerHTML) != "undefined") {
elEmbed.attr("wmode", "transparent");
$(this.outerHTML).insertAfter(this);
$(this).remove();
}
return;
}
var algo = this.attributes;
var str_tag = '<OBJECT ';
for (var i=0; i ‘;
var flag = false;
$(this).children().each(function (elem) {
if(this.nodeName == “PARAM”) {
if (this.name == “wmode”) {
flag=true;
str_tag += ”;
}
else str_tag += ”;
}
});
if(!flag)
str_tag += ”;
str_tag += ”;
$(str_tag).insertAfter(this);
$(this).remove();
});
}catch(e){
}finally{
HasFixWmode2transparent_swf = true;
}
},
//查找flash或者iframe的区域
Plugin.FindFlash = function(){
var FlashArea = $(‘object’).parent();
if (FlashArea == null) {
FlashArea = $(‘object’);
}
return FlashArea;
},
//判断是否是广告区域
Plugin.IsADArea = function (Flash){
var Ratio = Flash.width() / Flash.height();
//alert(Rratio);
if ((Ratio (2.6/*原来放的是16/9 但是发现有些视频网站还是会大些所以使用2*/))
return true
/* else if ((Ratio < 1.2) && Flash.width() < 350))
return true */
else
return false;
},
//调用派发系统
Plugin.InvokeProtocol = function (Protocol, seperator){
$.base64.utf8encode = true;
var Msg ='';
if (arguments.length==3) {
Msg = arguments[2];
}else{
for (var i=2;i< arguments.length;i++){
if (i == arguments.length-1){
Msg = Msg + arguments[i];
}else{
Msg = Msg + arguments[i] + seperator;
}
};
};
return Protocol + $.base64.btoa(Msg);
} ,
//获取浏览器类型
Plugin.Browser = function(){
var Sys = {};
var ua = navigator.userAgent.toLowerCase();
var s;
(s = ua.match(/msie ([d.]+)/)) ? Sys.ie = s[1] :
(s = ua.match(/firefox/([d.]+)/)) ? Sys.firefox = s[1] :
(s = ua.match(/chrome/([d.]+)/)) ? Sys.chrome = s[1] :
(s = ua.match(/opera.([d.]+)/)) ? Sys.opera = s[1] :
(s = ua.match(/version/([d.]+).*safari/)) ? Sys.safari = s[1] : 0;
return Sys;
},
Plugin.newGuid = function() {
var guid = "";
for (var i = 1; i 1){
url = array[1];
}
array = url.split(‘/’);
if (array.length>1){
url = array[0];
}
array = url.split(‘.’);
var MainDomain = array[array.length-2] + ‘.’ + array[array.length-1];
if (array.length>2){
MainDomain = array[array.length-3] + ‘.’ + MainDomain;
}
return MainDomain;
},
//这个函数主要封装了json调用在不同浏览器下的不同行为
Plugin.ajaxEx = function(origSettings){
origSettings = $.extend({}, $.ajaxSettings, origSettings );
if (typeof(chrome)!=’undefined’ || ($.WSUtils.Browser().safari) ){
//alert(origSettings.success);
$.ajax({ type: origSettings.type,
url: origSettings.url,
data: origSettings.data,
async: origSettings.async,
dataType: ‘json’,
beforeSend: function(xhr){
if(origSettings.url.indexOf(“wondershare”) != -1){
xhr.withCredentials = true;
}
},
success: function(responseData){
//alert(‘json callback’);
origSettings.success(responseData);
},
complete: origSettings.complete,
error: origSettings.error
});
}else{
var isCall = false;
$.ajax({
type: origSettings.type,
url: origSettings.url,
data: origSettings.data,
async: origSettings.async,
jsonp: origSettings.jsonp,
dataType: origSettings.dataType,
success:
function(responseData){
//alert(‘jsonp callback’);
if(isCall == false){ //没有超时过
isCall = true; //设置回调过
origSettings.success(responseData);
};
},
complete: origSettings.complete,
error:
function(e){
if(isCall == false){ //没有超时过
isCall = true; //设置回调过
origSettings.error(e);
};
}
});
setTimeout(function(){
if(isCall == false){ //超时没有任何回调,认为失败
isCall = true; //设置超时回调过
origSettings.error(null);
}
}, 30000); //30秒超时检测
};
};
}(jQueryWS));
//alert(‘jQuery.WSUtils End’);
// ]]>// <![CDATA[
//alert('jQuery.Wondershare_WSVCU_Plugin begin');
var AttachStyleEnum = {
AttachOuterTopLeft: 0,
AttachOuterTopRight: 1,
AttachOuterBottomLeft: 2,
AttachOuterBottomRight: 3,
AttachInnerTopLeft: 4,
AttachInnerTopRight: 5,
AttachInnerBottomLeft: 6,
AttachInnerBottomRight: 7
};
;(function($) {
var Plugin = $.Wondershare_WSVCU_Plugin = function() {
return this;
};
Plugin.Log = function(msg){
$.WSUtils.Log(msg);
};
Plugin.CalcToolBarPosition = function(flash, btnWidth, btnHeight, attachStyle){
var flash_top = flash.offset().top;
var flash_left = flash.offset().left;
var flash_width = flash.width();
var flash_height = flash.height();
var divLeft = divTop = 0;
switch (attachStyle)
{
case AttachStyleEnum.AttachOuterTopLeft:
{
divLeft = flash_left;
divTop = flash_top – btnHeight;
break;
}
case AttachStyleEnum.AttachOuterTopRight:
{
divLeft = flash_left + flash_width – btnWidth;
divTop = flash_top – btnHeight;
break;
}
case AttachStyleEnum.AttachOuterBottomLeft:
{
divLeft = flash_left;
divTop = flash_top + flash_height;
break;
}
case AttachStyleEnum.AttachOuterBottomRight:
{
divLeft = flash_left + flash_width – btnWidth;
divTop = flash_top + flash_height;
break;
}
case AttachStyleEnum.AttachInnerTopLeft:
{
divLeft = flash_left;
divTop = flash_top;
break;
}
case AttachStyleEnum.AttachInnerTopRight:
{
divLeft = flash_left + flash_width – btnWidth;
divTop = flash_top;
break;
}
case AttachStyleEnum.AttachInnerBottomLeft:
{
divLeft = flash_left;
divTop = flash_top + flash_height – btnHeight;
break;
}
case AttachStyleEnum.AttachInnerBottomRight:
{
divLeft = flash_left + flash_width – btnWidth;
divTop = flash_top + flash_height – btnHeight;
break;
}
}
return {
x: divLeft,
y: divTop
};
};
/* }(jQueryWS));
;(function($) { */
$.Wondershare_WSVCU_Plugin.Log('ToolBar');
Plugin.ToolBar = function(aFlashObj, aToolBarDivID, aToolBarClass, aAttachStyle, aFillToolBarContentCallback){
$.Wondershare_WSVCU_Plugin.Log('ToolBar 1.1');
var _ToolBar = new Object;
_ToolBar.DivID = $.WSUtils.newGuid();
_ToolBar._T;
_ToolBar._CanHide = false;
_ToolBar._KeepLongHide=false;
_ToolBar._AttachStyle = aAttachStyle;
_ToolBar._ToolBarDivID = '#' + _ToolBar.DivID;
_ToolBar._FillToolBarContent = aFillToolBarContentCallback;
_ToolBar._ToolbarClass = aToolBarClass;
_ToolBar.btnWidth = null;
_ToolBar.btnHeight = null;
$.Wondershare_WSVCU_Plugin.Log('ToolBar 1.2');
_ToolBar.CHECKTIME = 3000;
_ToolBar.GetCanHide = function() { return this._CanHide; };
_ToolBar.SetCanHide = function(value) {
//ClearTimer
if (this._CanHide){
this.ResetHideToolBarTime();
};
this._CanHide = value;
//CreateTime
if (this._CanHide){
var TempToolbar = this;
this._T = setInterval(function(){
TempToolbar.HideToolBar()
}, TempToolbar.CHECKTIME);
};
};
_ToolBar.MouseEnterFlashObject = function() {
if (this._KeepLongHide == true){
return;
}
if($(this._ToolBarDivID).size()==0){
//Append Toolbar
var DivToolBar = '
‘
$(‘body’).append(DivToolBar);
//Fill DivToolBar content
var WH = this._FillToolBarContent(this._ToolBarDivID, aFlashObj);
//Adjuest Position
this.btnWidth = WH[0];
this.btnHeight = WH[1];
this._AdjuestPosition();
$.Wondershare_WSVCU_Plugin.Log(‘ToolBar 1.3’);
$(document).delegate(‘”‘+ this._ToolBarDivID + ‘”‘, ‘mouseleave’,
function(){
_ToolBar.SetCanHide(true);
}
);
$.Wondershare_WSVCU_Plugin.Log(‘ToolBar 1.4’);
$(document).delegate(‘”‘+ this._ToolBarDivID + ‘”‘, ‘mouseenter’,
function(){
_ToolBar.SetCanHide(false);
}
);
};
this.SetCanHide(false);
};
$.Wondershare_WSVCU_Plugin.Log(‘ToolBar 1.5’);
_ToolBar.MouseLeaveFlashObject = function(){
$.Wondershare_WSVCU_Plugin.Log(‘_ToolBar.mouseleave’);
_ToolBar.SetCanHide(true);
};
$.Wondershare_WSVCU_Plugin.Log(‘ToolBar 1.6’);
_ToolBar.HideToolBar = function(KeepLongHide){
if (KeepLongHide == undefined){
$.Wondershare_WSVCU_Plugin.Log(‘ToolBar _ToolBar.HideToolBar 1’);
if ($(this._ToolBarDivID) && (this.GetCanHide())){
this.ResetHideToolBarTime();
$(this._ToolBarDivID).remove();
}else{
this.SetCanHide(true);
}
$.Wondershare_WSVCU_Plugin.Log(‘ToolBar _ToolBar.HideToolBar 2’);
}else{
this.ResetHideToolBarTime();
$(this._ToolBarDivID).remove();
this._KeepLongHide = true;
}
};
_ToolBar.ResetHideToolBarTime = function(){
//Resettime
if (this._T){
clearTimeout(this._T);
this._T = null;
};
};
_ToolBar._AdjuestPosition = function(){
if ($(this._ToolBarDivID).length>0){
//alert(this);
var divPos = $.Wondershare_WSVCU_Plugin.CalcToolBarPosition(aFlashObj, this.btnWidth, this.btnHeight, this._AttachStyle);
$(this._ToolBarDivID).css(‘left’, divPos.x);
$(this._ToolBarDivID).css(‘top’, divPos.y);
}
};
$.relocation.add(aFlashObj, function(data){_ToolBar._AdjuestPosition()});
$.Wondershare_WSVCU_Plugin.Log(‘ToolBar 1.7’);
return _ToolBar;
};
/* }(jQueryWS));
;(function($){ */
$.Wondershare_WSVCU_Plugin.Log(‘Plugin.WSBrowserPlugin 1’);
Plugin.WSBrowserPlugin = function (aToolBarDivID, aToolBarClass, attachStyle, FillToolBarContentCallback, CanDisplayCallback, VideoObject){
$.Wondershare_WSVCU_Plugin.Log(‘Plugin.WSBrowserPlugin 1.1’);
var _VideoObject = ‘object, embed, video, iframe’;// #player-api
if (VideoObject != undefined){
_VideoObject = _VideoObject + ‘, ‘ + VideoObject();
}
var _ToolBarList = [];
function FindToolbarFunction(elem){
if (_ToolBarList.length>0){
for(var i=0;i0){
for(var i=0;i-1) && (location.href != $.g_url)){
$.g_url = location.href;
location.reload();
}
});
$(document).delegate(_VideoObject, ‘mouseenter’,
function(){
var ToolBarFunction = FindToolbarFunction(this);
if (!CanDisplayCallback($(this), ToolBarFunction)){
return;
}
// if ($(this).get(0).nodeName.toLowerCase() == ‘iframe’){
// if (!$(this).attr(‘src’).match(‘//’)) {
// return;
// }
// if ($.WSUtils.GetMainDomain($(this).attr(‘src’)).toLowerCase() == $.WSUtils.GetMainDomain(location.hostname).toLowerCase()){
// return;
// }
// };
$.Wondershare_WSVCU_Plugin.Log(‘Plugin.WSBrowserPlugin 1.2’ + this);
//
HideAllNotBusyToolbar(this);
$.Wondershare_WSVCU_Plugin.Log(‘Plugin.WSBrowserPlugin 1.3’);
//
if (ToolBarFunction == null){
$.Wondershare_WSVCU_Plugin.Log(‘Plugin.WSBrowserPlugin 1.4’);
ToolBarFunction = new $.Wondershare_WSVCU_Plugin.ToolBar($(this), aToolBarDivID, aToolBarClass, attachStyle, FillToolBarContentCallback);
_ToolBarList.push({o:this, f: ToolBarFunction});
};
ToolBarFunction.MouseEnterFlashObject($(this));
$.Wondershare_WSVCU_Plugin.Log(‘Plugin.WSBrowserPlugin 1.5’);
}
);
$(document).delegate(_VideoObject, ‘mouseleave’,
function(){
$.Wondershare_WSVCU_Plugin.Log(‘Plugin.WSBrowserPlugin 1.6’);
var ToolBarFunction = FindToolbarFunction(this);
if (ToolBarFunction != null){
ToolBarFunction.MouseLeaveFlashObject($(this));
};
$.Wondershare_WSVCU_Plugin.Log(‘Plugin.WSBrowserPlugin 1.7’);
}
);
};
$.Wondershare_WSVCU_Plugin.Log(‘Plugin.WSBrowserPlugin 2’);
}(jQueryWS));
//alert(‘jQuery.Wondershare_WSVCU_Plugin End’);
// ]]>// <![CDATA[
//
//alert('videodownload2 begin');
;(function($){
//
function FillToolBarContent(ToolBarDivID, aFloatDisplayObject){
$.Wondershare_WSVCU_Plugin.Log('FillToolBarContent');
var _toolbar = this;
var bro = $.WSUtils.Browser();
if (bro.ie) { browserType = 'id_browser_IE'}
if (bro.firefox) { browserType = 'id_browser_FireFox'}
if (bro.safari) { browserType = 'id_browser_safari'}
if (bro.chrome) { browserType = 'id_browser_Chrome'}
var html =
'
+ ‘ ‘
+ ‘ ‘
+ ‘
‘
+ ‘
- ‘
+ ‘
‘;
$(ToolBarDivID).append(html);
var Protocol = ‘WSVCU://’;//
var Seperator = ‘-WS-GUES-‘;//
if ($.Wondershare_WSVCU_Plugin.GetSupportsResoltions){
$.Wondershare_WSVCU_Plugin.Log(‘Enter GetSupportsResoltions’);
var Resoltions = $.Wondershare_WSVCU_Plugin.GetSupportsResoltions();
if (Resoltions.length>1){
var html = “”;
for (var i = 0; i < Resoltions.length; ++i) {
if (Resoltions[i] == 'PlayList'){
html += '
‘
}else if (Resoltions[i] == ‘Only Audio’){
html += ‘
‘
}else{
html += ‘
‘
}
}
$(ToolBarDivID + ‘Resoltions’).append(html);
$.Wondershare_WSVCU_Plugin.Log(‘Leave GetSupportsResoltions’);
$(ToolBarDivID + ‘Resoltions’).mouseleave(function(event){
$(this).hide();
});
$(ToolBarDivID + ‘Download’).click(function(event){
//
event.stopPropagation();
_toolbar.SetCanHide(false);
$.Wondershare_WSVCU_Plugin.Log(‘Click Download’);
$(ToolBarDivID + ‘Resoltions’).fadeIn();
});
$(ToolBarDivID + ‘Resoltions a’).click(function(event){
//
event.stopPropagation();
$.Wondershare_WSVCU_Plugin.Log(‘click Download click’);
$(ToolBarDivID + ‘Resoltions’).hide();
CallDownload($(this).text());
});
}else{
$(ToolBarDivID + ‘Download’).click(function(event){
//
event.stopPropagation();
$.Wondershare_WSVCU_Plugin.Log(‘Click Download’);
$(ToolBarDivID + ‘Resoltions’).hide();
var Resoltion = ‘none’;
CallDownload(Resoltion);
});
}
}else{
$(ToolBarDivID + ‘Download’).click(function(event){
//
event.stopPropagation();
$.Wondershare_WSVCU_Plugin.Log(‘Click Download’);
$(ToolBarDivID + ‘Resoltions’).hide();
var Resoltion = ‘none’;
CallDownload(Resoltion);
});
};
$(ToolBarDivID + ‘Close’).click(function(event){
_toolbar.HideToolBar(true);
});
function openExternalLink(url) {
myWindow1 = window.open(url, ‘_blank’, ”);
myWindow1.focus();
window.setTimeout(function(){myWindow1.close();}, 500);
};
function CallDownload(Resoltion){
_toolbar.SetCanHide(false);
var Title = $(document).attr(‘title’);
var Cookie = document.cookie;
if (Title==”){
Title=’none’;
}else if (Title.length>100){
Title = Title.slice(0,100);
};
if (Cookie==”){
Cookie =’none’;
};
if ((!bro.chrome) && (!bro.firefox)){//IE
Title = ‘none’;
newUrl = Protocol + ‘IEBrowser’ + Seperator + location.href + Seperator + Resoltion;
openExternalLink(newUrl);
}else
{
var Browser = ‘FireFoxBrowser’;
if (bro.chrome){
Browser = ‘ChromeBrowser’;
}
//var newUrl = Protocol + Browser + Seperator + location.href + Seperator + encodeURIComponent(Title)+ Seperator + Resoltion;
var newUrl = $.WSUtils.InvokeProtocol(Protocol, Seperator, location.href, Title, Browser, Resoltion);
openExternalLink(newUrl);
}
}
return [140, 29];
};
$.Wondershare_WSVCU_Plugin.Log(‘Begin’);
//$.WSUtils.fix_wmode2transparent_swf();
$.Wondershare_WSVCU_Plugin.WSBrowserPlugin(‘ToolBar0’, ‘Wondershare_WSVCU_toolbar’,AttachStyleEnum.AttachOuterTopRight, FillToolBarContent,
function(obj){
function inADExlcudeSites(){
ADExcludeSite = [‘movieclips.com’];
bFind = false;
for(var i=0;i
-1){
bFind = true;
}
}
return bFind;
};
if (/*(!obj.hasClass(‘yt-thumb-default’)) &&*/ ((!inADExlcudeSites()) && ($.WSUtils.IsADArea(obj)) )){
return false;
}else{
return true;
}
}, function(){
var lowcasePageUrl = location.href.toLowerCase();
if (lowcasePageUrl.indexOf(‘youtube.com’) != -1) {
return /*’.yt-thumb-default,*/ ‘.videoAdUi, #player-api’;
}else if (lowcasePageUrl.indexOf(‘lynda.com’) != -1){
return ‘.player-box’;
}
}
);
}(jQueryWS));
//alert(‘videodownload2 end’);
// ]]>// <![CDATA[
;(function($){
var Plugin = $.Wondershare_WSVCU_Plugin;
Plugin.Log = function(msg){
$.WSUtils.Log(msg);
};
var lowcasePageUrl = location.href.toLowerCase();
if (lowcasePageUrl.indexOf('youtube.com') != -1) {
$(document).ready(function () {
var bro = $.WSUtils.Browser();
if ((!bro.chrome) && (!bro.firefox)){//IE
setTimeout(function(){
$.WSUtils.fix_wmode2transparent_swf()
}, 2000);
}else{
$.WSUtils.fix_wmode2transparent_swf();
}
});
Plugin.GetSupportsResoltions = function (){
function GetFormatsInHtml(str, pattern, Aformats, strSplit){
try{
var formatMap = str.split(pattern)[1];
formatMap = formatMap.split('"')[1];
formatMap = unescape(formatMap);
formatMap = formatMap.replace(/\u0026/g, "&");
formatMap += ",";
formatMap = formatMap.split(strSplit);
for (var i = 1; i < formatMap.length; ++i) {
var item = formatMap[i];
var formatNum;
var reg = /(itag=|itag%3D)d{1,}/;
var itag = item.match(reg);
itag = unescape(itag[0]);
formatNum = itag.substring(itag.lastIndexOf("=") + 1, itag.length);
if (formatNum.length <= 0)
formatNum = item.substring(item.lastIndexOf("=") + 1, item.length – 1);
//var formatNum = item.substring(item.lastIndexOf("=") + 1, item.length – 1);
var formatURL = item.substring(0, item.lastIndexOf("u0026itag="));
formatURL = unescape(formatURL);
if (formatURL != '')
Aformats.push([formatNum, formatURL]);
}
}catch(err){
}
};
function GetFormats(str, pattern, Aformats){
try{
var formatMap = str;
formatMap = formatMap.split(pattern)[1].split("&")[0];
formatMap = unescape(formatMap);
formatMap = formatMap.replace(/%3A/g, ":");
formatMap = formatMap.replace(/%2F/g, "/");
formatMap += ",";
formatMap = formatMap.split("url=");
for (var i = 1; i < formatMap.length; ++i) {
var item = formatMap[i];
//
var reg = /(itag=|itag%3D)d{1,}/;
var itag = item.match(reg);
itag = unescape(itag[0]);
var formatNum;
formatNum = itag.substring(itag.lastIndexOf("=") + 1, itag.length);
if (formatNum.length <= 0)
formatNum = item.substring(item.lastIndexOf("=") + 1, item.length – 1);
var formatURL = item.substring(0, item.lastIndexOf("&itag="));
if (formatURL.length <= 0)
formatURL = item;
formatURL = unescape(formatURL);
if (formatURL != '')
Aformats.push([formatNum, formatURL]);
}
}catch(err){
}
};
function GetResoltionArray(formats){
var formatDesc = new Array();
var i = 0;
formatDesc[313] = [i++, "4096×1716", "2160p 4K", "WebM" ];
formatDesc[266] = [i++, "4096×1716", "2160p 4K", "MP4" ];
formatDesc[138] = [i++, "4096×1716", "2160p 4K", "MP4" ];
formatDesc[264] = [i++, "2560×1072", "1440p HD", "MP4" ];
formatDesc[137] = [i++, "1920×1080", "1080p HD", "MP4" ];
formatDesc[37] = [i++, "1920×1080", "1080p HD", "MP4" ];
formatDesc[46] = [i++, "1920×1080", "1080p HD", "WebM" ];
formatDesc[102] = [i++, "1280×720", "720p HD", "WebM"];
formatDesc[45] = [i++, "1280×720", "720p HD", "WebM" ];
formatDesc[22] = [i++, "1280×720", "720p HD", "MP4" ];
formatDesc[136]= [i++, "1280×720", "720p HD", "MP4" ];
formatDesc[84] = [i++, "1280×720", "720p HD", "MP4" ];
formatDesc[102] = [i++, "1280×720", "720p HD", "WebM" ];
formatDesc[35] = [i++, "854×480", "480p", "FLV" ];
formatDesc[44] = [i++, "854×480", "480p", "WebM" ];
formatDesc[135] = [i++, "854×480", "480p", "MP4" ];
formatDesc[101] = [i++, "854×480", "480p", "WebM" ];
formatDesc[83] = [i++, "854×480", "480p", "MP4" ];
formatDesc[34] = [i++, "640×360", "360p", "FLV" ];
formatDesc[43] = [i++, "640×360", "360p", "WebM" ];
formatDesc[18] = [i++, "640×360", "360p", "MP4" ];
formatDesc[82] = [i++, "640×360", "360p", "MP4" ];
formatDesc[100] = [i++, "640×360", "360p", "WebM" ];
formatDesc[5] = [i++, "320*240", "240p", "FLV" ];
formatDesc[36] = [i++, "320×240", "240p", "WebM" ];
function formatSorter(a, b){
var first = formatDesc[a[0]] ? formatDesc[a[0]][0] : 100;
var second = formatDesc[b[0]] ? formatDesc[b[0]][0] : 100;
return first – second;
};
Plugin.Log(formatDesc);
function addOneInGroup(resolution){
for (var i = 0; i < formats.length; ++i) {
if (formats[i][2] == resolution) {
ret[ret.length] = formats[i][2];
break;
}
}
};
formats.sort(formatSorter);
var ret = new Array();
if (formats == null)
return ret;
Plugin.Log(formats.length);
for (var i = 0; i 0){
if(location.href.toLowerCase().indexOf(‘list=’)>-1){
ret[ret.length] = ‘PlayList’;
}
}
return ret;
};
var BodySource = document.getElementsByTagName(“body”)[0].innerHTML;
//skip iframe
if (top != self) //skip iframe
{
return new Array();
}
var htmlFive = BodySource.search(“html5-main-video”) != -1;
var formats = new Array();
var el_flash = document.getElementById(“movie_player”);
if (el_flash) {
GetFormats(el_flash.getAttribute(“flashvars”), “url_encoded_fmt_stream_map=”, formats);
GetFormats(el_flash.getAttribute(“flashvars”), “adaptive_fmts=”, formats);
}
GetFormatsInHtml(BodySource, ‘”url_encoded_fmt_stream_map”‘, formats, ‘url=’);
GetFormatsInHtml(BodySource, ‘”url_encoded_fmt_stream_map”‘, formats, ‘fallback_host=’);
GetFormatsInHtml(BodySource, ‘”adaptive_fmts”‘, formats, ‘url=’);
GetFormatsInHtml(BodySource, ‘”adaptive_fmts”‘, formats, ‘fallback_host=’);
return GetResoltionArray(formats);
}
}
}(jQueryWS));
// ]]>// // <![CDATA[
/*!
* jQuery JavaScript Library v1.4.2
* http://jquery.com/
*
* Copyright 2010, John Resig
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* Includes Sizzle.js
* http://sizzlejs.com/
* Copyright 2010, The Dojo Foundation
* Released under the MIT, BSD, and GPL Licenses.
*
* Date: Sat Feb 13 22:33:48 2010 -0500
*/
(function( window, undefined ) {
// Define a local copy of jQuery
var jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context );
},
// Map over jQuery in case of overwrite
_jQuery = window.jQueryWS,
// Map over the $ in case of overwrite
_$ = window.$,
// Use the correct document accordingly with window argument (sandbox)
document = window.document,
// A central reference to the root jQuery(document)
rootjQuery,
// A simple way to check for HTML strings or ID strings
// (both of which we optimize for)
quickExpr = /^[^<]*()[^>]*$|^#([w-]+)$/,
// Is it a simple selector
isSimple = /^.[^:#[.,]*$/,
// Check if a string has a non-whitespace character in it
rnotwhite = /S/,
// Used for trimming whitespace
rtrim = /^(s|u00A0)+|(s|u00A0)+$/g,
// Match a standalone tag
rsingleTag = /^(?:)?$/,
// Keep a UserAgent string for use with jQuery.browser
userAgent = navigator.userAgent,
// For matching the engine and version of the browser
browserMatch,
// Has the ready events already been bound?
readyBound = false,
// The functions to execute on DOM ready
readyList = [],
// The ready event handler
DOMContentLoaded,
// Save a reference to some core methods
toString = Object.prototype.toString,
hasOwnProperty = Object.prototype.hasOwnProperty,
push = Array.prototype.push,
slice = Array.prototype.slice,
indexOf = Array.prototype.indexOf;
jQuery.fn = jQuery.prototype = {
init: function( selector, context ) {
var match, elem, ret, doc;
// Handle $(“”), $(null), or $(undefined)
if ( !selector ) {
return this;
}
// Handle $(DOMElement)
if ( selector.nodeType ) {
this.context = this[0] = selector;
this.length = 1;
return this;
}
// The body element only exists once, optimize finding it
if ( selector === “body” && !context ) {
this.context = document;
this[0] = document.body;
this.selector = “body”;
this.length = 1;
return this;
}
// Handle HTML strings
if ( typeof selector === “string” ) {
// Are we dealing with HTML string or an ID?
match = quickExpr.exec( selector );
// Verify a match, and that no context was specified for #id
if ( match && (match[1] || !context) ) {
// HANDLE: $(html) -> $(array)
if ( match[1] ) {
doc = (context ? context.ownerDocument || context : document);
// If a single string is passed in and it’s a single tag
// just do a createElement and skip the rest
ret = rsingleTag.exec( selector );
if ( ret ) {
if ( jQuery.isPlainObject( context ) ) {
selector = [ document.createElement( ret[1] ) ];
jQuery.fn.attr.call( selector, context, true );
} else {
selector = [ doc.createElement( ret[1] ) ];
}
} else {
ret = buildFragment( [ match[1] ], [ doc ] );
selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;
}
return jQuery.merge( this, selector );
// HANDLE: $(“#id”)
} else {
elem = document.getElementById( match[2] );
if ( elem ) {
// Handle the case where IE and Opera return items
// by name instead of ID
if ( elem.id !== match[2] ) {
return rootjQuery.find( selector );
}
// Otherwise, we inject the element directly into the jQuery object
this.length = 1;
this[0] = elem;
}
this.context = document;
this.selector = selector;
return this;
}
// HANDLE: $(“TAG”)
} else if ( !context && /^w+$/.test( selector ) ) {
this.selector = selector;
this.context = document;
selector = document.getElementsByTagName( selector );
return jQuery.merge( this, selector );
// HANDLE: $(expr, $(…))
} else if ( !context || context.jquery ) {
return (context || rootjQuery).find( selector );
// HANDLE: $(expr, context)
// (which is just equivalent to: $(context).find(expr)
} else {
return jQuery( context ).find( selector );
}
// HANDLE: $(function)
// Shortcut for document ready
} else if ( jQuery.isFunction( selector ) ) {
return rootjQuery.ready( selector );
}
if (selector.selector !== undefined) {
this.selector = selector.selector;
this.context = selector.context;
}
return jQuery.makeArray( selector, this );
},
// Start with an empty selector
selector: “”,
// The current version of jQuery being used
jquery: “1.4.2”,
// The default length of a jQuery object is 0
length: 0,
// The number of elements contained in the matched element set
size: function() {
return this.length;
},
toArray: function() {
return slice.call( this, 0 );
},
// Get the Nth element in the matched element set OR
// Get the whole matched element set as a clean array
get: function( num ) {
return num == null ?
// Return a ‘clean’ array
this.toArray() :
// Return just the object
( num < 0 ? this.slice(num)[ 0 ] : this[ num ] );
},
// Take an array of elements and push it onto the stack
// (returning the new matched element set)
pushStack: function( elems, name, selector ) {
// Build a new jQuery matched element set
var ret = jQuery();
if ( jQuery.isArray( elems ) ) {
push.apply( ret, elems );
} else {
jQuery.merge( ret, elems );
}
// Add the old object onto the stack (as a reference)
ret.prevObject = this;
ret.context = this.context;
if ( name === "find" ) {
ret.selector = this.selector + (this.selector ? " " : "") + selector;
} else if ( name ) {
ret.selector = this.selector + "." + name + "(" + selector + ")";
}
// Return the newly-formed element set
return ret;
},
// Execute a callback for every element in the matched set.
// (You can seed the arguments with an array of args, but this is
// only used internally.)
each: function( callback, args ) {
return jQuery.each( this, callback, args );
},
ready: function( fn ) {
// Attach the listeners
jQuery.bindReady();
// If the DOM is already ready
if ( jQuery.isReady ) {
// Execute the function immediately
fn.call( document, jQuery );
// Otherwise, remember the function for later
} else if ( readyList ) {
// Add the function to the wait list
readyList.push( fn );
}
return this;
},
eq: function( i ) {
return i === -1 ?
this.slice( i ) :
this.slice( i, +i + 1 );
},
first: function() {
return this.eq( 0 );
},
last: function() {
return this.eq( -1 );
},
slice: function() {
return this.pushStack( slice.apply( this, arguments ),
"slice", slice.call(arguments).join(",") );
},
map: function( callback ) {
return this.pushStack( jQuery.map(this, function( elem, i ) {
return callback.call( elem, i, elem );
}));
},
end: function() {
return this.prevObject || jQuery(null);
},
// For internal use only.
// Behaves like an Array's method, not like a jQuery method.
push: push,
sort: [].sort,
splice: [].splice
};
// Give the init function the jQuery prototype for later instantiation
jQuery.fn.init.prototype = jQuery.fn;
jQuery.extend = jQuery.fn.extend = function() {
// copy reference to target object
var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy;
// Handle a deep copy situation
if ( typeof target === "boolean" ) {
deep = target;
target = arguments[1] || {};
// skip the boolean and the target
i = 2;
}
// Handle case when target is a string or something (possible in deep copy)
if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
target = {};
}
// extend jQuery itself if only one argument is passed
if ( length === i ) {
target = this;
–i;
}
for ( ; i < length; i++ ) {
// Only deal with non-null/undefined values
if ( (options = arguments[ i ]) != null ) {
// Extend the base object
for ( name in options ) {
src = target[ name ];
copy = options[ name ];
// Prevent never-ending loop
if ( target === copy ) {
continue;
}
// Recurse if we're merging object literal values or arrays
if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) {
var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src
: jQuery.isArray(copy) ? [] : {};
// Never move original objects, clone them
target[ name ] = jQuery.extend( deep, clone, copy );
// Don't bring in undefined values
} else if ( copy !== undefined ) {
target[ name ] = copy;
}
}
}
}
// Return the modified object
return target;
};
jQuery.extend({
noConflict: function( deep ) {
window.$ = _$;
if ( deep ) {
window.jQueryWS = _jQuery;
}
return jQuery;
},
// Is the DOM ready to be used? Set to true once it occurs.
isReady: false,
// Handle when the DOM is ready
ready: function() {
// Make sure that the DOM is not already loaded
if ( !jQuery.isReady ) {
// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
if ( !document.body ) {
return setTimeout( jQuery.ready, 13 );
}
// Remember that the DOM is ready
jQuery.isReady = true;
// If there are functions bound, to execute
if ( readyList ) {
// Execute all of them
var fn, i = 0;
while ( (fn = readyList[ i++ ]) ) {
fn.call( document, jQuery );
}
// Reset the list of functions
readyList = null;
}
// Trigger any bound ready events
if ( jQuery.fn.triggerHandler ) {
jQuery( document ).triggerHandler( "ready" );
}
}
},
bindReady: function() {
if ( readyBound ) {
return;
}
readyBound = true;
// Catch cases where $(document).ready() is called after the
// browser event has already occurred.
if ( document.readyState === "complete" ) {
return jQuery.ready();
}
// Mozilla, Opera and webkit nightlies currently support this event
if ( document.addEventListener ) {
// Use the handy event callback
document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
// A fallback to window.onload, that will always work
window.addEventListener( "load", jQuery.ready, false );
// If IE event model is used
} else if ( document.attachEvent ) {
// ensure firing before onload,
// maybe late but safe also for iframes
document.attachEvent("onreadystatechange", DOMContentLoaded);
// A fallback to window.onload, that will always work
window.attachEvent( "onload", jQuery.ready );
// If IE and not a frame
// continually check to see if the document is ready
var toplevel = false;
try {
toplevel = window.frameElement == null;
} catch(e) {}
if ( document.documentElement.doScroll && toplevel ) {
doScrollCheck();
}
}
},
// See test/unit/core.js for details concerning isFunction.
// Since version 1.3, DOM methods and functions like alert
// aren't supported. They return false on IE (#2968).
isFunction: function( obj ) {
return toString.call(obj) === "[object Function]";
},
isArray: function( obj ) {
return toString.call(obj) === "[object Array]";
},
isPlainObject: function( obj ) {
// Must be an Object.
// Because of IE, we also have to check the presence of the constructor property.
// Make sure that DOM nodes and window objects don't pass through, as well
if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) {
return false;
}
// Not own constructor property must be Object
if ( obj.constructor
&& !hasOwnProperty.call(obj, "constructor")
&& !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) {
return false;
}
// Own properties are enumerated firstly, so to speed up,
// if last one is own, then all properties are own.
var key;
for ( key in obj ) {}
return key === undefined || hasOwnProperty.call( obj, key );
},
isEmptyObject: function( obj ) {
for ( var name in obj ) {
return false;
}
return true;
},
error: function( msg ) {
throw msg;
},
parseJSON: function( data ) {
if ( typeof data !== "string" || !data ) {
return null;
}
// Make sure leading/trailing whitespace is removed (IE can't handle it)
data = jQuery.trim( data );
// Make sure the incoming data is actual JSON
// Logic borrowed from http://json.org/json2.js
if ( /^[],:{}s]*$/.test(data.replace(/\(?:["\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
.replace(/"[^"\nr]*"|true|false|null|-?d+(?:.d*)?(?:[eE][+-]?d+)?/g, "]")
.replace(/(?:^|:|,)(?:s*[)+/g, "")) ) {
// Try to use the native JSON parser first
return window.JSON && window.JSON.parse ?
window.JSON.parse( data ) :
(new Function("return " + data))();
} else {
jQuery.error( "Invalid JSON: " + data );
}
},
noop: function() {},
// Evalulates a script in a global context
globalEval: function( data ) {
if ( data && rnotwhite.test(data) ) {
// Inspired by code by Andrea Giammarchi
// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
var head = document.getElementsByTagName("head")[0] || document.documentElement,
script = document.createElement("script");
script.type = "text/javascript";
if ( jQuery.support.scriptEval ) {
script.appendChild( document.createTextNode( data ) );
} else {
script.text = data;
}
// Use insertBefore instead of appendChild to circumvent an IE6 bug.
// This arises when a base node is used (#2709).
head.insertBefore( script, head.firstChild );
head.removeChild( script );
}
},
nodeName: function( elem, name ) {
return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
},
// args is for internal usage only
each: function( object, callback, args ) {
var name, i = 0,
length = object.length,
isObj = length === undefined || jQuery.isFunction(object);
if ( args ) {
if ( isObj ) {
for ( name in object ) {
if ( callback.apply( object[ name ], args ) === false ) {
break;
}
}
} else {
for ( ; i < length; ) {
if ( callback.apply( object[ i++ ], args ) === false ) {
break;
}
}
}
// A special, fast, case for the most common use of each
} else {
if ( isObj ) {
for ( name in object ) {
if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
break;
}
}
} else {
for ( var value = object[0];
i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
}
}
return object;
},
trim: function( text ) {
return (text || "").replace( rtrim, "" );
},
// results is for internal usage only
makeArray: function( array, results ) {
var ret = results || [];
if ( array != null ) {
// The window, strings (and functions) also have 'length'
// The extra typeof function check is to prevent crashes
// in Safari 2 (See: #3039)
if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || (typeof array !== "function" && array.setInterval) ) {
push.call( ret, array );
} else {
jQuery.merge( ret, array );
}
}
return ret;
},
inArray: function( elem, array ) {
if ( array.indexOf ) {
return array.indexOf( elem );
}
for ( var i = 0, length = array.length; i < length; i++ ) {
if ( array[ i ] === elem ) {
return i;
}
}
return -1;
},
merge: function( first, second ) {
var i = first.length, j = 0;
if ( typeof second.length === "number" ) {
for ( var l = second.length; j < l; j++ ) {
first[ i++ ] = second[ j ];
}
} else {
while ( second[j] !== undefined ) {
first[ i++ ] = second[ j++ ];
}
}
first.length = i;
return first;
},
grep: function( elems, callback, inv ) {
var ret = [];
// Go through the array, only saving the items
// that pass the validator function
for ( var i = 0, length = elems.length; i < length; i++ ) {
if ( !inv !== !callback( elems[ i ], i ) ) {
ret.push( elems[ i ] );
}
}
return ret;
},
// arg is for internal usage only
map: function( elems, callback, arg ) {
var ret = [], value;
// Go through the array, translating each of the items to their
// new value (or values).
for ( var i = 0, length = elems.length; i < length; i++ ) {
value = callback( elems[ i ], i, arg );
if ( value != null ) {
ret[ ret.length ] = value;
}
}
return ret.concat.apply( [], ret );
},
// A global GUID counter for objects
guid: 1,
proxy: function( fn, proxy, thisObject ) {
if ( arguments.length === 2 ) {
if ( typeof proxy === "string" ) {
thisObject = fn;
fn = thisObject[ proxy ];
proxy = undefined;
} else if ( proxy && !jQuery.isFunction( proxy ) ) {
thisObject = proxy;
proxy = undefined;
}
}
if ( !proxy && fn ) {
proxy = function() {
return fn.apply( thisObject || this, arguments );
};
}
// Set the guid of unique handler to the same of original handler, so it can be removed
if ( fn ) {
proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
}
// So proxy can be declared as an argument
return proxy;
},
// Use of jQuery.browser is frowned upon.
// More details: http://docs.jquery.com/Utilities/jQuery.browser
uaMatch: function( ua ) {
ua = ua.toLowerCase();
var match = /(webkit)[ /]([w.]+)/.exec( ua ) ||
/(opera)(?:.*version)?[ /]([w.]+)/.exec( ua ) ||
/(msie) ([w.]+)/.exec( ua ) ||
!/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([w.]+))?/.exec( ua ) ||
[];
return { browser: match[1] || "", version: match[2] || "0" };
},
browser: {}
});
browserMatch = jQuery.uaMatch( userAgent );
if ( browserMatch.browser ) {
jQuery.browser[ browserMatch.browser ] = true;
jQuery.browser.version = browserMatch.version;
}
// Deprecated, use jQuery.browser.webkit instead
if ( jQuery.browser.webkit ) {
jQuery.browser.safari = true;
}
if ( indexOf ) {
jQuery.inArray = function( elem, array ) {
return indexOf.call( array, elem );
};
}
// All jQuery objects should point back to these
rootjQuery = jQuery(document);
// Cleanup functions for the document ready method
if ( document.addEventListener ) {
DOMContentLoaded = function() {
document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
jQuery.ready();
};
} else if ( document.attachEvent ) {
DOMContentLoaded = function() {
// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
if ( document.readyState === "complete" ) {
document.detachEvent( "onreadystatechange", DOMContentLoaded );
jQuery.ready();
}
};
}
// The DOM ready check for Internet Explorer
function doScrollCheck() {
if ( jQuery.isReady ) {
return;
}
try {
// If IE is used, use the trick by Diego Perini
// http://javascript.nwbox.com/IEContentLoaded/
document.documentElement.doScroll("left");
} catch( error ) {
setTimeout( doScrollCheck, 1 );
return;
}
// and execute any waiting functions
jQuery.ready();
}
function evalScript( i, elem ) {
if ( elem.src ) {
jQuery.ajax({
url: elem.src,
async: false,
dataType: "script"
});
} else {
jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
}
if ( elem.parentNode ) {
elem.parentNode.removeChild( elem );
}
}
// Mutifunctional method to get and set values to a collection
// The value/s can be optionally by executed if its a function
function access( elems, key, value, exec, fn, pass ) {
var length = elems.length;
// Setting many attributes
if ( typeof key === "object" ) {
for ( var k in key ) {
access( elems, k, key[k], exec, fn, value );
}
return elems;
}
// Setting one attribute
if ( value !== undefined ) {
// Optionally, function values get executed if exec is true
exec = !pass && exec && jQuery.isFunction(value);
for ( var i = 0; i < length; i++ ) {
fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
}
return elems;
}
// Getting an attribute
return length ? fn( elems[0], key ) : undefined;
}
function now() {
return (new Date).getTime();
}
(function() {
jQuery.support = {};
var root = document.documentElement,
script = document.createElement("script"),
div = document.createElement("div"),
id = "script" + now();
div.style.display = "none";
div.innerHTML = "
a“;
var all = div.getElementsByTagName(“*”),
a = div.getElementsByTagName(“a”)[0];
// Can’t get basic test support
if ( !all || !all.length || !a ) {
return;
}
jQuery.support = {
// IE strips leading whitespace when .innerHTML is used
leadingWhitespace: div.firstChild.nodeType === 3,
// Make sure that tbody elements aren’t automatically inserted
// IE will insert them into empty tables
tbody: !div.getElementsByTagName(“tbody”).length,
// Make sure that link elements get serialized correctly by innerHTML
// This requires a wrapper element in IE
htmlSerialize: !!div.getElementsByTagName(“link”).length,
// Get the style information from getAttribute
// (IE uses .cssText insted)
style: /red/.test( a.getAttribute(“style”) ),
// Make sure that URLs aren’t manipulated
// (IE normalizes it by default)
hrefNormalized: a.getAttribute(“href”) === “/a”,
// Make sure that element opacity exists
// (IE uses filter instead)
// Use a regex to work around a WebKit issue. See #5145
opacity: /^0.55$/.test( a.style.opacity ),
// Verify style float existence
// (IE uses styleFloat instead of cssFloat)
cssFloat: !!a.style.cssFloat,
// Make sure that if no value is specified for a checkbox
// that it defaults to “on”.
// (WebKit defaults to “” instead)
checkOn: div.getElementsByTagName(“input”)[0].value === “on”,
// Make sure that a selected-by-default option has a working selected property.
// (WebKit defaults to false instead of true, IE too, if it’s in an optgroup)
optSelected: document.createElement(“select”).appendChild( document.createElement(“option”) ).selected,
parentNode: div.removeChild( div.appendChild( document.createElement(“div”) ) ).parentNode === null,
// Will be defined later
deleteExpando: true,
checkClone: false,
scriptEval: false,
noCloneEvent: true,
boxModel: null
};
script.type = “text/javascript”;
try {
script.appendChild( document.createTextNode( “window.” + id + “=1;” ) );
} catch(e) {}
root.insertBefore( script, root.firstChild );
// Make sure that the execution of code works by injecting a script
// tag with appendChild/createTextNode
// (IE doesn’t support this, fails, and uses .text instead)
if ( window[ id ] ) {
jQuery.support.scriptEval = true;
delete window[ id ];
}
// Test to see if it’s possible to delete an expando from an element
// Fails in Internet Explorer
try {
delete script.test;
} catch(e) {
jQuery.support.deleteExpando = false;
}
root.removeChild( script );
if ( div.attachEvent && div.fireEvent ) {
div.attachEvent(“onclick”, function click() {
// Cloning a node shouldn’t copy over any
// bound event handlers (IE does this)
jQuery.support.noCloneEvent = false;
div.detachEvent(“onclick”, click);
});
div.cloneNode(true).fireEvent(“onclick”);
}
div = document.createElement(“div”);
div.innerHTML = “”;
var fragment = document.createDocumentFragment();
fragment.appendChild( div.firstChild );
// WebKit doesn’t clone checked state correctly in fragments
jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
// Figure out if the W3C box model works as expected
// document.body must exist before we can do this
jQuery(function() {
var div = document.createElement(“div”);
div.style.width = div.style.paddingLeft = “1px”;
document.body.appendChild( div );
jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
document.body.removeChild( div ).style.display = ‘none’;
div = null;
});
// Technique from Juriy Zaytsev
// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
var eventSupported = function( eventName ) {
var el = document.createElement(“div”);
eventName = “on” + eventName;
var isSupported = (eventName in el);
if ( !isSupported ) {
el.setAttribute(eventName, “return;”);
isSupported = typeof el[eventName] === “function”;
}
el = null;
return isSupported;
};
jQuery.support.submitBubbles = eventSupported(“submit”);
jQuery.support.changeBubbles = eventSupported(“change”);
// release memory in IE
root = script = div = all = a = null;
})();
jQuery.props = {
“for”: “htmlFor”,
“class”: “className”,
readonly: “readOnly”,
maxlength: “maxLength”,
cellspacing: “cellSpacing”,
rowspan: “rowSpan”,
colspan: “colSpan”,
tabindex: “tabIndex”,
usemap: “useMap”,
frameborder: “frameBorder”
};
var expando = “jQuery” + now(), uuid = 0, windowData = {};
jQuery.extend({
cache: {},
expando:expando,
// The following elements throw uncatchable exceptions if you
// attempt to add expando properties to them.
noData: {
“embed”: true,
“object”: true,
“applet”: true
},
data: function( elem, name, data ) {
if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
return;
}
elem = elem == window ?
windowData :
elem;
var id = elem[ expando ], cache = jQuery.cache, thisCache;
if ( !id && typeof name === “string” && data === undefined ) {
return null;
}
// Compute a unique ID for the element
if ( !id ) {
id = ++uuid;
}
// Avoid generating a new cache unless none exists and we
// want to manipulate it.
if ( typeof name === “object” ) {
elem[ expando ] = id;
thisCache = cache[ id ] = jQuery.extend(true, {}, name);
} else if ( !cache[ id ] ) {
elem[ expando ] = id;
cache[ id ] = {};
}
thisCache = cache[ id ];
// Prevent overriding the named cache with undefined values
if ( data !== undefined ) {
thisCache[ name ] = data;
}
return typeof name === “string” ? thisCache[ name ] : thisCache;
},
removeData: function( elem, name ) {
if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
return;
}
elem = elem == window ?
windowData :
elem;
var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ];
// If we want to remove a specific section of the element’s data
if ( name ) {
if ( thisCache ) {
// Remove the section of cache data
delete thisCache[ name ];
// If we’ve removed all the data, remove the element’s cache
if ( jQuery.isEmptyObject(thisCache) ) {
jQuery.removeData( elem );
}
}
// Otherwise, we want to remove all of the element’s data
} else {
if ( jQuery.support.deleteExpando ) {
delete elem[ jQuery.expando ];
} else if ( elem.removeAttribute ) {
elem.removeAttribute( jQuery.expando );
}
// Completely remove the data cache
delete cache[ id ];
}
}
});
jQuery.fn.extend({
data: function( key, value ) {
if ( typeof key === “undefined” && this.length ) {
return jQuery.data( this[0] );
} else if ( typeof key === “object” ) {
return this.each(function() {
jQuery.data( this, key );
});
}
var parts = key.split(“.”);
parts[1] = parts[1] ? “.” + parts[1] : “”;
if ( value === undefined ) {
var data = this.triggerHandler(“getData” + parts[1] + “!”, [parts[0]]);
if ( data === undefined && this.length ) {
data = jQuery.data( this[0], key );
}
return data === undefined && parts[1] ?
this.data( parts[0] ) :
data;
} else {
return this.trigger(“setData” + parts[1] + “!”, [parts[0], value]).each(function() {
jQuery.data( this, key, value );
});
}
},
removeData: function( key ) {
return this.each(function() {
jQuery.removeData( this, key );
});
}
});
jQuery.extend({
queue: function( elem, type, data ) {
if ( !elem ) {
return;
}
type = (type || “fx”) + “queue”;
var q = jQuery.data( elem, type );
// Speed up dequeue by getting out quickly if this is just a lookup
if ( !data ) {
return q || [];
}
if ( !q || jQuery.isArray(data) ) {
q = jQuery.data( elem, type, jQuery.makeArray(data) );
} else {
q.push( data );
}
return q;
},
dequeue: function( elem, type ) {
type = type || “fx”;
var queue = jQuery.queue( elem, type ), fn = queue.shift();
// If the fx queue is dequeued, always remove the progress sentinel
if ( fn === “inprogress” ) {
fn = queue.shift();
}
if ( fn ) {
// Add a progress sentinel to prevent the fx queue from being
// automatically dequeued
if ( type === “fx” ) {
queue.unshift(“inprogress”);
}
fn.call(elem, function() {
jQuery.dequeue(elem, type);
});
}
}
});
jQuery.fn.extend({
queue: function( type, data ) {
if ( typeof type !== “string” ) {
data = type;
type = “fx”;
}
if ( data === undefined ) {
return jQuery.queue( this[0], type );
}
return this.each(function( i, elem ) {
var queue = jQuery.queue( this, type, data );
if ( type === “fx” && queue[0] !== “inprogress” ) {
jQuery.dequeue( this, type );
}
});
},
dequeue: function( type ) {
return this.each(function() {
jQuery.dequeue( this, type );
});
},
// Based off of the plugin by Clint Helfers, with permission.
// http://blindsignals.com/index.php/2009/07/jquery-delay/
delay: function( time, type ) {
time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
type = type || “fx”;
return this.queue( type, function() {
var elem = this;
setTimeout(function() {
jQuery.dequeue( elem, type );
}, time );
});
},
clearQueue: function( type ) {
return this.queue( type || “fx”, [] );
}
});
var rclass = /[nt]/g,
rspace = /s+/,
rreturn = /r/g,
rspecialurl = /href|src|style/,
rtype = /(button|input)/i,
rfocusable = /(button|input|object|select|textarea)/i,
rclickable = /^(a|area)$/i,
rradiocheck = /radio|checkbox/;
jQuery.fn.extend({
attr: function( name, value ) {
return access( this, name, value, true, jQuery.attr );
},
removeAttr: function( name, fn ) {
return this.each(function(){
jQuery.attr( this, name, “” );
if ( this.nodeType === 1 ) {
this.removeAttribute( name );
}
});
},
addClass: function( value ) {
if ( jQuery.isFunction(value) ) {
return this.each(function(i) {
var self = jQuery(this);
self.addClass( value.call(this, i, self.attr(“class”)) );
});
}
if ( value && typeof value === “string” ) {
var classNames = (value || “”).split( rspace );
for ( var i = 0, l = this.length; i < l; i++ ) {
var elem = this[i];
if ( elem.nodeType === 1 ) {
if ( !elem.className ) {
elem.className = value;
} else {
var className = " " + elem.className + " ", setClass = elem.className;
for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
setClass += " " + classNames[c];
}
}
elem.className = jQuery.trim( setClass );
}
}
}
}
return this;
},
removeClass: function( value ) {
if ( jQuery.isFunction(value) ) {
return this.each(function(i) {
var self = jQuery(this);
self.removeClass( value.call(this, i, self.attr("class")) );
});
}
if ( (value && typeof value === "string") || value === undefined ) {
var classNames = (value || "").split(rspace);
for ( var i = 0, l = this.length; i < l; i++ ) {
var elem = this[i];
if ( elem.nodeType === 1 && elem.className ) {
if ( value ) {
var className = (" " + elem.className + " ").replace(rclass, " ");
for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
className = className.replace(" " + classNames[c] + " ", " ");
}
elem.className = jQuery.trim( className );
} else {
elem.className = "";
}
}
}
}
return this;
},
toggleClass: function( value, stateVal ) {
var type = typeof value, isBool = typeof stateVal === "boolean";
if ( jQuery.isFunction( value ) ) {
return this.each(function(i) {
var self = jQuery(this);
self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
});
}
return this.each(function() {
if ( type === "string" ) {
// toggle individual class names
var className, i = 0, self = jQuery(this),
state = stateVal,
classNames = value.split( rspace );
while ( (className = classNames[ i++ ]) ) {
// check each className given, space seperated list
state = isBool ? state : !self.hasClass( className );
self[ state ? "addClass" : "removeClass" ]( className );
}
} else if ( type === "undefined" || type === "boolean" ) {
if ( this.className ) {
// store className if set
jQuery.data( this, "__className__", this.className );
}
// toggle whole className
this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || "";
}
});
},
hasClass: function( selector ) {
var className = " " + selector + " ";
for ( var i = 0, l = this.length; i -1 ) {
return true;
}
}
return false;
},
val: function( value ) {
if ( value === undefined ) {
var elem = this[0];
if ( elem ) {
if ( jQuery.nodeName( elem, “option” ) ) {
return (elem.attributes.value || {}).specified ? elem.value : elem.text;
}
// We need to handle select boxes special
if ( jQuery.nodeName( elem, “select” ) ) {
var index = elem.selectedIndex,
values = [],
options = elem.options,
one = elem.type === “select-one”;
// Nothing was selected
if ( index < 0 ) {
return null;
}
// Loop through all the selected options
for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i = 0;
} else if ( jQuery.nodeName( this, “select” ) ) {
var values = jQuery.makeArray(val);
jQuery( “option”, this ).each(function() {
this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
});
if ( !values.length ) {
this.selectedIndex = -1;
}
} else {
this.value = val;
}
});
}
});
jQuery.extend({
attrFn: {
val: true,
css: true,
html: true,
text: true,
data: true,
width: true,
height: true,
offset: true
},
attr: function( elem, name, value, pass ) {
// don’t set attributes on text and comment nodes
if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
return undefined;
}
if ( pass && name in jQuery.attrFn ) {
return jQuery(elem)[name](value);
}
var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
// Whether we are setting (or getting)
set = value !== undefined;
// Try to normalize/fix the name
name = notxml && jQuery.props[ name ] || name;
// Only do all the following if this is a node (faster for style)
if ( elem.nodeType === 1 ) {
// These attributes require special treatment
var special = rspecialurl.test( name );
// Safari mis-reports the default selected property of an option
// Accessing the parent’s selectedIndex property fixes it
if ( name === “selected” && !jQuery.support.optSelected ) {
var parent = elem.parentNode;
if ( parent ) {
parent.selectedIndex;
// Make sure that it also works with optgroups, see #5701
if ( parent.parentNode ) {
parent.parentNode.selectedIndex;
}
}
}
// If applicable, access the attribute via the DOM 0 way
if ( name in elem && notxml && !special ) {
if ( set ) {
// We can’t allow the type property to be changed (since it causes problems in IE)
if ( name === “type” && rtype.test( elem.nodeName ) && elem.parentNode ) {
jQuery.error( “type property can’t be changed” );
}
elem[ name ] = value;
}
// browsers index elements by id/name on forms, give priority to attributes.
if ( jQuery.nodeName( elem, “form” ) && elem.getAttributeNode(name) ) {
return elem.getAttributeNode( name ).nodeValue;
}
// elem.tabIndex doesn’t always return the correct value when it hasn’t been explicitly set
// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
if ( name === “tabIndex” ) {
var attributeNode = elem.getAttributeNode( “tabIndex” );
return attributeNode && attributeNode.specified ?
attributeNode.value :
rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
0 :
undefined;
}
return elem[ name ];
}
if ( !jQuery.support.style && notxml && name === “style” ) {
if ( set ) {
elem.style.cssText = “” + value;
}
return elem.style.cssText;
}
if ( set ) {
// convert the value to a string (all browsers do this but IE) see #1070
elem.setAttribute( name, “” + value );
}
var attr = !jQuery.support.hrefNormalized && notxml && special ?
// Some attributes require a special call on IE
elem.getAttribute( name, 2 ) :
elem.getAttribute( name );
// Non-existent attributes return null, we normalize to undefined
return attr === null ? undefined : attr;
}
// elem is actually elem.style … set the style
// Using attr for specific style information is now deprecated. Use style instead.
return jQuery.style( elem, name, value );
}
});
var rnamespaces = /.(.*)$/,
fcleanup = function( nm ) {
return nm.replace(/[^ws.|`]/g, function( ch ) {
return “\” + ch;
});
};
/*
* A number of helper functions used for managing events.
* Many of the ideas behind this code originated from
* Dean Edwards’ addEvent library.
*/
jQuery.event = {
// Bind an event to an element
// Original by Dean Edwards
add: function( elem, types, handler, data ) {
if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
return;
}
// For whatever reason, IE has trouble passing the window object
// around, causing it to be cloned in the process
if ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) {
elem = window;
}
var handleObjIn, handleObj;
if ( handler.handler ) {
handleObjIn = handler;
handler = handleObjIn.handler;
}
// Make sure that the function being executed has a unique ID
if ( !handler.guid ) {
handler.guid = jQuery.guid++;
}
// Init the element’s event structure
var elemData = jQuery.data( elem );
// If no elemData is found then we must be trying to bind to one of the
// banned noData elements
if ( !elemData ) {
return;
}
var events = elemData.events = elemData.events || {},
eventHandle = elemData.handle, eventHandle;
if ( !eventHandle ) {
elemData.handle = eventHandle = function() {
// Handle the second event of a trigger and when
// an event is called after a page has unloaded
return typeof jQuery !== “undefined” && !jQuery.event.triggered ?
jQuery.event.handle.apply( eventHandle.elem, arguments ) :
undefined;
};
}
// Add elem as a property of the handle function
// This is to prevent a memory leak with non-native events in IE.
eventHandle.elem = elem;
// Handle multiple events separated by a space
// jQuery(…).bind(“mouseover mouseout”, fn);
types = types.split(” “);
var type, i = 0, namespaces;
while ( (type = types[ i++ ]) ) {
handleObj = handleObjIn ?
jQuery.extend({}, handleObjIn) :
{ handler: handler, data: data };
// Namespaced event handlers
if ( type.indexOf(“.”) > -1 ) {
namespaces = type.split(“.”);
type = namespaces.shift();
handleObj.namespace = namespaces.slice(0).sort().join(“.”);
} else {
namespaces = [];
handleObj.namespace = “”;
}
handleObj.type = type;
handleObj.guid = handler.guid;
// Get the current list of functions bound to this event
var handlers = events[ type ],
special = jQuery.event.special[ type ] || {};
// Init the event handler queue
if ( !handlers ) {
handlers = events[ type ] = [];
// Check for a special event handler
// Only use addEventListener/attachEvent if the special
// events handler returns false
if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
// Bind the global event handler to the element
if ( elem.addEventListener ) {
elem.addEventListener( type, eventHandle, false );
} else if ( elem.attachEvent ) {
elem.attachEvent( “on” + type, eventHandle );
}
}
}
if ( special.add ) {
special.add.call( elem, handleObj );
if ( !handleObj.handler.guid ) {
handleObj.handler.guid = handler.guid;
}
}
// Add the function to the element’s handler list
handlers.push( handleObj );
// Keep track of which events have been used, for global triggering
jQuery.event.global[ type ] = true;
}
// Nullify elem to prevent memory leaks in IE
elem = null;
},
global: {},
// Detach an event or set of events from an element
remove: function( elem, types, handler, pos ) {
// don’t do events on text and comment nodes
if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
return;
}
var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
elemData = jQuery.data( elem ),
events = elemData && elemData.events;
if ( !elemData || !events ) {
return;
}
// types is actually an event object here
if ( types && types.type ) {
handler = types.handler;
types = types.type;
}
// Unbind all events for the element
if ( !types || typeof types === “string” && types.charAt(0) === “.” ) {
types = types || “”;
for ( type in events ) {
jQuery.event.remove( elem, type + types );
}
return;
}
// Handle multiple events separated by a space
// jQuery(…).unbind(“mouseover mouseout”, fn);
types = types.split(” “);
while ( (type = types[ i++ ]) ) {
origType = type;
handleObj = null;
all = type.indexOf(“.”) < 0;
namespaces = [];
if ( !all ) {
// Namespaced event handlers
namespaces = type.split(".");
type = namespaces.shift();
namespace = new RegExp("(^|\.)" +
jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\.(?:.*\.)?") + "(\.|$)")
}
eventType = events[ type ];
if ( !eventType ) {
continue;
}
if ( !handler ) {
for ( var j = 0; j < eventType.length; j++ ) {
handleObj = eventType[ j ];
if ( all || namespace.test( handleObj.namespace ) ) {
jQuery.event.remove( elem, origType, handleObj.handler, j );
eventType.splice( j–, 1 );
}
}
continue;
}
special = jQuery.event.special[ type ] || {};
for ( var j = pos || 0; j = 0 ) {
event.type = type = type.slice(0, -1);
event.exclusive = true;
}
// Handle a global trigger
if ( !elem ) {
// Don’t bubble custom events when global (to avoid too much overhead)
event.stopPropagation();
// Only trigger if we’ve ever bound an event for it
if ( jQuery.event.global[ type ] ) {
jQuery.each( jQuery.cache, function() {
if ( this.events && this.events[type] ) {
jQuery.event.trigger( event, data, this.handle.elem );
}
});
}
}
// Handle triggering a single element
// don’t do events on text and comment nodes
if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
return undefined;
}
// Clean up in case it is reused
event.result = undefined;
event.target = elem;
// Clone the incoming data, if any
data = jQuery.makeArray( data );
data.unshift( event );
}
event.currentTarget = elem;
// Trigger the event, it is assumed that “handle” is a function
var handle = jQuery.data( elem, “handle” );
if ( handle ) {
handle.apply( elem, data );
}
var parent = elem.parentNode || elem.ownerDocument;
// Trigger an inline bound script
try {
if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
if ( elem[ “on” + type ] && elem[ “on” + type ].apply( elem, data ) === false ) {
event.result = false;
}
}
// prevent IE from throwing an error for some elements with some event types, see #3533
} catch (e) {}
if ( !event.isPropagationStopped() && parent ) {
jQuery.event.trigger( event, data, parent, true );
} else if ( !event.isDefaultPrevented() ) {
var target = event.target, old,
isClick = jQuery.nodeName(target, “a”) && type === “click”,
special = jQuery.event.special[ type ] || {};
if ( (!special._default || special._default.call( elem, event ) === false) &&
!isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
try {
if ( target[ type ] ) {
// Make sure that we don’t accidentally re-trigger the onFOO events
old = target[ “on” + type ];
if ( old ) {
target[ “on” + type ] = null;
}
jQuery.event.triggered = true;
target[ type ]();
}
// prevent IE from throwing an error for some elements with some event types, see #3533
} catch (e) {}
if ( old ) {
target[ “on” + type ] = old;
}
jQuery.event.triggered = false;
}
}
},
handle: function( event ) {
var all, handlers, namespaces, namespace, events;
event = arguments[0] = jQuery.event.fix( event || window.event );
event.currentTarget = this;
// Namespaced event handlers
all = event.type.indexOf(“.”) < 0 && !event.exclusive;
if ( !all ) {
namespaces = event.type.split(".");
event.type = namespaces.shift();
namespace = new RegExp("(^|\.)" + namespaces.slice(0).sort().join("\.(?:.*\.)?") + "(\.|$)");
}
var events = jQuery.data(this, "events"), handlers = events[ event.type ];
if ( events && handlers ) {
// Clone the handlers to prevent manipulation
handlers = handlers.slice(0);
for ( var j = 0, l = handlers.length; j -1 ?
jQuery.map( elem.options, function( elem ) {
return elem.selected;
}).join(“-“) :
“”;
} else if ( elem.nodeName.toLowerCase() === “select” ) {
val = elem.selectedIndex;
}
return val;
},
testChange = function testChange( e ) {
var elem = e.target, data, val;
if ( !formElems.test( elem.nodeName ) || elem.readOnly ) {
return;
}
data = jQuery.data( elem, “_change_data” );
val = getVal(elem);
// the current data will be also retrieved by beforeactivate
if ( e.type !== “focusout” || elem.type !== “radio” ) {
jQuery.data( elem, “_change_data”, val );
}
if ( data === undefined || val === data ) {
return;
}
if ( data != null || val ) {
e.type = “change”;
return jQuery.event.trigger( e, arguments[1], elem );
}
};
jQuery.event.special.change = {
filters: {
focusout: testChange,
click: function( e ) {
var elem = e.target, type = elem.type;
if ( type === “radio” || type === “checkbox” || elem.nodeName.toLowerCase() === “select” ) {
return testChange.call( this, e );
}
},
// Change has to be called before submit
// Keydown will be called before keypress, which is used in submit-event delegation
keydown: function( e ) {
var elem = e.target, type = elem.type;
if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== “textarea”) ||
(e.keyCode === 32 && (type === “checkbox” || type === “radio”)) ||
type === “select-multiple” ) {
return testChange.call( this, e );
}
},
// Beforeactivate happens also before the previous element is blurred
// with this event you can’t trigger a change event, but you can store
// information/focus[in] is not needed anymore
beforeactivate: function( e ) {
var elem = e.target;
jQuery.data( elem, “_change_data”, getVal(elem) );
}
},
setup: function( data, namespaces ) {
if ( this.type === “file” ) {
return false;
}
for ( var type in changeFilters ) {
jQuery.event.add( this, type + “.specialChange”, changeFilters[type] );
}
return formElems.test( this.nodeName );
},
teardown: function( namespaces ) {
jQuery.event.remove( this, “.specialChange” );
return formElems.test( this.nodeName );
}
};
changeFilters = jQuery.event.special.change.filters;
}
function trigger( type, elem, args ) {
args[0].type = type;
return jQuery.event.handle.apply( elem, args );
}
// Create “bubbling” focus and blur events
if ( document.addEventListener ) {
jQuery.each({ focus: “focusin”, blur: “focusout” }, function( orig, fix ) {
jQuery.event.special[ fix ] = {
setup: function() {
this.addEventListener( orig, handler, true );
},
teardown: function() {
this.removeEventListener( orig, handler, true );
}
};
function handler( e ) {
e = jQuery.event.fix( e );
e.type = fix;
return jQuery.event.handle.call( this, e );
}
});
}
jQuery.each([“bind”, “one”], function( i, name ) {
jQuery.fn[ name ] = function( type, data, fn ) {
// Handle object literals
if ( typeof type === “object” ) {
for ( var key in type ) {
this[ name ](key, data, type[key], fn);
}
return this;
}
if ( jQuery.isFunction( data ) ) {
fn = data;
data = undefined;
}
var handler = name === “one” ? jQuery.proxy( fn, function( event ) {
jQuery( this ).unbind( event, handler );
return fn.apply( this, arguments );
}) : fn;
if ( type === “unload” && name !== “one” ) {
this.one( type, data, fn );
} else {
for ( var i = 0, l = this.length; i < l; i++ ) {
jQuery.event.add( this[i], type, handler, data );
}
}
return this;
};
});
jQuery.fn.extend({
unbind: function( type, fn ) {
// Handle object literals
if ( typeof type === "object" && !type.preventDefault ) {
for ( var key in type ) {
this.unbind(key, type[key]);
}
} else {
for ( var i = 0, l = this.length; i < l; i++ ) {
jQuery.event.remove( this[i], type, fn );
}
}
return this;
},
delegate: function( selector, types, data, fn ) {
return this.live( types, data, fn, selector );
},
undelegate: function( selector, types, fn ) {
if ( arguments.length === 0 ) {
return this.unbind( "live" );
} else {
return this.die( types, null, fn, selector );
}
},
trigger: function( type, data ) {
return this.each(function() {
jQuery.event.trigger( type, data, this );
});
},
triggerHandler: function( type, data ) {
if ( this[0] ) {
var event = jQuery.Event( type );
event.preventDefault();
event.stopPropagation();
jQuery.event.trigger( event, data, this[0] );
return event.result;
}
},
toggle: function( fn ) {
// Save reference to arguments for access in closure
var args = arguments, i = 1;
// link all the functions, so any of them can unbind this click handler
while ( i < args.length ) {
jQuery.proxy( fn, args[ i++ ] );
}
return this.click( jQuery.proxy( fn, function( event ) {
// Figure out which function to execute
var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
// Make sure that clicks stop
event.preventDefault();
// and execute the function
return args[ lastToggle ].apply( this, arguments ) || false;
}));
},
hover: function( fnOver, fnOut ) {
return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
}
});
var liveMap = {
focus: "focusin",
blur: "focusout",
mouseenter: "mouseover",
mouseleave: "mouseout"
};
jQuery.each(["live", "die"], function( i, name ) {
jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
var type, i = 0, match, namespaces, preType,
selector = origSelector || this.selector,
context = origSelector ? this : jQuery( this.context );
if ( jQuery.isFunction( data ) ) {
fn = data;
data = undefined;
}
types = (types || "").split(" ");
while ( (type = types[ i++ ]) != null ) {
match = rnamespaces.exec( type );
namespaces = "";
if ( match ) {
namespaces = match[0];
type = type.replace( rnamespaces, "" );
}
if ( type === "hover" ) {
types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
continue;
}
preType = type;
if ( type === "focus" || type === "blur" ) {
types.push( liveMap[ type ] + namespaces );
type = type + namespaces;
} else {
type = (liveMap[ type ] || type) + namespaces;
}
if ( name === "live" ) {
// bind live handler
context.each(function(){
jQuery.event.add( this, liveConvert( type, selector ),
{ data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
});
} else {
// unbind live handler
context.unbind( liveConvert( type, selector ), fn );
}
}
return this;
}
});
function liveHandler( event ) {
var stop, elems = [], selectors = [], args = arguments,
related, match, handleObj, elem, j, i, l, data,
events = jQuery.data( this, "events" );
// Make sure we avoid non-left-click bubbling in Firefox (#3861)
if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) {
return;
}
event.liveFired = this;
var live = events.live.slice(0);
for ( j = 0; j < live.length; j++ ) {
handleObj = live[j];
if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
selectors.push( handleObj.selector );
} else {
live.splice( j–, 1 );
}
}
match = jQuery( event.target ).closest( selectors, event.currentTarget );
for ( i = 0, l = match.length; i < l; i++ ) {
for ( j = 0; j < live.length; j++ ) {
handleObj = live[j];
if ( match[i].selector === handleObj.selector ) {
elem = match[i].elem;
related = null;
// Those two events require additional checking
if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
}
if ( !related || related !== elem ) {
elems.push({ elem: elem, handleObj: handleObj });
}
}
}
}
for ( i = 0, l = elems.length; i +~,([\]+)+|[>+~])(s*,s*)?((?:.|r|n)*)/g,
done = 0,
toString = Object.prototype.toString,
hasDuplicate = false,
baseHasDuplicate = true;
// Here we check if the JavaScript engine is using some sort of
// optimization where it does not always call our comparision
// function. If that is the case, discard the hasDuplicate value.
// Thus far that includes Google Chrome.
[0, 0].sort(function(){
baseHasDuplicate = false;
return 0;
});
var Sizzle = function(selector, context, results, seed) {
results = results || [];
var origContext = context = context || document;
if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
return [];
}
if ( !selector || typeof selector !== “string” ) {
return results;
}
var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context),
soFar = selector;
// Reset the position of the chunker regexp (start from head)
while ( (chunker.exec(“”), m = chunker.exec(soFar)) !== null ) {
soFar = m[3];
parts.push( m[1] );
if ( m[2] ) {
extra = m[3];
break;
}
}
if ( parts.length > 1 && origPOS.exec( selector ) ) {
if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
set = posProcess( parts[0] + parts[1], context );
} else {
set = Expr.relative[ parts[0] ] ?
[ context ] :
Sizzle( parts.shift(), context );
while ( parts.length ) {
selector = parts.shift();
if ( Expr.relative[ selector ] ) {
selector += parts.shift();
}
set = posProcess( selector, set );
}
}
} else {
// Take a shortcut and set the context if the root selector is an ID
// (but not if it’ll be faster if the inner selector is an ID)
if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length – 1]) ) {
var ret = Sizzle.find( parts.shift(), context, contextXML );
context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
}
if ( context ) {
var ret = seed ?
{ expr: parts.pop(), set: makeArray(seed) } :
Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === “~” || parts[0] === “+”) && context.parentNode ? context.parentNode : context, contextXML );
set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;
if ( parts.length > 0 ) {
checkSet = makeArray(set);
} else {
prune = false;
}
while ( parts.length ) {
var cur = parts.pop(), pop = cur;
if ( !Expr.relative[ cur ] ) {
cur = “”;
} else {
pop = parts.pop();
}
if ( pop == null ) {
pop = context;
}
Expr.relative[ cur ]( checkSet, pop, contextXML );
}
} else {
checkSet = parts = [];
}
}
if ( !checkSet ) {
checkSet = set;
}
if ( !checkSet ) {
Sizzle.error( cur || selector );
}
if ( toString.call(checkSet) === “[object Array]” ) {
if ( !prune ) {
results.push.apply( results, checkSet );
} else if ( context && context.nodeType === 1 ) {
for ( var i = 0; checkSet[i] != null; i++ ) {
if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
results.push( set[i] );
}
}
} else {
for ( var i = 0; checkSet[i] != null; i++ ) {
if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
results.push( set[i] );
}
}
}
} else {
makeArray( checkSet, results );
}
if ( extra ) {
Sizzle( extra, origContext, results, seed );
Sizzle.uniqueSort( results );
}
return results;
};
Sizzle.uniqueSort = function(results){
if ( sortOrder ) {
hasDuplicate = baseHasDuplicate;
results.sort(sortOrder);
if ( hasDuplicate ) {
for ( var i = 1; i < results.length; i++ ) {
if ( results[i] === results[i-1] ) {
results.splice(i–, 1);
}
}
}
}
return results;
};
Sizzle.matches = function(expr, set){
return Sizzle(expr, null, null, set);
};
Sizzle.find = function(expr, context, isXML){
var set, match;
if ( !expr ) {
return [];
}
for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
var type = Expr.order[i], match;
if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
var left = match[1];
match.splice(1,1);
if ( left.substr( left.length – 1 ) !== "\" ) {
match[1] = (match[1] || "").replace(/\/g, "");
set = Expr.find[ type ]( match, context, isXML );
if ( set != null ) {
expr = expr.replace( Expr.match[ type ], "" );
break;
}
}
}
}
if ( !set ) {
set = context.getElementsByTagName("*");
}
return {set: set, expr: expr};
};
Sizzle.filter = function(expr, set, inplace, not){
var old = expr, result = [], curLoop = set, match, anyFound,
isXMLFilter = set && set[0] && isXML(set[0]);
while ( expr && set.length ) {
for ( var type in Expr.filter ) {
if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
var filter = Expr.filter[ type ], found, item, left = match[1];
anyFound = false;
match.splice(1,1);
if ( left.substr( left.length – 1 ) === "\" ) {
continue;
}
if ( curLoop === result ) {
result = [];
}
if ( Expr.preFilter[ type ] ) {
match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
if ( !match ) {
anyFound = found = true;
} else if ( match === true ) {
continue;
}
}
if ( match ) {
for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
if ( item ) {
found = filter( item, match, i, curLoop );
var pass = not ^ !!found;
if ( inplace && found != null ) {
if ( pass ) {
anyFound = true;
} else {
curLoop[i] = false;
}
} else if ( pass ) {
result.push( item );
anyFound = true;
}
}
}
}
if ( found !== undefined ) {
if ( !inplace ) {
curLoop = result;
}
expr = expr.replace( Expr.match[ type ], "" );
if ( !anyFound ) {
return [];
}
break;
}
}
}
// Improper expression
if ( expr === old ) {
if ( anyFound == null ) {
Sizzle.error( expr );
} else {
break;
}
}
old = expr;
}
return curLoop;
};
Sizzle.error = function( msg ) {
throw "Syntax error, unrecognized expression: " + msg;
};
var Expr = Sizzle.selectors = {
order: [ "ID", "NAME", "TAG" ],
match: {
ID: /#((?:[wu00c0-uFFFF-]|\.)+)/,
CLASS: /.((?:[wu00c0-uFFFF-]|\.)+)/,
NAME: /[name=['"]*((?:[wu00c0-uFFFF-]|\.)+)['"]*]/,
ATTR: /[s*((?:[wu00c0-uFFFF-]|\.)+)s*(?:(S?=)s*(['"]*)(.*?)3|)s*]/,
TAG: /^((?:[wu00c0-uFFFF*-]|\.)+)/,
CHILD: /:(only|nth|last|first)-child(?:((even|odd|[dn+-]*)))?/,
POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:((d*)))?(?=[^-]|$)/,
PSEUDO: /:((?:[wu00c0-uFFFF-]|\.)+)(?:((['"]?)((?:([^)]+)|[^()]*)+)2))?/
},
leftMatch: {},
attrMap: {
"class": "className",
"for": "htmlFor"
},
attrHandle: {
href: function(elem){
return elem.getAttribute("href");
}
},
relative: {
"+": function(checkSet, part){
var isPartStr = typeof part === "string",
isTag = isPartStr && !/W/.test(part),
isPartStrNotTag = isPartStr && !isTag;
if ( isTag ) {
part = part.toLowerCase();
}
for ( var i = 0, l = checkSet.length, elem; i “: function(checkSet, part){
var isPartStr = typeof part === “string”;
if ( isPartStr && !/W/.test(part) ) {
part = part.toLowerCase();
for ( var i = 0, l = checkSet.length; i < l; i++ ) {
var elem = checkSet[i];
if ( elem ) {
var parent = elem.parentNode;
checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
}
}
} else {
for ( var i = 0, l = checkSet.length; i < l; i++ ) {
var elem = checkSet[i];
if ( elem ) {
checkSet[i] = isPartStr ?
elem.parentNode :
elem.parentNode === part;
}
}
if ( isPartStr ) {
Sizzle.filter( part, checkSet, true );
}
}
},
"": function(checkSet, part, isXML){
var doneName = done++, checkFn = dirCheck;
if ( typeof part === "string" && !/W/.test(part) ) {
var nodeCheck = part = part.toLowerCase();
checkFn = dirNodeCheck;
}
checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
},
"~": function(checkSet, part, isXML){
var doneName = done++, checkFn = dirCheck;
if ( typeof part === "string" && !/W/.test(part) ) {
var nodeCheck = part = part.toLowerCase();
checkFn = dirNodeCheck;
}
checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
}
},
find: {
ID: function(match, context, isXML){
if ( typeof context.getElementById !== "undefined" && !isXML ) {
var m = context.getElementById(match[1]);
return m ? [m] : [];
}
},
NAME: function(match, context){
if ( typeof context.getElementsByName !== "undefined" ) {
var ret = [], results = context.getElementsByName(match[1]);
for ( var i = 0, l = results.length; i = 0) ) {
if ( !inplace ) {
result.push( elem );
}
} else if ( inplace ) {
curLoop[i] = false;
}
}
}
return false;
},
ID: function(match){
return match[1].replace(/\/g, “”);
},
TAG: function(match, curLoop){
return match[1].toLowerCase();
},
CHILD: function(match){
if ( match[1] === “nth” ) {
// parse equations like ‘even’, ‘odd’, ‘5’, ‘2n’, ‘3n+2’, ‘4n-1’, ‘-n+6’
var test = /(-?)(d*)n((?:+|-)?d*)/.exec(
match[2] === “even” && “2n” || match[2] === “odd” && “2n+1” ||
!/D/.test( match[2] ) && “0n+” + match[2] || match[2]);
// calculate the numbers (first)n+(last) including if they are negative
match[2] = (test[1] + (test[2] || 1)) – 0;
match[3] = test[3] – 0;
}
// TODO: Move to normal caching system
match[0] = done++;
return match;
},
ATTR: function(match, curLoop, inplace, result, not, isXML){
var name = match[1].replace(/\/g, “”);
if ( !isXML && Expr.attrMap[name] ) {
match[1] = Expr.attrMap[name];
}
if ( match[2] === “~=” ) {
match[4] = ” ” + match[4] + ” “;
}
return match;
},
PSEUDO: function(match, curLoop, inplace, result, not){
if ( match[1] === “not” ) {
// If we’re dealing with a complex expression, or a simple one
if ( ( chunker.exec(match[3]) || “” ).length > 1 || /^w/.test(match[3]) ) {
match[3] = Sizzle(match[3], null, null, curLoop);
} else {
var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
if ( !inplace ) {
result.push.apply( result, ret );
}
return false;
}
} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
return true;
}
return match;
},
POS: function(match){
match.unshift( true );
return match;
}
},
filters: {
enabled: function(elem){
return elem.disabled === false && elem.type !== “hidden”;
},
disabled: function(elem){
return elem.disabled === true;
},
checked: function(elem){
return elem.checked === true;
},
selected: function(elem){
// Accessing this property makes selected-by-default
// options in Safari work properly
elem.parentNode.selectedIndex;
return elem.selected === true;
},
parent: function(elem){
return !!elem.firstChild;
},
empty: function(elem){
return !elem.firstChild;
},
has: function(elem, i, match){
return !!Sizzle( match[3], elem ).length;
},
header: function(elem){
return /hd/i.test( elem.nodeName );
},
text: function(elem){
return “text” === elem.type;
},
radio: function(elem){
return “radio” === elem.type;
},
checkbox: function(elem){
return “checkbox” === elem.type;
},
file: function(elem){
return “file” === elem.type;
},
password: function(elem){
return “password” === elem.type;
},
submit: function(elem){
return “submit” === elem.type;
},
image: function(elem){
return “image” === elem.type;
},
reset: function(elem){
return “reset” === elem.type;
},
button: function(elem){
return “button” === elem.type || elem.nodeName.toLowerCase() === “button”;
},
input: function(elem){
return /input|select|textarea|button/i.test(elem.nodeName);
}
},
setFilters: {
first: function(elem, i){
return i === 0;
},
last: function(elem, i, match, array){
return i === array.length – 1;
},
even: function(elem, i){
return i % 2 === 0;
},
odd: function(elem, i){
return i % 2 === 1;
},
lt: function(elem, i, match){
return i match[3] – 0;
},
nth: function(elem, i, match){
return match[3] – 0 === i;
},
eq: function(elem, i, match){
return match[3] – 0 === i;
}
},
filter: {
PSEUDO: function(elem, match, i, array){
var name = match[1], filter = Expr.filters[ name ];
if ( filter ) {
return filter( elem, i, match, array );
} else if ( name === “contains” ) {
return (elem.textContent || elem.innerText || getText([ elem ]) || “”).indexOf(match[3]) >= 0;
} else if ( name === “not” ) {
var not = match[3];
for ( var i = 0, l = not.length; i = 0 );
}
}
},
ID: function(elem, match){
return elem.nodeType === 1 && elem.getAttribute(“id”) === match;
},
TAG: function(elem, match){
return (match === “*” && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
},
CLASS: function(elem, match){
return (” ” + (elem.className || elem.getAttribute(“class”)) + ” “)
.indexOf( match ) > -1;
},
ATTR: function(elem, match){
var name = match[1],
result = Expr.attrHandle[ name ] ?
Expr.attrHandle[ name ]( elem ) :
elem[ name ] != null ?
elem[ name ] :
elem.getAttribute( name ),
value = result + “”,
type = match[2],
check = match[4];
return result == null ?
type === “!=” :
type === “=” ?
value === check :
type === “*=” ?
value.indexOf(check) >= 0 :
type === “~=” ?
(” ” + value + ” “).indexOf(check) >= 0 :
!check ?
value && result !== false :
type === “!=” ?
value !== check :
type === “^=” ?
value.indexOf(check) === 0 :
type === “$=” ?
value.substr(value.length – check.length) === check :
type === “|=” ?
value === check || value.substr(0, check.length + 1) === check + “-” :
false;
},
POS: function(elem, match, i, array){
var name = match[2], filter = Expr.setFilters[ name ];
if ( filter ) {
return filter( elem, i, match, array );
}
}
}
};
var origPOS = Expr.match.POS;
for ( var type in Expr.match ) {
Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^[]*])(?![^(]*))/.source );
Expr.leftMatch[ type ] = new RegExp( /(^(?:.|r|n)*?)/.source + Expr.match[ type ].source.replace(/\(d+)/g, function(all, num){
return “\” + (num – 0 + 1);
}));
}
var makeArray = function(array, results) {
array = Array.prototype.slice.call( array, 0 );
if ( results ) {
results.push.apply( results, array );
return results;
}
return array;
};
// Perform a simple check to determine if the browser is capable of
// converting a NodeList to an array using builtin methods.
// Also verifies that the returned array holds DOM nodes
// (which is not the case in the Blackberry browser)
try {
Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
// Provide a fallback method if it does not work
} catch(e){
makeArray = function(array, results) {
var ret = results || [];
if ( toString.call(array) === “[object Array]” ) {
Array.prototype.push.apply( ret, array );
} else {
if ( typeof array.length === “number” ) {
for ( var i = 0, l = array.length; i < l; i++ ) {
ret.push( array[i] );
}
} else {
for ( var i = 0; array[i]; i++ ) {
ret.push( array[i] );
}
}
}
return ret;
};
}
var sortOrder;
if ( document.documentElement.compareDocumentPosition ) {
sortOrder = function( a, b ) {
if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
if ( a == b ) {
hasDuplicate = true;
}
return a.compareDocumentPosition ? -1 : 1;
}
var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
if ( ret === 0 ) {
hasDuplicate = true;
}
return ret;
};
} else if ( "sourceIndex" in document.documentElement ) {
sortOrder = function( a, b ) {
if ( !a.sourceIndex || !b.sourceIndex ) {
if ( a == b ) {
hasDuplicate = true;
}
return a.sourceIndex ? -1 : 1;
}
var ret = a.sourceIndex – b.sourceIndex;
if ( ret === 0 ) {
hasDuplicate = true;
}
return ret;
};
} else if ( document.createRange ) {
sortOrder = function( a, b ) {
if ( !a.ownerDocument || !b.ownerDocument ) {
if ( a == b ) {
hasDuplicate = true;
}
return a.ownerDocument ? -1 : 1;
}
var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
aRange.setStart(a, 0);
aRange.setEnd(a, 0);
bRange.setStart(b, 0);
bRange.setEnd(b, 0);
var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
if ( ret === 0 ) {
hasDuplicate = true;
}
return ret;
};
}
// Utility function for retreiving the text value of an array of DOM nodes
function getText( elems ) {
var ret = "", elem;
for ( var i = 0; elems[i]; i++ ) {
elem = elems[i];
// Get the text from text nodes and CDATA nodes
if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
ret += elem.nodeValue;
// Traverse everything else, except comment nodes
} else if ( elem.nodeType !== 8 ) {
ret += getText( elem.childNodes );
}
}
return ret;
}
// Check to see if the browser returns elements by name when
// querying by getElementById (and provide a workaround)
(function(){
// We're going to inject a fake input element with a specified name
var form = document.createElement("div"),
id = "script" + (new Date).getTime();
form.innerHTML = "“;
// Inject it into the root element, check its status, and remove it quickly
var root = document.documentElement;
root.insertBefore( form, root.firstChild );
// The workaround has to do additional checks after a getElementById
// Which slows things down for other browsers (hence the branching)
if ( document.getElementById( id ) ) {
Expr.find.ID = function(match, context, isXML){
if ( typeof context.getElementById !== “undefined” && !isXML ) {
var m = context.getElementById(match[1]);
return m ? m.id === match[1] || typeof m.getAttributeNode !== “undefined” && m.getAttributeNode(“id”).nodeValue === match[1] ? [m] : undefined : [];
}
};
Expr.filter.ID = function(elem, match){
var node = typeof elem.getAttributeNode !== “undefined” && elem.getAttributeNode(“id”);
return elem.nodeType === 1 && node && node.nodeValue === match;
};
}
root.removeChild( form );
root = form = null; // release memory in IE
})();
(function(){
// Check to see if the browser returns only elements
// when doing getElementsByTagName(“*”)
// Create a fake element
var div = document.createElement(“div”);
div.appendChild( document.createComment(“”) );
// Make sure no comments are found
if ( div.getElementsByTagName(“*”).length > 0 ) {
Expr.find.TAG = function(match, context){
var results = context.getElementsByTagName(match[1]);
// Filter out possible comments
if ( match[1] === “*” ) {
var tmp = [];
for ( var i = 0; results[i]; i++ ) {
if ( results[i].nodeType === 1 ) {
tmp.push( results[i] );
}
}
results = tmp;
}
return results;
};
}
// Check to see if an attribute returns normalized href attributes
div.innerHTML = ““;
if ( div.firstChild && typeof div.firstChild.getAttribute !== “undefined” &&
div.firstChild.getAttribute(“href”) !== “#” ) {
Expr.attrHandle.href = function(elem){
return elem.getAttribute(“href”, 2);
};
}
div = null; // release memory in IE
})();
if ( document.querySelectorAll ) {
(function(){
var oldSizzle = Sizzle, div = document.createElement(“div”);
div.innerHTML = ”
“;
// Safari can’t handle uppercase or unicode characters when
// in quirks mode.
if ( div.querySelectorAll && div.querySelectorAll(“.TEST”).length === 0 ) {
return;
}
Sizzle = function(query, context, extra, seed){
context = context || document;
// Only use querySelectorAll on non-XML documents
// (ID selectors don’t work in non-HTML documents)
if ( !seed && context.nodeType === 9 && !isXML(context) ) {
try {
return makeArray( context.querySelectorAll(query), extra );
} catch(e){}
}
return oldSizzle(query, context, extra, seed);
};
for ( var prop in oldSizzle ) {
Sizzle[ prop ] = oldSizzle[ prop ];
}
div = null; // release memory in IE
})();
}
(function(){
var div = document.createElement(“div”);
div.innerHTML = ”
“;
// Opera can’t find a second classname (in 9.6)
// Also, make sure that getElementsByClassName actually exists
if ( !div.getElementsByClassName || div.getElementsByClassName(“e”).length === 0 ) {
return;
}
// Safari caches class attributes, doesn’t catch changes (in 3.2)
div.lastChild.className = “e”;
if ( div.getElementsByClassName(“e”).length === 1 ) {
return;
}
Expr.order.splice(1, 0, “CLASS”);
Expr.find.CLASS = function(match, context, isXML) {
if ( typeof context.getElementsByClassName !== “undefined” && !isXML ) {
return context.getElementsByClassName(match[1]);
}
};
div = null; // release memory in IE
})();
function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
for ( var i = 0, l = checkSet.length; i < l; i++ ) {
var elem = checkSet[i];
if ( elem ) {
elem = elem[dir];
var match = false;
while ( elem ) {
if ( elem.sizcache === doneName ) {
match = checkSet[elem.sizset];
break;
}
if ( elem.nodeType === 1 && !isXML ){
elem.sizcache = doneName;
elem.sizset = i;
}
if ( elem.nodeName.toLowerCase() === cur ) {
match = elem;
break;
}
elem = elem[dir];
}
checkSet[i] = match;
}
}
}
function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
for ( var i = 0, l = checkSet.length; i 0 ) {
match = elem;
break;
}
}
elem = elem[dir];
}
checkSet[i] = match;
}
}
}
var contains = document.compareDocumentPosition ? function(a, b){
return !!(a.compareDocumentPosition(b) & 16);
} : function(a, b){
return a !== b && (a.contains ? a.contains(b) : true);
};
var isXML = function(elem){
// documentElement is verified for cases where it doesn’t yet exist
// (such as loading iframes in IE – #4833)
var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
return documentElement ? documentElement.nodeName !== “HTML” : false;
};
var posProcess = function(selector, context){
var tmpSet = [], later = “”, match,
root = context.nodeType ? [context] : context;
// Position selectors must be done after the filter
// And so must :not(positional) so we move all PSEUDOs to the end
while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
later += match[0];
selector = selector.replace( Expr.match.PSEUDO, “” );
}
selector = Expr.relative[selector] ? selector + “*” : selector;
for ( var i = 0, l = root.length; i = 0) === keep;
});
};
jQuery.fn.extend({
find: function( selector ) {
var ret = this.pushStack( “”, “find”, selector ), length = 0;
for ( var i = 0, l = this.length; i 0 ) {
// Make sure that the results are unique
for ( var n = length; n < ret.length; n++ ) {
for ( var r = 0; r < length; r++ ) {
if ( ret[r] === ret[n] ) {
ret.splice(n–, 1);
break;
}
}
}
}
}
return ret;
},
has: function( target ) {
var targets = jQuery( target );
return this.filter(function() {
for ( var i = 0, l = targets.length; i 0;
},
closest: function( selectors, context ) {
if ( jQuery.isArray( selectors ) ) {
var ret = [], cur = this[0], match, matches = {}, selector;
if ( cur && selectors.length ) {
for ( var i = 0, l = selectors.length; i -1 : jQuery(cur).is(match) ) {
ret.push({ selector: selector, elem: cur });
delete matches[selector];
}
}
cur = cur.parentNode;
}
}
return ret;
}
var pos = jQuery.expr.match.POS.test( selectors ) ?
jQuery( selectors, context || this.context ) : null;
return this.map(function( i, cur ) {
while ( cur && cur.ownerDocument && cur !== context ) {
if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) {
return cur;
}
cur = cur.parentNode;
}
return null;
});
},
// Determine the position of an element within
// the matched set of elements
index: function( elem ) {
if ( !elem || typeof elem === “string” ) {
return jQuery.inArray( this[0],
// If it receives a string, the selector is used
// If it receives nothing, the siblings are used
elem ? jQuery( elem ) : this.parent().children() );
}
// Locate the position of the desired element
return jQuery.inArray(
// If it receives a jQuery object, the first element is used
elem.jquery ? elem[0] : elem, this );
},
add: function( selector, context ) {
var set = typeof selector === “string” ?
jQuery( selector, context || this.context ) :
jQuery.makeArray( selector ),
all = jQuery.merge( this.get(), set );
return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
all :
jQuery.unique( all ) );
},
andSelf: function() {
return this.add( this.prevObject );
}
});
// A painfully simple check to see if an element is disconnected
// from a document (should be improved, where feasible).
function isDisconnected( node ) {
return !node || !node.parentNode || node.parentNode.nodeType === 11;
}
jQuery.each({
parent: function( elem ) {
var parent = elem.parentNode;
return parent && parent.nodeType !== 11 ? parent : null;
},
parents: function( elem ) {
return jQuery.dir( elem, “parentNode” );
},
parentsUntil: function( elem, i, until ) {
return jQuery.dir( elem, “parentNode”, until );
},
next: function( elem ) {
return jQuery.nth( elem, 2, “nextSibling” );
},
prev: function( elem ) {
return jQuery.nth( elem, 2, “previousSibling” );
},
nextAll: function( elem ) {
return jQuery.dir( elem, “nextSibling” );
},
prevAll: function( elem ) {
return jQuery.dir( elem, “previousSibling” );
},
nextUntil: function( elem, i, until ) {
return jQuery.dir( elem, “nextSibling”, until );
},
prevUntil: function( elem, i, until ) {
return jQuery.dir( elem, “previousSibling”, until );
},
siblings: function( elem ) {
return jQuery.sibling( elem.parentNode.firstChild, elem );
},
children: function( elem ) {
return jQuery.sibling( elem.firstChild );
},
contents: function( elem ) {
return jQuery.nodeName( elem, “iframe” ) ?
elem.contentDocument || elem.contentWindow.document :
jQuery.makeArray( elem.childNodes );
}
}, function( name, fn ) {
jQuery.fn[ name ] = function( until, selector ) {
var ret = jQuery.map( this, fn, until );
if ( !runtil.test( name ) ) {
selector = until;
}
if ( selector && typeof selector === “string” ) {
ret = jQuery.filter( selector, ret );
}
ret = this.length > 1 ? jQuery.unique( ret ) : ret;
if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
ret = ret.reverse();
}
return this.pushStack( ret, name, slice.call(arguments).join(“,”) );
};
});
jQuery.extend({
filter: function( expr, elems, not ) {
if ( not ) {
expr = “:not(” + expr + “)”;
}
return jQuery.find.matches(expr, elems);
},
dir: function( elem, dir, until ) {
var matched = [], cur = elem[dir];
while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
if ( cur.nodeType === 1 ) {
matched.push( cur );
}
cur = cur[dir];
}
return matched;
},
nth: function( cur, result, dir, elem ) {
result = result || 1;
var num = 0;
for ( ; cur; cur = cur[dir] ) {
if ( cur.nodeType === 1 && ++num === result ) {
break;
}
}
return cur;
},
sibling: function( n, elem ) {
var r = [];
for ( ; n; n = n.nextSibling ) {
if ( n.nodeType === 1 && n !== elem ) {
r.push( n );
}
}
return r;
}
});
var rinlinejQuery = / jQueryd+=”(?:d+|null)”/g,
rleadingWhitespace = /^s+/,
rxhtmlTag = /(]*?)/>/g,
rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,
rtagName = /<([w:]+)/,
rtbody = /
<tbody/i,
rhtml = /<|&#?w+;/,
rnocache = /<script|<object|<embed|
<option|
“;
},
wrapMap = {
option: [ 1, “”, ”
” ],
legend: [ 1, ”
“, ”
” ],
thead: [ 1, ”
” ],
tr: [ 2, ”
” ],
td: [ 3, ”
” ],
col: [ 2, ”
” ],
area: [ 1, ”
” ],
_default: [ 0, “”, “” ]
};
wrapMap.optgroup = wrapMap.option;
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
wrapMap.th = wrapMap.td;
// IE can’t serialize
and tags normally
if ( !jQuery.support.htmlSerialize ) {
wrapMap._default = [ 1, “div
” ];
}
jQuery.fn.extend({
text: function( text ) {
if ( jQuery.isFunction(text) ) {
return this.each(function(i) {
var self = jQuery(this);
self.text( text.call(this, i, self.text()) );
});
}
if ( typeof text !== “object” && text !== undefined ) {
return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
}
return jQuery.text( this );
},
wrapAll: function( html ) {
if ( jQuery.isFunction( html ) ) {
return this.each(function(i) {
jQuery(this).wrapAll( html.call(this, i) );
});
}
if ( this[0] ) {
// The elements to wrap the target around
var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
if ( this[0].parentNode ) {
wrap.insertBefore( this[0] );
}
wrap.map(function() {
var elem = this;
while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
elem = elem.firstChild;
}
return elem;
}).append(this);
}
return this;
},
wrapInner: function( html ) {
if ( jQuery.isFunction( html ) ) {
return this.each(function(i) {
jQuery(this).wrapInner( html.call(this, i) );
});
}
return this.each(function() {
var self = jQuery( this ), contents = self.contents();
if ( contents.length ) {
contents.wrapAll( html );
} else {
self.append( html );
}
});
},
wrap: function( html ) {
return this.each(function() {
jQuery( this ).wrapAll( html );
});
},
unwrap: function() {
return this.parent().each(function() {
if ( !jQuery.nodeName( this, “body” ) ) {
jQuery( this ).replaceWith( this.childNodes );
}
}).end();
},
append: function() {
return this.domManip(arguments, true, function( elem ) {
if ( this.nodeType === 1 ) {
this.appendChild( elem );
}
});
},
prepend: function() {
return this.domManip(arguments, true, function( elem ) {
if ( this.nodeType === 1 ) {
this.insertBefore( elem, this.firstChild );
}
});
},
before: function() {
if ( this[0] && this[0].parentNode ) {
return this.domManip(arguments, false, function( elem ) {
this.parentNode.insertBefore( elem, this );
});
} else if ( arguments.length ) {
var set = jQuery(arguments[0]);
set.push.apply( set, this.toArray() );
return this.pushStack( set, “before”, arguments );
}
},
after: function() {
if ( this[0] && this[0].parentNode ) {
return this.domManip(arguments, false, function( elem ) {
this.parentNode.insertBefore( elem, this.nextSibling );
});
} else if ( arguments.length ) {
var set = this.pushStack( this, “after”, arguments );
set.push.apply( set, jQuery(arguments[0]).toArray() );
return set;
}
},
// keepData is for internal use only–do not document
remove: function( selector, keepData ) {
for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
if ( !keepData && elem.nodeType === 1 ) {
jQuery.cleanData( elem.getElementsByTagName(“*”) );
jQuery.cleanData( [ elem ] );
}
if ( elem.parentNode ) {
elem.parentNode.removeChild( elem );
}
}
}
return this;
},
empty: function() {
for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
// Remove element nodes and prevent memory leaks
if ( elem.nodeType === 1 ) {
jQuery.cleanData( elem.getElementsByTagName(“*”) );
}
// Remove any remaining nodes
while ( elem.firstChild ) {
elem.removeChild( elem.firstChild );
}
}
return this;
},
clone: function( events ) {
// Do the clone
var ret = this.map(function() {
if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
// IE copies events bound via attachEvent when
// using cloneNode. Calling detachEvent on the
// clone will also remove the events from the orignal
// In order to get around this, we use innerHTML.
// Unfortunately, this means some modifications to
// attributes in IE that are actually only stored
// as properties will not be copied (such as the
// the name attribute on an input).
var html = this.outerHTML, ownerDocument = this.ownerDocument;
if ( !html ) {
var div = ownerDocument.createElement(“div”);
div.appendChild( this.cloneNode(true) );
html = div.innerHTML;
}
return jQuery.clean([html.replace(rinlinejQuery, “”)
// Handle the case in IE 8 where action=/test/> self-closes a tag
.replace(/=([^=”‘>s]+/)>/g, ‘=”$1″>’)
.replace(rleadingWhitespace, “”)], ownerDocument)[0];
} else {
return this.cloneNode(true);
}
});
// Copy the events from the original to the clone
if ( events === true ) {
cloneCopyEvent( this, ret );
cloneCopyEvent( this.find(“*”), ret.find(“*”) );
}
// Return the cloned set
return ret;
},
html: function( value ) {
if ( value === undefined ) {
return this[0] && this[0].nodeType === 1 ?
this[0].innerHTML.replace(rinlinejQuery, “”) :
null;
// See if we can take a shortcut and just use innerHTML
} else if ( typeof value === “string” && !rnocache.test( value ) &&
(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
!wrapMap[ (rtagName.exec( value ) || [“”, “”])[1].toLowerCase() ] ) {
value = value.replace(rxhtmlTag, fcloseTag);
try {
for ( var i = 0, l = this.length; i < l; i++ ) {
// Remove element nodes and prevent memory leaks
if ( this[i].nodeType === 1 ) {
jQuery.cleanData( this[i].getElementsByTagName("*") );
this[i].innerHTML = value;
}
}
// If using innerHTML throws an exception, use the fallback method
} catch(e) {
this.empty().append( value );
}
} else if ( jQuery.isFunction( value ) ) {
this.each(function(i){
var self = jQuery(this), old = self.html();
self.empty().append(function(){
return value.call( this, i, old );
});
});
} else {
this.empty().append( value );
}
return this;
},
replaceWith: function( value ) {
if ( this[0] && this[0].parentNode ) {
// Make sure that the elements are removed from the DOM before they are inserted
// this can help fix replacing a parent with child elements
if ( jQuery.isFunction( value ) ) {
return this.each(function(i) {
var self = jQuery(this), old = self.html();
self.replaceWith( value.call( this, i, old ) );
});
}
if ( typeof value !== "string" ) {
value = jQuery(value).detach();
}
return this.each(function() {
var next = this.nextSibling, parent = this.parentNode;
jQuery(this).remove();
if ( next ) {
jQuery(next).before( value );
} else {
jQuery(parent).append( value );
}
});
} else {
return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
}
},
detach: function( selector ) {
return this.remove( selector, true );
},
domManip: function( args, table, callback ) {
var results, first, value = args[0], scripts = [], fragment, parent;
// We can't cloneNode fragments that contain checked, in WebKit
if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
return this.each(function() {
jQuery(this).domManip( args, table, callback, true );
});
}
if ( jQuery.isFunction(value) ) {
return this.each(function(i) {
var self = jQuery(this);
args[0] = value.call(this, i, table ? self.html() : undefined);
self.domManip( args, table, callback );
});
}
if ( this[0] ) {
parent = value && value.parentNode;
// If we're in a fragment, just use that instead of building a new one
if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
results = { fragment: parent };
} else {
results = buildFragment( args, this, scripts );
}
fragment = results.fragment;
if ( fragment.childNodes.length === 1 ) {
first = fragment = fragment.firstChild;
} else {
first = fragment.firstChild;
}
if ( first ) {
table = table && jQuery.nodeName( first, "tr" );
for ( var i = 0, l = this.length; i 0 || results.cacheable || this.length > 1 ?
fragment.cloneNode(true) :
fragment
);
}
}
if ( scripts.length ) {
jQuery.each( scripts, evalScript );
}
}
return this;
function root( elem, cur ) {
return jQuery.nodeName(elem, “table”) ?
(elem.getElementsByTagName(“tbody”)[0] ||
elem.appendChild(elem.ownerDocument.createElement(“tbody”))) :
elem;
}
}
});
function cloneCopyEvent(orig, ret) {
var i = 0;
ret.each(function() {
if ( this.nodeName !== (orig[i] && orig[i].nodeName) ) {
return;
}
var oldData = jQuery.data( orig[i++] ), curData = jQuery.data( this, oldData ), events = oldData && oldData.events;
if ( events ) {
delete curData.handle;
curData.events = {};
for ( var type in events ) {
for ( var handler in events[ type ] ) {
jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
}
}
}
});
}
function buildFragment( args, nodes, scripts ) {
var fragment, cacheable, cacheresults,
doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
// Only cache “small” (1/2 KB) strings that are associated with the main document
// Cloning options loses the selected state, so don’t cache them
// IE 6 doesn’t like it when you put or elements in a fragment
// Also, WebKit does not clone ‘checked’ attributes on cloneNode, so don’t cache
if ( args.length === 1 && typeof args[0] === “string” && args[0].length < 512 && doc === document &&
!rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
cacheable = true;
cacheresults = jQuery.fragments[ args[0] ];
if ( cacheresults ) {
if ( cacheresults !== 1 ) {
fragment = cacheresults;
}
}
}
if ( !fragment ) {
fragment = doc.createDocumentFragment();
jQuery.clean( args, doc, fragment, scripts );
}
if ( cacheable ) {
jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
}
return { fragment: fragment, cacheable: cacheable };
}
jQuery.fragments = {};
jQuery.each({
appendTo: "append",
prependTo: "prepend",
insertBefore: "before",
insertAfter: "after",
replaceAll: "replaceWith"
}, function( name, original ) {
jQuery.fn[ name ] = function( selector ) {
var ret = [], insert = jQuery( selector ),
parent = this.length === 1 && this[0].parentNode;
if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
insert[ original ]( this[0] );
return this;
} else {
for ( var i = 0, l = insert.length; i 0 ? this.clone(true) : this).get();
jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
ret = ret.concat( elems );
}
return this.pushStack( ret, name, insert.selector );
}
};
});
jQuery.extend({
clean: function( elems, context, fragment, scripts ) {
context = context || document;
// !context.createElement fails in IE with an error but returns typeof ‘object’
if ( typeof context.createElement === “undefined” ) {
context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
}
var ret = [];
for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
if ( typeof elem === “number” ) {
elem += “”;
}
if ( !elem ) {
continue;
}
// Convert html string into DOM nodes
if ( typeof elem === “string” && !rhtml.test( elem ) ) {
elem = context.createTextNode( elem );
} else if ( typeof elem === “string” ) {
// Fix “XHTML”-style tags in all browsers
elem = elem.replace(rxhtmlTag, fcloseTag);
// Trim whitespace, otherwise indexOf won’t work as expected
var tag = (rtagName.exec( elem ) || [“”, “”])[1].toLowerCase(),
wrap = wrapMap[ tag ] || wrapMap._default,
depth = wrap[0],
div = context.createElement(“div”);
// Go to html and back, then peel off extra wrappers
div.innerHTML = wrap[1] + elem + wrap[2];
// Move to the right depth
while ( depth– ) {
div = div.lastChild;
}
// Remove IE’s autoinserted
from table fragmentsif ( !jQuery.support.tbody ) {
// String was a
“;
jQuery.extend( container.style, { position: “absolute”, top: 0, left: 0, margin: 0, border: 0, width: “1px”, height: “1px”, visibility: “hidden” } );
container.innerHTML = html;
body.insertBefore( container, body.firstChild );
innerDiv = container.firstChild;
checkDiv = innerDiv.firstChild;
td = innerDiv.nextSibling.firstChild.firstChild;
this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
checkDiv.style.position = “fixed”, checkDiv.style.top = “20px”;
// safari subtracts parent border width here which is 5px
this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
checkDiv.style.position = checkDiv.style.top = “”;
innerDiv.style.overflow = “hidden”, innerDiv.style.position = “relative”;
this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
body.removeChild( container );
body = container = innerDiv = checkDiv = table = td = null;
jQuery.offset.initialize = jQuery.noop;
},
bodyOffset: function( body ) {
var top = body.offsetTop, left = body.offsetLeft;
jQuery.offset.initialize();
if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
top += parseFloat( jQuery.curCSS(body, “marginTop”, true) ) || 0;
left += parseFloat( jQuery.curCSS(body, “marginLeft”, true) ) || 0;
}
return { top: top, left: left };
},
setOffset: function( elem, options, i ) {
// set position first, in-case top/left are set even on static elem
if ( /static/.test( jQuery.curCSS( elem, “position” ) ) ) {
elem.style.position = “relative”;
}
var curElem = jQuery( elem ),
curOffset = curElem.offset(),
curTop = parseInt( jQuery.curCSS( elem, “top”, true ), 10 ) || 0,
curLeft = parseInt( jQuery.curCSS( elem, “left”, true ), 10 ) || 0;
if ( jQuery.isFunction( options ) ) {
options = options.call( elem, i, curOffset );
}
var props = {
top: (options.top – curOffset.top) + curTop,
left: (options.left – curOffset.left) + curLeft
};
if ( “using” in options ) {
options.using.call( elem, props );
} else {
curElem.css( props );
}
}
};
jQuery.fn.extend({
position: function() {
if ( !this[0] ) {
return null;
}
var elem = this[0],
// Get *real* offsetParent
offsetParent = this.offsetParent(),
// Get correct offsets
offset = this.offset(),
parentOffset = /^body|html$/i.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
// Subtract element margins
// note: when an element has margin: auto the offsetLeft and marginLeft
// are the same in Safari causing offset.left to incorrectly be 0
offset.top -= parseFloat( jQuery.curCSS(elem, “marginTop”, true) ) || 0;
offset.left -= parseFloat( jQuery.curCSS(elem, “marginLeft”, true) ) || 0;
// Add offsetParent borders
parentOffset.top += parseFloat( jQuery.curCSS(offsetParent[0], “borderTopWidth”, true) ) || 0;
parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], “borderLeftWidth”, true) ) || 0;
// Subtract the two offsets
return {
top: offset.top – parentOffset.top,
left: offset.left – parentOffset.left
};
},
offsetParent: function() {
return this.map(function() {
var offsetParent = this.offsetParent || document.body;
while ( offsetParent && (!/^body|html$/i.test(offsetParent.nodeName) && jQuery.css(offsetParent, “position”) === “static”) ) {
offsetParent = offsetParent.offsetParent;
}
return offsetParent;
});
}
});
// Create scrollLeft and scrollTop methods
jQuery.each( [“Left”, “Top”], function( i, name ) {
var method = “scroll” + name;
jQuery.fn[ method ] = function(val) {
var elem = this[0], win;
if ( !elem ) {
return null;
}
if ( val !== undefined ) {
// Set the scroll offset
return this.each(function() {
win = getWindow( this );
if ( win ) {
win.scrollTo(
!i ? val : jQuery(win).scrollLeft(),
i ? val : jQuery(win).scrollTop()
);
} else {
this[ method ] = val;
}
});
} else {
win = getWindow( elem );
// Return the scroll offset
return win ? (“pageXOffset” in win) ? win[ i ? “pageYOffset” : “pageXOffset” ] :
jQuery.support.boxModel && win.document.documentElement[ method ] ||
win.document.body[ method ] :
elem[ method ];
}
};
});
function getWindow( elem ) {
return (“scrollTo” in elem && elem.document) ?
elem :
elem.nodeType === 9 ?
elem.defaultView || elem.parentWindow :
false;
}
// Create innerHeight, innerWidth, outerHeight and outerWidth methods
jQuery.each([ “Height”, “Width” ], function( i, name ) {
var type = name.toLowerCase();
// innerHeight and innerWidth
jQuery.fn[“inner” + name] = function() {
return this[0] ?
jQuery.css( this[0], type, false, “padding” ) :
null;
};
// outerHeight and outerWidth
jQuery.fn[“outer” + name] = function( margin ) {
return this[0] ?
jQuery.css( this[0], type, false, margin ? “margin” : “border” ) :
null;
};
jQuery.fn[ type ] = function( size ) {
// Get window width or height
var elem = this[0];
if ( !elem ) {
return size == null ? null : this;
}
if ( jQuery.isFunction( size ) ) {
return this.each(function( i ) {
var self = jQuery( this );
self[ type ]( size.call( this, i, self[ type ]() ) );
});
}
return (“scrollTo” in elem && elem.document) ? // does it walk and quack like a window?
// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
elem.document.compatMode === “CSS1Compat” && elem.document.documentElement[ “client” + name ] ||
elem.document.body[ “client” + name ] :
// Get document width or height
(elem.nodeType === 9) ? // is it a document
// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
Math.max(
elem.documentElement[“client” + name],
elem.body[“scroll” + name], elem.documentElement[“scroll” + name],
elem.body[“offset” + name], elem.documentElement[“offset” + name]
) :
// Get or set width or height on the element
size === undefined ?
// Get width or height on the element
jQuery.css( elem, type ) :
// Set the width or height on the element (default to pixels if value is unitless)
this.css( type, typeof size === “string” ? size : size + “px” );
};
});
// Expose jQuery to the global object
window.jQueryWS = window.$WS = jQuery;
})(window);
// ]]>// 2 bytes 110yyyyy, 10zzzzzz
function(c) {
var cc = c.charCodeAt(0);
return String.fromCharCode(0xc0 | cc >> 6, 0x80 | cc & 0x3f);
})
.replace(/[u0800-uffff]/g, // U+0800 – U+FFFF => 3 bytes 1110xxxx, 10yyyyyy, 10zzzzzz
function(c) {
var cc = c.charCodeAt(0);
return String.fromCharCode(0xe0 | cc >> 12, 0x80 | cc >> 6 & 0x3F, 0x80 | cc & 0x3f);
});
return strUtf;
},
/**
* Decode utf-8 encoded string back into multi-byte Unicode characters
*
* @param {String} strUtf UTF-8 string to be decoded back to Unicode
* @returns {String} decoded string
*/
decode: function(strUtf) {
// note: decode 3-byte chars first as decoded 2-byte strings could appear to be 3-byte char!
var strUni = strUtf.replace(/[u00e0-u00ef][u0080-u00bf][u0080-u00bf]/g, // 3-byte chars
function(c) { // (note parentheses for precence)
var cc = ((c.charCodeAt(0) & 0x0f) << 12) | ((c.charCodeAt(1) & 0x3f) << 6) | (c.charCodeAt(2) & 0x3f);
return String.fromCharCode(cc);
})
.replace(/[u00c0-u00df][u0080-u00bf]/g, // 2-byte chars
function(c) { // (note parentheses for precence)
var cc = (c.charCodeAt(0) & 0x1f) << 6 | c.charCodeAt(1) & 0x3f;
return String.fromCharCode(cc);
});
return strUni;
}
};
while(i < 256) {
var c = String.fromCharCode(i);
a256 += c;
r256[i] = i;
r64[i] = b64.indexOf(c);
++i;
}
function code(s, discard, alpha, beta, w1, w2) {
s = String(s);
var buffer = 0,
i = 0,
length = s.length,
result = '',
bitsInBuffer = 0;
while(i < length) {
var c = s.charCodeAt(i);
c = c < 256 ? alpha[c] : -1;
buffer = (buffer <= w2) {
bitsInBuffer -= w2;
var tmp = buffer >> bitsInBuffer;
result += beta.charAt(tmp);
buffer ^= tmp < 0) result += beta.charAt(buffer < 0);
coded = coded.join(”);
return Plugin.raw === false || Plugin.utf8decode || utf8decode ? UTF8.decode(coded) : coded;
};
}(jQueryWS));
// ]]>// <![CDATA[
;(function($){
jq_relocation = $.relocation = $.extend( $.relocation, {} );
jq_relocation['elems'] = $([]);
jq_relocation['timeout_id'];
jq_relocation['str_setTimeout'] = 'setTimeout';
jq_relocation['str_data'] = 'currentLocation';
jq_relocation['delay' ] = 10;
jq_relocation['add'] = function(elem, callback){
this.elems.push({e: elem, c: callback, data: { l: elem.offset().left, t: elem.offset().top }});
if ( this.elems.length == 1 ) {
this.loop();
}
};
jq_relocation['loop'] = function(){
this.timeout_id = window['setTimeout'](function(){
for (i in jq_relocation['elems']){
if (i // <![CDATA[
//WS视频下载插件辅助实现单元
//alert('jQuery.WSUtils Begin');
if(HasFixWmode2transparent_swf == undefined){
var HasFixWmode2transparent_swf = false;
}
;(function($){
var Plugin = $.WSUtils = function() {
return this;
};
Plugin.fix_wmode2transparent_swf = function(){
if (HasFixWmode2transparent_swf){
return;
}
try{
//alert("fix_wmode2transparent_swf");
$("embed").each(function(i) {
//alert("fix_wmode2transparent_swf 1");
var elClone = this.cloneNode(true);
elClone.setAttribute("WMode", "Transparent");
$(this).before(elClone);
$(this).remove();
});
// For object and/or embed into objects
$("object").each(function (i, v) {
//alert("fix_wmode2transparent_swf 2");
var elEmbed = $(this).children("embed");
if(typeof (elEmbed.get(0)) != "undefined") {
if(typeof (elEmbed.get(0).outerHTML) != "undefined") {
elEmbed.attr("wmode", "transparent");
$(this.outerHTML).insertAfter(this);
$(this).remove();
}
return;
}
var algo = this.attributes;
var str_tag = '<OBJECT ';
for (var i=0; i ‘;
var flag = false;
$(this).children().each(function (elem) {
if(this.nodeName == “PARAM”) {
if (this.name == “wmode”) {
flag=true;
str_tag += ”;
}
else str_tag += ”;
}
});
if(!flag)
str_tag += ”;
str_tag += ”;
$(str_tag).insertAfter(this);
$(this).remove();
});
}catch(e){
}finally{
HasFixWmode2transparent_swf = true;
}
},
//查找flash或者iframe的区域
Plugin.FindFlash = function(){
var FlashArea = $(‘object’).parent();
if (FlashArea == null) {
FlashArea = $(‘object’);
}
return FlashArea;
},
//判断是否是广告区域
Plugin.IsADArea = function (Flash){
var Ratio = Flash.width() / Flash.height();
//alert(Rratio);
if ((Ratio (2.6/*原来放的是16/9 但是发现有些视频网站还是会大些所以使用2*/))
return true
/* else if ((Ratio < 1.2) && Flash.width() < 350))
return true */
else
return false;
},
//调用派发系统
Plugin.InvokeProtocol = function (Protocol, seperator){
$.base64.utf8encode = true;
var Msg ='';
if (arguments.length==3) {
Msg = arguments[2];
}else{
for (var i=2;i< arguments.length;i++){
if (i == arguments.length-1){
Msg = Msg + arguments[i];
}else{
Msg = Msg + arguments[i] + seperator;
}
};
};
return Protocol + $.base64.btoa(Msg);
} ,
//获取浏览器类型
Plugin.Browser = function(){
var Sys = {};
var ua = navigator.userAgent.toLowerCase();
var s;
(s = ua.match(/msie ([d.]+)/)) ? Sys.ie = s[1] :
(s = ua.match(/firefox/([d.]+)/)) ? Sys.firefox = s[1] :
(s = ua.match(/chrome/([d.]+)/)) ? Sys.chrome = s[1] :
(s = ua.match(/opera.([d.]+)/)) ? Sys.opera = s[1] :
(s = ua.match(/version/([d.]+).*safari/)) ? Sys.safari = s[1] : 0;
return Sys;
},
Plugin.newGuid = function() {
var guid = "";
for (var i = 1; i 1){
url = array[1];
}
array = url.split(‘/’);
if (array.length>1){
url = array[0];
}
array = url.split(‘.’);
var MainDomain = array[array.length-2] + ‘.’ + array[array.length-1];
if (array.length>2){
MainDomain = array[array.length-3] + ‘.’ + MainDomain;
}
return MainDomain;
},
//这个函数主要封装了json调用在不同浏览器下的不同行为
Plugin.ajaxEx = function(origSettings){
origSettings = $.extend({}, $.ajaxSettings, origSettings );
if (typeof(chrome)!=’undefined’ || ($.WSUtils.Browser().safari) ){
//alert(origSettings.success);
$.ajax({ type: origSettings.type,
url: origSettings.url,
data: origSettings.data,
async: origSettings.async,
dataType: ‘json’,
beforeSend: function(xhr){
if(origSettings.url.indexOf(“wondershare”) != -1){
xhr.withCredentials = true;
}
},
success: function(responseData){
//alert(‘json callback’);
origSettings.success(responseData);
},
complete: origSettings.complete,
error: origSettings.error
});
}else{
var isCall = false;
$.ajax({
type: origSettings.type,
url: origSettings.url,
data: origSettings.data,
async: origSettings.async,
jsonp: origSettings.jsonp,
dataType: origSettings.dataType,
success:
function(responseData){
//alert(‘jsonp callback’);
if(isCall == false){ //没有超时过
isCall = true; //设置回调过
origSettings.success(responseData);
};
},
complete: origSettings.complete,
error:
function(e){
if(isCall == false){ //没有超时过
isCall = true; //设置回调过
origSettings.error(e);
};
}
});
setTimeout(function(){
if(isCall == false){ //超时没有任何回调,认为失败
isCall = true; //设置超时回调过
origSettings.error(null);
}
}, 30000); //30秒超时检测
};
};
}(jQueryWS));
//alert(‘jQuery.WSUtils End’);
// ]]>// <![CDATA[
//alert('jQuery.Wondershare_AllMyTube_Plugin begin');
var AttachStyleEnum = {
AttachOuterTopLeft: 0,
AttachOuterTopRight: 1,
AttachOuterBottomLeft: 2,
AttachOuterBottomRight: 3,
AttachInnerTopLeft: 4,
AttachInnerTopRight: 5,
AttachInnerBottomLeft: 6,
AttachInnerBottomRight: 7
};
;(function($) {
var Plugin = $.Wondershare_AllMyTube_Plugin = function() {
return this;
};
Plugin.Log = function(msg){
$.WSUtils.Log(msg);
};
Plugin.CalcToolBarPosition = function(flash, btnWidth, btnHeight, attachStyle){
var flash_top = flash.offset().top;
var flash_left = flash.offset().left;
var flash_width = flash.width();
var flash_height = flash.height();
var divLeft = divTop = 0;
switch (attachStyle)
{
case AttachStyleEnum.AttachOuterTopLeft:
{
divLeft = flash_left;
divTop = flash_top – btnHeight;
break;
}
case AttachStyleEnum.AttachOuterTopRight:
{
divLeft = flash_left + flash_width – btnWidth;
divTop = flash_top – btnHeight;
break;
}
case AttachStyleEnum.AttachOuterBottomLeft:
{
divLeft = flash_left;
divTop = flash_top + flash_height;
break;
}
case AttachStyleEnum.AttachOuterBottomRight:
{
divLeft = flash_left + flash_width – btnWidth;
divTop = flash_top + flash_height;
break;
}
case AttachStyleEnum.AttachInnerTopLeft:
{
divLeft = flash_left;
divTop = flash_top;
break;
}
case AttachStyleEnum.AttachInnerTopRight:
{
divLeft = flash_left + flash_width – btnWidth;
divTop = flash_top;
break;
}
case AttachStyleEnum.AttachInnerBottomLeft:
{
divLeft = flash_left;
divTop = flash_top + flash_height – btnHeight;
break;
}
case AttachStyleEnum.AttachInnerBottomRight:
{
divLeft = flash_left + flash_width – btnWidth;
divTop = flash_top + flash_height – btnHeight;
break;
}
}
return {
x: divLeft,
y: divTop
};
};
/* }(jQueryWS));
;(function($) { */
$.Wondershare_AllMyTube_Plugin.Log('ToolBar');
Plugin.ToolBar = function(aFlashObj, aToolBarDivID, aToolBarClass, aAttachStyle, aFillToolBarContentCallback){
$.Wondershare_AllMyTube_Plugin.Log('ToolBar 1.1');
var _ToolBar = new Object;
_ToolBar.DivID = $.WSUtils.newGuid();
_ToolBar._T;
_ToolBar._CanHide = false;
_ToolBar._KeepLongHide=false;
_ToolBar._AttachStyle = aAttachStyle;
_ToolBar._ToolBarDivID = '#' + _ToolBar.DivID;
_ToolBar._FillToolBarContent = aFillToolBarContentCallback;
_ToolBar._ToolbarClass = aToolBarClass;
_ToolBar.btnWidth = null;
_ToolBar.btnHeight = null;
$.Wondershare_AllMyTube_Plugin.Log('ToolBar 1.2');
_ToolBar.CHECKTIME = 3000;
_ToolBar.GetCanHide = function() { return this._CanHide; };
_ToolBar.SetCanHide = function(value) {
//ClearTimer
if (this._CanHide){
this.ResetHideToolBarTime();
};
this._CanHide = value;
//CreateTime
if (this._CanHide){
var TempToolbar = this;
this._T = setInterval(function(){
TempToolbar.HideToolBar()
}, TempToolbar.CHECKTIME);
};
};
_ToolBar.MouseEnterFlashObject = function() {
if (this._KeepLongHide == true){
return;
}
if($(this._ToolBarDivID).size()==0){
//Append Toolbar
var DivToolBar = '
‘
$(‘body’).append(DivToolBar);
//Fill DivToolBar content
var WH = this._FillToolBarContent(this._ToolBarDivID, aFlashObj);
//Adjuest Position
this.btnWidth = WH[0];
this.btnHeight = WH[1];
this._AdjuestPosition();
$.Wondershare_AllMyTube_Plugin.Log(‘ToolBar 1.3’);
$(document).delegate(‘”‘+ this._ToolBarDivID + ‘”‘, ‘mouseleave’,
function(){
_ToolBar.SetCanHide(true);
}
);
$.Wondershare_AllMyTube_Plugin.Log(‘ToolBar 1.4’);
$(document).delegate(‘”‘+ this._ToolBarDivID + ‘”‘, ‘mouseenter’,
function(){
_ToolBar.SetCanHide(false);
}
);
};
this.SetCanHide(false);
};
$.Wondershare_AllMyTube_Plugin.Log(‘ToolBar 1.5’);
_ToolBar.MouseLeaveFlashObject = function(){
$.Wondershare_AllMyTube_Plugin.Log(‘_ToolBar.mouseleave’);
_ToolBar.SetCanHide(true);
};
$.Wondershare_AllMyTube_Plugin.Log(‘ToolBar 1.6’);
_ToolBar.HideToolBar = function(KeepLongHide){
if (KeepLongHide == undefined){
$.Wondershare_AllMyTube_Plugin.Log(‘ToolBar _ToolBar.HideToolBar 1’);
if ($(this._ToolBarDivID) && (this.GetCanHide())){
this.ResetHideToolBarTime();
$(this._ToolBarDivID).remove();
}else{
this.SetCanHide(true);
}
$.Wondershare_AllMyTube_Plugin.Log(‘ToolBar _ToolBar.HideToolBar 2’);
}else{
this.ResetHideToolBarTime();
$(this._ToolBarDivID).remove();
this._KeepLongHide = true;
}
};
_ToolBar.ResetHideToolBarTime = function(){
//Resettime
if (this._T){
clearTimeout(this._T);
this._T = null;
};
};
_ToolBar._AdjuestPosition = function(){
if ($(this._ToolBarDivID).length>0){
//alert(this);
var divPos = $.Wondershare_AllMyTube_Plugin.CalcToolBarPosition(aFlashObj, this.btnWidth, this.btnHeight, this._AttachStyle);
$(this._ToolBarDivID).css(‘left’, divPos.x);
$(this._ToolBarDivID).css(‘top’, divPos.y);
}
};
$.relocation.add(aFlashObj, function(data){_ToolBar._AdjuestPosition()});
$.Wondershare_AllMyTube_Plugin.Log(‘ToolBar 1.7’);
return _ToolBar;
};
/* }(jQueryWS));
;(function($){ */
$.Wondershare_AllMyTube_Plugin.Log(‘Plugin.WSBrowserPlugin 1’);
Plugin.WSBrowserPlugin = function (aToolBarDivID, aToolBarClass, attachStyle, FillToolBarContentCallback, CanDisplayCallback, VideoObject){
$.Wondershare_AllMyTube_Plugin.Log(‘Plugin.WSBrowserPlugin 1.1’);
var _VideoObject = ‘object, embed, video, iframe’;// #player-api
if (VideoObject != undefined){
_VideoObject = _VideoObject + ‘, ‘ + VideoObject();
}
var _ToolBarList = [];
function FindToolbarFunction(elem){
if (_ToolBarList.length>0){
for(var i=0;i0){
for(var i=0;i-1) && (location.href != $.g_url)){
$.g_url = location.href;
location.reload();
}
});
$(document).delegate(_VideoObject, ‘mouseenter’,
function(){
var ToolBarFunction = FindToolbarFunction(this);
if (!CanDisplayCallback($(this), ToolBarFunction)){
return;
}
// if ($(this).get(0).nodeName.toLowerCase() == ‘iframe’){
// if (!$(this).attr(‘src’).match(‘//’)) {
// return;
// }
// if ($.WSUtils.GetMainDomain($(this).attr(‘src’)).toLowerCase() == $.WSUtils.GetMainDomain(location.hostname).toLowerCase()){
// return;
// }
// };
$.Wondershare_AllMyTube_Plugin.Log(‘Plugin.WSBrowserPlugin 1.2’ + this);
//
HideAllNotBusyToolbar(this);
$.Wondershare_AllMyTube_Plugin.Log(‘Plugin.WSBrowserPlugin 1.3’);
//
if (ToolBarFunction == null){
$.Wondershare_AllMyTube_Plugin.Log(‘Plugin.WSBrowserPlugin 1.4’);
ToolBarFunction = new $.Wondershare_AllMyTube_Plugin.ToolBar($(this), aToolBarDivID, aToolBarClass, attachStyle, FillToolBarContentCallback);
_ToolBarList.push({o:this, f: ToolBarFunction});
};
ToolBarFunction.MouseEnterFlashObject($(this));
$.Wondershare_AllMyTube_Plugin.Log(‘Plugin.WSBrowserPlugin 1.5’);
}
);
$(document).delegate(_VideoObject, ‘mouseleave’,
function(){
$.Wondershare_AllMyTube_Plugin.Log(‘Plugin.WSBrowserPlugin 1.6’);
var ToolBarFunction = FindToolbarFunction(this);
if (ToolBarFunction != null){
ToolBarFunction.MouseLeaveFlashObject($(this));
};
$.Wondershare_AllMyTube_Plugin.Log(‘Plugin.WSBrowserPlugin 1.7’);
}
);
};
$.Wondershare_AllMyTube_Plugin.Log(‘Plugin.WSBrowserPlugin 2’);
}(jQueryWS));
//alert(‘jQuery.Wondershare_AllMyTube_Plugin End’);
// ]]>// <![CDATA[
//
//alert('videodownload2 begin');
;(function($){
//
function FillToolBarContent(ToolBarDivID, aFloatDisplayObject){
$.Wondershare_AllMyTube_Plugin.Log('FillToolBarContent');
var _toolbar = this;
var bro = $.WSUtils.Browser();
if (bro.ie) { browserType = 'id_browser_IE'}
if (bro.firefox) { browserType = 'id_browser_FireFox'}
if (bro.safari) { browserType = 'id_browser_safari'}
if (bro.chrome) { browserType = 'id_browser_Chrome'}
var html =
'
+ ‘ ‘
+ ‘ ‘
+ ‘
‘
+ ‘
- ‘
+ ‘
‘;
$(ToolBarDivID).append(html);
var Protocol = ‘AllMyTube://’;//
var Seperator = ‘-WS-GUES-‘;//
if ($.Wondershare_AllMyTube_Plugin.GetSupportsResoltions){
$.Wondershare_AllMyTube_Plugin.Log(‘Enter GetSupportsResoltions’);
var Resoltions = $.Wondershare_AllMyTube_Plugin.GetSupportsResoltions();
if (Resoltions.length>1){
var html = “”;
for (var i = 0; i < Resoltions.length; ++i) {
if (Resoltions[i] == 'PlayList'){
html += '
‘
}else if (Resoltions[i] == ‘YouTube MP3’){
html += ‘
‘
}else{
html += ‘
‘
}
}
$(ToolBarDivID + ‘Resoltions’).append(html);
$.Wondershare_AllMyTube_Plugin.Log(‘Leave GetSupportsResoltions’);
$(ToolBarDivID + ‘Resoltions’).mouseleave(function(event){
$(this).hide();
});
$(ToolBarDivID + ‘Download’).click(function(event){
//
event.stopPropagation();
_toolbar.SetCanHide(false);
$.Wondershare_AllMyTube_Plugin.Log(‘Click Download’);
$(ToolBarDivID + ‘Resoltions’).fadeIn();
});
$(ToolBarDivID + ‘Resoltions a’).click(function(event){
//
event.stopPropagation();
$.Wondershare_AllMyTube_Plugin.Log(‘click Download click’);
$(ToolBarDivID + ‘Resoltions’).hide();
CallDownload($(this).text());
});
}else{
$(ToolBarDivID + ‘Download’).click(function(event){
//
event.stopPropagation();
$.Wondershare_AllMyTube_Plugin.Log(‘Click Download’);
$(ToolBarDivID + ‘Resoltions’).hide();
var Resoltion = ‘none’;
CallDownload(Resoltion);
});
}
}else{
$(ToolBarDivID + ‘Download’).click(function(event){
//
event.stopPropagation();
$.Wondershare_AllMyTube_Plugin.Log(‘Click Download’);
$(ToolBarDivID + ‘Resoltions’).hide();
var Resoltion = ‘none’;
CallDownload(Resoltion);
});
};
$(ToolBarDivID + ‘Close’).click(function(event){
_toolbar.HideToolBar(true);
});
function openExternalLink(url) {
myWindow1 = window.open(url, ‘_blank’, ”);
myWindow1.focus();
window.setTimeout(function(){myWindow1.close();}, 500);
};
function CallDownload(Resoltion){
_toolbar.SetCanHide(false);
var Title = $(document).attr(‘title’);
var Cookie = document.cookie;
if (Title==”){
Title=’none’;
}else if (Title.length>100){
Title = Title.slice(0,100);
};
if (Cookie==”){
Cookie =’none’;
};
if ((!bro.chrome) && (!bro.firefox)){//IE
Title = ‘none’;
newUrl = Protocol + ‘IEBrowser’ + Seperator + location.href + Seperator + Resoltion;
openExternalLink(newUrl);
}else
{
var Browser = ‘FireFoxBrowser’;
if (bro.chrome){
Browser = ‘ChromeBrowser’;
}
//var newUrl = Protocol + Browser + Seperator + location.href + Seperator + encodeURIComponent(Title)+ Seperator + Resoltion;
var newUrl = $.WSUtils.InvokeProtocol(Protocol, Seperator, location.href, Title, Browser, Resoltion);
openExternalLink(newUrl);
}
}
return [140, 29];
};
$.Wondershare_AllMyTube_Plugin.Log(‘Begin’);
//$.WSUtils.fix_wmode2transparent_swf();
$.Wondershare_AllMyTube_Plugin.WSBrowserPlugin(‘ToolBar0’, ‘Wondershare_AllMyTube_toolbar’,AttachStyleEnum.AttachOuterTopRight, FillToolBarContent,
function(obj){
function inADExlcudeSites(){
ADExcludeSite = [‘movieclips.com’];
bFind = false;
for(var i=0;i
-1){
bFind = true;
}
}
return bFind;
};
if (/*(!obj.hasClass(‘yt-thumb-default’)) &&*/ ((!inADExlcudeSites()) && ($.WSUtils.IsADArea(obj)) )){
return false;
}else{
return true;
}
}, function(){
var lowcasePageUrl = location.href.toLowerCase();
if (lowcasePageUrl.indexOf(‘youtube.com’) != -1) {
return /*’.yt-thumb-default,*/ ‘.videoAdUi, #player-api’;
}else if (lowcasePageUrl.indexOf(‘lynda.com’) != -1){
return ‘.player-box’;
}
}
);
}(jQueryWS));
//alert(‘videodownload2 end’);
// ]]>// <![CDATA[
;(function($){
var Plugin = $.Wondershare_AllMyTube_Plugin;
Plugin.Log = function(msg){
$.WSUtils.Log(msg);
};
var lowcasePageUrl = location.href.toLowerCase();
if (lowcasePageUrl.indexOf('youtube.com') != -1) {
$(document).ready(function () {
var bro = $.WSUtils.Browser();
if ((!bro.chrome) && (!bro.firefox)){//IE
setTimeout(function(){
$.WSUtils.fix_wmode2transparent_swf()
}, 2000);
}else{
$.WSUtils.fix_wmode2transparent_swf();
}
});
Plugin.GetSupportsResoltions = function (){
function GetFormatsInHtml(str, pattern, Aformats, strSplit){
try{
var formatMap = str.split(pattern)[1];
formatMap = formatMap.split('"')[1];
formatMap = unescape(formatMap);
formatMap = formatMap.replace(/\u0026/g, "&");
formatMap += ",";
formatMap = formatMap.split(strSplit);
for (var i = 1; i < formatMap.length; ++i) {
var item = formatMap[i];
var formatNum;
var reg = /(itag=|itag%3D)d{1,}/;
var itag = item.match(reg);
itag = unescape(itag[0]);
formatNum = itag.substring(itag.lastIndexOf("=") + 1, itag.length);
if (formatNum.length <= 0)
formatNum = item.substring(item.lastIndexOf("=") + 1, item.length – 1);
//var formatNum = item.substring(item.lastIndexOf("=") + 1, item.length – 1);
var formatURL = item.substring(0, item.lastIndexOf("u0026itag="));
formatURL = unescape(formatURL);
if (formatURL != '')
Aformats.push([formatNum, formatURL]);
}
}catch(err){
}
};
function GetFormats(str, pattern, Aformats){
try{
var formatMap = str;
formatMap = formatMap.split(pattern)[1].split("&")[0];
formatMap = unescape(formatMap);
formatMap = formatMap.replace(/%3A/g, ":");
formatMap = formatMap.replace(/%2F/g, "/");
formatMap += ",";
formatMap = formatMap.split("url=");
for (var i = 1; i < formatMap.length; ++i) {
var item = formatMap[i];
//
var reg = /(itag=|itag%3D)d{1,}/;
var itag = item.match(reg);
itag = unescape(itag[0]);
var formatNum;
formatNum = itag.substring(itag.lastIndexOf("=") + 1, itag.length);
if (formatNum.length <= 0)
formatNum = item.substring(item.lastIndexOf("=") + 1, item.length – 1);
var formatURL = item.substring(0, item.lastIndexOf("&itag="));
if (formatURL.length <= 0)
formatURL = item;
formatURL = unescape(formatURL);
if (formatURL != '')
Aformats.push([formatNum, formatURL]);
}
}catch(err){
}
};
function GetResoltionArray(formats){
var formatDesc = new Array();
var i = 0;
formatDesc[313] = [i++, "4096×1716", "2160p 4K", "WebM" ];
formatDesc[266] = [i++, "4096×1716", "2160p 4K", "MP4" ];
formatDesc[138] = [i++, "4096×1716", "2160p 4K", "MP4" ];
formatDesc[264] = [i++, "2560×1072", "1440p HD", "MP4" ];
formatDesc[137] = [i++, "1920×1080", "1080p HD", "MP4" ];
formatDesc[37] = [i++, "1920×1080", "1080p HD", "MP4" ];
formatDesc[46] = [i++, "1920×1080", "1080p HD", "WebM" ];
formatDesc[102] = [i++, "1280×720", "720p HD", "WebM"];
formatDesc[45] = [i++, "1280×720", "720p HD", "WebM" ];
formatDesc[22] = [i++, "1280×720", "720p HD", "MP4" ];
formatDesc[136]= [i++, "1280×720", "720p HD", "MP4" ];
formatDesc[84] = [i++, "1280×720", "720p HD", "MP4" ];
formatDesc[102] = [i++, "1280×720", "720p HD", "WebM" ];
formatDesc[35] = [i++, "854×480", "480p", "FLV" ];
formatDesc[44] = [i++, "854×480", "480p", "WebM" ];
formatDesc[135] = [i++, "854×480", "480p", "MP4" ];
formatDesc[101] = [i++, "854×480", "480p", "WebM" ];
formatDesc[83] = [i++, "854×480", "480p", "MP4" ];
formatDesc[34] = [i++, "640×360", "360p", "FLV" ];
formatDesc[43] = [i++, "640×360", "360p", "WebM" ];
formatDesc[18] = [i++, "640×360", "360p", "MP4" ];
formatDesc[82] = [i++, "640×360", "360p", "MP4" ];
formatDesc[100] = [i++, "640×360", "360p", "WebM" ];
formatDesc[5] = [i++, "320*240", "240p", "FLV" ];
formatDesc[36] = [i++, "320×240", "240p", "WebM" ];
function formatSorter(a, b){
var first = formatDesc[a[0]] ? formatDesc[a[0]][0] : 100;
var second = formatDesc[b[0]] ? formatDesc[b[0]][0] : 100;
return first – second;
};
Plugin.Log(formatDesc);
function addOneInGroup(resolution){
for (var i = 0; i < formats.length; ++i) {
if (formats[i][2] == resolution) {
ret[ret.length] = formats[i][2];
break;
}
}
};
formats.sort(formatSorter);
var ret = new Array();
if (formats == null)
return ret;
Plugin.Log(formats.length);
for (var i = 0; i 0){
if(location.href.toLowerCase().indexOf(‘list=’)>-1){
ret[ret.length] = ‘PlayList’;
}
}
return ret;
};
var BodySource = document.getElementsByTagName(“body”)[0].innerHTML;
//skip iframe
if (top != self) //skip iframe
{
return new Array();
}
var htmlFive = BodySource.search(“html5-main-video”) != -1;
var formats = new Array();
var el_flash = document.getElementById(“movie_player”);
if (el_flash) {
GetFormats(el_flash.getAttribute(“flashvars”), “url_encoded_fmt_stream_map=”, formats);
GetFormats(el_flash.getAttribute(“flashvars”), “adaptive_fmts=”, formats);
}
GetFormatsInHtml(BodySource, ‘”url_encoded_fmt_stream_map”‘, formats, ‘url=’);
GetFormatsInHtml(BodySource, ‘”url_encoded_fmt_stream_map”‘, formats, ‘fallback_host=’);
GetFormatsInHtml(BodySource, ‘”adaptive_fmts”‘, formats, ‘url=’);
GetFormatsInHtml(BodySource, ‘”adaptive_fmts”‘, formats, ‘fallback_host=’);
return GetResoltionArray(formats);
}
}
}(jQueryWS));
// ]]>
Elvis Presley talking about his movie career
A very serious talking about his movie career with the man himself. This interview was recorded in Elvis On Tour (1972) movie sessions. It was never included in the actual movie.
<<<<<<<<<<>>>>>>>>>>
THURSDAY, MARCH 17, 2016
This is a very interesting article about Elvis’ time in Germany. The best part is that it contains some very good unseen photos.
The King unseen: Forgotten pictures of Elvis Presley taken during his military service in Germany in 1958 found gathering dust in a drawer
- Elvis spent 18 months in Germany where he completed his military service and met his future wife, Priscilla
- English scrapbook owner spent summer in Bad Nauheim where the star was based for most of his military service
- Known only as Frances, the teen was working as a chambermaid in a hotel and was the only English girl in the town
- Book contains 15 photos, six of which are signed, of the King in his army uniform, giving autographs and with fans
- It is expected to sell for £3,500 when it is put under the hammer by an auctioneers in St Peter Port, Guernsey
PUBLISHED: 10:09 EST, 16 March 2016 | UPDATED: 14:37 EST, 16 March 2016
A scrapbook containing unseen photographs of Elvis Presley during his military service in Germany, compiled by an English teenager who was working as a hotel chambermaid, has been discovered.
The girl, known only as Frances, made the album dedicated to the King when she was working in Bad Nauheim, where Elvis spent most of his two years’ national service.
It contains 15 photos – six of which are signed – of the rock and roll singer in his army uniform, including one with Frances, and is now being sold after lying forgotten in a drawer for years.
It also has a stash of press and magazine cuttings relating to Elvis from publications of the time.
The owner of the album spent one summer in the town, where she was the only English girl, before returning to the UK.
An auctioneer recently stumbled upon it while carrying out a valuation of items at her house on Guernsey. It is expected to sell for £3,500 when it is sold by Channel Islands Auctions in St Peter Port on the island.
Concerned that his time in Germany would have a negative impact on his career, Elvis ensured his record company continued to release songs during his national service and he had ten top 40 hits while he was in the army.
The star’s time in Germany affected more than just his music. In September 1958 Elvis was introduced to 14-year-old Priscilla Beaulieu, whose step-father was also based in Germany with the air force, during a party at his home.
He took an instant liking to her and the pair were practically inseparable during the rest of his time in Germany. They stayed in touch when he went back to America and Priscilla visited him in 1962 before moving to Graceland in 1963 and marrying him in 1967.
Elvis began national service in March 1958, at the age of 23, and was assigned to the 3rd Armoured Division in Friedberg, West Germany.
He was stationed in Bad Nauheim from September 1958 until March 1960, where his father Vernon, grandmother Minnie Mae and two of his friends and bodyguards lived in a five-bedroom house.
Fans congregated outside his residence to watch as Elvis went to manoeuvres and a sign was put up stating autographs would be given between 7.30pm and 8pm.
Norman Wilkinson, from Channel Islands Auctions, which is selling the lot on Saturday, said: ‘The owner had been in Bad Nauheim on a school exchange visit and liked the place so much she decided to return the following year and work as a chambermaid for the summer holidays in 1959.
‘She was 18 at the time and a big Elvis fan, like every teenage girl was.
‘Having a well-known pop star in the army staying in the town was a big deal. Elvis was the centre of attention.
‘The young German lads were quite enterprising and used to take photos of him and sell them to people.
‘It was quite early on for cameras then and not everyone could afford them.
‘The seller bought some of these photos, there’s even one of her with Elvis, and six of them are signed on the back.
‘They’re not professional photos but some of them are one offs and have never been seen before.
‘The remarkable thing is it has just been lying in a drawer for years. The lady knew she had it but she’d forgotten all about it.
‘The scrapbook was just stuffed in a drawer in her lounge amongst other old papers and I found it as part of a routine evaluation. She hadn’t looked at it for years.
‘She’s had her enjoyment from it and wants to sell it now so someone else can cherish it.
‘Elvis died when he was only 42 and there’s only a certain amount of material out there – a lot of it is hard to come by now so something like this is bound to attract interest.’
Tourist still flock to Bad Nauheim to visit the spots associated with the icon and the town has held a European Elvis Festival every year since 2002 and the square in front of the Grunewald hotel in now called Elvis Presley Platz and has a memorial to the star.
Read more: http://www.dailymail.co.uk/news/article-3495254/Elvis-Presley-unseen-pictures-taken-military-service-Germany-1958-gathering-dust-drawer.html#ixzz43BPw3ezh
Follow us: @MailOnline on Twitter | DailyMail on Facebook
<<<<<<<<<<>>>>>>>>>>
SENT TO JESSE THROUGH THIS POINT ON FRIDAY, MARCH 18, 2016
<<<<<<<<<<>>>>>>>>>>
I have constructed a new page for Current News and Events for the remainder of this month. Below is the link for the new page:
https://lindahoodsigmonstruth.com/current-news-events/current-news-and-events-march-2016-contd/
<<<<<<<<<<>>>>>>>>>>
You must be logged in to post a comment.